onbuzz 4.5.0 → 4.6.1
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/bin/cli.js +38 -18
- package/package.json +2 -1
- package/scripts/e2e-flow-live.js +598 -0
- package/src/__tests__/resolvePreferredModel.test.js +15 -1
- package/src/core/__test-utils__/flowJudge.js +198 -0
- package/src/core/__tests__/flowCheckpointStore.test.js +140 -0
- package/src/core/__tests__/flowEndToEnd.test.js +565 -0
- package/src/core/__tests__/flowExecutor.test.js +950 -0
- package/src/core/__tests__/flowFieldMapping.test.js +189 -0
- package/src/core/__tests__/flowJudge.test.js +140 -0
- package/src/core/__tests__/flowLint.test.js +119 -0
- package/src/core/__tests__/flowLintClientMirror.test.js +98 -0
- package/src/core/__tests__/flowMigration.test.js +160 -0
- package/src/core/__tests__/flowRetry.test.js +145 -0
- package/src/core/__tests__/flowSavePayload.test.js +169 -0
- package/src/core/__tests__/flowSchema.test.js +438 -0
- package/src/core/__tests__/flowTemplates.test.js +311 -0
- package/src/core/__tests__/flowTypes.test.js +147 -0
- package/src/core/__tests__/flowVersionStore.test.js +123 -0
- package/src/core/__tests__/orchestrator.test.js +38 -0
- package/src/core/__tests__/stateManager.test.js +348 -0
- package/src/core/agentScheduler.js +37 -6
- package/src/core/flowCheckpointStore.js +146 -0
- package/src/core/flowExecutor.js +669 -87
- package/src/core/flowFieldMapping.js +138 -0
- package/src/core/flowLint.js +102 -0
- package/src/core/flowMigration.js +88 -0
- package/src/core/flowRetry.js +103 -0
- package/src/core/flowSchema.js +297 -0
- package/src/core/flowTypes.js +81 -0
- package/src/core/flowVersionStore.js +122 -0
- package/src/core/messageProcessor.js +5 -1
- package/src/core/stateManager.js +265 -17
- package/src/index.js +17 -0
- package/src/interfaces/webServer.js +304 -4
- package/src/modules/widget/galleryStore.js +27 -2
- package/src/services/__tests__/apiKeyManager.test.js +163 -0
- package/src/services/__tests__/flowContextService.test.js +391 -0
- package/src/services/apiKeyManager.js +54 -3
- package/src/services/flowContextService.js +401 -4
- package/src/tools/__tests__/imageFormat.test.js +208 -0
- package/src/tools/__tests__/jobDoneTool.test.js +285 -0
- package/src/tools/__tests__/platformControlAgentTeamPermissions.test.js +200 -0
- package/src/tools/__tests__/platformControlFlow.test.js +412 -0
- package/src/tools/imageFormat.js +249 -0
- package/src/tools/imageTool.js +107 -18
- package/src/tools/jobDoneTool.js +111 -3
- package/src/tools/platformControl/permissions.js +111 -0
- package/src/tools/platformControlTool.js +222 -0
- package/src/tools/videoTool.js +94 -60
- package/src/tools/webTool.js +9 -0
- package/src/utilities/__tests__/apiKeyPlaceholders.test.js +120 -0
- package/src/utilities/__tests__/brand.test.js +115 -0
- package/src/utilities/__tests__/flowEdgeIds.test.js +116 -0
- package/src/utilities/__tests__/flowPublish.test.js +196 -0
- package/src/utilities/__tests__/flowRunFilters.test.js +315 -0
- package/src/utilities/__tests__/useIsTouchDevice.detect.test.js +114 -0
- package/src/utilities/apiKeyPlaceholders.js +68 -0
- package/src/utilities/brand.js +93 -0
- package/src/utilities/flowEdgeIds.js +50 -0
- package/src/utilities/flowPublish.js +72 -0
- package/src/utilities/flowRunFilters.js +149 -0
- package/src/utilities/userDataDir.js +5 -0
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-4BRB87En.js +1 -0
- package/web-ui/build/static/abap-BXIqiAfL.js +1 -0
- package/web-ui/build/static/abnf-0gk1i0eD.js +1 -0
- package/web-ui/build/static/abnf-jcv7vN9a.js +1 -0
- package/web-ui/build/static/accesslog-bXE2aOZl.js +1 -0
- package/web-ui/build/static/actionscript-CF-bqawj.js +1 -0
- package/web-ui/build/static/actionscript-CodwLKar.js +1 -0
- package/web-ui/build/static/ada-BBEDI84F.js +1 -0
- package/web-ui/build/static/ada-Kb6JvaxP.js +1 -0
- package/web-ui/build/static/agda-UvnMXUUo.js +1 -0
- package/web-ui/build/static/al-D5QZ0ijQ.js +1 -0
- package/web-ui/build/static/angelscript-RpvZxbeT.js +1 -0
- package/web-ui/build/static/antlr4-BPyUvfii.js +1 -0
- package/web-ui/build/static/apache-CtM2pGik.js +1 -0
- package/web-ui/build/static/apacheconf-D-i9eISH.js +1 -0
- package/web-ui/build/static/apex-Dhn_SJi4.js +1 -0
- package/web-ui/build/static/apl-HWtdSaYy.js +1 -0
- package/web-ui/build/static/applescript-Br9NrmTP.js +1 -0
- package/web-ui/build/static/applescript-DLL0TuGw.js +1 -0
- package/web-ui/build/static/aql-MjCgNRUX.js +1 -0
- package/web-ui/build/static/arcade--DFvEPVv.js +1 -0
- package/web-ui/build/static/arduino-Cqw5W_fL.js +1 -0
- package/web-ui/build/static/arduino-DIDBbB7R.js +1 -0
- package/web-ui/build/static/arff-GGvbnOhc.js +1 -0
- package/web-ui/build/static/armasm-DKLRDLs1.js +1 -0
- package/web-ui/build/static/asciidoc-CN5qfm0K.js +1 -0
- package/web-ui/build/static/asciidoc-CeQEWYOj.js +1 -0
- package/web-ui/build/static/asm6502-B1l2Hc9j.js +1 -0
- package/web-ui/build/static/asmatmel-BAojNNWJ.js +1 -0
- package/web-ui/build/static/aspectj-DqZFhwdh.js +1 -0
- package/web-ui/build/static/aspnet-C0kQPqSr.js +1 -0
- package/web-ui/build/static/autohotkey-DY25td-Z.js +1 -0
- package/web-ui/build/static/autohotkey-DlqXINgk.js +1 -0
- package/web-ui/build/static/autoit-By7J2Y34.js +1 -0
- package/web-ui/build/static/autoit-nsu9sBga.js +1 -0
- package/web-ui/build/static/avisynth-DmhvVsr-.js +1 -0
- package/web-ui/build/static/avrasm-CHfBwwoQ.js +1 -0
- package/web-ui/build/static/avro-idl-BKgIWEIF.js +1 -0
- package/web-ui/build/static/awk-CpAb4d4E.js +1 -0
- package/web-ui/build/static/axapta-CM4aTfCZ.js +1 -0
- package/web-ui/build/static/bash-D1KTDlk-.js +1 -0
- package/web-ui/build/static/bash-DShkskxb.js +1 -0
- package/web-ui/build/static/basic-C4CfKvhg.js +1 -0
- package/web-ui/build/static/basic-CkQS4VwL.js +1 -0
- package/web-ui/build/static/batch-DZtrClI1.js +1 -0
- package/web-ui/build/static/bbcode-CY2FsfaO.js +1 -0
- package/web-ui/build/static/bicep-BeSEpm_3.js +1 -0
- package/web-ui/build/static/birb-huu22Mwu.js +1 -0
- package/web-ui/build/static/bison-CmbxfR57.js +1 -0
- package/web-ui/build/static/bnf-c2l_4HXN.js +1 -0
- package/web-ui/build/static/bnf-wucEDTqY.js +1 -0
- package/web-ui/build/static/brainfuck-CzWBg5U7.js +1 -0
- package/web-ui/build/static/brainfuck-I_YQ4sma.js +1 -0
- package/web-ui/build/static/brightscript-LOkD4eYW.js +1 -0
- package/web-ui/build/static/bro-CLJ7Afqo.js +1 -0
- package/web-ui/build/static/bsl-DbUgC2FQ.js +1 -0
- package/web-ui/build/static/c-C0S2D2ge.js +1 -0
- package/web-ui/build/static/c-KH25O_pL.js +1 -0
- package/web-ui/build/static/c-like-DtAFxyl_.js +1 -0
- package/web-ui/build/static/cal-uGiVJBNC.js +1 -0
- package/web-ui/build/static/capnproto-DSLchjOW.js +1 -0
- package/web-ui/build/static/ceylon-Bbxk66YL.js +1 -0
- package/web-ui/build/static/cfscript-CjDdgKbl.js +1 -0
- package/web-ui/build/static/chaiscript-CnRXaMae.js +1 -0
- package/web-ui/build/static/cil-CM9ygF3R.js +1 -0
- package/web-ui/build/static/clean-ppAH0SYy.js +1 -0
- package/web-ui/build/static/clojure-C5LVccGq.js +1 -0
- package/web-ui/build/static/clojure-DtLXiuuC.js +1 -0
- package/web-ui/build/static/clojure-repl-fSdrYuup.js +1 -0
- package/web-ui/build/static/cmake-AD1fuzSY.js +1 -0
- package/web-ui/build/static/cmake-D-o08Yta.js +1 -0
- package/web-ui/build/static/cobol-bDh1KHf9.js +1 -0
- package/web-ui/build/static/coffeescript-D8InK8kf.js +1 -0
- package/web-ui/build/static/coffeescript-MKWUOXb5.js +1 -0
- package/web-ui/build/static/concurnas-CR56nj6R.js +1 -0
- package/web-ui/build/static/coq-DDLBsBJu.js +1 -0
- package/web-ui/build/static/coq-WbhtANeW.js +1 -0
- package/web-ui/build/static/cos-Bfmre3op.js +1 -0
- package/web-ui/build/static/cpp-Cdy6A7gI.js +1 -0
- package/web-ui/build/static/cpp-De2KZejr.js +1 -0
- package/web-ui/build/static/crmsh-uf3vbKnN.js +1 -0
- package/web-ui/build/static/crystal-BHMyEVPP.js +1 -0
- package/web-ui/build/static/crystal-DXAQwftg.js +1 -0
- package/web-ui/build/static/csharp-Ci2MRG6L.js +1 -0
- package/web-ui/build/static/csharp-D8MV2a7f.js +1 -0
- package/web-ui/build/static/cshtml-kVj3v3uY.js +1 -0
- package/web-ui/build/static/csp-B83CCdVc.js +1 -0
- package/web-ui/build/static/csp-DUO7zlPh.js +1 -0
- package/web-ui/build/static/css-BWsx7mtO.js +1 -0
- package/web-ui/build/static/css-extras-oHch2Y5C.js +1 -0
- package/web-ui/build/static/csv-DIf0iNlc.js +1 -0
- package/web-ui/build/static/cypher-B1rOF_f3.js +1 -0
- package/web-ui/build/static/d-BUgLS87u.js +1 -0
- package/web-ui/build/static/d-ClM8XTCr.js +1 -0
- package/web-ui/build/static/dart-D5rVGtrb.js +1 -0
- package/web-ui/build/static/dart-Oal__k4m.js +1 -0
- package/web-ui/build/static/dataweave-B0uxnNDC.js +1 -0
- package/web-ui/build/static/dax-B9z6d1P6.js +1 -0
- package/web-ui/build/static/delphi-KMlx8q8A.js +1 -0
- package/web-ui/build/static/dhall-DLWFgSR8.js +1 -0
- package/web-ui/build/static/diff-DDMGnyhE.js +1 -0
- package/web-ui/build/static/diff-yg1oXq3U.js +1 -0
- package/web-ui/build/static/django-BDtkIu_c.js +1 -0
- package/web-ui/build/static/django-Bkn9HlyQ.js +1 -0
- package/web-ui/build/static/dns-Bx1VHfo6.js +1 -0
- package/web-ui/build/static/dns-zone-file-Bgn5zn_J.js +1 -0
- package/web-ui/build/static/docker-CTdrZJHc.js +1 -0
- package/web-ui/build/static/dockerfile-B7ziWbf_.js +1 -0
- package/web-ui/build/static/dos-cbBC5Icj.js +1 -0
- package/web-ui/build/static/dot-JXSVTLEH.js +1 -0
- package/web-ui/build/static/dsconfig-sEua2C2o.js +1 -0
- package/web-ui/build/static/dts-Zem_gT_O.js +1 -0
- package/web-ui/build/static/dust-B-dZ6-uQ.js +1 -0
- package/web-ui/build/static/ebnf-CXfeZoXF.js +1 -0
- package/web-ui/build/static/ebnf-raQs4FpT.js +1 -0
- package/web-ui/build/static/editorconfig-hp8ARbHf.js +1 -0
- package/web-ui/build/static/eiffel-tO3jaG00.js +1 -0
- package/web-ui/build/static/ejs-BGmD5Rvl.js +1 -0
- package/web-ui/build/static/elixir-CF0JDN9L.js +1 -0
- package/web-ui/build/static/elixir-CFSil_Ou.js +1 -0
- package/web-ui/build/static/elm-As6XaD-g.js +1 -0
- package/web-ui/build/static/elm-pw5GpqTZ.js +1 -0
- package/web-ui/build/static/erb-BrpCJIyN.js +1 -0
- package/web-ui/build/static/erb-D2_eJU9C.js +1 -0
- package/web-ui/build/static/erlang-5rSv6NMZ.js +1 -0
- package/web-ui/build/static/erlang-RCAxVMBd.js +1 -0
- package/web-ui/build/static/erlang-repl-BN0h_6XR.js +1 -0
- package/web-ui/build/static/etlua-BMtMnKtv.js +1 -0
- package/web-ui/build/static/excel-CRNS57iM.js +1 -0
- package/web-ui/build/static/excel-formula-BNw56R2m.js +1 -0
- package/web-ui/build/static/factor-7lsloWTf.js +1 -0
- package/web-ui/build/static/false-CQUvGnfd.js +1 -0
- package/web-ui/build/static/firestore-security-rules-WC1PabFS.js +1 -0
- package/web-ui/build/static/fix-Cs6kLeYV.js +1 -0
- package/web-ui/build/static/flix-1fdMgw2I.js +1 -0
- package/web-ui/build/static/flow-CRPduKSH.js +1 -0
- package/web-ui/build/static/fortran-C-3TUt5R.js +1 -0
- package/web-ui/build/static/fortran-CA4bbZCj.js +1 -0
- package/web-ui/build/static/fsharp-BScjCFae.js +1 -0
- package/web-ui/build/static/fsharp-BtHWuW4o.js +1 -0
- package/web-ui/build/static/ftl-Re-S2zvF.js +1 -0
- package/web-ui/build/static/gams-Cr12l-cM.js +1 -0
- package/web-ui/build/static/gap-H0O9-Zju.js +1 -0
- package/web-ui/build/static/gauss-CW8jwURx.js +1 -0
- package/web-ui/build/static/gcode-CIxfYtg9.js +1 -0
- package/web-ui/build/static/gcode-CVqRWYeB.js +1 -0
- package/web-ui/build/static/gdscript-BltZCaKl.js +1 -0
- package/web-ui/build/static/gedcom-nMT5ety_.js +1 -0
- package/web-ui/build/static/gherkin-B4M7CGOo.js +1 -0
- package/web-ui/build/static/gherkin-DumuqAQF.js +1 -0
- package/web-ui/build/static/git-BBiBlZ5H.js +1 -0
- package/web-ui/build/static/glsl-D8ckiRVo.js +1 -0
- package/web-ui/build/static/glsl-Z4VdDyPa.js +1 -0
- package/web-ui/build/static/gml-BHuSndHE.js +1 -0
- package/web-ui/build/static/gml-DZpfN_A4.js +1 -0
- package/web-ui/build/static/gn-BjpAHNh_.js +1 -0
- package/web-ui/build/static/go-BeZ9IgZB.js +1 -0
- package/web-ui/build/static/go-HEXrcgIc.js +1 -0
- package/web-ui/build/static/go-module-BGdPb7sP.js +1 -0
- package/web-ui/build/static/golo-Cr70KUbI.js +1 -0
- package/web-ui/build/static/gradle-C7MXrDnB.js +1 -0
- package/web-ui/build/static/graphql-CJK0wQjf.js +1 -0
- package/web-ui/build/static/groovy-Bwe7hkFG.js +1 -0
- package/web-ui/build/static/groovy-Dc6WDoKa.js +1 -0
- package/web-ui/build/static/haml-BSsAjltt.js +1 -0
- package/web-ui/build/static/haml-CZih7X_4.js +1 -0
- package/web-ui/build/static/handlebars-CN8hCpsy.js +1 -0
- package/web-ui/build/static/handlebars-XBLc7i13.js +1 -0
- package/web-ui/build/static/haskell-BH9WhK10.js +1 -0
- package/web-ui/build/static/haskell-Djf2J1vd.js +1 -0
- package/web-ui/build/static/haxe-BllD-W9e.js +1 -0
- package/web-ui/build/static/haxe-DY8Hyn7u.js +1 -0
- package/web-ui/build/static/hcl-CfktAP2o.js +1 -0
- package/web-ui/build/static/hlsl-B2JSOD9d.js +1 -0
- package/web-ui/build/static/hoon-BILyDobB.js +1 -0
- package/web-ui/build/static/hpkp-Bb8rXx4p.js +1 -0
- package/web-ui/build/static/hsp-BmjeJC21.js +1 -0
- package/web-ui/build/static/hsts-DJhW57Fu.js +1 -0
- package/web-ui/build/static/htmlbars-CJe_ZLjw.js +1 -0
- package/web-ui/build/static/http-D7SlABvQ.js +1 -0
- package/web-ui/build/static/http-DEUJqmEm.js +1 -0
- package/web-ui/build/static/hy-DVfsgEbr.js +1 -0
- package/web-ui/build/static/ichigojam-CPdz2bOt.js +1 -0
- package/web-ui/build/static/icon-DYK9RbU9.js +1 -0
- package/web-ui/build/static/icu-message-format-HiZB_alB.js +1 -0
- package/web-ui/build/static/idris-Clk3tJIE.js +1 -0
- package/web-ui/build/static/iecst-D7wkeksq.js +1 -0
- package/web-ui/build/static/ignore-GSm-L3jG.js +1 -0
- package/web-ui/build/static/index-BJe5td0v.js +13 -0
- package/web-ui/build/static/index-BYvljeMN.js +1 -0
- package/web-ui/build/static/index-CLelJq9j.js +1156 -0
- package/web-ui/build/static/index-f5UnFSsY.css +1 -0
- package/web-ui/build/static/inform7-D3gc0hSc.js +1 -0
- package/web-ui/build/static/inform7-DLdvZTxX.js +1 -0
- package/web-ui/build/static/ini-CVcWx1TA.js +1 -0
- package/web-ui/build/static/ini-CxYBdsvZ.js +1 -0
- package/web-ui/build/static/io-D760QF0i.js +1 -0
- package/web-ui/build/static/irpf90-DfkXdZut.js +1 -0
- package/web-ui/build/static/isbl-Bl3W-krY.js +1 -0
- package/web-ui/build/static/j-DyJj9FSc.js +1 -0
- package/web-ui/build/static/java-CLw1cH97.js +1 -0
- package/web-ui/build/static/java-vXaHBzP4.js +1 -0
- package/web-ui/build/static/javadoc-p5hIe48g.js +1 -0
- package/web-ui/build/static/javadoclike-OXi-sQ0q.js +1 -0
- package/web-ui/build/static/javascript-CTSqES8o.js +1 -0
- package/web-ui/build/static/javastacktrace-PC9-3moA.js +1 -0
- package/web-ui/build/static/jboss-cli-CxOZKDLi.js +1 -0
- package/web-ui/build/static/jexl-C4kSXhD1.js +1 -0
- package/web-ui/build/static/jolie-CntM8cWx.js +1 -0
- package/web-ui/build/static/jq-D_4bTCm0.js +1 -0
- package/web-ui/build/static/js-extras-Cx9VAZJd.js +1 -0
- package/web-ui/build/static/js-templates-BqyJUDxJ.js +1 -0
- package/web-ui/build/static/jsdoc-CNHLgAph.js +1 -0
- package/web-ui/build/static/json-BXIFrbVC.js +1 -0
- package/web-ui/build/static/json-DRUrJL_F.js +1 -0
- package/web-ui/build/static/json5-EsTrOpXr.js +1 -0
- package/web-ui/build/static/jsonp-RijEuTJY.js +1 -0
- package/web-ui/build/static/jsstacktrace-dM13uE1y.js +1 -0
- package/web-ui/build/static/jsx-Cf0j02DZ.js +1 -0
- package/web-ui/build/static/julia-BLrtj5Dj.js +1 -0
- package/web-ui/build/static/julia-D0PJgQhi.js +1 -0
- package/web-ui/build/static/julia-repl-BLnLCve4.js +1 -0
- package/web-ui/build/static/keepalived-SvzEYloD.js +1 -0
- package/web-ui/build/static/keyman-B5l2mmmE.js +1 -0
- package/web-ui/build/static/kotlin-B_6COR1e.js +1 -0
- package/web-ui/build/static/kotlin-vd1Xdz6D.js +1 -0
- package/web-ui/build/static/kumir-8mIZWgJQ.js +1 -0
- package/web-ui/build/static/kusto-CoV2oHqt.js +1 -0
- package/web-ui/build/static/lasso-BjjUNa_o.js +1 -0
- package/web-ui/build/static/latex-C9KOfuFk.js +1 -0
- package/web-ui/build/static/latex-DhLttY-I.js +1 -0
- package/web-ui/build/static/latte-CaYNaOoK.js +1 -0
- package/web-ui/build/static/ldif-DFxnpH3G.js +1 -0
- package/web-ui/build/static/leaf-DrMpC83a.js +1 -0
- package/web-ui/build/static/less-DUoYpEFn.js +1 -0
- package/web-ui/build/static/less-nh0XCcut.js +1 -0
- package/web-ui/build/static/lilypond-BlqjLr3W.js +1 -0
- package/web-ui/build/static/liquid-BVGHSG0T.js +1 -0
- package/web-ui/build/static/lisp-CEK8BtYQ.js +1 -0
- package/web-ui/build/static/lisp-D_jGHxhc.js +1 -0
- package/web-ui/build/static/livecodeserver-CFUDw_SK.js +1 -0
- package/web-ui/build/static/livescript-C5xzpiLM.js +1 -0
- package/web-ui/build/static/livescript-CKoPcK0c.js +1 -0
- package/web-ui/build/static/llvm-BBOVIeTl.js +1 -0
- package/web-ui/build/static/llvm-ioC5bCUB.js +1 -0
- package/web-ui/build/static/log-CPYTqm4T.js +1 -0
- package/web-ui/build/static/lolcode-BkT93adT.js +1 -0
- package/web-ui/build/static/lsl-M98YPNRW.js +1 -0
- package/web-ui/build/static/lua-D7Lum5n9.js +1 -0
- package/web-ui/build/static/lua-DHyr0QwE.js +1 -0
- package/web-ui/build/static/magma-BwMFjwQu.js +1 -0
- package/web-ui/build/static/makefile-BFYZ-SfG.js +1 -0
- package/web-ui/build/static/makefile-D6oyR2lD.js +1 -0
- package/web-ui/build/static/markdown-6jtg6KZm.js +1 -0
- package/web-ui/build/static/markdown-DTLtPgeP.js +1 -0
- package/web-ui/build/static/markup-templating-K8uoAIqY.js +1 -0
- package/web-ui/build/static/mathematica-cW5hOuB2.js +1 -0
- package/web-ui/build/static/matlab-CwSNWEq8.js +1 -0
- package/web-ui/build/static/matlab-MQ972BY-.js +1 -0
- package/web-ui/build/static/maxima-CMSFLri-.js +1 -0
- package/web-ui/build/static/maxscript-BzcoS2KA.js +1 -0
- package/web-ui/build/static/mel-Cd20pAs-.js +1 -0
- package/web-ui/build/static/mel-KWG5N49g.js +1 -0
- package/web-ui/build/static/mercury-eW1ljJh0.js +1 -0
- package/web-ui/build/static/mermaid-D3zeCM84.js +1 -0
- package/web-ui/build/static/mipsasm-B5g6Ndra.js +1 -0
- package/web-ui/build/static/mizar-C_nZ0Ts9.js +1 -0
- package/web-ui/build/static/mizar-CuTNEv2t.js +1 -0
- package/web-ui/build/static/mojolicious-C1Xq--lT.js +1 -0
- package/web-ui/build/static/mongodb-C_3giArw.js +1 -0
- package/web-ui/build/static/monkey-DQ1olPd-.js +1 -0
- package/web-ui/build/static/monkey-n4Tbrep7.js +1 -0
- package/web-ui/build/static/moonscript-CmnQJuIL.js +1 -0
- package/web-ui/build/static/moonscript-DXgmWjLy.js +1 -0
- package/web-ui/build/static/n1ql-531a3W-1.js +1 -0
- package/web-ui/build/static/n1ql-BYH9EvME.js +1 -0
- package/web-ui/build/static/n4js-Cy0LcM-V.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-CKOztBDD.js +1 -0
- package/web-ui/build/static/naniscript-oLFpxBGE.js +1 -0
- package/web-ui/build/static/nasm-DLPnwFkM.js +1 -0
- package/web-ui/build/static/neon-Cn03wGUR.js +1 -0
- package/web-ui/build/static/nevod-C_VRvbdf.js +1 -0
- package/web-ui/build/static/nginx-60SpLv4t.js +1 -0
- package/web-ui/build/static/nginx-DZLHid-q.js +1 -0
- package/web-ui/build/static/nim-BnrHdqGC.js +1 -0
- package/web-ui/build/static/nim-Ds3pmwtE.js +1 -0
- package/web-ui/build/static/nix-Dl-dS0w4.js +1 -0
- package/web-ui/build/static/nix-jL62FzTz.js +1 -0
- package/web-ui/build/static/node-repl-BAuDzNZd.js +1 -0
- package/web-ui/build/static/nsis-CEnFjfNr.js +1 -0
- package/web-ui/build/static/nsis-CcCz6HIu.js +1 -0
- package/web-ui/build/static/objectivec-CZXfVowS.js +1 -0
- package/web-ui/build/static/objectivec-CuaFU-Ef.js +1 -0
- package/web-ui/build/static/ocaml-BGAzfwAx.js +1 -0
- package/web-ui/build/static/ocaml-BoO1lU26.js +1 -0
- package/web-ui/build/static/opencl-DAnD5xP-.js +1 -0
- package/web-ui/build/static/openqasm-CO7gdVj9.js +1 -0
- package/web-ui/build/static/openscad-B2wMEMQR.js +1 -0
- package/web-ui/build/static/oxygene-1erv93gF.js +1 -0
- package/web-ui/build/static/oz-D3334gi7.js +1 -0
- package/web-ui/build/static/parigp-rQZTN8zi.js +1 -0
- package/web-ui/build/static/parser-B4ZSZ1ig.js +1 -0
- package/web-ui/build/static/parser3-CCCjkYLG.js +1 -0
- package/web-ui/build/static/pascal-DeC9Pvom.js +1 -0
- package/web-ui/build/static/pascaligo-CT2u6UpO.js +1 -0
- package/web-ui/build/static/pcaxis-CvlRg6t4.js +1 -0
- package/web-ui/build/static/peoplecode-BYahULz2.js +1 -0
- package/web-ui/build/static/perl-CKgvyY59.js +1 -0
- package/web-ui/build/static/perl-E7sx7Izv.js +1 -0
- package/web-ui/build/static/pf-D9wnFBt7.js +1 -0
- package/web-ui/build/static/pgsql-CrlBdRAn.js +1 -0
- package/web-ui/build/static/php-D2O-B3y7.js +1 -0
- package/web-ui/build/static/php-extras-BKqZuzgt.js +1 -0
- package/web-ui/build/static/php-nfXl9WfB.js +1 -0
- package/web-ui/build/static/php-template-Cg8ERLNQ.js +1 -0
- package/web-ui/build/static/phpdoc-Z1u90OwH.js +1 -0
- package/web-ui/build/static/plaintext-DkNVeXWx.js +1 -0
- package/web-ui/build/static/plsql-DO5fJNhS.js +1 -0
- package/web-ui/build/static/pony-DXIqq5Bk.js +1 -0
- package/web-ui/build/static/powerquery-B2ovxJZi.js +1 -0
- package/web-ui/build/static/powershell-BVeqqari.js +1 -0
- package/web-ui/build/static/powershell-CskV4qWh.js +1 -0
- package/web-ui/build/static/processing-D90SJpnq.js +1 -0
- package/web-ui/build/static/processing-DP2mf97Z.js +1 -0
- package/web-ui/build/static/profile-H6zk8v_f.js +1 -0
- package/web-ui/build/static/prolog-AUfxYiJV.js +1 -0
- package/web-ui/build/static/prolog-Dz2WdsVN.js +1 -0
- package/web-ui/build/static/promql-CloMJmMW.js +1 -0
- package/web-ui/build/static/properties-CTl3mnrP.js +1 -0
- package/web-ui/build/static/properties-D2RfteTZ.js +1 -0
- package/web-ui/build/static/protobuf-Be9oqQCu.js +1 -0
- package/web-ui/build/static/protobuf-BgG8zUnY.js +1 -0
- package/web-ui/build/static/psl-Bqx8iN9e.js +1 -0
- package/web-ui/build/static/pug-CHfFC0Wg.js +1 -0
- package/web-ui/build/static/puppet-__1ifzZS.js +1 -0
- package/web-ui/build/static/puppet-pbtRCMgd.js +1 -0
- package/web-ui/build/static/pure-B9STuf4F.js +1 -0
- package/web-ui/build/static/purebasic-7ADyn-Ce.js +1 -0
- package/web-ui/build/static/purebasic-Bc06YQcD.js +1 -0
- package/web-ui/build/static/purescript-CU-dDebr.js +1 -0
- package/web-ui/build/static/python-BEsXrEbi.js +1 -0
- package/web-ui/build/static/python-CZFrgH2X.js +1 -0
- package/web-ui/build/static/python-repl-CI9GmJce.js +1 -0
- package/web-ui/build/static/q-E7xvTGRo.js +1 -0
- package/web-ui/build/static/q-hvg9aQoY.js +1 -0
- package/web-ui/build/static/qml-DkZWcxEv.js +1 -0
- package/web-ui/build/static/qml-DpdWla8G.js +1 -0
- package/web-ui/build/static/qore-Dsm7ACR_.js +1 -0
- package/web-ui/build/static/qsharp-BBec6MJR.js +1 -0
- package/web-ui/build/static/r-CTVkq_Ky.js +1 -0
- package/web-ui/build/static/r-DHGNCupF.js +1 -0
- package/web-ui/build/static/racket-hoSh4YPx.js +1 -0
- package/web-ui/build/static/reason-CQPUIbsm.js +1 -0
- package/web-ui/build/static/reasonml-BXtFFSTZ.js +1 -0
- package/web-ui/build/static/regex-BNkF_ufb.js +1 -0
- package/web-ui/build/static/rego-BXHrjItC.js +1 -0
- package/web-ui/build/static/renpy-CBQvK_5t.js +1 -0
- package/web-ui/build/static/rest-Bf8hzmF1.js +1 -0
- package/web-ui/build/static/rib-D0a4KzlP.js +1 -0
- package/web-ui/build/static/rip-DchN4BQN.js +1 -0
- package/web-ui/build/static/roboconf-HXnyGNTm.js +1 -0
- package/web-ui/build/static/roboconf-zfK6mgmU.js +1 -0
- package/web-ui/build/static/robotframework-DnP-vXyd.js +1 -0
- package/web-ui/build/static/routeros-CDirYxZY.js +1 -0
- package/web-ui/build/static/rsl-BCK_msc-.js +1 -0
- package/web-ui/build/static/ruby--mXX6GNK.js +1 -0
- package/web-ui/build/static/ruby-BIdQYq0Y.js +1 -0
- package/web-ui/build/static/ruleslanguage-BD07s5RU.js +1 -0
- package/web-ui/build/static/rust-Bgni9V7U.js +1 -0
- package/web-ui/build/static/rust-OywmQ2ox.js +1 -0
- package/web-ui/build/static/sas-B6-82htH.js +1 -0
- package/web-ui/build/static/sas-k9XEScbR.js +1 -0
- package/web-ui/build/static/sass-BOvNBStT.js +1 -0
- package/web-ui/build/static/scala-At07fmMd.js +1 -0
- package/web-ui/build/static/scala-DUOfqSaU.js +1 -0
- package/web-ui/build/static/scheme-B87lC0bK.js +1 -0
- package/web-ui/build/static/scheme-BS7OzWRX.js +1 -0
- package/web-ui/build/static/scilab-Bmn4jjcu.js +1 -0
- package/web-ui/build/static/scss-DTeB95yE.js +1 -0
- package/web-ui/build/static/scss-xilnl6Dx.js +1 -0
- package/web-ui/build/static/shell-CKetyy4y.js +1 -0
- package/web-ui/build/static/shell-session-B6rat2c7.js +1 -0
- package/web-ui/build/static/smali-C9O9CXOD.js +1 -0
- package/web-ui/build/static/smali-CBkgbinS.js +1 -0
- package/web-ui/build/static/smalltalk-CuUjFHiz.js +1 -0
- package/web-ui/build/static/smalltalk-D0xhFL9b.js +1 -0
- package/web-ui/build/static/smarty-CY0N0d5x.js +1 -0
- package/web-ui/build/static/sml-BVAw3fjB.js +1 -0
- package/web-ui/build/static/sml-CO9XB1ax.js +1 -0
- package/web-ui/build/static/solidity-BNixD4Dx.js +1 -0
- package/web-ui/build/static/solution-file-DHyGXf2y.js +1 -0
- package/web-ui/build/static/soy-Cxgjntsl.js +1 -0
- package/web-ui/build/static/sparql-CDLqu9vy.js +1 -0
- package/web-ui/build/static/splunk-spl-Cmkl_Xmw.js +1 -0
- package/web-ui/build/static/sqf-CIGKolw3.js +1 -0
- package/web-ui/build/static/sqf-Cfp_lC6-.js +1 -0
- package/web-ui/build/static/sql-DHOGwYxe.js +1 -0
- package/web-ui/build/static/sql-QIw1Q2yi.js +1 -0
- package/web-ui/build/static/sql_more-C0b3-InT.js +1 -0
- package/web-ui/build/static/squirrel-DASToo1F.js +1 -0
- package/web-ui/build/static/stan-DHMkcFZg.js +1 -0
- package/web-ui/build/static/stan-No3nsdnQ.js +1 -0
- package/web-ui/build/static/stata-Brkzu5Nv.js +1 -0
- package/web-ui/build/static/step21-D2l5M5Ml.js +1 -0
- package/web-ui/build/static/stylus-Bx6FaZN_.js +1 -0
- package/web-ui/build/static/stylus-CVkTaPns.js +1 -0
- package/web-ui/build/static/subunit-CDrsAMuL.js +1 -0
- package/web-ui/build/static/swift-BSw_pS-l.js +1 -0
- package/web-ui/build/static/swift-BWyqwIo8.js +1 -0
- package/web-ui/build/static/systemd-BwqpYcJK.js +1 -0
- package/web-ui/build/static/t4-cs-CwsJLOxV.js +1 -0
- package/web-ui/build/static/t4-templating-BfxY01xf.js +1 -0
- package/web-ui/build/static/t4-vb-BhsKKFhp.js +1 -0
- package/web-ui/build/static/taggerscript-Bkew95or.js +1 -0
- package/web-ui/build/static/tap-DHovcHbS.js +1 -0
- package/web-ui/build/static/tap-DPl9uPo4.js +1 -0
- package/web-ui/build/static/tcl-BeozHO-f.js +1 -0
- package/web-ui/build/static/tcl-Df_8ItQH.js +1 -0
- package/web-ui/build/static/textile-B3m_f58b.js +1 -0
- package/web-ui/build/static/thrift-D20n-HpW.js +1 -0
- package/web-ui/build/static/toml-C-fTAonK.js +1 -0
- package/web-ui/build/static/tp-hGbXe5Eo.js +1 -0
- package/web-ui/build/static/tremor-BaVOtRFz.js +1 -0
- package/web-ui/build/static/tsx-ChPInNl0.js +1 -0
- package/web-ui/build/static/tt2-DAIJ8cpz.js +1 -0
- package/web-ui/build/static/turtle-B7z_y-PK.js +1 -0
- package/web-ui/build/static/twig-TUEkve6W.js +1 -0
- package/web-ui/build/static/twig-stKDItz7.js +1 -0
- package/web-ui/build/static/typescript-BPdM-QOM.js +1 -0
- package/web-ui/build/static/typescript-DjSY4MvL.js +1 -0
- package/web-ui/build/static/typoscript-BQHgQtEL.js +1 -0
- package/web-ui/build/static/unrealscript-g8yNPQQ5.js +1 -0
- package/web-ui/build/static/uorazor-CnuMiQz9.js +1 -0
- package/web-ui/build/static/uri-CfioiemU.js +1 -0
- package/web-ui/build/static/v-B69Oau14.js +1 -0
- package/web-ui/build/static/vala-C0PjlK3l.js +1 -0
- package/web-ui/build/static/vala-COgjD3gU.js +1 -0
- package/web-ui/build/static/vbnet-CklOnyuR.js +1 -0
- package/web-ui/build/static/vbnet-MxHUC5Mz.js +1 -0
- package/web-ui/build/static/vbscript-BxQnA97w.js +1 -0
- package/web-ui/build/static/vbscript-html-DOtde7dD.js +1 -0
- package/web-ui/build/static/velocity-l8B9m66X.js +1 -0
- package/web-ui/build/static/verilog-DF6dF-Vp.js +1 -0
- package/web-ui/build/static/verilog-Dgb9SDRX.js +1 -0
- package/web-ui/build/static/vhdl-0GarU_AK.js +1 -0
- package/web-ui/build/static/vhdl-BfPQnOdI.js +1 -0
- package/web-ui/build/static/vim-Likg_-II.js +1 -0
- package/web-ui/build/static/vim-k53Sj7A3.js +1 -0
- package/web-ui/build/static/visual-basic-BNVZCzlV.js +1 -0
- package/web-ui/build/static/warpscript-BkLK5iuW.js +1 -0
- package/web-ui/build/static/wasm-CQhA1ece.js +1 -0
- package/web-ui/build/static/web-idl-DmNsI0kE.js +1 -0
- package/web-ui/build/static/wiki-B3z4pmra.js +1 -0
- package/web-ui/build/static/wolfram-Dsf21d_g.js +1 -0
- package/web-ui/build/static/wren-BZXZlzrL.js +1 -0
- package/web-ui/build/static/x86asm-DpWGZhJU.js +1 -0
- package/web-ui/build/static/xeora-8xPZN4DH.js +1 -0
- package/web-ui/build/static/xl-XkdWYMGl.js +1 -0
- package/web-ui/build/static/xml-BBdROEWt.js +1 -0
- package/web-ui/build/static/xml-doc-Cjs4OpTe.js +1 -0
- package/web-ui/build/static/xojo-nCen1FPx.js +1 -0
- package/web-ui/build/static/xquery-CBFkAxo1.js +1 -0
- package/web-ui/build/static/xquery-Dwsc1weX.js +1 -0
- package/web-ui/build/static/yaml-DzSAh6jl.js +1 -0
- package/web-ui/build/static/yaml-Lg8gnEUU.js +1 -0
- package/web-ui/build/static/yang-Bd-v2b0k.js +1 -0
- package/web-ui/build/static/zephir-wbJOizIa.js +1 -0
- package/web-ui/build/static/zig-Cz384XjE.js +1 -0
- package/web-ui/build/static/1c-Cxgysx0K.js +0 -1
- package/web-ui/build/static/abap-D9Pd8DUG.js +0 -1
- package/web-ui/build/static/abnf-CHs5P8yl.js +0 -1
- package/web-ui/build/static/abnf-D5OtFEZO.js +0 -1
- package/web-ui/build/static/accesslog-CTD5Frmr.js +0 -1
- package/web-ui/build/static/actionscript-BN0BKQI7.js +0 -1
- package/web-ui/build/static/actionscript-DQNwbYlU.js +0 -1
- package/web-ui/build/static/ada-8O7AmGii.js +0 -1
- package/web-ui/build/static/ada-p8y2qCLB.js +0 -1
- package/web-ui/build/static/agda-BzT4bKSx.js +0 -1
- package/web-ui/build/static/al-Caq7o9RG.js +0 -1
- package/web-ui/build/static/angelscript-DivMpSHf.js +0 -1
- package/web-ui/build/static/antlr4-B1D_tnKH.js +0 -1
- package/web-ui/build/static/apache-l88_LooT.js +0 -1
- package/web-ui/build/static/apacheconf-kaxXABFE.js +0 -1
- package/web-ui/build/static/apex-CSdSRWUv.js +0 -1
- package/web-ui/build/static/apl-CHwVg89T.js +0 -1
- package/web-ui/build/static/applescript-C64qdYZf.js +0 -1
- package/web-ui/build/static/applescript-CqTGrBVp.js +0 -1
- package/web-ui/build/static/aql-BwKKr7z7.js +0 -1
- package/web-ui/build/static/arcade-C6oqHEwh.js +0 -1
- package/web-ui/build/static/arduino-DB4E20Km.js +0 -1
- package/web-ui/build/static/arduino-DKpgmHjE.js +0 -1
- package/web-ui/build/static/arff-CBbf8E8O.js +0 -1
- package/web-ui/build/static/armasm-Bogg7lrz.js +0 -1
- package/web-ui/build/static/asciidoc-3ZlDsfKD.js +0 -1
- package/web-ui/build/static/asciidoc-Cc88g_au.js +0 -1
- package/web-ui/build/static/asm6502-B4rN-vZ1.js +0 -1
- package/web-ui/build/static/asmatmel-B8zZLWGk.js +0 -1
- package/web-ui/build/static/aspectj-XdNtCtbN.js +0 -1
- package/web-ui/build/static/aspnet-DZVKB5n1.js +0 -1
- package/web-ui/build/static/autohotkey-CxDWLQqM.js +0 -1
- package/web-ui/build/static/autohotkey-DJStPrtS.js +0 -1
- package/web-ui/build/static/autoit-BWirJOCg.js +0 -1
- package/web-ui/build/static/autoit-CJcfmsnl.js +0 -1
- package/web-ui/build/static/avisynth-C7JQe3L7.js +0 -1
- package/web-ui/build/static/avrasm-CMiuHQvu.js +0 -1
- package/web-ui/build/static/avro-idl-kaRVyxMP.js +0 -1
- package/web-ui/build/static/awk-CQ70Cyh1.js +0 -1
- package/web-ui/build/static/axapta-DRxAzlG8.js +0 -1
- package/web-ui/build/static/bash-B2XqEYpT.js +0 -1
- package/web-ui/build/static/bash-D-D1taMA.js +0 -1
- package/web-ui/build/static/basic-Da1x7OIZ.js +0 -1
- package/web-ui/build/static/basic-Dslk2ZwT.js +0 -1
- package/web-ui/build/static/batch-B0wJNPoF.js +0 -1
- package/web-ui/build/static/bbcode-BXDdc2HS.js +0 -1
- package/web-ui/build/static/bicep-iiH-nx9J.js +0 -1
- package/web-ui/build/static/birb-DuTqqibI.js +0 -1
- package/web-ui/build/static/bison-D1Hw6owA.js +0 -1
- package/web-ui/build/static/bnf-BRhzfr87.js +0 -1
- package/web-ui/build/static/bnf-u1Iy1Ku7.js +0 -1
- package/web-ui/build/static/brainfuck-C4R5VJ3_.js +0 -1
- package/web-ui/build/static/brainfuck-C8niWF0i.js +0 -1
- package/web-ui/build/static/brightscript-DavMfkHx.js +0 -1
- package/web-ui/build/static/bro-CEMPoYum.js +0 -1
- package/web-ui/build/static/bsl-COeqiMqc.js +0 -1
- package/web-ui/build/static/c-BaaVQwFt.js +0 -1
- package/web-ui/build/static/c-BvALLiMv.js +0 -1
- package/web-ui/build/static/c-like-C4yx6s7b.js +0 -1
- package/web-ui/build/static/cal-CSxgKgNR.js +0 -1
- package/web-ui/build/static/capnproto-C9cMEmIo.js +0 -1
- package/web-ui/build/static/ceylon-Dj67Lf2T.js +0 -1
- package/web-ui/build/static/cfscript-BhALECgj.js +0 -1
- package/web-ui/build/static/chaiscript-Cg5weNRB.js +0 -1
- package/web-ui/build/static/cil-BR-JCsPu.js +0 -1
- package/web-ui/build/static/clean-xJMmqZ4X.js +0 -1
- package/web-ui/build/static/clojure-9C3tRo_T.js +0 -1
- package/web-ui/build/static/clojure-C2KNwa0h.js +0 -1
- package/web-ui/build/static/clojure-repl-B-pke3nS.js +0 -1
- package/web-ui/build/static/cmake-C0BFHpjZ.js +0 -1
- package/web-ui/build/static/cmake-DYoa_Kz_.js +0 -1
- package/web-ui/build/static/cobol-Bj_qcMsY.js +0 -1
- package/web-ui/build/static/coffeescript-C2KEz8d0.js +0 -1
- package/web-ui/build/static/coffeescript-CQsP9N_M.js +0 -1
- package/web-ui/build/static/concurnas-Ceu24KQb.js +0 -1
- package/web-ui/build/static/coq-CP7VW0bo.js +0 -1
- package/web-ui/build/static/coq-DQry0I8v.js +0 -1
- package/web-ui/build/static/cos-DAjhu7pi.js +0 -1
- package/web-ui/build/static/cpp-BwHJ0JtK.js +0 -1
- package/web-ui/build/static/cpp-Dro3stzS.js +0 -1
- package/web-ui/build/static/crmsh-Bnwknpi9.js +0 -1
- package/web-ui/build/static/crystal-B7TVeIo6.js +0 -1
- package/web-ui/build/static/crystal-Cy5JlSrW.js +0 -1
- package/web-ui/build/static/csharp-CeouYZK3.js +0 -1
- package/web-ui/build/static/csharp-Dv2oxLAS.js +0 -1
- package/web-ui/build/static/cshtml-C9IRHsFH.js +0 -1
- package/web-ui/build/static/csp-C85pVqYT.js +0 -1
- package/web-ui/build/static/csp-MJntgwIj.js +0 -1
- package/web-ui/build/static/css-DWTfQjN4.js +0 -1
- package/web-ui/build/static/css-extras-BmVbsPjr.js +0 -1
- package/web-ui/build/static/csv-zUw-JkSo.js +0 -1
- package/web-ui/build/static/cypher-DQOOp0bG.js +0 -1
- package/web-ui/build/static/d-B7Cku9c8.js +0 -1
- package/web-ui/build/static/d-Lnzvs4Wd.js +0 -1
- package/web-ui/build/static/dart-CeK_W9Mg.js +0 -1
- package/web-ui/build/static/dart-Z5nwVCn_.js +0 -1
- package/web-ui/build/static/dataweave-Bv7GTsiJ.js +0 -1
- package/web-ui/build/static/dax-CxkNT7ml.js +0 -1
- package/web-ui/build/static/delphi-BnBBHmHI.js +0 -1
- package/web-ui/build/static/dhall-DzzkunJZ.js +0 -1
- package/web-ui/build/static/diff-BKZzYJzc.js +0 -1
- package/web-ui/build/static/diff-BfTiUZV3.js +0 -1
- package/web-ui/build/static/django-BY4l8873.js +0 -1
- package/web-ui/build/static/django-NRVGlUZ_.js +0 -1
- package/web-ui/build/static/dns-Dvc8YawT.js +0 -1
- package/web-ui/build/static/dns-zone-file-CkaiOrlK.js +0 -1
- package/web-ui/build/static/docker-BQXYNHPO.js +0 -1
- package/web-ui/build/static/dockerfile-CkHfYmB1.js +0 -1
- package/web-ui/build/static/dos-Cj0YcQAg.js +0 -1
- package/web-ui/build/static/dot-zgBkKTS-.js +0 -1
- package/web-ui/build/static/dsconfig-Yy07ZSap.js +0 -1
- package/web-ui/build/static/dts-DyTWnuFT.js +0 -1
- package/web-ui/build/static/dust-CKq7f4u7.js +0 -1
- package/web-ui/build/static/ebnf-DJRrwYUt.js +0 -1
- package/web-ui/build/static/ebnf-RHbRUELR.js +0 -1
- package/web-ui/build/static/editorconfig-BPnyfBW2.js +0 -1
- package/web-ui/build/static/eiffel-yj-2JB74.js +0 -1
- package/web-ui/build/static/ejs-DitQDEAj.js +0 -1
- package/web-ui/build/static/elixir-3QGdRPiZ.js +0 -1
- package/web-ui/build/static/elixir-DjVihWJd.js +0 -1
- package/web-ui/build/static/elm-BY6TIO5U.js +0 -1
- package/web-ui/build/static/elm-CRkIBVgc.js +0 -1
- package/web-ui/build/static/erb-Djhpl6Qv.js +0 -1
- package/web-ui/build/static/erb-T-e_0q4M.js +0 -1
- package/web-ui/build/static/erlang-BHne0Sow.js +0 -1
- package/web-ui/build/static/erlang-BwFMbXMn.js +0 -1
- package/web-ui/build/static/erlang-repl-BkeLNBB1.js +0 -1
- package/web-ui/build/static/etlua-C7wAJl9b.js +0 -1
- package/web-ui/build/static/excel-DxE1g8nj.js +0 -1
- package/web-ui/build/static/excel-formula-CJfyOSIQ.js +0 -1
- package/web-ui/build/static/factor-CoKZ2w9G.js +0 -1
- package/web-ui/build/static/false-R3UgYwdZ.js +0 -1
- package/web-ui/build/static/firestore-security-rules-Na-FK95T.js +0 -1
- package/web-ui/build/static/fix-CvUjGqrP.js +0 -1
- package/web-ui/build/static/flix-DZcdobtd.js +0 -1
- package/web-ui/build/static/flow-Bs4ybDfF.js +0 -1
- package/web-ui/build/static/fortran-Bo7HQHVz.js +0 -1
- package/web-ui/build/static/fortran-C01QKAjv.js +0 -1
- package/web-ui/build/static/fsharp-Bl0db-E4.js +0 -1
- package/web-ui/build/static/fsharp-CyZIu__H.js +0 -1
- package/web-ui/build/static/ftl-CWXbnuJ8.js +0 -1
- package/web-ui/build/static/gams-BqHeBOiK.js +0 -1
- package/web-ui/build/static/gap-Dotaw9CX.js +0 -1
- package/web-ui/build/static/gauss-BT78eAPL.js +0 -1
- package/web-ui/build/static/gcode-MKCsCHbV.js +0 -1
- package/web-ui/build/static/gcode-bZIzS7dq.js +0 -1
- package/web-ui/build/static/gdscript-BfFdzROd.js +0 -1
- package/web-ui/build/static/gedcom-C-0fkvQT.js +0 -1
- package/web-ui/build/static/gherkin-Bgefs1Ac.js +0 -1
- package/web-ui/build/static/gherkin-BwLhttSG.js +0 -1
- package/web-ui/build/static/git-Cf3XNFwK.js +0 -1
- package/web-ui/build/static/glsl-BRBvgtKX.js +0 -1
- package/web-ui/build/static/glsl-Ci0Ywihb.js +0 -1
- package/web-ui/build/static/gml-BGED3ZV5.js +0 -1
- package/web-ui/build/static/gml-Bo5ybH2Z.js +0 -1
- package/web-ui/build/static/gn-Dvq3uq8q.js +0 -1
- package/web-ui/build/static/go-DEXubI7V.js +0 -1
- package/web-ui/build/static/go-DQ-rOBtr.js +0 -1
- package/web-ui/build/static/go-module-CJ0C_rZQ.js +0 -1
- package/web-ui/build/static/golo-BMZyESOG.js +0 -1
- package/web-ui/build/static/gradle-DamtVT5m.js +0 -1
- package/web-ui/build/static/graphql-BERukF58.js +0 -1
- package/web-ui/build/static/groovy-B-WmRKEQ.js +0 -1
- package/web-ui/build/static/groovy-BzgGHCpW.js +0 -1
- package/web-ui/build/static/haml-B50hpu0J.js +0 -1
- package/web-ui/build/static/haml-vZAqNnLr.js +0 -1
- package/web-ui/build/static/handlebars-ChvSiZA5.js +0 -1
- package/web-ui/build/static/handlebars-z32GTNvC.js +0 -1
- package/web-ui/build/static/haskell-BWLVCHRl.js +0 -1
- package/web-ui/build/static/haskell-CZ4HT-QV.js +0 -1
- package/web-ui/build/static/haxe-Dff2UzKb.js +0 -1
- package/web-ui/build/static/haxe-DtUMfT4Y.js +0 -1
- package/web-ui/build/static/hcl-CPdCn21C.js +0 -1
- package/web-ui/build/static/hlsl-Ddnzpafa.js +0 -1
- package/web-ui/build/static/hoon-BmzYN5g6.js +0 -1
- package/web-ui/build/static/hpkp-Cf4BtYzp.js +0 -1
- package/web-ui/build/static/hsp-CtNdizh5.js +0 -1
- package/web-ui/build/static/hsts-ChmUnrWY.js +0 -1
- package/web-ui/build/static/htmlbars-FvxUz397.js +0 -1
- package/web-ui/build/static/http-C91BqIc4.js +0 -1
- package/web-ui/build/static/http-DUkMpz6R.js +0 -1
- package/web-ui/build/static/hy-BgEorqc6.js +0 -1
- package/web-ui/build/static/ichigojam-CyJ85XqZ.js +0 -1
- package/web-ui/build/static/icon-CWVwUSUB.js +0 -1
- package/web-ui/build/static/icu-message-format-DQ5Vf-57.js +0 -1
- package/web-ui/build/static/idris-25epvnkz.js +0 -1
- package/web-ui/build/static/iecst-D_Q4A3Ao.js +0 -1
- package/web-ui/build/static/ignore-Dn3TUem-.js +0 -1
- package/web-ui/build/static/index-1GAqwN2P.js +0 -1029
- package/web-ui/build/static/index-Bbt0N_qA.css +0 -1
- package/web-ui/build/static/index-COM0znG6.js +0 -13
- package/web-ui/build/static/index-Cq1FjdFd.js +0 -1
- package/web-ui/build/static/inform7-CFrNuUCE.js +0 -1
- package/web-ui/build/static/inform7-DKEqg7Td.js +0 -1
- package/web-ui/build/static/ini-C-WeV3rA.js +0 -1
- package/web-ui/build/static/ini-DNeLlQLb.js +0 -1
- package/web-ui/build/static/io-CHx2lS-R.js +0 -1
- package/web-ui/build/static/irpf90-D4fNrYKT.js +0 -1
- package/web-ui/build/static/isbl-BwxgZUmw.js +0 -1
- package/web-ui/build/static/j-EkuSi-Ss.js +0 -1
- package/web-ui/build/static/java-BtphFsNb.js +0 -1
- package/web-ui/build/static/java-D6Ksxtks.js +0 -1
- package/web-ui/build/static/javadoc-COfrpXIF.js +0 -1
- package/web-ui/build/static/javadoclike-C0DIBgSo.js +0 -1
- package/web-ui/build/static/javascript-D9_bdns_.js +0 -1
- package/web-ui/build/static/javastacktrace-BgesTIoE.js +0 -1
- package/web-ui/build/static/jboss-cli-BCBm8RaA.js +0 -1
- package/web-ui/build/static/jexl-Bur7gjJl.js +0 -1
- package/web-ui/build/static/jolie-CG2HtqVF.js +0 -1
- package/web-ui/build/static/jq-BjcZo4Ta.js +0 -1
- package/web-ui/build/static/js-extras-DPWP-xWb.js +0 -1
- package/web-ui/build/static/js-templates-BYQFylC_.js +0 -1
- package/web-ui/build/static/jsdoc-CiOxmgl5.js +0 -1
- package/web-ui/build/static/json-C2-b3Xpo.js +0 -1
- package/web-ui/build/static/json-D7ok2MJS.js +0 -1
- package/web-ui/build/static/json5-DRNOdkus.js +0 -1
- package/web-ui/build/static/jsonp-FFJzAxUk.js +0 -1
- package/web-ui/build/static/jsstacktrace-C4ki-LaP.js +0 -1
- package/web-ui/build/static/jsx-ZxGQpUNq.js +0 -1
- package/web-ui/build/static/julia-7ooB8a4b.js +0 -1
- package/web-ui/build/static/julia-DzjCRNEr.js +0 -1
- package/web-ui/build/static/julia-repl-pceaZSLt.js +0 -1
- package/web-ui/build/static/keepalived-BQgTZddo.js +0 -1
- package/web-ui/build/static/keyman-Cqlba6tn.js +0 -1
- package/web-ui/build/static/kotlin-BygmvqBG.js +0 -1
- package/web-ui/build/static/kotlin-DrN0ycN8.js +0 -1
- package/web-ui/build/static/kumir-YhasANvI.js +0 -1
- package/web-ui/build/static/kusto-LQa6MD2B.js +0 -1
- package/web-ui/build/static/lasso-Ca3RFbcE.js +0 -1
- package/web-ui/build/static/latex-BoQj21fG.js +0 -1
- package/web-ui/build/static/latex-ZxewREOs.js +0 -1
- package/web-ui/build/static/latte-40SpSG4q.js +0 -1
- package/web-ui/build/static/ldif-CzTJxBjJ.js +0 -1
- package/web-ui/build/static/leaf-DO9LaVNe.js +0 -1
- package/web-ui/build/static/less-BoClFdvD.js +0 -1
- package/web-ui/build/static/less-C1s1U6-n.js +0 -1
- package/web-ui/build/static/lilypond-D5wHKW8A.js +0 -1
- package/web-ui/build/static/liquid-BRQzL-S2.js +0 -1
- package/web-ui/build/static/lisp-8q-QRYKi.js +0 -1
- package/web-ui/build/static/lisp-J8TPaPPb.js +0 -1
- package/web-ui/build/static/livecodeserver-Dcr3yGmD.js +0 -1
- package/web-ui/build/static/livescript-BUEQmlAe.js +0 -1
- package/web-ui/build/static/livescript-DsId63Ot.js +0 -1
- package/web-ui/build/static/llvm-B3CCzYxo.js +0 -1
- package/web-ui/build/static/llvm-kQGfyqnj.js +0 -1
- package/web-ui/build/static/log-BlA5152b.js +0 -1
- package/web-ui/build/static/lolcode-8WRAMeb2.js +0 -1
- package/web-ui/build/static/lsl-BZUMQNE2.js +0 -1
- package/web-ui/build/static/lua-C4hJ-Gql.js +0 -1
- package/web-ui/build/static/lua-RxOeZV_z.js +0 -1
- package/web-ui/build/static/magma-U9kYv2QD.js +0 -1
- package/web-ui/build/static/makefile-1Cu2rVDg.js +0 -1
- package/web-ui/build/static/makefile-mmZ8lbad.js +0 -1
- package/web-ui/build/static/markdown-CCqDOXhR.js +0 -1
- package/web-ui/build/static/markdown-CVOmqzdD.js +0 -1
- package/web-ui/build/static/markup-templating-C7eiVR0j.js +0 -1
- package/web-ui/build/static/mathematica-BbKHQ6zH.js +0 -1
- package/web-ui/build/static/matlab-BbMwJ6T0.js +0 -1
- package/web-ui/build/static/matlab-gHn5UhMb.js +0 -1
- package/web-ui/build/static/maxima-CuB3n0ri.js +0 -1
- package/web-ui/build/static/maxscript-jhOix4gn.js +0 -1
- package/web-ui/build/static/mel-Bpjqa7Ec.js +0 -1
- package/web-ui/build/static/mel-QxMxBq03.js +0 -1
- package/web-ui/build/static/mercury-C8IdDyFB.js +0 -1
- package/web-ui/build/static/mermaid-v41WDixf.js +0 -1
- package/web-ui/build/static/mipsasm-kYH27KXy.js +0 -1
- package/web-ui/build/static/mizar-BCJI9Jxa.js +0 -1
- package/web-ui/build/static/mizar-BCxP_6pj.js +0 -1
- package/web-ui/build/static/mojolicious-C7DC_CUp.js +0 -1
- package/web-ui/build/static/mongodb-DvBX00WY.js +0 -1
- package/web-ui/build/static/monkey-B7KjOZtt.js +0 -1
- package/web-ui/build/static/monkey-CFKZd6lx.js +0 -1
- package/web-ui/build/static/moonscript-44jD_uAZ.js +0 -1
- package/web-ui/build/static/moonscript-B3KahKf5.js +0 -1
- package/web-ui/build/static/n1ql-CxJOkBbD.js +0 -1
- package/web-ui/build/static/n1ql-FJFE6P7E.js +0 -1
- package/web-ui/build/static/n4js-D5jJTGdO.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-DlsCaky2.js +0 -1
- package/web-ui/build/static/naniscript-C3YsvWgN.js +0 -1
- package/web-ui/build/static/nasm-DCGKvOZq.js +0 -1
- package/web-ui/build/static/neon-nyFNinx-.js +0 -1
- package/web-ui/build/static/nevod-C5PnMzAW.js +0 -1
- package/web-ui/build/static/nginx-BUgMakda.js +0 -1
- package/web-ui/build/static/nginx-C5JBKsuz.js +0 -1
- package/web-ui/build/static/nim-BFu6fQgc.js +0 -1
- package/web-ui/build/static/nim-D0uh-nR9.js +0 -1
- package/web-ui/build/static/nix-BiOn3l1e.js +0 -1
- package/web-ui/build/static/nix-tapJszPl.js +0 -1
- package/web-ui/build/static/node-repl-BTp9CFzE.js +0 -1
- package/web-ui/build/static/nsis-B7hV5A06.js +0 -1
- package/web-ui/build/static/nsis-DLshnCv-.js +0 -1
- package/web-ui/build/static/objectivec-BKjt_sKE.js +0 -1
- package/web-ui/build/static/objectivec-KUMYgk5w.js +0 -1
- package/web-ui/build/static/ocaml-CV2nKA_A.js +0 -1
- package/web-ui/build/static/ocaml-ZyZ-dXmE.js +0 -1
- package/web-ui/build/static/opencl-igIWfc0n.js +0 -1
- package/web-ui/build/static/openqasm-ByCPmCpS.js +0 -1
- package/web-ui/build/static/openscad-Db6ypam1.js +0 -1
- package/web-ui/build/static/oxygene-CBbaQWRB.js +0 -1
- package/web-ui/build/static/oz-lEl_mXVw.js +0 -1
- package/web-ui/build/static/parigp-c2FbheBr.js +0 -1
- package/web-ui/build/static/parser-Ba6uivHf.js +0 -1
- package/web-ui/build/static/parser3-Cm5cgVSQ.js +0 -1
- package/web-ui/build/static/pascal-JgY-dd52.js +0 -1
- package/web-ui/build/static/pascaligo-BjSdyegq.js +0 -1
- package/web-ui/build/static/pcaxis-CDdxDfqJ.js +0 -1
- package/web-ui/build/static/peoplecode-BCPhsbK6.js +0 -1
- package/web-ui/build/static/perl-ClVPikLH.js +0 -1
- package/web-ui/build/static/perl-pRjXJ4uc.js +0 -1
- package/web-ui/build/static/pf-D6VrFfuf.js +0 -1
- package/web-ui/build/static/pgsql-DAv4ezCU.js +0 -1
- package/web-ui/build/static/php-Bz3Bn1G_.js +0 -1
- package/web-ui/build/static/php-extras-B8k1hZ7O.js +0 -1
- package/web-ui/build/static/php-template-DJJiMC8Q.js +0 -1
- package/web-ui/build/static/php-zCXGNRnB.js +0 -1
- package/web-ui/build/static/phpdoc-CpnPjGDk.js +0 -1
- package/web-ui/build/static/plaintext-BRkRKfKN.js +0 -1
- package/web-ui/build/static/plsql-BARhkvBo.js +0 -1
- package/web-ui/build/static/pony-guYTDEtj.js +0 -1
- package/web-ui/build/static/powerquery-DcM2Yj3O.js +0 -1
- package/web-ui/build/static/powershell-DJ8ftCxt.js +0 -1
- package/web-ui/build/static/powershell-DSRUQzqt.js +0 -1
- package/web-ui/build/static/processing-BCmW5Adu.js +0 -1
- package/web-ui/build/static/processing-DDMjYIa-.js +0 -1
- package/web-ui/build/static/profile-C9J13WXr.js +0 -1
- package/web-ui/build/static/prolog-CUyUfIUU.js +0 -1
- package/web-ui/build/static/prolog-wjvrQEy3.js +0 -1
- package/web-ui/build/static/promql-BkN3_kL1.js +0 -1
- package/web-ui/build/static/properties-B7zGUFLC.js +0 -1
- package/web-ui/build/static/properties-DHKWbrVz.js +0 -1
- package/web-ui/build/static/protobuf-CVwMi4py.js +0 -1
- package/web-ui/build/static/protobuf-CWUzVSVD.js +0 -1
- package/web-ui/build/static/psl-DdX6HMd3.js +0 -1
- package/web-ui/build/static/pug-D-Sn469u.js +0 -1
- package/web-ui/build/static/puppet-B6ZR9-D4.js +0 -1
- package/web-ui/build/static/puppet-m66LRiIo.js +0 -1
- package/web-ui/build/static/pure-7deZH-sc.js +0 -1
- package/web-ui/build/static/purebasic-DQLUcurt.js +0 -1
- package/web-ui/build/static/purebasic-DYMw9jTh.js +0 -1
- package/web-ui/build/static/purescript-DpysoAya.js +0 -1
- package/web-ui/build/static/python-D66_vufV.js +0 -1
- package/web-ui/build/static/python-DYxaIENO.js +0 -1
- package/web-ui/build/static/python-repl-DPjvQNxf.js +0 -1
- package/web-ui/build/static/q-DDHNKITB.js +0 -1
- package/web-ui/build/static/q-xV1Q9ILw.js +0 -1
- package/web-ui/build/static/qml-DSENM1u-.js +0 -1
- package/web-ui/build/static/qml-DfhbPQ-t.js +0 -1
- package/web-ui/build/static/qore-LQCffrzv.js +0 -1
- package/web-ui/build/static/qsharp-BcSf2ZGH.js +0 -1
- package/web-ui/build/static/r-Dc6GR0yQ.js +0 -1
- package/web-ui/build/static/r-vludgk3t.js +0 -1
- package/web-ui/build/static/racket-DJYIkQwh.js +0 -1
- package/web-ui/build/static/reason-D75i_ede.js +0 -1
- package/web-ui/build/static/reasonml-DhRXKjo3.js +0 -1
- package/web-ui/build/static/regex-D67iENuu.js +0 -1
- package/web-ui/build/static/rego-CJ2Eeb4g.js +0 -1
- package/web-ui/build/static/renpy-DUDNyFqb.js +0 -1
- package/web-ui/build/static/rest-Dn7SYTNt.js +0 -1
- package/web-ui/build/static/rib-BVUY5dIb.js +0 -1
- package/web-ui/build/static/rip-Bu9K3Hu9.js +0 -1
- package/web-ui/build/static/roboconf-CUzY2sLf.js +0 -1
- package/web-ui/build/static/roboconf-DBEmoD-Z.js +0 -1
- package/web-ui/build/static/robotframework-70EV7ffL.js +0 -1
- package/web-ui/build/static/routeros-KgfwmDVO.js +0 -1
- package/web-ui/build/static/rsl-D3oCnFGa.js +0 -1
- package/web-ui/build/static/ruby-Dqa0HtB4.js +0 -1
- package/web-ui/build/static/ruby-PeJYeL87.js +0 -1
- package/web-ui/build/static/ruleslanguage-vo3eM_mz.js +0 -1
- package/web-ui/build/static/rust-CwU6t4_Y.js +0 -1
- package/web-ui/build/static/rust-WXADYh9r.js +0 -1
- package/web-ui/build/static/sas-Cg6ADdDH.js +0 -1
- package/web-ui/build/static/sas-DWoEaeXv.js +0 -1
- package/web-ui/build/static/sass-DbHJHeBV.js +0 -1
- package/web-ui/build/static/scala-B6oE2QKr.js +0 -1
- package/web-ui/build/static/scala-NFQGPaYa.js +0 -1
- package/web-ui/build/static/scheme-C8Jx4oX7.js +0 -1
- package/web-ui/build/static/scheme-CUMBJaUf.js +0 -1
- package/web-ui/build/static/scilab-D1VqsdSy.js +0 -1
- package/web-ui/build/static/scss-CSH87oUD.js +0 -1
- package/web-ui/build/static/scss-GLX6NNDB.js +0 -1
- package/web-ui/build/static/shell-CbOhN21M.js +0 -1
- package/web-ui/build/static/shell-session-BQPdJJZS.js +0 -1
- package/web-ui/build/static/smali-BYbEOQX5.js +0 -1
- package/web-ui/build/static/smali-DcoYSibw.js +0 -1
- package/web-ui/build/static/smalltalk-CQkedD8N.js +0 -1
- package/web-ui/build/static/smalltalk-DihI81Cd.js +0 -1
- package/web-ui/build/static/smarty-RRvllERL.js +0 -1
- package/web-ui/build/static/sml-BJkMhBLU.js +0 -1
- package/web-ui/build/static/sml-Bm2IN0wP.js +0 -1
- package/web-ui/build/static/solidity-CsCW8kyX.js +0 -1
- package/web-ui/build/static/solution-file-B5YSxWQt.js +0 -1
- package/web-ui/build/static/soy-Dek2_YCW.js +0 -1
- package/web-ui/build/static/sparql-BeTxhWa4.js +0 -1
- package/web-ui/build/static/splunk-spl-hq6BW85c.js +0 -1
- package/web-ui/build/static/sqf-C-u4en-i.js +0 -1
- package/web-ui/build/static/sqf-DP0IhDYt.js +0 -1
- package/web-ui/build/static/sql-BzL0uonb.js +0 -1
- package/web-ui/build/static/sql-Zy6tV_us.js +0 -1
- package/web-ui/build/static/sql_more-BP2G6Vh5.js +0 -1
- package/web-ui/build/static/squirrel-C3MnMYx5.js +0 -1
- package/web-ui/build/static/stan-7iKo211G.js +0 -1
- package/web-ui/build/static/stan-C1lcIZjJ.js +0 -1
- package/web-ui/build/static/stata-DJ6GKcaw.js +0 -1
- package/web-ui/build/static/step21-Pg-uClDB.js +0 -1
- package/web-ui/build/static/stylus-DFAxYuRi.js +0 -1
- package/web-ui/build/static/stylus-DT6xc_Nv.js +0 -1
- package/web-ui/build/static/subunit-aGvGJXZZ.js +0 -1
- package/web-ui/build/static/swift-Sqmdmb4O.js +0 -1
- package/web-ui/build/static/swift-cUX-MVl4.js +0 -1
- package/web-ui/build/static/systemd-qIaU0Trg.js +0 -1
- package/web-ui/build/static/t4-cs-DtO6Bgg1.js +0 -1
- package/web-ui/build/static/t4-templating-DSSM2N5M.js +0 -1
- package/web-ui/build/static/t4-vb-tKIiE5uC.js +0 -1
- package/web-ui/build/static/taggerscript-Dt2Kgr-W.js +0 -1
- package/web-ui/build/static/tap-BMEgEMIk.js +0 -1
- package/web-ui/build/static/tap-C4TdzsNz.js +0 -1
- package/web-ui/build/static/tcl-B6k4Af9f.js +0 -1
- package/web-ui/build/static/tcl-Dq4_i5q5.js +0 -1
- package/web-ui/build/static/textile-C0uqAPk0.js +0 -1
- package/web-ui/build/static/thrift-DybQEjaA.js +0 -1
- package/web-ui/build/static/toml-DG1a2FSS.js +0 -1
- package/web-ui/build/static/tp-BwdfEEST.js +0 -1
- package/web-ui/build/static/tremor-JSTukmt-.js +0 -1
- package/web-ui/build/static/tsx-YUfsqzPf.js +0 -1
- package/web-ui/build/static/tt2-D9A_ACnF.js +0 -1
- package/web-ui/build/static/turtle-BKxwLa_-.js +0 -1
- package/web-ui/build/static/twig-BeEDK9Ri.js +0 -1
- package/web-ui/build/static/twig-TnOWwD7-.js +0 -1
- package/web-ui/build/static/typescript-BjZl8C3q.js +0 -1
- package/web-ui/build/static/typescript-qtW5Xh-j.js +0 -1
- package/web-ui/build/static/typoscript-Dj4sO7Jx.js +0 -1
- package/web-ui/build/static/unrealscript-DInimzNQ.js +0 -1
- package/web-ui/build/static/uorazor-B_9tFVKw.js +0 -1
- package/web-ui/build/static/uri-CTuMA7_k.js +0 -1
- package/web-ui/build/static/v-CvE0Ujqx.js +0 -1
- package/web-ui/build/static/vala-CLGf3xEs.js +0 -1
- package/web-ui/build/static/vala-Dm8LmEpm.js +0 -1
- package/web-ui/build/static/vbnet-Cwm2TjGP.js +0 -1
- package/web-ui/build/static/vbnet-LCd9GiMJ.js +0 -1
- package/web-ui/build/static/vbscript-DVj94_-y.js +0 -1
- package/web-ui/build/static/vbscript-html-CDHtSX-o.js +0 -1
- package/web-ui/build/static/velocity-C-OrhdDf.js +0 -1
- package/web-ui/build/static/verilog-Bh18N7TM.js +0 -1
- package/web-ui/build/static/verilog-C-YNXb8j.js +0 -1
- package/web-ui/build/static/vhdl-BFNm41_R.js +0 -1
- package/web-ui/build/static/vhdl-CyLgBDKk.js +0 -1
- package/web-ui/build/static/vim-BTafUqR0.js +0 -1
- package/web-ui/build/static/vim-Xg1pEHJe.js +0 -1
- package/web-ui/build/static/visual-basic-CDgUOlvq.js +0 -1
- package/web-ui/build/static/warpscript-1ELDmkt5.js +0 -1
- package/web-ui/build/static/wasm-C25KdQk5.js +0 -1
- package/web-ui/build/static/web-idl-CsdVYgpL.js +0 -1
- package/web-ui/build/static/wiki-4RrZuyhV.js +0 -1
- package/web-ui/build/static/wolfram-DMiRIwvp.js +0 -1
- package/web-ui/build/static/wren-Vk5PBcVB.js +0 -1
- package/web-ui/build/static/x86asm-D9TFTgye.js +0 -1
- package/web-ui/build/static/xeora-SAn_K3Ts.js +0 -1
- package/web-ui/build/static/xl-Da2Fl8D9.js +0 -1
- package/web-ui/build/static/xml-CeLm6l4V.js +0 -1
- package/web-ui/build/static/xml-doc-DypYH408.js +0 -1
- package/web-ui/build/static/xojo-CrfMiv1-.js +0 -1
- package/web-ui/build/static/xquery-8tOqVkgP.js +0 -1
- package/web-ui/build/static/xquery-CLOnNPtx.js +0 -1
- package/web-ui/build/static/yaml-CXiycPmU.js +0 -1
- package/web-ui/build/static/yaml-cIKjKW-H.js +0 -1
- package/web-ui/build/static/yang-KVshO9Ce.js +0 -1
- package/web-ui/build/static/zephir-B88JNqlj.js +0 -1
- package/web-ui/build/static/zig-C6GYIeFs.js +0 -1
|
@@ -31,6 +31,7 @@ import { getVisualEditorServer, getVisualEditorPort, getVisualEditorBaseUrl, set
|
|
|
31
31
|
import { getCredentialVault } from '../services/credentialVault.js';
|
|
32
32
|
import { getGalleryService } from '../services/galleryService.js';
|
|
33
33
|
import { getUserDataPaths } from '../utilities/userDataDir.js';
|
|
34
|
+
import { projectActiveRuns } from '../utilities/flowRunFilters.js';
|
|
34
35
|
|
|
35
36
|
// Connect visual editor server to bridge (enables element selection forwarding)
|
|
36
37
|
setBridgeGetter(getVisualEditorBridge);
|
|
@@ -43,6 +44,14 @@ import { initFileExplorerModule } from '../modules/fileExplorer/index.js';
|
|
|
43
44
|
|
|
44
45
|
// Import FlowExecutor for flow pipeline execution
|
|
45
46
|
import FlowExecutor from '../core/flowExecutor.js';
|
|
47
|
+
// Flow definition gate — rejects malformed flows BEFORE persistence/execution.
|
|
48
|
+
import { validateFlowDefinition } from '../core/flowSchema.js';
|
|
49
|
+
// Phase 4: disk checkpoint store backs resume/restart of failed runs.
|
|
50
|
+
import { FlowCheckpointStore } from '../core/flowCheckpointStore.js';
|
|
51
|
+
// Phase 5: editor lint — soft warnings (unbound placeholders, etc.)
|
|
52
|
+
import { lintFlow } from '../core/flowLint.js';
|
|
53
|
+
// Phase 6: append-only flow version archive (rollback support).
|
|
54
|
+
import { FlowVersionStore } from '../core/flowVersionStore.js';
|
|
46
55
|
|
|
47
56
|
// Scheduler visualizer routes (extracted for testability)
|
|
48
57
|
import { registerSchedulerRoutes } from './schedulerRoutes.js';
|
|
@@ -536,6 +545,39 @@ class WebServer {
|
|
|
536
545
|
// WebServer has broadcastToSession method that FlowExecutor will use
|
|
537
546
|
this.flowExecutor.setWebSocketManager(this);
|
|
538
547
|
|
|
548
|
+
// Phase 4: wire a disk checkpoint store so failed/interrupted
|
|
549
|
+
// flow runs can be resumed instead of starting over from scratch.
|
|
550
|
+
// Stored under the user data dir alongside agent state so the
|
|
551
|
+
// data survives `npm i -g` updates and follows the user across
|
|
552
|
+
// working-directory changes. (Earlier code read `dataPaths?.dataDir`
|
|
553
|
+
// which doesn't exist on getUserDataPaths() — that fell through to
|
|
554
|
+
// process.cwd() and dropped checkpoints into whatever directory the
|
|
555
|
+
// process happened to start in. Use `state` instead, grouping with
|
|
556
|
+
// agents/, operations/, models/, skills/.)
|
|
557
|
+
try {
|
|
558
|
+
const dataPaths = getUserDataPaths();
|
|
559
|
+
const checkpointDir = path.join(dataPaths?.state || process.cwd(), 'flow-checkpoints');
|
|
560
|
+
const store = new FlowCheckpointStore({ baseDir: checkpointDir });
|
|
561
|
+
this.flowExecutor.setCheckpointStore(store);
|
|
562
|
+
this.logger.info('FlowExecutor checkpoint store enabled', { baseDir: checkpointDir });
|
|
563
|
+
} catch (err) {
|
|
564
|
+
// Non-fatal: continue without resumability rather than failing init.
|
|
565
|
+
this.logger.warn('Failed to enable flow checkpoint store (non-fatal)', { error: err.message });
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// Phase 6: wire a version store so every flow save records an
|
|
569
|
+
// immutable snapshot. Used by /api/flows/:id/versions and
|
|
570
|
+
// /api/flows/:id/rollback. Stored alongside checkpoints under
|
|
571
|
+
// user data dir (see comment above for path-fix history).
|
|
572
|
+
try {
|
|
573
|
+
const dataPaths = getUserDataPaths();
|
|
574
|
+
const versionDir = path.join(dataPaths?.state || process.cwd(), 'flow-versions');
|
|
575
|
+
this.flowVersionStore = new FlowVersionStore({ baseDir: versionDir });
|
|
576
|
+
this.logger.info('Flow version store enabled', { baseDir: versionDir });
|
|
577
|
+
} catch (err) {
|
|
578
|
+
this.logger.warn('Failed to enable flow version store (non-fatal)', { error: err.message });
|
|
579
|
+
}
|
|
580
|
+
|
|
539
581
|
// Wire FlowExecutor into jobDoneTool so it can signal completion directly
|
|
540
582
|
const toolsRegistry = this.orchestrator?.toolsRegistry;
|
|
541
583
|
if (toolsRegistry) {
|
|
@@ -543,6 +585,14 @@ class WebServer {
|
|
|
543
585
|
if (jobDoneTool && typeof jobDoneTool.setFlowExecutor === 'function') {
|
|
544
586
|
jobDoneTool.setFlowExecutor(this.flowExecutor);
|
|
545
587
|
}
|
|
588
|
+
// Wire FlowExecutor into platformControlTool so its execute-flow
|
|
589
|
+
// and dry-run-flow actions can reach the executor. Without this,
|
|
590
|
+
// an agent with `flows: 'all'` permission would still get
|
|
591
|
+
// "FlowExecutor not available" when calling execute-flow.
|
|
592
|
+
const platformControlTool = toolsRegistry.getTool('platformcontrol');
|
|
593
|
+
if (platformControlTool && typeof platformControlTool.setFlowExecutor === 'function') {
|
|
594
|
+
platformControlTool.setFlowExecutor(this.flowExecutor);
|
|
595
|
+
}
|
|
546
596
|
}
|
|
547
597
|
|
|
548
598
|
this.logger.info('FlowExecutor initialized successfully');
|
|
@@ -4249,9 +4299,37 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4249
4299
|
});
|
|
4250
4300
|
}
|
|
4251
4301
|
|
|
4302
|
+
// If the resilient state loader recovered from missing/empty/
|
|
4303
|
+
// corrupt files, broadcast each recovery as a UI toast so the
|
|
4304
|
+
// operator sees what was salvaged. The reports were attached to
|
|
4305
|
+
// the restored agent in stateManager.restoreAgent.
|
|
4306
|
+
const recoveries = Array.isArray(agent._restoreRecoveries) ? agent._restoreRecoveries : [];
|
|
4307
|
+
if (recoveries.length > 0 && this.wsManager) {
|
|
4308
|
+
for (const r of recoveries) {
|
|
4309
|
+
this.wsManager.broadcast({
|
|
4310
|
+
type: 'state-file-recovery',
|
|
4311
|
+
level: r.kind === 'unrepairable' ? 'error'
|
|
4312
|
+
: r.kind === 'partial' ? 'warning'
|
|
4313
|
+
: 'info',
|
|
4314
|
+
agentId: agent.id,
|
|
4315
|
+
agentName: agent.name,
|
|
4316
|
+
recovery: {
|
|
4317
|
+
kind: r.kind,
|
|
4318
|
+
label: r.label,
|
|
4319
|
+
message: r.message,
|
|
4320
|
+
archivePath: r.archivePath || null,
|
|
4321
|
+
},
|
|
4322
|
+
});
|
|
4323
|
+
}
|
|
4324
|
+
}
|
|
4325
|
+
// Strip the recovery payload before logging/serializing back to
|
|
4326
|
+
// the client — it's an internal hint, not part of the agent shape.
|
|
4327
|
+
delete agent._restoreRecoveries;
|
|
4328
|
+
|
|
4252
4329
|
this.logger.info('Agent imported successfully', {
|
|
4253
4330
|
agentId: agent.id,
|
|
4254
|
-
name: agent.name
|
|
4331
|
+
name: agent.name,
|
|
4332
|
+
recoveryCount: recoveries.length,
|
|
4255
4333
|
});
|
|
4256
4334
|
|
|
4257
4335
|
res.json({
|
|
@@ -4264,7 +4342,12 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4264
4342
|
capabilities: agent.capabilities,
|
|
4265
4343
|
lastActivity: agent.lastActivity
|
|
4266
4344
|
},
|
|
4267
|
-
message: `Agent ${agent.name} imported successfully
|
|
4345
|
+
message: `Agent ${agent.name} imported successfully`,
|
|
4346
|
+
// Surfaced to the importer too so a non-WS client (curl) sees
|
|
4347
|
+
// them in the response body.
|
|
4348
|
+
...(recoveries.length > 0 ? { recoveries: recoveries.map(r => ({
|
|
4349
|
+
kind: r.kind, label: r.label, message: r.message,
|
|
4350
|
+
})) } : {}),
|
|
4268
4351
|
});
|
|
4269
4352
|
} catch (error) {
|
|
4270
4353
|
this.logger.error('Failed to import agent', {
|
|
@@ -4723,10 +4806,15 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4723
4806
|
try {
|
|
4724
4807
|
const { name, description, nodes, edges, variables } = req.body;
|
|
4725
4808
|
|
|
4726
|
-
|
|
4809
|
+
// Schema gate: reject malformed flows BEFORE they reach persistence
|
|
4810
|
+
// (avoids "saved but unexecutable" states). 400 with structured
|
|
4811
|
+
// errors so the editor can highlight specific problems inline.
|
|
4812
|
+
const validation = validateFlowDefinition({ name, nodes: nodes || [], edges: edges || [], variables });
|
|
4813
|
+
if (!validation.ok) {
|
|
4727
4814
|
return res.status(400).json({
|
|
4728
4815
|
success: false,
|
|
4729
|
-
error: 'Flow
|
|
4816
|
+
error: 'Flow definition is invalid',
|
|
4817
|
+
details: validation.errors
|
|
4730
4818
|
});
|
|
4731
4819
|
}
|
|
4732
4820
|
|
|
@@ -4739,6 +4827,20 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4739
4827
|
variables
|
|
4740
4828
|
}, projectDir);
|
|
4741
4829
|
|
|
4830
|
+
// Phase 6: record initial version (v1). Best-effort — the flow
|
|
4831
|
+
// is already saved; failing to version is a non-fatal warning.
|
|
4832
|
+
// Stamp the version number back onto the flow record so runs
|
|
4833
|
+
// can record which definition produced their output.
|
|
4834
|
+
if (this.flowVersionStore && flow?.id) {
|
|
4835
|
+
try {
|
|
4836
|
+
const v = await this.flowVersionStore.recordVersion(flow.id, flow);
|
|
4837
|
+
const projectDir = this.orchestrator.config.project?.directory || process.cwd();
|
|
4838
|
+
await this.orchestrator.stateManager.updateFlow(flow.id, { version: v.version }, projectDir);
|
|
4839
|
+
flow.version = v.version;
|
|
4840
|
+
}
|
|
4841
|
+
catch (e) { this.logger.warn('flow version record failed', { error: e.message }); }
|
|
4842
|
+
}
|
|
4843
|
+
|
|
4742
4844
|
// Broadcast flow created event
|
|
4743
4845
|
if (this.wsManager) {
|
|
4744
4846
|
this.wsManager.broadcast({
|
|
@@ -4794,6 +4896,35 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4794
4896
|
const { name, description, nodes, edges, variables } = req.body;
|
|
4795
4897
|
const projectDir = this.orchestrator.config.project?.directory || process.cwd();
|
|
4796
4898
|
|
|
4899
|
+
// PUT supports partial updates (e.g. just `{ nodes, edges }`
|
|
4900
|
+
// when the user clicks Save in the editor). Load the existing
|
|
4901
|
+
// flow and merge the patch before validating, so the schema
|
|
4902
|
+
// gate sees the full resulting record — not just the diff.
|
|
4903
|
+
const existing = await this.orchestrator.stateManager.getFlow(flowId, projectDir);
|
|
4904
|
+
if (!existing) {
|
|
4905
|
+
return res.status(404).json({ success: false, error: `Flow ${flowId} not found` });
|
|
4906
|
+
}
|
|
4907
|
+
const merged = {
|
|
4908
|
+
...existing,
|
|
4909
|
+
...(name !== undefined ? { name } : {}),
|
|
4910
|
+
...(description !== undefined ? { description } : {}),
|
|
4911
|
+
...(nodes !== undefined ? { nodes } : {}),
|
|
4912
|
+
...(edges !== undefined ? { edges } : {}),
|
|
4913
|
+
...(variables !== undefined ? { variables } : {}),
|
|
4914
|
+
};
|
|
4915
|
+
|
|
4916
|
+
// Same schema gate as POST. Editing a flow into an invalid state
|
|
4917
|
+
// is just as bad as creating one — both should be caught here, not
|
|
4918
|
+
// 90s into a future execution.
|
|
4919
|
+
const validation = validateFlowDefinition(merged);
|
|
4920
|
+
if (!validation.ok) {
|
|
4921
|
+
return res.status(400).json({
|
|
4922
|
+
success: false,
|
|
4923
|
+
error: 'Flow definition is invalid',
|
|
4924
|
+
details: validation.errors
|
|
4925
|
+
});
|
|
4926
|
+
}
|
|
4927
|
+
|
|
4797
4928
|
const flow = await this.orchestrator.stateManager.updateFlow(flowId, {
|
|
4798
4929
|
name,
|
|
4799
4930
|
description,
|
|
@@ -4802,6 +4933,17 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4802
4933
|
variables
|
|
4803
4934
|
}, projectDir);
|
|
4804
4935
|
|
|
4936
|
+
// Phase 6: record a new version snapshot on every PUT and
|
|
4937
|
+
// stamp the new version number onto the live record.
|
|
4938
|
+
if (this.flowVersionStore && flow?.id) {
|
|
4939
|
+
try {
|
|
4940
|
+
const v = await this.flowVersionStore.recordVersion(flow.id, flow);
|
|
4941
|
+
await this.orchestrator.stateManager.updateFlow(flow.id, { version: v.version }, projectDir);
|
|
4942
|
+
flow.version = v.version;
|
|
4943
|
+
}
|
|
4944
|
+
catch (e) { this.logger.warn('flow version record failed', { error: e.message }); }
|
|
4945
|
+
}
|
|
4946
|
+
|
|
4805
4947
|
// Broadcast flow updated event
|
|
4806
4948
|
if (this.wsManager) {
|
|
4807
4949
|
this.wsManager.broadcast({
|
|
@@ -4956,6 +5098,140 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4956
5098
|
}
|
|
4957
5099
|
});
|
|
4958
5100
|
|
|
5101
|
+
// Phase 6: list versions of a flow (lightweight metadata only).
|
|
5102
|
+
this.app.get('/api/flows/:flowId/versions', async (req, res) => {
|
|
5103
|
+
try {
|
|
5104
|
+
if (!this.flowVersionStore) return res.status(503).json({ success: false, error: 'version store not available' });
|
|
5105
|
+
const versions = await this.flowVersionStore.listVersions(req.params.flowId);
|
|
5106
|
+
res.json({ success: true, data: versions });
|
|
5107
|
+
} catch (error) {
|
|
5108
|
+
this.logger.error('list versions failed', { error: error.message });
|
|
5109
|
+
res.status(500).json({ success: false, error: error.message });
|
|
5110
|
+
}
|
|
5111
|
+
});
|
|
5112
|
+
|
|
5113
|
+
// Phase 6: read a specific version snapshot (full flow definition).
|
|
5114
|
+
this.app.get('/api/flows/:flowId/versions/:version', async (req, res) => {
|
|
5115
|
+
try {
|
|
5116
|
+
if (!this.flowVersionStore) return res.status(503).json({ success: false, error: 'version store not available' });
|
|
5117
|
+
const v = parseInt(req.params.version, 10);
|
|
5118
|
+
if (!Number.isFinite(v) || v < 1) {
|
|
5119
|
+
return res.status(400).json({ success: false, error: 'version must be a positive integer' });
|
|
5120
|
+
}
|
|
5121
|
+
const snap = await this.flowVersionStore.loadVersion(req.params.flowId, v);
|
|
5122
|
+
if (!snap) return res.status(404).json({ success: false, error: 'version not found' });
|
|
5123
|
+
res.json({ success: true, data: snap });
|
|
5124
|
+
} catch (error) {
|
|
5125
|
+
this.logger.error('load version failed', { error: error.message });
|
|
5126
|
+
res.status(500).json({ success: false, error: error.message });
|
|
5127
|
+
}
|
|
5128
|
+
});
|
|
5129
|
+
|
|
5130
|
+
// Phase 6: rollback — restore version N as the live flow record.
|
|
5131
|
+
// Body: { version: N }. Records ANOTHER new version after rollback
|
|
5132
|
+
// so history stays append-only ("rolled back to v3" produces v(N+1)).
|
|
5133
|
+
this.app.post('/api/flows/:flowId/rollback', async (req, res) => {
|
|
5134
|
+
try {
|
|
5135
|
+
if (!this.flowVersionStore) return res.status(503).json({ success: false, error: 'version store not available' });
|
|
5136
|
+
const { flowId } = req.params;
|
|
5137
|
+
const target = parseInt(req.body?.version, 10);
|
|
5138
|
+
if (!Number.isFinite(target) || target < 1) {
|
|
5139
|
+
return res.status(400).json({ success: false, error: 'body.version must be a positive integer' });
|
|
5140
|
+
}
|
|
5141
|
+
const snap = await this.flowVersionStore.loadVersion(flowId, target);
|
|
5142
|
+
if (!snap) return res.status(404).json({ success: false, error: `version ${target} not found` });
|
|
5143
|
+
|
|
5144
|
+
// Validate the target snapshot before promoting it. A flow that
|
|
5145
|
+
// passed validation when first saved may now be invalid against
|
|
5146
|
+
// a newer schema — surfacing that here is better than at execute.
|
|
5147
|
+
const validation = validateFlowDefinition(snap.flow);
|
|
5148
|
+
if (!validation.ok) {
|
|
5149
|
+
return res.status(400).json({
|
|
5150
|
+
success: false,
|
|
5151
|
+
error: `version ${target} fails current validation`,
|
|
5152
|
+
details: validation.errors,
|
|
5153
|
+
});
|
|
5154
|
+
}
|
|
5155
|
+
|
|
5156
|
+
const projectDir = this.orchestrator.config.project?.directory || process.cwd();
|
|
5157
|
+
const restored = await this.orchestrator.stateManager.updateFlow(flowId, {
|
|
5158
|
+
name: snap.flow.name,
|
|
5159
|
+
description: snap.flow.description,
|
|
5160
|
+
nodes: snap.flow.nodes,
|
|
5161
|
+
edges: snap.flow.edges,
|
|
5162
|
+
variables: snap.flow.variables,
|
|
5163
|
+
}, projectDir);
|
|
5164
|
+
|
|
5165
|
+
// Append a new version entry tagging the rollback
|
|
5166
|
+
try {
|
|
5167
|
+
await this.flowVersionStore.recordVersion(flowId, {
|
|
5168
|
+
...restored,
|
|
5169
|
+
_rollbackOf: target,
|
|
5170
|
+
});
|
|
5171
|
+
} catch (e) {
|
|
5172
|
+
this.logger.warn('post-rollback version record failed', { error: e.message });
|
|
5173
|
+
}
|
|
5174
|
+
|
|
5175
|
+
if (this.wsManager) {
|
|
5176
|
+
this.wsManager.broadcast({ type: 'flow-updated', flow: restored });
|
|
5177
|
+
}
|
|
5178
|
+
res.json({ success: true, data: restored, rolledBackTo: target });
|
|
5179
|
+
} catch (error) {
|
|
5180
|
+
this.logger.error('rollback failed', { error: error.message });
|
|
5181
|
+
res.status(500).json({ success: false, error: error.message });
|
|
5182
|
+
}
|
|
5183
|
+
});
|
|
5184
|
+
|
|
5185
|
+
// Phase 5: dry-run / lint an unsaved flow definition.
|
|
5186
|
+
// Posted body IS the flow definition (so the editor can lint
|
|
5187
|
+
// unsaved drafts). Combines schema gate + lint warnings into a
|
|
5188
|
+
// single report so the editor can highlight everything inline.
|
|
5189
|
+
this.app.post('/api/flows/dry-run', async (req, res) => {
|
|
5190
|
+
try {
|
|
5191
|
+
const flow = req.body || {};
|
|
5192
|
+
const validation = validateFlowDefinition(flow);
|
|
5193
|
+
const lint = lintFlow(flow);
|
|
5194
|
+
res.json({
|
|
5195
|
+
success: true,
|
|
5196
|
+
ok: validation.ok && lint.errors.length === 0,
|
|
5197
|
+
schemaErrors: validation.errors,
|
|
5198
|
+
lintErrors: lint.errors,
|
|
5199
|
+
lintWarnings: lint.warnings,
|
|
5200
|
+
});
|
|
5201
|
+
} catch (error) {
|
|
5202
|
+
this.logger.error('Dry-run failed', { error: error.message });
|
|
5203
|
+
res.status(500).json({ success: false, error: error.message });
|
|
5204
|
+
}
|
|
5205
|
+
});
|
|
5206
|
+
|
|
5207
|
+
// Phase 4: resume a failed / interrupted flow run.
|
|
5208
|
+
// Per-node checkpoints on disk let us skip already-completed nodes
|
|
5209
|
+
// and re-run from the first non-completed one. The run record lives
|
|
5210
|
+
// under runId regardless of the flow it belongs to, so this lookup
|
|
5211
|
+
// does not require the flowId in the URL.
|
|
5212
|
+
this.app.post('/api/flows/runs/:runId/resume', async (req, res) => {
|
|
5213
|
+
try {
|
|
5214
|
+
const { runId } = req.params;
|
|
5215
|
+
const { sessionId } = req.body || {};
|
|
5216
|
+
if (!this.flowExecutor) {
|
|
5217
|
+
return res.status(503).json({ success: false, error: 'FlowExecutor not initialized' });
|
|
5218
|
+
}
|
|
5219
|
+
// Async: kick off and return immediately so the HTTP request
|
|
5220
|
+
// doesn't sit open for minutes. Errors propagate via WebSocket
|
|
5221
|
+
// (flow_run_failed) and the run record's status field.
|
|
5222
|
+
this.flowExecutor.resumeFlow(runId, sessionId || null).catch(err => {
|
|
5223
|
+
this.logger.error(`Resume flow failed for run ${runId}`, { error: err.message });
|
|
5224
|
+
});
|
|
5225
|
+
res.json({ success: true, runId, status: 'resuming' });
|
|
5226
|
+
} catch (error) {
|
|
5227
|
+
this.logger.error('Failed to resume flow run', { error: error.message, runId: req.params.runId });
|
|
5228
|
+
const status = /not found/i.test(error.message) ? 404
|
|
5229
|
+
: /checkpoint store/i.test(error.message) ? 503
|
|
5230
|
+
: 500;
|
|
5231
|
+
res.status(status).json({ success: false, error: error.message });
|
|
5232
|
+
}
|
|
5233
|
+
});
|
|
5234
|
+
|
|
4959
5235
|
// Stop a flow run
|
|
4960
5236
|
this.app.post('/api/flows/:flowId/stop', async (req, res) => {
|
|
4961
5237
|
try {
|
|
@@ -5010,6 +5286,30 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
5010
5286
|
}
|
|
5011
5287
|
});
|
|
5012
5288
|
|
|
5289
|
+
// List all currently-active runs across every flow. Used by the
|
|
5290
|
+
// FlowsPage to mark which cards are "running" without polling each
|
|
5291
|
+
// flow individually. Active = status in {queued, pending, running,
|
|
5292
|
+
// paused} — anything not yet terminal.
|
|
5293
|
+
//
|
|
5294
|
+
// Mounted ABOVE `/api/flows/:flowId/runs` so the literal `active`
|
|
5295
|
+
// segment isn't captured as a flowId by Express's pattern matcher.
|
|
5296
|
+
this.app.get('/api/flows/runs/active', async (req, res) => {
|
|
5297
|
+
try {
|
|
5298
|
+
const projectDir = this.orchestrator.config.project?.directory || process.cwd();
|
|
5299
|
+
const runIndex = await this.orchestrator.stateManager.loadFlowRunIndex(projectDir);
|
|
5300
|
+
// Pre-load the flow index ONCE so the progress summary can
|
|
5301
|
+
// resolve total node count + current step labels per run
|
|
5302
|
+
// without N+1 lookups. The lookup callback is a closure over
|
|
5303
|
+
// the flow map; the helper queries by id at call time only.
|
|
5304
|
+
const flowIndex = await this.orchestrator.stateManager.loadFlowIndex(projectDir);
|
|
5305
|
+
const flowLookup = (flowId) => (flowIndex && flowId) ? flowIndex[flowId] || null : null;
|
|
5306
|
+
res.json({ success: true, data: projectActiveRuns(runIndex, flowLookup) });
|
|
5307
|
+
} catch (error) {
|
|
5308
|
+
this.logger.error('Failed to list active flow runs', { error: error.message });
|
|
5309
|
+
res.status(500).json({ success: false, error: error.message });
|
|
5310
|
+
}
|
|
5311
|
+
});
|
|
5312
|
+
|
|
5013
5313
|
// List runs for a flow
|
|
5014
5314
|
this.app.get('/api/flows/:flowId/runs', async (req, res) => {
|
|
5015
5315
|
try {
|
|
@@ -157,13 +157,38 @@ export class GalleryStore {
|
|
|
157
157
|
async _writeNow() {
|
|
158
158
|
const dir = path.dirname(this.filePath);
|
|
159
159
|
try { await fs.mkdir(dir, { recursive: true }); } catch { /* race-tolerant */ }
|
|
160
|
-
|
|
160
|
+
// Per-call unique tmp suffix so two concurrent writes (debounce+flush
|
|
161
|
+
// racing, or any future caller) can't trample each other's tmp file.
|
|
162
|
+
// The earlier static `.tmp` suffix produced ENOENT under parallel test
|
|
163
|
+
// load on Windows: writer A renamed first, writer B saw its own tmp
|
|
164
|
+
// disappear before its rename ran.
|
|
165
|
+
const tmp = `${this.filePath}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
|
|
161
166
|
const payload = JSON.stringify({
|
|
162
167
|
schema: VERSION_SCHEMA,
|
|
163
168
|
entries: Array.from(this._entries.values()),
|
|
164
169
|
}, null, 2);
|
|
165
170
|
await fs.writeFile(tmp, payload, 'utf-8');
|
|
166
|
-
|
|
171
|
+
// Windows-fs renames intermittently fail with EPERM / EBUSY when an
|
|
172
|
+
// antivirus scanner or another process briefly holds the destination
|
|
173
|
+
// open. A short retry loop covers both production users on Windows
|
|
174
|
+
// and the parallel-jest workers that surface this most often.
|
|
175
|
+
let lastErr;
|
|
176
|
+
for (let attempt = 0; attempt < 5; attempt++) {
|
|
177
|
+
try {
|
|
178
|
+
await fs.rename(tmp, this.filePath);
|
|
179
|
+
return;
|
|
180
|
+
} catch (err) {
|
|
181
|
+
lastErr = err;
|
|
182
|
+
// ENOENT means our tmp already vanished — give up; the source
|
|
183
|
+
// file is gone, retrying won't recreate it. Other transients
|
|
184
|
+
// (EPERM/EBUSY/EACCES) get a brief backoff.
|
|
185
|
+
if (err.code === 'ENOENT') break;
|
|
186
|
+
await new Promise(r => setTimeout(r, 20 * (attempt + 1)));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Best-effort cleanup of stranded tmp; ignore failure.
|
|
190
|
+
try { await fs.unlink(tmp); } catch { /* ok */ }
|
|
191
|
+
throw lastErr;
|
|
167
192
|
}
|
|
168
193
|
|
|
169
194
|
/**
|
|
@@ -120,6 +120,169 @@ describe('ApiKeyManager', () => {
|
|
|
120
120
|
expect(manager.keys.vendorKeys.anthropic).toBe('anth-key');
|
|
121
121
|
});
|
|
122
122
|
|
|
123
|
+
// Regression locks: the UI used to write display-only placeholder
|
|
124
|
+
// strings into the editable settings field; auto-save then echoed
|
|
125
|
+
// them here, overwriting real keys with strings like
|
|
126
|
+
// `lx_••••••••••••••••(server-managed)` and breaking every agent
|
|
127
|
+
// request with 401. loadFromDisk must scrub any placeholder that
|
|
128
|
+
// already snuck onto disk before the fix, so a poisoned persist
|
|
129
|
+
// file from an older build self-heals on next boot.
|
|
130
|
+
describe('loadFromDisk placeholder scrub (poisoned persist file)', () => {
|
|
131
|
+
/**
|
|
132
|
+
* Helper: prep a manager so loadFromDisk takes the happy path
|
|
133
|
+
* and returns deterministic decrypted data without going through
|
|
134
|
+
* the real crypto. Each call hands back the manager + a stub.
|
|
135
|
+
*/
|
|
136
|
+
function primeForLoad(manager, decryptedJson) {
|
|
137
|
+
manager.persistenceFile = '/fake/api-keys.enc';
|
|
138
|
+
manager.encryptionKey = Buffer.alloc(32, 'k');
|
|
139
|
+
mockFs.readFile.mockResolvedValueOnce('encrypted-bytes-ignored');
|
|
140
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
141
|
+
manager._decrypt = jest.fn(() => decryptedJson);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
test('scrubs bullet-string loxia key + re-persists', async () => {
|
|
145
|
+
primeForLoad(manager, JSON.stringify({
|
|
146
|
+
version: 2,
|
|
147
|
+
keys: {
|
|
148
|
+
loxiaApiKey: 'lx_••••••••••••••••(server-managed)',
|
|
149
|
+
vendorKeys: { anthropic: 'sk-ant-real-key' },
|
|
150
|
+
},
|
|
151
|
+
}));
|
|
152
|
+
// Stub persist so we can observe it without going through crypto.
|
|
153
|
+
manager.persist = jest.fn().mockResolvedValue(undefined);
|
|
154
|
+
|
|
155
|
+
await manager.loadFromDisk();
|
|
156
|
+
|
|
157
|
+
expect(manager.keys.loxiaApiKey).toBeNull();
|
|
158
|
+
// Real vendor keys preserved.
|
|
159
|
+
expect(manager.keys.vendorKeys.anthropic).toBe('sk-ant-real-key');
|
|
160
|
+
// Best-effort re-persist fired.
|
|
161
|
+
expect(manager.persist).toHaveBeenCalledTimes(1);
|
|
162
|
+
// Operator-visible warning logged so the scrub is observable.
|
|
163
|
+
expect(logger.warn).toHaveBeenCalledWith(
|
|
164
|
+
expect.stringContaining('Scrubbing placeholder loxiaApiKey')
|
|
165
|
+
);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test('scrubs platform-managed sentinel and any placeholder vendor keys', async () => {
|
|
169
|
+
primeForLoad(manager, JSON.stringify({
|
|
170
|
+
version: 2,
|
|
171
|
+
keys: {
|
|
172
|
+
loxiaApiKey: 'platform-managed',
|
|
173
|
+
vendorKeys: {
|
|
174
|
+
anthropic: '••••••••(server-managed)',
|
|
175
|
+
openai: 'sk-real-openai-key',
|
|
176
|
+
azure: 'foo[server-managed]bar',
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
}));
|
|
180
|
+
manager.persist = jest.fn().mockResolvedValue(undefined);
|
|
181
|
+
|
|
182
|
+
await manager.loadFromDisk();
|
|
183
|
+
|
|
184
|
+
expect(manager.keys.loxiaApiKey).toBeNull();
|
|
185
|
+
// Placeholder vendors removed entirely (NOT just blanked) so the
|
|
186
|
+
// shape stays clean for downstream serialization.
|
|
187
|
+
expect(manager.keys.vendorKeys).not.toHaveProperty('anthropic');
|
|
188
|
+
expect(manager.keys.vendorKeys).not.toHaveProperty('azure');
|
|
189
|
+
// Real vendor preserved.
|
|
190
|
+
expect(manager.keys.vendorKeys.openai).toBe('sk-real-openai-key');
|
|
191
|
+
expect(manager.persist).toHaveBeenCalledTimes(1);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test('clean persist file: no scrub, no re-persist', async () => {
|
|
195
|
+
primeForLoad(manager, JSON.stringify({
|
|
196
|
+
version: 2,
|
|
197
|
+
keys: {
|
|
198
|
+
loxiaApiKey: 'lx_real_loxia_key_abc123',
|
|
199
|
+
vendorKeys: { anthropic: 'sk-ant-real', openai: 'sk-real-openai' },
|
|
200
|
+
},
|
|
201
|
+
}));
|
|
202
|
+
manager.persist = jest.fn().mockResolvedValue(undefined);
|
|
203
|
+
|
|
204
|
+
await manager.loadFromDisk();
|
|
205
|
+
|
|
206
|
+
expect(manager.keys.loxiaApiKey).toBe('lx_real_loxia_key_abc123');
|
|
207
|
+
expect(manager.keys.vendorKeys).toEqual({ anthropic: 'sk-ant-real', openai: 'sk-real-openai' });
|
|
208
|
+
// Nothing to scrub → no extra write.
|
|
209
|
+
expect(manager.persist).not.toHaveBeenCalled();
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test('legacy globalKeys format: scrub still applies after migration', async () => {
|
|
213
|
+
primeForLoad(manager, JSON.stringify({
|
|
214
|
+
// No `version` / `keys` — old shape with `globalKeys` at root.
|
|
215
|
+
globalKeys: {
|
|
216
|
+
loxiaApiKey: 'lx_••••(server-managed)',
|
|
217
|
+
vendorKeys: { anthropic: 'sk-ant-still-good' },
|
|
218
|
+
},
|
|
219
|
+
}));
|
|
220
|
+
manager.persist = jest.fn().mockResolvedValue(undefined);
|
|
221
|
+
|
|
222
|
+
await manager.loadFromDisk();
|
|
223
|
+
|
|
224
|
+
expect(manager.keys.loxiaApiKey).toBeNull();
|
|
225
|
+
expect(manager.keys.vendorKeys.anthropic).toBe('sk-ant-still-good');
|
|
226
|
+
expect(manager.persist).toHaveBeenCalled();
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test('persist failure during scrub is non-fatal (in-memory state still clean)', async () => {
|
|
230
|
+
primeForLoad(manager, JSON.stringify({
|
|
231
|
+
version: 2,
|
|
232
|
+
keys: { loxiaApiKey: 'platform-managed', vendorKeys: {} },
|
|
233
|
+
}));
|
|
234
|
+
manager.persist = jest.fn().mockRejectedValue(new Error('disk full'));
|
|
235
|
+
|
|
236
|
+
// Should NOT throw — re-persist failure is tolerated.
|
|
237
|
+
await expect(manager.loadFromDisk()).resolves.toBeUndefined();
|
|
238
|
+
// In-memory state is clean even though disk wasn't updated.
|
|
239
|
+
expect(manager.keys.loxiaApiKey).toBeNull();
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
describe('placeholder rejection (server-managed key bug guard)', () => {
|
|
244
|
+
test('refuses bullet-string placeholder for loxia key, keeps existing', async () => {
|
|
245
|
+
manager.persistenceFile = null;
|
|
246
|
+
manager.keys.loxiaApiKey = 'real-key-existing';
|
|
247
|
+
await manager.setSessionKeys('sess-1', {
|
|
248
|
+
loxiaApiKey: 'lx_••••••••••••••••(server-managed)'
|
|
249
|
+
});
|
|
250
|
+
expect(manager.keys.loxiaApiKey).toBe('real-key-existing');
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test('refuses [server-managed] tag', async () => {
|
|
254
|
+
manager.persistenceFile = null;
|
|
255
|
+
manager.keys.loxiaApiKey = 'real-key';
|
|
256
|
+
await manager.setSessionKeys('sess-1', {
|
|
257
|
+
loxiaApiKey: 'lx_abc[server-managed]'
|
|
258
|
+
});
|
|
259
|
+
expect(manager.keys.loxiaApiKey).toBe('real-key');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('refuses platform-managed sentinel', async () => {
|
|
263
|
+
manager.persistenceFile = null;
|
|
264
|
+
manager.keys.loxiaApiKey = 'real-key';
|
|
265
|
+
await manager.setSessionKeys('sess-1', { loxiaApiKey: 'platform-managed' });
|
|
266
|
+
expect(manager.keys.loxiaApiKey).toBe('real-key');
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test('refuses placeholder vendor keys', async () => {
|
|
270
|
+
manager.persistenceFile = null;
|
|
271
|
+
manager.keys.vendorKeys = { anthropic: 'real-anth-key' };
|
|
272
|
+
await manager.setSessionKeys('sess-1', {
|
|
273
|
+
vendorKeys: { anthropic: '••••••••(server-managed)' }
|
|
274
|
+
});
|
|
275
|
+
expect(manager.keys.vendorKeys.anthropic).toBe('real-anth-key');
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test('still accepts real keys (regression guard for the guard)', async () => {
|
|
279
|
+
manager.persistenceFile = null;
|
|
280
|
+
manager.keys.loxiaApiKey = 'old';
|
|
281
|
+
await manager.setSessionKeys('sess-1', { loxiaApiKey: 'lx_brand_new_real_key' });
|
|
282
|
+
expect(manager.keys.loxiaApiKey).toBe('lx_brand_new_real_key');
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
123
286
|
test('getSessionKeys returns keys regardless of sessionId', () => {
|
|
124
287
|
manager.keys.loxiaApiKey = 'test-key';
|
|
125
288
|
const keys = manager.getSessionKeys('any-session');
|