agent-nuvira 1.14.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 (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +891 -0
  3. package/dist/agent-sdk/src/agent.d.ts +118 -0
  4. package/dist/agent-sdk/src/agent.d.ts.map +1 -0
  5. package/dist/agent-sdk/src/agent.js +88 -0
  6. package/dist/agent-sdk/src/agent.js.map +1 -0
  7. package/dist/agent-sdk/src/index.d.ts +33 -0
  8. package/dist/agent-sdk/src/index.d.ts.map +1 -0
  9. package/dist/agent-sdk/src/index.js +32 -0
  10. package/dist/agent-sdk/src/index.js.map +1 -0
  11. package/dist/agent-sdk/src/register.d.ts +70 -0
  12. package/dist/agent-sdk/src/register.d.ts.map +1 -0
  13. package/dist/agent-sdk/src/register.js +181 -0
  14. package/dist/agent-sdk/src/register.js.map +1 -0
  15. package/dist/agent-sdk/src/scaffold.d.ts +50 -0
  16. package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
  17. package/dist/agent-sdk/src/scaffold.js +291 -0
  18. package/dist/agent-sdk/src/scaffold.js.map +1 -0
  19. package/dist/agent-sdk/src/testing.d.ts +187 -0
  20. package/dist/agent-sdk/src/testing.d.ts.map +1 -0
  21. package/dist/agent-sdk/src/testing.js +243 -0
  22. package/dist/agent-sdk/src/testing.js.map +1 -0
  23. package/dist/agent-sdk/src/types.d.ts +202 -0
  24. package/dist/agent-sdk/src/types.d.ts.map +1 -0
  25. package/dist/agent-sdk/src/types.js +11 -0
  26. package/dist/agent-sdk/src/types.js.map +1 -0
  27. package/dist/agents/agent.d.ts +132 -0
  28. package/dist/agents/agent.d.ts.map +1 -0
  29. package/dist/agents/agent.js +19 -0
  30. package/dist/agents/agent.js.map +1 -0
  31. package/dist/agents/agents/context-gatherer.d.ts +42 -0
  32. package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
  33. package/dist/agents/agents/context-gatherer.js +366 -0
  34. package/dist/agents/agents/context-gatherer.js.map +1 -0
  35. package/dist/agents/agents/debugger.d.ts +58 -0
  36. package/dist/agents/agents/debugger.d.ts.map +1 -0
  37. package/dist/agents/agents/debugger.js +257 -0
  38. package/dist/agents/agents/debugger.js.map +1 -0
  39. package/dist/agents/agents/git-agent.d.ts +34 -0
  40. package/dist/agents/agents/git-agent.d.ts.map +1 -0
  41. package/dist/agents/agents/git-agent.js +200 -0
  42. package/dist/agents/agents/git-agent.js.map +1 -0
  43. package/dist/agents/agents/github-release-agent.d.ts +65 -0
  44. package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
  45. package/dist/agents/agents/github-release-agent.js +439 -0
  46. package/dist/agents/agents/github-release-agent.js.map +1 -0
  47. package/dist/agents/agents/package-agent.d.ts +33 -0
  48. package/dist/agents/agents/package-agent.d.ts.map +1 -0
  49. package/dist/agents/agents/package-agent.js +233 -0
  50. package/dist/agents/agents/package-agent.js.map +1 -0
  51. package/dist/agents/agents/planner.d.ts +26 -0
  52. package/dist/agents/agents/planner.d.ts.map +1 -0
  53. package/dist/agents/agents/planner.js +222 -0
  54. package/dist/agents/agents/planner.js.map +1 -0
  55. package/dist/agents/agents/reviewer.d.ts +34 -0
  56. package/dist/agents/agents/reviewer.d.ts.map +1 -0
  57. package/dist/agents/agents/reviewer.js +159 -0
  58. package/dist/agents/agents/reviewer.js.map +1 -0
  59. package/dist/agents/agents/runner.d.ts +73 -0
  60. package/dist/agents/agents/runner.d.ts.map +1 -0
  61. package/dist/agents/agents/runner.js +299 -0
  62. package/dist/agents/agents/runner.js.map +1 -0
  63. package/dist/agents/agents/security-agent.d.ts +33 -0
  64. package/dist/agents/agents/security-agent.d.ts.map +1 -0
  65. package/dist/agents/agents/security-agent.js +184 -0
  66. package/dist/agents/agents/security-agent.js.map +1 -0
  67. package/dist/agents/agents/tester.d.ts +96 -0
  68. package/dist/agents/agents/tester.d.ts.map +1 -0
  69. package/dist/agents/agents/tester.js +410 -0
  70. package/dist/agents/agents/tester.js.map +1 -0
  71. package/dist/agents/agents/writer.d.ts +51 -0
  72. package/dist/agents/agents/writer.d.ts.map +1 -0
  73. package/dist/agents/agents/writer.js +384 -0
  74. package/dist/agents/agents/writer.js.map +1 -0
  75. package/dist/agents/context-vault.d.ts +49 -0
  76. package/dist/agents/context-vault.d.ts.map +1 -0
  77. package/dist/agents/context-vault.js +134 -0
  78. package/dist/agents/context-vault.js.map +1 -0
  79. package/dist/agents/orchestrator.d.ts +97 -0
  80. package/dist/agents/orchestrator.d.ts.map +1 -0
  81. package/dist/agents/orchestrator.js +696 -0
  82. package/dist/agents/orchestrator.js.map +1 -0
  83. package/dist/agents/utils/file-tree.d.ts +28 -0
  84. package/dist/agents/utils/file-tree.d.ts.map +1 -0
  85. package/dist/agents/utils/file-tree.js +93 -0
  86. package/dist/agents/utils/file-tree.js.map +1 -0
  87. package/dist/cli/agent.d.ts +25 -0
  88. package/dist/cli/agent.d.ts.map +1 -0
  89. package/dist/cli/agent.js +374 -0
  90. package/dist/cli/agent.js.map +1 -0
  91. package/dist/cli/benchmark.d.ts +24 -0
  92. package/dist/cli/benchmark.d.ts.map +1 -0
  93. package/dist/cli/benchmark.js +235 -0
  94. package/dist/cli/benchmark.js.map +1 -0
  95. package/dist/cli/cache.d.ts +12 -0
  96. package/dist/cli/cache.d.ts.map +1 -0
  97. package/dist/cli/cache.js +58 -0
  98. package/dist/cli/cache.js.map +1 -0
  99. package/dist/cli/chat.d.ts +37 -0
  100. package/dist/cli/chat.d.ts.map +1 -0
  101. package/dist/cli/chat.js +393 -0
  102. package/dist/cli/chat.js.map +1 -0
  103. package/dist/cli/commands.d.ts +24 -0
  104. package/dist/cli/commands.d.ts.map +1 -0
  105. package/dist/cli/commands.js +18 -0
  106. package/dist/cli/commands.js.map +1 -0
  107. package/dist/cli/config.d.ts +19 -0
  108. package/dist/cli/config.d.ts.map +1 -0
  109. package/dist/cli/config.js +162 -0
  110. package/dist/cli/config.js.map +1 -0
  111. package/dist/cli/dashboard.d.ts +34 -0
  112. package/dist/cli/dashboard.d.ts.map +1 -0
  113. package/dist/cli/dashboard.js +126 -0
  114. package/dist/cli/dashboard.js.map +1 -0
  115. package/dist/cli/doctor.d.ts +68 -0
  116. package/dist/cli/doctor.d.ts.map +1 -0
  117. package/dist/cli/doctor.js +585 -0
  118. package/dist/cli/doctor.js.map +1 -0
  119. package/dist/cli/edit.d.ts +11 -0
  120. package/dist/cli/edit.d.ts.map +1 -0
  121. package/dist/cli/edit.js +86 -0
  122. package/dist/cli/edit.js.map +1 -0
  123. package/dist/cli/execute.d.ts +25 -0
  124. package/dist/cli/execute.d.ts.map +1 -0
  125. package/dist/cli/execute.js +186 -0
  126. package/dist/cli/execute.js.map +1 -0
  127. package/dist/cli/federation.d.ts +31 -0
  128. package/dist/cli/federation.d.ts.map +1 -0
  129. package/dist/cli/federation.js +387 -0
  130. package/dist/cli/federation.js.map +1 -0
  131. package/dist/cli/history.d.ts +22 -0
  132. package/dist/cli/history.d.ts.map +1 -0
  133. package/dist/cli/history.js +140 -0
  134. package/dist/cli/history.js.map +1 -0
  135. package/dist/cli/init.d.ts +49 -0
  136. package/dist/cli/init.d.ts.map +1 -0
  137. package/dist/cli/init.js +423 -0
  138. package/dist/cli/init.js.map +1 -0
  139. package/dist/cli/learn.d.ts +31 -0
  140. package/dist/cli/learn.d.ts.map +1 -0
  141. package/dist/cli/learn.js +320 -0
  142. package/dist/cli/learn.js.map +1 -0
  143. package/dist/cli/memory.d.ts +38 -0
  144. package/dist/cli/memory.d.ts.map +1 -0
  145. package/dist/cli/memory.js +295 -0
  146. package/dist/cli/memory.js.map +1 -0
  147. package/dist/cli/model-picker.d.ts +18 -0
  148. package/dist/cli/model-picker.d.ts.map +1 -0
  149. package/dist/cli/model-picker.js +225 -0
  150. package/dist/cli/model-picker.js.map +1 -0
  151. package/dist/cli/models.d.ts +11 -0
  152. package/dist/cli/models.d.ts.map +1 -0
  153. package/dist/cli/models.js +132 -0
  154. package/dist/cli/models.js.map +1 -0
  155. package/dist/cli/plan.d.ts +11 -0
  156. package/dist/cli/plan.d.ts.map +1 -0
  157. package/dist/cli/plan.js +94 -0
  158. package/dist/cli/plan.js.map +1 -0
  159. package/dist/cli/plugins.d.ts +15 -0
  160. package/dist/cli/plugins.d.ts.map +1 -0
  161. package/dist/cli/plugins.js +123 -0
  162. package/dist/cli/plugins.js.map +1 -0
  163. package/dist/cli/router.d.ts +20 -0
  164. package/dist/cli/router.d.ts.map +1 -0
  165. package/dist/cli/router.js +142 -0
  166. package/dist/cli/router.js.map +1 -0
  167. package/dist/cli/run.d.ts +22 -0
  168. package/dist/cli/run.d.ts.map +1 -0
  169. package/dist/cli/run.js +110 -0
  170. package/dist/cli/run.js.map +1 -0
  171. package/dist/cli/sandbox.d.ts +27 -0
  172. package/dist/cli/sandbox.d.ts.map +1 -0
  173. package/dist/cli/sandbox.js +264 -0
  174. package/dist/cli/sandbox.js.map +1 -0
  175. package/dist/cli/sdk.d.ts +27 -0
  176. package/dist/cli/sdk.d.ts.map +1 -0
  177. package/dist/cli/sdk.js +204 -0
  178. package/dist/cli/sdk.js.map +1 -0
  179. package/dist/cli/stats.d.ts +18 -0
  180. package/dist/cli/stats.d.ts.map +1 -0
  181. package/dist/cli/stats.js +78 -0
  182. package/dist/cli/stats.js.map +1 -0
  183. package/dist/cli/team.d.ts +42 -0
  184. package/dist/cli/team.d.ts.map +1 -0
  185. package/dist/cli/team.js +473 -0
  186. package/dist/cli/team.js.map +1 -0
  187. package/dist/cli/workflow.d.ts +27 -0
  188. package/dist/cli/workflow.d.ts.map +1 -0
  189. package/dist/cli/workflow.js +347 -0
  190. package/dist/cli/workflow.js.map +1 -0
  191. package/dist/config/manager.d.ts +37 -0
  192. package/dist/config/manager.d.ts.map +1 -0
  193. package/dist/config/manager.js +147 -0
  194. package/dist/config/manager.js.map +1 -0
  195. package/dist/config/types.d.ts +53 -0
  196. package/dist/config/types.d.ts.map +1 -0
  197. package/dist/config/types.js +2 -0
  198. package/dist/config/types.js.map +1 -0
  199. package/dist/context/cache.d.ts +27 -0
  200. package/dist/context/cache.d.ts.map +1 -0
  201. package/dist/context/cache.js +116 -0
  202. package/dist/context/cache.js.map +1 -0
  203. package/dist/context/history.d.ts +87 -0
  204. package/dist/context/history.d.ts.map +1 -0
  205. package/dist/context/history.js +249 -0
  206. package/dist/context/history.js.map +1 -0
  207. package/dist/context/parser.d.ts +61 -0
  208. package/dist/context/parser.d.ts.map +1 -0
  209. package/dist/context/parser.js +194 -0
  210. package/dist/context/parser.js.map +1 -0
  211. package/dist/federation/client.d.ts +49 -0
  212. package/dist/federation/client.d.ts.map +1 -0
  213. package/dist/federation/client.js +239 -0
  214. package/dist/federation/client.js.map +1 -0
  215. package/dist/federation/protocol.d.ts +155 -0
  216. package/dist/federation/protocol.d.ts.map +1 -0
  217. package/dist/federation/protocol.js +57 -0
  218. package/dist/federation/protocol.js.map +1 -0
  219. package/dist/federation/server.d.ts +25 -0
  220. package/dist/federation/server.d.ts.map +1 -0
  221. package/dist/federation/server.js +401 -0
  222. package/dist/federation/server.js.map +1 -0
  223. package/dist/index.d.ts +67 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +93 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/inference/factory.d.ts +20 -0
  228. package/dist/inference/factory.d.ts.map +1 -0
  229. package/dist/inference/factory.js +46 -0
  230. package/dist/inference/factory.js.map +1 -0
  231. package/dist/inference/gemini-adapter.d.ts +17 -0
  232. package/dist/inference/gemini-adapter.d.ts.map +1 -0
  233. package/dist/inference/gemini-adapter.js +176 -0
  234. package/dist/inference/gemini-adapter.js.map +1 -0
  235. package/dist/inference/groq-adapter.d.ts +17 -0
  236. package/dist/inference/groq-adapter.d.ts.map +1 -0
  237. package/dist/inference/groq-adapter.js +103 -0
  238. package/dist/inference/groq-adapter.js.map +1 -0
  239. package/dist/inference/interface.d.ts +49 -0
  240. package/dist/inference/interface.d.ts.map +1 -0
  241. package/dist/inference/interface.js +2 -0
  242. package/dist/inference/interface.js.map +1 -0
  243. package/dist/inference/local-adapter.d.ts +35 -0
  244. package/dist/inference/local-adapter.d.ts.map +1 -0
  245. package/dist/inference/local-adapter.js +311 -0
  246. package/dist/inference/local-adapter.js.map +1 -0
  247. package/dist/inference/model-catalog.d.ts +53 -0
  248. package/dist/inference/model-catalog.d.ts.map +1 -0
  249. package/dist/inference/model-catalog.js +306 -0
  250. package/dist/inference/model-catalog.js.map +1 -0
  251. package/dist/inference/nim-adapter.d.ts +17 -0
  252. package/dist/inference/nim-adapter.d.ts.map +1 -0
  253. package/dist/inference/nim-adapter.js +103 -0
  254. package/dist/inference/nim-adapter.js.map +1 -0
  255. package/dist/inference/openrouter-adapter.d.ts +17 -0
  256. package/dist/inference/openrouter-adapter.d.ts.map +1 -0
  257. package/dist/inference/openrouter-adapter.js +105 -0
  258. package/dist/inference/openrouter-adapter.js.map +1 -0
  259. package/dist/inference/sse.d.ts +20 -0
  260. package/dist/inference/sse.d.ts.map +1 -0
  261. package/dist/inference/sse.js +91 -0
  262. package/dist/inference/sse.js.map +1 -0
  263. package/dist/learning/agent-stats.d.ts +109 -0
  264. package/dist/learning/agent-stats.d.ts.map +1 -0
  265. package/dist/learning/agent-stats.js +240 -0
  266. package/dist/learning/agent-stats.js.map +1 -0
  267. package/dist/learning/benchmark.d.ts +161 -0
  268. package/dist/learning/benchmark.d.ts.map +1 -0
  269. package/dist/learning/benchmark.js +589 -0
  270. package/dist/learning/benchmark.js.map +1 -0
  271. package/dist/learning/cost-tracker.d.ts +101 -0
  272. package/dist/learning/cost-tracker.d.ts.map +1 -0
  273. package/dist/learning/cost-tracker.js +224 -0
  274. package/dist/learning/cost-tracker.js.map +1 -0
  275. package/dist/learning/feedback.d.ts +88 -0
  276. package/dist/learning/feedback.d.ts.map +1 -0
  277. package/dist/learning/feedback.js +169 -0
  278. package/dist/learning/feedback.js.map +1 -0
  279. package/dist/learning/hybrid-router.d.ts +201 -0
  280. package/dist/learning/hybrid-router.d.ts.map +1 -0
  281. package/dist/learning/hybrid-router.js +450 -0
  282. package/dist/learning/hybrid-router.js.map +1 -0
  283. package/dist/learning/model-compare.d.ts +76 -0
  284. package/dist/learning/model-compare.d.ts.map +1 -0
  285. package/dist/learning/model-compare.js +252 -0
  286. package/dist/learning/model-compare.js.map +1 -0
  287. package/dist/learning/model-router.d.ts +68 -0
  288. package/dist/learning/model-router.d.ts.map +1 -0
  289. package/dist/learning/model-router.js +140 -0
  290. package/dist/learning/model-router.js.map +1 -0
  291. package/dist/learning/pattern-extractor.d.ts +99 -0
  292. package/dist/learning/pattern-extractor.d.ts.map +1 -0
  293. package/dist/learning/pattern-extractor.js +310 -0
  294. package/dist/learning/pattern-extractor.js.map +1 -0
  295. package/dist/learning/scorer.d.ts +51 -0
  296. package/dist/learning/scorer.d.ts.map +1 -0
  297. package/dist/learning/scorer.js +64 -0
  298. package/dist/learning/scorer.js.map +1 -0
  299. package/dist/learning/self-improver.d.ts +48 -0
  300. package/dist/learning/self-improver.d.ts.map +1 -0
  301. package/dist/learning/self-improver.js +161 -0
  302. package/dist/learning/self-improver.js.map +1 -0
  303. package/dist/memory/embedder.d.ts +65 -0
  304. package/dist/memory/embedder.d.ts.map +1 -0
  305. package/dist/memory/embedder.js +424 -0
  306. package/dist/memory/embedder.js.map +1 -0
  307. package/dist/memory/memory-integration.d.ts +56 -0
  308. package/dist/memory/memory-integration.d.ts.map +1 -0
  309. package/dist/memory/memory-integration.js +95 -0
  310. package/dist/memory/memory-integration.js.map +1 -0
  311. package/dist/memory/trajectory-store.d.ts +149 -0
  312. package/dist/memory/trajectory-store.d.ts.map +1 -0
  313. package/dist/memory/trajectory-store.js +476 -0
  314. package/dist/memory/trajectory-store.js.map +1 -0
  315. package/dist/memory/vector-store.d.ts +78 -0
  316. package/dist/memory/vector-store.d.ts.map +1 -0
  317. package/dist/memory/vector-store.js +186 -0
  318. package/dist/memory/vector-store.js.map +1 -0
  319. package/dist/plugins/agent-plugin.d.ts +73 -0
  320. package/dist/plugins/agent-plugin.d.ts.map +1 -0
  321. package/dist/plugins/agent-plugin.js +199 -0
  322. package/dist/plugins/agent-plugin.js.map +1 -0
  323. package/dist/plugins/registry.d.ts +61 -0
  324. package/dist/plugins/registry.d.ts.map +1 -0
  325. package/dist/plugins/registry.js +67 -0
  326. package/dist/plugins/registry.js.map +1 -0
  327. package/dist/sandbox/images.d.ts +31 -0
  328. package/dist/sandbox/images.d.ts.map +1 -0
  329. package/dist/sandbox/images.js +129 -0
  330. package/dist/sandbox/images.js.map +1 -0
  331. package/dist/sandbox/manager.d.ts +134 -0
  332. package/dist/sandbox/manager.d.ts.map +1 -0
  333. package/dist/sandbox/manager.js +470 -0
  334. package/dist/sandbox/manager.js.map +1 -0
  335. package/dist/sandbox/types.d.ts +113 -0
  336. package/dist/sandbox/types.d.ts.map +1 -0
  337. package/dist/sandbox/types.js +107 -0
  338. package/dist/sandbox/types.js.map +1 -0
  339. package/dist/security/scanner.d.ts +53 -0
  340. package/dist/security/scanner.d.ts.map +1 -0
  341. package/dist/security/scanner.js +271 -0
  342. package/dist/security/scanner.js.map +1 -0
  343. package/dist/team/config.d.ts +50 -0
  344. package/dist/team/config.d.ts.map +1 -0
  345. package/dist/team/config.js +108 -0
  346. package/dist/team/config.js.map +1 -0
  347. package/dist/team/memory.d.ts +63 -0
  348. package/dist/team/memory.d.ts.map +1 -0
  349. package/dist/team/memory.js +282 -0
  350. package/dist/team/memory.js.map +1 -0
  351. package/dist/team/review.d.ts +123 -0
  352. package/dist/team/review.d.ts.map +1 -0
  353. package/dist/team/review.js +293 -0
  354. package/dist/team/review.js.map +1 -0
  355. package/dist/utils/env.d.ts +19 -0
  356. package/dist/utils/env.d.ts.map +1 -0
  357. package/dist/utils/env.js +250 -0
  358. package/dist/utils/env.js.map +1 -0
  359. package/dist/utils/logger.d.ts +11 -0
  360. package/dist/utils/logger.d.ts.map +1 -0
  361. package/dist/utils/logger.js +45 -0
  362. package/dist/utils/logger.js.map +1 -0
  363. package/dist/web-dashboard/server.d.ts +59 -0
  364. package/dist/web-dashboard/server.d.ts.map +1 -0
  365. package/dist/web-dashboard/server.js +418 -0
  366. package/dist/web-dashboard/server.js.map +1 -0
  367. package/dist/workflow/registry.d.ts +127 -0
  368. package/dist/workflow/registry.d.ts.map +1 -0
  369. package/dist/workflow/registry.js +482 -0
  370. package/dist/workflow/registry.js.map +1 -0
  371. package/dist/workflow/templates.d.ts +93 -0
  372. package/dist/workflow/templates.d.ts.map +1 -0
  373. package/dist/workflow/templates.js +481 -0
  374. package/dist/workflow/templates.js.map +1 -0
  375. package/package.json +78 -0
  376. package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
  377. package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
  378. package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
  379. package/src/web-dashboard/public/index.html +13 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * PatternExtractor — Extracts reusable coding patterns from high-scoring
3
+ * execution trajectories and stores them for future prompting.
4
+ *
5
+ * A "pattern" is a concise description of how a particular type of task
6
+ * was successfully completed: which files were involved, what steps were
7
+ * taken, what conventions were followed.
8
+ *
9
+ * These patterns are injected alongside trajectory few-shot examples
10
+ * when the PlannerAgent decomposes a new goal.
11
+ *
12
+ * Patterns are stored in ~/.buff/memory/patterns.json
13
+ */
14
+ import type { LLMCallFn } from '../agents/agent.js';
15
+ import type { Trajectory } from '../memory/trajectory-store.js';
16
+ /** A reusable coding pattern extracted from successful trajectories */
17
+ export interface CodingPattern {
18
+ /** Unique identifier */
19
+ id: string;
20
+ /** Short descriptive title (e.g., "Adding CLI commands") */
21
+ title: string;
22
+ /** Which project types this applies to (e.g., "typescript, node") */
23
+ applicableDomains: string[];
24
+ /** The pattern description — steps, conventions, file structure */
25
+ description: string;
26
+ /** File paths commonly involved (pattern-based, not absolute) */
27
+ commonFiles: string[];
28
+ /** Agent types commonly used */
29
+ commonAgentSequence: string[];
30
+ /** How many trajectories this was distilled from */
31
+ sourceCount: number;
32
+ /** Average score of source trajectories */
33
+ avgSourceScore: number;
34
+ /** When this pattern was created */
35
+ createdAt: number;
36
+ /** When this pattern was last used (for decay scoring) */
37
+ lastUsedAt: number;
38
+ /** How many times this pattern has been used */
39
+ usageCount: number;
40
+ }
41
+ /**
42
+ * Manages storage and retrieval of reusable coding patterns.
43
+ * Patterns are extracted from high-scoring trajectories via LLM.
44
+ */
45
+ export declare class PatternStore {
46
+ private patterns;
47
+ constructor();
48
+ /**
49
+ * Get all stored patterns, optionally filtered by minimum quality score.
50
+ */
51
+ getAll(minQualityScore?: number): CodingPattern[];
52
+ /**
53
+ * Get patterns relevant to a specific project domain.
54
+ */
55
+ getByDomain(domainTags: string[]): CodingPattern[];
56
+ /**
57
+ * Format patterns as a prompt string for agent injection.
58
+ */
59
+ formatAsPrompt(domainTags?: string[]): string;
60
+ /**
61
+ * Extract patterns from high-scoring trajectories using the LLM.
62
+ * Newly extracted patterns are merged with existing ones (keeping the best).
63
+ */
64
+ extractFromTrajectories(trajectories: Trajectory[], callLLM: LLMCallFn): Promise<number>;
65
+ /**
66
+ * Mark a pattern as used (for decay tracking).
67
+ */
68
+ markUsed(patternId: string): void;
69
+ /**
70
+ * Compute a decay score for a pattern based on age and usage.
71
+ * Returns a score from 0 (expired) to 1 (fresh).
72
+ */
73
+ computeDecayScore(pattern: CodingPattern): number;
74
+ /**
75
+ * Garbage collect low-quality patterns.
76
+ * Returns the number of patterns removed.
77
+ */
78
+ garbageCollect(verbose?: boolean): number;
79
+ /**
80
+ * Get decay quality statistics for all patterns.
81
+ */
82
+ getQualityReport(): Array<{
83
+ id: string;
84
+ title: string;
85
+ decayScore: number;
86
+ usageCount: number;
87
+ ageDays: number;
88
+ }>;
89
+ /**
90
+ * Clear all patterns.
91
+ */
92
+ clear(): void;
93
+ private load;
94
+ private save;
95
+ private buildExtractionPrompt;
96
+ private parsePatterns;
97
+ }
98
+ export declare function getPatternStore(): PatternStore;
99
+ //# sourceMappingURL=pattern-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-extractor.d.ts","sourceRoot":"","sources":["../../src/learning/pattern-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAKhE,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gCAAgC;IAChC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAmDD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAuB;;IAQvC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAQjD;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE;IAWlD;;OAEG;IACH,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAqB7C;;;OAGG;IACG,uBAAuB,CAC3B,YAAY,EAAE,UAAU,EAAE,EAC1B,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,CAAC;IAqDlB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASjC;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM;IAqBjD;;;OAGG;IACH,cAAc,CAAC,OAAO,GAAE,OAAe,GAAG,MAAM;IA0BhD;;OAEG;IACH,gBAAgB,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAWjH;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,IAAI;IAoBZ,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,aAAa;CAiCtB;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
@@ -0,0 +1,310 @@
1
+ /**
2
+ * PatternExtractor — Extracts reusable coding patterns from high-scoring
3
+ * execution trajectories and stores them for future prompting.
4
+ *
5
+ * A "pattern" is a concise description of how a particular type of task
6
+ * was successfully completed: which files were involved, what steps were
7
+ * taken, what conventions were followed.
8
+ *
9
+ * These patterns are injected alongside trajectory few-shot examples
10
+ * when the PlannerAgent decomposes a new goal.
11
+ *
12
+ * Patterns are stored in ~/.buff/memory/patterns.json
13
+ */
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { homedir } from 'node:os';
17
+ import { logger } from '../utils/logger.js';
18
+ // ─── Constants ──────────────────────────────────────────────────────────────
19
+ const MEMORY_DIR = join(homedir(), '.buff', 'memory');
20
+ const PATTERNS_PATH = join(MEMORY_DIR, 'patterns.json');
21
+ const CURRENT_VERSION = 2;
22
+ const MAX_PATTERNS = 30;
23
+ const MIN_SCORE_FOR_EXTRACTION = 0.7; // Only extract from high-quality trajectories
24
+ const MAX_TRAJECTORIES_FOR_EXTRACTION = 5;
25
+ // Pattern decay: patterns lose relevance over time
26
+ const PATTERN_TTL_DAYS = 90; // Expire after 90 days without use
27
+ const DECAY_DAYS_FOR_HALF_SCORE = 30; // Score halves after 30 days of no use
28
+ const MIN_PATTERN_SCORE = 0.2; // Prune patterns below this score
29
+ const EXTRACTION_PROMPT = `You are a senior software architect analyzing successful task executions. Given a set of execution trajectories, identify reusable patterns that would help complete similar tasks in the future.
30
+
31
+ For each distinct pattern you identify, provide:
32
+ 1. A short title (max 60 chars)
33
+ 2. Which tech stacks/domains it applies to (comma-separated)
34
+ 3. A concise description of the approach/structure (2-4 sentences)
35
+ 4. The file paths typically involved (as glob-like patterns)
36
+ 5. The agent sequence that works well for this task type
37
+
38
+ Focus on structural patterns, not specific code. What matters is:
39
+ - Which files tend to be touched together?
40
+ - What's the right order of operations?
41
+ - What conventions should be followed?
42
+
43
+ Return a JSON array of patterns. Example:
44
+ [
45
+ {
46
+ "title": "Adding new CLI commands",
47
+ "applicableDomains": ["typescript", "node", "cli"],
48
+ "description": "When adding a new CLI command, first update the command registration in the router, then create the implementation module, then update help text and exports.",
49
+ "commonFiles": ["src/cli/router.ts", "src/cli/*.ts", "src/index.ts"],
50
+ "commonAgentSequence": ["context-gatherer", "writer", "reviewer"]
51
+ }
52
+ ]
53
+
54
+ Extract up to 3 patterns from the provided trajectories.`;
55
+ // ─── PatternStore ───────────────────────────────────────────────────────────
56
+ /**
57
+ * Manages storage and retrieval of reusable coding patterns.
58
+ * Patterns are extracted from high-scoring trajectories via LLM.
59
+ */
60
+ export class PatternStore {
61
+ patterns = [];
62
+ constructor() {
63
+ this.patterns = this.load();
64
+ }
65
+ // ── Public API ──────────────────────────────────────────────────────────
66
+ /**
67
+ * Get all stored patterns, optionally filtered by minimum quality score.
68
+ */
69
+ getAll(minQualityScore) {
70
+ const patterns = [...this.patterns];
71
+ if (minQualityScore !== undefined) {
72
+ return patterns.filter((p) => this.computeDecayScore(p) >= minQualityScore);
73
+ }
74
+ return patterns;
75
+ }
76
+ /**
77
+ * Get patterns relevant to a specific project domain.
78
+ */
79
+ getByDomain(domainTags) {
80
+ if (domainTags.length === 0)
81
+ return this.getAll().slice(0, 3);
82
+ return this.patterns
83
+ .filter((p) => p.applicableDomains.some((d) => domainTags.some((tag) => d.toLowerCase().includes(tag.toLowerCase()))))
84
+ .slice(0, 3);
85
+ }
86
+ /**
87
+ * Format patterns as a prompt string for agent injection.
88
+ */
89
+ formatAsPrompt(domainTags) {
90
+ const relevant = domainTags ? this.getByDomain(domainTags) : this.getAll().slice(0, 3);
91
+ if (relevant.length === 0)
92
+ return '';
93
+ const parts = relevant.map((p, i) => `## Pattern ${i + 1}: ${p.title}\n` +
94
+ `Domains: ${p.applicableDomains.join(', ')}\n` +
95
+ `Approach: ${p.description}\n` +
96
+ `Common files: ${p.commonFiles.join(', ')}\n` +
97
+ `Agent sequence: ${p.commonAgentSequence.join(' → ')}`);
98
+ return (`\n---\n` +
99
+ `Here are reusable patterns learned from past successful executions similar to this project:\n\n` +
100
+ parts.join('\n\n') +
101
+ `\n---\n`);
102
+ }
103
+ /**
104
+ * Extract patterns from high-scoring trajectories using the LLM.
105
+ * Newly extracted patterns are merged with existing ones (keeping the best).
106
+ */
107
+ async extractFromTrajectories(trajectories, callLLM) {
108
+ const highScoring = trajectories
109
+ .filter((t) => t.score >= MIN_SCORE_FOR_EXTRACTION)
110
+ .slice(0, MAX_TRAJECTORIES_FOR_EXTRACTION);
111
+ if (highScoring.length < 2)
112
+ return 0; // Need at least 2 for pattern extraction
113
+ const prompt = this.buildExtractionPrompt(highScoring);
114
+ let response;
115
+ try {
116
+ response = await callLLM(prompt, {
117
+ temperature: 0.3,
118
+ maxTokens: 4096,
119
+ });
120
+ }
121
+ catch (err) {
122
+ logger.debug(`Pattern extraction failed: ${err}`);
123
+ return 0;
124
+ }
125
+ const newPatterns = this.parsePatterns(response);
126
+ if (newPatterns.length === 0)
127
+ return 0;
128
+ // Merge: replace existing patterns with same title, add new ones
129
+ for (const pattern of newPatterns) {
130
+ pattern.id = `pattern-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
131
+ pattern.sourceCount = highScoring.length;
132
+ pattern.avgSourceScore =
133
+ highScoring.reduce((sum, t) => sum + t.score, 0) / highScoring.length;
134
+ pattern.createdAt = Date.now();
135
+ pattern.lastUsedAt = Date.now();
136
+ pattern.usageCount = 0;
137
+ const existing = this.patterns.findIndex((p) => p.title.toLowerCase() === pattern.title.toLowerCase());
138
+ if (existing >= 0) {
139
+ this.patterns[existing] = pattern;
140
+ }
141
+ else {
142
+ this.patterns.push(pattern);
143
+ }
144
+ }
145
+ // Keep only the best ones
146
+ if (this.patterns.length > MAX_PATTERNS) {
147
+ this.patterns.sort((a, b) => b.avgSourceScore - a.avgSourceScore);
148
+ this.patterns = this.patterns.slice(0, MAX_PATTERNS);
149
+ }
150
+ this.save();
151
+ return newPatterns.length;
152
+ }
153
+ /**
154
+ * Mark a pattern as used (for decay tracking).
155
+ */
156
+ markUsed(patternId) {
157
+ const pattern = this.patterns.find((p) => p.id === patternId);
158
+ if (pattern) {
159
+ pattern.lastUsedAt = Date.now();
160
+ pattern.usageCount++;
161
+ this.save();
162
+ }
163
+ }
164
+ /**
165
+ * Compute a decay score for a pattern based on age and usage.
166
+ * Returns a score from 0 (expired) to 1 (fresh).
167
+ */
168
+ computeDecayScore(pattern) {
169
+ const now = Date.now();
170
+ const ageMs = now - pattern.createdAt;
171
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
172
+ // Hard expiry: pattern too old
173
+ if (ageDays > PATTERN_TTL_DAYS)
174
+ return 0;
175
+ // Time-based decay: score halves after DECAY_DAYS_FOR_HALF_SCORE
176
+ const timeScore = Math.pow(0.5, ageDays / DECAY_DAYS_FOR_HALF_SCORE);
177
+ // Usage bonus: patterns used more often are worth keeping
178
+ const usageBonus = Math.min(pattern.usageCount * 0.05, 0.3);
179
+ // Last-used bonus: recently used patterns get a boost
180
+ const daysSinceLastUse = (now - pattern.lastUsedAt) / (1000 * 60 * 60 * 24);
181
+ const recencyBonus = Math.max(0, 0.2 - daysSinceLastUse * 0.01);
182
+ return Math.min(1, timeScore + usageBonus + recencyBonus);
183
+ }
184
+ /**
185
+ * Garbage collect low-quality patterns.
186
+ * Returns the number of patterns removed.
187
+ */
188
+ garbageCollect(verbose = false) {
189
+ const before = this.patterns.length;
190
+ // Remove patterns below minimum score
191
+ this.patterns = this.patterns.filter((p) => {
192
+ const score = this.computeDecayScore(p);
193
+ if (score < MIN_PATTERN_SCORE) {
194
+ if (verbose) {
195
+ logger.debug(`Pruning pattern '${p.title}' (decay score: ${(score * 100).toFixed(0)}%)`);
196
+ }
197
+ return false;
198
+ }
199
+ return true;
200
+ });
201
+ // Also enforce max patterns
202
+ if (this.patterns.length > MAX_PATTERNS) {
203
+ this.patterns.sort((a, b) => this.computeDecayScore(b) - this.computeDecayScore(a));
204
+ this.patterns = this.patterns.slice(0, MAX_PATTERNS);
205
+ }
206
+ const removed = before - this.patterns.length;
207
+ if (removed > 0)
208
+ this.save();
209
+ return removed;
210
+ }
211
+ /**
212
+ * Get decay quality statistics for all patterns.
213
+ */
214
+ getQualityReport() {
215
+ const now = Date.now();
216
+ return this.patterns.map((p) => ({
217
+ id: p.id,
218
+ title: p.title,
219
+ decayScore: this.computeDecayScore(p),
220
+ usageCount: p.usageCount,
221
+ ageDays: Math.floor((now - p.createdAt) / (1000 * 60 * 60 * 24)),
222
+ })).sort((a, b) => a.decayScore - b.decayScore); // Worst first
223
+ }
224
+ /**
225
+ * Clear all patterns.
226
+ */
227
+ clear() {
228
+ this.patterns = [];
229
+ this.save();
230
+ }
231
+ // ── Private ────────────────────────────────────────────────────────────
232
+ load() {
233
+ try {
234
+ ensureDir();
235
+ if (!existsSync(PATTERNS_PATH))
236
+ return [];
237
+ const raw = readFileSync(PATTERNS_PATH, 'utf-8');
238
+ const data = JSON.parse(raw);
239
+ // Migrate old-format patterns (version 1 → 2) that may lack lastUsedAt/usageCount
240
+ const patterns = (data.patterns || []).map((p) => ({
241
+ ...p,
242
+ lastUsedAt: p.lastUsedAt ?? p.createdAt ?? Date.now(),
243
+ usageCount: p.usageCount ?? 0,
244
+ }));
245
+ return patterns;
246
+ }
247
+ catch {
248
+ return [];
249
+ }
250
+ }
251
+ save() {
252
+ ensureDir();
253
+ const data = { patterns: this.patterns, version: CURRENT_VERSION };
254
+ writeFileSync(PATTERNS_PATH, JSON.stringify(data, null, 2), 'utf-8');
255
+ }
256
+ buildExtractionPrompt(trajectories) {
257
+ const trajText = trajectories
258
+ .map((t, i) => `Trajectory ${i + 1} (score: ${t.score.toFixed(2)}):\n` +
259
+ `Goal: ${t.goal}\n` +
260
+ `Project: ${t.projectFingerprint}\n` +
261
+ `Steps: ${t.taskPlan.map((s) => `[${s.agentType}] ${s.description}`).join('\n')}\n` +
262
+ `Files: ${t.fileChanges.map((fc) => fc.path).join(', ')}\n`)
263
+ .join('\n---\n');
264
+ return `${EXTRACTION_PROMPT}\n\n## Execution Trajectories\n\n${trajText}`;
265
+ }
266
+ parsePatterns(response) {
267
+ // Try direct JSON parse first
268
+ try {
269
+ const trimmed = response.trim();
270
+ // Strip code block wrappers if present
271
+ const jsonStr = trimmed.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
272
+ const parsed = JSON.parse(jsonStr);
273
+ if (Array.isArray(parsed)) {
274
+ return parsed.filter((p) => p.title && p.description && Array.isArray(p.applicableDomains));
275
+ }
276
+ }
277
+ catch {
278
+ // Fall through
279
+ }
280
+ // Try extracting JSON array from the response
281
+ const arrayMatch = response.match(/\[[\s\S]*?\]/);
282
+ if (arrayMatch) {
283
+ try {
284
+ const parsed = JSON.parse(arrayMatch[0]);
285
+ if (Array.isArray(parsed)) {
286
+ return parsed.filter((p) => p.title && p.description && Array.isArray(p.applicableDomains));
287
+ }
288
+ }
289
+ catch {
290
+ // Fall through
291
+ }
292
+ }
293
+ return [];
294
+ }
295
+ }
296
+ // Singleton
297
+ let storeInstance = null;
298
+ export function getPatternStore() {
299
+ if (!storeInstance) {
300
+ storeInstance = new PatternStore();
301
+ }
302
+ return storeInstance;
303
+ }
304
+ // ─── Helpers ────────────────────────────────────────────────────────────────
305
+ function ensureDir() {
306
+ if (!existsSync(MEMORY_DIR)) {
307
+ mkdirSync(MEMORY_DIR, { recursive: true });
308
+ }
309
+ }
310
+ //# sourceMappingURL=pattern-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-extractor.js","sourceRoot":"","sources":["../../src/learning/pattern-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * TrajectoryScorer — Scores execution trajectories based on outcome quality.
3
+ *
4
+ * Scoring heuristics (max score = 1.0):
5
+ * - Base completion: 0.4 (all tasks completed → 0.4, partial → proportional)
6
+ * - No test failures: +0.3 (all tests passed)
7
+ * - No reviewer issues: +0.2 (reviewer approved)
8
+ * - Fewer iterations: +0.1 (fewer agent steps = more efficient)
9
+ *
10
+ * Scores are computed when a trajectory is saved and can be re-scored later
11
+ * if the user provides feedback (e.g., "accepted changes").
12
+ *
13
+ * Scoring happens at save time in the TrajectoryStore and is stored
14
+ * in the trajectory's `score` field for search ranking.
15
+ */
16
+ import type { OrchestrationResult } from '../agents/orchestrator.js';
17
+ export interface ScoreComponents {
18
+ /** 0–0.4: based on task completion ratio */
19
+ completionScore: number;
20
+ /** 0–0.3: based on test success */
21
+ testScore: number;
22
+ /** 0–0.2: based on reviewer approval */
23
+ reviewScore: number;
24
+ /** 0–0.1: based on efficiency (fewer iterations) */
25
+ efficiencyScore: number;
26
+ /** Total score (0–1), clamped */
27
+ total: number;
28
+ }
29
+ export interface ScoreInput {
30
+ /** Tasks completed vs total (e.g., 5/5) */
31
+ tasksCompleted: number;
32
+ tasksTotal: number;
33
+ /** Whether all tests passed (from TesterAgent) */
34
+ testsPassed?: boolean;
35
+ /** Whether the reviewer approved (no critical issues) */
36
+ reviewPassed?: boolean;
37
+ /** Number of agent steps executed (fewer = more efficient) */
38
+ totalSteps?: number;
39
+ /** 0–1 user feedback (1 = accepted without changes) */
40
+ userAcceptance?: number;
41
+ }
42
+ /**
43
+ * Score a trajectory execution outcome.
44
+ * Returns component scores and the total.
45
+ */
46
+ export declare function scoreTrajectory(input: ScoreInput): ScoreComponents;
47
+ /**
48
+ * Convenience: score an OrchestrationResult directly.
49
+ */
50
+ export declare function scoreOrchestrationResult(result: OrchestrationResult, extra?: Partial<ScoreInput>): number;
51
+ //# sourceMappingURL=scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../src/learning/scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAelE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAC1B,MAAM,CAQR"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * TrajectoryScorer — Scores execution trajectories based on outcome quality.
3
+ *
4
+ * Scoring heuristics (max score = 1.0):
5
+ * - Base completion: 0.4 (all tasks completed → 0.4, partial → proportional)
6
+ * - No test failures: +0.3 (all tests passed)
7
+ * - No reviewer issues: +0.2 (reviewer approved)
8
+ * - Fewer iterations: +0.1 (fewer agent steps = more efficient)
9
+ *
10
+ * Scores are computed when a trajectory is saved and can be re-scored later
11
+ * if the user provides feedback (e.g., "accepted changes").
12
+ *
13
+ * Scoring happens at save time in the TrajectoryStore and is stored
14
+ * in the trajectory's `score` field for search ranking.
15
+ */
16
+ // ─── Constants ──────────────────────────────────────────────────────────────
17
+ const MAX_COMPLETION_SCORE = 0.4;
18
+ const MAX_TEST_SCORE = 0.3;
19
+ const MAX_REVIEW_SCORE = 0.2;
20
+ const MAX_EFFICIENCY_SCORE = 0.1;
21
+ const MAX_USER_FEEDBACK_SCORE = 0.5;
22
+ const BASELINE_STEPS = 3; // "Ideal" minimum steps for most tasks
23
+ // ─── Scorer ─────────────────────────────────────────────────────────────────
24
+ /**
25
+ * Score a trajectory execution outcome.
26
+ * Returns component scores and the total.
27
+ */
28
+ export function scoreTrajectory(input) {
29
+ const completionScore = computeCompletionScore(input.tasksCompleted, input.tasksTotal);
30
+ const testScore = input.testsPassed === true ? MAX_TEST_SCORE : 0;
31
+ const reviewScore = input.reviewPassed === true ? MAX_REVIEW_SCORE : 0;
32
+ const efficiencyScore = computeEfficiencyScore(input.totalSteps);
33
+ const userScore = input.userAcceptance
34
+ ? input.userAcceptance * MAX_USER_FEEDBACK_SCORE
35
+ : 0;
36
+ const total = Math.min(completionScore + testScore + reviewScore + efficiencyScore + userScore, 1.0);
37
+ return { completionScore, testScore, reviewScore, efficiencyScore, total };
38
+ }
39
+ /**
40
+ * Convenience: score an OrchestrationResult directly.
41
+ */
42
+ export function scoreOrchestrationResult(result, extra) {
43
+ const scored = scoreTrajectory({
44
+ tasksCompleted: result.tasksCompleted,
45
+ tasksTotal: result.tasksTotal,
46
+ reviewPassed: result.success,
47
+ ...extra,
48
+ });
49
+ return scored.total;
50
+ }
51
+ // ─── Helpers ────────────────────────────────────────────────────────────────
52
+ function computeCompletionScore(completed, total) {
53
+ if (total === 0)
54
+ return 0;
55
+ return (completed / total) * MAX_COMPLETION_SCORE;
56
+ }
57
+ function computeEfficiencyScore(totalSteps) {
58
+ if (totalSteps === undefined || totalSteps <= 0)
59
+ return 0;
60
+ // Fewer steps = higher efficiency. 3 steps = max score, 10+ steps = 0.
61
+ const ratio = Math.max(0, 1 - (totalSteps - BASELINE_STEPS) / 10);
62
+ return ratio * MAX_EFFICIENCY_SCORE;
63
+ }
64
+ //# sourceMappingURL=scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../src/learning/scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiCH,+EAA+E;AAE/E,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,uCAAuC;AAEjE,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc;QACpC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,uBAAuB;QAChD,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,EACvE,GAAG,CACJ,CAAC;IAEF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA2B,EAC3B,KAA2B;IAE3B,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,MAAM,CAAC,OAAO;QAC5B,GAAG,KAAK;KACT,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,+EAA+E;AAE/E,SAAS,sBAAsB,CAAC,SAAiB,EAAE,KAAa;IAC9D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,oBAAoB,CAAC;AACpD,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAmB;IACjD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,uEAAuE;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,OAAO,KAAK,GAAG,oBAAoB,CAAC;AACtC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * SelfImprover — The self-improvement loop that ties together scoring,
3
+ * agent performance tracking, pattern extraction, and model optimization.
4
+ *
5
+ * After each orchestration run (when `useMemory: true`), the SelfImprover:
6
+ * 1. Scores the trajectory (how well did we do?)
7
+ * 2. Records per-agent stats (which agents/models succeed/fail?)
8
+ * 3. Periodically extracts patterns from high-scoring trajectories
9
+ * 4. Provides optimization recommendations (best models per agent)
10
+ *
11
+ * The SelfImprover is called by the Orchestrator post-execution hook.
12
+ * Users can also interact with it via the `buff learn` CLI commands.
13
+ */
14
+ import type { OrchestrationResult } from '../agents/orchestrator.js';
15
+ import type { LLMCallFn } from '../agents/agent.js';
16
+ export declare class SelfImprover {
17
+ private runCountSinceLastExtraction;
18
+ /**
19
+ * Process a completed orchestration run through the self-improvement loop.
20
+ * Scores the result, tracks agent stats, and conditionally extracts patterns.
21
+ *
22
+ * @param result The completed orchestration result
23
+ * @param callLLM LLM function for pattern extraction
24
+ * @param agentModels The model map used for this run (for tracking model perf)
25
+ * @param verbose Whether to log details
26
+ */
27
+ processRun(result: OrchestrationResult, callLLM: LLMCallFn, agentModels?: Record<string, string>, verbose?: boolean): Promise<void>;
28
+ /**
29
+ * Force pattern extraction from the best trajectories in the store.
30
+ */
31
+ extractPatterns(callLLM: LLMCallFn, verbose?: boolean): Promise<number>;
32
+ /**
33
+ * Get optimization recommendations based on collected stats.
34
+ * Returns a recommended model map for the Orchestrator.
35
+ */
36
+ getOptimizedModelMap(): Record<string, string>;
37
+ /**
38
+ * Get a human-readable summary of the self-improvement status.
39
+ */
40
+ getStatus(): string;
41
+ /**
42
+ * Reset extraction counter (called when user manually extracts patterns).
43
+ */
44
+ resetExtractionCounter(): void;
45
+ private averageScore;
46
+ }
47
+ export declare function getSelfImprover(): SelfImprover;
48
+ //# sourceMappingURL=self-improver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-improver.d.ts","sourceRoot":"","sources":["../../src/learning/self-improver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoBpD,qBAAa,YAAY;IACvB,OAAO,CAAC,2BAA2B,CAAa;IAEhD;;;;;;;;OAQG;IACG,UAAU,CACd,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,SAAS,EAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,IAAI,CAAC;IA2BhB;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,SAAS,EAClB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,MAAM,CAAC;IAkClB;;;OAGG;IACH,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAe9C;;OAEG;IACH,SAAS,IAAI,MAAM;IAgCnB;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAM9B,OAAO,CAAC,YAAY;CAMrB;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}