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,410 @@
1
+ /**
2
+ * TesterAgent — Creates a sandboxed test environment, copies the project,
3
+ * installs dependencies, runs tests, and reports pass/fail results.
4
+ *
5
+ * The sandbox is created in a temp directory to avoid modifying the original project.
6
+ * Tests are run via `npm test` (or a custom command), and full stdout/stderr + exit
7
+ * code are captured and returned.
8
+ */
9
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync, rmSync, readdirSync } from 'node:fs';
10
+ import { join, dirname } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+ import { mkdtempSync } from 'node:fs';
13
+ import { execSync } from 'node:child_process';
14
+ import { Agent } from '../agent.js';
15
+ import { SandboxManager } from '../../sandbox/manager.js';
16
+ import { detectProjectImage } from '../../sandbox/images.js';
17
+ import { getSandboxConfig } from '../../sandbox/types.js';
18
+ /** Common directories to exclude when copying to the sandbox */
19
+ const EXCLUDE_DIRS = ['node_modules', '.git', 'dist', '.next', 'coverage', '.cache'];
20
+ /** Default test command */
21
+ const DEFAULT_TEST_COMMAND = 'npm test 2>&1';
22
+ /** Maximum sandbox age before cleanup (30 minutes) */
23
+ const SANDBOX_MAX_AGE_MS = 30 * 60 * 1000;
24
+ /** Track sandbox directories for cleanup */
25
+ const activeSandboxes = [];
26
+ /**
27
+ * Clean up any sandbox directories on process exit.
28
+ * This prevents temp directory accumulation.
29
+ */
30
+ function registerCleanup() {
31
+ const cleanup = () => {
32
+ for (const dir of activeSandboxes) {
33
+ try {
34
+ rmSync(dir, { recursive: true, force: true });
35
+ }
36
+ catch {
37
+ // Best-effort cleanup
38
+ }
39
+ }
40
+ };
41
+ process.on('exit', cleanup);
42
+ process.on('SIGINT', () => { cleanup(); process.exit(1); });
43
+ process.on('SIGTERM', cleanup);
44
+ }
45
+ // Register cleanup once
46
+ let cleanupRegistered = false;
47
+ function ensureCleanupRegistered() {
48
+ if (!cleanupRegistered) {
49
+ registerCleanup();
50
+ cleanupRegistered = true;
51
+ }
52
+ }
53
+ /**
54
+ * TesterAgent — Sandboxed test runner.
55
+ *
56
+ * Usage in task plans:
57
+ * ```json
58
+ * { "id": "step-05-test", "description": "Run tests to verify the changes", "agentType": "tester", "dependsOn": ["step-04-write"] }
59
+ * ```
60
+ */
61
+ export class TesterAgent extends Agent {
62
+ name = 'Tester';
63
+ description = 'Runs tests in a sandboxed environment';
64
+ /**
65
+ * Execute tests in a sandboxed copy of the project.
66
+ *
67
+ * Steps:
68
+ * 1. Create a temp directory
69
+ * 2. Copy project files (excluding node_modules, .git, etc.)
70
+ * 3. Run `npm install` in the sandbox
71
+ * 4. Run `npm test` in the sandbox
72
+ * 5. Parse and return the results
73
+ */
74
+ async execute(context, _callLLM) {
75
+ ensureCleanupRegistered();
76
+ // Check if Docker sandbox should be used
77
+ // Skip if we already tried Docker and it was unavailable
78
+ const triedDocker = context.metadata._dockerTried === true;
79
+ const useDocker = !triedDocker && (context.metadata.useDockerSandbox === true ||
80
+ getSandboxConfig().enabled === true);
81
+ if (useDocker) {
82
+ return this.executeWithDocker(context, _callLLM);
83
+ }
84
+ let sandboxPath = '';
85
+ try {
86
+ // 1. Detect test command from package.json
87
+ const testCommand = this.detectTestCommand(context.workingDirectory);
88
+ // 2. Create sandbox
89
+ sandboxPath = mkdtempSync(join(tmpdir(), 'buff-sandbox-'));
90
+ activeSandboxes.push(sandboxPath);
91
+ if (context.metadata.verboseLogging) {
92
+ // verbose logging enabled
93
+ }
94
+ // 3. Copy project files to sandbox
95
+ this.copyProject(context.workingDirectory, sandboxPath);
96
+ // 4. Apply file changes from context to the sandbox
97
+ this.applyChangesToSandbox(sandboxPath, context.fileChanges);
98
+ // 5. Install dependencies
99
+ const installOutput = this.runInstall(sandboxPath);
100
+ // 6. Run tests
101
+ const testResult = this.runTests(sandboxPath, testCommand);
102
+ // 7. Parse test results
103
+ const parsed = this.parseTestOutput(testResult.output);
104
+ // 8. Store test result in context metadata for other agents
105
+ context.metadata['testResult'] = {
106
+ success: testResult.success,
107
+ output: testResult.output,
108
+ exitCode: testResult.exitCode,
109
+ sandboxPath,
110
+ ...parsed,
111
+ };
112
+ // 9. Build summary
113
+ const summaryLines = [];
114
+ if (parsed.total !== undefined) {
115
+ summaryLines.push(`${parsed.passed}/${parsed.total} tests passed`);
116
+ }
117
+ summaryLines.push(testResult.success ? '✅ All tests passed' : `❌ Tests failed (exit code ${testResult.exitCode})`);
118
+ const details = testResult.success
119
+ ? undefined
120
+ : `Test output:\n${this.truncateOutput(testResult.output, 2000)}`;
121
+ return {
122
+ success: testResult.success,
123
+ summary: summaryLines.join(' — '),
124
+ details,
125
+ };
126
+ }
127
+ catch (err) {
128
+ const msg = err instanceof Error ? err.message : String(err);
129
+ return {
130
+ success: false,
131
+ summary: 'Test execution failed',
132
+ error: msg,
133
+ };
134
+ }
135
+ }
136
+ /**
137
+ * Execute tests inside a Docker sandbox container.
138
+ * Falls back to filesystem sandbox if Docker is not available.
139
+ */
140
+ async executeWithDocker(context, callLLM) {
141
+ const sandboxManager = new SandboxManager();
142
+ let containerId = '';
143
+ try {
144
+ // Check Docker availability
145
+ const dockerAvailable = await sandboxManager.isDockerAvailable();
146
+ if (!dockerAvailable) {
147
+ // Fall back to filesystem sandbox — prevent infinite loop
148
+ // by temporarily disabling the Docker sandbox flag
149
+ if (context.metadata.verboseLogging) {
150
+ // Docker not available — falling back to filesystem sandbox
151
+ }
152
+ // Mark that we tried Docker to prevent infinite loop via config
153
+ context.metadata._dockerTried = true;
154
+ return this.execute(context, callLLM);
155
+ }
156
+ // Detect the right image for the project
157
+ const image = detectProjectImage(context.workingDirectory);
158
+ if (context.metadata.verboseLogging) {
159
+ // verbose logging enabled
160
+ }
161
+ // Create a Docker container for the sandbox
162
+ containerId = await sandboxManager.createContainer(image.image, {
163
+ memoryLimit: '1g',
164
+ cpuLimit: 1,
165
+ timeoutMs: 300_000,
166
+ networkAccess: false,
167
+ });
168
+ // Copy project files to the container
169
+ await sandboxManager.copyProjectToContainer(containerId, context.workingDirectory);
170
+ // Apply file changes from context to the container via heredoc
171
+ for (const change of context.fileChanges) {
172
+ if (change.status === 'deleted' || !change.newContent)
173
+ continue;
174
+ // Use a heredoc to write files with proper newline handling
175
+ const dir = `$(dirname "${change.path}")`;
176
+ await sandboxManager.runCommand(containerId, `mkdir -p ${dir} && cat > "${change.path}" << 'BUFFEOF'
177
+ ${change.newContent}
178
+ BUFFEOF`, 30_000);
179
+ }
180
+ // Install dependencies inside the container
181
+ await sandboxManager.runCommand(containerId, image.installCommand || 'npm install', 120_000);
182
+ // Run tests inside the container
183
+ const testCommand = this.detectTestCommand(context.workingDirectory);
184
+ const testResult = await sandboxManager.runCommand(containerId, testCommand, 180_000);
185
+ // Parse test results
186
+ const parsed = this.parseTestOutput(testResult.stdout);
187
+ // Store test result in context metadata
188
+ const output = testResult.stdout + (testResult.stderr ? '\n' + testResult.stderr : '');
189
+ context.metadata['testResult'] = {
190
+ success: testResult.success,
191
+ output,
192
+ exitCode: testResult.exitCode,
193
+ sandboxPath: `docker:${containerId.slice(0, 12)}`,
194
+ ...parsed,
195
+ };
196
+ // Build summary
197
+ const summaryLines = [];
198
+ if (parsed.total !== undefined) {
199
+ summaryLines.push(`${parsed.passed}/${parsed.total} tests passed`);
200
+ }
201
+ summaryLines.push(testResult.success ? '✅ All tests passed (Docker)' : `❌ Tests failed (exit code ${testResult.exitCode})`);
202
+ // Clean up the container
203
+ await sandboxManager.destroyContainer(containerId).catch(() => { });
204
+ return {
205
+ success: testResult.success,
206
+ summary: summaryLines.join(' — '),
207
+ details: testResult.success ? undefined : `Test output:\n${this.truncateOutput(output, 2000)}`,
208
+ };
209
+ }
210
+ catch (err) {
211
+ // Clean up on error
212
+ if (containerId) {
213
+ await sandboxManager.destroyContainer(containerId).catch(() => { });
214
+ }
215
+ const msg = err instanceof Error ? err.message : String(err);
216
+ return {
217
+ success: false,
218
+ summary: 'Docker sandbox test execution failed',
219
+ error: msg,
220
+ };
221
+ }
222
+ }
223
+ /**
224
+ * Detect the test command from package.json scripts.
225
+ * Falls back to the default if not found.
226
+ */
227
+ detectTestCommand(workingDir) {
228
+ try {
229
+ const pkgPath = join(workingDir, 'package.json');
230
+ if (existsSync(pkgPath)) {
231
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
232
+ if (pkg.scripts?.test) {
233
+ return `npm run test 2>&1`;
234
+ }
235
+ }
236
+ }
237
+ catch {
238
+ // Fall through
239
+ }
240
+ return DEFAULT_TEST_COMMAND;
241
+ }
242
+ /**
243
+ * Copy project files to the sandbox directory, excluding large/generated dirs.
244
+ */
245
+ copyProject(sourceDir, targetDir) {
246
+ const entries = this.getDirectoryEntries(sourceDir);
247
+ for (const entry of entries) {
248
+ const srcPath = join(sourceDir, entry);
249
+ const tgtPath = join(targetDir, entry);
250
+ try {
251
+ if (entry.startsWith('.'))
252
+ continue; // Skip hidden files
253
+ if (EXCLUDE_DIRS.includes(entry))
254
+ continue; // Skip excluded dirs
255
+ if (existsSync(srcPath)) {
256
+ cpSync(srcPath, tgtPath, { recursive: true, force: true });
257
+ }
258
+ }
259
+ catch {
260
+ // Skip files we can't copy
261
+ }
262
+ }
263
+ }
264
+ /**
265
+ * Get sorted directory entries to ensure deterministic copy order.
266
+ */
267
+ getDirectoryEntries(dir) {
268
+ try {
269
+ return readdirSync(dir).sort();
270
+ }
271
+ catch {
272
+ return [];
273
+ }
274
+ }
275
+ /**
276
+ * Apply the file changes from the execution context to the sandbox.
277
+ */
278
+ applyChangesToSandbox(sandboxPath, changes) {
279
+ for (const change of changes) {
280
+ if (change.status === 'deleted')
281
+ continue;
282
+ if (!change.newContent)
283
+ continue;
284
+ const filePath = join(sandboxPath, change.path);
285
+ const dir = dirname(filePath);
286
+ if (!existsSync(dir)) {
287
+ mkdirSync(dir, { recursive: true });
288
+ }
289
+ writeFileSync(filePath, change.newContent, 'utf-8');
290
+ }
291
+ }
292
+ /**
293
+ * Run npm install in the sandbox.
294
+ */
295
+ runInstall(sandboxPath) {
296
+ try {
297
+ return execSync('npm install --prefer-offline --no-audit --no-fund 2>&1', {
298
+ cwd: sandboxPath,
299
+ timeout: 120_000, // 2 minutes
300
+ stdio: 'pipe',
301
+ encoding: 'utf-8',
302
+ });
303
+ }
304
+ catch (err) {
305
+ const output = err instanceof Error ? err.message : String(err);
306
+ // npm install warnings are normal — only throw on critical errors
307
+ return output;
308
+ }
309
+ }
310
+ /**
311
+ * Run the test command and capture output.
312
+ */
313
+ runTests(sandboxPath, command) {
314
+ try {
315
+ const output = execSync(command, {
316
+ cwd: sandboxPath,
317
+ timeout: 180_000, // 3 minutes
318
+ stdio: 'pipe',
319
+ encoding: 'utf-8',
320
+ });
321
+ return {
322
+ success: true,
323
+ output,
324
+ exitCode: 0,
325
+ sandboxPath,
326
+ };
327
+ }
328
+ catch (err) {
329
+ const error = err;
330
+ const output = [
331
+ error.stdout || '',
332
+ error.stderr || '',
333
+ error.message || '',
334
+ ].filter(Boolean).join('\n');
335
+ return {
336
+ success: false,
337
+ output,
338
+ exitCode: error.status ?? 1,
339
+ sandboxPath,
340
+ };
341
+ }
342
+ }
343
+ /**
344
+ * Parse test output to extract pass/fail/total counts.
345
+ * Supports common test runners: vitest, jest, mocha, etc.
346
+ */
347
+ parseTestOutput(output) {
348
+ // Try vitest format: "Tests 1 failed | 3 passed (4)"
349
+ const vitestMatch = output.match(/Tests\s+(?:(?:(\d+)\s+failed)\s*)?(?:\|?\s*)?(?:(\d+)\s+passed)?\s*\((\d+)\)/);
350
+ if (vitestMatch) {
351
+ return {
352
+ failed: vitestMatch[1] ? parseInt(vitestMatch[1], 10) : 0,
353
+ passed: vitestMatch[2] ? parseInt(vitestMatch[2], 10) : 0,
354
+ total: parseInt(vitestMatch[3], 10),
355
+ };
356
+ }
357
+ // Try jest format: "Tests: 1 failed, 3 passed, 4 total"
358
+ const jestMatch = output.match(/Tests:\s*(?:(\d+)\s+failed,?\s*)?(?:(\d+)\s+passed,?\s*)?(\d+)\s+total/);
359
+ if (jestMatch) {
360
+ return {
361
+ failed: jestMatch[1] ? parseInt(jestMatch[1], 10) : 0,
362
+ passed: jestMatch[2] ? parseInt(jestMatch[2], 10) : 0,
363
+ total: parseInt(jestMatch[3], 10),
364
+ };
365
+ }
366
+ // Try generic: "X passing, Y failing"
367
+ const genericMatch = output.match(/(\d+)\s+passing,?\s*(?:(\d+)\s+failing)?/);
368
+ if (genericMatch) {
369
+ return {
370
+ passed: parseInt(genericMatch[1], 10),
371
+ failed: genericMatch[2] ? parseInt(genericMatch[2], 10) : 0,
372
+ total: (genericMatch[2] ? parseInt(genericMatch[1], 10) + parseInt(genericMatch[2], 10) : parseInt(genericMatch[1], 10)),
373
+ };
374
+ }
375
+ // Count lines with ✗, ✓, PASS, FAIL markers as a rough estimate
376
+ const failLines = (output.match(/[✗❌]|FAIL|failed/g) || []).length;
377
+ const passLines = (output.match(/[✓✅]|PASS|passed/g) || []).length;
378
+ if (passLines > 0 || failLines > 0) {
379
+ return {
380
+ passed: passLines,
381
+ failed: failLines,
382
+ total: passLines + failLines,
383
+ };
384
+ }
385
+ return {};
386
+ }
387
+ /**
388
+ * Truncate long output to avoid huge result strings.
389
+ */
390
+ truncateOutput(output, maxLength) {
391
+ if (output.length <= maxLength)
392
+ return output;
393
+ return output.slice(0, maxLength) + '\n... (output truncated)';
394
+ }
395
+ }
396
+ /**
397
+ * Clean up a specific sandbox directory.
398
+ */
399
+ export function cleanupSandbox(sandboxPath) {
400
+ try {
401
+ rmSync(sandboxPath, { recursive: true, force: true });
402
+ const idx = activeSandboxes.indexOf(sandboxPath);
403
+ if (idx >= 0)
404
+ activeSandboxes.splice(idx, 1);
405
+ }
406
+ catch {
407
+ // Best-effort
408
+ }
409
+ }
410
+ //# sourceMappingURL=tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tester.js","sourceRoot":"","sources":["../../../src/agents/agents/tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * WriterAgent — Proposes code changes based on the task plan and gathered context.
3
+ *
4
+ * For each "writer" step in the execution plan, this agent:
5
+ * 1. Reads the relevant source files (from artifacts in the context bus)
6
+ * 2. Generates modified versions using the LLM
7
+ * 3. Stores FileChange objects in the context bus for the orchestrator to apply
8
+ *
9
+ * The agent does NOT write to disk — it only proposes changes.
10
+ * The orchestrator decides whether to apply them (based on dry-run mode).
11
+ */
12
+ import { Agent, type AgentContext, type AgentResult, type LLMCallFn } from '../agent.js';
13
+ /**
14
+ * WriterAgent — Proposes code changes by reading files, generating new versions
15
+ * via the LLM, and storing FileChange objects in the shared context.
16
+ * Does NOT write to disk directly; the orchestrator handles that.
17
+ *
18
+ * Retry strategy:
19
+ * 1. Rate-limit (429) errors with LONG wait (>3s): invokes onRateLimit callback
20
+ * (if available) to let the user choose: wait, switch model, skip, or abort.
21
+ * 2. Rate-limit errors with SHORT wait (<=3s): auto-retry with smart delay.
22
+ * 3. Other transient errors (timeouts, network): auto-retry with backoff.
23
+ * 4. Empty parse results (format issue): retry once with stricter prompt.
24
+ */
25
+ export declare class WriterAgent extends Agent {
26
+ readonly name = "Writer";
27
+ readonly description = "Generates code changes based on the plan and context";
28
+ execute(context: AgentContext, callLLM: LLMCallFn): Promise<AgentResult>;
29
+ /**
30
+ * Perform a single write attempt.
31
+ * Optionally uses a stricter retry prompt.
32
+ */
33
+ private attemptWrite;
34
+ /**
35
+ * Build the prompt for the writer agent from the shared context.
36
+ * Limits the number of files sent to avoid token budget issues.
37
+ * When isRetry is true, uses a more explicit prompt.
38
+ */
39
+ private buildPrompt;
40
+ /**
41
+ * Parse the LLM response to extract file changes.
42
+ */
43
+ private parseFileChanges;
44
+ /**
45
+ * Select files within the given character budget.
46
+ * Prioritizes smaller files first so the LLM sees as much complete context as possible.
47
+ */
48
+ private selectFilesWithinBudget;
49
+ private addFileChange;
50
+ }
51
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/agents/agents/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AA8G1G;;;;;;;;;;;GAWG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,0DAA0D;IAExE,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAwH9E;;;OAGG;YACW,YAAY;IAiE1B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,aAAa;CA0BtB"}