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
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI ingestion contract test — consumes the exact SSE bytes that
|
|
3
|
+
* autopilot-backend's `/llm/chat` route emits (locked in backend's
|
|
4
|
+
* `routes/__tests__/llm.chat.reasoning.test.js`) and asserts that the
|
|
5
|
+
* resulting response object carries content, reasoning, and reasoning
|
|
6
|
+
* tokens correctly.
|
|
7
|
+
*
|
|
8
|
+
* Why this exists: the feature spans two repos. Per-repo tests prove
|
|
9
|
+
* each side holds its own assumption. This one proves they share the
|
|
10
|
+
* SAME wire contract: backend emissions parse correctly on the CLI
|
|
11
|
+
* side. If either drifts in the future, this tripwire catches it BEFORE
|
|
12
|
+
* "works in dev, broken in prod."
|
|
13
|
+
*
|
|
14
|
+
* The tested function (`_parseSSEResponseStream`) is the real production
|
|
15
|
+
* parser used by `_makeStreamingAPIRequest` — it's not a test double.
|
|
16
|
+
* Production and tests share a single implementation, so passing tests
|
|
17
|
+
* mean passing production.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { describe, test, expect } from '@jest/globals';
|
|
21
|
+
import { _parseSSEResponseStream } from '../aiService.js';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Build a fake ReadableStream-default-reader over a series of Uint8Array
|
|
25
|
+
* chunks. Mirrors what `response.body.getReader()` returns in production,
|
|
26
|
+
* but with caller-controlled bytes.
|
|
27
|
+
*/
|
|
28
|
+
function makeReader(chunks) {
|
|
29
|
+
let i = 0;
|
|
30
|
+
return {
|
|
31
|
+
async read() {
|
|
32
|
+
if (i >= chunks.length) return { done: true, value: undefined };
|
|
33
|
+
const value = typeof chunks[i] === 'string'
|
|
34
|
+
? new TextEncoder().encode(chunks[i])
|
|
35
|
+
: chunks[i];
|
|
36
|
+
i++;
|
|
37
|
+
return { done: false, value };
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Build an SSE frame string. Backend emits these via
|
|
44
|
+
* `data: ${JSON.stringify(event)}\n\n`.
|
|
45
|
+
*/
|
|
46
|
+
function sse(event) {
|
|
47
|
+
return `data: ${JSON.stringify(event)}\n\n`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
51
|
+
// Backward compat — plain content-only stream
|
|
52
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
53
|
+
|
|
54
|
+
describe('_parseSSEResponseStream — backward compat (no reasoning)', () => {
|
|
55
|
+
test('plain chunk + done stream returns content only, reasoning empty', async () => {
|
|
56
|
+
const chunks = [
|
|
57
|
+
sse({ type: 'start', model: 'gpt-4o' }),
|
|
58
|
+
sse({ type: 'chunk', content: 'Hello ' }),
|
|
59
|
+
sse({ type: 'chunk', content: 'world.' }),
|
|
60
|
+
sse({ type: 'done', content: 'Hello world.',
|
|
61
|
+
usage: { input_tokens: 10, output_tokens: 5, total_tokens: 15 },
|
|
62
|
+
model: 'gpt-4o', finishReason: 'stop' }),
|
|
63
|
+
];
|
|
64
|
+
const result = await _parseSSEResponseStream(makeReader(chunks), { fallbackModel: 'gpt-4o' });
|
|
65
|
+
|
|
66
|
+
expect(result.content).toBe('Hello world.');
|
|
67
|
+
expect(result.reasoning).toBe('');
|
|
68
|
+
expect(result.reasoningTokens).toBeNull();
|
|
69
|
+
expect(result.usage).toEqual({ input_tokens: 10, output_tokens: 5, total_tokens: 15 });
|
|
70
|
+
expect(result.model).toBe('gpt-4o');
|
|
71
|
+
expect(result.finishReason).toBe('stop');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('onChunk callback fires per chunk in order', async () => {
|
|
75
|
+
const chunks = [
|
|
76
|
+
sse({ type: 'chunk', content: 'a' }),
|
|
77
|
+
sse({ type: 'chunk', content: 'b' }),
|
|
78
|
+
sse({ type: 'chunk', content: 'c' }),
|
|
79
|
+
sse({ type: 'done', usage: null, model: 'x', finishReason: 'stop' }),
|
|
80
|
+
];
|
|
81
|
+
const captured = [];
|
|
82
|
+
await _parseSSEResponseStream(makeReader(chunks), { onChunk: (c) => captured.push(c) });
|
|
83
|
+
expect(captured).toEqual(['a', 'b', 'c']);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
88
|
+
// Reasoning — full content path (DeepSeek / Kimi / xAI / Claude-thinking)
|
|
89
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
describe('_parseSSEResponseStream — reasoning accumulation', () => {
|
|
92
|
+
test('interleaved reasoning_chunk + chunk accumulate into separate fields', async () => {
|
|
93
|
+
const chunks = [
|
|
94
|
+
sse({ type: 'reasoning_chunk', content: 'Let me think...' }),
|
|
95
|
+
sse({ type: 'chunk', content: 'Answer: ' }),
|
|
96
|
+
sse({ type: 'reasoning_chunk', content: ' still checking.' }),
|
|
97
|
+
sse({ type: 'chunk', content: '42.' }),
|
|
98
|
+
sse({ type: 'done', content: 'Answer: 42.',
|
|
99
|
+
usage: {
|
|
100
|
+
input_tokens: 10, output_tokens: 50, total_tokens: 60,
|
|
101
|
+
reasoning_tokens: 40,
|
|
102
|
+
},
|
|
103
|
+
model: 'DeepSeek-R1-0528', finishReason: 'stop' }),
|
|
104
|
+
];
|
|
105
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
106
|
+
|
|
107
|
+
expect(result.content).toBe('Answer: 42.');
|
|
108
|
+
expect(result.reasoning).toBe('Let me think... still checking.');
|
|
109
|
+
expect(result.reasoningTokens).toBe(40);
|
|
110
|
+
expect(result.model).toBe('DeepSeek-R1-0528');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('onReasoningChunk callback fires separately from onChunk', async () => {
|
|
114
|
+
const chunks = [
|
|
115
|
+
sse({ type: 'reasoning_chunk', content: 'thinking' }),
|
|
116
|
+
sse({ type: 'chunk', content: 'answer' }),
|
|
117
|
+
sse({ type: 'done', usage: null, model: 'x', finishReason: 'stop' }),
|
|
118
|
+
];
|
|
119
|
+
const texts = [];
|
|
120
|
+
const reasons = [];
|
|
121
|
+
await _parseSSEResponseStream(makeReader(chunks), {
|
|
122
|
+
onChunk: (c) => texts.push(c),
|
|
123
|
+
onReasoningChunk: (c) => reasons.push(c),
|
|
124
|
+
});
|
|
125
|
+
expect(texts).toEqual(['answer']);
|
|
126
|
+
expect(reasons).toEqual(['thinking']);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('backend-batched reasoning on done event is used when no reasoning_chunk events arrived', async () => {
|
|
130
|
+
const chunks = [
|
|
131
|
+
sse({ type: 'chunk', content: 'answer' }),
|
|
132
|
+
sse({ type: 'done', content: 'answer', reasoning: 'batched thinking trace',
|
|
133
|
+
usage: { input_tokens: 10, output_tokens: 30, reasoning_tokens: 25, total_tokens: 40 },
|
|
134
|
+
model: 'x', finishReason: 'stop' }),
|
|
135
|
+
];
|
|
136
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
137
|
+
expect(result.reasoning).toBe('batched thinking trace');
|
|
138
|
+
expect(result.reasoningTokens).toBe(25);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('streamed reasoning beats done.reasoning when both present', async () => {
|
|
142
|
+
// Belt-and-suspenders backends might send both. Prefer the streamed
|
|
143
|
+
// accumulation (it's what the caller's onReasoningChunk saw).
|
|
144
|
+
const chunks = [
|
|
145
|
+
sse({ type: 'reasoning_chunk', content: 'streamed' }),
|
|
146
|
+
sse({ type: 'chunk', content: 'ok' }),
|
|
147
|
+
sse({ type: 'done', reasoning: 'batched', usage: null, model: 'x', finishReason: 'stop' }),
|
|
148
|
+
];
|
|
149
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
150
|
+
expect(result.reasoning).toBe('streamed');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
155
|
+
// OpenAI o-series — reasoning_tokens count without content text
|
|
156
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
157
|
+
|
|
158
|
+
describe('_parseSSEResponseStream — opaque reasoning (count-only)', () => {
|
|
159
|
+
test('reasoning_tokens in done.usage but no reasoning_chunk events → reasoning="" + count', async () => {
|
|
160
|
+
const chunks = [
|
|
161
|
+
sse({ type: 'chunk', content: 'Final answer.' }),
|
|
162
|
+
sse({ type: 'done', content: 'Final answer.',
|
|
163
|
+
usage: {
|
|
164
|
+
input_tokens: 10, output_tokens: 100, total_tokens: 110,
|
|
165
|
+
reasoning_tokens: 85,
|
|
166
|
+
},
|
|
167
|
+
model: 'o3', finishReason: 'stop' }),
|
|
168
|
+
];
|
|
169
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
170
|
+
expect(result.reasoning).toBe('');
|
|
171
|
+
expect(result.reasoningTokens).toBe(85);
|
|
172
|
+
expect(result.content).toBe('Final answer.');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('reasoning_tokens in the completion_tokens_details alt shape also extracts', async () => {
|
|
176
|
+
const chunks = [
|
|
177
|
+
sse({ type: 'chunk', content: 'answer' }),
|
|
178
|
+
sse({ type: 'done', usage: {
|
|
179
|
+
input_tokens: 10, output_tokens: 50, total_tokens: 60,
|
|
180
|
+
completion_tokens_details: { reasoning_tokens: 40 },
|
|
181
|
+
}, model: 'x', finishReason: 'stop' }),
|
|
182
|
+
];
|
|
183
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
184
|
+
expect(result.reasoningTokens).toBe(40);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
189
|
+
// Robustness — chunking boundaries, malformed frames, errors
|
|
190
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
191
|
+
|
|
192
|
+
describe('_parseSSEResponseStream — robustness', () => {
|
|
193
|
+
test('SSE frames split across TCP chunks at arbitrary byte positions still parse correctly', async () => {
|
|
194
|
+
// Assemble one big SSE stream, then slice it at weird positions.
|
|
195
|
+
const full =
|
|
196
|
+
sse({ type: 'reasoning_chunk', content: 'Hmm.' }) +
|
|
197
|
+
sse({ type: 'chunk', content: 'Answer.' }) +
|
|
198
|
+
sse({ type: 'done', content: 'Answer.',
|
|
199
|
+
usage: { input_tokens: 5, output_tokens: 5, total_tokens: 10, reasoning_tokens: 3 },
|
|
200
|
+
model: 'x', finishReason: 'stop' });
|
|
201
|
+
// Split into 7-byte chunks (nothing magical — small enough to cross event boundaries).
|
|
202
|
+
const chunks = [];
|
|
203
|
+
for (let i = 0; i < full.length; i += 7) chunks.push(full.slice(i, i + 7));
|
|
204
|
+
|
|
205
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
206
|
+
expect(result.content).toBe('Answer.');
|
|
207
|
+
expect(result.reasoning).toBe('Hmm.');
|
|
208
|
+
expect(result.reasoningTokens).toBe(3);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test('malformed JSON data frames are skipped without crashing', async () => {
|
|
212
|
+
const chunks = [
|
|
213
|
+
'data: this-is-not-json\n\n',
|
|
214
|
+
sse({ type: 'chunk', content: 'real' }),
|
|
215
|
+
sse({ type: 'done', usage: null, model: 'x', finishReason: 'stop' }),
|
|
216
|
+
];
|
|
217
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
218
|
+
expect(result.content).toBe('real');
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('[DONE] sentinel is ignored (SSE end-of-stream marker convention)', async () => {
|
|
222
|
+
const chunks = [
|
|
223
|
+
sse({ type: 'chunk', content: 'hi' }),
|
|
224
|
+
sse({ type: 'done', content: 'hi', usage: null, model: 'x', finishReason: 'stop' }),
|
|
225
|
+
'data: [DONE]\n\n',
|
|
226
|
+
];
|
|
227
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
228
|
+
expect(result.content).toBe('hi');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test('stream ending without trailing newline still emits the final done event', async () => {
|
|
232
|
+
// Some proxies drop the terminal \n\n. Verify the trailing-line flush works.
|
|
233
|
+
const chunks = [
|
|
234
|
+
'data: {"type":"chunk","content":"x"}\n\n',
|
|
235
|
+
'data: {"type":"done","content":"x","usage":null,"model":"m","finishReason":"stop"}', // NO \n\n
|
|
236
|
+
];
|
|
237
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
238
|
+
expect(result.content).toBe('x');
|
|
239
|
+
expect(result.finishReason).toBe('stop');
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('type:"error" event throws with .code propagated', async () => {
|
|
243
|
+
const chunks = [
|
|
244
|
+
sse({ type: 'error', error: 'provider 500', code: 'upstream_500' }),
|
|
245
|
+
];
|
|
246
|
+
await expect(_parseSSEResponseStream(makeReader(chunks))).rejects.toMatchObject({
|
|
247
|
+
message: 'provider 500',
|
|
248
|
+
code: 'upstream_500',
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test('stream ends before done → returns accumulated content with no finalData', async () => {
|
|
253
|
+
const chunks = [
|
|
254
|
+
sse({ type: 'chunk', content: 'partial' }),
|
|
255
|
+
// No done event.
|
|
256
|
+
];
|
|
257
|
+
const result = await _parseSSEResponseStream(makeReader(chunks), { fallbackModel: 'm' });
|
|
258
|
+
expect(result.content).toBe('partial');
|
|
259
|
+
expect(result.finishReason).toBe('stop');
|
|
260
|
+
expect(result.model).toBe('m');
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
test('unknown event types are silently ignored (forward compat)', async () => {
|
|
264
|
+
const chunks = [
|
|
265
|
+
sse({ type: 'start', model: 'x', requestId: 'r1' }), // metadata, no content
|
|
266
|
+
sse({ type: 'some_new_future_event', data: 'whatever' }),
|
|
267
|
+
sse({ type: 'chunk', content: 'real' }),
|
|
268
|
+
sse({ type: 'done', content: 'real', usage: null, model: 'x', finishReason: 'stop' }),
|
|
269
|
+
];
|
|
270
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
271
|
+
expect(result.content).toBe('real');
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
276
|
+
// Tool-call bridge output — inline JSON flows through as content
|
|
277
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
describe('_parseSSEResponseStream — tool-call inline JSON passthrough', () => {
|
|
280
|
+
test('backend-bridged tool_call inline JSON arrives in content verbatim', async () => {
|
|
281
|
+
// The backend converts native tool_calls to inline JSON blocks and
|
|
282
|
+
// yields them as regular `chunk` events. Verify the CLI receives
|
|
283
|
+
// them intact so its TagParser can extract.
|
|
284
|
+
// Header only — see toolCallBridge.js DESIGN NOTE: the preamble
|
|
285
|
+
// is "**Calling X**" with no param preview, because the JSON block
|
|
286
|
+
// below is the single source of truth and duplicating its contents
|
|
287
|
+
// in a preview was bloating the context.
|
|
288
|
+
const inlineBlock = '\n**Calling filesystem**\n\n'
|
|
289
|
+
+ '```json\n'
|
|
290
|
+
+ '{\n "toolId": "filesystem",\n "parameters": {\n "action": "read"\n }\n}\n'
|
|
291
|
+
+ '```\n';
|
|
292
|
+
const chunks = [
|
|
293
|
+
sse({ type: 'chunk', content: 'Sure, checking. ' }),
|
|
294
|
+
sse({ type: 'chunk', content: inlineBlock }),
|
|
295
|
+
sse({ type: 'done', content: 'Sure, checking. ' + inlineBlock,
|
|
296
|
+
usage: { input_tokens: 5, output_tokens: 30, total_tokens: 35 },
|
|
297
|
+
model: 'DeepSeek-R1-0528', finishReason: 'tool_calls' }),
|
|
298
|
+
];
|
|
299
|
+
const result = await _parseSSEResponseStream(makeReader(chunks));
|
|
300
|
+
expect(result.content).toContain('```json');
|
|
301
|
+
expect(result.content).toContain('"toolId": "filesystem"');
|
|
302
|
+
expect(result.content).toContain('"action": "read"');
|
|
303
|
+
expect(result.finishReason).toBe('tool_calls');
|
|
304
|
+
});
|
|
305
|
+
});
|
|
@@ -108,7 +108,9 @@ describe('filterContentForExternalRelay()', () => {
|
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
test('CONTENT VERBATIM — "Calling X" bridge preamble preserved if wrapped', () => {
|
|
111
|
-
|
|
111
|
+
// Bridge emits header-only (no em-dash param preview — see
|
|
112
|
+
// toolCallBridge.js DESIGN NOTE).
|
|
113
|
+
const txt = '**Calling terminal**\n\nsee below';
|
|
112
114
|
const { blocks } = filterContentForExternalRelay(`<external>${txt}</external>`);
|
|
113
115
|
expect(blocks[0].text).toBe(txt);
|
|
114
116
|
});
|
|
@@ -134,7 +136,7 @@ describe('filterContentForExternalRelay()', () => {
|
|
|
134
136
|
// after the bridge has converted native tool calls to inline blocks.
|
|
135
137
|
const content =
|
|
136
138
|
"Thinking through this…\n\n" +
|
|
137
|
-
"**Calling taskmanager
|
|
139
|
+
"**Calling taskmanager**\n\n" +
|
|
138
140
|
"```json\n{\"toolId\":\"taskmanager\",\"parameters\":{\"actions\":[{\"type\":\"create\",\"title\":\"foo\"}]}}\n```\n\n" +
|
|
139
141
|
"<external to=\"discord:#ops\">\n" +
|
|
140
142
|
"Created a task for you: **foo**. I'll post back when it's done.\n" +
|
|
@@ -454,7 +454,7 @@ describe('Cross-service isolation: a single agent response splits across platfor
|
|
|
454
454
|
// for either Responses API or Chat Completions after the bridge.
|
|
455
455
|
const content =
|
|
456
456
|
'Private reasoning the operator sees.\n' +
|
|
457
|
-
'**Calling taskmanager
|
|
457
|
+
'**Calling taskmanager**\n' +
|
|
458
458
|
'```json\n{"toolId":"taskmanager","parameters":{"actions":[{"type":"complete","taskId":"t-1"}]}}\n```\n\n' +
|
|
459
459
|
'<external to="discord:#ops">\n' +
|
|
460
460
|
'**Deploy finished.** 42 tests passed.\n' +
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for reasoning-content handling in conversationQuery.read().
|
|
3
|
+
*
|
|
4
|
+
* Contract:
|
|
5
|
+
* - `hasReasoning` is ALWAYS surfaced when the archived message carries
|
|
6
|
+
* a non-empty `reasoning` field, even when the text isn't returned.
|
|
7
|
+
* Gives the agent a signal to re-fetch with includeReasoning=true.
|
|
8
|
+
* - `reasoningTokens` is ALWAYS surfaced when present (non-null).
|
|
9
|
+
* - The reasoning TEXT is returned only when includeReasoning=true.
|
|
10
|
+
* - Other modes (overview, range, search, around, byTool) are
|
|
11
|
+
* unaffected by this change — reasoning is deliberately scoped to
|
|
12
|
+
* `read` because loading chain-of-thought in bulk responses would
|
|
13
|
+
* blow the byte cap immediately.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { describe, test, expect } from '@jest/globals';
|
|
17
|
+
import { read, range, around } from '../conversationQuery.js';
|
|
18
|
+
|
|
19
|
+
function mkMsg({ id = 'msg_0001', content = 'hello', reasoning, reasoningTokens }) {
|
|
20
|
+
const m = {
|
|
21
|
+
id,
|
|
22
|
+
role: 'assistant',
|
|
23
|
+
content,
|
|
24
|
+
createdAt: '2026-04-21T10:00:00Z',
|
|
25
|
+
tokenUsage: { totalTokens: 100 },
|
|
26
|
+
};
|
|
27
|
+
if (reasoning !== undefined) m.reasoning = reasoning;
|
|
28
|
+
if (reasoningTokens !== undefined) m.reasoningTokens = reasoningTokens;
|
|
29
|
+
return m;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe('read() — reasoning presence signalling', () => {
|
|
33
|
+
test('hasReasoning=true + reasoningTokens surfaced without returning the text', () => {
|
|
34
|
+
const messages = [mkMsg({ reasoning: 'long chain of thought', reasoningTokens: 512 })];
|
|
35
|
+
const out = read(messages, { messageId: 'msg_0001' });
|
|
36
|
+
expect(out.targetFound).toBe(true);
|
|
37
|
+
expect(out.message.hasReasoning).toBe(true);
|
|
38
|
+
expect(out.message.reasoningTokens).toBe(512);
|
|
39
|
+
// Reasoning text is NOT returned by default
|
|
40
|
+
expect(out.message.reasoning).toBeUndefined();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('includeReasoning=true returns the reasoning text', () => {
|
|
44
|
+
const thought = 'Let me think step by step. First I need to...';
|
|
45
|
+
const messages = [mkMsg({ reasoning: thought, reasoningTokens: 150 })];
|
|
46
|
+
const out = read(messages, { messageId: 'msg_0001', includeReasoning: true });
|
|
47
|
+
expect(out.message.reasoning).toBe(thought);
|
|
48
|
+
expect(out.message.hasReasoning).toBe(true);
|
|
49
|
+
expect(out.message.reasoningTokens).toBe(150);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('message with no reasoning → hasReasoning=false, reasoningTokens=null', () => {
|
|
53
|
+
const messages = [mkMsg({})];
|
|
54
|
+
const out = read(messages, { messageId: 'msg_0001' });
|
|
55
|
+
expect(out.message.hasReasoning).toBe(false);
|
|
56
|
+
expect(out.message.reasoningTokens).toBeNull();
|
|
57
|
+
expect(out.message.reasoning).toBeUndefined();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('message with only reasoningTokens (opaque provider, no text)', () => {
|
|
61
|
+
// OpenAI o-series case: we know they thought, but not what they thought.
|
|
62
|
+
const messages = [mkMsg({ reasoningTokens: 4217 })];
|
|
63
|
+
const out = read(messages, { messageId: 'msg_0001', includeReasoning: true });
|
|
64
|
+
expect(out.message.hasReasoning).toBe(false); // no text present
|
|
65
|
+
expect(out.message.reasoningTokens).toBe(4217);
|
|
66
|
+
expect(out.message.reasoning).toBeUndefined();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('empty reasoning string treated as absent (keeps signal honest)', () => {
|
|
70
|
+
const messages = [mkMsg({ reasoning: '', reasoningTokens: 0 })];
|
|
71
|
+
const out = read(messages, { messageId: 'msg_0001', includeReasoning: true });
|
|
72
|
+
expect(out.message.hasReasoning).toBe(false);
|
|
73
|
+
expect(out.message.reasoning).toBeUndefined();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('reasoning is not pulled into around()/range() responses (byte-cap discipline)', () => {
|
|
77
|
+
// Other modes return slim entries; reasoning inclusion is scoped to
|
|
78
|
+
// read() only because chain-of-thought content can dwarf content.
|
|
79
|
+
const messages = [mkMsg({ reasoning: 'x'.repeat(50_000) })];
|
|
80
|
+
const rangeOut = range(messages);
|
|
81
|
+
const aroundOut = around(messages, { messageId: 'msg_0001' });
|
|
82
|
+
expect(rangeOut.messages[0].reasoning).toBeUndefined();
|
|
83
|
+
expect(aroundOut.messages[0].reasoning).toBeUndefined();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('includeReasoning does not leak reasoning across byte cap — cap still applies', () => {
|
|
87
|
+
// A large reasoning block honored alongside a small content block
|
|
88
|
+
// should still be bounded by maxBytes in the overall response.
|
|
89
|
+
const huge = 'R'.repeat(50_000);
|
|
90
|
+
const messages = [mkMsg({ content: 'tiny', reasoning: huge })];
|
|
91
|
+
const out = read(messages, {
|
|
92
|
+
messageId: 'msg_0001',
|
|
93
|
+
includeReasoning: true,
|
|
94
|
+
maxBytes: 4096,
|
|
95
|
+
});
|
|
96
|
+
// Either reasoning was omitted entirely, OR included but the content
|
|
97
|
+
// field was trimmed via the existing byte-cap path — both are valid.
|
|
98
|
+
// What must NOT happen: the full 50KB reasoning in the response.
|
|
99
|
+
const serialized = JSON.stringify(out);
|
|
100
|
+
expect(serialized.length).toBeLessThan(50_000);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for GalleryService — the durable store for tool-generated
|
|
3
|
+
* images + videos with metadata sidecars.
|
|
4
|
+
*
|
|
5
|
+
* Locks:
|
|
6
|
+
* - save copies file + writes a JSON sidecar
|
|
7
|
+
* - filename gets a timestamp prefix to avoid collisions
|
|
8
|
+
* - list returns entries newest-first with metadata from the sidecar
|
|
9
|
+
* - list filters by agentId when supplied
|
|
10
|
+
* - delete removes both the asset and its sidecar
|
|
11
|
+
* - delete rejects path traversal + unsupported extensions
|
|
12
|
+
* - saveImage on a non-image source returns null (no-op, non-fatal)
|
|
13
|
+
* - IO failures on the gallery path don't crash the caller (warn + null)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import os from 'os';
|
|
19
|
+
import { promises as fs } from 'fs';
|
|
20
|
+
|
|
21
|
+
// Point userDataDir to a tmp dir for the duration of the test.
|
|
22
|
+
let tmpRoot;
|
|
23
|
+
jest.unstable_mockModule('../../utilities/userDataDir.js', () => ({
|
|
24
|
+
getUserDataDir: () => tmpRoot,
|
|
25
|
+
getUserDataPaths: () => ({
|
|
26
|
+
base: tmpRoot,
|
|
27
|
+
state: path.join(tmpRoot, 'state'),
|
|
28
|
+
agents: path.join(tmpRoot, 'state', 'agents'),
|
|
29
|
+
settings: path.join(tmpRoot, 'settings'),
|
|
30
|
+
attachments: path.join(tmpRoot, 'attachments'),
|
|
31
|
+
logs: path.join(tmpRoot, 'logs'),
|
|
32
|
+
cache: path.join(tmpRoot, 'cache'),
|
|
33
|
+
operations: path.join(tmpRoot, 'state', 'operations'),
|
|
34
|
+
models: path.join(tmpRoot, 'state', 'models'),
|
|
35
|
+
runtime: path.join(tmpRoot, 'runtime'),
|
|
36
|
+
skills: path.join(tmpRoot, 'state', 'skills'),
|
|
37
|
+
gallery: path.join(tmpRoot, 'gallery'),
|
|
38
|
+
galleryImages: path.join(tmpRoot, 'gallery', 'images'),
|
|
39
|
+
galleryVideos: path.join(tmpRoot, 'gallery', 'videos'),
|
|
40
|
+
}),
|
|
41
|
+
ensureUserDataDirs: async () => {},
|
|
42
|
+
}));
|
|
43
|
+
|
|
44
|
+
const mod = await import('../galleryService.js');
|
|
45
|
+
const { GalleryService, _resetGalleryServiceForTests, getGalleryService } = mod;
|
|
46
|
+
|
|
47
|
+
const LOGGER = { info() {}, warn() {}, error() {}, debug() {} };
|
|
48
|
+
|
|
49
|
+
beforeEach(async () => {
|
|
50
|
+
_resetGalleryServiceForTests();
|
|
51
|
+
tmpRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'gallery-svc-'));
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
afterEach(async () => {
|
|
55
|
+
await fs.rm(tmpRoot, { recursive: true, force: true }).catch(() => {});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
async function makeSourceImage(name = 'fox.png') {
|
|
59
|
+
const srcDir = path.join(tmpRoot, 'src');
|
|
60
|
+
await fs.mkdir(srcDir, { recursive: true });
|
|
61
|
+
const src = path.join(srcDir, name);
|
|
62
|
+
await fs.writeFile(src, 'PNG-DATA');
|
|
63
|
+
return src;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function makeSourceVideo(name = 'dragon.mp4') {
|
|
67
|
+
const srcDir = path.join(tmpRoot, 'src');
|
|
68
|
+
await fs.mkdir(srcDir, { recursive: true });
|
|
69
|
+
const src = path.join(srcDir, name);
|
|
70
|
+
await fs.writeFile(src, 'MP4-DATA');
|
|
71
|
+
return src;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
describe('GalleryService.saveImage', () => {
|
|
75
|
+
test('copies the file into gallery/images and writes a sidecar', async () => {
|
|
76
|
+
const svc = new GalleryService(LOGGER);
|
|
77
|
+
const src = await makeSourceImage('fox.png');
|
|
78
|
+
const result = await svc.saveImage({
|
|
79
|
+
sourcePath: src,
|
|
80
|
+
metadata: { prompt: 'a fox', model: 'dall-e-3', agentId: 'agent-1', agentName: 'Alice' },
|
|
81
|
+
});
|
|
82
|
+
expect(result).toBeTruthy();
|
|
83
|
+
expect(result.filename).toMatch(/_fox\.png$/);
|
|
84
|
+
const contents = await fs.readFile(result.path, 'utf8');
|
|
85
|
+
expect(contents).toBe('PNG-DATA');
|
|
86
|
+
const sidecar = JSON.parse(await fs.readFile(`${result.path}.json`, 'utf8'));
|
|
87
|
+
expect(sidecar.prompt).toBe('a fox');
|
|
88
|
+
expect(sidecar.model).toBe('dall-e-3');
|
|
89
|
+
expect(sidecar.agentId).toBe('agent-1');
|
|
90
|
+
expect(sidecar.kind).toBe('image');
|
|
91
|
+
expect(sidecar.createdAt).toBeTruthy();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('returns null for a non-image source (no throw, no file)', async () => {
|
|
95
|
+
const svc = new GalleryService(LOGGER);
|
|
96
|
+
const txt = path.join(tmpRoot, 'src', 'notes.txt');
|
|
97
|
+
await fs.mkdir(path.dirname(txt), { recursive: true });
|
|
98
|
+
await fs.writeFile(txt, 'hi');
|
|
99
|
+
const r = await svc.saveImage({ sourcePath: txt });
|
|
100
|
+
expect(r).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('returns null when the source path does not exist (warn, not crash)', async () => {
|
|
104
|
+
const svc = new GalleryService(LOGGER);
|
|
105
|
+
const r = await svc.saveImage({
|
|
106
|
+
sourcePath: path.join(tmpRoot, 'does-not-exist.png'),
|
|
107
|
+
});
|
|
108
|
+
expect(r).toBeNull();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('two saves of the same basename do not collide', async () => {
|
|
112
|
+
const svc = new GalleryService(LOGGER);
|
|
113
|
+
const src = await makeSourceImage('boom.png');
|
|
114
|
+
const a = await svc.saveImage({ sourcePath: src });
|
|
115
|
+
// Enough wall-clock for the timestamp prefix to change.
|
|
116
|
+
await new Promise(r => setTimeout(r, 5));
|
|
117
|
+
const b = await svc.saveImage({ sourcePath: src });
|
|
118
|
+
expect(a.filename).not.toBe(b.filename);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe('GalleryService.saveVideo', () => {
|
|
123
|
+
test('copies + writes sidecar with kind=video', async () => {
|
|
124
|
+
const svc = new GalleryService(LOGGER);
|
|
125
|
+
const src = await makeSourceVideo('dragon.mp4');
|
|
126
|
+
const result = await svc.saveVideo({
|
|
127
|
+
sourcePath: src,
|
|
128
|
+
metadata: { prompt: 'a dragon', duration: 5, variants: 1, agentId: 'agent-1' },
|
|
129
|
+
});
|
|
130
|
+
expect(result).toBeTruthy();
|
|
131
|
+
const sidecar = JSON.parse(await fs.readFile(`${result.path}.json`, 'utf8'));
|
|
132
|
+
expect(sidecar.kind).toBe('video');
|
|
133
|
+
expect(sidecar.duration).toBe(5);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('GalleryService.listImages', () => {
|
|
138
|
+
test('returns saved images with sidecar metadata, newest first', async () => {
|
|
139
|
+
const svc = new GalleryService(LOGGER);
|
|
140
|
+
const src = await makeSourceImage('a.png');
|
|
141
|
+
const a = await svc.saveImage({ sourcePath: src, metadata: { prompt: 'first', agentId: 'x' } });
|
|
142
|
+
await new Promise(r => setTimeout(r, 20));
|
|
143
|
+
const b = await svc.saveImage({ sourcePath: src, metadata: { prompt: 'second', agentId: 'x' } });
|
|
144
|
+
|
|
145
|
+
const list = await svc.listImages();
|
|
146
|
+
expect(list.map(i => i.filename)).toEqual([b.filename, a.filename]);
|
|
147
|
+
expect(list[0].prompt).toBe('second');
|
|
148
|
+
expect(list[0].kind).toBe('image');
|
|
149
|
+
expect(list[0].bytes).toBeGreaterThan(0);
|
|
150
|
+
expect(list[0].mtime).toMatch(/^\d{4}-\d{2}-\d{2}T/);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test('filters by agentId', async () => {
|
|
154
|
+
const svc = new GalleryService(LOGGER);
|
|
155
|
+
const src = await makeSourceImage('a.png');
|
|
156
|
+
await svc.saveImage({ sourcePath: src, metadata: { agentId: 'agent-A' } });
|
|
157
|
+
await svc.saveImage({ sourcePath: src, metadata: { agentId: 'agent-B' } });
|
|
158
|
+
|
|
159
|
+
const onlyB = await svc.listImages({ agentId: 'agent-B' });
|
|
160
|
+
expect(onlyB).toHaveLength(1);
|
|
161
|
+
expect(onlyB[0].agentId).toBe('agent-B');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test('empty gallery → empty list', async () => {
|
|
165
|
+
const svc = new GalleryService(LOGGER);
|
|
166
|
+
const list = await svc.listImages();
|
|
167
|
+
expect(list).toEqual([]);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test('files without sidecars are still listed (best-effort)', async () => {
|
|
171
|
+
const svc = new GalleryService(LOGGER);
|
|
172
|
+
const dir = path.join(tmpRoot, 'gallery', 'images');
|
|
173
|
+
await fs.mkdir(dir, { recursive: true });
|
|
174
|
+
await fs.writeFile(path.join(dir, 'orphan.png'), 'x');
|
|
175
|
+
const list = await svc.listImages();
|
|
176
|
+
expect(list.map(i => i.filename)).toEqual(['orphan.png']);
|
|
177
|
+
expect(list[0].prompt).toBeUndefined();
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
describe('GalleryService.deleteImage', () => {
|
|
182
|
+
test('removes the image AND its sidecar', async () => {
|
|
183
|
+
const svc = new GalleryService(LOGGER);
|
|
184
|
+
const src = await makeSourceImage('gone.png');
|
|
185
|
+
const { filename, path: assetPath } = await svc.saveImage({ sourcePath: src });
|
|
186
|
+
await fs.access(assetPath);
|
|
187
|
+
await fs.access(`${assetPath}.json`);
|
|
188
|
+
|
|
189
|
+
const ok = await svc.deleteImage(filename);
|
|
190
|
+
expect(ok).toBe(true);
|
|
191
|
+
await expect(fs.access(assetPath)).rejects.toBeTruthy();
|
|
192
|
+
await expect(fs.access(`${assetPath}.json`)).rejects.toBeTruthy();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('rejects path-traversal filenames', async () => {
|
|
196
|
+
const svc = new GalleryService(LOGGER);
|
|
197
|
+
await expect(svc.deleteImage('../secret')).rejects.toMatchObject({ code: 'INVALID_FILENAME' });
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('rejects unsupported extensions', async () => {
|
|
201
|
+
const svc = new GalleryService(LOGGER);
|
|
202
|
+
await expect(svc.deleteImage('secret.txt')).rejects.toMatchObject({ code: 'INVALID_EXT' });
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test('returns false when the file is already gone (no throw)', async () => {
|
|
206
|
+
const svc = new GalleryService(LOGGER);
|
|
207
|
+
const r = await svc.deleteImage('ghost.png');
|
|
208
|
+
expect(r).toBe(false);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
describe('getGalleryService singleton', () => {
|
|
213
|
+
test('returns the same instance across calls', () => {
|
|
214
|
+
const a = getGalleryService(LOGGER);
|
|
215
|
+
const b = getGalleryService(LOGGER);
|
|
216
|
+
expect(a).toBe(b);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test('_resetGalleryServiceForTests creates a fresh instance', () => {
|
|
220
|
+
const a = getGalleryService(LOGGER);
|
|
221
|
+
_resetGalleryServiceForTests();
|
|
222
|
+
const b = getGalleryService(LOGGER);
|
|
223
|
+
expect(a).not.toBe(b);
|
|
224
|
+
});
|
|
225
|
+
});
|