onbuzz 4.5.0 → 4.6.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/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 +183 -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 +281 -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 +249 -15
- package/src/index.js +8 -0
- package/src/interfaces/webServer.js +271 -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/imageFormat.js +249 -0
- package/src/tools/imageTool.js +107 -18
- package/src/tools/jobDoneTool.js +111 -3
- 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/apiKeyPlaceholders.js +68 -0
- package/src/utilities/brand.js +93 -0
- package/src/utilities/userDataDir.js +5 -0
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-CvuQ3hv-.js +1 -0
- package/web-ui/build/static/abap-BLdv0Jje.js +1 -0
- package/web-ui/build/static/abnf-CGGg8KtC.js +1 -0
- package/web-ui/build/static/abnf-DRXF8AHh.js +1 -0
- package/web-ui/build/static/accesslog-C0v06age.js +1 -0
- package/web-ui/build/static/actionscript-5uhk1qo4.js +1 -0
- package/web-ui/build/static/actionscript-eFh_rL7l.js +1 -0
- package/web-ui/build/static/ada-DX064lsk.js +1 -0
- package/web-ui/build/static/ada-DtDpZJA8.js +1 -0
- package/web-ui/build/static/agda-DPnmQC2V.js +1 -0
- package/web-ui/build/static/al-BJnZv7Mq.js +1 -0
- package/web-ui/build/static/angelscript-BzX4egqM.js +1 -0
- package/web-ui/build/static/antlr4-CpvLBdqN.js +1 -0
- package/web-ui/build/static/apache-CeMpLZgQ.js +1 -0
- package/web-ui/build/static/apacheconf-DuxpNgGg.js +1 -0
- package/web-ui/build/static/apex-BnvL-Zqw.js +1 -0
- package/web-ui/build/static/apl-Cwp1WC58.js +1 -0
- package/web-ui/build/static/applescript-Drjf4gZ_.js +1 -0
- package/web-ui/build/static/applescript-OCRtzdLy.js +1 -0
- package/web-ui/build/static/aql-BT92x5XB.js +1 -0
- package/web-ui/build/static/arcade-BS9r1rKb.js +1 -0
- package/web-ui/build/static/arduino-Dx4b0RsU.js +1 -0
- package/web-ui/build/static/arduino-MC82bxgK.js +1 -0
- package/web-ui/build/static/arff-BPbJPmCK.js +1 -0
- package/web-ui/build/static/armasm-Ae0OYiNN.js +1 -0
- package/web-ui/build/static/asciidoc-BFCjTY8x.js +1 -0
- package/web-ui/build/static/asciidoc-Cum1UNn8.js +1 -0
- package/web-ui/build/static/asm6502-DRrCRZ3g.js +1 -0
- package/web-ui/build/static/asmatmel-QweP0nrX.js +1 -0
- package/web-ui/build/static/aspectj-GSWlVl13.js +1 -0
- package/web-ui/build/static/aspnet-gFBjg3Gc.js +1 -0
- package/web-ui/build/static/autohotkey-BKW8CgdS.js +1 -0
- package/web-ui/build/static/autohotkey-PxYn0v1n.js +1 -0
- package/web-ui/build/static/autoit-Dm1-Ww37.js +1 -0
- package/web-ui/build/static/autoit-ttEVAAKG.js +1 -0
- package/web-ui/build/static/avisynth-B7Wkp41N.js +1 -0
- package/web-ui/build/static/avrasm-CUPF81zm.js +1 -0
- package/web-ui/build/static/avro-idl-DHWmsw82.js +1 -0
- package/web-ui/build/static/awk-CjJ3RSZI.js +1 -0
- package/web-ui/build/static/axapta-C1qEYhtS.js +1 -0
- package/web-ui/build/static/bash-BGEpCDRi.js +1 -0
- package/web-ui/build/static/bash-nKHqg4vr.js +1 -0
- package/web-ui/build/static/basic-BoEGbohL.js +1 -0
- package/web-ui/build/static/basic-LeZDGhzq.js +1 -0
- package/web-ui/build/static/batch-AgpF9rt8.js +1 -0
- package/web-ui/build/static/bbcode-qAuG7NMV.js +1 -0
- package/web-ui/build/static/bicep-BjdiK558.js +1 -0
- package/web-ui/build/static/birb-DAe1WhT3.js +1 -0
- package/web-ui/build/static/bison-BanDUZpy.js +1 -0
- package/web-ui/build/static/bnf-DlBe3_6s.js +1 -0
- package/web-ui/build/static/bnf-QgoO3Q8o.js +1 -0
- package/web-ui/build/static/brainfuck-B1DXmfDc.js +1 -0
- package/web-ui/build/static/brainfuck-B_JhB4QU.js +1 -0
- package/web-ui/build/static/brightscript-C0POlK1a.js +1 -0
- package/web-ui/build/static/bro-CjGWwSC2.js +1 -0
- package/web-ui/build/static/bsl-DXsNn0E7.js +1 -0
- package/web-ui/build/static/c-D-Xouzk3.js +1 -0
- package/web-ui/build/static/c-Df8JpOdZ.js +1 -0
- package/web-ui/build/static/c-like-BQySGMeF.js +1 -0
- package/web-ui/build/static/cal-DLefuKn4.js +1 -0
- package/web-ui/build/static/capnproto-DuI4CHAK.js +1 -0
- package/web-ui/build/static/ceylon-DyUD9r5X.js +1 -0
- package/web-ui/build/static/cfscript-B71LgEx4.js +1 -0
- package/web-ui/build/static/chaiscript-DUx8exmo.js +1 -0
- package/web-ui/build/static/cil-BkH647hL.js +1 -0
- package/web-ui/build/static/clean-4G2AsMGw.js +1 -0
- package/web-ui/build/static/clojure-C41DUPjJ.js +1 -0
- package/web-ui/build/static/clojure-RzWG1SWB.js +1 -0
- package/web-ui/build/static/clojure-repl-C12peSNj.js +1 -0
- package/web-ui/build/static/cmake-D9dyf1Ef.js +1 -0
- package/web-ui/build/static/cmake-X6aOgq7A.js +1 -0
- package/web-ui/build/static/cobol-DQBujvW6.js +1 -0
- package/web-ui/build/static/coffeescript-3uuDLR0C.js +1 -0
- package/web-ui/build/static/coffeescript-BesW_-0N.js +1 -0
- package/web-ui/build/static/concurnas-DUqxEcDq.js +1 -0
- package/web-ui/build/static/coq-BNw0ZmzS.js +1 -0
- package/web-ui/build/static/coq-J6mf-n4i.js +1 -0
- package/web-ui/build/static/cos-B-p2VbRC.js +1 -0
- package/web-ui/build/static/cpp-B91xny9o.js +1 -0
- package/web-ui/build/static/cpp-C-qfcmAQ.js +1 -0
- package/web-ui/build/static/crmsh-CXJSYh9n.js +1 -0
- package/web-ui/build/static/crystal-BZJ_gkDx.js +1 -0
- package/web-ui/build/static/crystal-D7rBvt2Y.js +1 -0
- package/web-ui/build/static/csharp-CHWbNjwN.js +1 -0
- package/web-ui/build/static/csharp-DHH7lbyr.js +1 -0
- package/web-ui/build/static/cshtml-6XKl5N6w.js +1 -0
- package/web-ui/build/static/csp-BwQp4uKS.js +1 -0
- package/web-ui/build/static/csp-LxTXhb7W.js +1 -0
- package/web-ui/build/static/css-JviRe6l1.js +1 -0
- package/web-ui/build/static/css-extras-DdIyhyWh.js +1 -0
- package/web-ui/build/static/csv-BhyLVYKF.js +1 -0
- package/web-ui/build/static/cypher-45QLqKfb.js +1 -0
- package/web-ui/build/static/d-BQuCFdtT.js +1 -0
- package/web-ui/build/static/d-rDpztdwo.js +1 -0
- package/web-ui/build/static/dart-B3HdKwvI.js +1 -0
- package/web-ui/build/static/dart-CxIvlNfF.js +1 -0
- package/web-ui/build/static/dataweave-CMS5SC_F.js +1 -0
- package/web-ui/build/static/dax-C_neqUB4.js +1 -0
- package/web-ui/build/static/delphi-D86BXUtC.js +1 -0
- package/web-ui/build/static/dhall-BGV0CTjz.js +1 -0
- package/web-ui/build/static/diff-Br5L84xu.js +1 -0
- package/web-ui/build/static/diff-C8dJOj7p.js +1 -0
- package/web-ui/build/static/django-CRpfLgb_.js +1 -0
- package/web-ui/build/static/django-Cr0k0BHt.js +1 -0
- package/web-ui/build/static/dns-CvhVGt9J.js +1 -0
- package/web-ui/build/static/dns-zone-file--waGszJ5.js +1 -0
- package/web-ui/build/static/docker-Bp-jYj4d.js +1 -0
- package/web-ui/build/static/dockerfile-B9PF5D-H.js +1 -0
- package/web-ui/build/static/dos-CGjRa73t.js +1 -0
- package/web-ui/build/static/dot---3xJv0W.js +1 -0
- package/web-ui/build/static/dsconfig-ChUbMzIk.js +1 -0
- package/web-ui/build/static/dts-DzVrXhdk.js +1 -0
- package/web-ui/build/static/dust-BuyYJzfS.js +1 -0
- package/web-ui/build/static/ebnf-B4Jhny4j.js +1 -0
- package/web-ui/build/static/ebnf-wTpKeELK.js +1 -0
- package/web-ui/build/static/editorconfig-DijMMyBE.js +1 -0
- package/web-ui/build/static/eiffel-gSk8UUfh.js +1 -0
- package/web-ui/build/static/ejs-U-J4wHaR.js +1 -0
- package/web-ui/build/static/elixir-CLgHOCRk.js +1 -0
- package/web-ui/build/static/elixir-KhfnyoV6.js +1 -0
- package/web-ui/build/static/elm-B0g83jwv.js +1 -0
- package/web-ui/build/static/elm-Bl8qDmwz.js +1 -0
- package/web-ui/build/static/erb-CwkagsxA.js +1 -0
- package/web-ui/build/static/erb-DXfF2Urb.js +1 -0
- package/web-ui/build/static/erlang-BsONy4Br.js +1 -0
- package/web-ui/build/static/erlang-C44ddtgw.js +1 -0
- package/web-ui/build/static/erlang-repl-DhirJ_Ji.js +1 -0
- package/web-ui/build/static/etlua-C71HyvJj.js +1 -0
- package/web-ui/build/static/excel-B_RD_Nc6.js +1 -0
- package/web-ui/build/static/excel-formula-xRVcfp1T.js +1 -0
- package/web-ui/build/static/factor-CftUx68l.js +1 -0
- package/web-ui/build/static/false-DqRtSZRC.js +1 -0
- package/web-ui/build/static/firestore-security-rules-BCG_0nJP.js +1 -0
- package/web-ui/build/static/fix-CnRMAIWg.js +1 -0
- package/web-ui/build/static/flix-DLAgo_-e.js +1 -0
- package/web-ui/build/static/flow-w5YSIX1I.js +1 -0
- package/web-ui/build/static/fortran-CH5byJ0j.js +1 -0
- package/web-ui/build/static/fortran-DK-jnXQF.js +1 -0
- package/web-ui/build/static/fsharp-Cnfw9xB2.js +1 -0
- package/web-ui/build/static/fsharp-hebdfC6F.js +1 -0
- package/web-ui/build/static/ftl-DSSTp35t.js +1 -0
- package/web-ui/build/static/gams-C3akjfKZ.js +1 -0
- package/web-ui/build/static/gap-Dve6kEeL.js +1 -0
- package/web-ui/build/static/gauss-BmUqjv1m.js +1 -0
- package/web-ui/build/static/gcode-CjPpcuxm.js +1 -0
- package/web-ui/build/static/gcode-DdF0Sf0K.js +1 -0
- package/web-ui/build/static/gdscript-uyE_Q4Bz.js +1 -0
- package/web-ui/build/static/gedcom-9_5CrYud.js +1 -0
- package/web-ui/build/static/gherkin-0qL8AiDA.js +1 -0
- package/web-ui/build/static/gherkin-CBXpoWw3.js +1 -0
- package/web-ui/build/static/git-D6Y51k33.js +1 -0
- package/web-ui/build/static/glsl-DnD7skof.js +1 -0
- package/web-ui/build/static/glsl-aij7eTLw.js +1 -0
- package/web-ui/build/static/gml-3zbjVRHR.js +1 -0
- package/web-ui/build/static/gml-BOViyHVy.js +1 -0
- package/web-ui/build/static/gn-lYZFOgaG.js +1 -0
- package/web-ui/build/static/go-D3NQLBKz.js +1 -0
- package/web-ui/build/static/go-_v8tkYQe.js +1 -0
- package/web-ui/build/static/go-module-C6c3_rbX.js +1 -0
- package/web-ui/build/static/golo-BOIzwgKG.js +1 -0
- package/web-ui/build/static/gradle-DdejLgT6.js +1 -0
- package/web-ui/build/static/graphql-BWowSWlo.js +1 -0
- package/web-ui/build/static/groovy-DE_kIGjj.js +1 -0
- package/web-ui/build/static/groovy-DatEqK3Y.js +1 -0
- package/web-ui/build/static/haml-CpEpgDyf.js +1 -0
- package/web-ui/build/static/haml-DbPIKAsr.js +1 -0
- package/web-ui/build/static/handlebars-BcvOygMh.js +1 -0
- package/web-ui/build/static/handlebars-CM_40QlT.js +1 -0
- package/web-ui/build/static/haskell-DVgDTyj3.js +1 -0
- package/web-ui/build/static/haskell-Dm2oiqNu.js +1 -0
- package/web-ui/build/static/haxe--0QfWvD_.js +1 -0
- package/web-ui/build/static/haxe-DClHSH5I.js +1 -0
- package/web-ui/build/static/hcl-BaxNlNAk.js +1 -0
- package/web-ui/build/static/hlsl-Di7PYfJn.js +1 -0
- package/web-ui/build/static/hoon-Bq4hhWSd.js +1 -0
- package/web-ui/build/static/hpkp-Bu1AnCZZ.js +1 -0
- package/web-ui/build/static/hsp-CbIHPOnb.js +1 -0
- package/web-ui/build/static/hsts-inGzMZHb.js +1 -0
- package/web-ui/build/static/htmlbars-B63TZb6k.js +1 -0
- package/web-ui/build/static/http-3wWrh86I.js +1 -0
- package/web-ui/build/static/http-Bv97BGAr.js +1 -0
- package/web-ui/build/static/hy-CIEvnIJC.js +1 -0
- package/web-ui/build/static/ichigojam-BAyO373g.js +1 -0
- package/web-ui/build/static/icon-CGCawTFI.js +1 -0
- package/web-ui/build/static/icu-message-format-C_lOXF7I.js +1 -0
- package/web-ui/build/static/idris-D0SaDFta.js +1 -0
- package/web-ui/build/static/iecst-DIJ6Ei7g.js +1 -0
- package/web-ui/build/static/ignore-CgcF6vXx.js +1 -0
- package/web-ui/build/static/index-CCDUVvvx.js +1 -0
- package/web-ui/build/static/index-Cjg3uZB9.js +1109 -0
- package/web-ui/build/static/index-CjtNtdGN.js +13 -0
- package/web-ui/build/static/index-DpMwgPzf.css +1 -0
- package/web-ui/build/static/inform7-C_MqBtMp.js +1 -0
- package/web-ui/build/static/inform7-CmRJkJSh.js +1 -0
- package/web-ui/build/static/ini-BE6jwIzm.js +1 -0
- package/web-ui/build/static/ini-BJ50J7Sm.js +1 -0
- package/web-ui/build/static/io-Cnt0nyV5.js +1 -0
- package/web-ui/build/static/irpf90-BjRJE_kg.js +1 -0
- package/web-ui/build/static/isbl-C7912t_8.js +1 -0
- package/web-ui/build/static/j-D6ci3wH9.js +1 -0
- package/web-ui/build/static/java-B_gtzL63.js +1 -0
- package/web-ui/build/static/java-CChyLI1p.js +1 -0
- package/web-ui/build/static/javadoc-CGvzgn19.js +1 -0
- package/web-ui/build/static/javadoclike-CI4krpLe.js +1 -0
- package/web-ui/build/static/javascript-CgORCJsx.js +1 -0
- package/web-ui/build/static/javastacktrace-DNnLXvJa.js +1 -0
- package/web-ui/build/static/jboss-cli-DIfGm3Rl.js +1 -0
- package/web-ui/build/static/jexl-CYQxvL_i.js +1 -0
- package/web-ui/build/static/jolie-C2fxUjz7.js +1 -0
- package/web-ui/build/static/jq-j1fAl-OU.js +1 -0
- package/web-ui/build/static/js-extras-Dqx-da8U.js +1 -0
- package/web-ui/build/static/js-templates-jQphR4CW.js +1 -0
- package/web-ui/build/static/jsdoc-BCunhOqo.js +1 -0
- package/web-ui/build/static/json-CljDde4D.js +1 -0
- package/web-ui/build/static/json-Cvzg5_hO.js +1 -0
- package/web-ui/build/static/json5-B19V_yl9.js +1 -0
- package/web-ui/build/static/jsonp-WdmhO5Oi.js +1 -0
- package/web-ui/build/static/jsstacktrace-LpNHn4a_.js +1 -0
- package/web-ui/build/static/jsx-Zw6Egddf.js +1 -0
- package/web-ui/build/static/julia-DPlpJZNN.js +1 -0
- package/web-ui/build/static/julia-DuKc9nrz.js +1 -0
- package/web-ui/build/static/julia-repl-C-LuPMzI.js +1 -0
- package/web-ui/build/static/keepalived-DDl-dK9a.js +1 -0
- package/web-ui/build/static/keyman-DCtgoYKu.js +1 -0
- package/web-ui/build/static/kotlin-D9aFeaCS.js +1 -0
- package/web-ui/build/static/kotlin-DlrR34XG.js +1 -0
- package/web-ui/build/static/kumir-B_aiiAzq.js +1 -0
- package/web-ui/build/static/kusto-CD4lHO1B.js +1 -0
- package/web-ui/build/static/lasso-BAMF8mdd.js +1 -0
- package/web-ui/build/static/latex-BjEyffe7.js +1 -0
- package/web-ui/build/static/latex-NaCSqcbD.js +1 -0
- package/web-ui/build/static/latte-BACpaGl3.js +1 -0
- package/web-ui/build/static/ldif-CRWTiH1W.js +1 -0
- package/web-ui/build/static/leaf-BYydRpJx.js +1 -0
- package/web-ui/build/static/less-BtFu1MXi.js +1 -0
- package/web-ui/build/static/less-COgcqIOM.js +1 -0
- package/web-ui/build/static/lilypond-BMLjCV3G.js +1 -0
- package/web-ui/build/static/liquid-Dr5bQMAB.js +1 -0
- package/web-ui/build/static/lisp-CE1ra7Xs.js +1 -0
- package/web-ui/build/static/lisp-CcOEo5DI.js +1 -0
- package/web-ui/build/static/livecodeserver-DNuOfASY.js +1 -0
- package/web-ui/build/static/livescript-BJor4pxz.js +1 -0
- package/web-ui/build/static/livescript-DFaZj6XM.js +1 -0
- package/web-ui/build/static/llvm-CJtHIXsX.js +1 -0
- package/web-ui/build/static/llvm-d3gQICQs.js +1 -0
- package/web-ui/build/static/log-B0pKN1S4.js +1 -0
- package/web-ui/build/static/lolcode-C_V6Sffm.js +1 -0
- package/web-ui/build/static/lsl-yhp5dB9o.js +1 -0
- package/web-ui/build/static/lua-BDTJq_SO.js +1 -0
- package/web-ui/build/static/lua-BaKkUUd_.js +1 -0
- package/web-ui/build/static/magma-aTzw_jlN.js +1 -0
- package/web-ui/build/static/makefile-FyZn4dZ-.js +1 -0
- package/web-ui/build/static/makefile-Vk7smupm.js +1 -0
- package/web-ui/build/static/markdown-BHavO-Hk.js +1 -0
- package/web-ui/build/static/markdown-CTYy6uqC.js +1 -0
- package/web-ui/build/static/markup-templating-DJWuQB2F.js +1 -0
- package/web-ui/build/static/mathematica-BnMzpFTS.js +1 -0
- package/web-ui/build/static/matlab-BsW3yHe5.js +1 -0
- package/web-ui/build/static/matlab-C8_ylrUg.js +1 -0
- package/web-ui/build/static/maxima-c3e9EB-f.js +1 -0
- package/web-ui/build/static/maxscript-DU-NoCpb.js +1 -0
- package/web-ui/build/static/mel-CcB2EUO0.js +1 -0
- package/web-ui/build/static/mel-u6igP96m.js +1 -0
- package/web-ui/build/static/mercury-YZshmW3v.js +1 -0
- package/web-ui/build/static/mermaid-C9dmgLlU.js +1 -0
- package/web-ui/build/static/mipsasm-BXHH9ztX.js +1 -0
- package/web-ui/build/static/mizar-B1317rho.js +1 -0
- package/web-ui/build/static/mizar-BjaPUUcM.js +1 -0
- package/web-ui/build/static/mojolicious-BQ8vE8HW.js +1 -0
- package/web-ui/build/static/mongodb-P-J2PnwH.js +1 -0
- package/web-ui/build/static/monkey-DcKZEVh6.js +1 -0
- package/web-ui/build/static/monkey-wMAzhDv4.js +1 -0
- package/web-ui/build/static/moonscript-C9Ea7K1o.js +1 -0
- package/web-ui/build/static/moonscript-DAjW1T8X.js +1 -0
- package/web-ui/build/static/n1ql-6nGwiuTr.js +1 -0
- package/web-ui/build/static/n1ql-BxgYqKfs.js +1 -0
- package/web-ui/build/static/n4js-Cqw8_-b7.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-B3Qrhhfv.js +1 -0
- package/web-ui/build/static/naniscript-BpIC5j6P.js +1 -0
- package/web-ui/build/static/nasm-Dp1z_ttd.js +1 -0
- package/web-ui/build/static/neon-B4RksdIv.js +1 -0
- package/web-ui/build/static/nevod-P34zfD9_.js +1 -0
- package/web-ui/build/static/nginx-CSaiFc4g.js +1 -0
- package/web-ui/build/static/nginx-bZFV7OqP.js +1 -0
- package/web-ui/build/static/nim-D04ADsdj.js +1 -0
- package/web-ui/build/static/nim-D37nbh5y.js +1 -0
- package/web-ui/build/static/nix-BPsQ58gF.js +1 -0
- package/web-ui/build/static/nix-keWnuH3h.js +1 -0
- package/web-ui/build/static/node-repl-rNkVcb6S.js +1 -0
- package/web-ui/build/static/nsis-DT8bhvLc.js +1 -0
- package/web-ui/build/static/nsis-DvfCmyQQ.js +1 -0
- package/web-ui/build/static/objectivec-BaJIzRqu.js +1 -0
- package/web-ui/build/static/objectivec-CmAY0jlQ.js +1 -0
- package/web-ui/build/static/ocaml-Dsf96dbW.js +1 -0
- package/web-ui/build/static/ocaml-SFQJ7AwJ.js +1 -0
- package/web-ui/build/static/opencl-Dp9ILs3s.js +1 -0
- package/web-ui/build/static/openqasm-Bsk-xK6C.js +1 -0
- package/web-ui/build/static/openscad-Dgvp4h50.js +1 -0
- package/web-ui/build/static/oxygene-C9rTsztX.js +1 -0
- package/web-ui/build/static/oz-DNlV-Ssf.js +1 -0
- package/web-ui/build/static/parigp-B7a5XVP7.js +1 -0
- package/web-ui/build/static/parser-nTo2WBxY.js +1 -0
- package/web-ui/build/static/parser3-BSD4cYqf.js +1 -0
- package/web-ui/build/static/pascal-DJxIFBHG.js +1 -0
- package/web-ui/build/static/pascaligo-JdV741ps.js +1 -0
- package/web-ui/build/static/pcaxis-DdexNvEQ.js +1 -0
- package/web-ui/build/static/peoplecode-DxBgZPZT.js +1 -0
- package/web-ui/build/static/perl-C0INln41.js +1 -0
- package/web-ui/build/static/perl-DvRuNidH.js +1 -0
- package/web-ui/build/static/pf-BjguNjII.js +1 -0
- package/web-ui/build/static/pgsql-9w8Z8Ams.js +1 -0
- package/web-ui/build/static/php-DKQIY8Pe.js +1 -0
- package/web-ui/build/static/php-DibEnIhD.js +1 -0
- package/web-ui/build/static/php-extras-CKKhA74Z.js +1 -0
- package/web-ui/build/static/php-template-Cjba7UNU.js +1 -0
- package/web-ui/build/static/phpdoc-QXtTW5az.js +1 -0
- package/web-ui/build/static/plaintext-Cbn61_h_.js +1 -0
- package/web-ui/build/static/plsql-f34z7hfB.js +1 -0
- package/web-ui/build/static/pony-DBSnXJAW.js +1 -0
- package/web-ui/build/static/powerquery-lin81zqH.js +1 -0
- package/web-ui/build/static/powershell-BoyP16Ta.js +1 -0
- package/web-ui/build/static/powershell-CCpHONl6.js +1 -0
- package/web-ui/build/static/processing-Cd7-ycAb.js +1 -0
- package/web-ui/build/static/processing-CeGW9CwE.js +1 -0
- package/web-ui/build/static/profile-DLYi3Uya.js +1 -0
- package/web-ui/build/static/prolog-BVr1f3c4.js +1 -0
- package/web-ui/build/static/prolog-C3D6KhoT.js +1 -0
- package/web-ui/build/static/promql-dviC9B24.js +1 -0
- package/web-ui/build/static/properties-CSNjefFg.js +1 -0
- package/web-ui/build/static/properties-DTAWAQKc.js +1 -0
- package/web-ui/build/static/protobuf-BCYoMCa-.js +1 -0
- package/web-ui/build/static/protobuf-D8G6xbh1.js +1 -0
- package/web-ui/build/static/psl-DzehMnl-.js +1 -0
- package/web-ui/build/static/pug-Cl4m_Cmv.js +1 -0
- package/web-ui/build/static/puppet-CECKDklS.js +1 -0
- package/web-ui/build/static/puppet-ZSk9z7h2.js +1 -0
- package/web-ui/build/static/pure-CRYVKpUf.js +1 -0
- package/web-ui/build/static/purebasic-B1B7jCI9.js +1 -0
- package/web-ui/build/static/purebasic-BdOvLN02.js +1 -0
- package/web-ui/build/static/purescript-CdFZo5U_.js +1 -0
- package/web-ui/build/static/python-B_UnJ1V3.js +1 -0
- package/web-ui/build/static/python-BeSi3a8_.js +1 -0
- package/web-ui/build/static/python-repl-BBmtoedD.js +1 -0
- package/web-ui/build/static/q-Ery9rED_.js +1 -0
- package/web-ui/build/static/q-OEzRNQWZ.js +1 -0
- package/web-ui/build/static/qml-DdHTOYCC.js +1 -0
- package/web-ui/build/static/qml-DqjqC3TV.js +1 -0
- package/web-ui/build/static/qore-D3qGrct2.js +1 -0
- package/web-ui/build/static/qsharp-DdQgHY8o.js +1 -0
- package/web-ui/build/static/r-BsnBh-Gb.js +1 -0
- package/web-ui/build/static/r-CgLmD3ej.js +1 -0
- package/web-ui/build/static/racket-CgSPkQxA.js +1 -0
- package/web-ui/build/static/reason-BRJ4xDT3.js +1 -0
- package/web-ui/build/static/reasonml-B8V18bIF.js +1 -0
- package/web-ui/build/static/regex-C8qp_5tY.js +1 -0
- package/web-ui/build/static/rego-B3dQMEmR.js +1 -0
- package/web-ui/build/static/renpy-BmlUaEOQ.js +1 -0
- package/web-ui/build/static/rest-XlDNtjp0.js +1 -0
- package/web-ui/build/static/rib-BfquiuWk.js +1 -0
- package/web-ui/build/static/rip-dGRhlG0v.js +1 -0
- package/web-ui/build/static/roboconf-CtBSSFaA.js +1 -0
- package/web-ui/build/static/roboconf-wrbztr2r.js +1 -0
- package/web-ui/build/static/robotframework-BSxuJaY6.js +1 -0
- package/web-ui/build/static/routeros-DHKFvEvZ.js +1 -0
- package/web-ui/build/static/rsl-BhjvE0Cr.js +1 -0
- package/web-ui/build/static/ruby-BMED8W31.js +1 -0
- package/web-ui/build/static/ruby-BkE7uZGd.js +1 -0
- package/web-ui/build/static/ruleslanguage-DGe1m8Id.js +1 -0
- package/web-ui/build/static/rust-CUje9n_P.js +1 -0
- package/web-ui/build/static/rust-O67yEsAu.js +1 -0
- package/web-ui/build/static/sas-BpDWmnoa.js +1 -0
- package/web-ui/build/static/sas-DRBVod_5.js +1 -0
- package/web-ui/build/static/sass-CdUBh_kW.js +1 -0
- package/web-ui/build/static/scala-BvUTPbg2.js +1 -0
- package/web-ui/build/static/scala-DmXpVBFR.js +1 -0
- package/web-ui/build/static/scheme-BfzSegEb.js +1 -0
- package/web-ui/build/static/scheme-CL7dxV3L.js +1 -0
- package/web-ui/build/static/scilab-Bwx8K6ut.js +1 -0
- package/web-ui/build/static/scss-Bk3cnVi-.js +1 -0
- package/web-ui/build/static/scss-CEq_Uo2G.js +1 -0
- package/web-ui/build/static/shell-CH2lH60k.js +1 -0
- package/web-ui/build/static/shell-session-Dsc6nnXg.js +1 -0
- package/web-ui/build/static/smali-DR57iO-M.js +1 -0
- package/web-ui/build/static/smali-QDgUokkE.js +1 -0
- package/web-ui/build/static/smalltalk-CNWYoGI5.js +1 -0
- package/web-ui/build/static/smalltalk-DuKK00UG.js +1 -0
- package/web-ui/build/static/smarty-CM_K74KX.js +1 -0
- package/web-ui/build/static/sml-B-u4vtVQ.js +1 -0
- package/web-ui/build/static/sml-CnAed_Dv.js +1 -0
- package/web-ui/build/static/solidity-Bc_FUKPw.js +1 -0
- package/web-ui/build/static/solution-file-CE-Ffn8a.js +1 -0
- package/web-ui/build/static/soy-B__lNQNx.js +1 -0
- package/web-ui/build/static/sparql-BZnN0yju.js +1 -0
- package/web-ui/build/static/splunk-spl-DIs_BiUo.js +1 -0
- package/web-ui/build/static/sqf-DNSlhOUj.js +1 -0
- package/web-ui/build/static/sqf-DwPev5qJ.js +1 -0
- package/web-ui/build/static/sql-C9UaJUCf.js +1 -0
- package/web-ui/build/static/sql-DAnJSRyV.js +1 -0
- package/web-ui/build/static/sql_more-DMMfa_Zg.js +1 -0
- package/web-ui/build/static/squirrel-Bevu4MOl.js +1 -0
- package/web-ui/build/static/stan-Bs_yMVnC.js +1 -0
- package/web-ui/build/static/stan-Cduy4Z3W.js +1 -0
- package/web-ui/build/static/stata-BrHJdKRc.js +1 -0
- package/web-ui/build/static/step21-CGhxzCID.js +1 -0
- package/web-ui/build/static/stylus-B2lueE5_.js +1 -0
- package/web-ui/build/static/stylus-pKniqDuc.js +1 -0
- package/web-ui/build/static/subunit-B5WE5S5P.js +1 -0
- package/web-ui/build/static/swift-CEi576mT.js +1 -0
- package/web-ui/build/static/swift-CQCuFcEK.js +1 -0
- package/web-ui/build/static/systemd-CF-EHggg.js +1 -0
- package/web-ui/build/static/t4-cs-DWdn0RQB.js +1 -0
- package/web-ui/build/static/t4-templating-C15ubdW6.js +1 -0
- package/web-ui/build/static/t4-vb-Cz2QCDLO.js +1 -0
- package/web-ui/build/static/taggerscript-CfU_hv7J.js +1 -0
- package/web-ui/build/static/tap-2-gLM4Lw.js +1 -0
- package/web-ui/build/static/tap-M44CQJkj.js +1 -0
- package/web-ui/build/static/tcl-BMpkwsCa.js +1 -0
- package/web-ui/build/static/tcl-CfF-clAT.js +1 -0
- package/web-ui/build/static/textile-CUkgUEkV.js +1 -0
- package/web-ui/build/static/thrift-daJZ1DGJ.js +1 -0
- package/web-ui/build/static/toml-DnW5prhH.js +1 -0
- package/web-ui/build/static/tp-ZqeJLSGg.js +1 -0
- package/web-ui/build/static/tremor-WcELDSvz.js +1 -0
- package/web-ui/build/static/tsx-BVww6xUP.js +1 -0
- package/web-ui/build/static/tt2-Cxt3LLr_.js +1 -0
- package/web-ui/build/static/turtle-DmRTxNN8.js +1 -0
- package/web-ui/build/static/twig-DcLADpYg.js +1 -0
- package/web-ui/build/static/twig-Drdxszx_.js +1 -0
- package/web-ui/build/static/typescript-CgVWCuS9.js +1 -0
- package/web-ui/build/static/typescript-D3GjnDi9.js +1 -0
- package/web-ui/build/static/typoscript-B4qyGuOT.js +1 -0
- package/web-ui/build/static/unrealscript-BtIQeIeR.js +1 -0
- package/web-ui/build/static/uorazor-eWa_YDYv.js +1 -0
- package/web-ui/build/static/uri-CxsgAGHN.js +1 -0
- package/web-ui/build/static/v-D84eyWwn.js +1 -0
- package/web-ui/build/static/vala-Ccb9w5DW.js +1 -0
- package/web-ui/build/static/vala-MsPY7Xer.js +1 -0
- package/web-ui/build/static/vbnet-B33DMpXq.js +1 -0
- package/web-ui/build/static/vbnet-CaLY-AOH.js +1 -0
- package/web-ui/build/static/vbscript-DrXwNwNu.js +1 -0
- package/web-ui/build/static/vbscript-html-OTJEVr5m.js +1 -0
- package/web-ui/build/static/velocity-q0bXdAL4.js +1 -0
- package/web-ui/build/static/verilog-BD-Nxyqa.js +1 -0
- package/web-ui/build/static/verilog-PFy9sucN.js +1 -0
- package/web-ui/build/static/vhdl-BeCVyLiK.js +1 -0
- package/web-ui/build/static/vhdl-CMHdBpc5.js +1 -0
- package/web-ui/build/static/vim-3d_DOCsL.js +1 -0
- package/web-ui/build/static/vim-Bl5swMbH.js +1 -0
- package/web-ui/build/static/visual-basic-CjOvSeMg.js +1 -0
- package/web-ui/build/static/warpscript-C2EL35K2.js +1 -0
- package/web-ui/build/static/wasm-DmFD8VgH.js +1 -0
- package/web-ui/build/static/web-idl-RnzsvoQV.js +1 -0
- package/web-ui/build/static/wiki-Bu-zrPhW.js +1 -0
- package/web-ui/build/static/wolfram-CYYr3oaW.js +1 -0
- package/web-ui/build/static/wren-BXwkGwpn.js +1 -0
- package/web-ui/build/static/x86asm-_F19Kl5Y.js +1 -0
- package/web-ui/build/static/xeora-BmVPgL2I.js +1 -0
- package/web-ui/build/static/xl-68telKZ2.js +1 -0
- package/web-ui/build/static/xml-DPdaRgU0.js +1 -0
- package/web-ui/build/static/xml-doc-Aa64lijn.js +1 -0
- package/web-ui/build/static/xojo-DminlfyC.js +1 -0
- package/web-ui/build/static/xquery-BC1P9u6q.js +1 -0
- package/web-ui/build/static/xquery-kRz8gtls.js +1 -0
- package/web-ui/build/static/yaml-Bh9xHEaX.js +1 -0
- package/web-ui/build/static/yaml-CQW4NAe0.js +1 -0
- package/web-ui/build/static/yang-joHFzzXq.js +1 -0
- package/web-ui/build/static/zephir-BDGPNzsB.js +1 -0
- package/web-ui/build/static/zig-DtLmllYo.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
package/src/core/flowExecutor.js
CHANGED
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { AGENT_MODES } from '../utilities/constants.js';
|
|
13
|
+
import { validateFlowDefinition } from './flowSchema.js';
|
|
14
|
+
import { assembleNodeInputs } from './flowFieldMapping.js';
|
|
15
|
+
import { runWithRetry, FlowRetryError } from './flowRetry.js';
|
|
13
16
|
|
|
14
17
|
class FlowExecutor {
|
|
15
18
|
constructor(config, logger, stateManager, agentPool, messageProcessor) {
|
|
@@ -27,6 +30,40 @@ class FlowExecutor {
|
|
|
27
30
|
|
|
28
31
|
// Completion listeners per run
|
|
29
32
|
this.completionListeners = new Map();
|
|
33
|
+
|
|
34
|
+
// Phase 8: agentId → currently-awaited node contract.
|
|
35
|
+
// Set when an agent is invoked inside a flow node; cleared when
|
|
36
|
+
// the await resolves. The jobdone tool reads this to validate
|
|
37
|
+
// the agent's job-done call AT TOOL TIME — rejecting partial
|
|
38
|
+
// calls before they propagate into the executor.
|
|
39
|
+
this.activeContracts = new Map();
|
|
40
|
+
|
|
41
|
+
// Optional disk checkpointing — when set, every successful node
|
|
42
|
+
// persists its result so the run can resume after a crash. Off by
|
|
43
|
+
// default (preserves pre-Phase-4 behavior; opt in via setCheckpointStore).
|
|
44
|
+
this.checkpointStore = null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Phase 8: get the currently-awaited node contract for an agent (if any).
|
|
49
|
+
* Returns the contract object { inputs, outputs, instructions, ... } so
|
|
50
|
+
* the jobdone tool can validate the agent's call against it AT TOOL TIME
|
|
51
|
+
* — much faster recovery than waiting for executor-level re-prompts.
|
|
52
|
+
*
|
|
53
|
+
* @param {string} agentId
|
|
54
|
+
* @returns {object|null} the contract, or null when the agent isn't in
|
|
55
|
+
* a flow step right now.
|
|
56
|
+
*/
|
|
57
|
+
getActiveContract(agentId) {
|
|
58
|
+
return this.activeContracts.get(agentId) || null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Phase 4: enable disk checkpoints + resume by injecting a store.
|
|
63
|
+
* Calling with null disables checkpointing.
|
|
64
|
+
*/
|
|
65
|
+
setCheckpointStore(store) {
|
|
66
|
+
this.checkpointStore = store || null;
|
|
30
67
|
}
|
|
31
68
|
|
|
32
69
|
/**
|
|
@@ -51,6 +88,21 @@ class FlowExecutor {
|
|
|
51
88
|
throw new Error(`Flow not found: ${flowId}`);
|
|
52
89
|
}
|
|
53
90
|
|
|
91
|
+
// Belt-and-suspenders schema check. The POST/PUT routes already gate
|
|
92
|
+
// on this, but flows can also be authored by importing JSON files
|
|
93
|
+
// directly into the index, or by older clients that bypassed the
|
|
94
|
+
// route. Catching here means we never queue agents on a flow that
|
|
95
|
+
// we can't actually execute. Errors include path so the caller can
|
|
96
|
+
// surface them in the run-detail view.
|
|
97
|
+
const validation = validateFlowDefinition(flow);
|
|
98
|
+
if (!validation.ok) {
|
|
99
|
+
const detail = validation.errors.map(e => e.message).join('; ');
|
|
100
|
+
this.logger.warn(`Flow ${flowId} failed schema validation; refusing to execute`, {
|
|
101
|
+
errors: validation.errors,
|
|
102
|
+
});
|
|
103
|
+
throw new Error(`Flow definition is invalid: ${detail}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
54
106
|
// Create flow run record
|
|
55
107
|
const run = await this.stateManager.createFlowRun(flowId, initialInput);
|
|
56
108
|
const runId = run.id;
|
|
@@ -71,8 +123,13 @@ class FlowExecutor {
|
|
|
71
123
|
startedAt: new Date()
|
|
72
124
|
});
|
|
73
125
|
|
|
74
|
-
// Update run status to running
|
|
75
|
-
|
|
126
|
+
// Update run status to running. Phase 6.3: stamp the flow's
|
|
127
|
+
// current version onto the run so we can later answer "which
|
|
128
|
+
// definition produced this output?" — important after rollbacks.
|
|
129
|
+
await this.stateManager.updateFlowRun(runId, {
|
|
130
|
+
status: 'running',
|
|
131
|
+
flowVersion: flow.version ?? null,
|
|
132
|
+
});
|
|
76
133
|
const startedAt = new Date().toISOString();
|
|
77
134
|
this.broadcastFlowUpdate(sessionId, {
|
|
78
135
|
type: 'flow_run_started',
|
|
@@ -120,6 +177,14 @@ class FlowExecutor {
|
|
|
120
177
|
return { runId, status: 'stopped' };
|
|
121
178
|
}
|
|
122
179
|
|
|
180
|
+
// Phase 4: skip nodes already completed in a previous run that
|
|
181
|
+
// we're resuming from. Their outputs were rehydrated into
|
|
182
|
+
// context.nodeOutputs by resumeFlow before the loop started.
|
|
183
|
+
if (context.skipCompletedNodeIds?.has?.(node.id)) {
|
|
184
|
+
this.logger.info(`Flow ${flowId}: skipping already-completed node ${node.id} on resume`);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
|
|
123
188
|
// Execute node
|
|
124
189
|
const nodeResult = await this.executeNode(node, context, runId, sessionId, flow);
|
|
125
190
|
|
|
@@ -133,6 +198,18 @@ class FlowExecutor {
|
|
|
133
198
|
|
|
134
199
|
// Update node state in run
|
|
135
200
|
await this.updateNodeState(runId, node.id, 'completed', nodeResult);
|
|
201
|
+
|
|
202
|
+
// Phase 4: persist a checkpoint after each successful node so a
|
|
203
|
+
// resume can skip back here. Best-effort — checkpoint failures
|
|
204
|
+
// don't fail the run (we'd rather complete without resumability
|
|
205
|
+
// than blow up because disk is full).
|
|
206
|
+
if (this.checkpointStore) {
|
|
207
|
+
try {
|
|
208
|
+
await this.checkpointStore.saveNodeResult(runId, node.id, nodeResult);
|
|
209
|
+
} catch (err) {
|
|
210
|
+
this.logger.warn(`Flow ${flowId}: failed to checkpoint node ${node.id}`, { error: err.message });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
136
213
|
}
|
|
137
214
|
|
|
138
215
|
// Flow completed successfully
|
|
@@ -182,6 +259,111 @@ class FlowExecutor {
|
|
|
182
259
|
}
|
|
183
260
|
}
|
|
184
261
|
|
|
262
|
+
/**
|
|
263
|
+
* Phase 4: resume a previously-failed or interrupted run.
|
|
264
|
+
*
|
|
265
|
+
* Loads the run record + per-node checkpoints, rehydrates the
|
|
266
|
+
* execution context with all completed nodes' outputs, and re-runs
|
|
267
|
+
* the loop. The standard executeFlow loop skips any node whose ID is
|
|
268
|
+
* present in `context.skipCompletedNodeIds`, so completed work isn't
|
|
269
|
+
* repeated.
|
|
270
|
+
*
|
|
271
|
+
* Requires `setCheckpointStore` to have been called — without it,
|
|
272
|
+
* there are no per-node checkpoints to read and resume is a no-op
|
|
273
|
+
* fall-through.
|
|
274
|
+
*
|
|
275
|
+
* @param {string} runId
|
|
276
|
+
* @param {string|null} sessionId
|
|
277
|
+
* @returns {Promise<{ runId, status, output? }>}
|
|
278
|
+
*/
|
|
279
|
+
async resumeFlow(runId, sessionId = null) {
|
|
280
|
+
if (!this.checkpointStore) {
|
|
281
|
+
throw new Error('Cannot resume: no checkpoint store configured (call setCheckpointStore first)');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const run = await this.stateManager.getFlowRun(runId);
|
|
285
|
+
if (!run) throw new Error(`Cannot resume: flow run not found: ${runId}`);
|
|
286
|
+
if (run.status === 'completed') {
|
|
287
|
+
return { runId, status: 'completed', output: run.output };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const flow = await this.stateManager.getFlow(run.flowId);
|
|
291
|
+
if (!flow) throw new Error(`Cannot resume: flow definition not found: ${run.flowId}`);
|
|
292
|
+
|
|
293
|
+
// Same schema gate as executeFlow — the flow definition might have
|
|
294
|
+
// been edited between runs into an invalid shape.
|
|
295
|
+
const validation = validateFlowDefinition(flow);
|
|
296
|
+
if (!validation.ok) {
|
|
297
|
+
const detail = validation.errors.map(e => e.message).join('; ');
|
|
298
|
+
throw new Error(`Cannot resume: flow definition is invalid: ${detail}`);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Rehydrate completed-node outputs from disk.
|
|
302
|
+
const persistedOutputs = await this.checkpointStore.loadAllNodeResults(runId);
|
|
303
|
+
const completedIds = new Set(Object.keys(persistedOutputs));
|
|
304
|
+
this.logger.info(`Resuming flow ${run.flowId} run ${runId}`, {
|
|
305
|
+
completedNodes: completedIds.size,
|
|
306
|
+
totalNodes: flow.nodes.length,
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
this.activeExecutions.set(runId, {
|
|
310
|
+
flowId: run.flowId, flow, runId, sessionId,
|
|
311
|
+
status: 'running', startedAt: new Date(),
|
|
312
|
+
});
|
|
313
|
+
await this.stateManager.updateFlowRun(runId, { status: 'running', resumedAt: new Date().toISOString() });
|
|
314
|
+
this.broadcastFlowUpdate(sessionId, { type: 'flow_run_resumed', runId, flowId: run.flowId });
|
|
315
|
+
|
|
316
|
+
try {
|
|
317
|
+
await this.ensureAgentsLoaded(flow.nodes);
|
|
318
|
+
const sortedNodes = this.topologicalSort(flow.nodes, flow.edges);
|
|
319
|
+
if (sortedNodes.length === 0) throw new Error('Flow has no executable nodes');
|
|
320
|
+
|
|
321
|
+
const context = {
|
|
322
|
+
input: run.initialInput?.userInput || run.initialInput?.input || '',
|
|
323
|
+
nodeOutputs: { ...persistedOutputs },
|
|
324
|
+
variables: { ...flow.variables },
|
|
325
|
+
sortedNodes,
|
|
326
|
+
flow,
|
|
327
|
+
skipCompletedNodeIds: completedIds,
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
for (const node of sortedNodes) {
|
|
331
|
+
const execution = this.activeExecutions.get(runId);
|
|
332
|
+
if (!execution || execution.status === 'stopped') {
|
|
333
|
+
await this.stateManager.updateFlowRun(runId, { status: 'stopped', completedAt: new Date().toISOString() });
|
|
334
|
+
this.broadcastFlowUpdate(sessionId, { type: 'flow_run_stopped', runId, flowId: run.flowId });
|
|
335
|
+
return { runId, status: 'stopped' };
|
|
336
|
+
}
|
|
337
|
+
if (completedIds.has(node.id)) {
|
|
338
|
+
this.logger.info(`Resume: skipping already-completed node ${node.id}`);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
const nodeResult = await this.executeNode(node, context, runId, sessionId, flow);
|
|
342
|
+
context.nodeOutputs[node.id] = nodeResult;
|
|
343
|
+
if (node.data?.outputKey) context.nodeOutputs[node.data.outputKey] = nodeResult;
|
|
344
|
+
await this.updateNodeState(runId, node.id, 'completed', nodeResult);
|
|
345
|
+
try { await this.checkpointStore.saveNodeResult(runId, node.id, nodeResult); }
|
|
346
|
+
catch (err) { this.logger.warn(`Resume: checkpoint save failed for ${node.id}`, { error: err.message }); }
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const finalOutput = this.collectFinalOutput(sortedNodes, context);
|
|
350
|
+
await this.stateManager.updateFlowRun(runId, {
|
|
351
|
+
status: 'completed', output: finalOutput, completedAt: new Date().toISOString(),
|
|
352
|
+
});
|
|
353
|
+
this.broadcastFlowUpdate(sessionId, { type: 'flow_run_completed', runId, flowId: run.flowId, output: finalOutput });
|
|
354
|
+
this.activeExecutions.delete(runId);
|
|
355
|
+
return { runId, status: 'completed', output: finalOutput };
|
|
356
|
+
} catch (error) {
|
|
357
|
+
this.logger.error(`Flow resume failed: ${run.flowId}`, { runId, error: error.message });
|
|
358
|
+
await this.stateManager.updateFlowRun(runId, {
|
|
359
|
+
status: 'failed', error: error.message, completedAt: new Date().toISOString(),
|
|
360
|
+
});
|
|
361
|
+
this.broadcastFlowUpdate(sessionId, { type: 'flow_run_failed', runId, flowId: run.flowId, error: error.message });
|
|
362
|
+
this.activeExecutions.delete(runId);
|
|
363
|
+
return { runId, status: 'failed', error: error.message };
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
185
367
|
/**
|
|
186
368
|
* Stop a flow execution
|
|
187
369
|
* @param {string} runId - Run identifier
|
|
@@ -210,6 +392,21 @@ class FlowExecutor {
|
|
|
210
392
|
async ensureAgentsLoaded(nodes) {
|
|
211
393
|
if (!nodes || nodes.length === 0) return;
|
|
212
394
|
|
|
395
|
+
// First: surface ALL agent nodes that have no agentId at all (e.g.
|
|
396
|
+
// a template was loaded but the user hasn't picked agents yet).
|
|
397
|
+
// Better one clear "you haven't filled in N agents yet" than a
|
|
398
|
+
// confusing chain of partial loads followed by a "name === ''" error.
|
|
399
|
+
const unbound = nodes.filter(n =>
|
|
400
|
+
n.type === 'agent' &&
|
|
401
|
+
(typeof n.data?.agentId !== 'string' || n.data.agentId.trim().length === 0)
|
|
402
|
+
);
|
|
403
|
+
if (unbound.length > 0) {
|
|
404
|
+
const labels = unbound.map(n => n.data?.label || n.id).join(', ');
|
|
405
|
+
throw new Error(
|
|
406
|
+
`Cannot run flow: ${unbound.length} agent node(s) have no agent assigned (${labels}). Open each node and pick an agent in the properties panel.`
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
|
|
213
410
|
// Extract agent IDs from agent nodes
|
|
214
411
|
const agentNodes = nodes.filter(n => n.type === 'agent' && n.data?.agentId);
|
|
215
412
|
const agentIds = [...new Set(agentNodes.map(n => n.data.agentId))];
|
|
@@ -235,18 +432,33 @@ class FlowExecutor {
|
|
|
235
432
|
const agent = await this.stateManager.importArchivedAgent(agentId, projectDir, this.agentPool);
|
|
236
433
|
this.logger.info(`Successfully loaded agent: ${agentId}`);
|
|
237
434
|
|
|
238
|
-
// Broadcast agent-loaded event so UI sidebar updates
|
|
435
|
+
// Broadcast agent-loaded event so UI sidebar updates.
|
|
436
|
+
// Defensive: this is pure UX — it must NEVER kill the load.
|
|
437
|
+
// The WebServer instance exposes broadcastToSession(null, msg)
|
|
438
|
+
// for "broadcast to all"; some other manager shapes use
|
|
439
|
+
// broadcast(msg). Use whichever is available, swallow errors.
|
|
239
440
|
if (this.webSocketManager && agent) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
441
|
+
try {
|
|
442
|
+
const msg = {
|
|
443
|
+
type: 'agent-loaded',
|
|
444
|
+
agent: {
|
|
445
|
+
id: agent.id,
|
|
446
|
+
name: agent.name,
|
|
447
|
+
status: agent.status,
|
|
448
|
+
model: agent.currentModel || agent.preferredModel,
|
|
449
|
+
capabilities: agent.capabilities,
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
if (typeof this.webSocketManager.broadcast === 'function') {
|
|
453
|
+
this.webSocketManager.broadcast(msg);
|
|
454
|
+
} else if (typeof this.webSocketManager.broadcastToSession === 'function') {
|
|
455
|
+
this.webSocketManager.broadcastToSession(null, msg);
|
|
248
456
|
}
|
|
249
|
-
})
|
|
457
|
+
} catch (broadcastErr) {
|
|
458
|
+
this.logger.warn(`Failed to broadcast agent-loaded event (non-fatal)`, {
|
|
459
|
+
agentId, error: broadcastErr.message,
|
|
460
|
+
});
|
|
461
|
+
}
|
|
250
462
|
}
|
|
251
463
|
} catch (error) {
|
|
252
464
|
throw new Error(`Failed to load agent ${agentId}: ${error.message}. Make sure the agent exists.`);
|
|
@@ -413,13 +625,25 @@ class FlowExecutor {
|
|
|
413
625
|
return result;
|
|
414
626
|
|
|
415
627
|
} catch (error) {
|
|
416
|
-
|
|
628
|
+
// Phase 6.1: capture structured error info — kind classification
|
|
629
|
+
// (timeout / agent-error / agent-failure) + per-attempt history
|
|
630
|
+
// (from runWithRetry). Persisted on the node state so the run-
|
|
631
|
+
// detail UI can show "node-B timed out after 3 attempts" without
|
|
632
|
+
// re-parsing log files.
|
|
633
|
+
const errorInfo = {
|
|
634
|
+
kind: error?.kind || 'agent-error',
|
|
635
|
+
message: error?.message || String(error),
|
|
636
|
+
attempts: error?.attempts || null,
|
|
637
|
+
lastAt: new Date().toISOString(),
|
|
638
|
+
};
|
|
639
|
+
await this.updateNodeState(runId, node.id, 'failed', { error: error.message }, errorInfo);
|
|
417
640
|
this.broadcastFlowUpdate(sessionId, {
|
|
418
641
|
type: 'flow_node_failed',
|
|
419
642
|
runId,
|
|
420
643
|
nodeId: node.id,
|
|
421
644
|
nodeType: node.type,
|
|
422
|
-
error: error.message
|
|
645
|
+
error: error.message,
|
|
646
|
+
errorInfo,
|
|
423
647
|
});
|
|
424
648
|
throw error;
|
|
425
649
|
}
|
|
@@ -467,17 +691,38 @@ class FlowExecutor {
|
|
|
467
691
|
throw new Error(`Agent not found: ${agentId}`);
|
|
468
692
|
}
|
|
469
693
|
|
|
470
|
-
//
|
|
694
|
+
// ---- Phase 1: typed-input assembly ---------------------------------
|
|
695
|
+
// For v2 nodes (with declared inputs[]), assemble typed values from
|
|
696
|
+
// upstream outputs by following the edge field mappings. For legacy
|
|
697
|
+
// nodes (no inputs[]), this falls back to {input, previousOutput}
|
|
698
|
+
// built by concatenating upstream outputs — identical to v1 behavior.
|
|
699
|
+
const assembled = assembleNodeInputs(node, flow.edges, context.nodeOutputs);
|
|
700
|
+
|
|
701
|
+
if (!assembled.legacy && assembled.missing.length > 0) {
|
|
702
|
+
// v2 fail-fast: a required input has no upstream value. Better to
|
|
703
|
+
// bail here with a clear error than send the agent half its data.
|
|
704
|
+
throw new Error(
|
|
705
|
+
`Agent node ${node.id} (${agentId}) is missing required input(s): ${assembled.missing.join(', ')}`
|
|
706
|
+
);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// Legacy fallback also exposes inputNodeIds + previousOutput for the
|
|
710
|
+
// existing buildPreviousAgentData / context-injection code paths.
|
|
471
711
|
const inputNodeIds = this.getInputNodeIds(node.id, flow.edges);
|
|
472
|
-
const previousOutput =
|
|
712
|
+
const previousOutput = assembled.legacy
|
|
713
|
+
? assembled.values.previousOutput
|
|
714
|
+
: this.collectPreviousOutput(inputNodeIds, context.nodeOutputs);
|
|
473
715
|
|
|
474
|
-
// Apply prompt template
|
|
716
|
+
// Apply prompt template. Typed input values are exposed BY NAME so
|
|
717
|
+
// templates can write {{topic}}, {{research}}, etc. Legacy keys
|
|
718
|
+
// {{input}} / {{previousOutput}} stay available for backwards compat.
|
|
475
719
|
const template = node.data?.promptTemplate || '{{input}}';
|
|
476
720
|
const prompt = this.applyTemplate(template, {
|
|
477
721
|
input: previousOutput,
|
|
478
722
|
previousOutput,
|
|
479
723
|
...context.variables,
|
|
480
|
-
...context.nodeOutputs
|
|
724
|
+
...context.nodeOutputs,
|
|
725
|
+
...assembled.values, // typed inputs win over collisions
|
|
481
726
|
});
|
|
482
727
|
|
|
483
728
|
this.logger.info(`Sending message to agent: ${agentId}`, {
|
|
@@ -485,66 +730,252 @@ class FlowExecutor {
|
|
|
485
730
|
nodeId: node.id
|
|
486
731
|
});
|
|
487
732
|
|
|
488
|
-
//
|
|
489
|
-
const originalMode = agent.mode;
|
|
490
|
-
|
|
491
|
-
// Reset completion state from any previous run, then put in AGENT mode
|
|
492
|
-
agent.autonomousWorkComplete = false;
|
|
493
|
-
agent.lastCompletionSummary = null;
|
|
494
|
-
agent.lastCompletionDetails = null;
|
|
495
|
-
agent.mode = AGENT_MODES.AGENT;
|
|
496
|
-
await this.agentPool.persistAgentState(agentId);
|
|
497
|
-
|
|
498
|
-
// Clear conversation history for a fresh execution context
|
|
499
|
-
try {
|
|
500
|
-
await this.agentPool.clearConversation(agentId);
|
|
501
|
-
this.logger.info(`Cleared conversation for agent ${agentId} before flow execution`);
|
|
502
|
-
} catch (error) {
|
|
503
|
-
this.logger.warn(`Failed to clear conversation for agent ${agentId}`, { error: error.message });
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
// Create completion promise
|
|
507
|
-
const completionPromise = this.waitForAgentCompletion(agentId, runId);
|
|
508
|
-
|
|
509
|
-
// Build flow metadata for context injection
|
|
733
|
+
// Build flow metadata + previous-agent data ONCE — reused per retry
|
|
510
734
|
const sortedNodes = context.sortedNodes || [];
|
|
511
735
|
const nodePosition = sortedNodes.findIndex(n => n.id === node.id) + 1;
|
|
512
736
|
const flowMetadata = {
|
|
513
737
|
flowId: flow.id,
|
|
514
738
|
flowName: flow.name || 'Unnamed Flow',
|
|
739
|
+
// Phase 7: forward flow.description so system prompt can render
|
|
740
|
+
// a "FLOW GOAL" section orienting each agent to the bigger picture.
|
|
741
|
+
flowDescription: flow.description,
|
|
515
742
|
nodeName: node.data?.label || 'Agent',
|
|
516
743
|
nodePosition: nodePosition || 1,
|
|
517
744
|
totalNodes: sortedNodes.length
|
|
518
745
|
};
|
|
519
|
-
|
|
520
|
-
// Build previous agent data for context passing
|
|
521
746
|
const previousAgentData = this.buildPreviousAgentData(node, context, flow);
|
|
522
747
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
748
|
+
// v2: derive the node's typed I/O contract for system-prompt
|
|
749
|
+
// advertisement (handled downstream in agentScheduler). v1 nodes
|
|
750
|
+
// don't have inputs/outputs declared → contract is undefined and
|
|
751
|
+
// the scheduler skips the contract section.
|
|
752
|
+
// Phase 7: also forward node.data.instructions (the per-node role
|
|
753
|
+
// + success-criteria description) so the prompt can render a
|
|
754
|
+
// NODE INSTRUCTIONS section.
|
|
755
|
+
const hasTypedIO = Array.isArray(node.inputs) || Array.isArray(node.outputs);
|
|
756
|
+
const hasInstructions = typeof node.data?.instructions === 'string' && node.data.instructions.trim().length > 0;
|
|
757
|
+
const nodeContract = (hasTypedIO || hasInstructions)
|
|
758
|
+
? {
|
|
759
|
+
inputs: node.inputs || [],
|
|
760
|
+
outputs: node.outputs || [],
|
|
761
|
+
instructions: node.data?.instructions,
|
|
762
|
+
// Phase 8: opt-out flag — when true, scheduler keeps the
|
|
763
|
+
// agent's native system prompt and APPENDS flow context
|
|
764
|
+
// (legacy behavior). When false/absent, scheduler REPLACES
|
|
765
|
+
// the system prompt with a flow-worker version, eliminating
|
|
766
|
+
// identity conflicts.
|
|
767
|
+
useNativeSystemPrompt: node.data?.useNativeSystemPrompt === true,
|
|
768
|
+
}
|
|
769
|
+
: undefined;
|
|
770
|
+
|
|
771
|
+
// ---- Phase 3: per-node retry + per-node timeout -------------------
|
|
772
|
+
// The closure below is "one full agent invocation" — clear conv,
|
|
773
|
+
// queue message, wait for jobdone, validate outputs. Each retry is
|
|
774
|
+
// a brand-new invocation with the agent's conversation reset.
|
|
775
|
+
// Precedence: node.execution > flow.execution > config.flows.execution > defaults.
|
|
776
|
+
const exec = this._resolveExecutionConfig(node, flow);
|
|
777
|
+
|
|
778
|
+
// Store original mode for potential restoration on hard fail (not
|
|
779
|
+
// currently restored — same as pre-Phase 3 behavior — but useful
|
|
780
|
+
// to capture if we add cleanup).
|
|
781
|
+
const originalMode = agent.mode; // eslint-disable-line no-unused-vars
|
|
782
|
+
|
|
783
|
+
// Compute the list of missing required outputs given a job-done result.
|
|
784
|
+
// Returns [] when contract is satisfied (or no contract). Used both
|
|
785
|
+
// inside attemptOnce (to drive in-conversation re-prompts) and once
|
|
786
|
+
// more after the retry loop as a defensive belt-and-suspenders check.
|
|
787
|
+
const detectMissingOutputs = (result) => {
|
|
788
|
+
if (!nodeContract || !Array.isArray(nodeContract.outputs) || nodeContract.outputs.length === 0) return [];
|
|
789
|
+
const provided = (result?.outputs && typeof result.outputs === 'object') ? result.outputs : {};
|
|
790
|
+
const missing = [];
|
|
791
|
+
for (const decl of nodeContract.outputs) {
|
|
792
|
+
if (!decl || typeof decl.name !== 'string') continue;
|
|
793
|
+
if (!(decl.name in provided) || provided[decl.name] === null || provided[decl.name] === undefined) {
|
|
794
|
+
missing.push(decl.name);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
return missing;
|
|
798
|
+
};
|
|
528
799
|
|
|
529
|
-
//
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
800
|
+
// Build a corrective re-prompt that lists EXACTLY which fields are
|
|
801
|
+
// missing and shows the JSON shape the agent must emit on the next
|
|
802
|
+
// job-done. This is sent in the SAME conversation — the agent keeps
|
|
803
|
+
// its working memory and just patches the handoff.
|
|
804
|
+
const MAX_REPROMPTS_PER_ATTEMPT = 2;
|
|
805
|
+
const buildRepromptMessage = (missing) => {
|
|
806
|
+
// Phase 7: enrich the corrective message with each declared
|
|
807
|
+
// output's description + example so the agent has the FULL
|
|
808
|
+
// contract to satisfy on the retry, not just a list of names.
|
|
809
|
+
const required = nodeContract.outputs.map(o => {
|
|
810
|
+
const lines = [` • ${o.name}: ${o.type}`];
|
|
811
|
+
if (typeof o.description === 'string' && o.description.trim()) {
|
|
812
|
+
lines.push(` ${o.description.trim()}`);
|
|
813
|
+
}
|
|
814
|
+
if (o.example !== undefined && o.example !== null) {
|
|
815
|
+
try {
|
|
816
|
+
const ex = (typeof o.example === 'string')
|
|
817
|
+
? JSON.stringify(o.example)
|
|
818
|
+
: JSON.stringify(o.example, null, 2);
|
|
819
|
+
const oneLine = !ex.includes('\n');
|
|
820
|
+
lines.push(oneLine ? ` Example: ${ex}` : ` Example: ${ex.split('\n').join('\n ')}`);
|
|
821
|
+
} catch { /* ignore unstringifiable examples */ }
|
|
822
|
+
}
|
|
823
|
+
return lines.join('\n');
|
|
824
|
+
}).join('\n');
|
|
825
|
+
const example = nodeContract.outputs
|
|
826
|
+
.map(o => ` "${o.name}": <${o.type} value>`).join(',\n');
|
|
827
|
+
return [
|
|
828
|
+
`⚠ Your previous job-done was incomplete. The flow node declares REQUIRED OUTPUTS that must all be present in the "outputs" field of job-done.`,
|
|
829
|
+
``,
|
|
830
|
+
`Missing field(s): ${missing.join(', ')}`,
|
|
831
|
+
``,
|
|
832
|
+
`All required outputs:`,
|
|
833
|
+
required,
|
|
834
|
+
``,
|
|
835
|
+
`Please call job-done AGAIN with the complete payload. The "outputs" object must include EVERY field above. Example structure:`,
|
|
836
|
+
``,
|
|
837
|
+
`{`,
|
|
838
|
+
` "toolId": "jobdone",`,
|
|
839
|
+
` "actions": [{`,
|
|
840
|
+
` "action": "complete",`,
|
|
841
|
+
` "summary": "<your summary>",`,
|
|
842
|
+
` "outputs": {`,
|
|
843
|
+
example,
|
|
844
|
+
` }`,
|
|
845
|
+
` }]`,
|
|
846
|
+
`}`,
|
|
847
|
+
``,
|
|
848
|
+
`Use the work you've already done — do not redo the task. Just emit the structured outputs.`,
|
|
849
|
+
].join('\n');
|
|
850
|
+
};
|
|
538
851
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
852
|
+
const attemptOnce = async (attemptIndex) => {
|
|
853
|
+
// Phase 8: register the active contract so the jobdone tool can
|
|
854
|
+
// validate the agent's job-done call AT TOOL TIME — rejecting
|
|
855
|
+
// partial calls before they propagate. Cleared in the finally
|
|
856
|
+
// block of the outer try (see below) when the attempt completes
|
|
857
|
+
// (success OR failure).
|
|
858
|
+
if (nodeContract) {
|
|
859
|
+
this.activeContracts.set(agentId, nodeContract);
|
|
860
|
+
}
|
|
544
861
|
|
|
545
|
-
|
|
546
|
-
|
|
862
|
+
// Reset completion state + conversation for a clean slate every
|
|
863
|
+
// OUTER retry. In-conversation re-prompts (below) keep history.
|
|
864
|
+
agent.autonomousWorkComplete = false;
|
|
865
|
+
agent.lastCompletionSummary = null;
|
|
866
|
+
agent.lastCompletionDetails = null;
|
|
867
|
+
agent.mode = AGENT_MODES.AGENT;
|
|
868
|
+
await this.agentPool.persistAgentState(agentId);
|
|
869
|
+
try {
|
|
870
|
+
await this.agentPool.clearConversation(agentId);
|
|
871
|
+
} catch (error) {
|
|
872
|
+
this.logger.warn(`Failed to clear conversation for agent ${agentId}`, { error: error.message });
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
// Register the listener BEFORE queuing the message so a fast jobdone
|
|
876
|
+
// can resolve us immediately.
|
|
877
|
+
let completionPromise = this.waitForAgentCompletion(agentId, runId);
|
|
878
|
+
|
|
879
|
+
await this.messageProcessor.processMessage(agentId, prompt, {
|
|
880
|
+
sessionId,
|
|
881
|
+
isFlowExecution: true,
|
|
882
|
+
flowRunId: runId,
|
|
883
|
+
flowNodeId: node.id,
|
|
884
|
+
flowMetadata,
|
|
885
|
+
previousAgentData,
|
|
886
|
+
nodeContract,
|
|
887
|
+
attemptIndex,
|
|
888
|
+
});
|
|
889
|
+
|
|
890
|
+
let result = await completionPromise;
|
|
891
|
+
|
|
892
|
+
// v2 in-conversation re-prompt loop: when outputs are missing, ask
|
|
893
|
+
// the agent to fix the LAST job-done call WITHOUT clearing memory.
|
|
894
|
+
// Cheap (~1 model call vs full re-run) and almost always succeeds
|
|
895
|
+
// because the agent already produced the data — they just forgot
|
|
896
|
+
// to put it in the outputs field. After MAX_REPROMPTS, we fall
|
|
897
|
+
// through to the outer retry which DOES clear conversation.
|
|
898
|
+
let reprompts = 0;
|
|
899
|
+
while (reprompts < MAX_REPROMPTS_PER_ATTEMPT) {
|
|
900
|
+
const missing = detectMissingOutputs(result);
|
|
901
|
+
if (missing.length === 0) break;
|
|
902
|
+
|
|
903
|
+
this.logger.warn(`Flow node ${node.id}: re-prompting agent for missing outputs`, {
|
|
904
|
+
missing, reprompts, attemptIndex,
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
// Re-arm the listener BEFORE sending — the agent's response will
|
|
908
|
+
// resolve it.
|
|
909
|
+
agent.autonomousWorkComplete = false;
|
|
910
|
+
await this.agentPool.persistAgentState(agentId);
|
|
911
|
+
completionPromise = this.waitForAgentCompletion(agentId, runId);
|
|
912
|
+
|
|
913
|
+
await this.messageProcessor.processMessage(agentId, buildRepromptMessage(missing), {
|
|
914
|
+
sessionId,
|
|
915
|
+
isFlowExecution: true,
|
|
916
|
+
flowRunId: runId,
|
|
917
|
+
flowNodeId: node.id,
|
|
918
|
+
flowMetadata,
|
|
919
|
+
previousAgentData,
|
|
920
|
+
nodeContract,
|
|
921
|
+
attemptIndex,
|
|
922
|
+
isReprompt: true,
|
|
923
|
+
});
|
|
924
|
+
|
|
925
|
+
result = await completionPromise;
|
|
926
|
+
reprompts++;
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
// Final check: if still missing after re-prompts, throw a retryable
|
|
930
|
+
// error so the OUTER loop (runWithRetry) starts a fresh agent
|
|
931
|
+
// invocation with cleared conversation.
|
|
932
|
+
const stillMissing = detectMissingOutputs(result);
|
|
933
|
+
if (stillMissing.length > 0) {
|
|
934
|
+
throw new FlowRetryError(
|
|
935
|
+
`Agent ${agentId} (node ${node.id}) job-done is missing required output(s) after ${reprompts} re-prompt(s): ${stillMissing.join(', ')}. ` +
|
|
936
|
+
`Declared outputs: ${nodeContract.outputs.map(o => `${o.name}:${o.type}`).join(', ')}`,
|
|
937
|
+
'agent-error'
|
|
938
|
+
);
|
|
939
|
+
}
|
|
940
|
+
return result;
|
|
941
|
+
};
|
|
942
|
+
|
|
943
|
+
let attemptHistory = [];
|
|
944
|
+
let completionResult;
|
|
945
|
+
try {
|
|
946
|
+
const ran = await runWithRetry(attemptOnce, {
|
|
947
|
+
timeoutMs: exec.timeoutMs,
|
|
948
|
+
maxRetries: exec.maxRetries,
|
|
949
|
+
retryOn: exec.retryOn,
|
|
950
|
+
backoffBaseMs: exec.backoffBaseMs,
|
|
951
|
+
backoffMultiplier: exec.backoffMultiplier,
|
|
952
|
+
onAttempt: (meta) => {
|
|
953
|
+
this.logger.warn(`Flow node ${node.id} attempt ${meta.attempt} failed`, {
|
|
954
|
+
kind: meta.error?.kind, message: meta.error?.message, willRetry: meta.willRetry,
|
|
955
|
+
});
|
|
956
|
+
},
|
|
957
|
+
});
|
|
958
|
+
completionResult = ran.result;
|
|
959
|
+
attemptHistory = ran.attempts;
|
|
960
|
+
} catch (e) {
|
|
961
|
+
// Surface the kind on the thrown error so the caller (executeFlow)
|
|
962
|
+
// and observability can distinguish timeout vs agent-error vs
|
|
963
|
+
// explicit failure.
|
|
964
|
+
const kind = e?.kind || 'agent-error';
|
|
965
|
+
const friendly = kind === 'timeout'
|
|
966
|
+
? `Agent ${agentId} timed out (after ${exec.maxRetries + 1} attempt(s))`
|
|
967
|
+
: (e?.message || `Agent ${agentId} failed`);
|
|
968
|
+
const wrapped = new Error(friendly);
|
|
969
|
+
wrapped.kind = kind;
|
|
970
|
+
wrapped.attempts = e?.attempts;
|
|
971
|
+
// Phase 8: clear active contract on failure so the jobdone tool
|
|
972
|
+
// doesn't validate against a stale node when the agent gets used
|
|
973
|
+
// outside the flow later.
|
|
974
|
+
this.activeContracts.delete(agentId);
|
|
975
|
+
throw wrapped;
|
|
547
976
|
}
|
|
977
|
+
// Phase 8: clear active contract on success too.
|
|
978
|
+
this.activeContracts.delete(agentId);
|
|
548
979
|
|
|
549
980
|
// Get the agent's response (last assistant message)
|
|
550
981
|
const updatedAgent = await this.agentPool.getAgent(agentId);
|
|
@@ -553,17 +984,105 @@ class FlowExecutor {
|
|
|
553
984
|
// Extract files created during this agent's execution (from completion result or messages)
|
|
554
985
|
const filesCreated = completionResult.filesCreated || this.extractFilesFromCompletion(completionResult);
|
|
555
986
|
|
|
987
|
+
// v2: outputs validation already happened inside attemptOnce; this
|
|
988
|
+
// block stays only as a defensive belt-and-suspenders for the case
|
|
989
|
+
// where attemptOnce somehow returns without outputs. Same logic.
|
|
990
|
+
if (nodeContract && Array.isArray(nodeContract.outputs) && nodeContract.outputs.length > 0) {
|
|
991
|
+
const provided = (completionResult.outputs && typeof completionResult.outputs === 'object')
|
|
992
|
+
? completionResult.outputs : {};
|
|
993
|
+
const missing = [];
|
|
994
|
+
for (const decl of nodeContract.outputs) {
|
|
995
|
+
if (!decl || typeof decl.name !== 'string') continue;
|
|
996
|
+
if (!(decl.name in provided) || provided[decl.name] === null || provided[decl.name] === undefined) {
|
|
997
|
+
missing.push(decl.name);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
if (missing.length > 0) {
|
|
1001
|
+
throw new Error(
|
|
1002
|
+
`Agent ${agentId} (node ${node.id}) job-done is missing required output(s): ${missing.join(', ')}. ` +
|
|
1003
|
+
`Declared outputs: ${nodeContract.outputs.map(o => `${o.name}:${o.type}`).join(', ')}`
|
|
1004
|
+
);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
// Choose what becomes the legacy `output` field used by v1 handoff
|
|
1009
|
+
// and the prose preview in the next agent's system prompt.
|
|
1010
|
+
//
|
|
1011
|
+
// Preference order:
|
|
1012
|
+
// 1. summary + details (if both present, glue them)
|
|
1013
|
+
// 2. lastResponse (the agent's full final assistant message)
|
|
1014
|
+
// 3. summary alone
|
|
1015
|
+
// 4. ''
|
|
1016
|
+
//
|
|
1017
|
+
// Why: tiny "Done." summaries used to flow through as the next
|
|
1018
|
+
// agent's entire context — agents had nothing to work with. Falling
|
|
1019
|
+
// back to the assistant's last message gives the next agent a real
|
|
1020
|
+
// payload even when the upstream agent skipped `details`.
|
|
1021
|
+
const summary = (completionResult.summary || '').trim();
|
|
1022
|
+
const details = (completionResult.details || '').trim();
|
|
1023
|
+
let prose;
|
|
1024
|
+
if (summary && details) prose = `${summary}\n\n${details}`;
|
|
1025
|
+
else if (summary && summary.length < 40 && lastResponse) prose = lastResponse;
|
|
1026
|
+
else prose = summary || lastResponse || '';
|
|
1027
|
+
|
|
556
1028
|
return {
|
|
557
1029
|
type: 'agent',
|
|
558
1030
|
agentId,
|
|
559
1031
|
agentName: agent.name,
|
|
560
|
-
output:
|
|
1032
|
+
output: prose,
|
|
1033
|
+
// v2: structured outputs bag — keyed by declared field name. This
|
|
1034
|
+
// is what assembleNodeInputs reads when wiring the next node.
|
|
1035
|
+
outputs: completionResult.outputs,
|
|
561
1036
|
details: completionResult.details,
|
|
562
1037
|
filesCreated,
|
|
1038
|
+
// Phase 3: attempt history (one entry per try; failed entries
|
|
1039
|
+
// include { kind, message }). Surfaces in run-detail UI later.
|
|
1040
|
+
attempts: attemptHistory,
|
|
563
1041
|
success: completionResult.success !== false
|
|
564
1042
|
};
|
|
565
1043
|
}
|
|
566
1044
|
|
|
1045
|
+
/**
|
|
1046
|
+
* Resolve effective per-node execution config — timeout, retries,
|
|
1047
|
+
* backoff, retryOn classes. Precedence (highest wins):
|
|
1048
|
+
* node.execution > flow.execution > config.flows.execution > defaults
|
|
1049
|
+
*
|
|
1050
|
+
* Defaults:
|
|
1051
|
+
* timeoutMs 300000 (5min, matches pre-Phase-3 behavior; legacy
|
|
1052
|
+
* config.flows.nodeTimeout still honored as a global
|
|
1053
|
+
* timeout for back-compat)
|
|
1054
|
+
* maxRetries 1 (one fresh-conversation retry after re-prompts
|
|
1055
|
+
* exhaust — without this, structured-output
|
|
1056
|
+
* misses by some models cause flow failure
|
|
1057
|
+
* after only 2 in-conversation re-prompts).
|
|
1058
|
+
* Override per node to 0 to disable retries.
|
|
1059
|
+
* retryOn ['timeout', 'agent-error']
|
|
1060
|
+
* backoffBaseMs 1000
|
|
1061
|
+
* backoffMultiplier 2
|
|
1062
|
+
*/
|
|
1063
|
+
_resolveExecutionConfig(node, flow) {
|
|
1064
|
+
const globalCfg = this.config?.flows?.execution || {};
|
|
1065
|
+
const flowCfg = flow?.execution || {};
|
|
1066
|
+
const nodeCfg = node?.execution || {};
|
|
1067
|
+
// Legacy: config.flows.nodeTimeout was the only knob in v1. Keep
|
|
1068
|
+
// it as the default timeout if more-specific configs aren't set.
|
|
1069
|
+
const legacyTimeout = this.config?.flows?.nodeTimeout;
|
|
1070
|
+
|
|
1071
|
+
const pick = (k, fallback) =>
|
|
1072
|
+
nodeCfg[k] !== undefined ? nodeCfg[k] :
|
|
1073
|
+
flowCfg[k] !== undefined ? flowCfg[k] :
|
|
1074
|
+
globalCfg[k] !== undefined ? globalCfg[k] :
|
|
1075
|
+
fallback;
|
|
1076
|
+
|
|
1077
|
+
return {
|
|
1078
|
+
timeoutMs: pick('timeoutMs', legacyTimeout ?? 300000),
|
|
1079
|
+
maxRetries: pick('maxRetries', 1),
|
|
1080
|
+
retryOn: pick('retryOn', ['timeout', 'agent-error']),
|
|
1081
|
+
backoffBaseMs: pick('backoffBaseMs', 1000),
|
|
1082
|
+
backoffMultiplier: pick('backoffMultiplier', 2),
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
|
|
567
1086
|
/**
|
|
568
1087
|
* Build previous agent data for context passing to next agent
|
|
569
1088
|
* @param {Object} currentNode - Current agent node
|
|
@@ -575,25 +1094,52 @@ class FlowExecutor {
|
|
|
575
1094
|
// Find the previous agent node that feeds into this one
|
|
576
1095
|
const inputNodeIds = this.getInputNodeIds(currentNode.id, flow.edges);
|
|
577
1096
|
|
|
578
|
-
// Look for the most recent agent node in the inputs
|
|
1097
|
+
// Look for the most recent agent node in the inputs.
|
|
1098
|
+
// We collect ALL upstream agent contributions (not just one) so a
|
|
1099
|
+
// node fed by multiple agents gets a merged outputs bag and a
|
|
1100
|
+
// labeled list of contributors. v1 fallback: pick the first.
|
|
1101
|
+
const contributors = [];
|
|
579
1102
|
for (const inputId of inputNodeIds) {
|
|
580
1103
|
const nodeOutput = context.nodeOutputs[inputId];
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
1104
|
+
if (nodeOutput && nodeOutput.type === 'agent') contributors.push(nodeOutput);
|
|
1105
|
+
}
|
|
1106
|
+
if (contributors.length === 0) return null;
|
|
1107
|
+
|
|
1108
|
+
// Merge structured outputs from all contributors. When the same
|
|
1109
|
+
// field name appears on multiple upstream agents, the LATER one
|
|
1110
|
+
// wins (sortedNodes order in context.sortedNodes is topological).
|
|
1111
|
+
const mergedOutputs = {};
|
|
1112
|
+
for (const c of contributors) {
|
|
1113
|
+
if (c.outputs && typeof c.outputs === 'object') {
|
|
1114
|
+
Object.assign(mergedOutputs, c.outputs);
|
|
592
1115
|
}
|
|
593
1116
|
}
|
|
594
1117
|
|
|
595
|
-
//
|
|
596
|
-
|
|
1118
|
+
// Primary "previous agent" used for the legacy fields stays the
|
|
1119
|
+
// most recent contributor (last one in topo order).
|
|
1120
|
+
const primary = contributors[contributors.length - 1];
|
|
1121
|
+
|
|
1122
|
+
return {
|
|
1123
|
+
agentId: primary.agentId,
|
|
1124
|
+
agentName: primary.agentName || primary.agentId,
|
|
1125
|
+
summary: primary.output,
|
|
1126
|
+
details: primary.details,
|
|
1127
|
+
filesCreated: primary.filesCreated || [],
|
|
1128
|
+
output: primary.output,
|
|
1129
|
+
// Phase 5/6 fix: forward the structured outputs bag end-to-end.
|
|
1130
|
+
// Without this the next agent never sees the typed handoff —
|
|
1131
|
+
// only the free-text summary, defeating the whole v2 contract.
|
|
1132
|
+
outputs: Object.keys(mergedOutputs).length > 0 ? mergedOutputs : undefined,
|
|
1133
|
+
// When multiple agents fed this node, list them so the system
|
|
1134
|
+
// prompt can show "you received outputs from agents A, B".
|
|
1135
|
+
contributors: contributors.length > 1
|
|
1136
|
+
? contributors.map(c => ({
|
|
1137
|
+
agentId: c.agentId,
|
|
1138
|
+
agentName: c.agentName || c.agentId,
|
|
1139
|
+
outputs: c.outputs || null,
|
|
1140
|
+
}))
|
|
1141
|
+
: undefined,
|
|
1142
|
+
};
|
|
597
1143
|
}
|
|
598
1144
|
|
|
599
1145
|
/**
|
|
@@ -736,6 +1282,9 @@ class FlowExecutor {
|
|
|
736
1282
|
completed: true,
|
|
737
1283
|
summary: completionData.summary || '',
|
|
738
1284
|
details: completionData.details || null,
|
|
1285
|
+
// v2: structured outputs bag — forwarded through to the
|
|
1286
|
+
// executor's contract validator. v1 callers don't set this.
|
|
1287
|
+
outputs: completionData.outputs,
|
|
739
1288
|
success: completionData.success !== false
|
|
740
1289
|
});
|
|
741
1290
|
return true;
|
|
@@ -838,22 +1387,32 @@ class FlowExecutor {
|
|
|
838
1387
|
}
|
|
839
1388
|
|
|
840
1389
|
/**
|
|
841
|
-
* Update node state in the run record
|
|
842
|
-
*
|
|
843
|
-
*
|
|
844
|
-
*
|
|
845
|
-
*
|
|
1390
|
+
* Update node state in the run record.
|
|
1391
|
+
*
|
|
1392
|
+
* Phase 6.1: optional `errorInfo` captures classified failure detail
|
|
1393
|
+
* (kind, message, attempts) for run-detail diagnostics. Stored as
|
|
1394
|
+
* `nodeStates[id].error` alongside the truncated result.
|
|
1395
|
+
*
|
|
1396
|
+
* @param {string} runId
|
|
1397
|
+
* @param {string} nodeId
|
|
1398
|
+
* @param {string} status 'running' | 'completed' | 'failed'
|
|
1399
|
+
* @param {Object} result
|
|
1400
|
+
* @param {Object} [errorInfo] { kind, message, attempts, lastAt }
|
|
846
1401
|
*/
|
|
847
|
-
async updateNodeState(runId, nodeId, status, result) {
|
|
1402
|
+
async updateNodeState(runId, nodeId, status, result, errorInfo) {
|
|
848
1403
|
const run = await this.stateManager.getFlowRun(runId);
|
|
849
1404
|
if (!run) return;
|
|
850
1405
|
|
|
851
1406
|
const nodeStates = run.nodeStates || {};
|
|
852
|
-
|
|
1407
|
+
const entry = {
|
|
853
1408
|
status,
|
|
854
1409
|
result: result ? this.truncateOutput(result) : null,
|
|
855
1410
|
updatedAt: new Date().toISOString()
|
|
856
1411
|
};
|
|
1412
|
+
if (errorInfo && typeof errorInfo === 'object') {
|
|
1413
|
+
entry.error = errorInfo;
|
|
1414
|
+
}
|
|
1415
|
+
nodeStates[nodeId] = entry;
|
|
857
1416
|
|
|
858
1417
|
await this.stateManager.updateFlowRun(runId, { nodeStates });
|
|
859
1418
|
}
|
|
@@ -874,7 +1433,16 @@ class FlowExecutor {
|
|
|
874
1433
|
}
|
|
875
1434
|
|
|
876
1435
|
/**
|
|
877
|
-
* Truncate output for storage/transmission
|
|
1436
|
+
* Truncate output for storage/transmission.
|
|
1437
|
+
*
|
|
1438
|
+
* Special-case: when the output is an agent completion result with a
|
|
1439
|
+
* structured `outputs` field, preserve the `outputs` object verbatim.
|
|
1440
|
+
* Those are the typed contract values that downstream nodes consume —
|
|
1441
|
+
* truncating them silently breaks edge field-mapping (`writer.bullets
|
|
1442
|
+
* → critic.bullets` would deliver a string-truncation marker instead
|
|
1443
|
+
* of the real list). Long prose lives in `output` / `summary` /
|
|
1444
|
+
* `details`; those get the legacy string truncation.
|
|
1445
|
+
*
|
|
878
1446
|
* @param {Object} output - Output to truncate
|
|
879
1447
|
* @returns {Object} Truncated output
|
|
880
1448
|
*/
|
|
@@ -882,7 +1450,21 @@ class FlowExecutor {
|
|
|
882
1450
|
if (typeof output === 'string' && output.length > 1000) {
|
|
883
1451
|
return output.substring(0, 1000) + '... (truncated)';
|
|
884
1452
|
}
|
|
885
|
-
if (typeof output === 'object') {
|
|
1453
|
+
if (output && typeof output === 'object') {
|
|
1454
|
+
// Agent-completion shape: preserve structured `outputs`, truncate
|
|
1455
|
+
// only the long prose fields. Keeps the run dump useful for
|
|
1456
|
+
// post-mortem inspection AND keeps downstream edges working.
|
|
1457
|
+
const hasStructuredOutputs = output.outputs && typeof output.outputs === 'object';
|
|
1458
|
+
if (hasStructuredOutputs) {
|
|
1459
|
+
const trunc = { ...output };
|
|
1460
|
+
for (const k of ['output', 'summary', 'details']) {
|
|
1461
|
+
if (typeof trunc[k] === 'string' && trunc[k].length > 1000) {
|
|
1462
|
+
trunc[k] = trunc[k].substring(0, 1000) + '... (truncated)';
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
// outputs object preserved as-is; it's structured contract data.
|
|
1466
|
+
return trunc;
|
|
1467
|
+
}
|
|
886
1468
|
const str = JSON.stringify(output);
|
|
887
1469
|
if (str.length > 1000) {
|
|
888
1470
|
return { truncated: true, preview: str.substring(0, 1000) };
|