@winspan/claude-forge 9.2.0 → 9.12.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 (591) hide show
  1. package/DEVELOPMENT.md +80 -19
  2. package/README.md +13 -6
  3. package/dist/catalogs/agents.json +19 -24
  4. package/dist/catalogs/skills.json +139 -27
  5. package/dist/claudemd/templates/swarm-protocol.md +1 -1
  6. package/dist/cli/commands/agent.d.ts +169 -0
  7. package/dist/cli/commands/agent.d.ts.map +1 -0
  8. package/dist/cli/commands/agent.js +690 -0
  9. package/dist/cli/commands/agent.js.map +1 -0
  10. package/dist/cli/commands/codegraph.d.ts +17 -0
  11. package/dist/cli/commands/codegraph.d.ts.map +1 -0
  12. package/dist/cli/commands/codegraph.js +263 -0
  13. package/dist/cli/commands/codegraph.js.map +1 -0
  14. package/dist/cli/commands/decisions.d.ts.map +1 -1
  15. package/dist/cli/commands/decisions.js +46 -9
  16. package/dist/cli/commands/decisions.js.map +1 -1
  17. package/dist/cli/commands/executions.d.ts.map +1 -1
  18. package/dist/cli/commands/executions.js +2 -1
  19. package/dist/cli/commands/executions.js.map +1 -1
  20. package/dist/cli/commands/insights-goal-check.d.ts +5 -1
  21. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -1
  22. package/dist/cli/commands/insights-goal-check.js +15 -15
  23. package/dist/cli/commands/insights-goal-check.js.map +1 -1
  24. package/dist/cli/commands/knowledge.d.ts +51 -0
  25. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  26. package/dist/cli/commands/knowledge.js +202 -29
  27. package/dist/cli/commands/knowledge.js.map +1 -1
  28. package/dist/cli/commands/loop.d.ts +95 -0
  29. package/dist/cli/commands/loop.d.ts.map +1 -0
  30. package/dist/cli/commands/loop.js +408 -0
  31. package/dist/cli/commands/loop.js.map +1 -0
  32. package/dist/cli/commands/maintenance.d.ts +33 -0
  33. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  34. package/dist/cli/commands/maintenance.js +75 -0
  35. package/dist/cli/commands/maintenance.js.map +1 -0
  36. package/dist/cli/commands/mcp.d.ts +23 -0
  37. package/dist/cli/commands/mcp.d.ts.map +1 -1
  38. package/dist/cli/commands/mcp.js +82 -0
  39. package/dist/cli/commands/mcp.js.map +1 -1
  40. package/dist/cli/commands/skills.d.ts +131 -0
  41. package/dist/cli/commands/skills.d.ts.map +1 -1
  42. package/dist/cli/commands/skills.js +409 -9
  43. package/dist/cli/commands/skills.js.map +1 -1
  44. package/dist/cli/commands/stats.d.ts.map +1 -1
  45. package/dist/cli/commands/stats.js +9 -2
  46. package/dist/cli/commands/stats.js.map +1 -1
  47. package/dist/cli/index.js +8 -0
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/core/constants.d.ts +37 -0
  50. package/dist/core/constants.d.ts.map +1 -1
  51. package/dist/core/constants.js +43 -0
  52. package/dist/core/constants.js.map +1 -1
  53. package/dist/core/diagnostics/checks.d.ts.map +1 -1
  54. package/dist/core/diagnostics/checks.js +2 -1
  55. package/dist/core/diagnostics/checks.js.map +1 -1
  56. package/dist/core/diagnostics/daemon-status.d.ts +1 -1
  57. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -1
  58. package/dist/core/diagnostics/daemon-status.js +1 -1
  59. package/dist/core/diagnostics/daemon-status.js.map +1 -1
  60. package/dist/core/diagnostics/entropy-checks.d.ts +3 -2
  61. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -1
  62. package/dist/core/diagnostics/entropy-checks.js +10 -5
  63. package/dist/core/diagnostics/entropy-checks.js.map +1 -1
  64. package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
  65. package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
  66. package/dist/core/diagnostics/heartbeat-reader.js +50 -0
  67. package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
  68. package/dist/core/event-fields.d.ts +27 -0
  69. package/dist/core/event-fields.d.ts.map +1 -1
  70. package/dist/core/event-fields.js +43 -0
  71. package/dist/core/event-fields.js.map +1 -1
  72. package/dist/core/governance/global-inject.d.ts +34 -4
  73. package/dist/core/governance/global-inject.d.ts.map +1 -1
  74. package/dist/core/governance/global-inject.js +80 -25
  75. package/dist/core/governance/global-inject.js.map +1 -1
  76. package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
  77. package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
  78. package/dist/core/insights/agent-anchor-guard.js +119 -0
  79. package/dist/core/insights/agent-anchor-guard.js.map +1 -0
  80. package/dist/core/insights/agent-distill-context.d.ts +55 -0
  81. package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
  82. package/dist/core/insights/agent-distill-context.js +146 -0
  83. package/dist/core/insights/agent-distill-context.js.map +1 -0
  84. package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
  85. package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
  86. package/dist/core/insights/agent-distill-spawn.js +179 -0
  87. package/dist/core/insights/agent-distill-spawn.js.map +1 -0
  88. package/dist/core/insights/agent-drift.d.ts +66 -0
  89. package/dist/core/insights/agent-drift.d.ts.map +1 -0
  90. package/dist/core/insights/agent-drift.js +109 -0
  91. package/dist/core/insights/agent-drift.js.map +1 -0
  92. package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
  93. package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
  94. package/dist/core/insights/agent-evolution-sources.js +36 -0
  95. package/dist/core/insights/agent-evolution-sources.js.map +1 -0
  96. package/dist/core/insights/agent-health.d.ts +142 -0
  97. package/dist/core/insights/agent-health.d.ts.map +1 -0
  98. package/dist/core/insights/agent-health.js +296 -0
  99. package/dist/core/insights/agent-health.js.map +1 -0
  100. package/dist/core/insights/agent-patch-apply.d.ts +45 -0
  101. package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
  102. package/dist/core/insights/agent-patch-apply.js +165 -0
  103. package/dist/core/insights/agent-patch-apply.js.map +1 -0
  104. package/dist/core/insights/agent-suggest.d.ts +128 -0
  105. package/dist/core/insights/agent-suggest.d.ts.map +1 -0
  106. package/dist/core/insights/agent-suggest.js +284 -0
  107. package/dist/core/insights/agent-suggest.js.map +1 -0
  108. package/dist/core/insights/coverage-tiers.d.ts +46 -0
  109. package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
  110. package/dist/core/insights/coverage-tiers.js +95 -0
  111. package/dist/core/insights/coverage-tiers.js.map +1 -0
  112. package/dist/{daemon/services → core/insights}/experience-extractor.d.ts +0 -7
  113. package/dist/core/insights/experience-extractor.d.ts.map +1 -0
  114. package/dist/{daemon/services → core/insights}/experience-extractor.js +5 -9
  115. package/dist/core/insights/experience-extractor.js.map +1 -0
  116. package/dist/{daemon/services → core/insights}/violation-reporter.d.ts +20 -1
  117. package/dist/core/insights/violation-reporter.d.ts.map +1 -0
  118. package/dist/{daemon/services → core/insights}/violation-reporter.js +56 -4
  119. package/dist/core/insights/violation-reporter.js.map +1 -0
  120. package/dist/core/loop/loop-engine.d.ts +140 -0
  121. package/dist/core/loop/loop-engine.d.ts.map +1 -0
  122. package/dist/core/loop/loop-engine.js +266 -0
  123. package/dist/core/loop/loop-engine.js.map +1 -0
  124. package/dist/core/queue/index.d.ts.map +1 -1
  125. package/dist/core/queue/index.js +2 -1
  126. package/dist/core/queue/index.js.map +1 -1
  127. package/dist/core/storage/base.d.ts +159 -0
  128. package/dist/core/storage/base.d.ts.map +1 -1
  129. package/dist/core/storage/base.js +523 -0
  130. package/dist/core/storage/base.js.map +1 -1
  131. package/dist/core/storage/codegraph-types.d.ts +79 -0
  132. package/dist/core/storage/codegraph-types.d.ts.map +1 -0
  133. package/dist/core/storage/codegraph-types.js +14 -0
  134. package/dist/core/storage/codegraph-types.js.map +1 -0
  135. package/dist/core/storage/codegraph.d.ts +186 -0
  136. package/dist/core/storage/codegraph.d.ts.map +1 -0
  137. package/dist/core/storage/codegraph.js +452 -0
  138. package/dist/core/storage/codegraph.js.map +1 -0
  139. package/dist/core/storage/decisions.d.ts +30 -5
  140. package/dist/core/storage/decisions.d.ts.map +1 -1
  141. package/dist/core/storage/decisions.js +45 -13
  142. package/dist/core/storage/decisions.js.map +1 -1
  143. package/dist/core/storage/events.d.ts +127 -0
  144. package/dist/core/storage/events.d.ts.map +1 -1
  145. package/dist/core/storage/events.js +318 -3
  146. package/dist/core/storage/events.js.map +1 -1
  147. package/dist/core/storage/feedback.d.ts +3 -23
  148. package/dist/core/storage/feedback.d.ts.map +1 -1
  149. package/dist/core/storage/feedback.js +37 -38
  150. package/dist/core/storage/feedback.js.map +1 -1
  151. package/dist/core/storage/injections.d.ts +40 -0
  152. package/dist/core/storage/injections.d.ts.map +1 -1
  153. package/dist/core/storage/injections.js +69 -0
  154. package/dist/core/storage/injections.js.map +1 -1
  155. package/dist/core/storage/knowledge.d.ts +226 -0
  156. package/dist/core/storage/knowledge.d.ts.map +1 -1
  157. package/dist/core/storage/knowledge.js +391 -4
  158. package/dist/core/storage/knowledge.js.map +1 -1
  159. package/dist/core/storage/pipeline-rollup.d.ts +1 -7
  160. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -1
  161. package/dist/core/storage/pipeline-rollup.js +18 -57
  162. package/dist/core/storage/pipeline-rollup.js.map +1 -1
  163. package/dist/core/storage/routing.d.ts +34 -0
  164. package/dist/core/storage/routing.d.ts.map +1 -1
  165. package/dist/core/storage/routing.js +92 -2
  166. package/dist/core/storage/routing.js.map +1 -1
  167. package/dist/core/storage/rows.d.ts +5 -25
  168. package/dist/core/storage/rows.d.ts.map +1 -1
  169. package/dist/core/storage/schema.sql +92 -27
  170. package/dist/core/storage/sessions.d.ts.map +1 -1
  171. package/dist/core/storage/sessions.js +2 -1
  172. package/dist/core/storage/sessions.js.map +1 -1
  173. package/dist/core/storage/skills.d.ts +159 -0
  174. package/dist/core/storage/skills.d.ts.map +1 -1
  175. package/dist/core/storage/skills.js +350 -4
  176. package/dist/core/storage/skills.js.map +1 -1
  177. package/dist/core/storage/sqlite.d.ts +81 -25
  178. package/dist/core/storage/sqlite.d.ts.map +1 -1
  179. package/dist/core/storage/sqlite.js +143 -45
  180. package/dist/core/storage/sqlite.js.map +1 -1
  181. package/dist/core/storage/tasks.d.ts +270 -0
  182. package/dist/core/storage/tasks.d.ts.map +1 -1
  183. package/dist/core/storage/tasks.js +495 -16
  184. package/dist/core/storage/tasks.js.map +1 -1
  185. package/dist/core/storage/tool-intercepts.d.ts +1 -1
  186. package/dist/core/storage/tool-intercepts.js +1 -1
  187. package/dist/core/types.d.ts +26 -3
  188. package/dist/core/types.d.ts.map +1 -1
  189. package/dist/core/types.js +1 -3
  190. package/dist/core/types.js.map +1 -1
  191. package/dist/core/utils/binary-paths.d.ts +32 -0
  192. package/dist/core/utils/binary-paths.d.ts.map +1 -1
  193. package/dist/core/utils/binary-paths.js +52 -0
  194. package/dist/core/utils/binary-paths.js.map +1 -1
  195. package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
  196. package/dist/{skills/distill → core/utils}/claude-cli-resolver.js +1 -1
  197. package/dist/core/utils/claude-cli-resolver.js.map +1 -0
  198. package/dist/core/utils/claude-cli-spawn.d.ts +1 -1
  199. package/dist/core/utils/claude-cli-spawn.js +2 -2
  200. package/dist/core/utils/claude-cli-spawn.js.map +1 -1
  201. package/dist/core/utils/noise-prompt.d.ts +1 -1
  202. package/dist/core/utils/noise-prompt.js +1 -1
  203. package/dist/core/utils/time.d.ts +26 -0
  204. package/dist/core/utils/time.d.ts.map +1 -1
  205. package/dist/core/utils/time.js +33 -0
  206. package/dist/core/utils/time.js.map +1 -1
  207. package/dist/daemon/config-store.d.ts.map +1 -1
  208. package/dist/daemon/config-store.js +14 -5
  209. package/dist/daemon/config-store.js.map +1 -1
  210. package/dist/daemon/event-parser.d.ts.map +1 -1
  211. package/dist/daemon/event-parser.js +5 -0
  212. package/dist/daemon/event-parser.js.map +1 -1
  213. package/dist/daemon/handlers/post-tool-use.d.ts +24 -16
  214. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  215. package/dist/daemon/handlers/post-tool-use.js +76 -116
  216. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  217. package/dist/daemon/handlers/pre-tool-use.d.ts +35 -10
  218. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
  219. package/dist/daemon/handlers/pre-tool-use.js +71 -38
  220. package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
  221. package/dist/daemon/handlers/stop.d.ts +20 -0
  222. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  223. package/dist/daemon/handlers/stop.js +96 -8
  224. package/dist/daemon/handlers/stop.js.map +1 -1
  225. package/dist/daemon/handlers/user-prompt.d.ts +16 -1
  226. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  227. package/dist/daemon/handlers/user-prompt.js +97 -56
  228. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  229. package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
  230. package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
  231. package/dist/daemon/handlers/violation-content-backfill.js +167 -0
  232. package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
  233. package/dist/daemon/index.d.ts +19 -0
  234. package/dist/daemon/index.d.ts.map +1 -1
  235. package/dist/daemon/index.js +125 -200
  236. package/dist/daemon/index.js.map +1 -1
  237. package/dist/daemon/rules/defaults.d.ts.map +1 -1
  238. package/dist/daemon/rules/defaults.js +151 -64
  239. package/dist/daemon/rules/defaults.js.map +1 -1
  240. package/dist/daemon/rules/types.d.ts +28 -22
  241. package/dist/daemon/rules/types.d.ts.map +1 -1
  242. package/dist/daemon/rules/workflow-defaults.js +9 -9
  243. package/dist/daemon/rules/workflow-defaults.js.map +1 -1
  244. package/dist/daemon/services/codegraph-sync.d.ts +94 -0
  245. package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
  246. package/dist/daemon/services/codegraph-sync.js +159 -0
  247. package/dist/daemon/services/codegraph-sync.js.map +1 -0
  248. package/dist/daemon/services/decision-hint.d.ts +47 -10
  249. package/dist/daemon/services/decision-hint.d.ts.map +1 -1
  250. package/dist/daemon/services/decision-hint.js +99 -24
  251. package/dist/daemon/services/decision-hint.js.map +1 -1
  252. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -1
  253. package/dist/daemon/services/event-ttl-sweep.js +3 -2
  254. package/dist/daemon/services/event-ttl-sweep.js.map +1 -1
  255. package/dist/daemon/services/feedback-aggregator.d.ts +14 -26
  256. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -1
  257. package/dist/daemon/services/feedback-aggregator.js +23 -63
  258. package/dist/daemon/services/feedback-aggregator.js.map +1 -1
  259. package/dist/daemon/services/heartbeat-writer.d.ts +6 -15
  260. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -1
  261. package/dist/daemon/services/heartbeat-writer.js +7 -36
  262. package/dist/daemon/services/heartbeat-writer.js.map +1 -1
  263. package/dist/daemon/services/kb-injector.d.ts +1 -1
  264. package/dist/daemon/services/kb-injector.d.ts.map +1 -1
  265. package/dist/daemon/services/kb-injector.js +10 -2
  266. package/dist/daemon/services/kb-injector.js.map +1 -1
  267. package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
  268. package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
  269. package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
  270. package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
  271. package/dist/daemon/services/loop-hint.d.ts +139 -0
  272. package/dist/daemon/services/loop-hint.d.ts.map +1 -0
  273. package/dist/daemon/services/loop-hint.js +272 -0
  274. package/dist/daemon/services/loop-hint.js.map +1 -0
  275. package/dist/daemon/services/outcome-classification-service.js +1 -1
  276. package/dist/daemon/services/outcome-classification-service.js.map +1 -1
  277. package/dist/daemon/services/task-segmenter.d.ts +11 -0
  278. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  279. package/dist/daemon/services/task-segmenter.js +48 -2
  280. package/dist/daemon/services/task-segmenter.js.map +1 -1
  281. package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
  282. package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
  283. package/dist/daemon/startup/maintenance-schedulers.js +294 -0
  284. package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
  285. package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
  286. package/dist/daemon/templates/agents/claudemd-writer.md +1 -0
  287. package/dist/daemon/templates/agents/coder.md +165 -8
  288. package/dist/daemon/templates/agents/decision-maker.md +107 -21
  289. package/dist/daemon/templates/agents/doc-reviewer.md +4 -1
  290. package/dist/daemon/templates/agents/harness-debug-full.md +85 -3
  291. package/dist/daemon/templates/agents/knowledge-builder.md +1 -0
  292. package/dist/daemon/templates/agents/patch-applier.md +1 -0
  293. package/dist/daemon/templates/agents/planner.md +55 -3
  294. package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
  295. package/dist/daemon/templates/agents/skill-distiller.md +1 -0
  296. package/dist/daemon/templates/agents/task-boundary-classifier.md +1 -0
  297. package/dist/daemon/templates/agents/verify-agent.md +128 -5
  298. package/dist/hooks/stop.sh +7 -1
  299. package/dist/knowledge/builder.js +36 -7
  300. package/dist/knowledge/builder.js.map +1 -1
  301. package/dist/knowledge/constants.d.ts +10 -5
  302. package/dist/knowledge/constants.d.ts.map +1 -1
  303. package/dist/knowledge/constants.js +10 -5
  304. package/dist/knowledge/constants.js.map +1 -1
  305. package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
  306. package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
  307. package/dist/knowledge/graph/edge-extractor.js +242 -0
  308. package/dist/knowledge/graph/edge-extractor.js.map +1 -0
  309. package/dist/knowledge/graph/impact.d.ts +73 -0
  310. package/dist/knowledge/graph/impact.d.ts.map +1 -0
  311. package/dist/knowledge/graph/impact.js +94 -0
  312. package/dist/knowledge/graph/impact.js.map +1 -0
  313. package/dist/knowledge/graph/types.d.ts +22 -0
  314. package/dist/knowledge/graph/types.d.ts.map +1 -0
  315. package/dist/knowledge/graph/types.js +13 -0
  316. package/dist/knowledge/graph/types.js.map +1 -0
  317. package/dist/knowledge/prompt.d.ts +9 -0
  318. package/dist/knowledge/prompt.d.ts.map +1 -1
  319. package/dist/knowledge/prompt.js +17 -5
  320. package/dist/knowledge/prompt.js.map +1 -1
  321. package/dist/knowledge/query.d.ts +13 -0
  322. package/dist/knowledge/query.d.ts.map +1 -1
  323. package/dist/knowledge/query.js +107 -10
  324. package/dist/knowledge/query.js.map +1 -1
  325. package/dist/knowledge/repo-map.d.ts +11 -5
  326. package/dist/knowledge/repo-map.d.ts.map +1 -1
  327. package/dist/knowledge/repo-map.js +42 -3
  328. package/dist/knowledge/repo-map.js.map +1 -1
  329. package/dist/knowledge/validator.d.ts.map +1 -1
  330. package/dist/knowledge/validator.js +69 -2
  331. package/dist/knowledge/validator.js.map +1 -1
  332. package/dist/mcp/server.d.ts +64 -8
  333. package/dist/mcp/server.d.ts.map +1 -1
  334. package/dist/mcp/server.js +233 -18
  335. package/dist/mcp/server.js.map +1 -1
  336. package/dist/skills/distill/distiller.js +1 -1
  337. package/dist/skills/distill/distiller.js.map +1 -1
  338. package/dist/skills/distilled/distilled-api-design.md +4 -0
  339. package/dist/skills/distilled/distilled-brainstorming.md +79 -0
  340. package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
  341. package/dist/skills/distilled/distilled-canvas-design.md +128 -0
  342. package/dist/skills/distilled/distilled-claude-api.md +185 -0
  343. package/dist/skills/distilled/distilled-creator.md +5 -2
  344. package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
  345. package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
  346. package/dist/skills/distilled/distilled-docx.md +231 -0
  347. package/dist/skills/distilled/distilled-executing-plans.md +85 -50
  348. package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
  349. package/dist/skills/distilled/distilled-frontend-design.md +118 -0
  350. package/dist/skills/distilled/distilled-harness-engineering.md +1 -1
  351. package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
  352. package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
  353. package/dist/skills/distilled/distilled-systematic-debugging.md +108 -260
  354. package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
  355. package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
  356. package/dist/skills/distilled/distilled-verification-before-completion.md +88 -78
  357. package/dist/skills/distilled/distilled-writing-skills.md +175 -0
  358. package/dist/skills/registry.d.ts +10 -50
  359. package/dist/skills/registry.d.ts.map +1 -1
  360. package/dist/skills/registry.js +7 -118
  361. package/dist/skills/registry.js.map +1 -1
  362. package/dist/skills/tools/pipeline-suggest.js +2 -2
  363. package/dist/skills/tools/pipeline-suggest.js.map +1 -1
  364. package/dist/skills/tools/skill-invoke.d.ts +2 -1
  365. package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
  366. package/dist/skills/tools/skill-invoke.js +3 -1
  367. package/dist/skills/tools/skill-invoke.js.map +1 -1
  368. package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
  369. package/dist/web/analytics/anti-pattern-detector.js +6 -1
  370. package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
  371. package/dist/web/analytics/drift-detector.d.ts +6 -0
  372. package/dist/web/analytics/drift-detector.d.ts.map +1 -1
  373. package/dist/web/analytics/drift-detector.js +15 -8
  374. package/dist/web/analytics/drift-detector.js.map +1 -1
  375. package/dist/web/analytics/weekly-report.d.ts +13 -0
  376. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  377. package/dist/web/analytics/weekly-report.js +17 -3
  378. package/dist/web/analytics/weekly-report.js.map +1 -1
  379. package/dist/web/routes/_helpers.d.ts +31 -0
  380. package/dist/web/routes/_helpers.d.ts.map +1 -1
  381. package/dist/web/routes/_helpers.js +33 -0
  382. package/dist/web/routes/_helpers.js.map +1 -1
  383. package/dist/web/routes/agent-distill.d.ts +49 -0
  384. package/dist/web/routes/agent-distill.d.ts.map +1 -0
  385. package/dist/web/routes/agent-distill.js +526 -0
  386. package/dist/web/routes/agent-distill.js.map +1 -0
  387. package/dist/web/routes/config.d.ts +56 -0
  388. package/dist/web/routes/config.d.ts.map +1 -0
  389. package/dist/web/routes/config.js +243 -0
  390. package/dist/web/routes/config.js.map +1 -0
  391. package/dist/web/routes/decisions.js +1 -1
  392. package/dist/web/routes/decisions.js.map +1 -1
  393. package/dist/web/routes/error-handler.d.ts +0 -4
  394. package/dist/web/routes/error-handler.d.ts.map +1 -1
  395. package/dist/web/routes/error-handler.js +0 -8
  396. package/dist/web/routes/error-handler.js.map +1 -1
  397. package/dist/web/routes/events.d.ts.map +1 -1
  398. package/dist/web/routes/events.js +2 -1
  399. package/dist/web/routes/events.js.map +1 -1
  400. package/dist/web/routes/insights.d.ts.map +1 -1
  401. package/dist/web/routes/insights.js +0 -0
  402. package/dist/web/routes/insights.js.map +1 -1
  403. package/dist/web/routes/knowledge.d.ts +43 -2
  404. package/dist/web/routes/knowledge.d.ts.map +1 -1
  405. package/dist/web/routes/knowledge.js +117 -6
  406. package/dist/web/routes/knowledge.js.map +1 -1
  407. package/dist/web/routes/pipeline.d.ts +0 -9
  408. package/dist/web/routes/pipeline.d.ts.map +1 -1
  409. package/dist/web/routes/pipeline.js +0 -4
  410. package/dist/web/routes/pipeline.js.map +1 -1
  411. package/dist/web/routes/rules.d.ts.map +1 -1
  412. package/dist/web/routes/rules.js +20 -6
  413. package/dist/web/routes/rules.js.map +1 -1
  414. package/dist/web/routes/sessions.d.ts.map +1 -1
  415. package/dist/web/routes/sessions.js +8 -7
  416. package/dist/web/routes/sessions.js.map +1 -1
  417. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  418. package/dist/web/routes/skill-stats.js +153 -16
  419. package/dist/web/routes/skill-stats.js.map +1 -1
  420. package/dist/web/routes/skills-distill.js +1 -1
  421. package/dist/web/routes/skills-distill.js.map +1 -1
  422. package/dist/web/routes/stats.d.ts.map +1 -1
  423. package/dist/web/routes/stats.js +2 -1
  424. package/dist/web/routes/stats.js.map +1 -1
  425. package/dist/web/routes/task-timeline.d.ts +95 -19
  426. package/dist/web/routes/task-timeline.d.ts.map +1 -1
  427. package/dist/web/routes/task-timeline.js +344 -88
  428. package/dist/web/routes/task-timeline.js.map +1 -1
  429. package/dist/web/routes/tasks.d.ts.map +1 -1
  430. package/dist/web/routes/tasks.js +52 -30
  431. package/dist/web/routes/tasks.js.map +1 -1
  432. package/dist/web/routes/violations.d.ts +1 -1
  433. package/dist/web/routes/violations.d.ts.map +1 -1
  434. package/dist/web/routes/violations.js +3 -2
  435. package/dist/web/routes/violations.js.map +1 -1
  436. package/dist/web/server.d.ts.map +1 -1
  437. package/dist/web/server.js +20 -0
  438. package/dist/web/server.js.map +1 -1
  439. package/dist/web/services/agent-distill-manager.d.ts +122 -0
  440. package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
  441. package/dist/web/services/agent-distill-manager.js +397 -0
  442. package/dist/web/services/agent-distill-manager.js.map +1 -0
  443. package/dist/web/services/distill-manager.d.ts +47 -0
  444. package/dist/web/services/distill-manager.d.ts.map +1 -1
  445. package/dist/web/services/distill-manager.js +103 -0
  446. package/dist/web/services/distill-manager.js.map +1 -1
  447. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
  448. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
  449. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
  450. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
  451. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
  452. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
  453. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
  454. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
  455. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
  456. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
  457. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
  458. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
  459. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
  460. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
  461. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
  462. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
  463. package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
  464. package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
  465. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
  466. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
  467. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
  468. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
  469. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
  470. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
  471. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
  472. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
  473. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
  474. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
  475. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
  476. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
  477. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js → MarkdownRenderer-DlDQNihj.js} +2 -2
  478. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js.map → MarkdownRenderer-DlDQNihj.js.map} +1 -1
  479. package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
  480. package/dist/web/static/assets/{NotFound-BQPh0vaF.js.map → NotFound-LMzbP51V.js.map} +1 -1
  481. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
  482. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
  483. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
  484. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
  485. package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
  486. package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
  487. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
  488. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
  489. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
  490. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
  491. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
  492. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
  493. package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
  494. package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
  495. package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
  496. package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
  497. package/dist/web/static/assets/{index-7bl3kbcx.css → index-B_v_MKlb.css} +1 -1
  498. package/dist/web/static/assets/index-DileOOE4.js +4 -0
  499. package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
  500. package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
  501. package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
  502. package/dist/web/static/assets/{outcome-DUn1NjlC.js → outcome-BKGy9azt.js} +2 -2
  503. package/dist/web/static/assets/{outcome-DUn1NjlC.js.map → outcome-BKGy9azt.js.map} +1 -1
  504. package/dist/web/static/assets/{query-S6X1S7K9.js → query-CgCOpYWf.js} +2 -2
  505. package/dist/web/static/assets/{query-S6X1S7K9.js.map → query-CgCOpYWf.js.map} +1 -1
  506. package/dist/web/static/assets/{react-router-JVUrkhdd.js → react-router-Cxmg8RuL.js} +3 -3
  507. package/dist/web/static/assets/{react-router-JVUrkhdd.js.map → react-router-Cxmg8RuL.js.map} +1 -1
  508. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js → syntax-highlighter-BDYycNja.js} +3 -3
  509. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js.map → syntax-highlighter-BDYycNja.js.map} +1 -1
  510. package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
  511. package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
  512. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
  513. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
  514. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
  515. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
  516. package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
  517. package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
  518. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
  519. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
  520. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
  521. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
  522. package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
  523. package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
  524. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
  525. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
  526. package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
  527. package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
  528. package/dist/web/static/index.html +6 -6
  529. package/package.json +5 -3
  530. package/dist/core/storage/workflow-recommendations.d.ts +0 -124
  531. package/dist/core/storage/workflow-recommendations.d.ts.map +0 -1
  532. package/dist/core/storage/workflow-recommendations.js +0 -274
  533. package/dist/core/storage/workflow-recommendations.js.map +0 -1
  534. package/dist/daemon/services/experience-extractor.d.ts.map +0 -1
  535. package/dist/daemon/services/experience-extractor.js.map +0 -1
  536. package/dist/daemon/services/violation-reporter.d.ts.map +0 -1
  537. package/dist/daemon/services/violation-reporter.js.map +0 -1
  538. package/dist/daemon/templates/agents/harness-hotfix.md +0 -99
  539. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +0 -104
  540. package/dist/daemon/templates/agents/refactor-specialist.md +0 -98
  541. package/dist/skills/distill/claude-cli-resolver.d.ts.map +0 -1
  542. package/dist/skills/distill/claude-cli-resolver.js.map +0 -1
  543. package/dist/skills/distilled/distilled-defi-amm-security.md +0 -293
  544. package/dist/skills/keyword-score.d.ts +0 -29
  545. package/dist/skills/keyword-score.d.ts.map +0 -1
  546. package/dist/skills/keyword-score.js +0 -54
  547. package/dist/skills/keyword-score.js.map +0 -1
  548. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +0 -2
  549. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +0 -1
  550. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +0 -2
  551. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +0 -1
  552. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +0 -3
  553. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +0 -1
  554. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +0 -2
  555. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +0 -1
  556. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +0 -2
  557. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +0 -1
  558. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +0 -2
  559. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +0 -1
  560. package/dist/web/static/assets/DriftTab-DqpepOhI.js +0 -2
  561. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +0 -1
  562. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +0 -3
  563. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +0 -1
  564. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +0 -2
  565. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +0 -1
  566. package/dist/web/static/assets/NotFound-BQPh0vaF.js +0 -2
  567. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +0 -2
  568. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +0 -1
  569. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +0 -2
  570. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +0 -1
  571. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +0 -2
  572. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +0 -1
  573. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +0 -2
  574. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +0 -1
  575. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +0 -2
  576. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +0 -1
  577. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +0 -6
  578. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +0 -1
  579. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +0 -3
  580. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +0 -1
  581. package/dist/web/static/assets/arco-Bhi3a6Qp.js +0 -14
  582. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +0 -1
  583. package/dist/web/static/assets/charts-BuHQWDbQ.js +0 -37
  584. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +0 -1
  585. package/dist/web/static/assets/index-BIYnq1Dx.js +0 -4
  586. package/dist/web/static/assets/index-BIYnq1Dx.js.map +0 -1
  587. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +0 -2
  588. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +0 -1
  589. package/dist/web/static/assets/vendor-DWgdB1eY.js +0 -65
  590. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +0 -1
  591. /package/dist/{skills/distill → core/utils}/claude-cli-resolver.d.ts +0 -0
@@ -8,7 +8,6 @@
8
8
  *
9
9
  * Scope: pure read-only aggregates over already-written fact tables
10
10
  * • tool_intercepts (intercept obeyed ratio, top noisy rules)
11
- * • workflow_recommendations (C8 weighted accepted ratio, per-rule rollup)
12
11
  * • injections (KB) (kb_inject_count, metadata_json scan)
13
12
  * • skill_invocations (skill_top + skill rollup)
14
13
  * • sessions (outcome distribution)
@@ -36,14 +35,22 @@ export class FeedbackOperations {
36
35
  * `cli/commands/insights-goal-check.ts`. `override_count` is still
37
36
  * reported separately so the web dashboard can surface the raw counter.
38
37
  */
39
- queryInterceptObeyedSummary(sinceIso) {
38
+ queryInterceptObeyedSummary(sinceIso, projectPath) {
39
+ // decision 39839e30 (2026-06-13): optional per-project scope for the
40
+ // workplace 听劝率 KPI. tool_intercepts carries project_path directly →
41
+ // an additive `AND project_path = ?`. Omitting projectPath preserves the
42
+ // exact legacy all-projects aggregate (no clause appended).
43
+ const projClause = projectPath ? 'AND project_path = ?' : '';
44
+ const params = [sinceIso];
45
+ if (projectPath)
46
+ params.push(projectPath);
40
47
  const row = this.db
41
48
  .prepare(`SELECT
42
49
  1.0 * SUM(CASE WHEN decision='deny' AND outcome='obeyed' THEN 1 ELSE 0 END) /
43
50
  NULLIF(SUM(CASE WHEN decision='deny' AND outcome IN ('obeyed','override') THEN 1 ELSE 0 END), 0) AS r,
44
51
  SUM(CASE WHEN decision='deny' AND outcome='override' THEN 1 ELSE 0 END) AS overrides
45
- FROM tool_intercepts WHERE timestamp >= ?`)
46
- .get(sinceIso);
52
+ FROM tool_intercepts WHERE timestamp >= ? ${projClause}`)
53
+ .get(...params);
47
54
  return {
48
55
  ratio: row?.r ?? 0,
49
56
  override_count: row?.overrides ?? 0,
@@ -96,39 +103,23 @@ export class FeedbackOperations {
96
103
  GROUP BY rule_id`)
97
104
  .all(sinceIso);
98
105
  }
99
- // ── workflow_recommendations ───────────────────────────────────────────
100
- /**
101
- * C8 — weighted accepted ratio over `workflow_recommendations` since
102
- * `sinceIso`. Weighting: accepted=1.0, partial_accepted=0.5,
103
- * rejected/bypassed/ignored=0. `pending` rows excluded from denominator.
104
- */
105
- queryWorkflowAcceptanceSummary(sinceIso) {
106
- const row = this.db
107
- .prepare(`SELECT 1.0 * (
108
- SUM(CASE WHEN outcome='accepted' THEN 1 ELSE 0 END) * 1.0
109
- + SUM(CASE WHEN outcome='partial_accepted' THEN 1 ELSE 0 END) * 0.5
110
- ) / NULLIF(SUM(CASE WHEN outcome IS NOT NULL AND outcome <> 'pending' THEN 1 ELSE 0 END), 0) AS r
111
- FROM workflow_recommendations WHERE timestamp >= ?`)
112
- .get(sinceIso);
113
- return { ratio: row?.r ?? 0 };
114
- }
115
- /** Per-rule workflow recommendation outcome aggregates. */
116
- queryWorkflowRuleAggregates(sinceIso) {
117
- return this.db
118
- .prepare(`SELECT
119
- rule_id,
120
- COUNT(*) AS fires,
121
- SUM(CASE WHEN outcome='accepted' THEN 1 ELSE 0 END) AS accepted,
122
- SUM(CASE WHEN outcome='partial_accepted' THEN 1 ELSE 0 END) AS partial,
123
- SUM(CASE WHEN outcome='rejected' THEN 1 ELSE 0 END) AS rejected
124
- FROM workflow_recommendations
125
- WHERE timestamp >= ?
126
- GROUP BY rule_id`)
127
- .all(sinceIso);
128
- }
129
106
  // ── KB injections ──────────────────────────────────────────────────────
130
107
  /** C1 — total KB injection rows in window. */
131
- countKbInjections(sinceIso) {
108
+ countKbInjections(sinceIso, projectPath) {
109
+ // decision 39839e30 (2026-06-13): optional per-project scope for the
110
+ // workplace KB注入 KPI. injections has NO project_path column — it is
111
+ // joined to sessions on session_id to recover the project. Omitting
112
+ // projectPath preserves the exact legacy un-joined COUNT (no JOIN added).
113
+ if (projectPath) {
114
+ const row = this.db
115
+ .prepare(`SELECT COUNT(*) AS n FROM injections i
116
+ JOIN sessions s ON s.session_id = i.session_id
117
+ WHERE i.source_handler = 'UserPromptSubmitHandler:kb'
118
+ AND i.timestamp >= ?
119
+ AND s.project_path = ?`)
120
+ .get(sinceIso, projectPath);
121
+ return row?.n ?? 0;
122
+ }
132
123
  const row = this.db
133
124
  .prepare(`SELECT COUNT(*) AS n FROM injections
134
125
  WHERE source_handler = 'UserPromptSubmitHandler:kb' AND timestamp >= ?`)
@@ -175,13 +166,21 @@ export class FeedbackOperations {
175
166
  * Distribution of session outcomes for rows whose
176
167
  * COALESCE(classified_at, start_time) >= sinceIso.
177
168
  */
178
- querySessionOutcomeDistribution(sinceIso) {
169
+ querySessionOutcomeDistribution(sinceIso, projectPath) {
170
+ // decision 39839e30 (2026-06-13): optional per-project scope for the
171
+ // workplace 结果分布 KPI. sessions carries project_path directly → an
172
+ // additive `AND project_path = ?`. Omitting projectPath preserves the
173
+ // exact legacy all-projects distribution.
174
+ const projClause = projectPath ? 'AND project_path = ?' : '';
175
+ const params = [sinceIso];
176
+ if (projectPath)
177
+ params.push(projectPath);
179
178
  return this.db
180
179
  .prepare(`SELECT COALESCE(outcome, 'unclassified') AS o, COUNT(*) AS n
181
180
  FROM sessions
182
- WHERE COALESCE(classified_at, start_time) >= ?
181
+ WHERE COALESCE(classified_at, start_time) >= ? ${projClause}
183
182
  GROUP BY o`)
184
- .all(sinceIso);
183
+ .all(...params);
185
184
  }
186
185
  }
187
186
  //# sourceMappingURL=feedback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/core/storage/feedback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/core/storage/feedback.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,46 @@ export declare class InjectionOperations {
28
28
  private readonly writeInjectionStmt;
29
29
  constructor(db: Database.Database);
30
30
  writeInjection(injection: Injection): void;
31
+ /**
32
+ * KB 采纳 telemetry(decision 148f7a0a):把同一 session 中所有 KB 注入行
33
+ * (source_handler LIKE '%:kb')里尚未标记的(adopted_at IS NULL)盖上
34
+ * 采纳时间戳。由 PostToolUse handler 在观察到主动 KB MCP 调用
35
+ * (tool_name 以 'mcp__claude-forge__knowledge' 开头)时调用。
36
+ *
37
+ * 只标记未标记行 —— 同会话第二次 KB 调用不会覆盖首次采纳时间。
38
+ * 返回受影响行数(0 = 该会话无待标记的 KB 注入)。
39
+ */
40
+ writeKbInjectionAdoption(session_id: string, adopted_at: number): number;
41
+ /**
42
+ * KB 采纳率读路径(decision 148f7a0a):近 N 天 KB 注入总数 vs 已被采纳
43
+ * (adopted_at 非 NULL)条数。`cf stats` 用它输出一行采纳率。
44
+ */
45
+ countKbAdoption(sinceIso: string): {
46
+ total: number;
47
+ adopted: number;
48
+ };
49
+ /**
50
+ * LOOP HINT 采纳 telemetry(decision e7d13697, 2026-06-11, Option C):
51
+ * 把同一 session 中所有 `[LOOP HINT]` 注入行(source_handler =
52
+ * 'UserPromptSubmitHandler:loop-hint')里尚未标记的(adopted_at IS NULL)
53
+ * 盖上采纳时间戳。由 PostToolUse handler 在观察到本会话实际运行
54
+ * `cf loop run`(Bash 工具调用,命令含 'loop run')时调用——这是「主线程
55
+ * 采纳了 loop 建议」的可观测信号。
56
+ *
57
+ * 完全复用 KB 采纳的 `injections` + `adopted_at` 机制(decision 148f7a0a),
58
+ * 只换 source_handler 前缀。只标记未标记行——同会话第二次 `cf loop run` 不会
59
+ * 覆盖首次采纳时间。返回受影响行数(0 = 该会话无待标记的 loop-hint 注入)。
60
+ */
61
+ writeLoopHintAdoption(session_id: string, adopted_at: number): number;
62
+ /**
63
+ * LOOP HINT 采纳率读路径(decision e7d13697):近 N 天 loop-hint 注入总数 vs
64
+ * 已被采纳(adopted_at 非 NULL)条数。让我们日后据真实采纳率判 keep-vs-remove
65
+ * (Option C 之所以选过 D 的全部理由)。镜像 countKbAdoption。
66
+ */
67
+ countLoopHintAdoption(sinceIso: string): {
68
+ total: number;
69
+ adopted: number;
70
+ };
31
71
  /**
32
72
  * Phase 2 metrics rollup: count injection rows for one session, optionally
33
73
  * scoped to a specific source_handler (e.g. 'UserPromptSubmitHandler:kb' to
@@ -1 +1 @@
1
- {"version":3,"file":"injections.d.ts","sourceRoot":"","sources":["../../../src/core/storage/injections.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,eAAe,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAYD,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;gBAEpC,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAOzC,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAc1C;;;;;;OAMG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM;IAenE;;;;;;;OAOG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;IAmBlD,eAAe,CAAC,MAAM,GAAE;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,SAAS,EAAE;CAkCrB"}
1
+ {"version":3,"file":"injections.d.ts","sourceRoot":"","sources":["../../../src/core/storage/injections.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,eAAe,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAYD,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;gBAEpC,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAOzC,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAc1C;;;;;;;;OAQG;IACH,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAaxE;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAYrE;;;;;;;;;;;OAWG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAarE;;;;OAIG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAa3E;;;;;;OAMG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM;IAenE;;;;;;;OAOG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;IAmBlD,eAAe,CAAC,MAAM,GAAE;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,SAAS,EAAE;CAkCrB"}
@@ -27,6 +27,75 @@ export class InjectionOperations {
27
27
  const id = injection.id || randomUUID();
28
28
  this.writeInjectionStmt.run(id, injection.event_id ?? null, injection.session_id, injection.timestamp, injection.source_handler, injection.injection_type, injection.content, injection.metadata_json ?? null);
29
29
  }
30
+ /**
31
+ * KB 采纳 telemetry(decision 148f7a0a):把同一 session 中所有 KB 注入行
32
+ * (source_handler LIKE '%:kb')里尚未标记的(adopted_at IS NULL)盖上
33
+ * 采纳时间戳。由 PostToolUse handler 在观察到主动 KB MCP 调用
34
+ * (tool_name 以 'mcp__claude-forge__knowledge' 开头)时调用。
35
+ *
36
+ * 只标记未标记行 —— 同会话第二次 KB 调用不会覆盖首次采纳时间。
37
+ * 返回受影响行数(0 = 该会话无待标记的 KB 注入)。
38
+ */
39
+ writeKbInjectionAdoption(session_id, adopted_at) {
40
+ const result = this.db
41
+ .prepare(`UPDATE injections
42
+ SET adopted_at = ?
43
+ WHERE session_id = ?
44
+ AND source_handler LIKE '%:kb'
45
+ AND adopted_at IS NULL`)
46
+ .run(adopted_at, session_id);
47
+ return result.changes;
48
+ }
49
+ /**
50
+ * KB 采纳率读路径(decision 148f7a0a):近 N 天 KB 注入总数 vs 已被采纳
51
+ * (adopted_at 非 NULL)条数。`cf stats` 用它输出一行采纳率。
52
+ */
53
+ countKbAdoption(sinceIso) {
54
+ const row = this.db
55
+ .prepare(`SELECT COUNT(*) AS total,
56
+ SUM(CASE WHEN adopted_at IS NOT NULL THEN 1 ELSE 0 END) AS adopted
57
+ FROM injections
58
+ WHERE source_handler LIKE '%:kb' AND timestamp >= ?`)
59
+ .get(sinceIso);
60
+ return { total: row?.total ?? 0, adopted: row?.adopted ?? 0 };
61
+ }
62
+ /**
63
+ * LOOP HINT 采纳 telemetry(decision e7d13697, 2026-06-11, Option C):
64
+ * 把同一 session 中所有 `[LOOP HINT]` 注入行(source_handler =
65
+ * 'UserPromptSubmitHandler:loop-hint')里尚未标记的(adopted_at IS NULL)
66
+ * 盖上采纳时间戳。由 PostToolUse handler 在观察到本会话实际运行
67
+ * `cf loop run`(Bash 工具调用,命令含 'loop run')时调用——这是「主线程
68
+ * 采纳了 loop 建议」的可观测信号。
69
+ *
70
+ * 完全复用 KB 采纳的 `injections` + `adopted_at` 机制(decision 148f7a0a),
71
+ * 只换 source_handler 前缀。只标记未标记行——同会话第二次 `cf loop run` 不会
72
+ * 覆盖首次采纳时间。返回受影响行数(0 = 该会话无待标记的 loop-hint 注入)。
73
+ */
74
+ writeLoopHintAdoption(session_id, adopted_at) {
75
+ const result = this.db
76
+ .prepare(`UPDATE injections
77
+ SET adopted_at = ?
78
+ WHERE session_id = ?
79
+ AND source_handler = 'UserPromptSubmitHandler:loop-hint'
80
+ AND adopted_at IS NULL`)
81
+ .run(adopted_at, session_id);
82
+ return result.changes;
83
+ }
84
+ /**
85
+ * LOOP HINT 采纳率读路径(decision e7d13697):近 N 天 loop-hint 注入总数 vs
86
+ * 已被采纳(adopted_at 非 NULL)条数。让我们日后据真实采纳率判 keep-vs-remove
87
+ * (Option C 之所以选过 D 的全部理由)。镜像 countKbAdoption。
88
+ */
89
+ countLoopHintAdoption(sinceIso) {
90
+ const row = this.db
91
+ .prepare(`SELECT COUNT(*) AS total,
92
+ SUM(CASE WHEN adopted_at IS NOT NULL THEN 1 ELSE 0 END) AS adopted
93
+ FROM injections
94
+ WHERE source_handler = 'UserPromptSubmitHandler:loop-hint'
95
+ AND timestamp >= ?`)
96
+ .get(sinceIso);
97
+ return { total: row?.total ?? 0, adopted: row?.adopted ?? 0 };
98
+ }
30
99
  /**
31
100
  * Phase 2 metrics rollup: count injection rows for one session, optionally
32
101
  * scoped to a specific source_handler (e.g. 'UserPromptSubmitHandler:kb' to
@@ -1 +1 @@
1
- {"version":3,"file":"injections.js","sourceRoot":"","sources":["../../../src/core/storage/injections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"injections.js","sourceRoot":"","sources":["../../../src/core/storage/injections.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsBzC,4EAA4E;AAC5E,6EAA6E;AAC7E,0DAA0D;AAC1D,EAAE;AACF,qDAAqD;AACrD,+CAA+C;AAC/C,gDAAgD;AAChD,EAAE;AACF,mEAAmE;AAEnE,MAAM,OAAO,mBAAmB;IAGV;IAFH,kBAAkB,CAAqB;IAExD,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGpC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,SAAoB;QACjC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC;QACxC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACzB,EAAE,EACF,SAAS,CAAC,QAAQ,IAAI,IAAI,EAC1B,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,aAAa,IAAI,IAAI,CAChC,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,wBAAwB,CAAC,UAAkB,EAAE,UAAkB;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CACN;;;;kCAI0B,CAC3B;aACA,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,QAAgB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;6DAGqD,CACtD;aACA,GAAG,CAAC,QAAQ,CAA0D,CAAC;QAC1E,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IAChE,CAAC;IAED;;;;;;;;;;;OAWG;IACH,qBAAqB,CAAC,UAAkB,EAAE,UAAkB;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CACN;;;;kCAI0B,CAC3B;aACA,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,qBAAqB,CAAC,QAAgB;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;8BAIsB,CACvB;aACA,GAAG,CAAC,QAAQ,CAA0D,CAAC;QAC1E,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IAChE,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CAAC,UAAkB,EAAE,cAAuB;QACxD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;iBAChB,OAAO,CACN,kFAAkF,CACnF;iBACA,GAAG,CAAC,UAAU,EAAE,cAAc,CAA8B,CAAC;YAChE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,CAAC,UAAU,CAA8B,CAAC;QAChD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAC,UAAoB;QAClC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG;wCACwB,YAAY;wCACZ,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAmC,CAAC;QACvF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,EAAE,EAAE,CAAC,CAAC,EAAY;YAClB,QAAQ,EAAG,CAAC,CAAC,QAAmB,IAAI,SAAS;YAC7C,UAAU,EAAE,CAAC,CAAC,UAAoB;YAClC,SAAS,EAAE,CAAC,CAAC,SAAmB;YAChC,cAAc,EAAE,CAAC,CAAC,cAAwB;YAC1C,cAAc,EAAE,CAAC,CAAC,cAA6C;YAC/D,OAAO,EAAE,CAAC,CAAC,OAAiB;YAC5B,aAAa,EAAG,CAAC,CAAC,aAAwB,IAAI,SAAS;SACxD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,eAAe,CAAC,SAKZ,EAAE;QACJ,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;QAClC,MAAM,GAAG,GAAG,4BAA4B,KAAK,kCAAkC,CAAC;QAEhF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAmC,CAAC;QACnF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,EAAE,EAAE,CAAC,CAAC,EAAY;YAClB,QAAQ,EAAG,CAAC,CAAC,QAAmB,IAAI,SAAS;YAC7C,UAAU,EAAE,CAAC,CAAC,UAAoB;YAClC,SAAS,EAAE,CAAC,CAAC,SAAmB;YAChC,cAAc,EAAE,CAAC,CAAC,cAAwB;YAC1C,cAAc,EAAE,CAAC,CAAC,cAA6C;YAC/D,OAAO,EAAE,CAAC,CAAC,OAAiB;YAC5B,aAAa,EAAG,CAAC,CAAC,aAAwB,IAAI,SAAS;SACxD,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -25,6 +25,52 @@ export interface KbQueryLogEntry {
25
25
  ai_input_tokens?: number | null;
26
26
  ai_output_tokens?: number | null;
27
27
  duration_ms: number;
28
+ /**
29
+ * Attribution columns (decision d24cd3a2 Task B) — mirror skill_invocations.
30
+ * All nullable; legacy / daemon-auto rows leave them NULL.
31
+ * reason — verbatim caller-supplied reason (e.g. "coder/executing-plans"),
32
+ * so `reason LIKE 'coder/%'` follow-through SQL works.
33
+ * source — 'cli' (deliberate agent/operator pull) | 'daemon-probe'
34
+ * (automatic per-prompt kb-injector probe) | null (legacy).
35
+ * agent_id — session / agent id resolved by the CLI (sentinel fallback).
36
+ * workflow/phase — parseWorkflowMeta(reason) output for aggregation.
37
+ */
38
+ reason?: string | null;
39
+ source?: string | null;
40
+ agent_id?: string | null;
41
+ workflow?: string | null;
42
+ phase?: string | null;
43
+ }
44
+ export interface KbQueryLogRow {
45
+ id: number;
46
+ ts: number;
47
+ project_path: string;
48
+ query: string;
49
+ result_count: number;
50
+ ai_call_count: number | null;
51
+ ai_input_tokens: number | null;
52
+ ai_output_tokens: number | null;
53
+ duration_ms: number;
54
+ reason: string | null;
55
+ source: string | null;
56
+ agent_id: string | null;
57
+ workflow: string | null;
58
+ phase: string | null;
59
+ /** Post-use usefulness self-assessment (decision 096309e4 ①), nullable. */
60
+ usefulness: string | null;
61
+ usefulness_note: string | null;
62
+ }
63
+ /** Per-workflow KB usefulness aggregation (decision 096309e4 ①). */
64
+ export interface KbUsefulnessRow {
65
+ /** Grouping key — the pulling workflow (coder/verify/...), 'unknown' if NULL. */
66
+ workflow: string;
67
+ total_rated: number;
68
+ helped: number;
69
+ partial: number;
70
+ not_actionable: number;
71
+ pending: number;
72
+ /** helped / total_rated (STRICT helped-only); 0 when nothing rated. */
73
+ actionable_rate: number;
28
74
  }
29
75
  export interface KbStatsRow {
30
76
  total_queries: number;
@@ -56,6 +102,186 @@ export declare class KnowledgeOperations {
56
102
  private db;
57
103
  constructor(db: Database.Database);
58
104
  writeKbQueryLog(entry: KbQueryLogEntry): void;
105
+ /**
106
+ * Read raw kb_query_log rows (decision d24cd3a2 Task B) — used by attribution
107
+ * analytics + tests to prove a deliberate `cf knowledge query` pull recorded
108
+ * its reason/source. Filterable by project_path; newest first.
109
+ */
110
+ queryKbQueryLog(filter?: {
111
+ project_path?: string;
112
+ source?: string;
113
+ limit?: number;
114
+ }): KbQueryLogRow[];
115
+ /**
116
+ * Stamp `usefulness` + `usefulness_note` onto the SINGLE most-recent un-rated
117
+ * kb_query_log row matching `project_path` (+ optional `source`/`reason` filters
118
+ * and `agent_id`). Deterministic target rule: `ORDER BY ts DESC, id DESC LIMIT 1`
119
+ * inside a subquery so exactly one row is updated. Idempotent: only `usefulness
120
+ * IS NULL` rows are eligible, so re-running stamps the next-older un-rated pull
121
+ * (or affects 0 once all are rated). Returns rows-affected (0 = soft no-op,
122
+ * caller never treats it as an error).
123
+ *
124
+ * Default scoping is to deliberate agent pulls (`source='cli'`) so a feedback
125
+ * call never accidentally stamps a daemon-probe row; pass source=undefined to
126
+ * widen.
127
+ */
128
+ writeKbUsefulness(args: {
129
+ project_path: string;
130
+ usefulness: string;
131
+ note?: string | null;
132
+ source?: string | null;
133
+ agent_id?: string | null;
134
+ reasonPrefix?: string | null;
135
+ sinceMs?: number;
136
+ }): number;
137
+ /**
138
+ * Per-workflow KB usefulness aggregation — answers "is the KB content agents
139
+ * pull actually helping, and for which roles?". GROUP BY workflow over rows
140
+ * that HAVE a usefulness rating. `actionable_rate = helped / total_rated`
141
+ * (STRICT helped-only). Un-rated pulls counted as `pending` (NOT in rate
142
+ * denominator). Sorted worst actionable_rate FIRST (least-useful surface for
143
+ * refinement); ties broken by higher total_rated. ts is INTEGER ms.
144
+ */
145
+ aggregateKbUsefulness(filter?: {
146
+ project_path?: string;
147
+ since?: number;
148
+ until?: number;
149
+ limit?: number;
150
+ }): KbUsefulnessRow[];
151
+ /**
152
+ * Per-agent KB usefulness aggregation — Agent 体检 input (decision 234f1ad4,
153
+ * Phase 1 / P1-1). Mirrors aggregateKbUsefulness but the grouping key is the
154
+ * `reason` workflow PREFIX (`substr(reason,1,instr(reason,'/')-1)`), i.e. the
155
+ * proxy agent key (coder/verify/...), since `kb_query_log.agent_id` is not a
156
+ * reliable per-agent signal for CLI pulls (subagents have zero MCP). Only
157
+ * source='agent-pull' rows with a parseable `<x>/<y>` reason are attributed;
158
+ * reasons without `/` go to `<unknown>`. `ts` is INTEGER ms.
159
+ * `actionable_rate = helped / total_rated` (STRICT helped-only).
160
+ */
161
+ aggregateKbUsefulnessByAgent(filter?: {
162
+ project_path?: string;
163
+ since?: number;
164
+ until?: number;
165
+ limit?: number;
166
+ }): Array<{
167
+ agent: string;
168
+ total_rated: number;
169
+ helped: number;
170
+ partial: number;
171
+ not_actionable: number;
172
+ pending: number;
173
+ pulls: number;
174
+ actionable_rate: number;
175
+ }>;
176
+ /**
177
+ * Aggregate deliberate agent/operator KB pulls (decision a33a9b3d) — the
178
+ * consumer for the /context「agent 主动 pull」block. Reads kb_query_log rows
179
+ * with source='cli' (verbatim `cf knowledge query --reason` pulls), in a
180
+ * trailing time window. Returns three slices so the UI can show "who pulled,
181
+ * what, and how the three telemetry paths split":
182
+ * - byWorkflow: GROUP BY workflow (role: coder/decision/verify/...), count desc.
183
+ * - recent: newest N raw cli rows (query is a plaintext topic column —
184
+ * NOT gzip — safe to surface verbatim).
185
+ * - sourceDistribution: cli vs daemon-probe vs legacy(NULL) counts, so the
186
+ * user understands the per-page cited table reads a different
187
+ * (injection/push) path than this pull view.
188
+ *
189
+ * ts is INTEGER ms (kb_query_log landmine); the window bound is computed in ms.
190
+ * project_path optional — omit to aggregate across all known projects.
191
+ *
192
+ * Test-probe exclusion (decision 2d6d59b0): `cf knowledge query foo` smoke /
193
+ * manual probes land as source='cli' with the sentinel agent_id
194
+ * 'cli-no-session' (no real session) — they are NOT deliberate agent pulls and
195
+ * were inflating the cli bucket 85% (192→29 real over 7d). Every aggregate
196
+ * below excludes that sentinel with the NULL-safe predicate
197
+ * `(agent_id IS NULL OR agent_id != 'cli-no-session')`. NULL-safe matters for
198
+ * the source_distribution query: legacy(NULL source) user-prompt rows carry a
199
+ * NULL agent_id, and a bare `agent_id != …` would silently drop them (SQL NULL
200
+ * comparison is not-true) — wiping the legacy bucket. Real agent pulls carry a
201
+ * UUID agent_id + reason and are never touched.
202
+ */
203
+ queryAgentKbPulls(filter?: {
204
+ project_path?: string;
205
+ days?: number;
206
+ recentLimit?: number;
207
+ }): {
208
+ window_days: number;
209
+ by_workflow: Array<{
210
+ workflow: string;
211
+ count: number;
212
+ }>;
213
+ recent: Array<{
214
+ ts: number;
215
+ query: string;
216
+ reason: string | null;
217
+ workflow: string | null;
218
+ phase: string | null;
219
+ result_count: number;
220
+ agent_id: string | null;
221
+ }>;
222
+ source_distribution: Array<{
223
+ source: string;
224
+ count: number;
225
+ }>;
226
+ total_cli_pulls: number;
227
+ };
228
+ /**
229
+ * Count GENUINE agent KB pulls in a trailing window (decision 64d37b1d) —
230
+ * the「KB 调用」workplace KPI that replaces the passive「KB 注入」number.
231
+ *
232
+ * 口径 (reconciled against the live DB =46 for `reason LIKE '%kb-precedent%'`):
233
+ * - counts rows whose `reason LIKE '%kb-precedent%'` — the
234
+ * coder/verify/safetynet/decision pull-reason convention that marks a
235
+ * deliberate `cf knowledge query|fetch --reason "<wf>/kb-precedent"` pull,
236
+ * - EXCLUDES the foo-probe sentinel `agent_id='cli-no-session'`
237
+ * (decision 2d6d59b0), NULL-safe so real pulls with a NULL agent_id are
238
+ * kept,
239
+ * - filters by `kb_query_log.project_path` directly (this table HAS its own
240
+ * project_path column — no sessions JOIN, unlike countKbInjections),
241
+ * - window is INTEGER ms (kb_query_log.ts landmine): cutoff computed in ms.
242
+ *
243
+ * Omitting projectPath → aggregate across all projects (__all__ on the UI).
244
+ */
245
+ countAgentKbPulls(filter?: {
246
+ windowDays?: number;
247
+ projectPath?: string;
248
+ }): number;
249
+ /**
250
+ * Per-page KB *cited* counts for the /context「📚 KB 命中」table's
251
+ * "cited (7d)" column (decision aba3cae7).
252
+ *
253
+ * BUG it fixes: the per-page cited map used to be derived from
254
+ * /api/insights/agent-board, whose query LIMITs to the 40 most-recent
255
+ * user-tasks for kanban pagination. KB-bearing tasks ranked outside that 40
256
+ * were silently dropped → every page showed cited=0. This reads the raw
257
+ * INJECTION (push) path directly, bypassing that LIMIT entirely.
258
+ *
259
+ * Source of truth: `injections WHERE source_handler =
260
+ * 'UserPromptSubmitHandler:kb'`, joined to `sessions` for project scope.
261
+ *
262
+ * Landmines /口径 (intentional, do NOT "normalise"):
263
+ * - injections.timestamp is **ISO TEXT** (schema: `timestamp TEXT NOT NULL`),
264
+ * NOT integer-ms. The window bound is a TEXT comparison via
265
+ * datetime('now', '-N days'); do NOT compute an integer-ms cutoff here
266
+ * (that口径 belongs to kb_query_log / skill_invocations, different table).
267
+ * - project scope is a JOIN on sessions.project_path (injections has no
268
+ * project_path column).
269
+ * - NO task_kind filter: we aggregate injections directly, which naturally
270
+ * includes both user prompts and agent-callback prompts. Semantically
271
+ * "how many times was this page pulled by the AI" SHOULD include both.
272
+ * - NO adopted_at gate: this is a raw injection-event count, NOT an
273
+ * adoption-rate. adopted_at is a separate telemetry (decision 148f7a0a).
274
+ * - metadata_json is a plaintext JSON array `[{name,score,refs}, ...]`
275
+ * (NOT gzip) — parsed in JS and each `[].name` accumulated.
276
+ *
277
+ * @param filter.project_path — scope to one project (omit = all projects).
278
+ * @param filter.days — trailing window in days (default 7).
279
+ * @returns map of page_name → cited_count (raw injection-event count).
280
+ */
281
+ queryKbCitedPages(filter?: {
282
+ project_path?: string;
283
+ days?: number;
284
+ }): Record<string, number>;
59
285
  queryKbStats(projectPath: string): KbStatsRow;
60
286
  /**
61
287
  * Upsert on conflict(build_id) — if the same build_id is started twice
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../../src/core/storage/knowledge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAM3C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IACrC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,qBAAa,mBAAmB;IAClB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIzC,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAqB7C,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU;IA8B7C;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IA6B7C;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;QACtC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GACA,IAAI;IA+BP,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAe3D;;;;;;OAMG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAWjC;;;;;;;OAOG;IACH,0BAA0B,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAcxD;;;;;;OAMG;IACH,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,MAAU,GACf;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B;CA+DF"}
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../../src/core/storage/knowledge.ts"],"names":[],"mappings":"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"}