onbuzz 4.7.2 → 4.8.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 (990) hide show
  1. package/package.json +1 -1
  2. package/scripts/grounding-bench/bench.mjs +300 -0
  3. package/scripts/grounding-bench/cases.js +173 -0
  4. package/scripts/grounding-bench/imageBuilder.js +119 -0
  5. package/src/core/__tests__/agentScheduler.test.js +74 -0
  6. package/src/core/agentScheduler.js +59 -5
  7. package/src/index.js +36 -0
  8. package/src/interfaces/webServer.js +42 -0
  9. package/src/services/__tests__/memoryService.test.js +521 -450
  10. package/src/services/__tests__/modelRouterNaming.test.js +93 -0
  11. package/src/services/__tests__/modelRouterService.test.js +477 -388
  12. package/src/services/aiService.js +136 -1
  13. package/src/services/grounding/GroundingModel.js +116 -0
  14. package/src/services/grounding/KimiAdapter.js +427 -0
  15. package/src/services/grounding/MockAdapter.js +125 -0
  16. package/src/services/grounding/__tests__/KimiAdapter.test.js +475 -0
  17. package/src/services/grounding/__tests__/MockAdapter.test.js +66 -0
  18. package/src/services/grounding/__tests__/groundingMetrics.test.js +156 -0
  19. package/src/services/grounding/__tests__/registry.test.js +122 -0
  20. package/src/services/grounding/constants.js +121 -0
  21. package/src/services/grounding/groundingMetrics.js +121 -0
  22. package/src/services/grounding/index.js +53 -0
  23. package/src/services/grounding/registry.js +125 -0
  24. package/src/services/grounding/types.js +108 -0
  25. package/src/services/memoryService.js +559 -521
  26. package/src/services/modelRouterService.js +433 -364
  27. package/src/services/tokenCountingService.js +2 -2
  28. package/src/tools/__tests__/agentCommunicationTool.test.js +752 -717
  29. package/src/tools/__tests__/baseTool.test.js +22 -0
  30. package/src/tools/__tests__/codeMapTool.test.js +388 -0
  31. package/src/tools/__tests__/foundryWebSearchTool.test.js +252 -0
  32. package/src/tools/__tests__/memoryTool.reminisce.test.js +364 -363
  33. package/src/tools/__tests__/memoryTool.test.js +391 -297
  34. package/src/tools/__tests__/parserHelpers.test.js +233 -0
  35. package/src/tools/__tests__/webTool.e2e.test.js +13 -1
  36. package/src/tools/agentCommunicationTool.js +1399 -1385
  37. package/src/tools/baseTool.js +19 -4
  38. package/src/tools/codeMapTool.js +794 -130
  39. package/src/tools/desktop/DesktopTool.js +638 -0
  40. package/src/tools/desktop/__tests__/DesktopTool.e2e.test.js +306 -0
  41. package/src/tools/desktop/__tests__/DesktopTool.test.js +507 -0
  42. package/src/tools/desktop/__tests__/osCapabilities.test.js +106 -0
  43. package/src/tools/desktop/__tests__/osController.test.js +364 -0
  44. package/src/tools/desktop/osCapabilities.js +248 -0
  45. package/src/tools/desktop/osController.js +491 -0
  46. package/src/tools/foundryWebSearchTool.js +273 -0
  47. package/src/tools/memoryTool.js +892 -820
  48. package/src/tools/parserHelpers.js +296 -0
  49. package/src/utilities/__tests__/planInjection.test.js +125 -0
  50. package/src/utilities/__tests__/tagParser.test.js +943 -887
  51. package/src/utilities/constants.js +1 -1
  52. package/src/utilities/planInjection.js +103 -0
  53. package/src/utilities/tagParser.js +918 -896
  54. package/web-ui/build/index.html +2 -2
  55. package/web-ui/build/static/1c-DGpIT7i5.js +1 -0
  56. package/web-ui/build/static/abap-5wFDdWLh.js +1 -0
  57. package/web-ui/build/static/abnf-BP1dpNSE.js +1 -0
  58. package/web-ui/build/static/abnf-DBEIAl8g.js +1 -0
  59. package/web-ui/build/static/accesslog-CWSM_T5E.js +1 -0
  60. package/web-ui/build/static/actionscript-DONkco1J.js +1 -0
  61. package/web-ui/build/static/actionscript-FqBYk5er.js +1 -0
  62. package/web-ui/build/static/ada-C2JLRIaM.js +1 -0
  63. package/web-ui/build/static/ada-gKiygTRK.js +1 -0
  64. package/web-ui/build/static/agda-CkSODqK2.js +1 -0
  65. package/web-ui/build/static/al-BJ_YR6p7.js +1 -0
  66. package/web-ui/build/static/angelscript-Dg2byMGg.js +1 -0
  67. package/web-ui/build/static/antlr4-BnpyaFNr.js +1 -0
  68. package/web-ui/build/static/apache-Dffxsd7O.js +1 -0
  69. package/web-ui/build/static/apacheconf-DLitjtWj.js +1 -0
  70. package/web-ui/build/static/apex-Drr_IvU2.js +1 -0
  71. package/web-ui/build/static/apl-CF6qxmXG.js +1 -0
  72. package/web-ui/build/static/applescript-CjOlw3b_.js +1 -0
  73. package/web-ui/build/static/applescript-DjkSl1Ry.js +1 -0
  74. package/web-ui/build/static/aql-KwVmK1gP.js +1 -0
  75. package/web-ui/build/static/arcade-CENSXx0R.js +1 -0
  76. package/web-ui/build/static/arduino-B3Ta9Fll.js +1 -0
  77. package/web-ui/build/static/arduino-CzcsaB9_.js +1 -0
  78. package/web-ui/build/static/arff-CMJSVt_O.js +1 -0
  79. package/web-ui/build/static/armasm-0zSgSPB4.js +1 -0
  80. package/web-ui/build/static/asciidoc-B8K5ctWq.js +1 -0
  81. package/web-ui/build/static/asciidoc-bk2Sg6b6.js +1 -0
  82. package/web-ui/build/static/asm6502-ji6zm4FQ.js +1 -0
  83. package/web-ui/build/static/asmatmel-DJqObM4Y.js +1 -0
  84. package/web-ui/build/static/aspectj-DqQKI7J5.js +1 -0
  85. package/web-ui/build/static/aspnet-9cenTxW7.js +1 -0
  86. package/web-ui/build/static/autohotkey-C6EhiZvl.js +1 -0
  87. package/web-ui/build/static/autohotkey-sTGJOvMM.js +1 -0
  88. package/web-ui/build/static/autoit-B0Im8iQ1.js +1 -0
  89. package/web-ui/build/static/autoit-CO6pUD0H.js +1 -0
  90. package/web-ui/build/static/avisynth-OvOHTfj5.js +1 -0
  91. package/web-ui/build/static/avrasm-BLWZ5Mye.js +1 -0
  92. package/web-ui/build/static/avro-idl-BB2ODvnw.js +1 -0
  93. package/web-ui/build/static/awk-_jhMabQ0.js +1 -0
  94. package/web-ui/build/static/axapta-DdBRgoYy.js +1 -0
  95. package/web-ui/build/static/bash-CsaRGXBQ.js +1 -0
  96. package/web-ui/build/static/bash-CxLFkwAC.js +1 -0
  97. package/web-ui/build/static/basic-BJyy7JJE.js +1 -0
  98. package/web-ui/build/static/basic-CrMb-gv0.js +1 -0
  99. package/web-ui/build/static/batch-BvcykMe5.js +1 -0
  100. package/web-ui/build/static/bbcode-EOBuY5Y6.js +1 -0
  101. package/web-ui/build/static/bicep-QkDJBA34.js +1 -0
  102. package/web-ui/build/static/birb-TAOxKurn.js +1 -0
  103. package/web-ui/build/static/bison-BEK6cnad.js +1 -0
  104. package/web-ui/build/static/bnf-DfEODxsr.js +1 -0
  105. package/web-ui/build/static/bnf-DhbMjsuA.js +1 -0
  106. package/web-ui/build/static/brainfuck-BoVocOa7.js +1 -0
  107. package/web-ui/build/static/brainfuck-DDC5QXPK.js +1 -0
  108. package/web-ui/build/static/brightscript-DNN598w2.js +1 -0
  109. package/web-ui/build/static/bro-Cn_jjZ8P.js +1 -0
  110. package/web-ui/build/static/bsl-CMCN75Gu.js +1 -0
  111. package/web-ui/build/static/c-DbOGQnEJ.js +1 -0
  112. package/web-ui/build/static/c-kggwYFsy.js +1 -0
  113. package/web-ui/build/static/c-like-BIsuUvof.js +1 -0
  114. package/web-ui/build/static/cal-DpgMsBZE.js +1 -0
  115. package/web-ui/build/static/capnproto-C1AHYI-M.js +1 -0
  116. package/web-ui/build/static/ceylon-pvJffDe1.js +1 -0
  117. package/web-ui/build/static/cfscript-C1qylu52.js +1 -0
  118. package/web-ui/build/static/chaiscript-D417WKRI.js +1 -0
  119. package/web-ui/build/static/cil-CjbZHbcY.js +1 -0
  120. package/web-ui/build/static/clean-Dvc6R-F2.js +1 -0
  121. package/web-ui/build/static/clojure-CSVRQPMQ.js +1 -0
  122. package/web-ui/build/static/clojure-ig1Vkg7X.js +1 -0
  123. package/web-ui/build/static/clojure-repl-C1uyEabk.js +1 -0
  124. package/web-ui/build/static/cmake-DSbVcAB3.js +1 -0
  125. package/web-ui/build/static/cmake-Zp8kPwnH.js +1 -0
  126. package/web-ui/build/static/cobol-OsZSiK_P.js +1 -0
  127. package/web-ui/build/static/coffeescript-D8r0416S.js +1 -0
  128. package/web-ui/build/static/coffeescript-DCpgClxh.js +1 -0
  129. package/web-ui/build/static/concurnas-DKnsxUOc.js +1 -0
  130. package/web-ui/build/static/coq-BQFlywVI.js +1 -0
  131. package/web-ui/build/static/coq-BvS9mQB2.js +1 -0
  132. package/web-ui/build/static/cos-D3ze2791.js +1 -0
  133. package/web-ui/build/static/cpp-Bw-cV3P1.js +1 -0
  134. package/web-ui/build/static/cpp-vi1p7XpB.js +1 -0
  135. package/web-ui/build/static/crmsh-BClnJTeQ.js +1 -0
  136. package/web-ui/build/static/crystal-DGzOUYZq.js +1 -0
  137. package/web-ui/build/static/crystal-DMzk6EvA.js +1 -0
  138. package/web-ui/build/static/csharp-BTom8s2X.js +1 -0
  139. package/web-ui/build/static/csharp-Cp2V3jfR.js +1 -0
  140. package/web-ui/build/static/cshtml-Dmtt9Kto.js +1 -0
  141. package/web-ui/build/static/csp-WPVsLe9_.js +1 -0
  142. package/web-ui/build/static/csp-qddj5fu_.js +1 -0
  143. package/web-ui/build/static/css-B0FAm7kj.js +1 -0
  144. package/web-ui/build/static/css-extras-Bx3pvjiG.js +1 -0
  145. package/web-ui/build/static/csv-CH-edgS5.js +1 -0
  146. package/web-ui/build/static/cypher-c3G8Leew.js +1 -0
  147. package/web-ui/build/static/d-BMDSy22_.js +1 -0
  148. package/web-ui/build/static/d-BdH4oW8-.js +1 -0
  149. package/web-ui/build/static/dart-C-r72q-O.js +1 -0
  150. package/web-ui/build/static/dart-CwpBMrKa.js +1 -0
  151. package/web-ui/build/static/dataweave-BPvqdt4k.js +1 -0
  152. package/web-ui/build/static/dax-Eyy6ixcN.js +1 -0
  153. package/web-ui/build/static/delphi-DhEbPj_5.js +1 -0
  154. package/web-ui/build/static/dhall-Ct1L8sN1.js +1 -0
  155. package/web-ui/build/static/diff-CSTqCgwn.js +1 -0
  156. package/web-ui/build/static/diff-Da97B5vW.js +1 -0
  157. package/web-ui/build/static/django-DGit_lCg.js +1 -0
  158. package/web-ui/build/static/django-DPgqFB8k.js +1 -0
  159. package/web-ui/build/static/dns-DUyXuZ-a.js +1 -0
  160. package/web-ui/build/static/dns-zone-file-D79MDxVG.js +1 -0
  161. package/web-ui/build/static/docker-DTiy4o38.js +1 -0
  162. package/web-ui/build/static/dockerfile-CvwPP8wE.js +1 -0
  163. package/web-ui/build/static/dos-CaIUWxvb.js +1 -0
  164. package/web-ui/build/static/dot-D3504w6Y.js +1 -0
  165. package/web-ui/build/static/dsconfig-Smy1eeX_.js +1 -0
  166. package/web-ui/build/static/dts-DyTYSXZj.js +1 -0
  167. package/web-ui/build/static/dust-CrJyi6qA.js +1 -0
  168. package/web-ui/build/static/ebnf-C8nqfkBH.js +1 -0
  169. package/web-ui/build/static/ebnf-Cuh5Vh2-.js +1 -0
  170. package/web-ui/build/static/editorconfig-C7pTGl6n.js +1 -0
  171. package/web-ui/build/static/eiffel-C75MSJCA.js +1 -0
  172. package/web-ui/build/static/ejs-Dyo7DF5w.js +1 -0
  173. package/web-ui/build/static/elixir-D4yJefOc.js +1 -0
  174. package/web-ui/build/static/elixir-DKRow2SJ.js +1 -0
  175. package/web-ui/build/static/elm-CgbdDlkT.js +1 -0
  176. package/web-ui/build/static/elm-D3N-UgU0.js +1 -0
  177. package/web-ui/build/static/erb-BsITh8qW.js +1 -0
  178. package/web-ui/build/static/erb-lY_LyKyS.js +1 -0
  179. package/web-ui/build/static/erlang-BCnPiYmB.js +1 -0
  180. package/web-ui/build/static/erlang-JEghiPXc.js +1 -0
  181. package/web-ui/build/static/erlang-repl-DzU97ugC.js +1 -0
  182. package/web-ui/build/static/etlua-CsBo8cJa.js +1 -0
  183. package/web-ui/build/static/excel-formula-C2piiCYa.js +1 -0
  184. package/web-ui/build/static/excel-kqNypwQD.js +1 -0
  185. package/web-ui/build/static/factor-DZTOhkyU.js +1 -0
  186. package/web-ui/build/static/false-yLjhfaSw.js +1 -0
  187. package/web-ui/build/static/firestore-security-rules-oaQNoH8l.js +1 -0
  188. package/web-ui/build/static/fix-C9IfnTuS.js +1 -0
  189. package/web-ui/build/static/flix-EmJ_JhPo.js +1 -0
  190. package/web-ui/build/static/flow-DCUl7IAQ.js +1 -0
  191. package/web-ui/build/static/fortran-DvyxJmFN.js +1 -0
  192. package/web-ui/build/static/fortran-EEP9R3S5.js +1 -0
  193. package/web-ui/build/static/fsharp-D_98s3RX.js +1 -0
  194. package/web-ui/build/static/fsharp-Dt9jOO5G.js +1 -0
  195. package/web-ui/build/static/ftl-C8gMHWLo.js +1 -0
  196. package/web-ui/build/static/gams-BHxVPb4z.js +1 -0
  197. package/web-ui/build/static/gap-DFtyHk-q.js +1 -0
  198. package/web-ui/build/static/gauss-BwhJWUcg.js +1 -0
  199. package/web-ui/build/static/gcode-BvmXwp09.js +1 -0
  200. package/web-ui/build/static/gcode-gWcD6Vc7.js +1 -0
  201. package/web-ui/build/static/gdscript-btHoX8RE.js +1 -0
  202. package/web-ui/build/static/gedcom-MgPs9iqh.js +1 -0
  203. package/web-ui/build/static/gherkin-B9c_Q16A.js +1 -0
  204. package/web-ui/build/static/gherkin-BvOgkK6h.js +1 -0
  205. package/web-ui/build/static/git-D9XWOVcQ.js +1 -0
  206. package/web-ui/build/static/glsl-CshBHxHY.js +1 -0
  207. package/web-ui/build/static/glsl-fNRUMTDr.js +1 -0
  208. package/web-ui/build/static/gml-B78deHK8.js +1 -0
  209. package/web-ui/build/static/gml-Cj7d2u8O.js +1 -0
  210. package/web-ui/build/static/gn-CJLD-mF1.js +1 -0
  211. package/web-ui/build/static/go-CT93BEkL.js +1 -0
  212. package/web-ui/build/static/go-CTTlNuQO.js +1 -0
  213. package/web-ui/build/static/go-module-BgnXboUE.js +1 -0
  214. package/web-ui/build/static/golo-2S5tXS-l.js +1 -0
  215. package/web-ui/build/static/gradle-8W8DCcWJ.js +1 -0
  216. package/web-ui/build/static/graphql-DZfp6FNU.js +1 -0
  217. package/web-ui/build/static/groovy-BfsyMb3X.js +1 -0
  218. package/web-ui/build/static/groovy-Dxov7ENz.js +1 -0
  219. package/web-ui/build/static/haml-BlUFsdVV.js +1 -0
  220. package/web-ui/build/static/haml-CjVj6vvW.js +1 -0
  221. package/web-ui/build/static/handlebars-DxrQFkyA.js +1 -0
  222. package/web-ui/build/static/handlebars-FE6fotYl.js +1 -0
  223. package/web-ui/build/static/haskell-B6z0RCD_.js +1 -0
  224. package/web-ui/build/static/haskell-JBFmJTRy.js +1 -0
  225. package/web-ui/build/static/haxe-BtMZMi-_.js +1 -0
  226. package/web-ui/build/static/haxe-C1J8n-fH.js +1 -0
  227. package/web-ui/build/static/hcl-DJP-bFWE.js +1 -0
  228. package/web-ui/build/static/hlsl-DrGjhs1b.js +1 -0
  229. package/web-ui/build/static/hoon-Cg-ZhqIT.js +1 -0
  230. package/web-ui/build/static/hpkp-D07vgmoZ.js +1 -0
  231. package/web-ui/build/static/hsp-CsypPWoA.js +1 -0
  232. package/web-ui/build/static/hsts-B6DMRxvP.js +1 -0
  233. package/web-ui/build/static/htmlbars-BI7_Hw4e.js +1 -0
  234. package/web-ui/build/static/http-90ihEi4s.js +1 -0
  235. package/web-ui/build/static/http-Dp4QXj9E.js +1 -0
  236. package/web-ui/build/static/hy-BMgKvP4K.js +1 -0
  237. package/web-ui/build/static/ichigojam-D6wKvJDb.js +1 -0
  238. package/web-ui/build/static/icon-CrgkmCwl.js +1 -0
  239. package/web-ui/build/static/icu-message-format-Bi2JxCXs.js +1 -0
  240. package/web-ui/build/static/idris-DbUsyZt5.js +1 -0
  241. package/web-ui/build/static/iecst-CQZ9t8fW.js +1 -0
  242. package/web-ui/build/static/ignore-BaFgtNMs.js +1 -0
  243. package/web-ui/build/static/index-DEWSWosh.css +1 -0
  244. package/web-ui/build/static/index-Di1bjCFA.js +13 -0
  245. package/web-ui/build/static/index-otR_WSsL.js +1 -0
  246. package/web-ui/build/static/index-whZPU4as.js +1183 -0
  247. package/web-ui/build/static/inform7-ClyX1Gro.js +1 -0
  248. package/web-ui/build/static/inform7-tZHBS5XP.js +1 -0
  249. package/web-ui/build/static/ini-BrP5JNYL.js +1 -0
  250. package/web-ui/build/static/ini-CVkrAhwV.js +1 -0
  251. package/web-ui/build/static/io-BJ1Y6Bdc.js +1 -0
  252. package/web-ui/build/static/irpf90-fjjcKS_8.js +1 -0
  253. package/web-ui/build/static/isbl-ClpvfUIz.js +1 -0
  254. package/web-ui/build/static/j-CICW77xS.js +1 -0
  255. package/web-ui/build/static/java-B9DFK-0E.js +1 -0
  256. package/web-ui/build/static/java-BL_6rYko.js +1 -0
  257. package/web-ui/build/static/javadoc-Cc4HKpKK.js +1 -0
  258. package/web-ui/build/static/javadoclike-CgNkUDOm.js +1 -0
  259. package/web-ui/build/static/javascript-CM40ZECq.js +1 -0
  260. package/web-ui/build/static/javastacktrace-BHSqXfG5.js +1 -0
  261. package/web-ui/build/static/jboss-cli-Bv5NhVSZ.js +1 -0
  262. package/web-ui/build/static/jexl--Ohk_keA.js +1 -0
  263. package/web-ui/build/static/jolie-DMTN5Vdf.js +1 -0
  264. package/web-ui/build/static/jq-nXRLldXX.js +1 -0
  265. package/web-ui/build/static/js-extras-eLwv3frs.js +1 -0
  266. package/web-ui/build/static/js-templates-Ca0owlrg.js +1 -0
  267. package/web-ui/build/static/jsdoc-KERXp0da.js +1 -0
  268. package/web-ui/build/static/json-BTjLaRsy.js +1 -0
  269. package/web-ui/build/static/json-p7pU0qdW.js +1 -0
  270. package/web-ui/build/static/json5-Cxjy1udc.js +1 -0
  271. package/web-ui/build/static/jsonp-CO52H7Gy.js +1 -0
  272. package/web-ui/build/static/jsstacktrace-8YKfoyJP.js +1 -0
  273. package/web-ui/build/static/jsx-Ct_05KbM.js +1 -0
  274. package/web-ui/build/static/julia-23I1ubCE.js +1 -0
  275. package/web-ui/build/static/julia-d8rVGed_.js +1 -0
  276. package/web-ui/build/static/julia-repl-mwnHedW_.js +1 -0
  277. package/web-ui/build/static/keepalived-E85Rx_fF.js +1 -0
  278. package/web-ui/build/static/keyman-aWd3QUDq.js +1 -0
  279. package/web-ui/build/static/kotlin-Cu370hQq.js +1 -0
  280. package/web-ui/build/static/kotlin-DoJ2WnmZ.js +1 -0
  281. package/web-ui/build/static/kumir-oiOgqcQO.js +1 -0
  282. package/web-ui/build/static/kusto-Bp-B02K5.js +1 -0
  283. package/web-ui/build/static/lasso-BxoQVwOO.js +1 -0
  284. package/web-ui/build/static/latex-CANm5vsX.js +1 -0
  285. package/web-ui/build/static/latex-PMroeNch.js +1 -0
  286. package/web-ui/build/static/latte-2ErU_2XF.js +1 -0
  287. package/web-ui/build/static/ldif-ChPn_F7o.js +1 -0
  288. package/web-ui/build/static/leaf-UkCugDgG.js +1 -0
  289. package/web-ui/build/static/less-CCH5RA89.js +1 -0
  290. package/web-ui/build/static/less-CGZbVU1g.js +1 -0
  291. package/web-ui/build/static/lilypond-BoyM37sv.js +1 -0
  292. package/web-ui/build/static/liquid-DGJVpRBi.js +1 -0
  293. package/web-ui/build/static/lisp-93nne61u.js +1 -0
  294. package/web-ui/build/static/lisp-DYjIRsXz.js +1 -0
  295. package/web-ui/build/static/livecodeserver-CfNaxIE4.js +1 -0
  296. package/web-ui/build/static/livescript-C8kDlQkz.js +1 -0
  297. package/web-ui/build/static/livescript-CoarnRHq.js +1 -0
  298. package/web-ui/build/static/llvm-CBVyNmAh.js +1 -0
  299. package/web-ui/build/static/llvm-DGxq8a7u.js +1 -0
  300. package/web-ui/build/static/log-BivgwFql.js +1 -0
  301. package/web-ui/build/static/lolcode-l5sK2cZz.js +1 -0
  302. package/web-ui/build/static/lsl-Xm44xLRQ.js +1 -0
  303. package/web-ui/build/static/lua-CGvrzfKp.js +1 -0
  304. package/web-ui/build/static/lua-nHwXeY4c.js +1 -0
  305. package/web-ui/build/static/magma-DmNItmna.js +1 -0
  306. package/web-ui/build/static/makefile-CKJNNHGb.js +1 -0
  307. package/web-ui/build/static/makefile-DI6y5Qml.js +1 -0
  308. package/web-ui/build/static/markdown-BgpbxKd-.js +1 -0
  309. package/web-ui/build/static/markdown-CvcxA4yk.js +1 -0
  310. package/web-ui/build/static/markup-templating-DijqesiA.js +1 -0
  311. package/web-ui/build/static/mathematica-Cxll1Q10.js +1 -0
  312. package/web-ui/build/static/matlab-BJo2T1A-.js +1 -0
  313. package/web-ui/build/static/matlab-C6DlZX4l.js +1 -0
  314. package/web-ui/build/static/maxima-DJXO4sbL.js +1 -0
  315. package/web-ui/build/static/maxscript-DdLpUYBs.js +1 -0
  316. package/web-ui/build/static/mel-BIpfnSyZ.js +1 -0
  317. package/web-ui/build/static/mel-BYcTUZJW.js +1 -0
  318. package/web-ui/build/static/mercury-C_LSpbD8.js +1 -0
  319. package/web-ui/build/static/mermaid-D9yBWnrT.js +1 -0
  320. package/web-ui/build/static/mipsasm-nR_K2Ue-.js +1 -0
  321. package/web-ui/build/static/mizar-BeLUPncD.js +1 -0
  322. package/web-ui/build/static/mizar-BesIbZd9.js +1 -0
  323. package/web-ui/build/static/mojolicious-cBx3OWa-.js +1 -0
  324. package/web-ui/build/static/mongodb-DTWKy9ac.js +1 -0
  325. package/web-ui/build/static/monkey-B72bZC3c.js +1 -0
  326. package/web-ui/build/static/monkey-G9XELYPQ.js +1 -0
  327. package/web-ui/build/static/moonscript-BXYVQiqj.js +1 -0
  328. package/web-ui/build/static/moonscript-sDd-5knz.js +1 -0
  329. package/web-ui/build/static/n1ql-0vKSfFAO.js +1 -0
  330. package/web-ui/build/static/n1ql-C9_BSZfz.js +1 -0
  331. package/web-ui/build/static/n4js-B7Ct8dds.js +1 -0
  332. package/web-ui/build/static/nand2tetris-hdl-p9gpphTM.js +1 -0
  333. package/web-ui/build/static/naniscript-6ZVr8Aug.js +1 -0
  334. package/web-ui/build/static/nasm-Ca73yTUt.js +1 -0
  335. package/web-ui/build/static/neon-DNP49oyX.js +1 -0
  336. package/web-ui/build/static/nevod-Qhgt7Bce.js +1 -0
  337. package/web-ui/build/static/nginx-D5e7lu62.js +1 -0
  338. package/web-ui/build/static/nginx-DobnyESB.js +1 -0
  339. package/web-ui/build/static/nim-BPBivUOV.js +1 -0
  340. package/web-ui/build/static/nim-Baoug1Wa.js +1 -0
  341. package/web-ui/build/static/nix-CSPTQs5y.js +1 -0
  342. package/web-ui/build/static/nix-Dk4eNw49.js +1 -0
  343. package/web-ui/build/static/node-repl-NJNL8VFR.js +1 -0
  344. package/web-ui/build/static/nsis-BZ0oMzEw.js +1 -0
  345. package/web-ui/build/static/nsis-CKPCjtCU.js +1 -0
  346. package/web-ui/build/static/objectivec-BkfIRhhV.js +1 -0
  347. package/web-ui/build/static/objectivec-CnQgqhbJ.js +1 -0
  348. package/web-ui/build/static/ocaml-9rGNzRrK.js +1 -0
  349. package/web-ui/build/static/ocaml-CTolCqxL.js +1 -0
  350. package/web-ui/build/static/opencl-9Q3vRDxv.js +1 -0
  351. package/web-ui/build/static/openqasm-D2QiuFBp.js +1 -0
  352. package/web-ui/build/static/openscad-C3HyuzpB.js +1 -0
  353. package/web-ui/build/static/oxygene-4gi-VYy_.js +1 -0
  354. package/web-ui/build/static/oz-BGDEB-1A.js +1 -0
  355. package/web-ui/build/static/parigp-CfZzp1uE.js +1 -0
  356. package/web-ui/build/static/parser-UbGteTcy.js +1 -0
  357. package/web-ui/build/static/parser3-C-Jx-fy7.js +1 -0
  358. package/web-ui/build/static/pascal-D1_R0gW-.js +1 -0
  359. package/web-ui/build/static/pascaligo-B8C-98Np.js +1 -0
  360. package/web-ui/build/static/pcaxis-TGnlUKNs.js +1 -0
  361. package/web-ui/build/static/peoplecode-C5Vf1AH0.js +1 -0
  362. package/web-ui/build/static/perl-CBp1N62T.js +1 -0
  363. package/web-ui/build/static/perl-Z59j904t.js +1 -0
  364. package/web-ui/build/static/pf-Cq8B_xwQ.js +1 -0
  365. package/web-ui/build/static/pgsql-ofJbUHkL.js +1 -0
  366. package/web-ui/build/static/php-OlH7HLQJ.js +1 -0
  367. package/web-ui/build/static/php-extras-GqtrxLuk.js +1 -0
  368. package/web-ui/build/static/php-r09kMDOB.js +1 -0
  369. package/web-ui/build/static/php-template-18uT97Qo.js +1 -0
  370. package/web-ui/build/static/phpdoc-9tRFvup9.js +1 -0
  371. package/web-ui/build/static/plaintext-DsYT6Mu-.js +1 -0
  372. package/web-ui/build/static/plsql-RhWQNJVb.js +1 -0
  373. package/web-ui/build/static/pony-DD6JMLYI.js +1 -0
  374. package/web-ui/build/static/powerquery-CALow-bt.js +1 -0
  375. package/web-ui/build/static/powershell-C2QvIuKF.js +1 -0
  376. package/web-ui/build/static/powershell-yrbJEhCh.js +1 -0
  377. package/web-ui/build/static/processing-1T5w_Q03.js +1 -0
  378. package/web-ui/build/static/processing-DBim_dO-.js +1 -0
  379. package/web-ui/build/static/profile-Cdloh8mZ.js +1 -0
  380. package/web-ui/build/static/prolog-DRSsNnns.js +1 -0
  381. package/web-ui/build/static/prolog-D_ajweDr.js +1 -0
  382. package/web-ui/build/static/promql-BRuwn6Bn.js +1 -0
  383. package/web-ui/build/static/properties-D5Wyl4X4.js +1 -0
  384. package/web-ui/build/static/properties-kn4fl1bl.js +1 -0
  385. package/web-ui/build/static/protobuf-BMO76zWi.js +1 -0
  386. package/web-ui/build/static/protobuf-CTUCF-U-.js +1 -0
  387. package/web-ui/build/static/psl-CiqYdQbY.js +1 -0
  388. package/web-ui/build/static/pug-BLE2Qayj.js +1 -0
  389. package/web-ui/build/static/puppet-CFKLWXft.js +1 -0
  390. package/web-ui/build/static/puppet-DQci0Dl5.js +1 -0
  391. package/web-ui/build/static/pure-D2h_GynV.js +1 -0
  392. package/web-ui/build/static/purebasic-BF8MVw8V.js +1 -0
  393. package/web-ui/build/static/purebasic-BTtHiCkh.js +1 -0
  394. package/web-ui/build/static/purescript-D1ZSh-sH.js +1 -0
  395. package/web-ui/build/static/python-Cp9_Vdhb.js +1 -0
  396. package/web-ui/build/static/python-DdgNw8IW.js +1 -0
  397. package/web-ui/build/static/python-repl-DvK89VMC.js +1 -0
  398. package/web-ui/build/static/q-COaIgwhT.js +1 -0
  399. package/web-ui/build/static/q-Cm0dQkW8.js +1 -0
  400. package/web-ui/build/static/qml-BpsOqqJM.js +1 -0
  401. package/web-ui/build/static/qml-BziQXlU4.js +1 -0
  402. package/web-ui/build/static/qore-Cutz6g-2.js +1 -0
  403. package/web-ui/build/static/qsharp-B16619X1.js +1 -0
  404. package/web-ui/build/static/r-CFUIj5Hd.js +1 -0
  405. package/web-ui/build/static/r-CPrwCi5w.js +1 -0
  406. package/web-ui/build/static/racket-Bh08DFXF.js +1 -0
  407. package/web-ui/build/static/reason-BxjDq4e-.js +1 -0
  408. package/web-ui/build/static/reasonml-Ds5SsGP8.js +1 -0
  409. package/web-ui/build/static/regex-DhBIDIMI.js +1 -0
  410. package/web-ui/build/static/rego-DCwxZXcB.js +1 -0
  411. package/web-ui/build/static/renpy-C2fuQfqb.js +1 -0
  412. package/web-ui/build/static/rest-C52ZpxWQ.js +1 -0
  413. package/web-ui/build/static/rib-Cbl2Mzyj.js +1 -0
  414. package/web-ui/build/static/rip-BTOu5ZIE.js +1 -0
  415. package/web-ui/build/static/roboconf-3Oi2wuVk.js +1 -0
  416. package/web-ui/build/static/roboconf-ndLZLE39.js +1 -0
  417. package/web-ui/build/static/robotframework-BzHXiIj1.js +1 -0
  418. package/web-ui/build/static/routeros-CkpPoqx-.js +1 -0
  419. package/web-ui/build/static/rsl-C0bwOQ38.js +1 -0
  420. package/web-ui/build/static/ruby-C_hIhtuQ.js +1 -0
  421. package/web-ui/build/static/ruby-DvKfZPzj.js +1 -0
  422. package/web-ui/build/static/ruleslanguage-CbZJlddz.js +1 -0
  423. package/web-ui/build/static/rust-BFPIhB-X.js +1 -0
  424. package/web-ui/build/static/rust-sBpUq-qE.js +1 -0
  425. package/web-ui/build/static/sas-BCXvYN9x.js +1 -0
  426. package/web-ui/build/static/sas-D7GAsTY3.js +1 -0
  427. package/web-ui/build/static/sass-BdaErGMN.js +1 -0
  428. package/web-ui/build/static/scala-Cj81oCl9.js +1 -0
  429. package/web-ui/build/static/scala-CvbksfY6.js +1 -0
  430. package/web-ui/build/static/scheme-BM5ZqKnl.js +1 -0
  431. package/web-ui/build/static/scheme-BPvlu9Tk.js +1 -0
  432. package/web-ui/build/static/scilab-CJanLKQN.js +1 -0
  433. package/web-ui/build/static/scss-C53YF_7f.js +1 -0
  434. package/web-ui/build/static/scss-DPp8UZbr.js +1 -0
  435. package/web-ui/build/static/shell-CC9bQXMe.js +1 -0
  436. package/web-ui/build/static/shell-session-CuR3fbf-.js +1 -0
  437. package/web-ui/build/static/smali-CUgLls3D.js +1 -0
  438. package/web-ui/build/static/smali-YODSX8qt.js +1 -0
  439. package/web-ui/build/static/smalltalk-BMJQ4bbs.js +1 -0
  440. package/web-ui/build/static/smalltalk-BVGY3CTl.js +1 -0
  441. package/web-ui/build/static/smarty-C9aNt4-p.js +1 -0
  442. package/web-ui/build/static/sml-C3BIHhfq.js +1 -0
  443. package/web-ui/build/static/sml-DTipyRmY.js +1 -0
  444. package/web-ui/build/static/solidity-1yuPUqoC.js +1 -0
  445. package/web-ui/build/static/solution-file-BgzK4GOU.js +1 -0
  446. package/web-ui/build/static/soy-CFJXRvqc.js +1 -0
  447. package/web-ui/build/static/sparql-CAosYMpl.js +1 -0
  448. package/web-ui/build/static/splunk-spl-DkINtWr8.js +1 -0
  449. package/web-ui/build/static/sqf-DbrWIS2M.js +1 -0
  450. package/web-ui/build/static/sqf-nq8Q9J2W.js +1 -0
  451. package/web-ui/build/static/sql-9bwClhZQ.js +1 -0
  452. package/web-ui/build/static/sql-CqPkY-lX.js +1 -0
  453. package/web-ui/build/static/sql_more-CsY5ts77.js +1 -0
  454. package/web-ui/build/static/squirrel-BuqtzRBD.js +1 -0
  455. package/web-ui/build/static/stan-BNxBSglc.js +1 -0
  456. package/web-ui/build/static/stan-CZVMc34l.js +1 -0
  457. package/web-ui/build/static/stata-DKnVdHCd.js +1 -0
  458. package/web-ui/build/static/step21-Cu_TaBGF.js +1 -0
  459. package/web-ui/build/static/stylus-BS7-OJew.js +1 -0
  460. package/web-ui/build/static/stylus-DtFrp1Nk.js +1 -0
  461. package/web-ui/build/static/subunit-DDCoWkkc.js +1 -0
  462. package/web-ui/build/static/swift-BaguUZbl.js +1 -0
  463. package/web-ui/build/static/swift-mwBsb8Bx.js +1 -0
  464. package/web-ui/build/static/systemd-D6PpyDKk.js +1 -0
  465. package/web-ui/build/static/t4-cs-Cem8g4Ck.js +1 -0
  466. package/web-ui/build/static/t4-templating-BZo-HjmD.js +1 -0
  467. package/web-ui/build/static/t4-vb-B4oVnKa4.js +1 -0
  468. package/web-ui/build/static/taggerscript-DweAZ5pw.js +1 -0
  469. package/web-ui/build/static/tap-DpuvKHHF.js +1 -0
  470. package/web-ui/build/static/tap-hUKmJObZ.js +1 -0
  471. package/web-ui/build/static/tcl-BUvhAi7u.js +1 -0
  472. package/web-ui/build/static/tcl-Dsck63d8.js +1 -0
  473. package/web-ui/build/static/textile-CgKbqJ-j.js +1 -0
  474. package/web-ui/build/static/thrift-B5H6rApp.js +1 -0
  475. package/web-ui/build/static/toml-DggTpfOo.js +1 -0
  476. package/web-ui/build/static/tp-CazB2P2X.js +1 -0
  477. package/web-ui/build/static/tremor-B1jy7S5p.js +1 -0
  478. package/web-ui/build/static/tsx-BqF2lVDi.js +1 -0
  479. package/web-ui/build/static/tt2-BNoNXpEe.js +1 -0
  480. package/web-ui/build/static/turtle-B0evd5mn.js +1 -0
  481. package/web-ui/build/static/twig-B5A7nMdv.js +1 -0
  482. package/web-ui/build/static/twig-DZnLWvh8.js +1 -0
  483. package/web-ui/build/static/typescript-Bbe_P093.js +1 -0
  484. package/web-ui/build/static/typescript-BfhvmSSG.js +1 -0
  485. package/web-ui/build/static/typoscript-BjuZEIgw.js +1 -0
  486. package/web-ui/build/static/unrealscript-C3iUCFRi.js +1 -0
  487. package/web-ui/build/static/uorazor-CbZXwzIj.js +1 -0
  488. package/web-ui/build/static/uri-xMPSnp6m.js +1 -0
  489. package/web-ui/build/static/v-BKcGo5I6.js +1 -0
  490. package/web-ui/build/static/vala-BRoBE4am.js +1 -0
  491. package/web-ui/build/static/vala-B__Iyrma.js +1 -0
  492. package/web-ui/build/static/vbnet-DBxlMRvN.js +1 -0
  493. package/web-ui/build/static/vbnet-DjAXt5BE.js +1 -0
  494. package/web-ui/build/static/vbscript-BNA4oANi.js +1 -0
  495. package/web-ui/build/static/vbscript-html-o8ckLPKG.js +1 -0
  496. package/web-ui/build/static/velocity-D7sc5ggA.js +1 -0
  497. package/web-ui/build/static/verilog-BWJfMIng.js +1 -0
  498. package/web-ui/build/static/verilog-jW2GPC--.js +1 -0
  499. package/web-ui/build/static/vhdl-BIVlXRPa.js +1 -0
  500. package/web-ui/build/static/vhdl-BeqdhhxD.js +1 -0
  501. package/web-ui/build/static/vim-712lI4-g.js +1 -0
  502. package/web-ui/build/static/vim-DMROTzr0.js +1 -0
  503. package/web-ui/build/static/visual-basic-CQfbM-ta.js +1 -0
  504. package/web-ui/build/static/warpscript-DFAvCXFQ.js +1 -0
  505. package/web-ui/build/static/wasm-CiYoxBl0.js +1 -0
  506. package/web-ui/build/static/web-idl-DoCkPK8y.js +1 -0
  507. package/web-ui/build/static/wiki-bvz0AGzB.js +1 -0
  508. package/web-ui/build/static/wolfram-fBuyFEgU.js +1 -0
  509. package/web-ui/build/static/wren-DvATFxjF.js +1 -0
  510. package/web-ui/build/static/x86asm-r4bPbUR_.js +1 -0
  511. package/web-ui/build/static/xeora-B6iOnDJY.js +1 -0
  512. package/web-ui/build/static/xl-Ce6B5slc.js +1 -0
  513. package/web-ui/build/static/xml-DNjyPmhQ.js +1 -0
  514. package/web-ui/build/static/xml-doc-DydogmZD.js +1 -0
  515. package/web-ui/build/static/xojo-DCQLltvr.js +1 -0
  516. package/web-ui/build/static/xquery-C-fAnA0H.js +1 -0
  517. package/web-ui/build/static/xquery-CNeqzhLO.js +1 -0
  518. package/web-ui/build/static/yaml-BsVaGsk5.js +1 -0
  519. package/web-ui/build/static/yaml-kVZvwv_C.js +1 -0
  520. package/web-ui/build/static/yang-B_gq9JEq.js +1 -0
  521. package/web-ui/build/static/zephir-ECIXgXhX.js +1 -0
  522. package/web-ui/build/static/zig-DY325EKG.js +1 -0
  523. package/web-ui/build/static/1c-BLo2-5GS.js +0 -1
  524. package/web-ui/build/static/abap-BjUneMMr.js +0 -1
  525. package/web-ui/build/static/abnf-CZTz-l7P.js +0 -1
  526. package/web-ui/build/static/abnf-ITJ5mkBo.js +0 -1
  527. package/web-ui/build/static/accesslog-Dj78lZOU.js +0 -1
  528. package/web-ui/build/static/actionscript-Chivtu59.js +0 -1
  529. package/web-ui/build/static/actionscript-CrvMFXnx.js +0 -1
  530. package/web-ui/build/static/ada-DdJtyoYe.js +0 -1
  531. package/web-ui/build/static/ada-GIvogaLi.js +0 -1
  532. package/web-ui/build/static/agda-DbPp4fQi.js +0 -1
  533. package/web-ui/build/static/al-BZ24KwRS.js +0 -1
  534. package/web-ui/build/static/angelscript-DzsFypYt.js +0 -1
  535. package/web-ui/build/static/antlr4-3qb4rD3S.js +0 -1
  536. package/web-ui/build/static/apache-DF0P5ZRm.js +0 -1
  537. package/web-ui/build/static/apacheconf-C8KuNf9c.js +0 -1
  538. package/web-ui/build/static/apex-CPV-DeVE.js +0 -1
  539. package/web-ui/build/static/apl-C60bVxxW.js +0 -1
  540. package/web-ui/build/static/applescript-uz0i0tu1.js +0 -1
  541. package/web-ui/build/static/applescript-xcPRUBia.js +0 -1
  542. package/web-ui/build/static/aql-CRh4IGkA.js +0 -1
  543. package/web-ui/build/static/arcade-CmLedeqc.js +0 -1
  544. package/web-ui/build/static/arduino-3pr1BvXB.js +0 -1
  545. package/web-ui/build/static/arduino-C2BejAip.js +0 -1
  546. package/web-ui/build/static/arff-DE6Wr9MU.js +0 -1
  547. package/web-ui/build/static/armasm-DXodTfP4.js +0 -1
  548. package/web-ui/build/static/asciidoc-BU2BDFme.js +0 -1
  549. package/web-ui/build/static/asciidoc-CgvtvdeC.js +0 -1
  550. package/web-ui/build/static/asm6502-BMuYCKmP.js +0 -1
  551. package/web-ui/build/static/asmatmel-Dwxzg4kq.js +0 -1
  552. package/web-ui/build/static/aspectj-XZIldIRI.js +0 -1
  553. package/web-ui/build/static/aspnet-UxY2bZ9O.js +0 -1
  554. package/web-ui/build/static/autohotkey-BdZoQT7s.js +0 -1
  555. package/web-ui/build/static/autohotkey-DLWs6p8o.js +0 -1
  556. package/web-ui/build/static/autoit-CxcZx_kh.js +0 -1
  557. package/web-ui/build/static/autoit-HY_BHh1p.js +0 -1
  558. package/web-ui/build/static/avisynth-4Q4be9zq.js +0 -1
  559. package/web-ui/build/static/avrasm-CFqVJML2.js +0 -1
  560. package/web-ui/build/static/avro-idl-DVTV2YZm.js +0 -1
  561. package/web-ui/build/static/awk-C1Udi4As.js +0 -1
  562. package/web-ui/build/static/axapta-B9lexIDC.js +0 -1
  563. package/web-ui/build/static/bash-DDZrx0R1.js +0 -1
  564. package/web-ui/build/static/bash-Uuijyc_K.js +0 -1
  565. package/web-ui/build/static/basic-B29QFWwp.js +0 -1
  566. package/web-ui/build/static/basic-DKDOc42O.js +0 -1
  567. package/web-ui/build/static/batch-CA3q9wRr.js +0 -1
  568. package/web-ui/build/static/bbcode-DkUDcqrp.js +0 -1
  569. package/web-ui/build/static/bicep-AHSQiVgQ.js +0 -1
  570. package/web-ui/build/static/birb-BsAnN1j3.js +0 -1
  571. package/web-ui/build/static/bison-BIq5-ZXo.js +0 -1
  572. package/web-ui/build/static/bnf-BexLm6hz.js +0 -1
  573. package/web-ui/build/static/bnf-Dm46EM5S.js +0 -1
  574. package/web-ui/build/static/brainfuck-CBG8MHhD.js +0 -1
  575. package/web-ui/build/static/brainfuck-DrHuUFVv.js +0 -1
  576. package/web-ui/build/static/brightscript-CoQ7s_l3.js +0 -1
  577. package/web-ui/build/static/bro-Cz5RmvoK.js +0 -1
  578. package/web-ui/build/static/bsl-C9wXomkX.js +0 -1
  579. package/web-ui/build/static/c-BZFEFWwC.js +0 -1
  580. package/web-ui/build/static/c-CfFWLEL7.js +0 -1
  581. package/web-ui/build/static/c-like-CvIii1QP.js +0 -1
  582. package/web-ui/build/static/cal-be-Dz3GC.js +0 -1
  583. package/web-ui/build/static/capnproto-Bcaxak1e.js +0 -1
  584. package/web-ui/build/static/ceylon-QH_iQXnW.js +0 -1
  585. package/web-ui/build/static/cfscript-BRgBlxCO.js +0 -1
  586. package/web-ui/build/static/chaiscript-DSBx5kyN.js +0 -1
  587. package/web-ui/build/static/cil-C90LIbge.js +0 -1
  588. package/web-ui/build/static/clean-D2X3fSKw.js +0 -1
  589. package/web-ui/build/static/clojure-CvKE0e-3.js +0 -1
  590. package/web-ui/build/static/clojure-Cy3Zg4vZ.js +0 -1
  591. package/web-ui/build/static/clojure-repl-D0kONHv2.js +0 -1
  592. package/web-ui/build/static/cmake-DIDVe3n_.js +0 -1
  593. package/web-ui/build/static/cmake-DPijEs9c.js +0 -1
  594. package/web-ui/build/static/cobol-BPEjLjGY.js +0 -1
  595. package/web-ui/build/static/coffeescript-CoSx9MQU.js +0 -1
  596. package/web-ui/build/static/coffeescript-L5CBXrnP.js +0 -1
  597. package/web-ui/build/static/concurnas-q5sXhVU4.js +0 -1
  598. package/web-ui/build/static/coq-BAEq82zI.js +0 -1
  599. package/web-ui/build/static/coq-BBgtQZwi.js +0 -1
  600. package/web-ui/build/static/cos-9FdwfBC5.js +0 -1
  601. package/web-ui/build/static/cpp-CYt8UYn2.js +0 -1
  602. package/web-ui/build/static/cpp-CZ2lOXlm.js +0 -1
  603. package/web-ui/build/static/crmsh-C_TZWkES.js +0 -1
  604. package/web-ui/build/static/crystal-BDf_0NDz.js +0 -1
  605. package/web-ui/build/static/crystal-BrTR9dGT.js +0 -1
  606. package/web-ui/build/static/csharp-BSBrba50.js +0 -1
  607. package/web-ui/build/static/csharp-Cerqyqbn.js +0 -1
  608. package/web-ui/build/static/cshtml-heNA_ya5.js +0 -1
  609. package/web-ui/build/static/csp-CJprtNTl.js +0 -1
  610. package/web-ui/build/static/csp-CyYfNNga.js +0 -1
  611. package/web-ui/build/static/css-ClMfqSLF.js +0 -1
  612. package/web-ui/build/static/css-extras-BRU-Fmfk.js +0 -1
  613. package/web-ui/build/static/csv-VxPQSCnT.js +0 -1
  614. package/web-ui/build/static/cypher-COR7lVoB.js +0 -1
  615. package/web-ui/build/static/d-CjJIoaqU.js +0 -1
  616. package/web-ui/build/static/d-DrTea74c.js +0 -1
  617. package/web-ui/build/static/dart-Dx1CtbrO.js +0 -1
  618. package/web-ui/build/static/dart-Kqlt_5Iy.js +0 -1
  619. package/web-ui/build/static/dataweave-DpoRPYaa.js +0 -1
  620. package/web-ui/build/static/dax-BdRNDjXh.js +0 -1
  621. package/web-ui/build/static/delphi-C6ZfxFVF.js +0 -1
  622. package/web-ui/build/static/dhall-DZrga6Gc.js +0 -1
  623. package/web-ui/build/static/diff-BuMvzPYe.js +0 -1
  624. package/web-ui/build/static/diff-DZYXzKCb.js +0 -1
  625. package/web-ui/build/static/django-D_vRowuc.js +0 -1
  626. package/web-ui/build/static/django-NYcglI2i.js +0 -1
  627. package/web-ui/build/static/dns-Cd7tDS1i.js +0 -1
  628. package/web-ui/build/static/dns-zone-file-C3-2vwxy.js +0 -1
  629. package/web-ui/build/static/docker-DQ7ZFefk.js +0 -1
  630. package/web-ui/build/static/dockerfile-BpU0w0F-.js +0 -1
  631. package/web-ui/build/static/dos-B1_ZGbVG.js +0 -1
  632. package/web-ui/build/static/dot-BGB_tXU7.js +0 -1
  633. package/web-ui/build/static/dsconfig-BbDxyV_e.js +0 -1
  634. package/web-ui/build/static/dts-BfjOjY8l.js +0 -1
  635. package/web-ui/build/static/dust-BdwQ-7T_.js +0 -1
  636. package/web-ui/build/static/ebnf-BQTMmaYU.js +0 -1
  637. package/web-ui/build/static/ebnf-BwwBWilG.js +0 -1
  638. package/web-ui/build/static/editorconfig-DWS4VSOM.js +0 -1
  639. package/web-ui/build/static/eiffel-DVvlc0AI.js +0 -1
  640. package/web-ui/build/static/ejs-DsD496m-.js +0 -1
  641. package/web-ui/build/static/elixir-CLxuo9eh.js +0 -1
  642. package/web-ui/build/static/elixir-Cnyg3Ezx.js +0 -1
  643. package/web-ui/build/static/elm-CMAIkLMI.js +0 -1
  644. package/web-ui/build/static/elm-DZBnlwPV.js +0 -1
  645. package/web-ui/build/static/erb-B5xezjly.js +0 -1
  646. package/web-ui/build/static/erb-CJr8Ab4S.js +0 -1
  647. package/web-ui/build/static/erlang-BKy_rMFs.js +0 -1
  648. package/web-ui/build/static/erlang-DtaEL15_.js +0 -1
  649. package/web-ui/build/static/erlang-repl-CC5OZ0oZ.js +0 -1
  650. package/web-ui/build/static/etlua-1AfbSbi_.js +0 -1
  651. package/web-ui/build/static/excel-AEWYaJMN.js +0 -1
  652. package/web-ui/build/static/excel-formula-DXCH31eV.js +0 -1
  653. package/web-ui/build/static/factor-BvZsNxRC.js +0 -1
  654. package/web-ui/build/static/false-Y69sPjTa.js +0 -1
  655. package/web-ui/build/static/firestore-security-rules-BAYXaIU_.js +0 -1
  656. package/web-ui/build/static/fix-D7wVox5L.js +0 -1
  657. package/web-ui/build/static/flix-xYG3kZl-.js +0 -1
  658. package/web-ui/build/static/flow-zBPh0c8a.js +0 -1
  659. package/web-ui/build/static/fortran-C7OgAOwk.js +0 -1
  660. package/web-ui/build/static/fortran-D7HqnRra.js +0 -1
  661. package/web-ui/build/static/fsharp-Dz8jq_YD.js +0 -1
  662. package/web-ui/build/static/fsharp-wem8e879.js +0 -1
  663. package/web-ui/build/static/ftl-BNZhFjQT.js +0 -1
  664. package/web-ui/build/static/gams-C0WL3JTk.js +0 -1
  665. package/web-ui/build/static/gap-C3QTJPj2.js +0 -1
  666. package/web-ui/build/static/gauss-HDeDt6Js.js +0 -1
  667. package/web-ui/build/static/gcode-B6xVa-Q4.js +0 -1
  668. package/web-ui/build/static/gcode-KfjFk59Y.js +0 -1
  669. package/web-ui/build/static/gdscript-CZWTW6OT.js +0 -1
  670. package/web-ui/build/static/gedcom-DGTBZtDe.js +0 -1
  671. package/web-ui/build/static/gherkin-BM2fti5q.js +0 -1
  672. package/web-ui/build/static/gherkin-BsD-keLP.js +0 -1
  673. package/web-ui/build/static/git-CwXnrvg5.js +0 -1
  674. package/web-ui/build/static/glsl-CEL-DKdu.js +0 -1
  675. package/web-ui/build/static/glsl-DClg1hhL.js +0 -1
  676. package/web-ui/build/static/gml-BuyC2nUx.js +0 -1
  677. package/web-ui/build/static/gml-CaV0fexF.js +0 -1
  678. package/web-ui/build/static/gn-RZ4XHU09.js +0 -1
  679. package/web-ui/build/static/go-2fZP5dFL.js +0 -1
  680. package/web-ui/build/static/go-B-2r4QAR.js +0 -1
  681. package/web-ui/build/static/go-module-DSWZUUGo.js +0 -1
  682. package/web-ui/build/static/golo-BLZaLyU5.js +0 -1
  683. package/web-ui/build/static/gradle--RLe7WtU.js +0 -1
  684. package/web-ui/build/static/graphql-Dersm5rs.js +0 -1
  685. package/web-ui/build/static/groovy-BhCtzyFe.js +0 -1
  686. package/web-ui/build/static/groovy-CvbHavu3.js +0 -1
  687. package/web-ui/build/static/haml-CQhB89Xl.js +0 -1
  688. package/web-ui/build/static/haml-CemWzAX2.js +0 -1
  689. package/web-ui/build/static/handlebars-B39jLKjQ.js +0 -1
  690. package/web-ui/build/static/handlebars-Cl4dI91M.js +0 -1
  691. package/web-ui/build/static/haskell-CO9Ug-Kw.js +0 -1
  692. package/web-ui/build/static/haskell-EXme4CFR.js +0 -1
  693. package/web-ui/build/static/haxe-BDkCyqBy.js +0 -1
  694. package/web-ui/build/static/haxe-ahczQlFA.js +0 -1
  695. package/web-ui/build/static/hcl-liOTbdHr.js +0 -1
  696. package/web-ui/build/static/hlsl-Bnkb1zrP.js +0 -1
  697. package/web-ui/build/static/hoon-DCXHuTNp.js +0 -1
  698. package/web-ui/build/static/hpkp-CPJOGDF_.js +0 -1
  699. package/web-ui/build/static/hsp-BdeT0enM.js +0 -1
  700. package/web-ui/build/static/hsts-BoIN2VGK.js +0 -1
  701. package/web-ui/build/static/htmlbars-B5Ruf2zT.js +0 -1
  702. package/web-ui/build/static/http-BacVzmeC.js +0 -1
  703. package/web-ui/build/static/http-DifjpER4.js +0 -1
  704. package/web-ui/build/static/hy-DQ-M6mjk.js +0 -1
  705. package/web-ui/build/static/ichigojam-CcVrpthd.js +0 -1
  706. package/web-ui/build/static/icon-B4N1Fnx2.js +0 -1
  707. package/web-ui/build/static/icu-message-format-aDIl6Oaf.js +0 -1
  708. package/web-ui/build/static/idris-DKvV6i27.js +0 -1
  709. package/web-ui/build/static/iecst-zqZH79Dw.js +0 -1
  710. package/web-ui/build/static/ignore-BBbP-u2O.js +0 -1
  711. package/web-ui/build/static/index-CkhVK4lF.js +0 -1164
  712. package/web-ui/build/static/index-Cm1gK3R7.css +0 -1
  713. package/web-ui/build/static/index-D9JNKR2k.js +0 -13
  714. package/web-ui/build/static/index-DqZhvIWG.js +0 -1
  715. package/web-ui/build/static/inform7-BwvEArfL.js +0 -1
  716. package/web-ui/build/static/inform7-YkPDg57k.js +0 -1
  717. package/web-ui/build/static/ini-DU4drXRb.js +0 -1
  718. package/web-ui/build/static/ini-OhDTn0L5.js +0 -1
  719. package/web-ui/build/static/io-4thQGR-r.js +0 -1
  720. package/web-ui/build/static/irpf90-BnhmotbX.js +0 -1
  721. package/web-ui/build/static/isbl-BKcWS-M5.js +0 -1
  722. package/web-ui/build/static/j-Bw6CUCl9.js +0 -1
  723. package/web-ui/build/static/java-8IzvJ-mZ.js +0 -1
  724. package/web-ui/build/static/java-_jaQp1m2.js +0 -1
  725. package/web-ui/build/static/javadoc-D6KaHkhq.js +0 -1
  726. package/web-ui/build/static/javadoclike-B-DnR3Tl.js +0 -1
  727. package/web-ui/build/static/javascript-CfOOSye9.js +0 -1
  728. package/web-ui/build/static/javastacktrace-DHyDfhlB.js +0 -1
  729. package/web-ui/build/static/jboss-cli-zEH5UaRS.js +0 -1
  730. package/web-ui/build/static/jexl-CRpgdJ2f.js +0 -1
  731. package/web-ui/build/static/jolie-C5S16-nE.js +0 -1
  732. package/web-ui/build/static/jq-Dy-2LJZM.js +0 -1
  733. package/web-ui/build/static/js-extras-CNfXr3kE.js +0 -1
  734. package/web-ui/build/static/js-templates-DCJ1syUw.js +0 -1
  735. package/web-ui/build/static/jsdoc-BamyoRCh.js +0 -1
  736. package/web-ui/build/static/json-Buz-eeND.js +0 -1
  737. package/web-ui/build/static/json-D4xr_AK1.js +0 -1
  738. package/web-ui/build/static/json5-CS3uAaJP.js +0 -1
  739. package/web-ui/build/static/jsonp-CmEAdOcH.js +0 -1
  740. package/web-ui/build/static/jsstacktrace-D35jXpCN.js +0 -1
  741. package/web-ui/build/static/jsx-DRMEK-Qn.js +0 -1
  742. package/web-ui/build/static/julia-BgYJV7ho.js +0 -1
  743. package/web-ui/build/static/julia-CRsGDmxp.js +0 -1
  744. package/web-ui/build/static/julia-repl-D0vTZKUn.js +0 -1
  745. package/web-ui/build/static/keepalived-BlhBatvM.js +0 -1
  746. package/web-ui/build/static/keyman-B_-J66sg.js +0 -1
  747. package/web-ui/build/static/kotlin-B7HqYBGK.js +0 -1
  748. package/web-ui/build/static/kotlin-CszxhoS4.js +0 -1
  749. package/web-ui/build/static/kumir-B_wpMfXS.js +0 -1
  750. package/web-ui/build/static/kusto-BrHkOiE1.js +0 -1
  751. package/web-ui/build/static/lasso-xizuiq1s.js +0 -1
  752. package/web-ui/build/static/latex-62pryLTa.js +0 -1
  753. package/web-ui/build/static/latex-D7Tnbs2l.js +0 -1
  754. package/web-ui/build/static/latte-B_8xJj-y.js +0 -1
  755. package/web-ui/build/static/ldif-B69eIciC.js +0 -1
  756. package/web-ui/build/static/leaf-DPnh4k7N.js +0 -1
  757. package/web-ui/build/static/less-Bg3xuki-.js +0 -1
  758. package/web-ui/build/static/less-Cm-zhk4i.js +0 -1
  759. package/web-ui/build/static/lilypond-BFSXmrKQ.js +0 -1
  760. package/web-ui/build/static/liquid-D_jMXN_8.js +0 -1
  761. package/web-ui/build/static/lisp-CDWjXhWU.js +0 -1
  762. package/web-ui/build/static/lisp-DAu9fWrQ.js +0 -1
  763. package/web-ui/build/static/livecodeserver-BNgd6rBu.js +0 -1
  764. package/web-ui/build/static/livescript-C6sYNsdz.js +0 -1
  765. package/web-ui/build/static/livescript-CMOawYYt.js +0 -1
  766. package/web-ui/build/static/llvm-Yx2vcmJw.js +0 -1
  767. package/web-ui/build/static/llvm-w4vVb6qs.js +0 -1
  768. package/web-ui/build/static/log-CqhluDSP.js +0 -1
  769. package/web-ui/build/static/lolcode-Ck0rxP3x.js +0 -1
  770. package/web-ui/build/static/lsl-BwPX-Qjm.js +0 -1
  771. package/web-ui/build/static/lua-4H_Ijh4D.js +0 -1
  772. package/web-ui/build/static/lua-dDdlvQ6u.js +0 -1
  773. package/web-ui/build/static/magma-2nRRraug.js +0 -1
  774. package/web-ui/build/static/makefile-C887R9mV.js +0 -1
  775. package/web-ui/build/static/makefile-hlNtZePL.js +0 -1
  776. package/web-ui/build/static/markdown-DCALPnuW.js +0 -1
  777. package/web-ui/build/static/markdown-DGM_Z5tW.js +0 -1
  778. package/web-ui/build/static/markup-templating-PAvYDmBZ.js +0 -1
  779. package/web-ui/build/static/mathematica-CGL-Gomp.js +0 -1
  780. package/web-ui/build/static/matlab-C46ZZzlH.js +0 -1
  781. package/web-ui/build/static/matlab-WUgx8roJ.js +0 -1
  782. package/web-ui/build/static/maxima-Dd_TIy4H.js +0 -1
  783. package/web-ui/build/static/maxscript-f8SP9Ybn.js +0 -1
  784. package/web-ui/build/static/mel-6l2ZAh7F.js +0 -1
  785. package/web-ui/build/static/mel-BYdNMJzZ.js +0 -1
  786. package/web-ui/build/static/mercury-CdHf1buq.js +0 -1
  787. package/web-ui/build/static/mermaid-IRgUMtb1.js +0 -1
  788. package/web-ui/build/static/mipsasm-CRPpDKP4.js +0 -1
  789. package/web-ui/build/static/mizar-B4DBCLSi.js +0 -1
  790. package/web-ui/build/static/mizar-DiuZyDh7.js +0 -1
  791. package/web-ui/build/static/mojolicious-ChuQv8wb.js +0 -1
  792. package/web-ui/build/static/mongodb-CE5Epj0T.js +0 -1
  793. package/web-ui/build/static/monkey-BAz4pIwb.js +0 -1
  794. package/web-ui/build/static/monkey-i_g3gMkJ.js +0 -1
  795. package/web-ui/build/static/moonscript-BNaNpboV.js +0 -1
  796. package/web-ui/build/static/moonscript-uHlQVjxf.js +0 -1
  797. package/web-ui/build/static/n1ql-CBDLma2D.js +0 -1
  798. package/web-ui/build/static/n1ql-u4YLlLfk.js +0 -1
  799. package/web-ui/build/static/n4js-IVFjZEMP.js +0 -1
  800. package/web-ui/build/static/nand2tetris-hdl-Ba72aD32.js +0 -1
  801. package/web-ui/build/static/naniscript-CjMhybrb.js +0 -1
  802. package/web-ui/build/static/nasm-DjKhk70h.js +0 -1
  803. package/web-ui/build/static/neon-JEhMoh8P.js +0 -1
  804. package/web-ui/build/static/nevod-6tgpQVCA.js +0 -1
  805. package/web-ui/build/static/nginx-C6NwXcw_.js +0 -1
  806. package/web-ui/build/static/nginx-CquSTZbP.js +0 -1
  807. package/web-ui/build/static/nim-0bOOYxfL.js +0 -1
  808. package/web-ui/build/static/nim-aCQGMs_4.js +0 -1
  809. package/web-ui/build/static/nix-BV4kRCY_.js +0 -1
  810. package/web-ui/build/static/nix-FvSL2V8j.js +0 -1
  811. package/web-ui/build/static/node-repl-GtjTvb93.js +0 -1
  812. package/web-ui/build/static/nsis-DsftItKH.js +0 -1
  813. package/web-ui/build/static/nsis-pu7O80Pq.js +0 -1
  814. package/web-ui/build/static/objectivec-Bx7Bj0U_.js +0 -1
  815. package/web-ui/build/static/objectivec-GtO6Znp9.js +0 -1
  816. package/web-ui/build/static/ocaml-B71sR3qa.js +0 -1
  817. package/web-ui/build/static/ocaml-BlhoK75p.js +0 -1
  818. package/web-ui/build/static/opencl-40JZ6XXw.js +0 -1
  819. package/web-ui/build/static/openqasm-cDL6l7w3.js +0 -1
  820. package/web-ui/build/static/openscad-BQ0gNGv9.js +0 -1
  821. package/web-ui/build/static/oxygene-1fX2ftBa.js +0 -1
  822. package/web-ui/build/static/oz-Cgq2yQZq.js +0 -1
  823. package/web-ui/build/static/parigp-DfRO3DxU.js +0 -1
  824. package/web-ui/build/static/parser-hZcHrq-n.js +0 -1
  825. package/web-ui/build/static/parser3-Cf2p4Ryg.js +0 -1
  826. package/web-ui/build/static/pascal-C6tg_yvS.js +0 -1
  827. package/web-ui/build/static/pascaligo-9U9PdOS6.js +0 -1
  828. package/web-ui/build/static/pcaxis-B5EnEKrt.js +0 -1
  829. package/web-ui/build/static/peoplecode-Cf2sGzFJ.js +0 -1
  830. package/web-ui/build/static/perl-C9FNSHZx.js +0 -1
  831. package/web-ui/build/static/perl-uzSwl6wJ.js +0 -1
  832. package/web-ui/build/static/pf-C7Bjci1q.js +0 -1
  833. package/web-ui/build/static/pgsql-IBD1Cka7.js +0 -1
  834. package/web-ui/build/static/php-19XvqtTQ.js +0 -1
  835. package/web-ui/build/static/php-CUjVuQ1J.js +0 -1
  836. package/web-ui/build/static/php-extras-GWBU2Qbm.js +0 -1
  837. package/web-ui/build/static/php-template-Chtii014.js +0 -1
  838. package/web-ui/build/static/phpdoc-BLcJXgrV.js +0 -1
  839. package/web-ui/build/static/plaintext-BX3hHjdj.js +0 -1
  840. package/web-ui/build/static/plsql-tCcTmmsx.js +0 -1
  841. package/web-ui/build/static/pony-CKD16QkU.js +0 -1
  842. package/web-ui/build/static/powerquery-DXj7kqMe.js +0 -1
  843. package/web-ui/build/static/powershell-0jB2gvRR.js +0 -1
  844. package/web-ui/build/static/powershell-Ca6UjZV2.js +0 -1
  845. package/web-ui/build/static/processing-CPjwH4wc.js +0 -1
  846. package/web-ui/build/static/processing-ItKy7l8u.js +0 -1
  847. package/web-ui/build/static/profile-6N_Rzycx.js +0 -1
  848. package/web-ui/build/static/prolog-BV3TgLfG.js +0 -1
  849. package/web-ui/build/static/prolog-C5UoVyBz.js +0 -1
  850. package/web-ui/build/static/promql-CZot8Bw3.js +0 -1
  851. package/web-ui/build/static/properties-C_r_5f7N.js +0 -1
  852. package/web-ui/build/static/properties-qycKL1T0.js +0 -1
  853. package/web-ui/build/static/protobuf-BmdKEOw6.js +0 -1
  854. package/web-ui/build/static/protobuf-CxWC8PvT.js +0 -1
  855. package/web-ui/build/static/psl-CFSNRM7z.js +0 -1
  856. package/web-ui/build/static/pug-8dv12FtI.js +0 -1
  857. package/web-ui/build/static/puppet-CNjskGXn.js +0 -1
  858. package/web-ui/build/static/puppet-Cf6xZODN.js +0 -1
  859. package/web-ui/build/static/pure-exFir566.js +0 -1
  860. package/web-ui/build/static/purebasic-Bm6QaKku.js +0 -1
  861. package/web-ui/build/static/purebasic-lfzND9Qp.js +0 -1
  862. package/web-ui/build/static/purescript-D1xRYVQG.js +0 -1
  863. package/web-ui/build/static/python-DgkOjU0T.js +0 -1
  864. package/web-ui/build/static/python-o7BJVaX6.js +0 -1
  865. package/web-ui/build/static/python-repl-6SyonvH1.js +0 -1
  866. package/web-ui/build/static/q-CiQ2AFzU.js +0 -1
  867. package/web-ui/build/static/q-g7rEIWgm.js +0 -1
  868. package/web-ui/build/static/qml-ARc9Akfg.js +0 -1
  869. package/web-ui/build/static/qml-rVumxss_.js +0 -1
  870. package/web-ui/build/static/qore-CUXpqOSx.js +0 -1
  871. package/web-ui/build/static/qsharp-DMPNcgaz.js +0 -1
  872. package/web-ui/build/static/r-DCIo6joW.js +0 -1
  873. package/web-ui/build/static/r-nUBzz4LB.js +0 -1
  874. package/web-ui/build/static/racket--fPY_Q4o.js +0 -1
  875. package/web-ui/build/static/reason-CeVN9vJx.js +0 -1
  876. package/web-ui/build/static/reasonml-49SEasi3.js +0 -1
  877. package/web-ui/build/static/regex-BS97XMMk.js +0 -1
  878. package/web-ui/build/static/rego-Brc7DU11.js +0 -1
  879. package/web-ui/build/static/renpy-C2sPWAHv.js +0 -1
  880. package/web-ui/build/static/rest-DlZ7ycRe.js +0 -1
  881. package/web-ui/build/static/rib-C8WsA4on.js +0 -1
  882. package/web-ui/build/static/rip-dd9bS3Ar.js +0 -1
  883. package/web-ui/build/static/roboconf-CAEw-rS3.js +0 -1
  884. package/web-ui/build/static/roboconf-D0TfrLeu.js +0 -1
  885. package/web-ui/build/static/robotframework-CkgVY4bX.js +0 -1
  886. package/web-ui/build/static/routeros-DIek1v-Z.js +0 -1
  887. package/web-ui/build/static/rsl-DExhHtA1.js +0 -1
  888. package/web-ui/build/static/ruby-BjvzODgO.js +0 -1
  889. package/web-ui/build/static/ruby-Dflr1gcA.js +0 -1
  890. package/web-ui/build/static/ruleslanguage-BgzP6UBl.js +0 -1
  891. package/web-ui/build/static/rust-DxIro-GW.js +0 -1
  892. package/web-ui/build/static/rust-qWzP5Jcw.js +0 -1
  893. package/web-ui/build/static/sas-BrCJWU_w.js +0 -1
  894. package/web-ui/build/static/sas-itaOGZ-D.js +0 -1
  895. package/web-ui/build/static/sass-BTk1_hyU.js +0 -1
  896. package/web-ui/build/static/scala-DEtImhEo.js +0 -1
  897. package/web-ui/build/static/scala-DdZCH_nS.js +0 -1
  898. package/web-ui/build/static/scheme-CiOCQffl.js +0 -1
  899. package/web-ui/build/static/scheme-WaU-JPJX.js +0 -1
  900. package/web-ui/build/static/scilab-03tyg0ft.js +0 -1
  901. package/web-ui/build/static/scss-DXl2WSdH.js +0 -1
  902. package/web-ui/build/static/scss-movJ3vcX.js +0 -1
  903. package/web-ui/build/static/shell-DWmlNcrf.js +0 -1
  904. package/web-ui/build/static/shell-session-lHcfQbT0.js +0 -1
  905. package/web-ui/build/static/smali-7RKwn9RZ.js +0 -1
  906. package/web-ui/build/static/smali-TEMQ7bRM.js +0 -1
  907. package/web-ui/build/static/smalltalk-B_nVEfab.js +0 -1
  908. package/web-ui/build/static/smalltalk-BsA9wucb.js +0 -1
  909. package/web-ui/build/static/smarty-DSf4s_8v.js +0 -1
  910. package/web-ui/build/static/sml-BDO_Hmie.js +0 -1
  911. package/web-ui/build/static/sml-DKuy82zG.js +0 -1
  912. package/web-ui/build/static/solidity-jtWv6laA.js +0 -1
  913. package/web-ui/build/static/solution-file-DcfiquuJ.js +0 -1
  914. package/web-ui/build/static/soy-DmBVrDYd.js +0 -1
  915. package/web-ui/build/static/sparql-_JOxZ7fM.js +0 -1
  916. package/web-ui/build/static/splunk-spl-CHeBtp33.js +0 -1
  917. package/web-ui/build/static/sqf-9wI8rp5o.js +0 -1
  918. package/web-ui/build/static/sqf-BuKh30bG.js +0 -1
  919. package/web-ui/build/static/sql-ClFFHGMY.js +0 -1
  920. package/web-ui/build/static/sql-DVXtimpW.js +0 -1
  921. package/web-ui/build/static/sql_more-CNw-JJON.js +0 -1
  922. package/web-ui/build/static/squirrel-Bdi8LbT5.js +0 -1
  923. package/web-ui/build/static/stan-Brcz64A8.js +0 -1
  924. package/web-ui/build/static/stan-C9Q08Juk.js +0 -1
  925. package/web-ui/build/static/stata-ES8hryw_.js +0 -1
  926. package/web-ui/build/static/step21-Cfmoq4Lb.js +0 -1
  927. package/web-ui/build/static/stylus-DMKHLSvm.js +0 -1
  928. package/web-ui/build/static/stylus-Dcs8vyW2.js +0 -1
  929. package/web-ui/build/static/subunit-DRjv565H.js +0 -1
  930. package/web-ui/build/static/swift-0x_T9zx8.js +0 -1
  931. package/web-ui/build/static/swift-CUvpRg4a.js +0 -1
  932. package/web-ui/build/static/systemd-Dl8xGVv9.js +0 -1
  933. package/web-ui/build/static/t4-cs-DqvXuZwc.js +0 -1
  934. package/web-ui/build/static/t4-templating-DjN2N1uM.js +0 -1
  935. package/web-ui/build/static/t4-vb-CZQn9IVK.js +0 -1
  936. package/web-ui/build/static/taggerscript-CPCJkC2t.js +0 -1
  937. package/web-ui/build/static/tap-BPfuLhe7.js +0 -1
  938. package/web-ui/build/static/tap-CSdsd38Q.js +0 -1
  939. package/web-ui/build/static/tcl-4BqhAKLC.js +0 -1
  940. package/web-ui/build/static/tcl-Bh0Jg8jj.js +0 -1
  941. package/web-ui/build/static/textile-BiD4awlU.js +0 -1
  942. package/web-ui/build/static/thrift-Br1-10xh.js +0 -1
  943. package/web-ui/build/static/toml-QlLCqVpQ.js +0 -1
  944. package/web-ui/build/static/tp-B2Ef9EBz.js +0 -1
  945. package/web-ui/build/static/tremor-DuZdAfVr.js +0 -1
  946. package/web-ui/build/static/tsx-W3KEjccO.js +0 -1
  947. package/web-ui/build/static/tt2-D_tdF-56.js +0 -1
  948. package/web-ui/build/static/turtle-DxrQkFoq.js +0 -1
  949. package/web-ui/build/static/twig-DD44ApyU.js +0 -1
  950. package/web-ui/build/static/twig-vA3ZwAxn.js +0 -1
  951. package/web-ui/build/static/typescript-BfbcKNOu.js +0 -1
  952. package/web-ui/build/static/typescript-CvKtq1ix.js +0 -1
  953. package/web-ui/build/static/typoscript-BEu84JpE.js +0 -1
  954. package/web-ui/build/static/unrealscript-ohUNsJGM.js +0 -1
  955. package/web-ui/build/static/uorazor-BWer-chm.js +0 -1
  956. package/web-ui/build/static/uri-CPLTr_NY.js +0 -1
  957. package/web-ui/build/static/v-gAkMRmmI.js +0 -1
  958. package/web-ui/build/static/vala-Bktj5SNB.js +0 -1
  959. package/web-ui/build/static/vala-D1fDPFxI.js +0 -1
  960. package/web-ui/build/static/vbnet-Cn0g0ohh.js +0 -1
  961. package/web-ui/build/static/vbnet-TiYHF2WM.js +0 -1
  962. package/web-ui/build/static/vbscript-BUV-Kjvs.js +0 -1
  963. package/web-ui/build/static/vbscript-html-s1RgByjf.js +0 -1
  964. package/web-ui/build/static/velocity-DTy-TOwB.js +0 -1
  965. package/web-ui/build/static/verilog-4jk4MMXN.js +0 -1
  966. package/web-ui/build/static/verilog-aR4U-DJX.js +0 -1
  967. package/web-ui/build/static/vhdl-D72XnBZR.js +0 -1
  968. package/web-ui/build/static/vhdl-DFdtG28B.js +0 -1
  969. package/web-ui/build/static/vim-BMqsbQ-a.js +0 -1
  970. package/web-ui/build/static/vim-Cc3UuKOs.js +0 -1
  971. package/web-ui/build/static/visual-basic-CyC2kNGV.js +0 -1
  972. package/web-ui/build/static/warpscript-DpKFeISB.js +0 -1
  973. package/web-ui/build/static/wasm-SPljCkFH.js +0 -1
  974. package/web-ui/build/static/web-idl-Cie2yHU9.js +0 -1
  975. package/web-ui/build/static/wiki-BfYfwsBk.js +0 -1
  976. package/web-ui/build/static/wolfram-Dgi1K2gQ.js +0 -1
  977. package/web-ui/build/static/wren-CFQxgLld.js +0 -1
  978. package/web-ui/build/static/x86asm-CBIt2r64.js +0 -1
  979. package/web-ui/build/static/xeora-e5JHDF1T.js +0 -1
  980. package/web-ui/build/static/xl-CPZe-czl.js +0 -1
  981. package/web-ui/build/static/xml-BEuPuoS1.js +0 -1
  982. package/web-ui/build/static/xml-doc-DTOJGYE2.js +0 -1
  983. package/web-ui/build/static/xojo-ByMSKdYJ.js +0 -1
  984. package/web-ui/build/static/xquery--5iaD5oE.js +0 -1
  985. package/web-ui/build/static/xquery-DJp5PXZo.js +0 -1
  986. package/web-ui/build/static/yaml-CH8EnM9M.js +0 -1
  987. package/web-ui/build/static/yaml-mKr8oN1v.js +0 -1
  988. package/web-ui/build/static/yang-Nqdvm2mQ.js +0 -1
  989. package/web-ui/build/static/zephir-BJZaDzrW.js +0 -1
  990. package/web-ui/build/static/zig-DRkhvZLn.js +0 -1
@@ -1,820 +1,892 @@
1
- /**
2
- * Memory Tool - Persistent memory storage for agents
3
- *
4
- * Purpose:
5
- * - Allow agents to store, retrieve, update, and delete persistent memories
6
- * - Memories persist across sessions and agent restarts
7
- * - Support expiration conditions (date-based or custom conditions)
8
- * - Group memories by date for organized retrieval
9
- *
10
- * Actions:
11
- * - add: Create a new memory
12
- * - update: Update an existing memory
13
- * - delete: Remove a memory
14
- * - list: List memories with configurable detail level
15
- * - read: Load a memory's full content into context
16
- * - search: Search memories by title or description
17
- * - stats: Get memory statistics
18
- */
19
-
20
- import { BaseTool } from './baseTool.js';
21
- import { getMemoryService } from '../services/memoryService.js';
22
- import {
23
- overview as convOverview,
24
- range as convRange,
25
- search as convSearch,
26
- around as convAround,
27
- byTool as convByTool,
28
- read as convRead,
29
- } from '../services/conversationQuery.js';
30
-
31
- class MemoryTool extends BaseTool {
32
- constructor(config = {}, logger = null) {
33
- super(config, logger);
34
-
35
- this.memoryService = null;
36
-
37
- // Tool metadata
38
- this.requiresProject = false;
39
- this.isAsync = false;
40
- this.timeout = 30000; // 30 seconds
41
- }
42
-
43
- /**
44
- * Initialize memory service lazily
45
- */
46
- async _ensureMemoryService() {
47
- if (!this.memoryService) {
48
- this.memoryService = getMemoryService(this.logger);
49
- await this.memoryService.initialize();
50
- }
51
- return this.memoryService;
52
- }
53
-
54
- /**
55
- * Get tool description for LLM consumption
56
- * @returns {string} Tool description
57
- */
58
- getDescription() {
59
- return `
60
- Memory Tool: Store and retrieve persistent memories that survive across sessions.
61
-
62
- USAGE:
63
- \`\`\`json
64
- {
65
- "toolId": "memory",
66
- "action": "<action>",
67
- "parameters": { ... }
68
- }
69
- \`\`\`
70
-
71
- ACTIONS:
72
-
73
- 1. ADD - Create a new memory
74
- \`\`\`json
75
- {
76
- "toolId": "memory",
77
- "action": "add",
78
- "title": "User prefers TypeScript",
79
- "description": "Programming language preference",
80
- "content": "The user explicitly stated they prefer TypeScript over JavaScript.",
81
- "expiration": null
82
- }
83
- \`\`\`
84
-
85
- Expiration options:
86
- - null or omit: Never expires
87
- - "2025-06-01": Expires on date (ISO format)
88
- - "When user changes preference": Custom condition (manually removed)
89
-
90
- 2. UPDATE - Modify an existing memory
91
- \`\`\`json
92
- {
93
- "toolId": "memory",
94
- "action": "update",
95
- "id": "mem-123-abc",
96
- "title": "Updated title",
97
- "description": "Updated description",
98
- "content": "Updated content",
99
- "expiration": "2025-12-31"
100
- }
101
- \`\`\`
102
-
103
- 3. DELETE - Remove a memory
104
- \`\`\`json
105
- {
106
- "toolId": "memory",
107
- "action": "delete",
108
- "id": "mem-123-abc"
109
- }
110
- \`\`\`
111
-
112
- 4. LIST - List memories (grouped by date, newest first)
113
- \`\`\`json
114
- {
115
- "toolId": "memory",
116
- "action": "list",
117
- "level": "titles"
118
- }
119
- \`\`\`
120
-
121
- Level options:
122
- - "titles": ID and title only (default, recommended)
123
- - "descriptions": ID, title, and description
124
- - "full": All fields including expiration and timestamps
125
-
126
- 5. READ - Load a memory's full content
127
- \`\`\`json
128
- {
129
- "toolId": "memory",
130
- "action": "read",
131
- "id": "mem-123-abc"
132
- }
133
- \`\`\`
134
-
135
- 6. SEARCH - Find memories by keyword
136
- \`\`\`json
137
- {
138
- "toolId": "memory",
139
- "action": "search",
140
- "query": "TypeScript"
141
- }
142
- \`\`\`
143
-
144
- 7. STATS - Get memory statistics
145
- \`\`\`json
146
- {
147
- "toolId": "memory",
148
- "action": "stats"
149
- }
150
- \`\`\`
151
-
152
- 8. REMINISCE - Browse your own pre-compaction conversation archive (READ-ONLY)
153
-
154
- This is separate from the other actions. It does NOT read memory entries —
155
- it reads your full past conversation as stored on disk. Use it when you
156
- recall a detail from earlier in the session (a user instruction, a tool
157
- output, an earlier decision) that's no longer in your recent context
158
- because compaction removed it. The archive is durable: every message you
159
- and the user exchanged is still there, even if you can't see it now.
160
-
161
- The stable pointer is \`messageId\`. You can bookmark one result (e.g. from
162
- \`search\`) and use it later in \`around\` to pull the surrounding context.
163
- messageIds never change, even as the conversation grows or compaction runs.
164
-
165
- Sub-modes:
166
-
167
- 8a. overview — "where have I been"
168
- \`\`\`json
169
- { "toolId": "memory", "action": "reminisce", "mode": "overview" }
170
- \`\`\`
171
- Returns: totalMessages, firstAt, lastAt, totalApproxTokens, and a sparse
172
- timeline of ~20 evenly-spaced markers { at, role, messageId, snippet }.
173
-
174
- 8b. range — slice by index or timestamp
175
- \`\`\`json
176
- {
177
- "toolId": "memory", "action": "reminisce", "mode": "range",
178
- "offset": 0, "limit": 20,
179
- "from": "2026-04-18T00:00:00Z", "to": "2026-04-18T12:00:00Z"
180
- }
181
- \`\`\`
182
- Returns: { messages, total, offset, limit, hasMore }.
183
-
184
- 8c. search substring across content + tool-call arguments
185
- \`\`\`json
186
- {
187
- "toolId": "memory", "action": "reminisce", "mode": "search",
188
- "query": "database schema", "role": "user", "maxResults": 10
189
- }
190
- \`\`\`
191
- Returns: { matches [{ messageId, role, at, source, snippet, highlightRanges }],
192
- total, hasMore, cursor }.
193
- Pass \`cursor\` back verbatim to get the next page.
194
- Note: search does NOT match tool results/outputs only content and
195
- tool-call arguments.
196
-
197
- 8d. around N MESSAGES before + N MESSAGES after a bookmarked messageId
198
- \`\`\`json
199
- {
200
- "toolId": "memory", "action": "reminisce", "mode": "around",
201
- "messageId": "msg_abc", "before": 3, "after": 3
202
- }
203
- \`\`\`
204
- \`before\` and \`after\` count MESSAGES (not lines, not characters).
205
- Range: 0–20 each side. For a larger window, paginate with a new \`around\`
206
- call anchored at the messageId of the last-returned entry.
207
- Returns: { messages, center, targetFound }.
208
-
209
- 8e. byTool list your past tool calls (optionally filtered)
210
- \`\`\`json
211
- {
212
- "toolId": "memory", "action": "reminisce", "mode": "byTool",
213
- "toolId": "terminal", "limit": 20
214
- }
215
- \`\`\`
216
- Returns: { toolCalls [{ messageId, at, toolId, status, inputSnippet }],
217
- total, hasMore, cursor }.
218
-
219
- 8f. read open ONE message at sub-message granularity (lines OR chars)
220
- \`\`\`json
221
- // Read whole message (byte-capped at ~32 KB)
222
- { "toolId": "memory", "action": "reminisce", "mode": "read",
223
- "messageId": "msg_abc" }
224
-
225
- // Read lines 100–150 of a long message (stack trace, paste, etc.)
226
- { "toolId": "memory", "action": "reminisce", "mode": "read",
227
- "messageId": "msg_abc", "lineFrom": 100, "lineTo": 150 }
228
-
229
- // Read characters 5000–7000 (half-open range)
230
- { "toolId": "memory", "action": "reminisce", "mode": "read",
231
- "messageId": "msg_abc", "contentFrom": 5000, "contentTo": 7000 }
232
- \`\`\`
233
- Use this when \`search\` found a hit inside a huge message and the snippet
234
- isn't enough, OR when you want to page through a single long message
235
- without pulling the whole thing into context.
236
-
237
- Window selectors are mutually exclusive if you pass both, LINES win.
238
- Omit both selectors to read the whole message. Caps: 500 lines / 16 000
239
- chars per call. If the message is larger, the response's
240
- \`contentWindow.hasMoreAfter\` is true call \`read\` again with the next
241
- \`lineFrom\` or \`contentFrom\` to continue.
242
-
243
- Returns:
244
- \`\`\`
245
- {
246
- message: {
247
- messageId, role, at, tokenCount, hasToolCalls, model,
248
- content: "<requested slice>",
249
- contentWindow: {
250
- kind: "lines" | "chars" | "full",
251
- lineFrom?, lineTo?, totalLines?, // kind="lines"
252
- contentFrom?, contentTo?, // kind="chars"
253
- totalContentLength,
254
- hasMoreBefore, hasMoreAfter,
255
- truncatedAtBytes // byte cap kicked in mid-window
256
- }
257
- },
258
- targetFound, center
259
- }
260
- \`\`\`
261
-
262
- All reminisce responses are byte-capped (~32 KB) to protect your context.
263
- When a response is capped it includes \`truncatedByBytes > 0\`; fetch fewer
264
- or narrower results.
265
-
266
- Add \`"detail": "full"\` on range/around to receive full untruncated content
267
- and the raw toolExecutions / contextReferences — use sparingly; it eats
268
- tokens fast.
269
-
270
- BEST PRACTICES:
271
- - Use memories for important facts, preferences, or decisions that should persist
272
- - Keep titles concise and searchable
273
- - Use descriptions for quick context without loading full content
274
- - Set expiration dates for time-sensitive information
275
- - Use LIST with "titles" first, then READ specific memories as needed
276
- - Avoid storing sensitive data (API keys, passwords) in memories
277
- - For reminisce: start with \`overview\`, then \`search\` or \`range\` to find
278
- the right messageId, then \`around\` for surrounding messages or \`read\`
279
- to open a specific message (whole, by line range, or by char range).
280
- Bookmark messageIds in memory entries via \`[reminisce:msg_xxx]\`
281
- references for a durable pointer that survives compaction.
282
- `;
283
- }
284
-
285
- /**
286
- * Parse parameters from tool command content
287
- * @param {string} content - Raw tool command content
288
- * @returns {Object} Parsed parameters
289
- */
290
- parseParameters(content) {
291
- // Already parsed as JSON by the time it reaches here
292
- return content;
293
- }
294
-
295
- /**
296
- * Get required parameters based on action
297
- * @returns {Array<string>}
298
- */
299
- getRequiredParameters() {
300
- return ['action'];
301
- }
302
-
303
- /**
304
- * Validate parameter types
305
- * @param {Object} params
306
- * @returns {Object}
307
- */
308
- validateParameterTypes(params) {
309
- const errors = [];
310
-
311
- if (params.action && typeof params.action !== 'string') {
312
- errors.push('action must be a string');
313
- }
314
-
315
- if (params.id && typeof params.id !== 'string') {
316
- errors.push('id must be a string');
317
- }
318
-
319
- if (params.title && typeof params.title !== 'string') {
320
- errors.push('title must be a string');
321
- }
322
-
323
- if (params.description && typeof params.description !== 'string') {
324
- errors.push('description must be a string');
325
- }
326
-
327
- if (params.content && typeof params.content !== 'string') {
328
- errors.push('content must be a string');
329
- }
330
-
331
- if (params.query && typeof params.query !== 'string') {
332
- errors.push('query must be a string');
333
- }
334
-
335
- if (params.level && !['titles', 'descriptions', 'full'].includes(params.level)) {
336
- errors.push('level must be one of: titles, descriptions, full');
337
- }
338
-
339
- return {
340
- valid: errors.length === 0,
341
- errors
342
- };
343
- }
344
-
345
- /**
346
- * Custom parameter validation
347
- * @param {Object} params
348
- * @returns {Object}
349
- */
350
- customValidateParameters(params) {
351
- const errors = [];
352
- const validActions = ['add', 'update', 'delete', 'list', 'read', 'search', 'stats', 'reminisce'];
353
-
354
- if (!params.action) {
355
- errors.push('action is required');
356
- } else if (!validActions.includes(params.action)) {
357
- errors.push(`action must be one of: ${validActions.join(', ')}`);
358
- } else {
359
- // Validate action-specific requirements
360
- switch (params.action) {
361
- case 'add':
362
- if (!params.title) errors.push('title is required for add action');
363
- if (!params.content) errors.push('content is required for add action');
364
- break;
365
- case 'update':
366
- if (!params.id) errors.push('id is required for update action');
367
- break;
368
- case 'delete':
369
- if (!params.id) errors.push('id is required for delete action');
370
- break;
371
- case 'read':
372
- if (!params.id) errors.push('id is required for read action');
373
- break;
374
- case 'search':
375
- if (!params.query) errors.push('query is required for search action');
376
- break;
377
- }
378
- }
379
-
380
- // Length limits
381
- if (params.title && params.title.length > 200) {
382
- errors.push('title cannot exceed 200 characters');
383
- }
384
-
385
- if (params.description && params.description.length > 500) {
386
- errors.push('description cannot exceed 500 characters');
387
- }
388
-
389
- if (params.content && params.content.length > 10000) {
390
- errors.push('content cannot exceed 10000 characters');
391
- }
392
-
393
- return {
394
- valid: errors.length === 0,
395
- errors
396
- };
397
- }
398
-
399
- /**
400
- * Execute tool with parsed parameters
401
- * @param {Object} params
402
- * @param {Object} context
403
- * @returns {Promise<Object>}
404
- */
405
- async execute(params, context) {
406
- const { action } = params;
407
- const { agentId } = context;
408
-
409
- if (!agentId) {
410
- throw new Error('Agent ID is required for memory tool');
411
- }
412
-
413
- const memoryService = await this._ensureMemoryService();
414
-
415
- try {
416
- switch (action) {
417
- case 'add':
418
- return await this._executeAdd(memoryService, agentId, params);
419
- case 'update':
420
- return await this._executeUpdate(memoryService, agentId, params);
421
- case 'delete':
422
- return await this._executeDelete(memoryService, agentId, params);
423
- case 'list':
424
- return await this._executeList(memoryService, agentId, params);
425
- case 'read':
426
- return await this._executeRead(memoryService, agentId, params);
427
- case 'search':
428
- return await this._executeSearch(memoryService, agentId, params);
429
- case 'stats':
430
- return await this._executeStats(memoryService, agentId);
431
- case 'reminisce':
432
- return await this._executeReminisce(agentId, params, context);
433
- default:
434
- throw new Error(`Unknown action: ${action}`);
435
- }
436
- } catch (error) {
437
- this.logger?.error(`Memory tool execution failed: ${error.message}`, {
438
- agentId,
439
- action,
440
- error: error.stack
441
- });
442
- throw error;
443
- }
444
- }
445
-
446
- /**
447
- * Execute ADD action
448
- */
449
- async _executeAdd(memoryService, agentId, params) {
450
- const memory = await memoryService.addMemory(agentId, {
451
- title: params.title,
452
- description: params.description || '',
453
- content: params.content,
454
- expiration: params.expiration
455
- });
456
-
457
- return {
458
- success: true,
459
- action: 'add',
460
- memory: {
461
- id: memory.id,
462
- title: memory.title,
463
- createdAt: memory.createdAt,
464
- expiration: memory.expiration
465
- },
466
- message: `Memory created: "${memory.title}" (${memory.id})`
467
- };
468
- }
469
-
470
- /**
471
- * Execute UPDATE action
472
- */
473
- async _executeUpdate(memoryService, agentId, params) {
474
- const updates = {};
475
- if (params.title !== undefined) updates.title = params.title;
476
- if (params.description !== undefined) updates.description = params.description;
477
- if (params.content !== undefined) updates.content = params.content;
478
- if (params.expiration !== undefined) updates.expiration = params.expiration;
479
-
480
- const memory = await memoryService.updateMemory(agentId, params.id, updates);
481
-
482
- if (!memory) {
483
- return {
484
- success: false,
485
- action: 'update',
486
- message: `Memory not found: ${params.id}`
487
- };
488
- }
489
-
490
- return {
491
- success: true,
492
- action: 'update',
493
- memory: {
494
- id: memory.id,
495
- title: memory.title,
496
- updatedAt: memory.updatedAt
497
- },
498
- message: `Memory updated: "${memory.title}"`
499
- };
500
- }
501
-
502
- /**
503
- * Execute DELETE action
504
- */
505
- async _executeDelete(memoryService, agentId, params) {
506
- const deleted = await memoryService.deleteMemory(agentId, params.id);
507
-
508
- if (!deleted) {
509
- return {
510
- success: false,
511
- action: 'delete',
512
- message: `Memory not found: ${params.id}`
513
- };
514
- }
515
-
516
- return {
517
- success: true,
518
- action: 'delete',
519
- message: `Memory deleted: ${params.id}`
520
- };
521
- }
522
-
523
- /**
524
- * Execute LIST action
525
- */
526
- async _executeList(memoryService, agentId, params) {
527
- const level = params.level || 'titles';
528
- const result = await memoryService.listMemories(agentId, level);
529
-
530
- return {
531
- success: true,
532
- action: 'list',
533
- level,
534
- totalMemories: result.count,
535
- memoriesByDate: result.grouped,
536
- message: result.count === 0
537
- ? 'No memories found'
538
- : `Found ${result.count} memories`
539
- };
540
- }
541
-
542
- /**
543
- * Execute READ action
544
- */
545
- async _executeRead(memoryService, agentId, params) {
546
- const memory = await memoryService.readMemory(agentId, params.id);
547
-
548
- if (!memory) {
549
- return {
550
- success: false,
551
- action: 'read',
552
- message: `Memory not found: ${params.id}`
553
- };
554
- }
555
-
556
- return {
557
- success: true,
558
- action: 'read',
559
- memory: {
560
- id: memory.id,
561
- title: memory.title,
562
- description: memory.description,
563
- content: memory.content,
564
- createdAt: memory.createdAt,
565
- updatedAt: memory.updatedAt,
566
- expiration: memory.expiration,
567
- accessCount: memory.accessCount
568
- },
569
- message: `Memory loaded: "${memory.title}"`
570
- };
571
- }
572
-
573
- /**
574
- * Execute SEARCH action
575
- */
576
- async _executeSearch(memoryService, agentId, params) {
577
- const results = await memoryService.searchMemories(agentId, params.query);
578
-
579
- return {
580
- success: true,
581
- action: 'search',
582
- query: params.query,
583
- results,
584
- message: results.length === 0
585
- ? `No memories found matching "${params.query}"`
586
- : `Found ${results.length} memories matching "${params.query}"`
587
- };
588
- }
589
-
590
- /**
591
- * Execute STATS action
592
- */
593
- async _executeStats(memoryService, agentId) {
594
- const stats = await memoryService.getMemoryStats(agentId);
595
-
596
- return {
597
- success: true,
598
- action: 'stats',
599
- stats,
600
- message: `Memory statistics: ${stats.totalMemories} total memories, ${stats.totalAccessCount} total accesses`
601
- };
602
- }
603
-
604
- /**
605
- * Execute REMINISCE action read-only query over the agent's
606
- * pre-compaction conversation archive (conversations.full.messages).
607
- *
608
- * Unlike the other memory actions, reminisce does NOT touch memoryService.
609
- * It's a lens over a different dataset: the conversation history that
610
- * stateManager preserves durably on disk regardless of compaction. The
611
- * agent uses it to pull specific spans of past context back into the
612
- * current turn when they've fallen out of the active context window.
613
- *
614
- * Pointer contract: `messageId` values returned here are stable across
615
- * session growth and compaction — an agent can bookmark one now and
616
- * resolve it in a much later turn (see services/conversationQuery.js).
617
- *
618
- * @param {string} agentId
619
- * @param {Object} params
620
- * @param {'overview'|'range'|'search'|'around'|'byTool'} params.mode
621
- * @param {Object} context Must carry `agentPool` to fetch the agent's
622
- * conversation. If missing, returns a clean
623
- * failure (not a crash).
624
- */
625
- async _executeReminisce(agentId, params, context) {
626
- const mode = typeof params.mode === 'string' ? params.mode : '';
627
- const validModes = ['overview', 'range', 'search', 'around', 'byTool', 'read'];
628
- if (!validModes.includes(mode)) {
629
- return {
630
- success: false,
631
- action: 'reminisce',
632
- error: `mode must be one of: ${validModes.join(', ')}`,
633
- };
634
- }
635
-
636
- const agentPool = context?.agentPool;
637
- if (!agentPool?.getAgent) {
638
- return {
639
- success: false,
640
- action: 'reminisce',
641
- error: 'agentPool is not available on the tool context; cannot read conversation archive',
642
- };
643
- }
644
-
645
- const agent = await agentPool.getAgent(agentId);
646
- if (!agent) {
647
- return {
648
- success: false,
649
- action: 'reminisce',
650
- error: `Agent not found: ${agentId}`,
651
- };
652
- }
653
-
654
- // Always read from conversations.full — the durable archive that
655
- // survives every compaction pass. Never from per-model views.
656
- const messages = agent?.conversations?.full?.messages;
657
- if (!Array.isArray(messages)) {
658
- return {
659
- success: true,
660
- action: 'reminisce',
661
- mode,
662
- result: { empty: true, message: 'No conversation archive found for this agent.' },
663
- };
664
- }
665
-
666
- // Pass only the params relevant to each mode — conversationQuery's
667
- // per-mode validators clamp/default the rest.
668
- const modeParams = {
669
- from: params.from, to: params.to,
670
- offset: params.offset, limit: params.limit,
671
- query: params.query, role: params.role,
672
- maxResults: params.maxResults, cursor: params.cursor,
673
- messageId: params.messageId, before: params.before, after: params.after,
674
- toolId: params.toolId, detail: params.detail,
675
- // read-only window selectors (sub-message granularity)
676
- lineFrom: params.lineFrom, lineTo: params.lineTo,
677
- contentFrom: params.contentFrom, contentTo: params.contentTo,
678
- // Opt-in reasoning-content inclusion (default off — chain-of-thought
679
- // text can be very long; agents ask for it only when they actually
680
- // want to inspect what the model was thinking).
681
- includeReasoning: !!params.includeReasoning,
682
- };
683
-
684
- let result;
685
- switch (mode) {
686
- case 'overview': result = convOverview(messages); break;
687
- case 'range': result = convRange(messages, modeParams); break;
688
- case 'search': result = convSearch(messages, modeParams); break;
689
- case 'around': result = convAround(messages, modeParams); break;
690
- case 'byTool': result = convByTool(messages, modeParams); break;
691
- case 'read': result = convRead(messages, modeParams); break;
692
- }
693
-
694
- return {
695
- success: true,
696
- action: 'reminisce',
697
- mode,
698
- result,
699
- };
700
- }
701
-
702
- /**
703
- * Get supported actions
704
- * @returns {Array<string>}
705
- */
706
- getSupportedActions() {
707
- return ['add', 'update', 'delete', 'list', 'read', 'search', 'stats', 'reminisce'];
708
- }
709
-
710
- /**
711
- * Get parameter schema
712
- * @returns {Object}
713
- */
714
- getParameterSchema() {
715
- return {
716
- type: 'object',
717
- properties: {
718
- action: {
719
- type: 'string',
720
- enum: ['add', 'update', 'delete', 'list', 'read', 'search', 'stats', 'reminisce'],
721
- description: 'Action to perform'
722
- },
723
- id: {
724
- type: 'string',
725
- description: 'Memory ID (required for update, delete, read)'
726
- },
727
- title: {
728
- type: 'string',
729
- maxLength: 200,
730
- description: 'Memory title (required for add)'
731
- },
732
- description: {
733
- type: 'string',
734
- maxLength: 500,
735
- description: 'One-line description'
736
- },
737
- content: {
738
- type: 'string',
739
- maxLength: 10000,
740
- description: 'Full memory content (required for add)'
741
- },
742
- expiration: {
743
- oneOf: [
744
- { type: 'null' },
745
- { type: 'string' }
746
- ],
747
- description: 'Expiration date (ISO) or condition string'
748
- },
749
- level: {
750
- type: 'string',
751
- enum: ['titles', 'descriptions', 'full'],
752
- description: 'Detail level for list action'
753
- },
754
- query: {
755
- type: 'string',
756
- description: 'Search query (required for memory search AND reminisce search)'
757
- },
758
-
759
- // ── reminisce-specific parameters ────────────────────────────────
760
- // Required when action="reminisce"; ignored otherwise.
761
- mode: {
762
- type: 'string',
763
- enum: ['overview', 'range', 'search', 'around', 'byTool', 'read'],
764
- description: 'Reminisce sub-mode (required for action="reminisce")'
765
- },
766
- messageId: {
767
- type: 'string',
768
- description: 'Stable conversation-archive pointer. Required for reminisce around/read.'
769
- },
770
- from: { type: 'string', description: 'ISO timestamp lower bound (reminisce range)' },
771
- to: { type: 'string', description: 'ISO timestamp upper bound (reminisce range)' },
772
- offset: { type: 'integer', description: 'Pagination offset (reminisce range)' },
773
- limit: { type: 'integer', description: 'Max entries (reminisce range/byTool), 1–100' },
774
- maxResults: { type: 'integer', description: 'Max search matches (reminisce search), 1–50' },
775
- role: {
776
- type: 'string',
777
- enum: ['user', 'assistant', 'system'],
778
- description: 'Role filter for reminisce search'
779
- },
780
- cursor: { type: 'string', description: 'Opaque pagination cursor (reminisce search/byTool) — pass verbatim from a previous response' },
781
- toolId: { type: 'string', description: 'Filter by toolId (reminisce byTool)' },
782
- before: { type: 'integer', description: 'Messages BEFORE the target (reminisce around), 0–20' },
783
- after: { type: 'integer', description: 'Messages AFTER the target (reminisce around), 0–20' },
784
- lineFrom: { type: 'integer', description: 'First line (reminisce read), 1-indexed inclusive' },
785
- lineTo: { type: 'integer', description: 'Last line (reminisce read), 1-indexed inclusive; window ≤ 500 lines' },
786
- contentFrom: { type: 'integer', description: 'Char offset start (reminisce read), 0-indexed inclusive. Ignored if lineFrom is set.' },
787
- contentTo: { type: 'integer', description: 'Char offset end (reminisce read), 0-indexed exclusive; window ≤ 16000 chars' },
788
- detail: {
789
- type: 'string',
790
- enum: ['default', 'full'],
791
- description: 'Reminisce return shape: "default" (truncated/slim) or "full" (everything)'
792
- }
793
- },
794
- required: ['action']
795
- };
796
- }
797
-
798
- /**
799
- * Get tool capabilities
800
- * @returns {Object}
801
- */
802
- getCapabilities() {
803
- const baseCapabilities = super.getCapabilities();
804
-
805
- return {
806
- ...baseCapabilities,
807
- persistent: true,
808
- actions: this.getSupportedActions(),
809
- useCases: [
810
- 'user-preferences',
811
- 'project-context',
812
- 'important-decisions',
813
- 'learned-patterns',
814
- 'task-history'
815
- ]
816
- };
817
- }
818
- }
819
-
820
- export default MemoryTool;
1
+ /**
2
+ * Memory Tool - Persistent memory storage for agents
3
+ *
4
+ * Purpose:
5
+ * - Allow agents to store, retrieve, update, and delete persistent memories
6
+ * - Memories persist across sessions and agent restarts
7
+ * - Support expiration conditions (date-based or custom conditions)
8
+ * - Group memories by date for organized retrieval
9
+ *
10
+ * Actions:
11
+ * - add: Create a new memory
12
+ * - update: Update an existing memory
13
+ * - delete: Remove a memory
14
+ * - list: List memories with configurable detail level
15
+ * - read: Load a memory's full content into context
16
+ * - search: Search memories by title or description
17
+ * - stats: Get memory statistics
18
+ */
19
+
20
+ import { BaseTool } from './baseTool.js';
21
+ import { getMemoryService, PLAN_TITLE_PREFIX } from '../services/memoryService.js';
22
+
23
+ /**
24
+ * True if the given memory title is a "working plan" — those are
25
+ * auto-injected into the agent's system prompt under AGENT WORKING
26
+ * PLAN, so the tool result for ADD/UPDATE/READ on these should NOT
27
+ * echo the full content (would duplicate ~bulk into the conversation).
28
+ *
29
+ * TODO (future Plan C): add `team-plan/` prefix here too once the
30
+ * team-shared variant lands — same compression rules apply.
31
+ */
32
+ function isPlanTitle(title) {
33
+ return typeof title === 'string' && title.startsWith(PLAN_TITLE_PREFIX);
34
+ }
35
+ import {
36
+ overview as convOverview,
37
+ range as convRange,
38
+ search as convSearch,
39
+ around as convAround,
40
+ byTool as convByTool,
41
+ read as convRead,
42
+ } from '../services/conversationQuery.js';
43
+
44
+ class MemoryTool extends BaseTool {
45
+ constructor(config = {}, logger = null) {
46
+ super(config, logger);
47
+
48
+ this.memoryService = null;
49
+
50
+ // Tool metadata
51
+ this.requiresProject = false;
52
+ this.isAsync = false;
53
+ this.timeout = 30000; // 30 seconds
54
+ }
55
+
56
+ /**
57
+ * Initialize memory service lazily
58
+ */
59
+ async _ensureMemoryService() {
60
+ if (!this.memoryService) {
61
+ this.memoryService = getMemoryService(this.logger);
62
+ await this.memoryService.initialize();
63
+ }
64
+ return this.memoryService;
65
+ }
66
+
67
+ /**
68
+ * Get tool description for LLM consumption
69
+ * @returns {string} Tool description
70
+ */
71
+ getDescription() {
72
+ return `
73
+ Memory Tool: Store and retrieve persistent memories that survive across sessions.
74
+
75
+ ★ WORKING PLAN MEMORIES (auto-injected into system prompt):
76
+ If a memory's TITLE starts with "plan/" (e.g. "plan/research", "plan/refactor-v2"),
77
+ it is treated as a "working plan" and auto-injected into your system prompt
78
+ under an "AGENT WORKING PLAN" header EVERY TURN, until you delete or rename it.
79
+ This is the right tool for arc-spanning strategy that should persist across
80
+ sessions: the why, the constraints, the long-horizon plan.
81
+
82
+ Use it WHEN:
83
+ - You're working on something that will take multiple turns or sessions.
84
+ - You want to record a strategy/approach that you should re-read every turn.
85
+ - You want notes that will outlive the current chat history.
86
+
87
+ Do NOT use it for:
88
+ - Step-by-step within-task checkboxes that's what the task-manager tool
89
+ (TodoList) is for. Plans answer "the why"; the task list answers "what
90
+ am I doing right now."
91
+ - One-shot facts the agent will only need once.
92
+
93
+ Size guard: each plan/* memory is capped at ~2000 tokens before truncation,
94
+ and the total of all plan/* memories is capped at ~8000 tokens. If exceeded,
95
+ the content is truncated AND a warning is logged for the operator. Summarize
96
+ verbose plans yourself rather than relying on the truncation.
97
+
98
+ After add/update of a plan/* memory, the tool DOES NOT echo the content back
99
+ in the result — it would duplicate the header injection. You'll see the plan
100
+ in your system prompt on the next turn instead.
101
+
102
+ USAGE:
103
+ \`\`\`json
104
+ {
105
+ "toolId": "memory",
106
+ "action": "<action>",
107
+ "parameters": { ... }
108
+ }
109
+ \`\`\`
110
+
111
+ ACTIONS:
112
+
113
+ 1. ADD - Create a new memory
114
+ \`\`\`json
115
+ {
116
+ "toolId": "memory",
117
+ "action": "add",
118
+ "title": "User prefers TypeScript",
119
+ "description": "Programming language preference",
120
+ "content": "The user explicitly stated they prefer TypeScript over JavaScript.",
121
+ "expiration": null
122
+ }
123
+ \`\`\`
124
+
125
+ Expiration options:
126
+ - null or omit: Never expires
127
+ - "2025-06-01": Expires on date (ISO format)
128
+ - "When user changes preference": Custom condition (manually removed)
129
+
130
+ 2. UPDATE - Modify an existing memory
131
+ \`\`\`json
132
+ {
133
+ "toolId": "memory",
134
+ "action": "update",
135
+ "id": "mem-123-abc",
136
+ "title": "Updated title",
137
+ "description": "Updated description",
138
+ "content": "Updated content",
139
+ "expiration": "2025-12-31"
140
+ }
141
+ \`\`\`
142
+
143
+ 3. DELETE - Remove a memory
144
+ \`\`\`json
145
+ {
146
+ "toolId": "memory",
147
+ "action": "delete",
148
+ "id": "mem-123-abc"
149
+ }
150
+ \`\`\`
151
+
152
+ 4. LIST - List memories (grouped by date, newest first)
153
+ \`\`\`json
154
+ {
155
+ "toolId": "memory",
156
+ "action": "list",
157
+ "level": "titles"
158
+ }
159
+ \`\`\`
160
+
161
+ Level options:
162
+ - "titles": ID and title only (default, recommended)
163
+ - "descriptions": ID, title, and description
164
+ - "full": All fields including expiration and timestamps
165
+
166
+ 5. READ - Load a memory's full content
167
+ \`\`\`json
168
+ {
169
+ "toolId": "memory",
170
+ "action": "read",
171
+ "id": "mem-123-abc"
172
+ }
173
+ \`\`\`
174
+
175
+ 6. SEARCH - Find memories by keyword
176
+ \`\`\`json
177
+ {
178
+ "toolId": "memory",
179
+ "action": "search",
180
+ "query": "TypeScript"
181
+ }
182
+ \`\`\`
183
+
184
+ 7. STATS - Get memory statistics
185
+ \`\`\`json
186
+ {
187
+ "toolId": "memory",
188
+ "action": "stats"
189
+ }
190
+ \`\`\`
191
+
192
+ 8. REMINISCE - Browse your own pre-compaction conversation archive (READ-ONLY)
193
+
194
+ This is separate from the other actions. It does NOT read memory entries
195
+ it reads your full past conversation as stored on disk. Use it when you
196
+ recall a detail from earlier in the session (a user instruction, a tool
197
+ output, an earlier decision) that's no longer in your recent context
198
+ because compaction removed it. The archive is durable: every message you
199
+ and the user exchanged is still there, even if you can't see it now.
200
+
201
+ The stable pointer is \`messageId\`. You can bookmark one result (e.g. from
202
+ \`search\`) and use it later in \`around\` to pull the surrounding context.
203
+ messageIds never change, even as the conversation grows or compaction runs.
204
+
205
+ Sub-modes:
206
+
207
+ 8a. overview "where have I been"
208
+ \`\`\`json
209
+ { "toolId": "memory", "action": "reminisce", "mode": "overview" }
210
+ \`\`\`
211
+ Returns: totalMessages, firstAt, lastAt, totalApproxTokens, and a sparse
212
+ timeline of ~20 evenly-spaced markers { at, role, messageId, snippet }.
213
+
214
+ 8b. range — slice by index or timestamp
215
+ \`\`\`json
216
+ {
217
+ "toolId": "memory", "action": "reminisce", "mode": "range",
218
+ "offset": 0, "limit": 20,
219
+ "from": "2026-04-18T00:00:00Z", "to": "2026-04-18T12:00:00Z"
220
+ }
221
+ \`\`\`
222
+ Returns: { messages, total, offset, limit, hasMore }.
223
+
224
+ 8c. search — substring across content + tool-call arguments
225
+ \`\`\`json
226
+ {
227
+ "toolId": "memory", "action": "reminisce", "mode": "search",
228
+ "query": "database schema", "role": "user", "maxResults": 10
229
+ }
230
+ \`\`\`
231
+ Returns: { matches [{ messageId, role, at, source, snippet, highlightRanges }],
232
+ total, hasMore, cursor }.
233
+ Pass \`cursor\` back verbatim to get the next page.
234
+ Note: search does NOT match tool results/outputs only content and
235
+ tool-call arguments.
236
+
237
+ 8d. around N MESSAGES before + N MESSAGES after a bookmarked messageId
238
+ \`\`\`json
239
+ {
240
+ "toolId": "memory", "action": "reminisce", "mode": "around",
241
+ "messageId": "msg_abc", "before": 3, "after": 3
242
+ }
243
+ \`\`\`
244
+ \`before\` and \`after\` count MESSAGES (not lines, not characters).
245
+ Range: 0–20 each side. For a larger window, paginate with a new \`around\`
246
+ call anchored at the messageId of the last-returned entry.
247
+ Returns: { messages, center, targetFound }.
248
+
249
+ 8e. byTool — list your past tool calls (optionally filtered)
250
+ \`\`\`json
251
+ {
252
+ "toolId": "memory", "action": "reminisce", "mode": "byTool",
253
+ "toolId": "terminal", "limit": 20
254
+ }
255
+ \`\`\`
256
+ Returns: { toolCalls [{ messageId, at, toolId, status, inputSnippet }],
257
+ total, hasMore, cursor }.
258
+
259
+ 8f. read — open ONE message at sub-message granularity (lines OR chars)
260
+ \`\`\`json
261
+ // Read whole message (byte-capped at ~32 KB)
262
+ { "toolId": "memory", "action": "reminisce", "mode": "read",
263
+ "messageId": "msg_abc" }
264
+
265
+ // Read lines 100–150 of a long message (stack trace, paste, etc.)
266
+ { "toolId": "memory", "action": "reminisce", "mode": "read",
267
+ "messageId": "msg_abc", "lineFrom": 100, "lineTo": 150 }
268
+
269
+ // Read characters 5000–7000 (half-open range)
270
+ { "toolId": "memory", "action": "reminisce", "mode": "read",
271
+ "messageId": "msg_abc", "contentFrom": 5000, "contentTo": 7000 }
272
+ \`\`\`
273
+ Use this when \`search\` found a hit inside a huge message and the snippet
274
+ isn't enough, OR when you want to page through a single long message
275
+ without pulling the whole thing into context.
276
+
277
+ Window selectors are mutually exclusive if you pass both, LINES win.
278
+ Omit both selectors to read the whole message. Caps: 500 lines / 16 000
279
+ chars per call. If the message is larger, the response's
280
+ \`contentWindow.hasMoreAfter\` is true call \`read\` again with the next
281
+ \`lineFrom\` or \`contentFrom\` to continue.
282
+
283
+ Returns:
284
+ \`\`\`
285
+ {
286
+ message: {
287
+ messageId, role, at, tokenCount, hasToolCalls, model,
288
+ content: "<requested slice>",
289
+ contentWindow: {
290
+ kind: "lines" | "chars" | "full",
291
+ lineFrom?, lineTo?, totalLines?, // kind="lines"
292
+ contentFrom?, contentTo?, // kind="chars"
293
+ totalContentLength,
294
+ hasMoreBefore, hasMoreAfter,
295
+ truncatedAtBytes // byte cap kicked in mid-window
296
+ }
297
+ },
298
+ targetFound, center
299
+ }
300
+ \`\`\`
301
+
302
+ All reminisce responses are byte-capped (~32 KB) to protect your context.
303
+ When a response is capped it includes \`truncatedByBytes > 0\`; fetch fewer
304
+ or narrower results.
305
+
306
+ Add \`"detail": "full"\` on range/around to receive full untruncated content
307
+ and the raw toolExecutions / contextReferences — use sparingly; it eats
308
+ tokens fast.
309
+
310
+ BEST PRACTICES:
311
+ - Use memories for important facts, preferences, or decisions that should persist
312
+ - Keep titles concise and searchable
313
+ - Use descriptions for quick context without loading full content
314
+ - Set expiration dates for time-sensitive information
315
+ - Use LIST with "titles" first, then READ specific memories as needed
316
+ - Avoid storing sensitive data (API keys, passwords) in memories
317
+ - For reminisce: start with \`overview\`, then \`search\` or \`range\` to find
318
+ the right messageId, then \`around\` for surrounding messages or \`read\`
319
+ to open a specific message (whole, by line range, or by char range).
320
+ Bookmark messageIds in memory entries via \`[reminisce:msg_xxx]\`
321
+ references for a durable pointer that survives compaction.
322
+ `;
323
+ }
324
+
325
+ /**
326
+ * Parse parameters from tool command content
327
+ * @param {string} content - Raw tool command content
328
+ * @returns {Object} Parsed parameters
329
+ */
330
+ parseParameters(content) {
331
+ // Already parsed as JSON by the time it reaches here
332
+ return content;
333
+ }
334
+
335
+ /**
336
+ * Get required parameters based on action
337
+ * @returns {Array<string>}
338
+ */
339
+ getRequiredParameters() {
340
+ return ['action'];
341
+ }
342
+
343
+ /**
344
+ * Validate parameter types
345
+ * @param {Object} params
346
+ * @returns {Object}
347
+ */
348
+ validateParameterTypes(params) {
349
+ const errors = [];
350
+
351
+ if (params.action && typeof params.action !== 'string') {
352
+ errors.push('action must be a string');
353
+ }
354
+
355
+ if (params.id && typeof params.id !== 'string') {
356
+ errors.push('id must be a string');
357
+ }
358
+
359
+ if (params.title && typeof params.title !== 'string') {
360
+ errors.push('title must be a string');
361
+ }
362
+
363
+ if (params.description && typeof params.description !== 'string') {
364
+ errors.push('description must be a string');
365
+ }
366
+
367
+ if (params.content && typeof params.content !== 'string') {
368
+ errors.push('content must be a string');
369
+ }
370
+
371
+ if (params.query && typeof params.query !== 'string') {
372
+ errors.push('query must be a string');
373
+ }
374
+
375
+ if (params.level && !['titles', 'descriptions', 'full'].includes(params.level)) {
376
+ errors.push('level must be one of: titles, descriptions, full');
377
+ }
378
+
379
+ return {
380
+ valid: errors.length === 0,
381
+ errors
382
+ };
383
+ }
384
+
385
+ /**
386
+ * Custom parameter validation
387
+ * @param {Object} params
388
+ * @returns {Object}
389
+ */
390
+ customValidateParameters(params) {
391
+ const errors = [];
392
+ const validActions = ['add', 'update', 'delete', 'list', 'read', 'search', 'stats', 'reminisce'];
393
+
394
+ if (!params.action) {
395
+ errors.push('action is required');
396
+ } else if (!validActions.includes(params.action)) {
397
+ errors.push(`action must be one of: ${validActions.join(', ')}`);
398
+ } else {
399
+ // Validate action-specific requirements
400
+ switch (params.action) {
401
+ case 'add':
402
+ if (!params.title) errors.push('title is required for add action');
403
+ if (!params.content) errors.push('content is required for add action');
404
+ break;
405
+ case 'update':
406
+ if (!params.id) errors.push('id is required for update action');
407
+ break;
408
+ case 'delete':
409
+ if (!params.id) errors.push('id is required for delete action');
410
+ break;
411
+ case 'read':
412
+ if (!params.id) errors.push('id is required for read action');
413
+ break;
414
+ case 'search':
415
+ if (!params.query) errors.push('query is required for search action');
416
+ break;
417
+ }
418
+ }
419
+
420
+ // Length limits
421
+ if (params.title && params.title.length > 200) {
422
+ errors.push('title cannot exceed 200 characters');
423
+ }
424
+
425
+ if (params.description && params.description.length > 500) {
426
+ errors.push('description cannot exceed 500 characters');
427
+ }
428
+
429
+ if (params.content && params.content.length > 10000) {
430
+ errors.push('content cannot exceed 10000 characters');
431
+ }
432
+
433
+ return {
434
+ valid: errors.length === 0,
435
+ errors
436
+ };
437
+ }
438
+
439
+ /**
440
+ * Execute tool with parsed parameters
441
+ * @param {Object} params
442
+ * @param {Object} context
443
+ * @returns {Promise<Object>}
444
+ */
445
+ async execute(params, context) {
446
+ const { action } = params;
447
+ const { agentId } = context;
448
+
449
+ if (!agentId) {
450
+ throw new Error('Agent ID is required for memory tool');
451
+ }
452
+
453
+ const memoryService = await this._ensureMemoryService();
454
+
455
+ try {
456
+ switch (action) {
457
+ case 'add':
458
+ return await this._executeAdd(memoryService, agentId, params);
459
+ case 'update':
460
+ return await this._executeUpdate(memoryService, agentId, params);
461
+ case 'delete':
462
+ return await this._executeDelete(memoryService, agentId, params);
463
+ case 'list':
464
+ return await this._executeList(memoryService, agentId, params);
465
+ case 'read':
466
+ return await this._executeRead(memoryService, agentId, params);
467
+ case 'search':
468
+ return await this._executeSearch(memoryService, agentId, params);
469
+ case 'stats':
470
+ return await this._executeStats(memoryService, agentId);
471
+ case 'reminisce':
472
+ return await this._executeReminisce(agentId, params, context);
473
+ default:
474
+ throw new Error(`Unknown action: ${action}`);
475
+ }
476
+ } catch (error) {
477
+ this.logger?.error(`Memory tool execution failed: ${error.message}`, {
478
+ agentId,
479
+ action,
480
+ error: error.stack
481
+ });
482
+ throw error;
483
+ }
484
+ }
485
+
486
+ /**
487
+ * Execute ADD action
488
+ */
489
+ async _executeAdd(memoryService, agentId, params) {
490
+ const memory = await memoryService.addMemory(agentId, {
491
+ title: params.title,
492
+ description: params.description || '',
493
+ content: params.content,
494
+ expiration: params.expiration
495
+ });
496
+
497
+ return {
498
+ success: true,
499
+ action: 'add',
500
+ memory: {
501
+ id: memory.id,
502
+ title: memory.title,
503
+ createdAt: memory.createdAt,
504
+ expiration: memory.expiration
505
+ },
506
+ // Compressed acknowledgment for plan/* — the bulk lives in the
507
+ // AGENT WORKING PLAN header on the next turn, not in the
508
+ // conversation tool-result echo.
509
+ message: isPlanTitle(memory.title)
510
+ ? `Plan saved: "${memory.title}" (${memory.id}) — content now auto-injected as AGENT WORKING PLAN on your next turn.`
511
+ : `Memory created: "${memory.title}" (${memory.id})`
512
+ };
513
+ }
514
+
515
+ /**
516
+ * Execute UPDATE action
517
+ */
518
+ async _executeUpdate(memoryService, agentId, params) {
519
+ const updates = {};
520
+ if (params.title !== undefined) updates.title = params.title;
521
+ if (params.description !== undefined) updates.description = params.description;
522
+ if (params.content !== undefined) updates.content = params.content;
523
+ if (params.expiration !== undefined) updates.expiration = params.expiration;
524
+
525
+ const memory = await memoryService.updateMemory(agentId, params.id, updates);
526
+
527
+ if (!memory) {
528
+ return {
529
+ success: false,
530
+ action: 'update',
531
+ message: `Memory not found: ${params.id}`
532
+ };
533
+ }
534
+
535
+ return {
536
+ success: true,
537
+ action: 'update',
538
+ memory: {
539
+ id: memory.id,
540
+ title: memory.title,
541
+ updatedAt: memory.updatedAt
542
+ },
543
+ message: isPlanTitle(memory.title)
544
+ ? `Plan updated: "${memory.title}" — new content will appear in AGENT WORKING PLAN on your next turn.`
545
+ : `Memory updated: "${memory.title}"`
546
+ };
547
+ }
548
+
549
+ /**
550
+ * Execute DELETE action
551
+ */
552
+ async _executeDelete(memoryService, agentId, params) {
553
+ const deleted = await memoryService.deleteMemory(agentId, params.id);
554
+
555
+ if (!deleted) {
556
+ return {
557
+ success: false,
558
+ action: 'delete',
559
+ message: `Memory not found: ${params.id}`
560
+ };
561
+ }
562
+
563
+ return {
564
+ success: true,
565
+ action: 'delete',
566
+ message: `Memory deleted: ${params.id}`
567
+ };
568
+ }
569
+
570
+ /**
571
+ * Execute LIST action
572
+ */
573
+ async _executeList(memoryService, agentId, params) {
574
+ const level = params.level || 'titles';
575
+ const result = await memoryService.listMemories(agentId, level);
576
+
577
+ return {
578
+ success: true,
579
+ action: 'list',
580
+ level,
581
+ totalMemories: result.count,
582
+ memoriesByDate: result.grouped,
583
+ message: result.count === 0
584
+ ? 'No memories found'
585
+ : `Found ${result.count} memories`
586
+ };
587
+ }
588
+
589
+ /**
590
+ * Execute READ action
591
+ */
592
+ async _executeRead(memoryService, agentId, params) {
593
+ const memory = await memoryService.readMemory(agentId, params.id);
594
+
595
+ if (!memory) {
596
+ return {
597
+ success: false,
598
+ action: 'read',
599
+ message: `Memory not found: ${params.id}`
600
+ };
601
+ }
602
+
603
+ // Plan/* memories: skip echoing content into the tool result —
604
+ // the same content is already in the AGENT WORKING PLAN header
605
+ // of the system prompt on this very turn. Echoing it would
606
+ // double-tokenize the bulk and risk confusing the agent about
607
+ // which copy to trust.
608
+ if (isPlanTitle(memory.title)) {
609
+ return {
610
+ success: true,
611
+ action: 'read',
612
+ memory: {
613
+ id: memory.id,
614
+ title: memory.title,
615
+ description: memory.description,
616
+ // content intentionally omitted see AGENT WORKING PLAN header
617
+ createdAt: memory.createdAt,
618
+ updatedAt: memory.updatedAt,
619
+ expiration: memory.expiration,
620
+ accessCount: memory.accessCount
621
+ },
622
+ message:
623
+ `Plan "${memory.title}" content is auto-injected at the bottom of your system prompt ` +
624
+ `under AGENT WORKING PLAN, no need to re-read on subsequent turns.`
625
+ };
626
+ }
627
+
628
+ return {
629
+ success: true,
630
+ action: 'read',
631
+ memory: {
632
+ id: memory.id,
633
+ title: memory.title,
634
+ description: memory.description,
635
+ content: memory.content,
636
+ createdAt: memory.createdAt,
637
+ updatedAt: memory.updatedAt,
638
+ expiration: memory.expiration,
639
+ accessCount: memory.accessCount
640
+ },
641
+ message: `Memory loaded: "${memory.title}"`
642
+ };
643
+ }
644
+
645
+ /**
646
+ * Execute SEARCH action
647
+ */
648
+ async _executeSearch(memoryService, agentId, params) {
649
+ const results = await memoryService.searchMemories(agentId, params.query);
650
+
651
+ return {
652
+ success: true,
653
+ action: 'search',
654
+ query: params.query,
655
+ results,
656
+ message: results.length === 0
657
+ ? `No memories found matching "${params.query}"`
658
+ : `Found ${results.length} memories matching "${params.query}"`
659
+ };
660
+ }
661
+
662
+ /**
663
+ * Execute STATS action
664
+ */
665
+ async _executeStats(memoryService, agentId) {
666
+ const stats = await memoryService.getMemoryStats(agentId);
667
+
668
+ return {
669
+ success: true,
670
+ action: 'stats',
671
+ stats,
672
+ message: `Memory statistics: ${stats.totalMemories} total memories, ${stats.totalAccessCount} total accesses`
673
+ };
674
+ }
675
+
676
+ /**
677
+ * Execute REMINISCE action — read-only query over the agent's
678
+ * pre-compaction conversation archive (conversations.full.messages).
679
+ *
680
+ * Unlike the other memory actions, reminisce does NOT touch memoryService.
681
+ * It's a lens over a different dataset: the conversation history that
682
+ * stateManager preserves durably on disk regardless of compaction. The
683
+ * agent uses it to pull specific spans of past context back into the
684
+ * current turn when they've fallen out of the active context window.
685
+ *
686
+ * Pointer contract: `messageId` values returned here are stable across
687
+ * session growth and compaction — an agent can bookmark one now and
688
+ * resolve it in a much later turn (see services/conversationQuery.js).
689
+ *
690
+ * @param {string} agentId
691
+ * @param {Object} params
692
+ * @param {'overview'|'range'|'search'|'around'|'byTool'} params.mode
693
+ * @param {Object} context Must carry `agentPool` to fetch the agent's
694
+ * conversation. If missing, returns a clean
695
+ * failure (not a crash).
696
+ */
697
+ async _executeReminisce(agentId, params, context) {
698
+ const mode = typeof params.mode === 'string' ? params.mode : '';
699
+ const validModes = ['overview', 'range', 'search', 'around', 'byTool', 'read'];
700
+ if (!validModes.includes(mode)) {
701
+ return {
702
+ success: false,
703
+ action: 'reminisce',
704
+ error: `mode must be one of: ${validModes.join(', ')}`,
705
+ };
706
+ }
707
+
708
+ const agentPool = context?.agentPool;
709
+ if (!agentPool?.getAgent) {
710
+ return {
711
+ success: false,
712
+ action: 'reminisce',
713
+ error: 'agentPool is not available on the tool context; cannot read conversation archive',
714
+ };
715
+ }
716
+
717
+ const agent = await agentPool.getAgent(agentId);
718
+ if (!agent) {
719
+ return {
720
+ success: false,
721
+ action: 'reminisce',
722
+ error: `Agent not found: ${agentId}`,
723
+ };
724
+ }
725
+
726
+ // Always read from conversations.full — the durable archive that
727
+ // survives every compaction pass. Never from per-model views.
728
+ const messages = agent?.conversations?.full?.messages;
729
+ if (!Array.isArray(messages)) {
730
+ return {
731
+ success: true,
732
+ action: 'reminisce',
733
+ mode,
734
+ result: { empty: true, message: 'No conversation archive found for this agent.' },
735
+ };
736
+ }
737
+
738
+ // Pass only the params relevant to each mode — conversationQuery's
739
+ // per-mode validators clamp/default the rest.
740
+ const modeParams = {
741
+ from: params.from, to: params.to,
742
+ offset: params.offset, limit: params.limit,
743
+ query: params.query, role: params.role,
744
+ maxResults: params.maxResults, cursor: params.cursor,
745
+ messageId: params.messageId, before: params.before, after: params.after,
746
+ toolId: params.toolId, detail: params.detail,
747
+ // read-only window selectors (sub-message granularity)
748
+ lineFrom: params.lineFrom, lineTo: params.lineTo,
749
+ contentFrom: params.contentFrom, contentTo: params.contentTo,
750
+ // Opt-in reasoning-content inclusion (default off — chain-of-thought
751
+ // text can be very long; agents ask for it only when they actually
752
+ // want to inspect what the model was thinking).
753
+ includeReasoning: !!params.includeReasoning,
754
+ };
755
+
756
+ let result;
757
+ switch (mode) {
758
+ case 'overview': result = convOverview(messages); break;
759
+ case 'range': result = convRange(messages, modeParams); break;
760
+ case 'search': result = convSearch(messages, modeParams); break;
761
+ case 'around': result = convAround(messages, modeParams); break;
762
+ case 'byTool': result = convByTool(messages, modeParams); break;
763
+ case 'read': result = convRead(messages, modeParams); break;
764
+ }
765
+
766
+ return {
767
+ success: true,
768
+ action: 'reminisce',
769
+ mode,
770
+ result,
771
+ };
772
+ }
773
+
774
+ /**
775
+ * Get supported actions
776
+ * @returns {Array<string>}
777
+ */
778
+ getSupportedActions() {
779
+ return ['add', 'update', 'delete', 'list', 'read', 'search', 'stats', 'reminisce'];
780
+ }
781
+
782
+ /**
783
+ * Get parameter schema
784
+ * @returns {Object}
785
+ */
786
+ getParameterSchema() {
787
+ return {
788
+ type: 'object',
789
+ properties: {
790
+ action: {
791
+ type: 'string',
792
+ enum: ['add', 'update', 'delete', 'list', 'read', 'search', 'stats', 'reminisce'],
793
+ description: 'Action to perform'
794
+ },
795
+ id: {
796
+ type: 'string',
797
+ description: 'Memory ID (required for update, delete, read)'
798
+ },
799
+ title: {
800
+ type: 'string',
801
+ maxLength: 200,
802
+ description: 'Memory title (required for add)'
803
+ },
804
+ description: {
805
+ type: 'string',
806
+ maxLength: 500,
807
+ description: 'One-line description'
808
+ },
809
+ content: {
810
+ type: 'string',
811
+ maxLength: 10000,
812
+ description: 'Full memory content (required for add)'
813
+ },
814
+ expiration: {
815
+ oneOf: [
816
+ { type: 'null' },
817
+ { type: 'string' }
818
+ ],
819
+ description: 'Expiration date (ISO) or condition string'
820
+ },
821
+ level: {
822
+ type: 'string',
823
+ enum: ['titles', 'descriptions', 'full'],
824
+ description: 'Detail level for list action'
825
+ },
826
+ query: {
827
+ type: 'string',
828
+ description: 'Search query (required for memory search AND reminisce search)'
829
+ },
830
+
831
+ // ── reminisce-specific parameters ────────────────────────────────
832
+ // Required when action="reminisce"; ignored otherwise.
833
+ mode: {
834
+ type: 'string',
835
+ enum: ['overview', 'range', 'search', 'around', 'byTool', 'read'],
836
+ description: 'Reminisce sub-mode (required for action="reminisce")'
837
+ },
838
+ messageId: {
839
+ type: 'string',
840
+ description: 'Stable conversation-archive pointer. Required for reminisce around/read.'
841
+ },
842
+ from: { type: 'string', description: 'ISO timestamp lower bound (reminisce range)' },
843
+ to: { type: 'string', description: 'ISO timestamp upper bound (reminisce range)' },
844
+ offset: { type: 'integer', description: 'Pagination offset (reminisce range)' },
845
+ limit: { type: 'integer', description: 'Max entries (reminisce range/byTool), 1–100' },
846
+ maxResults: { type: 'integer', description: 'Max search matches (reminisce search), 1–50' },
847
+ role: {
848
+ type: 'string',
849
+ enum: ['user', 'assistant', 'system'],
850
+ description: 'Role filter for reminisce search'
851
+ },
852
+ cursor: { type: 'string', description: 'Opaque pagination cursor (reminisce search/byTool) — pass verbatim from a previous response' },
853
+ toolId: { type: 'string', description: 'Filter by toolId (reminisce byTool)' },
854
+ before: { type: 'integer', description: 'Messages BEFORE the target (reminisce around), 0–20' },
855
+ after: { type: 'integer', description: 'Messages AFTER the target (reminisce around), 0–20' },
856
+ lineFrom: { type: 'integer', description: 'First line (reminisce read), 1-indexed inclusive' },
857
+ lineTo: { type: 'integer', description: 'Last line (reminisce read), 1-indexed inclusive; window ≤ 500 lines' },
858
+ contentFrom: { type: 'integer', description: 'Char offset start (reminisce read), 0-indexed inclusive. Ignored if lineFrom is set.' },
859
+ contentTo: { type: 'integer', description: 'Char offset end (reminisce read), 0-indexed exclusive; window ≤ 16000 chars' },
860
+ detail: {
861
+ type: 'string',
862
+ enum: ['default', 'full'],
863
+ description: 'Reminisce return shape: "default" (truncated/slim) or "full" (everything)'
864
+ }
865
+ },
866
+ required: ['action']
867
+ };
868
+ }
869
+
870
+ /**
871
+ * Get tool capabilities
872
+ * @returns {Object}
873
+ */
874
+ getCapabilities() {
875
+ const baseCapabilities = super.getCapabilities();
876
+
877
+ return {
878
+ ...baseCapabilities,
879
+ persistent: true,
880
+ actions: this.getSupportedActions(),
881
+ useCases: [
882
+ 'user-preferences',
883
+ 'project-context',
884
+ 'important-decisions',
885
+ 'learned-patterns',
886
+ 'task-history'
887
+ ]
888
+ };
889
+ }
890
+ }
891
+
892
+ export default MemoryTool;