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.
- package/bin/cli.js +27 -1
- package/bin/composio-cli.js +431 -0
- package/package.json +1 -1
- package/scripts/build-onboarding-doc.cjs +805 -0
- package/scripts/composio-bench/README.md +151 -0
- package/scripts/memory-bench/bench.mjs +576 -0
- package/scripts/memory-bench/live-after-2026-05-21T16-20-52-767Z.json +150 -0
- package/scripts/memory-bench/live-after-2026-05-21T16-37-17-147Z.json +795 -0
- package/scripts/memory-bench/live-after-final-2026-05-21T17-16-02-947Z.json +766 -0
- package/scripts/memory-bench/live-after-v2-2026-05-21T16-52-26-833Z.json +890 -0
- package/scripts/memory-bench/live-after-v3-2026-05-21T17-05-40-622Z.json +955 -0
- package/scripts/memory-bench/live-probe-v2.mjs +412 -0
- package/scripts/memory-bench/live-probe.mjs +387 -0
- package/scripts/memory-bench/live-smoke-2026-05-21T16-22-35-945Z.json +36 -0
- package/scripts/memory-bench/live-smoke2-2026-05-21T16-24-14-095Z.json +36 -0
- package/scripts/memory-bench/live-smoke3-2026-05-21T16-26-54-093Z.json +123 -0
- package/scripts/memory-bench/live-v2-baseline-2026-05-23T22-43-20-757Z.json +628 -0
- package/scripts/memory-bench/live-v2-directive-2026-05-23T21-32-41-369Z.json +628 -0
- package/scripts/memory-bench/live-v2-smoke-2026-05-23T20-06-37-325Z.json +34 -0
- package/scripts/memory-bench/live-v2-smoke-2026-05-23T20-12-48-199Z.json +38 -0
- package/scripts/memory-bench/results-baseline-2026-05-19T11-23-12-245Z.json +39 -0
- package/scripts/memory-bench/results-baseline-2026-05-19T11-30-28-763Z.json +1024 -0
- package/scripts/memory-bench/results-baseline-2026-05-19T11-34-19-299Z.json +1007 -0
- package/scripts/memory-bench/results-baseline-2026-05-19T11-44-18-054Z.json +1432 -0
- package/scripts/memory-bench/results-nudge-combined-2026-05-19T12-00-37-465Z.json +1413 -0
- package/scripts/memory-bench/results-nudge-directive-2026-05-19T11-36-52-963Z.json +210 -0
- package/scripts/memory-bench/results-nudge-directive-2026-05-19T11-49-55-790Z.json +1464 -0
- package/scripts/memory-bench/results-nudge-echo-catalog-2026-05-19T11-39-01-829Z.json +232 -0
- package/scripts/memory-bench/results-nudge-echo-catalog-2026-05-19T11-55-12-705Z.json +1397 -0
- package/scripts/memory-bench/scenarios-v2.mjs +123 -0
- package/scripts/memory-bench/scenarios.mjs +178 -0
- package/scripts/office-bench/generate-samples.mjs +180 -0
- package/scripts/op-posture-bench/bench.mjs +397 -0
- package/scripts/op-posture-bench/probe.mjs +87 -0
- package/scripts/op-posture-bench/results-2026-05-18T20-29-13-941Z.json +57 -0
- package/scripts/op-posture-bench/results-2026-05-18T20-38-36-400Z.json +3071 -0
- package/scripts/op-posture-bench/scenarios.mjs +60 -0
- package/scripts/op-posture-bench/variants.mjs +68 -0
- package/scripts/stub-bench/bench.mjs +439 -0
- package/scripts/stub-bench/fixture/auth.js +41 -0
- package/scripts/stub-bench/results-2026-05-19T10-33-27-045Z.json +99 -0
- package/scripts/stub-bench/results-2026-05-19T10-35-08-240Z.json +920 -0
- package/scripts/stub-bench/results-2026-05-19T10-40-12-166Z.json +463 -0
- package/scripts/verify/azure-custom-embeddings.mjs +152 -0
- package/scripts/verify/azure-embeddings.mjs +146 -0
- package/scripts/verify/composio-toolkits.mjs +453 -0
- package/scripts/verify/local-embeddings.mjs +171 -0
- package/scripts/verify/openai-embeddings.mjs +140 -0
- package/src/__tests__/composioCliFlags.test.js +239 -0
- package/src/core/__tests__/agentScheduler.autoRecall.test.js +215 -0
- package/src/core/__tests__/agentScheduler.codebaseKnowledge.test.js +65 -0
- package/src/core/__tests__/agentScheduler.errorCategorisation.test.js +169 -0
- package/src/core/__tests__/agentScheduler.memoryInjection.test.js +78 -0
- package/src/core/agentPool.js +10 -0
- package/src/core/agentScheduler.js +273 -36
- package/src/index.js +82 -4
- package/src/interfaces/__tests__/bulkAgentRoute.test.js +290 -0
- package/src/interfaces/__tests__/composioRoutes.test.js +318 -0
- package/src/interfaces/webServer.js +436 -2
- package/src/interfaces/webServer.js.bak +7047 -0
- package/src/services/__tests__/aiService.core.test.js +420 -0
- package/src/services/__tests__/aiService.embed.test.js +172 -0
- package/src/services/__tests__/apiKeyManager.getEmbeddingApiKey.test.js +86 -0
- package/src/services/__tests__/codeMapStubRenderer.test.js +207 -0
- package/src/services/__tests__/codebaseKnowledgeService.test.js +427 -0
- package/src/services/__tests__/composioService.test.js +714 -0
- package/src/services/__tests__/memoryService.appendAndCatalog.test.js +139 -0
- package/src/services/__tests__/telegramService.test.js +91 -0
- package/src/services/aiService.js +137 -0
- package/src/services/apiKeyManager.js +61 -0
- package/src/services/codeMapStubRenderer.js +142 -0
- package/src/services/codebaseKnowledgeService.js +430 -0
- package/src/services/composioService.js +729 -0
- package/src/services/embeddings/__tests__/autoRecall.test.js +237 -0
- package/src/services/embeddings/__tests__/azureCustomProvider.test.js +232 -0
- package/src/services/embeddings/__tests__/cloudProviders.test.js +339 -0
- package/src/services/embeddings/__tests__/embeddingService.test.js +417 -0
- package/src/services/embeddings/__tests__/embeddingsConfig.test.js +182 -0
- package/src/services/embeddings/__tests__/inMemoryJsonStore.test.js +207 -0
- package/src/services/embeddings/__tests__/localProvider.test.js +263 -0
- package/src/services/embeddings/__tests__/providerInterface.test.js +209 -0
- package/src/services/embeddings/autoRecall.js +219 -0
- package/src/services/embeddings/embeddingService.js +452 -0
- package/src/services/embeddings/embeddingsConfig.js +203 -0
- package/src/services/embeddings/indexers/__tests__/agentIndexer.test.js +232 -0
- package/src/services/embeddings/indexers/__tests__/composioIndexer.test.js +265 -0
- package/src/services/embeddings/indexers/__tests__/memoryIndexer.test.js +418 -0
- package/src/services/embeddings/indexers/__tests__/reminisceIndexer.test.js +357 -0
- package/src/services/embeddings/indexers/__tests__/skillsIndexer.test.js +145 -0
- package/src/services/embeddings/indexers/__tests__/taskIndexer.test.js +146 -0
- package/src/services/embeddings/indexers/agentIndexer.js +249 -0
- package/src/services/embeddings/indexers/composioIndexer.js +279 -0
- package/src/services/embeddings/indexers/memoryIndexer.js +358 -0
- package/src/services/embeddings/indexers/reminisceIndexer.js +370 -0
- package/src/services/embeddings/indexers/skillsIndexer.js +154 -0
- package/src/services/embeddings/indexers/taskIndexer.js +155 -0
- package/src/services/embeddings/providerInterface.js +206 -0
- package/src/services/embeddings/providers/azureCustomProvider.js +154 -0
- package/src/services/embeddings/providers/azureProvider.js +122 -0
- package/src/services/embeddings/providers/cloudHttpTransport.js +205 -0
- package/src/services/embeddings/providers/localProvider.js +287 -0
- package/src/services/embeddings/providers/openaiProvider.js +101 -0
- package/src/services/embeddings/utilities/__tests__/textChunker.test.js +217 -0
- package/src/services/embeddings/utilities/textChunker.js +290 -0
- package/src/services/embeddings/vectorStore/__tests__/scoring.test.js +189 -0
- package/src/services/embeddings/vectorStore/inMemoryJsonStore.js +356 -0
- package/src/services/embeddings/vectorStore/scoring.js +128 -0
- package/src/services/embeddings/vectorStore/storeContractTests.js +179 -0
- package/src/services/embeddings/vectorStore/storeInterface.js +91 -0
- package/src/services/memoryService.js +98 -0
- package/src/services/telegramService.js +140 -1
- package/src/tools/__tests__/agentCommunicationTool.findAgent.test.js +226 -0
- package/src/tools/__tests__/agentCommunicationTool.test.js +17 -2
- package/src/tools/__tests__/baseTool.test.js +76 -10
- package/src/tools/__tests__/cloneDetectionTool.test.js +430 -0
- package/src/tools/__tests__/codeMapTool.pluralCanonical.test.js +83 -0
- package/src/tools/__tests__/composioTool.findAction.test.js +448 -0
- package/src/tools/__tests__/composioTool.test.js +499 -0
- package/src/tools/__tests__/dependencyResolverTool.test.js +567 -0
- package/src/tools/__tests__/docxTool.test.js +449 -0
- package/src/tools/__tests__/excelTool.test.js +486 -0
- package/src/tools/__tests__/importAnalyzerTool.test.js +368 -0
- package/src/tools/__tests__/memoryTool.forgetStale.test.js +272 -0
- package/src/tools/__tests__/memoryTool.pluralCanonical.test.js +189 -0
- package/src/tools/__tests__/memoryTool.reminisceSemanticSearch.test.js +301 -0
- package/src/tools/__tests__/memoryTool.semanticSearch.test.js +405 -0
- package/src/tools/__tests__/memoryTool.teamPool.test.js +293 -0
- package/src/tools/__tests__/memoryTool.test.js +1 -1
- package/src/tools/__tests__/officeTool.test.js +403 -0
- package/src/tools/__tests__/openaiFunctionSchemas.memoryReminisce.test.js +24 -25
- package/src/tools/__tests__/openaiFunctionSchemas.validity.test.js +268 -0
- package/src/tools/__tests__/pdfTool.test.js +457 -0
- package/src/tools/__tests__/singularToolReverseForgive.test.js +97 -0
- package/src/tools/__tests__/skillsTool.search.test.js +164 -0
- package/src/tools/__tests__/taskManagerTool.discipline.test.js +137 -0
- package/src/tools/__tests__/taskManagerTool.search.test.js +143 -0
- package/src/tools/__tests__/taskManagerTool.transition.test.js +236 -0
- package/src/tools/__tests__/toolShapeForgiveness.test.js +260 -0
- package/src/tools/agentCommunicationTool.js +120 -5
- package/src/tools/baseTool.js +28 -1
- package/src/tools/codeMapTool.js +1673 -1521
- package/src/tools/composioTool.js +617 -0
- package/src/tools/fileContentReplaceTool.js +893 -840
- package/src/tools/fileSystemTool.js +1372 -1314
- package/src/tools/fileTreeTool.js +7 -0
- package/src/tools/memoryTool.js +847 -82
- package/src/tools/office/officeDoc.js +425 -0
- package/src/tools/office/officePres.js +360 -0
- package/src/tools/office/officeSheet.js +350 -0
- package/src/tools/officeTool.js +313 -0
- package/src/tools/openaiFunctionSchemas.js +824 -44
- package/src/tools/platformControlTool.js +5 -0
- package/src/tools/seekTool.js +36 -1
- package/src/tools/skillsTool.js +133 -0
- package/src/tools/taskManagerTool.js +264 -16
- package/src/tools/terminalTool.js +23 -1
- package/src/tools/visionTool.js +7 -0
- package/src/tools/visualEditorTool.js +7 -0
- package/src/tools/webTool.js +28 -1
- package/src/tools/whatsappTool.js +7 -0
- package/src/utilities/authCache.js +47 -6
- package/src/utilities/authCache.js.backup-1779570472481 +121 -0
- package/src/utilities/toolConstants.js +3 -1
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-CTztA3Xo.js +1 -0
- package/web-ui/build/static/abap-BsUhLmBp.js +1 -0
- package/web-ui/build/static/abnf-CGKV2y5s.js +1 -0
- package/web-ui/build/static/abnf-vQPGuzu_.js +1 -0
- package/web-ui/build/static/accesslog-mUZocN9d.js +1 -0
- package/web-ui/build/static/actionscript-BmCHyr7v.js +1 -0
- package/web-ui/build/static/actionscript-Cc5vZvFE.js +1 -0
- package/web-ui/build/static/ada-BHR9NMNv.js +1 -0
- package/web-ui/build/static/ada-DnxQs2b9.js +1 -0
- package/web-ui/build/static/agda-CHEWVCEZ.js +1 -0
- package/web-ui/build/static/al-C0otNZjc.js +1 -0
- package/web-ui/build/static/angelscript-Co5e7ZdR.js +1 -0
- package/web-ui/build/static/antlr4-Dkky4AXR.js +1 -0
- package/web-ui/build/static/apache-BJkYIuV-.js +1 -0
- package/web-ui/build/static/apacheconf-XLif_lM5.js +1 -0
- package/web-ui/build/static/apex-DiKnugSK.js +1 -0
- package/web-ui/build/static/apl-R5OItFx8.js +1 -0
- package/web-ui/build/static/applescript-D8uiCoXI.js +1 -0
- package/web-ui/build/static/applescript-e5KOVzz4.js +1 -0
- package/web-ui/build/static/aql-Cvy5hwR1.js +1 -0
- package/web-ui/build/static/arcade-0iAjFk8w.js +1 -0
- package/web-ui/build/static/arduino-BJeuGqAT.js +1 -0
- package/web-ui/build/static/arduino-QJJjnM1j.js +1 -0
- package/web-ui/build/static/arff-C-i_E_-B.js +1 -0
- package/web-ui/build/static/armasm-ukFQKHGn.js +1 -0
- package/web-ui/build/static/asciidoc-B49qqHJJ.js +1 -0
- package/web-ui/build/static/asciidoc-Nkm1Ylrd.js +1 -0
- package/web-ui/build/static/asm6502-CMiM3nZs.js +1 -0
- package/web-ui/build/static/asmatmel-DG9XzIBf.js +1 -0
- package/web-ui/build/static/aspectj-DjRutrRk.js +1 -0
- package/web-ui/build/static/aspnet-DCNVRVi9.js +1 -0
- package/web-ui/build/static/autohotkey-C7eyvps0.js +1 -0
- package/web-ui/build/static/autohotkey-CiaZi-WO.js +1 -0
- package/web-ui/build/static/autoit-CaKUQkux.js +1 -0
- package/web-ui/build/static/autoit-D-CUHQgt.js +1 -0
- package/web-ui/build/static/avisynth-DFP3h4zu.js +1 -0
- package/web-ui/build/static/avrasm-BqvUj3fg.js +1 -0
- package/web-ui/build/static/avro-idl-D3l0ptuQ.js +1 -0
- package/web-ui/build/static/awk-BmDxAZFj.js +1 -0
- package/web-ui/build/static/axapta-B424jrgT.js +1 -0
- package/web-ui/build/static/bash-CgAffr8Z.js +1 -0
- package/web-ui/build/static/bash-D41aILLG.js +1 -0
- package/web-ui/build/static/basic-5DFTo35K.js +1 -0
- package/web-ui/build/static/basic-BONYG7D2.js +1 -0
- package/web-ui/build/static/batch-BnaDGMwS.js +1 -0
- package/web-ui/build/static/bbcode-Daujj4hU.js +1 -0
- package/web-ui/build/static/bicep-CXidcIK5.js +1 -0
- package/web-ui/build/static/birb-CcOzsnqB.js +1 -0
- package/web-ui/build/static/bison-rq0w5JFF.js +1 -0
- package/web-ui/build/static/bnf-C4uK1dK8.js +1 -0
- package/web-ui/build/static/bnf-CvXZ9crt.js +1 -0
- package/web-ui/build/static/brainfuck-B5Ezdg2y.js +1 -0
- package/web-ui/build/static/brainfuck-BZaTfZ97.js +1 -0
- package/web-ui/build/static/brightscript-D_2WBVxt.js +1 -0
- package/web-ui/build/static/bro-BD7GT6j_.js +1 -0
- package/web-ui/build/static/bsl-Bh-qcQ3w.js +1 -0
- package/web-ui/build/static/c-DNmZz1iT.js +1 -0
- package/web-ui/build/static/c-dUrSOcB2.js +1 -0
- package/web-ui/build/static/c-like-DfzKY8Uu.js +1 -0
- package/web-ui/build/static/cal-DgrFs4te.js +1 -0
- package/web-ui/build/static/capnproto-BxFR2k8w.js +1 -0
- package/web-ui/build/static/ceylon-B2Q7BIPM.js +1 -0
- package/web-ui/build/static/cfscript-DeaR8rww.js +1 -0
- package/web-ui/build/static/chaiscript-BeBIoz6b.js +1 -0
- package/web-ui/build/static/cil-YHiHOb4c.js +1 -0
- package/web-ui/build/static/clean-BgOl_0cN.js +1 -0
- package/web-ui/build/static/clojure-BlgOza7C.js +1 -0
- package/web-ui/build/static/clojure-PlKRYx3q.js +1 -0
- package/web-ui/build/static/clojure-repl-Dv2_THNB.js +1 -0
- package/web-ui/build/static/cmake-Ccf43gsy.js +1 -0
- package/web-ui/build/static/cmake-Dah_b5tK.js +1 -0
- package/web-ui/build/static/cobol-o9YRDzXA.js +1 -0
- package/web-ui/build/static/coffeescript-DTYLvxG9.js +1 -0
- package/web-ui/build/static/coffeescript-Dm4UcexP.js +1 -0
- package/web-ui/build/static/concurnas-1OxY7nFV.js +1 -0
- package/web-ui/build/static/coq-CvJBSoWT.js +1 -0
- package/web-ui/build/static/coq-DPZunybQ.js +1 -0
- package/web-ui/build/static/cos-BBstQgB4.js +1 -0
- package/web-ui/build/static/cpp-BR1pa5Wr.js +1 -0
- package/web-ui/build/static/cpp-C-_tTuKh.js +1 -0
- package/web-ui/build/static/crmsh-BIme7ihG.js +1 -0
- package/web-ui/build/static/crystal-C2hlJxaB.js +1 -0
- package/web-ui/build/static/crystal-Ca6D0fV7.js +1 -0
- package/web-ui/build/static/csharp-DGvdwvDH.js +1 -0
- package/web-ui/build/static/csharp-DbAjVltn.js +1 -0
- package/web-ui/build/static/cshtml-DVC84JPa.js +1 -0
- package/web-ui/build/static/csp-BawtG83z.js +1 -0
- package/web-ui/build/static/csp-BlaoxdTK.js +1 -0
- package/web-ui/build/static/css-52oqss7r.js +1 -0
- package/web-ui/build/static/css-extras-BoTVw2IW.js +1 -0
- package/web-ui/build/static/csv-nXBSv5kK.js +1 -0
- package/web-ui/build/static/cypher-WuesoPm2.js +1 -0
- package/web-ui/build/static/d-BmmTjwiV.js +1 -0
- package/web-ui/build/static/d-BwHf5A8R.js +1 -0
- package/web-ui/build/static/dart-BVZTRb8b.js +1 -0
- package/web-ui/build/static/dart-CbWzIBpX.js +1 -0
- package/web-ui/build/static/dataweave-qi_fpjJR.js +1 -0
- package/web-ui/build/static/dax-BpP02TD3.js +1 -0
- package/web-ui/build/static/delphi-TK0E0gLN.js +1 -0
- package/web-ui/build/static/dhall-jyNJwUbo.js +1 -0
- package/web-ui/build/static/diff-Dbu90HZq.js +1 -0
- package/web-ui/build/static/diff-Df6ezhAq.js +1 -0
- package/web-ui/build/static/django-BDy-xiWR.js +1 -0
- package/web-ui/build/static/django-CbmnWIX9.js +1 -0
- package/web-ui/build/static/dns-D_wmKRHl.js +1 -0
- package/web-ui/build/static/dns-zone-file-_1osc1Qk.js +1 -0
- package/web-ui/build/static/docker-D62hlkjX.js +1 -0
- package/web-ui/build/static/dockerfile-DQ080zHh.js +1 -0
- package/web-ui/build/static/dos-B5mA8Wna.js +1 -0
- package/web-ui/build/static/dot-D497WUfu.js +1 -0
- package/web-ui/build/static/dsconfig-dERMCQVk.js +1 -0
- package/web-ui/build/static/dts-DC3ujcbX.js +1 -0
- package/web-ui/build/static/dust-Bhm1VBQg.js +1 -0
- package/web-ui/build/static/ebnf-1lmwK0bv.js +1 -0
- package/web-ui/build/static/ebnf-qzzqKVXL.js +1 -0
- package/web-ui/build/static/editorconfig-CCe25wQr.js +1 -0
- package/web-ui/build/static/eiffel-BFOXbwEN.js +1 -0
- package/web-ui/build/static/ejs-D94vVkGZ.js +1 -0
- package/web-ui/build/static/elixir-B2W81YV0.js +1 -0
- package/web-ui/build/static/elixir-CD1szlP_.js +1 -0
- package/web-ui/build/static/elm-BUJhR-kM.js +1 -0
- package/web-ui/build/static/elm-DwLnLHSK.js +1 -0
- package/web-ui/build/static/erb-CcokD9Fu.js +1 -0
- package/web-ui/build/static/erb-lzhmSBEV.js +1 -0
- package/web-ui/build/static/erlang-C0jnu48-.js +1 -0
- package/web-ui/build/static/erlang-CrevXBnJ.js +1 -0
- package/web-ui/build/static/erlang-repl-CNY6yNoO.js +1 -0
- package/web-ui/build/static/etlua-BMO_ICdR.js +1 -0
- package/web-ui/build/static/excel-C5PbLrVC.js +1 -0
- package/web-ui/build/static/excel-formula-CX4pOnnV.js +1 -0
- package/web-ui/build/static/factor-bW3WUpa0.js +1 -0
- package/web-ui/build/static/false-CQx6Crbr.js +1 -0
- package/web-ui/build/static/firestore-security-rules-DT5oRNdf.js +1 -0
- package/web-ui/build/static/fix-C4IWe2LI.js +1 -0
- package/web-ui/build/static/flix-hi9-cLwA.js +1 -0
- package/web-ui/build/static/flow-CkX6DAhF.js +1 -0
- package/web-ui/build/static/fortran-C4rIX-2n.js +1 -0
- package/web-ui/build/static/fortran-Dvu3q_x_.js +1 -0
- package/web-ui/build/static/fsharp-Bwa1UrRI.js +1 -0
- package/web-ui/build/static/fsharp-CvadhLcA.js +1 -0
- package/web-ui/build/static/ftl-eFEI11YV.js +1 -0
- package/web-ui/build/static/gams-BxGx7deQ.js +1 -0
- package/web-ui/build/static/gap-Dcv7bqDd.js +1 -0
- package/web-ui/build/static/gauss-CcVoF4l8.js +1 -0
- package/web-ui/build/static/gcode-B1dc5sh5.js +1 -0
- package/web-ui/build/static/gcode-D5OxRG5t.js +1 -0
- package/web-ui/build/static/gdscript-CL-EA1wk.js +1 -0
- package/web-ui/build/static/gedcom-BbXrNsr0.js +1 -0
- package/web-ui/build/static/gherkin-B2wQMbT2.js +1 -0
- package/web-ui/build/static/gherkin-CnL4Y3j1.js +1 -0
- package/web-ui/build/static/git-DpdutSM5.js +1 -0
- package/web-ui/build/static/glsl-C7sgdZCA.js +1 -0
- package/web-ui/build/static/glsl-DVaNsn1Z.js +1 -0
- package/web-ui/build/static/gml-B_NppoA4.js +1 -0
- package/web-ui/build/static/gml-DFrn75UD.js +1 -0
- package/web-ui/build/static/gn-BhTU_aTW.js +1 -0
- package/web-ui/build/static/go-DKrUPrfb.js +1 -0
- package/web-ui/build/static/go-DLAYIsJl.js +1 -0
- package/web-ui/build/static/go-module-BXY6q1Ug.js +1 -0
- package/web-ui/build/static/golo-CKxjLRpC.js +1 -0
- package/web-ui/build/static/gradle-DN8lsmJj.js +1 -0
- package/web-ui/build/static/graphql-CMb_4vdm.js +1 -0
- package/web-ui/build/static/groovy-Bhi1VPv7.js +1 -0
- package/web-ui/build/static/groovy-D3X3r3EX.js +1 -0
- package/web-ui/build/static/haml-CvOCw9lL.js +1 -0
- package/web-ui/build/static/haml-DYs0wBJO.js +1 -0
- package/web-ui/build/static/handlebars-CLnuKGPm.js +1 -0
- package/web-ui/build/static/handlebars-CYGG_M1h.js +1 -0
- package/web-ui/build/static/haskell-0Ju0XclD.js +1 -0
- package/web-ui/build/static/haskell-CL5jUHSd.js +1 -0
- package/web-ui/build/static/haxe-BghRbBtK.js +1 -0
- package/web-ui/build/static/haxe-dfL7GzPv.js +1 -0
- package/web-ui/build/static/hcl-BZP2QME-.js +1 -0
- package/web-ui/build/static/hlsl-Djp0TiCX.js +1 -0
- package/web-ui/build/static/hoon-Df5gJVqA.js +1 -0
- package/web-ui/build/static/hpkp-Cy-hjB4V.js +1 -0
- package/web-ui/build/static/hsp-CntMIMs4.js +1 -0
- package/web-ui/build/static/hsts-BNBhETNx.js +1 -0
- package/web-ui/build/static/htmlbars-VCCYaDHA.js +1 -0
- package/web-ui/build/static/http-7DbskohZ.js +1 -0
- package/web-ui/build/static/http-BT5FYFAK.js +1 -0
- package/web-ui/build/static/hy-DuGSaK_b.js +1 -0
- package/web-ui/build/static/ichigojam-CjvnJmlr.js +1 -0
- package/web-ui/build/static/icon-BsBz6XP6.js +1 -0
- package/web-ui/build/static/icu-message-format-BEpv_nip.js +1 -0
- package/web-ui/build/static/idris-DiXQdMPU.js +1 -0
- package/web-ui/build/static/iecst-C9tYEzwP.js +1 -0
- package/web-ui/build/static/ignore-DNMpCRPN.js +1 -0
- package/web-ui/build/static/index-B-r71gxO.js +1 -0
- package/web-ui/build/static/index-CTtNXVAZ.js +1217 -0
- package/web-ui/build/static/index-DkBBEGYj.css +1 -0
- package/web-ui/build/static/index-PvzceRzr.js +13 -0
- package/web-ui/build/static/inform7-D38mj1Ty.js +1 -0
- package/web-ui/build/static/inform7-SwIRbrNQ.js +1 -0
- package/web-ui/build/static/ini-B9xO6J_m.js +1 -0
- package/web-ui/build/static/ini-zcp_esam.js +1 -0
- package/web-ui/build/static/io-C-Ay4jvg.js +1 -0
- package/web-ui/build/static/irpf90-BYnkitLq.js +1 -0
- package/web-ui/build/static/isbl-BYtdwd6v.js +1 -0
- package/web-ui/build/static/j-ByZQN5E4.js +1 -0
- package/web-ui/build/static/java-BNtb6JWL.js +1 -0
- package/web-ui/build/static/java-CQZL3scW.js +1 -0
- package/web-ui/build/static/javadoc-BciMZ8jg.js +1 -0
- package/web-ui/build/static/javadoclike-07BOTXmy.js +1 -0
- package/web-ui/build/static/javascript-CViZlg1q.js +1 -0
- package/web-ui/build/static/javastacktrace-bWyAK0up.js +1 -0
- package/web-ui/build/static/jboss-cli-hz5boSGB.js +1 -0
- package/web-ui/build/static/jexl-DdIINSXT.js +1 -0
- package/web-ui/build/static/jolie-CQnDX-f0.js +1 -0
- package/web-ui/build/static/jq-BzhF0CHG.js +1 -0
- package/web-ui/build/static/js-extras-jizEtT14.js +1 -0
- package/web-ui/build/static/js-templates-Dr1BqLAt.js +1 -0
- package/web-ui/build/static/jsdoc-CI-GPi6r.js +1 -0
- package/web-ui/build/static/json-2eDPxnHO.js +1 -0
- package/web-ui/build/static/json-BBqUMOAQ.js +1 -0
- package/web-ui/build/static/json5-CeIoln-Y.js +1 -0
- package/web-ui/build/static/jsonp-DWe9tbr2.js +1 -0
- package/web-ui/build/static/jsstacktrace-aE-go9tq.js +1 -0
- package/web-ui/build/static/jsx-BTXEPQYI.js +1 -0
- package/web-ui/build/static/julia-4VeOirXa.js +1 -0
- package/web-ui/build/static/julia-Da6yHEfz.js +1 -0
- package/web-ui/build/static/julia-repl-CFrizGkE.js +1 -0
- package/web-ui/build/static/keepalived-39SDM4j5.js +1 -0
- package/web-ui/build/static/keyman-DU5yOLYr.js +1 -0
- package/web-ui/build/static/kotlin-DJoqh3HG.js +1 -0
- package/web-ui/build/static/kotlin-DsKd3r_L.js +1 -0
- package/web-ui/build/static/kumir-CO96hby4.js +1 -0
- package/web-ui/build/static/kusto-DyuMf8l-.js +1 -0
- package/web-ui/build/static/lasso-BiPmQTXQ.js +1 -0
- package/web-ui/build/static/latex-Bd1ef5fi.js +1 -0
- package/web-ui/build/static/latex-DUrYkmWb.js +1 -0
- package/web-ui/build/static/latte-BSD-hpi5.js +1 -0
- package/web-ui/build/static/ldif-1ZMSg0qI.js +1 -0
- package/web-ui/build/static/leaf-Cg0eq01F.js +1 -0
- package/web-ui/build/static/less-BKcd1_xh.js +1 -0
- package/web-ui/build/static/less-SB5bcusC.js +1 -0
- package/web-ui/build/static/lilypond-BX_kuAqT.js +1 -0
- package/web-ui/build/static/liquid-C337T5bt.js +1 -0
- package/web-ui/build/static/lisp-B_bJRelF.js +1 -0
- package/web-ui/build/static/lisp-Du04Vdmx.js +1 -0
- package/web-ui/build/static/livecodeserver-BOkA9fV6.js +1 -0
- package/web-ui/build/static/livescript-DkMTCCBM.js +1 -0
- package/web-ui/build/static/livescript-rTaLq5oP.js +1 -0
- package/web-ui/build/static/llvm-BrBlvl5p.js +1 -0
- package/web-ui/build/static/llvm-DQbygw7z.js +1 -0
- package/web-ui/build/static/log-DoAzOt8c.js +1 -0
- package/web-ui/build/static/lolcode-DnB7KhRR.js +1 -0
- package/web-ui/build/static/lsl-DpzE7F5A.js +1 -0
- package/web-ui/build/static/lua-CIceROsO.js +1 -0
- package/web-ui/build/static/lua-DhnvJuMn.js +1 -0
- package/web-ui/build/static/magma-BwjzpKxi.js +1 -0
- package/web-ui/build/static/makefile-D10Y62dl.js +1 -0
- package/web-ui/build/static/makefile-esgkquGi.js +1 -0
- package/web-ui/build/static/markdown-B-Y7Y0Nn.js +1 -0
- package/web-ui/build/static/markdown-Cv3Onm-Q.js +1 -0
- package/web-ui/build/static/markup-templating-B1-9WWYa.js +1 -0
- package/web-ui/build/static/mathematica-gSyKdw2h.js +1 -0
- package/web-ui/build/static/matlab-6i1uXuBx.js +1 -0
- package/web-ui/build/static/matlab-CqcSZ1d9.js +1 -0
- package/web-ui/build/static/maxima-Bc-OnIOQ.js +1 -0
- package/web-ui/build/static/maxscript-Bce44o6c.js +1 -0
- package/web-ui/build/static/mel-0Jk3y-vw.js +1 -0
- package/web-ui/build/static/mel-DmA_8WPg.js +1 -0
- package/web-ui/build/static/mercury-DNdP1u-O.js +1 -0
- package/web-ui/build/static/mermaid-DrLkSIIb.js +1 -0
- package/web-ui/build/static/mipsasm-BIQVs3Ff.js +1 -0
- package/web-ui/build/static/mizar-BD5ZD_Rk.js +1 -0
- package/web-ui/build/static/mizar-DThX8Mdy.js +1 -0
- package/web-ui/build/static/mojolicious-Bra-ClwJ.js +1 -0
- package/web-ui/build/static/mongodb-DirByEEg.js +1 -0
- package/web-ui/build/static/monkey-C-Pvu43G.js +1 -0
- package/web-ui/build/static/monkey-n4IFmaA7.js +1 -0
- package/web-ui/build/static/moonscript-B1DM34lp.js +1 -0
- package/web-ui/build/static/moonscript-B82JBytX.js +1 -0
- package/web-ui/build/static/n1ql-C46iq3Hh.js +1 -0
- package/web-ui/build/static/n1ql-DOs3gJQo.js +1 -0
- package/web-ui/build/static/n4js-CPYgal3G.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-BhlUIq7M.js +1 -0
- package/web-ui/build/static/naniscript-D1YZXYcf.js +1 -0
- package/web-ui/build/static/nasm-2-TtCBo4.js +1 -0
- package/web-ui/build/static/neon-BzoXMDea.js +1 -0
- package/web-ui/build/static/nevod-DW_87wHj.js +1 -0
- package/web-ui/build/static/nginx-BgieYUhk.js +1 -0
- package/web-ui/build/static/nginx-DW0RVJbs.js +1 -0
- package/web-ui/build/static/nim-BbTa7YZN.js +1 -0
- package/web-ui/build/static/nim-VdXk3QT9.js +1 -0
- package/web-ui/build/static/nix-3tNNprEI.js +1 -0
- package/web-ui/build/static/nix-BDghlfzh.js +1 -0
- package/web-ui/build/static/node-repl-BBLv3tyt.js +1 -0
- package/web-ui/build/static/nsis-DxjfnSO8.js +1 -0
- package/web-ui/build/static/nsis-FY5xiiar.js +1 -0
- package/web-ui/build/static/objectivec-CXhf_sp_.js +1 -0
- package/web-ui/build/static/objectivec-DcRKjWcd.js +1 -0
- package/web-ui/build/static/ocaml-BLRL6Zro.js +1 -0
- package/web-ui/build/static/ocaml-C4S4QQtS.js +1 -0
- package/web-ui/build/static/opencl-ruEAYetM.js +1 -0
- package/web-ui/build/static/openqasm-D6r_FwIh.js +1 -0
- package/web-ui/build/static/openscad-BEPjoj_N.js +1 -0
- package/web-ui/build/static/oxygene-A61yc5Or.js +1 -0
- package/web-ui/build/static/oz-DICidCTs.js +1 -0
- package/web-ui/build/static/parigp-MjTNwy2s.js +1 -0
- package/web-ui/build/static/parser-DmI7lg_r.js +1 -0
- package/web-ui/build/static/parser3-Bv9kXAib.js +1 -0
- package/web-ui/build/static/pascal-B23PBLTj.js +1 -0
- package/web-ui/build/static/pascaligo-CPIJtX2C.js +1 -0
- package/web-ui/build/static/pcaxis-Bsj_6x8j.js +1 -0
- package/web-ui/build/static/peoplecode-VvQbMjsD.js +1 -0
- package/web-ui/build/static/perl-Cr6Y9-hl.js +1 -0
- package/web-ui/build/static/perl-D37oTJip.js +1 -0
- package/web-ui/build/static/pf-BKHaWcGm.js +1 -0
- package/web-ui/build/static/pgsql-ChusgWw2.js +1 -0
- package/web-ui/build/static/php-3Qr4hNV1.js +1 -0
- package/web-ui/build/static/php-CgxeEh4Y.js +1 -0
- package/web-ui/build/static/php-extras-DeLqwT6H.js +1 -0
- package/web-ui/build/static/php-template-DcOJxuIf.js +1 -0
- package/web-ui/build/static/phpdoc-amFph5Ax.js +1 -0
- package/web-ui/build/static/plaintext-mqBcO1hG.js +1 -0
- package/web-ui/build/static/plsql-ioyqfxP7.js +1 -0
- package/web-ui/build/static/pony-nxjy8Qot.js +1 -0
- package/web-ui/build/static/powerquery-Ci_Fxyg8.js +1 -0
- package/web-ui/build/static/powershell-CB_GgRqr.js +1 -0
- package/web-ui/build/static/powershell-au4fYIm7.js +1 -0
- package/web-ui/build/static/processing-Bkd3f-Wz.js +1 -0
- package/web-ui/build/static/processing-PgCPZm30.js +1 -0
- package/web-ui/build/static/profile-C2GBY6C9.js +1 -0
- package/web-ui/build/static/prolog-BRjYwjIO.js +1 -0
- package/web-ui/build/static/prolog-BheGlH8Q.js +1 -0
- package/web-ui/build/static/promql-CtCmTKys.js +1 -0
- package/web-ui/build/static/properties-BpLqVZha.js +1 -0
- package/web-ui/build/static/properties-UQxavHUY.js +1 -0
- package/web-ui/build/static/protobuf-BSuul6Uw.js +1 -0
- package/web-ui/build/static/protobuf-CLRi8VTE.js +1 -0
- package/web-ui/build/static/psl-CJsJilqO.js +1 -0
- package/web-ui/build/static/pug-5BY6sdv1.js +1 -0
- package/web-ui/build/static/puppet-DBg45gHV.js +1 -0
- package/web-ui/build/static/puppet-DPANCbOj.js +1 -0
- package/web-ui/build/static/pure-Cn4p-7Bj.js +1 -0
- package/web-ui/build/static/purebasic-CoXbIzZJ.js +1 -0
- package/web-ui/build/static/purebasic-DZ_eLoUV.js +1 -0
- package/web-ui/build/static/purescript-B98GoUb_.js +1 -0
- package/web-ui/build/static/python-B-Lm1OME.js +1 -0
- package/web-ui/build/static/python-C_ApFGS1.js +1 -0
- package/web-ui/build/static/python-repl-CJW5_RON.js +1 -0
- package/web-ui/build/static/q-BB2BYhxG.js +1 -0
- package/web-ui/build/static/q-DVqo_ScG.js +1 -0
- package/web-ui/build/static/qml-Co-8g096.js +1 -0
- package/web-ui/build/static/qml-Du0WFcoy.js +1 -0
- package/web-ui/build/static/qore-C6XBzy3U.js +1 -0
- package/web-ui/build/static/qsharp-BCMklAuq.js +1 -0
- package/web-ui/build/static/r-B5CGUQwN.js +1 -0
- package/web-ui/build/static/r-Dxhot-za.js +1 -0
- package/web-ui/build/static/racket-C0dCdrKh.js +1 -0
- package/web-ui/build/static/reason-DGJ1fFJs.js +1 -0
- package/web-ui/build/static/reasonml-gt_AvBg7.js +1 -0
- package/web-ui/build/static/regex-B5iNH8MZ.js +1 -0
- package/web-ui/build/static/rego-hfPajYet.js +1 -0
- package/web-ui/build/static/renpy-BkG5aM4I.js +1 -0
- package/web-ui/build/static/rest-C4uwtrF8.js +1 -0
- package/web-ui/build/static/rib-D32ew8Y7.js +1 -0
- package/web-ui/build/static/rip-BIEbWzxe.js +1 -0
- package/web-ui/build/static/roboconf-CMN8BoHf.js +1 -0
- package/web-ui/build/static/roboconf-GVMh3ioj.js +1 -0
- package/web-ui/build/static/robotframework-CUQybJQ9.js +1 -0
- package/web-ui/build/static/routeros-DUEdLmuc.js +1 -0
- package/web-ui/build/static/rsl-BsAePIwQ.js +1 -0
- package/web-ui/build/static/ruby-CZMMjJFw.js +1 -0
- package/web-ui/build/static/ruby-WOVZyoXO.js +1 -0
- package/web-ui/build/static/ruleslanguage-xV-HszUl.js +1 -0
- package/web-ui/build/static/rust-Da9GRxLz.js +1 -0
- package/web-ui/build/static/rust-uCND428m.js +1 -0
- package/web-ui/build/static/sas-BW15NPzf.js +1 -0
- package/web-ui/build/static/sas-DCx9gext.js +1 -0
- package/web-ui/build/static/sass-BMD7eETo.js +1 -0
- package/web-ui/build/static/scala-0wnxLTlF.js +1 -0
- package/web-ui/build/static/scala-D3Hk-q5-.js +1 -0
- package/web-ui/build/static/scheme-Ci9QOUcD.js +1 -0
- package/web-ui/build/static/scheme-CtqjB_HN.js +1 -0
- package/web-ui/build/static/scilab-CnITQd23.js +1 -0
- package/web-ui/build/static/scss-DCceV6xw.js +1 -0
- package/web-ui/build/static/scss-N5EuPQOS.js +1 -0
- package/web-ui/build/static/shell-BegJTton.js +1 -0
- package/web-ui/build/static/shell-session-BHBoosfJ.js +1 -0
- package/web-ui/build/static/smali-CoHePNQf.js +1 -0
- package/web-ui/build/static/smali-D64W1f0Y.js +1 -0
- package/web-ui/build/static/smalltalk-CagI-Ky8.js +1 -0
- package/web-ui/build/static/smalltalk-DHLuWDjp.js +1 -0
- package/web-ui/build/static/smarty-CSS2XBuu.js +1 -0
- package/web-ui/build/static/sml-D8Oyp9xr.js +1 -0
- package/web-ui/build/static/sml-DvC_VDmX.js +1 -0
- package/web-ui/build/static/solidity-DVkeulrL.js +1 -0
- package/web-ui/build/static/solution-file-Bd7qWzoo.js +1 -0
- package/web-ui/build/static/soy-BRSlVWf7.js +1 -0
- package/web-ui/build/static/sparql-DNnCQmqM.js +1 -0
- package/web-ui/build/static/splunk-spl-DXCDUv2Y.js +1 -0
- package/web-ui/build/static/sqf-C_IKzP5b.js +1 -0
- package/web-ui/build/static/sqf-DBqlUGoG.js +1 -0
- package/web-ui/build/static/sql-Dt3ZutCc.js +1 -0
- package/web-ui/build/static/sql-q0UMLqb7.js +1 -0
- package/web-ui/build/static/sql_more-DAuY5p3F.js +1 -0
- package/web-ui/build/static/squirrel-CgQZeaNT.js +1 -0
- package/web-ui/build/static/stan-D5kYsid7.js +1 -0
- package/web-ui/build/static/stan-JSHToKMA.js +1 -0
- package/web-ui/build/static/stata-DRVhVjVb.js +1 -0
- package/web-ui/build/static/step21-C7h5ssgs.js +1 -0
- package/web-ui/build/static/stylus-BXIDNFUe.js +1 -0
- package/web-ui/build/static/stylus-CyMBrStz.js +1 -0
- package/web-ui/build/static/subunit-Lbpuvy4t.js +1 -0
- package/web-ui/build/static/swift-BCxWOc8n.js +1 -0
- package/web-ui/build/static/swift-B_YEL6eF.js +1 -0
- package/web-ui/build/static/systemd-_zWfs8U5.js +1 -0
- package/web-ui/build/static/t4-cs-BCiVX6dp.js +1 -0
- package/web-ui/build/static/t4-templating-CDm61rWh.js +1 -0
- package/web-ui/build/static/t4-vb-OO2oZZrL.js +1 -0
- package/web-ui/build/static/taggerscript-CkXxiITO.js +1 -0
- package/web-ui/build/static/tap-C612JPhJ.js +1 -0
- package/web-ui/build/static/tap-J-zR66jL.js +1 -0
- package/web-ui/build/static/tcl-DIGan5K8.js +1 -0
- package/web-ui/build/static/tcl-SFVWFwbb.js +1 -0
- package/web-ui/build/static/textile-D0WxA5g8.js +1 -0
- package/web-ui/build/static/thrift-jboo4tJl.js +1 -0
- package/web-ui/build/static/toml-DIK32ROb.js +1 -0
- package/web-ui/build/static/tp-Bhs1iGD3.js +1 -0
- package/web-ui/build/static/tremor-4d_juLiN.js +1 -0
- package/web-ui/build/static/tsx-hEN3qQzd.js +1 -0
- package/web-ui/build/static/tt2-WU6EuPNO.js +1 -0
- package/web-ui/build/static/turtle-CUM3xwNI.js +1 -0
- package/web-ui/build/static/twig-B9JwTKv9.js +1 -0
- package/web-ui/build/static/twig-Crv6BtK7.js +1 -0
- package/web-ui/build/static/typescript-BmabW_ur.js +1 -0
- package/web-ui/build/static/typescript-oMKx2dph.js +1 -0
- package/web-ui/build/static/typoscript-X48MNTeK.js +1 -0
- package/web-ui/build/static/unrealscript-qnu9Ogmz.js +1 -0
- package/web-ui/build/static/uorazor-BicTvjGt.js +1 -0
- package/web-ui/build/static/uri-CyRoMB-u.js +1 -0
- package/web-ui/build/static/v-BDM6ZJR7.js +1 -0
- package/web-ui/build/static/vala-BWCf7DTx.js +1 -0
- package/web-ui/build/static/vala-COL5roWV.js +1 -0
- package/web-ui/build/static/vbnet-BHPgkiip.js +1 -0
- package/web-ui/build/static/vbnet-BadWmTKs.js +1 -0
- package/web-ui/build/static/vbscript-BfUpIAaV.js +1 -0
- package/web-ui/build/static/vbscript-html-BBR6zcvV.js +1 -0
- package/web-ui/build/static/velocity-k4gGPuiP.js +1 -0
- package/web-ui/build/static/verilog-BoNroxW8.js +1 -0
- package/web-ui/build/static/verilog-C7cplLIi.js +1 -0
- package/web-ui/build/static/vhdl-BrKkx69g.js +1 -0
- package/web-ui/build/static/vhdl-CWacsAXR.js +1 -0
- package/web-ui/build/static/vim-BcdueaEC.js +1 -0
- package/web-ui/build/static/vim-BwsUolG_.js +1 -0
- package/web-ui/build/static/visual-basic-DTXlX5HN.js +1 -0
- package/web-ui/build/static/warpscript-2w0_2KsB.js +1 -0
- package/web-ui/build/static/wasm-BPaXQO-A.js +1 -0
- package/web-ui/build/static/web-idl-BoCTFQod.js +1 -0
- package/web-ui/build/static/wiki-BkkCi9wm.js +1 -0
- package/web-ui/build/static/wolfram-CvRNTaAX.js +1 -0
- package/web-ui/build/static/wren-Bz8Smtz-.js +1 -0
- package/web-ui/build/static/x86asm-BM83B0N_.js +1 -0
- package/web-ui/build/static/xeora-BjuDukl7.js +1 -0
- package/web-ui/build/static/xl-ByiuKWwm.js +1 -0
- package/web-ui/build/static/xml-Dut2p53G.js +1 -0
- package/web-ui/build/static/xml-doc-CxgwiuaA.js +1 -0
- package/web-ui/build/static/xojo-CBqUB8JI.js +1 -0
- package/web-ui/build/static/xquery-D-agM4jx.js +1 -0
- package/web-ui/build/static/xquery-DL_eetrQ.js +1 -0
- package/web-ui/build/static/yaml-DZ7HVZSe.js +1 -0
- package/web-ui/build/static/yaml-DatJAv7_.js +1 -0
- package/web-ui/build/static/yang-D0nrKE-r.js +1 -0
- package/web-ui/build/static/zephir--M2g15-k.js +1 -0
- package/web-ui/build/static/zig-CK6rUH8E.js +1 -0
- package/web-ui/build/static/1c-DGpIT7i5.js +0 -1
- package/web-ui/build/static/abap-5wFDdWLh.js +0 -1
- package/web-ui/build/static/abnf-BP1dpNSE.js +0 -1
- package/web-ui/build/static/abnf-DBEIAl8g.js +0 -1
- package/web-ui/build/static/accesslog-CWSM_T5E.js +0 -1
- package/web-ui/build/static/actionscript-DONkco1J.js +0 -1
- package/web-ui/build/static/actionscript-FqBYk5er.js +0 -1
- package/web-ui/build/static/ada-C2JLRIaM.js +0 -1
- package/web-ui/build/static/ada-gKiygTRK.js +0 -1
- package/web-ui/build/static/agda-CkSODqK2.js +0 -1
- package/web-ui/build/static/al-BJ_YR6p7.js +0 -1
- package/web-ui/build/static/angelscript-Dg2byMGg.js +0 -1
- package/web-ui/build/static/antlr4-BnpyaFNr.js +0 -1
- package/web-ui/build/static/apache-Dffxsd7O.js +0 -1
- package/web-ui/build/static/apacheconf-DLitjtWj.js +0 -1
- package/web-ui/build/static/apex-Drr_IvU2.js +0 -1
- package/web-ui/build/static/apl-CF6qxmXG.js +0 -1
- package/web-ui/build/static/applescript-CjOlw3b_.js +0 -1
- package/web-ui/build/static/applescript-DjkSl1Ry.js +0 -1
- package/web-ui/build/static/aql-KwVmK1gP.js +0 -1
- package/web-ui/build/static/arcade-CENSXx0R.js +0 -1
- package/web-ui/build/static/arduino-B3Ta9Fll.js +0 -1
- package/web-ui/build/static/arduino-CzcsaB9_.js +0 -1
- package/web-ui/build/static/arff-CMJSVt_O.js +0 -1
- package/web-ui/build/static/armasm-0zSgSPB4.js +0 -1
- package/web-ui/build/static/asciidoc-B8K5ctWq.js +0 -1
- package/web-ui/build/static/asciidoc-bk2Sg6b6.js +0 -1
- package/web-ui/build/static/asm6502-ji6zm4FQ.js +0 -1
- package/web-ui/build/static/asmatmel-DJqObM4Y.js +0 -1
- package/web-ui/build/static/aspectj-DqQKI7J5.js +0 -1
- package/web-ui/build/static/aspnet-9cenTxW7.js +0 -1
- package/web-ui/build/static/autohotkey-C6EhiZvl.js +0 -1
- package/web-ui/build/static/autohotkey-sTGJOvMM.js +0 -1
- package/web-ui/build/static/autoit-B0Im8iQ1.js +0 -1
- package/web-ui/build/static/autoit-CO6pUD0H.js +0 -1
- package/web-ui/build/static/avisynth-OvOHTfj5.js +0 -1
- package/web-ui/build/static/avrasm-BLWZ5Mye.js +0 -1
- package/web-ui/build/static/avro-idl-BB2ODvnw.js +0 -1
- package/web-ui/build/static/awk-_jhMabQ0.js +0 -1
- package/web-ui/build/static/axapta-DdBRgoYy.js +0 -1
- package/web-ui/build/static/bash-CsaRGXBQ.js +0 -1
- package/web-ui/build/static/bash-CxLFkwAC.js +0 -1
- package/web-ui/build/static/basic-BJyy7JJE.js +0 -1
- package/web-ui/build/static/basic-CrMb-gv0.js +0 -1
- package/web-ui/build/static/batch-BvcykMe5.js +0 -1
- package/web-ui/build/static/bbcode-EOBuY5Y6.js +0 -1
- package/web-ui/build/static/bicep-QkDJBA34.js +0 -1
- package/web-ui/build/static/birb-TAOxKurn.js +0 -1
- package/web-ui/build/static/bison-BEK6cnad.js +0 -1
- package/web-ui/build/static/bnf-DfEODxsr.js +0 -1
- package/web-ui/build/static/bnf-DhbMjsuA.js +0 -1
- package/web-ui/build/static/brainfuck-BoVocOa7.js +0 -1
- package/web-ui/build/static/brainfuck-DDC5QXPK.js +0 -1
- package/web-ui/build/static/brightscript-DNN598w2.js +0 -1
- package/web-ui/build/static/bro-Cn_jjZ8P.js +0 -1
- package/web-ui/build/static/bsl-CMCN75Gu.js +0 -1
- package/web-ui/build/static/c-DbOGQnEJ.js +0 -1
- package/web-ui/build/static/c-kggwYFsy.js +0 -1
- package/web-ui/build/static/c-like-BIsuUvof.js +0 -1
- package/web-ui/build/static/cal-DpgMsBZE.js +0 -1
- package/web-ui/build/static/capnproto-C1AHYI-M.js +0 -1
- package/web-ui/build/static/ceylon-pvJffDe1.js +0 -1
- package/web-ui/build/static/cfscript-C1qylu52.js +0 -1
- package/web-ui/build/static/chaiscript-D417WKRI.js +0 -1
- package/web-ui/build/static/cil-CjbZHbcY.js +0 -1
- package/web-ui/build/static/clean-Dvc6R-F2.js +0 -1
- package/web-ui/build/static/clojure-CSVRQPMQ.js +0 -1
- package/web-ui/build/static/clojure-ig1Vkg7X.js +0 -1
- package/web-ui/build/static/clojure-repl-C1uyEabk.js +0 -1
- package/web-ui/build/static/cmake-DSbVcAB3.js +0 -1
- package/web-ui/build/static/cmake-Zp8kPwnH.js +0 -1
- package/web-ui/build/static/cobol-OsZSiK_P.js +0 -1
- package/web-ui/build/static/coffeescript-D8r0416S.js +0 -1
- package/web-ui/build/static/coffeescript-DCpgClxh.js +0 -1
- package/web-ui/build/static/concurnas-DKnsxUOc.js +0 -1
- package/web-ui/build/static/coq-BQFlywVI.js +0 -1
- package/web-ui/build/static/coq-BvS9mQB2.js +0 -1
- package/web-ui/build/static/cos-D3ze2791.js +0 -1
- package/web-ui/build/static/cpp-Bw-cV3P1.js +0 -1
- package/web-ui/build/static/cpp-vi1p7XpB.js +0 -1
- package/web-ui/build/static/crmsh-BClnJTeQ.js +0 -1
- package/web-ui/build/static/crystal-DGzOUYZq.js +0 -1
- package/web-ui/build/static/crystal-DMzk6EvA.js +0 -1
- package/web-ui/build/static/csharp-BTom8s2X.js +0 -1
- package/web-ui/build/static/csharp-Cp2V3jfR.js +0 -1
- package/web-ui/build/static/cshtml-Dmtt9Kto.js +0 -1
- package/web-ui/build/static/csp-WPVsLe9_.js +0 -1
- package/web-ui/build/static/csp-qddj5fu_.js +0 -1
- package/web-ui/build/static/css-B0FAm7kj.js +0 -1
- package/web-ui/build/static/css-extras-Bx3pvjiG.js +0 -1
- package/web-ui/build/static/csv-CH-edgS5.js +0 -1
- package/web-ui/build/static/cypher-c3G8Leew.js +0 -1
- package/web-ui/build/static/d-BMDSy22_.js +0 -1
- package/web-ui/build/static/d-BdH4oW8-.js +0 -1
- package/web-ui/build/static/dart-C-r72q-O.js +0 -1
- package/web-ui/build/static/dart-CwpBMrKa.js +0 -1
- package/web-ui/build/static/dataweave-BPvqdt4k.js +0 -1
- package/web-ui/build/static/dax-Eyy6ixcN.js +0 -1
- package/web-ui/build/static/delphi-DhEbPj_5.js +0 -1
- package/web-ui/build/static/dhall-Ct1L8sN1.js +0 -1
- package/web-ui/build/static/diff-CSTqCgwn.js +0 -1
- package/web-ui/build/static/diff-Da97B5vW.js +0 -1
- package/web-ui/build/static/django-DGit_lCg.js +0 -1
- package/web-ui/build/static/django-DPgqFB8k.js +0 -1
- package/web-ui/build/static/dns-DUyXuZ-a.js +0 -1
- package/web-ui/build/static/dns-zone-file-D79MDxVG.js +0 -1
- package/web-ui/build/static/docker-DTiy4o38.js +0 -1
- package/web-ui/build/static/dockerfile-CvwPP8wE.js +0 -1
- package/web-ui/build/static/dos-CaIUWxvb.js +0 -1
- package/web-ui/build/static/dot-D3504w6Y.js +0 -1
- package/web-ui/build/static/dsconfig-Smy1eeX_.js +0 -1
- package/web-ui/build/static/dts-DyTYSXZj.js +0 -1
- package/web-ui/build/static/dust-CrJyi6qA.js +0 -1
- package/web-ui/build/static/ebnf-C8nqfkBH.js +0 -1
- package/web-ui/build/static/ebnf-Cuh5Vh2-.js +0 -1
- package/web-ui/build/static/editorconfig-C7pTGl6n.js +0 -1
- package/web-ui/build/static/eiffel-C75MSJCA.js +0 -1
- package/web-ui/build/static/ejs-Dyo7DF5w.js +0 -1
- package/web-ui/build/static/elixir-D4yJefOc.js +0 -1
- package/web-ui/build/static/elixir-DKRow2SJ.js +0 -1
- package/web-ui/build/static/elm-CgbdDlkT.js +0 -1
- package/web-ui/build/static/elm-D3N-UgU0.js +0 -1
- package/web-ui/build/static/erb-BsITh8qW.js +0 -1
- package/web-ui/build/static/erb-lY_LyKyS.js +0 -1
- package/web-ui/build/static/erlang-BCnPiYmB.js +0 -1
- package/web-ui/build/static/erlang-JEghiPXc.js +0 -1
- package/web-ui/build/static/erlang-repl-DzU97ugC.js +0 -1
- package/web-ui/build/static/etlua-CsBo8cJa.js +0 -1
- package/web-ui/build/static/excel-formula-C2piiCYa.js +0 -1
- package/web-ui/build/static/excel-kqNypwQD.js +0 -1
- package/web-ui/build/static/factor-DZTOhkyU.js +0 -1
- package/web-ui/build/static/false-yLjhfaSw.js +0 -1
- package/web-ui/build/static/firestore-security-rules-oaQNoH8l.js +0 -1
- package/web-ui/build/static/fix-C9IfnTuS.js +0 -1
- package/web-ui/build/static/flix-EmJ_JhPo.js +0 -1
- package/web-ui/build/static/flow-DCUl7IAQ.js +0 -1
- package/web-ui/build/static/fortran-DvyxJmFN.js +0 -1
- package/web-ui/build/static/fortran-EEP9R3S5.js +0 -1
- package/web-ui/build/static/fsharp-D_98s3RX.js +0 -1
- package/web-ui/build/static/fsharp-Dt9jOO5G.js +0 -1
- package/web-ui/build/static/ftl-C8gMHWLo.js +0 -1
- package/web-ui/build/static/gams-BHxVPb4z.js +0 -1
- package/web-ui/build/static/gap-DFtyHk-q.js +0 -1
- package/web-ui/build/static/gauss-BwhJWUcg.js +0 -1
- package/web-ui/build/static/gcode-BvmXwp09.js +0 -1
- package/web-ui/build/static/gcode-gWcD6Vc7.js +0 -1
- package/web-ui/build/static/gdscript-btHoX8RE.js +0 -1
- package/web-ui/build/static/gedcom-MgPs9iqh.js +0 -1
- package/web-ui/build/static/gherkin-B9c_Q16A.js +0 -1
- package/web-ui/build/static/gherkin-BvOgkK6h.js +0 -1
- package/web-ui/build/static/git-D9XWOVcQ.js +0 -1
- package/web-ui/build/static/glsl-CshBHxHY.js +0 -1
- package/web-ui/build/static/glsl-fNRUMTDr.js +0 -1
- package/web-ui/build/static/gml-B78deHK8.js +0 -1
- package/web-ui/build/static/gml-Cj7d2u8O.js +0 -1
- package/web-ui/build/static/gn-CJLD-mF1.js +0 -1
- package/web-ui/build/static/go-CT93BEkL.js +0 -1
- package/web-ui/build/static/go-CTTlNuQO.js +0 -1
- package/web-ui/build/static/go-module-BgnXboUE.js +0 -1
- package/web-ui/build/static/golo-2S5tXS-l.js +0 -1
- package/web-ui/build/static/gradle-8W8DCcWJ.js +0 -1
- package/web-ui/build/static/graphql-DZfp6FNU.js +0 -1
- package/web-ui/build/static/groovy-BfsyMb3X.js +0 -1
- package/web-ui/build/static/groovy-Dxov7ENz.js +0 -1
- package/web-ui/build/static/haml-BlUFsdVV.js +0 -1
- package/web-ui/build/static/haml-CjVj6vvW.js +0 -1
- package/web-ui/build/static/handlebars-DxrQFkyA.js +0 -1
- package/web-ui/build/static/handlebars-FE6fotYl.js +0 -1
- package/web-ui/build/static/haskell-B6z0RCD_.js +0 -1
- package/web-ui/build/static/haskell-JBFmJTRy.js +0 -1
- package/web-ui/build/static/haxe-BtMZMi-_.js +0 -1
- package/web-ui/build/static/haxe-C1J8n-fH.js +0 -1
- package/web-ui/build/static/hcl-DJP-bFWE.js +0 -1
- package/web-ui/build/static/hlsl-DrGjhs1b.js +0 -1
- package/web-ui/build/static/hoon-Cg-ZhqIT.js +0 -1
- package/web-ui/build/static/hpkp-D07vgmoZ.js +0 -1
- package/web-ui/build/static/hsp-CsypPWoA.js +0 -1
- package/web-ui/build/static/hsts-B6DMRxvP.js +0 -1
- package/web-ui/build/static/htmlbars-BI7_Hw4e.js +0 -1
- package/web-ui/build/static/http-90ihEi4s.js +0 -1
- package/web-ui/build/static/http-Dp4QXj9E.js +0 -1
- package/web-ui/build/static/hy-BMgKvP4K.js +0 -1
- package/web-ui/build/static/ichigojam-D6wKvJDb.js +0 -1
- package/web-ui/build/static/icon-CrgkmCwl.js +0 -1
- package/web-ui/build/static/icu-message-format-Bi2JxCXs.js +0 -1
- package/web-ui/build/static/idris-DbUsyZt5.js +0 -1
- package/web-ui/build/static/iecst-CQZ9t8fW.js +0 -1
- package/web-ui/build/static/ignore-BaFgtNMs.js +0 -1
- package/web-ui/build/static/index-DEWSWosh.css +0 -1
- package/web-ui/build/static/index-Di1bjCFA.js +0 -13
- package/web-ui/build/static/index-otR_WSsL.js +0 -1
- package/web-ui/build/static/index-whZPU4as.js +0 -1183
- package/web-ui/build/static/inform7-ClyX1Gro.js +0 -1
- package/web-ui/build/static/inform7-tZHBS5XP.js +0 -1
- package/web-ui/build/static/ini-BrP5JNYL.js +0 -1
- package/web-ui/build/static/ini-CVkrAhwV.js +0 -1
- package/web-ui/build/static/io-BJ1Y6Bdc.js +0 -1
- package/web-ui/build/static/irpf90-fjjcKS_8.js +0 -1
- package/web-ui/build/static/isbl-ClpvfUIz.js +0 -1
- package/web-ui/build/static/j-CICW77xS.js +0 -1
- package/web-ui/build/static/java-B9DFK-0E.js +0 -1
- package/web-ui/build/static/java-BL_6rYko.js +0 -1
- package/web-ui/build/static/javadoc-Cc4HKpKK.js +0 -1
- package/web-ui/build/static/javadoclike-CgNkUDOm.js +0 -1
- package/web-ui/build/static/javascript-CM40ZECq.js +0 -1
- package/web-ui/build/static/javastacktrace-BHSqXfG5.js +0 -1
- package/web-ui/build/static/jboss-cli-Bv5NhVSZ.js +0 -1
- package/web-ui/build/static/jexl--Ohk_keA.js +0 -1
- package/web-ui/build/static/jolie-DMTN5Vdf.js +0 -1
- package/web-ui/build/static/jq-nXRLldXX.js +0 -1
- package/web-ui/build/static/js-extras-eLwv3frs.js +0 -1
- package/web-ui/build/static/js-templates-Ca0owlrg.js +0 -1
- package/web-ui/build/static/jsdoc-KERXp0da.js +0 -1
- package/web-ui/build/static/json-BTjLaRsy.js +0 -1
- package/web-ui/build/static/json-p7pU0qdW.js +0 -1
- package/web-ui/build/static/json5-Cxjy1udc.js +0 -1
- package/web-ui/build/static/jsonp-CO52H7Gy.js +0 -1
- package/web-ui/build/static/jsstacktrace-8YKfoyJP.js +0 -1
- package/web-ui/build/static/jsx-Ct_05KbM.js +0 -1
- package/web-ui/build/static/julia-23I1ubCE.js +0 -1
- package/web-ui/build/static/julia-d8rVGed_.js +0 -1
- package/web-ui/build/static/julia-repl-mwnHedW_.js +0 -1
- package/web-ui/build/static/keepalived-E85Rx_fF.js +0 -1
- package/web-ui/build/static/keyman-aWd3QUDq.js +0 -1
- package/web-ui/build/static/kotlin-Cu370hQq.js +0 -1
- package/web-ui/build/static/kotlin-DoJ2WnmZ.js +0 -1
- package/web-ui/build/static/kumir-oiOgqcQO.js +0 -1
- package/web-ui/build/static/kusto-Bp-B02K5.js +0 -1
- package/web-ui/build/static/lasso-BxoQVwOO.js +0 -1
- package/web-ui/build/static/latex-CANm5vsX.js +0 -1
- package/web-ui/build/static/latex-PMroeNch.js +0 -1
- package/web-ui/build/static/latte-2ErU_2XF.js +0 -1
- package/web-ui/build/static/ldif-ChPn_F7o.js +0 -1
- package/web-ui/build/static/leaf-UkCugDgG.js +0 -1
- package/web-ui/build/static/less-CCH5RA89.js +0 -1
- package/web-ui/build/static/less-CGZbVU1g.js +0 -1
- package/web-ui/build/static/lilypond-BoyM37sv.js +0 -1
- package/web-ui/build/static/liquid-DGJVpRBi.js +0 -1
- package/web-ui/build/static/lisp-93nne61u.js +0 -1
- package/web-ui/build/static/lisp-DYjIRsXz.js +0 -1
- package/web-ui/build/static/livecodeserver-CfNaxIE4.js +0 -1
- package/web-ui/build/static/livescript-C8kDlQkz.js +0 -1
- package/web-ui/build/static/livescript-CoarnRHq.js +0 -1
- package/web-ui/build/static/llvm-CBVyNmAh.js +0 -1
- package/web-ui/build/static/llvm-DGxq8a7u.js +0 -1
- package/web-ui/build/static/log-BivgwFql.js +0 -1
- package/web-ui/build/static/lolcode-l5sK2cZz.js +0 -1
- package/web-ui/build/static/lsl-Xm44xLRQ.js +0 -1
- package/web-ui/build/static/lua-CGvrzfKp.js +0 -1
- package/web-ui/build/static/lua-nHwXeY4c.js +0 -1
- package/web-ui/build/static/magma-DmNItmna.js +0 -1
- package/web-ui/build/static/makefile-CKJNNHGb.js +0 -1
- package/web-ui/build/static/makefile-DI6y5Qml.js +0 -1
- package/web-ui/build/static/markdown-BgpbxKd-.js +0 -1
- package/web-ui/build/static/markdown-CvcxA4yk.js +0 -1
- package/web-ui/build/static/markup-templating-DijqesiA.js +0 -1
- package/web-ui/build/static/mathematica-Cxll1Q10.js +0 -1
- package/web-ui/build/static/matlab-BJo2T1A-.js +0 -1
- package/web-ui/build/static/matlab-C6DlZX4l.js +0 -1
- package/web-ui/build/static/maxima-DJXO4sbL.js +0 -1
- package/web-ui/build/static/maxscript-DdLpUYBs.js +0 -1
- package/web-ui/build/static/mel-BIpfnSyZ.js +0 -1
- package/web-ui/build/static/mel-BYcTUZJW.js +0 -1
- package/web-ui/build/static/mercury-C_LSpbD8.js +0 -1
- package/web-ui/build/static/mermaid-D9yBWnrT.js +0 -1
- package/web-ui/build/static/mipsasm-nR_K2Ue-.js +0 -1
- package/web-ui/build/static/mizar-BeLUPncD.js +0 -1
- package/web-ui/build/static/mizar-BesIbZd9.js +0 -1
- package/web-ui/build/static/mojolicious-cBx3OWa-.js +0 -1
- package/web-ui/build/static/mongodb-DTWKy9ac.js +0 -1
- package/web-ui/build/static/monkey-B72bZC3c.js +0 -1
- package/web-ui/build/static/monkey-G9XELYPQ.js +0 -1
- package/web-ui/build/static/moonscript-BXYVQiqj.js +0 -1
- package/web-ui/build/static/moonscript-sDd-5knz.js +0 -1
- package/web-ui/build/static/n1ql-0vKSfFAO.js +0 -1
- package/web-ui/build/static/n1ql-C9_BSZfz.js +0 -1
- package/web-ui/build/static/n4js-B7Ct8dds.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-p9gpphTM.js +0 -1
- package/web-ui/build/static/naniscript-6ZVr8Aug.js +0 -1
- package/web-ui/build/static/nasm-Ca73yTUt.js +0 -1
- package/web-ui/build/static/neon-DNP49oyX.js +0 -1
- package/web-ui/build/static/nevod-Qhgt7Bce.js +0 -1
- package/web-ui/build/static/nginx-D5e7lu62.js +0 -1
- package/web-ui/build/static/nginx-DobnyESB.js +0 -1
- package/web-ui/build/static/nim-BPBivUOV.js +0 -1
- package/web-ui/build/static/nim-Baoug1Wa.js +0 -1
- package/web-ui/build/static/nix-CSPTQs5y.js +0 -1
- package/web-ui/build/static/nix-Dk4eNw49.js +0 -1
- package/web-ui/build/static/node-repl-NJNL8VFR.js +0 -1
- package/web-ui/build/static/nsis-BZ0oMzEw.js +0 -1
- package/web-ui/build/static/nsis-CKPCjtCU.js +0 -1
- package/web-ui/build/static/objectivec-BkfIRhhV.js +0 -1
- package/web-ui/build/static/objectivec-CnQgqhbJ.js +0 -1
- package/web-ui/build/static/ocaml-9rGNzRrK.js +0 -1
- package/web-ui/build/static/ocaml-CTolCqxL.js +0 -1
- package/web-ui/build/static/opencl-9Q3vRDxv.js +0 -1
- package/web-ui/build/static/openqasm-D2QiuFBp.js +0 -1
- package/web-ui/build/static/openscad-C3HyuzpB.js +0 -1
- package/web-ui/build/static/oxygene-4gi-VYy_.js +0 -1
- package/web-ui/build/static/oz-BGDEB-1A.js +0 -1
- package/web-ui/build/static/parigp-CfZzp1uE.js +0 -1
- package/web-ui/build/static/parser-UbGteTcy.js +0 -1
- package/web-ui/build/static/parser3-C-Jx-fy7.js +0 -1
- package/web-ui/build/static/pascal-D1_R0gW-.js +0 -1
- package/web-ui/build/static/pascaligo-B8C-98Np.js +0 -1
- package/web-ui/build/static/pcaxis-TGnlUKNs.js +0 -1
- package/web-ui/build/static/peoplecode-C5Vf1AH0.js +0 -1
- package/web-ui/build/static/perl-CBp1N62T.js +0 -1
- package/web-ui/build/static/perl-Z59j904t.js +0 -1
- package/web-ui/build/static/pf-Cq8B_xwQ.js +0 -1
- package/web-ui/build/static/pgsql-ofJbUHkL.js +0 -1
- package/web-ui/build/static/php-OlH7HLQJ.js +0 -1
- package/web-ui/build/static/php-extras-GqtrxLuk.js +0 -1
- package/web-ui/build/static/php-r09kMDOB.js +0 -1
- package/web-ui/build/static/php-template-18uT97Qo.js +0 -1
- package/web-ui/build/static/phpdoc-9tRFvup9.js +0 -1
- package/web-ui/build/static/plaintext-DsYT6Mu-.js +0 -1
- package/web-ui/build/static/plsql-RhWQNJVb.js +0 -1
- package/web-ui/build/static/pony-DD6JMLYI.js +0 -1
- package/web-ui/build/static/powerquery-CALow-bt.js +0 -1
- package/web-ui/build/static/powershell-C2QvIuKF.js +0 -1
- package/web-ui/build/static/powershell-yrbJEhCh.js +0 -1
- package/web-ui/build/static/processing-1T5w_Q03.js +0 -1
- package/web-ui/build/static/processing-DBim_dO-.js +0 -1
- package/web-ui/build/static/profile-Cdloh8mZ.js +0 -1
- package/web-ui/build/static/prolog-DRSsNnns.js +0 -1
- package/web-ui/build/static/prolog-D_ajweDr.js +0 -1
- package/web-ui/build/static/promql-BRuwn6Bn.js +0 -1
- package/web-ui/build/static/properties-D5Wyl4X4.js +0 -1
- package/web-ui/build/static/properties-kn4fl1bl.js +0 -1
- package/web-ui/build/static/protobuf-BMO76zWi.js +0 -1
- package/web-ui/build/static/protobuf-CTUCF-U-.js +0 -1
- package/web-ui/build/static/psl-CiqYdQbY.js +0 -1
- package/web-ui/build/static/pug-BLE2Qayj.js +0 -1
- package/web-ui/build/static/puppet-CFKLWXft.js +0 -1
- package/web-ui/build/static/puppet-DQci0Dl5.js +0 -1
- package/web-ui/build/static/pure-D2h_GynV.js +0 -1
- package/web-ui/build/static/purebasic-BF8MVw8V.js +0 -1
- package/web-ui/build/static/purebasic-BTtHiCkh.js +0 -1
- package/web-ui/build/static/purescript-D1ZSh-sH.js +0 -1
- package/web-ui/build/static/python-Cp9_Vdhb.js +0 -1
- package/web-ui/build/static/python-DdgNw8IW.js +0 -1
- package/web-ui/build/static/python-repl-DvK89VMC.js +0 -1
- package/web-ui/build/static/q-COaIgwhT.js +0 -1
- package/web-ui/build/static/q-Cm0dQkW8.js +0 -1
- package/web-ui/build/static/qml-BpsOqqJM.js +0 -1
- package/web-ui/build/static/qml-BziQXlU4.js +0 -1
- package/web-ui/build/static/qore-Cutz6g-2.js +0 -1
- package/web-ui/build/static/qsharp-B16619X1.js +0 -1
- package/web-ui/build/static/r-CFUIj5Hd.js +0 -1
- package/web-ui/build/static/r-CPrwCi5w.js +0 -1
- package/web-ui/build/static/racket-Bh08DFXF.js +0 -1
- package/web-ui/build/static/reason-BxjDq4e-.js +0 -1
- package/web-ui/build/static/reasonml-Ds5SsGP8.js +0 -1
- package/web-ui/build/static/regex-DhBIDIMI.js +0 -1
- package/web-ui/build/static/rego-DCwxZXcB.js +0 -1
- package/web-ui/build/static/renpy-C2fuQfqb.js +0 -1
- package/web-ui/build/static/rest-C52ZpxWQ.js +0 -1
- package/web-ui/build/static/rib-Cbl2Mzyj.js +0 -1
- package/web-ui/build/static/rip-BTOu5ZIE.js +0 -1
- package/web-ui/build/static/roboconf-3Oi2wuVk.js +0 -1
- package/web-ui/build/static/roboconf-ndLZLE39.js +0 -1
- package/web-ui/build/static/robotframework-BzHXiIj1.js +0 -1
- package/web-ui/build/static/routeros-CkpPoqx-.js +0 -1
- package/web-ui/build/static/rsl-C0bwOQ38.js +0 -1
- package/web-ui/build/static/ruby-C_hIhtuQ.js +0 -1
- package/web-ui/build/static/ruby-DvKfZPzj.js +0 -1
- package/web-ui/build/static/ruleslanguage-CbZJlddz.js +0 -1
- package/web-ui/build/static/rust-BFPIhB-X.js +0 -1
- package/web-ui/build/static/rust-sBpUq-qE.js +0 -1
- package/web-ui/build/static/sas-BCXvYN9x.js +0 -1
- package/web-ui/build/static/sas-D7GAsTY3.js +0 -1
- package/web-ui/build/static/sass-BdaErGMN.js +0 -1
- package/web-ui/build/static/scala-Cj81oCl9.js +0 -1
- package/web-ui/build/static/scala-CvbksfY6.js +0 -1
- package/web-ui/build/static/scheme-BM5ZqKnl.js +0 -1
- package/web-ui/build/static/scheme-BPvlu9Tk.js +0 -1
- package/web-ui/build/static/scilab-CJanLKQN.js +0 -1
- package/web-ui/build/static/scss-C53YF_7f.js +0 -1
- package/web-ui/build/static/scss-DPp8UZbr.js +0 -1
- package/web-ui/build/static/shell-CC9bQXMe.js +0 -1
- package/web-ui/build/static/shell-session-CuR3fbf-.js +0 -1
- package/web-ui/build/static/smali-CUgLls3D.js +0 -1
- package/web-ui/build/static/smali-YODSX8qt.js +0 -1
- package/web-ui/build/static/smalltalk-BMJQ4bbs.js +0 -1
- package/web-ui/build/static/smalltalk-BVGY3CTl.js +0 -1
- package/web-ui/build/static/smarty-C9aNt4-p.js +0 -1
- package/web-ui/build/static/sml-C3BIHhfq.js +0 -1
- package/web-ui/build/static/sml-DTipyRmY.js +0 -1
- package/web-ui/build/static/solidity-1yuPUqoC.js +0 -1
- package/web-ui/build/static/solution-file-BgzK4GOU.js +0 -1
- package/web-ui/build/static/soy-CFJXRvqc.js +0 -1
- package/web-ui/build/static/sparql-CAosYMpl.js +0 -1
- package/web-ui/build/static/splunk-spl-DkINtWr8.js +0 -1
- package/web-ui/build/static/sqf-DbrWIS2M.js +0 -1
- package/web-ui/build/static/sqf-nq8Q9J2W.js +0 -1
- package/web-ui/build/static/sql-9bwClhZQ.js +0 -1
- package/web-ui/build/static/sql-CqPkY-lX.js +0 -1
- package/web-ui/build/static/sql_more-CsY5ts77.js +0 -1
- package/web-ui/build/static/squirrel-BuqtzRBD.js +0 -1
- package/web-ui/build/static/stan-BNxBSglc.js +0 -1
- package/web-ui/build/static/stan-CZVMc34l.js +0 -1
- package/web-ui/build/static/stata-DKnVdHCd.js +0 -1
- package/web-ui/build/static/step21-Cu_TaBGF.js +0 -1
- package/web-ui/build/static/stylus-BS7-OJew.js +0 -1
- package/web-ui/build/static/stylus-DtFrp1Nk.js +0 -1
- package/web-ui/build/static/subunit-DDCoWkkc.js +0 -1
- package/web-ui/build/static/swift-BaguUZbl.js +0 -1
- package/web-ui/build/static/swift-mwBsb8Bx.js +0 -1
- package/web-ui/build/static/systemd-D6PpyDKk.js +0 -1
- package/web-ui/build/static/t4-cs-Cem8g4Ck.js +0 -1
- package/web-ui/build/static/t4-templating-BZo-HjmD.js +0 -1
- package/web-ui/build/static/t4-vb-B4oVnKa4.js +0 -1
- package/web-ui/build/static/taggerscript-DweAZ5pw.js +0 -1
- package/web-ui/build/static/tap-DpuvKHHF.js +0 -1
- package/web-ui/build/static/tap-hUKmJObZ.js +0 -1
- package/web-ui/build/static/tcl-BUvhAi7u.js +0 -1
- package/web-ui/build/static/tcl-Dsck63d8.js +0 -1
- package/web-ui/build/static/textile-CgKbqJ-j.js +0 -1
- package/web-ui/build/static/thrift-B5H6rApp.js +0 -1
- package/web-ui/build/static/toml-DggTpfOo.js +0 -1
- package/web-ui/build/static/tp-CazB2P2X.js +0 -1
- package/web-ui/build/static/tremor-B1jy7S5p.js +0 -1
- package/web-ui/build/static/tsx-BqF2lVDi.js +0 -1
- package/web-ui/build/static/tt2-BNoNXpEe.js +0 -1
- package/web-ui/build/static/turtle-B0evd5mn.js +0 -1
- package/web-ui/build/static/twig-B5A7nMdv.js +0 -1
- package/web-ui/build/static/twig-DZnLWvh8.js +0 -1
- package/web-ui/build/static/typescript-Bbe_P093.js +0 -1
- package/web-ui/build/static/typescript-BfhvmSSG.js +0 -1
- package/web-ui/build/static/typoscript-BjuZEIgw.js +0 -1
- package/web-ui/build/static/unrealscript-C3iUCFRi.js +0 -1
- package/web-ui/build/static/uorazor-CbZXwzIj.js +0 -1
- package/web-ui/build/static/uri-xMPSnp6m.js +0 -1
- package/web-ui/build/static/v-BKcGo5I6.js +0 -1
- package/web-ui/build/static/vala-BRoBE4am.js +0 -1
- package/web-ui/build/static/vala-B__Iyrma.js +0 -1
- package/web-ui/build/static/vbnet-DBxlMRvN.js +0 -1
- package/web-ui/build/static/vbnet-DjAXt5BE.js +0 -1
- package/web-ui/build/static/vbscript-BNA4oANi.js +0 -1
- package/web-ui/build/static/vbscript-html-o8ckLPKG.js +0 -1
- package/web-ui/build/static/velocity-D7sc5ggA.js +0 -1
- package/web-ui/build/static/verilog-BWJfMIng.js +0 -1
- package/web-ui/build/static/verilog-jW2GPC--.js +0 -1
- package/web-ui/build/static/vhdl-BIVlXRPa.js +0 -1
- package/web-ui/build/static/vhdl-BeqdhhxD.js +0 -1
- package/web-ui/build/static/vim-712lI4-g.js +0 -1
- package/web-ui/build/static/vim-DMROTzr0.js +0 -1
- package/web-ui/build/static/visual-basic-CQfbM-ta.js +0 -1
- package/web-ui/build/static/warpscript-DFAvCXFQ.js +0 -1
- package/web-ui/build/static/wasm-CiYoxBl0.js +0 -1
- package/web-ui/build/static/web-idl-DoCkPK8y.js +0 -1
- package/web-ui/build/static/wiki-bvz0AGzB.js +0 -1
- package/web-ui/build/static/wolfram-fBuyFEgU.js +0 -1
- package/web-ui/build/static/wren-DvATFxjF.js +0 -1
- package/web-ui/build/static/x86asm-r4bPbUR_.js +0 -1
- package/web-ui/build/static/xeora-B6iOnDJY.js +0 -1
- package/web-ui/build/static/xl-Ce6B5slc.js +0 -1
- package/web-ui/build/static/xml-DNjyPmhQ.js +0 -1
- package/web-ui/build/static/xml-doc-DydogmZD.js +0 -1
- package/web-ui/build/static/xojo-DCQLltvr.js +0 -1
- package/web-ui/build/static/xquery-C-fAnA0H.js +0 -1
- package/web-ui/build/static/xquery-CNeqzhLO.js +0 -1
- package/web-ui/build/static/yaml-BsVaGsk5.js +0 -1
- package/web-ui/build/static/yaml-kVZvwv_C.js +0 -1
- package/web-ui/build/static/yang-B_gq9JEq.js +0 -1
- package/web-ui/build/static/zephir-ECIXgXhX.js +0 -1
- package/web-ui/build/static/zig-DY325EKG.js +0 -1
package/src/tools/memoryTool.js
CHANGED
|
@@ -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
|
-
"
|
|
107
|
-
|
|
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
|
-
"
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
"
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
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
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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 (
|
|
457
|
-
case 'add':
|
|
458
|
-
|
|
459
|
-
case '
|
|
460
|
-
|
|
461
|
-
case '
|
|
462
|
-
|
|
463
|
-
case '
|
|
464
|
-
|
|
465
|
-
case '
|
|
466
|
-
|
|
467
|
-
case '
|
|
468
|
-
|
|
469
|
-
case '
|
|
470
|
-
|
|
471
|
-
case '
|
|
472
|
-
|
|
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: ${
|
|
608
|
+
throw new Error(`Unknown memory action: ${type}`);
|
|
475
609
|
}
|
|
476
610
|
} catch (error) {
|
|
477
|
-
this.logger?.error(`Memory tool
|
|
611
|
+
this.logger?.error(`Memory tool action failed: ${error.message}`, {
|
|
478
612
|
agentId,
|
|
479
|
-
|
|
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 {
|