mister-wolf 2.11.0 → 2.13.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 (419) hide show
  1. package/dist/adapters/cli/cli-entry.d.ts +25 -0
  2. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  3. package/dist/adapters/cli/cli-entry.js +393 -94
  4. package/dist/adapters/cli/cli-entry.js.map +1 -1
  5. package/dist/adapters/cli/commands/analytics.d.ts +30 -5
  6. package/dist/adapters/cli/commands/analytics.d.ts.map +1 -1
  7. package/dist/adapters/cli/commands/analytics.js +314 -2
  8. package/dist/adapters/cli/commands/analytics.js.map +1 -1
  9. package/dist/adapters/cli/commands/memory-add.d.ts +21 -1
  10. package/dist/adapters/cli/commands/memory-add.d.ts.map +1 -1
  11. package/dist/adapters/cli/commands/memory-add.js +42 -29
  12. package/dist/adapters/cli/commands/memory-add.js.map +1 -1
  13. package/dist/adapters/cli/commands/memory-archive.d.ts +3 -0
  14. package/dist/adapters/cli/commands/memory-archive.d.ts.map +1 -0
  15. package/dist/adapters/cli/commands/memory-archive.js +19 -0
  16. package/dist/adapters/cli/commands/memory-archive.js.map +1 -0
  17. package/dist/adapters/cli/commands/memory-brief.d.ts.map +1 -1
  18. package/dist/adapters/cli/commands/memory-brief.js +13 -3
  19. package/dist/adapters/cli/commands/memory-brief.js.map +1 -1
  20. package/dist/adapters/cli/commands/memory-call.d.ts.map +1 -1
  21. package/dist/adapters/cli/commands/memory-call.js +57 -3
  22. package/dist/adapters/cli/commands/memory-call.js.map +1 -1
  23. package/dist/adapters/cli/commands/memory-edit.d.ts +3 -0
  24. package/dist/adapters/cli/commands/memory-edit.d.ts.map +1 -0
  25. package/dist/adapters/cli/commands/memory-edit.js +67 -0
  26. package/dist/adapters/cli/commands/memory-edit.js.map +1 -0
  27. package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
  28. package/dist/adapters/cli/commands/memory-init.js +46 -7
  29. package/dist/adapters/cli/commands/memory-init.js.map +1 -1
  30. package/dist/adapters/cli/commands/memory-list.d.ts +12 -0
  31. package/dist/adapters/cli/commands/memory-list.d.ts.map +1 -1
  32. package/dist/adapters/cli/commands/memory-list.js +34 -21
  33. package/dist/adapters/cli/commands/memory-list.js.map +1 -1
  34. package/dist/adapters/cli/commands/memory-migrate.d.ts.map +1 -1
  35. package/dist/adapters/cli/commands/memory-migrate.js +91 -0
  36. package/dist/adapters/cli/commands/memory-migrate.js.map +1 -1
  37. package/dist/adapters/cli/commands/memory-recap.d.ts.map +1 -1
  38. package/dist/adapters/cli/commands/memory-recap.js +16 -1
  39. package/dist/adapters/cli/commands/memory-recap.js.map +1 -1
  40. package/dist/adapters/cli/commands/memory-relation.d.ts +1 -1
  41. package/dist/adapters/cli/commands/memory-relation.d.ts.map +1 -1
  42. package/dist/adapters/cli/commands/memory-relation.js +57 -2
  43. package/dist/adapters/cli/commands/memory-relation.js.map +1 -1
  44. package/dist/adapters/cli/commands/memory-search.d.ts.map +1 -1
  45. package/dist/adapters/cli/commands/memory-search.js +21 -2
  46. package/dist/adapters/cli/commands/memory-search.js.map +1 -1
  47. package/dist/adapters/cli/commands/memory-session.d.ts.map +1 -1
  48. package/dist/adapters/cli/commands/memory-session.js +2 -12
  49. package/dist/adapters/cli/commands/memory-session.js.map +1 -1
  50. package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -1
  51. package/dist/adapters/cli/commands/memory-sync.js +2 -9
  52. package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
  53. package/dist/adapters/cli/commands/memory-taxonomy.d.ts.map +1 -1
  54. package/dist/adapters/cli/commands/memory-taxonomy.js +4 -4
  55. package/dist/adapters/cli/commands/memory-taxonomy.js.map +1 -1
  56. package/dist/adapters/cli/commands/memory-tool.d.ts.map +1 -1
  57. package/dist/adapters/cli/commands/memory-tool.js +13 -5
  58. package/dist/adapters/cli/commands/memory-tool.js.map +1 -1
  59. package/dist/adapters/cli/commands/memory-validate.d.ts.map +1 -1
  60. package/dist/adapters/cli/commands/memory-validate.js +18 -4
  61. package/dist/adapters/cli/commands/memory-validate.js.map +1 -1
  62. package/dist/adapters/cli/removed-commands.d.ts +11 -0
  63. package/dist/adapters/cli/removed-commands.d.ts.map +1 -0
  64. package/dist/adapters/cli/removed-commands.js +36 -0
  65. package/dist/adapters/cli/removed-commands.js.map +1 -0
  66. package/dist/adapters/cli/type-command-generator.d.ts +5 -0
  67. package/dist/adapters/cli/type-command-generator.d.ts.map +1 -0
  68. package/dist/adapters/cli/type-command-generator.js +128 -0
  69. package/dist/adapters/cli/type-command-generator.js.map +1 -0
  70. package/dist/adapters/fs/config-file.d.ts +14 -1
  71. package/dist/adapters/fs/config-file.d.ts.map +1 -1
  72. package/dist/adapters/fs/config-file.js +168 -56
  73. package/dist/adapters/fs/config-file.js.map +1 -1
  74. package/dist/adapters/fs/doc-id-migration.d.ts +2 -0
  75. package/dist/adapters/fs/doc-id-migration.d.ts.map +1 -1
  76. package/dist/adapters/fs/doc-id-migration.js +8 -2
  77. package/dist/adapters/fs/doc-id-migration.js.map +1 -1
  78. package/dist/adapters/fs/effectiveness-snapshots.d.ts +1 -1
  79. package/dist/adapters/fs/effectiveness-snapshots.d.ts.map +1 -1
  80. package/dist/adapters/fs/jsonl-relation-log.d.ts.map +1 -1
  81. package/dist/adapters/fs/jsonl-relation-log.js +10 -2
  82. package/dist/adapters/fs/jsonl-relation-log.js.map +1 -1
  83. package/dist/adapters/fs/layout-migration.d.ts.map +1 -1
  84. package/dist/adapters/fs/layout-migration.js +21 -2
  85. package/dist/adapters/fs/layout-migration.js.map +1 -1
  86. package/dist/adapters/fs/markdown-memory-store.d.ts +9 -0
  87. package/dist/adapters/fs/markdown-memory-store.d.ts.map +1 -1
  88. package/dist/adapters/fs/markdown-memory-store.js +103 -21
  89. package/dist/adapters/fs/markdown-memory-store.js.map +1 -1
  90. package/dist/adapters/fs/project-paths.d.ts +1 -1
  91. package/dist/adapters/fs/project-paths.d.ts.map +1 -1
  92. package/dist/adapters/fs/project-paths.js +1 -1
  93. package/dist/adapters/fs/project-paths.js.map +1 -1
  94. package/dist/adapters/fs/projects-registry.d.ts +0 -2
  95. package/dist/adapters/fs/projects-registry.d.ts.map +1 -1
  96. package/dist/adapters/fs/projects-registry.js +0 -16
  97. package/dist/adapters/fs/projects-registry.js.map +1 -1
  98. package/dist/adapters/fs/scan-snapshot-cache.d.ts +23 -0
  99. package/dist/adapters/fs/scan-snapshot-cache.d.ts.map +1 -0
  100. package/dist/adapters/fs/scan-snapshot-cache.js +36 -0
  101. package/dist/adapters/fs/scan-snapshot-cache.js.map +1 -0
  102. package/dist/adapters/fs/session-delivery-registry.d.ts +31 -0
  103. package/dist/adapters/fs/session-delivery-registry.d.ts.map +1 -0
  104. package/dist/adapters/fs/session-delivery-registry.js +104 -0
  105. package/dist/adapters/fs/session-delivery-registry.js.map +1 -0
  106. package/dist/adapters/fs/session-metrics-log.d.ts +35 -109
  107. package/dist/adapters/fs/session-metrics-log.d.ts.map +1 -1
  108. package/dist/adapters/fs/session-metrics-log.js +227 -141
  109. package/dist/adapters/fs/session-metrics-log.js.map +1 -1
  110. package/dist/adapters/fs/taxonomy-migration.d.ts +38 -0
  111. package/dist/adapters/fs/taxonomy-migration.d.ts.map +1 -0
  112. package/dist/adapters/fs/taxonomy-migration.js +280 -0
  113. package/dist/adapters/fs/taxonomy-migration.js.map +1 -0
  114. package/dist/adapters/mcp/mcp-schemas.d.ts +0 -122
  115. package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
  116. package/dist/adapters/mcp/mcp-schemas.js +0 -102
  117. package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
  118. package/dist/adapters/mcp/mcp-server.d.ts.map +1 -1
  119. package/dist/adapters/mcp/mcp-server.js +30 -1
  120. package/dist/adapters/mcp/mcp-server.js.map +1 -1
  121. package/dist/adapters/mcp/mcp-tools.d.ts +10 -0
  122. package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
  123. package/dist/adapters/mcp/mcp-tools.js +51 -188
  124. package/dist/adapters/mcp/mcp-tools.js.map +1 -1
  125. package/dist/adapters/sqlite/sqlite-schema.d.ts +1 -1
  126. package/dist/adapters/sqlite/sqlite-schema.d.ts.map +1 -1
  127. package/dist/adapters/sqlite/sqlite-schema.js +4 -2
  128. package/dist/adapters/sqlite/sqlite-schema.js.map +1 -1
  129. package/dist/adapters/sqlite/sqlite-search-index.d.ts +13 -1
  130. package/dist/adapters/sqlite/sqlite-search-index.d.ts.map +1 -1
  131. package/dist/adapters/sqlite/sqlite-search-index.js +88 -34
  132. package/dist/adapters/sqlite/sqlite-search-index.js.map +1 -1
  133. package/dist/app/use-cases/add-memory-object.d.ts +4 -0
  134. package/dist/app/use-cases/add-memory-object.d.ts.map +1 -1
  135. package/dist/app/use-cases/add-memory-object.js +34 -4
  136. package/dist/app/use-cases/add-memory-object.js.map +1 -1
  137. package/dist/app/use-cases/bootstrap-project.d.ts.map +1 -1
  138. package/dist/app/use-cases/bootstrap-project.js +13 -9
  139. package/dist/app/use-cases/bootstrap-project.js.map +1 -1
  140. package/dist/app/use-cases/build-analytics.d.ts +160 -2
  141. package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
  142. package/dist/app/use-cases/build-analytics.js +399 -6
  143. package/dist/app/use-cases/build-analytics.js.map +1 -1
  144. package/dist/app/use-cases/create-memory-repair-request.d.ts.map +1 -1
  145. package/dist/app/use-cases/create-memory-repair-request.js +5 -3
  146. package/dist/app/use-cases/create-memory-repair-request.js.map +1 -1
  147. package/dist/app/use-cases/diff-thread.d.ts.map +1 -1
  148. package/dist/app/use-cases/diff-thread.js +9 -6
  149. package/dist/app/use-cases/diff-thread.js.map +1 -1
  150. package/dist/app/use-cases/generate-agent-brief.d.ts.map +1 -1
  151. package/dist/app/use-cases/generate-agent-brief.js +18 -8
  152. package/dist/app/use-cases/generate-agent-brief.js.map +1 -1
  153. package/dist/app/use-cases/generate-recap.d.ts +14 -0
  154. package/dist/app/use-cases/generate-recap.d.ts.map +1 -1
  155. package/dist/app/use-cases/generate-recap.js +60 -7
  156. package/dist/app/use-cases/generate-recap.js.map +1 -1
  157. package/dist/app/use-cases/get-call-injections.d.ts +8 -0
  158. package/dist/app/use-cases/get-call-injections.d.ts.map +1 -1
  159. package/dist/app/use-cases/get-call-injections.js +43 -12
  160. package/dist/app/use-cases/get-call-injections.js.map +1 -1
  161. package/dist/app/use-cases/init-project.d.ts +2 -6
  162. package/dist/app/use-cases/init-project.d.ts.map +1 -1
  163. package/dist/app/use-cases/init-project.js +11 -13
  164. package/dist/app/use-cases/init-project.js.map +1 -1
  165. package/dist/app/use-cases/list-memory-objects.d.ts +2 -0
  166. package/dist/app/use-cases/list-memory-objects.d.ts.map +1 -1
  167. package/dist/app/use-cases/list-memory-objects.js.map +1 -1
  168. package/dist/app/use-cases/scaffold-agent.d.ts.map +1 -1
  169. package/dist/app/use-cases/scaffold-agent.js +58 -17
  170. package/dist/app/use-cases/scaffold-agent.js.map +1 -1
  171. package/dist/app/use-cases/scan-project.d.ts +26 -1
  172. package/dist/app/use-cases/scan-project.d.ts.map +1 -1
  173. package/dist/app/use-cases/scan-project.js +86 -51
  174. package/dist/app/use-cases/scan-project.js.map +1 -1
  175. package/dist/app/use-cases/seed-base-playbooks.d.ts +82 -3
  176. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
  177. package/dist/app/use-cases/seed-base-playbooks.js +13 -1
  178. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
  179. package/dist/app/use-cases/should-summarize.d.ts.map +1 -1
  180. package/dist/app/use-cases/should-summarize.js +3 -1
  181. package/dist/app/use-cases/should-summarize.js.map +1 -1
  182. package/dist/app/use-cases/snapshot-delta.d.ts +1 -1
  183. package/dist/app/use-cases/snapshot-delta.d.ts.map +1 -1
  184. package/dist/app/use-cases/snapshot-delta.js.map +1 -1
  185. package/dist/app/use-cases/summarize-session.d.ts.map +1 -1
  186. package/dist/app/use-cases/summarize-session.js +11 -2
  187. package/dist/app/use-cases/summarize-session.js.map +1 -1
  188. package/dist/app/use-cases/thinking.d.ts +2 -2
  189. package/dist/app/use-cases/thinking.d.ts.map +1 -1
  190. package/dist/app/use-cases/thinking.js +20 -12
  191. package/dist/app/use-cases/thinking.js.map +1 -1
  192. package/dist/app/use-cases/tool-stats.js +1 -1
  193. package/dist/app/use-cases/tool-stats.js.map +1 -1
  194. package/dist/domain/facet-colors.d.ts +12 -0
  195. package/dist/domain/facet-colors.d.ts.map +1 -0
  196. package/dist/domain/facet-colors.js +33 -0
  197. package/dist/domain/facet-colors.js.map +1 -0
  198. package/dist/domain/governance.d.ts.map +1 -1
  199. package/dist/domain/governance.js +9 -2
  200. package/dist/domain/governance.js.map +1 -1
  201. package/dist/domain/memory-types.d.ts +67 -318
  202. package/dist/domain/memory-types.d.ts.map +1 -1
  203. package/dist/domain/memory-types.js +87 -223
  204. package/dist/domain/memory-types.js.map +1 -1
  205. package/dist/domain/policies/read-only-zones.d.ts.map +1 -1
  206. package/dist/domain/policies/read-only-zones.js +7 -11
  207. package/dist/domain/policies/read-only-zones.js.map +1 -1
  208. package/dist/domain/router-log.d.ts +8 -2
  209. package/dist/domain/router-log.d.ts.map +1 -1
  210. package/dist/domain/router-log.js +14 -2
  211. package/dist/domain/router-log.js.map +1 -1
  212. package/dist/domain/schemas/memory-event-schema.d.ts +1 -0
  213. package/dist/domain/schemas/memory-event-schema.d.ts.map +1 -1
  214. package/dist/domain/schemas/memory-event-schema.js +1 -0
  215. package/dist/domain/schemas/memory-event-schema.js.map +1 -1
  216. package/dist/domain/schemas/memory-object-schema.d.ts +2 -0
  217. package/dist/domain/schemas/memory-object-schema.d.ts.map +1 -1
  218. package/dist/domain/schemas/memory-object-schema.js +3 -0
  219. package/dist/domain/schemas/memory-object-schema.js.map +1 -1
  220. package/dist/domain/schemas/relation-schema.d.ts +5 -3
  221. package/dist/domain/schemas/relation-schema.d.ts.map +1 -1
  222. package/dist/domain/schemas/relation-schema.js +4 -0
  223. package/dist/domain/schemas/relation-schema.js.map +1 -1
  224. package/dist/domain/schemas/session-checkpoint-schema.d.ts +3 -1
  225. package/dist/domain/schemas/session-checkpoint-schema.d.ts.map +1 -1
  226. package/dist/domain/schemas/session-checkpoint-schema.js +3 -2
  227. package/dist/domain/schemas/session-checkpoint-schema.js.map +1 -1
  228. package/dist/domain/solve/scenarios.js +3 -3
  229. package/dist/domain/solve/scenarios.js.map +1 -1
  230. package/dist/domain/taxonomy.d.ts +15 -1
  231. package/dist/domain/taxonomy.d.ts.map +1 -1
  232. package/dist/domain/taxonomy.js +14 -1
  233. package/dist/domain/taxonomy.js.map +1 -1
  234. package/dist/domain/tool-economy.d.ts +1 -1
  235. package/dist/domain/tool-economy.js +1 -1
  236. package/dist/domain/type-schema-builder.d.ts +15 -2
  237. package/dist/domain/type-schema-builder.d.ts.map +1 -1
  238. package/dist/domain/type-schema-builder.js +7 -0
  239. package/dist/domain/type-schema-builder.js.map +1 -1
  240. package/dist/ports/memory-store.port.d.ts +2 -0
  241. package/dist/ports/memory-store.port.d.ts.map +1 -1
  242. package/dist/ports/search-index.port.d.ts +2 -0
  243. package/dist/ports/search-index.port.d.ts.map +1 -1
  244. package/package.json +2 -2
  245. package/templates/opencode/plugins/wolf-router.ts +88 -45
  246. package/templates/opencode/plugins/wolf-session-start.js +6 -3
  247. package/dist/adapters/cli/commands/coord.d.ts +0 -3
  248. package/dist/adapters/cli/commands/coord.d.ts.map +0 -1
  249. package/dist/adapters/cli/commands/coord.js +0 -36
  250. package/dist/adapters/cli/commands/coord.js.map +0 -1
  251. package/dist/adapters/cli/commands/dashboard.d.ts +0 -20
  252. package/dist/adapters/cli/commands/dashboard.d.ts.map +0 -1
  253. package/dist/adapters/cli/commands/dashboard.js +0 -231
  254. package/dist/adapters/cli/commands/dashboard.js.map +0 -1
  255. package/dist/adapters/cli/commands/memory-article.d.ts +0 -3
  256. package/dist/adapters/cli/commands/memory-article.d.ts.map +0 -1
  257. package/dist/adapters/cli/commands/memory-article.js +0 -47
  258. package/dist/adapters/cli/commands/memory-article.js.map +0 -1
  259. package/dist/adapters/cli/commands/memory-blocker.d.ts +0 -3
  260. package/dist/adapters/cli/commands/memory-blocker.d.ts.map +0 -1
  261. package/dist/adapters/cli/commands/memory-blocker.js +0 -52
  262. package/dist/adapters/cli/commands/memory-blocker.js.map +0 -1
  263. package/dist/adapters/cli/commands/memory-council.d.ts +0 -3
  264. package/dist/adapters/cli/commands/memory-council.d.ts.map +0 -1
  265. package/dist/adapters/cli/commands/memory-council.js +0 -42
  266. package/dist/adapters/cli/commands/memory-council.js.map +0 -1
  267. package/dist/adapters/cli/commands/memory-decision.d.ts +0 -3
  268. package/dist/adapters/cli/commands/memory-decision.d.ts.map +0 -1
  269. package/dist/adapters/cli/commands/memory-decision.js +0 -41
  270. package/dist/adapters/cli/commands/memory-decision.js.map +0 -1
  271. package/dist/adapters/cli/commands/memory-effectiveness.d.ts +0 -3
  272. package/dist/adapters/cli/commands/memory-effectiveness.d.ts.map +0 -1
  273. package/dist/adapters/cli/commands/memory-effectiveness.js +0 -127
  274. package/dist/adapters/cli/commands/memory-effectiveness.js.map +0 -1
  275. package/dist/adapters/cli/commands/memory-info-request.d.ts +0 -3
  276. package/dist/adapters/cli/commands/memory-info-request.d.ts.map +0 -1
  277. package/dist/adapters/cli/commands/memory-info-request.js +0 -47
  278. package/dist/adapters/cli/commands/memory-info-request.js.map +0 -1
  279. package/dist/adapters/cli/commands/memory-insights.d.ts +0 -3
  280. package/dist/adapters/cli/commands/memory-insights.d.ts.map +0 -1
  281. package/dist/adapters/cli/commands/memory-insights.js +0 -42
  282. package/dist/adapters/cli/commands/memory-insights.js.map +0 -1
  283. package/dist/adapters/cli/commands/memory-learn.d.ts +0 -3
  284. package/dist/adapters/cli/commands/memory-learn.d.ts.map +0 -1
  285. package/dist/adapters/cli/commands/memory-learn.js +0 -327
  286. package/dist/adapters/cli/commands/memory-learn.js.map +0 -1
  287. package/dist/adapters/cli/commands/memory-rule.d.ts +0 -3
  288. package/dist/adapters/cli/commands/memory-rule.d.ts.map +0 -1
  289. package/dist/adapters/cli/commands/memory-rule.js +0 -40
  290. package/dist/adapters/cli/commands/memory-rule.js.map +0 -1
  291. package/dist/adapters/cli/commands/memory-run.d.ts +0 -3
  292. package/dist/adapters/cli/commands/memory-run.d.ts.map +0 -1
  293. package/dist/adapters/cli/commands/memory-run.js +0 -154
  294. package/dist/adapters/cli/commands/memory-run.js.map +0 -1
  295. package/dist/adapters/cli/commands/memory-stage.d.ts +0 -3
  296. package/dist/adapters/cli/commands/memory-stage.d.ts.map +0 -1
  297. package/dist/adapters/cli/commands/memory-stage.js +0 -35
  298. package/dist/adapters/cli/commands/memory-stage.js.map +0 -1
  299. package/dist/adapters/cli/commands/memory-thread.d.ts +0 -3
  300. package/dist/adapters/cli/commands/memory-thread.d.ts.map +0 -1
  301. package/dist/adapters/cli/commands/memory-thread.js +0 -48
  302. package/dist/adapters/cli/commands/memory-thread.js.map +0 -1
  303. package/dist/adapters/cli/opencode-run-metrics.d.ts +0 -25
  304. package/dist/adapters/cli/opencode-run-metrics.d.ts.map +0 -1
  305. package/dist/adapters/cli/opencode-run-metrics.js +0 -64
  306. package/dist/adapters/cli/opencode-run-metrics.js.map +0 -1
  307. package/dist/app/use-cases/activate-draft.d.ts +0 -31
  308. package/dist/app/use-cases/activate-draft.d.ts.map +0 -1
  309. package/dist/app/use-cases/activate-draft.js +0 -74
  310. package/dist/app/use-cases/activate-draft.js.map +0 -1
  311. package/dist/app/use-cases/build-dashboard.d.ts +0 -43
  312. package/dist/app/use-cases/build-dashboard.d.ts.map +0 -1
  313. package/dist/app/use-cases/build-dashboard.js +0 -32
  314. package/dist/app/use-cases/build-dashboard.js.map +0 -1
  315. package/dist/app/use-cases/create-article.d.ts +0 -31
  316. package/dist/app/use-cases/create-article.d.ts.map +0 -1
  317. package/dist/app/use-cases/create-article.js +0 -62
  318. package/dist/app/use-cases/create-article.js.map +0 -1
  319. package/dist/app/use-cases/create-blocker.d.ts +0 -28
  320. package/dist/app/use-cases/create-blocker.d.ts.map +0 -1
  321. package/dist/app/use-cases/create-blocker.js +0 -51
  322. package/dist/app/use-cases/create-blocker.js.map +0 -1
  323. package/dist/app/use-cases/create-decision.d.ts +0 -28
  324. package/dist/app/use-cases/create-decision.d.ts.map +0 -1
  325. package/dist/app/use-cases/create-decision.js +0 -58
  326. package/dist/app/use-cases/create-decision.js.map +0 -1
  327. package/dist/app/use-cases/create-info-request.d.ts +0 -31
  328. package/dist/app/use-cases/create-info-request.d.ts.map +0 -1
  329. package/dist/app/use-cases/create-info-request.js +0 -58
  330. package/dist/app/use-cases/create-info-request.js.map +0 -1
  331. package/dist/app/use-cases/create-rule.d.ts +0 -27
  332. package/dist/app/use-cases/create-rule.d.ts.map +0 -1
  333. package/dist/app/use-cases/create-rule.js +0 -48
  334. package/dist/app/use-cases/create-rule.js.map +0 -1
  335. package/dist/app/use-cases/create-session-checkpoint.d.ts +0 -23
  336. package/dist/app/use-cases/create-session-checkpoint.d.ts.map +0 -1
  337. package/dist/app/use-cases/create-session-checkpoint.js +0 -61
  338. package/dist/app/use-cases/create-session-checkpoint.js.map +0 -1
  339. package/dist/app/use-cases/create-synthesis.d.ts +0 -25
  340. package/dist/app/use-cases/create-synthesis.d.ts.map +0 -1
  341. package/dist/app/use-cases/create-synthesis.js +0 -36
  342. package/dist/app/use-cases/create-synthesis.js.map +0 -1
  343. package/dist/app/use-cases/create-work-thread.d.ts +0 -26
  344. package/dist/app/use-cases/create-work-thread.d.ts.map +0 -1
  345. package/dist/app/use-cases/create-work-thread.js +0 -47
  346. package/dist/app/use-cases/create-work-thread.js.map +0 -1
  347. package/dist/app/use-cases/effectiveness.d.ts +0 -116
  348. package/dist/app/use-cases/effectiveness.d.ts.map +0 -1
  349. package/dist/app/use-cases/effectiveness.js +0 -198
  350. package/dist/app/use-cases/effectiveness.js.map +0 -1
  351. package/dist/app/use-cases/get-thread-brief.d.ts +0 -19
  352. package/dist/app/use-cases/get-thread-brief.d.ts.map +0 -1
  353. package/dist/app/use-cases/get-thread-brief.js +0 -72
  354. package/dist/app/use-cases/get-thread-brief.js.map +0 -1
  355. package/dist/app/use-cases/learn-decay.d.ts +0 -91
  356. package/dist/app/use-cases/learn-decay.d.ts.map +0 -1
  357. package/dist/app/use-cases/learn-decay.js +0 -274
  358. package/dist/app/use-cases/learn-decay.js.map +0 -1
  359. package/dist/app/use-cases/model-routing.d.ts +0 -30
  360. package/dist/app/use-cases/model-routing.d.ts.map +0 -1
  361. package/dist/app/use-cases/model-routing.js +0 -39
  362. package/dist/app/use-cases/model-routing.js.map +0 -1
  363. package/dist/app/use-cases/pattern-detection.d.ts +0 -44
  364. package/dist/app/use-cases/pattern-detection.d.ts.map +0 -1
  365. package/dist/app/use-cases/pattern-detection.js +0 -71
  366. package/dist/app/use-cases/pattern-detection.js.map +0 -1
  367. package/dist/app/use-cases/propose-draft.d.ts +0 -79
  368. package/dist/app/use-cases/propose-draft.d.ts.map +0 -1
  369. package/dist/app/use-cases/propose-draft.js +0 -140
  370. package/dist/app/use-cases/propose-draft.js.map +0 -1
  371. package/dist/app/use-cases/resolve-blocker.d.ts +0 -17
  372. package/dist/app/use-cases/resolve-blocker.d.ts.map +0 -1
  373. package/dist/app/use-cases/resolve-blocker.js +0 -31
  374. package/dist/app/use-cases/resolve-blocker.js.map +0 -1
  375. package/dist/app/use-cases/run-source.d.ts +0 -15
  376. package/dist/app/use-cases/run-source.d.ts.map +0 -1
  377. package/dist/app/use-cases/run-source.js +0 -26
  378. package/dist/app/use-cases/run-source.js.map +0 -1
  379. package/dist/app/use-cases/tally-council-votes.d.ts +0 -24
  380. package/dist/app/use-cases/tally-council-votes.d.ts.map +0 -1
  381. package/dist/app/use-cases/tally-council-votes.js +0 -30
  382. package/dist/app/use-cases/tally-council-votes.js.map +0 -1
  383. package/dist/app/use-cases/template-evolve.d.ts +0 -87
  384. package/dist/app/use-cases/template-evolve.d.ts.map +0 -1
  385. package/dist/app/use-cases/template-evolve.js +0 -164
  386. package/dist/app/use-cases/template-evolve.js.map +0 -1
  387. package/dist/app/use-cases/validate-draft.d.ts +0 -36
  388. package/dist/app/use-cases/validate-draft.d.ts.map +0 -1
  389. package/dist/app/use-cases/validate-draft.js +0 -75
  390. package/dist/app/use-cases/validate-draft.js.map +0 -1
  391. package/dist/domain/gates/stop-gate.d.ts +0 -43
  392. package/dist/domain/gates/stop-gate.d.ts.map +0 -1
  393. package/dist/domain/gates/stop-gate.js +0 -125
  394. package/dist/domain/gates/stop-gate.js.map +0 -1
  395. package/dist/domain/schemas/article-schema.d.ts +0 -79
  396. package/dist/domain/schemas/article-schema.d.ts.map +0 -1
  397. package/dist/domain/schemas/article-schema.js +0 -12
  398. package/dist/domain/schemas/article-schema.js.map +0 -1
  399. package/dist/domain/schemas/blocker-schema.d.ts +0 -77
  400. package/dist/domain/schemas/blocker-schema.d.ts.map +0 -1
  401. package/dist/domain/schemas/blocker-schema.js +0 -10
  402. package/dist/domain/schemas/blocker-schema.js.map +0 -1
  403. package/dist/domain/schemas/decision-schema.d.ts +0 -75
  404. package/dist/domain/schemas/decision-schema.d.ts.map +0 -1
  405. package/dist/domain/schemas/decision-schema.js +0 -8
  406. package/dist/domain/schemas/decision-schema.js.map +0 -1
  407. package/dist/domain/schemas/info-request-schema.d.ts +0 -80
  408. package/dist/domain/schemas/info-request-schema.d.ts.map +0 -1
  409. package/dist/domain/schemas/info-request-schema.js +0 -13
  410. package/dist/domain/schemas/info-request-schema.js.map +0 -1
  411. package/dist/domain/schemas/rule-schema.d.ts +0 -80
  412. package/dist/domain/schemas/rule-schema.d.ts.map +0 -1
  413. package/dist/domain/schemas/rule-schema.js +0 -10
  414. package/dist/domain/schemas/rule-schema.js.map +0 -1
  415. package/dist/domain/schemas/thread-schema.d.ts +0 -77
  416. package/dist/domain/schemas/thread-schema.d.ts.map +0 -1
  417. package/dist/domain/schemas/thread-schema.js +0 -10
  418. package/dist/domain/schemas/thread-schema.js.map +0 -1
  419. package/templates/base/playbooks/wolf-review-lenses.md +0 -50
@@ -1,10 +1,9 @@
1
- import { DEFAULT_PATTERN_THRESHOLD } from '../../adapters/fs/session-metrics-log.js';
1
+ import { DEFAULT_PATTERN_THRESHOLD, mergeRunEntries, silentRuleIds, } from '../../adapters/fs/session-metrics-log.js';
2
+ import { median } from '../../domain/tool-economy.js';
2
3
  import { UNCATEGORIZED_ERROR_CLASS } from '../../domain/error-class.js';
3
4
  import { runCostUsd } from '../../domain/pricing.js';
4
- import { silentRuleIds } from './learn-decay.js';
5
- import { mergeRunEntries } from './run-source.js';
6
5
  import { mondayOf } from './generate-insights.js';
7
- import { extractVote } from './tally-council-votes.js';
6
+ import { toolStats } from './tool-stats.js';
8
7
  export const DEFAULT_LIFECYCLE_THRESHOLDS = { newDays: 14, workhorseUses: 3 };
9
8
  /** Override из config (analytics.thresholds) поверх дефолтов (D7). */
10
9
  export function resolveLifecycleThresholds(override) {
@@ -491,6 +490,155 @@ function buildAcceptance(signals, routerLog, now, signalLogMalformedLines = 0) {
491
490
  dataQuality: { malformedLines: signalLogMalformedLines },
492
491
  };
493
492
  }
493
+ /**
494
+ * P110: толерантный парсер .wolf/metrics/skill-invocations.jsonl (прецедент readJsonl):
495
+ * битая строка → malformedLines++, не бросает; agent отсутствует → null.
496
+ * Валидная строка = JSON-объект с непустой строкой в `skill`.
497
+ */
498
+ export function parseSkillInvocations(text) {
499
+ const rows = [];
500
+ let malformedLines = 0;
501
+ for (const line of text.split('\n')) {
502
+ const trimmed = line.trim();
503
+ if (trimmed === '')
504
+ continue;
505
+ try {
506
+ const parsed = JSON.parse(trimmed);
507
+ const rec = typeof parsed === 'object' && parsed !== null ? parsed : null;
508
+ if (rec === null || typeof rec.skill !== 'string' || rec.skill === '') {
509
+ malformedLines += 1;
510
+ continue;
511
+ }
512
+ rows.push({
513
+ ts: typeof rec.ts === 'string' ? rec.ts : '',
514
+ skill: rec.skill,
515
+ agent: typeof rec.agent === 'string' && rec.agent !== '' ? rec.agent : null,
516
+ });
517
+ }
518
+ catch {
519
+ malformedLines += 1;
520
+ }
521
+ }
522
+ return { rows, malformedLines };
523
+ }
524
+ /** P110: панель доставки — чистая агрегация signals + router.log + skill-invocations.
525
+ * applied-join (только CLI-канал, session_id !== null): доставка (S, name N, ts T)
526
+ * считается applied, если в той же сессии S есть get(memory_id=N) или
527
+ * search(memory_ids ∋ N) с ts >= T. Пустые входы → пустые массивы/null-метрики. */
528
+ function buildDelivery(signals, routerLog, skillInvocations) {
529
+ // индекс get/search-вызовов по сессии (CLI-канал): tsMs + множество затронутых id
530
+ const callsBySession = new Map();
531
+ for (const s of signals) {
532
+ if (s.event !== 'mcp_call' || s.session_id === null)
533
+ continue;
534
+ if (s.tool_name !== 'get' && s.tool_name !== 'search')
535
+ continue;
536
+ let ids;
537
+ if (s.tool_name === 'get') {
538
+ const mid = s.detail?.memory_id;
539
+ if (typeof mid !== 'string' || mid === '')
540
+ continue;
541
+ ids = new Set([mid]);
542
+ }
543
+ else {
544
+ const mids = s.detail?.memory_ids;
545
+ ids = new Set((Array.isArray(mids) ? mids : []).filter((v) => typeof v === 'string' && v !== ''));
546
+ }
547
+ if (ids.size === 0)
548
+ continue;
549
+ const tsMs = Date.parse(s.ts);
550
+ if (Number.isNaN(tsMs))
551
+ continue;
552
+ const arr = callsBySession.get(s.session_id) ?? [];
553
+ arr.push({ tsMs, ids });
554
+ callsBySession.set(s.session_id, arr);
555
+ }
556
+ const byName = new Map();
557
+ let bytesSum = 0;
558
+ let bytesCount = 0;
559
+ for (const s of signals) {
560
+ if (s.event !== 'delivery')
561
+ continue;
562
+ const name = s.detail?.name;
563
+ if (typeof name !== 'string' || name === '')
564
+ continue;
565
+ const acc = byName.get(name) ?? { deliveries: 0, applied: 0 };
566
+ acc.deliveries += 1;
567
+ const b = finiteNumber(s.detail?.injection_bytes);
568
+ if (b !== null) {
569
+ bytesSum += b;
570
+ bytesCount += 1;
571
+ }
572
+ // ponytail: O(D×G) на логах ~10^4 — достаточно; индекс по id, если вырастет
573
+ if (s.session_id !== null) {
574
+ const tMs = Date.parse(s.ts);
575
+ const calls = callsBySession.get(s.session_id);
576
+ if (!Number.isNaN(tMs) && calls !== undefined) {
577
+ for (const c of calls) {
578
+ if (c.tsMs >= tMs && c.ids.has(name)) {
579
+ acc.applied += 1;
580
+ break;
581
+ }
582
+ }
583
+ }
584
+ }
585
+ byName.set(name, acc);
586
+ }
587
+ const topDelivered = [...byName.entries()]
588
+ .map(([name, a]) => ({
589
+ name,
590
+ deliveries: a.deliveries,
591
+ applied: a.applied,
592
+ appliedPct: a.deliveries > 0 ? (a.applied / a.deliveries) * 100 : null,
593
+ }))
594
+ .sort((a, b) => b.deliveries - a.deliveries || a.name.localeCompare(b.name));
595
+ const underApplied = topDelivered
596
+ .filter((r) => r.deliveries >= 10 && r.appliedPct !== null && r.appliedPct < 10)
597
+ .map((r) => r.name);
598
+ const routerAcc = new Map();
599
+ let routerBytesSum = 0;
600
+ let routerBytesCount = 0;
601
+ const msValues = [];
602
+ for (const row of routerLog?.rows ?? []) {
603
+ const acc = routerAcc.get(row.agentId) ?? { fallbacks: 0, total: 0 };
604
+ acc.total += 1;
605
+ if (row.variant === 'fallback')
606
+ acc.fallbacks += 1;
607
+ routerAcc.set(row.agentId, acc);
608
+ if (row.bytes !== null && row.bytes > 0) {
609
+ routerBytesSum += row.bytes;
610
+ routerBytesCount += 1;
611
+ }
612
+ if (row.ms !== null)
613
+ msValues.push(row.ms);
614
+ }
615
+ const missRateByAgent = [...routerAcc.entries()]
616
+ .map(([agent, a]) => ({
617
+ agent,
618
+ fallbacks: a.fallbacks,
619
+ total: a.total,
620
+ missRatePct: a.total > 0 ? (a.fallbacks / a.total) * 100 : null,
621
+ }))
622
+ .sort((a, b) => b.fallbacks - a.fallbacks || a.agent.localeCompare(b.agent));
623
+ const msSorted = msValues.sort((x, y) => x - y);
624
+ const skillsAcc = new Map();
625
+ for (const row of skillInvocations?.rows ?? []) {
626
+ skillsAcc.set(row.skill, (skillsAcc.get(row.skill) ?? 0) + 1);
627
+ }
628
+ return {
629
+ topDelivered,
630
+ underApplied,
631
+ missRateByAgent,
632
+ avgInjectionBytes: {
633
+ deliverySignals: bytesCount > 0 ? bytesSum / bytesCount : null,
634
+ routerLog: routerBytesCount > 0 ? routerBytesSum / routerBytesCount : null,
635
+ },
636
+ routerMs: { p50: percentileInterp(msSorted, 50), p90: percentileInterp(msSorted, 90), count: msSorted.length },
637
+ skills: [...skillsAcc.entries()]
638
+ .map(([skill, count]) => ({ skill, count }))
639
+ .sort((a, b) => b.count - a.count || a.skill.localeCompare(b.skill)),
640
+ };
641
+ }
494
642
  /** Coverage D5: scored = task_evaluated (любой verdict), runs = run-сигналы. */
495
643
  function buildCoverage(signals) {
496
644
  const scored = signals.filter((s) => s.event === 'task_evaluated').length;
@@ -1069,17 +1217,26 @@ function buildReadiness(signals) {
1069
1217
  // ---------------------------------------------------------------------------
1070
1218
  // Use-case
1071
1219
  // ---------------------------------------------------------------------------
1220
+ /** Парсер голоса мнения (поле vote → body `VOTE:` → TIMEOUT).
1221
+ * P203: перенесён из удалённого tally-use-case — чтение council-данных живое. */
1222
+ function extractVote(op) {
1223
+ const raw = op.vote;
1224
+ if (typeof raw === 'string' && raw.trim())
1225
+ return raw.trim();
1226
+ const m = op.body.match(/^VOTE:\s*(\S+)/m);
1227
+ return m ? m[1] : 'TIMEOUT';
1228
+ }
1072
1229
  /** Консилиумы: вопросы/мнения/синтезы из councils-subdir + relations answers/based_on.
1073
1230
  * Чистая агрегация по уже выгруженным объектам; ровно два вызова relations.list
1074
1231
  * (predicate answers и based_on — без N+1 по вопросам). Голоса — extractVote
1075
- * из tally-council-votes (единственный парсер). */
1232
+ * выше (единственный парсер). */
1076
1233
  async function buildCouncils(objects, relations, now, weeks) {
1077
1234
  const byId = new Map(objects.map((o) => [o.id, o]));
1078
1235
  const questions = objects.filter((o) => o.type === 'council-question');
1079
1236
  const opinions = objects.filter((o) => o.type === 'council-opinion');
1080
1237
  const syntheses = objects.filter((o) => o.type === 'synthesis');
1081
1238
  // вопрос → id его мнений; субъект-реляция засчитывается только если это
1082
- // существующее в store мнение (прецедент tallyCouncilVotes)
1239
+ // существующее в store мнение (парсер council-голосов — локальный, ниже)
1083
1240
  const answersByQuestion = new Map();
1084
1241
  for (const r of await relations.list({ predicate: 'answers' })) {
1085
1242
  const op = byId.get(r.subject);
@@ -1236,6 +1393,7 @@ export async function buildAnalyticsReport(deps, input) {
1236
1393
  const councils = await buildCouncils(allObjects, deps.relations, now, weeks);
1237
1394
  const coordination = buildCoordination(signals, events); // P2 D5
1238
1395
  const campaign = buildCampaignView(signals); // P3 D2
1396
+ const delivery = buildDelivery(signals, input.routerLog, input.skillInvocations); // P110
1239
1397
  const coverage = buildCoverage(signals);
1240
1398
  // D6: unknown-model и pricing-coverage по дедуплицированным run-сигналам
1241
1399
  const runSignals = signals.filter((s) => s.event === 'run');
@@ -1272,6 +1430,7 @@ export async function buildAnalyticsReport(deps, input) {
1272
1430
  councils,
1273
1431
  coordination,
1274
1432
  campaign,
1433
+ delivery,
1275
1434
  // acceptedByAgent (Map, не-JSON) остаётся внутренним — в отчёт идут публичные поля
1276
1435
  acceptance: {
1277
1436
  accepted: acceptance.accepted,
@@ -1288,6 +1447,234 @@ export async function buildAnalyticsReport(deps, input) {
1288
1447
  dataQuality,
1289
1448
  };
1290
1449
  }
1450
+ // ---------------------------------------------------------------------------
1451
+ // Effectiveness (P221 §6.5: консолидация панели, ранее отдельный use-case-модуль)
1452
+ // ---------------------------------------------------------------------------
1453
+ /**
1454
+ * E1.2: панель эффективности памяти по пробегу (`analytics --view effectiveness`).
1455
+ * Только агрегация существующих данных (store, relations, event-log, signals,
1456
+ * run-log), без LLM и без выдуманных чисел: мало данных → null → панель печатает n/a.
1457
+ *
1458
+ * Методика шума: docs/planning/memory-audit-2026-08-29.md «пишется-но-не-читается» —
1459
+ * объект шум, если нет ни одной связи (relations) и ни одного события в event-log
1460
+ * кроме memory.added; memory.scan.updated = подтверждение актуальности сканом =
1461
+ * использование. Объекты document-ref — функциональный «индекс документов»
1462
+ * (использование = регистрация/обновление сканом), исключены из метрики шума
1463
+ * и показываются отдельной строкой documents (калибровка 2026-08-30).
1464
+ * Объекты со статусом archived исключены аналогично (из числителя и знаменателя):
1465
+ * архивация — легитимный способ снижения шума; показываются строкой archived.
1466
+ * Пороги статусов — config learning.effectiveness_thresholds.
1467
+ */
1468
+ // Локальные копии из learn-decay.ts (P221: новый импорт оттуда запрещён — файл
1469
+ // умирает в параллельном потоке C; существующий импорт silentRuleIds остаётся)
1470
+ /** Окно молчания правила для rule_utilization-дрейфа [ВА] (§16). */
1471
+ const SILENT_RULE_WINDOW_SESSIONS = 30;
1472
+ /** Минимум delivery-событий в логе, чтобы судить об утилизации правил [ВА] (§16). */
1473
+ const SILENT_RULE_MIN_DELIVERIES = 20;
1474
+ /** Пробег = упорядоченные уникальные session_id из run-событий
1475
+ * (порядок первого появления в логе = хронология). */
1476
+ function countSessions(signals) {
1477
+ const seen = new Set();
1478
+ const out = [];
1479
+ for (const ev of signals) {
1480
+ if (ev.event !== 'run' || ev.session_id === null)
1481
+ continue;
1482
+ if (!seen.has(ev.session_id)) {
1483
+ seen.add(ev.session_id);
1484
+ out.push(ev.session_id);
1485
+ }
1486
+ }
1487
+ return out;
1488
+ }
1489
+ export const DEFAULT_EFFECTIVENESS_THRESHOLDS = {
1490
+ noiseOk: 20,
1491
+ noiseWarn: 40,
1492
+ silentOk: 30,
1493
+ };
1494
+ /** Шум: null → NO_DATA; <noiseOk → OK; <=noiseWarn → WARN; иначе BAD. */
1495
+ export function classifyNoise(share, t) {
1496
+ if (share === null)
1497
+ return 'NO_DATA';
1498
+ if (share < t.noiseOk)
1499
+ return 'OK';
1500
+ return share <= t.noiseWarn ? 'WARN' : 'BAD';
1501
+ }
1502
+ /** Молчащие правила: null → NO_DATA; <silentOk → OK; иначе BAD. */
1503
+ export function classifySilent(share, t) {
1504
+ if (share === null)
1505
+ return 'NO_DATA';
1506
+ return share < t.silentOk ? 'OK' : 'BAD';
1507
+ }
1508
+ /** Override из config поверх дефолтов (E1.2); битые/чужие поля отбрасываются схемой. */
1509
+ export function resolveThresholds(override) {
1510
+ return { ...DEFAULT_EFFECTIVENESS_THRESHOLDS, ...override };
1511
+ }
1512
+ /** M3: агрегация run-сигналов в блок абсолютов; пустые данные → нули/null, не выдумываем. */
1513
+ function buildTotals(signals, pricing) {
1514
+ const runs = signals.filter((s) => s.event === 'run');
1515
+ const processFailures = runs.filter((s) => s.outcome !== 'ok').length;
1516
+ const sumWeighted = runs.reduce((sum, s) => sum + (s.weighted ?? 0), 0);
1517
+ let sumTokens = null;
1518
+ const durations = [];
1519
+ let costUsd = null;
1520
+ const byModelMap = new Map();
1521
+ for (const s of runs) {
1522
+ if (typeof s.duration_ms === 'number' && Number.isFinite(s.duration_ms))
1523
+ durations.push(s.duration_ms);
1524
+ if (s.tokens !== undefined && s.tokens !== null) {
1525
+ if (sumTokens === null)
1526
+ sumTokens = { input: 0, output: 0, cache_read: 0 };
1527
+ sumTokens.input += s.tokens.input;
1528
+ sumTokens.output += s.tokens.output;
1529
+ sumTokens.cache_read += s.tokens.cache_read;
1530
+ }
1531
+ const c = runCostUsd(s.tokens, pricing, s.gen_ai.modelID);
1532
+ if (c !== null)
1533
+ costUsd = (costUsd ?? 0) + c;
1534
+ const model = s.gen_ai.modelID ?? 'unknown';
1535
+ const row = byModelMap.get(model) ?? { runs: 0, processFailures: 0, sumWeighted: 0, durations: [], costUsd: null };
1536
+ row.runs += 1;
1537
+ if (s.outcome !== 'ok')
1538
+ row.processFailures += 1;
1539
+ row.sumWeighted += s.weighted ?? 0;
1540
+ if (typeof s.duration_ms === 'number' && Number.isFinite(s.duration_ms))
1541
+ row.durations.push(s.duration_ms);
1542
+ if (c !== null)
1543
+ row.costUsd = (row.costUsd ?? 0) + c;
1544
+ byModelMap.set(model, row);
1545
+ }
1546
+ const avg = (xs) => (xs.length === 0 ? null : xs.reduce((a, b) => a + b, 0) / xs.length);
1547
+ const denom = sumTokens === null ? 0 : sumTokens.input + sumTokens.cache_read;
1548
+ const byModel = [...byModelMap.entries()]
1549
+ .map(([model, row]) => {
1550
+ const completedRuns = row.runs - row.processFailures;
1551
+ return {
1552
+ model,
1553
+ runs: row.runs,
1554
+ processFailures: row.processFailures,
1555
+ sumWeighted: row.sumWeighted,
1556
+ avgDurationMs: avg(row.durations),
1557
+ costUsd: row.costUsd,
1558
+ costPerCompletedRun: row.costUsd === null || completedRuns === 0 ? null : row.costUsd / completedRuns,
1559
+ };
1560
+ })
1561
+ .sort((a, b) => b.runs - a.runs || a.model.localeCompare(b.model));
1562
+ return {
1563
+ runs: runs.length,
1564
+ processFailures,
1565
+ sumWeighted,
1566
+ sumTokens,
1567
+ cacheHitRatio: sumTokens === null || denom === 0 ? null : (sumTokens.cache_read / denom) * 100,
1568
+ avgDurationMs: avg(durations),
1569
+ costUsd,
1570
+ byModel,
1571
+ };
1572
+ }
1573
+ /**
1574
+ * Пять блоков отчёта из одних портов: чистая агрегация, детерминированная.
1575
+ * Не падает на пустой памяти — все блоки возвращают нули/null.
1576
+ */
1577
+ export async function buildEffectivenessReport(deps, input) {
1578
+ // Блок 1 «Правила»: активные + суммы holdout-полей Ф22 по rule/lesson (все статусы)
1579
+ const activeRuleObjects = await deps.store.list({ type: 'rule', status: 'active' });
1580
+ const activeRules = activeRuleObjects.length;
1581
+ let prevented = 0;
1582
+ let checked = 0;
1583
+ let hasHoldoutData = false;
1584
+ for (const type of ['rule', 'lesson']) {
1585
+ for (const o of await deps.store.list({ type })) {
1586
+ const rec = o;
1587
+ const p = finiteNumber(rec.holdout_prevented);
1588
+ const c = finiteNumber(rec.holdout_checked);
1589
+ if (p !== null || c !== null)
1590
+ hasHoldoutData = true;
1591
+ prevented += p ?? 0;
1592
+ checked += c ?? 0;
1593
+ }
1594
+ }
1595
+ // Блок 2 «Инструменты»: реестр + экономика (переиспользуем toolStats —
1596
+ // P1 D4: сигнальный источник + legacy run-log, insufficient от analyzeEconomy)
1597
+ const { tools: toolRows, economy } = await toolStats({ store: deps.store }, { signals: input.signals, runLogText: input.runLogText });
1598
+ // Блок 3 «Доставка→срабатывание»: сигнальный лог + окно молчания из learn-decay
1599
+ const deliveries = input.signals.filter((s) => s.event === 'delivery');
1600
+ const triggered = new Set();
1601
+ for (const ev of deliveries) {
1602
+ if (typeof ev.detail?.name === 'string')
1603
+ triggered.add(ev.detail.name);
1604
+ }
1605
+ const silent = silentRuleIds(input.signals);
1606
+ // то же пре-условие, что внутри silentRuleIds (ранний выход при малом пробеге):
1607
+ // count=0 в этом случае — «не знаем», а не «нет молчащих»
1608
+ const sessions = countSessions(input.signals).length;
1609
+ const enoughDeliveryData = deliveries.length >= SILENT_RULE_MIN_DELIVERIES && sessions > SILENT_RULE_WINDOW_SESSIONS;
1610
+ // silentRuleIds возвращает ВСЕ молчащие delivery-имена (любой тип — call-injection,
1611
+ // lesson и т.д.); делим только на правила и считаем только правила (прецедент:
1612
+ // runDecayPass фильтрует по active rules) — иначе доля могла бы превысить 100%
1613
+ const activeRuleIds = new Set(activeRuleObjects.map((o) => o.id));
1614
+ const silentRules = [...silent.ids].filter((id) => activeRuleIds.has(id)).length;
1615
+ const silentShare = enoughDeliveryData && activeRules > 0 ? (silentRules / activeRules) * 100 : null;
1616
+ // Блок 4 «Шум памяти»: нет связей И нет событий кроме memory.added (event-log).
1617
+ // document-ref — функциональный «индекс документов» (использование = регистрация/
1618
+ // обновление сканом), из метрики шума исключён и из числителя, и из знаменателя
1619
+ // (калибровка 2026-08-30); показывается отдельной строкой documents.
1620
+ // archived — вне метрики и из числителя, и из знаменателя: архивация —
1621
+ // легитимный способ снижения шума (иначе transition, помечающий объект
1622
+ // «использованным», почти не улучшал метрику); показывается строкой archived.
1623
+ // memory.scan.updated = подтверждение актуальности = использование: readIds-фильтр
1624
+ // («любое событие кроме memory.added») засчитывает scan-события автоматически.
1625
+ const allObjects = await deps.store.list();
1626
+ const documents = allObjects.filter((o) => o.type === 'document-ref').length;
1627
+ const archived = allObjects.filter((o) => o.status === 'archived').length;
1628
+ const noiseBase = allObjects.filter((o) => o.type !== 'document-ref' && o.status !== 'archived');
1629
+ const linked = new Set();
1630
+ for (const r of await deps.relations.list()) {
1631
+ linked.add(r.subject);
1632
+ linked.add(r.object);
1633
+ }
1634
+ const readIds = new Set();
1635
+ for (const ev of await deps.log.readAll()) {
1636
+ if (ev.type === 'memory.added')
1637
+ continue;
1638
+ const mid = ev.payload?.memory_id;
1639
+ if (typeof mid === 'string')
1640
+ readIds.add(mid);
1641
+ }
1642
+ const writeOnly = noiseBase.filter((o) => !linked.has(o.id) && !readIds.has(o.id)).length;
1643
+ const noiseShare = noiseBase.length > 0 ? (writeOnly / noiseBase.length) * 100 : null;
1644
+ // Блок 5 «Роутинг»: группировка run-метрик (P1 D4: сигнальный источник + legacy
1645
+ // run-log) по model, медиана weighted (медианы переиспользуем)
1646
+ const weightedByModel = new Map();
1647
+ for (const entry of mergeRunEntries(input.signals, input.runLogText)) {
1648
+ const w = finiteNumber(entry.weighted);
1649
+ if (w === null)
1650
+ continue;
1651
+ const model = typeof entry.model === 'string' && entry.model !== '' ? entry.model : 'unknown';
1652
+ const arr = weightedByModel.get(model) ?? [];
1653
+ arr.push(w);
1654
+ weightedByModel.set(model, arr);
1655
+ }
1656
+ const routing = [...weightedByModel.entries()]
1657
+ .map(([model, values]) => ({ model, tasks: values.length, medianWeighted: median(values) }))
1658
+ .sort((a, b) => b.tasks - a.tasks || a.model.localeCompare(b.model));
1659
+ const noise = { totalObjects: noiseBase.length, writeOnly, share: noiseShare, documents, archived };
1660
+ return {
1661
+ rules: { activeRules, prevented: hasHoldoutData ? prevented : null, checked: hasHoldoutData ? checked : null },
1662
+ tools: { toolCount: toolRows.length, totalUsage: toolRows.reduce((sum, r) => sum + r.usage_count, 0), economy },
1663
+ delivery: {
1664
+ deliveryEvents: deliveries.length,
1665
+ triggeredObjects: triggered.size,
1666
+ activeRules,
1667
+ silentRules,
1668
+ enoughDeliveryData,
1669
+ silentShare,
1670
+ },
1671
+ noise,
1672
+ noiseStatus: classifyNoise(noiseShare, input.thresholds),
1673
+ silentStatus: classifySilent(silentShare, input.thresholds),
1674
+ routing,
1675
+ totals: buildTotals(input.signals, input.pricing),
1676
+ };
1677
+ }
1291
1678
  /** Срез отчёта по view-фильтру (§6.2); top ограничивает строки, дефолт 20. */
1292
1679
  export function filterAnalytics(report, filter) {
1293
1680
  const top = filter.top ?? 20;
@@ -1340,6 +1727,12 @@ export function filterAnalytics(report, filter) {
1340
1727
  return { view: 'coordination', coordination: report.coordination };
1341
1728
  case 'campaign':
1342
1729
  return { view: 'campaign', campaign: report.campaign };
1730
+ case 'delivery':
1731
+ // P110: top-срез из фильтра, остальные блоки целиком (JSON-сериализуемые)
1732
+ return {
1733
+ view: 'delivery',
1734
+ delivery: { ...report.delivery, topDelivered: report.delivery.topDelivered.slice(0, top) },
1735
+ };
1343
1736
  case 'acceptance':
1344
1737
  // report.acceptance = AcceptanceStats & AcceptanceView — JSON несёт и D4-поля
1345
1738
  return { view: 'acceptance', acceptance: report.acceptance };