onbuzz 4.1.0 → 4.2.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/agentPool.js +118 -25
- package/src/core/agentScheduler.js +28 -4
- package/src/core/messageProcessor.js +19 -1
- package/src/interfaces/__tests__/galleryRoutes.test.js +311 -0
- package/src/interfaces/webServer.js +142 -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 +301 -0
- package/src/services/__tests__/conversationQuery.reasoning.test.js +102 -0
- package/src/services/__tests__/toolCallBridgeContract.test.js +129 -0
- package/src/services/agentActivityService.js +25 -4
- package/src/services/aiService.js +180 -91
- package/src/services/conversationQuery.js +26 -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__/memoryTool.reminisce.test.js +33 -0
- package/src/tools/__tests__/terminalTool.test.js +64 -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/memoryTool.js +4 -0
- package/src/tools/terminalTool.js +62 -2
- package/src/tools/webTool.js +65 -1
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-C_9olPfq.js +1 -0
- package/web-ui/build/static/abap--DeFI1OC.js +1 -0
- package/web-ui/build/static/abnf-5HzSmxRy.js +1 -0
- package/web-ui/build/static/abnf-IG-O3NHT.js +1 -0
- package/web-ui/build/static/accesslog-qO_3I5IJ.js +1 -0
- package/web-ui/build/static/actionscript-DbFc2Uxo.js +1 -0
- package/web-ui/build/static/actionscript-jU7xUh7w.js +1 -0
- package/web-ui/build/static/ada-DBOzyNDe.js +1 -0
- package/web-ui/build/static/ada-F0QwXh2e.js +1 -0
- package/web-ui/build/static/agda-Drhr_GYC.js +1 -0
- package/web-ui/build/static/al-bEatcrqU.js +1 -0
- package/web-ui/build/static/angelscript-Bp0mqasc.js +1 -0
- package/web-ui/build/static/antlr4-BCvixOqW.js +1 -0
- package/web-ui/build/static/apache-zSeWcGFf.js +1 -0
- package/web-ui/build/static/apacheconf-CEDX0qIZ.js +1 -0
- package/web-ui/build/static/apex-BHlvjPxZ.js +1 -0
- package/web-ui/build/static/apl-S86eLVnh.js +1 -0
- package/web-ui/build/static/applescript-D15JiHTt.js +1 -0
- package/web-ui/build/static/applescript-D6g2nIGs.js +1 -0
- package/web-ui/build/static/aql-C4SWmhk2.js +1 -0
- package/web-ui/build/static/arcade-DrwRCCCh.js +1 -0
- package/web-ui/build/static/arduino-Blsw4-hb.js +1 -0
- package/web-ui/build/static/arduino-s6CYn6L3.js +1 -0
- package/web-ui/build/static/arff-DnrfdsTx.js +1 -0
- package/web-ui/build/static/armasm-C2WK9q2y.js +1 -0
- package/web-ui/build/static/asciidoc-BiY2pDol.js +1 -0
- package/web-ui/build/static/asciidoc-DG128-Q1.js +1 -0
- package/web-ui/build/static/asm6502-BEAW0Cck.js +1 -0
- package/web-ui/build/static/asmatmel-C4v7boSu.js +1 -0
- package/web-ui/build/static/aspectj-Bfek529B.js +1 -0
- package/web-ui/build/static/aspnet-8K2PeLn2.js +1 -0
- package/web-ui/build/static/autohotkey-BHw78HYu.js +1 -0
- package/web-ui/build/static/autohotkey-C5DDQtDL.js +1 -0
- package/web-ui/build/static/autoit-CgsSmQkF.js +1 -0
- package/web-ui/build/static/autoit-DZ7IS_9i.js +1 -0
- package/web-ui/build/static/avisynth-B20WuEUg.js +1 -0
- package/web-ui/build/static/avrasm-C7TrcWBg.js +1 -0
- package/web-ui/build/static/avro-idl-CfDy8XWE.js +1 -0
- package/web-ui/build/static/awk-cjY-7p5o.js +1 -0
- package/web-ui/build/static/axapta-Bu9INQG2.js +1 -0
- package/web-ui/build/static/bash-B998wxy_.js +1 -0
- package/web-ui/build/static/bash-LE6roX2s.js +1 -0
- package/web-ui/build/static/basic-Cd6-vDdH.js +1 -0
- package/web-ui/build/static/basic-mfY-ovnp.js +1 -0
- package/web-ui/build/static/batch-DxVy2cwv.js +1 -0
- package/web-ui/build/static/bbcode-Ct3Yu8De.js +1 -0
- package/web-ui/build/static/bicep-CexPoMEW.js +1 -0
- package/web-ui/build/static/birb-CH1RMpPI.js +1 -0
- package/web-ui/build/static/bison-XQFuPB_Q.js +1 -0
- package/web-ui/build/static/bnf-CIDGmY3l.js +1 -0
- package/web-ui/build/static/bnf-DjN_FU2s.js +1 -0
- package/web-ui/build/static/brainfuck-Cu_hvayi.js +1 -0
- package/web-ui/build/static/brainfuck-eRbe4_qo.js +1 -0
- package/web-ui/build/static/brightscript-Cdq0ttTN.js +1 -0
- package/web-ui/build/static/bro-D3aio8LS.js +1 -0
- package/web-ui/build/static/bsl-DFEwVZ2J.js +1 -0
- package/web-ui/build/static/c-D6RK1vhn.js +1 -0
- package/web-ui/build/static/c-DUcBA02q.js +1 -0
- package/web-ui/build/static/c-like-BApJDFwD.js +1 -0
- package/web-ui/build/static/cal-Ckv8Qnpw.js +1 -0
- package/web-ui/build/static/capnproto-DCoblEyS.js +1 -0
- package/web-ui/build/static/ceylon-DM-zZDWY.js +1 -0
- package/web-ui/build/static/cfscript-CMoOAgUK.js +1 -0
- package/web-ui/build/static/chaiscript-B3Vl3wGb.js +1 -0
- package/web-ui/build/static/cil-ChEi_uFO.js +1 -0
- package/web-ui/build/static/clean-BtA08oDV.js +1 -0
- package/web-ui/build/static/clojure-CWMlf7lJ.js +1 -0
- package/web-ui/build/static/clojure-Vur8C4jr.js +1 -0
- package/web-ui/build/static/clojure-repl-BsfGHdYy.js +1 -0
- package/web-ui/build/static/cmake-Csgl_IVr.js +1 -0
- package/web-ui/build/static/cmake-DFMKvwxy.js +1 -0
- package/web-ui/build/static/cobol-XhlGrCrW.js +1 -0
- package/web-ui/build/static/coffeescript-DYldGW35.js +1 -0
- package/web-ui/build/static/coffeescript-DvbNKwrC.js +1 -0
- package/web-ui/build/static/concurnas-DjALqCYn.js +1 -0
- package/web-ui/build/static/coq-D9QGJI6g.js +1 -0
- package/web-ui/build/static/coq-fAZpoc7i.js +1 -0
- package/web-ui/build/static/cos-GgM7WWVZ.js +1 -0
- package/web-ui/build/static/cpp-Cgt5qqfd.js +1 -0
- package/web-ui/build/static/cpp-DxVcOuBe.js +1 -0
- package/web-ui/build/static/crmsh-BlZWnzbY.js +1 -0
- package/web-ui/build/static/crystal--H7HLAQf.js +1 -0
- package/web-ui/build/static/crystal-DWm0bbUT.js +1 -0
- package/web-ui/build/static/csharp-8dr-wktE.js +1 -0
- package/web-ui/build/static/csharp-DFuHLPFe.js +1 -0
- package/web-ui/build/static/cshtml-C-L4_dy2.js +1 -0
- package/web-ui/build/static/csp-CJ6qbecO.js +1 -0
- package/web-ui/build/static/csp-DswTy-5u.js +1 -0
- package/web-ui/build/static/css-DdRPdKXQ.js +1 -0
- package/web-ui/build/static/css-extras-DMwOZFrB.js +1 -0
- package/web-ui/build/static/csv-BiWlhIMC.js +1 -0
- package/web-ui/build/static/cypher-ByNaJKO8.js +1 -0
- package/web-ui/build/static/d-BR89VlK-.js +1 -0
- package/web-ui/build/static/d-KlWvBc4w.js +1 -0
- package/web-ui/build/static/dart-BIsk7m6o.js +1 -0
- package/web-ui/build/static/dart-BnyP1Rjp.js +1 -0
- package/web-ui/build/static/dataweave-CH_Q2gWX.js +1 -0
- package/web-ui/build/static/dax-wulX9uc-.js +1 -0
- package/web-ui/build/static/delphi-CFowdk_A.js +1 -0
- package/web-ui/build/static/dhall-BfCOemEp.js +1 -0
- package/web-ui/build/static/diff-DQD2zPaG.js +1 -0
- package/web-ui/build/static/diff-DZoEdrYM.js +1 -0
- package/web-ui/build/static/django-B0j973Kw.js +1 -0
- package/web-ui/build/static/django-CYScL320.js +1 -0
- package/web-ui/build/static/dns-DoECkAgz.js +1 -0
- package/web-ui/build/static/dns-zone-file-CuoIcXgj.js +1 -0
- package/web-ui/build/static/docker-C2nfXTBG.js +1 -0
- package/web-ui/build/static/dockerfile-DBalxIH7.js +1 -0
- package/web-ui/build/static/dos-GNL9IdmL.js +1 -0
- package/web-ui/build/static/dot-rKuRS-PS.js +1 -0
- package/web-ui/build/static/dsconfig-CKmenTFr.js +1 -0
- package/web-ui/build/static/dts-AxT2qjQU.js +1 -0
- package/web-ui/build/static/dust-DpqHWPC4.js +1 -0
- package/web-ui/build/static/ebnf-CONEMpLp.js +1 -0
- package/web-ui/build/static/ebnf-DRWcOs8R.js +1 -0
- package/web-ui/build/static/editorconfig-lmLHmECZ.js +1 -0
- package/web-ui/build/static/eiffel-B39e31fw.js +1 -0
- package/web-ui/build/static/ejs-DtJwpVdo.js +1 -0
- package/web-ui/build/static/elixir-BH4JTqa9.js +1 -0
- package/web-ui/build/static/elixir-aH1DLjYD.js +1 -0
- package/web-ui/build/static/elm-BcCGkSrW.js +1 -0
- package/web-ui/build/static/elm-CCrB1JbX.js +1 -0
- package/web-ui/build/static/erb-CcumI1K3.js +1 -0
- package/web-ui/build/static/erb-_HK77hx-.js +1 -0
- package/web-ui/build/static/erlang-B1qxMZZp.js +1 -0
- package/web-ui/build/static/erlang-CCM_ejO_.js +1 -0
- package/web-ui/build/static/erlang-repl-D1zC2Zf6.js +1 -0
- package/web-ui/build/static/etlua-HJMRx9x7.js +1 -0
- package/web-ui/build/static/excel-DqXCKUKa.js +1 -0
- package/web-ui/build/static/excel-formula-oNw1T5Gi.js +1 -0
- package/web-ui/build/static/factor-BrTp5FZH.js +1 -0
- package/web-ui/build/static/false-CAVqV3ok.js +1 -0
- package/web-ui/build/static/firestore-security-rules-CxTofGT0.js +1 -0
- package/web-ui/build/static/fix-BMooo7-3.js +1 -0
- package/web-ui/build/static/flix-DR5Pi_4n.js +1 -0
- package/web-ui/build/static/flow-BoCWpUCW.js +1 -0
- package/web-ui/build/static/fortran-B9JI5ahV.js +1 -0
- package/web-ui/build/static/fortran-LXg81aOn.js +1 -0
- package/web-ui/build/static/fsharp-BqcGG-SM.js +1 -0
- package/web-ui/build/static/fsharp-Dj5YVL_h.js +1 -0
- package/web-ui/build/static/ftl-kuY7uFR8.js +1 -0
- package/web-ui/build/static/gams-CzihHKqE.js +1 -0
- package/web-ui/build/static/gap-BbS0A-Wl.js +1 -0
- package/web-ui/build/static/gauss-BauwG_O4.js +1 -0
- package/web-ui/build/static/gcode-VY1OKBcC.js +1 -0
- package/web-ui/build/static/gcode-lapsLgV5.js +1 -0
- package/web-ui/build/static/gdscript-1UIYB8m0.js +1 -0
- package/web-ui/build/static/gedcom-Bhrxt1LM.js +1 -0
- package/web-ui/build/static/gherkin-BsUD3vJB.js +1 -0
- package/web-ui/build/static/gherkin-hj_asmFX.js +1 -0
- package/web-ui/build/static/git-DXIrRKzR.js +1 -0
- package/web-ui/build/static/glsl-Bww3i9-P.js +1 -0
- package/web-ui/build/static/glsl-tW4hvcaQ.js +1 -0
- package/web-ui/build/static/gml-BIqshajA.js +1 -0
- package/web-ui/build/static/gml-CQqc9F-B.js +1 -0
- package/web-ui/build/static/gn-CBgpy8B9.js +1 -0
- package/web-ui/build/static/go-CEUAUIgn.js +1 -0
- package/web-ui/build/static/go-DPEd33Yn.js +1 -0
- package/web-ui/build/static/go-module-BVPbZOg5.js +1 -0
- package/web-ui/build/static/golo-CqB3OATq.js +1 -0
- package/web-ui/build/static/gradle-Djj_6FTv.js +1 -0
- package/web-ui/build/static/graphql-ymSYYmmE.js +1 -0
- package/web-ui/build/static/groovy-BLoXi1Ew.js +1 -0
- package/web-ui/build/static/groovy-D8ua3DVO.js +1 -0
- package/web-ui/build/static/haml-DKlxHs26.js +1 -0
- package/web-ui/build/static/haml-S_iUNysn.js +1 -0
- package/web-ui/build/static/handlebars-B7tcAMGB.js +1 -0
- package/web-ui/build/static/handlebars-CV-zB05N.js +1 -0
- package/web-ui/build/static/haskell-CMxCwdZX.js +1 -0
- package/web-ui/build/static/haskell-Dis6rGJ5.js +1 -0
- package/web-ui/build/static/haxe-C76IK5YN.js +1 -0
- package/web-ui/build/static/haxe-hbmD2uei.js +1 -0
- package/web-ui/build/static/hcl-BPI_t80W.js +1 -0
- package/web-ui/build/static/hlsl-BmeH3MXM.js +1 -0
- package/web-ui/build/static/hoon-BYLX7KiR.js +1 -0
- package/web-ui/build/static/hpkp-CFV1lvIV.js +1 -0
- package/web-ui/build/static/hsp-_VXPtQPw.js +1 -0
- package/web-ui/build/static/hsts-DzmFog1b.js +1 -0
- package/web-ui/build/static/htmlbars-uX8JubPS.js +1 -0
- package/web-ui/build/static/http-BTDAHgkv.js +1 -0
- package/web-ui/build/static/http-Ba1gTHCW.js +1 -0
- package/web-ui/build/static/hy-G7MK4TLb.js +1 -0
- package/web-ui/build/static/ichigojam-BKKN56jZ.js +1 -0
- package/web-ui/build/static/icon-nrqdEYwB.js +1 -0
- package/web-ui/build/static/icu-message-format-Bjone7XH.js +1 -0
- package/web-ui/build/static/idris-CKkY_0op.js +1 -0
- package/web-ui/build/static/iecst-EV3ZvBDC.js +1 -0
- package/web-ui/build/static/ignore-LJIbInke.js +1 -0
- package/web-ui/build/static/index-C1x426Pt.js +734 -0
- package/web-ui/build/static/index-CTzeYMwr.js +13 -0
- package/web-ui/build/static/index-CUBjz1OL.css +1 -0
- package/web-ui/build/static/index-DnVIkRiR.js +1 -0
- package/web-ui/build/static/inform7-BiW6HbUl.js +1 -0
- package/web-ui/build/static/inform7-DT-x6SRD.js +1 -0
- package/web-ui/build/static/ini-BbnHjAtW.js +1 -0
- package/web-ui/build/static/ini-DuNY7Iqz.js +1 -0
- package/web-ui/build/static/io-BquAtlCB.js +1 -0
- package/web-ui/build/static/irpf90-CZELNeJl.js +1 -0
- package/web-ui/build/static/isbl-DhOgOzai.js +1 -0
- package/web-ui/build/static/j-r8D3BrBj.js +1 -0
- package/web-ui/build/static/java-MjQ5EBN5.js +1 -0
- package/web-ui/build/static/java-c3Jyc0B6.js +1 -0
- package/web-ui/build/static/javadoc-CfNFziRD.js +1 -0
- package/web-ui/build/static/javadoclike-BUcJZQAh.js +1 -0
- package/web-ui/build/static/javascript-CL_4g6j3.js +1 -0
- package/web-ui/build/static/javastacktrace-4P_J-58S.js +1 -0
- package/web-ui/build/static/jboss-cli-DUfK88hO.js +1 -0
- package/web-ui/build/static/jexl-DsSijmcs.js +1 -0
- package/web-ui/build/static/jolie-DjtNIZB4.js +1 -0
- package/web-ui/build/static/jq-BXdSm79y.js +1 -0
- package/web-ui/build/static/js-extras-B-C7ngCD.js +1 -0
- package/web-ui/build/static/js-templates-CmPAiwFC.js +1 -0
- package/web-ui/build/static/jsdoc-CkiXOOMV.js +1 -0
- package/web-ui/build/static/json-Bmvhezfj.js +1 -0
- package/web-ui/build/static/json-HPR8wBiw.js +1 -0
- package/web-ui/build/static/json5-Chcg9nnQ.js +1 -0
- package/web-ui/build/static/jsonp-C3KWcfzJ.js +1 -0
- package/web-ui/build/static/jsstacktrace-D1jRFy-S.js +1 -0
- package/web-ui/build/static/jsx-COtCqQ_9.js +1 -0
- package/web-ui/build/static/julia-BVvfw2TB.js +1 -0
- package/web-ui/build/static/julia-Ddalvdoa.js +1 -0
- package/web-ui/build/static/julia-repl-Bc-uwnIZ.js +1 -0
- package/web-ui/build/static/keepalived-CJ9ZYuQx.js +1 -0
- package/web-ui/build/static/keyman-BHea-dB6.js +1 -0
- package/web-ui/build/static/kotlin-DWOyCb_2.js +1 -0
- package/web-ui/build/static/kotlin-fvMiFIS3.js +1 -0
- package/web-ui/build/static/kumir-DaNls7gN.js +1 -0
- package/web-ui/build/static/kusto-DKweJuKl.js +1 -0
- package/web-ui/build/static/lasso-BB9dUrv_.js +1 -0
- package/web-ui/build/static/latex-C7U5RUQQ.js +1 -0
- package/web-ui/build/static/latex-CXM3EEy0.js +1 -0
- package/web-ui/build/static/latte-B4pEA635.js +1 -0
- package/web-ui/build/static/ldif-D3wYig10.js +1 -0
- package/web-ui/build/static/leaf-uFkjT9sR.js +1 -0
- package/web-ui/build/static/less-CbUH4jBX.js +1 -0
- package/web-ui/build/static/less-DEGyfeZn.js +1 -0
- package/web-ui/build/static/lilypond-UuoBjShK.js +1 -0
- package/web-ui/build/static/liquid-DB3a9n7S.js +1 -0
- package/web-ui/build/static/lisp-BDbj7Kd2.js +1 -0
- package/web-ui/build/static/lisp-D3T0YOb1.js +1 -0
- package/web-ui/build/static/livecodeserver-CkZMVLmr.js +1 -0
- package/web-ui/build/static/livescript-CJbtbTfA.js +1 -0
- package/web-ui/build/static/livescript-CdWg1xgf.js +1 -0
- package/web-ui/build/static/llvm-8hpjZ6qF.js +1 -0
- package/web-ui/build/static/llvm-DPpuma6i.js +1 -0
- package/web-ui/build/static/log-DwsLgecp.js +1 -0
- package/web-ui/build/static/lolcode-D3tkyiVB.js +1 -0
- package/web-ui/build/static/lsl-BBM4ZYza.js +1 -0
- package/web-ui/build/static/lua-DT0su8pZ.js +1 -0
- package/web-ui/build/static/lua-DqZXmUwn.js +1 -0
- package/web-ui/build/static/magma-DGW0-GCr.js +1 -0
- package/web-ui/build/static/makefile-C_K7AaVw.js +1 -0
- package/web-ui/build/static/makefile-CarddjPJ.js +1 -0
- package/web-ui/build/static/markdown-3dq-8I9T.js +1 -0
- package/web-ui/build/static/markdown-c4VYoNo2.js +1 -0
- package/web-ui/build/static/markup-templating-BBX0gWS5.js +1 -0
- package/web-ui/build/static/mathematica-n-aqoCbO.js +1 -0
- package/web-ui/build/static/matlab-B_kYC-A2.js +1 -0
- package/web-ui/build/static/matlab-CQP2D_0j.js +1 -0
- package/web-ui/build/static/maxima-piaAhCcP.js +1 -0
- package/web-ui/build/static/maxscript-CkxNZR1a.js +1 -0
- package/web-ui/build/static/mel-BXbrV0aU.js +1 -0
- package/web-ui/build/static/mel-CBSpVZcl.js +1 -0
- package/web-ui/build/static/mercury-CffeC87B.js +1 -0
- package/web-ui/build/static/mermaid-DAZcfksM.js +1 -0
- package/web-ui/build/static/mipsasm-DvOPoNgz.js +1 -0
- package/web-ui/build/static/mizar-C2ki99qc.js +1 -0
- package/web-ui/build/static/mizar-C5AXRrsD.js +1 -0
- package/web-ui/build/static/mojolicious-DklqV-uP.js +1 -0
- package/web-ui/build/static/mongodb-BbuSPlN0.js +1 -0
- package/web-ui/build/static/monkey-CJBb2-mV.js +1 -0
- package/web-ui/build/static/monkey-DgERCZQd.js +1 -0
- package/web-ui/build/static/moonscript-BovBU9jW.js +1 -0
- package/web-ui/build/static/moonscript-lPqbcjjy.js +1 -0
- package/web-ui/build/static/n1ql-CjVXW0Z0.js +1 -0
- package/web-ui/build/static/n1ql-DkfG2dTH.js +1 -0
- package/web-ui/build/static/n4js-6L9QW_kw.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-CqohGHfB.js +1 -0
- package/web-ui/build/static/naniscript-CIvQ6y1b.js +1 -0
- package/web-ui/build/static/nasm-CQbJbZZf.js +1 -0
- package/web-ui/build/static/neon-Cz41RJxQ.js +1 -0
- package/web-ui/build/static/nevod-WPRJ2Q9j.js +1 -0
- package/web-ui/build/static/nginx-BL2wPbD-.js +1 -0
- package/web-ui/build/static/nginx-DsqC_gQT.js +1 -0
- package/web-ui/build/static/nim-7qnwzYm_.js +1 -0
- package/web-ui/build/static/nim-D6iDo5H6.js +1 -0
- package/web-ui/build/static/nix-BQSsaH-G.js +1 -0
- package/web-ui/build/static/nix-DgwCtjpD.js +1 -0
- package/web-ui/build/static/node-repl-Cb4w8DbD.js +1 -0
- package/web-ui/build/static/nsis-CiXZWrqR.js +1 -0
- package/web-ui/build/static/nsis-CuwGI5px.js +1 -0
- package/web-ui/build/static/objectivec-DZXCqQ1J.js +1 -0
- package/web-ui/build/static/objectivec-GNGh-wiY.js +1 -0
- package/web-ui/build/static/ocaml-BPg_ANkr.js +1 -0
- package/web-ui/build/static/ocaml-DRUpaN8p.js +1 -0
- package/web-ui/build/static/opencl-CazTs_sf.js +1 -0
- package/web-ui/build/static/openqasm-DHuuXGjm.js +1 -0
- package/web-ui/build/static/openscad-YbvBFeLc.js +1 -0
- package/web-ui/build/static/oxygene-DDzgbCaQ.js +1 -0
- package/web-ui/build/static/oz-BRDBLIjx.js +1 -0
- package/web-ui/build/static/parigp-BbApdos7.js +1 -0
- package/web-ui/build/static/parser-CbVH4ySK.js +1 -0
- package/web-ui/build/static/parser3-BIkvuuuE.js +1 -0
- package/web-ui/build/static/pascal-oS7U_3sO.js +1 -0
- package/web-ui/build/static/pascaligo-57DdFj76.js +1 -0
- package/web-ui/build/static/pcaxis-V-Euf0DV.js +1 -0
- package/web-ui/build/static/peoplecode-DjyRW5V8.js +1 -0
- package/web-ui/build/static/perl-BEQWvjeP.js +1 -0
- package/web-ui/build/static/perl-CiDHRorC.js +1 -0
- package/web-ui/build/static/pf-S5x_U1LC.js +1 -0
- package/web-ui/build/static/pgsql-DwHZC-iy.js +1 -0
- package/web-ui/build/static/php-7enmlb-I.js +1 -0
- package/web-ui/build/static/php-extras-BhRDMlXE.js +1 -0
- package/web-ui/build/static/php-kIwfq-Jj.js +1 -0
- package/web-ui/build/static/php-template-M2RrZc1R.js +1 -0
- package/web-ui/build/static/phpdoc-HUeiWlkw.js +1 -0
- package/web-ui/build/static/plaintext-CPt25ow_.js +1 -0
- package/web-ui/build/static/plsql-BvoRAbdz.js +1 -0
- package/web-ui/build/static/pony-BVuhxk7D.js +1 -0
- package/web-ui/build/static/powerquery-rnRfiL3F.js +1 -0
- package/web-ui/build/static/powershell-BQR2-qjF.js +1 -0
- package/web-ui/build/static/powershell-S_XnLato.js +1 -0
- package/web-ui/build/static/processing-B-8pt1gx.js +1 -0
- package/web-ui/build/static/processing-ozS1KPr7.js +1 -0
- package/web-ui/build/static/profile-DOjTmxRs.js +1 -0
- package/web-ui/build/static/prolog-BaaxuI5L.js +1 -0
- package/web-ui/build/static/prolog-D90dFqfr.js +1 -0
- package/web-ui/build/static/promql-BuyoLqtl.js +1 -0
- package/web-ui/build/static/properties-C0pMastm.js +1 -0
- package/web-ui/build/static/properties-k7bXYQao.js +1 -0
- package/web-ui/build/static/protobuf-ChaO1q7B.js +1 -0
- package/web-ui/build/static/protobuf-DAGxv01T.js +1 -0
- package/web-ui/build/static/psl-BpYOLBqn.js +1 -0
- package/web-ui/build/static/pug-BUlJA4UD.js +1 -0
- package/web-ui/build/static/puppet-8l--PVpO.js +1 -0
- package/web-ui/build/static/puppet-BJDN84xr.js +1 -0
- package/web-ui/build/static/pure-DhqjQg1a.js +1 -0
- package/web-ui/build/static/purebasic-BHnSz9Yh.js +1 -0
- package/web-ui/build/static/purebasic-CeiLO2aV.js +1 -0
- package/web-ui/build/static/purescript-BaXXPnKS.js +1 -0
- package/web-ui/build/static/python-BXdJ4yqN.js +1 -0
- package/web-ui/build/static/python-Cef5Vfx2.js +1 -0
- package/web-ui/build/static/python-repl-CRpJP363.js +1 -0
- package/web-ui/build/static/q-C6Ov0g11.js +1 -0
- package/web-ui/build/static/q-D3tQMiHa.js +1 -0
- package/web-ui/build/static/qml-BYofTHXZ.js +1 -0
- package/web-ui/build/static/qml-DTxi8T37.js +1 -0
- package/web-ui/build/static/qore-Ny7MVtbP.js +1 -0
- package/web-ui/build/static/qsharp-Cy_rqHs2.js +1 -0
- package/web-ui/build/static/r-BtNaz7Jx.js +1 -0
- package/web-ui/build/static/r-DkF7wq0g.js +1 -0
- package/web-ui/build/static/racket-C5r8oFZa.js +1 -0
- package/web-ui/build/static/reason-BURRGL8T.js +1 -0
- package/web-ui/build/static/reasonml-ZPKVqo38.js +1 -0
- package/web-ui/build/static/regex-DgaaAttu.js +1 -0
- package/web-ui/build/static/rego-CtwYq-qp.js +1 -0
- package/web-ui/build/static/renpy-OueysuHf.js +1 -0
- package/web-ui/build/static/rest-Co13hzuk.js +1 -0
- package/web-ui/build/static/rib-CvGWooaO.js +1 -0
- package/web-ui/build/static/rip-5glwZfvx.js +1 -0
- package/web-ui/build/static/roboconf-B9R_ZXBj.js +1 -0
- package/web-ui/build/static/roboconf-Gf0nTNKt.js +1 -0
- package/web-ui/build/static/robotframework-C2axWAv1.js +1 -0
- package/web-ui/build/static/routeros-CE_Iedbm.js +1 -0
- package/web-ui/build/static/rsl-2QjczbcI.js +1 -0
- package/web-ui/build/static/ruby-5q7nApRB.js +1 -0
- package/web-ui/build/static/ruby-BUTeEeQo.js +1 -0
- package/web-ui/build/static/ruleslanguage-vxFl2T6e.js +1 -0
- package/web-ui/build/static/rust-BMuquF4q.js +1 -0
- package/web-ui/build/static/rust-CcZQo8qE.js +1 -0
- package/web-ui/build/static/sas-B3kZio_a.js +1 -0
- package/web-ui/build/static/sas-Bbv6Pcs_.js +1 -0
- package/web-ui/build/static/sass-C0q0q-U-.js +1 -0
- package/web-ui/build/static/scala-B5vW0oUX.js +1 -0
- package/web-ui/build/static/scala-CyVnVDED.js +1 -0
- package/web-ui/build/static/scheme-C9JOo4R_.js +1 -0
- package/web-ui/build/static/scheme-W2233tzx.js +1 -0
- package/web-ui/build/static/scilab-D2Bvw6Ov.js +1 -0
- package/web-ui/build/static/scss-CTlab4AI.js +1 -0
- package/web-ui/build/static/scss-DZ5g2Z9m.js +1 -0
- package/web-ui/build/static/shell-bYpiB--U.js +1 -0
- package/web-ui/build/static/shell-session-C4jzoNup.js +1 -0
- package/web-ui/build/static/smali-9ucoTzDl.js +1 -0
- package/web-ui/build/static/smali-BnluPxDD.js +1 -0
- package/web-ui/build/static/smalltalk-CAMGWItN.js +1 -0
- package/web-ui/build/static/smalltalk-DNxg0Og_.js +1 -0
- package/web-ui/build/static/smarty-YxNaCRZt.js +1 -0
- package/web-ui/build/static/sml-CZbvurr2.js +1 -0
- package/web-ui/build/static/sml-DGs_TRXx.js +1 -0
- package/web-ui/build/static/solidity-CEsviKxI.js +1 -0
- package/web-ui/build/static/solution-file-D0Yvaoet.js +1 -0
- package/web-ui/build/static/soy-BmVAPY7I.js +1 -0
- package/web-ui/build/static/sparql-D8d4i2J8.js +1 -0
- package/web-ui/build/static/splunk-spl-CcgWj5Im.js +1 -0
- package/web-ui/build/static/sqf-Cd4tBlXZ.js +1 -0
- package/web-ui/build/static/sqf-DC8e-wlP.js +1 -0
- package/web-ui/build/static/sql-D5KtfAwl.js +1 -0
- package/web-ui/build/static/sql-DX4iGc5J.js +1 -0
- package/web-ui/build/static/sql_more-9ztUFh5U.js +1 -0
- package/web-ui/build/static/squirrel-CiVV01fQ.js +1 -0
- package/web-ui/build/static/stan-DCrPYtdq.js +1 -0
- package/web-ui/build/static/stan-LL9ScTUT.js +1 -0
- package/web-ui/build/static/stata-n-r5-RvF.js +1 -0
- package/web-ui/build/static/step21-B2hxGG1E.js +1 -0
- package/web-ui/build/static/stylus-D-1wq2uN.js +1 -0
- package/web-ui/build/static/stylus-Dr-w1AjW.js +1 -0
- package/web-ui/build/static/subunit-DRCyiRHI.js +1 -0
- package/web-ui/build/static/swift-B2ZIuBjB.js +1 -0
- package/web-ui/build/static/swift-CnRpp8ao.js +1 -0
- package/web-ui/build/static/systemd-LPN-yj3b.js +1 -0
- package/web-ui/build/static/t4-cs-CXJSMlet.js +1 -0
- package/web-ui/build/static/t4-templating-Ciw3keAZ.js +1 -0
- package/web-ui/build/static/t4-vb-CXe99AWF.js +1 -0
- package/web-ui/build/static/taggerscript-Bm830ZwV.js +1 -0
- package/web-ui/build/static/tap-B0WwYGVt.js +1 -0
- package/web-ui/build/static/tap-Dw_cgj6K.js +1 -0
- package/web-ui/build/static/tcl-Di4JhH4s.js +1 -0
- package/web-ui/build/static/tcl-cIeBNf2V.js +1 -0
- package/web-ui/build/static/textile-DgMdCAz5.js +1 -0
- package/web-ui/build/static/thrift-zY2WxYMk.js +1 -0
- package/web-ui/build/static/toml-BtXdKizf.js +1 -0
- package/web-ui/build/static/tp-DxY0K8UF.js +1 -0
- package/web-ui/build/static/tremor-890wqxvH.js +1 -0
- package/web-ui/build/static/tsx-92ElsKxL.js +1 -0
- package/web-ui/build/static/tt2-DqcvjDKh.js +1 -0
- package/web-ui/build/static/turtle-BZikMsiD.js +1 -0
- package/web-ui/build/static/twig-BlxkEMdw.js +1 -0
- package/web-ui/build/static/twig-CfsoMGnv.js +1 -0
- package/web-ui/build/static/typescript-3xS8yDgH.js +1 -0
- package/web-ui/build/static/typescript-Dx0zHssr.js +1 -0
- package/web-ui/build/static/typoscript-BdFwMGCV.js +1 -0
- package/web-ui/build/static/unrealscript-DJzoqp3G.js +1 -0
- package/web-ui/build/static/uorazor-CQO8Ynpw.js +1 -0
- package/web-ui/build/static/uri-BUBBJdel.js +1 -0
- package/web-ui/build/static/v-XU798JEc.js +1 -0
- package/web-ui/build/static/vala-DsH-Nomr.js +1 -0
- package/web-ui/build/static/vala-gCVw4o0d.js +1 -0
- package/web-ui/build/static/vbnet-BHw8cZ4s.js +1 -0
- package/web-ui/build/static/vbnet-DPa2ddOk.js +1 -0
- package/web-ui/build/static/vbscript-html-CNADYJ1-.js +1 -0
- package/web-ui/build/static/vbscript-ztRmIppj.js +1 -0
- package/web-ui/build/static/velocity-DVfeN53w.js +1 -0
- package/web-ui/build/static/verilog-C9VDLRl9.js +1 -0
- package/web-ui/build/static/verilog-Dsmt_WJW.js +1 -0
- package/web-ui/build/static/vhdl-DbylNGny.js +1 -0
- package/web-ui/build/static/vhdl-wNJe3yKK.js +1 -0
- package/web-ui/build/static/vim-6PLlVaq_.js +1 -0
- package/web-ui/build/static/vim-BJpkTTe-.js +1 -0
- package/web-ui/build/static/visual-basic-GY3wXjJ3.js +1 -0
- package/web-ui/build/static/warpscript-DUb9z3yI.js +1 -0
- package/web-ui/build/static/wasm-Dey0RlHH.js +1 -0
- package/web-ui/build/static/web-idl-qAF1RqaI.js +1 -0
- package/web-ui/build/static/wiki-Dh3Vjtce.js +1 -0
- package/web-ui/build/static/wolfram-BrQcRMlt.js +1 -0
- package/web-ui/build/static/wren-Cu3Mzln6.js +1 -0
- package/web-ui/build/static/x86asm-DD5mhaEi.js +1 -0
- package/web-ui/build/static/xeora-DKRZ6hlr.js +1 -0
- package/web-ui/build/static/xl-BL8R8sAx.js +1 -0
- package/web-ui/build/static/xml-doc-BSpNJbEM.js +1 -0
- package/web-ui/build/static/xml-i5BJyEQ7.js +1 -0
- package/web-ui/build/static/xojo-r2ieNAyP.js +1 -0
- package/web-ui/build/static/xquery-BtAK8Dvl.js +1 -0
- package/web-ui/build/static/xquery-CM4Q_TX7.js +1 -0
- package/web-ui/build/static/yaml-Mm8ArZA3.js +1 -0
- package/web-ui/build/static/yaml-r-QeuY00.js +1 -0
- package/web-ui/build/static/yang-qcKR-Y23.js +1 -0
- package/web-ui/build/static/zephir-8ApHtH7c.js +1 -0
- package/web-ui/build/static/zig-BanqOd9_.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,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,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-repo contract test: the inline-JSON format that
|
|
3
|
+
* autopilot-backend's tool-call bridge produces MUST be extractable by
|
|
4
|
+
* this CLI's TagParser.
|
|
5
|
+
*
|
|
6
|
+
* The test reproduces the exact output of the backend's
|
|
7
|
+
* `formatToolCallInlineBlock` (from autopilot-backend/services/toolCallBridge.js)
|
|
8
|
+
* as a literal template string here, then feeds it to
|
|
9
|
+
* `TagParser.extractToolCommands` + `normalizeToolCommand` and asserts
|
|
10
|
+
* the extraction produces a valid tool invocation.
|
|
11
|
+
*
|
|
12
|
+
* Why the literal template: the backend and CLI are separate repos, so we
|
|
13
|
+
* can't share code. The only way to lock a cross-repo contract is to
|
|
14
|
+
* write the expected format on BOTH sides and test both ends against it.
|
|
15
|
+
* Backend: `services/__tests__/toolCallBridge.test.js` verifies
|
|
16
|
+
* `formatToolCallInlineBlock` produces this exact string. CLI: this file
|
|
17
|
+
* verifies TagParser extracts tools from the same string. If either
|
|
18
|
+
* side's format drifts, the other repo's test breaks. Works because both
|
|
19
|
+
* repos are in the same workspace — deploys happen together.
|
|
20
|
+
*
|
|
21
|
+
* The template MUST stay in lockstep with backend's formatter. Any
|
|
22
|
+
* change there requires a corresponding change here.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { describe, test, expect } from '@jest/globals';
|
|
26
|
+
import TagParser from '../../utilities/tagParser.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Reproduce the backend's `formatToolCallInlineBlock` output byte-for-byte.
|
|
30
|
+
* Must stay identical to what `autopilot-backend/services/toolCallBridge.js`
|
|
31
|
+
* emits — the single wire contract between provider tool_calls and the
|
|
32
|
+
* CLI's inline-JSON tool extraction.
|
|
33
|
+
*/
|
|
34
|
+
function bridgeOutput({ name, args }) {
|
|
35
|
+
const params = args ? JSON.parse(args) : {};
|
|
36
|
+
const paramSummary = Object.entries(params)
|
|
37
|
+
.map(([k, v]) => `${k}: ${typeof v === 'string' ? v : JSON.stringify(v)}`)
|
|
38
|
+
.join(', ')
|
|
39
|
+
.slice(0, 120);
|
|
40
|
+
return `\n**Calling ${name}** — ${paramSummary || 'no params'}…\n\n` +
|
|
41
|
+
'```json\n' +
|
|
42
|
+
JSON.stringify({ toolId: name, parameters: params }, null, 2) +
|
|
43
|
+
'\n```\n';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const parser = new TagParser();
|
|
47
|
+
|
|
48
|
+
describe('cross-repo contract: backend bridge output → CLI TagParser extraction', () => {
|
|
49
|
+
test('single tool call with string params extracts correctly', () => {
|
|
50
|
+
const bridged = bridgeOutput({
|
|
51
|
+
name: 'filesystem',
|
|
52
|
+
args: '{"action":"read","path":"/etc/hosts"}',
|
|
53
|
+
});
|
|
54
|
+
// Prefix with some assistant prose — real responses combine both.
|
|
55
|
+
const content = 'Let me check that file.' + bridged;
|
|
56
|
+
|
|
57
|
+
const commands = parser.extractToolCommands(content);
|
|
58
|
+
expect(commands.length).toBeGreaterThan(0);
|
|
59
|
+
|
|
60
|
+
const normalized = parser.normalizeToolCommand(commands[0]);
|
|
61
|
+
expect(normalized.toolId).toBe('filesystem');
|
|
62
|
+
// Parameters may land either flat on the command (unwrapped by
|
|
63
|
+
// tagParser) or inside a `parameters` object — either is fine as
|
|
64
|
+
// long as the agent has access to them. Verify at least one path.
|
|
65
|
+
const params = normalized.parameters || normalized;
|
|
66
|
+
expect(params.action).toBe('read');
|
|
67
|
+
expect(params.path).toBe('/etc/hosts');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('multiple tool calls in the same content extract as separate commands in order', () => {
|
|
71
|
+
const content =
|
|
72
|
+
'I will run two commands.' +
|
|
73
|
+
bridgeOutput({ name: 'filesystem', args: '{"path":"/a"}' }) +
|
|
74
|
+
' Then: ' +
|
|
75
|
+
bridgeOutput({ name: 'terminal', args: '{"cmd":"ls"}' });
|
|
76
|
+
|
|
77
|
+
const commands = parser.extractToolCommands(content);
|
|
78
|
+
expect(commands.length).toBeGreaterThanOrEqual(2);
|
|
79
|
+
// The parser may order by appearance; at minimum both tool ids are
|
|
80
|
+
// present.
|
|
81
|
+
const toolIds = commands.map(c => parser.normalizeToolCommand(c).toolId);
|
|
82
|
+
expect(toolIds).toContain('filesystem');
|
|
83
|
+
expect(toolIds).toContain('terminal');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('tool call with nested object params extracts with structure preserved', () => {
|
|
87
|
+
const bridged = bridgeOutput({
|
|
88
|
+
name: 'taskmanager',
|
|
89
|
+
args: JSON.stringify({
|
|
90
|
+
action: 'sync',
|
|
91
|
+
tasks: [
|
|
92
|
+
{ title: 'Task 1', priority: 'high' },
|
|
93
|
+
{ title: 'Task 2', priority: 'medium' },
|
|
94
|
+
],
|
|
95
|
+
}),
|
|
96
|
+
});
|
|
97
|
+
const commands = parser.extractToolCommands(bridged);
|
|
98
|
+
expect(commands.length).toBeGreaterThan(0);
|
|
99
|
+
const normalized = parser.normalizeToolCommand(commands[0]);
|
|
100
|
+
expect(normalized.toolId).toBe('taskmanager');
|
|
101
|
+
const params = normalized.parameters || normalized;
|
|
102
|
+
expect(params.action).toBe('sync');
|
|
103
|
+
expect(Array.isArray(params.tasks)).toBe(true);
|
|
104
|
+
expect(params.tasks).toHaveLength(2);
|
|
105
|
+
expect(params.tasks[0].title).toBe('Task 1');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('bridge output with no params (empty args object) extracts toolId correctly', () => {
|
|
109
|
+
const bridged = bridgeOutput({ name: 'jobdone', args: '{}' });
|
|
110
|
+
const commands = parser.extractToolCommands(bridged);
|
|
111
|
+
expect(commands.length).toBeGreaterThan(0);
|
|
112
|
+
const normalized = parser.normalizeToolCommand(commands[0]);
|
|
113
|
+
expect(normalized.toolId).toBe('jobdone');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('bridge output surrounded by assistant prose does not trip the extractor', () => {
|
|
117
|
+
const content =
|
|
118
|
+
"I'll analyze this step by step. First, I need to check the file.\n\n" +
|
|
119
|
+
bridgeOutput({ name: 'filesystem', args: '{"path":"/x","action":"stat"}' }) +
|
|
120
|
+
"\n\nAfter I see the metadata I'll decide next steps.";
|
|
121
|
+
|
|
122
|
+
const commands = parser.extractToolCommands(content);
|
|
123
|
+
expect(commands.length).toBeGreaterThan(0);
|
|
124
|
+
const normalized = parser.normalizeToolCommand(commands[0]);
|
|
125
|
+
expect(normalized.toolId).toBe('filesystem');
|
|
126
|
+
const params = normalized.parameters || normalized;
|
|
127
|
+
expect(params.path).toBe('/x');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
@@ -164,8 +164,18 @@ export function shouldAgentBeActive(agent) {
|
|
|
164
164
|
};
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
+
// Belt-and-suspenders: queued inbound work (user message, inter-agent
|
|
168
|
+
// ping, tool result) overrides delay/pause. Inbound enqueue paths clear
|
|
169
|
+
// delay/pause at arrival time via agentPool._wakeAgentForMessage, so in
|
|
170
|
+
// the happy path a delayed agent never has queued messages. This guard
|
|
171
|
+
// is a defensive second line: if anything bypasses the enqueue helpers
|
|
172
|
+
// (persisted state loaded mid-delay, direct mutation in legacy code,
|
|
173
|
+
// future paths) we still refuse to sideline an agent that has work to do.
|
|
174
|
+
const _queueStatus = getMessageQueueStatus(agent);
|
|
175
|
+
const _hasInboundWork = _queueStatus.hasUserMessages || _queueStatus.hasInterAgentMessages || _queueStatus.hasToolResults;
|
|
176
|
+
|
|
167
177
|
// 3. Delay check
|
|
168
|
-
if (isAgentDelayed(agent)) {
|
|
178
|
+
if (isAgentDelayed(agent) && !_hasInboundWork) {
|
|
169
179
|
return {
|
|
170
180
|
active: false,
|
|
171
181
|
reason: AGENT_ACTIVITY_STATUS.AGENT_DELAYED,
|
|
@@ -174,7 +184,7 @@ export function shouldAgentBeActive(agent) {
|
|
|
174
184
|
}
|
|
175
185
|
|
|
176
186
|
// 4. Pause check
|
|
177
|
-
if (isAgentPaused(agent)) {
|
|
187
|
+
if (isAgentPaused(agent) && !_hasInboundWork) {
|
|
178
188
|
return {
|
|
179
189
|
active: false,
|
|
180
190
|
reason: AGENT_ACTIVITY_STATUS.AGENT_PAUSED,
|
|
@@ -359,14 +369,25 @@ export function shouldSkipIteration(agent) {
|
|
|
359
369
|
return { skip: true, reason: 'Agent not found' };
|
|
360
370
|
}
|
|
361
371
|
|
|
372
|
+
// Belt-and-suspenders: a queued inbound message is a stronger signal
|
|
373
|
+
// than any delay/pause. Inbound enqueue paths (addUserMessage,
|
|
374
|
+
// addInterAgentMessage, addToolResult) call agentPool._wakeAgentForMessage
|
|
375
|
+
// to clear delay/pause *before* queueing — so in the happy path we never
|
|
376
|
+
// reach this branch with a non-empty queue AND a live delay. But if
|
|
377
|
+
// anything bypassed that (direct state mutation in tests, future code
|
|
378
|
+
// paths, persisted state loaded mid-delay with pre-existing queue), we
|
|
379
|
+
// still refuse to skip.
|
|
380
|
+
const q = getMessageQueueStatus(agent);
|
|
381
|
+
const hasInbound = q.hasUserMessages || q.hasInterAgentMessages || q.hasToolResults;
|
|
382
|
+
|
|
362
383
|
// Skip if delayed (but don't remove - delay will expire)
|
|
363
384
|
// This is also used for WebTool auto-delay to allow browser operations to complete
|
|
364
|
-
if (isAgentDelayed(agent)) {
|
|
385
|
+
if (isAgentDelayed(agent) && !hasInbound) {
|
|
365
386
|
return { skip: true, reason: `Agent delayed until ${agent.delayEndTime}` };
|
|
366
387
|
}
|
|
367
388
|
|
|
368
389
|
// Skip if paused with expiration (but don't remove - pause will expire)
|
|
369
|
-
if (agent.pausedUntil && new Date() < new Date(agent.pausedUntil)) {
|
|
390
|
+
if (agent.pausedUntil && new Date() < new Date(agent.pausedUntil) && !hasInbound) {
|
|
370
391
|
return { skip: true, reason: `Agent paused until ${agent.pausedUntil}` };
|
|
371
392
|
}
|
|
372
393
|
|
|
@@ -20,6 +20,138 @@ import {
|
|
|
20
20
|
} from '../utilities/constants.js';
|
|
21
21
|
import { getOllamaService, OLLAMA_MODEL_PREFIX } from './ollamaService.js';
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Pull the reasoning-token count out of a usage object, checking every
|
|
25
|
+
* provider shape we've seen in the fleet:
|
|
26
|
+
* - OpenAI: usage.completion_tokens_details.reasoning_tokens
|
|
27
|
+
* - Some Azure: usage.reasoning_tokens (flattened)
|
|
28
|
+
* - Claude: usage.output_tokens_details.reasoning_tokens
|
|
29
|
+
* Returns null when no reasoning tokens are reported (non-reasoning model,
|
|
30
|
+
* or provider hasn't populated the field).
|
|
31
|
+
*
|
|
32
|
+
* Surfaced even for models that don't expose reasoning content text
|
|
33
|
+
* (OpenAI o-series, gpt-5-*-reasoning variants): the count alone is useful
|
|
34
|
+
* — it tells the operator "the model spent N tokens thinking" which
|
|
35
|
+
* explains slow turns and signal "depth of deliberation" at a glance.
|
|
36
|
+
*
|
|
37
|
+
* @param {Object|null|undefined} usage
|
|
38
|
+
* @returns {number|null}
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* Parse the SSE stream emitted by autopilot-backend's `/llm/chat` route
|
|
43
|
+
* into a final response object. This is the CLI half of the backend ↔
|
|
44
|
+
* CLI wire contract (backend emission is tested in autopilot-backend's
|
|
45
|
+
* `routes/__tests__/llm.chat.reasoning.test.js`).
|
|
46
|
+
*
|
|
47
|
+
* Accepts anything that returns chunks matching the ReadableStream
|
|
48
|
+
* default-reader protocol: an object with `.read()` returning
|
|
49
|
+
* `{ done, value: Uint8Array }`. Production callers pass
|
|
50
|
+
* `response.body.getReader()`; tests pass a fake reader constructed over
|
|
51
|
+
* a fixed set of byte chunks.
|
|
52
|
+
*
|
|
53
|
+
* Event shapes understood (must match backend's emission):
|
|
54
|
+
* { type: 'start', ...metadata } → ignored
|
|
55
|
+
* { type: 'chunk', content: string } → accumulated into `content`
|
|
56
|
+
* { type: 'reasoning_chunk', content: string } → accumulated into `reasoning`
|
|
57
|
+
* { type: 'done', content, reasoning?, usage, model, finishReason } → finalizes
|
|
58
|
+
* { type: 'error', error, code } → throws
|
|
59
|
+
*
|
|
60
|
+
* Callbacks (all optional) fire progressively:
|
|
61
|
+
* onChunk(content) — on each text chunk
|
|
62
|
+
* onReasoningChunk(content) — on each reasoning chunk
|
|
63
|
+
*
|
|
64
|
+
* @param {{ read(): Promise<{done: boolean, value: Uint8Array|undefined}> }} reader
|
|
65
|
+
* @param {Object} [opts]
|
|
66
|
+
* @param {Function} [opts.onChunk]
|
|
67
|
+
* @param {Function} [opts.onReasoningChunk]
|
|
68
|
+
* @param {string} [opts.fallbackModel] Used when the final `done` event lacks `model`.
|
|
69
|
+
* @returns {Promise<{
|
|
70
|
+
* content: string, reasoning: string, reasoningTokens: number|null,
|
|
71
|
+
* usage: Object|null, model: string, finishReason: string
|
|
72
|
+
* }>}
|
|
73
|
+
*/
|
|
74
|
+
export async function _parseSSEResponseStream(reader, opts = {}) {
|
|
75
|
+
const { onChunk, onReasoningChunk, fallbackModel = null } = opts;
|
|
76
|
+
const decoder = new TextDecoder();
|
|
77
|
+
let fullContent = '';
|
|
78
|
+
let fullReasoning = '';
|
|
79
|
+
let finalData = null;
|
|
80
|
+
let lineBuffer = '';
|
|
81
|
+
|
|
82
|
+
const processLine = (line) => {
|
|
83
|
+
const trimmedLine = line.trim();
|
|
84
|
+
if (!trimmedLine.startsWith('data: ')) return;
|
|
85
|
+
const data = trimmedLine.slice(6).trim();
|
|
86
|
+
if (data === '[DONE]' || data.length === 0) return;
|
|
87
|
+
|
|
88
|
+
let parsed;
|
|
89
|
+
try { parsed = JSON.parse(data); }
|
|
90
|
+
catch { return; /* malformed SSE chunk — skip defensively */ }
|
|
91
|
+
|
|
92
|
+
if (parsed.type === 'chunk' && parsed.content) {
|
|
93
|
+
fullContent += parsed.content;
|
|
94
|
+
if (onChunk) onChunk(parsed.content);
|
|
95
|
+
} else if (parsed.type === 'reasoning_chunk' && parsed.content) {
|
|
96
|
+
fullReasoning += parsed.content;
|
|
97
|
+
if (onReasoningChunk) onReasoningChunk(parsed.content);
|
|
98
|
+
} else if (parsed.type === 'done') {
|
|
99
|
+
finalData = {
|
|
100
|
+
content: parsed.content || fullContent,
|
|
101
|
+
// Prefer the streamed accumulation; fall back to a batched `reasoning`
|
|
102
|
+
// field on the done event (rare but supported).
|
|
103
|
+
reasoning: fullReasoning || parsed.reasoning || '',
|
|
104
|
+
reasoningTokens: _extractReasoningTokens(parsed.usage),
|
|
105
|
+
usage: parsed.usage,
|
|
106
|
+
model: parsed.model || fallbackModel,
|
|
107
|
+
finishReason: parsed.finishReason || 'stop',
|
|
108
|
+
};
|
|
109
|
+
} else if (parsed.type === 'error') {
|
|
110
|
+
const error = new Error(parsed.error);
|
|
111
|
+
error.code = parsed.code;
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
// Unknown event types (e.g. 'start') are silently ignored — forward
|
|
115
|
+
// compat for future backend event additions.
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
while (true) {
|
|
119
|
+
const { done, value } = await reader.read();
|
|
120
|
+
if (done) break;
|
|
121
|
+
lineBuffer += decoder.decode(value, { stream: true });
|
|
122
|
+
const parts = lineBuffer.split('\n');
|
|
123
|
+
lineBuffer = parts.pop() || ''; // last fragment may be incomplete
|
|
124
|
+
for (const line of parts) processLine(line);
|
|
125
|
+
}
|
|
126
|
+
// Flush any trailing unterminated line (streams that end without \n).
|
|
127
|
+
if (lineBuffer.trim().length > 0) processLine(lineBuffer);
|
|
128
|
+
|
|
129
|
+
if (finalData) return finalData;
|
|
130
|
+
// Stream ended without a `done` event — return what we accumulated.
|
|
131
|
+
return {
|
|
132
|
+
content: fullContent,
|
|
133
|
+
reasoning: fullReasoning,
|
|
134
|
+
reasoningTokens: null,
|
|
135
|
+
usage: null,
|
|
136
|
+
model: fallbackModel,
|
|
137
|
+
finishReason: 'stop',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function _extractReasoningTokens(usage) {
|
|
142
|
+
if (!usage || typeof usage !== 'object') return null;
|
|
143
|
+
const candidates = [
|
|
144
|
+
usage.reasoning_tokens,
|
|
145
|
+
usage.completion_tokens_details?.reasoning_tokens,
|
|
146
|
+
usage.output_tokens_details?.reasoning_tokens,
|
|
147
|
+
usage.completionTokensDetails?.reasoningTokens,
|
|
148
|
+
];
|
|
149
|
+
for (const c of candidates) {
|
|
150
|
+
if (typeof c === 'number' && Number.isFinite(c)) return c;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
|
|
23
155
|
class AIService {
|
|
24
156
|
constructor(config, logger, budgetService, errorHandler) {
|
|
25
157
|
this.config = config;
|
|
@@ -342,8 +474,20 @@ class AIService {
|
|
|
342
474
|
// Track model reliability - mark as verified
|
|
343
475
|
this.recordModelSuccess(model);
|
|
344
476
|
|
|
477
|
+
const msg = response.choices[0]?.message || {};
|
|
478
|
+
// Non-streaming reasoning: providers that surface content text put it
|
|
479
|
+
// on the message as `reasoning_content` (DeepSeek-R1, xAI reasoning)
|
|
480
|
+
// or `reasoning` (some OpenAI-compatible gateways) or `thinking`
|
|
481
|
+
// (Anthropic when surfaced through a compatible shape). Token count
|
|
482
|
+
// comes from usage regardless of content presence.
|
|
483
|
+
const reasoning = (typeof msg.reasoning_content === 'string' && msg.reasoning_content)
|
|
484
|
+
|| (typeof msg.reasoning === 'string' && msg.reasoning)
|
|
485
|
+
|| (typeof msg.thinking === 'string' && msg.thinking)
|
|
486
|
+
|| '';
|
|
345
487
|
return {
|
|
346
|
-
content:
|
|
488
|
+
content: msg.content || '',
|
|
489
|
+
reasoning,
|
|
490
|
+
reasoningTokens: _extractReasoningTokens(response.usage),
|
|
347
491
|
model: response.model,
|
|
348
492
|
tokenUsage: response.usage,
|
|
349
493
|
requestId,
|
|
@@ -591,6 +735,11 @@ class AIService {
|
|
|
591
735
|
|
|
592
736
|
// Track accumulated content for partial return on abort
|
|
593
737
|
let fullContent = '';
|
|
738
|
+
// Reasoning/thinking accumulator hoisted to outer scope so the catch
|
|
739
|
+
// block (user-abort path) can return any reasoning captured before the
|
|
740
|
+
// abort fired. Populated from 'reasoning_chunk' SSE events inside the
|
|
741
|
+
// try block.
|
|
742
|
+
let fullReasoning = '';
|
|
594
743
|
|
|
595
744
|
try {
|
|
596
745
|
const response = await fetch(backendUrl, {
|
|
@@ -698,101 +847,37 @@ class AIService {
|
|
|
698
847
|
return fallbackResult;
|
|
699
848
|
}
|
|
700
849
|
|
|
701
|
-
//
|
|
702
|
-
//
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
850
|
+
// Parse the SSE stream via the shared helper — see `_parseSSEResponseStream`
|
|
851
|
+
// (exported for testability). The helper encodes the full backend
|
|
852
|
+
// contract: chunk/reasoning_chunk/done/error event shapes, line
|
|
853
|
+
// buffering across TCP frames, accumulation of reasoning, trailing-
|
|
854
|
+
// unterminated-line flush. Changing this contract means updating the
|
|
855
|
+
// helper AND the autopilot-backend tests that lock the emission side.
|
|
856
|
+
fullContent = ''; // Reset (declared outside try for catch block access)
|
|
857
|
+
fullReasoning = ''; // Same reason — hoisted for catch-block reuse.
|
|
706
858
|
let finalData = null;
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
//
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
for (const line of parts) {
|
|
725
|
-
const trimmedLine = line.trim();
|
|
726
|
-
if (trimmedLine.startsWith('data: ')) {
|
|
727
|
-
const data = trimmedLine.slice(6).trim();
|
|
728
|
-
|
|
729
|
-
if (data === '[DONE]') {
|
|
730
|
-
continue;
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
try {
|
|
734
|
-
const parsed = JSON.parse(data);
|
|
735
|
-
|
|
736
|
-
if (parsed.type === 'chunk' && parsed.content) {
|
|
737
|
-
fullContent += parsed.content;
|
|
738
|
-
if (onChunk) {
|
|
739
|
-
onChunk(parsed.content);
|
|
740
|
-
}
|
|
741
|
-
} else if (parsed.type === 'done') {
|
|
742
|
-
finalData = {
|
|
743
|
-
content: parsed.content || fullContent,
|
|
744
|
-
usage: parsed.usage,
|
|
745
|
-
model: parsed.model || payload.model,
|
|
746
|
-
finishReason: parsed.finishReason || 'stop'
|
|
747
|
-
};
|
|
748
|
-
} else if (parsed.type === 'error') {
|
|
749
|
-
const error = new Error(parsed.error);
|
|
750
|
-
error.code = parsed.code;
|
|
751
|
-
if (onError) {
|
|
752
|
-
onError(error);
|
|
753
|
-
}
|
|
754
|
-
throw error;
|
|
755
|
-
}
|
|
756
|
-
} catch (parseError) {
|
|
757
|
-
// Rethrow intentional backend error events (have .code from parsed.type === 'error')
|
|
758
|
-
// but never rethrow JSON SyntaxErrors — those are just malformed SSE chunks
|
|
759
|
-
if (parseError.code && !(parseError instanceof SyntaxError)) {
|
|
760
|
-
throw parseError;
|
|
761
|
-
}
|
|
762
|
-
this.logger?.debug('Skipping unparseable SSE data', {
|
|
763
|
-
requestId,
|
|
764
|
-
dataPreview: data.substring(0, 120),
|
|
765
|
-
error: parseError.message
|
|
766
|
-
});
|
|
767
|
-
continue;
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
// Process any remaining buffered data (in case stream ended without trailing newline)
|
|
774
|
-
if (lineBuffer.trim().startsWith('data: ')) {
|
|
775
|
-
const data = lineBuffer.trim().slice(6).trim();
|
|
776
|
-
if (data !== '[DONE]') {
|
|
777
|
-
try {
|
|
778
|
-
const parsed = JSON.parse(data);
|
|
779
|
-
if (parsed.type === 'done') {
|
|
780
|
-
finalData = {
|
|
781
|
-
content: parsed.content || fullContent,
|
|
782
|
-
usage: parsed.usage,
|
|
783
|
-
model: parsed.model || payload.model,
|
|
784
|
-
finishReason: parsed.finishReason || 'stop'
|
|
785
|
-
};
|
|
786
|
-
}
|
|
787
|
-
} catch (e) {
|
|
788
|
-
// Ignore parse errors on final buffer
|
|
789
|
-
}
|
|
790
|
-
}
|
|
859
|
+
try {
|
|
860
|
+
finalData = await _parseSSEResponseStream(response.body.getReader(), {
|
|
861
|
+
onChunk: (chunk) => {
|
|
862
|
+
fullContent += chunk;
|
|
863
|
+
if (onChunk) onChunk(chunk);
|
|
864
|
+
},
|
|
865
|
+
onReasoningChunk: (chunk) => {
|
|
866
|
+
fullReasoning += chunk;
|
|
867
|
+
if (options.onReasoningChunk) options.onReasoningChunk(chunk);
|
|
868
|
+
},
|
|
869
|
+
fallbackModel: payload.model,
|
|
870
|
+
});
|
|
871
|
+
} catch (streamError) {
|
|
872
|
+
// Backend `type: 'error'` events throw out of the helper with a .code.
|
|
873
|
+
// Route them through onError like the previous implementation did.
|
|
874
|
+
if (streamError?.code && onError) onError(streamError);
|
|
875
|
+
throw streamError;
|
|
791
876
|
}
|
|
792
877
|
|
|
793
878
|
// Final callback with complete data
|
|
794
879
|
if (onDone) {
|
|
795
|
-
onDone(finalData || { content: fullContent });
|
|
880
|
+
onDone(finalData || { content: fullContent, reasoning: fullReasoning, reasoningTokens: null });
|
|
796
881
|
}
|
|
797
882
|
|
|
798
883
|
// Clean up active request tracking on success
|
|
@@ -803,6 +888,8 @@ class AIService {
|
|
|
803
888
|
|
|
804
889
|
return finalData || {
|
|
805
890
|
content: fullContent,
|
|
891
|
+
reasoning: fullReasoning,
|
|
892
|
+
reasoningTokens: null,
|
|
806
893
|
usage: null,
|
|
807
894
|
model: payload.model,
|
|
808
895
|
finishReason: 'stop'
|
|
@@ -833,6 +920,8 @@ class AIService {
|
|
|
833
920
|
// Return partial content that was received before abort
|
|
834
921
|
const abortResult = {
|
|
835
922
|
content: fullContent || '', // Use accumulated content
|
|
923
|
+
reasoning: fullReasoning || '', // Preserve any reasoning captured before abort
|
|
924
|
+
reasoningTokens: null,
|
|
836
925
|
usage: null,
|
|
837
926
|
model: payload.model,
|
|
838
927
|
finishReason: 'user_abort',
|
|
@@ -714,11 +714,37 @@ export function read(messages, params = {}) {
|
|
|
714
714
|
tokenCount: _tokenCountOf(m),
|
|
715
715
|
hasToolCalls: _hasToolCalls(m),
|
|
716
716
|
model: m?.metadata?.model || null,
|
|
717
|
+
// Signal presence of reasoning even when we're not returning the text
|
|
718
|
+
// — agent can decide to re-fetch with includeReasoning=true.
|
|
719
|
+
hasReasoning: typeof m?.reasoning === 'string' && m.reasoning.length > 0,
|
|
720
|
+
reasoningTokens: Number.isFinite(m?.reasoningTokens) ? m.reasoningTokens : null,
|
|
717
721
|
};
|
|
718
722
|
const extras = detail === 'full' ? {
|
|
719
723
|
toolExecutions: Array.isArray(m?.toolExecutions) ? m.toolExecutions : [],
|
|
720
724
|
contextReferences: Array.isArray(m?.contextReferences) ? m.contextReferences : [],
|
|
721
725
|
} : {};
|
|
726
|
+
// Reasoning is opt-in on `read` because chain-of-thought can dwarf the
|
|
727
|
+
// content in token count; default slim responses skip it, callers who
|
|
728
|
+
// want the thinking text pass includeReasoning=true. When included, it
|
|
729
|
+
// gets its own byte budget (50% of maxBytes by default) so a huge
|
|
730
|
+
// reasoning block doesn't devour content or blow the response cap.
|
|
731
|
+
// Truncation marker "…(N more chars)" preserves the "hasMore" signal.
|
|
732
|
+
if (params.includeReasoning && typeof m?.reasoning === 'string' && m.reasoning.length > 0) {
|
|
733
|
+
const reasoningBudget = Math.floor(maxBytes / 2);
|
|
734
|
+
if (Buffer.byteLength(m.reasoning, 'utf-8') <= reasoningBudget) {
|
|
735
|
+
extras.reasoning = m.reasoning;
|
|
736
|
+
} else {
|
|
737
|
+
// Binary-trim to the budget (same pattern as content truncation below).
|
|
738
|
+
let lo = 0, hi = m.reasoning.length;
|
|
739
|
+
while (lo < hi) {
|
|
740
|
+
const mid = (lo + hi + 1) >>> 1;
|
|
741
|
+
if (Buffer.byteLength(m.reasoning.slice(0, mid), 'utf-8') <= reasoningBudget) lo = mid;
|
|
742
|
+
else hi = mid - 1;
|
|
743
|
+
}
|
|
744
|
+
extras.reasoning = m.reasoning.slice(0, lo) + `…(${m.reasoning.length - lo} more chars)`;
|
|
745
|
+
extras.reasoningTruncated = true;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
722
748
|
|
|
723
749
|
// Serialize incrementally: shell of the response minus content is a
|
|
724
750
|
// cheap lower bound on overhead; we give content the remaining budget.
|