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,476 @@
1
+ /**
2
+ * TrajectoryStore — Stores and retrieves successful agent execution trajectories.
3
+ *
4
+ * A trajectory captures a full agent session: the goal, the plan,
5
+ * what files were touched, what changes were made, and the outcome.
6
+ * This data is stored in a JSON file and indexed via the VectorStore
7
+ * for semantic similarity search.
8
+ *
9
+ * When a new goal arrives, the Orchestrator queries past trajectories
10
+ * and injects similar ones as few-shot examples into agent prompts.
11
+ *
12
+ * File location: ~/.buff/memory/trajectories.json
13
+ */
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { homedir } from 'node:os';
17
+ import { getVectorStore } from './vector-store.js';
18
+ import { embed, EMBEDDING_DIM } from './embedder.js';
19
+ import { logger } from '../utils/logger.js';
20
+ import { scoreTrajectory } from '../learning/scorer.js';
21
+ // ─── Constants ──────────────────────────────────────────────────────────────
22
+ const MEMORY_DIR = join(homedir(), '.buff', 'memory');
23
+ const TRAJECTORIES_PATH = join(MEMORY_DIR, 'trajectories.json');
24
+ const CURRENT_VERSION = 1;
25
+ const MAX_TRAJECTORIES = 500;
26
+ // ─── Helpers ────────────────────────────────────────────────────────────────
27
+ function ensureDir() {
28
+ if (!existsSync(MEMORY_DIR)) {
29
+ mkdirSync(MEMORY_DIR, { recursive: true });
30
+ }
31
+ }
32
+ function readTrajectories() {
33
+ try {
34
+ ensureDir();
35
+ if (!existsSync(TRAJECTORIES_PATH)) {
36
+ return { trajectories: {}, version: CURRENT_VERSION };
37
+ }
38
+ const raw = readFileSync(TRAJECTORIES_PATH, 'utf-8');
39
+ return JSON.parse(raw);
40
+ }
41
+ catch {
42
+ return { trajectories: {}, version: CURRENT_VERSION };
43
+ }
44
+ }
45
+ function writeTrajectories(data) {
46
+ ensureDir();
47
+ writeFileSync(TRAJECTORIES_PATH, JSON.stringify(data, null, 2), 'utf-8');
48
+ }
49
+ /** Generate a unique trajectory ID */
50
+ function generateId() {
51
+ return `traj-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
52
+ }
53
+ /** Simple heuristic to guess a project fingerprint from file changes */
54
+ function guessProjectFingerprint(fileChanges) {
55
+ const paths = fileChanges.map((c) => c.path);
56
+ const allExtensions = paths
57
+ .map((p) => p.slice(p.lastIndexOf('.')))
58
+ .filter(Boolean);
59
+ const extSet = new Set(allExtensions);
60
+ const tags = [];
61
+ if (extSet.has('.ts') || extSet.has('.tsx'))
62
+ tags.push('typescript');
63
+ if (extSet.has('.js') || extSet.has('.jsx'))
64
+ tags.push('javascript');
65
+ if (extSet.has('.py'))
66
+ tags.push('python');
67
+ if (extSet.has('.go'))
68
+ tags.push('go');
69
+ if (extSet.has('.rs'))
70
+ tags.push('rust');
71
+ if (extSet.has('.json'))
72
+ tags.push('json');
73
+ if (paths.some((p) => p.includes('package.json')))
74
+ tags.push('node');
75
+ if (paths.some((p) => p.includes('Dockerfile')))
76
+ tags.push('docker');
77
+ return tags.length > 0 ? tags.join(', ') : 'unknown';
78
+ }
79
+ // ─── TrajectoryStore ────────────────────────────────────────────────────────
80
+ /**
81
+ * Manages the storage and retrieval of agent execution trajectories.
82
+ */
83
+ export class TrajectoryStore {
84
+ /**
85
+ * Save a successful orchestration result as a trajectory.
86
+ * Also indexes it in the VectorStore for semantic search.
87
+ *
88
+ * @param result The orchestration result to save
89
+ * @param callLLM LLM function for generating the embedding vector
90
+ * @param taskPlan The original task plan steps
91
+ * @returns The trajectory ID
92
+ */
93
+ async save(result, callLLM, taskPlan, contextFiles) {
94
+ // Only save successful trajectories
95
+ if (!result.success)
96
+ return '';
97
+ const data = readTrajectories();
98
+ // Prune old trajectories if we're at the limit
99
+ this.pruneIfNeeded(data);
100
+ const id = generateId();
101
+ const trajectory = {
102
+ id,
103
+ goal: result.goal,
104
+ projectFingerprint: '', // Will be set below after parsing file changes
105
+ taskPlan: taskPlan.map((s) => ({
106
+ id: s.id,
107
+ description: s.description,
108
+ agentType: s.agentType,
109
+ })),
110
+ contextFiles,
111
+ fileChanges: result.fileChanges
112
+ .split('\n')
113
+ .filter((l) => l.includes('📄') || l.includes('✏️') || l.includes('🗑️'))
114
+ .map((l) => {
115
+ const match = l.match(/[✏️📄🗑️]\s+(.+?)\s+\((.*?)\)/);
116
+ return match
117
+ ? { path: match[1], status: match[2] }
118
+ : { path: l.trim(), status: 'modified' };
119
+ }),
120
+ tasksCompleted: result.tasksCompleted,
121
+ tasksTotal: result.tasksTotal,
122
+ // Use the heuristic scorer for a more nuanced quality score
123
+ score: scoreTrajectory({
124
+ tasksCompleted: result.tasksCompleted,
125
+ tasksTotal: result.tasksTotal,
126
+ reviewPassed: result.success && !result.error,
127
+ totalSteps: taskPlan.length,
128
+ }).total,
129
+ timestamp: Date.now(),
130
+ };
131
+ // Compute the project fingerprint from real file changes
132
+ trajectory.projectFingerprint = guessProjectFingerprint(trajectory.fileChanges.map((fc) => ({
133
+ path: fc.path,
134
+ status: fc.status,
135
+ })));
136
+ // Store the trajectory
137
+ data.trajectories[id] = trajectory;
138
+ writeTrajectories(data);
139
+ // Generate embedding and index in VectorStore
140
+ // Uses native embeddings (Tier 1/Xenova) if available, falls back to LLM
141
+ try {
142
+ const embeddingText = this.buildEmbeddingText(trajectory);
143
+ const vector = await embed(embeddingText, callLLM);
144
+ // Check if embedding succeeded (non-zero vector)
145
+ if (vector.some((v) => v !== 0)) {
146
+ const vs = getVectorStore();
147
+ await vs.insert(id, vector, {
148
+ goal: trajectory.goal,
149
+ projectFingerprint: trajectory.projectFingerprint,
150
+ score: trajectory.score,
151
+ timestamp: trajectory.timestamp,
152
+ });
153
+ logger.debug(`Indexed trajectory ${id} in vector store (${EMBEDDING_DIM} dim)`);
154
+ }
155
+ else {
156
+ logger.debug(`Skipping vector index for ${id}: zero vector (embedding failed)`);
157
+ }
158
+ }
159
+ catch (err) {
160
+ // Non-fatal: trajectory is stored but not indexed for search
161
+ logger.debug(`Failed to index trajectory ${id}: ${err}`);
162
+ }
163
+ return id;
164
+ }
165
+ /**
166
+ * Retrieve a single trajectory by ID.
167
+ */
168
+ async get(id) {
169
+ const data = readTrajectories();
170
+ return data.trajectories[id] || null;
171
+ }
172
+ /**
173
+ * Search for trajectories similar to a goal.
174
+ *
175
+ * @param goal The goal text to search by
176
+ * @param callLLM LLM function for generating the query embedding
177
+ * @param k Maximum number of results
178
+ * @returns Array of trajectories sorted by relevance
179
+ */
180
+ async searchByGoal(goal, callLLM, k = 3) {
181
+ try {
182
+ // Generate embedding for the query
183
+ const queryPrompt = `Search query for past agent trajectories: ${goal}`;
184
+ const queryVector = await embed(queryPrompt, callLLM);
185
+ // Skip search if we got a zero vector (embedding failed)
186
+ if (queryVector.every((v) => v === 0))
187
+ return [];
188
+ // Search the vector index
189
+ const vs = getVectorStore();
190
+ const results = await vs.search(queryVector, k, (entry) => {
191
+ const score = entry.metadata.score || 0;
192
+ return score >= 0.5; // Only retrieve quality trajectories
193
+ });
194
+ // Load full trajectories from the store
195
+ const trajectories = [];
196
+ const data = readTrajectories();
197
+ for (const { entry, similarity } of results) {
198
+ const traj = data.trajectories[entry.id];
199
+ if (traj && similarity > 0.3) {
200
+ trajectories.push(traj);
201
+ }
202
+ }
203
+ return trajectories;
204
+ }
205
+ catch (err) {
206
+ logger.debug(`Trajectory search failed: ${err}`);
207
+ return [];
208
+ }
209
+ }
210
+ /**
211
+ * Format trajectories as few-shot examples for agent prompts.
212
+ * Truncates plans to the first 5 steps to save token budget.
213
+ * Returns a string that can be injected into the PlannerAgent's prompt.
214
+ */
215
+ formatAsFewShot(trajectories) {
216
+ if (trajectories.length === 0)
217
+ return '';
218
+ const MAX_STEPS_PER_TRAJECTORY = 5;
219
+ const parts = trajectories.map((t, i) => {
220
+ // Truncate long plans to save tokens in the prompt
221
+ const truncatedPlan = t.taskPlan.slice(0, MAX_STEPS_PER_TRAJECTORY);
222
+ const stepsJson = JSON.stringify(truncatedPlan, null, 2);
223
+ const truncatedNote = t.taskPlan.length > MAX_STEPS_PER_TRAJECTORY
224
+ ? `\n (... and ${t.taskPlan.length - MAX_STEPS_PER_TRAJECTORY} more steps)`
225
+ : '';
226
+ return `## Similar Past Task ${i + 1}\nGoal: ${t.goal}\nProject: ${t.projectFingerprint}\nPlan:\n${stepsJson}${truncatedNote}\nFiles changed: ${t.fileChanges.map((fc) => fc.path).join(', ')}\n`;
227
+ });
228
+ return `\n---\nHere are examples of how similar goals were decomposed into execution plans in the past. Use them as reference for creating the plan for the current goal.\n\n${parts.join('\n')}\n---\n`;
229
+ }
230
+ /**
231
+ * Get statistics about stored trajectories.
232
+ */
233
+ async stats() {
234
+ const data = readTrajectories();
235
+ const trajectories = Object.values(data.trajectories);
236
+ const avgScore = trajectories.length > 0
237
+ ? trajectories.reduce((sum, t) => sum + t.score, 0) / trajectories.length
238
+ : 0;
239
+ const byProjectFingerprint = {};
240
+ for (const t of trajectories) {
241
+ const fp = t.projectFingerprint || 'unknown';
242
+ byProjectFingerprint[fp] = (byProjectFingerprint[fp] || 0) + 1;
243
+ }
244
+ return {
245
+ total: trajectories.length,
246
+ avgScore: Math.round(avgScore * 100) / 100,
247
+ byProjectFingerprint,
248
+ };
249
+ }
250
+ /**
251
+ * Get all stored trajectories.
252
+ */
253
+ getAll() {
254
+ const data = readTrajectories();
255
+ return Object.values(data.trajectories);
256
+ }
257
+ /**
258
+ * Clear all trajectories.
259
+ */
260
+ async clear() {
261
+ writeTrajectories({ trajectories: {}, version: CURRENT_VERSION });
262
+ const vs = getVectorStore();
263
+ await vs.clear();
264
+ }
265
+ // ─── Private Helpers ────────────────────────────────────────────────────
266
+ /**
267
+ * Build text to generate an embedding for a trajectory.
268
+ */
269
+ buildEmbeddingText(trajectory) {
270
+ return [
271
+ `Goal: ${trajectory.goal}`,
272
+ `Project: ${trajectory.projectFingerprint}`,
273
+ `Steps: ${trajectory.taskPlan.map((s) => `${s.agentType}: ${s.description}`).join('; ')}`,
274
+ `Files: ${trajectory.fileChanges.map((fc) => fc.path).join(', ')}`,
275
+ ].join('\n');
276
+ }
277
+ /**
278
+ * Remove oldest trajectories when the store exceeds MAX_TRAJECTORIES.
279
+ */
280
+ pruneIfNeeded(data) {
281
+ const entries = Object.entries(data.trajectories);
282
+ if (entries.length < MAX_TRAJECTORIES)
283
+ return;
284
+ // Sort by timestamp (oldest first), remove excess
285
+ const sorted = entries.sort(([, a], [, b]) => a.timestamp - b.timestamp);
286
+ const toRemove = sorted.slice(0, entries.length - MAX_TRAJECTORIES + 10);
287
+ // Remove from trajectory store AND vector index to avoid orphaned entries
288
+ for (const [id] of toRemove) {
289
+ delete data.trajectories[id];
290
+ // Async cleanup — fire and forget (non-critical)
291
+ getVectorStore().delete(id).catch(() => { });
292
+ }
293
+ }
294
+ // ────────────────────────────────────────────────────────────────────
295
+ // Phase 2.6: Memory Compression & Pruning
296
+ // ────────────────────────────────────────────────────────────────────
297
+ /**
298
+ * Summarize old trajectories by merging multiple low-scoring or old
299
+ * trajectories into a single compact representation.
300
+ *
301
+ * Summarization replaces a group of similar old trajectories with a
302
+ * single aggregated entry that retains the most important information
303
+ * (goal, file patterns, common steps) while discarding individual details.
304
+ *
305
+ * @param retentionDays Keep original trajectories newer than this (default: 7)
306
+ * @param verbose Log summarization details
307
+ * @returns Number of trajectories summarized/removed
308
+ */
309
+ async summarize(retentionDays = 7, verbose = false) {
310
+ const data = readTrajectories();
311
+ const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
312
+ // Get trajectories older than retention period, grouped by project fingerprint
313
+ const oldTrajectories = Object.entries(data.trajectories)
314
+ .filter(([, t]) => t.timestamp < cutoff)
315
+ .sort(([, a], [, b]) => b.score - a.score); // Higher scores first
316
+ if (oldTrajectories.length < 3) {
317
+ if (verbose)
318
+ logger.info(`Only ${oldTrajectories.length} old trajectories — skipping summarization (need 3+)`);
319
+ return { summarized: 0, merged: 0 };
320
+ }
321
+ // Group by project fingerprint for merging
322
+ const groups = new Map();
323
+ for (const [id, traj] of oldTrajectories) {
324
+ const key = traj.projectFingerprint || 'unknown';
325
+ if (!groups.has(key))
326
+ groups.set(key, []);
327
+ groups.get(key).push([id, traj]);
328
+ }
329
+ let summarized = 0;
330
+ let merged = 0;
331
+ // For each group, keep the highest-scoring trajectory and summarize the rest
332
+ for (const [fingerprint, group] of groups) {
333
+ if (group.length < 2)
334
+ continue;
335
+ // Keep the highest-scoring trajectory as the representative
336
+ const [bestId, bestTraj] = group[0];
337
+ const rest = group.slice(1);
338
+ // Update the best trajectory to encompass the group
339
+ bestTraj.goal = `[Summarized] ${bestTraj.goal} (+${rest.length} similar tasks)`;
340
+ bestTraj.taskPlan = bestTraj.taskPlan.slice(0, 3); // Keep only first 3 steps
341
+ bestTraj.fileChanges = this.mergeFileChanges(bestTraj.fileChanges, rest.map(([, t]) => t.fileChanges).flat());
342
+ bestTraj.contextFiles = [
343
+ ...new Set([...bestTraj.contextFiles, ...rest.map(([, t]) => t.contextFiles).flat()]),
344
+ ];
345
+ bestTraj.score = Math.min(1.0, bestTraj.score + 0.05); // Small bonus for being representative
346
+ bestTraj.tasksCompleted = bestTraj.tasksCompleted + rest.reduce((s, [, t]) => s + t.tasksCompleted, 0);
347
+ bestTraj.tasksTotal = bestTraj.tasksTotal + rest.reduce((s, [, t]) => s + t.tasksTotal, 0);
348
+ // Remove the rest
349
+ for (const [id] of rest) {
350
+ delete data.trajectories[id];
351
+ getVectorStore().delete(id).catch(() => { });
352
+ merged++;
353
+ }
354
+ summarized++;
355
+ if (verbose) {
356
+ logger.info(`Summarized ${rest.length + 1} '${fingerprint}' trajectories into 1 (kept: ${bestId.slice(0, 16)}...)`);
357
+ }
358
+ }
359
+ writeTrajectories(data);
360
+ return { summarized, merged };
361
+ }
362
+ /**
363
+ * Merge file changes from multiple trajectories into a unique set,
364
+ * preferring 'modified' status over 'read' etc.
365
+ */
366
+ mergeFileChanges(primary, secondary) {
367
+ const seen = new Map();
368
+ // Status priority: modified > created > deleted > read
369
+ const statusPriority = {
370
+ modified: 3,
371
+ created: 2,
372
+ deleted: 1,
373
+ read: 0,
374
+ };
375
+ for (const fc of [...primary, ...secondary]) {
376
+ const existing = seen.get(fc.path);
377
+ const existingPrio = existing ? (statusPriority[existing] ?? 0) : -1;
378
+ const newPrio = statusPriority[fc.status] ?? 0;
379
+ if (newPrio > existingPrio) {
380
+ seen.set(fc.path, fc.status);
381
+ }
382
+ }
383
+ return Array.from(seen.entries()).map(([path, status]) => ({ path, status }));
384
+ }
385
+ /**
386
+ * Prune trajectories based on configurable retention policy.
387
+ *
388
+ * @param maxAgeDays Remove trajectories older than this (default: 90)
389
+ * @param minScore Remove trajectories with score below this (default: 0.1)
390
+ * @param maxTrajectories Maximum number to keep (default: 500)
391
+ * @param verbose Log pruning details
392
+ * @returns Number of trajectories removed
393
+ */
394
+ pruneByPolicy(maxAgeDays = 90, minScore = 0.1, maxTrajectories = 500, verbose = false) {
395
+ const data = readTrajectories();
396
+ const before = Object.keys(data.trajectories).length;
397
+ const now = Date.now();
398
+ const ageCutoff = now - maxAgeDays * 24 * 60 * 60 * 1000;
399
+ let removed = 0;
400
+ // Remove by age
401
+ for (const [id, traj] of Object.entries(data.trajectories)) {
402
+ if (traj.timestamp < ageCutoff) {
403
+ delete data.trajectories[id];
404
+ getVectorStore().delete(id).catch(() => { });
405
+ removed++;
406
+ if (verbose) {
407
+ logger.debug(`Removed old trajectory ${id.slice(0, 16)}... (age exceeds ${maxAgeDays}d)`);
408
+ }
409
+ }
410
+ }
411
+ // Remove by score
412
+ for (const [id, traj] of Object.entries(data.trajectories)) {
413
+ if (traj.score < minScore) {
414
+ delete data.trajectories[id];
415
+ getVectorStore().delete(id).catch(() => { });
416
+ removed++;
417
+ if (verbose) {
418
+ logger.debug(`Removed low-quality trajectory ${id.slice(0, 16)}... (score: ${traj.score.toFixed(2)})`);
419
+ }
420
+ }
421
+ }
422
+ // Enforce max count
423
+ const entries = Object.entries(data.trajectories);
424
+ if (entries.length > maxTrajectories) {
425
+ const sorted = entries.sort(([, a], [, b]) => a.score - b.score);
426
+ const toRemove = sorted.slice(0, entries.length - maxTrajectories);
427
+ for (const [id] of toRemove) {
428
+ delete data.trajectories[id];
429
+ getVectorStore().delete(id).catch(() => { });
430
+ removed++;
431
+ }
432
+ }
433
+ if (removed > 0) {
434
+ writeTrajectories(data);
435
+ }
436
+ return removed;
437
+ }
438
+ /**
439
+ * Get compression statistics showing memory usage and optimization potential.
440
+ */
441
+ getCompressionStats() {
442
+ const data = readTrajectories();
443
+ const trajs = Object.values(data.trajectories);
444
+ const now = Date.now();
445
+ const thirtyDaysAgo = now - 30 * 24 * 60 * 60 * 1000;
446
+ const oldTrajectories = trajs.filter((t) => t.timestamp < thirtyDaysAgo).length;
447
+ const lowScoreTrajectories = trajs.filter((t) => t.score < 0.3).length;
448
+ // Count mergeable groups (2+ trajectories with same fingerprint)
449
+ const fingerprintCounts = new Map();
450
+ for (const t of trajs) {
451
+ const key = t.projectFingerprint || 'unknown';
452
+ fingerprintCounts.set(key, (fingerprintCounts.get(key) || 0) + 1);
453
+ }
454
+ const mergeableGroups = Array.from(fingerprintCounts.values()).filter((c) => c >= 2).length;
455
+ // Estimate size (rough: ~2KB per trajectory)
456
+ const totalSizeBytes = trajs.length * 2048;
457
+ const reductionEstimate = Math.min(100, Math.round(((oldTrajectories + lowScoreTrajectories * 0.5) / Math.max(1, trajs.length)) * 100));
458
+ return {
459
+ totalTrajectories: trajs.length,
460
+ totalSizeBytes,
461
+ oldTrajectories,
462
+ lowScoreTrajectories,
463
+ mergeableGroups,
464
+ estimatedOptimization: `~${reductionEstimate}% reduction possible`,
465
+ };
466
+ }
467
+ }
468
+ // Singleton instance
469
+ let storeInstance = null;
470
+ export function getTrajectoryStore() {
471
+ if (!storeInstance) {
472
+ storeInstance = new TrajectoryStore();
473
+ }
474
+ return storeInstance;
475
+ }
476
+ //# sourceMappingURL=trajectory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trajectory-store.js","sourceRoot":"","sources":["../../src/memory/trajectory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * VectorStore — A lightweight, JSON-based vector index with cosine similarity search.
3
+ *
4
+ * Stores embeddings as `{ id, vector, metadata }` entries in a single JSON file.
5
+ * No external dependencies — uses only Node.js built-in fs and crypto.
6
+ *
7
+ * File location: ~/.buff/memory/vectors.json
8
+ */
9
+ /** A single entry in the vector index */
10
+ export interface VectorEntry {
11
+ /** Unique identifier for this entry */
12
+ id: string;
13
+ /** The embedding vector (array of numbers) */
14
+ vector: number[];
15
+ /** Arbitrary metadata for filtering/display */
16
+ metadata: Record<string, unknown>;
17
+ /** Timestamp when this entry was created */
18
+ createdAt: number;
19
+ }
20
+ /**
21
+ * Compute cosine similarity between two vectors.
22
+ * Returns a value between -1 and 1 (higher = more similar).
23
+ */
24
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
25
+ /**
26
+ * Lightweight vector store for semantic search.
27
+ *
28
+ * Usage:
29
+ * ```ts
30
+ * const store = new VectorStore();
31
+ * await store.insert("traj-001", [0.1, 0.2, ...], { goal: "add auth" });
32
+ * const results = await store.search([0.15, 0.25, ...], 3);
33
+ * ```
34
+ */
35
+ export declare class VectorStore {
36
+ /**
37
+ * Insert a vector entry into the index.
38
+ * If an entry with the same `id` already exists, it is overwritten.
39
+ */
40
+ insert(id: string, vector: number[], metadata?: Record<string, unknown>): Promise<void>;
41
+ /**
42
+ * Retrieve a single entry by ID.
43
+ */
44
+ get(id: string): Promise<VectorEntry | null>;
45
+ /**
46
+ * Remove an entry from the index.
47
+ */
48
+ delete(id: string): Promise<boolean>;
49
+ /**
50
+ * Search for the top-k most similar entries to the query vector.
51
+ * Returns results sorted by similarity (highest first).
52
+ */
53
+ search(queryVector: number[], k?: number, filterFn?: (entry: VectorEntry) => boolean): Promise<Array<{
54
+ entry: VectorEntry;
55
+ similarity: number;
56
+ }>>;
57
+ /**
58
+ * Get the total number of stored entries.
59
+ */
60
+ count(): Promise<number>;
61
+ /**
62
+ * Clear all entries from the index.
63
+ */
64
+ clear(): Promise<void>;
65
+ /**
66
+ * Get all entries (for iteration/export).
67
+ */
68
+ getAll(): Promise<VectorEntry[]>;
69
+ /**
70
+ * Get vector store statistics.
71
+ */
72
+ stats(): {
73
+ totalEntries: number;
74
+ dimensions: number;
75
+ };
76
+ }
77
+ export declare function getVectorStore(): VectorStore;
78
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/memory/vector-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AA2ED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAOjE;AAID;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB;;;OAGG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjG;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKlD;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ1C;;;OAGG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EAAE,EACrB,CAAC,GAAE,MAAU,EACb,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,GACzC,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAiB7D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtC;;OAEG;IACH,KAAK,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAStD;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}