onbuzz 4.2.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/core/__tests__/agentScheduler.visualizer.test.js +258 -0
- package/src/core/__tests__/orchestrator.test.js +22 -6
- package/src/core/agentScheduler.js +7 -1
- package/src/core/orchestrator.js +13 -6
- package/src/index.js +8 -0
- package/src/interfaces/__tests__/galleryRoutes.test.js +158 -250
- package/src/interfaces/__tests__/schedulerRoutes.test.js +176 -0
- package/src/interfaces/__tests__/videoJobsRoutes.test.js +179 -0
- package/src/interfaces/schedulerRoutes.js +50 -0
- package/src/interfaces/webServer.js +235 -111
- package/src/modules/widget/__tests__/acceptance.test.js +267 -0
- package/src/modules/widget/__tests__/codeAnalyzer.test.js +340 -0
- package/src/modules/widget/__tests__/eventBus.test.js +169 -0
- package/src/modules/widget/__tests__/galleryActions.test.js +290 -0
- package/src/modules/widget/__tests__/galleryStore.test.js +269 -0
- package/src/modules/widget/__tests__/isDisabled.test.js +41 -0
- package/src/modules/widget/__tests__/phishingScanner.test.js +75 -0
- package/src/modules/widget/__tests__/routes.test.js +678 -0
- package/src/modules/widget/__tests__/runtime.test.js +401 -0
- package/src/modules/widget/__tests__/schema.test.js +155 -0
- package/src/modules/widget/__tests__/upgrade.test.js +257 -0
- package/src/modules/widget/__tests__/versioning.test.js +309 -0
- package/src/modules/widget/__tests__/webComponentRuntime.test.js +565 -0
- package/src/modules/widget/__tests__/widgetTool.test.js +316 -0
- package/src/modules/widget/codeAnalyzer.js +351 -0
- package/src/modules/widget/galleryStore.js +324 -0
- package/src/modules/widget/index.js +38 -0
- package/src/modules/widget/phishingScanner.js +47 -0
- package/src/modules/widget/routes.js +414 -0
- package/src/modules/widget/runtime/bundle.js +640 -0
- package/src/modules/widget/runtime/webComponentBundle.js +470 -0
- package/src/modules/widget/schema.js +133 -0
- package/src/modules/widget/widgetTool.js +1336 -0
- package/src/services/__tests__/aiService.stream.test.js +5 -1
- package/src/services/__tests__/channelFilter.test.js +4 -2
- package/src/services/__tests__/channelRelay.integration.test.js +1 -1
- package/src/services/__tests__/galleryService.test.js +225 -0
- package/src/services/__tests__/toolCallBridgeContract.test.js +3 -5
- package/src/services/galleryService.js +257 -0
- package/src/tools/__tests__/imageTool.sizeValidation.test.js +134 -0
- package/src/tools/__tests__/imageTool.validator.test.js +194 -0
- package/src/tools/__tests__/videoTool.jobs.test.js +147 -0
- package/src/tools/imageTool.js +282 -44
- package/src/tools/taskManagerTool.js +13 -2
- package/src/tools/videoTool.js +126 -0
- package/src/utilities/__tests__/logger.safeStringify.test.js +124 -0
- package/src/utilities/logger.js +51 -7
- package/src/utilities/userDataDir.js +3 -0
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-DhNfWMWm.js +1 -0
- package/web-ui/build/static/abap-QOWHgSNA.js +1 -0
- package/web-ui/build/static/abnf-C9PFiETQ.js +1 -0
- package/web-ui/build/static/abnf-DEbBdEpP.js +1 -0
- package/web-ui/build/static/accesslog-DaKq5_Ts.js +1 -0
- package/web-ui/build/static/actionscript-BcY19SjW.js +1 -0
- package/web-ui/build/static/actionscript-CbLJrkm9.js +1 -0
- package/web-ui/build/static/ada-D1vjmumu.js +1 -0
- package/web-ui/build/static/ada-hAjtW1jL.js +1 -0
- package/web-ui/build/static/agda-Bhk3JFT9.js +1 -0
- package/web-ui/build/static/al-DYmeq5B0.js +1 -0
- package/web-ui/build/static/angelscript-BxCBNQXZ.js +1 -0
- package/web-ui/build/static/antlr4-CPmkdILF.js +1 -0
- package/web-ui/build/static/apache-CnwL2ZvW.js +1 -0
- package/web-ui/build/static/apacheconf-CfeBIh7R.js +1 -0
- package/web-ui/build/static/apex-C36kXZsT.js +1 -0
- package/web-ui/build/static/apl-CeT_l0YX.js +1 -0
- package/web-ui/build/static/applescript-BimsduDW.js +1 -0
- package/web-ui/build/static/applescript-CLBFEONC.js +1 -0
- package/web-ui/build/static/aql-DcXNMsw5.js +1 -0
- package/web-ui/build/static/arcade-CsONs-nh.js +1 -0
- package/web-ui/build/static/arduino-1XAf972o.js +1 -0
- package/web-ui/build/static/arduino-BkRulzgv.js +1 -0
- package/web-ui/build/static/arff-QhmkBHXy.js +1 -0
- package/web-ui/build/static/armasm-Cf34TCbg.js +1 -0
- package/web-ui/build/static/asciidoc-Dxk-KUUW.js +1 -0
- package/web-ui/build/static/asciidoc-mpuuiNok.js +1 -0
- package/web-ui/build/static/asm6502-0M2Se3gz.js +1 -0
- package/web-ui/build/static/asmatmel-DhFK-DLd.js +1 -0
- package/web-ui/build/static/aspectj-BKNOwBC8.js +1 -0
- package/web-ui/build/static/aspnet-BZ88RTxR.js +1 -0
- package/web-ui/build/static/autohotkey-DGmMm6oy.js +1 -0
- package/web-ui/build/static/autohotkey-HUDPuon_.js +1 -0
- package/web-ui/build/static/autoit-B-YW8YdA.js +1 -0
- package/web-ui/build/static/autoit-CvHRbbE-.js +1 -0
- package/web-ui/build/static/avisynth-C6iP20gR.js +1 -0
- package/web-ui/build/static/avrasm-AOIVGwnb.js +1 -0
- package/web-ui/build/static/avro-idl-CcPf6wBK.js +1 -0
- package/web-ui/build/static/awk-Dy8_cKla.js +1 -0
- package/web-ui/build/static/axapta-CexCCXgI.js +1 -0
- package/web-ui/build/static/bash-DKgFZb-B.js +1 -0
- package/web-ui/build/static/bash-DrUQRf4E.js +1 -0
- package/web-ui/build/static/basic-BXDUD6us.js +1 -0
- package/web-ui/build/static/basic-DlEL_-PG.js +1 -0
- package/web-ui/build/static/batch-HHuRbek7.js +1 -0
- package/web-ui/build/static/bbcode-D4lEyfHq.js +1 -0
- package/web-ui/build/static/bicep-Ca66VjcC.js +1 -0
- package/web-ui/build/static/birb-BWDnQG3-.js +1 -0
- package/web-ui/build/static/bison-DGEvuoCn.js +1 -0
- package/web-ui/build/static/bnf-DNrgnFxK.js +1 -0
- package/web-ui/build/static/bnf-DkGg9a6f.js +1 -0
- package/web-ui/build/static/brainfuck-BcC5WVuw.js +1 -0
- package/web-ui/build/static/brainfuck-Dzx6V6EF.js +1 -0
- package/web-ui/build/static/brightscript-26Asmy4_.js +1 -0
- package/web-ui/build/static/bro-CFV9ava2.js +1 -0
- package/web-ui/build/static/bsl-BHMAYVVg.js +1 -0
- package/web-ui/build/static/c-B7WGfC_g.js +1 -0
- package/web-ui/build/static/c-CUYmQ5h3.js +1 -0
- package/web-ui/build/static/c-like-BSddZquS.js +1 -0
- package/web-ui/build/static/cal-DQjwjuMG.js +1 -0
- package/web-ui/build/static/capnproto-CBnYJDMr.js +1 -0
- package/web-ui/build/static/ceylon-ce3L4vqX.js +1 -0
- package/web-ui/build/static/cfscript-CN8IKzxH.js +1 -0
- package/web-ui/build/static/chaiscript-DT-qasen.js +1 -0
- package/web-ui/build/static/cil-BPu0-6KT.js +1 -0
- package/web-ui/build/static/clean-BWcUgtLl.js +1 -0
- package/web-ui/build/static/clojure-CVLbUcEn.js +1 -0
- package/web-ui/build/static/clojure-mVJcgmKZ.js +1 -0
- package/web-ui/build/static/clojure-repl-B1bPQUgE.js +1 -0
- package/web-ui/build/static/cmake-ApAYr4_A.js +1 -0
- package/web-ui/build/static/cmake-oI81UP1F.js +1 -0
- package/web-ui/build/static/cobol-eZdxawKH.js +1 -0
- package/web-ui/build/static/coffeescript-BvFq14Nz.js +1 -0
- package/web-ui/build/static/coffeescript-CedrhcbC.js +1 -0
- package/web-ui/build/static/concurnas-8QctO6Q7.js +1 -0
- package/web-ui/build/static/coq-CaQMtKys.js +1 -0
- package/web-ui/build/static/coq-Di7lBRJy.js +1 -0
- package/web-ui/build/static/cos-3TjiDgk1.js +1 -0
- package/web-ui/build/static/cpp-BGwIhR_y.js +1 -0
- package/web-ui/build/static/cpp-CRXTx1YD.js +1 -0
- package/web-ui/build/static/crmsh-C67REd2u.js +1 -0
- package/web-ui/build/static/crystal-C8Rs5smk.js +1 -0
- package/web-ui/build/static/crystal-C8jnpN4t.js +1 -0
- package/web-ui/build/static/csharp-CqlFLWOu.js +1 -0
- package/web-ui/build/static/csharp-D1M9LcKj.js +1 -0
- package/web-ui/build/static/cshtml-BrYce3m1.js +1 -0
- package/web-ui/build/static/csp-DaMDae_q.js +1 -0
- package/web-ui/build/static/csp-DmoB74Pq.js +1 -0
- package/web-ui/build/static/css-Bm-MgPWM.js +1 -0
- package/web-ui/build/static/css-extras-T3f2IfaH.js +1 -0
- package/web-ui/build/static/csv-BgIvUIgl.js +1 -0
- package/web-ui/build/static/cypher-Bsq4PGhM.js +1 -0
- package/web-ui/build/static/d-Qt9QuUvk.js +1 -0
- package/web-ui/build/static/d-h4AYkhsS.js +1 -0
- package/web-ui/build/static/dart-DNDTBaSF.js +1 -0
- package/web-ui/build/static/dart-Dkg8Mtqj.js +1 -0
- package/web-ui/build/static/dataweave-XNvXnB4j.js +1 -0
- package/web-ui/build/static/dax-DAM3HOsu.js +1 -0
- package/web-ui/build/static/delphi-DTzj2E4U.js +1 -0
- package/web-ui/build/static/dhall-Brb1ufqF.js +1 -0
- package/web-ui/build/static/diff-3SMw9VwF.js +1 -0
- package/web-ui/build/static/diff-ssu7Mr2I.js +1 -0
- package/web-ui/build/static/django-CK_xvPUY.js +1 -0
- package/web-ui/build/static/django-D9a4uL_8.js +1 -0
- package/web-ui/build/static/dns-Uvea7PR7.js +1 -0
- package/web-ui/build/static/dns-zone-file-BvD_LLn3.js +1 -0
- package/web-ui/build/static/docker-CC3kvxlv.js +1 -0
- package/web-ui/build/static/dockerfile-BRFh_Hdm.js +1 -0
- package/web-ui/build/static/dos-C-I0-qWQ.js +1 -0
- package/web-ui/build/static/dot-BmS_Nrtr.js +1 -0
- package/web-ui/build/static/dsconfig-CBWgrIVa.js +1 -0
- package/web-ui/build/static/dts-B31mUIV6.js +1 -0
- package/web-ui/build/static/dust-BBtJv286.js +1 -0
- package/web-ui/build/static/ebnf-CCA0ITCE.js +1 -0
- package/web-ui/build/static/ebnf-CeVJpQny.js +1 -0
- package/web-ui/build/static/editorconfig-Nhj95Qci.js +1 -0
- package/web-ui/build/static/eiffel-E7QJBlEz.js +1 -0
- package/web-ui/build/static/ejs-B9gYRoXo.js +1 -0
- package/web-ui/build/static/elixir-CYG1GGGp.js +1 -0
- package/web-ui/build/static/elixir-fNfEypj7.js +1 -0
- package/web-ui/build/static/elm-Td6N7vMU.js +1 -0
- package/web-ui/build/static/elm-v0-mxxuQ.js +1 -0
- package/web-ui/build/static/erb-BO3LQtQx.js +1 -0
- package/web-ui/build/static/erb-ez_pDLEC.js +1 -0
- package/web-ui/build/static/erlang-ChOZ-mbI.js +1 -0
- package/web-ui/build/static/erlang-DCBIueE-.js +1 -0
- package/web-ui/build/static/erlang-repl-CL0-sGxn.js +1 -0
- package/web-ui/build/static/etlua-CQdh26X0.js +1 -0
- package/web-ui/build/static/excel-BbAj2wuJ.js +1 -0
- package/web-ui/build/static/excel-formula-qBXUIcjs.js +1 -0
- package/web-ui/build/static/factor-BPO68YSz.js +1 -0
- package/web-ui/build/static/false-sZ2iLGj-.js +1 -0
- package/web-ui/build/static/firestore-security-rules-BmYLiQGh.js +1 -0
- package/web-ui/build/static/fix-Co_Dnq0A.js +1 -0
- package/web-ui/build/static/flix-DlEWTbVq.js +1 -0
- package/web-ui/build/static/flow-DnsnnZca.js +1 -0
- package/web-ui/build/static/fortran-B4OMllck.js +1 -0
- package/web-ui/build/static/fortran-_8ltaoLA.js +1 -0
- package/web-ui/build/static/fsharp-CY0Ix1iB.js +1 -0
- package/web-ui/build/static/fsharp-y6HOJqAr.js +1 -0
- package/web-ui/build/static/ftl-DvbP9VWU.js +1 -0
- package/web-ui/build/static/gams-DF3rxJoc.js +1 -0
- package/web-ui/build/static/gap-BSje56C-.js +1 -0
- package/web-ui/build/static/gauss-BqYXtLWM.js +1 -0
- package/web-ui/build/static/gcode-CBl-mAWK.js +1 -0
- package/web-ui/build/static/gcode-idSM0RsM.js +1 -0
- package/web-ui/build/static/gdscript-CniY3oYY.js +1 -0
- package/web-ui/build/static/gedcom-C1dJ3jCP.js +1 -0
- package/web-ui/build/static/gherkin-4jaQr3Lt.js +1 -0
- package/web-ui/build/static/gherkin-BRsS35Ed.js +1 -0
- package/web-ui/build/static/git-2a7wzptj.js +1 -0
- package/web-ui/build/static/glsl-Ckv4lBKB.js +1 -0
- package/web-ui/build/static/glsl-CnGjBp6a.js +1 -0
- package/web-ui/build/static/gml-DG3KVI4z.js +1 -0
- package/web-ui/build/static/gml-DxKOOp--.js +1 -0
- package/web-ui/build/static/gn-DmUPMuZR.js +1 -0
- package/web-ui/build/static/go-D8tYdcYa.js +1 -0
- package/web-ui/build/static/go-DpIavxCs.js +1 -0
- package/web-ui/build/static/go-module-BktUPko9.js +1 -0
- package/web-ui/build/static/golo-Ao-diOpI.js +1 -0
- package/web-ui/build/static/gradle-DHJSdPoJ.js +1 -0
- package/web-ui/build/static/graphql-HpsdbKFp.js +1 -0
- package/web-ui/build/static/groovy-B4BrZYtV.js +1 -0
- package/web-ui/build/static/groovy-BCIRzoWJ.js +1 -0
- package/web-ui/build/static/haml-B8Mj6Hex.js +1 -0
- package/web-ui/build/static/haml-Fo-yynuy.js +1 -0
- package/web-ui/build/static/handlebars-BnFawcCU.js +1 -0
- package/web-ui/build/static/handlebars-YZn3MEyv.js +1 -0
- package/web-ui/build/static/haskell-DutAI7D9.js +1 -0
- package/web-ui/build/static/haskell-Dvl0Yw7z.js +1 -0
- package/web-ui/build/static/haxe-6S205Iem.js +1 -0
- package/web-ui/build/static/haxe-aKgbIDi5.js +1 -0
- package/web-ui/build/static/hcl-Dt_vNekv.js +1 -0
- package/web-ui/build/static/hlsl-CupXb_iv.js +1 -0
- package/web-ui/build/static/hoon-Dg19YEzw.js +1 -0
- package/web-ui/build/static/hpkp-DCF8Ff3o.js +1 -0
- package/web-ui/build/static/hsp-D90yiizY.js +1 -0
- package/web-ui/build/static/hsts-Cf63XX0s.js +1 -0
- package/web-ui/build/static/htmlbars-DMbRiSo_.js +1 -0
- package/web-ui/build/static/http-DklRfzP4.js +1 -0
- package/web-ui/build/static/http-U94aUtJB.js +1 -0
- package/web-ui/build/static/hy-B2ESVqxB.js +1 -0
- package/web-ui/build/static/ichigojam-DrVZWL_q.js +1 -0
- package/web-ui/build/static/icon-CMA5sxLF.js +1 -0
- package/web-ui/build/static/icu-message-format-DyfbEZSi.js +1 -0
- package/web-ui/build/static/idris-lCmRODnZ.js +1 -0
- package/web-ui/build/static/iecst-CgrrW0EE.js +1 -0
- package/web-ui/build/static/ignore-BmZ03AWS.js +1 -0
- package/web-ui/build/static/index-CLLrOcOY.js +1 -0
- package/web-ui/build/static/index-Ck0Dg4M1.js +13 -0
- package/web-ui/build/static/index-DOAQiM34.css +1 -0
- package/web-ui/build/static/index-DjtEf-qv.js +1029 -0
- package/web-ui/build/static/inform7-BfOnAvVe.js +1 -0
- package/web-ui/build/static/inform7-JJIIMXTB.js +1 -0
- package/web-ui/build/static/ini-CIKxMbKN.js +1 -0
- package/web-ui/build/static/ini-T3DdG5H-.js +1 -0
- package/web-ui/build/static/io-K9Gdeq6M.js +1 -0
- package/web-ui/build/static/irpf90-BYsCcwwg.js +1 -0
- package/web-ui/build/static/isbl-jcjEwPPP.js +1 -0
- package/web-ui/build/static/j-DSNUhn5G.js +1 -0
- package/web-ui/build/static/java-BKwYwPEk.js +1 -0
- package/web-ui/build/static/java-DuZuc1lQ.js +1 -0
- package/web-ui/build/static/javadoc-Bd8CYqmj.js +1 -0
- package/web-ui/build/static/javadoclike-BcPQURih.js +1 -0
- package/web-ui/build/static/javascript-C7B2Ty3f.js +1 -0
- package/web-ui/build/static/javastacktrace-BRZBpTgb.js +1 -0
- package/web-ui/build/static/jboss-cli-DaXYYeAA.js +1 -0
- package/web-ui/build/static/jexl-oN152m0J.js +1 -0
- package/web-ui/build/static/jolie-BUWtG9eQ.js +1 -0
- package/web-ui/build/static/jq-ooTdhdbC.js +1 -0
- package/web-ui/build/static/js-extras-BQJ_tqbC.js +1 -0
- package/web-ui/build/static/js-templates-xygrVmsG.js +1 -0
- package/web-ui/build/static/jsdoc-BPMuWUGw.js +1 -0
- package/web-ui/build/static/json-DbssHgO1.js +1 -0
- package/web-ui/build/static/json-iOY4SV10.js +1 -0
- package/web-ui/build/static/json5-C_-PZnKE.js +1 -0
- package/web-ui/build/static/jsonp-BQakabW1.js +1 -0
- package/web-ui/build/static/jsstacktrace-DyDuNLl8.js +1 -0
- package/web-ui/build/static/jsx-DCQITdOi.js +1 -0
- package/web-ui/build/static/julia-BF0mftpu.js +1 -0
- package/web-ui/build/static/julia-TT2Hy-Ob.js +1 -0
- package/web-ui/build/static/julia-repl-UBoVaQSD.js +1 -0
- package/web-ui/build/static/keepalived-yNkg9KNG.js +1 -0
- package/web-ui/build/static/keyman-7ModFC-k.js +1 -0
- package/web-ui/build/static/kotlin-BjJgl7UF.js +1 -0
- package/web-ui/build/static/kotlin-GEW2sNY3.js +1 -0
- package/web-ui/build/static/kumir-CeWMdLSX.js +1 -0
- package/web-ui/build/static/kusto-NufgjlVz.js +1 -0
- package/web-ui/build/static/lasso-eUS0tR3e.js +1 -0
- package/web-ui/build/static/latex-C7prlA6j.js +1 -0
- package/web-ui/build/static/latex-Hx35xemv.js +1 -0
- package/web-ui/build/static/latte-Da8RAWgh.js +1 -0
- package/web-ui/build/static/ldif-DZVoiKm3.js +1 -0
- package/web-ui/build/static/leaf-OEtu9dZj.js +1 -0
- package/web-ui/build/static/less-0VwiOSeL.js +1 -0
- package/web-ui/build/static/less-CciyvbHx.js +1 -0
- package/web-ui/build/static/lilypond-blLDi6bC.js +1 -0
- package/web-ui/build/static/liquid-C8_7pWOo.js +1 -0
- package/web-ui/build/static/lisp-Dd28CPVg.js +1 -0
- package/web-ui/build/static/lisp-hWkYuWd0.js +1 -0
- package/web-ui/build/static/livecodeserver-7_v3dVy3.js +1 -0
- package/web-ui/build/static/livescript-B8YdZ4uV.js +1 -0
- package/web-ui/build/static/livescript-dLNrctPK.js +1 -0
- package/web-ui/build/static/llvm-BfTyXy_G.js +1 -0
- package/web-ui/build/static/llvm-CLvUvWLu.js +1 -0
- package/web-ui/build/static/log-DbsxiU9k.js +1 -0
- package/web-ui/build/static/lolcode-CfacgPRH.js +1 -0
- package/web-ui/build/static/lsl-nJWe_8hA.js +1 -0
- package/web-ui/build/static/lua-BzXX-n4X.js +1 -0
- package/web-ui/build/static/lua-Ds6K-rhW.js +1 -0
- package/web-ui/build/static/magma-U4RmSh9f.js +1 -0
- package/web-ui/build/static/makefile-CSCW5rGm.js +1 -0
- package/web-ui/build/static/makefile-kzE_oEn3.js +1 -0
- package/web-ui/build/static/markdown-CalHH_DC.js +1 -0
- package/web-ui/build/static/markdown-Cqr_u0Ad.js +1 -0
- package/web-ui/build/static/markup-templating-BTOI73DQ.js +1 -0
- package/web-ui/build/static/mathematica-NX1KG9I0.js +1 -0
- package/web-ui/build/static/matlab-BAn1HwNV.js +1 -0
- package/web-ui/build/static/matlab-Bdg2LWPm.js +1 -0
- package/web-ui/build/static/maxima-DjRYVgK8.js +1 -0
- package/web-ui/build/static/maxscript-xwiWU5-Z.js +1 -0
- package/web-ui/build/static/mel-BgwB0sDS.js +1 -0
- package/web-ui/build/static/mel-CIouMI9e.js +1 -0
- package/web-ui/build/static/mercury-Do8hrPEb.js +1 -0
- package/web-ui/build/static/mermaid-BGEw9Ybx.js +1 -0
- package/web-ui/build/static/mipsasm-BDqQqoDE.js +1 -0
- package/web-ui/build/static/mizar-7lZfUsYd.js +1 -0
- package/web-ui/build/static/mizar-D7O18zEE.js +1 -0
- package/web-ui/build/static/mojolicious-DqmJjzUO.js +1 -0
- package/web-ui/build/static/mongodb-CXRl7RlT.js +1 -0
- package/web-ui/build/static/monkey-DE9L51qk.js +1 -0
- package/web-ui/build/static/monkey-DM9WNqkW.js +1 -0
- package/web-ui/build/static/moonscript-D8lRTdQE.js +1 -0
- package/web-ui/build/static/moonscript-DFEVxKjh.js +1 -0
- package/web-ui/build/static/n1ql-B3BB__pa.js +1 -0
- package/web-ui/build/static/n1ql-Br4OECGn.js +1 -0
- package/web-ui/build/static/n4js-BPNwKp4U.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-BrjXXFUn.js +1 -0
- package/web-ui/build/static/naniscript-COGKQbvR.js +1 -0
- package/web-ui/build/static/nasm-BHOt34Wi.js +1 -0
- package/web-ui/build/static/neon-CYjyYixT.js +1 -0
- package/web-ui/build/static/nevod-CILFZbPW.js +1 -0
- package/web-ui/build/static/nginx-B7B9La6b.js +1 -0
- package/web-ui/build/static/nginx-Dcs1btfu.js +1 -0
- package/web-ui/build/static/nim-B39Qq_sB.js +1 -0
- package/web-ui/build/static/nim-Cm0o-zEI.js +1 -0
- package/web-ui/build/static/nix-Bb4CX-fQ.js +1 -0
- package/web-ui/build/static/nix-C3bIutdy.js +1 -0
- package/web-ui/build/static/node-repl-BtbNtavi.js +1 -0
- package/web-ui/build/static/nsis-CJpMkpQy.js +1 -0
- package/web-ui/build/static/nsis-h39nQk_L.js +1 -0
- package/web-ui/build/static/objectivec-BIV3Kmu2.js +1 -0
- package/web-ui/build/static/objectivec-CNhpMYiK.js +1 -0
- package/web-ui/build/static/ocaml-Ld6KARDY.js +1 -0
- package/web-ui/build/static/ocaml-upCImTLO.js +1 -0
- package/web-ui/build/static/opencl-CfWJp1hT.js +1 -0
- package/web-ui/build/static/openqasm-i8xT4CAo.js +1 -0
- package/web-ui/build/static/openscad-CzWxpIx6.js +1 -0
- package/web-ui/build/static/oxygene-CCokKj_U.js +1 -0
- package/web-ui/build/static/oz-BBdHXCgw.js +1 -0
- package/web-ui/build/static/parigp-C6n5F4KO.js +1 -0
- package/web-ui/build/static/parser-C2RrTYYO.js +1 -0
- package/web-ui/build/static/parser3-BaAVXypg.js +1 -0
- package/web-ui/build/static/pascal-UeXMBbP2.js +1 -0
- package/web-ui/build/static/pascaligo-CYD4ZqHc.js +1 -0
- package/web-ui/build/static/pcaxis-CuN2yCzi.js +1 -0
- package/web-ui/build/static/peoplecode-H1Adh-ll.js +1 -0
- package/web-ui/build/static/perl-DCyTMUn2.js +1 -0
- package/web-ui/build/static/perl-V4mDd6YP.js +1 -0
- package/web-ui/build/static/pf-5iH6Mo1D.js +1 -0
- package/web-ui/build/static/pgsql-CrmNuytU.js +1 -0
- package/web-ui/build/static/php-AWteRwUZ.js +1 -0
- package/web-ui/build/static/php-B-dr82M2.js +1 -0
- package/web-ui/build/static/php-extras-CVQI7yIC.js +1 -0
- package/web-ui/build/static/php-template-BW_DclRa.js +1 -0
- package/web-ui/build/static/phpdoc-Cfv3EM5F.js +1 -0
- package/web-ui/build/static/plaintext-CyfmYRWM.js +1 -0
- package/web-ui/build/static/plsql-DIfiFLDw.js +1 -0
- package/web-ui/build/static/pony-DjBwB1l2.js +1 -0
- package/web-ui/build/static/powerquery-D80luSMu.js +1 -0
- package/web-ui/build/static/powershell-Cai1oPSE.js +1 -0
- package/web-ui/build/static/powershell-qk5MHehm.js +1 -0
- package/web-ui/build/static/processing-DGNtNe05.js +1 -0
- package/web-ui/build/static/processing-DHK3kwAe.js +1 -0
- package/web-ui/build/static/profile-D6MBLt-p.js +1 -0
- package/web-ui/build/static/prolog-CqKHjX9T.js +1 -0
- package/web-ui/build/static/prolog-CwAlj8yp.js +1 -0
- package/web-ui/build/static/promql-Cwo7B1q9.js +1 -0
- package/web-ui/build/static/properties-03DbKSuC.js +1 -0
- package/web-ui/build/static/properties-BlFjiqSF.js +1 -0
- package/web-ui/build/static/protobuf-DFZRRGno.js +1 -0
- package/web-ui/build/static/protobuf-D_GKOSo6.js +1 -0
- package/web-ui/build/static/psl-RSBmgd7b.js +1 -0
- package/web-ui/build/static/pug-DzBjT8h1.js +1 -0
- package/web-ui/build/static/puppet-BwyNySh7.js +1 -0
- package/web-ui/build/static/puppet-CHJRn6Na.js +1 -0
- package/web-ui/build/static/pure-XbBeN0U7.js +1 -0
- package/web-ui/build/static/purebasic-BeRgP1y5.js +1 -0
- package/web-ui/build/static/purebasic-XGD8k1X_.js +1 -0
- package/web-ui/build/static/purescript-DPej8C9k.js +1 -0
- package/web-ui/build/static/python-DK4CPbFS.js +1 -0
- package/web-ui/build/static/python-repl-BDrlZxhA.js +1 -0
- package/web-ui/build/static/python-sRExKvGw.js +1 -0
- package/web-ui/build/static/q-B8K1uEtE.js +1 -0
- package/web-ui/build/static/q-iptUl3TG.js +1 -0
- package/web-ui/build/static/qml-Ck-8E28D.js +1 -0
- package/web-ui/build/static/qml-DapR8Kud.js +1 -0
- package/web-ui/build/static/qore-Bq2u6ALt.js +1 -0
- package/web-ui/build/static/qsharp-C9FGwAhI.js +1 -0
- package/web-ui/build/static/r-B8PZ1lyW.js +1 -0
- package/web-ui/build/static/r-jsXxivRe.js +1 -0
- package/web-ui/build/static/racket-BW1YY6oG.js +1 -0
- package/web-ui/build/static/reason-CGrwEH7Y.js +1 -0
- package/web-ui/build/static/reasonml-D2S9u5tv.js +1 -0
- package/web-ui/build/static/regex-Bx_rkaF-.js +1 -0
- package/web-ui/build/static/rego-DYSQb1aU.js +1 -0
- package/web-ui/build/static/renpy-DoEOEpqT.js +1 -0
- package/web-ui/build/static/rest-6xfrLQ1u.js +1 -0
- package/web-ui/build/static/rib-BH2XAOdJ.js +1 -0
- package/web-ui/build/static/rip-BOcHDByA.js +1 -0
- package/web-ui/build/static/roboconf-8nB4fpob.js +1 -0
- package/web-ui/build/static/roboconf-BjKYzQ_Z.js +1 -0
- package/web-ui/build/static/robotframework-BIAT2wY6.js +1 -0
- package/web-ui/build/static/routeros-Bt6cTmB2.js +1 -0
- package/web-ui/build/static/rsl-XvWWVxz_.js +1 -0
- package/web-ui/build/static/ruby-CEfc9tVA.js +1 -0
- package/web-ui/build/static/ruby-CKNSKxB1.js +1 -0
- package/web-ui/build/static/ruleslanguage-tpn62qMj.js +1 -0
- package/web-ui/build/static/rust-Cb-H3ah6.js +1 -0
- package/web-ui/build/static/rust-CmAiRDXU.js +1 -0
- package/web-ui/build/static/sas-6JRKVKN4.js +1 -0
- package/web-ui/build/static/sas-BnSXGxyB.js +1 -0
- package/web-ui/build/static/sass-RPp8p1Ef.js +1 -0
- package/web-ui/build/static/scala-BjZ--04s.js +1 -0
- package/web-ui/build/static/scala-CbHbqC82.js +1 -0
- package/web-ui/build/static/scheme-51taSudc.js +1 -0
- package/web-ui/build/static/scheme-FF2J1d7z.js +1 -0
- package/web-ui/build/static/scilab-CSU1i7r7.js +1 -0
- package/web-ui/build/static/scss-Bf9-1Rwp.js +1 -0
- package/web-ui/build/static/scss-kWs2GBCV.js +1 -0
- package/web-ui/build/static/shell-B6aH0_VB.js +1 -0
- package/web-ui/build/static/shell-session-42tFBoqK.js +1 -0
- package/web-ui/build/static/smali-BTC2VGoh.js +1 -0
- package/web-ui/build/static/smali-CFCAUthF.js +1 -0
- package/web-ui/build/static/smalltalk-C4Z4p5Ld.js +1 -0
- package/web-ui/build/static/smalltalk-DS9teHSb.js +1 -0
- package/web-ui/build/static/smarty-9tLXgYFw.js +1 -0
- package/web-ui/build/static/sml-CvQCOzHl.js +1 -0
- package/web-ui/build/static/sml-D7VN7gLP.js +1 -0
- package/web-ui/build/static/solidity-C8mgaeFG.js +1 -0
- package/web-ui/build/static/solution-file-BW6eSi9-.js +1 -0
- package/web-ui/build/static/soy-iYu8WojY.js +1 -0
- package/web-ui/build/static/sparql-fr7u_sdF.js +1 -0
- package/web-ui/build/static/splunk-spl-C1ELr7BN.js +1 -0
- package/web-ui/build/static/sqf-8e9uVb30.js +1 -0
- package/web-ui/build/static/sqf-CWavw2F4.js +1 -0
- package/web-ui/build/static/sql-DC_QvrP2.js +1 -0
- package/web-ui/build/static/sql-yLctL19P.js +1 -0
- package/web-ui/build/static/sql_more-KfXMatfe.js +1 -0
- package/web-ui/build/static/squirrel-Bjd69daG.js +1 -0
- package/web-ui/build/static/stan-CaplZnB-.js +1 -0
- package/web-ui/build/static/stan-UYitmAjw.js +1 -0
- package/web-ui/build/static/stata-Beng42ZG.js +1 -0
- package/web-ui/build/static/step21-jqm1hcSr.js +1 -0
- package/web-ui/build/static/stylus-DB7RdP7s.js +1 -0
- package/web-ui/build/static/stylus-IFC9sMcH.js +1 -0
- package/web-ui/build/static/subunit-B75tNAV5.js +1 -0
- package/web-ui/build/static/swift-BRcicKMn.js +1 -0
- package/web-ui/build/static/swift-s8OoLWy_.js +1 -0
- package/web-ui/build/static/systemd-BC7VQvFw.js +1 -0
- package/web-ui/build/static/t4-cs-C6aVcIEq.js +1 -0
- package/web-ui/build/static/t4-templating-cVFAPDZQ.js +1 -0
- package/web-ui/build/static/t4-vb-DwpqTEJL.js +1 -0
- package/web-ui/build/static/taggerscript-GaB8ayWT.js +1 -0
- package/web-ui/build/static/tap-DN_-tQNk.js +1 -0
- package/web-ui/build/static/tap-XgwFSVSK.js +1 -0
- package/web-ui/build/static/tcl-D6eT7YQe.js +1 -0
- package/web-ui/build/static/tcl-DiEmh3pJ.js +1 -0
- package/web-ui/build/static/textile-cNMT-4v2.js +1 -0
- package/web-ui/build/static/thrift-DTgTgcBm.js +1 -0
- package/web-ui/build/static/toml-B8XPB_4B.js +1 -0
- package/web-ui/build/static/tp-NpmS9CLR.js +1 -0
- package/web-ui/build/static/tremor-OVZ172ee.js +1 -0
- package/web-ui/build/static/tsx-B1xtIV1E.js +1 -0
- package/web-ui/build/static/tt2-DITHT_e6.js +1 -0
- package/web-ui/build/static/turtle-D3IrO7qu.js +1 -0
- package/web-ui/build/static/twig-Bwmu1-US.js +1 -0
- package/web-ui/build/static/twig-CmWIdHrv.js +1 -0
- package/web-ui/build/static/typescript-BI4GgjOm.js +1 -0
- package/web-ui/build/static/typescript-D6hycyND.js +1 -0
- package/web-ui/build/static/typoscript-5S0Q3h4I.js +1 -0
- package/web-ui/build/static/unrealscript-CaROCOEp.js +1 -0
- package/web-ui/build/static/uorazor-VyIQ6lvW.js +1 -0
- package/web-ui/build/static/uri-DDdjLj4-.js +1 -0
- package/web-ui/build/static/v-CzPHqjdM.js +1 -0
- package/web-ui/build/static/vala-CRK3Oxn2.js +1 -0
- package/web-ui/build/static/vala-DTG5j_IY.js +1 -0
- package/web-ui/build/static/vbnet-C6z8S410.js +1 -0
- package/web-ui/build/static/vbnet-cWNTX8Og.js +1 -0
- package/web-ui/build/static/vbscript-CyA_PhGn.js +1 -0
- package/web-ui/build/static/vbscript-html-CidnweeC.js +1 -0
- package/web-ui/build/static/velocity-Dp6ZU1nS.js +1 -0
- package/web-ui/build/static/verilog-CilE-jD9.js +1 -0
- package/web-ui/build/static/verilog-RAde9Uda.js +1 -0
- package/web-ui/build/static/vhdl-CHS4lDo8.js +1 -0
- package/web-ui/build/static/vhdl-D5o9ErDa.js +1 -0
- package/web-ui/build/static/vim-B8jwaGJ6.js +1 -0
- package/web-ui/build/static/vim-BZrCpxwn.js +1 -0
- package/web-ui/build/static/visual-basic-By6WIP3n.js +1 -0
- package/web-ui/build/static/warpscript-BQF8R5WL.js +1 -0
- package/web-ui/build/static/wasm-DJyk23np.js +1 -0
- package/web-ui/build/static/web-idl-DezqVYtV.js +1 -0
- package/web-ui/build/static/wiki-CiJcHWqV.js +1 -0
- package/web-ui/build/static/wolfram-DjwPz6pa.js +1 -0
- package/web-ui/build/static/wren-lzb3aV3F.js +1 -0
- package/web-ui/build/static/x86asm-CCNfO4dU.js +1 -0
- package/web-ui/build/static/xeora-CRaNjAb0.js +1 -0
- package/web-ui/build/static/xl-CRqWPyuc.js +1 -0
- package/web-ui/build/static/xml-Uuta5J77.js +1 -0
- package/web-ui/build/static/xml-doc-Drc3ho9Y.js +1 -0
- package/web-ui/build/static/xojo-D2WT5Q0J.js +1 -0
- package/web-ui/build/static/xquery-CwB9Zxcf.js +1 -0
- package/web-ui/build/static/xquery-DA5NuZxN.js +1 -0
- package/web-ui/build/static/yaml-DJMpA9ia.js +1 -0
- package/web-ui/build/static/yaml-DxiY0s1_.js +1 -0
- package/web-ui/build/static/yang-DPrwGYlZ.js +1 -0
- package/web-ui/build/static/zephir-DOfPWp4I.js +1 -0
- package/web-ui/build/static/zig-BE1mX447.js +1 -0
- package/web-ui/build/static/1c-C_9olPfq.js +0 -1
- package/web-ui/build/static/abap--DeFI1OC.js +0 -1
- package/web-ui/build/static/abnf-5HzSmxRy.js +0 -1
- package/web-ui/build/static/abnf-IG-O3NHT.js +0 -1
- package/web-ui/build/static/accesslog-qO_3I5IJ.js +0 -1
- package/web-ui/build/static/actionscript-DbFc2Uxo.js +0 -1
- package/web-ui/build/static/actionscript-jU7xUh7w.js +0 -1
- package/web-ui/build/static/ada-DBOzyNDe.js +0 -1
- package/web-ui/build/static/ada-F0QwXh2e.js +0 -1
- package/web-ui/build/static/agda-Drhr_GYC.js +0 -1
- package/web-ui/build/static/al-bEatcrqU.js +0 -1
- package/web-ui/build/static/angelscript-Bp0mqasc.js +0 -1
- package/web-ui/build/static/antlr4-BCvixOqW.js +0 -1
- package/web-ui/build/static/apache-zSeWcGFf.js +0 -1
- package/web-ui/build/static/apacheconf-CEDX0qIZ.js +0 -1
- package/web-ui/build/static/apex-BHlvjPxZ.js +0 -1
- package/web-ui/build/static/apl-S86eLVnh.js +0 -1
- package/web-ui/build/static/applescript-D15JiHTt.js +0 -1
- package/web-ui/build/static/applescript-D6g2nIGs.js +0 -1
- package/web-ui/build/static/aql-C4SWmhk2.js +0 -1
- package/web-ui/build/static/arcade-DrwRCCCh.js +0 -1
- package/web-ui/build/static/arduino-Blsw4-hb.js +0 -1
- package/web-ui/build/static/arduino-s6CYn6L3.js +0 -1
- package/web-ui/build/static/arff-DnrfdsTx.js +0 -1
- package/web-ui/build/static/armasm-C2WK9q2y.js +0 -1
- package/web-ui/build/static/asciidoc-BiY2pDol.js +0 -1
- package/web-ui/build/static/asciidoc-DG128-Q1.js +0 -1
- package/web-ui/build/static/asm6502-BEAW0Cck.js +0 -1
- package/web-ui/build/static/asmatmel-C4v7boSu.js +0 -1
- package/web-ui/build/static/aspectj-Bfek529B.js +0 -1
- package/web-ui/build/static/aspnet-8K2PeLn2.js +0 -1
- package/web-ui/build/static/autohotkey-BHw78HYu.js +0 -1
- package/web-ui/build/static/autohotkey-C5DDQtDL.js +0 -1
- package/web-ui/build/static/autoit-CgsSmQkF.js +0 -1
- package/web-ui/build/static/autoit-DZ7IS_9i.js +0 -1
- package/web-ui/build/static/avisynth-B20WuEUg.js +0 -1
- package/web-ui/build/static/avrasm-C7TrcWBg.js +0 -1
- package/web-ui/build/static/avro-idl-CfDy8XWE.js +0 -1
- package/web-ui/build/static/awk-cjY-7p5o.js +0 -1
- package/web-ui/build/static/axapta-Bu9INQG2.js +0 -1
- package/web-ui/build/static/bash-B998wxy_.js +0 -1
- package/web-ui/build/static/bash-LE6roX2s.js +0 -1
- package/web-ui/build/static/basic-Cd6-vDdH.js +0 -1
- package/web-ui/build/static/basic-mfY-ovnp.js +0 -1
- package/web-ui/build/static/batch-DxVy2cwv.js +0 -1
- package/web-ui/build/static/bbcode-Ct3Yu8De.js +0 -1
- package/web-ui/build/static/bicep-CexPoMEW.js +0 -1
- package/web-ui/build/static/birb-CH1RMpPI.js +0 -1
- package/web-ui/build/static/bison-XQFuPB_Q.js +0 -1
- package/web-ui/build/static/bnf-CIDGmY3l.js +0 -1
- package/web-ui/build/static/bnf-DjN_FU2s.js +0 -1
- package/web-ui/build/static/brainfuck-Cu_hvayi.js +0 -1
- package/web-ui/build/static/brainfuck-eRbe4_qo.js +0 -1
- package/web-ui/build/static/brightscript-Cdq0ttTN.js +0 -1
- package/web-ui/build/static/bro-D3aio8LS.js +0 -1
- package/web-ui/build/static/bsl-DFEwVZ2J.js +0 -1
- package/web-ui/build/static/c-D6RK1vhn.js +0 -1
- package/web-ui/build/static/c-DUcBA02q.js +0 -1
- package/web-ui/build/static/c-like-BApJDFwD.js +0 -1
- package/web-ui/build/static/cal-Ckv8Qnpw.js +0 -1
- package/web-ui/build/static/capnproto-DCoblEyS.js +0 -1
- package/web-ui/build/static/ceylon-DM-zZDWY.js +0 -1
- package/web-ui/build/static/cfscript-CMoOAgUK.js +0 -1
- package/web-ui/build/static/chaiscript-B3Vl3wGb.js +0 -1
- package/web-ui/build/static/cil-ChEi_uFO.js +0 -1
- package/web-ui/build/static/clean-BtA08oDV.js +0 -1
- package/web-ui/build/static/clojure-CWMlf7lJ.js +0 -1
- package/web-ui/build/static/clojure-Vur8C4jr.js +0 -1
- package/web-ui/build/static/clojure-repl-BsfGHdYy.js +0 -1
- package/web-ui/build/static/cmake-Csgl_IVr.js +0 -1
- package/web-ui/build/static/cmake-DFMKvwxy.js +0 -1
- package/web-ui/build/static/cobol-XhlGrCrW.js +0 -1
- package/web-ui/build/static/coffeescript-DYldGW35.js +0 -1
- package/web-ui/build/static/coffeescript-DvbNKwrC.js +0 -1
- package/web-ui/build/static/concurnas-DjALqCYn.js +0 -1
- package/web-ui/build/static/coq-D9QGJI6g.js +0 -1
- package/web-ui/build/static/coq-fAZpoc7i.js +0 -1
- package/web-ui/build/static/cos-GgM7WWVZ.js +0 -1
- package/web-ui/build/static/cpp-Cgt5qqfd.js +0 -1
- package/web-ui/build/static/cpp-DxVcOuBe.js +0 -1
- package/web-ui/build/static/crmsh-BlZWnzbY.js +0 -1
- package/web-ui/build/static/crystal--H7HLAQf.js +0 -1
- package/web-ui/build/static/crystal-DWm0bbUT.js +0 -1
- package/web-ui/build/static/csharp-8dr-wktE.js +0 -1
- package/web-ui/build/static/csharp-DFuHLPFe.js +0 -1
- package/web-ui/build/static/cshtml-C-L4_dy2.js +0 -1
- package/web-ui/build/static/csp-CJ6qbecO.js +0 -1
- package/web-ui/build/static/csp-DswTy-5u.js +0 -1
- package/web-ui/build/static/css-DdRPdKXQ.js +0 -1
- package/web-ui/build/static/css-extras-DMwOZFrB.js +0 -1
- package/web-ui/build/static/csv-BiWlhIMC.js +0 -1
- package/web-ui/build/static/cypher-ByNaJKO8.js +0 -1
- package/web-ui/build/static/d-BR89VlK-.js +0 -1
- package/web-ui/build/static/d-KlWvBc4w.js +0 -1
- package/web-ui/build/static/dart-BIsk7m6o.js +0 -1
- package/web-ui/build/static/dart-BnyP1Rjp.js +0 -1
- package/web-ui/build/static/dataweave-CH_Q2gWX.js +0 -1
- package/web-ui/build/static/dax-wulX9uc-.js +0 -1
- package/web-ui/build/static/delphi-CFowdk_A.js +0 -1
- package/web-ui/build/static/dhall-BfCOemEp.js +0 -1
- package/web-ui/build/static/diff-DQD2zPaG.js +0 -1
- package/web-ui/build/static/diff-DZoEdrYM.js +0 -1
- package/web-ui/build/static/django-B0j973Kw.js +0 -1
- package/web-ui/build/static/django-CYScL320.js +0 -1
- package/web-ui/build/static/dns-DoECkAgz.js +0 -1
- package/web-ui/build/static/dns-zone-file-CuoIcXgj.js +0 -1
- package/web-ui/build/static/docker-C2nfXTBG.js +0 -1
- package/web-ui/build/static/dockerfile-DBalxIH7.js +0 -1
- package/web-ui/build/static/dos-GNL9IdmL.js +0 -1
- package/web-ui/build/static/dot-rKuRS-PS.js +0 -1
- package/web-ui/build/static/dsconfig-CKmenTFr.js +0 -1
- package/web-ui/build/static/dts-AxT2qjQU.js +0 -1
- package/web-ui/build/static/dust-DpqHWPC4.js +0 -1
- package/web-ui/build/static/ebnf-CONEMpLp.js +0 -1
- package/web-ui/build/static/ebnf-DRWcOs8R.js +0 -1
- package/web-ui/build/static/editorconfig-lmLHmECZ.js +0 -1
- package/web-ui/build/static/eiffel-B39e31fw.js +0 -1
- package/web-ui/build/static/ejs-DtJwpVdo.js +0 -1
- package/web-ui/build/static/elixir-BH4JTqa9.js +0 -1
- package/web-ui/build/static/elixir-aH1DLjYD.js +0 -1
- package/web-ui/build/static/elm-BcCGkSrW.js +0 -1
- package/web-ui/build/static/elm-CCrB1JbX.js +0 -1
- package/web-ui/build/static/erb-CcumI1K3.js +0 -1
- package/web-ui/build/static/erb-_HK77hx-.js +0 -1
- package/web-ui/build/static/erlang-B1qxMZZp.js +0 -1
- package/web-ui/build/static/erlang-CCM_ejO_.js +0 -1
- package/web-ui/build/static/erlang-repl-D1zC2Zf6.js +0 -1
- package/web-ui/build/static/etlua-HJMRx9x7.js +0 -1
- package/web-ui/build/static/excel-DqXCKUKa.js +0 -1
- package/web-ui/build/static/excel-formula-oNw1T5Gi.js +0 -1
- package/web-ui/build/static/factor-BrTp5FZH.js +0 -1
- package/web-ui/build/static/false-CAVqV3ok.js +0 -1
- package/web-ui/build/static/firestore-security-rules-CxTofGT0.js +0 -1
- package/web-ui/build/static/fix-BMooo7-3.js +0 -1
- package/web-ui/build/static/flix-DR5Pi_4n.js +0 -1
- package/web-ui/build/static/flow-BoCWpUCW.js +0 -1
- package/web-ui/build/static/fortran-B9JI5ahV.js +0 -1
- package/web-ui/build/static/fortran-LXg81aOn.js +0 -1
- package/web-ui/build/static/fsharp-BqcGG-SM.js +0 -1
- package/web-ui/build/static/fsharp-Dj5YVL_h.js +0 -1
- package/web-ui/build/static/ftl-kuY7uFR8.js +0 -1
- package/web-ui/build/static/gams-CzihHKqE.js +0 -1
- package/web-ui/build/static/gap-BbS0A-Wl.js +0 -1
- package/web-ui/build/static/gauss-BauwG_O4.js +0 -1
- package/web-ui/build/static/gcode-VY1OKBcC.js +0 -1
- package/web-ui/build/static/gcode-lapsLgV5.js +0 -1
- package/web-ui/build/static/gdscript-1UIYB8m0.js +0 -1
- package/web-ui/build/static/gedcom-Bhrxt1LM.js +0 -1
- package/web-ui/build/static/gherkin-BsUD3vJB.js +0 -1
- package/web-ui/build/static/gherkin-hj_asmFX.js +0 -1
- package/web-ui/build/static/git-DXIrRKzR.js +0 -1
- package/web-ui/build/static/glsl-Bww3i9-P.js +0 -1
- package/web-ui/build/static/glsl-tW4hvcaQ.js +0 -1
- package/web-ui/build/static/gml-BIqshajA.js +0 -1
- package/web-ui/build/static/gml-CQqc9F-B.js +0 -1
- package/web-ui/build/static/gn-CBgpy8B9.js +0 -1
- package/web-ui/build/static/go-CEUAUIgn.js +0 -1
- package/web-ui/build/static/go-DPEd33Yn.js +0 -1
- package/web-ui/build/static/go-module-BVPbZOg5.js +0 -1
- package/web-ui/build/static/golo-CqB3OATq.js +0 -1
- package/web-ui/build/static/gradle-Djj_6FTv.js +0 -1
- package/web-ui/build/static/graphql-ymSYYmmE.js +0 -1
- package/web-ui/build/static/groovy-BLoXi1Ew.js +0 -1
- package/web-ui/build/static/groovy-D8ua3DVO.js +0 -1
- package/web-ui/build/static/haml-DKlxHs26.js +0 -1
- package/web-ui/build/static/haml-S_iUNysn.js +0 -1
- package/web-ui/build/static/handlebars-B7tcAMGB.js +0 -1
- package/web-ui/build/static/handlebars-CV-zB05N.js +0 -1
- package/web-ui/build/static/haskell-CMxCwdZX.js +0 -1
- package/web-ui/build/static/haskell-Dis6rGJ5.js +0 -1
- package/web-ui/build/static/haxe-C76IK5YN.js +0 -1
- package/web-ui/build/static/haxe-hbmD2uei.js +0 -1
- package/web-ui/build/static/hcl-BPI_t80W.js +0 -1
- package/web-ui/build/static/hlsl-BmeH3MXM.js +0 -1
- package/web-ui/build/static/hoon-BYLX7KiR.js +0 -1
- package/web-ui/build/static/hpkp-CFV1lvIV.js +0 -1
- package/web-ui/build/static/hsp-_VXPtQPw.js +0 -1
- package/web-ui/build/static/hsts-DzmFog1b.js +0 -1
- package/web-ui/build/static/htmlbars-uX8JubPS.js +0 -1
- package/web-ui/build/static/http-BTDAHgkv.js +0 -1
- package/web-ui/build/static/http-Ba1gTHCW.js +0 -1
- package/web-ui/build/static/hy-G7MK4TLb.js +0 -1
- package/web-ui/build/static/ichigojam-BKKN56jZ.js +0 -1
- package/web-ui/build/static/icon-nrqdEYwB.js +0 -1
- package/web-ui/build/static/icu-message-format-Bjone7XH.js +0 -1
- package/web-ui/build/static/idris-CKkY_0op.js +0 -1
- package/web-ui/build/static/iecst-EV3ZvBDC.js +0 -1
- package/web-ui/build/static/ignore-LJIbInke.js +0 -1
- package/web-ui/build/static/index-C1x426Pt.js +0 -734
- package/web-ui/build/static/index-CTzeYMwr.js +0 -13
- package/web-ui/build/static/index-CUBjz1OL.css +0 -1
- package/web-ui/build/static/index-DnVIkRiR.js +0 -1
- package/web-ui/build/static/inform7-BiW6HbUl.js +0 -1
- package/web-ui/build/static/inform7-DT-x6SRD.js +0 -1
- package/web-ui/build/static/ini-BbnHjAtW.js +0 -1
- package/web-ui/build/static/ini-DuNY7Iqz.js +0 -1
- package/web-ui/build/static/io-BquAtlCB.js +0 -1
- package/web-ui/build/static/irpf90-CZELNeJl.js +0 -1
- package/web-ui/build/static/isbl-DhOgOzai.js +0 -1
- package/web-ui/build/static/j-r8D3BrBj.js +0 -1
- package/web-ui/build/static/java-MjQ5EBN5.js +0 -1
- package/web-ui/build/static/java-c3Jyc0B6.js +0 -1
- package/web-ui/build/static/javadoc-CfNFziRD.js +0 -1
- package/web-ui/build/static/javadoclike-BUcJZQAh.js +0 -1
- package/web-ui/build/static/javascript-CL_4g6j3.js +0 -1
- package/web-ui/build/static/javastacktrace-4P_J-58S.js +0 -1
- package/web-ui/build/static/jboss-cli-DUfK88hO.js +0 -1
- package/web-ui/build/static/jexl-DsSijmcs.js +0 -1
- package/web-ui/build/static/jolie-DjtNIZB4.js +0 -1
- package/web-ui/build/static/jq-BXdSm79y.js +0 -1
- package/web-ui/build/static/js-extras-B-C7ngCD.js +0 -1
- package/web-ui/build/static/js-templates-CmPAiwFC.js +0 -1
- package/web-ui/build/static/jsdoc-CkiXOOMV.js +0 -1
- package/web-ui/build/static/json-Bmvhezfj.js +0 -1
- package/web-ui/build/static/json-HPR8wBiw.js +0 -1
- package/web-ui/build/static/json5-Chcg9nnQ.js +0 -1
- package/web-ui/build/static/jsonp-C3KWcfzJ.js +0 -1
- package/web-ui/build/static/jsstacktrace-D1jRFy-S.js +0 -1
- package/web-ui/build/static/jsx-COtCqQ_9.js +0 -1
- package/web-ui/build/static/julia-BVvfw2TB.js +0 -1
- package/web-ui/build/static/julia-Ddalvdoa.js +0 -1
- package/web-ui/build/static/julia-repl-Bc-uwnIZ.js +0 -1
- package/web-ui/build/static/keepalived-CJ9ZYuQx.js +0 -1
- package/web-ui/build/static/keyman-BHea-dB6.js +0 -1
- package/web-ui/build/static/kotlin-DWOyCb_2.js +0 -1
- package/web-ui/build/static/kotlin-fvMiFIS3.js +0 -1
- package/web-ui/build/static/kumir-DaNls7gN.js +0 -1
- package/web-ui/build/static/kusto-DKweJuKl.js +0 -1
- package/web-ui/build/static/lasso-BB9dUrv_.js +0 -1
- package/web-ui/build/static/latex-C7U5RUQQ.js +0 -1
- package/web-ui/build/static/latex-CXM3EEy0.js +0 -1
- package/web-ui/build/static/latte-B4pEA635.js +0 -1
- package/web-ui/build/static/ldif-D3wYig10.js +0 -1
- package/web-ui/build/static/leaf-uFkjT9sR.js +0 -1
- package/web-ui/build/static/less-CbUH4jBX.js +0 -1
- package/web-ui/build/static/less-DEGyfeZn.js +0 -1
- package/web-ui/build/static/lilypond-UuoBjShK.js +0 -1
- package/web-ui/build/static/liquid-DB3a9n7S.js +0 -1
- package/web-ui/build/static/lisp-BDbj7Kd2.js +0 -1
- package/web-ui/build/static/lisp-D3T0YOb1.js +0 -1
- package/web-ui/build/static/livecodeserver-CkZMVLmr.js +0 -1
- package/web-ui/build/static/livescript-CJbtbTfA.js +0 -1
- package/web-ui/build/static/livescript-CdWg1xgf.js +0 -1
- package/web-ui/build/static/llvm-8hpjZ6qF.js +0 -1
- package/web-ui/build/static/llvm-DPpuma6i.js +0 -1
- package/web-ui/build/static/log-DwsLgecp.js +0 -1
- package/web-ui/build/static/lolcode-D3tkyiVB.js +0 -1
- package/web-ui/build/static/lsl-BBM4ZYza.js +0 -1
- package/web-ui/build/static/lua-DT0su8pZ.js +0 -1
- package/web-ui/build/static/lua-DqZXmUwn.js +0 -1
- package/web-ui/build/static/magma-DGW0-GCr.js +0 -1
- package/web-ui/build/static/makefile-C_K7AaVw.js +0 -1
- package/web-ui/build/static/makefile-CarddjPJ.js +0 -1
- package/web-ui/build/static/markdown-3dq-8I9T.js +0 -1
- package/web-ui/build/static/markdown-c4VYoNo2.js +0 -1
- package/web-ui/build/static/markup-templating-BBX0gWS5.js +0 -1
- package/web-ui/build/static/mathematica-n-aqoCbO.js +0 -1
- package/web-ui/build/static/matlab-B_kYC-A2.js +0 -1
- package/web-ui/build/static/matlab-CQP2D_0j.js +0 -1
- package/web-ui/build/static/maxima-piaAhCcP.js +0 -1
- package/web-ui/build/static/maxscript-CkxNZR1a.js +0 -1
- package/web-ui/build/static/mel-BXbrV0aU.js +0 -1
- package/web-ui/build/static/mel-CBSpVZcl.js +0 -1
- package/web-ui/build/static/mercury-CffeC87B.js +0 -1
- package/web-ui/build/static/mermaid-DAZcfksM.js +0 -1
- package/web-ui/build/static/mipsasm-DvOPoNgz.js +0 -1
- package/web-ui/build/static/mizar-C2ki99qc.js +0 -1
- package/web-ui/build/static/mizar-C5AXRrsD.js +0 -1
- package/web-ui/build/static/mojolicious-DklqV-uP.js +0 -1
- package/web-ui/build/static/mongodb-BbuSPlN0.js +0 -1
- package/web-ui/build/static/monkey-CJBb2-mV.js +0 -1
- package/web-ui/build/static/monkey-DgERCZQd.js +0 -1
- package/web-ui/build/static/moonscript-BovBU9jW.js +0 -1
- package/web-ui/build/static/moonscript-lPqbcjjy.js +0 -1
- package/web-ui/build/static/n1ql-CjVXW0Z0.js +0 -1
- package/web-ui/build/static/n1ql-DkfG2dTH.js +0 -1
- package/web-ui/build/static/n4js-6L9QW_kw.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-CqohGHfB.js +0 -1
- package/web-ui/build/static/naniscript-CIvQ6y1b.js +0 -1
- package/web-ui/build/static/nasm-CQbJbZZf.js +0 -1
- package/web-ui/build/static/neon-Cz41RJxQ.js +0 -1
- package/web-ui/build/static/nevod-WPRJ2Q9j.js +0 -1
- package/web-ui/build/static/nginx-BL2wPbD-.js +0 -1
- package/web-ui/build/static/nginx-DsqC_gQT.js +0 -1
- package/web-ui/build/static/nim-7qnwzYm_.js +0 -1
- package/web-ui/build/static/nim-D6iDo5H6.js +0 -1
- package/web-ui/build/static/nix-BQSsaH-G.js +0 -1
- package/web-ui/build/static/nix-DgwCtjpD.js +0 -1
- package/web-ui/build/static/node-repl-Cb4w8DbD.js +0 -1
- package/web-ui/build/static/nsis-CiXZWrqR.js +0 -1
- package/web-ui/build/static/nsis-CuwGI5px.js +0 -1
- package/web-ui/build/static/objectivec-DZXCqQ1J.js +0 -1
- package/web-ui/build/static/objectivec-GNGh-wiY.js +0 -1
- package/web-ui/build/static/ocaml-BPg_ANkr.js +0 -1
- package/web-ui/build/static/ocaml-DRUpaN8p.js +0 -1
- package/web-ui/build/static/opencl-CazTs_sf.js +0 -1
- package/web-ui/build/static/openqasm-DHuuXGjm.js +0 -1
- package/web-ui/build/static/openscad-YbvBFeLc.js +0 -1
- package/web-ui/build/static/oxygene-DDzgbCaQ.js +0 -1
- package/web-ui/build/static/oz-BRDBLIjx.js +0 -1
- package/web-ui/build/static/parigp-BbApdos7.js +0 -1
- package/web-ui/build/static/parser-CbVH4ySK.js +0 -1
- package/web-ui/build/static/parser3-BIkvuuuE.js +0 -1
- package/web-ui/build/static/pascal-oS7U_3sO.js +0 -1
- package/web-ui/build/static/pascaligo-57DdFj76.js +0 -1
- package/web-ui/build/static/pcaxis-V-Euf0DV.js +0 -1
- package/web-ui/build/static/peoplecode-DjyRW5V8.js +0 -1
- package/web-ui/build/static/perl-BEQWvjeP.js +0 -1
- package/web-ui/build/static/perl-CiDHRorC.js +0 -1
- package/web-ui/build/static/pf-S5x_U1LC.js +0 -1
- package/web-ui/build/static/pgsql-DwHZC-iy.js +0 -1
- package/web-ui/build/static/php-7enmlb-I.js +0 -1
- package/web-ui/build/static/php-extras-BhRDMlXE.js +0 -1
- package/web-ui/build/static/php-kIwfq-Jj.js +0 -1
- package/web-ui/build/static/php-template-M2RrZc1R.js +0 -1
- package/web-ui/build/static/phpdoc-HUeiWlkw.js +0 -1
- package/web-ui/build/static/plaintext-CPt25ow_.js +0 -1
- package/web-ui/build/static/plsql-BvoRAbdz.js +0 -1
- package/web-ui/build/static/pony-BVuhxk7D.js +0 -1
- package/web-ui/build/static/powerquery-rnRfiL3F.js +0 -1
- package/web-ui/build/static/powershell-BQR2-qjF.js +0 -1
- package/web-ui/build/static/powershell-S_XnLato.js +0 -1
- package/web-ui/build/static/processing-B-8pt1gx.js +0 -1
- package/web-ui/build/static/processing-ozS1KPr7.js +0 -1
- package/web-ui/build/static/profile-DOjTmxRs.js +0 -1
- package/web-ui/build/static/prolog-BaaxuI5L.js +0 -1
- package/web-ui/build/static/prolog-D90dFqfr.js +0 -1
- package/web-ui/build/static/promql-BuyoLqtl.js +0 -1
- package/web-ui/build/static/properties-C0pMastm.js +0 -1
- package/web-ui/build/static/properties-k7bXYQao.js +0 -1
- package/web-ui/build/static/protobuf-ChaO1q7B.js +0 -1
- package/web-ui/build/static/protobuf-DAGxv01T.js +0 -1
- package/web-ui/build/static/psl-BpYOLBqn.js +0 -1
- package/web-ui/build/static/pug-BUlJA4UD.js +0 -1
- package/web-ui/build/static/puppet-8l--PVpO.js +0 -1
- package/web-ui/build/static/puppet-BJDN84xr.js +0 -1
- package/web-ui/build/static/pure-DhqjQg1a.js +0 -1
- package/web-ui/build/static/purebasic-BHnSz9Yh.js +0 -1
- package/web-ui/build/static/purebasic-CeiLO2aV.js +0 -1
- package/web-ui/build/static/purescript-BaXXPnKS.js +0 -1
- package/web-ui/build/static/python-BXdJ4yqN.js +0 -1
- package/web-ui/build/static/python-Cef5Vfx2.js +0 -1
- package/web-ui/build/static/python-repl-CRpJP363.js +0 -1
- package/web-ui/build/static/q-C6Ov0g11.js +0 -1
- package/web-ui/build/static/q-D3tQMiHa.js +0 -1
- package/web-ui/build/static/qml-BYofTHXZ.js +0 -1
- package/web-ui/build/static/qml-DTxi8T37.js +0 -1
- package/web-ui/build/static/qore-Ny7MVtbP.js +0 -1
- package/web-ui/build/static/qsharp-Cy_rqHs2.js +0 -1
- package/web-ui/build/static/r-BtNaz7Jx.js +0 -1
- package/web-ui/build/static/r-DkF7wq0g.js +0 -1
- package/web-ui/build/static/racket-C5r8oFZa.js +0 -1
- package/web-ui/build/static/reason-BURRGL8T.js +0 -1
- package/web-ui/build/static/reasonml-ZPKVqo38.js +0 -1
- package/web-ui/build/static/regex-DgaaAttu.js +0 -1
- package/web-ui/build/static/rego-CtwYq-qp.js +0 -1
- package/web-ui/build/static/renpy-OueysuHf.js +0 -1
- package/web-ui/build/static/rest-Co13hzuk.js +0 -1
- package/web-ui/build/static/rib-CvGWooaO.js +0 -1
- package/web-ui/build/static/rip-5glwZfvx.js +0 -1
- package/web-ui/build/static/roboconf-B9R_ZXBj.js +0 -1
- package/web-ui/build/static/roboconf-Gf0nTNKt.js +0 -1
- package/web-ui/build/static/robotframework-C2axWAv1.js +0 -1
- package/web-ui/build/static/routeros-CE_Iedbm.js +0 -1
- package/web-ui/build/static/rsl-2QjczbcI.js +0 -1
- package/web-ui/build/static/ruby-5q7nApRB.js +0 -1
- package/web-ui/build/static/ruby-BUTeEeQo.js +0 -1
- package/web-ui/build/static/ruleslanguage-vxFl2T6e.js +0 -1
- package/web-ui/build/static/rust-BMuquF4q.js +0 -1
- package/web-ui/build/static/rust-CcZQo8qE.js +0 -1
- package/web-ui/build/static/sas-B3kZio_a.js +0 -1
- package/web-ui/build/static/sas-Bbv6Pcs_.js +0 -1
- package/web-ui/build/static/sass-C0q0q-U-.js +0 -1
- package/web-ui/build/static/scala-B5vW0oUX.js +0 -1
- package/web-ui/build/static/scala-CyVnVDED.js +0 -1
- package/web-ui/build/static/scheme-C9JOo4R_.js +0 -1
- package/web-ui/build/static/scheme-W2233tzx.js +0 -1
- package/web-ui/build/static/scilab-D2Bvw6Ov.js +0 -1
- package/web-ui/build/static/scss-CTlab4AI.js +0 -1
- package/web-ui/build/static/scss-DZ5g2Z9m.js +0 -1
- package/web-ui/build/static/shell-bYpiB--U.js +0 -1
- package/web-ui/build/static/shell-session-C4jzoNup.js +0 -1
- package/web-ui/build/static/smali-9ucoTzDl.js +0 -1
- package/web-ui/build/static/smali-BnluPxDD.js +0 -1
- package/web-ui/build/static/smalltalk-CAMGWItN.js +0 -1
- package/web-ui/build/static/smalltalk-DNxg0Og_.js +0 -1
- package/web-ui/build/static/smarty-YxNaCRZt.js +0 -1
- package/web-ui/build/static/sml-CZbvurr2.js +0 -1
- package/web-ui/build/static/sml-DGs_TRXx.js +0 -1
- package/web-ui/build/static/solidity-CEsviKxI.js +0 -1
- package/web-ui/build/static/solution-file-D0Yvaoet.js +0 -1
- package/web-ui/build/static/soy-BmVAPY7I.js +0 -1
- package/web-ui/build/static/sparql-D8d4i2J8.js +0 -1
- package/web-ui/build/static/splunk-spl-CcgWj5Im.js +0 -1
- package/web-ui/build/static/sqf-Cd4tBlXZ.js +0 -1
- package/web-ui/build/static/sqf-DC8e-wlP.js +0 -1
- package/web-ui/build/static/sql-D5KtfAwl.js +0 -1
- package/web-ui/build/static/sql-DX4iGc5J.js +0 -1
- package/web-ui/build/static/sql_more-9ztUFh5U.js +0 -1
- package/web-ui/build/static/squirrel-CiVV01fQ.js +0 -1
- package/web-ui/build/static/stan-DCrPYtdq.js +0 -1
- package/web-ui/build/static/stan-LL9ScTUT.js +0 -1
- package/web-ui/build/static/stata-n-r5-RvF.js +0 -1
- package/web-ui/build/static/step21-B2hxGG1E.js +0 -1
- package/web-ui/build/static/stylus-D-1wq2uN.js +0 -1
- package/web-ui/build/static/stylus-Dr-w1AjW.js +0 -1
- package/web-ui/build/static/subunit-DRCyiRHI.js +0 -1
- package/web-ui/build/static/swift-B2ZIuBjB.js +0 -1
- package/web-ui/build/static/swift-CnRpp8ao.js +0 -1
- package/web-ui/build/static/systemd-LPN-yj3b.js +0 -1
- package/web-ui/build/static/t4-cs-CXJSMlet.js +0 -1
- package/web-ui/build/static/t4-templating-Ciw3keAZ.js +0 -1
- package/web-ui/build/static/t4-vb-CXe99AWF.js +0 -1
- package/web-ui/build/static/taggerscript-Bm830ZwV.js +0 -1
- package/web-ui/build/static/tap-B0WwYGVt.js +0 -1
- package/web-ui/build/static/tap-Dw_cgj6K.js +0 -1
- package/web-ui/build/static/tcl-Di4JhH4s.js +0 -1
- package/web-ui/build/static/tcl-cIeBNf2V.js +0 -1
- package/web-ui/build/static/textile-DgMdCAz5.js +0 -1
- package/web-ui/build/static/thrift-zY2WxYMk.js +0 -1
- package/web-ui/build/static/toml-BtXdKizf.js +0 -1
- package/web-ui/build/static/tp-DxY0K8UF.js +0 -1
- package/web-ui/build/static/tremor-890wqxvH.js +0 -1
- package/web-ui/build/static/tsx-92ElsKxL.js +0 -1
- package/web-ui/build/static/tt2-DqcvjDKh.js +0 -1
- package/web-ui/build/static/turtle-BZikMsiD.js +0 -1
- package/web-ui/build/static/twig-BlxkEMdw.js +0 -1
- package/web-ui/build/static/twig-CfsoMGnv.js +0 -1
- package/web-ui/build/static/typescript-3xS8yDgH.js +0 -1
- package/web-ui/build/static/typescript-Dx0zHssr.js +0 -1
- package/web-ui/build/static/typoscript-BdFwMGCV.js +0 -1
- package/web-ui/build/static/unrealscript-DJzoqp3G.js +0 -1
- package/web-ui/build/static/uorazor-CQO8Ynpw.js +0 -1
- package/web-ui/build/static/uri-BUBBJdel.js +0 -1
- package/web-ui/build/static/v-XU798JEc.js +0 -1
- package/web-ui/build/static/vala-DsH-Nomr.js +0 -1
- package/web-ui/build/static/vala-gCVw4o0d.js +0 -1
- package/web-ui/build/static/vbnet-BHw8cZ4s.js +0 -1
- package/web-ui/build/static/vbnet-DPa2ddOk.js +0 -1
- package/web-ui/build/static/vbscript-html-CNADYJ1-.js +0 -1
- package/web-ui/build/static/vbscript-ztRmIppj.js +0 -1
- package/web-ui/build/static/velocity-DVfeN53w.js +0 -1
- package/web-ui/build/static/verilog-C9VDLRl9.js +0 -1
- package/web-ui/build/static/verilog-Dsmt_WJW.js +0 -1
- package/web-ui/build/static/vhdl-DbylNGny.js +0 -1
- package/web-ui/build/static/vhdl-wNJe3yKK.js +0 -1
- package/web-ui/build/static/vim-6PLlVaq_.js +0 -1
- package/web-ui/build/static/vim-BJpkTTe-.js +0 -1
- package/web-ui/build/static/visual-basic-GY3wXjJ3.js +0 -1
- package/web-ui/build/static/warpscript-DUb9z3yI.js +0 -1
- package/web-ui/build/static/wasm-Dey0RlHH.js +0 -1
- package/web-ui/build/static/web-idl-qAF1RqaI.js +0 -1
- package/web-ui/build/static/wiki-Dh3Vjtce.js +0 -1
- package/web-ui/build/static/wolfram-BrQcRMlt.js +0 -1
- package/web-ui/build/static/wren-Cu3Mzln6.js +0 -1
- package/web-ui/build/static/x86asm-DD5mhaEi.js +0 -1
- package/web-ui/build/static/xeora-DKRZ6hlr.js +0 -1
- package/web-ui/build/static/xl-BL8R8sAx.js +0 -1
- package/web-ui/build/static/xml-doc-BSpNJbEM.js +0 -1
- package/web-ui/build/static/xml-i5BJyEQ7.js +0 -1
- package/web-ui/build/static/xojo-r2ieNAyP.js +0 -1
- package/web-ui/build/static/xquery-BtAK8Dvl.js +0 -1
- package/web-ui/build/static/xquery-CM4Q_TX7.js +0 -1
- package/web-ui/build/static/yaml-Mm8ArZA3.js +0 -1
- package/web-ui/build/static/yaml-r-QeuY00.js +0 -1
- package/web-ui/build/static/yang-qcKR-Y23.js +0 -1
- package/web-ui/build/static/zephir-8ApHtH7c.js +0 -1
- package/web-ui/build/static/zig-BanqOd9_.js +0 -1
|
@@ -281,7 +281,11 @@ describe('_parseSSEResponseStream — tool-call inline JSON passthrough', () =>
|
|
|
281
281
|
// The backend converts native tool_calls to inline JSON blocks and
|
|
282
282
|
// yields them as regular `chunk` events. Verify the CLI receives
|
|
283
283
|
// them intact so its TagParser can extract.
|
|
284
|
-
|
|
284
|
+
// Header only — see toolCallBridge.js DESIGN NOTE: the preamble
|
|
285
|
+
// is "**Calling X**" with no param preview, because the JSON block
|
|
286
|
+
// below is the single source of truth and duplicating its contents
|
|
287
|
+
// in a preview was bloating the context.
|
|
288
|
+
const inlineBlock = '\n**Calling filesystem**\n\n'
|
|
285
289
|
+ '```json\n'
|
|
286
290
|
+ '{\n "toolId": "filesystem",\n "parameters": {\n "action": "read"\n }\n}\n'
|
|
287
291
|
+ '```\n';
|
|
@@ -108,7 +108,9 @@ describe('filterContentForExternalRelay()', () => {
|
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
test('CONTENT VERBATIM — "Calling X" bridge preamble preserved if wrapped', () => {
|
|
111
|
-
|
|
111
|
+
// Bridge emits header-only (no em-dash param preview — see
|
|
112
|
+
// toolCallBridge.js DESIGN NOTE).
|
|
113
|
+
const txt = '**Calling terminal**\n\nsee below';
|
|
112
114
|
const { blocks } = filterContentForExternalRelay(`<external>${txt}</external>`);
|
|
113
115
|
expect(blocks[0].text).toBe(txt);
|
|
114
116
|
});
|
|
@@ -134,7 +136,7 @@ describe('filterContentForExternalRelay()', () => {
|
|
|
134
136
|
// after the bridge has converted native tool calls to inline blocks.
|
|
135
137
|
const content =
|
|
136
138
|
"Thinking through this…\n\n" +
|
|
137
|
-
"**Calling taskmanager
|
|
139
|
+
"**Calling taskmanager**\n\n" +
|
|
138
140
|
"```json\n{\"toolId\":\"taskmanager\",\"parameters\":{\"actions\":[{\"type\":\"create\",\"title\":\"foo\"}]}}\n```\n\n" +
|
|
139
141
|
"<external to=\"discord:#ops\">\n" +
|
|
140
142
|
"Created a task for you: **foo**. I'll post back when it's done.\n" +
|
|
@@ -454,7 +454,7 @@ describe('Cross-service isolation: a single agent response splits across platfor
|
|
|
454
454
|
// for either Responses API or Chat Completions after the bridge.
|
|
455
455
|
const content =
|
|
456
456
|
'Private reasoning the operator sees.\n' +
|
|
457
|
-
'**Calling taskmanager
|
|
457
|
+
'**Calling taskmanager**\n' +
|
|
458
458
|
'```json\n{"toolId":"taskmanager","parameters":{"actions":[{"type":"complete","taskId":"t-1"}]}}\n```\n\n' +
|
|
459
459
|
'<external to="discord:#ops">\n' +
|
|
460
460
|
'**Deploy finished.** 42 tests passed.\n' +
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for GalleryService — the durable store for tool-generated
|
|
3
|
+
* images + videos with metadata sidecars.
|
|
4
|
+
*
|
|
5
|
+
* Locks:
|
|
6
|
+
* - save copies file + writes a JSON sidecar
|
|
7
|
+
* - filename gets a timestamp prefix to avoid collisions
|
|
8
|
+
* - list returns entries newest-first with metadata from the sidecar
|
|
9
|
+
* - list filters by agentId when supplied
|
|
10
|
+
* - delete removes both the asset and its sidecar
|
|
11
|
+
* - delete rejects path traversal + unsupported extensions
|
|
12
|
+
* - saveImage on a non-image source returns null (no-op, non-fatal)
|
|
13
|
+
* - IO failures on the gallery path don't crash the caller (warn + null)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { jest, describe, test, expect, beforeEach, afterEach } from '@jest/globals';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import os from 'os';
|
|
19
|
+
import { promises as fs } from 'fs';
|
|
20
|
+
|
|
21
|
+
// Point userDataDir to a tmp dir for the duration of the test.
|
|
22
|
+
let tmpRoot;
|
|
23
|
+
jest.unstable_mockModule('../../utilities/userDataDir.js', () => ({
|
|
24
|
+
getUserDataDir: () => tmpRoot,
|
|
25
|
+
getUserDataPaths: () => ({
|
|
26
|
+
base: tmpRoot,
|
|
27
|
+
state: path.join(tmpRoot, 'state'),
|
|
28
|
+
agents: path.join(tmpRoot, 'state', 'agents'),
|
|
29
|
+
settings: path.join(tmpRoot, 'settings'),
|
|
30
|
+
attachments: path.join(tmpRoot, 'attachments'),
|
|
31
|
+
logs: path.join(tmpRoot, 'logs'),
|
|
32
|
+
cache: path.join(tmpRoot, 'cache'),
|
|
33
|
+
operations: path.join(tmpRoot, 'state', 'operations'),
|
|
34
|
+
models: path.join(tmpRoot, 'state', 'models'),
|
|
35
|
+
runtime: path.join(tmpRoot, 'runtime'),
|
|
36
|
+
skills: path.join(tmpRoot, 'state', 'skills'),
|
|
37
|
+
gallery: path.join(tmpRoot, 'gallery'),
|
|
38
|
+
galleryImages: path.join(tmpRoot, 'gallery', 'images'),
|
|
39
|
+
galleryVideos: path.join(tmpRoot, 'gallery', 'videos'),
|
|
40
|
+
}),
|
|
41
|
+
ensureUserDataDirs: async () => {},
|
|
42
|
+
}));
|
|
43
|
+
|
|
44
|
+
const mod = await import('../galleryService.js');
|
|
45
|
+
const { GalleryService, _resetGalleryServiceForTests, getGalleryService } = mod;
|
|
46
|
+
|
|
47
|
+
const LOGGER = { info() {}, warn() {}, error() {}, debug() {} };
|
|
48
|
+
|
|
49
|
+
beforeEach(async () => {
|
|
50
|
+
_resetGalleryServiceForTests();
|
|
51
|
+
tmpRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'gallery-svc-'));
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
afterEach(async () => {
|
|
55
|
+
await fs.rm(tmpRoot, { recursive: true, force: true }).catch(() => {});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
async function makeSourceImage(name = 'fox.png') {
|
|
59
|
+
const srcDir = path.join(tmpRoot, 'src');
|
|
60
|
+
await fs.mkdir(srcDir, { recursive: true });
|
|
61
|
+
const src = path.join(srcDir, name);
|
|
62
|
+
await fs.writeFile(src, 'PNG-DATA');
|
|
63
|
+
return src;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function makeSourceVideo(name = 'dragon.mp4') {
|
|
67
|
+
const srcDir = path.join(tmpRoot, 'src');
|
|
68
|
+
await fs.mkdir(srcDir, { recursive: true });
|
|
69
|
+
const src = path.join(srcDir, name);
|
|
70
|
+
await fs.writeFile(src, 'MP4-DATA');
|
|
71
|
+
return src;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
describe('GalleryService.saveImage', () => {
|
|
75
|
+
test('copies the file into gallery/images and writes a sidecar', async () => {
|
|
76
|
+
const svc = new GalleryService(LOGGER);
|
|
77
|
+
const src = await makeSourceImage('fox.png');
|
|
78
|
+
const result = await svc.saveImage({
|
|
79
|
+
sourcePath: src,
|
|
80
|
+
metadata: { prompt: 'a fox', model: 'dall-e-3', agentId: 'agent-1', agentName: 'Alice' },
|
|
81
|
+
});
|
|
82
|
+
expect(result).toBeTruthy();
|
|
83
|
+
expect(result.filename).toMatch(/_fox\.png$/);
|
|
84
|
+
const contents = await fs.readFile(result.path, 'utf8');
|
|
85
|
+
expect(contents).toBe('PNG-DATA');
|
|
86
|
+
const sidecar = JSON.parse(await fs.readFile(`${result.path}.json`, 'utf8'));
|
|
87
|
+
expect(sidecar.prompt).toBe('a fox');
|
|
88
|
+
expect(sidecar.model).toBe('dall-e-3');
|
|
89
|
+
expect(sidecar.agentId).toBe('agent-1');
|
|
90
|
+
expect(sidecar.kind).toBe('image');
|
|
91
|
+
expect(sidecar.createdAt).toBeTruthy();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('returns null for a non-image source (no throw, no file)', async () => {
|
|
95
|
+
const svc = new GalleryService(LOGGER);
|
|
96
|
+
const txt = path.join(tmpRoot, 'src', 'notes.txt');
|
|
97
|
+
await fs.mkdir(path.dirname(txt), { recursive: true });
|
|
98
|
+
await fs.writeFile(txt, 'hi');
|
|
99
|
+
const r = await svc.saveImage({ sourcePath: txt });
|
|
100
|
+
expect(r).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('returns null when the source path does not exist (warn, not crash)', async () => {
|
|
104
|
+
const svc = new GalleryService(LOGGER);
|
|
105
|
+
const r = await svc.saveImage({
|
|
106
|
+
sourcePath: path.join(tmpRoot, 'does-not-exist.png'),
|
|
107
|
+
});
|
|
108
|
+
expect(r).toBeNull();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('two saves of the same basename do not collide', async () => {
|
|
112
|
+
const svc = new GalleryService(LOGGER);
|
|
113
|
+
const src = await makeSourceImage('boom.png');
|
|
114
|
+
const a = await svc.saveImage({ sourcePath: src });
|
|
115
|
+
// Enough wall-clock for the timestamp prefix to change.
|
|
116
|
+
await new Promise(r => setTimeout(r, 5));
|
|
117
|
+
const b = await svc.saveImage({ sourcePath: src });
|
|
118
|
+
expect(a.filename).not.toBe(b.filename);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe('GalleryService.saveVideo', () => {
|
|
123
|
+
test('copies + writes sidecar with kind=video', async () => {
|
|
124
|
+
const svc = new GalleryService(LOGGER);
|
|
125
|
+
const src = await makeSourceVideo('dragon.mp4');
|
|
126
|
+
const result = await svc.saveVideo({
|
|
127
|
+
sourcePath: src,
|
|
128
|
+
metadata: { prompt: 'a dragon', duration: 5, variants: 1, agentId: 'agent-1' },
|
|
129
|
+
});
|
|
130
|
+
expect(result).toBeTruthy();
|
|
131
|
+
const sidecar = JSON.parse(await fs.readFile(`${result.path}.json`, 'utf8'));
|
|
132
|
+
expect(sidecar.kind).toBe('video');
|
|
133
|
+
expect(sidecar.duration).toBe(5);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('GalleryService.listImages', () => {
|
|
138
|
+
test('returns saved images with sidecar metadata, newest first', async () => {
|
|
139
|
+
const svc = new GalleryService(LOGGER);
|
|
140
|
+
const src = await makeSourceImage('a.png');
|
|
141
|
+
const a = await svc.saveImage({ sourcePath: src, metadata: { prompt: 'first', agentId: 'x' } });
|
|
142
|
+
await new Promise(r => setTimeout(r, 20));
|
|
143
|
+
const b = await svc.saveImage({ sourcePath: src, metadata: { prompt: 'second', agentId: 'x' } });
|
|
144
|
+
|
|
145
|
+
const list = await svc.listImages();
|
|
146
|
+
expect(list.map(i => i.filename)).toEqual([b.filename, a.filename]);
|
|
147
|
+
expect(list[0].prompt).toBe('second');
|
|
148
|
+
expect(list[0].kind).toBe('image');
|
|
149
|
+
expect(list[0].bytes).toBeGreaterThan(0);
|
|
150
|
+
expect(list[0].mtime).toMatch(/^\d{4}-\d{2}-\d{2}T/);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test('filters by agentId', async () => {
|
|
154
|
+
const svc = new GalleryService(LOGGER);
|
|
155
|
+
const src = await makeSourceImage('a.png');
|
|
156
|
+
await svc.saveImage({ sourcePath: src, metadata: { agentId: 'agent-A' } });
|
|
157
|
+
await svc.saveImage({ sourcePath: src, metadata: { agentId: 'agent-B' } });
|
|
158
|
+
|
|
159
|
+
const onlyB = await svc.listImages({ agentId: 'agent-B' });
|
|
160
|
+
expect(onlyB).toHaveLength(1);
|
|
161
|
+
expect(onlyB[0].agentId).toBe('agent-B');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test('empty gallery → empty list', async () => {
|
|
165
|
+
const svc = new GalleryService(LOGGER);
|
|
166
|
+
const list = await svc.listImages();
|
|
167
|
+
expect(list).toEqual([]);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test('files without sidecars are still listed (best-effort)', async () => {
|
|
171
|
+
const svc = new GalleryService(LOGGER);
|
|
172
|
+
const dir = path.join(tmpRoot, 'gallery', 'images');
|
|
173
|
+
await fs.mkdir(dir, { recursive: true });
|
|
174
|
+
await fs.writeFile(path.join(dir, 'orphan.png'), 'x');
|
|
175
|
+
const list = await svc.listImages();
|
|
176
|
+
expect(list.map(i => i.filename)).toEqual(['orphan.png']);
|
|
177
|
+
expect(list[0].prompt).toBeUndefined();
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
describe('GalleryService.deleteImage', () => {
|
|
182
|
+
test('removes the image AND its sidecar', async () => {
|
|
183
|
+
const svc = new GalleryService(LOGGER);
|
|
184
|
+
const src = await makeSourceImage('gone.png');
|
|
185
|
+
const { filename, path: assetPath } = await svc.saveImage({ sourcePath: src });
|
|
186
|
+
await fs.access(assetPath);
|
|
187
|
+
await fs.access(`${assetPath}.json`);
|
|
188
|
+
|
|
189
|
+
const ok = await svc.deleteImage(filename);
|
|
190
|
+
expect(ok).toBe(true);
|
|
191
|
+
await expect(fs.access(assetPath)).rejects.toBeTruthy();
|
|
192
|
+
await expect(fs.access(`${assetPath}.json`)).rejects.toBeTruthy();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('rejects path-traversal filenames', async () => {
|
|
196
|
+
const svc = new GalleryService(LOGGER);
|
|
197
|
+
await expect(svc.deleteImage('../secret')).rejects.toMatchObject({ code: 'INVALID_FILENAME' });
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('rejects unsupported extensions', async () => {
|
|
201
|
+
const svc = new GalleryService(LOGGER);
|
|
202
|
+
await expect(svc.deleteImage('secret.txt')).rejects.toMatchObject({ code: 'INVALID_EXT' });
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test('returns false when the file is already gone (no throw)', async () => {
|
|
206
|
+
const svc = new GalleryService(LOGGER);
|
|
207
|
+
const r = await svc.deleteImage('ghost.png');
|
|
208
|
+
expect(r).toBe(false);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
describe('getGalleryService singleton', () => {
|
|
213
|
+
test('returns the same instance across calls', () => {
|
|
214
|
+
const a = getGalleryService(LOGGER);
|
|
215
|
+
const b = getGalleryService(LOGGER);
|
|
216
|
+
expect(a).toBe(b);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test('_resetGalleryServiceForTests creates a fresh instance', () => {
|
|
220
|
+
const a = getGalleryService(LOGGER);
|
|
221
|
+
_resetGalleryServiceForTests();
|
|
222
|
+
const b = getGalleryService(LOGGER);
|
|
223
|
+
expect(a).not.toBe(b);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
@@ -33,11 +33,9 @@ import TagParser from '../../utilities/tagParser.js';
|
|
|
33
33
|
*/
|
|
34
34
|
function bridgeOutput({ name, args }) {
|
|
35
35
|
const params = args ? JSON.parse(args) : {};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
.slice(0, 120);
|
|
40
|
-
return `\n**Calling ${name}** — ${paramSummary || 'no params'}…\n\n` +
|
|
36
|
+
// Header only — see autopilot-backend/services/toolCallBridge.js
|
|
37
|
+
// DESIGN NOTE. No em-dash / param preview line.
|
|
38
|
+
return `\n**Calling ${name}**\n\n` +
|
|
41
39
|
'```json\n' +
|
|
42
40
|
JSON.stringify({ toolId: name, parameters: params }, null, 2) +
|
|
43
41
|
'\n```\n';
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file services/galleryService.js
|
|
3
|
+
* @description Durable gallery for tool-generated media.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists:
|
|
6
|
+
* Before, the web-UI gallery listed files by scanning each agent's
|
|
7
|
+
* `working-dir/images/` folder. That breaks the moment a file is
|
|
8
|
+
* moved, an agent is deleted, or the agent's workingDirectory
|
|
9
|
+
* changes — and there's nowhere to store the prompt/model metadata
|
|
10
|
+
* that made the image in the first place. GalleryService gives each
|
|
11
|
+
* generation a durable home at `{userDataDir}/gallery/{images|videos}/`
|
|
12
|
+
* with a `.json` sidecar carrying the full metadata.
|
|
13
|
+
*
|
|
14
|
+
* Layout:
|
|
15
|
+
* {userDataDir}/gallery/
|
|
16
|
+
* images/
|
|
17
|
+
* 2026-04-22T12-34-56_fox.png ← the asset
|
|
18
|
+
* 2026-04-22T12-34-56_fox.png.json ← metadata sidecar
|
|
19
|
+
* videos/
|
|
20
|
+
* 2026-04-22T12-34-56_dragon.mp4
|
|
21
|
+
* 2026-04-22T12-34-56_dragon.mp4.json
|
|
22
|
+
*
|
|
23
|
+
* Sidecar shape (whatever the caller passed to saveImage/saveVideo):
|
|
24
|
+
* {
|
|
25
|
+
* filename: "2026-04-22T12-34-56_fox.png",
|
|
26
|
+
* sourcePath: "/original/path/images/fox.png",
|
|
27
|
+
* agentId: "agent-xyz",
|
|
28
|
+
* agentName: "Alice",
|
|
29
|
+
* prompt: "a fox on a skateboard",
|
|
30
|
+
* model: "dall-e-3",
|
|
31
|
+
* size: "1024x1024", // or width/height
|
|
32
|
+
* duration: 5, // video only
|
|
33
|
+
* variants: 1, // video only
|
|
34
|
+
* createdAt: "2026-04-22T12:34:56.789Z",
|
|
35
|
+
* bytes: 834221,
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* Save-time naming guarantees:
|
|
39
|
+
* - Timestamp prefix prevents collisions when two agents pick the
|
|
40
|
+
* same filename.
|
|
41
|
+
* - Original filename is retained after the prefix so users can still
|
|
42
|
+
* recognise what they asked for.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
import { promises as fs } from 'fs';
|
|
46
|
+
import path from 'path';
|
|
47
|
+
import { getUserDataPaths, ensureUserDataDirs } from '../utilities/userDataDir.js';
|
|
48
|
+
|
|
49
|
+
const IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif']);
|
|
50
|
+
const VIDEO_EXTS = new Set(['.mp4', '.webm', '.mov', '.gif']);
|
|
51
|
+
|
|
52
|
+
function _ts() {
|
|
53
|
+
// Filesystem-safe ISO — replaces ':' (illegal on Windows) with '-'.
|
|
54
|
+
return new Date().toISOString().replace(/[:.]/g, '-');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function _isImage(name) { return IMAGE_EXTS.has(path.extname(name).toLowerCase()); }
|
|
58
|
+
function _isVideo(name) { return VIDEO_EXTS.has(path.extname(name).toLowerCase()); }
|
|
59
|
+
|
|
60
|
+
async function _ensureDir(dir) {
|
|
61
|
+
await fs.mkdir(dir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Write `data` to `{target}.json` — pretty, atomic-ish (write + rename). */
|
|
65
|
+
async function _writeSidecar(target, data) {
|
|
66
|
+
const json = JSON.stringify(data, null, 2);
|
|
67
|
+
const tmp = `${target}.json.tmp`;
|
|
68
|
+
await fs.writeFile(tmp, json, 'utf8');
|
|
69
|
+
await fs.rename(tmp, `${target}.json`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function _readSidecar(target) {
|
|
73
|
+
try {
|
|
74
|
+
const raw = await fs.readFile(`${target}.json`, 'utf8');
|
|
75
|
+
return JSON.parse(raw);
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Best-effort: strip known internal keys before returning to callers. */
|
|
82
|
+
function _sanitiseMeta(meta, file, stat, url) {
|
|
83
|
+
const out = { ...(meta || {}) };
|
|
84
|
+
out.filename = file;
|
|
85
|
+
out.bytes = stat.size;
|
|
86
|
+
out.mtime = stat.mtime.toISOString();
|
|
87
|
+
if (url) out.url = url;
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
class GalleryService {
|
|
92
|
+
constructor(logger = null) {
|
|
93
|
+
this.logger = logger;
|
|
94
|
+
this.paths = getUserDataPaths();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Copy a freshly-generated image into the durable gallery.
|
|
99
|
+
* @param {object} opts
|
|
100
|
+
* @param {string} opts.sourcePath absolute path to source file
|
|
101
|
+
* @param {object} opts.metadata free-form sidecar data
|
|
102
|
+
* @param {string} [opts.filenameHint] override the suggested filename
|
|
103
|
+
* @returns {Promise<{ filename: string, path: string } | null>}
|
|
104
|
+
* null when sourcePath couldn't be read (non-fatal)
|
|
105
|
+
*/
|
|
106
|
+
async saveImage({ sourcePath, metadata = {}, filenameHint } = {}) {
|
|
107
|
+
if (!sourcePath) return null;
|
|
108
|
+
if (!_isImage(filenameHint || sourcePath)) return null;
|
|
109
|
+
try {
|
|
110
|
+
await _ensureDir(this.paths.galleryImages);
|
|
111
|
+
const base = path.basename(filenameHint || sourcePath);
|
|
112
|
+
const final = `${_ts()}_${base}`;
|
|
113
|
+
const target = path.join(this.paths.galleryImages, final);
|
|
114
|
+
await fs.copyFile(sourcePath, target);
|
|
115
|
+
const stat = await fs.stat(target);
|
|
116
|
+
await _writeSidecar(target, {
|
|
117
|
+
...metadata,
|
|
118
|
+
filename: final,
|
|
119
|
+
sourcePath,
|
|
120
|
+
bytes: stat.size,
|
|
121
|
+
createdAt: metadata.createdAt || new Date().toISOString(),
|
|
122
|
+
kind: 'image',
|
|
123
|
+
});
|
|
124
|
+
this.logger?.info?.('[Gallery] saved image', { final, sourcePath });
|
|
125
|
+
return { filename: final, path: target };
|
|
126
|
+
} catch (err) {
|
|
127
|
+
// Gallery save is non-fatal — the tool's primary save to the
|
|
128
|
+
// agent's working dir already succeeded.
|
|
129
|
+
this.logger?.warn?.('[Gallery] saveImage failed', { error: err.message, sourcePath });
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Same shape as saveImage, but for videos. */
|
|
135
|
+
async saveVideo({ sourcePath, metadata = {}, filenameHint } = {}) {
|
|
136
|
+
if (!sourcePath) return null;
|
|
137
|
+
if (!_isVideo(filenameHint || sourcePath)) return null;
|
|
138
|
+
try {
|
|
139
|
+
await _ensureDir(this.paths.galleryVideos);
|
|
140
|
+
const base = path.basename(filenameHint || sourcePath);
|
|
141
|
+
const final = `${_ts()}_${base}`;
|
|
142
|
+
const target = path.join(this.paths.galleryVideos, final);
|
|
143
|
+
await fs.copyFile(sourcePath, target);
|
|
144
|
+
const stat = await fs.stat(target);
|
|
145
|
+
await _writeSidecar(target, {
|
|
146
|
+
...metadata,
|
|
147
|
+
filename: final,
|
|
148
|
+
sourcePath,
|
|
149
|
+
bytes: stat.size,
|
|
150
|
+
createdAt: metadata.createdAt || new Date().toISOString(),
|
|
151
|
+
kind: 'video',
|
|
152
|
+
});
|
|
153
|
+
this.logger?.info?.('[Gallery] saved video', { final, sourcePath });
|
|
154
|
+
return { filename: final, path: target };
|
|
155
|
+
} catch (err) {
|
|
156
|
+
this.logger?.warn?.('[Gallery] saveVideo failed', { error: err.message, sourcePath });
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* List gallery images, newest first. Optional { agentId } filter.
|
|
163
|
+
* Returns rich entries populated from the sidecar where available.
|
|
164
|
+
*/
|
|
165
|
+
async listImages({ agentId } = {}) {
|
|
166
|
+
return this._listDir(this.paths.galleryImages, _isImage, agentId, 'image');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Same for videos. */
|
|
170
|
+
async listVideos({ agentId } = {}) {
|
|
171
|
+
return this._listDir(this.paths.galleryVideos, _isVideo, agentId, 'video');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async _listDir(dir, extCheck, agentId, kind) {
|
|
175
|
+
let entries;
|
|
176
|
+
try {
|
|
177
|
+
entries = await fs.readdir(dir);
|
|
178
|
+
} catch {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
const results = [];
|
|
182
|
+
for (const name of entries) {
|
|
183
|
+
if (!extCheck(name)) continue;
|
|
184
|
+
const abs = path.join(dir, name);
|
|
185
|
+
let stat;
|
|
186
|
+
try { stat = await fs.stat(abs); } catch { continue; }
|
|
187
|
+
if (!stat.isFile()) continue;
|
|
188
|
+
const meta = (await _readSidecar(abs)) || {};
|
|
189
|
+
if (agentId && meta.agentId && meta.agentId !== agentId) continue;
|
|
190
|
+
results.push(_sanitiseMeta({ ...meta, kind }, name, stat, /* url */ null));
|
|
191
|
+
}
|
|
192
|
+
// Sort newest-first. Use createdAt from sidecar when available (more
|
|
193
|
+
// precise than mtime, which can collide at ms resolution on fast
|
|
194
|
+
// filesystems). Filename fallback works because we embed a timestamp
|
|
195
|
+
// prefix at save time.
|
|
196
|
+
results.sort((a, b) => {
|
|
197
|
+
const ka = a.createdAt || a.filename || '';
|
|
198
|
+
const kb = b.createdAt || b.filename || '';
|
|
199
|
+
return kb.localeCompare(ka);
|
|
200
|
+
});
|
|
201
|
+
return results;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Delete a gallery image by filename (+ its sidecar). 404 → false. */
|
|
205
|
+
async deleteImage(filename) {
|
|
206
|
+
return this._deleteFile(this.paths.galleryImages, filename, _isImage);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Delete a gallery video by filename (+ its sidecar). */
|
|
210
|
+
async deleteVideo(filename) {
|
|
211
|
+
return this._deleteFile(this.paths.galleryVideos, filename, _isVideo);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async _deleteFile(dir, filename, extCheck) {
|
|
215
|
+
const normalized = path.basename(filename || '');
|
|
216
|
+
if (!normalized || normalized !== filename) {
|
|
217
|
+
throw Object.assign(new Error('Invalid filename'), { code: 'INVALID_FILENAME' });
|
|
218
|
+
}
|
|
219
|
+
if (!extCheck(normalized)) {
|
|
220
|
+
throw Object.assign(new Error('Unsupported extension'), { code: 'INVALID_EXT' });
|
|
221
|
+
}
|
|
222
|
+
const target = path.join(dir, normalized);
|
|
223
|
+
let existed = false;
|
|
224
|
+
try {
|
|
225
|
+
await fs.unlink(target);
|
|
226
|
+
existed = true;
|
|
227
|
+
} catch (err) {
|
|
228
|
+
if (err.code !== 'ENOENT') throw err;
|
|
229
|
+
}
|
|
230
|
+
// Sidecar is best-effort — missing sidecar is fine.
|
|
231
|
+
await fs.unlink(`${target}.json`).catch(() => {});
|
|
232
|
+
return existed;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Diagnostic helper (used by tests). */
|
|
236
|
+
async _ensureStructure() {
|
|
237
|
+
await ensureUserDataDirs();
|
|
238
|
+
await _ensureDir(this.paths.galleryImages);
|
|
239
|
+
await _ensureDir(this.paths.galleryVideos);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* Singleton. Tools and webServer routes share one instance. */
|
|
244
|
+
let _instance = null;
|
|
245
|
+
|
|
246
|
+
export function getGalleryService(logger = null) {
|
|
247
|
+
if (!_instance) _instance = new GalleryService(logger);
|
|
248
|
+
return _instance;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** Test-only — reset module state. */
|
|
252
|
+
export function _resetGalleryServiceForTests() {
|
|
253
|
+
_instance = null;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export default GalleryService;
|
|
257
|
+
export { GalleryService };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression tests for the per-model size validator in imageTool.
|
|
3
|
+
*
|
|
4
|
+
* Motivation: an agent hit "Width 1536 out of range" when requesting
|
|
5
|
+
* 1536x1024 on gpt-image-1.5 (where that size IS valid) — because the
|
|
6
|
+
* validator was hardcoded to Flux constraints and didn't know the
|
|
7
|
+
* effective model. It also rejected `size: "auto"` despite the docs
|
|
8
|
+
* saying it's valid, and failed to remap the `portrait` preset when
|
|
9
|
+
* the tool auto-switched to gpt-image-1.5 (transparency=true).
|
|
10
|
+
*
|
|
11
|
+
* These tests lock the fixed behaviour end-to-end:
|
|
12
|
+
* - Valid gpt-image-1.5 sizes accepted.
|
|
13
|
+
* - Flux out-of-range errors still fire for Flux.
|
|
14
|
+
* - Errors name the model + list valid sizes + hint at recovery.
|
|
15
|
+
* - The transparency/sourceImage auto-switch runs BEFORE validation.
|
|
16
|
+
* - Presets remap per model.
|
|
17
|
+
* - _translateImageError produces actionable text for moderation,
|
|
18
|
+
* size, and auth errors.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { describe, test, expect } from '@jest/globals';
|
|
22
|
+
import {
|
|
23
|
+
resolveEffectiveImageModel,
|
|
24
|
+
_getModelSizeRule,
|
|
25
|
+
_translateImageError,
|
|
26
|
+
} from '../imageTool.js';
|
|
27
|
+
|
|
28
|
+
// ── resolveEffectiveImageModel ──────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
describe('resolveEffectiveImageModel', () => {
|
|
31
|
+
test('returns explicit model when set', () => {
|
|
32
|
+
expect(resolveEffectiveImageModel({ model: 'gpt-image-1.5' })).toBe('gpt-image-1.5');
|
|
33
|
+
expect(resolveEffectiveImageModel({ model: 'Flux-1.1-pro' })).toBe('flux-1.1-pro');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('auto-switches to gpt-image-1.5 when transparency=true', () => {
|
|
37
|
+
expect(resolveEffectiveImageModel({ transparency: true })).toBe('gpt-image-1.5');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('auto-switches to gpt-image-1.5 when sourceImage is provided', () => {
|
|
41
|
+
expect(resolveEffectiveImageModel({ sourceImage: '/tmp/x.png' })).toBe('gpt-image-1.5');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('returns "" when nothing forces a model (downstream will resolve)', () => {
|
|
45
|
+
expect(resolveEffectiveImageModel({})).toBe('');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('explicit "auto" is treated as "defer to downstream"', () => {
|
|
49
|
+
expect(resolveEffectiveImageModel({ model: 'auto' })).toBe('');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// ── _getModelSizeRule ───────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
describe('_getModelSizeRule', () => {
|
|
56
|
+
test('gpt-image-1.5 gets the enum rule', () => {
|
|
57
|
+
const { rule } = _getModelSizeRule('gpt-image-1.5');
|
|
58
|
+
expect(rule.kind).toBe('enum');
|
|
59
|
+
expect(rule.values).toContain('1024x1024');
|
|
60
|
+
expect(rule.values).toContain('1024x1536');
|
|
61
|
+
expect(rule.values).toContain('1536x1024');
|
|
62
|
+
expect(rule.values).toContain('auto');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('substring match — "gpt-image-1.5-preview" still picks enum', () => {
|
|
66
|
+
const { rule } = _getModelSizeRule('gpt-image-1.5-preview');
|
|
67
|
+
expect(rule.kind).toBe('enum');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('flux variants get the range rule', () => {
|
|
71
|
+
const { rule } = _getModelSizeRule('flux-1.1-pro');
|
|
72
|
+
expect(rule.kind).toBe('range');
|
|
73
|
+
expect(rule.min).toBe(256);
|
|
74
|
+
expect(rule.max).toBe(1440);
|
|
75
|
+
expect(rule.increment).toBe(32);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('unknown model falls back to default (range)', () => {
|
|
79
|
+
const { rule, modelKey } = _getModelSizeRule('completely-unknown-model');
|
|
80
|
+
expect(rule.kind).toBe('range');
|
|
81
|
+
expect(modelKey).toBe('default');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// ── _translateImageError ────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
describe('_translateImageError', () => {
|
|
88
|
+
test('moderation error — rewrites with rephrasing hint', () => {
|
|
89
|
+
const msg = _translateImageError(
|
|
90
|
+
new Error('HTTP 400: Bad Request - content_policy violation'),
|
|
91
|
+
{ prompt: 'blood', model: 'gpt-image-1.5' }
|
|
92
|
+
);
|
|
93
|
+
expect(msg).toMatch(/content moderation/i);
|
|
94
|
+
expect(msg).toMatch(/Rephrase/i);
|
|
95
|
+
expect(msg).toContain('gpt-image-1.5');
|
|
96
|
+
// Original text preserved for auditability
|
|
97
|
+
expect(msg).toContain('content_policy violation');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('size error — lists valid sizes for gpt-image-1.5', () => {
|
|
101
|
+
const msg = _translateImageError(
|
|
102
|
+
new Error('Invalid image size: must be one of 1024x1024, 1024x1536, 1536x1024'),
|
|
103
|
+
{ size: '1280x720', transparency: true }
|
|
104
|
+
);
|
|
105
|
+
expect(msg).toMatch(/size "1280x720" not accepted/);
|
|
106
|
+
expect(msg).toContain('gpt-image-1.5');
|
|
107
|
+
expect(msg).toContain('1024x1024');
|
|
108
|
+
expect(msg).toContain('1024x1536');
|
|
109
|
+
expect(msg).toContain('1536x1024');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('size error — Flux: range hint', () => {
|
|
113
|
+
const msg = _translateImageError(
|
|
114
|
+
new Error('out of range'),
|
|
115
|
+
{ size: '2000x2000', model: 'flux-1.1-pro' }
|
|
116
|
+
);
|
|
117
|
+
expect(msg).toMatch(/flux/);
|
|
118
|
+
expect(msg).toMatch(/256-1440/);
|
|
119
|
+
expect(msg).toMatch(/multiples of 32/);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('auth error — flags non-retryability', () => {
|
|
123
|
+
const msg = _translateImageError(new Error('401 Unauthorized'), { model: 'gpt-image-1.5' });
|
|
124
|
+
expect(msg).toMatch(/authentication/i);
|
|
125
|
+
expect(msg).toMatch(/Retrying.*will likely fail/i);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('unknown error — still includes model + size context', () => {
|
|
129
|
+
const msg = _translateImageError(new Error('network wobble'), { model: 'flux-1.1-pro', size: '1024x1024' });
|
|
130
|
+
expect(msg).toContain('flux-1.1-pro');
|
|
131
|
+
expect(msg).toContain('1024x1024');
|
|
132
|
+
expect(msg).toContain('network wobble');
|
|
133
|
+
});
|
|
134
|
+
});
|