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,384 @@
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 { existsSync, readFileSync } from 'node:fs';
13
+ import { isAbsolute, join } from 'node:path';
14
+ import { Agent } from '../agent.js';
15
+ import { logger } from '../../utils/logger.js';
16
+ const WRITER_SYSTEM_PROMPT = `You are an expert software engineer implementing changes to a codebase.
17
+
18
+ Given file contents and an implementation task, you will:
19
+ 1. Read the current file content carefully
20
+ 2. Implement the requested changes
21
+ 3. Return the COMPLETE updated file content for EACH modified file
22
+
23
+ ## Output Format (MANDATORY)
24
+
25
+ Wrap EACH file you modify in its own code block. The file path MUST go right after the opening backticks with the prefix "filepath:".
26
+
27
+ CORRECT (use this format):
28
+ \`\`\`filepath:path/to/file.ts
29
+ // FULL updated file content here
30
+ \`\`\`
31
+
32
+ INCORRECT (do NOT use these):
33
+ - ❌ \`\`\`typescript\n...\n\`\`\` (missing filepath)
34
+ - ❌ \`\`\`\n...\n\`\`\` (missing language and filepath)
35
+ - ❌ Just describing the changes instead of returning the file
36
+
37
+ ## Rules
38
+ - Return the FULL file content, not just the changed parts
39
+ - Preserve existing code style and conventions
40
+ - Add appropriate error handling
41
+ - Write clean, well-documented code
42
+ - If you modify multiple files, return ONE code block per file
43
+ `;
44
+ /** Maximum files to include in a single writer prompt */
45
+ const MAX_CONTEXT_FILES = 10;
46
+ /**
47
+ * Maximum total characters across all files sent to the LLM.
48
+ * 16,000 chars ≈ 4,000 tokens — leaves room for the rest of the prompt and response.
49
+ * Files are prioritized: smaller files first, larger files are trunkated if over budget.
50
+ */
51
+ const MAX_CONTEXT_CHARS = 16_000;
52
+ /** Maximum number of API retry attempts for transient LLM failures (rate limits, timeouts, etc.) */
53
+ const MAX_API_RETRIES = 2;
54
+ /** Base delay for exponential backoff in milliseconds (doubles each retry: 5s, 10s) */
55
+ const BASE_RETRY_DELAY_MS = 5000;
56
+ /**
57
+ * Threshold above which we consider a rate-limit wait "long" and prompt the user.
58
+ * Short waits (< 3s) are auto-retried silently. Long waits prompt the user.
59
+ */
60
+ const LONG_WAIT_THRESHOLD_MS = 3000;
61
+ /**
62
+ * Parse the "try again in Xs" hint from a rate-limit error response.
63
+ * Supports formats: "try again in 10.49s", "try again in 5000ms"
64
+ * Returns the suggested wait time in ms, or null if not found.
65
+ */
66
+ function parseRetryAfterHint(errorMessage) {
67
+ // Match patterns like: "try again in 10.49s" or "try again in 5000ms"
68
+ const secondMatch = errorMessage.match(/try again in ([\d.]+)s/i);
69
+ if (secondMatch) {
70
+ const seconds = parseFloat(secondMatch[1]);
71
+ if (!isNaN(seconds) && seconds > 0) {
72
+ return Math.ceil(seconds * 1000);
73
+ }
74
+ }
75
+ const msMatch = errorMessage.match(/try again in (\d+)ms/i);
76
+ if (msMatch) {
77
+ const ms = parseInt(msMatch[1], 10);
78
+ if (!isNaN(ms) && ms > 0) {
79
+ return ms;
80
+ }
81
+ }
82
+ return null;
83
+ }
84
+ /**
85
+ * Extract the model name from a rate-limit error message.
86
+ * Matches patterns like: "Rate limit reached for model `qwen/qwen3-32b`"
87
+ */
88
+ function parseModelName(errorMessage) {
89
+ const match = errorMessage.match(/model\s+`([^`]+)`|model\s+'([^']+)'|model\s+([^\s]+)/i);
90
+ return match?.[1] || match?.[2] || match?.[3] || undefined;
91
+ }
92
+ /**
93
+ * Check if an error message indicates a rate-limit (429) error.
94
+ */
95
+ function isRateLimitError(errorMessage) {
96
+ return /rate\s*limit|429|too many requests|try again in/i.test(errorMessage);
97
+ }
98
+ /**
99
+ * Calculate the retry delay for a given attempt.
100
+ * If the error message contains a "try again in Xs" hint, use that.
101
+ * Otherwise, fall back to exponential backoff with BASE_RETRY_DELAY_MS.
102
+ */
103
+ function calculateRetryDelay(attempt, errorMessage) {
104
+ const hintDelay = parseRetryAfterHint(errorMessage);
105
+ if (hintDelay !== null) {
106
+ return hintDelay;
107
+ }
108
+ // Fallback: exponential backoff (5s, 10s, 20s...)
109
+ return BASE_RETRY_DELAY_MS * Math.pow(2, attempt);
110
+ }
111
+ /**
112
+ * WriterAgent — Proposes code changes by reading files, generating new versions
113
+ * via the LLM, and storing FileChange objects in the shared context.
114
+ * Does NOT write to disk directly; the orchestrator handles that.
115
+ *
116
+ * Retry strategy:
117
+ * 1. Rate-limit (429) errors with LONG wait (>3s): invokes onRateLimit callback
118
+ * (if available) to let the user choose: wait, switch model, skip, or abort.
119
+ * 2. Rate-limit errors with SHORT wait (<=3s): auto-retry with smart delay.
120
+ * 3. Other transient errors (timeouts, network): auto-retry with backoff.
121
+ * 4. Empty parse results (format issue): retry once with stricter prompt.
122
+ */
123
+ export class WriterAgent extends Agent {
124
+ name = 'Writer';
125
+ description = 'Generates code changes based on the plan and context';
126
+ async execute(context, callLLM) {
127
+ let lastError;
128
+ let latestCallLLM = callLLM;
129
+ // Outer retry loop: handles transient API errors (rate limits, timeouts)
130
+ for (let attempt = 0; attempt <= MAX_API_RETRIES; attempt++) {
131
+ try {
132
+ const result = await this.attemptWrite(context, latestCallLLM);
133
+ // Inner retry: handles empty parse results (format issue)
134
+ // This runs on EVERY API attempt — API errors and format issues are independent.
135
+ // The format retry always returns (success or note), so no infinite loop risk.
136
+ if (result.success && result.summary === 'No files needed changes') {
137
+ // Retry once with stricter format instructions
138
+ const retryResult = await this.attemptWrite(context, latestCallLLM, true);
139
+ if (retryResult.success && retryResult.summary !== 'No files needed changes') {
140
+ return retryResult;
141
+ }
142
+ return {
143
+ success: true,
144
+ summary: result.summary,
145
+ details: `${result.details}\n(Retried once with explicit format instructions — still no parseable output)`,
146
+ };
147
+ }
148
+ return result;
149
+ }
150
+ catch (err) {
151
+ lastError = err instanceof Error ? err.message : String(err);
152
+ // ── Rate limit handling with user prompt ─────────────────────
153
+ if (isRateLimitError(lastError) && context.onRateLimit) {
154
+ const retryAfterMs = parseRetryAfterHint(lastError) || BASE_RETRY_DELAY_MS;
155
+ if (retryAfterMs >= LONG_WAIT_THRESHOLD_MS) {
156
+ const modelName = parseModelName(lastError);
157
+ const action = await context.onRateLimit({
158
+ retryAfterMs,
159
+ modelName,
160
+ agentName: this.name,
161
+ errorMessage: lastError.slice(0, 300),
162
+ });
163
+ if (action.action === 'abort') {
164
+ logger.error(`Writer aborted by user: ${lastError}`);
165
+ return {
166
+ success: false,
167
+ summary: 'Writer aborted by user due to rate limit',
168
+ error: lastError,
169
+ };
170
+ }
171
+ if (action.action === 'skip') {
172
+ logger.info('Writer step skipped by user');
173
+ return {
174
+ success: true,
175
+ summary: 'Skipped by user (rate limit)',
176
+ details: 'The writer step was skipped because the API rate limit was exceeded.',
177
+ };
178
+ }
179
+ if (action.action === 'switch-model') {
180
+ logger.info('Switching model per user request...');
181
+ latestCallLLM = action.callLLM;
182
+ // Continue the retry loop with the new callLLM
183
+ await new Promise((resolve) => setTimeout(resolve, 500)); // Brief pause before retry
184
+ continue;
185
+ }
186
+ // 'retry': fall through to wait and retry below
187
+ logger.warn(`Writer rate limited. Waiting ${(retryAfterMs / 1000).toFixed(1)}s as chosen by user...`);
188
+ await new Promise((resolve) => setTimeout(resolve, retryAfterMs));
189
+ continue;
190
+ }
191
+ // Short wait: auto-retry (fall through to standard retry logic below)
192
+ }
193
+ // ── Standard retry for transient errors ──────────────────────
194
+ if (attempt < MAX_API_RETRIES) {
195
+ if (isRateLimitError(lastError)) {
196
+ // Short wait rate limit: auto-retry with smart delay
197
+ const delayMs = calculateRetryDelay(attempt, lastError);
198
+ logger.warn(`Writer API error (attempt ${attempt + 1}/${MAX_API_RETRIES + 1}): ` +
199
+ `${lastError.slice(0, 200)}. Waiting ${(delayMs / 1000).toFixed(1)}s...`);
200
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
201
+ }
202
+ else {
203
+ // Other transient errors (timeout, network): standard exponential backoff
204
+ const delayMs = BASE_RETRY_DELAY_MS * Math.pow(2, attempt);
205
+ logger.warn(`Writer API error (attempt ${attempt + 1}/${MAX_API_RETRIES + 1}): ` +
206
+ `${lastError.slice(0, 200)}. Retrying in ${(delayMs / 1000).toFixed(1)}s...`);
207
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
208
+ }
209
+ continue;
210
+ }
211
+ // All attempts exhausted
212
+ logger.error(`Writer failed after ${MAX_API_RETRIES + 1} API attempts: ${lastError}`);
213
+ return {
214
+ success: false,
215
+ summary: 'Writer failed to generate changes',
216
+ error: lastError,
217
+ };
218
+ }
219
+ }
220
+ // TypeScript safety — unreachable due to return in catch/finally
221
+ return {
222
+ success: false,
223
+ summary: 'Writer failed to generate changes',
224
+ error: lastError || 'Unknown error',
225
+ };
226
+ }
227
+ /**
228
+ * Perform a single write attempt.
229
+ * Optionally uses a stricter retry prompt.
230
+ */
231
+ async attemptWrite(context, callLLM, isRetry = false) {
232
+ const prompt = this.buildPrompt(context, isRetry);
233
+ // Log prompt size for debugging token limit issues
234
+ const label = isRetry ? 'Retry' : 'Initial';
235
+ logger.debug(`[Writer ${label}] Prompt size: ${prompt.length} chars, ~${Math.ceil(prompt.length / 4)} tokens`);
236
+ const response = await callLLM(prompt, {
237
+ temperature: isRetry ? 0.1 : 0.3, // Lower temperature for retry
238
+ maxTokens: 2048,
239
+ });
240
+ // ── Verbose logging: capture what the LLM actually returned ──────
241
+ logger.debug(`[Writer ${label}] LLM response length: ${response.length} chars`);
242
+ logger.debug(`[Writer ${label}] LLM response preview (first 600 chars):`);
243
+ logger.debug(response.slice(0, 600));
244
+ if (response.length > 600) {
245
+ logger.debug(`[Writer ${label}] ... (${response.length - 600} more chars truncated)`);
246
+ }
247
+ // Extract file changes from the response
248
+ const fileChanges = this.parseFileChanges(response, context.workingDirectory);
249
+ logger.debug(`[Writer ${label}] Parsed ${fileChanges.length} file change(s)`);
250
+ for (const fc of fileChanges) {
251
+ logger.debug(`[Writer ${label}] ${fc.status === 'created' ? '\u{1F4C4}' : '\u{270F}\u{FE0F}'} ${fc.path} (${(fc.newContent || '').length} chars)`);
252
+ }
253
+ // Store changes in the shared context
254
+ for (const change of fileChanges) {
255
+ const existing = context.fileChanges.findIndex((c) => c.path === change.path);
256
+ if (existing >= 0) {
257
+ context.fileChanges[existing] = change;
258
+ }
259
+ else {
260
+ context.fileChanges.push(change);
261
+ }
262
+ }
263
+ const count = fileChanges.length;
264
+ if (count === 0) {
265
+ const excerpt = response.slice(0, 300).replace(/\n/g, '\\n');
266
+ logger.debug(`[Writer ${label}] No files parsed. Response starts with: ${excerpt.slice(0, 200)}...`);
267
+ return {
268
+ success: true,
269
+ summary: 'No files needed changes',
270
+ details: `Response preview: ${excerpt}...`,
271
+ };
272
+ }
273
+ return {
274
+ success: true,
275
+ summary: `Proposed changes to ${count} file${count !== 1 ? 's' : ''}`,
276
+ details: fileChanges
277
+ .map((c) => {
278
+ const icon = c.status === 'created' ? '\u{1F4C4}' : '\u{270F}\u{FE0F}';
279
+ return ` ${icon} ${c.path} (${c.status})`;
280
+ })
281
+ .join('\n'),
282
+ };
283
+ }
284
+ /**
285
+ * Build the prompt for the writer agent from the shared context.
286
+ * Limits the number of files sent to avoid token budget issues.
287
+ * When isRetry is true, uses a more explicit prompt.
288
+ */
289
+ buildPrompt(context, isRetry = false) {
290
+ // Find the writer tasks in the plan
291
+ const writerTask = context.taskPlan.find((s) => s.agentType === 'writer' && s.status === 'running');
292
+ const taskDescription = writerTask?.description || context.goal;
293
+ // Use token-budget-aware file selection: show as many files as possible
294
+ // within MAX_CONTEXT_CHARS, prioritizing smaller files to max context.
295
+ const filesToSend = this.selectFilesWithinBudget(context.artifacts, MAX_CONTEXT_CHARS);
296
+ const fileContext = filesToSend.length > 0
297
+ ? filesToSend
298
+ .map(({ artifact, truncated }) => `--- ${artifact.path} ---${truncated ? ` (truncated, ${artifact.content.length}\u2192${truncated.length} chars)` : ''}\n${truncated || artifact.content}`)
299
+ .join('\n\n') +
300
+ (context.artifacts.length > filesToSend.length
301
+ ? `\n\n... and ${context.artifacts.length - filesToSend.length} more files in the project (excluded to fit token budget)`
302
+ : '')
303
+ : '(No files found in context — you may need to create new files)';
304
+ const instructions = isRetry
305
+ ? `\n## CRITICAL — Read This Carefully\nThe previous response could not be parsed because the files were not wrapped in correctly formatted code blocks.\n\nYou MUST follow this format EXACTLY for EACH file you modify:\n\n\`\`\`filepath:src/example.ts\n// THE COMPLETE UPDATED FILE CONTENT GOES HERE (every line, full file)\n\`\`\`\n\nIMPORTANT:\n- The filepath: prefix is REQUIRED after the opening backticks\n- Return the FULL file, not a diff or snippet\n- If you modify 2 files, return 2 separate code blocks in this format`
306
+ : `\n## Instructions\nImplement the changes described in the task. Return the complete updated file content for each file you modify. Remember: each file must be wrapped in \`\`\`filepath:...\n\`\`\` format.`;
307
+ return `${WRITER_SYSTEM_PROMPT}\n\n## Task Description\n${taskDescription}\n\n## Current File Content\n${fileContext}\n${instructions}`;
308
+ }
309
+ /**
310
+ * Parse the LLM response to extract file changes.
311
+ */
312
+ parseFileChanges(response, workingDir) {
313
+ const changes = [];
314
+ // Match code blocks containing a real file path.
315
+ const blockRegex = /```(?:[a-zA-Z0-9+#]*\s+)?(?:filepath:)?([^\n`]+(?:\.[a-zA-Z0-9]+|\/[^\n`]+))\n([\s\S]*?)```/g;
316
+ let match;
317
+ while ((match = blockRegex.exec(response)) !== null) {
318
+ let filePath = match[1].trim();
319
+ const content = match[2].trim();
320
+ // Clean up the file path (remove leading/trailing quotes, whitespace)
321
+ filePath = filePath.replace(/^['"]|['"]$/g, '').trim();
322
+ if (!filePath || !content)
323
+ continue;
324
+ this.addFileChange(changes, filePath, content, workingDir);
325
+ }
326
+ return changes;
327
+ }
328
+ /**
329
+ * Select files within the given character budget.
330
+ * Prioritizes smaller files first so the LLM sees as much complete context as possible.
331
+ */
332
+ selectFilesWithinBudget(artifacts, budget) {
333
+ const sorted = [...artifacts]
334
+ .map((a) => ({ artifact: a, size: a.content.length }))
335
+ .sort((a, b) => a.size - b.size);
336
+ const result = [];
337
+ let used = 0;
338
+ const OVERHEAD_PER_FILE = 50;
339
+ for (const { artifact, size } of sorted) {
340
+ if (result.length >= MAX_CONTEXT_FILES)
341
+ break;
342
+ const totalNeeded = size + OVERHEAD_PER_FILE;
343
+ if (used + totalNeeded <= budget) {
344
+ result.push({ artifact, truncated: null });
345
+ used += totalNeeded;
346
+ }
347
+ else if (used + OVERHEAD_PER_FILE < budget) {
348
+ const remaining = budget - used - OVERHEAD_PER_FILE;
349
+ if (remaining > 200) {
350
+ const truncated = artifact.content.slice(0, remaining);
351
+ result.push({ artifact, truncated });
352
+ used = budget;
353
+ }
354
+ break;
355
+ }
356
+ else {
357
+ break;
358
+ }
359
+ }
360
+ return result;
361
+ }
362
+ addFileChange(changes, filePath, content, workingDir) {
363
+ const absolutePath = isAbsolute(filePath) ? filePath : join(workingDir, filePath);
364
+ if (existsSync(absolutePath)) {
365
+ const originalContent = readFileSync(absolutePath, 'utf-8');
366
+ if (originalContent.trim() !== content.trim()) {
367
+ changes.push({
368
+ path: filePath,
369
+ originalContent,
370
+ newContent: content,
371
+ status: 'modified',
372
+ });
373
+ }
374
+ }
375
+ else {
376
+ changes.push({
377
+ path: filePath,
378
+ newContent: content,
379
+ status: 'created',
380
+ });
381
+ }
382
+ }
383
+ }
384
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/agents/agents/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * ContextVault — The shared in-memory context bus for inter-agent communication.
3
+ *
4
+ * All agents read from and write to this vault. The orchestrator creates one
5
+ * per execution session and passes references to every agent.
6
+ *
7
+ * This is deliberately a simple class wrapping a plain object so that
8
+ * it can be serialized/deserialized in Phase 2 (persistent memory).
9
+ */
10
+ import type { AgentContext, TaskStep, Artifact, FileChange } from './agent.js';
11
+ /**
12
+ * Shared, mutable context bus for a single orchestration session.
13
+ */
14
+ export declare class ContextVault {
15
+ /** The underlying shared context */
16
+ readonly context: AgentContext;
17
+ constructor(goal: string, workingDirectory: string);
18
+ /** Replace the full task plan */
19
+ setTaskPlan(steps: TaskStep[]): void;
20
+ /** Update status for a single task step */
21
+ updateTaskStatus(taskId: string, status: TaskStep['status'], result?: string): void;
22
+ /** Get pending tasks whose dependencies are all completed */
23
+ getRunnableTasks(): TaskStep[];
24
+ /** Check if all tasks are completed or failed */
25
+ get isComplete(): boolean;
26
+ /** Check if any task has failed */
27
+ get hasFailedTasks(): boolean;
28
+ /** Add one or more file artifacts */
29
+ addArtifacts(artifacts: Artifact[]): void;
30
+ /** Get all artifacts (optionally filtered by path match) */
31
+ getArtifacts(pathPattern?: string): Artifact[];
32
+ /** Log an agent-to-agent message */
33
+ addMessage(from: string, to: string, content: string): void;
34
+ /** Get conversation history formatted for LLM context */
35
+ getConversationLog(): string;
36
+ /** Record a file change */
37
+ addFileChange(change: FileChange): void;
38
+ /** Get all file changes */
39
+ getFileChanges(): FileChange[];
40
+ /** Get a formatted diff summary for display */
41
+ getDiffSummary(): string;
42
+ /** Store a metadata value */
43
+ setMeta(key: string, value: unknown): void;
44
+ /** Retrieve a metadata value */
45
+ getMeta<T = unknown>(key: string): T | undefined;
46
+ /** Get a serialisable snapshot (handy for logging / Phase 2 persistence) */
47
+ snapshot(): AgentContext;
48
+ }
49
+ //# sourceMappingURL=context-vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-vault.d.ts","sourceRoot":"","sources":["../../src/agents/context-vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAgB,UAAU,EAAE,MAAM,YAAY,CAAC;AAe7F;;GAEG;AACH,qBAAa,YAAY;IACvB,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;gBAEnB,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAMlD,iCAAiC;IACjC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAIpC,2CAA2C;IAC3C,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAUnF,6DAA6D;IAC7D,gBAAgB,IAAI,QAAQ,EAAE;IAU9B,iDAAiD;IACjD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,mCAAmC;IACnC,IAAI,cAAc,IAAI,OAAO,CAE5B;IAID,qCAAqC;IACrC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAIzC,4DAA4D;IAC5D,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAO9C,oCAAoC;IACpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3D,yDAAyD;IACzD,kBAAkB,IAAI,MAAM;IAQ5B,2BAA2B;IAC3B,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAUvC,2BAA2B;IAC3B,cAAc,IAAI,UAAU,EAAE;IAI9B,+CAA+C;IAC/C,cAAc,IAAI,MAAM;IAYxB,6BAA6B;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI1C,gCAAgC;IAChC,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAMhD,4EAA4E;IAC5E,QAAQ,IAAI,YAAY;CAGzB"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * ContextVault — The shared in-memory context bus for inter-agent communication.
3
+ *
4
+ * All agents read from and write to this vault. The orchestrator creates one
5
+ * per execution session and passes references to every agent.
6
+ *
7
+ * This is deliberately a simple class wrapping a plain object so that
8
+ * it can be serialized/deserialized in Phase 2 (persistent memory).
9
+ */
10
+ /** Default empty context */
11
+ function createEmptyContext(goal, workingDirectory) {
12
+ return {
13
+ goal,
14
+ workingDirectory,
15
+ taskPlan: [],
16
+ artifacts: [],
17
+ conversations: [],
18
+ fileChanges: [],
19
+ metadata: {},
20
+ };
21
+ }
22
+ /**
23
+ * Shared, mutable context bus for a single orchestration session.
24
+ */
25
+ export class ContextVault {
26
+ /** The underlying shared context */
27
+ context;
28
+ constructor(goal, workingDirectory) {
29
+ this.context = createEmptyContext(goal, workingDirectory);
30
+ }
31
+ // ─── Task Plan ──────────────────────────────────────────────────────────
32
+ /** Replace the full task plan */
33
+ setTaskPlan(steps) {
34
+ this.context.taskPlan = steps;
35
+ }
36
+ /** Update status for a single task step */
37
+ updateTaskStatus(taskId, status, result) {
38
+ const step = this.context.taskPlan.find((s) => s.id === taskId);
39
+ if (step) {
40
+ step.status = status;
41
+ if (result !== undefined) {
42
+ step.result = result;
43
+ }
44
+ }
45
+ }
46
+ /** Get pending tasks whose dependencies are all completed */
47
+ getRunnableTasks() {
48
+ return this.context.taskPlan.filter((step) => {
49
+ if (step.status !== 'pending')
50
+ return false;
51
+ return step.dependsOn.every((depId) => {
52
+ const dep = this.context.taskPlan.find((s) => s.id === depId);
53
+ return dep?.status === 'completed';
54
+ });
55
+ });
56
+ }
57
+ /** Check if all tasks are completed or failed */
58
+ get isComplete() {
59
+ return this.context.taskPlan.every((s) => s.status === 'completed' || s.status === 'failed');
60
+ }
61
+ /** Check if any task has failed */
62
+ get hasFailedTasks() {
63
+ return this.context.taskPlan.some((s) => s.status === 'failed');
64
+ }
65
+ // ─── Artifacts ──────────────────────────────────────────────────────────
66
+ /** Add one or more file artifacts */
67
+ addArtifacts(artifacts) {
68
+ this.context.artifacts.push(...artifacts);
69
+ }
70
+ /** Get all artifacts (optionally filtered by path match) */
71
+ getArtifacts(pathPattern) {
72
+ if (!pathPattern)
73
+ return [...this.context.artifacts];
74
+ return this.context.artifacts.filter((a) => a.path.includes(pathPattern));
75
+ }
76
+ // ─── Conversations ──────────────────────────────────────────────────────
77
+ /** Log an agent-to-agent message */
78
+ addMessage(from, to, content) {
79
+ this.context.conversations.push({
80
+ from,
81
+ to,
82
+ content,
83
+ timestamp: Date.now(),
84
+ });
85
+ }
86
+ /** Get conversation history formatted for LLM context */
87
+ getConversationLog() {
88
+ return this.context.conversations
89
+ .map((m) => `[${m.from} → ${m.to}]: ${m.content}`)
90
+ .join('\n');
91
+ }
92
+ // ─── File Changes ───────────────────────────────────────────────────────
93
+ /** Record a file change */
94
+ addFileChange(change) {
95
+ // Replace existing entry for same path if present
96
+ const existing = this.context.fileChanges.findIndex((c) => c.path === change.path);
97
+ if (existing >= 0) {
98
+ this.context.fileChanges[existing] = change;
99
+ }
100
+ else {
101
+ this.context.fileChanges.push(change);
102
+ }
103
+ }
104
+ /** Get all file changes */
105
+ getFileChanges() {
106
+ return [...this.context.fileChanges];
107
+ }
108
+ /** Get a formatted diff summary for display */
109
+ getDiffSummary() {
110
+ if (this.context.fileChanges.length === 0)
111
+ return 'No files changed.';
112
+ return this.context.fileChanges
113
+ .map((c) => {
114
+ const icon = c.status === 'created' ? '📄' : c.status === 'deleted' ? '🗑️' : '✏️';
115
+ return ` ${icon} ${c.path} (${c.status})`;
116
+ })
117
+ .join('\n');
118
+ }
119
+ // ─── Metadata ───────────────────────────────────────────────────────────
120
+ /** Store a metadata value */
121
+ setMeta(key, value) {
122
+ this.context.metadata[key] = value;
123
+ }
124
+ /** Retrieve a metadata value */
125
+ getMeta(key) {
126
+ return this.context.metadata[key];
127
+ }
128
+ // ─── Snapshot ───────────────────────────────────────────────────────────
129
+ /** Get a serialisable snapshot (handy for logging / Phase 2 persistence) */
130
+ snapshot() {
131
+ return structuredClone(this.context);
132
+ }
133
+ }
134
+ //# sourceMappingURL=context-vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-vault.js","sourceRoot":"","sources":["../../src/agents/context-vault.ts"],"names":[],"mappings":"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"}