onbuzz 4.8.3 → 4.9.1

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 (1100) hide show
  1. package/bin/cli.js +27 -1
  2. package/bin/composio-cli.js +431 -0
  3. package/package.json +1 -1
  4. package/scripts/build-onboarding-doc.cjs +805 -0
  5. package/scripts/composio-bench/README.md +151 -0
  6. package/scripts/memory-bench/bench.mjs +576 -0
  7. package/scripts/memory-bench/live-after-2026-05-21T16-20-52-767Z.json +150 -0
  8. package/scripts/memory-bench/live-after-2026-05-21T16-37-17-147Z.json +795 -0
  9. package/scripts/memory-bench/live-after-final-2026-05-21T17-16-02-947Z.json +766 -0
  10. package/scripts/memory-bench/live-after-v2-2026-05-21T16-52-26-833Z.json +890 -0
  11. package/scripts/memory-bench/live-after-v3-2026-05-21T17-05-40-622Z.json +955 -0
  12. package/scripts/memory-bench/live-probe-v2.mjs +412 -0
  13. package/scripts/memory-bench/live-probe.mjs +387 -0
  14. package/scripts/memory-bench/live-smoke-2026-05-21T16-22-35-945Z.json +36 -0
  15. package/scripts/memory-bench/live-smoke2-2026-05-21T16-24-14-095Z.json +36 -0
  16. package/scripts/memory-bench/live-smoke3-2026-05-21T16-26-54-093Z.json +123 -0
  17. package/scripts/memory-bench/live-v2-baseline-2026-05-23T22-43-20-757Z.json +628 -0
  18. package/scripts/memory-bench/live-v2-directive-2026-05-23T21-32-41-369Z.json +628 -0
  19. package/scripts/memory-bench/live-v2-smoke-2026-05-23T20-06-37-325Z.json +34 -0
  20. package/scripts/memory-bench/live-v2-smoke-2026-05-23T20-12-48-199Z.json +38 -0
  21. package/scripts/memory-bench/results-baseline-2026-05-19T11-23-12-245Z.json +39 -0
  22. package/scripts/memory-bench/results-baseline-2026-05-19T11-30-28-763Z.json +1024 -0
  23. package/scripts/memory-bench/results-baseline-2026-05-19T11-34-19-299Z.json +1007 -0
  24. package/scripts/memory-bench/results-baseline-2026-05-19T11-44-18-054Z.json +1432 -0
  25. package/scripts/memory-bench/results-nudge-combined-2026-05-19T12-00-37-465Z.json +1413 -0
  26. package/scripts/memory-bench/results-nudge-directive-2026-05-19T11-36-52-963Z.json +210 -0
  27. package/scripts/memory-bench/results-nudge-directive-2026-05-19T11-49-55-790Z.json +1464 -0
  28. package/scripts/memory-bench/results-nudge-echo-catalog-2026-05-19T11-39-01-829Z.json +232 -0
  29. package/scripts/memory-bench/results-nudge-echo-catalog-2026-05-19T11-55-12-705Z.json +1397 -0
  30. package/scripts/memory-bench/scenarios-v2.mjs +123 -0
  31. package/scripts/memory-bench/scenarios.mjs +178 -0
  32. package/scripts/office-bench/generate-samples.mjs +180 -0
  33. package/scripts/op-posture-bench/bench.mjs +397 -0
  34. package/scripts/op-posture-bench/probe.mjs +87 -0
  35. package/scripts/op-posture-bench/results-2026-05-18T20-29-13-941Z.json +57 -0
  36. package/scripts/op-posture-bench/results-2026-05-18T20-38-36-400Z.json +3071 -0
  37. package/scripts/op-posture-bench/scenarios.mjs +60 -0
  38. package/scripts/op-posture-bench/variants.mjs +68 -0
  39. package/scripts/stub-bench/bench.mjs +439 -0
  40. package/scripts/stub-bench/fixture/auth.js +41 -0
  41. package/scripts/stub-bench/results-2026-05-19T10-33-27-045Z.json +99 -0
  42. package/scripts/stub-bench/results-2026-05-19T10-35-08-240Z.json +920 -0
  43. package/scripts/stub-bench/results-2026-05-19T10-40-12-166Z.json +463 -0
  44. package/scripts/verify/azure-custom-embeddings.mjs +152 -0
  45. package/scripts/verify/azure-embeddings.mjs +146 -0
  46. package/scripts/verify/composio-toolkits.mjs +453 -0
  47. package/scripts/verify/local-embeddings.mjs +171 -0
  48. package/scripts/verify/openai-embeddings.mjs +140 -0
  49. package/src/__tests__/composioCliFlags.test.js +239 -0
  50. package/src/core/__tests__/agentScheduler.autoRecall.test.js +215 -0
  51. package/src/core/__tests__/agentScheduler.codebaseKnowledge.test.js +65 -0
  52. package/src/core/__tests__/agentScheduler.errorCategorisation.test.js +169 -0
  53. package/src/core/__tests__/agentScheduler.memoryInjection.test.js +78 -0
  54. package/src/core/agentPool.js +10 -0
  55. package/src/core/agentScheduler.js +273 -36
  56. package/src/index.js +82 -4
  57. package/src/interfaces/__tests__/bulkAgentRoute.test.js +290 -0
  58. package/src/interfaces/__tests__/composioRoutes.test.js +318 -0
  59. package/src/interfaces/webServer.js +436 -2
  60. package/src/interfaces/webServer.js.bak +7047 -0
  61. package/src/services/__tests__/aiService.core.test.js +420 -0
  62. package/src/services/__tests__/aiService.embed.test.js +172 -0
  63. package/src/services/__tests__/apiKeyManager.getEmbeddingApiKey.test.js +86 -0
  64. package/src/services/__tests__/codeMapStubRenderer.test.js +207 -0
  65. package/src/services/__tests__/codebaseKnowledgeService.test.js +427 -0
  66. package/src/services/__tests__/composioService.test.js +714 -0
  67. package/src/services/__tests__/memoryService.appendAndCatalog.test.js +139 -0
  68. package/src/services/__tests__/telegramService.test.js +91 -0
  69. package/src/services/aiService.js +137 -0
  70. package/src/services/apiKeyManager.js +61 -0
  71. package/src/services/codeMapStubRenderer.js +142 -0
  72. package/src/services/codebaseKnowledgeService.js +430 -0
  73. package/src/services/composioService.js +729 -0
  74. package/src/services/embeddings/__tests__/autoRecall.test.js +237 -0
  75. package/src/services/embeddings/__tests__/azureCustomProvider.test.js +232 -0
  76. package/src/services/embeddings/__tests__/cloudProviders.test.js +339 -0
  77. package/src/services/embeddings/__tests__/embeddingService.test.js +417 -0
  78. package/src/services/embeddings/__tests__/embeddingsConfig.test.js +182 -0
  79. package/src/services/embeddings/__tests__/inMemoryJsonStore.test.js +207 -0
  80. package/src/services/embeddings/__tests__/localProvider.test.js +263 -0
  81. package/src/services/embeddings/__tests__/providerInterface.test.js +209 -0
  82. package/src/services/embeddings/autoRecall.js +219 -0
  83. package/src/services/embeddings/embeddingService.js +452 -0
  84. package/src/services/embeddings/embeddingsConfig.js +203 -0
  85. package/src/services/embeddings/indexers/__tests__/agentIndexer.test.js +232 -0
  86. package/src/services/embeddings/indexers/__tests__/composioIndexer.test.js +265 -0
  87. package/src/services/embeddings/indexers/__tests__/memoryIndexer.test.js +418 -0
  88. package/src/services/embeddings/indexers/__tests__/reminisceIndexer.test.js +357 -0
  89. package/src/services/embeddings/indexers/__tests__/skillsIndexer.test.js +145 -0
  90. package/src/services/embeddings/indexers/__tests__/taskIndexer.test.js +146 -0
  91. package/src/services/embeddings/indexers/agentIndexer.js +249 -0
  92. package/src/services/embeddings/indexers/composioIndexer.js +279 -0
  93. package/src/services/embeddings/indexers/memoryIndexer.js +358 -0
  94. package/src/services/embeddings/indexers/reminisceIndexer.js +370 -0
  95. package/src/services/embeddings/indexers/skillsIndexer.js +154 -0
  96. package/src/services/embeddings/indexers/taskIndexer.js +155 -0
  97. package/src/services/embeddings/providerInterface.js +206 -0
  98. package/src/services/embeddings/providers/azureCustomProvider.js +154 -0
  99. package/src/services/embeddings/providers/azureProvider.js +122 -0
  100. package/src/services/embeddings/providers/cloudHttpTransport.js +205 -0
  101. package/src/services/embeddings/providers/localProvider.js +287 -0
  102. package/src/services/embeddings/providers/openaiProvider.js +101 -0
  103. package/src/services/embeddings/utilities/__tests__/textChunker.test.js +217 -0
  104. package/src/services/embeddings/utilities/textChunker.js +290 -0
  105. package/src/services/embeddings/vectorStore/__tests__/scoring.test.js +189 -0
  106. package/src/services/embeddings/vectorStore/inMemoryJsonStore.js +356 -0
  107. package/src/services/embeddings/vectorStore/scoring.js +128 -0
  108. package/src/services/embeddings/vectorStore/storeContractTests.js +179 -0
  109. package/src/services/embeddings/vectorStore/storeInterface.js +91 -0
  110. package/src/services/memoryService.js +98 -0
  111. package/src/services/telegramService.js +140 -1
  112. package/src/tools/__tests__/agentCommunicationTool.findAgent.test.js +226 -0
  113. package/src/tools/__tests__/agentCommunicationTool.test.js +17 -2
  114. package/src/tools/__tests__/baseTool.test.js +76 -10
  115. package/src/tools/__tests__/cloneDetectionTool.test.js +430 -0
  116. package/src/tools/__tests__/codeMapTool.pluralCanonical.test.js +83 -0
  117. package/src/tools/__tests__/composioTool.findAction.test.js +448 -0
  118. package/src/tools/__tests__/composioTool.test.js +499 -0
  119. package/src/tools/__tests__/dependencyResolverTool.test.js +567 -0
  120. package/src/tools/__tests__/docxTool.test.js +449 -0
  121. package/src/tools/__tests__/excelTool.test.js +486 -0
  122. package/src/tools/__tests__/importAnalyzerTool.test.js +368 -0
  123. package/src/tools/__tests__/memoryTool.forgetStale.test.js +272 -0
  124. package/src/tools/__tests__/memoryTool.pluralCanonical.test.js +189 -0
  125. package/src/tools/__tests__/memoryTool.reminisceSemanticSearch.test.js +301 -0
  126. package/src/tools/__tests__/memoryTool.semanticSearch.test.js +405 -0
  127. package/src/tools/__tests__/memoryTool.teamPool.test.js +293 -0
  128. package/src/tools/__tests__/memoryTool.test.js +1 -1
  129. package/src/tools/__tests__/officeTool.test.js +403 -0
  130. package/src/tools/__tests__/openaiFunctionSchemas.memoryReminisce.test.js +24 -25
  131. package/src/tools/__tests__/openaiFunctionSchemas.validity.test.js +268 -0
  132. package/src/tools/__tests__/pdfTool.test.js +457 -0
  133. package/src/tools/__tests__/singularToolReverseForgive.test.js +97 -0
  134. package/src/tools/__tests__/skillsTool.search.test.js +164 -0
  135. package/src/tools/__tests__/taskManagerTool.discipline.test.js +137 -0
  136. package/src/tools/__tests__/taskManagerTool.search.test.js +143 -0
  137. package/src/tools/__tests__/taskManagerTool.transition.test.js +236 -0
  138. package/src/tools/__tests__/toolShapeForgiveness.test.js +260 -0
  139. package/src/tools/agentCommunicationTool.js +120 -5
  140. package/src/tools/baseTool.js +28 -1
  141. package/src/tools/codeMapTool.js +1673 -1521
  142. package/src/tools/composioTool.js +617 -0
  143. package/src/tools/fileContentReplaceTool.js +893 -840
  144. package/src/tools/fileSystemTool.js +1372 -1314
  145. package/src/tools/fileTreeTool.js +7 -0
  146. package/src/tools/memoryTool.js +847 -82
  147. package/src/tools/office/officeDoc.js +425 -0
  148. package/src/tools/office/officePres.js +360 -0
  149. package/src/tools/office/officeSheet.js +350 -0
  150. package/src/tools/officeTool.js +313 -0
  151. package/src/tools/openaiFunctionSchemas.js +824 -44
  152. package/src/tools/platformControlTool.js +5 -0
  153. package/src/tools/seekTool.js +36 -1
  154. package/src/tools/skillsTool.js +133 -0
  155. package/src/tools/taskManagerTool.js +264 -16
  156. package/src/tools/terminalTool.js +23 -1
  157. package/src/tools/visionTool.js +7 -0
  158. package/src/tools/visualEditorTool.js +7 -0
  159. package/src/tools/webTool.js +28 -1
  160. package/src/tools/whatsappTool.js +7 -0
  161. package/src/utilities/authCache.js +47 -6
  162. package/src/utilities/authCache.js.backup-1779570472481 +121 -0
  163. package/src/utilities/toolConstants.js +3 -1
  164. package/web-ui/build/index.html +2 -2
  165. package/web-ui/build/static/1c-CTztA3Xo.js +1 -0
  166. package/web-ui/build/static/abap-BsUhLmBp.js +1 -0
  167. package/web-ui/build/static/abnf-CGKV2y5s.js +1 -0
  168. package/web-ui/build/static/abnf-vQPGuzu_.js +1 -0
  169. package/web-ui/build/static/accesslog-mUZocN9d.js +1 -0
  170. package/web-ui/build/static/actionscript-BmCHyr7v.js +1 -0
  171. package/web-ui/build/static/actionscript-Cc5vZvFE.js +1 -0
  172. package/web-ui/build/static/ada-BHR9NMNv.js +1 -0
  173. package/web-ui/build/static/ada-DnxQs2b9.js +1 -0
  174. package/web-ui/build/static/agda-CHEWVCEZ.js +1 -0
  175. package/web-ui/build/static/al-C0otNZjc.js +1 -0
  176. package/web-ui/build/static/angelscript-Co5e7ZdR.js +1 -0
  177. package/web-ui/build/static/antlr4-Dkky4AXR.js +1 -0
  178. package/web-ui/build/static/apache-BJkYIuV-.js +1 -0
  179. package/web-ui/build/static/apacheconf-XLif_lM5.js +1 -0
  180. package/web-ui/build/static/apex-DiKnugSK.js +1 -0
  181. package/web-ui/build/static/apl-R5OItFx8.js +1 -0
  182. package/web-ui/build/static/applescript-D8uiCoXI.js +1 -0
  183. package/web-ui/build/static/applescript-e5KOVzz4.js +1 -0
  184. package/web-ui/build/static/aql-Cvy5hwR1.js +1 -0
  185. package/web-ui/build/static/arcade-0iAjFk8w.js +1 -0
  186. package/web-ui/build/static/arduino-BJeuGqAT.js +1 -0
  187. package/web-ui/build/static/arduino-QJJjnM1j.js +1 -0
  188. package/web-ui/build/static/arff-C-i_E_-B.js +1 -0
  189. package/web-ui/build/static/armasm-ukFQKHGn.js +1 -0
  190. package/web-ui/build/static/asciidoc-B49qqHJJ.js +1 -0
  191. package/web-ui/build/static/asciidoc-Nkm1Ylrd.js +1 -0
  192. package/web-ui/build/static/asm6502-CMiM3nZs.js +1 -0
  193. package/web-ui/build/static/asmatmel-DG9XzIBf.js +1 -0
  194. package/web-ui/build/static/aspectj-DjRutrRk.js +1 -0
  195. package/web-ui/build/static/aspnet-DCNVRVi9.js +1 -0
  196. package/web-ui/build/static/autohotkey-C7eyvps0.js +1 -0
  197. package/web-ui/build/static/autohotkey-CiaZi-WO.js +1 -0
  198. package/web-ui/build/static/autoit-CaKUQkux.js +1 -0
  199. package/web-ui/build/static/autoit-D-CUHQgt.js +1 -0
  200. package/web-ui/build/static/avisynth-DFP3h4zu.js +1 -0
  201. package/web-ui/build/static/avrasm-BqvUj3fg.js +1 -0
  202. package/web-ui/build/static/avro-idl-D3l0ptuQ.js +1 -0
  203. package/web-ui/build/static/awk-BmDxAZFj.js +1 -0
  204. package/web-ui/build/static/axapta-B424jrgT.js +1 -0
  205. package/web-ui/build/static/bash-CgAffr8Z.js +1 -0
  206. package/web-ui/build/static/bash-D41aILLG.js +1 -0
  207. package/web-ui/build/static/basic-5DFTo35K.js +1 -0
  208. package/web-ui/build/static/basic-BONYG7D2.js +1 -0
  209. package/web-ui/build/static/batch-BnaDGMwS.js +1 -0
  210. package/web-ui/build/static/bbcode-Daujj4hU.js +1 -0
  211. package/web-ui/build/static/bicep-CXidcIK5.js +1 -0
  212. package/web-ui/build/static/birb-CcOzsnqB.js +1 -0
  213. package/web-ui/build/static/bison-rq0w5JFF.js +1 -0
  214. package/web-ui/build/static/bnf-C4uK1dK8.js +1 -0
  215. package/web-ui/build/static/bnf-CvXZ9crt.js +1 -0
  216. package/web-ui/build/static/brainfuck-B5Ezdg2y.js +1 -0
  217. package/web-ui/build/static/brainfuck-BZaTfZ97.js +1 -0
  218. package/web-ui/build/static/brightscript-D_2WBVxt.js +1 -0
  219. package/web-ui/build/static/bro-BD7GT6j_.js +1 -0
  220. package/web-ui/build/static/bsl-Bh-qcQ3w.js +1 -0
  221. package/web-ui/build/static/c-DNmZz1iT.js +1 -0
  222. package/web-ui/build/static/c-dUrSOcB2.js +1 -0
  223. package/web-ui/build/static/c-like-DfzKY8Uu.js +1 -0
  224. package/web-ui/build/static/cal-DgrFs4te.js +1 -0
  225. package/web-ui/build/static/capnproto-BxFR2k8w.js +1 -0
  226. package/web-ui/build/static/ceylon-B2Q7BIPM.js +1 -0
  227. package/web-ui/build/static/cfscript-DeaR8rww.js +1 -0
  228. package/web-ui/build/static/chaiscript-BeBIoz6b.js +1 -0
  229. package/web-ui/build/static/cil-YHiHOb4c.js +1 -0
  230. package/web-ui/build/static/clean-BgOl_0cN.js +1 -0
  231. package/web-ui/build/static/clojure-BlgOza7C.js +1 -0
  232. package/web-ui/build/static/clojure-PlKRYx3q.js +1 -0
  233. package/web-ui/build/static/clojure-repl-Dv2_THNB.js +1 -0
  234. package/web-ui/build/static/cmake-Ccf43gsy.js +1 -0
  235. package/web-ui/build/static/cmake-Dah_b5tK.js +1 -0
  236. package/web-ui/build/static/cobol-o9YRDzXA.js +1 -0
  237. package/web-ui/build/static/coffeescript-DTYLvxG9.js +1 -0
  238. package/web-ui/build/static/coffeescript-Dm4UcexP.js +1 -0
  239. package/web-ui/build/static/concurnas-1OxY7nFV.js +1 -0
  240. package/web-ui/build/static/coq-CvJBSoWT.js +1 -0
  241. package/web-ui/build/static/coq-DPZunybQ.js +1 -0
  242. package/web-ui/build/static/cos-BBstQgB4.js +1 -0
  243. package/web-ui/build/static/cpp-BR1pa5Wr.js +1 -0
  244. package/web-ui/build/static/cpp-C-_tTuKh.js +1 -0
  245. package/web-ui/build/static/crmsh-BIme7ihG.js +1 -0
  246. package/web-ui/build/static/crystal-C2hlJxaB.js +1 -0
  247. package/web-ui/build/static/crystal-Ca6D0fV7.js +1 -0
  248. package/web-ui/build/static/csharp-DGvdwvDH.js +1 -0
  249. package/web-ui/build/static/csharp-DbAjVltn.js +1 -0
  250. package/web-ui/build/static/cshtml-DVC84JPa.js +1 -0
  251. package/web-ui/build/static/csp-BawtG83z.js +1 -0
  252. package/web-ui/build/static/csp-BlaoxdTK.js +1 -0
  253. package/web-ui/build/static/css-52oqss7r.js +1 -0
  254. package/web-ui/build/static/css-extras-BoTVw2IW.js +1 -0
  255. package/web-ui/build/static/csv-nXBSv5kK.js +1 -0
  256. package/web-ui/build/static/cypher-WuesoPm2.js +1 -0
  257. package/web-ui/build/static/d-BmmTjwiV.js +1 -0
  258. package/web-ui/build/static/d-BwHf5A8R.js +1 -0
  259. package/web-ui/build/static/dart-BVZTRb8b.js +1 -0
  260. package/web-ui/build/static/dart-CbWzIBpX.js +1 -0
  261. package/web-ui/build/static/dataweave-qi_fpjJR.js +1 -0
  262. package/web-ui/build/static/dax-BpP02TD3.js +1 -0
  263. package/web-ui/build/static/delphi-TK0E0gLN.js +1 -0
  264. package/web-ui/build/static/dhall-jyNJwUbo.js +1 -0
  265. package/web-ui/build/static/diff-Dbu90HZq.js +1 -0
  266. package/web-ui/build/static/diff-Df6ezhAq.js +1 -0
  267. package/web-ui/build/static/django-BDy-xiWR.js +1 -0
  268. package/web-ui/build/static/django-CbmnWIX9.js +1 -0
  269. package/web-ui/build/static/dns-D_wmKRHl.js +1 -0
  270. package/web-ui/build/static/dns-zone-file-_1osc1Qk.js +1 -0
  271. package/web-ui/build/static/docker-D62hlkjX.js +1 -0
  272. package/web-ui/build/static/dockerfile-DQ080zHh.js +1 -0
  273. package/web-ui/build/static/dos-B5mA8Wna.js +1 -0
  274. package/web-ui/build/static/dot-D497WUfu.js +1 -0
  275. package/web-ui/build/static/dsconfig-dERMCQVk.js +1 -0
  276. package/web-ui/build/static/dts-DC3ujcbX.js +1 -0
  277. package/web-ui/build/static/dust-Bhm1VBQg.js +1 -0
  278. package/web-ui/build/static/ebnf-1lmwK0bv.js +1 -0
  279. package/web-ui/build/static/ebnf-qzzqKVXL.js +1 -0
  280. package/web-ui/build/static/editorconfig-CCe25wQr.js +1 -0
  281. package/web-ui/build/static/eiffel-BFOXbwEN.js +1 -0
  282. package/web-ui/build/static/ejs-D94vVkGZ.js +1 -0
  283. package/web-ui/build/static/elixir-B2W81YV0.js +1 -0
  284. package/web-ui/build/static/elixir-CD1szlP_.js +1 -0
  285. package/web-ui/build/static/elm-BUJhR-kM.js +1 -0
  286. package/web-ui/build/static/elm-DwLnLHSK.js +1 -0
  287. package/web-ui/build/static/erb-CcokD9Fu.js +1 -0
  288. package/web-ui/build/static/erb-lzhmSBEV.js +1 -0
  289. package/web-ui/build/static/erlang-C0jnu48-.js +1 -0
  290. package/web-ui/build/static/erlang-CrevXBnJ.js +1 -0
  291. package/web-ui/build/static/erlang-repl-CNY6yNoO.js +1 -0
  292. package/web-ui/build/static/etlua-BMO_ICdR.js +1 -0
  293. package/web-ui/build/static/excel-C5PbLrVC.js +1 -0
  294. package/web-ui/build/static/excel-formula-CX4pOnnV.js +1 -0
  295. package/web-ui/build/static/factor-bW3WUpa0.js +1 -0
  296. package/web-ui/build/static/false-CQx6Crbr.js +1 -0
  297. package/web-ui/build/static/firestore-security-rules-DT5oRNdf.js +1 -0
  298. package/web-ui/build/static/fix-C4IWe2LI.js +1 -0
  299. package/web-ui/build/static/flix-hi9-cLwA.js +1 -0
  300. package/web-ui/build/static/flow-CkX6DAhF.js +1 -0
  301. package/web-ui/build/static/fortran-C4rIX-2n.js +1 -0
  302. package/web-ui/build/static/fortran-Dvu3q_x_.js +1 -0
  303. package/web-ui/build/static/fsharp-Bwa1UrRI.js +1 -0
  304. package/web-ui/build/static/fsharp-CvadhLcA.js +1 -0
  305. package/web-ui/build/static/ftl-eFEI11YV.js +1 -0
  306. package/web-ui/build/static/gams-BxGx7deQ.js +1 -0
  307. package/web-ui/build/static/gap-Dcv7bqDd.js +1 -0
  308. package/web-ui/build/static/gauss-CcVoF4l8.js +1 -0
  309. package/web-ui/build/static/gcode-B1dc5sh5.js +1 -0
  310. package/web-ui/build/static/gcode-D5OxRG5t.js +1 -0
  311. package/web-ui/build/static/gdscript-CL-EA1wk.js +1 -0
  312. package/web-ui/build/static/gedcom-BbXrNsr0.js +1 -0
  313. package/web-ui/build/static/gherkin-B2wQMbT2.js +1 -0
  314. package/web-ui/build/static/gherkin-CnL4Y3j1.js +1 -0
  315. package/web-ui/build/static/git-DpdutSM5.js +1 -0
  316. package/web-ui/build/static/glsl-C7sgdZCA.js +1 -0
  317. package/web-ui/build/static/glsl-DVaNsn1Z.js +1 -0
  318. package/web-ui/build/static/gml-B_NppoA4.js +1 -0
  319. package/web-ui/build/static/gml-DFrn75UD.js +1 -0
  320. package/web-ui/build/static/gn-BhTU_aTW.js +1 -0
  321. package/web-ui/build/static/go-DKrUPrfb.js +1 -0
  322. package/web-ui/build/static/go-DLAYIsJl.js +1 -0
  323. package/web-ui/build/static/go-module-BXY6q1Ug.js +1 -0
  324. package/web-ui/build/static/golo-CKxjLRpC.js +1 -0
  325. package/web-ui/build/static/gradle-DN8lsmJj.js +1 -0
  326. package/web-ui/build/static/graphql-CMb_4vdm.js +1 -0
  327. package/web-ui/build/static/groovy-Bhi1VPv7.js +1 -0
  328. package/web-ui/build/static/groovy-D3X3r3EX.js +1 -0
  329. package/web-ui/build/static/haml-CvOCw9lL.js +1 -0
  330. package/web-ui/build/static/haml-DYs0wBJO.js +1 -0
  331. package/web-ui/build/static/handlebars-CLnuKGPm.js +1 -0
  332. package/web-ui/build/static/handlebars-CYGG_M1h.js +1 -0
  333. package/web-ui/build/static/haskell-0Ju0XclD.js +1 -0
  334. package/web-ui/build/static/haskell-CL5jUHSd.js +1 -0
  335. package/web-ui/build/static/haxe-BghRbBtK.js +1 -0
  336. package/web-ui/build/static/haxe-dfL7GzPv.js +1 -0
  337. package/web-ui/build/static/hcl-BZP2QME-.js +1 -0
  338. package/web-ui/build/static/hlsl-Djp0TiCX.js +1 -0
  339. package/web-ui/build/static/hoon-Df5gJVqA.js +1 -0
  340. package/web-ui/build/static/hpkp-Cy-hjB4V.js +1 -0
  341. package/web-ui/build/static/hsp-CntMIMs4.js +1 -0
  342. package/web-ui/build/static/hsts-BNBhETNx.js +1 -0
  343. package/web-ui/build/static/htmlbars-VCCYaDHA.js +1 -0
  344. package/web-ui/build/static/http-7DbskohZ.js +1 -0
  345. package/web-ui/build/static/http-BT5FYFAK.js +1 -0
  346. package/web-ui/build/static/hy-DuGSaK_b.js +1 -0
  347. package/web-ui/build/static/ichigojam-CjvnJmlr.js +1 -0
  348. package/web-ui/build/static/icon-BsBz6XP6.js +1 -0
  349. package/web-ui/build/static/icu-message-format-BEpv_nip.js +1 -0
  350. package/web-ui/build/static/idris-DiXQdMPU.js +1 -0
  351. package/web-ui/build/static/iecst-C9tYEzwP.js +1 -0
  352. package/web-ui/build/static/ignore-DNMpCRPN.js +1 -0
  353. package/web-ui/build/static/index-B-r71gxO.js +1 -0
  354. package/web-ui/build/static/index-CTtNXVAZ.js +1217 -0
  355. package/web-ui/build/static/index-DkBBEGYj.css +1 -0
  356. package/web-ui/build/static/index-PvzceRzr.js +13 -0
  357. package/web-ui/build/static/inform7-D38mj1Ty.js +1 -0
  358. package/web-ui/build/static/inform7-SwIRbrNQ.js +1 -0
  359. package/web-ui/build/static/ini-B9xO6J_m.js +1 -0
  360. package/web-ui/build/static/ini-zcp_esam.js +1 -0
  361. package/web-ui/build/static/io-C-Ay4jvg.js +1 -0
  362. package/web-ui/build/static/irpf90-BYnkitLq.js +1 -0
  363. package/web-ui/build/static/isbl-BYtdwd6v.js +1 -0
  364. package/web-ui/build/static/j-ByZQN5E4.js +1 -0
  365. package/web-ui/build/static/java-BNtb6JWL.js +1 -0
  366. package/web-ui/build/static/java-CQZL3scW.js +1 -0
  367. package/web-ui/build/static/javadoc-BciMZ8jg.js +1 -0
  368. package/web-ui/build/static/javadoclike-07BOTXmy.js +1 -0
  369. package/web-ui/build/static/javascript-CViZlg1q.js +1 -0
  370. package/web-ui/build/static/javastacktrace-bWyAK0up.js +1 -0
  371. package/web-ui/build/static/jboss-cli-hz5boSGB.js +1 -0
  372. package/web-ui/build/static/jexl-DdIINSXT.js +1 -0
  373. package/web-ui/build/static/jolie-CQnDX-f0.js +1 -0
  374. package/web-ui/build/static/jq-BzhF0CHG.js +1 -0
  375. package/web-ui/build/static/js-extras-jizEtT14.js +1 -0
  376. package/web-ui/build/static/js-templates-Dr1BqLAt.js +1 -0
  377. package/web-ui/build/static/jsdoc-CI-GPi6r.js +1 -0
  378. package/web-ui/build/static/json-2eDPxnHO.js +1 -0
  379. package/web-ui/build/static/json-BBqUMOAQ.js +1 -0
  380. package/web-ui/build/static/json5-CeIoln-Y.js +1 -0
  381. package/web-ui/build/static/jsonp-DWe9tbr2.js +1 -0
  382. package/web-ui/build/static/jsstacktrace-aE-go9tq.js +1 -0
  383. package/web-ui/build/static/jsx-BTXEPQYI.js +1 -0
  384. package/web-ui/build/static/julia-4VeOirXa.js +1 -0
  385. package/web-ui/build/static/julia-Da6yHEfz.js +1 -0
  386. package/web-ui/build/static/julia-repl-CFrizGkE.js +1 -0
  387. package/web-ui/build/static/keepalived-39SDM4j5.js +1 -0
  388. package/web-ui/build/static/keyman-DU5yOLYr.js +1 -0
  389. package/web-ui/build/static/kotlin-DJoqh3HG.js +1 -0
  390. package/web-ui/build/static/kotlin-DsKd3r_L.js +1 -0
  391. package/web-ui/build/static/kumir-CO96hby4.js +1 -0
  392. package/web-ui/build/static/kusto-DyuMf8l-.js +1 -0
  393. package/web-ui/build/static/lasso-BiPmQTXQ.js +1 -0
  394. package/web-ui/build/static/latex-Bd1ef5fi.js +1 -0
  395. package/web-ui/build/static/latex-DUrYkmWb.js +1 -0
  396. package/web-ui/build/static/latte-BSD-hpi5.js +1 -0
  397. package/web-ui/build/static/ldif-1ZMSg0qI.js +1 -0
  398. package/web-ui/build/static/leaf-Cg0eq01F.js +1 -0
  399. package/web-ui/build/static/less-BKcd1_xh.js +1 -0
  400. package/web-ui/build/static/less-SB5bcusC.js +1 -0
  401. package/web-ui/build/static/lilypond-BX_kuAqT.js +1 -0
  402. package/web-ui/build/static/liquid-C337T5bt.js +1 -0
  403. package/web-ui/build/static/lisp-B_bJRelF.js +1 -0
  404. package/web-ui/build/static/lisp-Du04Vdmx.js +1 -0
  405. package/web-ui/build/static/livecodeserver-BOkA9fV6.js +1 -0
  406. package/web-ui/build/static/livescript-DkMTCCBM.js +1 -0
  407. package/web-ui/build/static/livescript-rTaLq5oP.js +1 -0
  408. package/web-ui/build/static/llvm-BrBlvl5p.js +1 -0
  409. package/web-ui/build/static/llvm-DQbygw7z.js +1 -0
  410. package/web-ui/build/static/log-DoAzOt8c.js +1 -0
  411. package/web-ui/build/static/lolcode-DnB7KhRR.js +1 -0
  412. package/web-ui/build/static/lsl-DpzE7F5A.js +1 -0
  413. package/web-ui/build/static/lua-CIceROsO.js +1 -0
  414. package/web-ui/build/static/lua-DhnvJuMn.js +1 -0
  415. package/web-ui/build/static/magma-BwjzpKxi.js +1 -0
  416. package/web-ui/build/static/makefile-D10Y62dl.js +1 -0
  417. package/web-ui/build/static/makefile-esgkquGi.js +1 -0
  418. package/web-ui/build/static/markdown-B-Y7Y0Nn.js +1 -0
  419. package/web-ui/build/static/markdown-Cv3Onm-Q.js +1 -0
  420. package/web-ui/build/static/markup-templating-B1-9WWYa.js +1 -0
  421. package/web-ui/build/static/mathematica-gSyKdw2h.js +1 -0
  422. package/web-ui/build/static/matlab-6i1uXuBx.js +1 -0
  423. package/web-ui/build/static/matlab-CqcSZ1d9.js +1 -0
  424. package/web-ui/build/static/maxima-Bc-OnIOQ.js +1 -0
  425. package/web-ui/build/static/maxscript-Bce44o6c.js +1 -0
  426. package/web-ui/build/static/mel-0Jk3y-vw.js +1 -0
  427. package/web-ui/build/static/mel-DmA_8WPg.js +1 -0
  428. package/web-ui/build/static/mercury-DNdP1u-O.js +1 -0
  429. package/web-ui/build/static/mermaid-DrLkSIIb.js +1 -0
  430. package/web-ui/build/static/mipsasm-BIQVs3Ff.js +1 -0
  431. package/web-ui/build/static/mizar-BD5ZD_Rk.js +1 -0
  432. package/web-ui/build/static/mizar-DThX8Mdy.js +1 -0
  433. package/web-ui/build/static/mojolicious-Bra-ClwJ.js +1 -0
  434. package/web-ui/build/static/mongodb-DirByEEg.js +1 -0
  435. package/web-ui/build/static/monkey-C-Pvu43G.js +1 -0
  436. package/web-ui/build/static/monkey-n4IFmaA7.js +1 -0
  437. package/web-ui/build/static/moonscript-B1DM34lp.js +1 -0
  438. package/web-ui/build/static/moonscript-B82JBytX.js +1 -0
  439. package/web-ui/build/static/n1ql-C46iq3Hh.js +1 -0
  440. package/web-ui/build/static/n1ql-DOs3gJQo.js +1 -0
  441. package/web-ui/build/static/n4js-CPYgal3G.js +1 -0
  442. package/web-ui/build/static/nand2tetris-hdl-BhlUIq7M.js +1 -0
  443. package/web-ui/build/static/naniscript-D1YZXYcf.js +1 -0
  444. package/web-ui/build/static/nasm-2-TtCBo4.js +1 -0
  445. package/web-ui/build/static/neon-BzoXMDea.js +1 -0
  446. package/web-ui/build/static/nevod-DW_87wHj.js +1 -0
  447. package/web-ui/build/static/nginx-BgieYUhk.js +1 -0
  448. package/web-ui/build/static/nginx-DW0RVJbs.js +1 -0
  449. package/web-ui/build/static/nim-BbTa7YZN.js +1 -0
  450. package/web-ui/build/static/nim-VdXk3QT9.js +1 -0
  451. package/web-ui/build/static/nix-3tNNprEI.js +1 -0
  452. package/web-ui/build/static/nix-BDghlfzh.js +1 -0
  453. package/web-ui/build/static/node-repl-BBLv3tyt.js +1 -0
  454. package/web-ui/build/static/nsis-DxjfnSO8.js +1 -0
  455. package/web-ui/build/static/nsis-FY5xiiar.js +1 -0
  456. package/web-ui/build/static/objectivec-CXhf_sp_.js +1 -0
  457. package/web-ui/build/static/objectivec-DcRKjWcd.js +1 -0
  458. package/web-ui/build/static/ocaml-BLRL6Zro.js +1 -0
  459. package/web-ui/build/static/ocaml-C4S4QQtS.js +1 -0
  460. package/web-ui/build/static/opencl-ruEAYetM.js +1 -0
  461. package/web-ui/build/static/openqasm-D6r_FwIh.js +1 -0
  462. package/web-ui/build/static/openscad-BEPjoj_N.js +1 -0
  463. package/web-ui/build/static/oxygene-A61yc5Or.js +1 -0
  464. package/web-ui/build/static/oz-DICidCTs.js +1 -0
  465. package/web-ui/build/static/parigp-MjTNwy2s.js +1 -0
  466. package/web-ui/build/static/parser-DmI7lg_r.js +1 -0
  467. package/web-ui/build/static/parser3-Bv9kXAib.js +1 -0
  468. package/web-ui/build/static/pascal-B23PBLTj.js +1 -0
  469. package/web-ui/build/static/pascaligo-CPIJtX2C.js +1 -0
  470. package/web-ui/build/static/pcaxis-Bsj_6x8j.js +1 -0
  471. package/web-ui/build/static/peoplecode-VvQbMjsD.js +1 -0
  472. package/web-ui/build/static/perl-Cr6Y9-hl.js +1 -0
  473. package/web-ui/build/static/perl-D37oTJip.js +1 -0
  474. package/web-ui/build/static/pf-BKHaWcGm.js +1 -0
  475. package/web-ui/build/static/pgsql-ChusgWw2.js +1 -0
  476. package/web-ui/build/static/php-3Qr4hNV1.js +1 -0
  477. package/web-ui/build/static/php-CgxeEh4Y.js +1 -0
  478. package/web-ui/build/static/php-extras-DeLqwT6H.js +1 -0
  479. package/web-ui/build/static/php-template-DcOJxuIf.js +1 -0
  480. package/web-ui/build/static/phpdoc-amFph5Ax.js +1 -0
  481. package/web-ui/build/static/plaintext-mqBcO1hG.js +1 -0
  482. package/web-ui/build/static/plsql-ioyqfxP7.js +1 -0
  483. package/web-ui/build/static/pony-nxjy8Qot.js +1 -0
  484. package/web-ui/build/static/powerquery-Ci_Fxyg8.js +1 -0
  485. package/web-ui/build/static/powershell-CB_GgRqr.js +1 -0
  486. package/web-ui/build/static/powershell-au4fYIm7.js +1 -0
  487. package/web-ui/build/static/processing-Bkd3f-Wz.js +1 -0
  488. package/web-ui/build/static/processing-PgCPZm30.js +1 -0
  489. package/web-ui/build/static/profile-C2GBY6C9.js +1 -0
  490. package/web-ui/build/static/prolog-BRjYwjIO.js +1 -0
  491. package/web-ui/build/static/prolog-BheGlH8Q.js +1 -0
  492. package/web-ui/build/static/promql-CtCmTKys.js +1 -0
  493. package/web-ui/build/static/properties-BpLqVZha.js +1 -0
  494. package/web-ui/build/static/properties-UQxavHUY.js +1 -0
  495. package/web-ui/build/static/protobuf-BSuul6Uw.js +1 -0
  496. package/web-ui/build/static/protobuf-CLRi8VTE.js +1 -0
  497. package/web-ui/build/static/psl-CJsJilqO.js +1 -0
  498. package/web-ui/build/static/pug-5BY6sdv1.js +1 -0
  499. package/web-ui/build/static/puppet-DBg45gHV.js +1 -0
  500. package/web-ui/build/static/puppet-DPANCbOj.js +1 -0
  501. package/web-ui/build/static/pure-Cn4p-7Bj.js +1 -0
  502. package/web-ui/build/static/purebasic-CoXbIzZJ.js +1 -0
  503. package/web-ui/build/static/purebasic-DZ_eLoUV.js +1 -0
  504. package/web-ui/build/static/purescript-B98GoUb_.js +1 -0
  505. package/web-ui/build/static/python-B-Lm1OME.js +1 -0
  506. package/web-ui/build/static/python-C_ApFGS1.js +1 -0
  507. package/web-ui/build/static/python-repl-CJW5_RON.js +1 -0
  508. package/web-ui/build/static/q-BB2BYhxG.js +1 -0
  509. package/web-ui/build/static/q-DVqo_ScG.js +1 -0
  510. package/web-ui/build/static/qml-Co-8g096.js +1 -0
  511. package/web-ui/build/static/qml-Du0WFcoy.js +1 -0
  512. package/web-ui/build/static/qore-C6XBzy3U.js +1 -0
  513. package/web-ui/build/static/qsharp-BCMklAuq.js +1 -0
  514. package/web-ui/build/static/r-B5CGUQwN.js +1 -0
  515. package/web-ui/build/static/r-Dxhot-za.js +1 -0
  516. package/web-ui/build/static/racket-C0dCdrKh.js +1 -0
  517. package/web-ui/build/static/reason-DGJ1fFJs.js +1 -0
  518. package/web-ui/build/static/reasonml-gt_AvBg7.js +1 -0
  519. package/web-ui/build/static/regex-B5iNH8MZ.js +1 -0
  520. package/web-ui/build/static/rego-hfPajYet.js +1 -0
  521. package/web-ui/build/static/renpy-BkG5aM4I.js +1 -0
  522. package/web-ui/build/static/rest-C4uwtrF8.js +1 -0
  523. package/web-ui/build/static/rib-D32ew8Y7.js +1 -0
  524. package/web-ui/build/static/rip-BIEbWzxe.js +1 -0
  525. package/web-ui/build/static/roboconf-CMN8BoHf.js +1 -0
  526. package/web-ui/build/static/roboconf-GVMh3ioj.js +1 -0
  527. package/web-ui/build/static/robotframework-CUQybJQ9.js +1 -0
  528. package/web-ui/build/static/routeros-DUEdLmuc.js +1 -0
  529. package/web-ui/build/static/rsl-BsAePIwQ.js +1 -0
  530. package/web-ui/build/static/ruby-CZMMjJFw.js +1 -0
  531. package/web-ui/build/static/ruby-WOVZyoXO.js +1 -0
  532. package/web-ui/build/static/ruleslanguage-xV-HszUl.js +1 -0
  533. package/web-ui/build/static/rust-Da9GRxLz.js +1 -0
  534. package/web-ui/build/static/rust-uCND428m.js +1 -0
  535. package/web-ui/build/static/sas-BW15NPzf.js +1 -0
  536. package/web-ui/build/static/sas-DCx9gext.js +1 -0
  537. package/web-ui/build/static/sass-BMD7eETo.js +1 -0
  538. package/web-ui/build/static/scala-0wnxLTlF.js +1 -0
  539. package/web-ui/build/static/scala-D3Hk-q5-.js +1 -0
  540. package/web-ui/build/static/scheme-Ci9QOUcD.js +1 -0
  541. package/web-ui/build/static/scheme-CtqjB_HN.js +1 -0
  542. package/web-ui/build/static/scilab-CnITQd23.js +1 -0
  543. package/web-ui/build/static/scss-DCceV6xw.js +1 -0
  544. package/web-ui/build/static/scss-N5EuPQOS.js +1 -0
  545. package/web-ui/build/static/shell-BegJTton.js +1 -0
  546. package/web-ui/build/static/shell-session-BHBoosfJ.js +1 -0
  547. package/web-ui/build/static/smali-CoHePNQf.js +1 -0
  548. package/web-ui/build/static/smali-D64W1f0Y.js +1 -0
  549. package/web-ui/build/static/smalltalk-CagI-Ky8.js +1 -0
  550. package/web-ui/build/static/smalltalk-DHLuWDjp.js +1 -0
  551. package/web-ui/build/static/smarty-CSS2XBuu.js +1 -0
  552. package/web-ui/build/static/sml-D8Oyp9xr.js +1 -0
  553. package/web-ui/build/static/sml-DvC_VDmX.js +1 -0
  554. package/web-ui/build/static/solidity-DVkeulrL.js +1 -0
  555. package/web-ui/build/static/solution-file-Bd7qWzoo.js +1 -0
  556. package/web-ui/build/static/soy-BRSlVWf7.js +1 -0
  557. package/web-ui/build/static/sparql-DNnCQmqM.js +1 -0
  558. package/web-ui/build/static/splunk-spl-DXCDUv2Y.js +1 -0
  559. package/web-ui/build/static/sqf-C_IKzP5b.js +1 -0
  560. package/web-ui/build/static/sqf-DBqlUGoG.js +1 -0
  561. package/web-ui/build/static/sql-Dt3ZutCc.js +1 -0
  562. package/web-ui/build/static/sql-q0UMLqb7.js +1 -0
  563. package/web-ui/build/static/sql_more-DAuY5p3F.js +1 -0
  564. package/web-ui/build/static/squirrel-CgQZeaNT.js +1 -0
  565. package/web-ui/build/static/stan-D5kYsid7.js +1 -0
  566. package/web-ui/build/static/stan-JSHToKMA.js +1 -0
  567. package/web-ui/build/static/stata-DRVhVjVb.js +1 -0
  568. package/web-ui/build/static/step21-C7h5ssgs.js +1 -0
  569. package/web-ui/build/static/stylus-BXIDNFUe.js +1 -0
  570. package/web-ui/build/static/stylus-CyMBrStz.js +1 -0
  571. package/web-ui/build/static/subunit-Lbpuvy4t.js +1 -0
  572. package/web-ui/build/static/swift-BCxWOc8n.js +1 -0
  573. package/web-ui/build/static/swift-B_YEL6eF.js +1 -0
  574. package/web-ui/build/static/systemd-_zWfs8U5.js +1 -0
  575. package/web-ui/build/static/t4-cs-BCiVX6dp.js +1 -0
  576. package/web-ui/build/static/t4-templating-CDm61rWh.js +1 -0
  577. package/web-ui/build/static/t4-vb-OO2oZZrL.js +1 -0
  578. package/web-ui/build/static/taggerscript-CkXxiITO.js +1 -0
  579. package/web-ui/build/static/tap-C612JPhJ.js +1 -0
  580. package/web-ui/build/static/tap-J-zR66jL.js +1 -0
  581. package/web-ui/build/static/tcl-DIGan5K8.js +1 -0
  582. package/web-ui/build/static/tcl-SFVWFwbb.js +1 -0
  583. package/web-ui/build/static/textile-D0WxA5g8.js +1 -0
  584. package/web-ui/build/static/thrift-jboo4tJl.js +1 -0
  585. package/web-ui/build/static/toml-DIK32ROb.js +1 -0
  586. package/web-ui/build/static/tp-Bhs1iGD3.js +1 -0
  587. package/web-ui/build/static/tremor-4d_juLiN.js +1 -0
  588. package/web-ui/build/static/tsx-hEN3qQzd.js +1 -0
  589. package/web-ui/build/static/tt2-WU6EuPNO.js +1 -0
  590. package/web-ui/build/static/turtle-CUM3xwNI.js +1 -0
  591. package/web-ui/build/static/twig-B9JwTKv9.js +1 -0
  592. package/web-ui/build/static/twig-Crv6BtK7.js +1 -0
  593. package/web-ui/build/static/typescript-BmabW_ur.js +1 -0
  594. package/web-ui/build/static/typescript-oMKx2dph.js +1 -0
  595. package/web-ui/build/static/typoscript-X48MNTeK.js +1 -0
  596. package/web-ui/build/static/unrealscript-qnu9Ogmz.js +1 -0
  597. package/web-ui/build/static/uorazor-BicTvjGt.js +1 -0
  598. package/web-ui/build/static/uri-CyRoMB-u.js +1 -0
  599. package/web-ui/build/static/v-BDM6ZJR7.js +1 -0
  600. package/web-ui/build/static/vala-BWCf7DTx.js +1 -0
  601. package/web-ui/build/static/vala-COL5roWV.js +1 -0
  602. package/web-ui/build/static/vbnet-BHPgkiip.js +1 -0
  603. package/web-ui/build/static/vbnet-BadWmTKs.js +1 -0
  604. package/web-ui/build/static/vbscript-BfUpIAaV.js +1 -0
  605. package/web-ui/build/static/vbscript-html-BBR6zcvV.js +1 -0
  606. package/web-ui/build/static/velocity-k4gGPuiP.js +1 -0
  607. package/web-ui/build/static/verilog-BoNroxW8.js +1 -0
  608. package/web-ui/build/static/verilog-C7cplLIi.js +1 -0
  609. package/web-ui/build/static/vhdl-BrKkx69g.js +1 -0
  610. package/web-ui/build/static/vhdl-CWacsAXR.js +1 -0
  611. package/web-ui/build/static/vim-BcdueaEC.js +1 -0
  612. package/web-ui/build/static/vim-BwsUolG_.js +1 -0
  613. package/web-ui/build/static/visual-basic-DTXlX5HN.js +1 -0
  614. package/web-ui/build/static/warpscript-2w0_2KsB.js +1 -0
  615. package/web-ui/build/static/wasm-BPaXQO-A.js +1 -0
  616. package/web-ui/build/static/web-idl-BoCTFQod.js +1 -0
  617. package/web-ui/build/static/wiki-BkkCi9wm.js +1 -0
  618. package/web-ui/build/static/wolfram-CvRNTaAX.js +1 -0
  619. package/web-ui/build/static/wren-Bz8Smtz-.js +1 -0
  620. package/web-ui/build/static/x86asm-BM83B0N_.js +1 -0
  621. package/web-ui/build/static/xeora-BjuDukl7.js +1 -0
  622. package/web-ui/build/static/xl-ByiuKWwm.js +1 -0
  623. package/web-ui/build/static/xml-Dut2p53G.js +1 -0
  624. package/web-ui/build/static/xml-doc-CxgwiuaA.js +1 -0
  625. package/web-ui/build/static/xojo-CBqUB8JI.js +1 -0
  626. package/web-ui/build/static/xquery-D-agM4jx.js +1 -0
  627. package/web-ui/build/static/xquery-DL_eetrQ.js +1 -0
  628. package/web-ui/build/static/yaml-DZ7HVZSe.js +1 -0
  629. package/web-ui/build/static/yaml-DatJAv7_.js +1 -0
  630. package/web-ui/build/static/yang-D0nrKE-r.js +1 -0
  631. package/web-ui/build/static/zephir--M2g15-k.js +1 -0
  632. package/web-ui/build/static/zig-CK6rUH8E.js +1 -0
  633. package/web-ui/build/static/1c-DGpIT7i5.js +0 -1
  634. package/web-ui/build/static/abap-5wFDdWLh.js +0 -1
  635. package/web-ui/build/static/abnf-BP1dpNSE.js +0 -1
  636. package/web-ui/build/static/abnf-DBEIAl8g.js +0 -1
  637. package/web-ui/build/static/accesslog-CWSM_T5E.js +0 -1
  638. package/web-ui/build/static/actionscript-DONkco1J.js +0 -1
  639. package/web-ui/build/static/actionscript-FqBYk5er.js +0 -1
  640. package/web-ui/build/static/ada-C2JLRIaM.js +0 -1
  641. package/web-ui/build/static/ada-gKiygTRK.js +0 -1
  642. package/web-ui/build/static/agda-CkSODqK2.js +0 -1
  643. package/web-ui/build/static/al-BJ_YR6p7.js +0 -1
  644. package/web-ui/build/static/angelscript-Dg2byMGg.js +0 -1
  645. package/web-ui/build/static/antlr4-BnpyaFNr.js +0 -1
  646. package/web-ui/build/static/apache-Dffxsd7O.js +0 -1
  647. package/web-ui/build/static/apacheconf-DLitjtWj.js +0 -1
  648. package/web-ui/build/static/apex-Drr_IvU2.js +0 -1
  649. package/web-ui/build/static/apl-CF6qxmXG.js +0 -1
  650. package/web-ui/build/static/applescript-CjOlw3b_.js +0 -1
  651. package/web-ui/build/static/applescript-DjkSl1Ry.js +0 -1
  652. package/web-ui/build/static/aql-KwVmK1gP.js +0 -1
  653. package/web-ui/build/static/arcade-CENSXx0R.js +0 -1
  654. package/web-ui/build/static/arduino-B3Ta9Fll.js +0 -1
  655. package/web-ui/build/static/arduino-CzcsaB9_.js +0 -1
  656. package/web-ui/build/static/arff-CMJSVt_O.js +0 -1
  657. package/web-ui/build/static/armasm-0zSgSPB4.js +0 -1
  658. package/web-ui/build/static/asciidoc-B8K5ctWq.js +0 -1
  659. package/web-ui/build/static/asciidoc-bk2Sg6b6.js +0 -1
  660. package/web-ui/build/static/asm6502-ji6zm4FQ.js +0 -1
  661. package/web-ui/build/static/asmatmel-DJqObM4Y.js +0 -1
  662. package/web-ui/build/static/aspectj-DqQKI7J5.js +0 -1
  663. package/web-ui/build/static/aspnet-9cenTxW7.js +0 -1
  664. package/web-ui/build/static/autohotkey-C6EhiZvl.js +0 -1
  665. package/web-ui/build/static/autohotkey-sTGJOvMM.js +0 -1
  666. package/web-ui/build/static/autoit-B0Im8iQ1.js +0 -1
  667. package/web-ui/build/static/autoit-CO6pUD0H.js +0 -1
  668. package/web-ui/build/static/avisynth-OvOHTfj5.js +0 -1
  669. package/web-ui/build/static/avrasm-BLWZ5Mye.js +0 -1
  670. package/web-ui/build/static/avro-idl-BB2ODvnw.js +0 -1
  671. package/web-ui/build/static/awk-_jhMabQ0.js +0 -1
  672. package/web-ui/build/static/axapta-DdBRgoYy.js +0 -1
  673. package/web-ui/build/static/bash-CsaRGXBQ.js +0 -1
  674. package/web-ui/build/static/bash-CxLFkwAC.js +0 -1
  675. package/web-ui/build/static/basic-BJyy7JJE.js +0 -1
  676. package/web-ui/build/static/basic-CrMb-gv0.js +0 -1
  677. package/web-ui/build/static/batch-BvcykMe5.js +0 -1
  678. package/web-ui/build/static/bbcode-EOBuY5Y6.js +0 -1
  679. package/web-ui/build/static/bicep-QkDJBA34.js +0 -1
  680. package/web-ui/build/static/birb-TAOxKurn.js +0 -1
  681. package/web-ui/build/static/bison-BEK6cnad.js +0 -1
  682. package/web-ui/build/static/bnf-DfEODxsr.js +0 -1
  683. package/web-ui/build/static/bnf-DhbMjsuA.js +0 -1
  684. package/web-ui/build/static/brainfuck-BoVocOa7.js +0 -1
  685. package/web-ui/build/static/brainfuck-DDC5QXPK.js +0 -1
  686. package/web-ui/build/static/brightscript-DNN598w2.js +0 -1
  687. package/web-ui/build/static/bro-Cn_jjZ8P.js +0 -1
  688. package/web-ui/build/static/bsl-CMCN75Gu.js +0 -1
  689. package/web-ui/build/static/c-DbOGQnEJ.js +0 -1
  690. package/web-ui/build/static/c-kggwYFsy.js +0 -1
  691. package/web-ui/build/static/c-like-BIsuUvof.js +0 -1
  692. package/web-ui/build/static/cal-DpgMsBZE.js +0 -1
  693. package/web-ui/build/static/capnproto-C1AHYI-M.js +0 -1
  694. package/web-ui/build/static/ceylon-pvJffDe1.js +0 -1
  695. package/web-ui/build/static/cfscript-C1qylu52.js +0 -1
  696. package/web-ui/build/static/chaiscript-D417WKRI.js +0 -1
  697. package/web-ui/build/static/cil-CjbZHbcY.js +0 -1
  698. package/web-ui/build/static/clean-Dvc6R-F2.js +0 -1
  699. package/web-ui/build/static/clojure-CSVRQPMQ.js +0 -1
  700. package/web-ui/build/static/clojure-ig1Vkg7X.js +0 -1
  701. package/web-ui/build/static/clojure-repl-C1uyEabk.js +0 -1
  702. package/web-ui/build/static/cmake-DSbVcAB3.js +0 -1
  703. package/web-ui/build/static/cmake-Zp8kPwnH.js +0 -1
  704. package/web-ui/build/static/cobol-OsZSiK_P.js +0 -1
  705. package/web-ui/build/static/coffeescript-D8r0416S.js +0 -1
  706. package/web-ui/build/static/coffeescript-DCpgClxh.js +0 -1
  707. package/web-ui/build/static/concurnas-DKnsxUOc.js +0 -1
  708. package/web-ui/build/static/coq-BQFlywVI.js +0 -1
  709. package/web-ui/build/static/coq-BvS9mQB2.js +0 -1
  710. package/web-ui/build/static/cos-D3ze2791.js +0 -1
  711. package/web-ui/build/static/cpp-Bw-cV3P1.js +0 -1
  712. package/web-ui/build/static/cpp-vi1p7XpB.js +0 -1
  713. package/web-ui/build/static/crmsh-BClnJTeQ.js +0 -1
  714. package/web-ui/build/static/crystal-DGzOUYZq.js +0 -1
  715. package/web-ui/build/static/crystal-DMzk6EvA.js +0 -1
  716. package/web-ui/build/static/csharp-BTom8s2X.js +0 -1
  717. package/web-ui/build/static/csharp-Cp2V3jfR.js +0 -1
  718. package/web-ui/build/static/cshtml-Dmtt9Kto.js +0 -1
  719. package/web-ui/build/static/csp-WPVsLe9_.js +0 -1
  720. package/web-ui/build/static/csp-qddj5fu_.js +0 -1
  721. package/web-ui/build/static/css-B0FAm7kj.js +0 -1
  722. package/web-ui/build/static/css-extras-Bx3pvjiG.js +0 -1
  723. package/web-ui/build/static/csv-CH-edgS5.js +0 -1
  724. package/web-ui/build/static/cypher-c3G8Leew.js +0 -1
  725. package/web-ui/build/static/d-BMDSy22_.js +0 -1
  726. package/web-ui/build/static/d-BdH4oW8-.js +0 -1
  727. package/web-ui/build/static/dart-C-r72q-O.js +0 -1
  728. package/web-ui/build/static/dart-CwpBMrKa.js +0 -1
  729. package/web-ui/build/static/dataweave-BPvqdt4k.js +0 -1
  730. package/web-ui/build/static/dax-Eyy6ixcN.js +0 -1
  731. package/web-ui/build/static/delphi-DhEbPj_5.js +0 -1
  732. package/web-ui/build/static/dhall-Ct1L8sN1.js +0 -1
  733. package/web-ui/build/static/diff-CSTqCgwn.js +0 -1
  734. package/web-ui/build/static/diff-Da97B5vW.js +0 -1
  735. package/web-ui/build/static/django-DGit_lCg.js +0 -1
  736. package/web-ui/build/static/django-DPgqFB8k.js +0 -1
  737. package/web-ui/build/static/dns-DUyXuZ-a.js +0 -1
  738. package/web-ui/build/static/dns-zone-file-D79MDxVG.js +0 -1
  739. package/web-ui/build/static/docker-DTiy4o38.js +0 -1
  740. package/web-ui/build/static/dockerfile-CvwPP8wE.js +0 -1
  741. package/web-ui/build/static/dos-CaIUWxvb.js +0 -1
  742. package/web-ui/build/static/dot-D3504w6Y.js +0 -1
  743. package/web-ui/build/static/dsconfig-Smy1eeX_.js +0 -1
  744. package/web-ui/build/static/dts-DyTYSXZj.js +0 -1
  745. package/web-ui/build/static/dust-CrJyi6qA.js +0 -1
  746. package/web-ui/build/static/ebnf-C8nqfkBH.js +0 -1
  747. package/web-ui/build/static/ebnf-Cuh5Vh2-.js +0 -1
  748. package/web-ui/build/static/editorconfig-C7pTGl6n.js +0 -1
  749. package/web-ui/build/static/eiffel-C75MSJCA.js +0 -1
  750. package/web-ui/build/static/ejs-Dyo7DF5w.js +0 -1
  751. package/web-ui/build/static/elixir-D4yJefOc.js +0 -1
  752. package/web-ui/build/static/elixir-DKRow2SJ.js +0 -1
  753. package/web-ui/build/static/elm-CgbdDlkT.js +0 -1
  754. package/web-ui/build/static/elm-D3N-UgU0.js +0 -1
  755. package/web-ui/build/static/erb-BsITh8qW.js +0 -1
  756. package/web-ui/build/static/erb-lY_LyKyS.js +0 -1
  757. package/web-ui/build/static/erlang-BCnPiYmB.js +0 -1
  758. package/web-ui/build/static/erlang-JEghiPXc.js +0 -1
  759. package/web-ui/build/static/erlang-repl-DzU97ugC.js +0 -1
  760. package/web-ui/build/static/etlua-CsBo8cJa.js +0 -1
  761. package/web-ui/build/static/excel-formula-C2piiCYa.js +0 -1
  762. package/web-ui/build/static/excel-kqNypwQD.js +0 -1
  763. package/web-ui/build/static/factor-DZTOhkyU.js +0 -1
  764. package/web-ui/build/static/false-yLjhfaSw.js +0 -1
  765. package/web-ui/build/static/firestore-security-rules-oaQNoH8l.js +0 -1
  766. package/web-ui/build/static/fix-C9IfnTuS.js +0 -1
  767. package/web-ui/build/static/flix-EmJ_JhPo.js +0 -1
  768. package/web-ui/build/static/flow-DCUl7IAQ.js +0 -1
  769. package/web-ui/build/static/fortran-DvyxJmFN.js +0 -1
  770. package/web-ui/build/static/fortran-EEP9R3S5.js +0 -1
  771. package/web-ui/build/static/fsharp-D_98s3RX.js +0 -1
  772. package/web-ui/build/static/fsharp-Dt9jOO5G.js +0 -1
  773. package/web-ui/build/static/ftl-C8gMHWLo.js +0 -1
  774. package/web-ui/build/static/gams-BHxVPb4z.js +0 -1
  775. package/web-ui/build/static/gap-DFtyHk-q.js +0 -1
  776. package/web-ui/build/static/gauss-BwhJWUcg.js +0 -1
  777. package/web-ui/build/static/gcode-BvmXwp09.js +0 -1
  778. package/web-ui/build/static/gcode-gWcD6Vc7.js +0 -1
  779. package/web-ui/build/static/gdscript-btHoX8RE.js +0 -1
  780. package/web-ui/build/static/gedcom-MgPs9iqh.js +0 -1
  781. package/web-ui/build/static/gherkin-B9c_Q16A.js +0 -1
  782. package/web-ui/build/static/gherkin-BvOgkK6h.js +0 -1
  783. package/web-ui/build/static/git-D9XWOVcQ.js +0 -1
  784. package/web-ui/build/static/glsl-CshBHxHY.js +0 -1
  785. package/web-ui/build/static/glsl-fNRUMTDr.js +0 -1
  786. package/web-ui/build/static/gml-B78deHK8.js +0 -1
  787. package/web-ui/build/static/gml-Cj7d2u8O.js +0 -1
  788. package/web-ui/build/static/gn-CJLD-mF1.js +0 -1
  789. package/web-ui/build/static/go-CT93BEkL.js +0 -1
  790. package/web-ui/build/static/go-CTTlNuQO.js +0 -1
  791. package/web-ui/build/static/go-module-BgnXboUE.js +0 -1
  792. package/web-ui/build/static/golo-2S5tXS-l.js +0 -1
  793. package/web-ui/build/static/gradle-8W8DCcWJ.js +0 -1
  794. package/web-ui/build/static/graphql-DZfp6FNU.js +0 -1
  795. package/web-ui/build/static/groovy-BfsyMb3X.js +0 -1
  796. package/web-ui/build/static/groovy-Dxov7ENz.js +0 -1
  797. package/web-ui/build/static/haml-BlUFsdVV.js +0 -1
  798. package/web-ui/build/static/haml-CjVj6vvW.js +0 -1
  799. package/web-ui/build/static/handlebars-DxrQFkyA.js +0 -1
  800. package/web-ui/build/static/handlebars-FE6fotYl.js +0 -1
  801. package/web-ui/build/static/haskell-B6z0RCD_.js +0 -1
  802. package/web-ui/build/static/haskell-JBFmJTRy.js +0 -1
  803. package/web-ui/build/static/haxe-BtMZMi-_.js +0 -1
  804. package/web-ui/build/static/haxe-C1J8n-fH.js +0 -1
  805. package/web-ui/build/static/hcl-DJP-bFWE.js +0 -1
  806. package/web-ui/build/static/hlsl-DrGjhs1b.js +0 -1
  807. package/web-ui/build/static/hoon-Cg-ZhqIT.js +0 -1
  808. package/web-ui/build/static/hpkp-D07vgmoZ.js +0 -1
  809. package/web-ui/build/static/hsp-CsypPWoA.js +0 -1
  810. package/web-ui/build/static/hsts-B6DMRxvP.js +0 -1
  811. package/web-ui/build/static/htmlbars-BI7_Hw4e.js +0 -1
  812. package/web-ui/build/static/http-90ihEi4s.js +0 -1
  813. package/web-ui/build/static/http-Dp4QXj9E.js +0 -1
  814. package/web-ui/build/static/hy-BMgKvP4K.js +0 -1
  815. package/web-ui/build/static/ichigojam-D6wKvJDb.js +0 -1
  816. package/web-ui/build/static/icon-CrgkmCwl.js +0 -1
  817. package/web-ui/build/static/icu-message-format-Bi2JxCXs.js +0 -1
  818. package/web-ui/build/static/idris-DbUsyZt5.js +0 -1
  819. package/web-ui/build/static/iecst-CQZ9t8fW.js +0 -1
  820. package/web-ui/build/static/ignore-BaFgtNMs.js +0 -1
  821. package/web-ui/build/static/index-DEWSWosh.css +0 -1
  822. package/web-ui/build/static/index-Di1bjCFA.js +0 -13
  823. package/web-ui/build/static/index-otR_WSsL.js +0 -1
  824. package/web-ui/build/static/index-whZPU4as.js +0 -1183
  825. package/web-ui/build/static/inform7-ClyX1Gro.js +0 -1
  826. package/web-ui/build/static/inform7-tZHBS5XP.js +0 -1
  827. package/web-ui/build/static/ini-BrP5JNYL.js +0 -1
  828. package/web-ui/build/static/ini-CVkrAhwV.js +0 -1
  829. package/web-ui/build/static/io-BJ1Y6Bdc.js +0 -1
  830. package/web-ui/build/static/irpf90-fjjcKS_8.js +0 -1
  831. package/web-ui/build/static/isbl-ClpvfUIz.js +0 -1
  832. package/web-ui/build/static/j-CICW77xS.js +0 -1
  833. package/web-ui/build/static/java-B9DFK-0E.js +0 -1
  834. package/web-ui/build/static/java-BL_6rYko.js +0 -1
  835. package/web-ui/build/static/javadoc-Cc4HKpKK.js +0 -1
  836. package/web-ui/build/static/javadoclike-CgNkUDOm.js +0 -1
  837. package/web-ui/build/static/javascript-CM40ZECq.js +0 -1
  838. package/web-ui/build/static/javastacktrace-BHSqXfG5.js +0 -1
  839. package/web-ui/build/static/jboss-cli-Bv5NhVSZ.js +0 -1
  840. package/web-ui/build/static/jexl--Ohk_keA.js +0 -1
  841. package/web-ui/build/static/jolie-DMTN5Vdf.js +0 -1
  842. package/web-ui/build/static/jq-nXRLldXX.js +0 -1
  843. package/web-ui/build/static/js-extras-eLwv3frs.js +0 -1
  844. package/web-ui/build/static/js-templates-Ca0owlrg.js +0 -1
  845. package/web-ui/build/static/jsdoc-KERXp0da.js +0 -1
  846. package/web-ui/build/static/json-BTjLaRsy.js +0 -1
  847. package/web-ui/build/static/json-p7pU0qdW.js +0 -1
  848. package/web-ui/build/static/json5-Cxjy1udc.js +0 -1
  849. package/web-ui/build/static/jsonp-CO52H7Gy.js +0 -1
  850. package/web-ui/build/static/jsstacktrace-8YKfoyJP.js +0 -1
  851. package/web-ui/build/static/jsx-Ct_05KbM.js +0 -1
  852. package/web-ui/build/static/julia-23I1ubCE.js +0 -1
  853. package/web-ui/build/static/julia-d8rVGed_.js +0 -1
  854. package/web-ui/build/static/julia-repl-mwnHedW_.js +0 -1
  855. package/web-ui/build/static/keepalived-E85Rx_fF.js +0 -1
  856. package/web-ui/build/static/keyman-aWd3QUDq.js +0 -1
  857. package/web-ui/build/static/kotlin-Cu370hQq.js +0 -1
  858. package/web-ui/build/static/kotlin-DoJ2WnmZ.js +0 -1
  859. package/web-ui/build/static/kumir-oiOgqcQO.js +0 -1
  860. package/web-ui/build/static/kusto-Bp-B02K5.js +0 -1
  861. package/web-ui/build/static/lasso-BxoQVwOO.js +0 -1
  862. package/web-ui/build/static/latex-CANm5vsX.js +0 -1
  863. package/web-ui/build/static/latex-PMroeNch.js +0 -1
  864. package/web-ui/build/static/latte-2ErU_2XF.js +0 -1
  865. package/web-ui/build/static/ldif-ChPn_F7o.js +0 -1
  866. package/web-ui/build/static/leaf-UkCugDgG.js +0 -1
  867. package/web-ui/build/static/less-CCH5RA89.js +0 -1
  868. package/web-ui/build/static/less-CGZbVU1g.js +0 -1
  869. package/web-ui/build/static/lilypond-BoyM37sv.js +0 -1
  870. package/web-ui/build/static/liquid-DGJVpRBi.js +0 -1
  871. package/web-ui/build/static/lisp-93nne61u.js +0 -1
  872. package/web-ui/build/static/lisp-DYjIRsXz.js +0 -1
  873. package/web-ui/build/static/livecodeserver-CfNaxIE4.js +0 -1
  874. package/web-ui/build/static/livescript-C8kDlQkz.js +0 -1
  875. package/web-ui/build/static/livescript-CoarnRHq.js +0 -1
  876. package/web-ui/build/static/llvm-CBVyNmAh.js +0 -1
  877. package/web-ui/build/static/llvm-DGxq8a7u.js +0 -1
  878. package/web-ui/build/static/log-BivgwFql.js +0 -1
  879. package/web-ui/build/static/lolcode-l5sK2cZz.js +0 -1
  880. package/web-ui/build/static/lsl-Xm44xLRQ.js +0 -1
  881. package/web-ui/build/static/lua-CGvrzfKp.js +0 -1
  882. package/web-ui/build/static/lua-nHwXeY4c.js +0 -1
  883. package/web-ui/build/static/magma-DmNItmna.js +0 -1
  884. package/web-ui/build/static/makefile-CKJNNHGb.js +0 -1
  885. package/web-ui/build/static/makefile-DI6y5Qml.js +0 -1
  886. package/web-ui/build/static/markdown-BgpbxKd-.js +0 -1
  887. package/web-ui/build/static/markdown-CvcxA4yk.js +0 -1
  888. package/web-ui/build/static/markup-templating-DijqesiA.js +0 -1
  889. package/web-ui/build/static/mathematica-Cxll1Q10.js +0 -1
  890. package/web-ui/build/static/matlab-BJo2T1A-.js +0 -1
  891. package/web-ui/build/static/matlab-C6DlZX4l.js +0 -1
  892. package/web-ui/build/static/maxima-DJXO4sbL.js +0 -1
  893. package/web-ui/build/static/maxscript-DdLpUYBs.js +0 -1
  894. package/web-ui/build/static/mel-BIpfnSyZ.js +0 -1
  895. package/web-ui/build/static/mel-BYcTUZJW.js +0 -1
  896. package/web-ui/build/static/mercury-C_LSpbD8.js +0 -1
  897. package/web-ui/build/static/mermaid-D9yBWnrT.js +0 -1
  898. package/web-ui/build/static/mipsasm-nR_K2Ue-.js +0 -1
  899. package/web-ui/build/static/mizar-BeLUPncD.js +0 -1
  900. package/web-ui/build/static/mizar-BesIbZd9.js +0 -1
  901. package/web-ui/build/static/mojolicious-cBx3OWa-.js +0 -1
  902. package/web-ui/build/static/mongodb-DTWKy9ac.js +0 -1
  903. package/web-ui/build/static/monkey-B72bZC3c.js +0 -1
  904. package/web-ui/build/static/monkey-G9XELYPQ.js +0 -1
  905. package/web-ui/build/static/moonscript-BXYVQiqj.js +0 -1
  906. package/web-ui/build/static/moonscript-sDd-5knz.js +0 -1
  907. package/web-ui/build/static/n1ql-0vKSfFAO.js +0 -1
  908. package/web-ui/build/static/n1ql-C9_BSZfz.js +0 -1
  909. package/web-ui/build/static/n4js-B7Ct8dds.js +0 -1
  910. package/web-ui/build/static/nand2tetris-hdl-p9gpphTM.js +0 -1
  911. package/web-ui/build/static/naniscript-6ZVr8Aug.js +0 -1
  912. package/web-ui/build/static/nasm-Ca73yTUt.js +0 -1
  913. package/web-ui/build/static/neon-DNP49oyX.js +0 -1
  914. package/web-ui/build/static/nevod-Qhgt7Bce.js +0 -1
  915. package/web-ui/build/static/nginx-D5e7lu62.js +0 -1
  916. package/web-ui/build/static/nginx-DobnyESB.js +0 -1
  917. package/web-ui/build/static/nim-BPBivUOV.js +0 -1
  918. package/web-ui/build/static/nim-Baoug1Wa.js +0 -1
  919. package/web-ui/build/static/nix-CSPTQs5y.js +0 -1
  920. package/web-ui/build/static/nix-Dk4eNw49.js +0 -1
  921. package/web-ui/build/static/node-repl-NJNL8VFR.js +0 -1
  922. package/web-ui/build/static/nsis-BZ0oMzEw.js +0 -1
  923. package/web-ui/build/static/nsis-CKPCjtCU.js +0 -1
  924. package/web-ui/build/static/objectivec-BkfIRhhV.js +0 -1
  925. package/web-ui/build/static/objectivec-CnQgqhbJ.js +0 -1
  926. package/web-ui/build/static/ocaml-9rGNzRrK.js +0 -1
  927. package/web-ui/build/static/ocaml-CTolCqxL.js +0 -1
  928. package/web-ui/build/static/opencl-9Q3vRDxv.js +0 -1
  929. package/web-ui/build/static/openqasm-D2QiuFBp.js +0 -1
  930. package/web-ui/build/static/openscad-C3HyuzpB.js +0 -1
  931. package/web-ui/build/static/oxygene-4gi-VYy_.js +0 -1
  932. package/web-ui/build/static/oz-BGDEB-1A.js +0 -1
  933. package/web-ui/build/static/parigp-CfZzp1uE.js +0 -1
  934. package/web-ui/build/static/parser-UbGteTcy.js +0 -1
  935. package/web-ui/build/static/parser3-C-Jx-fy7.js +0 -1
  936. package/web-ui/build/static/pascal-D1_R0gW-.js +0 -1
  937. package/web-ui/build/static/pascaligo-B8C-98Np.js +0 -1
  938. package/web-ui/build/static/pcaxis-TGnlUKNs.js +0 -1
  939. package/web-ui/build/static/peoplecode-C5Vf1AH0.js +0 -1
  940. package/web-ui/build/static/perl-CBp1N62T.js +0 -1
  941. package/web-ui/build/static/perl-Z59j904t.js +0 -1
  942. package/web-ui/build/static/pf-Cq8B_xwQ.js +0 -1
  943. package/web-ui/build/static/pgsql-ofJbUHkL.js +0 -1
  944. package/web-ui/build/static/php-OlH7HLQJ.js +0 -1
  945. package/web-ui/build/static/php-extras-GqtrxLuk.js +0 -1
  946. package/web-ui/build/static/php-r09kMDOB.js +0 -1
  947. package/web-ui/build/static/php-template-18uT97Qo.js +0 -1
  948. package/web-ui/build/static/phpdoc-9tRFvup9.js +0 -1
  949. package/web-ui/build/static/plaintext-DsYT6Mu-.js +0 -1
  950. package/web-ui/build/static/plsql-RhWQNJVb.js +0 -1
  951. package/web-ui/build/static/pony-DD6JMLYI.js +0 -1
  952. package/web-ui/build/static/powerquery-CALow-bt.js +0 -1
  953. package/web-ui/build/static/powershell-C2QvIuKF.js +0 -1
  954. package/web-ui/build/static/powershell-yrbJEhCh.js +0 -1
  955. package/web-ui/build/static/processing-1T5w_Q03.js +0 -1
  956. package/web-ui/build/static/processing-DBim_dO-.js +0 -1
  957. package/web-ui/build/static/profile-Cdloh8mZ.js +0 -1
  958. package/web-ui/build/static/prolog-DRSsNnns.js +0 -1
  959. package/web-ui/build/static/prolog-D_ajweDr.js +0 -1
  960. package/web-ui/build/static/promql-BRuwn6Bn.js +0 -1
  961. package/web-ui/build/static/properties-D5Wyl4X4.js +0 -1
  962. package/web-ui/build/static/properties-kn4fl1bl.js +0 -1
  963. package/web-ui/build/static/protobuf-BMO76zWi.js +0 -1
  964. package/web-ui/build/static/protobuf-CTUCF-U-.js +0 -1
  965. package/web-ui/build/static/psl-CiqYdQbY.js +0 -1
  966. package/web-ui/build/static/pug-BLE2Qayj.js +0 -1
  967. package/web-ui/build/static/puppet-CFKLWXft.js +0 -1
  968. package/web-ui/build/static/puppet-DQci0Dl5.js +0 -1
  969. package/web-ui/build/static/pure-D2h_GynV.js +0 -1
  970. package/web-ui/build/static/purebasic-BF8MVw8V.js +0 -1
  971. package/web-ui/build/static/purebasic-BTtHiCkh.js +0 -1
  972. package/web-ui/build/static/purescript-D1ZSh-sH.js +0 -1
  973. package/web-ui/build/static/python-Cp9_Vdhb.js +0 -1
  974. package/web-ui/build/static/python-DdgNw8IW.js +0 -1
  975. package/web-ui/build/static/python-repl-DvK89VMC.js +0 -1
  976. package/web-ui/build/static/q-COaIgwhT.js +0 -1
  977. package/web-ui/build/static/q-Cm0dQkW8.js +0 -1
  978. package/web-ui/build/static/qml-BpsOqqJM.js +0 -1
  979. package/web-ui/build/static/qml-BziQXlU4.js +0 -1
  980. package/web-ui/build/static/qore-Cutz6g-2.js +0 -1
  981. package/web-ui/build/static/qsharp-B16619X1.js +0 -1
  982. package/web-ui/build/static/r-CFUIj5Hd.js +0 -1
  983. package/web-ui/build/static/r-CPrwCi5w.js +0 -1
  984. package/web-ui/build/static/racket-Bh08DFXF.js +0 -1
  985. package/web-ui/build/static/reason-BxjDq4e-.js +0 -1
  986. package/web-ui/build/static/reasonml-Ds5SsGP8.js +0 -1
  987. package/web-ui/build/static/regex-DhBIDIMI.js +0 -1
  988. package/web-ui/build/static/rego-DCwxZXcB.js +0 -1
  989. package/web-ui/build/static/renpy-C2fuQfqb.js +0 -1
  990. package/web-ui/build/static/rest-C52ZpxWQ.js +0 -1
  991. package/web-ui/build/static/rib-Cbl2Mzyj.js +0 -1
  992. package/web-ui/build/static/rip-BTOu5ZIE.js +0 -1
  993. package/web-ui/build/static/roboconf-3Oi2wuVk.js +0 -1
  994. package/web-ui/build/static/roboconf-ndLZLE39.js +0 -1
  995. package/web-ui/build/static/robotframework-BzHXiIj1.js +0 -1
  996. package/web-ui/build/static/routeros-CkpPoqx-.js +0 -1
  997. package/web-ui/build/static/rsl-C0bwOQ38.js +0 -1
  998. package/web-ui/build/static/ruby-C_hIhtuQ.js +0 -1
  999. package/web-ui/build/static/ruby-DvKfZPzj.js +0 -1
  1000. package/web-ui/build/static/ruleslanguage-CbZJlddz.js +0 -1
  1001. package/web-ui/build/static/rust-BFPIhB-X.js +0 -1
  1002. package/web-ui/build/static/rust-sBpUq-qE.js +0 -1
  1003. package/web-ui/build/static/sas-BCXvYN9x.js +0 -1
  1004. package/web-ui/build/static/sas-D7GAsTY3.js +0 -1
  1005. package/web-ui/build/static/sass-BdaErGMN.js +0 -1
  1006. package/web-ui/build/static/scala-Cj81oCl9.js +0 -1
  1007. package/web-ui/build/static/scala-CvbksfY6.js +0 -1
  1008. package/web-ui/build/static/scheme-BM5ZqKnl.js +0 -1
  1009. package/web-ui/build/static/scheme-BPvlu9Tk.js +0 -1
  1010. package/web-ui/build/static/scilab-CJanLKQN.js +0 -1
  1011. package/web-ui/build/static/scss-C53YF_7f.js +0 -1
  1012. package/web-ui/build/static/scss-DPp8UZbr.js +0 -1
  1013. package/web-ui/build/static/shell-CC9bQXMe.js +0 -1
  1014. package/web-ui/build/static/shell-session-CuR3fbf-.js +0 -1
  1015. package/web-ui/build/static/smali-CUgLls3D.js +0 -1
  1016. package/web-ui/build/static/smali-YODSX8qt.js +0 -1
  1017. package/web-ui/build/static/smalltalk-BMJQ4bbs.js +0 -1
  1018. package/web-ui/build/static/smalltalk-BVGY3CTl.js +0 -1
  1019. package/web-ui/build/static/smarty-C9aNt4-p.js +0 -1
  1020. package/web-ui/build/static/sml-C3BIHhfq.js +0 -1
  1021. package/web-ui/build/static/sml-DTipyRmY.js +0 -1
  1022. package/web-ui/build/static/solidity-1yuPUqoC.js +0 -1
  1023. package/web-ui/build/static/solution-file-BgzK4GOU.js +0 -1
  1024. package/web-ui/build/static/soy-CFJXRvqc.js +0 -1
  1025. package/web-ui/build/static/sparql-CAosYMpl.js +0 -1
  1026. package/web-ui/build/static/splunk-spl-DkINtWr8.js +0 -1
  1027. package/web-ui/build/static/sqf-DbrWIS2M.js +0 -1
  1028. package/web-ui/build/static/sqf-nq8Q9J2W.js +0 -1
  1029. package/web-ui/build/static/sql-9bwClhZQ.js +0 -1
  1030. package/web-ui/build/static/sql-CqPkY-lX.js +0 -1
  1031. package/web-ui/build/static/sql_more-CsY5ts77.js +0 -1
  1032. package/web-ui/build/static/squirrel-BuqtzRBD.js +0 -1
  1033. package/web-ui/build/static/stan-BNxBSglc.js +0 -1
  1034. package/web-ui/build/static/stan-CZVMc34l.js +0 -1
  1035. package/web-ui/build/static/stata-DKnVdHCd.js +0 -1
  1036. package/web-ui/build/static/step21-Cu_TaBGF.js +0 -1
  1037. package/web-ui/build/static/stylus-BS7-OJew.js +0 -1
  1038. package/web-ui/build/static/stylus-DtFrp1Nk.js +0 -1
  1039. package/web-ui/build/static/subunit-DDCoWkkc.js +0 -1
  1040. package/web-ui/build/static/swift-BaguUZbl.js +0 -1
  1041. package/web-ui/build/static/swift-mwBsb8Bx.js +0 -1
  1042. package/web-ui/build/static/systemd-D6PpyDKk.js +0 -1
  1043. package/web-ui/build/static/t4-cs-Cem8g4Ck.js +0 -1
  1044. package/web-ui/build/static/t4-templating-BZo-HjmD.js +0 -1
  1045. package/web-ui/build/static/t4-vb-B4oVnKa4.js +0 -1
  1046. package/web-ui/build/static/taggerscript-DweAZ5pw.js +0 -1
  1047. package/web-ui/build/static/tap-DpuvKHHF.js +0 -1
  1048. package/web-ui/build/static/tap-hUKmJObZ.js +0 -1
  1049. package/web-ui/build/static/tcl-BUvhAi7u.js +0 -1
  1050. package/web-ui/build/static/tcl-Dsck63d8.js +0 -1
  1051. package/web-ui/build/static/textile-CgKbqJ-j.js +0 -1
  1052. package/web-ui/build/static/thrift-B5H6rApp.js +0 -1
  1053. package/web-ui/build/static/toml-DggTpfOo.js +0 -1
  1054. package/web-ui/build/static/tp-CazB2P2X.js +0 -1
  1055. package/web-ui/build/static/tremor-B1jy7S5p.js +0 -1
  1056. package/web-ui/build/static/tsx-BqF2lVDi.js +0 -1
  1057. package/web-ui/build/static/tt2-BNoNXpEe.js +0 -1
  1058. package/web-ui/build/static/turtle-B0evd5mn.js +0 -1
  1059. package/web-ui/build/static/twig-B5A7nMdv.js +0 -1
  1060. package/web-ui/build/static/twig-DZnLWvh8.js +0 -1
  1061. package/web-ui/build/static/typescript-Bbe_P093.js +0 -1
  1062. package/web-ui/build/static/typescript-BfhvmSSG.js +0 -1
  1063. package/web-ui/build/static/typoscript-BjuZEIgw.js +0 -1
  1064. package/web-ui/build/static/unrealscript-C3iUCFRi.js +0 -1
  1065. package/web-ui/build/static/uorazor-CbZXwzIj.js +0 -1
  1066. package/web-ui/build/static/uri-xMPSnp6m.js +0 -1
  1067. package/web-ui/build/static/v-BKcGo5I6.js +0 -1
  1068. package/web-ui/build/static/vala-BRoBE4am.js +0 -1
  1069. package/web-ui/build/static/vala-B__Iyrma.js +0 -1
  1070. package/web-ui/build/static/vbnet-DBxlMRvN.js +0 -1
  1071. package/web-ui/build/static/vbnet-DjAXt5BE.js +0 -1
  1072. package/web-ui/build/static/vbscript-BNA4oANi.js +0 -1
  1073. package/web-ui/build/static/vbscript-html-o8ckLPKG.js +0 -1
  1074. package/web-ui/build/static/velocity-D7sc5ggA.js +0 -1
  1075. package/web-ui/build/static/verilog-BWJfMIng.js +0 -1
  1076. package/web-ui/build/static/verilog-jW2GPC--.js +0 -1
  1077. package/web-ui/build/static/vhdl-BIVlXRPa.js +0 -1
  1078. package/web-ui/build/static/vhdl-BeqdhhxD.js +0 -1
  1079. package/web-ui/build/static/vim-712lI4-g.js +0 -1
  1080. package/web-ui/build/static/vim-DMROTzr0.js +0 -1
  1081. package/web-ui/build/static/visual-basic-CQfbM-ta.js +0 -1
  1082. package/web-ui/build/static/warpscript-DFAvCXFQ.js +0 -1
  1083. package/web-ui/build/static/wasm-CiYoxBl0.js +0 -1
  1084. package/web-ui/build/static/web-idl-DoCkPK8y.js +0 -1
  1085. package/web-ui/build/static/wiki-bvz0AGzB.js +0 -1
  1086. package/web-ui/build/static/wolfram-fBuyFEgU.js +0 -1
  1087. package/web-ui/build/static/wren-DvATFxjF.js +0 -1
  1088. package/web-ui/build/static/x86asm-r4bPbUR_.js +0 -1
  1089. package/web-ui/build/static/xeora-B6iOnDJY.js +0 -1
  1090. package/web-ui/build/static/xl-Ce6B5slc.js +0 -1
  1091. package/web-ui/build/static/xml-DNjyPmhQ.js +0 -1
  1092. package/web-ui/build/static/xml-doc-DydogmZD.js +0 -1
  1093. package/web-ui/build/static/xojo-DCQLltvr.js +0 -1
  1094. package/web-ui/build/static/xquery-C-fAnA0H.js +0 -1
  1095. package/web-ui/build/static/xquery-CNeqzhLO.js +0 -1
  1096. package/web-ui/build/static/yaml-BsVaGsk5.js +0 -1
  1097. package/web-ui/build/static/yaml-kVZvwv_C.js +0 -1
  1098. package/web-ui/build/static/yang-B_gq9JEq.js +0 -1
  1099. package/web-ui/build/static/zephir-ECIXgXhX.js +0 -1
  1100. package/web-ui/build/static/zig-DY325EKG.js +0 -1
@@ -19,6 +19,8 @@
19
19
 
20
20
  import { BaseTool } from './baseTool.js';
21
21
  import { getMemoryService, PLAN_TITLE_PREFIX } from '../services/memoryService.js';
22
+ import { MemoryIndexer } from '../services/embeddings/indexers/memoryIndexer.js';
23
+ import { ReminisceIndexer } from '../services/embeddings/indexers/reminisceIndexer.js';
22
24
 
23
25
  /**
24
26
  * True if the given memory title is a "working plan" — those are
@@ -99,12 +101,25 @@ After add/update of a plan/* memory, the tool DOES NOT echo the content back
99
101
  in the result — it would duplicate the header injection. You'll see the plan
100
102
  in your system prompt on the next turn instead.
101
103
 
102
- USAGE:
104
+ USAGE (canonical plural — same shape across all tools):
103
105
  \`\`\`json
104
106
  {
105
107
  "toolId": "memory",
106
- "action": "<action>",
107
- "parameters": { ... }
108
+ "actions": [
109
+ {"type": "read", "id": "mem-123-abc"}
110
+ ]
111
+ }
112
+ \`\`\`
113
+
114
+ BATCH multiple memory operations in one call:
115
+ \`\`\`json
116
+ {
117
+ "toolId": "memory",
118
+ "actions": [
119
+ {"type": "read", "id": "mem-auth-plan"},
120
+ {"type": "read", "id": "mem-retry-policy"},
121
+ {"type": "append", "id": "mem-auth-plan", "content": "Step 4 added: revoke v1 tokens"}
122
+ ]
108
123
  }
109
124
  \`\`\`
110
125
 
@@ -114,11 +129,13 @@ ACTIONS:
114
129
  \`\`\`json
115
130
  {
116
131
  "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
132
+ "actions": [{
133
+ "type": "add",
134
+ "title": "User prefers TypeScript",
135
+ "description": "Programming language preference",
136
+ "content": "The user explicitly stated they prefer TypeScript over JavaScript.",
137
+ "expiration": null
138
+ }]
122
139
  }
123
140
  \`\`\`
124
141
 
@@ -131,12 +148,14 @@ Expiration options:
131
148
  \`\`\`json
132
149
  {
133
150
  "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"
151
+ "actions": [{
152
+ "type": "update",
153
+ "id": "mem-123-abc",
154
+ "title": "Updated title",
155
+ "description": "Updated description",
156
+ "content": "Updated content",
157
+ "expiration": "2025-12-31"
158
+ }]
140
159
  }
141
160
  \`\`\`
142
161
 
@@ -144,8 +163,7 @@ Expiration options:
144
163
  \`\`\`json
145
164
  {
146
165
  "toolId": "memory",
147
- "action": "delete",
148
- "id": "mem-123-abc"
166
+ "actions": [{"type": "delete", "id": "mem-123-abc"}]
149
167
  }
150
168
  \`\`\`
151
169
 
@@ -153,8 +171,7 @@ Expiration options:
153
171
  \`\`\`json
154
172
  {
155
173
  "toolId": "memory",
156
- "action": "list",
157
- "level": "titles"
174
+ "actions": [{"type": "list", "level": "titles"}]
158
175
  }
159
176
  \`\`\`
160
177
 
@@ -167,8 +184,7 @@ Level options:
167
184
  \`\`\`json
168
185
  {
169
186
  "toolId": "memory",
170
- "action": "read",
171
- "id": "mem-123-abc"
187
+ "actions": [{"type": "read", "id": "mem-123-abc"}]
172
188
  }
173
189
  \`\`\`
174
190
 
@@ -176,8 +192,7 @@ Level options:
176
192
  \`\`\`json
177
193
  {
178
194
  "toolId": "memory",
179
- "action": "search",
180
- "query": "TypeScript"
195
+ "actions": [{"type": "search", "query": "TypeScript"}]
181
196
  }
182
197
  \`\`\`
183
198
 
@@ -185,7 +200,7 @@ Level options:
185
200
  \`\`\`json
186
201
  {
187
202
  "toolId": "memory",
188
- "action": "stats"
203
+ "actions": [{"type": "stats"}]
189
204
  }
190
205
  \`\`\`
191
206
 
@@ -389,47 +404,89 @@ BEST PRACTICES:
389
404
  */
390
405
  customValidateParameters(params) {
391
406
  const errors = [];
392
- const validActions = ['add', 'update', 'delete', 'list', 'read', 'search', 'stats', 'reminisce'];
407
+ const validActions = ['add', 'update', 'append', 'delete', 'list', 'read', 'search', 'semantic-search', 'backfill-embeddings', 'reminisce-backfill-embeddings', 'forget-stale', 'publish-to-team', 'search-team', 'unpublish-from-team', 'stats', 'reminisce'];
393
408
 
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(', ')}`);
409
+ // Normalize to the canonical actions[] shape and validate every action.
410
+ // Accepts both the canonical plural `{actions: [{type, ...}]}` and the
411
+ // legacy singular `{action: "X", ...}` shapes — the executor's
412
+ // _normalizeToActions handles the runtime promotion identically.
413
+ const actions = this._normalizeToActions(params);
414
+
415
+ if (actions.length === 0) {
416
+ errors.push('action is required (or `actions: [...]` for batched calls)');
398
417
  } 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;
418
+ for (let i = 0; i < actions.length; i++) {
419
+ const a = actions[i];
420
+ const tag = actions.length > 1 ? `actions[${i}]: ` : '';
421
+ if (!a || typeof a !== 'object') {
422
+ errors.push(`${tag}must be an object with a "type" field`);
423
+ continue;
424
+ }
425
+ const t = a.type;
426
+ if (!t) {
427
+ errors.push(`${tag}"type" is required`);
428
+ continue;
429
+ }
430
+ if (!validActions.includes(t)) {
431
+ errors.push(`${tag}type must be one of: ${validActions.join(', ')}`);
432
+ continue;
433
+ }
434
+ switch (t) {
435
+ case 'add':
436
+ if (!a.title) errors.push(`${tag}title is required for add`);
437
+ if (!a.content) errors.push(`${tag}content is required for add`);
438
+ break;
439
+ case 'update':
440
+ if (!a.id) errors.push(`${tag}id is required for update`);
441
+ break;
442
+ case 'append':
443
+ if (!a.id) errors.push(`${tag}id is required for append`);
444
+ if (!a.content) errors.push(`${tag}content is required for append`);
445
+ break;
446
+ case 'delete':
447
+ if (!a.id) errors.push(`${tag}id is required for delete`);
448
+ break;
449
+ case 'read':
450
+ if (!a.id) errors.push(`${tag}id is required for read`);
451
+ break;
452
+ case 'search':
453
+ if (!a.query) errors.push(`${tag}query is required for search`);
454
+ break;
455
+ case 'semantic-search':
456
+ if (!a.query) errors.push(`${tag}query is required for semantic-search`);
457
+ if (a.topK != null && (!Number.isInteger(a.topK) || a.topK <= 0)) {
458
+ errors.push(`${tag}topK must be a positive integer when provided`);
459
+ }
460
+ break;
461
+ case 'forget-stale':
462
+ if (a.ageDays != null && (!Number.isFinite(a.ageDays) || a.ageDays <= 0)) {
463
+ errors.push(`${tag}ageDays must be a positive number when provided`);
464
+ }
465
+ break;
466
+ case 'publish-to-team':
467
+ if (!a.id) errors.push(`${tag}id is required for publish-to-team (the memory id to publish)`);
468
+ if (!a.teamId) errors.push(`${tag}teamId is required for publish-to-team`);
469
+ break;
470
+ case 'search-team':
471
+ if (!a.teamId) errors.push(`${tag}teamId is required for search-team`);
472
+ if (!a.query) errors.push(`${tag}query is required for search-team`);
473
+ if (a.topK != null && (!Number.isInteger(a.topK) || a.topK <= 0)) {
474
+ errors.push(`${tag}topK must be a positive integer when provided`);
475
+ }
476
+ break;
477
+ case 'unpublish-from-team':
478
+ if (!a.id) errors.push(`${tag}id is required for unpublish-from-team`);
479
+ if (!a.teamId) errors.push(`${tag}teamId is required for unpublish-from-team`);
480
+ break;
481
+ // backfill-embeddings has no required params (re-indexes everything).
482
+ }
483
+ // Length limits (per-action).
484
+ if (a.title && a.title.length > 200) errors.push(`${tag}title cannot exceed 200 characters`);
485
+ if (a.description && a.description.length > 500) errors.push(`${tag}description cannot exceed 500 characters`);
486
+ if (a.content && a.content.length > 10000) errors.push(`${tag}content cannot exceed 10000 characters`);
417
487
  }
418
488
  }
419
489
 
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
490
  return {
434
491
  valid: errors.length === 0,
435
492
  errors
@@ -443,7 +500,6 @@ BEST PRACTICES:
443
500
  * @returns {Promise<Object>}
444
501
  */
445
502
  async execute(params, context) {
446
- const { action } = params;
447
503
  const { agentId } = context;
448
504
 
449
505
  if (!agentId) {
@@ -452,32 +508,110 @@ BEST PRACTICES:
452
508
 
453
509
  const memoryService = await this._ensureMemoryService();
454
510
 
511
+ // PLURAL-CANONICAL DISPATCH — the canonical shape is
512
+ // `{actions: [{type: "read", id: "X"}, ...]}` matching the rest
513
+ // of the tool conventions (filesystem, terminal, taskmanager).
514
+ // Singular `{action: "read", id: "X"}` is auto-promoted as
515
+ // backward-compat for the agent's training-prior emissions.
516
+ // See commit 5e6b817 + the "tool envelope unification" thread.
517
+ const actions = this._normalizeToActions(params);
518
+
519
+ if (actions.length === 0) {
520
+ throw new Error('memory tool requires either `action` (singular) or `actions` (plural array). Each action needs a `type` (or `action`) field.');
521
+ }
522
+
523
+ // Single-action path → return one result directly (no array wrap)
524
+ // for backward-compat with every existing caller / test that
525
+ // expects the shape from the singular dispatch.
526
+ if (actions.length === 1) {
527
+ return await this._dispatchSingleAction(memoryService, agentId, actions[0], context);
528
+ }
529
+
530
+ // Multi-action path → execute sequentially, return array of results.
531
+ // Errors on one action don't abort the others — each result
532
+ // carries its own success/error state.
533
+ const results = [];
534
+ for (const a of actions) {
535
+ try {
536
+ const r = await this._dispatchSingleAction(memoryService, agentId, a, context);
537
+ results.push(r);
538
+ } catch (err) {
539
+ results.push({ success: false, action: a.type || a.action, error: err.message });
540
+ }
541
+ }
542
+ return {
543
+ success: results.every(r => r.success !== false),
544
+ batched: true,
545
+ actionCount: results.length,
546
+ results,
547
+ };
548
+ }
549
+
550
+ /**
551
+ * Promote a tool-call's params into a canonical actions[] array.
552
+ * Accepts:
553
+ * { actions: [{type, ...}] } (canonical plural)
554
+ * { actions: [{action, ...}] } (plural with `action` instead of `type`)
555
+ * { action: "read", id: "X" } (legacy singular at top level)
556
+ * { action: "read", parameters: {...} } (legacy singular with nested params)
557
+ * @private
558
+ */
559
+ _normalizeToActions(params) {
560
+ if (!params || typeof params !== 'object') return [];
561
+ if (Array.isArray(params.actions)) {
562
+ // Normalize each item: ensure `type` is set (rename `action`→`type`).
563
+ return params.actions.map(a => {
564
+ if (!a || typeof a !== 'object') return a;
565
+ if (!a.type && a.action) {
566
+ const { action, ...rest } = a;
567
+ return { type: action, ...rest };
568
+ }
569
+ return a;
570
+ });
571
+ }
572
+ if (params.action) {
573
+ const { action, parameters, ...rest } = params;
574
+ // Merge nested `parameters` (some callers wrap fields inside).
575
+ return [{ type: action, ...(parameters && typeof parameters === 'object' ? parameters : {}), ...rest }];
576
+ }
577
+ return [];
578
+ }
579
+
580
+ /**
581
+ * Dispatch a single normalized action {type, ...fields}.
582
+ * The downstream _executeX methods expect the legacy params shape
583
+ * (flat with `action: "X"`), so we adapt before calling.
584
+ * @private
585
+ */
586
+ async _dispatchSingleAction(memoryService, agentId, action, context) {
587
+ const { type, ...rest } = action;
588
+ const legacyParams = { action: type, ...rest };
455
589
  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);
590
+ switch (type) {
591
+ case 'add': return await this._executeAdd(memoryService, agentId, legacyParams);
592
+ case 'update': return await this._executeUpdate(memoryService, agentId, legacyParams);
593
+ case 'append': return await this._executeAppend(memoryService, agentId, legacyParams);
594
+ case 'delete': return await this._executeDelete(memoryService, agentId, legacyParams);
595
+ case 'list': return await this._executeList(memoryService, agentId, legacyParams);
596
+ case 'read': return await this._executeRead(memoryService, agentId, legacyParams);
597
+ case 'search': return await this._executeSearch(memoryService, agentId, legacyParams);
598
+ case 'semantic-search': return await this._executeSemanticSearch(memoryService, agentId, legacyParams);
599
+ case 'backfill-embeddings': return await this._executeBackfillEmbeddings(memoryService, agentId);
600
+ case 'reminisce-backfill-embeddings': return await this._executeReminisceBackfill(agentId, context);
601
+ case 'forget-stale': return await this._executeForgetStale(memoryService, agentId, legacyParams);
602
+ case 'publish-to-team': return await this._executePublishToTeam(memoryService, agentId, legacyParams);
603
+ case 'search-team': return await this._executeSearchTeam(agentId, legacyParams);
604
+ case 'unpublish-from-team': return await this._executeUnpublishFromTeam(agentId, legacyParams);
605
+ case 'stats': return await this._executeStats(memoryService, agentId);
606
+ case 'reminisce': return await this._executeReminisce(agentId, legacyParams, context);
473
607
  default:
474
- throw new Error(`Unknown action: ${action}`);
608
+ throw new Error(`Unknown memory action: ${type}`);
475
609
  }
476
610
  } catch (error) {
477
- this.logger?.error(`Memory tool execution failed: ${error.message}`, {
611
+ this.logger?.error(`Memory tool action failed: ${error.message}`, {
478
612
  agentId,
479
- action,
480
- error: error.stack
613
+ type,
614
+ error: error.stack,
481
615
  });
482
616
  throw error;
483
617
  }
@@ -494,6 +628,11 @@ BEST PRACTICES:
494
628
  expiration: params.expiration
495
629
  });
496
630
 
631
+ // Fire-and-forget index update. Best-effort by design — the indexer's
632
+ // public surface swallows errors and returns a result, but we don't
633
+ // even await it so memory writes never wait on the embedding service.
634
+ this._asyncIndexMemory(agentId, memory);
635
+
497
636
  return {
498
637
  success: true,
499
638
  action: 'add',
@@ -532,6 +671,9 @@ BEST PRACTICES:
532
671
  };
533
672
  }
534
673
 
674
+ // Re-index after content change. Fire-and-forget.
675
+ this._asyncIndexMemory(agentId, memory);
676
+
535
677
  return {
536
678
  success: true,
537
679
  action: 'update',
@@ -546,6 +688,47 @@ BEST PRACTICES:
546
688
  };
547
689
  }
548
690
 
691
+ /**
692
+ * Execute APPEND action — additive update with a timestamped block.
693
+ *
694
+ * Designed for the "memory grows as the agent learns" use case:
695
+ * agent attaches a memory to a task on creation, then appends
696
+ * findings/methodology as work progresses. Each append becomes a
697
+ * dated section so the memory reads like a journal.
698
+ *
699
+ * Soft-cap behavior: once total content exceeds ~16K chars, the
700
+ * service compresses older blocks into a summary on subsequent
701
+ * appends. See memoryService.appendToMemory.
702
+ */
703
+ async _executeAppend(memoryService, agentId, params) {
704
+ const memory = await memoryService.appendToMemory(agentId, params.id, params.content);
705
+
706
+ if (!memory) {
707
+ return {
708
+ success: false,
709
+ action: 'append',
710
+ message: `Memory not found: ${params.id}`
711
+ };
712
+ }
713
+
714
+ // Re-index after content grew. Fire-and-forget.
715
+ this._asyncIndexMemory(agentId, memory);
716
+
717
+ return {
718
+ success: true,
719
+ action: 'append',
720
+ memory: {
721
+ id: memory.id,
722
+ title: memory.title,
723
+ updatedAt: memory.updatedAt,
724
+ contentLength: memory.content?.length || 0,
725
+ },
726
+ message: isPlanTitle(memory.title)
727
+ ? `Plan updated (append): "${memory.title}" — full content appears in AGENT WORKING PLAN next turn.`
728
+ : `Appended to memory: "${memory.title}" (now ${memory.content?.length || 0} chars)`
729
+ };
730
+ }
731
+
549
732
  /**
550
733
  * Execute DELETE action
551
734
  */
@@ -560,6 +743,9 @@ BEST PRACTICES:
560
743
  };
561
744
  }
562
745
 
746
+ // Drop the corresponding vector from the index. Fire-and-forget.
747
+ this._asyncRemoveFromIndex(agentId, params.id);
748
+
563
749
  return {
564
750
  success: true,
565
751
  action: 'delete',
@@ -659,6 +845,577 @@ BEST PRACTICES:
659
845
  };
660
846
  }
661
847
 
848
+ /**
849
+ * Execute SEMANTIC-SEARCH action — embeddings-backed retrieval over
850
+ * the agent's memory. Falls back to substring search when embeddings
851
+ * are disabled, so the action is always safe to call regardless of
852
+ * configuration. Hybrid mode (semantic + substring via RRF) is the
853
+ * default — preserves exact-match precision while adding paraphrase
854
+ * recall.
855
+ *
856
+ * Params: { query, topK?=10, hybrid?=true }
857
+ */
858
+ async _executeSemanticSearch(memoryService, agentId, params) {
859
+ const topK = Number.isInteger(params.topK) && params.topK > 0 ? params.topK : 10;
860
+ const hybrid = params.hybrid !== false;
861
+
862
+ const indexer = this._getMemoryIndexer();
863
+ if (!indexer || !indexer.isEnabled) {
864
+ // Graceful fallback: when the user hasn't enabled embeddings yet,
865
+ // return substring results so the action is still useful (and the
866
+ // agent doesn't need to branch on config).
867
+ const results = await memoryService.searchMemories(agentId, params.query);
868
+ return {
869
+ success: true,
870
+ action: 'semantic-search',
871
+ mode: 'substring-fallback',
872
+ query: params.query,
873
+ results,
874
+ message: results.length === 0
875
+ ? `Embeddings disabled; substring search found no matches for "${params.query}"`
876
+ : `Embeddings disabled; substring search found ${results.length} memories`,
877
+ };
878
+ }
879
+
880
+ const { hits, error } = await indexer.search(agentId, params.query, { topK, hybrid });
881
+
882
+ // Hydrate hits → full memory objects via memoryService.readMemory.
883
+ // The indexer returns vector-store metadata (title/text) which is a
884
+ // snapshot — fetching live ensures we surface the current content
885
+ // (in case it was updated since the last index sync).
886
+ const hydrated = [];
887
+ for (const h of hits) {
888
+ // eslint-disable-next-line no-await-in-loop
889
+ const mem = await memoryService.readMemory(agentId, h.id);
890
+ if (mem) hydrated.push({ ...mem, score: h.score });
891
+ else hydrated.push({ id: h.id, score: h.score, missing: true, ...h.metadata });
892
+ }
893
+
894
+ return {
895
+ success: !error,
896
+ action: 'semantic-search',
897
+ mode: hybrid ? 'hybrid' : 'semantic',
898
+ query: params.query,
899
+ topK,
900
+ results: hydrated,
901
+ ...(error ? { error } : {}),
902
+ message: error
903
+ ? `Semantic search failed: ${error}`
904
+ : hydrated.length === 0
905
+ ? `No memories matched "${params.query}"`
906
+ : `Found ${hydrated.length} memories ranked by similarity to "${params.query}"`,
907
+ };
908
+ }
909
+
910
+ /**
911
+ * Execute BACKFILL-EMBEDDINGS action — drop the agent's memory index
912
+ * and rebuild it from scratch. Use after enabling embeddings for the
913
+ * first time, after switching providers/models, or whenever the index
914
+ * is suspected stale. Idempotent.
915
+ */
916
+ async _executeBackfillEmbeddings(memoryService, agentId) {
917
+ const indexer = this._getMemoryIndexer();
918
+ if (!indexer || !indexer.isEnabled) {
919
+ return {
920
+ success: false,
921
+ action: 'backfill-embeddings',
922
+ message: 'Embeddings are not enabled — nothing to backfill. Enable a provider in Settings → Embeddings first.',
923
+ };
924
+ }
925
+
926
+ // Pull every memory for this agent. memoryService.listMemories at
927
+ // 'full' detail returns the full content blob per memory.
928
+ const listing = await memoryService.listMemories(agentId, 'full');
929
+ // listMemories returns { count, grouped }. The 'full' shape gives
930
+ // us per-bucket arrays of memory objects. Flatten + filter.
931
+ const memories = [];
932
+ for (const bucket of Object.values(listing.grouped || {})) {
933
+ for (const m of bucket || []) if (m?.id) memories.push(m);
934
+ }
935
+
936
+ const result = await indexer.backfill(agentId, memories);
937
+ return {
938
+ success: result.ok !== false,
939
+ action: 'backfill-embeddings',
940
+ indexed: result.indexed || 0,
941
+ skipped: result.skipped || 0,
942
+ failed: result.failed || 0,
943
+ ...(result.error ? { error: result.error } : {}),
944
+ message: result.ok === false
945
+ ? `Backfill failed: ${result.reason || result.error || 'unknown'}`
946
+ : `Re-indexed ${result.indexed || 0} memories for agent ${agentId}` +
947
+ (result.skipped ? ` (skipped ${result.skipped} with no text)` : '') +
948
+ (result.failed ? ` (failed ${result.failed})` : ''),
949
+ };
950
+ }
951
+
952
+ /**
953
+ * Execute FORGET-STALE action — delete memories older than `ageDays`.
954
+ *
955
+ * FadeMem-style soft pruning (arXiv 2601.18642): unbounded memory
956
+ * growth is the real long-term problem. The right answer is graceful
957
+ * decay of unused old memories so the index stays signal-rich.
958
+ *
959
+ * Defaults are conservative — `ageDays=90`, plan/* memories skipped.
960
+ * Pass `dryRun: true` to preview what would be removed. The cascade
961
+ * to the vector index is automatic (memoryService.deleteMemory fires
962
+ * the indexer's deleteOne via _asyncRemoveFromIndex).
963
+ *
964
+ * Params: { ageDays?=90, dryRun?=false, includePlans?=false }
965
+ * @private
966
+ */
967
+ async _executeForgetStale(memoryService, agentId, params) {
968
+ const ageDays = Number.isFinite(params.ageDays) && params.ageDays > 0 ? params.ageDays : 90;
969
+ const dryRun = !!params.dryRun;
970
+ const includePlans = !!params.includePlans;
971
+ const cutoffMs = Date.now() - ageDays * 24 * 60 * 60 * 1000;
972
+
973
+ // Walk the full memory list. Use 'descriptions' detail — enough to
974
+ // decide what's stale without pulling huge content blobs.
975
+ const listing = await memoryService.listMemories(agentId, 'full');
976
+ const candidates = [];
977
+ for (const bucket of Object.values(listing.grouped || {})) {
978
+ for (const m of bucket || []) {
979
+ if (!m?.id || !m?.createdAt) continue;
980
+ const createdMs = Date.parse(m.createdAt);
981
+ if (!Number.isFinite(createdMs) || createdMs > cutoffMs) continue;
982
+ // Skip plan/* memories unless explicitly included — they're the
983
+ // agent's active working plan, not stale notes.
984
+ if (!includePlans && isPlanTitle(m.title)) continue;
985
+ candidates.push({
986
+ id: m.id,
987
+ title: m.title,
988
+ createdAt: m.createdAt,
989
+ ageDays: Math.round((Date.now() - createdMs) / (24 * 60 * 60 * 1000)),
990
+ });
991
+ }
992
+ }
993
+
994
+ if (dryRun) {
995
+ return {
996
+ success: true,
997
+ action: 'forget-stale',
998
+ dryRun: true,
999
+ thresholdDays: ageDays,
1000
+ candidates,
1001
+ count: candidates.length,
1002
+ message: candidates.length === 0
1003
+ ? `No memories older than ${ageDays} days.`
1004
+ : `Would forget ${candidates.length} memories older than ${ageDays} days. Pass dryRun:false to apply.`,
1005
+ };
1006
+ }
1007
+
1008
+ let forgotten = 0;
1009
+ let failed = 0;
1010
+ for (const c of candidates) {
1011
+ try {
1012
+ const ok = await memoryService.deleteMemory(agentId, c.id);
1013
+ if (ok) forgotten++;
1014
+ else failed++;
1015
+ } catch (err) {
1016
+ this.logger?.warn?.('[memoryTool] forget-stale: delete failed', { id: c.id, error: err?.message });
1017
+ failed++;
1018
+ }
1019
+ }
1020
+
1021
+ return {
1022
+ success: failed === 0,
1023
+ action: 'forget-stale',
1024
+ thresholdDays: ageDays,
1025
+ forgotten,
1026
+ failed,
1027
+ message: forgotten === 0 && failed === 0
1028
+ ? `No memories older than ${ageDays} days.`
1029
+ : `Forgot ${forgotten} memories older than ${ageDays} days` +
1030
+ (failed ? `, ${failed} deletions failed` : '') + '.',
1031
+ };
1032
+ }
1033
+
1034
+ // ──────────────────────────────────────────────────────────────────
1035
+ // Phase 6c — Team-pool memory (the explicit publish channel)
1036
+ //
1037
+ // Answers the design Q1: per-agent memory stays private by default;
1038
+ // teams are an explicit, ACL-gated sharing surface. Lit-aligned with
1039
+ // arXiv 2505.18279 "Collaborative Memory" (dual-tier private + shared
1040
+ // with read/write policies). Pattern matches Mem0's multi-level
1041
+ // scoping (user_id / agent_id / app_id) — we use Loxia's existing
1042
+ // Teams primitive as the natural sharing boundary.
1043
+ //
1044
+ // ACL: agent must be a member of the team. Membership is read from
1045
+ // stateManager.getTeam(teamId).memberAgentIds — the authoritative
1046
+ // source. We refuse rather than warn so accidental cross-team leaks
1047
+ // are impossible. The check is encapsulated in `_assertTeamMember`.
1048
+ // ──────────────────────────────────────────────────────────────────
1049
+
1050
+ /**
1051
+ * Allow callers to inject a StateManager so ACL lookups can resolve
1052
+ * team membership. Mirrors the platformControl pattern. Without it,
1053
+ * team-scoped actions all fail with a clean error rather than
1054
+ * defaulting open.
1055
+ */
1056
+ setStateManager(stateManager) {
1057
+ this.stateManager = stateManager;
1058
+ this.logger?.info?.(`[memory] StateManager ${stateManager ? 'attached' : 'detached'}`);
1059
+ }
1060
+
1061
+ /**
1062
+ * Read-only ACL: throws an Error with a user-facing message if the
1063
+ * agent isn't a member of the team. Use inside team-scoped handlers
1064
+ * to gate writes and reads alike.
1065
+ * @private
1066
+ */
1067
+ async _assertTeamMember(agentId, teamId) {
1068
+ if (!this.stateManager?.getTeam) {
1069
+ throw new Error('Team-scoped memory actions require a StateManager. None is attached.');
1070
+ }
1071
+ const team = await this.stateManager.getTeam(teamId);
1072
+ if (!team) {
1073
+ throw new Error(`Team not found: ${teamId}`);
1074
+ }
1075
+ const members = Array.isArray(team.memberAgentIds) ? team.memberAgentIds : [];
1076
+ if (!members.includes(agentId)) {
1077
+ throw new Error(
1078
+ `Access denied: agent ${agentId} is not a member of team ${teamId}. ` +
1079
+ `Ask a team admin to add you via platformcontrol.add-team-member.`,
1080
+ );
1081
+ }
1082
+ return team;
1083
+ }
1084
+
1085
+ /**
1086
+ * Publish an existing per-agent memory to a team's shared pool. The
1087
+ * memory itself stays in the agent's own pool — `publish` copies its
1088
+ * content into the team's vector index with `publishedBy` metadata.
1089
+ *
1090
+ * Params: { id, teamId }
1091
+ * @private
1092
+ */
1093
+ async _executePublishToTeam(memoryService, agentId, params) {
1094
+ const indexer = this._getMemoryIndexer();
1095
+ if (!indexer || !indexer.isEnabled) {
1096
+ return {
1097
+ success: false,
1098
+ action: 'publish-to-team',
1099
+ message: 'Embeddings are not enabled. Team-pool memory requires a configured embedding provider — enable one in Settings → Embeddings first.',
1100
+ };
1101
+ }
1102
+
1103
+ let team;
1104
+ try { team = await this._assertTeamMember(agentId, params.teamId); }
1105
+ catch (err) {
1106
+ return { success: false, action: 'publish-to-team', error: err.message };
1107
+ }
1108
+
1109
+ const memory = await memoryService.readMemory(agentId, params.id);
1110
+ if (!memory) {
1111
+ return {
1112
+ success: false,
1113
+ action: 'publish-to-team',
1114
+ error: `Memory not found in your pool: ${params.id}. publish-to-team copies an existing personal memory into the team pool.`,
1115
+ };
1116
+ }
1117
+
1118
+ const result = await indexer.publishToTeam(params.teamId, memory, agentId);
1119
+ return {
1120
+ success: result.indexed === true,
1121
+ action: 'publish-to-team',
1122
+ teamId: params.teamId,
1123
+ teamName: team?.name || params.teamId,
1124
+ memoryId: memory.id,
1125
+ ...(result.error ? { error: result.error } : {}),
1126
+ message: result.indexed
1127
+ ? `Published "${memory.title}" to team "${team?.name || params.teamId}".`
1128
+ : `Publish failed: ${result.reason || result.error || 'unknown'}`,
1129
+ };
1130
+ }
1131
+
1132
+ /**
1133
+ * Semantic (or hybrid) search over a team's shared memory pool.
1134
+ * Requires team membership — otherwise no read.
1135
+ *
1136
+ * Params: { teamId, query, topK?=10, hybrid?=true }
1137
+ * @private
1138
+ */
1139
+ async _executeSearchTeam(agentId, params) {
1140
+ const indexer = this._getMemoryIndexer();
1141
+ if (!indexer || !indexer.isEnabled) {
1142
+ return {
1143
+ success: false,
1144
+ action: 'search-team',
1145
+ message: 'Embeddings are not enabled. Team-pool memory requires a configured embedding provider.',
1146
+ };
1147
+ }
1148
+
1149
+ let team;
1150
+ try { team = await this._assertTeamMember(agentId, params.teamId); }
1151
+ catch (err) {
1152
+ return { success: false, action: 'search-team', error: err.message };
1153
+ }
1154
+
1155
+ const topK = Number.isInteger(params.topK) && params.topK > 0 ? params.topK : 10;
1156
+ const hybrid = params.hybrid !== false;
1157
+ const { hits, error } = await indexer.searchTeam(params.teamId, params.query, { topK, hybrid });
1158
+ return {
1159
+ success: !error,
1160
+ action: 'search-team',
1161
+ teamId: params.teamId,
1162
+ teamName: team?.name || params.teamId,
1163
+ query: params.query,
1164
+ mode: hybrid ? 'hybrid' : 'semantic',
1165
+ topK,
1166
+ results: hits,
1167
+ ...(error ? { error } : {}),
1168
+ message: error
1169
+ ? `Team search failed: ${error}`
1170
+ : hits.length === 0
1171
+ ? `No memories matched "${params.query}" in team "${team?.name || params.teamId}".`
1172
+ : `Found ${hits.length} team memories ranked by similarity to "${params.query}".`,
1173
+ };
1174
+ }
1175
+
1176
+ /**
1177
+ * Remove a memory from a team pool. Any team member can unpublish
1178
+ * (no per-author restriction at this layer — keeps the ACL surface
1179
+ * simple; if richer policies are needed later, layer them here).
1180
+ *
1181
+ * Params: { teamId, id }
1182
+ * @private
1183
+ */
1184
+ async _executeUnpublishFromTeam(agentId, params) {
1185
+ const indexer = this._getMemoryIndexer();
1186
+ if (!indexer || !indexer.isEnabled) {
1187
+ return {
1188
+ success: false,
1189
+ action: 'unpublish-from-team',
1190
+ message: 'Embeddings are not enabled. Team-pool memory requires a configured embedding provider.',
1191
+ };
1192
+ }
1193
+
1194
+ let team;
1195
+ try { team = await this._assertTeamMember(agentId, params.teamId); }
1196
+ catch (err) {
1197
+ return { success: false, action: 'unpublish-from-team', error: err.message };
1198
+ }
1199
+
1200
+ const result = await indexer.unpublishFromTeam(params.teamId, params.id);
1201
+ return {
1202
+ success: result.deleted === true,
1203
+ action: 'unpublish-from-team',
1204
+ teamId: params.teamId,
1205
+ teamName: team?.name || params.teamId,
1206
+ memoryId: params.id,
1207
+ ...(result.error ? { error: result.error } : {}),
1208
+ message: result.deleted
1209
+ ? `Removed memory ${params.id} from team "${team?.name || params.teamId}".`
1210
+ : `Unpublish failed: ${result.reason || result.error || 'unknown'}`,
1211
+ };
1212
+ }
1213
+
1214
+ /**
1215
+ * Lazy accessor for the per-tool MemoryIndexer.
1216
+ *
1217
+ * Why lazy: the EmbeddingService is attached to aiService AFTER
1218
+ * tools are constructed. Pulling it on first use lets us avoid
1219
+ * construction-time ordering pain.
1220
+ *
1221
+ * Returns null when no embedding service is available (cloud-only
1222
+ * deploys without local provider, brand-new installs, etc.). Callers
1223
+ * MUST check `indexer.isEnabled` before relying on it — the indexer
1224
+ * is a thin shim that itself checks the service's enabled flag.
1225
+ *
1226
+ * @private
1227
+ * @returns {import('../services/embeddings/indexers/memoryIndexer.js').MemoryIndexer | null}
1228
+ */
1229
+ _getMemoryIndexer() {
1230
+ if (this._memoryIndexer) return this._memoryIndexer;
1231
+ const svc = this.aiService?.getEmbeddingService?.();
1232
+ if (!svc) return null;
1233
+ this._memoryIndexer = new MemoryIndexer({ embeddingService: svc, logger: this.logger });
1234
+ return this._memoryIndexer;
1235
+ }
1236
+
1237
+ /**
1238
+ * Fire-and-forget memory index update. Errors are logged inside the
1239
+ * indexer; we additionally swallow any thrown error here so a runtime
1240
+ * surprise (broken provider, full disk) NEVER affects the memory write.
1241
+ * @private
1242
+ */
1243
+ _asyncIndexMemory(agentId, memory) {
1244
+ const indexer = this._getMemoryIndexer();
1245
+ if (!indexer || !indexer.isEnabled) return;
1246
+ // Don't await — the result is consumed only via the indexer's own
1247
+ // log. We bury the promise with .catch() so Node doesn't crash on
1248
+ // unhandled rejection if something exotic blows up.
1249
+ indexer.indexOne(agentId, memory).catch(err => {
1250
+ this.logger?.warn?.('[memoryTool] async index failed', { agentId, id: memory?.id, error: err?.message });
1251
+ });
1252
+ }
1253
+
1254
+ /**
1255
+ * Fire-and-forget removal from the index after a delete.
1256
+ * @private
1257
+ */
1258
+ _asyncRemoveFromIndex(agentId, memoryId) {
1259
+ const indexer = this._getMemoryIndexer();
1260
+ if (!indexer || !indexer.isEnabled) return;
1261
+ indexer.deleteOne(agentId, memoryId).catch(err => {
1262
+ this.logger?.warn?.('[memoryTool] async deleteFromIndex failed', { agentId, id: memoryId, error: err?.message });
1263
+ });
1264
+ }
1265
+
1266
+ /**
1267
+ * Lazy accessor for the per-tool ReminisceIndexer. Same lifetime model
1268
+ * as `_getMemoryIndexer`: cached on the tool instance after first use.
1269
+ * Returns null when the embedding service isn't attached.
1270
+ *
1271
+ * @private
1272
+ * @returns {import('../services/embeddings/indexers/reminisceIndexer.js').ReminisceIndexer | null}
1273
+ */
1274
+ _getReminisceIndexer() {
1275
+ if (this._reminisceIndexer) return this._reminisceIndexer;
1276
+ const svc = this.aiService?.getEmbeddingService?.();
1277
+ if (!svc) return null;
1278
+ this._reminisceIndexer = new ReminisceIndexer({ embeddingService: svc, logger: this.logger });
1279
+ return this._reminisceIndexer;
1280
+ }
1281
+
1282
+ /**
1283
+ * Reminisce semantic-search handler. Routes through the
1284
+ * ReminisceIndexer; falls back to the existing substring-based
1285
+ * `reminisce.search` when embeddings aren't configured.
1286
+ *
1287
+ * Params: { query, topK?=10, hybrid?=true }
1288
+ * @private
1289
+ */
1290
+ async _executeReminisceSemanticSearch(agentId, params, context) {
1291
+ const query = typeof params.query === 'string' ? params.query.trim() : '';
1292
+ if (!query) {
1293
+ return {
1294
+ success: false,
1295
+ action: 'reminisce',
1296
+ mode: 'semantic-search',
1297
+ error: 'query is required for reminisce semantic-search',
1298
+ };
1299
+ }
1300
+ const topK = Number.isInteger(params.topK) && params.topK > 0 ? params.topK : 10;
1301
+ const hybrid = params.hybrid !== false;
1302
+
1303
+ const indexer = this._getReminisceIndexer();
1304
+ if (!indexer || !indexer.isEnabled) {
1305
+ // Graceful fallback to the existing substring path so the action
1306
+ // remains useful when embeddings are off. Mirrors memoryTool's
1307
+ // semantic-search fallback shape for consistency.
1308
+ const fb = await this._executeReminisce(agentId, { ...params, mode: 'search' }, context);
1309
+ return {
1310
+ ...fb,
1311
+ mode: 'semantic-search',
1312
+ modeUsed: 'substring-fallback',
1313
+ message: 'Embeddings disabled; returned substring search results instead.',
1314
+ };
1315
+ }
1316
+
1317
+ // Run the vector search.
1318
+ const { hits, error } = await indexer.search(agentId, query, { topK, hybrid });
1319
+
1320
+ // Hydrate scored messageIds back to full messages from the archive,
1321
+ // so the agent sees `role`, `content`, `createdAt`, etc. — the same
1322
+ // shape it gets from `reminisce.search`.
1323
+ const agentPool = context?.agentPool;
1324
+ let messages = null;
1325
+ if (agentPool?.getAgent) {
1326
+ const agent = await agentPool.getAgent(agentId);
1327
+ messages = Array.isArray(agent?.conversations?.full?.messages) ? agent.conversations.full.messages : null;
1328
+ }
1329
+ const byId = new Map((messages || []).map(m => [m?.id, m]));
1330
+ const hydrated = hits.map(h => {
1331
+ const m = byId.get(h.messageId);
1332
+ const base = {
1333
+ messageId: h.messageId,
1334
+ score: h.score,
1335
+ chunkIndex: h.chunkIndex,
1336
+ // Default to the index-snapshot text when the live message has
1337
+ // gone missing (rare — only if archive was pruned).
1338
+ snippet: h.chunkText,
1339
+ };
1340
+ if (!m) return { ...base, missing: true };
1341
+ return {
1342
+ ...base,
1343
+ role: m.role || 'unknown',
1344
+ at: m.createdAt || m.timestamp || null,
1345
+ content: typeof m.content === 'string' ? m.content : '',
1346
+ };
1347
+ });
1348
+
1349
+ return {
1350
+ success: !error,
1351
+ action: 'reminisce',
1352
+ mode: 'semantic-search',
1353
+ modeUsed: hybrid ? 'hybrid' : 'semantic',
1354
+ query,
1355
+ topK,
1356
+ result: {
1357
+ hits: hydrated,
1358
+ ...(error ? { error } : {}),
1359
+ },
1360
+ message: error
1361
+ ? `Reminisce semantic search failed: ${error}`
1362
+ : hydrated.length === 0
1363
+ ? `No archived messages matched "${query}"`
1364
+ : `Found ${hydrated.length} archived messages ranked by similarity to "${query}"`,
1365
+ };
1366
+ }
1367
+
1368
+ /**
1369
+ * Drop the agent's reminisce index and rebuild from the full
1370
+ * conversation archive. Use after first enabling embeddings, or after
1371
+ * switching provider/model. Idempotent.
1372
+ *
1373
+ * NOTE: this is the canonical entry point for keeping reminisce
1374
+ * semantic-search current today. Auto-indexing on new archive writes
1375
+ * is a planned follow-up; until then, re-run this periodically (or
1376
+ * via a scheduled task) to pick up the latest messages.
1377
+ *
1378
+ * @private
1379
+ */
1380
+ async _executeReminisceBackfill(agentId, context) {
1381
+ const indexer = this._getReminisceIndexer();
1382
+ if (!indexer || !indexer.isEnabled) {
1383
+ return {
1384
+ success: false,
1385
+ action: 'reminisce-backfill-embeddings',
1386
+ message: 'Embeddings are not enabled — nothing to backfill. Enable a provider in Settings → Embeddings first.',
1387
+ };
1388
+ }
1389
+
1390
+ const agentPool = context?.agentPool;
1391
+ if (!agentPool?.getAgent) {
1392
+ return {
1393
+ success: false,
1394
+ action: 'reminisce-backfill-embeddings',
1395
+ error: 'agentPool is not available on the tool context; cannot read conversation archive',
1396
+ };
1397
+ }
1398
+ const agent = await agentPool.getAgent(agentId);
1399
+ const messages = Array.isArray(agent?.conversations?.full?.messages) ? agent.conversations.full.messages : [];
1400
+
1401
+ const result = await indexer.backfill(agentId, messages);
1402
+ return {
1403
+ success: result.ok !== false && !result.error,
1404
+ action: 'reminisce-backfill-embeddings',
1405
+ indexedMessages: result.indexedMessages || 0,
1406
+ indexedChunks: result.indexedChunks || 0,
1407
+ skipped: result.skipped || 0,
1408
+ failed: result.failed || 0,
1409
+ ...(result.error ? { error: result.error } : {}),
1410
+ message: result.ok === false
1411
+ ? `Reminisce backfill failed: ${result.reason || result.error || 'unknown'}`
1412
+ : `Re-indexed ${result.indexedMessages || 0} messages` +
1413
+ (result.indexedChunks ? ` (${result.indexedChunks} chunks)` : '') +
1414
+ (result.skipped ? `, skipped ${result.skipped}` : '') +
1415
+ (result.failed ? `, failed ${result.failed}` : ''),
1416
+ };
1417
+ }
1418
+
662
1419
  /**
663
1420
  * Execute STATS action
664
1421
  */
@@ -696,7 +1453,7 @@ BEST PRACTICES:
696
1453
  */
697
1454
  async _executeReminisce(agentId, params, context) {
698
1455
  const mode = typeof params.mode === 'string' ? params.mode : '';
699
- const validModes = ['overview', 'range', 'search', 'around', 'byTool', 'read'];
1456
+ const validModes = ['overview', 'range', 'search', 'semantic-search', 'around', 'byTool', 'read'];
700
1457
  if (!validModes.includes(mode)) {
701
1458
  return {
702
1459
  success: false,
@@ -705,6 +1462,14 @@ BEST PRACTICES:
705
1462
  };
706
1463
  }
707
1464
 
1465
+ // Semantic-search has a different shape than the other modes — it
1466
+ // routes through the ReminisceIndexer (vector store) rather than the
1467
+ // conversation-query helpers. Falls back to substring `search` when
1468
+ // embeddings are disabled so the action is always callable.
1469
+ if (mode === 'semantic-search') {
1470
+ return await this._executeReminisceSemanticSearch(agentId, params, context);
1471
+ }
1472
+
708
1473
  const agentPool = context?.agentPool;
709
1474
  if (!agentPool?.getAgent) {
710
1475
  return {