@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,179 @@
1
+ /**
2
+ * FeedbackAggregator — Phase 8 of the master roadmap (master-roadmap-full-loop-
3
+ * 20260522-0200.md §2). Reads tool_intercepts / workflow_recommendations /
4
+ * injections / skill_invocations / sessions rollup metrics and folds them into
5
+ * a single "tuning report" structure with three classes of suggestion:
6
+ *
7
+ * • RuleTuningSuggestion — too-noisy or never-firing rule_intercept &
8
+ * workflow_recommend rules
9
+ * • SkillTuningSuggestion — skills that match too rarely / always fail /
10
+ * never match (stale keywords)
11
+ * • KbTuningSuggestion — KB pages that never appear in injection
12
+ * metadata, or always appear with low scores
13
+ *
14
+ * Apply contract: this service NEVER edits CLAUDE.md / skill .md / KB .md
15
+ * files. Every `apply_action` is whitelisted in routes/insights.ts and only
16
+ * writes to the `forge_config` table (so users see suggestions in the Web UI
17
+ * and choose to flip a flag — fully reversible via `cf config set ...`).
18
+ *
19
+ * D7 thresholds (master roadmap §1):
20
+ * • C4 intercept obeyed ratio target >= 0.70
21
+ * • C8 workflow adoption ratio target >= 0.40 (red <0.40, yellow 0.40-0.55,
22
+ * green >=0.55)
23
+ *
24
+ * Acceptance:
25
+ * • `cf insights weekly` renders a markdown weekly report (see CLI)
26
+ * • `GET /api/insights/tuning?window=7` returns suggestions + summary
27
+ * • Feature flag `feedback_loop.enabled` (Phase 0) gates the endpoint —
28
+ * this class never probes the flag itself; the route does.
29
+ */
30
+ import type { SQLiteStorage } from '../../core/storage/sqlite.js';
31
+ export type SeverityBand = 'red' | 'yellow' | 'green';
32
+ export interface RuleTuningSuggestion {
33
+ kind: 'rule_tuning';
34
+ rule_id: string;
35
+ rule_kind: 'tool_intercept' | 'workflow_recommend';
36
+ metric: {
37
+ fires_per_day: number;
38
+ obeyed_ratio: number;
39
+ override_count_7d: number;
40
+ /** Phase 5 only — fraction of accepted recommendations in window. */
41
+ accepted_ratio?: number;
42
+ fires_7d: number;
43
+ };
44
+ suggestion: string;
45
+ apply_action?: {
46
+ type: 'disable_rule' | 'tighten_threshold' | 'loosen_threshold';
47
+ payload: Record<string, unknown>;
48
+ };
49
+ }
50
+ export interface SkillTuningSuggestion {
51
+ kind: 'skill_tuning';
52
+ skill_id: string;
53
+ metric: {
54
+ matched_per_day: number;
55
+ success_rate: number;
56
+ zero_result_rate: number;
57
+ invocations_7d: number;
58
+ };
59
+ suggestion: string;
60
+ apply_action?: {
61
+ type: 'update_keywords' | 'disable_skill' | 'enable_skill';
62
+ payload: Record<string, unknown>;
63
+ };
64
+ }
65
+ export interface KbTuningSuggestion {
66
+ kind: 'kb_tuning';
67
+ page_name: string;
68
+ metric: {
69
+ cited_per_day: number;
70
+ avg_score: number;
71
+ in_top_2_count_7d: number;
72
+ cited_7d: number;
73
+ };
74
+ suggestion: string;
75
+ apply_action?: {
76
+ type: 'regenerate_module' | 'archive_page' | 'lower_priority';
77
+ payload: Record<string, unknown>;
78
+ };
79
+ }
80
+ export type TuningSuggestion = RuleTuningSuggestion | SkillTuningSuggestion | KbTuningSuggestion;
81
+ export interface TuningReportSummary {
82
+ rule_violations_top: Array<{
83
+ rule_id: string;
84
+ n: number;
85
+ }>;
86
+ /**
87
+ * C4 — fraction of intercepts where outcome is 'obeyed' (excluding 'unknown').
88
+ * KPI relax: includes both real `deny` rows AND `dry_run` rehearsal rows
89
+ * back-filled by PostToolUseHandler — see post-tool-use.ts
90
+ * `maybeMarkInterceptOutcome`. This makes C4 meaningful before
91
+ * `pre_tool_intercept.enabled` is flipped on; UI tooltip notes the dry_run
92
+ * inclusion.
93
+ */
94
+ intercept_obeyed_ratio: number;
95
+ intercept_obeyed_band: SeverityBand;
96
+ /**
97
+ * C8 — weighted workflow recommendation acceptance ratio.
98
+ * accepted → 1.0
99
+ * partial_accepted → 0.5 (spawned a known subagent_type but not the
100
+ * recommended one)
101
+ * rejected / bypassed / ignored → 0.0
102
+ * Denominator = total non-pending rows in window. Captures the common
103
+ * "main thread spawned `coder` instead of `refactor-specialist`" pattern
104
+ * that previously evaporated as `ignored`.
105
+ */
106
+ workflow_acceptance_ratio: number;
107
+ workflow_acceptance_band: SeverityBand;
108
+ /** C1 — KB injection rows in window (UserPromptSubmitHandler:kb). */
109
+ kb_inject_count: number;
110
+ kb_top_pages: Array<{
111
+ name: string;
112
+ cited: number;
113
+ }>;
114
+ skill_top: Array<{
115
+ skill_id: string;
116
+ n: number;
117
+ success_rate: number;
118
+ }>;
119
+ session_outcome: {
120
+ success: number;
121
+ partial: number;
122
+ failed: number;
123
+ abandoned: number;
124
+ unclassified: number;
125
+ };
126
+ /**
127
+ * H4 contract — per-decision counts of `tool_intercepts` rows in window.
128
+ * Surfaces the deny/dry_run/warn/bypass denominator split behind
129
+ * `intercept_obeyed_ratio` so curl/jq + future UI tooltip can see which
130
+ * decisions dominate. Optional / nullable for backwards-compat: pre-2026-05-27
131
+ * callers do not depend on these fields.
132
+ */
133
+ intercept_denied?: number | null;
134
+ intercept_dry_run?: number | null;
135
+ intercept_warn?: number | null;
136
+ intercept_bypass?: number | null;
137
+ }
138
+ export interface TuningReport {
139
+ generated_at: string;
140
+ window_days: 7 | 30;
141
+ suggestions: TuningSuggestion[];
142
+ summary: TuningReportSummary;
143
+ }
144
+ /** D7 master-roadmap default for workflow recommendation adoption. */
145
+ export declare const C8_ACCEPTANCE_TARGET = 0.4;
146
+ /** Below this is red. */
147
+ export declare const C8_RED_BELOW = 0.4;
148
+ /** At/above this is green. */
149
+ export declare const C8_GREEN_AT = 0.55;
150
+ /** Master roadmap C4 target for intercept obedience. */
151
+ export declare const C4_OBEYED_TARGET = 0.7;
152
+ export declare const C4_RED_BELOW = 0.5;
153
+ export declare const C4_GREEN_AT = 0.7;
154
+ export declare const RULE_NOISY_FIRES_PER_DAY = 5;
155
+ export declare const RULE_OBEYED_RATIO_FLOOR = 0.3;
156
+ export declare const RULE_OVERRIDE_FLOOR = 5;
157
+ export declare const RULE_DEAD_FIRES_7D = 0;
158
+ export declare const SKILL_ZERO_RESULT_THRESHOLD = 5;
159
+ export declare const SKILL_LOW_SUCCESS_FLOOR = 0.5;
160
+ export declare const KB_ARCHIVE_TARGET_CITES = 0;
161
+ export declare const KB_LOW_SCORE_FLOOR = 10;
162
+ export declare class FeedbackAggregator {
163
+ private storage;
164
+ constructor(storage: SQLiteStorage);
165
+ generateReport(opts?: {
166
+ windowDays: 7 | 30;
167
+ }): TuningReport;
168
+ private computeSummary;
169
+ private emptySummary;
170
+ private buildRuleSuggestions;
171
+ private buildSkillSuggestions;
172
+ private buildKbSuggestions;
173
+ }
174
+ /**
175
+ * Render a TuningReport as a markdown document. Used by `cf insights weekly`.
176
+ * Kept here (not in CLI) so the same renderer can power email digests later.
177
+ */
178
+ export declare function renderReportMarkdown(report: TuningReport): string;
179
+ //# sourceMappingURL=feedback-aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-aggregator.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/feedback-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAMlE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,GAAG,oBAAoB,CAAC;IACnD,MAAM,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,qEAAqE;QACrE,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;QAChE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,cAAc,CAAC;QAC3D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,mBAAmB,GAAG,cAAc,GAAG,gBAAgB,CAAC;QAC9D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;CACH;AAED,MAAM,MAAM,gBAAgB,GACxB,oBAAoB,GACpB,qBAAqB,GACrB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D;;;;;;;OAOG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,YAAY,CAAC;IACpC;;;;;;;;;OASG;IACH,yBAAyB,EAAE,MAAM,CAAC;IAClC,wBAAwB,EAAE,YAAY,CAAC;IACvC,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,SAAS,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,eAAe,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/G;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC;IACpB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAID,sEAAsE;AACtE,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,yBAAyB;AACzB,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,8BAA8B;AAC9B,eAAO,MAAM,WAAW,OAAO,CAAC;AAEhC,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,WAAW,MAAM,CAAC;AAI/B,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAqBrC,qBAAa,kBAAkB;IACjB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE1C,cAAc,CAAC,IAAI,GAAE;QAAE,UAAU,EAAE,CAAC,GAAG,EAAE,CAAA;KAAsB,GAAG,YAAY;IAkC9E,OAAO,CAAC,cAAc;IA4FtB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,oBAAoB;IAgG5B,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,kBAAkB;CA2D3B;AASD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAuEjE"}
@@ -0,0 +1,455 @@
1
+ /**
2
+ * FeedbackAggregator — Phase 8 of the master roadmap (master-roadmap-full-loop-
3
+ * 20260522-0200.md §2). Reads tool_intercepts / workflow_recommendations /
4
+ * injections / skill_invocations / sessions rollup metrics and folds them into
5
+ * a single "tuning report" structure with three classes of suggestion:
6
+ *
7
+ * • RuleTuningSuggestion — too-noisy or never-firing rule_intercept &
8
+ * workflow_recommend rules
9
+ * • SkillTuningSuggestion — skills that match too rarely / always fail /
10
+ * never match (stale keywords)
11
+ * • KbTuningSuggestion — KB pages that never appear in injection
12
+ * metadata, or always appear with low scores
13
+ *
14
+ * Apply contract: this service NEVER edits CLAUDE.md / skill .md / KB .md
15
+ * files. Every `apply_action` is whitelisted in routes/insights.ts and only
16
+ * writes to the `forge_config` table (so users see suggestions in the Web UI
17
+ * and choose to flip a flag — fully reversible via `cf config set ...`).
18
+ *
19
+ * D7 thresholds (master roadmap §1):
20
+ * • C4 intercept obeyed ratio target >= 0.70
21
+ * • C8 workflow adoption ratio target >= 0.40 (red <0.40, yellow 0.40-0.55,
22
+ * green >=0.55)
23
+ *
24
+ * Acceptance:
25
+ * • `cf insights weekly` renders a markdown weekly report (see CLI)
26
+ * • `GET /api/insights/tuning?window=7` returns suggestions + summary
27
+ * • Feature flag `feedback_loop.enabled` (Phase 0) gates the endpoint —
28
+ * this class never probes the flag itself; the route does.
29
+ */
30
+ import { logger } from '../../core/utils/logger.js';
31
+ import { formatError } from '../../core/utils/format.js';
32
+ // ─── Thresholds (D7 + sensible defaults) ──────────────────────────────────
33
+ /** D7 master-roadmap default for workflow recommendation adoption. */
34
+ export const C8_ACCEPTANCE_TARGET = 0.4;
35
+ /** Below this is red. */
36
+ export const C8_RED_BELOW = 0.4;
37
+ /** At/above this is green. */
38
+ export const C8_GREEN_AT = 0.55;
39
+ /** Master roadmap C4 target for intercept obedience. */
40
+ export const C4_OBEYED_TARGET = 0.7;
41
+ export const C4_RED_BELOW = 0.5;
42
+ export const C4_GREEN_AT = 0.7;
43
+ // Suggestion-emit thresholds — kept conservative for v1 so we don't drown
44
+ // the UI in low-confidence noise. All exported so tests can drive them.
45
+ export const RULE_NOISY_FIRES_PER_DAY = 5; // a rule firing > 5/day is "loud"
46
+ export const RULE_OBEYED_RATIO_FLOOR = 0.3; // less than 30% obeyed → noisy
47
+ export const RULE_OVERRIDE_FLOOR = 5; // ≥5 overrides → worth a card
48
+ export const RULE_DEAD_FIRES_7D = 0; // never fired → suggest disable
49
+ export const SKILL_ZERO_RESULT_THRESHOLD = 5; // ≥5 failed invocations → tag
50
+ export const SKILL_LOW_SUCCESS_FLOOR = 0.5;
51
+ export const KB_ARCHIVE_TARGET_CITES = 0; // page never cited in window → archive
52
+ export const KB_LOW_SCORE_FLOOR = 10; // avg < 10 → suggest regenerate
53
+ // ─── Helpers ──────────────────────────────────────────────────────────────
54
+ function sinceIso(windowDays) {
55
+ const ms = Date.now() - windowDays * 24 * 60 * 60 * 1000;
56
+ return new Date(ms).toISOString();
57
+ }
58
+ function sinceMs(windowDays) {
59
+ return Date.now() - windowDays * 24 * 60 * 60 * 1000;
60
+ }
61
+ function ratioBand(value, redBelow, greenAt) {
62
+ if (value < redBelow)
63
+ return 'red';
64
+ if (value >= greenAt)
65
+ return 'green';
66
+ return 'yellow';
67
+ }
68
+ // ─── Aggregator ───────────────────────────────────────────────────────────
69
+ export class FeedbackAggregator {
70
+ storage;
71
+ constructor(storage) {
72
+ this.storage = storage;
73
+ }
74
+ generateReport(opts = { windowDays: 7 }) {
75
+ const window = opts.windowDays === 30 ? 30 : 7;
76
+ const since = sinceIso(window);
77
+ const sinceMillis = sinceMs(window);
78
+ let summary;
79
+ let suggestions = [];
80
+ try {
81
+ summary = this.computeSummary(since, sinceMillis, window);
82
+ }
83
+ catch (err) {
84
+ logger.warn(`[FeedbackAggregator] summary failed: ${formatError(err)}`);
85
+ summary = this.emptySummary();
86
+ }
87
+ try {
88
+ suggestions = [
89
+ ...this.buildRuleSuggestions(since, window),
90
+ ...this.buildSkillSuggestions(sinceMillis, window),
91
+ ...this.buildKbSuggestions(since, window),
92
+ ];
93
+ }
94
+ catch (err) {
95
+ logger.warn(`[FeedbackAggregator] suggestion build failed: ${formatError(err)}`);
96
+ }
97
+ return {
98
+ generated_at: new Date().toISOString(),
99
+ window_days: window,
100
+ suggestions,
101
+ summary,
102
+ };
103
+ }
104
+ // ── Summary computation ────────────────────────────────────────────────
105
+ computeSummary(since, sinceMillis, window) {
106
+ // F-medium #1 (2026-05-26): all raw SQL down-sunk to FeedbackOperations.
107
+ // Aggregator only orchestrates + applies business rules (band thresholds,
108
+ // metadata_json parsing for KB top pages).
109
+ // C4 intercept obeyed ratio. Numerator = obeyed; denominator = obeyed +
110
+ // override. `unknown` excluded. KPI relax: PostToolUseHandler back-fills
111
+ // outcome for BOTH `deny` and `dry_run` intercept rows so this ratio is
112
+ // meaningful even before pre_tool_intercept.enabled is flipped on.
113
+ const obeyedRow = this.storage.queryInterceptObeyedSummary(since);
114
+ const interceptObeyed = obeyedRow.ratio;
115
+ // H4 contract — per-decision counts behind the obeyed ratio. See
116
+ // TuningReportSummary.intercept_{denied,dry_run,warn,bypass}.
117
+ const decisionCounts = this.storage.queryInterceptDecisionCounts(since);
118
+ // Top noisy intercept rules in window (by row count).
119
+ const ruleViolationsTop = this.storage.queryTopInterceptRuleViolations(since, 10);
120
+ // C8 workflow acceptance ratio — weighted by outcome strength.
121
+ // accepted → 1.0
122
+ // partial_accepted → 0.5
123
+ // rejected / bypassed / ignored / pending → 0.0 (pending excluded from
124
+ // denominator)
125
+ const acceptRow = this.storage.queryWorkflowAcceptanceSummary(since);
126
+ const workflowAccept = acceptRow.ratio;
127
+ // C1 KB inject count.
128
+ const kbInjectCount = this.storage.countKbInjections(since);
129
+ // KB top pages — parse metadata_json from KB injection rows. Done in JS to
130
+ // sidestep JSON1 portability (some sqlite builds don't have JSON1).
131
+ const kbPagesCounter = new Map();
132
+ const kbInjectionRows = this.storage.queryKbInjectionMetadata(since);
133
+ for (const row of kbInjectionRows) {
134
+ try {
135
+ const arr = JSON.parse(row.metadata_json);
136
+ if (Array.isArray(arr)) {
137
+ for (const item of arr) {
138
+ if (item && typeof item.name === 'string') {
139
+ kbPagesCounter.set(item.name, (kbPagesCounter.get(item.name) ?? 0) + 1);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ catch {
145
+ /* malformed metadata_json → skip */
146
+ }
147
+ }
148
+ const kbTopPages = Array.from(kbPagesCounter.entries())
149
+ .map(([name, cited]) => ({ name, cited }))
150
+ .sort((a, b) => b.cited - a.cited)
151
+ .slice(0, 10);
152
+ // Skill top — count by skill_id, with success rate.
153
+ const skillRows = this.storage.queryTopSkillInvocations(sinceMillis, 10);
154
+ const skillTop = skillRows.map((r) => ({
155
+ skill_id: r.skill_id,
156
+ n: r.n,
157
+ success_rate: r.sr ?? 0,
158
+ }));
159
+ // Session outcome distribution in window. classified_at is the canonical
160
+ // "when did outcome get written" timestamp.
161
+ const outcomeRows = this.storage.querySessionOutcomeDistribution(since);
162
+ const outcome = { success: 0, partial: 0, failed: 0, abandoned: 0, unclassified: 0 };
163
+ for (const row of outcomeRows) {
164
+ if (row.o === 'success' || row.o === 'partial' || row.o === 'failed' || row.o === 'abandoned') {
165
+ outcome[row.o] = row.n;
166
+ }
167
+ else {
168
+ outcome.unclassified += row.n;
169
+ }
170
+ }
171
+ void window; // window is captured by caller; placeholder for future per-window deltas
172
+ return {
173
+ rule_violations_top: ruleViolationsTop,
174
+ intercept_obeyed_ratio: interceptObeyed,
175
+ intercept_obeyed_band: ratioBand(interceptObeyed, C4_RED_BELOW, C4_GREEN_AT),
176
+ workflow_acceptance_ratio: workflowAccept,
177
+ workflow_acceptance_band: ratioBand(workflowAccept, C8_RED_BELOW, C8_GREEN_AT),
178
+ kb_inject_count: kbInjectCount,
179
+ kb_top_pages: kbTopPages,
180
+ skill_top: skillTop,
181
+ session_outcome: outcome,
182
+ intercept_denied: decisionCounts.denied,
183
+ intercept_dry_run: decisionCounts.dry_run,
184
+ intercept_warn: decisionCounts.warn,
185
+ intercept_bypass: decisionCounts.bypass,
186
+ };
187
+ }
188
+ emptySummary() {
189
+ return {
190
+ rule_violations_top: [],
191
+ intercept_obeyed_ratio: 0,
192
+ intercept_obeyed_band: 'red',
193
+ workflow_acceptance_ratio: 0,
194
+ workflow_acceptance_band: 'red',
195
+ kb_inject_count: 0,
196
+ kb_top_pages: [],
197
+ skill_top: [],
198
+ session_outcome: { success: 0, partial: 0, failed: 0, abandoned: 0, unclassified: 0 },
199
+ // H4 contract — emptySummary is the catch-block fallback when aggregation
200
+ // itself throws. Distinguished from "true zero" (returned by SQL on
201
+ // empty tool_intercepts) by using null. Callers (curl/jq) can tell apart
202
+ // "no data observed" vs "computation failed".
203
+ intercept_denied: null,
204
+ intercept_dry_run: null,
205
+ intercept_warn: null,
206
+ intercept_bypass: null,
207
+ };
208
+ }
209
+ // ── Rule suggestions (tool_intercepts + workflow_recommendations) ──────
210
+ buildRuleSuggestions(since, windowDays) {
211
+ const out = [];
212
+ // tool_intercept rules grouped by rule_id — per-rule fire count / obeyed / override.
213
+ const interceptRows = this.storage.queryInterceptRuleAggregates(since);
214
+ for (const row of interceptRows) {
215
+ const firesPerDay = row.fires / Math.max(1, windowDays);
216
+ const decided = row.obeyed + row.overrides;
217
+ const obeyedRatio = decided > 0 ? row.obeyed / decided : 0;
218
+ // Noisy + low obey → propose disabling / loosening.
219
+ if (firesPerDay >= RULE_NOISY_FIRES_PER_DAY && obeyedRatio < RULE_OBEYED_RATIO_FLOOR) {
220
+ out.push({
221
+ kind: 'rule_tuning',
222
+ rule_id: row.rule_id,
223
+ rule_kind: 'tool_intercept',
224
+ metric: {
225
+ fires_per_day: round(firesPerDay, 2),
226
+ obeyed_ratio: round(obeyedRatio, 2),
227
+ override_count_7d: row.overrides,
228
+ fires_7d: row.fires,
229
+ },
230
+ suggestion: `Rule "${row.rule_id}" fires ${row.fires} time(s) in the window (${round(firesPerDay, 1)}/day) ` +
231
+ `but only ${Math.round(obeyedRatio * 100)}% are obeyed. Consider loosening or disabling.`,
232
+ apply_action: {
233
+ type: 'loosen_threshold',
234
+ payload: { rule_id: row.rule_id, rule_kind: 'tool_intercept' },
235
+ },
236
+ });
237
+ continue;
238
+ }
239
+ // Many overrides relative to total → worth surfacing even if obey ratio
240
+ // is OK; user is regularly bypassing.
241
+ if (row.overrides >= RULE_OVERRIDE_FLOOR && row.overrides > row.obeyed) {
242
+ out.push({
243
+ kind: 'rule_tuning',
244
+ rule_id: row.rule_id,
245
+ rule_kind: 'tool_intercept',
246
+ metric: {
247
+ fires_per_day: round(firesPerDay, 2),
248
+ obeyed_ratio: round(obeyedRatio, 2),
249
+ override_count_7d: row.overrides,
250
+ fires_7d: row.fires,
251
+ },
252
+ suggestion: `Rule "${row.rule_id}" has ${row.overrides} overrides vs ${row.obeyed} obeyed. ` +
253
+ `Users routinely bypass — consider loosening or disabling.`,
254
+ apply_action: {
255
+ type: 'loosen_threshold',
256
+ payload: { rule_id: row.rule_id, rule_kind: 'tool_intercept' },
257
+ },
258
+ });
259
+ }
260
+ }
261
+ // workflow_recommend rules — emit a suggestion when accepted_ratio is low.
262
+ // Mirrors the summary-level C8 weighting: partial_accepted contributes 0.5
263
+ // so a rule that triggers lots of "tried but missed" spawns isn't unfairly
264
+ // tagged as ignored.
265
+ const workflowRows = this.storage.queryWorkflowRuleAggregates(since);
266
+ for (const row of workflowRows) {
267
+ const firesPerDay = row.fires / Math.max(1, windowDays);
268
+ const acceptedRatio = row.fires > 0 ? (row.accepted + row.partial * 0.5) / row.fires : 0;
269
+ if (firesPerDay >= 1 && acceptedRatio < C8_RED_BELOW) {
270
+ out.push({
271
+ kind: 'rule_tuning',
272
+ rule_id: row.rule_id,
273
+ rule_kind: 'workflow_recommend',
274
+ metric: {
275
+ fires_per_day: round(firesPerDay, 2),
276
+ obeyed_ratio: 0,
277
+ override_count_7d: row.rejected,
278
+ accepted_ratio: round(acceptedRatio, 2),
279
+ fires_7d: row.fires,
280
+ },
281
+ suggestion: `Workflow rule "${row.rule_id}" fired ${row.fires} time(s) but only ${row.accepted} were accepted ` +
282
+ `(${Math.round(acceptedRatio * 100)}%, below C8 target ${Math.round(C8_ACCEPTANCE_TARGET * 100)}%). ` +
283
+ `Consider tightening the matcher or disabling.`,
284
+ apply_action: {
285
+ type: 'disable_rule',
286
+ payload: { rule_id: row.rule_id, rule_kind: 'workflow_recommend' },
287
+ },
288
+ });
289
+ }
290
+ }
291
+ return out;
292
+ }
293
+ // ── Skill suggestions ──────────────────────────────────────────────────
294
+ buildSkillSuggestions(sinceMillis, windowDays) {
295
+ const out = [];
296
+ const rows = this.storage.querySkillAggregates(sinceMillis);
297
+ for (const row of rows) {
298
+ const successRate = row.n > 0 ? row.succ / row.n : 0;
299
+ const zeroRate = row.n > 0 ? row.zero / row.n : 0;
300
+ const matchedPerDay = row.n / Math.max(1, windowDays);
301
+ if (row.zero >= SKILL_ZERO_RESULT_THRESHOLD && successRate < SKILL_LOW_SUCCESS_FLOOR) {
302
+ out.push({
303
+ kind: 'skill_tuning',
304
+ skill_id: row.skill_id,
305
+ metric: {
306
+ matched_per_day: round(matchedPerDay, 2),
307
+ success_rate: round(successRate, 2),
308
+ zero_result_rate: round(zeroRate, 2),
309
+ invocations_7d: row.n,
310
+ },
311
+ suggestion: `Skill "${row.skill_id}" has ${row.zero} failed invocations out of ${row.n} ` +
312
+ `(${Math.round(zeroRate * 100)}% failure rate). Review keywords or disable.`,
313
+ apply_action: {
314
+ type: 'update_keywords',
315
+ payload: { skill_id: row.skill_id },
316
+ },
317
+ });
318
+ }
319
+ }
320
+ return out;
321
+ }
322
+ // ── KB suggestions ─────────────────────────────────────────────────────
323
+ buildKbSuggestions(since, windowDays) {
324
+ const out = [];
325
+ // Aggregate cite count + score sum + top-2 count per page from
326
+ // injections.metadata_json. metadata is JSON array of {name, score, refs}.
327
+ const rows = this.storage.queryKbInjectionMetadata(since);
328
+ const map = new Map();
329
+ for (const row of rows) {
330
+ try {
331
+ const arr = JSON.parse(row.metadata_json);
332
+ if (!Array.isArray(arr))
333
+ continue;
334
+ arr.forEach((item, idx) => {
335
+ if (!item || typeof item.name !== 'string')
336
+ return;
337
+ const cur = map.get(item.name) ?? { cited: 0, scoreSum: 0, inTop2: 0 };
338
+ cur.cited += 1;
339
+ cur.scoreSum += typeof item.score === 'number' ? item.score : 0;
340
+ if (idx < 2)
341
+ cur.inTop2 += 1;
342
+ map.set(item.name, cur);
343
+ });
344
+ }
345
+ catch {
346
+ /* skip malformed */
347
+ }
348
+ }
349
+ for (const [name, acc] of map.entries()) {
350
+ const avgScore = acc.cited > 0 ? acc.scoreSum / acc.cited : 0;
351
+ const citedPerDay = acc.cited / Math.max(1, windowDays);
352
+ // Page cited but always low score → suggest regenerate (probably stale).
353
+ if (acc.cited >= 3 && avgScore < KB_LOW_SCORE_FLOOR) {
354
+ out.push({
355
+ kind: 'kb_tuning',
356
+ page_name: name,
357
+ metric: {
358
+ cited_per_day: round(citedPerDay, 2),
359
+ avg_score: round(avgScore, 1),
360
+ in_top_2_count_7d: acc.inTop2,
361
+ cited_7d: acc.cited,
362
+ },
363
+ suggestion: `KB page "${name}" cited ${acc.cited} time(s) but avg score is ${round(avgScore, 1)} ` +
364
+ `(below ${KB_LOW_SCORE_FLOOR}). Run \`cf knowledge build --apply --module=<name>\` to refresh.`,
365
+ apply_action: {
366
+ type: 'regenerate_module',
367
+ payload: { page_name: name },
368
+ },
369
+ });
370
+ }
371
+ }
372
+ // Pages that are NEVER cited in window → suggest archive. We only know
373
+ // about pages that DID get cited (from metadata_json), so "never cited"
374
+ // is computed against a caller-supplied list. v1: skip this — it would
375
+ // require walking .forge-knowledge/, which the daemon does not own.
376
+ return out;
377
+ }
378
+ }
379
+ function round(n, digits) {
380
+ const m = Math.pow(10, digits);
381
+ return Math.round(n * m) / m;
382
+ }
383
+ // ─── Markdown rendering (CLI weekly report) ───────────────────────────────
384
+ /**
385
+ * Render a TuningReport as a markdown document. Used by `cf insights weekly`.
386
+ * Kept here (not in CLI) so the same renderer can power email digests later.
387
+ */
388
+ export function renderReportMarkdown(report) {
389
+ const lines = [];
390
+ lines.push(`# Forge tuning report (${report.window_days}d window)`);
391
+ lines.push('');
392
+ lines.push(`Generated at: ${report.generated_at}`);
393
+ lines.push('');
394
+ lines.push(`## KPIs`);
395
+ lines.push('');
396
+ lines.push(`- **C4 intercept obeyed**: ${pct(report.summary.intercept_obeyed_ratio)} ` +
397
+ `(${band(report.summary.intercept_obeyed_band)}, target ${pct(C4_OBEYED_TARGET)})`);
398
+ lines.push(`- **C8 workflow accepted**: ${pct(report.summary.workflow_acceptance_ratio)} ` +
399
+ `(${band(report.summary.workflow_acceptance_band)}, target ${pct(C8_ACCEPTANCE_TARGET)})`);
400
+ lines.push(`- **C1 KB injections**: ${report.summary.kb_inject_count}`);
401
+ const outcome = report.summary.session_outcome;
402
+ lines.push(`- **Session outcome**: ${outcome.success} success / ${outcome.partial} partial / ` +
403
+ `${outcome.failed} failed / ${outcome.abandoned} abandoned / ${outcome.unclassified} unclassified`);
404
+ lines.push('');
405
+ if (report.summary.rule_violations_top.length > 0) {
406
+ lines.push(`## Top intercept rules (by fire count)`);
407
+ lines.push('');
408
+ for (const r of report.summary.rule_violations_top) {
409
+ lines.push(`- \`${r.rule_id}\` — ${r.n} fires`);
410
+ }
411
+ lines.push('');
412
+ }
413
+ if (report.summary.kb_top_pages.length > 0) {
414
+ lines.push(`## Top cited KB pages`);
415
+ lines.push('');
416
+ for (const p of report.summary.kb_top_pages) {
417
+ lines.push(`- \`${p.name}\` — cited ${p.cited}x`);
418
+ }
419
+ lines.push('');
420
+ }
421
+ if (report.summary.skill_top.length > 0) {
422
+ lines.push(`## Top skill invocations`);
423
+ lines.push('');
424
+ for (const s of report.summary.skill_top) {
425
+ lines.push(`- \`${s.skill_id}\` — ${s.n} invocations, ${pct(s.success_rate)} success`);
426
+ }
427
+ lines.push('');
428
+ }
429
+ lines.push(`## Suggestions (${report.suggestions.length})`);
430
+ lines.push('');
431
+ if (report.suggestions.length === 0) {
432
+ lines.push('_No tuning suggestions — system in balance._');
433
+ }
434
+ else {
435
+ for (const s of report.suggestions) {
436
+ const id = s.kind === 'rule_tuning' ? s.rule_id : s.kind === 'skill_tuning' ? s.skill_id : s.page_name;
437
+ lines.push(`### [${s.kind}] ${id}`);
438
+ lines.push('');
439
+ lines.push(s.suggestion);
440
+ if (s.apply_action) {
441
+ lines.push('');
442
+ lines.push(`Suggested action: \`${s.apply_action.type}\` — ${JSON.stringify(s.apply_action.payload)}`);
443
+ }
444
+ lines.push('');
445
+ }
446
+ }
447
+ return lines.join('\n');
448
+ }
449
+ function pct(n) {
450
+ return `${Math.round(n * 100)}%`;
451
+ }
452
+ function band(b) {
453
+ return b === 'green' ? 'green' : b === 'yellow' ? 'yellow' : 'red';
454
+ }
455
+ //# sourceMappingURL=feedback-aggregator.js.map