onbuzz 4.7.2 → 4.8.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/scripts/grounding-bench/bench.mjs +300 -0
- package/scripts/grounding-bench/cases.js +173 -0
- package/scripts/grounding-bench/imageBuilder.js +119 -0
- package/src/core/__tests__/agentScheduler.test.js +74 -0
- package/src/core/agentScheduler.js +59 -5
- package/src/index.js +36 -0
- package/src/interfaces/webServer.js +42 -0
- package/src/services/__tests__/memoryService.test.js +521 -450
- package/src/services/__tests__/modelRouterNaming.test.js +93 -0
- package/src/services/__tests__/modelRouterService.test.js +477 -388
- package/src/services/aiService.js +136 -1
- package/src/services/grounding/GroundingModel.js +116 -0
- package/src/services/grounding/KimiAdapter.js +427 -0
- package/src/services/grounding/MockAdapter.js +125 -0
- package/src/services/grounding/__tests__/KimiAdapter.test.js +475 -0
- package/src/services/grounding/__tests__/MockAdapter.test.js +66 -0
- package/src/services/grounding/__tests__/groundingMetrics.test.js +156 -0
- package/src/services/grounding/__tests__/registry.test.js +122 -0
- package/src/services/grounding/constants.js +121 -0
- package/src/services/grounding/groundingMetrics.js +121 -0
- package/src/services/grounding/index.js +53 -0
- package/src/services/grounding/registry.js +125 -0
- package/src/services/grounding/types.js +108 -0
- package/src/services/memoryService.js +559 -521
- package/src/services/modelRouterService.js +433 -364
- package/src/services/tokenCountingService.js +2 -2
- package/src/tools/__tests__/agentCommunicationTool.test.js +752 -717
- package/src/tools/__tests__/baseTool.test.js +22 -0
- package/src/tools/__tests__/codeMapTool.test.js +388 -0
- package/src/tools/__tests__/foundryWebSearchTool.test.js +252 -0
- package/src/tools/__tests__/memoryTool.reminisce.test.js +364 -363
- package/src/tools/__tests__/memoryTool.test.js +391 -297
- package/src/tools/__tests__/parserHelpers.test.js +233 -0
- package/src/tools/__tests__/webTool.e2e.test.js +13 -1
- package/src/tools/agentCommunicationTool.js +1399 -1385
- package/src/tools/baseTool.js +19 -4
- package/src/tools/codeMapTool.js +794 -130
- package/src/tools/desktop/DesktopTool.js +638 -0
- package/src/tools/desktop/__tests__/DesktopTool.e2e.test.js +306 -0
- package/src/tools/desktop/__tests__/DesktopTool.test.js +507 -0
- package/src/tools/desktop/__tests__/osCapabilities.test.js +106 -0
- package/src/tools/desktop/__tests__/osController.test.js +364 -0
- package/src/tools/desktop/osCapabilities.js +248 -0
- package/src/tools/desktop/osController.js +491 -0
- package/src/tools/foundryWebSearchTool.js +273 -0
- package/src/tools/memoryTool.js +892 -820
- package/src/tools/parserHelpers.js +296 -0
- package/src/utilities/__tests__/planInjection.test.js +125 -0
- package/src/utilities/__tests__/tagParser.test.js +943 -887
- package/src/utilities/constants.js +1 -1
- package/src/utilities/planInjection.js +103 -0
- package/src/utilities/tagParser.js +918 -896
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-DGpIT7i5.js +1 -0
- package/web-ui/build/static/abap-5wFDdWLh.js +1 -0
- package/web-ui/build/static/abnf-BP1dpNSE.js +1 -0
- package/web-ui/build/static/abnf-DBEIAl8g.js +1 -0
- package/web-ui/build/static/accesslog-CWSM_T5E.js +1 -0
- package/web-ui/build/static/actionscript-DONkco1J.js +1 -0
- package/web-ui/build/static/actionscript-FqBYk5er.js +1 -0
- package/web-ui/build/static/ada-C2JLRIaM.js +1 -0
- package/web-ui/build/static/ada-gKiygTRK.js +1 -0
- package/web-ui/build/static/agda-CkSODqK2.js +1 -0
- package/web-ui/build/static/al-BJ_YR6p7.js +1 -0
- package/web-ui/build/static/angelscript-Dg2byMGg.js +1 -0
- package/web-ui/build/static/antlr4-BnpyaFNr.js +1 -0
- package/web-ui/build/static/apache-Dffxsd7O.js +1 -0
- package/web-ui/build/static/apacheconf-DLitjtWj.js +1 -0
- package/web-ui/build/static/apex-Drr_IvU2.js +1 -0
- package/web-ui/build/static/apl-CF6qxmXG.js +1 -0
- package/web-ui/build/static/applescript-CjOlw3b_.js +1 -0
- package/web-ui/build/static/applescript-DjkSl1Ry.js +1 -0
- package/web-ui/build/static/aql-KwVmK1gP.js +1 -0
- package/web-ui/build/static/arcade-CENSXx0R.js +1 -0
- package/web-ui/build/static/arduino-B3Ta9Fll.js +1 -0
- package/web-ui/build/static/arduino-CzcsaB9_.js +1 -0
- package/web-ui/build/static/arff-CMJSVt_O.js +1 -0
- package/web-ui/build/static/armasm-0zSgSPB4.js +1 -0
- package/web-ui/build/static/asciidoc-B8K5ctWq.js +1 -0
- package/web-ui/build/static/asciidoc-bk2Sg6b6.js +1 -0
- package/web-ui/build/static/asm6502-ji6zm4FQ.js +1 -0
- package/web-ui/build/static/asmatmel-DJqObM4Y.js +1 -0
- package/web-ui/build/static/aspectj-DqQKI7J5.js +1 -0
- package/web-ui/build/static/aspnet-9cenTxW7.js +1 -0
- package/web-ui/build/static/autohotkey-C6EhiZvl.js +1 -0
- package/web-ui/build/static/autohotkey-sTGJOvMM.js +1 -0
- package/web-ui/build/static/autoit-B0Im8iQ1.js +1 -0
- package/web-ui/build/static/autoit-CO6pUD0H.js +1 -0
- package/web-ui/build/static/avisynth-OvOHTfj5.js +1 -0
- package/web-ui/build/static/avrasm-BLWZ5Mye.js +1 -0
- package/web-ui/build/static/avro-idl-BB2ODvnw.js +1 -0
- package/web-ui/build/static/awk-_jhMabQ0.js +1 -0
- package/web-ui/build/static/axapta-DdBRgoYy.js +1 -0
- package/web-ui/build/static/bash-CsaRGXBQ.js +1 -0
- package/web-ui/build/static/bash-CxLFkwAC.js +1 -0
- package/web-ui/build/static/basic-BJyy7JJE.js +1 -0
- package/web-ui/build/static/basic-CrMb-gv0.js +1 -0
- package/web-ui/build/static/batch-BvcykMe5.js +1 -0
- package/web-ui/build/static/bbcode-EOBuY5Y6.js +1 -0
- package/web-ui/build/static/bicep-QkDJBA34.js +1 -0
- package/web-ui/build/static/birb-TAOxKurn.js +1 -0
- package/web-ui/build/static/bison-BEK6cnad.js +1 -0
- package/web-ui/build/static/bnf-DfEODxsr.js +1 -0
- package/web-ui/build/static/bnf-DhbMjsuA.js +1 -0
- package/web-ui/build/static/brainfuck-BoVocOa7.js +1 -0
- package/web-ui/build/static/brainfuck-DDC5QXPK.js +1 -0
- package/web-ui/build/static/brightscript-DNN598w2.js +1 -0
- package/web-ui/build/static/bro-Cn_jjZ8P.js +1 -0
- package/web-ui/build/static/bsl-CMCN75Gu.js +1 -0
- package/web-ui/build/static/c-DbOGQnEJ.js +1 -0
- package/web-ui/build/static/c-kggwYFsy.js +1 -0
- package/web-ui/build/static/c-like-BIsuUvof.js +1 -0
- package/web-ui/build/static/cal-DpgMsBZE.js +1 -0
- package/web-ui/build/static/capnproto-C1AHYI-M.js +1 -0
- package/web-ui/build/static/ceylon-pvJffDe1.js +1 -0
- package/web-ui/build/static/cfscript-C1qylu52.js +1 -0
- package/web-ui/build/static/chaiscript-D417WKRI.js +1 -0
- package/web-ui/build/static/cil-CjbZHbcY.js +1 -0
- package/web-ui/build/static/clean-Dvc6R-F2.js +1 -0
- package/web-ui/build/static/clojure-CSVRQPMQ.js +1 -0
- package/web-ui/build/static/clojure-ig1Vkg7X.js +1 -0
- package/web-ui/build/static/clojure-repl-C1uyEabk.js +1 -0
- package/web-ui/build/static/cmake-DSbVcAB3.js +1 -0
- package/web-ui/build/static/cmake-Zp8kPwnH.js +1 -0
- package/web-ui/build/static/cobol-OsZSiK_P.js +1 -0
- package/web-ui/build/static/coffeescript-D8r0416S.js +1 -0
- package/web-ui/build/static/coffeescript-DCpgClxh.js +1 -0
- package/web-ui/build/static/concurnas-DKnsxUOc.js +1 -0
- package/web-ui/build/static/coq-BQFlywVI.js +1 -0
- package/web-ui/build/static/coq-BvS9mQB2.js +1 -0
- package/web-ui/build/static/cos-D3ze2791.js +1 -0
- package/web-ui/build/static/cpp-Bw-cV3P1.js +1 -0
- package/web-ui/build/static/cpp-vi1p7XpB.js +1 -0
- package/web-ui/build/static/crmsh-BClnJTeQ.js +1 -0
- package/web-ui/build/static/crystal-DGzOUYZq.js +1 -0
- package/web-ui/build/static/crystal-DMzk6EvA.js +1 -0
- package/web-ui/build/static/csharp-BTom8s2X.js +1 -0
- package/web-ui/build/static/csharp-Cp2V3jfR.js +1 -0
- package/web-ui/build/static/cshtml-Dmtt9Kto.js +1 -0
- package/web-ui/build/static/csp-WPVsLe9_.js +1 -0
- package/web-ui/build/static/csp-qddj5fu_.js +1 -0
- package/web-ui/build/static/css-B0FAm7kj.js +1 -0
- package/web-ui/build/static/css-extras-Bx3pvjiG.js +1 -0
- package/web-ui/build/static/csv-CH-edgS5.js +1 -0
- package/web-ui/build/static/cypher-c3G8Leew.js +1 -0
- package/web-ui/build/static/d-BMDSy22_.js +1 -0
- package/web-ui/build/static/d-BdH4oW8-.js +1 -0
- package/web-ui/build/static/dart-C-r72q-O.js +1 -0
- package/web-ui/build/static/dart-CwpBMrKa.js +1 -0
- package/web-ui/build/static/dataweave-BPvqdt4k.js +1 -0
- package/web-ui/build/static/dax-Eyy6ixcN.js +1 -0
- package/web-ui/build/static/delphi-DhEbPj_5.js +1 -0
- package/web-ui/build/static/dhall-Ct1L8sN1.js +1 -0
- package/web-ui/build/static/diff-CSTqCgwn.js +1 -0
- package/web-ui/build/static/diff-Da97B5vW.js +1 -0
- package/web-ui/build/static/django-DGit_lCg.js +1 -0
- package/web-ui/build/static/django-DPgqFB8k.js +1 -0
- package/web-ui/build/static/dns-DUyXuZ-a.js +1 -0
- package/web-ui/build/static/dns-zone-file-D79MDxVG.js +1 -0
- package/web-ui/build/static/docker-DTiy4o38.js +1 -0
- package/web-ui/build/static/dockerfile-CvwPP8wE.js +1 -0
- package/web-ui/build/static/dos-CaIUWxvb.js +1 -0
- package/web-ui/build/static/dot-D3504w6Y.js +1 -0
- package/web-ui/build/static/dsconfig-Smy1eeX_.js +1 -0
- package/web-ui/build/static/dts-DyTYSXZj.js +1 -0
- package/web-ui/build/static/dust-CrJyi6qA.js +1 -0
- package/web-ui/build/static/ebnf-C8nqfkBH.js +1 -0
- package/web-ui/build/static/ebnf-Cuh5Vh2-.js +1 -0
- package/web-ui/build/static/editorconfig-C7pTGl6n.js +1 -0
- package/web-ui/build/static/eiffel-C75MSJCA.js +1 -0
- package/web-ui/build/static/ejs-Dyo7DF5w.js +1 -0
- package/web-ui/build/static/elixir-D4yJefOc.js +1 -0
- package/web-ui/build/static/elixir-DKRow2SJ.js +1 -0
- package/web-ui/build/static/elm-CgbdDlkT.js +1 -0
- package/web-ui/build/static/elm-D3N-UgU0.js +1 -0
- package/web-ui/build/static/erb-BsITh8qW.js +1 -0
- package/web-ui/build/static/erb-lY_LyKyS.js +1 -0
- package/web-ui/build/static/erlang-BCnPiYmB.js +1 -0
- package/web-ui/build/static/erlang-JEghiPXc.js +1 -0
- package/web-ui/build/static/erlang-repl-DzU97ugC.js +1 -0
- package/web-ui/build/static/etlua-CsBo8cJa.js +1 -0
- package/web-ui/build/static/excel-formula-C2piiCYa.js +1 -0
- package/web-ui/build/static/excel-kqNypwQD.js +1 -0
- package/web-ui/build/static/factor-DZTOhkyU.js +1 -0
- package/web-ui/build/static/false-yLjhfaSw.js +1 -0
- package/web-ui/build/static/firestore-security-rules-oaQNoH8l.js +1 -0
- package/web-ui/build/static/fix-C9IfnTuS.js +1 -0
- package/web-ui/build/static/flix-EmJ_JhPo.js +1 -0
- package/web-ui/build/static/flow-DCUl7IAQ.js +1 -0
- package/web-ui/build/static/fortran-DvyxJmFN.js +1 -0
- package/web-ui/build/static/fortran-EEP9R3S5.js +1 -0
- package/web-ui/build/static/fsharp-D_98s3RX.js +1 -0
- package/web-ui/build/static/fsharp-Dt9jOO5G.js +1 -0
- package/web-ui/build/static/ftl-C8gMHWLo.js +1 -0
- package/web-ui/build/static/gams-BHxVPb4z.js +1 -0
- package/web-ui/build/static/gap-DFtyHk-q.js +1 -0
- package/web-ui/build/static/gauss-BwhJWUcg.js +1 -0
- package/web-ui/build/static/gcode-BvmXwp09.js +1 -0
- package/web-ui/build/static/gcode-gWcD6Vc7.js +1 -0
- package/web-ui/build/static/gdscript-btHoX8RE.js +1 -0
- package/web-ui/build/static/gedcom-MgPs9iqh.js +1 -0
- package/web-ui/build/static/gherkin-B9c_Q16A.js +1 -0
- package/web-ui/build/static/gherkin-BvOgkK6h.js +1 -0
- package/web-ui/build/static/git-D9XWOVcQ.js +1 -0
- package/web-ui/build/static/glsl-CshBHxHY.js +1 -0
- package/web-ui/build/static/glsl-fNRUMTDr.js +1 -0
- package/web-ui/build/static/gml-B78deHK8.js +1 -0
- package/web-ui/build/static/gml-Cj7d2u8O.js +1 -0
- package/web-ui/build/static/gn-CJLD-mF1.js +1 -0
- package/web-ui/build/static/go-CT93BEkL.js +1 -0
- package/web-ui/build/static/go-CTTlNuQO.js +1 -0
- package/web-ui/build/static/go-module-BgnXboUE.js +1 -0
- package/web-ui/build/static/golo-2S5tXS-l.js +1 -0
- package/web-ui/build/static/gradle-8W8DCcWJ.js +1 -0
- package/web-ui/build/static/graphql-DZfp6FNU.js +1 -0
- package/web-ui/build/static/groovy-BfsyMb3X.js +1 -0
- package/web-ui/build/static/groovy-Dxov7ENz.js +1 -0
- package/web-ui/build/static/haml-BlUFsdVV.js +1 -0
- package/web-ui/build/static/haml-CjVj6vvW.js +1 -0
- package/web-ui/build/static/handlebars-DxrQFkyA.js +1 -0
- package/web-ui/build/static/handlebars-FE6fotYl.js +1 -0
- package/web-ui/build/static/haskell-B6z0RCD_.js +1 -0
- package/web-ui/build/static/haskell-JBFmJTRy.js +1 -0
- package/web-ui/build/static/haxe-BtMZMi-_.js +1 -0
- package/web-ui/build/static/haxe-C1J8n-fH.js +1 -0
- package/web-ui/build/static/hcl-DJP-bFWE.js +1 -0
- package/web-ui/build/static/hlsl-DrGjhs1b.js +1 -0
- package/web-ui/build/static/hoon-Cg-ZhqIT.js +1 -0
- package/web-ui/build/static/hpkp-D07vgmoZ.js +1 -0
- package/web-ui/build/static/hsp-CsypPWoA.js +1 -0
- package/web-ui/build/static/hsts-B6DMRxvP.js +1 -0
- package/web-ui/build/static/htmlbars-BI7_Hw4e.js +1 -0
- package/web-ui/build/static/http-90ihEi4s.js +1 -0
- package/web-ui/build/static/http-Dp4QXj9E.js +1 -0
- package/web-ui/build/static/hy-BMgKvP4K.js +1 -0
- package/web-ui/build/static/ichigojam-D6wKvJDb.js +1 -0
- package/web-ui/build/static/icon-CrgkmCwl.js +1 -0
- package/web-ui/build/static/icu-message-format-Bi2JxCXs.js +1 -0
- package/web-ui/build/static/idris-DbUsyZt5.js +1 -0
- package/web-ui/build/static/iecst-CQZ9t8fW.js +1 -0
- package/web-ui/build/static/ignore-BaFgtNMs.js +1 -0
- package/web-ui/build/static/index-DEWSWosh.css +1 -0
- package/web-ui/build/static/index-Di1bjCFA.js +13 -0
- package/web-ui/build/static/index-otR_WSsL.js +1 -0
- package/web-ui/build/static/index-whZPU4as.js +1183 -0
- package/web-ui/build/static/inform7-ClyX1Gro.js +1 -0
- package/web-ui/build/static/inform7-tZHBS5XP.js +1 -0
- package/web-ui/build/static/ini-BrP5JNYL.js +1 -0
- package/web-ui/build/static/ini-CVkrAhwV.js +1 -0
- package/web-ui/build/static/io-BJ1Y6Bdc.js +1 -0
- package/web-ui/build/static/irpf90-fjjcKS_8.js +1 -0
- package/web-ui/build/static/isbl-ClpvfUIz.js +1 -0
- package/web-ui/build/static/j-CICW77xS.js +1 -0
- package/web-ui/build/static/java-B9DFK-0E.js +1 -0
- package/web-ui/build/static/java-BL_6rYko.js +1 -0
- package/web-ui/build/static/javadoc-Cc4HKpKK.js +1 -0
- package/web-ui/build/static/javadoclike-CgNkUDOm.js +1 -0
- package/web-ui/build/static/javascript-CM40ZECq.js +1 -0
- package/web-ui/build/static/javastacktrace-BHSqXfG5.js +1 -0
- package/web-ui/build/static/jboss-cli-Bv5NhVSZ.js +1 -0
- package/web-ui/build/static/jexl--Ohk_keA.js +1 -0
- package/web-ui/build/static/jolie-DMTN5Vdf.js +1 -0
- package/web-ui/build/static/jq-nXRLldXX.js +1 -0
- package/web-ui/build/static/js-extras-eLwv3frs.js +1 -0
- package/web-ui/build/static/js-templates-Ca0owlrg.js +1 -0
- package/web-ui/build/static/jsdoc-KERXp0da.js +1 -0
- package/web-ui/build/static/json-BTjLaRsy.js +1 -0
- package/web-ui/build/static/json-p7pU0qdW.js +1 -0
- package/web-ui/build/static/json5-Cxjy1udc.js +1 -0
- package/web-ui/build/static/jsonp-CO52H7Gy.js +1 -0
- package/web-ui/build/static/jsstacktrace-8YKfoyJP.js +1 -0
- package/web-ui/build/static/jsx-Ct_05KbM.js +1 -0
- package/web-ui/build/static/julia-23I1ubCE.js +1 -0
- package/web-ui/build/static/julia-d8rVGed_.js +1 -0
- package/web-ui/build/static/julia-repl-mwnHedW_.js +1 -0
- package/web-ui/build/static/keepalived-E85Rx_fF.js +1 -0
- package/web-ui/build/static/keyman-aWd3QUDq.js +1 -0
- package/web-ui/build/static/kotlin-Cu370hQq.js +1 -0
- package/web-ui/build/static/kotlin-DoJ2WnmZ.js +1 -0
- package/web-ui/build/static/kumir-oiOgqcQO.js +1 -0
- package/web-ui/build/static/kusto-Bp-B02K5.js +1 -0
- package/web-ui/build/static/lasso-BxoQVwOO.js +1 -0
- package/web-ui/build/static/latex-CANm5vsX.js +1 -0
- package/web-ui/build/static/latex-PMroeNch.js +1 -0
- package/web-ui/build/static/latte-2ErU_2XF.js +1 -0
- package/web-ui/build/static/ldif-ChPn_F7o.js +1 -0
- package/web-ui/build/static/leaf-UkCugDgG.js +1 -0
- package/web-ui/build/static/less-CCH5RA89.js +1 -0
- package/web-ui/build/static/less-CGZbVU1g.js +1 -0
- package/web-ui/build/static/lilypond-BoyM37sv.js +1 -0
- package/web-ui/build/static/liquid-DGJVpRBi.js +1 -0
- package/web-ui/build/static/lisp-93nne61u.js +1 -0
- package/web-ui/build/static/lisp-DYjIRsXz.js +1 -0
- package/web-ui/build/static/livecodeserver-CfNaxIE4.js +1 -0
- package/web-ui/build/static/livescript-C8kDlQkz.js +1 -0
- package/web-ui/build/static/livescript-CoarnRHq.js +1 -0
- package/web-ui/build/static/llvm-CBVyNmAh.js +1 -0
- package/web-ui/build/static/llvm-DGxq8a7u.js +1 -0
- package/web-ui/build/static/log-BivgwFql.js +1 -0
- package/web-ui/build/static/lolcode-l5sK2cZz.js +1 -0
- package/web-ui/build/static/lsl-Xm44xLRQ.js +1 -0
- package/web-ui/build/static/lua-CGvrzfKp.js +1 -0
- package/web-ui/build/static/lua-nHwXeY4c.js +1 -0
- package/web-ui/build/static/magma-DmNItmna.js +1 -0
- package/web-ui/build/static/makefile-CKJNNHGb.js +1 -0
- package/web-ui/build/static/makefile-DI6y5Qml.js +1 -0
- package/web-ui/build/static/markdown-BgpbxKd-.js +1 -0
- package/web-ui/build/static/markdown-CvcxA4yk.js +1 -0
- package/web-ui/build/static/markup-templating-DijqesiA.js +1 -0
- package/web-ui/build/static/mathematica-Cxll1Q10.js +1 -0
- package/web-ui/build/static/matlab-BJo2T1A-.js +1 -0
- package/web-ui/build/static/matlab-C6DlZX4l.js +1 -0
- package/web-ui/build/static/maxima-DJXO4sbL.js +1 -0
- package/web-ui/build/static/maxscript-DdLpUYBs.js +1 -0
- package/web-ui/build/static/mel-BIpfnSyZ.js +1 -0
- package/web-ui/build/static/mel-BYcTUZJW.js +1 -0
- package/web-ui/build/static/mercury-C_LSpbD8.js +1 -0
- package/web-ui/build/static/mermaid-D9yBWnrT.js +1 -0
- package/web-ui/build/static/mipsasm-nR_K2Ue-.js +1 -0
- package/web-ui/build/static/mizar-BeLUPncD.js +1 -0
- package/web-ui/build/static/mizar-BesIbZd9.js +1 -0
- package/web-ui/build/static/mojolicious-cBx3OWa-.js +1 -0
- package/web-ui/build/static/mongodb-DTWKy9ac.js +1 -0
- package/web-ui/build/static/monkey-B72bZC3c.js +1 -0
- package/web-ui/build/static/monkey-G9XELYPQ.js +1 -0
- package/web-ui/build/static/moonscript-BXYVQiqj.js +1 -0
- package/web-ui/build/static/moonscript-sDd-5knz.js +1 -0
- package/web-ui/build/static/n1ql-0vKSfFAO.js +1 -0
- package/web-ui/build/static/n1ql-C9_BSZfz.js +1 -0
- package/web-ui/build/static/n4js-B7Ct8dds.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-p9gpphTM.js +1 -0
- package/web-ui/build/static/naniscript-6ZVr8Aug.js +1 -0
- package/web-ui/build/static/nasm-Ca73yTUt.js +1 -0
- package/web-ui/build/static/neon-DNP49oyX.js +1 -0
- package/web-ui/build/static/nevod-Qhgt7Bce.js +1 -0
- package/web-ui/build/static/nginx-D5e7lu62.js +1 -0
- package/web-ui/build/static/nginx-DobnyESB.js +1 -0
- package/web-ui/build/static/nim-BPBivUOV.js +1 -0
- package/web-ui/build/static/nim-Baoug1Wa.js +1 -0
- package/web-ui/build/static/nix-CSPTQs5y.js +1 -0
- package/web-ui/build/static/nix-Dk4eNw49.js +1 -0
- package/web-ui/build/static/node-repl-NJNL8VFR.js +1 -0
- package/web-ui/build/static/nsis-BZ0oMzEw.js +1 -0
- package/web-ui/build/static/nsis-CKPCjtCU.js +1 -0
- package/web-ui/build/static/objectivec-BkfIRhhV.js +1 -0
- package/web-ui/build/static/objectivec-CnQgqhbJ.js +1 -0
- package/web-ui/build/static/ocaml-9rGNzRrK.js +1 -0
- package/web-ui/build/static/ocaml-CTolCqxL.js +1 -0
- package/web-ui/build/static/opencl-9Q3vRDxv.js +1 -0
- package/web-ui/build/static/openqasm-D2QiuFBp.js +1 -0
- package/web-ui/build/static/openscad-C3HyuzpB.js +1 -0
- package/web-ui/build/static/oxygene-4gi-VYy_.js +1 -0
- package/web-ui/build/static/oz-BGDEB-1A.js +1 -0
- package/web-ui/build/static/parigp-CfZzp1uE.js +1 -0
- package/web-ui/build/static/parser-UbGteTcy.js +1 -0
- package/web-ui/build/static/parser3-C-Jx-fy7.js +1 -0
- package/web-ui/build/static/pascal-D1_R0gW-.js +1 -0
- package/web-ui/build/static/pascaligo-B8C-98Np.js +1 -0
- package/web-ui/build/static/pcaxis-TGnlUKNs.js +1 -0
- package/web-ui/build/static/peoplecode-C5Vf1AH0.js +1 -0
- package/web-ui/build/static/perl-CBp1N62T.js +1 -0
- package/web-ui/build/static/perl-Z59j904t.js +1 -0
- package/web-ui/build/static/pf-Cq8B_xwQ.js +1 -0
- package/web-ui/build/static/pgsql-ofJbUHkL.js +1 -0
- package/web-ui/build/static/php-OlH7HLQJ.js +1 -0
- package/web-ui/build/static/php-extras-GqtrxLuk.js +1 -0
- package/web-ui/build/static/php-r09kMDOB.js +1 -0
- package/web-ui/build/static/php-template-18uT97Qo.js +1 -0
- package/web-ui/build/static/phpdoc-9tRFvup9.js +1 -0
- package/web-ui/build/static/plaintext-DsYT6Mu-.js +1 -0
- package/web-ui/build/static/plsql-RhWQNJVb.js +1 -0
- package/web-ui/build/static/pony-DD6JMLYI.js +1 -0
- package/web-ui/build/static/powerquery-CALow-bt.js +1 -0
- package/web-ui/build/static/powershell-C2QvIuKF.js +1 -0
- package/web-ui/build/static/powershell-yrbJEhCh.js +1 -0
- package/web-ui/build/static/processing-1T5w_Q03.js +1 -0
- package/web-ui/build/static/processing-DBim_dO-.js +1 -0
- package/web-ui/build/static/profile-Cdloh8mZ.js +1 -0
- package/web-ui/build/static/prolog-DRSsNnns.js +1 -0
- package/web-ui/build/static/prolog-D_ajweDr.js +1 -0
- package/web-ui/build/static/promql-BRuwn6Bn.js +1 -0
- package/web-ui/build/static/properties-D5Wyl4X4.js +1 -0
- package/web-ui/build/static/properties-kn4fl1bl.js +1 -0
- package/web-ui/build/static/protobuf-BMO76zWi.js +1 -0
- package/web-ui/build/static/protobuf-CTUCF-U-.js +1 -0
- package/web-ui/build/static/psl-CiqYdQbY.js +1 -0
- package/web-ui/build/static/pug-BLE2Qayj.js +1 -0
- package/web-ui/build/static/puppet-CFKLWXft.js +1 -0
- package/web-ui/build/static/puppet-DQci0Dl5.js +1 -0
- package/web-ui/build/static/pure-D2h_GynV.js +1 -0
- package/web-ui/build/static/purebasic-BF8MVw8V.js +1 -0
- package/web-ui/build/static/purebasic-BTtHiCkh.js +1 -0
- package/web-ui/build/static/purescript-D1ZSh-sH.js +1 -0
- package/web-ui/build/static/python-Cp9_Vdhb.js +1 -0
- package/web-ui/build/static/python-DdgNw8IW.js +1 -0
- package/web-ui/build/static/python-repl-DvK89VMC.js +1 -0
- package/web-ui/build/static/q-COaIgwhT.js +1 -0
- package/web-ui/build/static/q-Cm0dQkW8.js +1 -0
- package/web-ui/build/static/qml-BpsOqqJM.js +1 -0
- package/web-ui/build/static/qml-BziQXlU4.js +1 -0
- package/web-ui/build/static/qore-Cutz6g-2.js +1 -0
- package/web-ui/build/static/qsharp-B16619X1.js +1 -0
- package/web-ui/build/static/r-CFUIj5Hd.js +1 -0
- package/web-ui/build/static/r-CPrwCi5w.js +1 -0
- package/web-ui/build/static/racket-Bh08DFXF.js +1 -0
- package/web-ui/build/static/reason-BxjDq4e-.js +1 -0
- package/web-ui/build/static/reasonml-Ds5SsGP8.js +1 -0
- package/web-ui/build/static/regex-DhBIDIMI.js +1 -0
- package/web-ui/build/static/rego-DCwxZXcB.js +1 -0
- package/web-ui/build/static/renpy-C2fuQfqb.js +1 -0
- package/web-ui/build/static/rest-C52ZpxWQ.js +1 -0
- package/web-ui/build/static/rib-Cbl2Mzyj.js +1 -0
- package/web-ui/build/static/rip-BTOu5ZIE.js +1 -0
- package/web-ui/build/static/roboconf-3Oi2wuVk.js +1 -0
- package/web-ui/build/static/roboconf-ndLZLE39.js +1 -0
- package/web-ui/build/static/robotframework-BzHXiIj1.js +1 -0
- package/web-ui/build/static/routeros-CkpPoqx-.js +1 -0
- package/web-ui/build/static/rsl-C0bwOQ38.js +1 -0
- package/web-ui/build/static/ruby-C_hIhtuQ.js +1 -0
- package/web-ui/build/static/ruby-DvKfZPzj.js +1 -0
- package/web-ui/build/static/ruleslanguage-CbZJlddz.js +1 -0
- package/web-ui/build/static/rust-BFPIhB-X.js +1 -0
- package/web-ui/build/static/rust-sBpUq-qE.js +1 -0
- package/web-ui/build/static/sas-BCXvYN9x.js +1 -0
- package/web-ui/build/static/sas-D7GAsTY3.js +1 -0
- package/web-ui/build/static/sass-BdaErGMN.js +1 -0
- package/web-ui/build/static/scala-Cj81oCl9.js +1 -0
- package/web-ui/build/static/scala-CvbksfY6.js +1 -0
- package/web-ui/build/static/scheme-BM5ZqKnl.js +1 -0
- package/web-ui/build/static/scheme-BPvlu9Tk.js +1 -0
- package/web-ui/build/static/scilab-CJanLKQN.js +1 -0
- package/web-ui/build/static/scss-C53YF_7f.js +1 -0
- package/web-ui/build/static/scss-DPp8UZbr.js +1 -0
- package/web-ui/build/static/shell-CC9bQXMe.js +1 -0
- package/web-ui/build/static/shell-session-CuR3fbf-.js +1 -0
- package/web-ui/build/static/smali-CUgLls3D.js +1 -0
- package/web-ui/build/static/smali-YODSX8qt.js +1 -0
- package/web-ui/build/static/smalltalk-BMJQ4bbs.js +1 -0
- package/web-ui/build/static/smalltalk-BVGY3CTl.js +1 -0
- package/web-ui/build/static/smarty-C9aNt4-p.js +1 -0
- package/web-ui/build/static/sml-C3BIHhfq.js +1 -0
- package/web-ui/build/static/sml-DTipyRmY.js +1 -0
- package/web-ui/build/static/solidity-1yuPUqoC.js +1 -0
- package/web-ui/build/static/solution-file-BgzK4GOU.js +1 -0
- package/web-ui/build/static/soy-CFJXRvqc.js +1 -0
- package/web-ui/build/static/sparql-CAosYMpl.js +1 -0
- package/web-ui/build/static/splunk-spl-DkINtWr8.js +1 -0
- package/web-ui/build/static/sqf-DbrWIS2M.js +1 -0
- package/web-ui/build/static/sqf-nq8Q9J2W.js +1 -0
- package/web-ui/build/static/sql-9bwClhZQ.js +1 -0
- package/web-ui/build/static/sql-CqPkY-lX.js +1 -0
- package/web-ui/build/static/sql_more-CsY5ts77.js +1 -0
- package/web-ui/build/static/squirrel-BuqtzRBD.js +1 -0
- package/web-ui/build/static/stan-BNxBSglc.js +1 -0
- package/web-ui/build/static/stan-CZVMc34l.js +1 -0
- package/web-ui/build/static/stata-DKnVdHCd.js +1 -0
- package/web-ui/build/static/step21-Cu_TaBGF.js +1 -0
- package/web-ui/build/static/stylus-BS7-OJew.js +1 -0
- package/web-ui/build/static/stylus-DtFrp1Nk.js +1 -0
- package/web-ui/build/static/subunit-DDCoWkkc.js +1 -0
- package/web-ui/build/static/swift-BaguUZbl.js +1 -0
- package/web-ui/build/static/swift-mwBsb8Bx.js +1 -0
- package/web-ui/build/static/systemd-D6PpyDKk.js +1 -0
- package/web-ui/build/static/t4-cs-Cem8g4Ck.js +1 -0
- package/web-ui/build/static/t4-templating-BZo-HjmD.js +1 -0
- package/web-ui/build/static/t4-vb-B4oVnKa4.js +1 -0
- package/web-ui/build/static/taggerscript-DweAZ5pw.js +1 -0
- package/web-ui/build/static/tap-DpuvKHHF.js +1 -0
- package/web-ui/build/static/tap-hUKmJObZ.js +1 -0
- package/web-ui/build/static/tcl-BUvhAi7u.js +1 -0
- package/web-ui/build/static/tcl-Dsck63d8.js +1 -0
- package/web-ui/build/static/textile-CgKbqJ-j.js +1 -0
- package/web-ui/build/static/thrift-B5H6rApp.js +1 -0
- package/web-ui/build/static/toml-DggTpfOo.js +1 -0
- package/web-ui/build/static/tp-CazB2P2X.js +1 -0
- package/web-ui/build/static/tremor-B1jy7S5p.js +1 -0
- package/web-ui/build/static/tsx-BqF2lVDi.js +1 -0
- package/web-ui/build/static/tt2-BNoNXpEe.js +1 -0
- package/web-ui/build/static/turtle-B0evd5mn.js +1 -0
- package/web-ui/build/static/twig-B5A7nMdv.js +1 -0
- package/web-ui/build/static/twig-DZnLWvh8.js +1 -0
- package/web-ui/build/static/typescript-Bbe_P093.js +1 -0
- package/web-ui/build/static/typescript-BfhvmSSG.js +1 -0
- package/web-ui/build/static/typoscript-BjuZEIgw.js +1 -0
- package/web-ui/build/static/unrealscript-C3iUCFRi.js +1 -0
- package/web-ui/build/static/uorazor-CbZXwzIj.js +1 -0
- package/web-ui/build/static/uri-xMPSnp6m.js +1 -0
- package/web-ui/build/static/v-BKcGo5I6.js +1 -0
- package/web-ui/build/static/vala-BRoBE4am.js +1 -0
- package/web-ui/build/static/vala-B__Iyrma.js +1 -0
- package/web-ui/build/static/vbnet-DBxlMRvN.js +1 -0
- package/web-ui/build/static/vbnet-DjAXt5BE.js +1 -0
- package/web-ui/build/static/vbscript-BNA4oANi.js +1 -0
- package/web-ui/build/static/vbscript-html-o8ckLPKG.js +1 -0
- package/web-ui/build/static/velocity-D7sc5ggA.js +1 -0
- package/web-ui/build/static/verilog-BWJfMIng.js +1 -0
- package/web-ui/build/static/verilog-jW2GPC--.js +1 -0
- package/web-ui/build/static/vhdl-BIVlXRPa.js +1 -0
- package/web-ui/build/static/vhdl-BeqdhhxD.js +1 -0
- package/web-ui/build/static/vim-712lI4-g.js +1 -0
- package/web-ui/build/static/vim-DMROTzr0.js +1 -0
- package/web-ui/build/static/visual-basic-CQfbM-ta.js +1 -0
- package/web-ui/build/static/warpscript-DFAvCXFQ.js +1 -0
- package/web-ui/build/static/wasm-CiYoxBl0.js +1 -0
- package/web-ui/build/static/web-idl-DoCkPK8y.js +1 -0
- package/web-ui/build/static/wiki-bvz0AGzB.js +1 -0
- package/web-ui/build/static/wolfram-fBuyFEgU.js +1 -0
- package/web-ui/build/static/wren-DvATFxjF.js +1 -0
- package/web-ui/build/static/x86asm-r4bPbUR_.js +1 -0
- package/web-ui/build/static/xeora-B6iOnDJY.js +1 -0
- package/web-ui/build/static/xl-Ce6B5slc.js +1 -0
- package/web-ui/build/static/xml-DNjyPmhQ.js +1 -0
- package/web-ui/build/static/xml-doc-DydogmZD.js +1 -0
- package/web-ui/build/static/xojo-DCQLltvr.js +1 -0
- package/web-ui/build/static/xquery-C-fAnA0H.js +1 -0
- package/web-ui/build/static/xquery-CNeqzhLO.js +1 -0
- package/web-ui/build/static/yaml-BsVaGsk5.js +1 -0
- package/web-ui/build/static/yaml-kVZvwv_C.js +1 -0
- package/web-ui/build/static/yang-B_gq9JEq.js +1 -0
- package/web-ui/build/static/zephir-ECIXgXhX.js +1 -0
- package/web-ui/build/static/zig-DY325EKG.js +1 -0
- package/web-ui/build/static/1c-BLo2-5GS.js +0 -1
- package/web-ui/build/static/abap-BjUneMMr.js +0 -1
- package/web-ui/build/static/abnf-CZTz-l7P.js +0 -1
- package/web-ui/build/static/abnf-ITJ5mkBo.js +0 -1
- package/web-ui/build/static/accesslog-Dj78lZOU.js +0 -1
- package/web-ui/build/static/actionscript-Chivtu59.js +0 -1
- package/web-ui/build/static/actionscript-CrvMFXnx.js +0 -1
- package/web-ui/build/static/ada-DdJtyoYe.js +0 -1
- package/web-ui/build/static/ada-GIvogaLi.js +0 -1
- package/web-ui/build/static/agda-DbPp4fQi.js +0 -1
- package/web-ui/build/static/al-BZ24KwRS.js +0 -1
- package/web-ui/build/static/angelscript-DzsFypYt.js +0 -1
- package/web-ui/build/static/antlr4-3qb4rD3S.js +0 -1
- package/web-ui/build/static/apache-DF0P5ZRm.js +0 -1
- package/web-ui/build/static/apacheconf-C8KuNf9c.js +0 -1
- package/web-ui/build/static/apex-CPV-DeVE.js +0 -1
- package/web-ui/build/static/apl-C60bVxxW.js +0 -1
- package/web-ui/build/static/applescript-uz0i0tu1.js +0 -1
- package/web-ui/build/static/applescript-xcPRUBia.js +0 -1
- package/web-ui/build/static/aql-CRh4IGkA.js +0 -1
- package/web-ui/build/static/arcade-CmLedeqc.js +0 -1
- package/web-ui/build/static/arduino-3pr1BvXB.js +0 -1
- package/web-ui/build/static/arduino-C2BejAip.js +0 -1
- package/web-ui/build/static/arff-DE6Wr9MU.js +0 -1
- package/web-ui/build/static/armasm-DXodTfP4.js +0 -1
- package/web-ui/build/static/asciidoc-BU2BDFme.js +0 -1
- package/web-ui/build/static/asciidoc-CgvtvdeC.js +0 -1
- package/web-ui/build/static/asm6502-BMuYCKmP.js +0 -1
- package/web-ui/build/static/asmatmel-Dwxzg4kq.js +0 -1
- package/web-ui/build/static/aspectj-XZIldIRI.js +0 -1
- package/web-ui/build/static/aspnet-UxY2bZ9O.js +0 -1
- package/web-ui/build/static/autohotkey-BdZoQT7s.js +0 -1
- package/web-ui/build/static/autohotkey-DLWs6p8o.js +0 -1
- package/web-ui/build/static/autoit-CxcZx_kh.js +0 -1
- package/web-ui/build/static/autoit-HY_BHh1p.js +0 -1
- package/web-ui/build/static/avisynth-4Q4be9zq.js +0 -1
- package/web-ui/build/static/avrasm-CFqVJML2.js +0 -1
- package/web-ui/build/static/avro-idl-DVTV2YZm.js +0 -1
- package/web-ui/build/static/awk-C1Udi4As.js +0 -1
- package/web-ui/build/static/axapta-B9lexIDC.js +0 -1
- package/web-ui/build/static/bash-DDZrx0R1.js +0 -1
- package/web-ui/build/static/bash-Uuijyc_K.js +0 -1
- package/web-ui/build/static/basic-B29QFWwp.js +0 -1
- package/web-ui/build/static/basic-DKDOc42O.js +0 -1
- package/web-ui/build/static/batch-CA3q9wRr.js +0 -1
- package/web-ui/build/static/bbcode-DkUDcqrp.js +0 -1
- package/web-ui/build/static/bicep-AHSQiVgQ.js +0 -1
- package/web-ui/build/static/birb-BsAnN1j3.js +0 -1
- package/web-ui/build/static/bison-BIq5-ZXo.js +0 -1
- package/web-ui/build/static/bnf-BexLm6hz.js +0 -1
- package/web-ui/build/static/bnf-Dm46EM5S.js +0 -1
- package/web-ui/build/static/brainfuck-CBG8MHhD.js +0 -1
- package/web-ui/build/static/brainfuck-DrHuUFVv.js +0 -1
- package/web-ui/build/static/brightscript-CoQ7s_l3.js +0 -1
- package/web-ui/build/static/bro-Cz5RmvoK.js +0 -1
- package/web-ui/build/static/bsl-C9wXomkX.js +0 -1
- package/web-ui/build/static/c-BZFEFWwC.js +0 -1
- package/web-ui/build/static/c-CfFWLEL7.js +0 -1
- package/web-ui/build/static/c-like-CvIii1QP.js +0 -1
- package/web-ui/build/static/cal-be-Dz3GC.js +0 -1
- package/web-ui/build/static/capnproto-Bcaxak1e.js +0 -1
- package/web-ui/build/static/ceylon-QH_iQXnW.js +0 -1
- package/web-ui/build/static/cfscript-BRgBlxCO.js +0 -1
- package/web-ui/build/static/chaiscript-DSBx5kyN.js +0 -1
- package/web-ui/build/static/cil-C90LIbge.js +0 -1
- package/web-ui/build/static/clean-D2X3fSKw.js +0 -1
- package/web-ui/build/static/clojure-CvKE0e-3.js +0 -1
- package/web-ui/build/static/clojure-Cy3Zg4vZ.js +0 -1
- package/web-ui/build/static/clojure-repl-D0kONHv2.js +0 -1
- package/web-ui/build/static/cmake-DIDVe3n_.js +0 -1
- package/web-ui/build/static/cmake-DPijEs9c.js +0 -1
- package/web-ui/build/static/cobol-BPEjLjGY.js +0 -1
- package/web-ui/build/static/coffeescript-CoSx9MQU.js +0 -1
- package/web-ui/build/static/coffeescript-L5CBXrnP.js +0 -1
- package/web-ui/build/static/concurnas-q5sXhVU4.js +0 -1
- package/web-ui/build/static/coq-BAEq82zI.js +0 -1
- package/web-ui/build/static/coq-BBgtQZwi.js +0 -1
- package/web-ui/build/static/cos-9FdwfBC5.js +0 -1
- package/web-ui/build/static/cpp-CYt8UYn2.js +0 -1
- package/web-ui/build/static/cpp-CZ2lOXlm.js +0 -1
- package/web-ui/build/static/crmsh-C_TZWkES.js +0 -1
- package/web-ui/build/static/crystal-BDf_0NDz.js +0 -1
- package/web-ui/build/static/crystal-BrTR9dGT.js +0 -1
- package/web-ui/build/static/csharp-BSBrba50.js +0 -1
- package/web-ui/build/static/csharp-Cerqyqbn.js +0 -1
- package/web-ui/build/static/cshtml-heNA_ya5.js +0 -1
- package/web-ui/build/static/csp-CJprtNTl.js +0 -1
- package/web-ui/build/static/csp-CyYfNNga.js +0 -1
- package/web-ui/build/static/css-ClMfqSLF.js +0 -1
- package/web-ui/build/static/css-extras-BRU-Fmfk.js +0 -1
- package/web-ui/build/static/csv-VxPQSCnT.js +0 -1
- package/web-ui/build/static/cypher-COR7lVoB.js +0 -1
- package/web-ui/build/static/d-CjJIoaqU.js +0 -1
- package/web-ui/build/static/d-DrTea74c.js +0 -1
- package/web-ui/build/static/dart-Dx1CtbrO.js +0 -1
- package/web-ui/build/static/dart-Kqlt_5Iy.js +0 -1
- package/web-ui/build/static/dataweave-DpoRPYaa.js +0 -1
- package/web-ui/build/static/dax-BdRNDjXh.js +0 -1
- package/web-ui/build/static/delphi-C6ZfxFVF.js +0 -1
- package/web-ui/build/static/dhall-DZrga6Gc.js +0 -1
- package/web-ui/build/static/diff-BuMvzPYe.js +0 -1
- package/web-ui/build/static/diff-DZYXzKCb.js +0 -1
- package/web-ui/build/static/django-D_vRowuc.js +0 -1
- package/web-ui/build/static/django-NYcglI2i.js +0 -1
- package/web-ui/build/static/dns-Cd7tDS1i.js +0 -1
- package/web-ui/build/static/dns-zone-file-C3-2vwxy.js +0 -1
- package/web-ui/build/static/docker-DQ7ZFefk.js +0 -1
- package/web-ui/build/static/dockerfile-BpU0w0F-.js +0 -1
- package/web-ui/build/static/dos-B1_ZGbVG.js +0 -1
- package/web-ui/build/static/dot-BGB_tXU7.js +0 -1
- package/web-ui/build/static/dsconfig-BbDxyV_e.js +0 -1
- package/web-ui/build/static/dts-BfjOjY8l.js +0 -1
- package/web-ui/build/static/dust-BdwQ-7T_.js +0 -1
- package/web-ui/build/static/ebnf-BQTMmaYU.js +0 -1
- package/web-ui/build/static/ebnf-BwwBWilG.js +0 -1
- package/web-ui/build/static/editorconfig-DWS4VSOM.js +0 -1
- package/web-ui/build/static/eiffel-DVvlc0AI.js +0 -1
- package/web-ui/build/static/ejs-DsD496m-.js +0 -1
- package/web-ui/build/static/elixir-CLxuo9eh.js +0 -1
- package/web-ui/build/static/elixir-Cnyg3Ezx.js +0 -1
- package/web-ui/build/static/elm-CMAIkLMI.js +0 -1
- package/web-ui/build/static/elm-DZBnlwPV.js +0 -1
- package/web-ui/build/static/erb-B5xezjly.js +0 -1
- package/web-ui/build/static/erb-CJr8Ab4S.js +0 -1
- package/web-ui/build/static/erlang-BKy_rMFs.js +0 -1
- package/web-ui/build/static/erlang-DtaEL15_.js +0 -1
- package/web-ui/build/static/erlang-repl-CC5OZ0oZ.js +0 -1
- package/web-ui/build/static/etlua-1AfbSbi_.js +0 -1
- package/web-ui/build/static/excel-AEWYaJMN.js +0 -1
- package/web-ui/build/static/excel-formula-DXCH31eV.js +0 -1
- package/web-ui/build/static/factor-BvZsNxRC.js +0 -1
- package/web-ui/build/static/false-Y69sPjTa.js +0 -1
- package/web-ui/build/static/firestore-security-rules-BAYXaIU_.js +0 -1
- package/web-ui/build/static/fix-D7wVox5L.js +0 -1
- package/web-ui/build/static/flix-xYG3kZl-.js +0 -1
- package/web-ui/build/static/flow-zBPh0c8a.js +0 -1
- package/web-ui/build/static/fortran-C7OgAOwk.js +0 -1
- package/web-ui/build/static/fortran-D7HqnRra.js +0 -1
- package/web-ui/build/static/fsharp-Dz8jq_YD.js +0 -1
- package/web-ui/build/static/fsharp-wem8e879.js +0 -1
- package/web-ui/build/static/ftl-BNZhFjQT.js +0 -1
- package/web-ui/build/static/gams-C0WL3JTk.js +0 -1
- package/web-ui/build/static/gap-C3QTJPj2.js +0 -1
- package/web-ui/build/static/gauss-HDeDt6Js.js +0 -1
- package/web-ui/build/static/gcode-B6xVa-Q4.js +0 -1
- package/web-ui/build/static/gcode-KfjFk59Y.js +0 -1
- package/web-ui/build/static/gdscript-CZWTW6OT.js +0 -1
- package/web-ui/build/static/gedcom-DGTBZtDe.js +0 -1
- package/web-ui/build/static/gherkin-BM2fti5q.js +0 -1
- package/web-ui/build/static/gherkin-BsD-keLP.js +0 -1
- package/web-ui/build/static/git-CwXnrvg5.js +0 -1
- package/web-ui/build/static/glsl-CEL-DKdu.js +0 -1
- package/web-ui/build/static/glsl-DClg1hhL.js +0 -1
- package/web-ui/build/static/gml-BuyC2nUx.js +0 -1
- package/web-ui/build/static/gml-CaV0fexF.js +0 -1
- package/web-ui/build/static/gn-RZ4XHU09.js +0 -1
- package/web-ui/build/static/go-2fZP5dFL.js +0 -1
- package/web-ui/build/static/go-B-2r4QAR.js +0 -1
- package/web-ui/build/static/go-module-DSWZUUGo.js +0 -1
- package/web-ui/build/static/golo-BLZaLyU5.js +0 -1
- package/web-ui/build/static/gradle--RLe7WtU.js +0 -1
- package/web-ui/build/static/graphql-Dersm5rs.js +0 -1
- package/web-ui/build/static/groovy-BhCtzyFe.js +0 -1
- package/web-ui/build/static/groovy-CvbHavu3.js +0 -1
- package/web-ui/build/static/haml-CQhB89Xl.js +0 -1
- package/web-ui/build/static/haml-CemWzAX2.js +0 -1
- package/web-ui/build/static/handlebars-B39jLKjQ.js +0 -1
- package/web-ui/build/static/handlebars-Cl4dI91M.js +0 -1
- package/web-ui/build/static/haskell-CO9Ug-Kw.js +0 -1
- package/web-ui/build/static/haskell-EXme4CFR.js +0 -1
- package/web-ui/build/static/haxe-BDkCyqBy.js +0 -1
- package/web-ui/build/static/haxe-ahczQlFA.js +0 -1
- package/web-ui/build/static/hcl-liOTbdHr.js +0 -1
- package/web-ui/build/static/hlsl-Bnkb1zrP.js +0 -1
- package/web-ui/build/static/hoon-DCXHuTNp.js +0 -1
- package/web-ui/build/static/hpkp-CPJOGDF_.js +0 -1
- package/web-ui/build/static/hsp-BdeT0enM.js +0 -1
- package/web-ui/build/static/hsts-BoIN2VGK.js +0 -1
- package/web-ui/build/static/htmlbars-B5Ruf2zT.js +0 -1
- package/web-ui/build/static/http-BacVzmeC.js +0 -1
- package/web-ui/build/static/http-DifjpER4.js +0 -1
- package/web-ui/build/static/hy-DQ-M6mjk.js +0 -1
- package/web-ui/build/static/ichigojam-CcVrpthd.js +0 -1
- package/web-ui/build/static/icon-B4N1Fnx2.js +0 -1
- package/web-ui/build/static/icu-message-format-aDIl6Oaf.js +0 -1
- package/web-ui/build/static/idris-DKvV6i27.js +0 -1
- package/web-ui/build/static/iecst-zqZH79Dw.js +0 -1
- package/web-ui/build/static/ignore-BBbP-u2O.js +0 -1
- package/web-ui/build/static/index-CkhVK4lF.js +0 -1164
- package/web-ui/build/static/index-Cm1gK3R7.css +0 -1
- package/web-ui/build/static/index-D9JNKR2k.js +0 -13
- package/web-ui/build/static/index-DqZhvIWG.js +0 -1
- package/web-ui/build/static/inform7-BwvEArfL.js +0 -1
- package/web-ui/build/static/inform7-YkPDg57k.js +0 -1
- package/web-ui/build/static/ini-DU4drXRb.js +0 -1
- package/web-ui/build/static/ini-OhDTn0L5.js +0 -1
- package/web-ui/build/static/io-4thQGR-r.js +0 -1
- package/web-ui/build/static/irpf90-BnhmotbX.js +0 -1
- package/web-ui/build/static/isbl-BKcWS-M5.js +0 -1
- package/web-ui/build/static/j-Bw6CUCl9.js +0 -1
- package/web-ui/build/static/java-8IzvJ-mZ.js +0 -1
- package/web-ui/build/static/java-_jaQp1m2.js +0 -1
- package/web-ui/build/static/javadoc-D6KaHkhq.js +0 -1
- package/web-ui/build/static/javadoclike-B-DnR3Tl.js +0 -1
- package/web-ui/build/static/javascript-CfOOSye9.js +0 -1
- package/web-ui/build/static/javastacktrace-DHyDfhlB.js +0 -1
- package/web-ui/build/static/jboss-cli-zEH5UaRS.js +0 -1
- package/web-ui/build/static/jexl-CRpgdJ2f.js +0 -1
- package/web-ui/build/static/jolie-C5S16-nE.js +0 -1
- package/web-ui/build/static/jq-Dy-2LJZM.js +0 -1
- package/web-ui/build/static/js-extras-CNfXr3kE.js +0 -1
- package/web-ui/build/static/js-templates-DCJ1syUw.js +0 -1
- package/web-ui/build/static/jsdoc-BamyoRCh.js +0 -1
- package/web-ui/build/static/json-Buz-eeND.js +0 -1
- package/web-ui/build/static/json-D4xr_AK1.js +0 -1
- package/web-ui/build/static/json5-CS3uAaJP.js +0 -1
- package/web-ui/build/static/jsonp-CmEAdOcH.js +0 -1
- package/web-ui/build/static/jsstacktrace-D35jXpCN.js +0 -1
- package/web-ui/build/static/jsx-DRMEK-Qn.js +0 -1
- package/web-ui/build/static/julia-BgYJV7ho.js +0 -1
- package/web-ui/build/static/julia-CRsGDmxp.js +0 -1
- package/web-ui/build/static/julia-repl-D0vTZKUn.js +0 -1
- package/web-ui/build/static/keepalived-BlhBatvM.js +0 -1
- package/web-ui/build/static/keyman-B_-J66sg.js +0 -1
- package/web-ui/build/static/kotlin-B7HqYBGK.js +0 -1
- package/web-ui/build/static/kotlin-CszxhoS4.js +0 -1
- package/web-ui/build/static/kumir-B_wpMfXS.js +0 -1
- package/web-ui/build/static/kusto-BrHkOiE1.js +0 -1
- package/web-ui/build/static/lasso-xizuiq1s.js +0 -1
- package/web-ui/build/static/latex-62pryLTa.js +0 -1
- package/web-ui/build/static/latex-D7Tnbs2l.js +0 -1
- package/web-ui/build/static/latte-B_8xJj-y.js +0 -1
- package/web-ui/build/static/ldif-B69eIciC.js +0 -1
- package/web-ui/build/static/leaf-DPnh4k7N.js +0 -1
- package/web-ui/build/static/less-Bg3xuki-.js +0 -1
- package/web-ui/build/static/less-Cm-zhk4i.js +0 -1
- package/web-ui/build/static/lilypond-BFSXmrKQ.js +0 -1
- package/web-ui/build/static/liquid-D_jMXN_8.js +0 -1
- package/web-ui/build/static/lisp-CDWjXhWU.js +0 -1
- package/web-ui/build/static/lisp-DAu9fWrQ.js +0 -1
- package/web-ui/build/static/livecodeserver-BNgd6rBu.js +0 -1
- package/web-ui/build/static/livescript-C6sYNsdz.js +0 -1
- package/web-ui/build/static/livescript-CMOawYYt.js +0 -1
- package/web-ui/build/static/llvm-Yx2vcmJw.js +0 -1
- package/web-ui/build/static/llvm-w4vVb6qs.js +0 -1
- package/web-ui/build/static/log-CqhluDSP.js +0 -1
- package/web-ui/build/static/lolcode-Ck0rxP3x.js +0 -1
- package/web-ui/build/static/lsl-BwPX-Qjm.js +0 -1
- package/web-ui/build/static/lua-4H_Ijh4D.js +0 -1
- package/web-ui/build/static/lua-dDdlvQ6u.js +0 -1
- package/web-ui/build/static/magma-2nRRraug.js +0 -1
- package/web-ui/build/static/makefile-C887R9mV.js +0 -1
- package/web-ui/build/static/makefile-hlNtZePL.js +0 -1
- package/web-ui/build/static/markdown-DCALPnuW.js +0 -1
- package/web-ui/build/static/markdown-DGM_Z5tW.js +0 -1
- package/web-ui/build/static/markup-templating-PAvYDmBZ.js +0 -1
- package/web-ui/build/static/mathematica-CGL-Gomp.js +0 -1
- package/web-ui/build/static/matlab-C46ZZzlH.js +0 -1
- package/web-ui/build/static/matlab-WUgx8roJ.js +0 -1
- package/web-ui/build/static/maxima-Dd_TIy4H.js +0 -1
- package/web-ui/build/static/maxscript-f8SP9Ybn.js +0 -1
- package/web-ui/build/static/mel-6l2ZAh7F.js +0 -1
- package/web-ui/build/static/mel-BYdNMJzZ.js +0 -1
- package/web-ui/build/static/mercury-CdHf1buq.js +0 -1
- package/web-ui/build/static/mermaid-IRgUMtb1.js +0 -1
- package/web-ui/build/static/mipsasm-CRPpDKP4.js +0 -1
- package/web-ui/build/static/mizar-B4DBCLSi.js +0 -1
- package/web-ui/build/static/mizar-DiuZyDh7.js +0 -1
- package/web-ui/build/static/mojolicious-ChuQv8wb.js +0 -1
- package/web-ui/build/static/mongodb-CE5Epj0T.js +0 -1
- package/web-ui/build/static/monkey-BAz4pIwb.js +0 -1
- package/web-ui/build/static/monkey-i_g3gMkJ.js +0 -1
- package/web-ui/build/static/moonscript-BNaNpboV.js +0 -1
- package/web-ui/build/static/moonscript-uHlQVjxf.js +0 -1
- package/web-ui/build/static/n1ql-CBDLma2D.js +0 -1
- package/web-ui/build/static/n1ql-u4YLlLfk.js +0 -1
- package/web-ui/build/static/n4js-IVFjZEMP.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-Ba72aD32.js +0 -1
- package/web-ui/build/static/naniscript-CjMhybrb.js +0 -1
- package/web-ui/build/static/nasm-DjKhk70h.js +0 -1
- package/web-ui/build/static/neon-JEhMoh8P.js +0 -1
- package/web-ui/build/static/nevod-6tgpQVCA.js +0 -1
- package/web-ui/build/static/nginx-C6NwXcw_.js +0 -1
- package/web-ui/build/static/nginx-CquSTZbP.js +0 -1
- package/web-ui/build/static/nim-0bOOYxfL.js +0 -1
- package/web-ui/build/static/nim-aCQGMs_4.js +0 -1
- package/web-ui/build/static/nix-BV4kRCY_.js +0 -1
- package/web-ui/build/static/nix-FvSL2V8j.js +0 -1
- package/web-ui/build/static/node-repl-GtjTvb93.js +0 -1
- package/web-ui/build/static/nsis-DsftItKH.js +0 -1
- package/web-ui/build/static/nsis-pu7O80Pq.js +0 -1
- package/web-ui/build/static/objectivec-Bx7Bj0U_.js +0 -1
- package/web-ui/build/static/objectivec-GtO6Znp9.js +0 -1
- package/web-ui/build/static/ocaml-B71sR3qa.js +0 -1
- package/web-ui/build/static/ocaml-BlhoK75p.js +0 -1
- package/web-ui/build/static/opencl-40JZ6XXw.js +0 -1
- package/web-ui/build/static/openqasm-cDL6l7w3.js +0 -1
- package/web-ui/build/static/openscad-BQ0gNGv9.js +0 -1
- package/web-ui/build/static/oxygene-1fX2ftBa.js +0 -1
- package/web-ui/build/static/oz-Cgq2yQZq.js +0 -1
- package/web-ui/build/static/parigp-DfRO3DxU.js +0 -1
- package/web-ui/build/static/parser-hZcHrq-n.js +0 -1
- package/web-ui/build/static/parser3-Cf2p4Ryg.js +0 -1
- package/web-ui/build/static/pascal-C6tg_yvS.js +0 -1
- package/web-ui/build/static/pascaligo-9U9PdOS6.js +0 -1
- package/web-ui/build/static/pcaxis-B5EnEKrt.js +0 -1
- package/web-ui/build/static/peoplecode-Cf2sGzFJ.js +0 -1
- package/web-ui/build/static/perl-C9FNSHZx.js +0 -1
- package/web-ui/build/static/perl-uzSwl6wJ.js +0 -1
- package/web-ui/build/static/pf-C7Bjci1q.js +0 -1
- package/web-ui/build/static/pgsql-IBD1Cka7.js +0 -1
- package/web-ui/build/static/php-19XvqtTQ.js +0 -1
- package/web-ui/build/static/php-CUjVuQ1J.js +0 -1
- package/web-ui/build/static/php-extras-GWBU2Qbm.js +0 -1
- package/web-ui/build/static/php-template-Chtii014.js +0 -1
- package/web-ui/build/static/phpdoc-BLcJXgrV.js +0 -1
- package/web-ui/build/static/plaintext-BX3hHjdj.js +0 -1
- package/web-ui/build/static/plsql-tCcTmmsx.js +0 -1
- package/web-ui/build/static/pony-CKD16QkU.js +0 -1
- package/web-ui/build/static/powerquery-DXj7kqMe.js +0 -1
- package/web-ui/build/static/powershell-0jB2gvRR.js +0 -1
- package/web-ui/build/static/powershell-Ca6UjZV2.js +0 -1
- package/web-ui/build/static/processing-CPjwH4wc.js +0 -1
- package/web-ui/build/static/processing-ItKy7l8u.js +0 -1
- package/web-ui/build/static/profile-6N_Rzycx.js +0 -1
- package/web-ui/build/static/prolog-BV3TgLfG.js +0 -1
- package/web-ui/build/static/prolog-C5UoVyBz.js +0 -1
- package/web-ui/build/static/promql-CZot8Bw3.js +0 -1
- package/web-ui/build/static/properties-C_r_5f7N.js +0 -1
- package/web-ui/build/static/properties-qycKL1T0.js +0 -1
- package/web-ui/build/static/protobuf-BmdKEOw6.js +0 -1
- package/web-ui/build/static/protobuf-CxWC8PvT.js +0 -1
- package/web-ui/build/static/psl-CFSNRM7z.js +0 -1
- package/web-ui/build/static/pug-8dv12FtI.js +0 -1
- package/web-ui/build/static/puppet-CNjskGXn.js +0 -1
- package/web-ui/build/static/puppet-Cf6xZODN.js +0 -1
- package/web-ui/build/static/pure-exFir566.js +0 -1
- package/web-ui/build/static/purebasic-Bm6QaKku.js +0 -1
- package/web-ui/build/static/purebasic-lfzND9Qp.js +0 -1
- package/web-ui/build/static/purescript-D1xRYVQG.js +0 -1
- package/web-ui/build/static/python-DgkOjU0T.js +0 -1
- package/web-ui/build/static/python-o7BJVaX6.js +0 -1
- package/web-ui/build/static/python-repl-6SyonvH1.js +0 -1
- package/web-ui/build/static/q-CiQ2AFzU.js +0 -1
- package/web-ui/build/static/q-g7rEIWgm.js +0 -1
- package/web-ui/build/static/qml-ARc9Akfg.js +0 -1
- package/web-ui/build/static/qml-rVumxss_.js +0 -1
- package/web-ui/build/static/qore-CUXpqOSx.js +0 -1
- package/web-ui/build/static/qsharp-DMPNcgaz.js +0 -1
- package/web-ui/build/static/r-DCIo6joW.js +0 -1
- package/web-ui/build/static/r-nUBzz4LB.js +0 -1
- package/web-ui/build/static/racket--fPY_Q4o.js +0 -1
- package/web-ui/build/static/reason-CeVN9vJx.js +0 -1
- package/web-ui/build/static/reasonml-49SEasi3.js +0 -1
- package/web-ui/build/static/regex-BS97XMMk.js +0 -1
- package/web-ui/build/static/rego-Brc7DU11.js +0 -1
- package/web-ui/build/static/renpy-C2sPWAHv.js +0 -1
- package/web-ui/build/static/rest-DlZ7ycRe.js +0 -1
- package/web-ui/build/static/rib-C8WsA4on.js +0 -1
- package/web-ui/build/static/rip-dd9bS3Ar.js +0 -1
- package/web-ui/build/static/roboconf-CAEw-rS3.js +0 -1
- package/web-ui/build/static/roboconf-D0TfrLeu.js +0 -1
- package/web-ui/build/static/robotframework-CkgVY4bX.js +0 -1
- package/web-ui/build/static/routeros-DIek1v-Z.js +0 -1
- package/web-ui/build/static/rsl-DExhHtA1.js +0 -1
- package/web-ui/build/static/ruby-BjvzODgO.js +0 -1
- package/web-ui/build/static/ruby-Dflr1gcA.js +0 -1
- package/web-ui/build/static/ruleslanguage-BgzP6UBl.js +0 -1
- package/web-ui/build/static/rust-DxIro-GW.js +0 -1
- package/web-ui/build/static/rust-qWzP5Jcw.js +0 -1
- package/web-ui/build/static/sas-BrCJWU_w.js +0 -1
- package/web-ui/build/static/sas-itaOGZ-D.js +0 -1
- package/web-ui/build/static/sass-BTk1_hyU.js +0 -1
- package/web-ui/build/static/scala-DEtImhEo.js +0 -1
- package/web-ui/build/static/scala-DdZCH_nS.js +0 -1
- package/web-ui/build/static/scheme-CiOCQffl.js +0 -1
- package/web-ui/build/static/scheme-WaU-JPJX.js +0 -1
- package/web-ui/build/static/scilab-03tyg0ft.js +0 -1
- package/web-ui/build/static/scss-DXl2WSdH.js +0 -1
- package/web-ui/build/static/scss-movJ3vcX.js +0 -1
- package/web-ui/build/static/shell-DWmlNcrf.js +0 -1
- package/web-ui/build/static/shell-session-lHcfQbT0.js +0 -1
- package/web-ui/build/static/smali-7RKwn9RZ.js +0 -1
- package/web-ui/build/static/smali-TEMQ7bRM.js +0 -1
- package/web-ui/build/static/smalltalk-B_nVEfab.js +0 -1
- package/web-ui/build/static/smalltalk-BsA9wucb.js +0 -1
- package/web-ui/build/static/smarty-DSf4s_8v.js +0 -1
- package/web-ui/build/static/sml-BDO_Hmie.js +0 -1
- package/web-ui/build/static/sml-DKuy82zG.js +0 -1
- package/web-ui/build/static/solidity-jtWv6laA.js +0 -1
- package/web-ui/build/static/solution-file-DcfiquuJ.js +0 -1
- package/web-ui/build/static/soy-DmBVrDYd.js +0 -1
- package/web-ui/build/static/sparql-_JOxZ7fM.js +0 -1
- package/web-ui/build/static/splunk-spl-CHeBtp33.js +0 -1
- package/web-ui/build/static/sqf-9wI8rp5o.js +0 -1
- package/web-ui/build/static/sqf-BuKh30bG.js +0 -1
- package/web-ui/build/static/sql-ClFFHGMY.js +0 -1
- package/web-ui/build/static/sql-DVXtimpW.js +0 -1
- package/web-ui/build/static/sql_more-CNw-JJON.js +0 -1
- package/web-ui/build/static/squirrel-Bdi8LbT5.js +0 -1
- package/web-ui/build/static/stan-Brcz64A8.js +0 -1
- package/web-ui/build/static/stan-C9Q08Juk.js +0 -1
- package/web-ui/build/static/stata-ES8hryw_.js +0 -1
- package/web-ui/build/static/step21-Cfmoq4Lb.js +0 -1
- package/web-ui/build/static/stylus-DMKHLSvm.js +0 -1
- package/web-ui/build/static/stylus-Dcs8vyW2.js +0 -1
- package/web-ui/build/static/subunit-DRjv565H.js +0 -1
- package/web-ui/build/static/swift-0x_T9zx8.js +0 -1
- package/web-ui/build/static/swift-CUvpRg4a.js +0 -1
- package/web-ui/build/static/systemd-Dl8xGVv9.js +0 -1
- package/web-ui/build/static/t4-cs-DqvXuZwc.js +0 -1
- package/web-ui/build/static/t4-templating-DjN2N1uM.js +0 -1
- package/web-ui/build/static/t4-vb-CZQn9IVK.js +0 -1
- package/web-ui/build/static/taggerscript-CPCJkC2t.js +0 -1
- package/web-ui/build/static/tap-BPfuLhe7.js +0 -1
- package/web-ui/build/static/tap-CSdsd38Q.js +0 -1
- package/web-ui/build/static/tcl-4BqhAKLC.js +0 -1
- package/web-ui/build/static/tcl-Bh0Jg8jj.js +0 -1
- package/web-ui/build/static/textile-BiD4awlU.js +0 -1
- package/web-ui/build/static/thrift-Br1-10xh.js +0 -1
- package/web-ui/build/static/toml-QlLCqVpQ.js +0 -1
- package/web-ui/build/static/tp-B2Ef9EBz.js +0 -1
- package/web-ui/build/static/tremor-DuZdAfVr.js +0 -1
- package/web-ui/build/static/tsx-W3KEjccO.js +0 -1
- package/web-ui/build/static/tt2-D_tdF-56.js +0 -1
- package/web-ui/build/static/turtle-DxrQkFoq.js +0 -1
- package/web-ui/build/static/twig-DD44ApyU.js +0 -1
- package/web-ui/build/static/twig-vA3ZwAxn.js +0 -1
- package/web-ui/build/static/typescript-BfbcKNOu.js +0 -1
- package/web-ui/build/static/typescript-CvKtq1ix.js +0 -1
- package/web-ui/build/static/typoscript-BEu84JpE.js +0 -1
- package/web-ui/build/static/unrealscript-ohUNsJGM.js +0 -1
- package/web-ui/build/static/uorazor-BWer-chm.js +0 -1
- package/web-ui/build/static/uri-CPLTr_NY.js +0 -1
- package/web-ui/build/static/v-gAkMRmmI.js +0 -1
- package/web-ui/build/static/vala-Bktj5SNB.js +0 -1
- package/web-ui/build/static/vala-D1fDPFxI.js +0 -1
- package/web-ui/build/static/vbnet-Cn0g0ohh.js +0 -1
- package/web-ui/build/static/vbnet-TiYHF2WM.js +0 -1
- package/web-ui/build/static/vbscript-BUV-Kjvs.js +0 -1
- package/web-ui/build/static/vbscript-html-s1RgByjf.js +0 -1
- package/web-ui/build/static/velocity-DTy-TOwB.js +0 -1
- package/web-ui/build/static/verilog-4jk4MMXN.js +0 -1
- package/web-ui/build/static/verilog-aR4U-DJX.js +0 -1
- package/web-ui/build/static/vhdl-D72XnBZR.js +0 -1
- package/web-ui/build/static/vhdl-DFdtG28B.js +0 -1
- package/web-ui/build/static/vim-BMqsbQ-a.js +0 -1
- package/web-ui/build/static/vim-Cc3UuKOs.js +0 -1
- package/web-ui/build/static/visual-basic-CyC2kNGV.js +0 -1
- package/web-ui/build/static/warpscript-DpKFeISB.js +0 -1
- package/web-ui/build/static/wasm-SPljCkFH.js +0 -1
- package/web-ui/build/static/web-idl-Cie2yHU9.js +0 -1
- package/web-ui/build/static/wiki-BfYfwsBk.js +0 -1
- package/web-ui/build/static/wolfram-Dgi1K2gQ.js +0 -1
- package/web-ui/build/static/wren-CFQxgLld.js +0 -1
- package/web-ui/build/static/x86asm-CBIt2r64.js +0 -1
- package/web-ui/build/static/xeora-e5JHDF1T.js +0 -1
- package/web-ui/build/static/xl-CPZe-czl.js +0 -1
- package/web-ui/build/static/xml-BEuPuoS1.js +0 -1
- package/web-ui/build/static/xml-doc-DTOJGYE2.js +0 -1
- package/web-ui/build/static/xojo-ByMSKdYJ.js +0 -1
- package/web-ui/build/static/xquery--5iaD5oE.js +0 -1
- package/web-ui/build/static/xquery-DJp5PXZo.js +0 -1
- package/web-ui/build/static/yaml-CH8EnM9M.js +0 -1
- package/web-ui/build/static/yaml-mKr8oN1v.js +0 -1
- package/web-ui/build/static/yang-Nqdvm2mQ.js +0 -1
- package/web-ui/build/static/zephir-BJZaDzrW.js +0 -1
- package/web-ui/build/static/zig-DRkhvZLn.js +0 -1
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DesktopTool — agent-facing desktop-control surface.
|
|
3
|
+
*
|
|
4
|
+
* Pairs the OS controller (mouse / keyboard / screenshot / windows) with
|
|
5
|
+
* a pluggable visual-grounding model (default: Kimi K2.6) so an agent
|
|
6
|
+
* can say "click the orange Save button" and the tool figures out
|
|
7
|
+
* `(x, y)` from a fresh screenshot before the click.
|
|
8
|
+
*
|
|
9
|
+
* Five guardrails are layered into every execute() call:
|
|
10
|
+
*
|
|
11
|
+
* 1. CAPABILITY GATE - osController refuses ops the OS can't do
|
|
12
|
+
* (e.g. mouseInput on Wayland) and surfaces
|
|
13
|
+
* an operator-friendly remediation message.
|
|
14
|
+
*
|
|
15
|
+
* 2. PER-AGENT ALLOWLIST - toolConfig.allowedActions lets an operator
|
|
16
|
+
* disable any subset of actions per agent
|
|
17
|
+
* (e.g. read-only screenshot bot vs. full
|
|
18
|
+
* control). Default: ALL DISABLED — the
|
|
19
|
+
* agent has to be explicitly granted control.
|
|
20
|
+
*
|
|
21
|
+
* 3. KILL SWITCH - LOXIA_DESKTOP_TOOL_DISABLED=1 env flag
|
|
22
|
+
* short-circuits every call with a clear
|
|
23
|
+
* error. Zero-source kill in production.
|
|
24
|
+
*
|
|
25
|
+
* 4. AUDIT TRAIL - every action emits a structured log line
|
|
26
|
+
* with operation id + grounded coords so
|
|
27
|
+
* screen-recording-free postmortems work.
|
|
28
|
+
*
|
|
29
|
+
* 5. INTENT GROUNDING - "click" / "scroll" / "drag" accept either
|
|
30
|
+
* raw (x, y) OR a natural-language `intent`.
|
|
31
|
+
* With intent, the tool grabs a screenshot,
|
|
32
|
+
* asks the grounding model, validates the
|
|
33
|
+
* returned coords fit the screen, and
|
|
34
|
+
* ONLY THEN moves. Failed grounding never
|
|
35
|
+
* silently clicks somewhere random.
|
|
36
|
+
*
|
|
37
|
+
* Model is swappable via toolConfig.groundingModelId (any id registered
|
|
38
|
+
* in src/services/grounding/registry.js). Backend proxy vs. direct
|
|
39
|
+
* Foundry is also config — see _buildAdapter below.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
43
|
+
import { join } from 'node:path';
|
|
44
|
+
import { tmpdir } from 'node:os';
|
|
45
|
+
import { BaseTool } from '../baseTool.js';
|
|
46
|
+
import { createOSController, OSError } from './osController.js';
|
|
47
|
+
import {
|
|
48
|
+
createGroundingModel,
|
|
49
|
+
ModelId,
|
|
50
|
+
DEFAULT_REASONING_EFFORT,
|
|
51
|
+
} from '../../services/grounding/index.js';
|
|
52
|
+
|
|
53
|
+
/** Every action the tool can perform. */
|
|
54
|
+
export const DesktopAction = Object.freeze({
|
|
55
|
+
SCREENSHOT: 'screenshot',
|
|
56
|
+
CLICK: 'click',
|
|
57
|
+
TYPE: 'type',
|
|
58
|
+
KEY_PRESS: 'key_press',
|
|
59
|
+
SCROLL: 'scroll',
|
|
60
|
+
DRAG: 'drag',
|
|
61
|
+
LIST_WINDOWS: 'list_windows',
|
|
62
|
+
FOCUS_WINDOW: 'focus_window',
|
|
63
|
+
DESCRIBE_CAPS: 'describe_capabilities',
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const ACTIONS_REQUIRING_INPUT = new Set([
|
|
67
|
+
DesktopAction.CLICK, DesktopAction.TYPE, DesktopAction.KEY_PRESS,
|
|
68
|
+
DesktopAction.SCROLL, DesktopAction.DRAG, DesktopAction.FOCUS_WINDOW,
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
const ACTIONS_THAT_CAN_USE_INTENT = new Set([
|
|
72
|
+
DesktopAction.CLICK, DesktopAction.SCROLL, DesktopAction.DRAG,
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
/** Env-level kill switch — checked on every call. */
|
|
76
|
+
const ENV_KILL_FLAG = 'LOXIA_DESKTOP_TOOL_DISABLED';
|
|
77
|
+
|
|
78
|
+
/** Defaults — overridable via per-agent toolConfig.desktop or this.config. */
|
|
79
|
+
const Defaults = Object.freeze({
|
|
80
|
+
/** Default actions an agent gets WHEN allowedActions is unset.
|
|
81
|
+
* Empty list = no control. Operator must opt in per agent. */
|
|
82
|
+
ALLOWED_ACTIONS: [],
|
|
83
|
+
/** Visual-grounding model (registry id). */
|
|
84
|
+
GROUNDING_MODEL: ModelId.KIMI_K2_6,
|
|
85
|
+
/** Grounding reasoning effort. */
|
|
86
|
+
GROUNDING_EFFORT: DEFAULT_REASONING_EFFORT,
|
|
87
|
+
/** Hard cap on a single grounded coord lookup. Catches hangs. */
|
|
88
|
+
GROUNDING_TIMEOUT_MS: 180_000,
|
|
89
|
+
/** Refuse clicks > this many px from the screen edge (sanity check
|
|
90
|
+
* against bogus grounding outputs). */
|
|
91
|
+
COORD_MARGIN_PX: 0,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
export class DesktopTool extends BaseTool {
|
|
95
|
+
constructor(config = {}, logger = null) {
|
|
96
|
+
super(config, logger);
|
|
97
|
+
this.id = 'desktop';
|
|
98
|
+
this.name = 'Desktop Control';
|
|
99
|
+
this.version = '1.0.0';
|
|
100
|
+
this.requiresProject = false;
|
|
101
|
+
this.isAsync = true;
|
|
102
|
+
// Modest builtin delay so the OS has time to repaint between
|
|
103
|
+
// an action and the agent's next screenshot.
|
|
104
|
+
this.builtinDelay = 150;
|
|
105
|
+
|
|
106
|
+
// Injected at registry time. The tool needs:
|
|
107
|
+
// - aiService: source of baseUrl + apiKey for proxy-mode grounding
|
|
108
|
+
// - osController: defaults to a fresh createOSController() instance
|
|
109
|
+
// but tests inject a stub.
|
|
110
|
+
this.aiService = null;
|
|
111
|
+
this.osController = config.osController || null;
|
|
112
|
+
this._adapterCache = null; // lazy — built on first ground()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Called by index.js after construction. */
|
|
116
|
+
setAIService(aiService) {
|
|
117
|
+
this.aiService = aiService;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Static factory for tests / explicit DI. */
|
|
121
|
+
static withDependencies({ aiService, osController, config = {}, logger = null }) {
|
|
122
|
+
const tool = new DesktopTool({ ...config, osController }, logger);
|
|
123
|
+
if (aiService) tool.setAIService(aiService);
|
|
124
|
+
return tool;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ─── BaseTool surface ─────────────────────────────────────────────
|
|
128
|
+
|
|
129
|
+
getDescription() {
|
|
130
|
+
// NOTE: this string lands in the agent's system prompt every turn.
|
|
131
|
+
// Keep it tight, action-oriented, and free of meta-commentary like
|
|
132
|
+
// "this is beta" / "we're missing safeguards" — agents read those
|
|
133
|
+
// disclaimers as instructions to act timidly and the user's UX
|
|
134
|
+
// suffers. Operator-facing beta indicators live in the web-UI
|
|
135
|
+
// configurator + tool-selector pills, not here.
|
|
136
|
+
return `
|
|
137
|
+
Desktop Control Tool: drive the user's keyboard, mouse, screen, and
|
|
138
|
+
windows like a human. Combines OS-level input with visual grounding
|
|
139
|
+
("click the orange Save button") via a vision LLM.
|
|
140
|
+
|
|
141
|
+
USAGE:
|
|
142
|
+
|
|
143
|
+
{
|
|
144
|
+
"toolId": "desktop",
|
|
145
|
+
"parameters": {
|
|
146
|
+
"action": "click",
|
|
147
|
+
"intent": "the orange Save button"
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
PREFERRED WORKFLOW — use intent-driven actions, NOT raw screenshot:
|
|
152
|
+
|
|
153
|
+
For "click X" tasks, do NOT call screenshot first and then try to read
|
|
154
|
+
the image yourself. You can't see screenshot results in plain text. The
|
|
155
|
+
intent-driven actions screenshot + ground + act in one step:
|
|
156
|
+
|
|
157
|
+
{ "toolId": "desktop", "parameters": {
|
|
158
|
+
"action": "click", "intent": "the Netflix icon in the taskbar" }}
|
|
159
|
+
|
|
160
|
+
That triggers: screenshot → grounding model finds the coords → click.
|
|
161
|
+
You only need to look at the screenshot yourself if grounding fails
|
|
162
|
+
(rare on legible UIs).
|
|
163
|
+
|
|
164
|
+
ACTIONS:
|
|
165
|
+
- click (intent OR x,y) single/double click — use intent first
|
|
166
|
+
- type (text) keyboard input into focused window
|
|
167
|
+
- key_press (keys[]) chord like ["Control","S"]
|
|
168
|
+
- scroll (intent OR x,y, dy) positive dy scrolls down
|
|
169
|
+
- drag (fromIntent/toIntent OR from/to coords)
|
|
170
|
+
- list_windows titles + bounds of open windows
|
|
171
|
+
- focus_window (titleMatch) bring matching window to front
|
|
172
|
+
- screenshot capture screen to disk (returns file
|
|
173
|
+
path; you cannot read raw PNG bytes —
|
|
174
|
+
use the vision tool on the path if you
|
|
175
|
+
must inspect, or prefer intent actions)
|
|
176
|
+
- describe_capabilities OS + display server + permission state
|
|
177
|
+
|
|
178
|
+
INTENT FAILURE: if grounding can't find the target, you'll get a
|
|
179
|
+
GROUNDING_FAILED or COORDS_OUT_OF_BOUNDS error with the model's raw
|
|
180
|
+
answer. Sharpen the intent ("the red Save button in the toolbar")
|
|
181
|
+
and retry.
|
|
182
|
+
|
|
183
|
+
PERMISSION MODEL:
|
|
184
|
+
- Every action is OFF by default per-agent until the operator adds
|
|
185
|
+
it to toolConfig.desktop.allowedActions in the agent's config.
|
|
186
|
+
- LOXIA_DESKTOP_TOOL_DISABLED=1 is a global kill switch (env).
|
|
187
|
+
- On Linux Wayland, input actions are blocked by the OS; only
|
|
188
|
+
screenshot + list_windows work. The tool surfaces a clear
|
|
189
|
+
"Wayland blocks input injection" error for the rest.
|
|
190
|
+
|
|
191
|
+
OS NOTES:
|
|
192
|
+
- macOS: needs Accessibility + Screen Recording permissions granted
|
|
193
|
+
to the Loxia process. Without them you'll see PERMISSION_DENIED.
|
|
194
|
+
- First call lazily loads @nut-tree-fork/nut-js (optional dep, ~30MB
|
|
195
|
+
native binary). If not installed, every action fails with
|
|
196
|
+
NATIVE_UNAVAILABLE — install it or run on a different machine.
|
|
197
|
+
`.trim();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
parseParameters(content) {
|
|
201
|
+
try {
|
|
202
|
+
const trimmed = (content || '').trim();
|
|
203
|
+
if (trimmed.startsWith('{')) {
|
|
204
|
+
const parsed = JSON.parse(trimmed);
|
|
205
|
+
return parsed.parameters || parsed;
|
|
206
|
+
}
|
|
207
|
+
// No XML alternate form — desktop actions are too varied to
|
|
208
|
+
// hand-author. JSON-only keeps the surface honest.
|
|
209
|
+
throw new Error('desktop tool requires JSON parameters');
|
|
210
|
+
} catch (err) {
|
|
211
|
+
throw new Error(`Failed to parse desktop parameters: ${err.message}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
getSupportedActions() {
|
|
216
|
+
return Object.values(DesktopAction);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
getRequiredParameters() {
|
|
220
|
+
return ['action'];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ─── execute ──────────────────────────────────────────────────────
|
|
224
|
+
|
|
225
|
+
async execute(params, context) {
|
|
226
|
+
// 1. Kill switch
|
|
227
|
+
if (process.env[ENV_KILL_FLAG] === '1') {
|
|
228
|
+
return this._fail('DESKTOP_DISABLED',
|
|
229
|
+
'Desktop tool disabled via LOXIA_DESKTOP_TOOL_DISABLED.');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const action = params?.action;
|
|
233
|
+
if (!action || !Object.values(DesktopAction).includes(action)) {
|
|
234
|
+
return this._fail('INVALID_ACTION',
|
|
235
|
+
`unknown action "${action}". Valid: ${Object.values(DesktopAction).join(', ')}`);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// 2. Per-agent allowlist
|
|
239
|
+
const effective = this.getEffectiveConfig(context, Defaults);
|
|
240
|
+
const allowed = effective.allowedActions || Defaults.ALLOWED_ACTIONS;
|
|
241
|
+
if (!Array.isArray(allowed) || !allowed.includes(action)) {
|
|
242
|
+
return this._fail('NOT_PERMITTED',
|
|
243
|
+
`action "${action}" not in this agent's allowedActions ` +
|
|
244
|
+
`(set toolConfig.desktop.allowedActions to enable).`);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// 3. Dispatch
|
|
248
|
+
const osc = this._osc();
|
|
249
|
+
try {
|
|
250
|
+
switch (action) {
|
|
251
|
+
case DesktopAction.SCREENSHOT: return await this._actScreenshot(osc, params);
|
|
252
|
+
case DesktopAction.CLICK: return await this._actClick(osc, effective, params, context);
|
|
253
|
+
case DesktopAction.TYPE: return await this._actType(osc, params);
|
|
254
|
+
case DesktopAction.KEY_PRESS: return await this._actKeyPress(osc, params);
|
|
255
|
+
case DesktopAction.SCROLL: return await this._actScroll(osc, effective, params, context);
|
|
256
|
+
case DesktopAction.DRAG: return await this._actDrag(osc, effective, params, context);
|
|
257
|
+
case DesktopAction.LIST_WINDOWS: return await this._actListWindows(osc);
|
|
258
|
+
case DesktopAction.FOCUS_WINDOW: return await this._actFocusWindow(osc, params);
|
|
259
|
+
case DesktopAction.DESCRIBE_CAPS: return await this._actDescribeCaps(osc);
|
|
260
|
+
}
|
|
261
|
+
} catch (err) {
|
|
262
|
+
return this._fail(err.code || 'OP_FAILED', err.message, action);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ─── actions ──────────────────────────────────────────────────────
|
|
267
|
+
|
|
268
|
+
async _actScreenshot(osc, params) {
|
|
269
|
+
const png = await osc.screenshot({ region: params.region });
|
|
270
|
+
const size = await osc.screenSize();
|
|
271
|
+
// Tag the action in the output. Without this, a screenshot success
|
|
272
|
+
// result is indistinguishable from a click/scroll/drag SUCCESS when
|
|
273
|
+
// the agent reads the tool result text — and out-of-order batched
|
|
274
|
+
// returns can land a stale screenshot success right where a click
|
|
275
|
+
// success would normally appear. Putting "[action: screenshot]" up
|
|
276
|
+
// front makes the action explicit so the model can't mistake it for
|
|
277
|
+
// a click confirmation.
|
|
278
|
+
// Save to a temp file rather than inlining base64 into the tool
|
|
279
|
+
// result. A 200 KB PNG becomes ~290 KB of base64 — stuffing that
|
|
280
|
+
// into the conversation as a text tool-result derails the next
|
|
281
|
+
// model turn (it sees a wall of characters, not an image, and
|
|
282
|
+
// loses the original task; streaming often aborts mid-scan).
|
|
283
|
+
// Returning a path lets vision-capable downstream tools open it
|
|
284
|
+
// properly, and keeps the conversation token count sane.
|
|
285
|
+
const filePath = await this._saveScreenshot(png);
|
|
286
|
+
this._audit('screenshot', { size, bytes: png.length, filePath });
|
|
287
|
+
return {
|
|
288
|
+
success: true,
|
|
289
|
+
action: 'screenshot',
|
|
290
|
+
output:
|
|
291
|
+
`[action: screenshot] Captured ${size.width}x${size.height} screenshot ` +
|
|
292
|
+
`(${png.length} bytes) → ${filePath}\n` +
|
|
293
|
+
`NOTE: a successful screenshot does NOT mean an earlier click/scroll/drag ` +
|
|
294
|
+
`succeeded — those have separate results tagged "[action: click]" etc. ` +
|
|
295
|
+
`Look at the most recent action-tagged result for the action you actually called.\n` +
|
|
296
|
+
`To inspect the image use the vision tool with this path, or just call ` +
|
|
297
|
+
`click/scroll/drag with an "intent" (one-step: screenshot + ground + act).`,
|
|
298
|
+
screenshotPath: filePath,
|
|
299
|
+
bytes: png.length,
|
|
300
|
+
size,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Persist a captured PNG to disk. We use the OS temp dir under a
|
|
306
|
+
* stable subfolder so old shots are easy to clean up by hand, and
|
|
307
|
+
* a millisecond-precise filename so concurrent captures don't
|
|
308
|
+
* collide. Returning the file path (not the bytes) is what keeps
|
|
309
|
+
* the conversation text-size sane — see _actScreenshot.
|
|
310
|
+
*/
|
|
311
|
+
async _saveScreenshot(png) {
|
|
312
|
+
const dir = join(tmpdir(), 'loxia-desktop-screenshots');
|
|
313
|
+
await mkdir(dir, { recursive: true });
|
|
314
|
+
const filePath = join(dir, `screenshot-${Date.now()}.png`);
|
|
315
|
+
await writeFile(filePath, png);
|
|
316
|
+
return filePath;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async _actClick(osc, effective, params, context) {
|
|
320
|
+
const { x, y, groundedFrom } = await this._resolveCoords(osc, effective, params, context);
|
|
321
|
+
await osc.mouseClick(x, y, { button: params.button, count: params.count });
|
|
322
|
+
this._audit('click', { x, y, button: params.button || 'left', count: params.count || 1, groundedFrom });
|
|
323
|
+
return {
|
|
324
|
+
success: true,
|
|
325
|
+
action: 'click',
|
|
326
|
+
output: `[action: click] Clicked at (${x}, ${y})${groundedFrom ? ` — grounded from "${groundedFrom}"` : ''}.`,
|
|
327
|
+
coords: { x, y },
|
|
328
|
+
groundedFrom,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
async _actType(osc, params) {
|
|
333
|
+
if (typeof params.text !== 'string' || params.text.length === 0) {
|
|
334
|
+
return this._fail('INVALID_INPUT', 'type action requires non-empty "text"', 'type');
|
|
335
|
+
}
|
|
336
|
+
await osc.typeText(params.text, { delayMs: params.delayMs });
|
|
337
|
+
this._audit('type', { chars: params.text.length });
|
|
338
|
+
return {
|
|
339
|
+
success: true,
|
|
340
|
+
action: 'type',
|
|
341
|
+
output: `[action: type] Typed ${params.text.length} characters.`,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
async _actKeyPress(osc, params) {
|
|
346
|
+
if (!Array.isArray(params.keys) || params.keys.length === 0) {
|
|
347
|
+
return this._fail('INVALID_INPUT', 'key_press requires non-empty "keys" array', 'key_press');
|
|
348
|
+
}
|
|
349
|
+
await osc.keyPress(params.keys);
|
|
350
|
+
this._audit('key_press', { keys: params.keys });
|
|
351
|
+
return {
|
|
352
|
+
success: true,
|
|
353
|
+
action: 'key_press',
|
|
354
|
+
output: `[action: key_press] Pressed ${params.keys.join('+')}.`,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
async _actScroll(osc, effective, params, context) {
|
|
359
|
+
if (!Number.isFinite(params.dy)) {
|
|
360
|
+
return this._fail('INVALID_INPUT', 'scroll requires numeric "dy"', 'scroll');
|
|
361
|
+
}
|
|
362
|
+
const { x, y, groundedFrom } = await this._resolveCoords(osc, effective, params, context);
|
|
363
|
+
await osc.mouseScroll(x, y, params.dy);
|
|
364
|
+
this._audit('scroll', { x, y, dy: params.dy, groundedFrom });
|
|
365
|
+
return {
|
|
366
|
+
success: true,
|
|
367
|
+
action: 'scroll',
|
|
368
|
+
output: `[action: scroll] Scrolled ${params.dy > 0 ? 'down' : 'up'} ${Math.abs(params.dy)} at (${x}, ${y}).`,
|
|
369
|
+
coords: { x, y },
|
|
370
|
+
groundedFrom,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
async _actDrag(osc, effective, params, context) {
|
|
375
|
+
// Drag accepts either two coord pairs OR two intents. The two ends
|
|
376
|
+
// are grounded independently with the SAME screenshot — avoids two
|
|
377
|
+
// model calls when both intents reference the same view.
|
|
378
|
+
const from = await this._resolveCoords(
|
|
379
|
+
osc, effective,
|
|
380
|
+
{ x: params.from?.x, y: params.from?.y, intent: params.fromIntent },
|
|
381
|
+
context,
|
|
382
|
+
);
|
|
383
|
+
const to = await this._resolveCoords(
|
|
384
|
+
osc, effective,
|
|
385
|
+
{ x: params.to?.x, y: params.to?.y, intent: params.toIntent },
|
|
386
|
+
context,
|
|
387
|
+
from._sharedScreenshot,
|
|
388
|
+
);
|
|
389
|
+
await osc.mouseDrag({ x: from.x, y: from.y }, { x: to.x, y: to.y }, { button: params.button });
|
|
390
|
+
this._audit('drag', { from, to });
|
|
391
|
+
return {
|
|
392
|
+
success: true,
|
|
393
|
+
action: 'drag',
|
|
394
|
+
output: `[action: drag] Dragged from (${from.x}, ${from.y}) to (${to.x}, ${to.y}).`,
|
|
395
|
+
from: { x: from.x, y: from.y },
|
|
396
|
+
to: { x: to.x, y: to.y },
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
async _actListWindows(osc) {
|
|
401
|
+
const raw = await osc.listWindows();
|
|
402
|
+
// Most platforms (Windows especially) report hundreds of OS-internal
|
|
403
|
+
// handles with empty titles. Surfacing the full list bloats the
|
|
404
|
+
// conversation context (>200 KB observed on Win11 with ~1300
|
|
405
|
+
// handles) and the model loses the original task in the noise.
|
|
406
|
+
// Filter to titled windows and cap to a sensible top-N. Total count
|
|
407
|
+
// stays in the output so the agent knows truncation happened.
|
|
408
|
+
const titled = raw.filter(w => w.title && w.title.trim().length > 0);
|
|
409
|
+
const MAX_LIST = 50;
|
|
410
|
+
const top = titled.slice(0, MAX_LIST);
|
|
411
|
+
const truncated = titled.length > MAX_LIST;
|
|
412
|
+
this._audit('list_windows', { total: raw.length, titled: titled.length, returned: top.length });
|
|
413
|
+
return {
|
|
414
|
+
success: true,
|
|
415
|
+
action: 'list_windows',
|
|
416
|
+
output:
|
|
417
|
+
`[action: list_windows] ${titled.length} titled window(s)` +
|
|
418
|
+
(raw.length !== titled.length ? ` (filtered ${raw.length - titled.length} untitled handles)` : '') +
|
|
419
|
+
(truncated ? ` — showing first ${MAX_LIST}` : '') + ': ' +
|
|
420
|
+
top.map(w => `"${w.title}"`).join(', '),
|
|
421
|
+
windows: top,
|
|
422
|
+
totalCount: raw.length,
|
|
423
|
+
titledCount: titled.length,
|
|
424
|
+
truncated,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
async _actFocusWindow(osc, params) {
|
|
429
|
+
if (!params.titleMatch) {
|
|
430
|
+
return this._fail('INVALID_INPUT', 'focus_window requires "titleMatch"', 'focus_window');
|
|
431
|
+
}
|
|
432
|
+
const r = await osc.focusWindow({ titleMatch: params.titleMatch });
|
|
433
|
+
this._audit('focus_window', r);
|
|
434
|
+
return {
|
|
435
|
+
success: r.focused,
|
|
436
|
+
action: 'focus_window',
|
|
437
|
+
output: r.focused
|
|
438
|
+
? `[action: focus_window] Focused window: "${r.title}".`
|
|
439
|
+
: `[action: focus_window] No window matched "${params.titleMatch}".`,
|
|
440
|
+
...r,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
async _actDescribeCaps(osc) {
|
|
445
|
+
const caps = await osc.describeCapabilities();
|
|
446
|
+
return {
|
|
447
|
+
success: true,
|
|
448
|
+
action: 'describe_capabilities',
|
|
449
|
+
output: `[action: describe_capabilities] OS: ${caps.os}${caps.display ? ` / ${caps.display}` : ''}; ` +
|
|
450
|
+
`screenshot=${caps.screenshot} mouseInput=${caps.mouseInput} ` +
|
|
451
|
+
`keyboardInput=${caps.keyboardInput} windowFocus=${caps.windowFocus}` +
|
|
452
|
+
(caps.degradedReason ? `\nDegraded: ${caps.degradedReason}` : ''),
|
|
453
|
+
capabilities: caps,
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// ─── helpers ──────────────────────────────────────────────────────
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Resolve (x, y) for an action. Three input shapes:
|
|
461
|
+
*
|
|
462
|
+
* 1. {x, y} — used as-is after validation
|
|
463
|
+
* 2. {intent: '...'} — ask the grounding model
|
|
464
|
+
* 3. neither — INVALID_INPUT
|
|
465
|
+
*
|
|
466
|
+
* When grounding fires, the screenshot is returned on the result so
|
|
467
|
+
* the caller (drag) can reuse it for the second coord without an
|
|
468
|
+
* extra capture.
|
|
469
|
+
*/
|
|
470
|
+
async _resolveCoords(osc, effective, params, context, reuseScreenshot = null) {
|
|
471
|
+
if (Number.isFinite(params.x) && Number.isFinite(params.y)) {
|
|
472
|
+
return { x: params.x, y: params.y, groundedFrom: null };
|
|
473
|
+
}
|
|
474
|
+
if (typeof params.intent === 'string' && params.intent.trim()) {
|
|
475
|
+
const size = await osc.screenSize();
|
|
476
|
+
const screenshot = reuseScreenshot || await osc.screenshot();
|
|
477
|
+
const adapter = await this._adapter(effective, context);
|
|
478
|
+
const result = await this._groundWithFallback(adapter, {
|
|
479
|
+
screenshot,
|
|
480
|
+
intent: params.intent,
|
|
481
|
+
imageSize: { width: size.width, height: size.height },
|
|
482
|
+
knobs: { reasoning_effort: effective.groundingEffort || Defaults.GROUNDING_EFFORT },
|
|
483
|
+
timeoutMs: effective.groundingTimeoutMs || Defaults.GROUNDING_TIMEOUT_MS,
|
|
484
|
+
}, effective, context);
|
|
485
|
+
if (!result.coords) {
|
|
486
|
+
const err = new Error(`grounding produced no coords; model said: "${(result.answer || '').slice(0, 200)}"`);
|
|
487
|
+
err.code = 'GROUNDING_FAILED';
|
|
488
|
+
throw err;
|
|
489
|
+
}
|
|
490
|
+
const { x, y } = result.coords;
|
|
491
|
+
if (!this._coordsInScreen(x, y, size, effective.coordMarginPx ?? Defaults.COORD_MARGIN_PX)) {
|
|
492
|
+
const err = new Error(`grounded coords (${x}, ${y}) lie outside the ${size.width}x${size.height} screen`);
|
|
493
|
+
err.code = 'COORDS_OUT_OF_BOUNDS';
|
|
494
|
+
throw err;
|
|
495
|
+
}
|
|
496
|
+
return { x, y, groundedFrom: params.intent, _sharedScreenshot: screenshot };
|
|
497
|
+
}
|
|
498
|
+
const err = new Error('action requires either (x, y) or "intent"');
|
|
499
|
+
err.code = 'INVALID_INPUT';
|
|
500
|
+
throw err;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
_coordsInScreen(x, y, size, margin) {
|
|
504
|
+
return x >= margin && y >= margin
|
|
505
|
+
&& x <= size.width - margin
|
|
506
|
+
&& y <= size.height - margin;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Lazy-build the grounding adapter. The model id + transport mode
|
|
511
|
+
* come from toolConfig so an operator can swap Kimi → some future
|
|
512
|
+
* model without code changes.
|
|
513
|
+
*/
|
|
514
|
+
async _adapter(effective, context) {
|
|
515
|
+
if (this._adapterCache) return this._adapterCache;
|
|
516
|
+
this._adapterCache = this._buildAdapter(effective, context);
|
|
517
|
+
return this._adapterCache;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
_buildAdapter(effective, context) {
|
|
521
|
+
const modelId = effective.groundingModelId || Defaults.GROUNDING_MODEL;
|
|
522
|
+
|
|
523
|
+
const foundryEndpoint = process.env.FOUNDRY_ENDPOINT;
|
|
524
|
+
const foundryKey = process.env.FOUNDRY_KEY;
|
|
525
|
+
const forceDirect = process.env.LOXIA_GROUNDING_DIRECT === '1';
|
|
526
|
+
const haveDirectCreds = !!(foundryEndpoint && foundryKey);
|
|
527
|
+
|
|
528
|
+
// Mode selection. In order of preference:
|
|
529
|
+
// 1. forceDirect env flag → direct (test / CI)
|
|
530
|
+
// 2. direct creds set AND no aiService → direct (headless / bench)
|
|
531
|
+
// 3. otherwise → proxy via the Loxia backend (production path)
|
|
532
|
+
// A failed proxy request (e.g. 404 because /llm/grounding isn't
|
|
533
|
+
// deployed yet) automatically retries once in direct mode if creds
|
|
534
|
+
// exist — `ground()` does the fallback below.
|
|
535
|
+
if (forceDirect || (!this.aiService && haveDirectCreds)) {
|
|
536
|
+
if (!haveDirectCreds) {
|
|
537
|
+
throw Object.assign(new Error(
|
|
538
|
+
'Direct mode requested but FOUNDRY_ENDPOINT / FOUNDRY_KEY env vars are not set.'
|
|
539
|
+
), { code: 'NOT_INITIALISED' });
|
|
540
|
+
}
|
|
541
|
+
return createGroundingModel(modelId, {
|
|
542
|
+
mode: 'direct',
|
|
543
|
+
endpoint: foundryEndpoint,
|
|
544
|
+
apiKey: foundryKey,
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
if (!this.aiService) {
|
|
548
|
+
throw Object.assign(new Error(
|
|
549
|
+
'DesktopTool has no grounding transport. Either set FOUNDRY_ENDPOINT + ' +
|
|
550
|
+
'FOUNDRY_KEY env vars (direct mode) OR run a Loxia backend that has ' +
|
|
551
|
+
'POST /llm/grounding deployed (proxy mode).'
|
|
552
|
+
), { code: 'NOT_INITIALISED' });
|
|
553
|
+
}
|
|
554
|
+
return createGroundingModel(modelId, {
|
|
555
|
+
mode: 'proxy',
|
|
556
|
+
backendUrl: this.aiService.baseUrl,
|
|
557
|
+
userApiKey: this._resolveUserKey(context),
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Wraps the adapter's ground() with one automatic fallback to direct
|
|
563
|
+
* mode when proxy returns 404 (route not deployed yet) AND direct
|
|
564
|
+
* credentials are available in env. Saves the user from "deploy the
|
|
565
|
+
* backend before you can fun" friction during the rollout window.
|
|
566
|
+
*/
|
|
567
|
+
async _groundWithFallback(adapter, request, effective, context) {
|
|
568
|
+
try {
|
|
569
|
+
return await adapter.ground(request);
|
|
570
|
+
} catch (err) {
|
|
571
|
+
const is404 = /\b404\b/.test(err.message || '') || /\bNot Found\b/i.test(err.message || '');
|
|
572
|
+
const isProxy = adapter.mode === 'proxy';
|
|
573
|
+
const haveDirectCreds = !!(process.env.FOUNDRY_ENDPOINT && process.env.FOUNDRY_KEY);
|
|
574
|
+
if (!is404 || !isProxy || !haveDirectCreds) throw err;
|
|
575
|
+
|
|
576
|
+
this.logger?.warn?.(
|
|
577
|
+
'[desktop] proxy /llm/grounding returned 404 — falling back to direct Foundry. ' +
|
|
578
|
+
'Deploy the backend route to get billing + audit back.',
|
|
579
|
+
);
|
|
580
|
+
const directAdapter = createGroundingModel(
|
|
581
|
+
effective.groundingModelId || Defaults.GROUNDING_MODEL,
|
|
582
|
+
{ mode: 'direct', endpoint: process.env.FOUNDRY_ENDPOINT, apiKey: process.env.FOUNDRY_KEY },
|
|
583
|
+
);
|
|
584
|
+
// Replace cache so subsequent calls go straight to direct.
|
|
585
|
+
this._adapterCache = directAdapter;
|
|
586
|
+
return await directAdapter.ground(request);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
_resolveUserKey(context) {
|
|
591
|
+
// Pull the per-session Loxia token the same way other tools do.
|
|
592
|
+
const km = this.aiService?.apiKeyManager;
|
|
593
|
+
if (km && typeof km.getKeysForRequest === 'function') {
|
|
594
|
+
const keys = km.getKeysForRequest(context?.sessionId, {
|
|
595
|
+
platformProvided: context?.platformProvided !== false,
|
|
596
|
+
});
|
|
597
|
+
if (keys?.loxiaApiKey) return keys.loxiaApiKey;
|
|
598
|
+
}
|
|
599
|
+
return this.aiService?.config?.apiKey || process.env.LOXIA_API_KEY || null;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* Lazy-create an OS controller if the constructor didn't get one.
|
|
604
|
+
* Production path: created on demand. Test path: injected at ctor.
|
|
605
|
+
*/
|
|
606
|
+
_osc() {
|
|
607
|
+
if (!this.osController) this.osController = createOSController();
|
|
608
|
+
return this.osController;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
_audit(action, meta) {
|
|
612
|
+
this.logger?.info?.(`[desktop] ${action}`, { tool: this.id, action, ...meta });
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* Build a structured failure result. `action` is optional but
|
|
617
|
+
* strongly preferred — it lets the agent distinguish "click failed"
|
|
618
|
+
* from "screenshot failed" at a glance when results arrive
|
|
619
|
+
* out-of-order in a batched message, which is the only way it can
|
|
620
|
+
* recover the correct mental model of what happened.
|
|
621
|
+
*/
|
|
622
|
+
_fail(code, message, action = null) {
|
|
623
|
+
this.logger?.warn?.(`[desktop] ${code}: ${message}`);
|
|
624
|
+
const prefix = action ? `[action: ${action}] ` : '';
|
|
625
|
+
return {
|
|
626
|
+
success: false,
|
|
627
|
+
...(action ? { action } : {}),
|
|
628
|
+
error: message,
|
|
629
|
+
code,
|
|
630
|
+
output: `${prefix}Desktop action failed (${code}): ${message}`,
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
// Re-export OSError so callers can match on it without two imports.
|
|
636
|
+
export { OSError };
|
|
637
|
+
|
|
638
|
+
export default DesktopTool;
|