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,186 @@
1
+ /**
2
+ * VectorStore — A lightweight, JSON-based vector index with cosine similarity search.
3
+ *
4
+ * Stores embeddings as `{ id, vector, metadata }` entries in a single JSON file.
5
+ * No external dependencies — uses only Node.js built-in fs and crypto.
6
+ *
7
+ * File location: ~/.buff/memory/vectors.json
8
+ */
9
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { homedir } from 'node:os';
12
+ // ─── Constants ──────────────────────────────────────────────────────────────
13
+ const MEMORY_DIR = join(homedir(), '.buff', 'memory');
14
+ const INDEX_PATH = join(MEMORY_DIR, 'vectors.json');
15
+ /**
16
+ * Schema version for the vector index.
17
+ * Version 2: Increased embedding dimensionality from 64 to 384 (all-MiniLM-L6-v2).
18
+ * Old version 1 entries (64-dim) are incompatible and will be cleared.
19
+ */
20
+ const CURRENT_VERSION = 2;
21
+ // ─── Helpers ────────────────────────────────────────────────────────────────
22
+ function ensureDir() {
23
+ if (!existsSync(MEMORY_DIR)) {
24
+ mkdirSync(MEMORY_DIR, { recursive: true });
25
+ }
26
+ }
27
+ function readIndex() {
28
+ try {
29
+ ensureDir();
30
+ if (!existsSync(INDEX_PATH)) {
31
+ return { entries: {}, version: CURRENT_VERSION };
32
+ }
33
+ const raw = readFileSync(INDEX_PATH, 'utf-8');
34
+ const data = JSON.parse(raw);
35
+ // Version migration: if the on-disk version doesn't match the current
36
+ // schema version, clear old entries to prevent incompatible vectors
37
+ // (e.g., 64-dim → 384-dim migration) from returning similarity=0 silently.
38
+ if (data.version !== CURRENT_VERSION) {
39
+ return { entries: {}, version: CURRENT_VERSION };
40
+ }
41
+ return data;
42
+ }
43
+ catch {
44
+ return { entries: {}, version: CURRENT_VERSION };
45
+ }
46
+ }
47
+ function writeIndex(data) {
48
+ ensureDir();
49
+ writeFileSync(INDEX_PATH, JSON.stringify(data, null, 2), 'utf-8');
50
+ }
51
+ // ─── Vector Math ────────────────────────────────────────────────────────────
52
+ /** Compute the dot product of two vectors */
53
+ function dotProduct(a, b) {
54
+ let sum = 0;
55
+ for (let i = 0; i < a.length; i++) {
56
+ sum += a[i] * b[i];
57
+ }
58
+ return sum;
59
+ }
60
+ /** Compute the L2 norm (magnitude) of a vector */
61
+ function magnitude(v) {
62
+ let sum = 0;
63
+ for (const val of v) {
64
+ sum += val * val;
65
+ }
66
+ return Math.sqrt(sum);
67
+ }
68
+ /**
69
+ * Compute cosine similarity between two vectors.
70
+ * Returns a value between -1 and 1 (higher = more similar).
71
+ */
72
+ export function cosineSimilarity(a, b) {
73
+ if (a.length !== b.length)
74
+ return 0;
75
+ const dot = dotProduct(a, b);
76
+ const magA = magnitude(a);
77
+ const magB = magnitude(b);
78
+ if (magA === 0 || magB === 0)
79
+ return 0;
80
+ return dot / (magA * magB);
81
+ }
82
+ // ─── VectorStore ────────────────────────────────────────────────────────────
83
+ /**
84
+ * Lightweight vector store for semantic search.
85
+ *
86
+ * Usage:
87
+ * ```ts
88
+ * const store = new VectorStore();
89
+ * await store.insert("traj-001", [0.1, 0.2, ...], { goal: "add auth" });
90
+ * const results = await store.search([0.15, 0.25, ...], 3);
91
+ * ```
92
+ */
93
+ export class VectorStore {
94
+ /**
95
+ * Insert a vector entry into the index.
96
+ * If an entry with the same `id` already exists, it is overwritten.
97
+ */
98
+ async insert(id, vector, metadata = {}) {
99
+ const data = readIndex();
100
+ data.entries[id] = {
101
+ id,
102
+ vector,
103
+ metadata,
104
+ createdAt: Date.now(),
105
+ };
106
+ writeIndex(data);
107
+ }
108
+ /**
109
+ * Retrieve a single entry by ID.
110
+ */
111
+ async get(id) {
112
+ const data = readIndex();
113
+ return data.entries[id] || null;
114
+ }
115
+ /**
116
+ * Remove an entry from the index.
117
+ */
118
+ async delete(id) {
119
+ const data = readIndex();
120
+ if (!data.entries[id])
121
+ return false;
122
+ delete data.entries[id];
123
+ writeIndex(data);
124
+ return true;
125
+ }
126
+ /**
127
+ * Search for the top-k most similar entries to the query vector.
128
+ * Returns results sorted by similarity (highest first).
129
+ */
130
+ async search(queryVector, k = 5, filterFn) {
131
+ const data = readIndex();
132
+ const entries = Object.values(data.entries);
133
+ // Compute similarities
134
+ const scored = [];
135
+ for (const entry of entries) {
136
+ if (filterFn && !filterFn(entry))
137
+ continue;
138
+ const sim = cosineSimilarity(queryVector, entry.vector);
139
+ scored.push({ entry, similarity: sim });
140
+ }
141
+ // Sort by similarity descending, take top-k
142
+ scored.sort((a, b) => b.similarity - a.similarity);
143
+ return scored.slice(0, k);
144
+ }
145
+ /**
146
+ * Get the total number of stored entries.
147
+ */
148
+ async count() {
149
+ const data = readIndex();
150
+ return Object.keys(data.entries).length;
151
+ }
152
+ /**
153
+ * Clear all entries from the index.
154
+ */
155
+ async clear() {
156
+ writeIndex({ entries: {}, version: CURRENT_VERSION });
157
+ }
158
+ /**
159
+ * Get all entries (for iteration/export).
160
+ */
161
+ async getAll() {
162
+ const data = readIndex();
163
+ return Object.values(data.entries);
164
+ }
165
+ /**
166
+ * Get vector store statistics.
167
+ */
168
+ stats() {
169
+ const data = readIndex();
170
+ const entries = Object.values(data.entries);
171
+ const dimensions = entries.length > 0 ? entries[0].vector.length : 0;
172
+ return {
173
+ totalEntries: entries.length,
174
+ dimensions,
175
+ };
176
+ }
177
+ }
178
+ // Singleton instance
179
+ let storeInstance = null;
180
+ export function getVectorStore() {
181
+ if (!storeInstance) {
182
+ storeInstance = new VectorStore();
183
+ }
184
+ return storeInstance;
185
+ }
186
+ //# sourceMappingURL=vector-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/memory/vector-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAsBlC,+EAA+E;AAE/E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,+EAA+E;AAE/E,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,SAAS,EAAE,CAAC;QACZ,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QACnD,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAEhD,sEAAsE;QACtE,oEAAoE;QACpE,2EAA2E;QAC3E,IAAI,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAqB;IACvC,SAAS,EAAE,CAAC;IACZ,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,+EAA+E;AAE/E,6CAA6C;AAC7C,SAAS,UAAU,CAAC,CAAW,EAAE,CAAW;IAC1C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kDAAkD;AAClD,SAAS,SAAS,CAAC,CAAW;IAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IACtB;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,MAAgB,EAAE,WAAoC,EAAE;QAC/E,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;YACjB,EAAE;YACF,MAAM;YACN,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,WAAqB,EACrB,IAAY,CAAC,EACb,QAA0C;QAE1C,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,uBAAuB;QACvB,MAAM,MAAM,GAAsD,EAAE,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC3C,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,4CAA4C;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,UAAU;SACX,CAAC;IACJ,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,aAAa,GAAuB,IAAI,CAAC;AAE7C,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * AgentPlugin — Interface for third-party agent plugins and auto-discovery.
3
+ *
4
+ * Users can place agent plugin files in ~/.buff/agents/ and they will be
5
+ * automatically discovered and registered with the orchestrator at startup.
6
+ *
7
+ * Provider plugins (inference providers):
8
+ * - Any .js file in ~/.buff/plugins/
9
+ * - Must export a default object matching the ProviderPlugin interface
10
+ *
11
+ * Agent plugins (agent extensions):
12
+ * - Any .js file in ~/.buff/agents/
13
+ * - Must export a default object matching the AgentPlugin interface
14
+ *
15
+ * Workflow plugins:
16
+ * - Any .yaml, .yml, or .json file in ~/.buff/workflows/
17
+ * - Defines a sequence of agent steps as a reusable workflow template
18
+ */
19
+ import type { AgentContext, AgentResult } from '../agents/agent.js';
20
+ import type { WorkflowTemplate } from '../workflow/templates.js';
21
+ export interface AgentPluginMetadata {
22
+ name: string;
23
+ version: string;
24
+ description: string;
25
+ author?: string;
26
+ /** Which agent types this plugin can act as (e.g., ['writer', 'reviewer']) */
27
+ agentTypes: string[];
28
+ }
29
+ export interface AgentPlugin {
30
+ metadata: AgentPluginMetadata;
31
+ execute(context: AgentContext, callLLM: (prompt: string) => Promise<string>): Promise<AgentResult>;
32
+ }
33
+ /**
34
+ * Scan ~/.buff/plugins/ for provider plugin .js files and register them
35
+ * with the global PluginRegistry.
36
+ *
37
+ * Each file must export a default object matching the ProviderPlugin interface
38
+ * from ./registry.js. Upon discovery, the plugin is automatically registered
39
+ * so it can be used with: buff chat --provider <plugin-type>
40
+ *
41
+ * Returns the number of successfully loaded provider plugins.
42
+ */
43
+ export declare function discoverProviderPlugins(): Promise<number>;
44
+ /**
45
+ * Scan ~/.buff/agents/ for plugin .js files and load them.
46
+ * Returns a map of agent type → AgentPlugin.
47
+ */
48
+ export declare function discoverAgentPlugins(): Promise<Map<string, AgentPlugin>>;
49
+ /**
50
+ * Scan ~/.buff/workflows/ for custom workflow template files.
51
+ * Supports .json, .yaml, and .yml files.
52
+ */
53
+ export declare function discoverWorkflowPlugins(): WorkflowTemplate[];
54
+ /**
55
+ * Get plugin statistics.
56
+ */
57
+ export declare function getPluginStats(): {
58
+ providerPlugins: number;
59
+ agentPlugins: number;
60
+ workflowPlugins: number;
61
+ };
62
+ /**
63
+ * Run all auto-discovery scanners at startup.
64
+ * Called once when the CLI boots up.
65
+ *
66
+ * @returns Summary of discovered plugins
67
+ */
68
+ export declare function runAutoDiscovery(): Promise<{
69
+ providerPlugins: number;
70
+ agentPlugins: number;
71
+ workflowPlugins: number;
72
+ }>;
73
+ //# sourceMappingURL=agent-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/agent-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQjE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACpG;AAmBD;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiC/D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAiC9E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,EAAE,CAkC5D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CA0B3G;AAID;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAWD"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * AgentPlugin — Interface for third-party agent plugins and auto-discovery.
3
+ *
4
+ * Users can place agent plugin files in ~/.buff/agents/ and they will be
5
+ * automatically discovered and registered with the orchestrator at startup.
6
+ *
7
+ * Provider plugins (inference providers):
8
+ * - Any .js file in ~/.buff/plugins/
9
+ * - Must export a default object matching the ProviderPlugin interface
10
+ *
11
+ * Agent plugins (agent extensions):
12
+ * - Any .js file in ~/.buff/agents/
13
+ * - Must export a default object matching the AgentPlugin interface
14
+ *
15
+ * Workflow plugins:
16
+ * - Any .yaml, .yml, or .json file in ~/.buff/workflows/
17
+ * - Defines a sequence of agent steps as a reusable workflow template
18
+ */
19
+ import { readdirSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ import { homedir } from 'node:os';
22
+ import { isValidWorkflowTemplate } from '../workflow/templates.js';
23
+ import { getPluginRegistry } from './registry.js';
24
+ import { logger } from '../utils/logger.js';
25
+ // ─── Paths ──────────────────────────────────────────────────────────────────
26
+ const BUFF_DIR = join(homedir(), '.buff');
27
+ const PLUGINS_DIR = join(BUFF_DIR, 'plugins');
28
+ const AGENTS_DIR = join(BUFF_DIR, 'agents');
29
+ const WORKFLOWS_DIR = join(BUFF_DIR, 'workflows');
30
+ function ensureDirectories() {
31
+ for (const dir of [PLUGINS_DIR, AGENTS_DIR, WORKFLOWS_DIR]) {
32
+ if (!existsSync(dir)) {
33
+ try {
34
+ mkdirSync(dir, { recursive: true });
35
+ }
36
+ catch { /* best-effort */ }
37
+ }
38
+ }
39
+ }
40
+ // ─── Auto-Discovery ─────────────────────────────────────────────────────────
41
+ /**
42
+ * Scan ~/.buff/plugins/ for provider plugin .js files and register them
43
+ * with the global PluginRegistry.
44
+ *
45
+ * Each file must export a default object matching the ProviderPlugin interface
46
+ * from ./registry.js. Upon discovery, the plugin is automatically registered
47
+ * so it can be used with: buff chat --provider <plugin-type>
48
+ *
49
+ * Returns the number of successfully loaded provider plugins.
50
+ */
51
+ export async function discoverProviderPlugins() {
52
+ ensureDirectories();
53
+ let loaded = 0;
54
+ try {
55
+ const files = readdirSync(PLUGINS_DIR).filter((f) => f.endsWith('.js'));
56
+ for (const file of files) {
57
+ try {
58
+ const pluginPath = join(PLUGINS_DIR, file);
59
+ // Dynamic import for ESM compatibility
60
+ const mod = await import(pluginPath);
61
+ if (!mod.default || !mod.default.metadata || !mod.default.getProviderType) {
62
+ logger.debug(`Skipping ${file}: missing ProviderPlugin interface (need metadata + getProviderType)`);
63
+ continue;
64
+ }
65
+ const plugin = mod.default;
66
+ const type = plugin.getProviderType();
67
+ const registry = getPluginRegistry();
68
+ registry.register(plugin);
69
+ loaded++;
70
+ logger.success(`Auto-discovered provider plugin: ${plugin.metadata.name} v${plugin.metadata.version} (${type})`);
71
+ }
72
+ catch (err) {
73
+ logger.debug(`Failed to load provider plugin ${file}: ${err}`);
74
+ }
75
+ }
76
+ }
77
+ catch (err) {
78
+ logger.debug(`Failed to scan ${PLUGINS_DIR}: ${err}`);
79
+ }
80
+ return loaded;
81
+ }
82
+ /**
83
+ * Scan ~/.buff/agents/ for plugin .js files and load them.
84
+ * Returns a map of agent type → AgentPlugin.
85
+ */
86
+ export async function discoverAgentPlugins() {
87
+ const plugins = new Map();
88
+ ensureDirectories();
89
+ try {
90
+ const files = readdirSync(AGENTS_DIR).filter((f) => f.endsWith('.js'));
91
+ for (const file of files) {
92
+ try {
93
+ const pluginPath = join(AGENTS_DIR, file);
94
+ // Dynamic import for ESM compatibility
95
+ const plugin = await import(pluginPath);
96
+ if (!plugin.default || !plugin.default.metadata) {
97
+ logger.debug(`Skipping ${file}: missing metadata or default export`);
98
+ continue;
99
+ }
100
+ const agentPlugin = plugin.default;
101
+ for (const agentType of agentPlugin.metadata.agentTypes) {
102
+ plugins.set(agentType, agentPlugin);
103
+ logger.success(`Discovered agent plugin: ${agentPlugin.metadata.name} v${agentPlugin.metadata.version} (${agentType})`);
104
+ }
105
+ }
106
+ catch (err) {
107
+ logger.debug(`Failed to load plugin ${file}: ${err}`);
108
+ }
109
+ }
110
+ }
111
+ catch (err) {
112
+ logger.debug(`Failed to scan ${AGENTS_DIR}: ${err}`);
113
+ }
114
+ return plugins;
115
+ }
116
+ /**
117
+ * Scan ~/.buff/workflows/ for custom workflow template files.
118
+ * Supports .json, .yaml, and .yml files.
119
+ */
120
+ export function discoverWorkflowPlugins() {
121
+ const workflows = [];
122
+ ensureDirectories();
123
+ try {
124
+ const files = readdirSync(WORKFLOWS_DIR).filter((f) => f.endsWith('.json') || f.endsWith('.yaml') || f.endsWith('.yml'));
125
+ for (const file of files) {
126
+ try {
127
+ const filePath = join(WORKFLOWS_DIR, file);
128
+ const content = readFileSync(filePath, 'utf-8');
129
+ if (file.endsWith('.json')) {
130
+ const parsed = JSON.parse(content);
131
+ if (isValidWorkflowTemplate(parsed)) {
132
+ workflows.push(parsed);
133
+ logger.success(`Discovered workflow template: ${parsed.id} (${file})`);
134
+ }
135
+ }
136
+ else {
137
+ // YAML not available as dependency — skip, or use Node.js built-in
138
+ logger.debug(`YAML workflow files not yet supported (${file}). Use .json format instead.`);
139
+ }
140
+ }
141
+ catch (err) {
142
+ logger.debug(`Failed to load workflow ${file}: ${err}`);
143
+ }
144
+ }
145
+ }
146
+ catch (err) {
147
+ logger.debug(`Failed to scan ${WORKFLOWS_DIR}: ${err}`);
148
+ }
149
+ return workflows;
150
+ }
151
+ /**
152
+ * Get plugin statistics.
153
+ */
154
+ export function getPluginStats() {
155
+ let providerPlugins = 0;
156
+ let agentPlugins = 0;
157
+ let workflowPlugins = 0;
158
+ try {
159
+ if (existsSync(PLUGINS_DIR)) {
160
+ providerPlugins = readdirSync(PLUGINS_DIR).filter((f) => f.endsWith('.js')).length;
161
+ }
162
+ }
163
+ catch { /* */ }
164
+ try {
165
+ if (existsSync(AGENTS_DIR)) {
166
+ agentPlugins = readdirSync(AGENTS_DIR).filter((f) => f.endsWith('.js')).length;
167
+ }
168
+ }
169
+ catch { /* */ }
170
+ try {
171
+ if (existsSync(WORKFLOWS_DIR)) {
172
+ workflowPlugins = readdirSync(WORKFLOWS_DIR).filter((f) => f.endsWith('.json') || f.endsWith('.yaml') || f.endsWith('.yml')).length;
173
+ }
174
+ }
175
+ catch { /* */ }
176
+ return { providerPlugins, agentPlugins, workflowPlugins };
177
+ }
178
+ // ─── Startup Integration ────────────────────────────────────────────────────
179
+ /**
180
+ * Run all auto-discovery scanners at startup.
181
+ * Called once when the CLI boots up.
182
+ *
183
+ * @returns Summary of discovered plugins
184
+ */
185
+ export async function runAutoDiscovery() {
186
+ const providerCount = await discoverProviderPlugins();
187
+ await discoverAgentPlugins(); // Agent plugins stored in map, not counted here
188
+ const workflowPlugins = discoverWorkflowPlugins();
189
+ const stats = getPluginStats();
190
+ return {
191
+ providerPlugins: stats.providerPlugins,
192
+ agentPlugins: stats.agentPlugins,
193
+ workflowPlugins: stats.workflowPlugins,
194
+ };
195
+ }
196
+ // ─── Validation ─────────────────────────────────────────────────────────────
197
+ // Note: isValidWorkflowTemplate is imported from '../workflow/templates.js'
198
+ // to avoid duplicating the validation logic.
199
+ //# sourceMappingURL=agent-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-plugin.js","sourceRoot":"","sources":["../../src/plugins/agent-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { InferenceProvider } from '../inference/interface.js';
2
+ import { ProviderConfig } from '../config/types.js';
3
+ /**
4
+ * Plugin metadata
5
+ */
6
+ export interface PluginMetadata {
7
+ name: string;
8
+ version: string;
9
+ description: string;
10
+ author?: string;
11
+ }
12
+ /**
13
+ * Plugin interface for extending Buff with custom providers
14
+ */
15
+ export interface ProviderPlugin {
16
+ metadata: PluginMetadata;
17
+ /**
18
+ * Create an inference provider instance from this plugin
19
+ */
20
+ createProvider(config: ProviderConfig): InferenceProvider;
21
+ /**
22
+ * Get the provider type identifier (e.g., 'my-custom-provider')
23
+ */
24
+ getProviderType(): string;
25
+ }
26
+ /**
27
+ * Plugin registry for managing provider plugins
28
+ */
29
+ export declare class PluginRegistry {
30
+ private plugins;
31
+ /**
32
+ * Register a new provider plugin
33
+ */
34
+ register(plugin: ProviderPlugin): void;
35
+ /**
36
+ * Unregister a plugin
37
+ */
38
+ unregister(providerType: string): boolean;
39
+ /**
40
+ * Get a plugin by provider type
41
+ */
42
+ getPlugin(providerType: string): ProviderPlugin | undefined;
43
+ /**
44
+ * Get all registered plugins
45
+ */
46
+ getAllPlugins(): ProviderPlugin[];
47
+ /**
48
+ * Check if a provider type has a registered plugin
49
+ */
50
+ hasPlugin(providerType: string): boolean;
51
+ /**
52
+ * Create an inference provider from a plugin
53
+ */
54
+ createProviderFromPlugin(providerType: string, config: ProviderConfig): InferenceProvider;
55
+ /**
56
+ * List all registered plugins with their metadata
57
+ */
58
+ listPlugins(): PluginMetadata[];
59
+ }
60
+ export declare function getPluginRegistry(): PluginRegistry;
61
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IAEzB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAAC;IAE1D;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA0C;IAEzD;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAWtC;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAIzC;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3D;;OAEG;IACH,aAAa,IAAI,cAAc,EAAE;IAIjC;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,iBAAiB;IAQzF;;OAEG;IACH,WAAW,IAAI,cAAc,EAAE;CAGhC;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
@@ -0,0 +1,67 @@
1
+ import { logger } from '../utils/logger.js';
2
+ /**
3
+ * Plugin registry for managing provider plugins
4
+ */
5
+ export class PluginRegistry {
6
+ plugins = new Map();
7
+ /**
8
+ * Register a new provider plugin
9
+ */
10
+ register(plugin) {
11
+ const type = plugin.getProviderType();
12
+ if (this.plugins.has(type)) {
13
+ logger.warn(`Overwriting existing plugin for provider type: ${type}`);
14
+ }
15
+ this.plugins.set(type, plugin);
16
+ logger.success(`Registered plugin: ${plugin.metadata.name} v${plugin.metadata.version}`);
17
+ }
18
+ /**
19
+ * Unregister a plugin
20
+ */
21
+ unregister(providerType) {
22
+ return this.plugins.delete(providerType);
23
+ }
24
+ /**
25
+ * Get a plugin by provider type
26
+ */
27
+ getPlugin(providerType) {
28
+ return this.plugins.get(providerType);
29
+ }
30
+ /**
31
+ * Get all registered plugins
32
+ */
33
+ getAllPlugins() {
34
+ return Array.from(this.plugins.values());
35
+ }
36
+ /**
37
+ * Check if a provider type has a registered plugin
38
+ */
39
+ hasPlugin(providerType) {
40
+ return this.plugins.has(providerType);
41
+ }
42
+ /**
43
+ * Create an inference provider from a plugin
44
+ */
45
+ createProviderFromPlugin(providerType, config) {
46
+ const plugin = this.plugins.get(providerType);
47
+ if (!plugin) {
48
+ throw new Error(`No plugin registered for provider type: ${providerType}`);
49
+ }
50
+ return plugin.createProvider(config);
51
+ }
52
+ /**
53
+ * List all registered plugins with their metadata
54
+ */
55
+ listPlugins() {
56
+ return this.getAllPlugins().map((p) => p.metadata);
57
+ }
58
+ }
59
+ // Singleton registry
60
+ let registryInstance = null;
61
+ export function getPluginRegistry() {
62
+ if (!registryInstance) {
63
+ registryInstance = new PluginRegistry();
64
+ }
65
+ return registryInstance;
66
+ }
67
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA6B5C;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEzD;;OAEG;IACH,QAAQ,CAAC,MAAsB;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,sBAAsB,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,YAAoB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,YAAoB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,YAAoB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,YAAoB,EAAE,MAAsB;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,gBAAgB,GAA0B,IAAI,CAAC;AAEnD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,IAAI,cAAc,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Sandbox images — Pre-defined Docker images for common programming languages.
3
+ *
4
+ * These are used as base images for sandbox containers. Each image definition
5
+ * includes the Docker image name, language/runtime details, and default
6
+ * install/test commands.
7
+ *
8
+ * Images are pulled on first use if not present locally.
9
+ */
10
+ import type { SandboxImage } from './types.js';
11
+ /**
12
+ * Pre-defined sandbox images for common runtimes.
13
+ */
14
+ export declare const BUILTIN_SANDBOX_IMAGES: SandboxImage[];
15
+ /**
16
+ * Find a built-in sandbox image by language/runtime name (case-insensitive).
17
+ *
18
+ * Examples:
19
+ * resolveSandboxImage('node') → node:20-slim
20
+ * resolveSandboxImage('python') → python:3.12-slim
21
+ * resolveSandboxImage('go') → golang:1.22
22
+ * resolveSandboxImage('golang') → golang:1.22
23
+ * resolveSandboxImage('rust') → rust:1.77-slim
24
+ */
25
+ export declare function resolveSandboxImage(runtime: string): SandboxImage | undefined;
26
+ /**
27
+ * Get the default sandbox image based on detected project type.
28
+ * Checks for common project files to determine runtime.
29
+ */
30
+ export declare function detectProjectImage(projectDir: string): SandboxImage;
31
+ //# sourceMappingURL=images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/sandbox/images.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,YAAY,EA0EhD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAsB7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CASnE"}