onbuzz 4.1.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/core/__tests__/agentPoolToolConfig.test.js +191 -0
- package/src/core/__tests__/agentPoolWakeOnMessage.test.js +315 -0
- package/src/core/__tests__/messageProcessor.test.js +42 -0
- package/src/core/__tests__/orchestrator.test.js +22 -6
- package/src/core/agentPool.js +118 -25
- package/src/core/agentScheduler.js +28 -4
- package/src/core/messageProcessor.js +19 -1
- package/src/core/orchestrator.js +13 -6
- package/src/interfaces/__tests__/galleryRoutes.test.js +219 -0
- package/src/interfaces/__tests__/videoJobsRoutes.test.js +179 -0
- package/src/interfaces/webServer.js +220 -2
- package/src/services/__tests__/agentActivityService.test.js +83 -0
- package/src/services/__tests__/aiService.reasoningTokens.test.js +66 -0
- package/src/services/__tests__/aiService.stream.test.js +305 -0
- package/src/services/__tests__/channelFilter.test.js +4 -2
- package/src/services/__tests__/channelRelay.integration.test.js +1 -1
- package/src/services/__tests__/conversationQuery.reasoning.test.js +102 -0
- package/src/services/__tests__/galleryService.test.js +225 -0
- package/src/services/__tests__/toolCallBridgeContract.test.js +127 -0
- package/src/services/agentActivityService.js +25 -4
- package/src/services/aiService.js +180 -91
- package/src/services/conversationQuery.js +26 -0
- package/src/services/galleryService.js +257 -0
- package/src/tools/__tests__/agentCommunicationTool.test.js +114 -0
- package/src/tools/__tests__/baseTool.getEffectiveConfig.test.js +77 -0
- package/src/tools/__tests__/baseTool.test.js +471 -420
- package/src/tools/__tests__/filesystemTool.test.js +98 -0
- package/src/tools/__tests__/imageTool.sizeValidation.test.js +134 -0
- package/src/tools/__tests__/imageTool.validator.test.js +194 -0
- package/src/tools/__tests__/memoryTool.reminisce.test.js +33 -0
- package/src/tools/__tests__/terminalTool.test.js +64 -0
- package/src/tools/__tests__/videoTool.jobs.test.js +147 -0
- package/src/tools/__tests__/webTool.perAgentConfig.test.js +94 -0
- package/src/tools/agentCommunicationTool.js +33 -22
- package/src/tools/baseTool.js +980 -899
- package/src/tools/fileSystemTool.js +76 -2
- package/src/tools/imageTool.js +282 -44
- package/src/tools/memoryTool.js +4 -0
- package/src/tools/taskManagerTool.js +13 -2
- package/src/tools/terminalTool.js +62 -2
- package/src/tools/videoTool.js +126 -0
- package/src/tools/webTool.js +65 -1
- package/src/utilities/__tests__/logger.safeStringify.test.js +124 -0
- package/src/utilities/logger.js +51 -7
- package/src/utilities/userDataDir.js +3 -0
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-BdLpzMAL.js +1 -0
- package/web-ui/build/static/abap-CDwRvs0G.js +1 -0
- package/web-ui/build/static/abnf-BI7p3j5a.js +1 -0
- package/web-ui/build/static/abnf-CNv3r7Uy.js +1 -0
- package/web-ui/build/static/accesslog-C06B6TeF.js +1 -0
- package/web-ui/build/static/actionscript-4rvU1xh_.js +1 -0
- package/web-ui/build/static/actionscript-hzeSNpz-.js +1 -0
- package/web-ui/build/static/ada-BKQHlNbk.js +1 -0
- package/web-ui/build/static/ada-C-cG6Cnx.js +1 -0
- package/web-ui/build/static/agda-BLGp6bzV.js +1 -0
- package/web-ui/build/static/al-D1v7f7zb.js +1 -0
- package/web-ui/build/static/angelscript-C6fH5Phl.js +1 -0
- package/web-ui/build/static/antlr4-CkeL19Pe.js +1 -0
- package/web-ui/build/static/apache-JdORoIBq.js +1 -0
- package/web-ui/build/static/apacheconf-CapiFi2H.js +1 -0
- package/web-ui/build/static/apex-B9woB7hA.js +1 -0
- package/web-ui/build/static/apl-lmFlegeo.js +1 -0
- package/web-ui/build/static/applescript-BHhW-aLP.js +1 -0
- package/web-ui/build/static/applescript-ss_o-t9Q.js +1 -0
- package/web-ui/build/static/aql-BLNeECob.js +1 -0
- package/web-ui/build/static/arcade-CFXIdOiD.js +1 -0
- package/web-ui/build/static/arduino-BnvFM4Uv.js +1 -0
- package/web-ui/build/static/arduino-COqLsxBH.js +1 -0
- package/web-ui/build/static/arff-D29LT0W3.js +1 -0
- package/web-ui/build/static/armasm-4vnDbtEO.js +1 -0
- package/web-ui/build/static/asciidoc-B5enjW-U.js +1 -0
- package/web-ui/build/static/asciidoc-DXDLuzat.js +1 -0
- package/web-ui/build/static/asm6502-BlmY96A-.js +1 -0
- package/web-ui/build/static/asmatmel-DsTJaam3.js +1 -0
- package/web-ui/build/static/aspectj-CWKdyALZ.js +1 -0
- package/web-ui/build/static/aspnet-BMb5ovzr.js +1 -0
- package/web-ui/build/static/autohotkey-Bnt4L8Sq.js +1 -0
- package/web-ui/build/static/autohotkey-FJP6t7LP.js +1 -0
- package/web-ui/build/static/autoit-D_uma-t5.js +1 -0
- package/web-ui/build/static/autoit-tV1DvCag.js +1 -0
- package/web-ui/build/static/avisynth-C3EGWRqZ.js +1 -0
- package/web-ui/build/static/avrasm-SPYupzKN.js +1 -0
- package/web-ui/build/static/avro-idl-BVy35bGz.js +1 -0
- package/web-ui/build/static/awk-bd20WYWO.js +1 -0
- package/web-ui/build/static/axapta-rMrFdrRa.js +1 -0
- package/web-ui/build/static/bash-B6JbRSpw.js +1 -0
- package/web-ui/build/static/bash-CjDn8CS1.js +1 -0
- package/web-ui/build/static/basic-1cr_KdjO.js +1 -0
- package/web-ui/build/static/basic-VjzNgL1A.js +1 -0
- package/web-ui/build/static/batch-xKrSAbnh.js +1 -0
- package/web-ui/build/static/bbcode-D_oXQoMX.js +1 -0
- package/web-ui/build/static/bicep-DHCLyehu.js +1 -0
- package/web-ui/build/static/birb-LnKeXfOt.js +1 -0
- package/web-ui/build/static/bison-D1Y9rGkL.js +1 -0
- package/web-ui/build/static/bnf-Dmfxl80x.js +1 -0
- package/web-ui/build/static/bnf-Dr4hlA3O.js +1 -0
- package/web-ui/build/static/brainfuck-BLTIahWA.js +1 -0
- package/web-ui/build/static/brainfuck-DfZP16Cx.js +1 -0
- package/web-ui/build/static/brightscript-YT7Nr8GN.js +1 -0
- package/web-ui/build/static/bro-Cn2KhPkj.js +1 -0
- package/web-ui/build/static/bsl-DFyeWkvL.js +1 -0
- package/web-ui/build/static/c-B8jd4ks-.js +1 -0
- package/web-ui/build/static/c-CTVZoi8i.js +1 -0
- package/web-ui/build/static/c-like-BYR8sR5E.js +1 -0
- package/web-ui/build/static/cal-D7KqKxTg.js +1 -0
- package/web-ui/build/static/capnproto-Bl9dDXU4.js +1 -0
- package/web-ui/build/static/ceylon-DrCHmREL.js +1 -0
- package/web-ui/build/static/cfscript-C0sNdmMo.js +1 -0
- package/web-ui/build/static/chaiscript-LgrVMZR5.js +1 -0
- package/web-ui/build/static/cil-CCNfQAo8.js +1 -0
- package/web-ui/build/static/clean-DDw0s_-o.js +1 -0
- package/web-ui/build/static/clojure-BFxsxcbQ.js +1 -0
- package/web-ui/build/static/clojure-BgMU8fA8.js +1 -0
- package/web-ui/build/static/clojure-repl-C174HUrZ.js +1 -0
- package/web-ui/build/static/cmake-C6hjTvGt.js +1 -0
- package/web-ui/build/static/cmake-CcnmaxXV.js +1 -0
- package/web-ui/build/static/cobol-DiLCdCf7.js +1 -0
- package/web-ui/build/static/coffeescript-CGB29Opz.js +1 -0
- package/web-ui/build/static/coffeescript-DV3V4J6g.js +1 -0
- package/web-ui/build/static/concurnas-Cgdt5ES1.js +1 -0
- package/web-ui/build/static/coq-BbiJDyLq.js +1 -0
- package/web-ui/build/static/coq-DvsBabEJ.js +1 -0
- package/web-ui/build/static/cos-B7_pvH_X.js +1 -0
- package/web-ui/build/static/cpp-416w6yHT.js +1 -0
- package/web-ui/build/static/cpp-pz382MTt.js +1 -0
- package/web-ui/build/static/crmsh-BeYTFuCW.js +1 -0
- package/web-ui/build/static/crystal-BRtDR8RG.js +1 -0
- package/web-ui/build/static/crystal-BZJgl_sw.js +1 -0
- package/web-ui/build/static/csharp-BQ-0v8VA.js +1 -0
- package/web-ui/build/static/csharp-MlHfKRW4.js +1 -0
- package/web-ui/build/static/cshtml-DtS0T24q.js +1 -0
- package/web-ui/build/static/csp-6DGTWGnA.js +1 -0
- package/web-ui/build/static/csp-CvvAXfUJ.js +1 -0
- package/web-ui/build/static/css-DJmvg-kI.js +1 -0
- package/web-ui/build/static/css-extras-qVKXZ1K5.js +1 -0
- package/web-ui/build/static/csv-HN89Dabm.js +1 -0
- package/web-ui/build/static/cypher-zqUo_NN4.js +1 -0
- package/web-ui/build/static/d-BDzMr17q.js +1 -0
- package/web-ui/build/static/d-DV4MmaJ0.js +1 -0
- package/web-ui/build/static/dart-BFkAPQxN.js +1 -0
- package/web-ui/build/static/dart-mlgsSLDz.js +1 -0
- package/web-ui/build/static/dataweave-BQWIxcgu.js +1 -0
- package/web-ui/build/static/dax-FY1jMN3E.js +1 -0
- package/web-ui/build/static/delphi-D85b-0Yr.js +1 -0
- package/web-ui/build/static/dhall-C8db-g46.js +1 -0
- package/web-ui/build/static/diff-BHBVMWZm.js +1 -0
- package/web-ui/build/static/diff-Bet-lyrd.js +1 -0
- package/web-ui/build/static/django-CFm4coNe.js +1 -0
- package/web-ui/build/static/django-DN9SMkSp.js +1 -0
- package/web-ui/build/static/dns-C4yo4DHG.js +1 -0
- package/web-ui/build/static/dns-zone-file-B3o4w8rf.js +1 -0
- package/web-ui/build/static/docker-BxxsATcw.js +1 -0
- package/web-ui/build/static/dockerfile-BKIud8Xh.js +1 -0
- package/web-ui/build/static/dos-G9yNAV_a.js +1 -0
- package/web-ui/build/static/dot-CdN-GBnW.js +1 -0
- package/web-ui/build/static/dsconfig-DZ5R9lQR.js +1 -0
- package/web-ui/build/static/dts-DwetpYRu.js +1 -0
- package/web-ui/build/static/dust-DzEHgUuI.js +1 -0
- package/web-ui/build/static/ebnf-COJZCCYQ.js +1 -0
- package/web-ui/build/static/ebnf-CkdHWCBJ.js +1 -0
- package/web-ui/build/static/editorconfig-Bd3ywZZQ.js +1 -0
- package/web-ui/build/static/eiffel-C1Qk3pq5.js +1 -0
- package/web-ui/build/static/ejs-DxCI_S1L.js +1 -0
- package/web-ui/build/static/elixir-BIIHBb4p.js +1 -0
- package/web-ui/build/static/elixir-Cs4wFfMY.js +1 -0
- package/web-ui/build/static/elm-CXqZthrB.js +1 -0
- package/web-ui/build/static/elm-DBguvIDg.js +1 -0
- package/web-ui/build/static/erb-BPbVhlMt.js +1 -0
- package/web-ui/build/static/erb-DvRAcKbN.js +1 -0
- package/web-ui/build/static/erlang-BUKDJMhm.js +1 -0
- package/web-ui/build/static/erlang-iWD1_psr.js +1 -0
- package/web-ui/build/static/erlang-repl-CjXC9U4C.js +1 -0
- package/web-ui/build/static/etlua-nQ8GCNAu.js +1 -0
- package/web-ui/build/static/excel-D8YfiDAv.js +1 -0
- package/web-ui/build/static/excel-formula-CdZZRE7Y.js +1 -0
- package/web-ui/build/static/factor-wiNoX051.js +1 -0
- package/web-ui/build/static/false-CsZdI-HD.js +1 -0
- package/web-ui/build/static/firestore-security-rules-9yXT_i-6.js +1 -0
- package/web-ui/build/static/fix-BsV5RZTa.js +1 -0
- package/web-ui/build/static/flix-rATD1-Qx.js +1 -0
- package/web-ui/build/static/flow-B4UMzoDr.js +1 -0
- package/web-ui/build/static/fortran-CavcrRz8.js +1 -0
- package/web-ui/build/static/fortran-DVZjWi__.js +1 -0
- package/web-ui/build/static/fsharp-BCVsmzkR.js +1 -0
- package/web-ui/build/static/fsharp-Cj6zPGzQ.js +1 -0
- package/web-ui/build/static/ftl-C5VdFKkz.js +1 -0
- package/web-ui/build/static/gams-CT90XmM8.js +1 -0
- package/web-ui/build/static/gap-Ch518Ngd.js +1 -0
- package/web-ui/build/static/gauss-DTmMb1xB.js +1 -0
- package/web-ui/build/static/gcode-BLc6YjFp.js +1 -0
- package/web-ui/build/static/gcode-DYtkCbZZ.js +1 -0
- package/web-ui/build/static/gdscript-xrcGCBEi.js +1 -0
- package/web-ui/build/static/gedcom-DMOuE70a.js +1 -0
- package/web-ui/build/static/gherkin-BoEzs1SS.js +1 -0
- package/web-ui/build/static/gherkin-DHanA7dz.js +1 -0
- package/web-ui/build/static/git-BwT7p7t_.js +1 -0
- package/web-ui/build/static/glsl-C3_TTBJ-.js +1 -0
- package/web-ui/build/static/glsl-Do3cCE-W.js +1 -0
- package/web-ui/build/static/gml-CWSUBiZ2.js +1 -0
- package/web-ui/build/static/gml-wrCAzzgE.js +1 -0
- package/web-ui/build/static/gn-DqmZ0Qq_.js +1 -0
- package/web-ui/build/static/go-DLiparlr.js +1 -0
- package/web-ui/build/static/go-i67Zsx3x.js +1 -0
- package/web-ui/build/static/go-module-S33FcrvV.js +1 -0
- package/web-ui/build/static/golo-DZ7qHIok.js +1 -0
- package/web-ui/build/static/gradle-BTVIAud8.js +1 -0
- package/web-ui/build/static/graphql-BRc7dV6d.js +1 -0
- package/web-ui/build/static/groovy-C0xCDIoi.js +1 -0
- package/web-ui/build/static/groovy-CqfENDj5.js +1 -0
- package/web-ui/build/static/haml-DGEmWQaf.js +1 -0
- package/web-ui/build/static/haml-Uc13XeLh.js +1 -0
- package/web-ui/build/static/handlebars-2pDOu-qZ.js +1 -0
- package/web-ui/build/static/handlebars-fvNs6C2z.js +1 -0
- package/web-ui/build/static/haskell-C_0PdpI7.js +1 -0
- package/web-ui/build/static/haskell-DPiywQAr.js +1 -0
- package/web-ui/build/static/haxe-B-Jmpi4X.js +1 -0
- package/web-ui/build/static/haxe-BnwqHNBF.js +1 -0
- package/web-ui/build/static/hcl-BkCp99Ns.js +1 -0
- package/web-ui/build/static/hlsl-Dhtz76rF.js +1 -0
- package/web-ui/build/static/hoon-DLvY-xJE.js +1 -0
- package/web-ui/build/static/hpkp-DqGdkrWa.js +1 -0
- package/web-ui/build/static/hsp-uyhbGChx.js +1 -0
- package/web-ui/build/static/hsts-B_hdMfTA.js +1 -0
- package/web-ui/build/static/htmlbars-DBm6s2XZ.js +1 -0
- package/web-ui/build/static/http-BJx-7pVa.js +1 -0
- package/web-ui/build/static/http-BNr6-Kd5.js +1 -0
- package/web-ui/build/static/hy-CCeD6Z5O.js +1 -0
- package/web-ui/build/static/ichigojam-HlQ9_0Cd.js +1 -0
- package/web-ui/build/static/icon-BVRGWnBS.js +1 -0
- package/web-ui/build/static/icu-message-format-DrOF-VCL.js +1 -0
- package/web-ui/build/static/idris-BTtsUKQZ.js +1 -0
- package/web-ui/build/static/iecst-C8fkotHg.js +1 -0
- package/web-ui/build/static/ignore-9L0_iQf0.js +1 -0
- package/web-ui/build/static/index-5biw7ctT.js +1 -0
- package/web-ui/build/static/index-C6XLF9dS.js +734 -0
- package/web-ui/build/static/index-CTO5ggyx.css +1 -0
- package/web-ui/build/static/index-CU7QxI6e.js +13 -0
- package/web-ui/build/static/inform7-DrLS7QKe.js +1 -0
- package/web-ui/build/static/inform7-GeduJ02-.js +1 -0
- package/web-ui/build/static/ini-ClRWklj4.js +1 -0
- package/web-ui/build/static/ini-CnWkQt74.js +1 -0
- package/web-ui/build/static/io-DLrwKpJi.js +1 -0
- package/web-ui/build/static/irpf90-D2n0wokI.js +1 -0
- package/web-ui/build/static/isbl-DF3cf2zG.js +1 -0
- package/web-ui/build/static/j-DFQ008Ab.js +1 -0
- package/web-ui/build/static/java-BXn0NYGW.js +1 -0
- package/web-ui/build/static/java-DwyOtG2R.js +1 -0
- package/web-ui/build/static/javadoc-7lKDS9yO.js +1 -0
- package/web-ui/build/static/javadoclike-UZC5a-I2.js +1 -0
- package/web-ui/build/static/javascript-BVwVipxy.js +1 -0
- package/web-ui/build/static/javastacktrace-Dysb6pma.js +1 -0
- package/web-ui/build/static/jboss-cli-DnBJbhvD.js +1 -0
- package/web-ui/build/static/jexl-Xt80RITf.js +1 -0
- package/web-ui/build/static/jolie-K583lEAy.js +1 -0
- package/web-ui/build/static/jq-DzZu56Cz.js +1 -0
- package/web-ui/build/static/js-extras-Cnbo_FPE.js +1 -0
- package/web-ui/build/static/js-templates-ChGVoxvZ.js +1 -0
- package/web-ui/build/static/jsdoc-7PKg08vo.js +1 -0
- package/web-ui/build/static/json-CS8btz_1.js +1 -0
- package/web-ui/build/static/json-NWyA8Y-S.js +1 -0
- package/web-ui/build/static/json5-BTuuCOka.js +1 -0
- package/web-ui/build/static/jsonp-CddCenzG.js +1 -0
- package/web-ui/build/static/jsstacktrace-Iz7J77qQ.js +1 -0
- package/web-ui/build/static/jsx-KHA4XV99.js +1 -0
- package/web-ui/build/static/julia-DBE7YTR3.js +1 -0
- package/web-ui/build/static/julia-DhbxCJBI.js +1 -0
- package/web-ui/build/static/julia-repl-DMdm1IG1.js +1 -0
- package/web-ui/build/static/keepalived-B7vqYV9X.js +1 -0
- package/web-ui/build/static/keyman-BgxIO8fq.js +1 -0
- package/web-ui/build/static/kotlin-DkKt1c_W.js +1 -0
- package/web-ui/build/static/kotlin-DkVwHXV3.js +1 -0
- package/web-ui/build/static/kumir-ByisfWMX.js +1 -0
- package/web-ui/build/static/kusto-D0PVadiC.js +1 -0
- package/web-ui/build/static/lasso-DUqlKJ-V.js +1 -0
- package/web-ui/build/static/latex-B_KNiR3P.js +1 -0
- package/web-ui/build/static/latex-CAna5qNt.js +1 -0
- package/web-ui/build/static/latte-IGkHLrSc.js +1 -0
- package/web-ui/build/static/ldif-COEZfOAo.js +1 -0
- package/web-ui/build/static/leaf-zSqkBknP.js +1 -0
- package/web-ui/build/static/less-BZ7CLYuK.js +1 -0
- package/web-ui/build/static/less-DTOaHWfJ.js +1 -0
- package/web-ui/build/static/lilypond-CXVSkLeK.js +1 -0
- package/web-ui/build/static/liquid-C-anTr0A.js +1 -0
- package/web-ui/build/static/lisp-CadxWoyo.js +1 -0
- package/web-ui/build/static/lisp-hkvi2iDB.js +1 -0
- package/web-ui/build/static/livecodeserver-CHrsuOkQ.js +1 -0
- package/web-ui/build/static/livescript-B3gz-3aB.js +1 -0
- package/web-ui/build/static/livescript-DnHL9ghu.js +1 -0
- package/web-ui/build/static/llvm-BahggCBp.js +1 -0
- package/web-ui/build/static/llvm-CmHdko4Y.js +1 -0
- package/web-ui/build/static/log-Czikd_pI.js +1 -0
- package/web-ui/build/static/lolcode-Ch49C9Zh.js +1 -0
- package/web-ui/build/static/lsl-C-VWBCeP.js +1 -0
- package/web-ui/build/static/lua-CUvtI6AS.js +1 -0
- package/web-ui/build/static/lua-z6ZTYh0E.js +1 -0
- package/web-ui/build/static/magma-n2Gm1_JJ.js +1 -0
- package/web-ui/build/static/makefile-CV719aL9.js +1 -0
- package/web-ui/build/static/makefile-D3XU9qyi.js +1 -0
- package/web-ui/build/static/markdown-B7ecawDo.js +1 -0
- package/web-ui/build/static/markdown-BAZuKAWm.js +1 -0
- package/web-ui/build/static/markup-templating-CkJ0kvIz.js +1 -0
- package/web-ui/build/static/mathematica-DeYzfKBj.js +1 -0
- package/web-ui/build/static/matlab-CkL4qFcf.js +1 -0
- package/web-ui/build/static/matlab-DyeBcYxN.js +1 -0
- package/web-ui/build/static/maxima-BYkoTgQQ.js +1 -0
- package/web-ui/build/static/maxscript-DF4yyx_y.js +1 -0
- package/web-ui/build/static/mel-Cvinm-ul.js +1 -0
- package/web-ui/build/static/mel-DuhIFj6N.js +1 -0
- package/web-ui/build/static/mercury-BgIQH4Io.js +1 -0
- package/web-ui/build/static/mermaid-Cu_HXPUU.js +1 -0
- package/web-ui/build/static/mipsasm-Bgjx3kJk.js +1 -0
- package/web-ui/build/static/mizar-D6qzNoqS.js +1 -0
- package/web-ui/build/static/mizar-_PkxIqXq.js +1 -0
- package/web-ui/build/static/mojolicious-DUGLQPxV.js +1 -0
- package/web-ui/build/static/mongodb-BLMBcuTL.js +1 -0
- package/web-ui/build/static/monkey-C5k7PFu0.js +1 -0
- package/web-ui/build/static/monkey-DXGsKsbX.js +1 -0
- package/web-ui/build/static/moonscript-1TthCNMT.js +1 -0
- package/web-ui/build/static/moonscript-DqJs0-Md.js +1 -0
- package/web-ui/build/static/n1ql-Bwd4nK-7.js +1 -0
- package/web-ui/build/static/n1ql-hfjCkL2y.js +1 -0
- package/web-ui/build/static/n4js-gwCvxndi.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-CRRkn3L9.js +1 -0
- package/web-ui/build/static/naniscript-C_wnlSUo.js +1 -0
- package/web-ui/build/static/nasm-DX-Dob1L.js +1 -0
- package/web-ui/build/static/neon-vJIHxlBH.js +1 -0
- package/web-ui/build/static/nevod-Bax1uE4z.js +1 -0
- package/web-ui/build/static/nginx-BQS7w2F8.js +1 -0
- package/web-ui/build/static/nginx-Bt8431vM.js +1 -0
- package/web-ui/build/static/nim-0PFojGir.js +1 -0
- package/web-ui/build/static/nim-BQVxzPdc.js +1 -0
- package/web-ui/build/static/nix-C1td4KJd.js +1 -0
- package/web-ui/build/static/nix-CGOaQ4S_.js +1 -0
- package/web-ui/build/static/node-repl-BsAGA-kF.js +1 -0
- package/web-ui/build/static/nsis-B8d23hVv.js +1 -0
- package/web-ui/build/static/nsis-CRfGDpKw.js +1 -0
- package/web-ui/build/static/objectivec-CVrobj9V.js +1 -0
- package/web-ui/build/static/objectivec-DcVwp8g9.js +1 -0
- package/web-ui/build/static/ocaml-b8Cm2pBQ.js +1 -0
- package/web-ui/build/static/ocaml-mP-4C0uB.js +1 -0
- package/web-ui/build/static/opencl--Qo9pjSM.js +1 -0
- package/web-ui/build/static/openqasm-Dt7vKzox.js +1 -0
- package/web-ui/build/static/openscad-By-SEqIm.js +1 -0
- package/web-ui/build/static/oxygene-BifGHmAP.js +1 -0
- package/web-ui/build/static/oz-DHXFoY_V.js +1 -0
- package/web-ui/build/static/parigp-CQEx84-o.js +1 -0
- package/web-ui/build/static/parser-DevuQ_YA.js +1 -0
- package/web-ui/build/static/parser3-IBmULMjM.js +1 -0
- package/web-ui/build/static/pascal-hHG_VNBq.js +1 -0
- package/web-ui/build/static/pascaligo-DcXZnXMD.js +1 -0
- package/web-ui/build/static/pcaxis-paqvl2ov.js +1 -0
- package/web-ui/build/static/peoplecode-T-lVjo6Q.js +1 -0
- package/web-ui/build/static/perl-BrrOfxJA.js +1 -0
- package/web-ui/build/static/perl-DwF9DDkX.js +1 -0
- package/web-ui/build/static/pf-CCvQZiY2.js +1 -0
- package/web-ui/build/static/pgsql-DYZXTARb.js +1 -0
- package/web-ui/build/static/php-C8P7LrqU.js +1 -0
- package/web-ui/build/static/php-Jh4xpwhM.js +1 -0
- package/web-ui/build/static/php-extras-Ddj6zZ2a.js +1 -0
- package/web-ui/build/static/php-template-D0846ZMl.js +1 -0
- package/web-ui/build/static/phpdoc-DU8hHiT4.js +1 -0
- package/web-ui/build/static/plaintext-BpAdoq1j.js +1 -0
- package/web-ui/build/static/plsql-DjRpUwV7.js +1 -0
- package/web-ui/build/static/pony-C91UDOZB.js +1 -0
- package/web-ui/build/static/powerquery-CbFt66kY.js +1 -0
- package/web-ui/build/static/powershell-Bpd_CmgV.js +1 -0
- package/web-ui/build/static/powershell-C0-63tFn.js +1 -0
- package/web-ui/build/static/processing-COoELNkd.js +1 -0
- package/web-ui/build/static/processing-DovufXGj.js +1 -0
- package/web-ui/build/static/profile-DSijKis_.js +1 -0
- package/web-ui/build/static/prolog-BPJoWbIS.js +1 -0
- package/web-ui/build/static/prolog-Cs4I3Exr.js +1 -0
- package/web-ui/build/static/promql-aIfsISjo.js +1 -0
- package/web-ui/build/static/properties-DWHgjzpz.js +1 -0
- package/web-ui/build/static/properties-k4Dmn8BE.js +1 -0
- package/web-ui/build/static/protobuf-HvnZbIjE.js +1 -0
- package/web-ui/build/static/protobuf-bqbMMmGn.js +1 -0
- package/web-ui/build/static/psl-KbjBRrbA.js +1 -0
- package/web-ui/build/static/pug-DJVp_q_q.js +1 -0
- package/web-ui/build/static/puppet-DloEWvDZ.js +1 -0
- package/web-ui/build/static/puppet-WFgyaopG.js +1 -0
- package/web-ui/build/static/pure-483zjlGE.js +1 -0
- package/web-ui/build/static/purebasic-CZ8DdKkF.js +1 -0
- package/web-ui/build/static/purebasic-dlQReKmz.js +1 -0
- package/web-ui/build/static/purescript-BQnFvaU3.js +1 -0
- package/web-ui/build/static/python-CZ8lWs1l.js +1 -0
- package/web-ui/build/static/python-SU3ESoh4.js +1 -0
- package/web-ui/build/static/python-repl-BBkzrvQe.js +1 -0
- package/web-ui/build/static/q-DTmVFt9r.js +1 -0
- package/web-ui/build/static/q-DtzT8sxS.js +1 -0
- package/web-ui/build/static/qml-B5F36arQ.js +1 -0
- package/web-ui/build/static/qml-BGRIPpl3.js +1 -0
- package/web-ui/build/static/qore-CRS2zeE4.js +1 -0
- package/web-ui/build/static/qsharp-C4Tv2HNI.js +1 -0
- package/web-ui/build/static/r-BrIQscI_.js +1 -0
- package/web-ui/build/static/r-C1dTwrK3.js +1 -0
- package/web-ui/build/static/racket-CY5XtMxt.js +1 -0
- package/web-ui/build/static/reason-BOspKOui.js +1 -0
- package/web-ui/build/static/reasonml-CI0bWekr.js +1 -0
- package/web-ui/build/static/regex-Bu9fRM2h.js +1 -0
- package/web-ui/build/static/rego-DPs1L6rM.js +1 -0
- package/web-ui/build/static/renpy-CqxG8TUa.js +1 -0
- package/web-ui/build/static/rest-DVBf_JOU.js +1 -0
- package/web-ui/build/static/rib-C7f1MpLJ.js +1 -0
- package/web-ui/build/static/rip-CnDVKjn3.js +1 -0
- package/web-ui/build/static/roboconf-B3CDWS-p.js +1 -0
- package/web-ui/build/static/roboconf-Cl96yvBS.js +1 -0
- package/web-ui/build/static/robotframework-BitHYBrT.js +1 -0
- package/web-ui/build/static/routeros-CfrP9irD.js +1 -0
- package/web-ui/build/static/rsl-CGblvP8t.js +1 -0
- package/web-ui/build/static/ruby-CJyKAxoz.js +1 -0
- package/web-ui/build/static/ruby-KT7L0c-N.js +1 -0
- package/web-ui/build/static/ruleslanguage-_MWgFm9V.js +1 -0
- package/web-ui/build/static/rust-DAiMZG-s.js +1 -0
- package/web-ui/build/static/rust-Dmpa9JNg.js +1 -0
- package/web-ui/build/static/sas-CQltIY6v.js +1 -0
- package/web-ui/build/static/sas-aM67MfcZ.js +1 -0
- package/web-ui/build/static/sass-DEBoFRRa.js +1 -0
- package/web-ui/build/static/scala-Cd5U29aY.js +1 -0
- package/web-ui/build/static/scala-DzaGwcFi.js +1 -0
- package/web-ui/build/static/scheme-Cqqy_i9p.js +1 -0
- package/web-ui/build/static/scheme-cIT7gYIT.js +1 -0
- package/web-ui/build/static/scilab-DkyaqVYN.js +1 -0
- package/web-ui/build/static/scss-Cyi-dRZB.js +1 -0
- package/web-ui/build/static/scss-D_mUdkix.js +1 -0
- package/web-ui/build/static/shell-BF_xfQdX.js +1 -0
- package/web-ui/build/static/shell-session-C4TwlI5u.js +1 -0
- package/web-ui/build/static/smali-CvYqcvZD.js +1 -0
- package/web-ui/build/static/smali-DdJm0lGk.js +1 -0
- package/web-ui/build/static/smalltalk-B4v_uFAj.js +1 -0
- package/web-ui/build/static/smalltalk-BHk9orPf.js +1 -0
- package/web-ui/build/static/smarty-DCURdYbE.js +1 -0
- package/web-ui/build/static/sml-BFUDbMt7.js +1 -0
- package/web-ui/build/static/sml-BIbfLMH_.js +1 -0
- package/web-ui/build/static/solidity-fyryqi43.js +1 -0
- package/web-ui/build/static/solution-file-DoPZY9rL.js +1 -0
- package/web-ui/build/static/soy-AjVmvggx.js +1 -0
- package/web-ui/build/static/sparql-C4-CLrDw.js +1 -0
- package/web-ui/build/static/splunk-spl-DclxQT5j.js +1 -0
- package/web-ui/build/static/sqf-CuCGayd3.js +1 -0
- package/web-ui/build/static/sqf-uK9OZDXX.js +1 -0
- package/web-ui/build/static/sql-B0Pqn1rt.js +1 -0
- package/web-ui/build/static/sql-DlNrMSaF.js +1 -0
- package/web-ui/build/static/sql_more-BmwYd1jA.js +1 -0
- package/web-ui/build/static/squirrel-PzIoP6WH.js +1 -0
- package/web-ui/build/static/stan-BZe07EwD.js +1 -0
- package/web-ui/build/static/stan-De1mVh5w.js +1 -0
- package/web-ui/build/static/stata-Dt6KIbHG.js +1 -0
- package/web-ui/build/static/step21-5If4hNHF.js +1 -0
- package/web-ui/build/static/stylus-Cfsl-liy.js +1 -0
- package/web-ui/build/static/stylus-V2q0pGFi.js +1 -0
- package/web-ui/build/static/subunit-Dw4nCzI8.js +1 -0
- package/web-ui/build/static/swift-CNMLwgfO.js +1 -0
- package/web-ui/build/static/swift-HUQ5YZQh.js +1 -0
- package/web-ui/build/static/systemd-C8DE2Z5C.js +1 -0
- package/web-ui/build/static/t4-cs-C_Ey5AJK.js +1 -0
- package/web-ui/build/static/t4-templating-DwnTc5zw.js +1 -0
- package/web-ui/build/static/t4-vb-C-0KWoPY.js +1 -0
- package/web-ui/build/static/taggerscript-Bv6_taGx.js +1 -0
- package/web-ui/build/static/tap-CFDvzug8.js +1 -0
- package/web-ui/build/static/tap-CdJ_Enrg.js +1 -0
- package/web-ui/build/static/tcl-BAEseFnT.js +1 -0
- package/web-ui/build/static/tcl-BS59XADk.js +1 -0
- package/web-ui/build/static/textile-a8y5rAtB.js +1 -0
- package/web-ui/build/static/thrift-D7V-eNGh.js +1 -0
- package/web-ui/build/static/toml-D8cwTEse.js +1 -0
- package/web-ui/build/static/tp-hIAhc2bK.js +1 -0
- package/web-ui/build/static/tremor-Czk4wryK.js +1 -0
- package/web-ui/build/static/tsx-BOeSrzC2.js +1 -0
- package/web-ui/build/static/tt2-BHVJTkSt.js +1 -0
- package/web-ui/build/static/turtle-BOWLWZq7.js +1 -0
- package/web-ui/build/static/twig-CiL22hfc.js +1 -0
- package/web-ui/build/static/twig-fnjh9nSd.js +1 -0
- package/web-ui/build/static/typescript-BXgo8AbH.js +1 -0
- package/web-ui/build/static/typescript-Bd_EcNlS.js +1 -0
- package/web-ui/build/static/typoscript-OvQoCcN-.js +1 -0
- package/web-ui/build/static/unrealscript-Dw9u3aN1.js +1 -0
- package/web-ui/build/static/uorazor-BYmWZy9R.js +1 -0
- package/web-ui/build/static/uri-cZEKPhfB.js +1 -0
- package/web-ui/build/static/v-DCUw5P5w.js +1 -0
- package/web-ui/build/static/vala-BeMIXdl5.js +1 -0
- package/web-ui/build/static/vala-Dchv0k-k.js +1 -0
- package/web-ui/build/static/vbnet-CYNUkFEn.js +1 -0
- package/web-ui/build/static/vbnet-DJpHrZ4P.js +1 -0
- package/web-ui/build/static/vbscript-html-eSFLndJq.js +1 -0
- package/web-ui/build/static/vbscript-uo6pZmjr.js +1 -0
- package/web-ui/build/static/velocity-BZ4IThJR.js +1 -0
- package/web-ui/build/static/verilog-CaEouCrk.js +1 -0
- package/web-ui/build/static/verilog-D_yjfQsL.js +1 -0
- package/web-ui/build/static/vhdl-3zobHypY.js +1 -0
- package/web-ui/build/static/vhdl-DfMoYPtq.js +1 -0
- package/web-ui/build/static/vim-DBVHHc5J.js +1 -0
- package/web-ui/build/static/vim-DillbvCO.js +1 -0
- package/web-ui/build/static/visual-basic-C7H7McST.js +1 -0
- package/web-ui/build/static/warpscript-BKjx-dEN.js +1 -0
- package/web-ui/build/static/wasm-AVgQyIgy.js +1 -0
- package/web-ui/build/static/web-idl-BNNIYzG6.js +1 -0
- package/web-ui/build/static/wiki-CLfpaX63.js +1 -0
- package/web-ui/build/static/wolfram-DUecju0s.js +1 -0
- package/web-ui/build/static/wren-DOzRaRuS.js +1 -0
- package/web-ui/build/static/x86asm-FxnmOy9a.js +1 -0
- package/web-ui/build/static/xeora-u3RdEzzL.js +1 -0
- package/web-ui/build/static/xl-DRkSDCgX.js +1 -0
- package/web-ui/build/static/xml-d39yV6YW.js +1 -0
- package/web-ui/build/static/xml-doc-CAsyFkZk.js +1 -0
- package/web-ui/build/static/xojo-C82wULba.js +1 -0
- package/web-ui/build/static/xquery-CdvxjAIl.js +1 -0
- package/web-ui/build/static/xquery-ClPcUh76.js +1 -0
- package/web-ui/build/static/yaml-C5_f2N79.js +1 -0
- package/web-ui/build/static/yaml-ZJm6Uydk.js +1 -0
- package/web-ui/build/static/yang-BR7aZNbT.js +1 -0
- package/web-ui/build/static/zephir-CnL3vXXJ.js +1 -0
- package/web-ui/build/static/zig-e5ovIuAu.js +1 -0
- package/web-ui/build/static/1c-D-8ReLUQ.js +0 -1
- package/web-ui/build/static/abap-NvrQD84d.js +0 -1
- package/web-ui/build/static/abnf-BxKbzF6d.js +0 -1
- package/web-ui/build/static/abnf-gQpmRWjd.js +0 -1
- package/web-ui/build/static/accesslog-BQLUo5Gi.js +0 -1
- package/web-ui/build/static/actionscript-3TeMZFpQ.js +0 -1
- package/web-ui/build/static/actionscript-w6DEnLr3.js +0 -1
- package/web-ui/build/static/ada-87XHdEXs.js +0 -1
- package/web-ui/build/static/ada-QztkYmC7.js +0 -1
- package/web-ui/build/static/agda-CUYeMLgB.js +0 -1
- package/web-ui/build/static/al-DrDn2-sA.js +0 -1
- package/web-ui/build/static/angelscript-D3Qw8kQa.js +0 -1
- package/web-ui/build/static/antlr4-CWEEpQ5q.js +0 -1
- package/web-ui/build/static/apache-Bme3xfdp.js +0 -1
- package/web-ui/build/static/apacheconf-BKOfs-cp.js +0 -1
- package/web-ui/build/static/apex-DswYOikL.js +0 -1
- package/web-ui/build/static/apl-CizhojF3.js +0 -1
- package/web-ui/build/static/applescript-D9M6q0r7.js +0 -1
- package/web-ui/build/static/applescript-DpP5T055.js +0 -1
- package/web-ui/build/static/aql-BqAlaha9.js +0 -1
- package/web-ui/build/static/arcade-DobNWm8j.js +0 -1
- package/web-ui/build/static/arduino-BeuGL09r.js +0 -1
- package/web-ui/build/static/arduino-BiF5cC7x.js +0 -1
- package/web-ui/build/static/arff-2H9PyLDr.js +0 -1
- package/web-ui/build/static/armasm-B6wc18B0.js +0 -1
- package/web-ui/build/static/asciidoc-DUF4xPDI.js +0 -1
- package/web-ui/build/static/asciidoc-TBH4m8SR.js +0 -1
- package/web-ui/build/static/asm6502-CzTI2B-y.js +0 -1
- package/web-ui/build/static/asmatmel-BYN0Xd3T.js +0 -1
- package/web-ui/build/static/aspectj-DXCMDgp7.js +0 -1
- package/web-ui/build/static/aspnet-lOvDpvP_.js +0 -1
- package/web-ui/build/static/autohotkey-CICk12uK.js +0 -1
- package/web-ui/build/static/autohotkey-DrG81PVL.js +0 -1
- package/web-ui/build/static/autoit-DFemtuhG.js +0 -1
- package/web-ui/build/static/autoit-D_K-jEWY.js +0 -1
- package/web-ui/build/static/avisynth-DOnmgjBO.js +0 -1
- package/web-ui/build/static/avrasm-rMDuGPFy.js +0 -1
- package/web-ui/build/static/avro-idl-CH5Xk5PQ.js +0 -1
- package/web-ui/build/static/awk-BvyFWX3C.js +0 -1
- package/web-ui/build/static/axapta-BWmF5MqT.js +0 -1
- package/web-ui/build/static/bash-Coyd2GnL.js +0 -1
- package/web-ui/build/static/bash-DSdj70Nv.js +0 -1
- package/web-ui/build/static/basic-CflyLZ31.js +0 -1
- package/web-ui/build/static/basic-Cs6QyVqS.js +0 -1
- package/web-ui/build/static/batch-DCDtzw83.js +0 -1
- package/web-ui/build/static/bbcode-MWdW7azN.js +0 -1
- package/web-ui/build/static/bicep-jQ4zhAw9.js +0 -1
- package/web-ui/build/static/birb-9f7Itiod.js +0 -1
- package/web-ui/build/static/bison-CIIUW5Cl.js +0 -1
- package/web-ui/build/static/bnf-B2w55bnT.js +0 -1
- package/web-ui/build/static/bnf-CUlbZGe7.js +0 -1
- package/web-ui/build/static/brainfuck-CaJZ1LRc.js +0 -1
- package/web-ui/build/static/brainfuck-eIkhMKej.js +0 -1
- package/web-ui/build/static/brightscript-BSLnJVmJ.js +0 -1
- package/web-ui/build/static/bro-YVCWDbPj.js +0 -1
- package/web-ui/build/static/bsl-Nm0_B_oa.js +0 -1
- package/web-ui/build/static/c-Dv7lr1UK.js +0 -1
- package/web-ui/build/static/c-like-C9IU26FO.js +0 -1
- package/web-ui/build/static/c-pfS3v02M.js +0 -1
- package/web-ui/build/static/cal-D4re7xDS.js +0 -1
- package/web-ui/build/static/capnproto-Dy75AQ6u.js +0 -1
- package/web-ui/build/static/ceylon-BNtjB2q0.js +0 -1
- package/web-ui/build/static/cfscript-8X2NpMn_.js +0 -1
- package/web-ui/build/static/chaiscript-CoXaTTY-.js +0 -1
- package/web-ui/build/static/cil-BluyliW6.js +0 -1
- package/web-ui/build/static/clean-Bj15gq3Q.js +0 -1
- package/web-ui/build/static/clojure-BH5xTDBp.js +0 -1
- package/web-ui/build/static/clojure-BqHsfJwr.js +0 -1
- package/web-ui/build/static/clojure-repl-B32b9bLV.js +0 -1
- package/web-ui/build/static/cmake-CyTE-1A0.js +0 -1
- package/web-ui/build/static/cmake-hiJ0lXa-.js +0 -1
- package/web-ui/build/static/cobol-BBnQUH8E.js +0 -1
- package/web-ui/build/static/coffeescript-BjrsNhLL.js +0 -1
- package/web-ui/build/static/coffeescript-C7WO1c8O.js +0 -1
- package/web-ui/build/static/concurnas-9EpupFAI.js +0 -1
- package/web-ui/build/static/coq-C-tt6nZE.js +0 -1
- package/web-ui/build/static/coq-CLCiqFzC.js +0 -1
- package/web-ui/build/static/cos-BQC1_Gov.js +0 -1
- package/web-ui/build/static/cpp-CH4XSTo7.js +0 -1
- package/web-ui/build/static/cpp-K8F2XScQ.js +0 -1
- package/web-ui/build/static/crmsh-DztNtPne.js +0 -1
- package/web-ui/build/static/crystal-kBqCeXtW.js +0 -1
- package/web-ui/build/static/crystal-sVG_HS9o.js +0 -1
- package/web-ui/build/static/csharp-4pb9Wc--.js +0 -1
- package/web-ui/build/static/csharp-D5QaxB-K.js +0 -1
- package/web-ui/build/static/cshtml-Cpytn-LL.js +0 -1
- package/web-ui/build/static/csp-BH6fPZVZ.js +0 -1
- package/web-ui/build/static/csp-WrjFExbk.js +0 -1
- package/web-ui/build/static/css-DJxZ20Kx.js +0 -1
- package/web-ui/build/static/css-extras-DwoO5sHq.js +0 -1
- package/web-ui/build/static/csv-DJb1XTwb.js +0 -1
- package/web-ui/build/static/cypher-CFN05H9J.js +0 -1
- package/web-ui/build/static/d-COFI-yfM.js +0 -1
- package/web-ui/build/static/d-DYHnLAnt.js +0 -1
- package/web-ui/build/static/dart-Bw35nKGj.js +0 -1
- package/web-ui/build/static/dart-C5gnqL08.js +0 -1
- package/web-ui/build/static/dataweave-DG_2euLu.js +0 -1
- package/web-ui/build/static/dax-BSpzdHUe.js +0 -1
- package/web-ui/build/static/delphi-Cl5NRXvZ.js +0 -1
- package/web-ui/build/static/dhall-CNefJtoo.js +0 -1
- package/web-ui/build/static/diff-DhqUs0Iy.js +0 -1
- package/web-ui/build/static/diff-KGSf4pWL.js +0 -1
- package/web-ui/build/static/django-5TgWQjd4.js +0 -1
- package/web-ui/build/static/django-DavZW8FP.js +0 -1
- package/web-ui/build/static/dns-CuF6RAET.js +0 -1
- package/web-ui/build/static/dns-zone-file-BcBMQ0BR.js +0 -1
- package/web-ui/build/static/docker-Dht8jS2j.js +0 -1
- package/web-ui/build/static/dockerfile-CjjL85ki.js +0 -1
- package/web-ui/build/static/dos-CVoaOHAQ.js +0 -1
- package/web-ui/build/static/dot-QcLwKXVK.js +0 -1
- package/web-ui/build/static/dsconfig-_1R6hLzq.js +0 -1
- package/web-ui/build/static/dts-B_Dzxmb6.js +0 -1
- package/web-ui/build/static/dust-xRpJXkxU.js +0 -1
- package/web-ui/build/static/ebnf-DPK9Hid-.js +0 -1
- package/web-ui/build/static/ebnf-OVlya1yQ.js +0 -1
- package/web-ui/build/static/editorconfig-CbCWWNal.js +0 -1
- package/web-ui/build/static/eiffel-CShmAG_u.js +0 -1
- package/web-ui/build/static/ejs-Dybq4vcI.js +0 -1
- package/web-ui/build/static/elixir-CzXoWmCJ.js +0 -1
- package/web-ui/build/static/elixir-DKVoqGbI.js +0 -1
- package/web-ui/build/static/elm-DfJge1Cy.js +0 -1
- package/web-ui/build/static/elm-wTttagz6.js +0 -1
- package/web-ui/build/static/erb-BqJOty-L.js +0 -1
- package/web-ui/build/static/erb-DEcQyddF.js +0 -1
- package/web-ui/build/static/erlang-DR0S8Dbq.js +0 -1
- package/web-ui/build/static/erlang-foLyt35P.js +0 -1
- package/web-ui/build/static/erlang-repl-KGaauP1D.js +0 -1
- package/web-ui/build/static/etlua-i5bjc318.js +0 -1
- package/web-ui/build/static/excel-Bxn-_4FK.js +0 -1
- package/web-ui/build/static/excel-formula-C3ittGUe.js +0 -1
- package/web-ui/build/static/factor-Cq9BFfPi.js +0 -1
- package/web-ui/build/static/false-Bq1Og8uV.js +0 -1
- package/web-ui/build/static/firestore-security-rules-BuWMvGkh.js +0 -1
- package/web-ui/build/static/fix-CJH3csBZ.js +0 -1
- package/web-ui/build/static/flix-DZVFkMZK.js +0 -1
- package/web-ui/build/static/flow-DGvt9eNT.js +0 -1
- package/web-ui/build/static/fortran-CRMIJaq3.js +0 -1
- package/web-ui/build/static/fortran-DYMWvRQk.js +0 -1
- package/web-ui/build/static/fsharp-DsngWUfx.js +0 -1
- package/web-ui/build/static/fsharp-iEMP2hGc.js +0 -1
- package/web-ui/build/static/ftl-6XZ6kVeO.js +0 -1
- package/web-ui/build/static/gams-BPxwyKlw.js +0 -1
- package/web-ui/build/static/gap-LiwKb7bd.js +0 -1
- package/web-ui/build/static/gauss-BMq9hJW2.js +0 -1
- package/web-ui/build/static/gcode-BhUKSjaC.js +0 -1
- package/web-ui/build/static/gcode-b-DQdN2W.js +0 -1
- package/web-ui/build/static/gdscript-DIZ0_yTx.js +0 -1
- package/web-ui/build/static/gedcom-B-Don8Su.js +0 -1
- package/web-ui/build/static/gherkin-BioIAP1n.js +0 -1
- package/web-ui/build/static/gherkin-Cly_guds.js +0 -1
- package/web-ui/build/static/git-CopW8z0r.js +0 -1
- package/web-ui/build/static/glsl-6ssjFzwf.js +0 -1
- package/web-ui/build/static/glsl-E_uyFQdl.js +0 -1
- package/web-ui/build/static/gml-CaO1S6wu.js +0 -1
- package/web-ui/build/static/gml-D9DYjC5y.js +0 -1
- package/web-ui/build/static/gn-B_qqVpR0.js +0 -1
- package/web-ui/build/static/go-DFaKy1Ay.js +0 -1
- package/web-ui/build/static/go-JLTG1uU-.js +0 -1
- package/web-ui/build/static/go-module-BGp5Ey97.js +0 -1
- package/web-ui/build/static/golo-BlbGqaMN.js +0 -1
- package/web-ui/build/static/gradle-wqmsj6uh.js +0 -1
- package/web-ui/build/static/graphql-7RIdAO4i.js +0 -1
- package/web-ui/build/static/groovy-3icIp5xU.js +0 -1
- package/web-ui/build/static/groovy-HPI8s9_9.js +0 -1
- package/web-ui/build/static/haml-CTkGGR02.js +0 -1
- package/web-ui/build/static/haml-Thxu3S1L.js +0 -1
- package/web-ui/build/static/handlebars-1DoYlhi8.js +0 -1
- package/web-ui/build/static/handlebars-i1BBTCzR.js +0 -1
- package/web-ui/build/static/haskell-A1VYHFSA.js +0 -1
- package/web-ui/build/static/haskell-C_DMih9U.js +0 -1
- package/web-ui/build/static/haxe-Cz5x4sAD.js +0 -1
- package/web-ui/build/static/haxe-DYRFmKkv.js +0 -1
- package/web-ui/build/static/hcl-BRcB2lym.js +0 -1
- package/web-ui/build/static/hlsl-DkyhfHB3.js +0 -1
- package/web-ui/build/static/hoon-Droh_30T.js +0 -1
- package/web-ui/build/static/hpkp-DTAbnc4g.js +0 -1
- package/web-ui/build/static/hsp-C0QnJZWI.js +0 -1
- package/web-ui/build/static/hsts-C21QOmcz.js +0 -1
- package/web-ui/build/static/htmlbars-Bjlkvm5m.js +0 -1
- package/web-ui/build/static/http-D0nJQkzK.js +0 -1
- package/web-ui/build/static/http-DRz4r8bD.js +0 -1
- package/web-ui/build/static/hy-BqiXsF4N.js +0 -1
- package/web-ui/build/static/ichigojam-BQi7PpBN.js +0 -1
- package/web-ui/build/static/icon-BufrPPND.js +0 -1
- package/web-ui/build/static/icu-message-format-BGFhE2gJ.js +0 -1
- package/web-ui/build/static/idris-CDCGxwUo.js +0 -1
- package/web-ui/build/static/iecst-CdwPGvCO.js +0 -1
- package/web-ui/build/static/ignore-CHdDzb39.js +0 -1
- package/web-ui/build/static/index-C9Fa_kgD.css +0 -1
- package/web-ui/build/static/index-D1KAbjnI.js +0 -1
- package/web-ui/build/static/index-DBYkW2lx.js +0 -13
- package/web-ui/build/static/index-DsoPopge.js +0 -727
- package/web-ui/build/static/inform7-Bpq3UO5w.js +0 -1
- package/web-ui/build/static/inform7-DmXu-aMH.js +0 -1
- package/web-ui/build/static/ini-DWUEQKxG.js +0 -1
- package/web-ui/build/static/ini-t3XdjCfA.js +0 -1
- package/web-ui/build/static/io-DfElp6yx.js +0 -1
- package/web-ui/build/static/irpf90-fx9_FB-t.js +0 -1
- package/web-ui/build/static/isbl-CcrRysr8.js +0 -1
- package/web-ui/build/static/j--Jx3nGHC.js +0 -1
- package/web-ui/build/static/java-OOMeJRRQ.js +0 -1
- package/web-ui/build/static/java-OTyqE2m1.js +0 -1
- package/web-ui/build/static/javadoc-CD-HiYEY.js +0 -1
- package/web-ui/build/static/javadoclike-CLv1_76Z.js +0 -1
- package/web-ui/build/static/javascript-C_j1lHAa.js +0 -1
- package/web-ui/build/static/javastacktrace-CIsSL13b.js +0 -1
- package/web-ui/build/static/jboss-cli-C9HktJFq.js +0 -1
- package/web-ui/build/static/jexl-Doro4Jcm.js +0 -1
- package/web-ui/build/static/jolie-C5wL2YdC.js +0 -1
- package/web-ui/build/static/jq-Bmi3HMEP.js +0 -1
- package/web-ui/build/static/js-extras-CQyLxL3s.js +0 -1
- package/web-ui/build/static/js-templates-DAigrjqA.js +0 -1
- package/web-ui/build/static/jsdoc-BJ_oa4xn.js +0 -1
- package/web-ui/build/static/json--C9O_45y.js +0 -1
- package/web-ui/build/static/json-CSGkCpU2.js +0 -1
- package/web-ui/build/static/json5-CcxKJla0.js +0 -1
- package/web-ui/build/static/jsonp-DjUgPOz0.js +0 -1
- package/web-ui/build/static/jsstacktrace-BpOw_ymZ.js +0 -1
- package/web-ui/build/static/jsx-otTTuJ8X.js +0 -1
- package/web-ui/build/static/julia-B1n4YHpM.js +0 -1
- package/web-ui/build/static/julia-bi12E6me.js +0 -1
- package/web-ui/build/static/julia-repl-DwzL74R7.js +0 -1
- package/web-ui/build/static/keepalived-cKzNWQWz.js +0 -1
- package/web-ui/build/static/keyman-BVOouxaa.js +0 -1
- package/web-ui/build/static/kotlin-BPuaNDRU.js +0 -1
- package/web-ui/build/static/kotlin-DvWwch7e.js +0 -1
- package/web-ui/build/static/kumir-DxiPnZla.js +0 -1
- package/web-ui/build/static/kusto-tc7F4iSM.js +0 -1
- package/web-ui/build/static/lasso-CuIxaW6G.js +0 -1
- package/web-ui/build/static/latex-DaVNZvfJ.js +0 -1
- package/web-ui/build/static/latex-Y-rAMd-m.js +0 -1
- package/web-ui/build/static/latte-BWApgl6V.js +0 -1
- package/web-ui/build/static/ldif-BjMOGnja.js +0 -1
- package/web-ui/build/static/leaf-BjXTc-gF.js +0 -1
- package/web-ui/build/static/less-BAoMgFHw.js +0 -1
- package/web-ui/build/static/less-BIXQ4mtM.js +0 -1
- package/web-ui/build/static/lilypond-B6avfRfg.js +0 -1
- package/web-ui/build/static/liquid-Bgux4iHZ.js +0 -1
- package/web-ui/build/static/lisp-DZwObPt9.js +0 -1
- package/web-ui/build/static/lisp-KuHBOL65.js +0 -1
- package/web-ui/build/static/livecodeserver-Cuv2a-Np.js +0 -1
- package/web-ui/build/static/livescript-B5joK5y1.js +0 -1
- package/web-ui/build/static/livescript-Cfl-5tRI.js +0 -1
- package/web-ui/build/static/llvm-Bq_MvIMt.js +0 -1
- package/web-ui/build/static/llvm-DDplxqNH.js +0 -1
- package/web-ui/build/static/log-C0UrUYNZ.js +0 -1
- package/web-ui/build/static/lolcode-Bpn0nZXI.js +0 -1
- package/web-ui/build/static/lsl-Baa3yssY.js +0 -1
- package/web-ui/build/static/lua-CmS7S4r8.js +0 -1
- package/web-ui/build/static/lua-CuTsqVUh.js +0 -1
- package/web-ui/build/static/magma-D80wNgLE.js +0 -1
- package/web-ui/build/static/makefile-BUfHdkgl.js +0 -1
- package/web-ui/build/static/makefile-DcdqPwtQ.js +0 -1
- package/web-ui/build/static/markdown-Dnk5E2xs.js +0 -1
- package/web-ui/build/static/markdown-dVGF22cZ.js +0 -1
- package/web-ui/build/static/markup-templating-DFEtKf2a.js +0 -1
- package/web-ui/build/static/mathematica-D6RpzMC4.js +0 -1
- package/web-ui/build/static/matlab-BNL791Vd.js +0 -1
- package/web-ui/build/static/matlab-CcJdErYu.js +0 -1
- package/web-ui/build/static/maxima-DtObzS0g.js +0 -1
- package/web-ui/build/static/maxscript-Boeo84Pc.js +0 -1
- package/web-ui/build/static/mel-CQDFYa9L.js +0 -1
- package/web-ui/build/static/mel-Dqbr8Ct3.js +0 -1
- package/web-ui/build/static/mercury-CtQIBvXV.js +0 -1
- package/web-ui/build/static/mermaid-Be11mdXJ.js +0 -1
- package/web-ui/build/static/mipsasm-Bzu7KAos.js +0 -1
- package/web-ui/build/static/mizar-CTwK6_XC.js +0 -1
- package/web-ui/build/static/mizar-DGSninkt.js +0 -1
- package/web-ui/build/static/mojolicious-B5J4ts83.js +0 -1
- package/web-ui/build/static/mongodb-Canys4Q-.js +0 -1
- package/web-ui/build/static/monkey-Bc8QeQKW.js +0 -1
- package/web-ui/build/static/monkey-BuakrB5T.js +0 -1
- package/web-ui/build/static/moonscript-CCCY-549.js +0 -1
- package/web-ui/build/static/moonscript-DgTN69ea.js +0 -1
- package/web-ui/build/static/n1ql-BeClvJbI.js +0 -1
- package/web-ui/build/static/n1ql-Bmrbwg5D.js +0 -1
- package/web-ui/build/static/n4js-BI7ajnA2.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-CTtO9tFK.js +0 -1
- package/web-ui/build/static/naniscript-ByLXiYB-.js +0 -1
- package/web-ui/build/static/nasm-DyRBXPTp.js +0 -1
- package/web-ui/build/static/neon-CuGxTU_0.js +0 -1
- package/web-ui/build/static/nevod-CWnxD5-I.js +0 -1
- package/web-ui/build/static/nginx-9_Wnc0a8.js +0 -1
- package/web-ui/build/static/nginx-YzYFF0YL.js +0 -1
- package/web-ui/build/static/nim-Dgg2r5_y.js +0 -1
- package/web-ui/build/static/nim-Dket4DOJ.js +0 -1
- package/web-ui/build/static/nix-CM2XsNVm.js +0 -1
- package/web-ui/build/static/nix-P756jRJz.js +0 -1
- package/web-ui/build/static/node-repl-BRadhyOu.js +0 -1
- package/web-ui/build/static/nsis-4AzWWTt3.js +0 -1
- package/web-ui/build/static/nsis-DawN0fp-.js +0 -1
- package/web-ui/build/static/objectivec-BHy8WXYe.js +0 -1
- package/web-ui/build/static/objectivec-CVvJfvIh.js +0 -1
- package/web-ui/build/static/ocaml-BXmkRrGk.js +0 -1
- package/web-ui/build/static/ocaml-D9blGtF-.js +0 -1
- package/web-ui/build/static/opencl-CrP8B7-Y.js +0 -1
- package/web-ui/build/static/openqasm-BF_FGc9C.js +0 -1
- package/web-ui/build/static/openscad-BX0LeVCC.js +0 -1
- package/web-ui/build/static/oxygene-Dv7-kaO-.js +0 -1
- package/web-ui/build/static/oz-DMw40m1E.js +0 -1
- package/web-ui/build/static/parigp-C6qS_vHR.js +0 -1
- package/web-ui/build/static/parser-CIccHpfs.js +0 -1
- package/web-ui/build/static/parser3-DY65kzTx.js +0 -1
- package/web-ui/build/static/pascal-Bd8OdL32.js +0 -1
- package/web-ui/build/static/pascaligo-Czv0M1Ke.js +0 -1
- package/web-ui/build/static/pcaxis-Ct9Xzb0v.js +0 -1
- package/web-ui/build/static/peoplecode-Qs_52P9e.js +0 -1
- package/web-ui/build/static/perl-C7ZXixEj.js +0 -1
- package/web-ui/build/static/perl-jarWhwwS.js +0 -1
- package/web-ui/build/static/pf-CUIEZmhu.js +0 -1
- package/web-ui/build/static/pgsql-Cd9Vguu1.js +0 -1
- package/web-ui/build/static/php-BkEHU_F0.js +0 -1
- package/web-ui/build/static/php-DgxitXwB.js +0 -1
- package/web-ui/build/static/php-extras-DZ4cqJZr.js +0 -1
- package/web-ui/build/static/php-template-CmDsJimC.js +0 -1
- package/web-ui/build/static/phpdoc-BuzuEwXH.js +0 -1
- package/web-ui/build/static/plaintext-B9rbdHym.js +0 -1
- package/web-ui/build/static/plsql-BsUyjIMQ.js +0 -1
- package/web-ui/build/static/pony-DByqIe1z.js +0 -1
- package/web-ui/build/static/powerquery-1VSf_dLA.js +0 -1
- package/web-ui/build/static/powershell-CBYqkmKw.js +0 -1
- package/web-ui/build/static/powershell-TsgmSwr2.js +0 -1
- package/web-ui/build/static/processing-C7SmsDmp.js +0 -1
- package/web-ui/build/static/processing-DdvVbwBS.js +0 -1
- package/web-ui/build/static/profile-CrLgDepu.js +0 -1
- package/web-ui/build/static/prolog-1ezqlvDI.js +0 -1
- package/web-ui/build/static/prolog-BBYyok9G.js +0 -1
- package/web-ui/build/static/promql-CWatQOpO.js +0 -1
- package/web-ui/build/static/properties-BJQxP8JR.js +0 -1
- package/web-ui/build/static/properties-CfR17w8n.js +0 -1
- package/web-ui/build/static/protobuf-Cfo3A4gN.js +0 -1
- package/web-ui/build/static/protobuf-DjV26D7V.js +0 -1
- package/web-ui/build/static/psl-DHNAOSYZ.js +0 -1
- package/web-ui/build/static/pug-DnizfuFH.js +0 -1
- package/web-ui/build/static/puppet-BCcVNhLH.js +0 -1
- package/web-ui/build/static/puppet-BmSRwm0u.js +0 -1
- package/web-ui/build/static/pure-l1UGfReS.js +0 -1
- package/web-ui/build/static/purebasic-Cm1PR5lC.js +0 -1
- package/web-ui/build/static/purebasic-Dxq0YRkO.js +0 -1
- package/web-ui/build/static/purescript-CpKroRLn.js +0 -1
- package/web-ui/build/static/python-C0PwNTef.js +0 -1
- package/web-ui/build/static/python-Cr-3O1IE.js +0 -1
- package/web-ui/build/static/python-repl-B1P7p6JA.js +0 -1
- package/web-ui/build/static/q-CL79K_i7.js +0 -1
- package/web-ui/build/static/q-DLSzzmR3.js +0 -1
- package/web-ui/build/static/qml-BeN40LEp.js +0 -1
- package/web-ui/build/static/qml-DIjR5p31.js +0 -1
- package/web-ui/build/static/qore-CrnBG9xB.js +0 -1
- package/web-ui/build/static/qsharp-B8sPnj52.js +0 -1
- package/web-ui/build/static/r-UubkOviq.js +0 -1
- package/web-ui/build/static/r-lT3ysYih.js +0 -1
- package/web-ui/build/static/racket-Czw_1lqD.js +0 -1
- package/web-ui/build/static/reason-D-_rWPty.js +0 -1
- package/web-ui/build/static/reasonml-BZkHaGWN.js +0 -1
- package/web-ui/build/static/regex-BjeMZDQs.js +0 -1
- package/web-ui/build/static/rego-OYluSFFo.js +0 -1
- package/web-ui/build/static/renpy-D1X5nAoT.js +0 -1
- package/web-ui/build/static/rest-DnlQgDnx.js +0 -1
- package/web-ui/build/static/rib-DtDxwFfu.js +0 -1
- package/web-ui/build/static/rip-D8vOYwVd.js +0 -1
- package/web-ui/build/static/roboconf-DtEUhHis.js +0 -1
- package/web-ui/build/static/roboconf-w-iqpst4.js +0 -1
- package/web-ui/build/static/robotframework-M9UnAH02.js +0 -1
- package/web-ui/build/static/routeros-CX0gciU5.js +0 -1
- package/web-ui/build/static/rsl-CZOvPQbk.js +0 -1
- package/web-ui/build/static/ruby-BEwdhTtL.js +0 -1
- package/web-ui/build/static/ruby-dlRf3rgu.js +0 -1
- package/web-ui/build/static/ruleslanguage-CKX7tlpI.js +0 -1
- package/web-ui/build/static/rust-7xat0n1g.js +0 -1
- package/web-ui/build/static/rust-DCpdcw_7.js +0 -1
- package/web-ui/build/static/sas-B9K83LkK.js +0 -1
- package/web-ui/build/static/sas-ijKPjRom.js +0 -1
- package/web-ui/build/static/sass-ByZaOmQh.js +0 -1
- package/web-ui/build/static/scala-B6tUDsIS.js +0 -1
- package/web-ui/build/static/scala-BZ4NRThT.js +0 -1
- package/web-ui/build/static/scheme-BmDQeIVd.js +0 -1
- package/web-ui/build/static/scheme-DIrkVtyr.js +0 -1
- package/web-ui/build/static/scilab-BUTG2a1V.js +0 -1
- package/web-ui/build/static/scss-CC2Rr7DZ.js +0 -1
- package/web-ui/build/static/scss-CG0LtoLt.js +0 -1
- package/web-ui/build/static/shell-DEPni1su.js +0 -1
- package/web-ui/build/static/shell-session-DxlJbQBl.js +0 -1
- package/web-ui/build/static/smali-C5QEAhGK.js +0 -1
- package/web-ui/build/static/smali-RgOjDrpG.js +0 -1
- package/web-ui/build/static/smalltalk-CCLKnQXy.js +0 -1
- package/web-ui/build/static/smalltalk-D2pTtTF6.js +0 -1
- package/web-ui/build/static/smarty-D5pb-235.js +0 -1
- package/web-ui/build/static/sml-CtXZ7rhO.js +0 -1
- package/web-ui/build/static/sml-DgsaUoao.js +0 -1
- package/web-ui/build/static/solidity-DLDSX1RV.js +0 -1
- package/web-ui/build/static/solution-file-BaDc2_E-.js +0 -1
- package/web-ui/build/static/soy-x9k9lQq1.js +0 -1
- package/web-ui/build/static/sparql-CEyFkY2d.js +0 -1
- package/web-ui/build/static/splunk-spl-Cnoeez_o.js +0 -1
- package/web-ui/build/static/sqf-BiFuoaL6.js +0 -1
- package/web-ui/build/static/sqf-IC3wZMuh.js +0 -1
- package/web-ui/build/static/sql-B0kmmGOU.js +0 -1
- package/web-ui/build/static/sql-CUJr2cg-.js +0 -1
- package/web-ui/build/static/sql_more-CWl75_kq.js +0 -1
- package/web-ui/build/static/squirrel-CcEHntJJ.js +0 -1
- package/web-ui/build/static/stan-5fBmEp2c.js +0 -1
- package/web-ui/build/static/stan-CAB7l4xW.js +0 -1
- package/web-ui/build/static/stata-Cg3Bl6d7.js +0 -1
- package/web-ui/build/static/step21-CZGJgHPf.js +0 -1
- package/web-ui/build/static/stylus-BO533InK.js +0 -1
- package/web-ui/build/static/stylus-DNWkkgmm.js +0 -1
- package/web-ui/build/static/subunit-BFopBokb.js +0 -1
- package/web-ui/build/static/swift-CalO-wab.js +0 -1
- package/web-ui/build/static/swift-mePvo3P4.js +0 -1
- package/web-ui/build/static/systemd-bKGRJ9Ha.js +0 -1
- package/web-ui/build/static/t4-cs-D7xxs1lK.js +0 -1
- package/web-ui/build/static/t4-templating-_11pVeD-.js +0 -1
- package/web-ui/build/static/t4-vb-CprOaKdB.js +0 -1
- package/web-ui/build/static/taggerscript-CEpPw-UD.js +0 -1
- package/web-ui/build/static/tap-CFFYSmjs.js +0 -1
- package/web-ui/build/static/tap-Dy3jliYv.js +0 -1
- package/web-ui/build/static/tcl-Bw3AVuiY.js +0 -1
- package/web-ui/build/static/tcl-CD50d_-j.js +0 -1
- package/web-ui/build/static/textile-CSeSEGjy.js +0 -1
- package/web-ui/build/static/thrift-00VB402i.js +0 -1
- package/web-ui/build/static/toml-DuFNkxHe.js +0 -1
- package/web-ui/build/static/tp-4CeaWqyI.js +0 -1
- package/web-ui/build/static/tremor-BnerOgTY.js +0 -1
- package/web-ui/build/static/tsx-XiNhF1ao.js +0 -1
- package/web-ui/build/static/tt2-CM6FV9KO.js +0 -1
- package/web-ui/build/static/turtle-JxpiTJEQ.js +0 -1
- package/web-ui/build/static/twig-C16bJf43.js +0 -1
- package/web-ui/build/static/twig-DQ-0wCvQ.js +0 -1
- package/web-ui/build/static/typescript-ILNg_Uvt.js +0 -1
- package/web-ui/build/static/typescript-chBpZOex.js +0 -1
- package/web-ui/build/static/typoscript-D2-lUjQX.js +0 -1
- package/web-ui/build/static/unrealscript-CwOA8REe.js +0 -1
- package/web-ui/build/static/uorazor-Dh1SAWKw.js +0 -1
- package/web-ui/build/static/uri-BF1wAQOC.js +0 -1
- package/web-ui/build/static/v-DUq5Mxzu.js +0 -1
- package/web-ui/build/static/vala-BYNy6zW2.js +0 -1
- package/web-ui/build/static/vala-CqGfs9Kv.js +0 -1
- package/web-ui/build/static/vbnet-BxH9jvRi.js +0 -1
- package/web-ui/build/static/vbnet-CJxJGhMO.js +0 -1
- package/web-ui/build/static/vbscript-OQ6kMcDV.js +0 -1
- package/web-ui/build/static/vbscript-html-CZ-QJ4ch.js +0 -1
- package/web-ui/build/static/velocity-B59YHwoP.js +0 -1
- package/web-ui/build/static/verilog--uW8iUzt.js +0 -1
- package/web-ui/build/static/verilog-DAQz3Gcl.js +0 -1
- package/web-ui/build/static/vhdl-5FrGi5Wx.js +0 -1
- package/web-ui/build/static/vhdl-C25AEZ8g.js +0 -1
- package/web-ui/build/static/vim-CW6uewUP.js +0 -1
- package/web-ui/build/static/vim-f3zGsJk1.js +0 -1
- package/web-ui/build/static/visual-basic-CoOTQEUn.js +0 -1
- package/web-ui/build/static/warpscript-DGouvP9I.js +0 -1
- package/web-ui/build/static/wasm-BZeW0TNm.js +0 -1
- package/web-ui/build/static/web-idl-Bw1mV_A4.js +0 -1
- package/web-ui/build/static/wiki-CZG2B_w1.js +0 -1
- package/web-ui/build/static/wolfram-CiMIUpaO.js +0 -1
- package/web-ui/build/static/wren-Bh9Sv_02.js +0 -1
- package/web-ui/build/static/x86asm-BhoPGTpG.js +0 -1
- package/web-ui/build/static/xeora-C5CM7V9L.js +0 -1
- package/web-ui/build/static/xl-WCHINiXA.js +0 -1
- package/web-ui/build/static/xml-DPAIpwAO.js +0 -1
- package/web-ui/build/static/xml-doc-CJxlhMe0.js +0 -1
- package/web-ui/build/static/xojo-BW0Z0CzB.js +0 -1
- package/web-ui/build/static/xquery-CwiBIiph.js +0 -1
- package/web-ui/build/static/xquery-De9QIea7.js +0 -1
- package/web-ui/build/static/yaml-CKzSgstB.js +0 -1
- package/web-ui/build/static/yaml-DIHBhXM_.js +0 -1
- package/web-ui/build/static/yang-Cn0PKttf.js +0 -1
- package/web-ui/build/static/zephir-CKVBh8TU.js +0 -1
- package/web-ui/build/static/zig-CetEB4NE.js +0 -1
package/src/core/agentPool.js
CHANGED
|
@@ -161,6 +161,16 @@ class AgentPool {
|
|
|
161
161
|
status: AGENT_STATUS.ACTIVE,
|
|
162
162
|
capabilities: config.capabilities || [],
|
|
163
163
|
directoryAccess: directoryAccess, // Directory access configuration
|
|
164
|
+
// Per-tool configuration — keyed by tool id (e.g., 'terminal',
|
|
165
|
+
// 'filesystem'). When a tool is instantiated for this agent, the
|
|
166
|
+
// object under toolConfig[toolId] is merged into the tool's
|
|
167
|
+
// constructor config. Previously tools were constructed from global
|
|
168
|
+
// defaults only, so there was no way to set per-agent knobs like
|
|
169
|
+
// terminal allowed-commands, filesystem size limits, web stealth
|
|
170
|
+
// level, etc. See ToolManager integration in step 2.
|
|
171
|
+
toolConfig: (config.toolConfig && typeof config.toolConfig === 'object' && !Array.isArray(config.toolConfig))
|
|
172
|
+
? { ...config.toolConfig }
|
|
173
|
+
: {},
|
|
164
174
|
conversations: {
|
|
165
175
|
full: {
|
|
166
176
|
messages: [],
|
|
@@ -304,6 +314,24 @@ class AgentPool {
|
|
|
304
314
|
});
|
|
305
315
|
}
|
|
306
316
|
|
|
317
|
+
// Validate per-tool config if being updated. Must be a plain object
|
|
318
|
+
// keyed by tool id; each value is an object of config overrides that
|
|
319
|
+
// will be merged into the tool's constructor config at instantiation.
|
|
320
|
+
// We don't validate individual tool schemas here — that happens at
|
|
321
|
+
// tool construction time where the tool knows its own shape.
|
|
322
|
+
if (updates.toolConfig !== undefined) {
|
|
323
|
+
if (updates.toolConfig === null
|
|
324
|
+
|| typeof updates.toolConfig !== 'object'
|
|
325
|
+
|| Array.isArray(updates.toolConfig)) {
|
|
326
|
+
throw new Error('Invalid toolConfig: must be a plain object keyed by tool id');
|
|
327
|
+
}
|
|
328
|
+
for (const [toolId, cfg] of Object.entries(updates.toolConfig)) {
|
|
329
|
+
if (cfg !== null && (typeof cfg !== 'object' || Array.isArray(cfg))) {
|
|
330
|
+
throw new Error(`Invalid toolConfig.${toolId}: must be an object or null`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
307
335
|
// If originalSystemPrompt is being updated (user edited the raw prompt), store it
|
|
308
336
|
// and use it as the base for enhancement. Otherwise use the existing originalSystemPrompt.
|
|
309
337
|
if (updates.originalSystemPrompt !== undefined) {
|
|
@@ -592,6 +620,7 @@ class AgentPool {
|
|
|
592
620
|
platformProvided: agent.platformProvided,
|
|
593
621
|
capabilities: agent.capabilities,
|
|
594
622
|
directoryAccess: agent.directoryAccess,
|
|
623
|
+
toolConfig: agent.toolConfig || {},
|
|
595
624
|
lastActivity: agent.lastActivity,
|
|
596
625
|
isPaused: this._isAgentPaused(agent),
|
|
597
626
|
pausedUntil: agent.pausedUntil,
|
|
@@ -1297,6 +1326,69 @@ class AgentPool {
|
|
|
1297
1326
|
// Now using the new messageQueues system with AgentScheduler
|
|
1298
1327
|
// Inter-agent messages are queued via addInterAgentMessage() method
|
|
1299
1328
|
|
|
1329
|
+
/**
|
|
1330
|
+
* Wake an agent out of any paused/delayed state because a message has
|
|
1331
|
+
* arrived for it. Shared by addUserMessage / addInterAgentMessage /
|
|
1332
|
+
* addToolResult — every inbound path MUST route through this to avoid
|
|
1333
|
+
* the "silent queue into a delayed agent" bug where the recipient never
|
|
1334
|
+
* wakes up and the message sits until the scheduler back-off naturally
|
|
1335
|
+
* expires.
|
|
1336
|
+
*
|
|
1337
|
+
* Rationale: delays/pauses are "leave this agent alone" signals set by
|
|
1338
|
+
* the scheduler on error back-off or by the agentDelayTool for timed
|
|
1339
|
+
* waits. Any caller going to the trouble of actually addressing the
|
|
1340
|
+
* agent is an explicit "act now" signal that overrides the wait.
|
|
1341
|
+
*
|
|
1342
|
+
* @param {Object} agent - Agent object (already fetched)
|
|
1343
|
+
* @param {string} reason - Source label for logs (e.g. 'user-message',
|
|
1344
|
+
* 'inter-agent-message', 'tool-result')
|
|
1345
|
+
* @returns {Promise<{wasPaused:boolean, hadDelay:boolean, hadPausedUntil:boolean}>}
|
|
1346
|
+
* @private
|
|
1347
|
+
*/
|
|
1348
|
+
async _wakeAgentForMessage(agent, reason) {
|
|
1349
|
+
const info = { wasPaused: false, hadDelay: false, hadPausedUntil: false };
|
|
1350
|
+
if (!agent) return info;
|
|
1351
|
+
|
|
1352
|
+
// Auto-resume explicitly paused agent.
|
|
1353
|
+
if (agent.status === AGENT_STATUS.PAUSED) {
|
|
1354
|
+
info.wasPaused = true;
|
|
1355
|
+
this.logger.info(`Auto-resuming paused agent ${agent.id} due to ${reason}`);
|
|
1356
|
+
await this.resumeAgent(agent.id);
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
// Clear scheduler-enforced delay (rate-limit back-off, api-key delay,
|
|
1360
|
+
// builtin webTool delay, etc.). Only clear if actually in the future;
|
|
1361
|
+
// stale past values don't matter but shouldn't trigger a broadcast.
|
|
1362
|
+
if (agent.delayEndTime && new Date(agent.delayEndTime).getTime() > Date.now()) {
|
|
1363
|
+
info.hadDelay = true;
|
|
1364
|
+
agent.delayEndTime = null;
|
|
1365
|
+
this.logger.info(`Cleared scheduler delay for agent ${agent.id} — ${reason} takes precedence`);
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
// Defensive: if pausedUntil is set but status isn't PAUSED (shouldn't
|
|
1369
|
+
// happen but protects against state drift), clear it too.
|
|
1370
|
+
if (agent.pausedUntil && new Date(agent.pausedUntil).getTime() > Date.now()) {
|
|
1371
|
+
info.hadPausedUntil = true;
|
|
1372
|
+
agent.pausedUntil = null;
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
return info;
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
/**
|
|
1379
|
+
* Broadcast a delay-clear to the WS so the UI's delay chip disappears
|
|
1380
|
+
* immediately instead of waiting for the next scheduler tick.
|
|
1381
|
+
* @private
|
|
1382
|
+
*/
|
|
1383
|
+
async _broadcastWake(agentId, reason) {
|
|
1384
|
+
if (!this.scheduler?.broadcastAgentStateUpdate) return;
|
|
1385
|
+
try {
|
|
1386
|
+
await this.scheduler.broadcastAgentStateUpdate(agentId, reason);
|
|
1387
|
+
} catch (err) {
|
|
1388
|
+
this.logger.warn(`Failed to broadcast wake for ${agentId}: ${err.message}`);
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1300
1392
|
/**
|
|
1301
1393
|
* Add message to agent's user message queue
|
|
1302
1394
|
* @param {string} agentId - Agent ID
|
|
@@ -1309,25 +1401,10 @@ class AgentPool {
|
|
|
1309
1401
|
throw new Error(`Agent not found: ${agentId}`);
|
|
1310
1402
|
}
|
|
1311
1403
|
|
|
1312
|
-
//
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
}
|
|
1317
|
-
|
|
1318
|
-
// Clear any scheduler-enforced delay when the user explicitly addresses
|
|
1319
|
-
// the agent. Delays are set by the scheduler as a back-off for
|
|
1320
|
-
// rate-limit / network / api-key / builtin-tool-delay situations and
|
|
1321
|
-
// only make sense while the agent is left alone — a new user message is
|
|
1322
|
-
// an explicit signal to act NOW, and waiting out the remaining delay
|
|
1323
|
-
// would feel unresponsive. We clear the field and let the scheduler
|
|
1324
|
-
// pick the agent up on its next tick. Broadcast the state update so
|
|
1325
|
-
// the UI's delay chip disappears immediately.
|
|
1326
|
-
const hadDelay = !!(agent.delayEndTime && new Date(agent.delayEndTime).getTime() > Date.now());
|
|
1327
|
-
if (hadDelay) {
|
|
1328
|
-
agent.delayEndTime = null;
|
|
1329
|
-
this.logger.info(`Cleared scheduler delay for agent ${agentId} — user message takes precedence`);
|
|
1330
|
-
}
|
|
1404
|
+
// Any inbound message — user, inter-agent, or tool-result — takes
|
|
1405
|
+
// precedence over scheduler back-off and manual pauses. See
|
|
1406
|
+
// _wakeAgentForMessage for the rationale.
|
|
1407
|
+
const wakeInfo = await this._wakeAgentForMessage(agent, 'user-message');
|
|
1331
1408
|
|
|
1332
1409
|
const queuedMessage = {
|
|
1333
1410
|
...message,
|
|
@@ -1348,12 +1425,8 @@ class AgentPool {
|
|
|
1348
1425
|
|
|
1349
1426
|
// If we cleared a delay, surface it on the WS so the delay chip in the
|
|
1350
1427
|
// chat header disappears without waiting for the next scheduler cycle.
|
|
1351
|
-
if (hadDelay
|
|
1352
|
-
|
|
1353
|
-
await this.scheduler.broadcastAgentStateUpdate(agentId, 'user-message-clears-delay');
|
|
1354
|
-
} catch (err) {
|
|
1355
|
-
this.logger.warn(`Failed to broadcast delay-clear for ${agentId}: ${err.message}`);
|
|
1356
|
-
}
|
|
1428
|
+
if (wakeInfo.hadDelay) {
|
|
1429
|
+
await this._broadcastWake(agentId, 'user-message-clears-delay');
|
|
1357
1430
|
}
|
|
1358
1431
|
|
|
1359
1432
|
this.logger.info(`User message queued for agent: ${agentId}`, {
|
|
@@ -1374,6 +1447,11 @@ class AgentPool {
|
|
|
1374
1447
|
throw new Error(`Agent not found: ${agentId}`);
|
|
1375
1448
|
}
|
|
1376
1449
|
|
|
1450
|
+
// An inter-agent ping from another agent is an explicit "act now"
|
|
1451
|
+
// signal and must override any scheduler back-off or manual pause
|
|
1452
|
+
// on the recipient. See _wakeAgentForMessage.
|
|
1453
|
+
const wakeInfo = await this._wakeAgentForMessage(agent, 'inter-agent-message');
|
|
1454
|
+
|
|
1377
1455
|
const queuedMessage = {
|
|
1378
1456
|
...message,
|
|
1379
1457
|
id: message.id || message.messageId || `inter-agent-msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
@@ -1400,6 +1478,10 @@ class AgentPool {
|
|
|
1400
1478
|
});
|
|
1401
1479
|
}
|
|
1402
1480
|
|
|
1481
|
+
if (wakeInfo.hadDelay) {
|
|
1482
|
+
await this._broadcastWake(agentId, 'inter-agent-message-clears-delay');
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1403
1485
|
this.logger.info(`Inter-agent message queued for agent: ${agentId}`, {
|
|
1404
1486
|
messageId: queuedMessage.id,
|
|
1405
1487
|
sender: message.sender || message.senderName,
|
|
@@ -1420,6 +1502,13 @@ class AgentPool {
|
|
|
1420
1502
|
throw new Error(`Agent not found: ${agentId}`);
|
|
1421
1503
|
}
|
|
1422
1504
|
|
|
1505
|
+
// Tool results are "external async work finished — continue."
|
|
1506
|
+
// If the agent is delayed or paused when a result arrives (e.g. a
|
|
1507
|
+
// long image/video render completes while an unrelated rate-limit
|
|
1508
|
+
// back-off is still in effect) we wake it so the result can be
|
|
1509
|
+
// consumed immediately instead of sitting until the back-off expires.
|
|
1510
|
+
const wakeInfo = await this._wakeAgentForMessage(agent, 'tool-result');
|
|
1511
|
+
|
|
1423
1512
|
const queuedResult = {
|
|
1424
1513
|
...toolResult,
|
|
1425
1514
|
id: toolResult.id || `tool-result-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
@@ -1430,6 +1519,10 @@ class AgentPool {
|
|
|
1430
1519
|
agent.messageQueues.toolResults.push(queuedResult);
|
|
1431
1520
|
await this.persistAgentState(agentId);
|
|
1432
1521
|
|
|
1522
|
+
if (wakeInfo.hadDelay) {
|
|
1523
|
+
await this._broadcastWake(agentId, 'tool-result-clears-delay');
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1433
1526
|
this.logger.debug(`Tool result queued for agent: ${agentId}`, {
|
|
1434
1527
|
toolId: toolResult.toolId,
|
|
1435
1528
|
status: toolResult.status,
|
|
@@ -2185,8 +2185,11 @@ class AgentScheduler {
|
|
|
2185
2185
|
this._broadcastFlowProgress(sessionId, agentId, flowProgress, true);
|
|
2186
2186
|
}
|
|
2187
2187
|
|
|
2188
|
-
// Broadcast stream completion
|
|
2189
|
-
|
|
2188
|
+
// Broadcast stream completion. Reasoning fields are included
|
|
2189
|
+
// only when present so non-reasoning models' broadcasts stay
|
|
2190
|
+
// minimal; the web-UI treats undefined/empty as "no thinking
|
|
2191
|
+
// panel to render." See utilities/reasoningContext patterns.
|
|
2192
|
+
const streamCompleteEvent = {
|
|
2190
2193
|
type: 'stream_complete',
|
|
2191
2194
|
agentId,
|
|
2192
2195
|
messageId: streamMessageId,
|
|
@@ -2200,7 +2203,14 @@ class AgentScheduler {
|
|
|
2200
2203
|
flowRunId: flowContext.flowRunId,
|
|
2201
2204
|
flowNodeId: flowContext.flowNodeId
|
|
2202
2205
|
})
|
|
2203
|
-
}
|
|
2206
|
+
};
|
|
2207
|
+
if (typeof result.reasoning === 'string' && result.reasoning.length > 0) {
|
|
2208
|
+
streamCompleteEvent.reasoning = result.reasoning;
|
|
2209
|
+
}
|
|
2210
|
+
if (Number.isFinite(result.reasoningTokens) && result.reasoningTokens > 0) {
|
|
2211
|
+
streamCompleteEvent.reasoningTokens = result.reasoningTokens;
|
|
2212
|
+
}
|
|
2213
|
+
this._broadcastStreamEvent(sessionId, streamCompleteEvent);
|
|
2204
2214
|
},
|
|
2205
2215
|
onError: (error) => {
|
|
2206
2216
|
// Check if this is a model-related error that should show suggestions
|
|
@@ -2864,7 +2874,15 @@ class AgentScheduler {
|
|
|
2864
2874
|
});
|
|
2865
2875
|
}
|
|
2866
2876
|
|
|
2867
|
-
// Create response message
|
|
2877
|
+
// Create response message. Reasoning fields are only attached when
|
|
2878
|
+
// there's something to attach — avoids cluttering every assistant
|
|
2879
|
+
// message with null fields for non-reasoning models.
|
|
2880
|
+
// - `reasoning`: chain-of-thought text, when the provider exposed it
|
|
2881
|
+
// (DeepSeek-R1, Kimi K2 thinking, xAI reasoning, Claude thinking).
|
|
2882
|
+
// - `reasoningTokens`: token count spent thinking, surfaced even
|
|
2883
|
+
// when the text is opaque (OpenAI o-series, gpt-5-reasoning).
|
|
2884
|
+
// See src/services/aiService.js — `_extractReasoningTokens` + the
|
|
2885
|
+
// streaming/non-streaming handlers for the capture contract.
|
|
2868
2886
|
const responseMessage = {
|
|
2869
2887
|
id: `ai-response-${Date.now()}`,
|
|
2870
2888
|
agentId: agentId,
|
|
@@ -2877,6 +2895,12 @@ class AgentScheduler {
|
|
|
2877
2895
|
// Mark if tools will be executed (UI can show loading indicator)
|
|
2878
2896
|
pendingToolExecution: hasTools
|
|
2879
2897
|
};
|
|
2898
|
+
if (typeof aiResponse.reasoning === 'string' && aiResponse.reasoning.length > 0) {
|
|
2899
|
+
responseMessage.reasoning = aiResponse.reasoning;
|
|
2900
|
+
}
|
|
2901
|
+
if (Number.isFinite(aiResponse.reasoningTokens) && aiResponse.reasoningTokens > 0) {
|
|
2902
|
+
responseMessage.reasoningTokens = aiResponse.reasoningTokens;
|
|
2903
|
+
}
|
|
2880
2904
|
|
|
2881
2905
|
const appended = await this.addMessageToConversation(agentId, responseMessage, false);
|
|
2882
2906
|
|
|
@@ -467,9 +467,22 @@ class MessageProcessor {
|
|
|
467
467
|
// Pass truncation info to tool for partial execution handling.
|
|
468
468
|
// Re-derive projectDir from directoryAccess in case a previous tool
|
|
469
469
|
// (e.g. terminal change-directory) updated the working directory.
|
|
470
|
+
//
|
|
471
|
+
// toolConfig is this tool's slice of the agent's per-tool config
|
|
472
|
+
// (from agent.toolConfig[toolId]) — null when the agent didn't
|
|
473
|
+
// override anything for this tool, in which case the tool uses
|
|
474
|
+
// its global defaults. Tools that want to support per-agent
|
|
475
|
+
// config read `context.toolConfig` and merge it with their own
|
|
476
|
+
// defaults; tools that ignore it get the same behaviour as
|
|
477
|
+
// before.
|
|
478
|
+
const perToolConfig = (context.agentToolConfig && command.toolId)
|
|
479
|
+
? context.agentToolConfig[command.toolId] || null
|
|
480
|
+
: null;
|
|
481
|
+
|
|
470
482
|
const toolContext = {
|
|
471
483
|
...context,
|
|
472
484
|
projectDir: context.directoryAccess?.workingDirectory || context.projectDir,
|
|
485
|
+
toolConfig: perToolConfig,
|
|
473
486
|
wasRepaired: command.wasRepaired || false,
|
|
474
487
|
wasTruncated: command.wasTruncated || false
|
|
475
488
|
};
|
|
@@ -823,7 +836,7 @@ class MessageProcessor {
|
|
|
823
836
|
|
|
824
837
|
// Get agent to include its directoryAccess configuration
|
|
825
838
|
const agent = await this.agentPool.getAgent(agentId);
|
|
826
|
-
|
|
839
|
+
|
|
827
840
|
// Execute tools with agent context including sessionId and directoryAccess
|
|
828
841
|
const toolContext = {
|
|
829
842
|
...context,
|
|
@@ -831,6 +844,11 @@ class MessageProcessor {
|
|
|
831
844
|
sessionId: context.sessionId, // Ensure sessionId is explicitly available for tools
|
|
832
845
|
directoryAccess: agent?.directoryAccess, // Include agent's directory access configuration
|
|
833
846
|
projectDir: agent?.directoryAccess?.workingDirectory || agent?.projectDir || context.projectDir, // Extract project directory from directoryAccess
|
|
847
|
+
// Per-agent tool configuration — keyed by tool id. Tools can read
|
|
848
|
+
// their own slice via `context.toolConfig` (injected per-tool in
|
|
849
|
+
// executeTools below) or inspect the full map here if they need
|
|
850
|
+
// cross-tool state. See agentPool.js for the schema contract.
|
|
851
|
+
agentToolConfig: (agent && agent.toolConfig) ? agent.toolConfig : {},
|
|
834
852
|
agentPool: this.agentPool,
|
|
835
853
|
contextManager: this.contextManager,
|
|
836
854
|
aiService: this.aiService,
|
package/src/core/orchestrator.js
CHANGED
|
@@ -135,12 +135,19 @@ class Orchestrator {
|
|
|
135
135
|
if (!agent) {
|
|
136
136
|
throw new Error(`Agent not found: ${agentId}`);
|
|
137
137
|
}
|
|
138
|
-
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
138
|
+
|
|
139
|
+
// NOTE: We deliberately do NOT short-circuit on agent.status === PAUSED
|
|
140
|
+
// here. A user message is an explicit "act now" signal and must
|
|
141
|
+
// override any pause/delay state. agentPool.addUserMessage() calls
|
|
142
|
+
// _wakeAgentForMessage() which resumes paused agents, clears
|
|
143
|
+
// scheduler-enforced delayEndTime, and clears pausedUntil — so by
|
|
144
|
+
// the time the message lands in the queue the agent is back to
|
|
145
|
+
// active status. Rejecting here would silently drop user intent
|
|
146
|
+
// (the symptom was: "agent is paused" toast, no processing, the
|
|
147
|
+
// agent happily napping while the user waits). See
|
|
148
|
+
// src/core/__tests__/orchestratorUserMessageOverridesPause.test.js
|
|
149
|
+
// for the regression guard.
|
|
150
|
+
|
|
144
151
|
// Process message through message processor (NEW ARCHITECTURE: just queues message)
|
|
145
152
|
const result = await this.messageProcessor.processMessage(agentId, message, context);
|
|
146
153
|
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration-style tests for /api/images + /api/gallery/images/:filename
|
|
3
|
+
* (and DELETE /api/images). The routes now delegate to GalleryService,
|
|
4
|
+
* so these tests build a fresh GalleryService pointed at a tmp dir and
|
|
5
|
+
* exercise the routes end-to-end.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jest, describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
|
|
9
|
+
import express from 'express';
|
|
10
|
+
import { createServer } from 'http';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import { promises as fs } from 'fs';
|
|
13
|
+
import os from 'os';
|
|
14
|
+
|
|
15
|
+
// Redirect userDataDir into a tmp dir so the gallery's writes don't
|
|
16
|
+
// touch the developer's real user data.
|
|
17
|
+
let tmpRoot;
|
|
18
|
+
jest.unstable_mockModule('../../utilities/userDataDir.js', () => ({
|
|
19
|
+
getUserDataDir: () => tmpRoot,
|
|
20
|
+
getUserDataPaths: () => ({
|
|
21
|
+
base: tmpRoot,
|
|
22
|
+
state: path.join(tmpRoot, 'state'),
|
|
23
|
+
agents: path.join(tmpRoot, 'state', 'agents'),
|
|
24
|
+
settings: path.join(tmpRoot, 'settings'),
|
|
25
|
+
attachments: path.join(tmpRoot, 'attachments'),
|
|
26
|
+
logs: path.join(tmpRoot, 'logs'),
|
|
27
|
+
cache: path.join(tmpRoot, 'cache'),
|
|
28
|
+
operations: path.join(tmpRoot, 'state', 'operations'),
|
|
29
|
+
models: path.join(tmpRoot, 'state', 'models'),
|
|
30
|
+
runtime: path.join(tmpRoot, 'runtime'),
|
|
31
|
+
skills: path.join(tmpRoot, 'state', 'skills'),
|
|
32
|
+
gallery: path.join(tmpRoot, 'gallery'),
|
|
33
|
+
galleryImages: path.join(tmpRoot, 'gallery', 'images'),
|
|
34
|
+
galleryVideos: path.join(tmpRoot, 'gallery', 'videos'),
|
|
35
|
+
}),
|
|
36
|
+
ensureUserDataDirs: async () => {},
|
|
37
|
+
}));
|
|
38
|
+
|
|
39
|
+
const { _resetGalleryServiceForTests, getGalleryService } = await import('../../services/galleryService.js');
|
|
40
|
+
const { getUserDataPaths } = await import('../../utilities/userDataDir.js');
|
|
41
|
+
|
|
42
|
+
const HTTP_STATUS = { OK: 200, BAD_REQUEST: 400, NOT_FOUND: 404, INTERNAL_SERVER_ERROR: 500 };
|
|
43
|
+
|
|
44
|
+
function buildApp() {
|
|
45
|
+
const app = express();
|
|
46
|
+
|
|
47
|
+
app.get('/api/images', async (req, res) => {
|
|
48
|
+
try {
|
|
49
|
+
const gallery = getGalleryService();
|
|
50
|
+
const entries = await gallery.listImages({ agentId: req.query.agentId || undefined });
|
|
51
|
+
const images = entries.map(e => ({
|
|
52
|
+
...e, size: e.bytes,
|
|
53
|
+
url: `/api/gallery/images/${encodeURIComponent(e.filename)}`,
|
|
54
|
+
}));
|
|
55
|
+
res.json({ success: true, images });
|
|
56
|
+
} catch (error) {
|
|
57
|
+
res.status(HTTP_STATUS.INTERNAL_SERVER_ERROR).json({ success: false, error: error.message });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
app.delete('/api/images', async (req, res) => {
|
|
62
|
+
try {
|
|
63
|
+
const { filename } = req.query;
|
|
64
|
+
if (!filename) return res.status(HTTP_STATUS.BAD_REQUEST).json({ success: false, error: 'filename is required' });
|
|
65
|
+
const ok = await getGalleryService().deleteImage(filename);
|
|
66
|
+
if (!ok) return res.status(HTTP_STATUS.NOT_FOUND).json({ success: false, error: 'Image not found' });
|
|
67
|
+
res.json({ success: true });
|
|
68
|
+
} catch (error) {
|
|
69
|
+
if (error.code === 'INVALID_FILENAME') return res.status(HTTP_STATUS.BAD_REQUEST).json({ success: false, error: 'Invalid filename' });
|
|
70
|
+
if (error.code === 'INVALID_EXT') return res.status(HTTP_STATUS.BAD_REQUEST).json({ success: false, error: 'Unsupported file extension' });
|
|
71
|
+
res.status(HTTP_STATUS.INTERNAL_SERVER_ERROR).json({ success: false, error: error.message });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
app.get('/api/gallery/images/:filename', async (req, res) => {
|
|
76
|
+
const filename = req.params.filename;
|
|
77
|
+
const normalized = path.basename(filename);
|
|
78
|
+
if (normalized !== filename || filename.includes('..')) {
|
|
79
|
+
return res.status(HTTP_STATUS.BAD_REQUEST).json({ success: false, error: 'Invalid filename' });
|
|
80
|
+
}
|
|
81
|
+
const ext = path.extname(normalized).toLowerCase();
|
|
82
|
+
if (!['.png', '.jpg', '.jpeg', '.webp', '.gif'].includes(ext)) {
|
|
83
|
+
return res.status(HTTP_STATUS.BAD_REQUEST).json({ success: false, error: 'Unsupported extension' });
|
|
84
|
+
}
|
|
85
|
+
const target = path.join(getUserDataPaths().galleryImages, normalized);
|
|
86
|
+
res.sendFile(target, (err) => {
|
|
87
|
+
if (err && !res.headersSent) res.status(HTTP_STATUS.NOT_FOUND).json({ success: false, error: 'Image not found' });
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
return app;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function http(url, options = {}) {
|
|
95
|
+
const resp = await globalThis.fetch(url, options);
|
|
96
|
+
const body = resp.headers.get('content-type')?.includes('json') ? await resp.json() : await resp.text();
|
|
97
|
+
return { status: resp.status, body, headers: resp.headers };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
describe('gallery routes (GalleryService-backed)', () => {
|
|
101
|
+
let server, baseUrl;
|
|
102
|
+
|
|
103
|
+
async function saveImg(meta = {}, content = 'PNG-DATA') {
|
|
104
|
+
const srcDir = path.join(tmpRoot, 'src');
|
|
105
|
+
await fs.mkdir(srcDir, { recursive: true });
|
|
106
|
+
const src = path.join(srcDir, `${meta.name || 'img'}.png`);
|
|
107
|
+
await fs.writeFile(src, content);
|
|
108
|
+
return await getGalleryService().saveImage({ sourcePath: src, metadata: meta });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
beforeAll(async () => {
|
|
112
|
+
tmpRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'gallery-routes-'));
|
|
113
|
+
const app = buildApp();
|
|
114
|
+
server = createServer(app);
|
|
115
|
+
await new Promise(r => server.listen(0, r));
|
|
116
|
+
baseUrl = `http://localhost:${server.address().port}`;
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
afterAll(async () => {
|
|
120
|
+
server?.close();
|
|
121
|
+
await fs.rm(tmpRoot, { recursive: true, force: true }).catch(() => {});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
beforeEach(async () => {
|
|
125
|
+
_resetGalleryServiceForTests();
|
|
126
|
+
// Clean gallery dir between tests.
|
|
127
|
+
const dir = path.join(tmpRoot, 'gallery', 'images');
|
|
128
|
+
await fs.rm(dir, { recursive: true, force: true }).catch(() => {});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// ── GET /api/images ─────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
it('returns empty list when gallery has no entries', async () => {
|
|
134
|
+
const { status, body } = await http(`${baseUrl}/api/images`);
|
|
135
|
+
expect(status).toBe(200);
|
|
136
|
+
expect(body).toEqual({ success: true, images: [] });
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('lists saved gallery entries with sidecar metadata', async () => {
|
|
140
|
+
await saveImg({ name: 'fox', prompt: 'a fox', model: 'dall-e-3', agentId: 'a', agentName: 'Alice' });
|
|
141
|
+
const { body } = await http(`${baseUrl}/api/images`);
|
|
142
|
+
expect(body.images).toHaveLength(1);
|
|
143
|
+
const img = body.images[0];
|
|
144
|
+
expect(img.prompt).toBe('a fox');
|
|
145
|
+
expect(img.model).toBe('dall-e-3');
|
|
146
|
+
expect(img.agentId).toBe('a');
|
|
147
|
+
expect(img.url).toMatch(/^\/api\/gallery\/images\/.*fox\.png$/);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('filters by agentId', async () => {
|
|
151
|
+
await saveImg({ name: 'a', agentId: 'agent-A' });
|
|
152
|
+
await saveImg({ name: 'b', agentId: 'agent-B' });
|
|
153
|
+
const { body } = await http(`${baseUrl}/api/images?agentId=agent-B`);
|
|
154
|
+
expect(body.images).toHaveLength(1);
|
|
155
|
+
expect(body.images[0].agentId).toBe('agent-B');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// ── DELETE /api/images ──────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
it('rejects missing filename param', async () => {
|
|
161
|
+
const { status } = await http(`${baseUrl}/api/images`, { method: 'DELETE' });
|
|
162
|
+
expect(status).toBe(400);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('rejects path traversal', async () => {
|
|
166
|
+
const { status, body } = await http(
|
|
167
|
+
`${baseUrl}/api/images?filename=..%2Fetc%2Fpasswd`,
|
|
168
|
+
{ method: 'DELETE' }
|
|
169
|
+
);
|
|
170
|
+
expect(status).toBe(400);
|
|
171
|
+
expect(body.error).toMatch(/Invalid filename/);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('rejects non-image extension', async () => {
|
|
175
|
+
const { status, body } = await http(
|
|
176
|
+
`${baseUrl}/api/images?filename=secret.txt`,
|
|
177
|
+
{ method: 'DELETE' }
|
|
178
|
+
);
|
|
179
|
+
expect(status).toBe(400);
|
|
180
|
+
expect(body.error).toMatch(/Unsupported/);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('returns 404 when the gallery entry does not exist', async () => {
|
|
184
|
+
const { status } = await http(`${baseUrl}/api/images?filename=ghost.png`, { method: 'DELETE' });
|
|
185
|
+
expect(status).toBe(404);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('deletes an existing gallery entry + its sidecar', async () => {
|
|
189
|
+
const saved = await saveImg({ prompt: 'deleting' });
|
|
190
|
+
const { status, body } = await http(
|
|
191
|
+
`${baseUrl}/api/images?filename=${encodeURIComponent(saved.filename)}`,
|
|
192
|
+
{ method: 'DELETE' }
|
|
193
|
+
);
|
|
194
|
+
expect(status).toBe(200);
|
|
195
|
+
expect(body.success).toBe(true);
|
|
196
|
+
await expect(fs.access(saved.path)).rejects.toBeTruthy();
|
|
197
|
+
await expect(fs.access(`${saved.path}.json`)).rejects.toBeTruthy();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// ── GET /api/gallery/images/:filename ──────────────────────
|
|
201
|
+
|
|
202
|
+
it('serves a gallery image by filename', async () => {
|
|
203
|
+
const saved = await saveImg({ prompt: 'serve-me' }, 'PNG-BYTES');
|
|
204
|
+
const resp = await globalThis.fetch(`${baseUrl}/api/gallery/images/${encodeURIComponent(saved.filename)}`);
|
|
205
|
+
expect(resp.status).toBe(200);
|
|
206
|
+
const buf = await resp.text();
|
|
207
|
+
expect(buf).toBe('PNG-BYTES');
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('serve route rejects path traversal', async () => {
|
|
211
|
+
const { status } = await http(`${baseUrl}/api/gallery/images/..%2Fetc%2Fshadow.png`);
|
|
212
|
+
expect(status).toBe(400);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('serve route returns 404 for unknown filename', async () => {
|
|
216
|
+
const { status } = await http(`${baseUrl}/api/gallery/images/does-not-exist.png`);
|
|
217
|
+
expect(status).toBe(404);
|
|
218
|
+
});
|
|
219
|
+
});
|