onbuzz 3.9.6 → 3.9.8
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/__tests__/resolvePreferredModel.test.js +59 -101
- package/src/interfaces/__tests__/remoteSessionAuth.test.js +46 -0
- package/src/interfaces/webServer.js +10 -2
- package/src/tools/__tests__/visionTool.modelSelection.test.js +86 -0
- package/src/tools/__tests__/webTool.visionModel.test.js +75 -0
- package/src/tools/visionTool.js +18 -24
- package/src/tools/webTool.js +27 -2
- package/web-ui/build/index.html +1 -1
- package/web-ui/build/static/1c-CbzecjHi.js +1 -0
- package/web-ui/build/static/abap-B64Rmd3x.js +1 -0
- package/web-ui/build/static/abnf-0eZ1ofqG.js +1 -0
- package/web-ui/build/static/abnf-BhANbO1L.js +1 -0
- package/web-ui/build/static/accesslog-clFlGMX1.js +1 -0
- package/web-ui/build/static/actionscript-DXab4IMG.js +1 -0
- package/web-ui/build/static/actionscript-RFf8wL8w.js +1 -0
- package/web-ui/build/static/ada-Bm94vJQR.js +1 -0
- package/web-ui/build/static/ada-zNbObSyu.js +1 -0
- package/web-ui/build/static/agda-K3kQv8iy.js +1 -0
- package/web-ui/build/static/al-B3t1K-du.js +1 -0
- package/web-ui/build/static/angelscript-CnHodqV_.js +1 -0
- package/web-ui/build/static/antlr4-BZgY7Twd.js +1 -0
- package/web-ui/build/static/apache-C12AF3ev.js +1 -0
- package/web-ui/build/static/apacheconf-DkOEqFh0.js +1 -0
- package/web-ui/build/static/apex-BDpgbClJ.js +1 -0
- package/web-ui/build/static/apl-Dh1dt5kw.js +1 -0
- package/web-ui/build/static/applescript-Bg_fqdWd.js +1 -0
- package/web-ui/build/static/applescript-ByhrvNiG.js +1 -0
- package/web-ui/build/static/aql-QIblVVYJ.js +1 -0
- package/web-ui/build/static/arcade-Cm4e2zMb.js +1 -0
- package/web-ui/build/static/arduino-CGkuSXzN.js +1 -0
- package/web-ui/build/static/arduino-OsL_Nhym.js +1 -0
- package/web-ui/build/static/arff-B4JSuA76.js +1 -0
- package/web-ui/build/static/armasm-DdbgiOrV.js +1 -0
- package/web-ui/build/static/asciidoc-0lb-Ko8S.js +1 -0
- package/web-ui/build/static/asciidoc-BYRGLnED.js +1 -0
- package/web-ui/build/static/asm6502-DG0RlvQN.js +1 -0
- package/web-ui/build/static/asmatmel-DWT2_REW.js +1 -0
- package/web-ui/build/static/aspectj-MEt9NeRB.js +1 -0
- package/web-ui/build/static/aspnet-DR3hLqcA.js +1 -0
- package/web-ui/build/static/autohotkey-B6JJ6A0n.js +1 -0
- package/web-ui/build/static/autohotkey-BCqVAmnV.js +1 -0
- package/web-ui/build/static/autoit-BqyLjnUK.js +1 -0
- package/web-ui/build/static/autoit-D3OL2ya6.js +1 -0
- package/web-ui/build/static/avisynth-CFYPlhWF.js +1 -0
- package/web-ui/build/static/avrasm-BvoWo5z1.js +1 -0
- package/web-ui/build/static/avro-idl-Dmt54kEx.js +1 -0
- package/web-ui/build/static/awk-DKHI_UvD.js +1 -0
- package/web-ui/build/static/axapta-jgtqYlu1.js +1 -0
- package/web-ui/build/static/bash-CM-bsVnP.js +1 -0
- package/web-ui/build/static/bash-rbX0rKbK.js +1 -0
- package/web-ui/build/static/basic-B31B3k7x.js +1 -0
- package/web-ui/build/static/basic-Gu99ccWS.js +1 -0
- package/web-ui/build/static/batch-Dxt_s5aG.js +1 -0
- package/web-ui/build/static/bbcode-C0kmzu6X.js +1 -0
- package/web-ui/build/static/bicep-BsOEq_j9.js +1 -0
- package/web-ui/build/static/birb-CtTYWirD.js +1 -0
- package/web-ui/build/static/bison-D50hClIy.js +1 -0
- package/web-ui/build/static/bnf-CZQ0tN86.js +1 -0
- package/web-ui/build/static/bnf-keJM21-h.js +1 -0
- package/web-ui/build/static/brainfuck-BYsdquiy.js +1 -0
- package/web-ui/build/static/brainfuck-ChqXjCJ9.js +1 -0
- package/web-ui/build/static/brightscript-C2Wd5Kft.js +1 -0
- package/web-ui/build/static/bro-Cg2wy26n.js +1 -0
- package/web-ui/build/static/bsl-KPpKnfiJ.js +1 -0
- package/web-ui/build/static/c-DngIvZ7L.js +1 -0
- package/web-ui/build/static/c-Iq8EIPIe.js +1 -0
- package/web-ui/build/static/c-like-Bec9Rkda.js +1 -0
- package/web-ui/build/static/cal-BS26ucSy.js +1 -0
- package/web-ui/build/static/capnproto-W0IWf2FW.js +1 -0
- package/web-ui/build/static/ceylon-ujPry_yR.js +1 -0
- package/web-ui/build/static/cfscript-806779CY.js +1 -0
- package/web-ui/build/static/chaiscript-D9HG2WFc.js +1 -0
- package/web-ui/build/static/cil-BDNzOY3h.js +1 -0
- package/web-ui/build/static/clean-DoE0KPLU.js +1 -0
- package/web-ui/build/static/clojure-B-nWTi09.js +1 -0
- package/web-ui/build/static/clojure-BIPQIlEM.js +1 -0
- package/web-ui/build/static/clojure-repl-C6Xgw1BL.js +1 -0
- package/web-ui/build/static/cmake-BCUVXGkd.js +1 -0
- package/web-ui/build/static/cmake-DoEfzWcx.js +1 -0
- package/web-ui/build/static/cobol-DyuJRPLj.js +1 -0
- package/web-ui/build/static/coffeescript-CzPUmFhd.js +1 -0
- package/web-ui/build/static/coffeescript-cxIqfyb2.js +1 -0
- package/web-ui/build/static/concurnas-YafoHwhS.js +1 -0
- package/web-ui/build/static/coq-DtAS2_j-.js +1 -0
- package/web-ui/build/static/coq-sa9vsIqd.js +1 -0
- package/web-ui/build/static/cos-nEV8XIfx.js +1 -0
- package/web-ui/build/static/cpp-CcKjDXtx.js +1 -0
- package/web-ui/build/static/cpp-CcxmwIS8.js +1 -0
- package/web-ui/build/static/crmsh-BCZKA2g2.js +1 -0
- package/web-ui/build/static/crystal-CI7ryNid.js +1 -0
- package/web-ui/build/static/crystal-DpjmCsWq.js +1 -0
- package/web-ui/build/static/csharp-BJEFr34Q.js +1 -0
- package/web-ui/build/static/csharp-Di8gXUl6.js +1 -0
- package/web-ui/build/static/cshtml-CM5kdsbL.js +1 -0
- package/web-ui/build/static/csp-CCUatC8F.js +1 -0
- package/web-ui/build/static/csp-CQMJNBVX.js +1 -0
- package/web-ui/build/static/css-Ca1P3y8D.js +1 -0
- package/web-ui/build/static/css-extras-B-WsWoLG.js +1 -0
- package/web-ui/build/static/csv-Dp2D1vNQ.js +1 -0
- package/web-ui/build/static/cypher-C2lTf63v.js +1 -0
- package/web-ui/build/static/d-BpN31fsJ.js +1 -0
- package/web-ui/build/static/d-DF2Z_5Y5.js +1 -0
- package/web-ui/build/static/dart-D2xFtNlR.js +1 -0
- package/web-ui/build/static/dart-D_CllGe8.js +1 -0
- package/web-ui/build/static/dataweave-D0S0J-fB.js +1 -0
- package/web-ui/build/static/dax-LFApbZ_c.js +1 -0
- package/web-ui/build/static/delphi-BwOo_vb0.js +1 -0
- package/web-ui/build/static/dhall-Bdnii7zv.js +1 -0
- package/web-ui/build/static/diff-BkC59Drj.js +1 -0
- package/web-ui/build/static/diff-Ft7pVJ9X.js +1 -0
- package/web-ui/build/static/django-CBZk8JcH.js +1 -0
- package/web-ui/build/static/django-WTsadJGk.js +1 -0
- package/web-ui/build/static/dns-DiL3BhcP.js +1 -0
- package/web-ui/build/static/dns-zone-file-pi6xeovf.js +1 -0
- package/web-ui/build/static/docker-DyQR3JA7.js +1 -0
- package/web-ui/build/static/dockerfile-BE207Z5W.js +1 -0
- package/web-ui/build/static/dos-BhnpGRsK.js +1 -0
- package/web-ui/build/static/dot-Dhy7kpoM.js +1 -0
- package/web-ui/build/static/dsconfig-DzkFGUpr.js +1 -0
- package/web-ui/build/static/dts-BhMOwHm3.js +1 -0
- package/web-ui/build/static/dust-DkbHh2Pg.js +1 -0
- package/web-ui/build/static/ebnf-C3wm6ooH.js +1 -0
- package/web-ui/build/static/ebnf-DqOIsQzW.js +1 -0
- package/web-ui/build/static/editorconfig-D2EbTZsp.js +1 -0
- package/web-ui/build/static/eiffel-C_xptgK8.js +1 -0
- package/web-ui/build/static/ejs-CcONaJS0.js +1 -0
- package/web-ui/build/static/elixir-CagtfrW4.js +1 -0
- package/web-ui/build/static/elixir-CyP-nJp8.js +1 -0
- package/web-ui/build/static/elm-BkimtfCC.js +1 -0
- package/web-ui/build/static/elm-Cy0zy-Wk.js +1 -0
- package/web-ui/build/static/erb-CKfVidCX.js +1 -0
- package/web-ui/build/static/erb-Di0rdfuA.js +1 -0
- package/web-ui/build/static/erlang-C9YmoUs7.js +1 -0
- package/web-ui/build/static/erlang-DRED-UWJ.js +1 -0
- package/web-ui/build/static/erlang-repl-DeR_2uii.js +1 -0
- package/web-ui/build/static/etlua-B6Z-QQtE.js +1 -0
- package/web-ui/build/static/excel-DYqxHaXE.js +1 -0
- package/web-ui/build/static/excel-formula-BreCIdiF.js +1 -0
- package/web-ui/build/static/factor-jyOxALZ3.js +1 -0
- package/web-ui/build/static/false-BNO0FXoK.js +1 -0
- package/web-ui/build/static/firestore-security-rules-8OJaVJPI.js +1 -0
- package/web-ui/build/static/fix-DxdEj5oc.js +1 -0
- package/web-ui/build/static/flix-Dz2xZZH5.js +1 -0
- package/web-ui/build/static/flow-DpzKZb4e.js +1 -0
- package/web-ui/build/static/fortran-CtfIFIgp.js +1 -0
- package/web-ui/build/static/fortran-Cv6ED2BG.js +1 -0
- package/web-ui/build/static/fsharp-BC6e3hD1.js +1 -0
- package/web-ui/build/static/fsharp-CMyk8GxQ.js +1 -0
- package/web-ui/build/static/ftl-DZnBCzfq.js +1 -0
- package/web-ui/build/static/gams-ClY69INi.js +1 -0
- package/web-ui/build/static/gap-DYeEWwoE.js +1 -0
- package/web-ui/build/static/gauss-CCHXytat.js +1 -0
- package/web-ui/build/static/gcode-DoWDPjLg.js +1 -0
- package/web-ui/build/static/gcode-N6PPDTDT.js +1 -0
- package/web-ui/build/static/gdscript-agxR9uG0.js +1 -0
- package/web-ui/build/static/gedcom-BvBAgJXG.js +1 -0
- package/web-ui/build/static/gherkin-BW8CWXxJ.js +1 -0
- package/web-ui/build/static/gherkin-CqawSkQY.js +1 -0
- package/web-ui/build/static/git-99C9UE-e.js +1 -0
- package/web-ui/build/static/glsl-CQEuDShu.js +1 -0
- package/web-ui/build/static/glsl-DuhoPpCv.js +1 -0
- package/web-ui/build/static/gml-Bsn22WsK.js +1 -0
- package/web-ui/build/static/gml-BvXK6GGq.js +1 -0
- package/web-ui/build/static/gn-BUoYUPzm.js +1 -0
- package/web-ui/build/static/go-CvTv9DUi.js +1 -0
- package/web-ui/build/static/go-module-Dwpq3Jsg.js +1 -0
- package/web-ui/build/static/go-sGZzTvuq.js +1 -0
- package/web-ui/build/static/golo-C6DHxID0.js +1 -0
- package/web-ui/build/static/gradle-D7XVSr1y.js +1 -0
- package/web-ui/build/static/graphql-DIIA3EdJ.js +1 -0
- package/web-ui/build/static/groovy-B5TJuGtQ.js +1 -0
- package/web-ui/build/static/groovy-BVf2VudZ.js +1 -0
- package/web-ui/build/static/haml-B0dZKFFV.js +1 -0
- package/web-ui/build/static/haml-B5rD_eqj.js +1 -0
- package/web-ui/build/static/handlebars-Db8etm3q.js +1 -0
- package/web-ui/build/static/handlebars-Qm9HXVGH.js +1 -0
- package/web-ui/build/static/haskell-BbTqR78v.js +1 -0
- package/web-ui/build/static/haskell-cf6URQ36.js +1 -0
- package/web-ui/build/static/haxe-4ugxCu3z.js +1 -0
- package/web-ui/build/static/haxe-BscBu1yx.js +1 -0
- package/web-ui/build/static/hcl-QK-f8vU5.js +1 -0
- package/web-ui/build/static/hlsl-BnQDpabJ.js +1 -0
- package/web-ui/build/static/hoon-VPMuvItP.js +1 -0
- package/web-ui/build/static/hpkp-VpqLQgGP.js +1 -0
- package/web-ui/build/static/hsp-DTlBvyyT.js +1 -0
- package/web-ui/build/static/hsts-B6Dishdu.js +1 -0
- package/web-ui/build/static/htmlbars-Byn3Paw0.js +1 -0
- package/web-ui/build/static/http-CM7a2429.js +1 -0
- package/web-ui/build/static/http-QOmRJ4Jd.js +1 -0
- package/web-ui/build/static/hy-D3_6scbm.js +1 -0
- package/web-ui/build/static/ichigojam-Os0-Gxpc.js +1 -0
- package/web-ui/build/static/icon-DAjjoH9X.js +1 -0
- package/web-ui/build/static/icu-message-format-CCtlXoOl.js +1 -0
- package/web-ui/build/static/idris-BLmLcq2C.js +1 -0
- package/web-ui/build/static/iecst-CL0FD1hF.js +1 -0
- package/web-ui/build/static/ignore-Bcd-tuGH.js +1 -0
- package/web-ui/build/static/index-BPqTB5k7.js +1 -0
- package/web-ui/build/static/index-ClWUfRkv.js +13 -0
- package/web-ui/build/static/index-DY0DLa8y.js +831 -0
- package/web-ui/build/static/inform7-ChnghUc9.js +1 -0
- package/web-ui/build/static/inform7-DFioFNVH.js +1 -0
- package/web-ui/build/static/ini-B7Qqa2Hv.js +1 -0
- package/web-ui/build/static/ini-CFmmlUla.js +1 -0
- package/web-ui/build/static/io-C5MldizL.js +1 -0
- package/web-ui/build/static/irpf90-Co951JRw.js +1 -0
- package/web-ui/build/static/isbl-BlVCsoVY.js +1 -0
- package/web-ui/build/static/j-BfpCTQLT.js +1 -0
- package/web-ui/build/static/java-B8eLTuI_.js +1 -0
- package/web-ui/build/static/java-Cp73UB-4.js +1 -0
- package/web-ui/build/static/javadoc-sKuB5y9S.js +1 -0
- package/web-ui/build/static/javadoclike-0oCrjeqP.js +1 -0
- package/web-ui/build/static/javascript-DhJRIVbT.js +1 -0
- package/web-ui/build/static/javastacktrace-34av_07D.js +1 -0
- package/web-ui/build/static/jboss-cli-B3LjD57q.js +1 -0
- package/web-ui/build/static/jexl-DjeCXh3R.js +1 -0
- package/web-ui/build/static/jolie-DSguA0co.js +1 -0
- package/web-ui/build/static/jq-CrNdtEVM.js +1 -0
- package/web-ui/build/static/js-extras-DRiGHN_t.js +1 -0
- package/web-ui/build/static/js-templates-BOAGBe4G.js +1 -0
- package/web-ui/build/static/jsdoc-BD9HPtj-.js +1 -0
- package/web-ui/build/static/json-DWyPfZ7N.js +1 -0
- package/web-ui/build/static/json-ZOqNWxv3.js +1 -0
- package/web-ui/build/static/json5-CtFHocU-.js +1 -0
- package/web-ui/build/static/jsonp-D6qQgfvt.js +1 -0
- package/web-ui/build/static/jsstacktrace-4V_XcjuT.js +1 -0
- package/web-ui/build/static/jsx-BEPywbwa.js +1 -0
- package/web-ui/build/static/julia-BMbPnK5h.js +1 -0
- package/web-ui/build/static/julia-DdAob-5L.js +1 -0
- package/web-ui/build/static/julia-repl-D8h3n5ls.js +1 -0
- package/web-ui/build/static/keepalived-DMtuOIPi.js +1 -0
- package/web-ui/build/static/keyman-BYoKRL3H.js +1 -0
- package/web-ui/build/static/kotlin-DKSAAlR0.js +1 -0
- package/web-ui/build/static/kotlin-av8HkILL.js +1 -0
- package/web-ui/build/static/kumir-DKW-dbIw.js +1 -0
- package/web-ui/build/static/kusto-CmM_Dgdi.js +1 -0
- package/web-ui/build/static/lasso-UpwhKAGW.js +1 -0
- package/web-ui/build/static/latex--o0dGgqN.js +1 -0
- package/web-ui/build/static/latex-BDYUhb2n.js +1 -0
- package/web-ui/build/static/latte-BIQdMLZM.js +1 -0
- package/web-ui/build/static/ldif-BHZbj1Gt.js +1 -0
- package/web-ui/build/static/leaf-tKJVpCFa.js +1 -0
- package/web-ui/build/static/less-BWc29iML.js +1 -0
- package/web-ui/build/static/less-Cbs0Yz51.js +1 -0
- package/web-ui/build/static/lilypond-B5_XQXAT.js +1 -0
- package/web-ui/build/static/liquid-BUBwhbDU.js +1 -0
- package/web-ui/build/static/lisp-ConZsrCa.js +1 -0
- package/web-ui/build/static/lisp-CyghfRqh.js +1 -0
- package/web-ui/build/static/livecodeserver-BdtmjzpM.js +1 -0
- package/web-ui/build/static/livescript-CbEttWiK.js +1 -0
- package/web-ui/build/static/livescript-DlaJUNpa.js +1 -0
- package/web-ui/build/static/llvm-CljEFNfy.js +1 -0
- package/web-ui/build/static/llvm-OEx8ipzf.js +1 -0
- package/web-ui/build/static/log-CtjresKJ.js +1 -0
- package/web-ui/build/static/lolcode-CbZB03Q-.js +1 -0
- package/web-ui/build/static/lsl-TsKq2mca.js +1 -0
- package/web-ui/build/static/lua-1Rx_tY_z.js +1 -0
- package/web-ui/build/static/lua-CrgLvyqs.js +1 -0
- package/web-ui/build/static/magma-BK5awswf.js +1 -0
- package/web-ui/build/static/makefile-6SJJhsz5.js +1 -0
- package/web-ui/build/static/makefile-DXokzicL.js +1 -0
- package/web-ui/build/static/markdown-Bzf4rNiL.js +1 -0
- package/web-ui/build/static/markdown-D2e-R2p5.js +1 -0
- package/web-ui/build/static/markup-templating-Brr7NCtI.js +1 -0
- package/web-ui/build/static/mathematica-BHdsgRlV.js +1 -0
- package/web-ui/build/static/matlab-D_t3IZfZ.js +1 -0
- package/web-ui/build/static/matlab-cKsG1reI.js +1 -0
- package/web-ui/build/static/maxima-cBBBfxwc.js +1 -0
- package/web-ui/build/static/maxscript-C1ulETQI.js +1 -0
- package/web-ui/build/static/mel-Bi5R0sfT.js +1 -0
- package/web-ui/build/static/mel-CExeAiGY.js +1 -0
- package/web-ui/build/static/mercury-BQmKWkZv.js +1 -0
- package/web-ui/build/static/mermaid-n5nH0--1.js +1 -0
- package/web-ui/build/static/mipsasm-B5MOlnt9.js +1 -0
- package/web-ui/build/static/mizar-BOKt_6pu.js +1 -0
- package/web-ui/build/static/mizar-BQn40NA6.js +1 -0
- package/web-ui/build/static/mojolicious-B9lAb6C9.js +1 -0
- package/web-ui/build/static/mongodb-DBaQzUEE.js +1 -0
- package/web-ui/build/static/monkey-FadeXREo.js +1 -0
- package/web-ui/build/static/monkey-HfvbiXjN.js +1 -0
- package/web-ui/build/static/moonscript-CNC9qFDz.js +1 -0
- package/web-ui/build/static/moonscript-Cin88noO.js +1 -0
- package/web-ui/build/static/n1ql-Dr9Yo8b-.js +1 -0
- package/web-ui/build/static/n1ql-DzlVOUYJ.js +1 -0
- package/web-ui/build/static/n4js-DTmfxRT4.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-Bod-DCUu.js +1 -0
- package/web-ui/build/static/naniscript-CfiXCI4Z.js +1 -0
- package/web-ui/build/static/nasm-BXYRoY2W.js +1 -0
- package/web-ui/build/static/neon-D2krcpRE.js +1 -0
- package/web-ui/build/static/nevod-BQHDBMPo.js +1 -0
- package/web-ui/build/static/nginx-C_9KHeCP.js +1 -0
- package/web-ui/build/static/nginx-KL5tR7Jx.js +1 -0
- package/web-ui/build/static/nim-37p-xSET.js +1 -0
- package/web-ui/build/static/nim-D6PBji9h.js +1 -0
- package/web-ui/build/static/nix-CKra7X1P.js +1 -0
- package/web-ui/build/static/nix-CvbOGPFE.js +1 -0
- package/web-ui/build/static/node-repl-Cgo-gZ2g.js +1 -0
- package/web-ui/build/static/nsis-CtJDG2rE.js +1 -0
- package/web-ui/build/static/nsis-Cyt_6huf.js +1 -0
- package/web-ui/build/static/objectivec-Dy3dfqtz.js +1 -0
- package/web-ui/build/static/objectivec-QkHVj_us.js +1 -0
- package/web-ui/build/static/ocaml-C6TUnerY.js +1 -0
- package/web-ui/build/static/ocaml-c_egR_d6.js +1 -0
- package/web-ui/build/static/opencl-B9yN9nWN.js +1 -0
- package/web-ui/build/static/openqasm-BklslFAf.js +1 -0
- package/web-ui/build/static/openscad-C0AzYzEM.js +1 -0
- package/web-ui/build/static/oxygene-D2P6nG-V.js +1 -0
- package/web-ui/build/static/oz-CITL0kRx.js +1 -0
- package/web-ui/build/static/parigp-B9QyF2Nn.js +1 -0
- package/web-ui/build/static/parser-bpYn2eF8.js +1 -0
- package/web-ui/build/static/parser3-COZ5BGpE.js +1 -0
- package/web-ui/build/static/pascal-CjnX24jl.js +1 -0
- package/web-ui/build/static/pascaligo-BACCpo1a.js +1 -0
- package/web-ui/build/static/pcaxis-BoQE7JGE.js +1 -0
- package/web-ui/build/static/peoplecode-CgLXg57_.js +1 -0
- package/web-ui/build/static/perl-CJpIvn7i.js +1 -0
- package/web-ui/build/static/perl-DfM-sqCy.js +1 -0
- package/web-ui/build/static/pf-BF6Acu_U.js +1 -0
- package/web-ui/build/static/pgsql-08w-3mdC.js +1 -0
- package/web-ui/build/static/php-CSic_Yu4.js +1 -0
- package/web-ui/build/static/php-DFxYbY5N.js +1 -0
- package/web-ui/build/static/php-extras-DnRPSllm.js +1 -0
- package/web-ui/build/static/php-template-1kNXCBCk.js +1 -0
- package/web-ui/build/static/phpdoc-CLUTjtz4.js +1 -0
- package/web-ui/build/static/plaintext-dz7_1xmX.js +1 -0
- package/web-ui/build/static/plsql-BGMyKYzB.js +1 -0
- package/web-ui/build/static/pony-B1lWEmkm.js +1 -0
- package/web-ui/build/static/powerquery-iafim1FR.js +1 -0
- package/web-ui/build/static/powershell-Bum4b4hl.js +1 -0
- package/web-ui/build/static/powershell-CuB2b8w1.js +1 -0
- package/web-ui/build/static/processing-BpLaX01w.js +1 -0
- package/web-ui/build/static/processing-dUSz33TD.js +1 -0
- package/web-ui/build/static/profile-C7sg9dHs.js +1 -0
- package/web-ui/build/static/prolog-BBCiPfqc.js +1 -0
- package/web-ui/build/static/prolog-nGaUTvbS.js +1 -0
- package/web-ui/build/static/promql-BBDfFLGg.js +1 -0
- package/web-ui/build/static/properties-BlRMM1Ox.js +1 -0
- package/web-ui/build/static/properties-BxuonvJH.js +1 -0
- package/web-ui/build/static/protobuf-COJo2eGP.js +1 -0
- package/web-ui/build/static/protobuf-Jz8_e3Gc.js +1 -0
- package/web-ui/build/static/psl-aKlFbB2o.js +1 -0
- package/web-ui/build/static/pug-B3kgkOaV.js +1 -0
- package/web-ui/build/static/puppet-Bn-ilWOt.js +1 -0
- package/web-ui/build/static/puppet-CAYrNHnV.js +1 -0
- package/web-ui/build/static/pure-Dae3dENv.js +1 -0
- package/web-ui/build/static/purebasic-BUc1d9bO.js +1 -0
- package/web-ui/build/static/purebasic-Ts3KCWkR.js +1 -0
- package/web-ui/build/static/purescript-DpsJiDL7.js +1 -0
- package/web-ui/build/static/python-C1ydkjn5.js +1 -0
- package/web-ui/build/static/python-CGJhIYP9.js +1 -0
- package/web-ui/build/static/python-repl-B_OutDuW.js +1 -0
- package/web-ui/build/static/q-DhLYm0oH.js +1 -0
- package/web-ui/build/static/q-Dj9Ezde0.js +1 -0
- package/web-ui/build/static/qml-BdSL3VMg.js +1 -0
- package/web-ui/build/static/qml-CjHJFscZ.js +1 -0
- package/web-ui/build/static/qore-CI3GTUtJ.js +1 -0
- package/web-ui/build/static/qsharp-CIibh84F.js +1 -0
- package/web-ui/build/static/r-BwwEbG-u.js +1 -0
- package/web-ui/build/static/r-C3s_ZZZQ.js +1 -0
- package/web-ui/build/static/racket-BcskASd8.js +1 -0
- package/web-ui/build/static/reason-DPziNH3U.js +1 -0
- package/web-ui/build/static/reasonml-D8R2Q19F.js +1 -0
- package/web-ui/build/static/regex-GzOZXBr2.js +1 -0
- package/web-ui/build/static/rego-l3gotT8l.js +1 -0
- package/web-ui/build/static/renpy-A19Zs8lh.js +1 -0
- package/web-ui/build/static/rest-wpzEKBJX.js +1 -0
- package/web-ui/build/static/rib-D_1KUGxh.js +1 -0
- package/web-ui/build/static/rip-8I3EGZnx.js +1 -0
- package/web-ui/build/static/roboconf-BSDIosSS.js +1 -0
- package/web-ui/build/static/roboconf-kHnsbEMa.js +1 -0
- package/web-ui/build/static/robotframework-De413her.js +1 -0
- package/web-ui/build/static/routeros-CF8DUMUu.js +1 -0
- package/web-ui/build/static/rsl-BSdv82fF.js +1 -0
- package/web-ui/build/static/ruby-7_GfbcxC.js +1 -0
- package/web-ui/build/static/ruby-BBYtzWvG.js +1 -0
- package/web-ui/build/static/ruleslanguage-CXhlU3tA.js +1 -0
- package/web-ui/build/static/rust-C2zLvQSk.js +1 -0
- package/web-ui/build/static/rust-CA-fq6LB.js +1 -0
- package/web-ui/build/static/sas-B-Yl0xMb.js +1 -0
- package/web-ui/build/static/sas-fjwRLuAQ.js +1 -0
- package/web-ui/build/static/sass-BUQ0WSOP.js +1 -0
- package/web-ui/build/static/scala-CJGiisP_.js +1 -0
- package/web-ui/build/static/scala-D15Fs72E.js +1 -0
- package/web-ui/build/static/scheme-CUk9mzNj.js +1 -0
- package/web-ui/build/static/scheme-CpvRWrML.js +1 -0
- package/web-ui/build/static/scilab-CdjikQAK.js +1 -0
- package/web-ui/build/static/scss-Bei63J7g.js +1 -0
- package/web-ui/build/static/scss-DbyTXjpl.js +1 -0
- package/web-ui/build/static/shell-CnHgXkIR.js +1 -0
- package/web-ui/build/static/shell-session-6lXCFDCO.js +1 -0
- package/web-ui/build/static/smali-BWdSwwzU.js +1 -0
- package/web-ui/build/static/smali-Bbc5YAcf.js +1 -0
- package/web-ui/build/static/smalltalk-BJDkU3rO.js +1 -0
- package/web-ui/build/static/smalltalk-Dm14AAUR.js +1 -0
- package/web-ui/build/static/smarty-CjCz5oQD.js +1 -0
- package/web-ui/build/static/sml-4QhxjTg1.js +1 -0
- package/web-ui/build/static/sml-BzhtSqHU.js +1 -0
- package/web-ui/build/static/solidity-BkXRM40v.js +1 -0
- package/web-ui/build/static/solution-file-BFJbqEWI.js +1 -0
- package/web-ui/build/static/soy-BWsRHx_l.js +1 -0
- package/web-ui/build/static/sparql-BmnAgU1w.js +1 -0
- package/web-ui/build/static/splunk-spl-BHQ0Zdjq.js +1 -0
- package/web-ui/build/static/sqf-BgRLbdp_.js +1 -0
- package/web-ui/build/static/sqf-DLLI0el0.js +1 -0
- package/web-ui/build/static/sql-2q54nPNH.js +1 -0
- package/web-ui/build/static/sql-DlC3YX66.js +1 -0
- package/web-ui/build/static/sql_more-BQKcXmJ0.js +1 -0
- package/web-ui/build/static/squirrel-DmebN_EL.js +1 -0
- package/web-ui/build/static/stan-BDGrHwEo.js +1 -0
- package/web-ui/build/static/stan-BasdJxfJ.js +1 -0
- package/web-ui/build/static/stata-DAcZR0XQ.js +1 -0
- package/web-ui/build/static/step21-RptXxSDX.js +1 -0
- package/web-ui/build/static/stylus-BtiAI269.js +1 -0
- package/web-ui/build/static/stylus-CbjAOV1A.js +1 -0
- package/web-ui/build/static/subunit-CNB_tt3p.js +1 -0
- package/web-ui/build/static/swift-BV3DOlYX.js +1 -0
- package/web-ui/build/static/swift-Bi-kz7aa.js +1 -0
- package/web-ui/build/static/systemd-CG-NuWtk.js +1 -0
- package/web-ui/build/static/t4-cs-DUThZgjr.js +1 -0
- package/web-ui/build/static/t4-templating-C7ED6iGj.js +1 -0
- package/web-ui/build/static/t4-vb-CT2spCQD.js +1 -0
- package/web-ui/build/static/taggerscript-CIWvWwRH.js +1 -0
- package/web-ui/build/static/tap-B-OZQ_98.js +1 -0
- package/web-ui/build/static/tap-ULV7YBw-.js +1 -0
- package/web-ui/build/static/tcl-DarZx3V_.js +1 -0
- package/web-ui/build/static/tcl-FAfHZOuK.js +1 -0
- package/web-ui/build/static/textile-YIaZ55lg.js +1 -0
- package/web-ui/build/static/thrift-Cw-lC7xb.js +1 -0
- package/web-ui/build/static/toml-CrMkp-dJ.js +1 -0
- package/web-ui/build/static/tp-DCzAu7jW.js +1 -0
- package/web-ui/build/static/tremor-CFDwS8vd.js +1 -0
- package/web-ui/build/static/tsx-DEeAlDW6.js +1 -0
- package/web-ui/build/static/tt2-BzFfu8wk.js +1 -0
- package/web-ui/build/static/turtle-84Pa71hh.js +1 -0
- package/web-ui/build/static/twig-BayQvHS_.js +1 -0
- package/web-ui/build/static/twig-BsjBtlDh.js +1 -0
- package/web-ui/build/static/typescript-Cnjvfmxu.js +1 -0
- package/web-ui/build/static/typescript-DtikLyM7.js +1 -0
- package/web-ui/build/static/typoscript-zFoMPUtV.js +1 -0
- package/web-ui/build/static/unrealscript-BD0AGGE4.js +1 -0
- package/web-ui/build/static/uorazor-DEt_IzcG.js +1 -0
- package/web-ui/build/static/uri-CIvm0_Br.js +1 -0
- package/web-ui/build/static/v-BQoK7-a7.js +1 -0
- package/web-ui/build/static/vala-BDiY-0iU.js +1 -0
- package/web-ui/build/static/vala-CoUXbdfw.js +1 -0
- package/web-ui/build/static/vbnet-BahQpBvh.js +1 -0
- package/web-ui/build/static/vbnet-CTFmJ_tD.js +1 -0
- package/web-ui/build/static/vbscript-RIjZOgm7.js +1 -0
- package/web-ui/build/static/vbscript-html-etVtdRUU.js +1 -0
- package/web-ui/build/static/velocity-k8t18OIQ.js +1 -0
- package/web-ui/build/static/verilog-BkuqYQQS.js +1 -0
- package/web-ui/build/static/verilog-CO7q-Nx8.js +1 -0
- package/web-ui/build/static/vhdl-F9maVm1z.js +1 -0
- package/web-ui/build/static/vhdl-jHowTwXP.js +1 -0
- package/web-ui/build/static/vim-5tQiPYrt.js +1 -0
- package/web-ui/build/static/vim-B6g6AlZK.js +1 -0
- package/web-ui/build/static/visual-basic-BVe6araH.js +1 -0
- package/web-ui/build/static/warpscript-DpWoozOM.js +1 -0
- package/web-ui/build/static/wasm-BVySa5nz.js +1 -0
- package/web-ui/build/static/web-idl-Cx8PIp9r.js +1 -0
- package/web-ui/build/static/wiki-CnAy151p.js +1 -0
- package/web-ui/build/static/wolfram-CJHJcKVC.js +1 -0
- package/web-ui/build/static/wren-C2PAcX7s.js +1 -0
- package/web-ui/build/static/x86asm-C1SuPV6P.js +1 -0
- package/web-ui/build/static/xeora-l6fZzLIy.js +1 -0
- package/web-ui/build/static/xl-CkVwYUVn.js +1 -0
- package/web-ui/build/static/xml-DLjQp4KT.js +1 -0
- package/web-ui/build/static/xml-doc-Dawa4cLr.js +1 -0
- package/web-ui/build/static/xojo-Da05ByLG.js +1 -0
- package/web-ui/build/static/xquery-CS7xhikd.js +1 -0
- package/web-ui/build/static/xquery-DFbsJTQt.js +1 -0
- package/web-ui/build/static/yaml-BGwGJYFK.js +1 -0
- package/web-ui/build/static/yaml-OtITZEUe.js +1 -0
- package/web-ui/build/static/yang-o4P5TRpK.js +1 -0
- package/web-ui/build/static/zephir-B7zGXFYj.js +1 -0
- package/web-ui/build/static/zig-DtRlHrbt.js +1 -0
- package/web-ui/build/static/1c-BU43ZrVw.js +0 -1
- package/web-ui/build/static/abap-AoL-lRFD.js +0 -1
- package/web-ui/build/static/abnf-96OFWMCD.js +0 -1
- package/web-ui/build/static/abnf-C41Cofd6.js +0 -1
- package/web-ui/build/static/accesslog-BcnAo7ES.js +0 -1
- package/web-ui/build/static/actionscript-BFOz5mA2.js +0 -1
- package/web-ui/build/static/actionscript-DJGQt8u5.js +0 -1
- package/web-ui/build/static/ada-CwKeODqT.js +0 -1
- package/web-ui/build/static/ada-DchU8VGZ.js +0 -1
- package/web-ui/build/static/agda-BiNn9WvW.js +0 -1
- package/web-ui/build/static/al-BV88nGgg.js +0 -1
- package/web-ui/build/static/angelscript-COMetbQf.js +0 -1
- package/web-ui/build/static/antlr4-DcxHPzCP.js +0 -1
- package/web-ui/build/static/apache-DBeh3rw8.js +0 -1
- package/web-ui/build/static/apacheconf-CMIBfQ9p.js +0 -1
- package/web-ui/build/static/apex-Cs5QQM6z.js +0 -1
- package/web-ui/build/static/apl-Dx-K9gOV.js +0 -1
- package/web-ui/build/static/applescript--9cY-_M0.js +0 -1
- package/web-ui/build/static/applescript-BcsYpX4C.js +0 -1
- package/web-ui/build/static/aql-B6_wZJ19.js +0 -1
- package/web-ui/build/static/arcade-ML5yo01k.js +0 -1
- package/web-ui/build/static/arduino-CXGPdWdX.js +0 -1
- package/web-ui/build/static/arduino-Dg8nk7Ia.js +0 -1
- package/web-ui/build/static/arff-gVSLqgST.js +0 -1
- package/web-ui/build/static/armasm-DAsE4rEm.js +0 -1
- package/web-ui/build/static/asciidoc-C5znngFU.js +0 -1
- package/web-ui/build/static/asciidoc-DYALRNYZ.js +0 -1
- package/web-ui/build/static/asm6502-DDgAH1tv.js +0 -1
- package/web-ui/build/static/asmatmel-DOphTD2l.js +0 -1
- package/web-ui/build/static/aspectj-CulZkr51.js +0 -1
- package/web-ui/build/static/aspnet-CNX6-Mkw.js +0 -1
- package/web-ui/build/static/autohotkey-D0vVKqB7.js +0 -1
- package/web-ui/build/static/autohotkey-DDYXV6Yq.js +0 -1
- package/web-ui/build/static/autoit-CxUJueRz.js +0 -1
- package/web-ui/build/static/autoit-D9JFllVP.js +0 -1
- package/web-ui/build/static/avisynth-BenZbKzO.js +0 -1
- package/web-ui/build/static/avrasm-uYahqQ8h.js +0 -1
- package/web-ui/build/static/avro-idl-CfbM7gLn.js +0 -1
- package/web-ui/build/static/awk-Ca723U04.js +0 -1
- package/web-ui/build/static/axapta-Bd89lJnD.js +0 -1
- package/web-ui/build/static/bash-9j3v2pHC.js +0 -1
- package/web-ui/build/static/bash-D3FWVCYG.js +0 -1
- package/web-ui/build/static/basic-DdNa7MnE.js +0 -1
- package/web-ui/build/static/basic-E4QxjXCY.js +0 -1
- package/web-ui/build/static/batch-CfCADUvD.js +0 -1
- package/web-ui/build/static/bbcode-WshNX5WN.js +0 -1
- package/web-ui/build/static/bicep-D8FjRewr.js +0 -1
- package/web-ui/build/static/birb-88EdZvI2.js +0 -1
- package/web-ui/build/static/bison-D_FuD8Pc.js +0 -1
- package/web-ui/build/static/bnf-CbP5W98L.js +0 -1
- package/web-ui/build/static/bnf-Cml6OuCd.js +0 -1
- package/web-ui/build/static/brainfuck-BAX8RtaB.js +0 -1
- package/web-ui/build/static/brainfuck-C6aQP1EH.js +0 -1
- package/web-ui/build/static/brightscript-CQvzUDkK.js +0 -1
- package/web-ui/build/static/bro-D1TUGEOB.js +0 -1
- package/web-ui/build/static/bsl-Cz666_jX.js +0 -1
- package/web-ui/build/static/c-Br3hSof9.js +0 -1
- package/web-ui/build/static/c-CnhEGx2K.js +0 -1
- package/web-ui/build/static/c-like-8ph3qbGh.js +0 -1
- package/web-ui/build/static/cal-IgRtvJyR.js +0 -1
- package/web-ui/build/static/capnproto-Brw1rI-t.js +0 -1
- package/web-ui/build/static/ceylon-DZhLRlUy.js +0 -1
- package/web-ui/build/static/cfscript-DQGyJKwK.js +0 -1
- package/web-ui/build/static/chaiscript-C4OGz_un.js +0 -1
- package/web-ui/build/static/cil-DicjcGqk.js +0 -1
- package/web-ui/build/static/clean-DALZvuMV.js +0 -1
- package/web-ui/build/static/clojure-DPpZu94_.js +0 -1
- package/web-ui/build/static/clojure-Wr_wuwna.js +0 -1
- package/web-ui/build/static/clojure-repl-BDrvmjMJ.js +0 -1
- package/web-ui/build/static/cmake-B14DY3nI.js +0 -1
- package/web-ui/build/static/cmake-SYFQC59q.js +0 -1
- package/web-ui/build/static/cobol-abUH09OX.js +0 -1
- package/web-ui/build/static/coffeescript-Bky52ZtC.js +0 -1
- package/web-ui/build/static/coffeescript-zCTO0lvd.js +0 -1
- package/web-ui/build/static/concurnas-CU2vlX2t.js +0 -1
- package/web-ui/build/static/coq-CtQeoOxK.js +0 -1
- package/web-ui/build/static/coq-U_ekdUOC.js +0 -1
- package/web-ui/build/static/cos-I1RAZGcd.js +0 -1
- package/web-ui/build/static/cpp-CBgfByvO.js +0 -1
- package/web-ui/build/static/cpp-DOgzX9Fr.js +0 -1
- package/web-ui/build/static/crmsh-C564oTI3.js +0 -1
- package/web-ui/build/static/crystal-BAkf0Lyu.js +0 -1
- package/web-ui/build/static/crystal-S6p_ZP8F.js +0 -1
- package/web-ui/build/static/csharp-4Eckg4RD.js +0 -1
- package/web-ui/build/static/csharp-BbncLZi-.js +0 -1
- package/web-ui/build/static/cshtml-3CAfDEZr.js +0 -1
- package/web-ui/build/static/csp-B1uCSPSv.js +0 -1
- package/web-ui/build/static/csp-DMRqPioi.js +0 -1
- package/web-ui/build/static/css-BGUkWLMn.js +0 -1
- package/web-ui/build/static/css-extras-BvWk25Qq.js +0 -1
- package/web-ui/build/static/csv-B4b2Q5_f.js +0 -1
- package/web-ui/build/static/cypher-poGwJkDD.js +0 -1
- package/web-ui/build/static/d-DMSHgHAy.js +0 -1
- package/web-ui/build/static/d-cV9sHfbC.js +0 -1
- package/web-ui/build/static/dart-CAw4osRs.js +0 -1
- package/web-ui/build/static/dart-DNd3kAhv.js +0 -1
- package/web-ui/build/static/dataweave-DrBaourx.js +0 -1
- package/web-ui/build/static/dax-BrZwLORG.js +0 -1
- package/web-ui/build/static/delphi-Ct4aE4aH.js +0 -1
- package/web-ui/build/static/dhall-BYoLaIQB.js +0 -1
- package/web-ui/build/static/diff-CnmWuCgJ.js +0 -1
- package/web-ui/build/static/diff-zrcvdd0a.js +0 -1
- package/web-ui/build/static/django-C-oZ7YKd.js +0 -1
- package/web-ui/build/static/django-JpRfMOZ2.js +0 -1
- package/web-ui/build/static/dns-DsSuoCT5.js +0 -1
- package/web-ui/build/static/dns-zone-file-DGrpD-sD.js +0 -1
- package/web-ui/build/static/docker-BIfKAgOO.js +0 -1
- package/web-ui/build/static/dockerfile-pDKCRsua.js +0 -1
- package/web-ui/build/static/dos-tuNLH04p.js +0 -1
- package/web-ui/build/static/dot-ByjtD8Iw.js +0 -1
- package/web-ui/build/static/dsconfig-BCjL4yBF.js +0 -1
- package/web-ui/build/static/dts-DOYzn60p.js +0 -1
- package/web-ui/build/static/dust-CPf1De2a.js +0 -1
- package/web-ui/build/static/ebnf-BqPpYQsv.js +0 -1
- package/web-ui/build/static/ebnf-DtowFnom.js +0 -1
- package/web-ui/build/static/editorconfig-ByGC7lfc.js +0 -1
- package/web-ui/build/static/eiffel-ql_YAW83.js +0 -1
- package/web-ui/build/static/ejs-CEIk0b1t.js +0 -1
- package/web-ui/build/static/elixir-5cZo1rKW.js +0 -1
- package/web-ui/build/static/elixir-kLu8Siuw.js +0 -1
- package/web-ui/build/static/elm-CFEXRK2g.js +0 -1
- package/web-ui/build/static/elm-O7LEJa6N.js +0 -1
- package/web-ui/build/static/erb-CMspOWfC.js +0 -1
- package/web-ui/build/static/erb-DmVFtWWQ.js +0 -1
- package/web-ui/build/static/erlang-CNS4Vy5W.js +0 -1
- package/web-ui/build/static/erlang-DS3YMI6f.js +0 -1
- package/web-ui/build/static/erlang-repl-COpdqM-k.js +0 -1
- package/web-ui/build/static/etlua-BaywXnJ4.js +0 -1
- package/web-ui/build/static/excel-DbD_vagJ.js +0 -1
- package/web-ui/build/static/excel-formula-DvX9phaD.js +0 -1
- package/web-ui/build/static/factor-Dmyoo9jr.js +0 -1
- package/web-ui/build/static/false-CFFZ5oF1.js +0 -1
- package/web-ui/build/static/firestore-security-rules-6gF61FL7.js +0 -1
- package/web-ui/build/static/fix-DqD23dpu.js +0 -1
- package/web-ui/build/static/flix-ByG_SwOl.js +0 -1
- package/web-ui/build/static/flow-_rIgWtyE.js +0 -1
- package/web-ui/build/static/fortran-BxMeEQFu.js +0 -1
- package/web-ui/build/static/fortran-JYN66CoM.js +0 -1
- package/web-ui/build/static/fsharp-DUIudRus.js +0 -1
- package/web-ui/build/static/fsharp-dwrir66Q.js +0 -1
- package/web-ui/build/static/ftl-DE2kycMu.js +0 -1
- package/web-ui/build/static/gams-BdaFBkUq.js +0 -1
- package/web-ui/build/static/gap-DG6uTKtq.js +0 -1
- package/web-ui/build/static/gauss-CdZRpgQN.js +0 -1
- package/web-ui/build/static/gcode-BCwsx3FN.js +0 -1
- package/web-ui/build/static/gcode-DqOLuGTU.js +0 -1
- package/web-ui/build/static/gdscript-CQsGMP79.js +0 -1
- package/web-ui/build/static/gedcom-DjiaJO4h.js +0 -1
- package/web-ui/build/static/gherkin-DKQrzpoe.js +0 -1
- package/web-ui/build/static/gherkin-MN1tGQ_p.js +0 -1
- package/web-ui/build/static/git-BV33OtmB.js +0 -1
- package/web-ui/build/static/glsl-BrKcS_A_.js +0 -1
- package/web-ui/build/static/glsl-zNpiyDT0.js +0 -1
- package/web-ui/build/static/gml-B42QqZwd.js +0 -1
- package/web-ui/build/static/gml-wLSDMYgV.js +0 -1
- package/web-ui/build/static/gn-Bh6e2j59.js +0 -1
- package/web-ui/build/static/go-BcV51Gep.js +0 -1
- package/web-ui/build/static/go-DoEsEvyO.js +0 -1
- package/web-ui/build/static/go-module-CPiCVk-t.js +0 -1
- package/web-ui/build/static/golo-Dm6Qh0rv.js +0 -1
- package/web-ui/build/static/gradle-Bq5SCTs-.js +0 -1
- package/web-ui/build/static/graphql-BMKmdCzB.js +0 -1
- package/web-ui/build/static/groovy-BUPY3Q3Q.js +0 -1
- package/web-ui/build/static/groovy-DJ1fIXgB.js +0 -1
- package/web-ui/build/static/haml-CzbX1nD7.js +0 -1
- package/web-ui/build/static/haml-vci5GS4H.js +0 -1
- package/web-ui/build/static/handlebars-DDKzQGIO.js +0 -1
- package/web-ui/build/static/handlebars-DUBBysQz.js +0 -1
- package/web-ui/build/static/haskell-Becgtpfw.js +0 -1
- package/web-ui/build/static/haskell-DzmxROXt.js +0 -1
- package/web-ui/build/static/haxe-Dn6vv5Ho.js +0 -1
- package/web-ui/build/static/haxe-N5We1g-1.js +0 -1
- package/web-ui/build/static/hcl-aU8RXzqH.js +0 -1
- package/web-ui/build/static/hlsl-DnxH7wd4.js +0 -1
- package/web-ui/build/static/hoon-DxQk5J8Y.js +0 -1
- package/web-ui/build/static/hpkp-CXTY4okp.js +0 -1
- package/web-ui/build/static/hsp-ChPgc1iH.js +0 -1
- package/web-ui/build/static/hsts-DhqErzSD.js +0 -1
- package/web-ui/build/static/htmlbars-C1RX3QEK.js +0 -1
- package/web-ui/build/static/http-CdQuhyze.js +0 -1
- package/web-ui/build/static/http-DIfbUO-8.js +0 -1
- package/web-ui/build/static/hy-CtuvNSVL.js +0 -1
- package/web-ui/build/static/ichigojam-Dhb1oxgM.js +0 -1
- package/web-ui/build/static/icon-18yeuSqY.js +0 -1
- package/web-ui/build/static/icu-message-format-BtING76I.js +0 -1
- package/web-ui/build/static/idris-BpXksRPQ.js +0 -1
- package/web-ui/build/static/iecst-DxsuKh-u.js +0 -1
- package/web-ui/build/static/ignore-LFUqEXDc.js +0 -1
- package/web-ui/build/static/index-CNhxse_k.js +0 -831
- package/web-ui/build/static/index-DTSROa9m.js +0 -13
- package/web-ui/build/static/index-Dn1rYKSW.js +0 -1
- package/web-ui/build/static/inform7-CMWs3Icc.js +0 -1
- package/web-ui/build/static/inform7-IKJ-i25v.js +0 -1
- package/web-ui/build/static/ini-BKx9RlYa.js +0 -1
- package/web-ui/build/static/ini-OuIKSh9I.js +0 -1
- package/web-ui/build/static/io-DsdrD9ck.js +0 -1
- package/web-ui/build/static/irpf90-D8RwjO-X.js +0 -1
- package/web-ui/build/static/isbl-B19anZ4P.js +0 -1
- package/web-ui/build/static/j-cS0ZhHxg.js +0 -1
- package/web-ui/build/static/java-BArfyDLP.js +0 -1
- package/web-ui/build/static/java-CVssvoho.js +0 -1
- package/web-ui/build/static/javadoc-BbYTABTG.js +0 -1
- package/web-ui/build/static/javadoclike-reViVmsX.js +0 -1
- package/web-ui/build/static/javascript-C8BGzZvz.js +0 -1
- package/web-ui/build/static/javastacktrace-DgQT1sKr.js +0 -1
- package/web-ui/build/static/jboss-cli-CXzftW3Q.js +0 -1
- package/web-ui/build/static/jexl-DfYeVq7m.js +0 -1
- package/web-ui/build/static/jolie-BR1u31Sa.js +0 -1
- package/web-ui/build/static/jq-C1FEtJ5S.js +0 -1
- package/web-ui/build/static/js-extras-BRujBZgr.js +0 -1
- package/web-ui/build/static/js-templates-CgsCAf95.js +0 -1
- package/web-ui/build/static/jsdoc-BAN_COOq.js +0 -1
- package/web-ui/build/static/json-CO83p783.js +0 -1
- package/web-ui/build/static/json-D_vV4rAm.js +0 -1
- package/web-ui/build/static/json5-DBDJJEbn.js +0 -1
- package/web-ui/build/static/jsonp-b6P9-KKS.js +0 -1
- package/web-ui/build/static/jsstacktrace-BgPNj9Kj.js +0 -1
- package/web-ui/build/static/jsx-Co4GcrAm.js +0 -1
- package/web-ui/build/static/julia-B9omll60.js +0 -1
- package/web-ui/build/static/julia-BHDCyM-i.js +0 -1
- package/web-ui/build/static/julia-repl-C7Eb4bgJ.js +0 -1
- package/web-ui/build/static/keepalived-Dzp76shL.js +0 -1
- package/web-ui/build/static/keyman-DNvXbNCF.js +0 -1
- package/web-ui/build/static/kotlin-eb0_7isz.js +0 -1
- package/web-ui/build/static/kotlin-i_bUq7c5.js +0 -1
- package/web-ui/build/static/kumir-bzILNJNt.js +0 -1
- package/web-ui/build/static/kusto-DkykNNg-.js +0 -1
- package/web-ui/build/static/lasso-Cqgl3L5V.js +0 -1
- package/web-ui/build/static/latex-BK2d4H00.js +0 -1
- package/web-ui/build/static/latex-CCY9RWja.js +0 -1
- package/web-ui/build/static/latte--1mLyI-m.js +0 -1
- package/web-ui/build/static/ldif-CKpl0obl.js +0 -1
- package/web-ui/build/static/leaf-Cylh6k2i.js +0 -1
- package/web-ui/build/static/less-BF2V9-r1.js +0 -1
- package/web-ui/build/static/less-DZnIlP4J.js +0 -1
- package/web-ui/build/static/lilypond-Q-51NK9a.js +0 -1
- package/web-ui/build/static/liquid-BtFjuu34.js +0 -1
- package/web-ui/build/static/lisp-BTSZLEXC.js +0 -1
- package/web-ui/build/static/lisp-mBPUREKp.js +0 -1
- package/web-ui/build/static/livecodeserver-X2MkrtIh.js +0 -1
- package/web-ui/build/static/livescript-BCGPODju.js +0 -1
- package/web-ui/build/static/livescript-CSRilU12.js +0 -1
- package/web-ui/build/static/llvm-BrA-OPc0.js +0 -1
- package/web-ui/build/static/llvm-CX47EYi9.js +0 -1
- package/web-ui/build/static/log-UmKn5LCr.js +0 -1
- package/web-ui/build/static/lolcode-CzokJ_7T.js +0 -1
- package/web-ui/build/static/lsl-zawAQf0T.js +0 -1
- package/web-ui/build/static/lua-AzLMAnp_.js +0 -1
- package/web-ui/build/static/lua-BCYatl_B.js +0 -1
- package/web-ui/build/static/magma-Vk_HAjNd.js +0 -1
- package/web-ui/build/static/makefile-CBhQfnCA.js +0 -1
- package/web-ui/build/static/makefile-CqmpfcQv.js +0 -1
- package/web-ui/build/static/markdown-DEeiASnV.js +0 -1
- package/web-ui/build/static/markdown-MMAcC-4P.js +0 -1
- package/web-ui/build/static/markup-templating-BIcrJ22L.js +0 -1
- package/web-ui/build/static/mathematica-B0zDtahh.js +0 -1
- package/web-ui/build/static/matlab-BfcWtjh0.js +0 -1
- package/web-ui/build/static/matlab-CzvSbe8w.js +0 -1
- package/web-ui/build/static/maxima-D_OOwDHQ.js +0 -1
- package/web-ui/build/static/maxscript-B0UQqykR.js +0 -1
- package/web-ui/build/static/mel-5BfrTNON.js +0 -1
- package/web-ui/build/static/mel-DVL_6rnq.js +0 -1
- package/web-ui/build/static/mercury-CaNr8hHX.js +0 -1
- package/web-ui/build/static/mermaid-CqSXXPCa.js +0 -1
- package/web-ui/build/static/mipsasm-KebNef0S.js +0 -1
- package/web-ui/build/static/mizar-87NmyJPg.js +0 -1
- package/web-ui/build/static/mizar-Bh-iPnnJ.js +0 -1
- package/web-ui/build/static/mojolicious-RdAGGOBG.js +0 -1
- package/web-ui/build/static/mongodb-D-3TyeHe.js +0 -1
- package/web-ui/build/static/monkey-CBl0NH_G.js +0 -1
- package/web-ui/build/static/monkey-_lVf4ZFO.js +0 -1
- package/web-ui/build/static/moonscript-BWoLiJse.js +0 -1
- package/web-ui/build/static/moonscript-DvK6XosR.js +0 -1
- package/web-ui/build/static/n1ql-BHaHIJwU.js +0 -1
- package/web-ui/build/static/n1ql-DHG6la1y.js +0 -1
- package/web-ui/build/static/n4js-BnEnODnl.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-Bx_Sdku7.js +0 -1
- package/web-ui/build/static/naniscript-C9LlE8Sm.js +0 -1
- package/web-ui/build/static/nasm-C2RqJeMj.js +0 -1
- package/web-ui/build/static/neon-Htd-1WHg.js +0 -1
- package/web-ui/build/static/nevod-xEEcHJ6H.js +0 -1
- package/web-ui/build/static/nginx-DHZ2TmrY.js +0 -1
- package/web-ui/build/static/nginx-fVaFLr6L.js +0 -1
- package/web-ui/build/static/nim-C0kLUnOo.js +0 -1
- package/web-ui/build/static/nim-D2t9WTJG.js +0 -1
- package/web-ui/build/static/nix-BgS9-fG3.js +0 -1
- package/web-ui/build/static/nix-CJ-ZtUjs.js +0 -1
- package/web-ui/build/static/node-repl-BqDf1Wqa.js +0 -1
- package/web-ui/build/static/nsis-BcbMIXXt.js +0 -1
- package/web-ui/build/static/nsis-Clmq9ubM.js +0 -1
- package/web-ui/build/static/objectivec-CQCJHkDn.js +0 -1
- package/web-ui/build/static/objectivec-l-L7sw2F.js +0 -1
- package/web-ui/build/static/ocaml-CLhfFI9J.js +0 -1
- package/web-ui/build/static/ocaml-CVZbp5Q6.js +0 -1
- package/web-ui/build/static/opencl-FaoxED_5.js +0 -1
- package/web-ui/build/static/openqasm-DowdIaHJ.js +0 -1
- package/web-ui/build/static/openscad-CuV43J87.js +0 -1
- package/web-ui/build/static/oxygene-DFl_S4Mo.js +0 -1
- package/web-ui/build/static/oz-CrZEGs03.js +0 -1
- package/web-ui/build/static/parigp-CgI9msS-.js +0 -1
- package/web-ui/build/static/parser-nTYAMRRR.js +0 -1
- package/web-ui/build/static/parser3-B-s7V2NG.js +0 -1
- package/web-ui/build/static/pascal-DxyFzkBI.js +0 -1
- package/web-ui/build/static/pascaligo-pTESG7CK.js +0 -1
- package/web-ui/build/static/pcaxis-B2X2sY8s.js +0 -1
- package/web-ui/build/static/peoplecode-D3dixWRI.js +0 -1
- package/web-ui/build/static/perl-DzF9wk2I.js +0 -1
- package/web-ui/build/static/perl-r6iIkk3J.js +0 -1
- package/web-ui/build/static/pf-BHt68zPf.js +0 -1
- package/web-ui/build/static/pgsql-DrWBN0mn.js +0 -1
- package/web-ui/build/static/php-B9P0S_Yv.js +0 -1
- package/web-ui/build/static/php-Dq2u1evi.js +0 -1
- package/web-ui/build/static/php-extras-GhxZmNQn.js +0 -1
- package/web-ui/build/static/php-template-wduD2F6a.js +0 -1
- package/web-ui/build/static/phpdoc-S6AgvZj9.js +0 -1
- package/web-ui/build/static/plaintext-CkefHWd1.js +0 -1
- package/web-ui/build/static/plsql-ChhnkKyq.js +0 -1
- package/web-ui/build/static/pony-Ci4oRl2L.js +0 -1
- package/web-ui/build/static/powerquery-htr17QYt.js +0 -1
- package/web-ui/build/static/powershell-BjdbtsWh.js +0 -1
- package/web-ui/build/static/powershell-CfTH6v8E.js +0 -1
- package/web-ui/build/static/processing-CyhVXfth.js +0 -1
- package/web-ui/build/static/processing-DRd0DN-1.js +0 -1
- package/web-ui/build/static/profile-CzLbiRVw.js +0 -1
- package/web-ui/build/static/prolog-C9Bd3AiH.js +0 -1
- package/web-ui/build/static/prolog-SNjuNM01.js +0 -1
- package/web-ui/build/static/promql-w_4MRJZ5.js +0 -1
- package/web-ui/build/static/properties-Bu21gd8n.js +0 -1
- package/web-ui/build/static/properties-CxUTIgqR.js +0 -1
- package/web-ui/build/static/protobuf-Dw_RQ_nq.js +0 -1
- package/web-ui/build/static/protobuf-I-uLxCyW.js +0 -1
- package/web-ui/build/static/psl-60y7CGad.js +0 -1
- package/web-ui/build/static/pug-6TwxG97U.js +0 -1
- package/web-ui/build/static/puppet-DsB7SV7C.js +0 -1
- package/web-ui/build/static/puppet-xYMQTgSK.js +0 -1
- package/web-ui/build/static/pure-B-46644a.js +0 -1
- package/web-ui/build/static/purebasic-C2jTmxCp.js +0 -1
- package/web-ui/build/static/purebasic-DB1qz_79.js +0 -1
- package/web-ui/build/static/purescript-C7X1Jhpv.js +0 -1
- package/web-ui/build/static/python-DdZkdREO.js +0 -1
- package/web-ui/build/static/python-g-3ev0jp.js +0 -1
- package/web-ui/build/static/python-repl-Ba3YgabT.js +0 -1
- package/web-ui/build/static/q-4Xd1x0tI.js +0 -1
- package/web-ui/build/static/q-CFLewr3P.js +0 -1
- package/web-ui/build/static/qml-D1wL69-t.js +0 -1
- package/web-ui/build/static/qml-o0TpTomi.js +0 -1
- package/web-ui/build/static/qore-Bu32uyvk.js +0 -1
- package/web-ui/build/static/qsharp-BlenDeSE.js +0 -1
- package/web-ui/build/static/r-x-9dl4d1.js +0 -1
- package/web-ui/build/static/r-xEFM_Z9P.js +0 -1
- package/web-ui/build/static/racket-B6M0zyVn.js +0 -1
- package/web-ui/build/static/reason-B_YmUFeb.js +0 -1
- package/web-ui/build/static/reasonml-DqV3O6jw.js +0 -1
- package/web-ui/build/static/regex-RpvIR1UC.js +0 -1
- package/web-ui/build/static/rego-DLBfnzDz.js +0 -1
- package/web-ui/build/static/renpy-BPyvMyYV.js +0 -1
- package/web-ui/build/static/rest-BOvObf4b.js +0 -1
- package/web-ui/build/static/rib-CfbyRlOV.js +0 -1
- package/web-ui/build/static/rip-BmGgp-ky.js +0 -1
- package/web-ui/build/static/roboconf-BjlIhdyT.js +0 -1
- package/web-ui/build/static/roboconf-gCvzQFG_.js +0 -1
- package/web-ui/build/static/robotframework-DMIYiZ9n.js +0 -1
- package/web-ui/build/static/routeros-dIA3JsYo.js +0 -1
- package/web-ui/build/static/rsl-C-IHLDiI.js +0 -1
- package/web-ui/build/static/ruby-2UsEEPvi.js +0 -1
- package/web-ui/build/static/ruby-DQuqRBbF.js +0 -1
- package/web-ui/build/static/ruleslanguage-DIX-ZNdD.js +0 -1
- package/web-ui/build/static/rust-C3AZB4MD.js +0 -1
- package/web-ui/build/static/rust-s-uSy2xK.js +0 -1
- package/web-ui/build/static/sas-2ySpLG9-.js +0 -1
- package/web-ui/build/static/sas-BZjFIK6U.js +0 -1
- package/web-ui/build/static/sass-DmfN0RXk.js +0 -1
- package/web-ui/build/static/scala-BWG4D45T.js +0 -1
- package/web-ui/build/static/scala-DORCOJGF.js +0 -1
- package/web-ui/build/static/scheme-Dhf3OcIw.js +0 -1
- package/web-ui/build/static/scheme-RkPOVGvt.js +0 -1
- package/web-ui/build/static/scilab-BPjU1E5p.js +0 -1
- package/web-ui/build/static/scss-Cl5xn34j.js +0 -1
- package/web-ui/build/static/scss-K2UK4NzM.js +0 -1
- package/web-ui/build/static/shell-CnNrPIpO.js +0 -1
- package/web-ui/build/static/shell-session-CWzCvkCd.js +0 -1
- package/web-ui/build/static/smali-BqUloCDk.js +0 -1
- package/web-ui/build/static/smali-D9l7tmuy.js +0 -1
- package/web-ui/build/static/smalltalk-Ch8WtZ3x.js +0 -1
- package/web-ui/build/static/smalltalk-D33bV6Ux.js +0 -1
- package/web-ui/build/static/smarty-DhuA-30v.js +0 -1
- package/web-ui/build/static/sml-CcRV_05i.js +0 -1
- package/web-ui/build/static/sml-Dxy9VWS5.js +0 -1
- package/web-ui/build/static/solidity-B6Q9ss0Q.js +0 -1
- package/web-ui/build/static/solution-file-CdD4U58t.js +0 -1
- package/web-ui/build/static/soy-DwAwdpNx.js +0 -1
- package/web-ui/build/static/sparql-BD7Xi4u4.js +0 -1
- package/web-ui/build/static/splunk-spl-DNR8Nqkh.js +0 -1
- package/web-ui/build/static/sqf-D_eO1j0l.js +0 -1
- package/web-ui/build/static/sqf-RmFM3NP_.js +0 -1
- package/web-ui/build/static/sql-BqcZzHxC.js +0 -1
- package/web-ui/build/static/sql-C1Og8w4D.js +0 -1
- package/web-ui/build/static/sql_more-B8l439k3.js +0 -1
- package/web-ui/build/static/squirrel-k8wRFBEU.js +0 -1
- package/web-ui/build/static/stan-Cyd1Qc2Z.js +0 -1
- package/web-ui/build/static/stan-vaOTiGIw.js +0 -1
- package/web-ui/build/static/stata-BvtPM-UC.js +0 -1
- package/web-ui/build/static/step21-CcJzkfyX.js +0 -1
- package/web-ui/build/static/stylus-BUdFaHOi.js +0 -1
- package/web-ui/build/static/stylus-DZUxYm7B.js +0 -1
- package/web-ui/build/static/subunit-BLFu1vy1.js +0 -1
- package/web-ui/build/static/swift-4C37Wfzo.js +0 -1
- package/web-ui/build/static/swift-tpG5dEoC.js +0 -1
- package/web-ui/build/static/systemd-CZAHgFou.js +0 -1
- package/web-ui/build/static/t4-cs-BzDTdhsq.js +0 -1
- package/web-ui/build/static/t4-templating-BnNIhX-m.js +0 -1
- package/web-ui/build/static/t4-vb-WH6kXP4O.js +0 -1
- package/web-ui/build/static/taggerscript-DPuoT3fc.js +0 -1
- package/web-ui/build/static/tap-CRdOSYnA.js +0 -1
- package/web-ui/build/static/tap-Cfv7r5Y1.js +0 -1
- package/web-ui/build/static/tcl-C57QpMKe.js +0 -1
- package/web-ui/build/static/tcl-D_HhrQb7.js +0 -1
- package/web-ui/build/static/textile-HiZT-42r.js +0 -1
- package/web-ui/build/static/thrift-BIevTRAV.js +0 -1
- package/web-ui/build/static/toml-Dzu0VuJT.js +0 -1
- package/web-ui/build/static/tp-BcFKGcDv.js +0 -1
- package/web-ui/build/static/tremor-ChPj0YkW.js +0 -1
- package/web-ui/build/static/tsx-DEgPhspu.js +0 -1
- package/web-ui/build/static/tt2-zECU_j-n.js +0 -1
- package/web-ui/build/static/turtle-DSxo1JVc.js +0 -1
- package/web-ui/build/static/twig-BzzbcVU0.js +0 -1
- package/web-ui/build/static/twig-DD8ck-xB.js +0 -1
- package/web-ui/build/static/typescript-mfGLA69h.js +0 -1
- package/web-ui/build/static/typescript-obXwfhtv.js +0 -1
- package/web-ui/build/static/typoscript-DGRFkQ44.js +0 -1
- package/web-ui/build/static/unrealscript-C71Cshhh.js +0 -1
- package/web-ui/build/static/uorazor--YPn6YI1.js +0 -1
- package/web-ui/build/static/uri-DiBB6LAn.js +0 -1
- package/web-ui/build/static/v-DD6j4G3R.js +0 -1
- package/web-ui/build/static/vala-90B6tBz6.js +0 -1
- package/web-ui/build/static/vala-CPgj-_9p.js +0 -1
- package/web-ui/build/static/vbnet-Ct4CtLUY.js +0 -1
- package/web-ui/build/static/vbnet-Dt71G1FN.js +0 -1
- package/web-ui/build/static/vbscript-2A1bKLI8.js +0 -1
- package/web-ui/build/static/vbscript-html-BNSfZskj.js +0 -1
- package/web-ui/build/static/velocity-Cw07cCrw.js +0 -1
- package/web-ui/build/static/verilog-Appxv8wV.js +0 -1
- package/web-ui/build/static/verilog-gFSdUnSn.js +0 -1
- package/web-ui/build/static/vhdl-326_OrM2.js +0 -1
- package/web-ui/build/static/vhdl-BGaNDNIa.js +0 -1
- package/web-ui/build/static/vim-D1mEwoEz.js +0 -1
- package/web-ui/build/static/vim-lvX3nIwq.js +0 -1
- package/web-ui/build/static/visual-basic-C5WWtiVx.js +0 -1
- package/web-ui/build/static/warpscript-CF7kIXUC.js +0 -1
- package/web-ui/build/static/wasm-BHfGEvXM.js +0 -1
- package/web-ui/build/static/web-idl-U4Bu4xZZ.js +0 -1
- package/web-ui/build/static/wiki-Cypfsr_n.js +0 -1
- package/web-ui/build/static/wolfram-B4afYjEC.js +0 -1
- package/web-ui/build/static/wren-CIleRBn0.js +0 -1
- package/web-ui/build/static/x86asm-C-79USsG.js +0 -1
- package/web-ui/build/static/xeora-CSaM51pY.js +0 -1
- package/web-ui/build/static/xl-CuiQZS3B.js +0 -1
- package/web-ui/build/static/xml-C6jbRHrj.js +0 -1
- package/web-ui/build/static/xml-doc-CV7qp07_.js +0 -1
- package/web-ui/build/static/xojo-D4t2uWPH.js +0 -1
- package/web-ui/build/static/xquery-DT_Ao6QG.js +0 -1
- package/web-ui/build/static/xquery-DnKodhmy.js +0 -1
- package/web-ui/build/static/yaml-CLiRAuyI.js +0 -1
- package/web-ui/build/static/yaml-aulSfOTJ.js +0 -1
- package/web-ui/build/static/yang-C1R60r9w.js +0 -1
- package/web-ui/build/static/zephir-D_18ShED.js +0 -1
- package/web-ui/build/static/zig-C-01pua6.js +0 -1
package/package.json
CHANGED
|
@@ -1,152 +1,110 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tests for resolvePreferredModel —
|
|
3
|
-
*
|
|
2
|
+
* Tests for resolvePreferredModel — catalog-driven model resolver.
|
|
3
|
+
* Uses recommended_for and tags from the model catalog instead of name matching.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, test, expect, beforeAll } from '@jest/globals';
|
|
7
7
|
|
|
8
|
-
let resolvePreferredModel, AGENT_TEMPLATES,
|
|
8
|
+
let resolvePreferredModel, AGENT_TEMPLATES, TEMPLATE_PURPOSE_MAP;
|
|
9
9
|
|
|
10
10
|
beforeAll(async () => {
|
|
11
|
-
({ resolvePreferredModel, AGENT_TEMPLATES,
|
|
11
|
+
({ resolvePreferredModel, AGENT_TEMPLATES, TEMPLATE_PURPOSE_MAP } =
|
|
12
12
|
await import('../../web-ui/src/constants/index.js'));
|
|
13
13
|
});
|
|
14
14
|
|
|
15
|
-
//
|
|
15
|
+
// Models with catalog computed fields
|
|
16
16
|
const MOCK_MODELS = [
|
|
17
|
-
{ id: '
|
|
18
|
-
{ id: 'gpt-5.
|
|
19
|
-
{ id: 'gpt-5.4
|
|
20
|
-
{ id: 'gpt-5
|
|
21
|
-
{ id: '
|
|
22
|
-
{ id: '
|
|
23
|
-
{ id: '
|
|
24
|
-
{ id: 'gpt-4.1-mini', modelName: 'gpt-4.1-mini' },
|
|
25
|
-
{ id: 'o4-mini', modelName: 'o4-mini' },
|
|
26
|
-
{ id: 'o3', modelName: 'o3' },
|
|
27
|
-
{ id: 'grok-4', modelName: 'grok-4' },
|
|
28
|
-
{ id: 'grok-4-fast-reasoning', modelName: 'grok-4-fast-reasoning' },
|
|
29
|
-
{ id: 'DeepSeek-V3.2', modelName: 'DeepSeek-V3.2' },
|
|
30
|
-
{ id: 'DeepSeek-R1-0528', modelName: 'DeepSeek-R1-0528' },
|
|
31
|
-
{ id: 'Kimi-K2.5', modelName: 'Kimi-K2.5' },
|
|
32
|
-
{ id: 'Phi-4-reasoning', modelName: 'Phi-4-reasoning' },
|
|
17
|
+
{ id: 'o4-mini', modelName: 'o4-mini', recommended_for: ['vision', 'reasoning', 'default'], tags: ['vision', 'reasoning', 'agentic', 'budget', 'fast'], tier: 'budget' },
|
|
18
|
+
{ id: 'gpt-5.3-codex', modelName: 'gpt-5.3-codex', recommended_for: ['coding'], tags: ['agentic', 'standard-cost'], tier: 'standard' },
|
|
19
|
+
{ id: 'gpt-5.4', modelName: 'gpt-5.4', recommended_for: ['creative'], tags: ['agentic', 'standard-cost'], tier: 'standard' },
|
|
20
|
+
{ id: 'gpt-5-mini', modelName: 'gpt-5-mini', recommended_for: ['vision', 'default'], tags: ['vision', 'agentic', 'budget', 'fast'], tier: 'budget' },
|
|
21
|
+
{ id: 'Kimi-K2.5', modelName: 'Kimi-K2.5', recommended_for: ['vision'], tags: ['vision', 'budget'], tier: 'budget' },
|
|
22
|
+
{ id: 'grok-4', modelName: 'grok-4', recommended_for: [], tags: ['agentic', 'standard-cost'], tier: 'standard' },
|
|
23
|
+
{ id: 'DeepSeek-V3.2', modelName: 'DeepSeek-V3.2', recommended_for: [], tags: ['agentic', 'budget'], tier: 'budget' },
|
|
33
24
|
];
|
|
34
25
|
|
|
35
|
-
describe('resolvePreferredModel', () => {
|
|
36
|
-
// ── Exact match ──────────────────────────────────────────────
|
|
37
|
-
describe('exact match (tier 1)', () => {
|
|
38
|
-
test('Coding Assistant resolves to gpt-5.3-codex', () => {
|
|
39
|
-
expect(resolvePreferredModel(AGENT_TEMPLATES.CODING_ASSISTANT, MOCK_MODELS))
|
|
40
|
-
.toBe('gpt-5.3-codex');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('Data Analyst resolves to gpt-5.4-mini', () => {
|
|
44
|
-
expect(resolvePreferredModel(AGENT_TEMPLATES.DATA_ANALYST, MOCK_MODELS))
|
|
45
|
-
.toBe('gpt-5.4-mini');
|
|
46
|
-
});
|
|
26
|
+
describe('resolvePreferredModel (catalog-driven)', () => {
|
|
47
27
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
28
|
+
describe('recommended_for matching', () => {
|
|
29
|
+
test('Coding Assistant resolves to model recommended for coding', () => {
|
|
30
|
+
const result = resolvePreferredModel(AGENT_TEMPLATES.CODING_ASSISTANT, MOCK_MODELS);
|
|
31
|
+
expect(result).toBe('gpt-5.3-codex');
|
|
51
32
|
});
|
|
52
33
|
|
|
53
|
-
test('Security Architect resolves to
|
|
54
|
-
|
|
55
|
-
|
|
34
|
+
test('Security Architect resolves to model recommended for reasoning', () => {
|
|
35
|
+
const result = resolvePreferredModel(AGENT_TEMPLATES.SECURITY_ARCHITECT, MOCK_MODELS);
|
|
36
|
+
expect(result).toBe('o4-mini');
|
|
56
37
|
});
|
|
57
38
|
|
|
58
|
-
test('
|
|
59
|
-
|
|
60
|
-
|
|
39
|
+
test('Creative Writer resolves to model recommended for creative', () => {
|
|
40
|
+
const result = resolvePreferredModel(AGENT_TEMPLATES.CREATIVE_WRITER, MOCK_MODELS);
|
|
41
|
+
expect(result).toBe('gpt-5.4');
|
|
61
42
|
});
|
|
62
43
|
|
|
63
|
-
test('System Admin resolves to
|
|
64
|
-
|
|
65
|
-
|
|
44
|
+
test('System Admin resolves to model recommended for default', () => {
|
|
45
|
+
const result = resolvePreferredModel(AGENT_TEMPLATES.SYSTEM_ADMIN, MOCK_MODELS);
|
|
46
|
+
expect(result).toBe('o4-mini'); // first model with recommended_for: 'default'
|
|
66
47
|
});
|
|
67
48
|
|
|
68
|
-
test('
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
test('Custom resolves to gpt-5.4-mini', () => {
|
|
74
|
-
expect(resolvePreferredModel(AGENT_TEMPLATES.CUSTOM, MOCK_MODELS))
|
|
75
|
-
.toBe('gpt-5.4-mini');
|
|
49
|
+
test('Custom resolves to default model', () => {
|
|
50
|
+
const result = resolvePreferredModel(AGENT_TEMPLATES.CUSTOM, MOCK_MODELS);
|
|
51
|
+
expect(result).toBe('o4-mini');
|
|
76
52
|
});
|
|
77
53
|
});
|
|
78
54
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const models =
|
|
55
|
+
describe('tag fallback', () => {
|
|
56
|
+
test('falls back to tag match when no recommended_for match', () => {
|
|
57
|
+
// Models without any recommended_for
|
|
58
|
+
const models = [
|
|
59
|
+
{ id: 'model-a', modelName: 'model-a', tags: ['coding'], recommended_for: [] },
|
|
60
|
+
{ id: 'model-b', modelName: 'model-b', tags: ['general'], recommended_for: [] },
|
|
61
|
+
];
|
|
83
62
|
const result = resolvePreferredModel(AGENT_TEMPLATES.CODING_ASSISTANT, models);
|
|
84
|
-
|
|
85
|
-
// Terms are ['gpt', 'codex', '5.3'] — should match a gpt model with high version
|
|
86
|
-
expect(selected.modelName).toMatch(/gpt/);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
test('Data Analyst falls back to a gpt model when gpt-5.4-mini missing', () => {
|
|
90
|
-
const models = MOCK_MODELS.filter(m => m.modelName !== 'gpt-5.4-mini');
|
|
91
|
-
const result = resolvePreferredModel(AGENT_TEMPLATES.DATA_ANALYST, models);
|
|
92
|
-
const selected = models.find(m => m.id === result);
|
|
93
|
-
// Should still pick a model that matches at least "gpt" or "5.4"
|
|
94
|
-
expect(selected).toBeDefined();
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
test('Security Architect falls back to a model matching at least one term when o4-mini missing', () => {
|
|
98
|
-
const models = MOCK_MODELS.filter(m => m.modelName !== 'o4-mini');
|
|
99
|
-
const result = resolvePreferredModel(AGENT_TEMPLATES.SECURITY_ARCHITECT, models);
|
|
100
|
-
expect(result).toBeTruthy();
|
|
101
|
-
// The resolver picks the best scoring model — any match on 'o4', 'reasoning', or 'o3' is valid
|
|
102
|
-
// Version-number bonus may also influence the pick (e.g., DeepSeek-R1-0528 has high digits)
|
|
63
|
+
expect(result).toBe('model-a');
|
|
103
64
|
});
|
|
65
|
+
});
|
|
104
66
|
|
|
105
|
-
|
|
67
|
+
describe('default fallback', () => {
|
|
68
|
+
test('falls back to default-recommended model when purpose not found', () => {
|
|
106
69
|
const models = [
|
|
107
|
-
{ id: '
|
|
108
|
-
{ id: '
|
|
109
|
-
{ id: 'gpt-5.3', modelName: 'gpt-5.3' },
|
|
70
|
+
{ id: 'exotic', modelName: 'exotic', recommended_for: ['default'], tags: [] },
|
|
71
|
+
{ id: 'other', modelName: 'other', recommended_for: [], tags: [] },
|
|
110
72
|
];
|
|
111
|
-
// Creative Writer
|
|
112
|
-
|
|
113
|
-
|
|
73
|
+
// Creative Writer with no 'creative' recommended_for → falls to 'default'
|
|
74
|
+
const result = resolvePreferredModel(AGENT_TEMPLATES.CREATIVE_WRITER, models);
|
|
75
|
+
expect(result).toBe('exotic');
|
|
114
76
|
});
|
|
115
77
|
});
|
|
116
78
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
{ id: '
|
|
122
|
-
{ id: 'exotic-2', modelName: 'another-unknown' },
|
|
79
|
+
describe('first-available fallback', () => {
|
|
80
|
+
test('returns first model when no tags or recommended_for match', () => {
|
|
81
|
+
const models = [
|
|
82
|
+
{ id: 'unknown-1', modelName: 'unknown-1' },
|
|
83
|
+
{ id: 'unknown-2', modelName: 'unknown-2' },
|
|
123
84
|
];
|
|
124
|
-
const result = resolvePreferredModel(AGENT_TEMPLATES.CODING_ASSISTANT,
|
|
125
|
-
expect(result).
|
|
126
|
-
expect(['exotic-1', 'exotic-2']).toContain(result);
|
|
85
|
+
const result = resolvePreferredModel(AGENT_TEMPLATES.CODING_ASSISTANT, models);
|
|
86
|
+
expect(result).toBe('unknown-1');
|
|
127
87
|
});
|
|
128
88
|
});
|
|
129
89
|
|
|
130
|
-
// ── Edge cases ───────────────────────────────────────────────
|
|
131
90
|
describe('edge cases', () => {
|
|
132
|
-
test('returns null for empty
|
|
91
|
+
test('returns null for empty list', () => {
|
|
133
92
|
expect(resolvePreferredModel(AGENT_TEMPLATES.CODING_ASSISTANT, [])).toBeNull();
|
|
134
93
|
});
|
|
135
94
|
|
|
136
|
-
test('returns null for null
|
|
95
|
+
test('returns null for null', () => {
|
|
137
96
|
expect(resolvePreferredModel(AGENT_TEMPLATES.CODING_ASSISTANT, null)).toBeNull();
|
|
138
97
|
});
|
|
139
98
|
|
|
140
|
-
test('handles unknown template
|
|
99
|
+
test('handles unknown template gracefully', () => {
|
|
141
100
|
const result = resolvePreferredModel('nonexistent', MOCK_MODELS);
|
|
142
|
-
|
|
101
|
+
// Unknown template defaults to 'default' purpose → finds o4-mini
|
|
102
|
+
expect(result).toBe('o4-mini');
|
|
143
103
|
});
|
|
144
104
|
|
|
145
|
-
test('every AGENT_TEMPLATE has a
|
|
105
|
+
test('every AGENT_TEMPLATE has a purpose in TEMPLATE_PURPOSE_MAP', () => {
|
|
146
106
|
for (const key of Object.values(AGENT_TEMPLATES)) {
|
|
147
|
-
expect(
|
|
148
|
-
expect(TEMPLATE_MODEL_PREFERENCES[key].preferredModel).toBeTruthy();
|
|
149
|
-
expect(TEMPLATE_MODEL_PREFERENCES[key].terms.length).toBeGreaterThan(0);
|
|
107
|
+
expect(TEMPLATE_PURPOSE_MAP[key]).toBeDefined();
|
|
150
108
|
}
|
|
151
109
|
});
|
|
152
110
|
});
|
|
@@ -33,6 +33,9 @@ function buildRemoteSessionApp(sessionToken) {
|
|
|
33
33
|
// Health endpoint is public
|
|
34
34
|
if (req.path === '/api/health' || req.path === '/health') return next();
|
|
35
35
|
|
|
36
|
+
// Static assets are public (CSS, JS, images, fonts)
|
|
37
|
+
if (req.path.startsWith('/static/') || req.path.endsWith('.svg') || req.path.endsWith('.png') || req.path.endsWith('.ico') || req.path.endsWith('.woff2')) return next();
|
|
38
|
+
|
|
36
39
|
// Parse cookies manually
|
|
37
40
|
const cookies = {};
|
|
38
41
|
(req.headers.cookie || '').split(';').forEach(c => {
|
|
@@ -69,6 +72,10 @@ function buildRemoteSessionApp(sessionToken) {
|
|
|
69
72
|
// ── Test routes behind the gate ────────────────────────────────
|
|
70
73
|
app.get('/api/health', (req, res) => res.json({ status: 'healthy' }));
|
|
71
74
|
app.get('/health', (req, res) => res.json({ status: 'healthy' }));
|
|
75
|
+
app.get('/static/index-abc123.js', (req, res) => res.type('js').send('console.log("app")'));
|
|
76
|
+
app.get('/static/index-abc123.css', (req, res) => res.type('css').send('body{}'));
|
|
77
|
+
app.get('/loxia-icon.svg', (req, res) => res.type('svg').send('<svg></svg>'));
|
|
78
|
+
app.get('/favicon.ico', (req, res) => res.type('ico').send(''));
|
|
72
79
|
app.get('/api/test', (req, res) => res.json({ success: true, data: 'protected' }));
|
|
73
80
|
app.get('/', (req, res) => res.send('<html><body>Web UI</body></html>'));
|
|
74
81
|
app.get('/dashboard', (req, res) => res.send('<html><body>Dashboard</body></html>'));
|
|
@@ -113,6 +120,45 @@ describe('Remote Session Auth Gate', () => {
|
|
|
113
120
|
});
|
|
114
121
|
});
|
|
115
122
|
|
|
123
|
+
// ── Static assets bypass (public) ──────────────────────────────────
|
|
124
|
+
describe('static assets (public, no auth needed)', () => {
|
|
125
|
+
it('/static/*.js is accessible without any token', async () => {
|
|
126
|
+
const app = buildRemoteSessionApp(VALID_TOKEN);
|
|
127
|
+
const { server: s, baseUrl } = await startServer(app);
|
|
128
|
+
server = s;
|
|
129
|
+
|
|
130
|
+
const res = await fetch(`${baseUrl}/static/index-abc123.js`);
|
|
131
|
+
expect(res.status).toBe(200);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('/static/*.css is accessible without any token', async () => {
|
|
135
|
+
const app = buildRemoteSessionApp(VALID_TOKEN);
|
|
136
|
+
const { server: s, baseUrl } = await startServer(app);
|
|
137
|
+
server = s;
|
|
138
|
+
|
|
139
|
+
const res = await fetch(`${baseUrl}/static/index-abc123.css`);
|
|
140
|
+
expect(res.status).toBe(200);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('.svg files are accessible without any token', async () => {
|
|
144
|
+
const app = buildRemoteSessionApp(VALID_TOKEN);
|
|
145
|
+
const { server: s, baseUrl } = await startServer(app);
|
|
146
|
+
server = s;
|
|
147
|
+
|
|
148
|
+
const res = await fetch(`${baseUrl}/loxia-icon.svg`);
|
|
149
|
+
expect(res.status).toBe(200);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('.ico files are accessible without any token', async () => {
|
|
153
|
+
const app = buildRemoteSessionApp(VALID_TOKEN);
|
|
154
|
+
const { server: s, baseUrl } = await startServer(app);
|
|
155
|
+
server = s;
|
|
156
|
+
|
|
157
|
+
const res = await fetch(`${baseUrl}/favicon.ico`);
|
|
158
|
+
expect(res.status).toBe(200);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
116
162
|
// ── Token via query param (first access) ─────────────────────────
|
|
117
163
|
describe('?session_token= query param (first access)', () => {
|
|
118
164
|
it('valid token sets cookie and redirects (strips token from URL)', async () => {
|
|
@@ -269,6 +269,11 @@ class WebServer {
|
|
|
269
269
|
// Health endpoint is public (used by session manager to check readiness)
|
|
270
270
|
if (req.path === '/api/health' || req.path === '/health') return next();
|
|
271
271
|
|
|
272
|
+
// Static assets are public — CSS, JS, images, fonts, icons
|
|
273
|
+
// These are hashed build artifacts with no sensitive data.
|
|
274
|
+
// Blocking them breaks the UI on first load (before cookie is set).
|
|
275
|
+
if (req.path.startsWith('/static/') || req.path.endsWith('.svg') || req.path.endsWith('.png') || req.path.endsWith('.ico') || req.path.endsWith('.woff2')) return next();
|
|
276
|
+
|
|
272
277
|
// Check for session token in cookie or query param
|
|
273
278
|
// Parse cookie manually (avoid adding cookie-parser dependency)
|
|
274
279
|
const cookies = {};
|
|
@@ -287,10 +292,13 @@ class WebServer {
|
|
|
287
292
|
maxAge: (parseInt(process.env.SESSION_TTL) || 7200) * 1000,
|
|
288
293
|
path: '/'
|
|
289
294
|
});
|
|
290
|
-
// Strip the session_token param
|
|
295
|
+
// Strip the session_token param and redirect via a tiny HTML page
|
|
296
|
+
// that sets sessionStorage flag before navigating (so the SPA knows
|
|
297
|
+
// this is a remote session with a pre-configured API key).
|
|
291
298
|
const url = new URL(req.originalUrl, `http://${req.headers.host}`);
|
|
292
299
|
url.searchParams.delete('session_token');
|
|
293
|
-
|
|
300
|
+
const target = url.pathname + url.search || '/';
|
|
301
|
+
return res.send(`<html><head><script>sessionStorage.setItem('loxia-remote-session','true');window.location.replace('${target}');</script></head><body></body></html>`);
|
|
294
302
|
}
|
|
295
303
|
|
|
296
304
|
if (tokenFromCookie === sessionToken) {
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for VisionTool vision model selection — catalog-driven.
|
|
3
|
+
* Uses recommended_for and tier from the catalog instead of name lists.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
function selectVisionModel(models, context = {}) {
|
|
9
|
+
const visionModels = (models || []).filter(m => m.supportsVision === true);
|
|
10
|
+
if (visionModels.length === 0) return null;
|
|
11
|
+
|
|
12
|
+
// 1. Model recommended for vision
|
|
13
|
+
const recommended = visionModels.find(m => m.recommended_for?.includes('vision'));
|
|
14
|
+
if (recommended) return recommended.name;
|
|
15
|
+
|
|
16
|
+
// 2. Budget-tier vision model
|
|
17
|
+
const budget = visionModels.find(m => m.tier === 'budget');
|
|
18
|
+
if (budget) return budget.name;
|
|
19
|
+
|
|
20
|
+
// 3. Agent's current model
|
|
21
|
+
const agentModel = context.currentModel;
|
|
22
|
+
if (agentModel && visionModels.some(m => m.name === agentModel)) return agentModel;
|
|
23
|
+
|
|
24
|
+
// 4. First available
|
|
25
|
+
return visionModels[0].name;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const ALL_MODELS = [
|
|
29
|
+
{ name: 'o4-mini', supportsVision: true, recommended_for: ['vision', 'reasoning', 'default'], tier: 'budget' },
|
|
30
|
+
{ name: 'gpt-5-mini', supportsVision: true, recommended_for: ['vision', 'default'], tier: 'budget' },
|
|
31
|
+
{ name: 'Kimi-K2.5', supportsVision: true, recommended_for: ['vision'], tier: 'budget' },
|
|
32
|
+
{ name: 'gpt-5.4', supportsVision: false, recommended_for: ['creative'], tier: 'standard' },
|
|
33
|
+
{ name: 'grok-4', supportsVision: true, recommended_for: [], tier: 'standard' },
|
|
34
|
+
{ name: 'DeepSeek-V3.2', supportsVision: false, recommended_for: [], tier: 'budget' },
|
|
35
|
+
{ name: 'gpt-5.3-codex', supportsVision: false, recommended_for: ['coding'], tier: 'standard' },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
describe('VisionTool model selection (catalog-driven)', () => {
|
|
39
|
+
|
|
40
|
+
test('selects model recommended for vision', () => {
|
|
41
|
+
expect(selectVisionModel(ALL_MODELS)).toBe('o4-mini');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('selects budget vision model when no recommended_for match', () => {
|
|
45
|
+
const models = ALL_MODELS.map(m => ({ ...m, recommended_for: [] }));
|
|
46
|
+
expect(selectVisionModel(models)).toBe('o4-mini'); // still budget + vision
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('skips non-vision models even if recommended', () => {
|
|
50
|
+
const models = [
|
|
51
|
+
{ name: 'non-vision', supportsVision: false, recommended_for: ['vision'], tier: 'budget' },
|
|
52
|
+
{ name: 'actual-vision', supportsVision: true, recommended_for: [], tier: 'standard' },
|
|
53
|
+
];
|
|
54
|
+
expect(selectVisionModel(models)).toBe('actual-vision');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('uses agent current model when no recommended/budget match', () => {
|
|
58
|
+
const models = [
|
|
59
|
+
{ name: 'premium-vision', supportsVision: true, recommended_for: [], tier: 'premium' },
|
|
60
|
+
{ name: 'agent-model', supportsVision: true, recommended_for: [], tier: 'premium' },
|
|
61
|
+
];
|
|
62
|
+
expect(selectVisionModel(models, { currentModel: 'agent-model' })).toBe('agent-model');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('falls back to first available', () => {
|
|
66
|
+
const models = [
|
|
67
|
+
{ name: 'only-option', supportsVision: true, recommended_for: [], tier: 'premium' },
|
|
68
|
+
];
|
|
69
|
+
expect(selectVisionModel(models)).toBe('only-option');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('returns null when no vision models', () => {
|
|
73
|
+
expect(selectVisionModel([{ name: 'text-only', supportsVision: false }])).toBeNull();
|
|
74
|
+
expect(selectVisionModel([])).toBeNull();
|
|
75
|
+
expect(selectVisionModel(null)).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('no hardcoded model names in selection logic', () => {
|
|
79
|
+
// All models are fictional — proves zero name dependence
|
|
80
|
+
const models = [
|
|
81
|
+
{ name: 'xyz-model-alpha', supportsVision: true, recommended_for: ['vision'], tier: 'budget' },
|
|
82
|
+
{ name: 'abc-model-beta', supportsVision: true, recommended_for: [], tier: 'standard' },
|
|
83
|
+
];
|
|
84
|
+
expect(selectVisionModel(models)).toBe('xyz-model-alpha');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for WebTool._selectVisionModel() — catalog-driven.
|
|
3
|
+
* Uses recommended_for and tier instead of hardcoded name lists.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { jest, describe, test, expect } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
function selectVisionModel(context) {
|
|
9
|
+
const modelsService = context.aiService?.modelsService;
|
|
10
|
+
if (!modelsService) return null;
|
|
11
|
+
|
|
12
|
+
const allModels = modelsService.getModels?.() || [];
|
|
13
|
+
const visionModels = allModels.filter(m => m.supportsVision === true);
|
|
14
|
+
if (visionModels.length === 0) return null;
|
|
15
|
+
|
|
16
|
+
const recommended = visionModels.find(m => m.recommended_for?.includes('vision'));
|
|
17
|
+
if (recommended) return recommended.name;
|
|
18
|
+
|
|
19
|
+
const budget = visionModels.find(m => m.tier === 'budget');
|
|
20
|
+
if (budget) return budget.name;
|
|
21
|
+
|
|
22
|
+
return visionModels[0].name;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function makeContext(models) {
|
|
26
|
+
return { aiService: { modelsService: { getModels: () => models } } };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe('WebTool._selectVisionModel (catalog-driven)', () => {
|
|
30
|
+
|
|
31
|
+
test('selects model recommended for vision', () => {
|
|
32
|
+
const models = [
|
|
33
|
+
{ name: 'vision-model', supportsVision: true, recommended_for: ['vision'], tier: 'budget' },
|
|
34
|
+
{ name: 'other', supportsVision: true, recommended_for: [], tier: 'standard' },
|
|
35
|
+
];
|
|
36
|
+
expect(selectVisionModel(makeContext(models))).toBe('vision-model');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('selects budget vision model as fallback', () => {
|
|
40
|
+
const models = [
|
|
41
|
+
{ name: 'premium', supportsVision: true, recommended_for: [], tier: 'premium' },
|
|
42
|
+
{ name: 'cheap', supportsVision: true, recommended_for: [], tier: 'budget' },
|
|
43
|
+
];
|
|
44
|
+
expect(selectVisionModel(makeContext(models))).toBe('cheap');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('returns first available when no tags match', () => {
|
|
48
|
+
const models = [
|
|
49
|
+
{ name: 'only-one', supportsVision: true, recommended_for: [], tier: 'premium' },
|
|
50
|
+
];
|
|
51
|
+
expect(selectVisionModel(makeContext(models))).toBe('only-one');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('skips non-vision models', () => {
|
|
55
|
+
const models = [
|
|
56
|
+
{ name: 'text-only', supportsVision: false, recommended_for: ['vision'], tier: 'budget' },
|
|
57
|
+
{ name: 'actual-vision', supportsVision: true, recommended_for: [], tier: 'standard' },
|
|
58
|
+
];
|
|
59
|
+
expect(selectVisionModel(makeContext(models))).toBe('actual-vision');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('returns null when no models available', () => {
|
|
63
|
+
expect(selectVisionModel(makeContext([]))).toBeNull();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('returns null when no aiService', () => {
|
|
67
|
+
expect(selectVisionModel({})).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('falls back to o4-mini when _selectVisionModel returns null', () => {
|
|
71
|
+
// The actual code does: this._selectVisionModel(context) || 'o4-mini'
|
|
72
|
+
const result = selectVisionModel({}) || 'o4-mini';
|
|
73
|
+
expect(result).toBe('o4-mini');
|
|
74
|
+
});
|
|
75
|
+
});
|
package/src/tools/visionTool.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Purpose:
|
|
5
5
|
* - Analyze images from disk with natural language questions
|
|
6
6
|
* - Session-based: first call uploads image, subsequent calls reuse it
|
|
7
|
-
* - Uses the best available vision model (prefers
|
|
7
|
+
* - Uses the best available vision model (prefers o4-mini for best MMMU/cost ratio)
|
|
8
8
|
* - Returns structured answers only (no filler text)
|
|
9
9
|
*
|
|
10
10
|
* Actions:
|
|
@@ -18,12 +18,8 @@ import { BaseTool } from './baseTool.js';
|
|
|
18
18
|
import { promises as fs } from 'fs';
|
|
19
19
|
import path from 'path';
|
|
20
20
|
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
// 2. Model with "sonnet" in name + vision capability
|
|
24
|
-
// 3. Agent's current model if it has vision capability
|
|
25
|
-
// 4. First model in the list with vision capability
|
|
26
|
-
const VISION_MODEL_PRIORITY = ['opus', 'sonnet'];
|
|
21
|
+
// Vision model selection uses catalog tags + recommended_for fields.
|
|
22
|
+
// No hardcoded model names — the catalog determines which models are best for vision.
|
|
27
23
|
|
|
28
24
|
const MAX_IMAGE_SIZE_BYTES = 20 * 1024 * 1024; // 20MB
|
|
29
25
|
const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
@@ -436,31 +432,29 @@ ANSWERS: Structured, direct answers only — no filler text.`;
|
|
|
436
432
|
|
|
437
433
|
_selectVisionModel(context = {}) {
|
|
438
434
|
const visionModels = this._getVisionModels();
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
const match = visionModels.find(m => m.name.toLowerCase().includes(keyword));
|
|
443
|
-
if (match) {
|
|
444
|
-
this._selectedModel = match.name;
|
|
445
|
-
return this._selectedModel;
|
|
446
|
-
}
|
|
435
|
+
if (visionModels.length === 0) {
|
|
436
|
+
this.logger?.warn('[VisionTool] No vision-capable model found in model list');
|
|
437
|
+
return null;
|
|
447
438
|
}
|
|
448
439
|
|
|
449
|
-
//
|
|
440
|
+
// 1. Model explicitly recommended for vision (from catalog)
|
|
441
|
+
const recommended = visionModels.find(m => m.recommended_for?.includes('vision'));
|
|
442
|
+
if (recommended) { this._selectedModel = recommended.name; return this._selectedModel; }
|
|
443
|
+
|
|
444
|
+
// 2. Vision model with budget tier (best cost/quality)
|
|
445
|
+
const budgetVision = visionModels.find(m => m.tier === 'budget');
|
|
446
|
+
if (budgetVision) { this._selectedModel = budgetVision.name; return this._selectedModel; }
|
|
447
|
+
|
|
448
|
+
// 3. Agent's current model if it has vision capability
|
|
450
449
|
const agentModel = context.currentModel;
|
|
451
450
|
if (agentModel && visionModels.some(m => m.name === agentModel)) {
|
|
452
451
|
this._selectedModel = agentModel;
|
|
453
452
|
return this._selectedModel;
|
|
454
453
|
}
|
|
455
454
|
|
|
456
|
-
//
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
return this._selectedModel;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
this.logger?.warn('[VisionTool] No vision-capable model found in model list');
|
|
463
|
-
return null;
|
|
455
|
+
// 4. First available vision model
|
|
456
|
+
this._selectedModel = visionModels[0].name;
|
|
457
|
+
return this._selectedModel;
|
|
464
458
|
}
|
|
465
459
|
|
|
466
460
|
_getVisionModels() {
|
package/src/tools/webTool.js
CHANGED
|
@@ -2832,6 +2832,31 @@ If blocked (CAPTCHA, access denied), use stealthLevel: "maximum" (visible browse
|
|
|
2832
2832
|
};
|
|
2833
2833
|
}
|
|
2834
2834
|
|
|
2835
|
+
/**
|
|
2836
|
+
* Select the best available vision model for screenshot analysis.
|
|
2837
|
+
* Uses catalog tags + recommended_for — no hardcoded model names.
|
|
2838
|
+
* @private
|
|
2839
|
+
*/
|
|
2840
|
+
_selectVisionModel(context) {
|
|
2841
|
+
const modelsService = context.aiService?.modelsService;
|
|
2842
|
+
if (!modelsService) return null;
|
|
2843
|
+
|
|
2844
|
+
const allModels = modelsService.getModels?.() || [];
|
|
2845
|
+
const visionModels = allModels.filter(m => m.supportsVision === true);
|
|
2846
|
+
if (visionModels.length === 0) return null;
|
|
2847
|
+
|
|
2848
|
+
// 1. Model recommended for vision (from catalog)
|
|
2849
|
+
const recommended = visionModels.find(m => m.recommended_for?.includes('vision'));
|
|
2850
|
+
if (recommended) return recommended.name;
|
|
2851
|
+
|
|
2852
|
+
// 2. Budget-tier vision model (best cost/quality)
|
|
2853
|
+
const budget = visionModels.find(m => m.tier === 'budget');
|
|
2854
|
+
if (budget) return budget.name;
|
|
2855
|
+
|
|
2856
|
+
// 3. First available
|
|
2857
|
+
return visionModels[0].name;
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2835
2860
|
/**
|
|
2836
2861
|
* Analyze screenshot using AI vision model
|
|
2837
2862
|
* @param {Page} page - Puppeteer page
|
|
@@ -2856,8 +2881,8 @@ If blocked (CAPTCHA, access denied), use stealthLevel: "maximum" (visible browse
|
|
|
2856
2881
|
});
|
|
2857
2882
|
|
|
2858
2883
|
try {
|
|
2859
|
-
//
|
|
2860
|
-
const model = '
|
|
2884
|
+
// Select best available vision model dynamically
|
|
2885
|
+
const model = this._selectVisionModel(context) || 'o4-mini';
|
|
2861
2886
|
|
|
2862
2887
|
// Create message with image
|
|
2863
2888
|
const response = await aiService.sendMessage(
|
package/web-ui/build/index.html
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>Loxia Autopilot One</title>
|
|
8
8
|
<meta name="description" content="AI Agents System - No-code/vibe-code/companion-coder platform" />
|
|
9
|
-
<script type="module" crossorigin src="/static/index-
|
|
9
|
+
<script type="module" crossorigin src="/static/index-DY0DLa8y.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/static/index-BwNJoEC1.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as f}from"./index-DY0DLa8y.js";import{r as s}from"./index-ClWUfRkv.js";function i(t,n){for(var o=0;o<n.length;o++){const e=n[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const c=Object.getOwnPropertyDescriptor(e,r);c&&Object.defineProperty(t,r,c.get?c:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var a=s();const p=f(a),l=i({__proto__:null,default:p},[a]);export{l as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as s,g as f}from"./index-DY0DLa8y.js";function c(t,n){for(var o=0;o<n.length;o++){const e=n[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var p=s();const i=f(p),b=c({__proto__:null,default:i},[p]);export{b as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as s,g as c}from"./index-DY0DLa8y.js";function i(t,a){for(var o=0;o<a.length;o++){const e=a[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const n=Object.getOwnPropertyDescriptor(e,r);n&&Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var f=s();const p=c(f),b=i({__proto__:null,default:p},[f]);export{b as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as s}from"./index-DY0DLa8y.js";import{a as i}from"./index-ClWUfRkv.js";function c(t,n){for(var o=0;o<n.length;o++){const e=n[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var f=i();const p=s(f),g=c({__proto__:null,default:p},[f]);export{g as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as n}from"./index-DY0DLa8y.js";import{b as f}from"./index-ClWUfRkv.js";function g(t,c){for(var o=0;o<c.length;o++){const e=c[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const s=Object.getOwnPropertyDescriptor(e,r);s&&Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var a=f();const l=n(a),u=g({__proto__:null,default:l},[a]);export{u as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as a,g as s}from"./index-DY0DLa8y.js";function p(r,i){for(var o=0;o<i.length;o++){const t=i[o];if(typeof t!="string"&&!Array.isArray(t)){for(const e in t)if(e!=="default"&&!(e in r)){const c=Object.getOwnPropertyDescriptor(t,e);c&&Object.defineProperty(r,e,c.get?c:{enumerable:!0,get:()=>t[e]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}var n=a();const f=s(n),g=p({__proto__:null,default:f},[n]);export{g as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as a}from"./index-DY0DLa8y.js";import{c as s}from"./index-ClWUfRkv.js";function p(r,i){for(var o=0;o<i.length;o++){const t=i[o];if(typeof t!="string"&&!Array.isArray(t)){for(const e in t)if(e!=="default"&&!(e in r)){const c=Object.getOwnPropertyDescriptor(t,e);c&&Object.defineProperty(r,e,c.get?c:{enumerable:!0,get:()=>t[e]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}var n=s();const f=a(n),l=p({__proto__:null,default:f},[n]);export{l as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as s,g as c}from"./index-DY0DLa8y.js";function i(t,n){for(var o=0;o<n.length;o++){const e=n[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var f=s();const p=c(f),d=i({__proto__:null,default:p},[f]);export{d as a};
|