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,293 @@
1
+ /**
2
+ * Team Review — Review workflow (agent PR → review → merge).
3
+ *
4
+ * The review workflow enables team members to review agent-generated changes
5
+ * before applying them. It mimics a simplified PR workflow:
6
+ *
7
+ * 1. PR Creation: Agent proposes changes → saved as a "review bundle"
8
+ * 2. Review: Team member reviews the proposed changes
9
+ * 3. Merge: Approved changes are applied to the working directory
10
+ *
11
+ * Review bundles are stored in ~/.buff/team/reviews/ and can be shared
12
+ * via git (if team memory is set up) or locally.
13
+ *
14
+ * Each bundle contains:
15
+ * - Metadata (author, timestamp, goal, provider)
16
+ * - Proposed file changes (path, original, new content)
17
+ * - Review comments (status, feedback)
18
+ */
19
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
20
+ import { join, resolve } from 'node:path';
21
+ import { homedir } from 'node:os';
22
+ import { logger } from '../utils/logger.js';
23
+ // ─── Constants ──────────────────────────────────────────────────────────────
24
+ const REVIEWS_DIR = join(homedir(), '.buff', 'team', 'reviews');
25
+ const REVIEWS_INDEX_PATH = join(REVIEWS_DIR, 'index.json');
26
+ // ─── Helpers ────────────────────────────────────────────────────────────────
27
+ function ensureDir() {
28
+ if (!existsSync(REVIEWS_DIR)) {
29
+ mkdirSync(REVIEWS_DIR, { recursive: true });
30
+ }
31
+ }
32
+ function generateReviewId() {
33
+ return `review-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
34
+ }
35
+ function readIndex() {
36
+ try {
37
+ ensureDir();
38
+ if (!existsSync(REVIEWS_INDEX_PATH)) {
39
+ return { reviews: [] };
40
+ }
41
+ return JSON.parse(readFileSync(REVIEWS_INDEX_PATH, 'utf-8'));
42
+ }
43
+ catch {
44
+ return { reviews: [] };
45
+ }
46
+ }
47
+ function writeIndex(index) {
48
+ ensureDir();
49
+ writeFileSync(REVIEWS_INDEX_PATH, JSON.stringify(index, null, 2), 'utf-8');
50
+ }
51
+ function bundlePath(id) {
52
+ return join(REVIEWS_DIR, `${id}.json`);
53
+ }
54
+ // ─── Review Operations ──────────────────────────────────────────────────────
55
+ /**
56
+ * Create a new review bundle from proposed file changes.
57
+ * Typically called after an agent execution to capture the proposed changes
58
+ * for review before applying them.
59
+ *
60
+ * @param title — Short title for the review
61
+ * @param goal — The original goal
62
+ * @param changes — Proposed file changes
63
+ * @param options — Optional metadata
64
+ * @returns The created ReviewBundle
65
+ */
66
+ export function createReview(title, goal, changes, options) {
67
+ const id = generateReviewId();
68
+ const bundle = {
69
+ id,
70
+ title,
71
+ goal,
72
+ author: options?.author || process.env.USER || 'unknown',
73
+ status: 'pending',
74
+ createdAt: Date.now(),
75
+ provider: options?.provider || 'unknown',
76
+ model: options?.model || 'unknown',
77
+ changes,
78
+ comments: [],
79
+ summary: options?.summary,
80
+ tags: options?.tags || [],
81
+ };
82
+ // Save to disk
83
+ ensureDir();
84
+ writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
85
+ // Update index
86
+ const index = readIndex();
87
+ index.reviews.unshift({
88
+ id,
89
+ title,
90
+ status: 'pending',
91
+ createdAt: bundle.createdAt,
92
+ author: bundle.author,
93
+ });
94
+ // Keep only last 100 entries in the index
95
+ if (index.reviews.length > 100) {
96
+ index.reviews = index.reviews.slice(0, 100);
97
+ }
98
+ writeIndex(index);
99
+ logger.success(`Created review bundle: ${id} — "${title}"`);
100
+ return bundle;
101
+ }
102
+ /**
103
+ * Load a review bundle by ID.
104
+ */
105
+ export function getReview(id) {
106
+ const path = bundlePath(id);
107
+ if (!existsSync(path))
108
+ return null;
109
+ try {
110
+ return JSON.parse(readFileSync(path, 'utf-8'));
111
+ }
112
+ catch {
113
+ return null;
114
+ }
115
+ }
116
+ /**
117
+ * List all review bundles, sorted by recency.
118
+ */
119
+ export function listReviews(limit = 20) {
120
+ const index = readIndex();
121
+ const reviews = [];
122
+ for (const entry of index.reviews.slice(0, limit)) {
123
+ const bundle = getReview(entry.id);
124
+ if (bundle)
125
+ reviews.push(bundle);
126
+ }
127
+ return reviews;
128
+ }
129
+ /**
130
+ * Add a review comment to a bundle.
131
+ */
132
+ export function addReviewComment(id, reviewer, status, comment) {
133
+ const bundle = getReview(id);
134
+ if (!bundle) {
135
+ logger.error(`Review not found: ${id}`);
136
+ return null;
137
+ }
138
+ bundle.comments.push({
139
+ reviewer,
140
+ status,
141
+ comment,
142
+ timestamp: Date.now(),
143
+ });
144
+ // Update status based on comment
145
+ if (status === 'approve') {
146
+ bundle.status = 'approved';
147
+ }
148
+ else if (status === 'request-changes') {
149
+ bundle.status = 'changes-requested';
150
+ }
151
+ // Save
152
+ writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
153
+ // Update index
154
+ const index = readIndex();
155
+ const entry = index.reviews.find((r) => r.id === id);
156
+ if (entry)
157
+ entry.status = bundle.status;
158
+ writeIndex(index);
159
+ return bundle;
160
+ }
161
+ /**
162
+ * Merge a review bundle — apply approved changes to the working directory.
163
+ *
164
+ * @param id — Review bundle ID
165
+ * @param workingDir — Working directory to apply changes to (default: process.cwd())
166
+ * @returns The number of files changed
167
+ */
168
+ export function mergeReview(id, workingDir) {
169
+ const bundle = getReview(id);
170
+ if (!bundle) {
171
+ logger.error(`Review not found: ${id}`);
172
+ return 0;
173
+ }
174
+ if (bundle.status === 'rejected') {
175
+ logger.error('Cannot merge a rejected review.');
176
+ return 0;
177
+ }
178
+ if (bundle.status === 'pending') {
179
+ logger.warn('Review is still pending. Approve first with `buff team review approve <id>`.');
180
+ return 0;
181
+ }
182
+ const dir = resolve(workingDir || process.cwd());
183
+ let count = 0;
184
+ for (const change of bundle.changes) {
185
+ const fullPath = resolve(dir, change.path);
186
+ switch (change.status) {
187
+ case 'created':
188
+ case 'modified':
189
+ if (change.newContent !== undefined) {
190
+ const targetDir = join(fullPath, '..');
191
+ if (!existsSync(targetDir)) {
192
+ mkdirSync(targetDir, { recursive: true });
193
+ }
194
+ writeFileSync(fullPath, change.newContent, 'utf-8');
195
+ count++;
196
+ }
197
+ break;
198
+ case 'deleted':
199
+ if (existsSync(fullPath)) {
200
+ try {
201
+ const { unlinkSync } = require('node:fs');
202
+ unlinkSync(fullPath);
203
+ count++;
204
+ }
205
+ catch {
206
+ logger.warn(`Could not delete ${change.path}`);
207
+ }
208
+ }
209
+ break;
210
+ }
211
+ }
212
+ // Update status
213
+ bundle.status = 'merged';
214
+ writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
215
+ const index = readIndex();
216
+ const entry = index.reviews.find((r) => r.id === id);
217
+ if (entry)
218
+ entry.status = 'merged';
219
+ writeIndex(index);
220
+ logger.success(`Merged review ${id}: ${count} file(s) changed.`);
221
+ return count;
222
+ }
223
+ /**
224
+ * Reject a review bundle.
225
+ */
226
+ export function rejectReview(id, reason) {
227
+ const bundle = getReview(id);
228
+ if (!bundle) {
229
+ logger.error(`Review not found: ${id}`);
230
+ return false;
231
+ }
232
+ bundle.status = 'rejected';
233
+ if (reason) {
234
+ bundle.comments.push({
235
+ reviewer: bundle.author,
236
+ status: 'request-changes',
237
+ comment: reason,
238
+ timestamp: Date.now(),
239
+ });
240
+ }
241
+ writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
242
+ const index = readIndex();
243
+ const entry = index.reviews.find((r) => r.id === id);
244
+ if (entry)
245
+ entry.status = 'rejected';
246
+ writeIndex(index);
247
+ logger.info(`Review ${id} rejected.${reason ? ` Reason: ${reason}` : ''}`);
248
+ return true;
249
+ }
250
+ /**
251
+ * Create a review bundle from the current orchestrator result.
252
+ * This captures all file changes proposed by the agents into a review.
253
+ *
254
+ * @param goal — The original goal
255
+ * @param fileChanges — The proposed file changes from the orchestrator
256
+ * @param summary — Execution summary
257
+ * @returns The created ReviewBundle
258
+ */
259
+ export function createReviewFromResult(goal, fileChanges, summary, options) {
260
+ // Read original content for modified files
261
+ const changes = fileChanges.map((fc) => {
262
+ const change = {
263
+ path: fc.path,
264
+ status: fc.status,
265
+ };
266
+ if (fc.originalContent)
267
+ change.originalContent = fc.originalContent;
268
+ if (fc.newContent)
269
+ change.newContent = fc.newContent;
270
+ // Try to read original content if not provided
271
+ if (!change.originalContent && change.status === 'modified') {
272
+ try {
273
+ const fullPath = resolve(process.cwd(), fc.path);
274
+ if (existsSync(fullPath)) {
275
+ change.originalContent = readFileSync(fullPath, 'utf-8');
276
+ }
277
+ }
278
+ catch { /* ignore */ }
279
+ }
280
+ return change;
281
+ });
282
+ const title = summary
283
+ ? summary.split('\n')[0].slice(0, 80)
284
+ : `Changes for: ${goal.slice(0, 60)}`;
285
+ return createReview(title, goal, changes, {
286
+ provider: options?.provider,
287
+ model: options?.model,
288
+ author: options?.author,
289
+ summary,
290
+ tags: ['agent-generated'],
291
+ });
292
+ }
293
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/team/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Load environment variables from .env files
3
+ * Checks: project .env, home dir .env, and process.env
4
+ *
5
+ * .env file features:
6
+ * - Lines starting with # are comments
7
+ * - Inline comments are supported (KEY=value # comment)
8
+ * - export prefix is stripped (export KEY=value)
9
+ * - Variable expansion: $VAR, ${VAR}, ${VAR:-default}
10
+ * - References already-parsed vars in the same file first
11
+ * - Falls back to process.env
12
+ * - ${VAR:-default} uses 'default' if VAR is not set
13
+ * - Windows CRLF line endings are handled
14
+ * - Quoted values (single and double) are unquoted
15
+ * - Double-quoted values support variable expansion
16
+ * - Single-quoted values are literal (no expansion)
17
+ */
18
+ export declare function loadEnv(): Record<string, string | undefined>;
19
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAiB5D"}
@@ -0,0 +1,250 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ /**
5
+ * Load environment variables from .env files
6
+ * Checks: project .env, home dir .env, and process.env
7
+ *
8
+ * .env file features:
9
+ * - Lines starting with # are comments
10
+ * - Inline comments are supported (KEY=value # comment)
11
+ * - export prefix is stripped (export KEY=value)
12
+ * - Variable expansion: $VAR, ${VAR}, ${VAR:-default}
13
+ * - References already-parsed vars in the same file first
14
+ * - Falls back to process.env
15
+ * - ${VAR:-default} uses 'default' if VAR is not set
16
+ * - Windows CRLF line endings are handled
17
+ * - Quoted values (single and double) are unquoted
18
+ * - Double-quoted values support variable expansion
19
+ * - Single-quoted values are literal (no expansion)
20
+ */
21
+ export function loadEnv() {
22
+ const env = { ...process.env };
23
+ // Try loading from .env in project root
24
+ const projectEnv = findEnvFile(process.cwd());
25
+ if (projectEnv) {
26
+ Object.assign(env, projectEnv);
27
+ }
28
+ // Try loading from ~/.buff/.env
29
+ const homeEnvPath = join(homedir(), '.buff', '.env');
30
+ if (existsSync(homeEnvPath)) {
31
+ const homeEnv = parseEnvFile(readFileSync(homeEnvPath, 'utf-8'));
32
+ Object.assign(env, homeEnv);
33
+ }
34
+ return env;
35
+ }
36
+ function findEnvFile(dir) {
37
+ const envPath = join(dir, '.env');
38
+ if (existsSync(envPath)) {
39
+ return parseEnvFile(readFileSync(envPath, 'utf-8'));
40
+ }
41
+ return null;
42
+ }
43
+ /**
44
+ * Parse a .env file content into key-value pairs.
45
+ *
46
+ * Supports:
47
+ * - Comments: # full line and KEY=val # inline comment
48
+ * - export prefix: export KEY=value
49
+ * - Variable expansion: $VAR, ${VAR}, ${VAR:-default}
50
+ * - Quoted values: KEY="value" KEY='value'
51
+ * - CRLF line endings
52
+ * - Empty lines
53
+ */
54
+ function parseEnvFile(content) {
55
+ const env = {};
56
+ const lines = splitIntoLines(content);
57
+ for (const rawLine of lines) {
58
+ // Skip empty lines and full-line comments
59
+ if (rawLine.length === 0)
60
+ continue;
61
+ // Strip 'export ' prefix if present
62
+ const trimmed = rawLine.startsWith('export ')
63
+ ? rawLine.slice(7).trimStart()
64
+ : rawLine;
65
+ // Check if the line is just a comment after stripping export
66
+ if (trimmed.startsWith('#') || trimmed.length === 0)
67
+ continue;
68
+ // Find the first '=' that separates key from value
69
+ const eqIndex = trimmed.indexOf('=');
70
+ if (eqIndex === -1)
71
+ continue;
72
+ const key = trimmed.slice(0, eqIndex).trim();
73
+ if (!key)
74
+ continue;
75
+ const rawValue = trimmed.slice(eqIndex + 1).trim();
76
+ // Parse the value, handling quotes and inline comments
77
+ const value = parseValue(rawValue, env);
78
+ env[key] = value;
79
+ }
80
+ return env;
81
+ }
82
+ /**
83
+ * Split content into lines, handling CRLF and trailing newlines.
84
+ */
85
+ function splitIntoLines(content) {
86
+ // Normalize CRLF to LF, then split
87
+ const normalized = content.replace(/\r\n/g, '\n');
88
+ const lines = normalized.split('\n');
89
+ // Trim trailing empty line from final newline
90
+ if (lines.length > 0 && lines[lines.length - 1] === '') {
91
+ return lines.slice(0, -1);
92
+ }
93
+ return lines;
94
+ }
95
+ /**
96
+ * Parse a value string from a .env file line.
97
+ *
98
+ * Handles:
99
+ * - Unquoted values: strip inline comments, expand vars
100
+ * - Double-quoted values: unquote, expand vars, preserve inline comments
101
+ * - Single-quoted values: unquote, literal (no expansion, no comment stripping)
102
+ */
103
+ function parseValue(rawValue, env) {
104
+ if (rawValue.length === 0)
105
+ return '';
106
+ // Single-quoted: literal value, no expansion, no inline comments
107
+ if (rawValue.startsWith("'")) {
108
+ const closingQuote = rawValue.indexOf("'", 1);
109
+ if (closingQuote !== -1) {
110
+ return rawValue.slice(1, closingQuote);
111
+ }
112
+ // No closing quote — treat rest as literal
113
+ return rawValue.slice(1);
114
+ }
115
+ // Double-quoted or unquoted: handle inline comments and variable expansion
116
+ // First, strip inline comments from unquoted values
117
+ // (Double-quoted values keep everything inside the quotes, including #)
118
+ let value;
119
+ if (rawValue.startsWith('"')) {
120
+ // Find closing double quote
121
+ const closingQuote = findClosingQuote(rawValue, 0);
122
+ if (closingQuote !== -1) {
123
+ value = rawValue.slice(1, closingQuote);
124
+ // Rest after the closing quote is ignored (could be an inline comment)
125
+ }
126
+ else {
127
+ // No closing quote — treat entire rest as value
128
+ value = rawValue.slice(1);
129
+ }
130
+ }
131
+ else {
132
+ // Unquoted: strip inline comments
133
+ value = stripInlineComment(rawValue);
134
+ }
135
+ // Expand variables
136
+ value = expandVariables(value, env);
137
+ return value;
138
+ }
139
+ /**
140
+ * Find the closing double quote starting from a given position.
141
+ * Handles escaped quotes inside the string.
142
+ */
143
+ function findClosingQuote(s, start) {
144
+ let i = start + 1;
145
+ while (i < s.length) {
146
+ if (s[i] === '\\') {
147
+ i += 2; // Skip escaped character
148
+ continue;
149
+ }
150
+ if (s[i] === '"') {
151
+ return i;
152
+ }
153
+ i++;
154
+ }
155
+ return -1;
156
+ }
157
+ /**
158
+ * Strip inline comments from an unquoted value.
159
+ *
160
+ * A '#' starts a comment UNLESS it's inside:
161
+ * - A quoted string (single or double)
162
+ * - It's escaped (\#)
163
+ */
164
+ function stripInlineComment(value) {
165
+ let result = '';
166
+ let i = 0;
167
+ while (i < value.length) {
168
+ // Escaped character — keep literally
169
+ if (value[i] === '\\' && i + 1 < value.length) {
170
+ result += value[i + 1];
171
+ i += 2;
172
+ continue;
173
+ }
174
+ // Start of a quote — find matching closing quote and include the whole thing
175
+ if (value[i] === "'") {
176
+ const close = value.indexOf("'", i + 1);
177
+ if (close !== -1) {
178
+ result += value.slice(i, close + 1);
179
+ i = close + 1;
180
+ continue;
181
+ }
182
+ // No closing quote — include rest
183
+ result += value.slice(i);
184
+ break;
185
+ }
186
+ if (value[i] === '"') {
187
+ const close = findClosingQuote(value, i);
188
+ if (close !== -1) {
189
+ result += value.slice(i, close + 1);
190
+ i = close + 1;
191
+ continue;
192
+ }
193
+ // No closing quote — include rest
194
+ result += value.slice(i);
195
+ break;
196
+ }
197
+ // Comment start — stop here
198
+ if (value[i] === '#') {
199
+ break;
200
+ }
201
+ result += value[i];
202
+ i++;
203
+ }
204
+ return result.trim();
205
+ }
206
+ /**
207
+ * Expand variable references in a value string.
208
+ *
209
+ * Supports:
210
+ * - $VAR — simple variable reference (ends at non-identifier char)
211
+ * - ${VAR} — explicit variable reference
212
+ * - ${VAR:-default} — with default value if VAR is unset or empty
213
+ *
214
+ * Variables are resolved from:
215
+ * 1. The current file's already-parsed env object
216
+ * 2. process.env as fallback
217
+ */
218
+ function expandVariables(value, env) {
219
+ if (!value.includes('$'))
220
+ return value;
221
+ return value.replace(/\$(?:\{([^}]+)\}|([a-zA-Z_][a-zA-Z0-9_]*))/g, (match, bracedVar, simpleVar) => {
222
+ if (bracedVar !== undefined) {
223
+ // ${VAR} or ${VAR:-default}
224
+ const colonDefaultIndex = bracedVar.indexOf(':-');
225
+ if (colonDefaultIndex !== -1) {
226
+ const varName = bracedVar.slice(0, colonDefaultIndex);
227
+ const defaultValue = bracedVar.slice(colonDefaultIndex + 2);
228
+ // Bash semantics: use default if var is unset OR empty
229
+ const resolved = resolveVar(varName, env);
230
+ if (resolved !== null && resolved !== '')
231
+ return resolved;
232
+ return defaultValue;
233
+ }
234
+ return resolveVar(bracedVar, env) ?? '';
235
+ }
236
+ // $VAR
237
+ return resolveVar(simpleVar, env) ?? '';
238
+ });
239
+ }
240
+ /**
241
+ * Resolve a single variable name from the env object or process.env.
242
+ */
243
+ function resolveVar(varName, env) {
244
+ if (varName in env)
245
+ return env[varName];
246
+ if (varName in process.env)
247
+ return process.env[varName];
248
+ return null;
249
+ }
250
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export declare function setLogLevel(level: LogLevel): void;
3
+ export declare const logger: {
4
+ debug: (message: string, ...args: unknown[]) => void;
5
+ info: (message: string, ...args: unknown[]) => void;
6
+ success: (message: string, ...args: unknown[]) => void;
7
+ warn: (message: string, ...args: unknown[]) => void;
8
+ error: (message: string, ...args: unknown[]) => void;
9
+ highlight: (message: string) => void;
10
+ };
11
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAMD,eAAO,MAAM,MAAM;qBACA,MAAM,WAAW,OAAO,EAAE;oBAM3B,MAAM,WAAW,OAAO,EAAE;uBAMvB,MAAM,WAAW,OAAO,EAAE;oBAM7B,MAAM,WAAW,OAAO,EAAE;qBAMzB,MAAM,WAAW,OAAO,EAAE;yBAMtB,MAAM;CAG5B,CAAC"}
@@ -0,0 +1,45 @@
1
+ import chalk from 'chalk';
2
+ let currentLogLevel = 'info';
3
+ const LOG_LEVELS = {
4
+ debug: 0,
5
+ info: 1,
6
+ warn: 2,
7
+ error: 3,
8
+ };
9
+ export function setLogLevel(level) {
10
+ currentLogLevel = level;
11
+ }
12
+ function shouldLog(level) {
13
+ return LOG_LEVELS[level] >= LOG_LEVELS[currentLogLevel];
14
+ }
15
+ export const logger = {
16
+ debug: (message, ...args) => {
17
+ if (shouldLog('debug')) {
18
+ console.log(chalk.gray(`[debug] ${message}`), ...args);
19
+ }
20
+ },
21
+ info: (message, ...args) => {
22
+ if (shouldLog('info')) {
23
+ console.log(chalk.blue(`ℹ ${message}`), ...args);
24
+ }
25
+ },
26
+ success: (message, ...args) => {
27
+ if (shouldLog('info')) {
28
+ console.log(chalk.green(`✔ ${message}`), ...args);
29
+ }
30
+ },
31
+ warn: (message, ...args) => {
32
+ if (shouldLog('warn')) {
33
+ console.log(chalk.yellow(`⚠ ${message}`), ...args);
34
+ }
35
+ },
36
+ error: (message, ...args) => {
37
+ if (shouldLog('error')) {
38
+ console.error(chalk.red(`✖ ${message}`), ...args);
39
+ }
40
+ },
41
+ highlight: (message) => {
42
+ console.log(chalk.cyan(message));
43
+ },
44
+ };
45
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,IAAI,eAAe,GAAa,MAAM,CAAC;AAEvC,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,eAAe,GAAG,KAAK,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC/C,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,SAAS,EAAE,CAAC,OAAe,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;CACF,CAAC"}