onbuzz 4.0.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/core/__tests__/agentPool.test.js +60 -0
- package/src/core/__tests__/messageProcessor.sourceHeader.test.js +195 -0
- package/src/core/agentPool.js +24 -0
- package/src/core/agentScheduler.js +20 -9
- package/src/core/messageProcessor.js +17 -0
- package/src/core/orchestrator.js +6 -2
- package/src/interfaces/webServer.js +26 -0
- package/src/services/__tests__/messageSource.channelFilter.coherence.test.js +101 -0
- package/src/services/__tests__/messageSource.test.js +376 -0
- package/src/services/discordService.js +11 -2
- package/src/services/messageSource.js +318 -0
- package/src/services/telegramService.js +7 -1
- package/src/services/visualEditorServer.js +35 -7
- package/src/tools/__tests__/visualEditorTool.broadcast.test.js +41 -11
- package/src/tools/__tests__/visualEditorTool.context.test.js +141 -0
- package/src/tools/baseTool.js +14 -1
- package/src/tools/taskManagerTool.js +10 -0
- package/src/tools/visualEditorTool.js +114 -25
- package/src/utilities/tagParser.js +22 -3
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-alYWzgyM.js +1 -0
- package/web-ui/build/static/abap-MNX4MGQu.js +1 -0
- package/web-ui/build/static/abnf-PB6umZUe.js +1 -0
- package/web-ui/build/static/abnf-lLelqyRq.js +1 -0
- package/web-ui/build/static/accesslog-ECfnNf6M.js +1 -0
- package/web-ui/build/static/actionscript-48Mv-P2G.js +1 -0
- package/web-ui/build/static/actionscript-CmFMkWAF.js +1 -0
- package/web-ui/build/static/ada-D0nj2830.js +1 -0
- package/web-ui/build/static/ada-DC68kRrL.js +1 -0
- package/web-ui/build/static/agda-CjnuTEYG.js +1 -0
- package/web-ui/build/static/al-DICLGfy9.js +1 -0
- package/web-ui/build/static/angelscript-D7H0wknj.js +1 -0
- package/web-ui/build/static/antlr4-C_KsZIwI.js +1 -0
- package/web-ui/build/static/apache-Cfj2o0TW.js +1 -0
- package/web-ui/build/static/apacheconf-D5jQXqP_.js +1 -0
- package/web-ui/build/static/apex-G2rOb7vm.js +1 -0
- package/web-ui/build/static/apl-CE_aKOLQ.js +1 -0
- package/web-ui/build/static/applescript-BffXi9IZ.js +1 -0
- package/web-ui/build/static/applescript-CshVa-pZ.js +1 -0
- package/web-ui/build/static/aql-F9xr2xIN.js +1 -0
- package/web-ui/build/static/arcade-29Re4fPy.js +1 -0
- package/web-ui/build/static/arduino-BGsZiYrf.js +1 -0
- package/web-ui/build/static/arduino-HiqNS--s.js +1 -0
- package/web-ui/build/static/arff-jPcJv_eJ.js +1 -0
- package/web-ui/build/static/armasm-DDockn0p.js +1 -0
- package/web-ui/build/static/asciidoc-BW3nh79M.js +1 -0
- package/web-ui/build/static/asciidoc-Dxit6U7t.js +1 -0
- package/web-ui/build/static/asm6502-eTpxnsNy.js +1 -0
- package/web-ui/build/static/asmatmel-BHeErmNQ.js +1 -0
- package/web-ui/build/static/aspectj-CX6x53Aw.js +1 -0
- package/web-ui/build/static/aspnet-BFDGvlyU.js +1 -0
- package/web-ui/build/static/autohotkey-CRNZnW-g.js +1 -0
- package/web-ui/build/static/autohotkey-DhdXEUbC.js +1 -0
- package/web-ui/build/static/autoit-BrCU_LoC.js +1 -0
- package/web-ui/build/static/autoit-CNY5ZLoO.js +1 -0
- package/web-ui/build/static/avisynth-CvpX-vR-.js +1 -0
- package/web-ui/build/static/avrasm-Ch0VgbnW.js +1 -0
- package/web-ui/build/static/avro-idl-DVNgaXeA.js +1 -0
- package/web-ui/build/static/awk-DBbMErBm.js +1 -0
- package/web-ui/build/static/axapta-BZMCBJyd.js +1 -0
- package/web-ui/build/static/bash-B7W9_l_H.js +1 -0
- package/web-ui/build/static/bash-nUxPXV93.js +1 -0
- package/web-ui/build/static/basic-CncKWTdb.js +1 -0
- package/web-ui/build/static/basic-t050Yfrj.js +1 -0
- package/web-ui/build/static/batch-DzppEDD6.js +1 -0
- package/web-ui/build/static/bbcode-Cxa6xUCC.js +1 -0
- package/web-ui/build/static/bicep-CNfRbyLD.js +1 -0
- package/web-ui/build/static/birb-BQn3C4qH.js +1 -0
- package/web-ui/build/static/bison-CG1ITN82.js +1 -0
- package/web-ui/build/static/bnf-BH6EqVfg.js +1 -0
- package/web-ui/build/static/bnf-DOOI4ziA.js +1 -0
- package/web-ui/build/static/brainfuck-CuvanNT4.js +1 -0
- package/web-ui/build/static/brainfuck-DEN53aXA.js +1 -0
- package/web-ui/build/static/brightscript-C_qPLhPu.js +1 -0
- package/web-ui/build/static/bro-DE4fdxVn.js +1 -0
- package/web-ui/build/static/bsl-DhilRMN1.js +1 -0
- package/web-ui/build/static/c-DJMkv9RR.js +1 -0
- package/web-ui/build/static/c-HH0eyrSO.js +1 -0
- package/web-ui/build/static/c-like-CievvBLp.js +1 -0
- package/web-ui/build/static/cal-BBz3_HT0.js +1 -0
- package/web-ui/build/static/capnproto-BOgD9Wf3.js +1 -0
- package/web-ui/build/static/ceylon-MWYZBIMt.js +1 -0
- package/web-ui/build/static/cfscript-BiVuxt5i.js +1 -0
- package/web-ui/build/static/chaiscript-CPx7l6f-.js +1 -0
- package/web-ui/build/static/cil-3DGkdNym.js +1 -0
- package/web-ui/build/static/clean-Bxi-hwbJ.js +1 -0
- package/web-ui/build/static/clojure-BBMLjTS9.js +1 -0
- package/web-ui/build/static/clojure-RPrwnP3x.js +1 -0
- package/web-ui/build/static/clojure-repl-BE9VGIhP.js +1 -0
- package/web-ui/build/static/cmake-BMeSZbTq.js +1 -0
- package/web-ui/build/static/cmake-CLVNptnB.js +1 -0
- package/web-ui/build/static/cobol-f-w6Mj2H.js +1 -0
- package/web-ui/build/static/coffeescript-CESbl4tN.js +1 -0
- package/web-ui/build/static/coffeescript-DmOzsrDS.js +1 -0
- package/web-ui/build/static/concurnas-DxQ9U571.js +1 -0
- package/web-ui/build/static/coq-4Wu7fuDB.js +1 -0
- package/web-ui/build/static/coq-BERQ-1c4.js +1 -0
- package/web-ui/build/static/cos-SsvxAn6O.js +1 -0
- package/web-ui/build/static/cpp-BkY4KhJS.js +1 -0
- package/web-ui/build/static/cpp-CGkeKbAD.js +1 -0
- package/web-ui/build/static/crmsh-BL32bNK1.js +1 -0
- package/web-ui/build/static/crystal-C4e562-w.js +1 -0
- package/web-ui/build/static/crystal-Hu8WDm2E.js +1 -0
- package/web-ui/build/static/csharp-DvnJhHBw.js +1 -0
- package/web-ui/build/static/csharp-DxFH-E_J.js +1 -0
- package/web-ui/build/static/cshtml-BkimeLw1.js +1 -0
- package/web-ui/build/static/csp-CDNmbLWI.js +1 -0
- package/web-ui/build/static/csp-DXmobqdr.js +1 -0
- package/web-ui/build/static/css-VRUoX-cu.js +1 -0
- package/web-ui/build/static/css-extras-Dcz-5Gz_.js +1 -0
- package/web-ui/build/static/csv-Cy-vj0dX.js +1 -0
- package/web-ui/build/static/cypher-CyiGMZEd.js +1 -0
- package/web-ui/build/static/d-50yhKzqs.js +1 -0
- package/web-ui/build/static/d-CtQcHe9N.js +1 -0
- package/web-ui/build/static/dart-Dj05IVm2.js +1 -0
- package/web-ui/build/static/dart-kumEUEig.js +1 -0
- package/web-ui/build/static/dataweave-CyaTPvHl.js +1 -0
- package/web-ui/build/static/dax-BYZEUwTe.js +1 -0
- package/web-ui/build/static/delphi-Hrkf0_Zm.js +1 -0
- package/web-ui/build/static/dhall-ZfXZcVvQ.js +1 -0
- package/web-ui/build/static/diff-B681Qorw.js +1 -0
- package/web-ui/build/static/diff-C85U1vU3.js +1 -0
- package/web-ui/build/static/django-BbqkMAd3.js +1 -0
- package/web-ui/build/static/django-ebEm7IW1.js +1 -0
- package/web-ui/build/static/dns-CIKOn0cx.js +1 -0
- package/web-ui/build/static/dns-zone-file-Cgfj303q.js +1 -0
- package/web-ui/build/static/docker-DezZesK-.js +1 -0
- package/web-ui/build/static/dockerfile-HOIJDSPT.js +1 -0
- package/web-ui/build/static/dos-Bv0IPgh2.js +1 -0
- package/web-ui/build/static/dot-BiJIuPYL.js +1 -0
- package/web-ui/build/static/dsconfig-DCPRv9km.js +1 -0
- package/web-ui/build/static/dts-CXMbX7gl.js +1 -0
- package/web-ui/build/static/dust-Mjmn5ftw.js +1 -0
- package/web-ui/build/static/ebnf-469W3R_o.js +1 -0
- package/web-ui/build/static/ebnf-Bs6Ftm9u.js +1 -0
- package/web-ui/build/static/editorconfig-C4dD8cK_.js +1 -0
- package/web-ui/build/static/eiffel-D78uHdvn.js +1 -0
- package/web-ui/build/static/ejs-CUydrtqr.js +1 -0
- package/web-ui/build/static/elixir-BIxlPrSO.js +1 -0
- package/web-ui/build/static/elixir-CLS7rDXm.js +1 -0
- package/web-ui/build/static/elm-CdXXWPN7.js +1 -0
- package/web-ui/build/static/elm-DT7wSSPo.js +1 -0
- package/web-ui/build/static/erb-8Xeo3WFF.js +1 -0
- package/web-ui/build/static/erb-DROzrB_O.js +1 -0
- package/web-ui/build/static/erlang-DbMlkDTN.js +1 -0
- package/web-ui/build/static/erlang-DoF730hs.js +1 -0
- package/web-ui/build/static/erlang-repl-B7enXvga.js +1 -0
- package/web-ui/build/static/etlua-CehWhSD3.js +1 -0
- package/web-ui/build/static/excel-DHmOIegb.js +1 -0
- package/web-ui/build/static/excel-formula-DdeWF1_w.js +1 -0
- package/web-ui/build/static/factor-DBMZ3xT3.js +1 -0
- package/web-ui/build/static/false-AxZ_vqH0.js +1 -0
- package/web-ui/build/static/firestore-security-rules-BChGByFG.js +1 -0
- package/web-ui/build/static/fix-Cc-mOcI9.js +1 -0
- package/web-ui/build/static/flix-CBpO-hKP.js +1 -0
- package/web-ui/build/static/flow-FI5Ahl__.js +1 -0
- package/web-ui/build/static/fortran-C-jW3mxU.js +1 -0
- package/web-ui/build/static/fortran-zFBKdQax.js +1 -0
- package/web-ui/build/static/fsharp-Qu8P7ZfJ.js +1 -0
- package/web-ui/build/static/fsharp-gJT07_u6.js +1 -0
- package/web-ui/build/static/ftl-DcmD2jIl.js +1 -0
- package/web-ui/build/static/gams-BAhsVwik.js +1 -0
- package/web-ui/build/static/gap-DtjJMac5.js +1 -0
- package/web-ui/build/static/gauss-DLNJrvWH.js +1 -0
- package/web-ui/build/static/gcode-CbChIRHG.js +1 -0
- package/web-ui/build/static/gcode-lgPukEuS.js +1 -0
- package/web-ui/build/static/gdscript-ChdqKkXx.js +1 -0
- package/web-ui/build/static/gedcom-B3RAxWnR.js +1 -0
- package/web-ui/build/static/gherkin-BwKe4UMd.js +1 -0
- package/web-ui/build/static/gherkin-D1Q4xoY6.js +1 -0
- package/web-ui/build/static/git-CwA8K3Cg.js +1 -0
- package/web-ui/build/static/glsl-B_AtY5k6.js +1 -0
- package/web-ui/build/static/glsl-BgXyZa9x.js +1 -0
- package/web-ui/build/static/gml-O2ebFipB.js +1 -0
- package/web-ui/build/static/gml-xLusiP_j.js +1 -0
- package/web-ui/build/static/gn-T-uGKQLr.js +1 -0
- package/web-ui/build/static/go-B9spniuU.js +1 -0
- package/web-ui/build/static/go-DTwlbvuB.js +1 -0
- package/web-ui/build/static/go-module-DWCbGNjZ.js +1 -0
- package/web-ui/build/static/golo-Dp3ZC9Ry.js +1 -0
- package/web-ui/build/static/gradle-DxnYLs2J.js +1 -0
- package/web-ui/build/static/graphql-8stFQb3o.js +1 -0
- package/web-ui/build/static/groovy-Dbpy85Rs.js +1 -0
- package/web-ui/build/static/groovy-zimUQS73.js +1 -0
- package/web-ui/build/static/haml-B5gJAH_w.js +1 -0
- package/web-ui/build/static/haml-CXW3L0QY.js +1 -0
- package/web-ui/build/static/handlebars-BW92WxdN.js +1 -0
- package/web-ui/build/static/handlebars-DNysemQE.js +1 -0
- package/web-ui/build/static/haskell-BCP5M1h6.js +1 -0
- package/web-ui/build/static/haskell-BvSwVdJS.js +1 -0
- package/web-ui/build/static/haxe-BBVHLa1y.js +1 -0
- package/web-ui/build/static/haxe-DHK7XQB_.js +1 -0
- package/web-ui/build/static/hcl-CW0_ZJVS.js +1 -0
- package/web-ui/build/static/hlsl-DAH7B5KM.js +1 -0
- package/web-ui/build/static/hoon-CXY0i4p4.js +1 -0
- package/web-ui/build/static/hpkp-RL8DG2Fy.js +1 -0
- package/web-ui/build/static/hsp-DMAT8yb3.js +1 -0
- package/web-ui/build/static/hsts-SOCNnT21.js +1 -0
- package/web-ui/build/static/htmlbars-Bsrm5Qs8.js +1 -0
- package/web-ui/build/static/http-CYjIQwPj.js +1 -0
- package/web-ui/build/static/http-Hu8W9pON.js +1 -0
- package/web-ui/build/static/hy-CDbyyAxf.js +1 -0
- package/web-ui/build/static/ichigojam-CpPBjr7T.js +1 -0
- package/web-ui/build/static/icon-UI22EXz2.js +1 -0
- package/web-ui/build/static/icu-message-format-DAU066Wq.js +1 -0
- package/web-ui/build/static/idris-BuMEL37s.js +1 -0
- package/web-ui/build/static/iecst-CEqwKb_G.js +1 -0
- package/web-ui/build/static/ignore-CcCxTW7I.js +1 -0
- package/web-ui/build/static/index-C9Fa_kgD.css +1 -0
- package/web-ui/build/static/index-DexoK8pu.js +834 -0
- package/web-ui/build/static/index-DgeaGxMy.js +13 -0
- package/web-ui/build/static/index-RM91zq9j.js +1 -0
- package/web-ui/build/static/inform7-BdnukB1N.js +1 -0
- package/web-ui/build/static/inform7-Chkw-Df3.js +1 -0
- package/web-ui/build/static/ini--KUo0NJD.js +1 -0
- package/web-ui/build/static/ini-eo_rWFNv.js +1 -0
- package/web-ui/build/static/io-CWDVYxeI.js +1 -0
- package/web-ui/build/static/irpf90-CWFfmPjK.js +1 -0
- package/web-ui/build/static/isbl-BNkdk_dr.js +1 -0
- package/web-ui/build/static/j-Bg02P4UL.js +1 -0
- package/web-ui/build/static/java-BIDWcDHj.js +1 -0
- package/web-ui/build/static/java-D4bhM1sC.js +1 -0
- package/web-ui/build/static/javadoc-DxxfkSj4.js +1 -0
- package/web-ui/build/static/javadoclike-C3v2LXMS.js +1 -0
- package/web-ui/build/static/javascript-CSu6Pvd7.js +1 -0
- package/web-ui/build/static/javastacktrace-C50AqeNg.js +1 -0
- package/web-ui/build/static/jboss-cli-D4aAEeAL.js +1 -0
- package/web-ui/build/static/jexl-F8wyoUqO.js +1 -0
- package/web-ui/build/static/jolie-CdEDMXNQ.js +1 -0
- package/web-ui/build/static/jq-D95l3yQ0.js +1 -0
- package/web-ui/build/static/js-extras-55OlT8yf.js +1 -0
- package/web-ui/build/static/js-templates-4m7AkoaU.js +1 -0
- package/web-ui/build/static/jsdoc-BC6Ab1D0.js +1 -0
- package/web-ui/build/static/json-BHS2wD8g.js +1 -0
- package/web-ui/build/static/json-CPEJ9diH.js +1 -0
- package/web-ui/build/static/json5-EDQFzkuf.js +1 -0
- package/web-ui/build/static/jsonp-Cn_lpjaf.js +1 -0
- package/web-ui/build/static/jsstacktrace-pqdhqbKV.js +1 -0
- package/web-ui/build/static/jsx-Cop--oM_.js +1 -0
- package/web-ui/build/static/julia-B728rR99.js +1 -0
- package/web-ui/build/static/julia-Cq6vOawm.js +1 -0
- package/web-ui/build/static/julia-repl-BfOfjY_7.js +1 -0
- package/web-ui/build/static/keepalived-6ZwoBjFL.js +1 -0
- package/web-ui/build/static/keyman-DmOLCkH_.js +1 -0
- package/web-ui/build/static/kotlin-Bt385M6s.js +1 -0
- package/web-ui/build/static/kotlin-DsTE9me6.js +1 -0
- package/web-ui/build/static/kumir-DGpgb_2O.js +1 -0
- package/web-ui/build/static/kusto-Bb1U0J5m.js +1 -0
- package/web-ui/build/static/lasso-B4Rh4fa1.js +1 -0
- package/web-ui/build/static/latex-BlKwUVQO.js +1 -0
- package/web-ui/build/static/latex-D4EkT2Sx.js +1 -0
- package/web-ui/build/static/latte-8APUTRqH.js +1 -0
- package/web-ui/build/static/ldif-C1AH3r9Q.js +1 -0
- package/web-ui/build/static/leaf-DgHqqnCU.js +1 -0
- package/web-ui/build/static/less-BmLC9UX9.js +1 -0
- package/web-ui/build/static/less-D7wanA1u.js +1 -0
- package/web-ui/build/static/lilypond-CPpwdP3M.js +1 -0
- package/web-ui/build/static/liquid-C9g89s0-.js +1 -0
- package/web-ui/build/static/lisp-Ck1UA6zq.js +1 -0
- package/web-ui/build/static/lisp-tlR-SVFU.js +1 -0
- package/web-ui/build/static/livecodeserver-CfcVUDKK.js +1 -0
- package/web-ui/build/static/livescript-BPfp_PIe.js +1 -0
- package/web-ui/build/static/livescript-BVClM17E.js +1 -0
- package/web-ui/build/static/llvm-1CmNV1WZ.js +1 -0
- package/web-ui/build/static/llvm-DzaT3xf4.js +1 -0
- package/web-ui/build/static/log-x35sd55_.js +1 -0
- package/web-ui/build/static/lolcode-DfGz4a2C.js +1 -0
- package/web-ui/build/static/lsl-BJ13xzsn.js +1 -0
- package/web-ui/build/static/lua-DHTiU4iK.js +1 -0
- package/web-ui/build/static/lua-DttbbyOa.js +1 -0
- package/web-ui/build/static/magma-CM6u6Urv.js +1 -0
- package/web-ui/build/static/makefile--_TmwP5m.js +1 -0
- package/web-ui/build/static/makefile-DoB_xjMl.js +1 -0
- package/web-ui/build/static/markdown-BnyhT66e.js +1 -0
- package/web-ui/build/static/markdown-DvTREwgd.js +1 -0
- package/web-ui/build/static/markup-templating-yOvzgP3Z.js +1 -0
- package/web-ui/build/static/mathematica-BtY5tmVE.js +1 -0
- package/web-ui/build/static/matlab-DK98sDbn.js +1 -0
- package/web-ui/build/static/matlab-sBcSHRlC.js +1 -0
- package/web-ui/build/static/maxima-DMUOymL4.js +1 -0
- package/web-ui/build/static/maxscript-DaIC7eX6.js +1 -0
- package/web-ui/build/static/mel-BuONpgVc.js +1 -0
- package/web-ui/build/static/mel-Ckh0frDB.js +1 -0
- package/web-ui/build/static/mercury-CDFt4KAe.js +1 -0
- package/web-ui/build/static/mermaid-BqSA7Pr5.js +1 -0
- package/web-ui/build/static/mipsasm-Dj6mne2g.js +1 -0
- package/web-ui/build/static/mizar-CIQIQU-V.js +1 -0
- package/web-ui/build/static/mizar-CLTLHCGu.js +1 -0
- package/web-ui/build/static/mojolicious-DxjS7wDV.js +1 -0
- package/web-ui/build/static/mongodb-BAEipI91.js +1 -0
- package/web-ui/build/static/monkey-BBGnwc6s.js +1 -0
- package/web-ui/build/static/monkey-CvxTCuiS.js +1 -0
- package/web-ui/build/static/moonscript-CqDVk1K9.js +1 -0
- package/web-ui/build/static/moonscript-DJyxvZQc.js +1 -0
- package/web-ui/build/static/n1ql-AFWwB4Xn.js +1 -0
- package/web-ui/build/static/n1ql-VuVk9_MG.js +1 -0
- package/web-ui/build/static/n4js-BH6hpdgG.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-kVewh9V1.js +1 -0
- package/web-ui/build/static/naniscript-B_oQ4TiW.js +1 -0
- package/web-ui/build/static/nasm-B1_bJvcz.js +1 -0
- package/web-ui/build/static/neon-CbXfhQIm.js +1 -0
- package/web-ui/build/static/nevod-5Fv5cPWk.js +1 -0
- package/web-ui/build/static/nginx-BfifkBy-.js +1 -0
- package/web-ui/build/static/nginx-D9toNO0V.js +1 -0
- package/web-ui/build/static/nim-BFN2inD1.js +1 -0
- package/web-ui/build/static/nim-do_UhCvy.js +1 -0
- package/web-ui/build/static/nix-D6RLwwOZ.js +1 -0
- package/web-ui/build/static/nix-djoKaPeE.js +1 -0
- package/web-ui/build/static/node-repl-DDbffQSR.js +1 -0
- package/web-ui/build/static/nsis-BiO6b68i.js +1 -0
- package/web-ui/build/static/nsis-CHzeu7js.js +1 -0
- package/web-ui/build/static/objectivec-B7vXzYuT.js +1 -0
- package/web-ui/build/static/objectivec-BLn212SY.js +1 -0
- package/web-ui/build/static/ocaml-BvpR0Yig.js +1 -0
- package/web-ui/build/static/ocaml-DWZF00Ti.js +1 -0
- package/web-ui/build/static/opencl-C2K2Ctu5.js +1 -0
- package/web-ui/build/static/openqasm-Cbtnnn3m.js +1 -0
- package/web-ui/build/static/openscad-CEPC0-yW.js +1 -0
- package/web-ui/build/static/oxygene-KfcdTXi0.js +1 -0
- package/web-ui/build/static/oz-B-azwNjQ.js +1 -0
- package/web-ui/build/static/parigp-IWtYGphS.js +1 -0
- package/web-ui/build/static/parser-CUCdnJ6l.js +1 -0
- package/web-ui/build/static/parser3--a7jm4Uq.js +1 -0
- package/web-ui/build/static/pascal-BbezKExl.js +1 -0
- package/web-ui/build/static/pascaligo-Bd8IN8hq.js +1 -0
- package/web-ui/build/static/pcaxis-CfT0dd7B.js +1 -0
- package/web-ui/build/static/peoplecode-Dq29i2LW.js +1 -0
- package/web-ui/build/static/perl-BZLc5sMP.js +1 -0
- package/web-ui/build/static/perl-JJmLLJne.js +1 -0
- package/web-ui/build/static/pf-seOENy0q.js +1 -0
- package/web-ui/build/static/pgsql-BtkzXwKY.js +1 -0
- package/web-ui/build/static/php-8b9a1w98.js +1 -0
- package/web-ui/build/static/php-extras-5D00a1Fm.js +1 -0
- package/web-ui/build/static/php-imFv4WXA.js +1 -0
- package/web-ui/build/static/php-template-CI-0RdMu.js +1 -0
- package/web-ui/build/static/phpdoc-DdcPBfc-.js +1 -0
- package/web-ui/build/static/plaintext-Ca1WAvT6.js +1 -0
- package/web-ui/build/static/plsql-CZV7QAnN.js +1 -0
- package/web-ui/build/static/pony-DiomUkGt.js +1 -0
- package/web-ui/build/static/powerquery-CKXX2_O_.js +1 -0
- package/web-ui/build/static/powershell-2Ctsosr0.js +1 -0
- package/web-ui/build/static/powershell-DVPkgaB6.js +1 -0
- package/web-ui/build/static/processing-BAuxATGX.js +1 -0
- package/web-ui/build/static/processing-DBzyjRsf.js +1 -0
- package/web-ui/build/static/profile-Cq2gkRUb.js +1 -0
- package/web-ui/build/static/prolog-ByKO_5p_.js +1 -0
- package/web-ui/build/static/prolog-CDCLze6j.js +1 -0
- package/web-ui/build/static/promql-BYOPu10L.js +1 -0
- package/web-ui/build/static/properties-kP8T8mqV.js +1 -0
- package/web-ui/build/static/properties-zdANIr61.js +1 -0
- package/web-ui/build/static/protobuf-DhAYlNOg.js +1 -0
- package/web-ui/build/static/protobuf-a1lLQN1f.js +1 -0
- package/web-ui/build/static/psl-DpP1u6wu.js +1 -0
- package/web-ui/build/static/pug-BobY0hsa.js +1 -0
- package/web-ui/build/static/puppet-CDimLnep.js +1 -0
- package/web-ui/build/static/puppet-D7DLS3gG.js +1 -0
- package/web-ui/build/static/pure-4QGsilHw.js +1 -0
- package/web-ui/build/static/purebasic-D0wI4z6w.js +1 -0
- package/web-ui/build/static/purebasic-Du_RxI7h.js +1 -0
- package/web-ui/build/static/purescript-CM92Fn9c.js +1 -0
- package/web-ui/build/static/python-Bvcn81x2.js +1 -0
- package/web-ui/build/static/python-CkfwrdRF.js +1 -0
- package/web-ui/build/static/python-repl-C48-EfyF.js +1 -0
- package/web-ui/build/static/q-B2-zP3za.js +1 -0
- package/web-ui/build/static/q-KuKa9s_e.js +1 -0
- package/web-ui/build/static/qml-D8j38-Sx.js +1 -0
- package/web-ui/build/static/qml-DTP6fbZN.js +1 -0
- package/web-ui/build/static/qore-DY-n97IK.js +1 -0
- package/web-ui/build/static/qsharp-Mn8hUKww.js +1 -0
- package/web-ui/build/static/r-BBPYkuMA.js +1 -0
- package/web-ui/build/static/r-CheuVCRq.js +1 -0
- package/web-ui/build/static/racket-2UxWXIqI.js +1 -0
- package/web-ui/build/static/reason-CudKWaht.js +1 -0
- package/web-ui/build/static/reasonml-BDZgwPxq.js +1 -0
- package/web-ui/build/static/regex-DpKrn61Z.js +1 -0
- package/web-ui/build/static/rego-CS2iMzor.js +1 -0
- package/web-ui/build/static/renpy-0CbyBFae.js +1 -0
- package/web-ui/build/static/rest-Ckpz2bGS.js +1 -0
- package/web-ui/build/static/rib-g77eioCq.js +1 -0
- package/web-ui/build/static/rip-L-KlpyJn.js +1 -0
- package/web-ui/build/static/roboconf-BkNeb0Yn.js +1 -0
- package/web-ui/build/static/roboconf-CE-yfGxs.js +1 -0
- package/web-ui/build/static/robotframework-ZhLv32cH.js +1 -0
- package/web-ui/build/static/routeros-C_1I4hFK.js +1 -0
- package/web-ui/build/static/rsl-CxEYmrJa.js +1 -0
- package/web-ui/build/static/ruby-Cgxmv3hM.js +1 -0
- package/web-ui/build/static/ruby-Cs4qnUzE.js +1 -0
- package/web-ui/build/static/ruleslanguage-DPK5B1Dg.js +1 -0
- package/web-ui/build/static/rust-BbVN6hMu.js +1 -0
- package/web-ui/build/static/rust-C6MrX2UK.js +1 -0
- package/web-ui/build/static/sas-CGov9per.js +1 -0
- package/web-ui/build/static/sas-Cp88q4DD.js +1 -0
- package/web-ui/build/static/sass-COOJqQer.js +1 -0
- package/web-ui/build/static/scala-BvOmMtdv.js +1 -0
- package/web-ui/build/static/scala-D5gnz3xs.js +1 -0
- package/web-ui/build/static/scheme-CNBfxsvv.js +1 -0
- package/web-ui/build/static/scheme-DiKuURfA.js +1 -0
- package/web-ui/build/static/scilab-vGKouaTh.js +1 -0
- package/web-ui/build/static/scss-B4PKgroe.js +1 -0
- package/web-ui/build/static/scss-BvRxfJ1U.js +1 -0
- package/web-ui/build/static/shell-B5TooOs0.js +1 -0
- package/web-ui/build/static/shell-session-TNT_ahRW.js +1 -0
- package/web-ui/build/static/smali-CiIXEKzG.js +1 -0
- package/web-ui/build/static/smali-EGdSXgM9.js +1 -0
- package/web-ui/build/static/smalltalk-DVAXFBVS.js +1 -0
- package/web-ui/build/static/smalltalk-Dfy8hlRv.js +1 -0
- package/web-ui/build/static/smarty-Rc2y-rm6.js +1 -0
- package/web-ui/build/static/sml-BoYe_d8x.js +1 -0
- package/web-ui/build/static/sml-CaIv1GsI.js +1 -0
- package/web-ui/build/static/solidity-Dem-6tsD.js +1 -0
- package/web-ui/build/static/solution-file-DfDjJASp.js +1 -0
- package/web-ui/build/static/soy-CkrJH5eW.js +1 -0
- package/web-ui/build/static/sparql-Dvg1P5oN.js +1 -0
- package/web-ui/build/static/splunk-spl-rB2pJQdl.js +1 -0
- package/web-ui/build/static/sqf-Cj_KV-kC.js +1 -0
- package/web-ui/build/static/sqf-DA_tj5Fb.js +1 -0
- package/web-ui/build/static/sql-CYDE0gzH.js +1 -0
- package/web-ui/build/static/sql-D8byAq-B.js +1 -0
- package/web-ui/build/static/sql_more-bMORpicj.js +1 -0
- package/web-ui/build/static/squirrel-rgwbGN0q.js +1 -0
- package/web-ui/build/static/stan-C-OYiHTu.js +1 -0
- package/web-ui/build/static/stan-CT8cMsn7.js +1 -0
- package/web-ui/build/static/stata-BJwZeN-z.js +1 -0
- package/web-ui/build/static/step21-WP26kxkW.js +1 -0
- package/web-ui/build/static/stylus-Cw9up-Iv.js +1 -0
- package/web-ui/build/static/stylus-CyFEQpH2.js +1 -0
- package/web-ui/build/static/subunit-B2XhtaLx.js +1 -0
- package/web-ui/build/static/swift-Bpyyuvtg.js +1 -0
- package/web-ui/build/static/swift-D-jiKNlA.js +1 -0
- package/web-ui/build/static/systemd-DE3AeWrd.js +1 -0
- package/web-ui/build/static/t4-cs-BSG7rkB_.js +1 -0
- package/web-ui/build/static/t4-templating-Cy7LuqAv.js +1 -0
- package/web-ui/build/static/t4-vb-ZLfMjXrh.js +1 -0
- package/web-ui/build/static/taggerscript-q2zFfkel.js +1 -0
- package/web-ui/build/static/tap-CzjhWyhf.js +1 -0
- package/web-ui/build/static/tap-ttXfPums.js +1 -0
- package/web-ui/build/static/tcl-6ta1XDva.js +1 -0
- package/web-ui/build/static/tcl-Cvx4AN_Q.js +1 -0
- package/web-ui/build/static/textile-zWm4gRbJ.js +1 -0
- package/web-ui/build/static/thrift-Crj4hRsm.js +1 -0
- package/web-ui/build/static/toml-hVfLOJr-.js +1 -0
- package/web-ui/build/static/tp-D5aJh4yF.js +1 -0
- package/web-ui/build/static/tremor-B9gWC4v1.js +1 -0
- package/web-ui/build/static/tsx-DtNWBAJO.js +1 -0
- package/web-ui/build/static/tt2-eH1L7Bpm.js +1 -0
- package/web-ui/build/static/turtle-BYCk4r6f.js +1 -0
- package/web-ui/build/static/twig-BQ-dq4no.js +1 -0
- package/web-ui/build/static/twig-n3AiXKyV.js +1 -0
- package/web-ui/build/static/typescript-CPQ0vD90.js +1 -0
- package/web-ui/build/static/typescript-juxiNWRf.js +1 -0
- package/web-ui/build/static/typoscript-C5h9SqFN.js +1 -0
- package/web-ui/build/static/unrealscript-9ht7jiai.js +1 -0
- package/web-ui/build/static/uorazor-36B6okgA.js +1 -0
- package/web-ui/build/static/uri-DEwrtmz_.js +1 -0
- package/web-ui/build/static/v-CvhXAFWo.js +1 -0
- package/web-ui/build/static/vala-CU_jVQ3c.js +1 -0
- package/web-ui/build/static/vala-H_yoFBZf.js +1 -0
- package/web-ui/build/static/vbnet-BNI0Gy5q.js +1 -0
- package/web-ui/build/static/vbnet-D-4O1Hpc.js +1 -0
- package/web-ui/build/static/vbscript-1zyalaSG.js +1 -0
- package/web-ui/build/static/vbscript-html-ea5_TYi7.js +1 -0
- package/web-ui/build/static/velocity-BlEdS1Un.js +1 -0
- package/web-ui/build/static/verilog-BGSIJuDJ.js +1 -0
- package/web-ui/build/static/verilog-C1vff5Z3.js +1 -0
- package/web-ui/build/static/vhdl-5H4C8O-_.js +1 -0
- package/web-ui/build/static/vhdl-DHiBEhsE.js +1 -0
- package/web-ui/build/static/vim-Bd1MNlxj.js +1 -0
- package/web-ui/build/static/vim-DBP2ZsgQ.js +1 -0
- package/web-ui/build/static/visual-basic-DI34-9vJ.js +1 -0
- package/web-ui/build/static/warpscript-DBQ-KbS6.js +1 -0
- package/web-ui/build/static/wasm-CY5W57_Y.js +1 -0
- package/web-ui/build/static/web-idl-CF9xaLpZ.js +1 -0
- package/web-ui/build/static/wiki-xfSWwdeC.js +1 -0
- package/web-ui/build/static/wolfram-DZ6ghwRH.js +1 -0
- package/web-ui/build/static/wren-qULNE4ZV.js +1 -0
- package/web-ui/build/static/x86asm-DD2-d5-3.js +1 -0
- package/web-ui/build/static/xeora-CMja58lL.js +1 -0
- package/web-ui/build/static/xl-DKZpXGv8.js +1 -0
- package/web-ui/build/static/xml-Xf5ErmV_.js +1 -0
- package/web-ui/build/static/xml-doc-Bl_99SZE.js +1 -0
- package/web-ui/build/static/xojo-PwcPgmIF.js +1 -0
- package/web-ui/build/static/xquery-BshbqrZe.js +1 -0
- package/web-ui/build/static/xquery-DY2-GgvB.js +1 -0
- package/web-ui/build/static/yaml-9mp-mYjQ.js +1 -0
- package/web-ui/build/static/yaml-BnH4Y8-L.js +1 -0
- package/web-ui/build/static/yang-CRK7RS7V.js +1 -0
- package/web-ui/build/static/zephir-B560hCdS.js +1 -0
- package/web-ui/build/static/zig-CBG6H3iO.js +1 -0
- package/web-ui/build/static/1c-D0gS3Hso.js +0 -1
- package/web-ui/build/static/abap-CyCKEEhS.js +0 -1
- package/web-ui/build/static/abnf-BZBn0pag.js +0 -1
- package/web-ui/build/static/abnf-BpCrg_Bf.js +0 -1
- package/web-ui/build/static/accesslog-DuTggsRZ.js +0 -1
- package/web-ui/build/static/actionscript-Ba9yLObR.js +0 -1
- package/web-ui/build/static/actionscript-C_BTnWxb.js +0 -1
- package/web-ui/build/static/ada-B69_itVh.js +0 -1
- package/web-ui/build/static/ada-DoeTM_BQ.js +0 -1
- package/web-ui/build/static/agda-jCpnVEpX.js +0 -1
- package/web-ui/build/static/al-CakFGn97.js +0 -1
- package/web-ui/build/static/angelscript-CnSUNIGj.js +0 -1
- package/web-ui/build/static/antlr4-Cn-R7SWD.js +0 -1
- package/web-ui/build/static/apache-jWzYeO33.js +0 -1
- package/web-ui/build/static/apacheconf-Qf6ccteC.js +0 -1
- package/web-ui/build/static/apex-BBFeLnmZ.js +0 -1
- package/web-ui/build/static/apl-Id4G-9pR.js +0 -1
- package/web-ui/build/static/applescript-Cndkqqg_.js +0 -1
- package/web-ui/build/static/applescript-De2uOrG8.js +0 -1
- package/web-ui/build/static/aql-Bx0hBEFP.js +0 -1
- package/web-ui/build/static/arcade-kv3B2d64.js +0 -1
- package/web-ui/build/static/arduino-Di5etN7-.js +0 -1
- package/web-ui/build/static/arduino-dzzVGXPJ.js +0 -1
- package/web-ui/build/static/arff-vVmlJyxT.js +0 -1
- package/web-ui/build/static/armasm-CLLemW4j.js +0 -1
- package/web-ui/build/static/asciidoc-5N0GIB1H.js +0 -1
- package/web-ui/build/static/asciidoc-BUQcC9k5.js +0 -1
- package/web-ui/build/static/asm6502-DrvbjZqg.js +0 -1
- package/web-ui/build/static/asmatmel-DXaAmo9p.js +0 -1
- package/web-ui/build/static/aspectj-QEbU6lqv.js +0 -1
- package/web-ui/build/static/aspnet-D1DOd55H.js +0 -1
- package/web-ui/build/static/autohotkey-CeN6Nxl7.js +0 -1
- package/web-ui/build/static/autohotkey-DK33Y-ag.js +0 -1
- package/web-ui/build/static/autoit-Ce15EHmT.js +0 -1
- package/web-ui/build/static/autoit-Du48dS3x.js +0 -1
- package/web-ui/build/static/avisynth-CTNNDQJu.js +0 -1
- package/web-ui/build/static/avrasm-U3bAmy_8.js +0 -1
- package/web-ui/build/static/avro-idl-hdYq5Y_G.js +0 -1
- package/web-ui/build/static/awk-D_y_Ybkz.js +0 -1
- package/web-ui/build/static/axapta-BtorzWAb.js +0 -1
- package/web-ui/build/static/bash-C7jHPzRr.js +0 -1
- package/web-ui/build/static/bash-C8rx4ZX7.js +0 -1
- package/web-ui/build/static/basic-BnB1QbT9.js +0 -1
- package/web-ui/build/static/basic-C3lmrCJn.js +0 -1
- package/web-ui/build/static/batch-D3zfZMkE.js +0 -1
- package/web-ui/build/static/bbcode-CcaWY4r6.js +0 -1
- package/web-ui/build/static/bicep-BTSNjNeE.js +0 -1
- package/web-ui/build/static/birb-FlitQ-CB.js +0 -1
- package/web-ui/build/static/bison-BwUeAPik.js +0 -1
- package/web-ui/build/static/bnf-BO0epnqT.js +0 -1
- package/web-ui/build/static/bnf-Dr7Yhkhf.js +0 -1
- package/web-ui/build/static/brainfuck-CQXtVvdr.js +0 -1
- package/web-ui/build/static/brainfuck-DBI8WFED.js +0 -1
- package/web-ui/build/static/brightscript-DMCw9cpk.js +0 -1
- package/web-ui/build/static/bro-DLuuGrl1.js +0 -1
- package/web-ui/build/static/bsl-YJucc4YV.js +0 -1
- package/web-ui/build/static/c-DhDv7jSS.js +0 -1
- package/web-ui/build/static/c-DxhyzKko.js +0 -1
- package/web-ui/build/static/c-like-DlgSkBV0.js +0 -1
- package/web-ui/build/static/cal-l1d2rfZn.js +0 -1
- package/web-ui/build/static/capnproto-dj8ChcGe.js +0 -1
- package/web-ui/build/static/ceylon-D54yMfbT.js +0 -1
- package/web-ui/build/static/cfscript-D6rZc4oz.js +0 -1
- package/web-ui/build/static/chaiscript-C5TnPhY1.js +0 -1
- package/web-ui/build/static/cil-OfdzNvKT.js +0 -1
- package/web-ui/build/static/clean-CIKWd5m_.js +0 -1
- package/web-ui/build/static/clojure-DPPjCSD9.js +0 -1
- package/web-ui/build/static/clojure-E4hINJlB.js +0 -1
- package/web-ui/build/static/clojure-repl-ByPwVP0v.js +0 -1
- package/web-ui/build/static/cmake-EmgODR4I.js +0 -1
- package/web-ui/build/static/cmake-FzVdKoPQ.js +0 -1
- package/web-ui/build/static/cobol-BCywZ9YX.js +0 -1
- package/web-ui/build/static/coffeescript-B3PJfOGT.js +0 -1
- package/web-ui/build/static/coffeescript-Cn6ayg_l.js +0 -1
- package/web-ui/build/static/concurnas-CDZuVXuU.js +0 -1
- package/web-ui/build/static/coq-CmxamUdH.js +0 -1
- package/web-ui/build/static/coq-OIzJsY4F.js +0 -1
- package/web-ui/build/static/cos-DGL5rP0B.js +0 -1
- package/web-ui/build/static/cpp-6bJ9ZCLp.js +0 -1
- package/web-ui/build/static/cpp-CnpCPPE0.js +0 -1
- package/web-ui/build/static/crmsh-UqfNCx22.js +0 -1
- package/web-ui/build/static/crystal-BZPfo8wh.js +0 -1
- package/web-ui/build/static/crystal-BmnmtxvU.js +0 -1
- package/web-ui/build/static/csharp-Ddd4cQJM.js +0 -1
- package/web-ui/build/static/csharp-Ozmwd4H7.js +0 -1
- package/web-ui/build/static/cshtml-CKUifIKv.js +0 -1
- package/web-ui/build/static/csp-DIKKHabm.js +0 -1
- package/web-ui/build/static/csp-DVNj8KoC.js +0 -1
- package/web-ui/build/static/css-C5xXuaIa.js +0 -1
- package/web-ui/build/static/css-extras-BcO-SjvT.js +0 -1
- package/web-ui/build/static/csv-Ckfvef5r.js +0 -1
- package/web-ui/build/static/cypher-nFX3ujhC.js +0 -1
- package/web-ui/build/static/d-C51vBcAN.js +0 -1
- package/web-ui/build/static/d-C5Zzmfpj.js +0 -1
- package/web-ui/build/static/dart-DTgXq_zq.js +0 -1
- package/web-ui/build/static/dart-nEf62Xtl.js +0 -1
- package/web-ui/build/static/dataweave-BBu_SXNo.js +0 -1
- package/web-ui/build/static/dax-BgSY6VXv.js +0 -1
- package/web-ui/build/static/delphi-BsEFn1Dg.js +0 -1
- package/web-ui/build/static/dhall-DZLoRbRq.js +0 -1
- package/web-ui/build/static/diff-BigjWm8-.js +0 -1
- package/web-ui/build/static/diff-GaoenF5U.js +0 -1
- package/web-ui/build/static/django-BHquQxg_.js +0 -1
- package/web-ui/build/static/django-BklTsfN1.js +0 -1
- package/web-ui/build/static/dns-Fye2v3C_.js +0 -1
- package/web-ui/build/static/dns-zone-file-Cl9DxAn6.js +0 -1
- package/web-ui/build/static/docker-ByXHv0Ly.js +0 -1
- package/web-ui/build/static/dockerfile-C3JvS7wx.js +0 -1
- package/web-ui/build/static/dos-DZjvZtlb.js +0 -1
- package/web-ui/build/static/dot-Ce9RBw-P.js +0 -1
- package/web-ui/build/static/dsconfig-CqzyFCWR.js +0 -1
- package/web-ui/build/static/dts-CzmHan27.js +0 -1
- package/web-ui/build/static/dust-ooMZaltT.js +0 -1
- package/web-ui/build/static/ebnf-BQTW3VN9.js +0 -1
- package/web-ui/build/static/ebnf-BWQPIMhj.js +0 -1
- package/web-ui/build/static/editorconfig-ChULEndb.js +0 -1
- package/web-ui/build/static/eiffel-DNf4Lf6d.js +0 -1
- package/web-ui/build/static/ejs-BN91k0H9.js +0 -1
- package/web-ui/build/static/elixir-BsUN2TJ3.js +0 -1
- package/web-ui/build/static/elixir-DowOmwjw.js +0 -1
- package/web-ui/build/static/elm-BR0-AOlB.js +0 -1
- package/web-ui/build/static/elm-CyQ-Tu1y.js +0 -1
- package/web-ui/build/static/erb-C3-ICRZC.js +0 -1
- package/web-ui/build/static/erb-CDwwnVfP.js +0 -1
- package/web-ui/build/static/erlang-CkKAvBqC.js +0 -1
- package/web-ui/build/static/erlang-b8hjzYg_.js +0 -1
- package/web-ui/build/static/erlang-repl-gGfh3Gx4.js +0 -1
- package/web-ui/build/static/etlua-DD1BETje.js +0 -1
- package/web-ui/build/static/excel-BHUhNjbb.js +0 -1
- package/web-ui/build/static/excel-formula-pygAkTSb.js +0 -1
- package/web-ui/build/static/factor-DGtAXbeO.js +0 -1
- package/web-ui/build/static/false-CmwPZZMx.js +0 -1
- package/web-ui/build/static/firestore-security-rules-BPVh7g3V.js +0 -1
- package/web-ui/build/static/fix-D0X2IrLW.js +0 -1
- package/web-ui/build/static/flix-B_K9PtSC.js +0 -1
- package/web-ui/build/static/flow-Bj8UDWFS.js +0 -1
- package/web-ui/build/static/fortran-CVjlvxYP.js +0 -1
- package/web-ui/build/static/fortran-CeuwkeSi.js +0 -1
- package/web-ui/build/static/fsharp-7ZnhHRI2.js +0 -1
- package/web-ui/build/static/fsharp-Dg0zkEUM.js +0 -1
- package/web-ui/build/static/ftl-DTiv91OH.js +0 -1
- package/web-ui/build/static/gams-mzIliqa9.js +0 -1
- package/web-ui/build/static/gap-CZy17Yrg.js +0 -1
- package/web-ui/build/static/gauss-eN8ZSPsu.js +0 -1
- package/web-ui/build/static/gcode-BilRDZ1d.js +0 -1
- package/web-ui/build/static/gcode-DgLXH4R9.js +0 -1
- package/web-ui/build/static/gdscript-ZYuV2APS.js +0 -1
- package/web-ui/build/static/gedcom-0kGxJiZ9.js +0 -1
- package/web-ui/build/static/gherkin-CCSGpV3s.js +0 -1
- package/web-ui/build/static/gherkin-DGxXFCBT.js +0 -1
- package/web-ui/build/static/git-CdLGzlwT.js +0 -1
- package/web-ui/build/static/glsl-BtFVLAdf.js +0 -1
- package/web-ui/build/static/glsl-pOLV_i61.js +0 -1
- package/web-ui/build/static/gml-BvRYdpYB.js +0 -1
- package/web-ui/build/static/gml-kixDldbq.js +0 -1
- package/web-ui/build/static/gn-B0j6r1ZR.js +0 -1
- package/web-ui/build/static/go-0gVqv26H.js +0 -1
- package/web-ui/build/static/go-hMMVdAxn.js +0 -1
- package/web-ui/build/static/go-module-nQEPOPuc.js +0 -1
- package/web-ui/build/static/golo-Dm43VBu7.js +0 -1
- package/web-ui/build/static/gradle-CHC1_Cae.js +0 -1
- package/web-ui/build/static/graphql-0VBsLded.js +0 -1
- package/web-ui/build/static/groovy-D8pgT7Gh.js +0 -1
- package/web-ui/build/static/groovy-LYh6lufY.js +0 -1
- package/web-ui/build/static/haml-D7TlUCYV.js +0 -1
- package/web-ui/build/static/haml-DM_YbLsX.js +0 -1
- package/web-ui/build/static/handlebars-C6s9z8yY.js +0 -1
- package/web-ui/build/static/handlebars-MmYUBbhF.js +0 -1
- package/web-ui/build/static/haskell-WDNKcSr-.js +0 -1
- package/web-ui/build/static/haskell-uN4RNceQ.js +0 -1
- package/web-ui/build/static/haxe-BfngEDpC.js +0 -1
- package/web-ui/build/static/haxe-Di7jSobz.js +0 -1
- package/web-ui/build/static/hcl-CCY9WaU5.js +0 -1
- package/web-ui/build/static/hlsl-BZeRODlS.js +0 -1
- package/web-ui/build/static/hoon-CYgEwHo6.js +0 -1
- package/web-ui/build/static/hpkp-CDGRQT6H.js +0 -1
- package/web-ui/build/static/hsp-Bd3e6SwQ.js +0 -1
- package/web-ui/build/static/hsts-BOUlTJ6c.js +0 -1
- package/web-ui/build/static/htmlbars-BPiYH0_n.js +0 -1
- package/web-ui/build/static/http-BX5oUCxR.js +0 -1
- package/web-ui/build/static/http-DVroDmj6.js +0 -1
- package/web-ui/build/static/hy-BCcF_QHP.js +0 -1
- package/web-ui/build/static/ichigojam-BiISBr0y.js +0 -1
- package/web-ui/build/static/icon-ClvK1B41.js +0 -1
- package/web-ui/build/static/icu-message-format-DbYDqmui.js +0 -1
- package/web-ui/build/static/idris-DUkwgVYa.js +0 -1
- package/web-ui/build/static/iecst-Dsthm7u9.js +0 -1
- package/web-ui/build/static/ignore-C6sD6BBI.js +0 -1
- package/web-ui/build/static/index-BJi0QI4y.js +0 -13
- package/web-ui/build/static/index-BUtXAjd5.css +0 -1
- package/web-ui/build/static/index-C0yagaf_.js +0 -1
- package/web-ui/build/static/index-rmQCMu11.js +0 -834
- package/web-ui/build/static/inform7-BhpCpaCI.js +0 -1
- package/web-ui/build/static/inform7-CypdUZ2H.js +0 -1
- package/web-ui/build/static/ini-D3bMjLFy.js +0 -1
- package/web-ui/build/static/ini-mZ4DmMFa.js +0 -1
- package/web-ui/build/static/io-CAPenDjW.js +0 -1
- package/web-ui/build/static/irpf90-DMLZfHOl.js +0 -1
- package/web-ui/build/static/isbl-C-heO4bo.js +0 -1
- package/web-ui/build/static/j-CYnuDyva.js +0 -1
- package/web-ui/build/static/java-BwxvO1xU.js +0 -1
- package/web-ui/build/static/java-DrS-TIOG.js +0 -1
- package/web-ui/build/static/javadoc-C7g1nvf0.js +0 -1
- package/web-ui/build/static/javadoclike-BccMcxyJ.js +0 -1
- package/web-ui/build/static/javascript-BTLBzg4X.js +0 -1
- package/web-ui/build/static/javastacktrace-DMfJDkdg.js +0 -1
- package/web-ui/build/static/jboss-cli-Bod2dA9a.js +0 -1
- package/web-ui/build/static/jexl-N6nsHGWj.js +0 -1
- package/web-ui/build/static/jolie-CsrX6xYs.js +0 -1
- package/web-ui/build/static/jq-UVBu2R02.js +0 -1
- package/web-ui/build/static/js-extras-CuwwBN5k.js +0 -1
- package/web-ui/build/static/js-templates-DIBe0p7a.js +0 -1
- package/web-ui/build/static/jsdoc-DtDbuWdy.js +0 -1
- package/web-ui/build/static/json-BI3FHwe1.js +0 -1
- package/web-ui/build/static/json-P6SuA8aJ.js +0 -1
- package/web-ui/build/static/json5-CRP2homn.js +0 -1
- package/web-ui/build/static/jsonp-9ElDctKO.js +0 -1
- package/web-ui/build/static/jsstacktrace-D2Fl9d_V.js +0 -1
- package/web-ui/build/static/jsx-CQTwBhTH.js +0 -1
- package/web-ui/build/static/julia-DuUl4PLy.js +0 -1
- package/web-ui/build/static/julia-nGiK_b-G.js +0 -1
- package/web-ui/build/static/julia-repl-CZXv3gUI.js +0 -1
- package/web-ui/build/static/keepalived-BXuewLUw.js +0 -1
- package/web-ui/build/static/keyman-qJzqzYn7.js +0 -1
- package/web-ui/build/static/kotlin-B9n_utKk.js +0 -1
- package/web-ui/build/static/kotlin-haL4BAuN.js +0 -1
- package/web-ui/build/static/kumir-B3qOyQmg.js +0 -1
- package/web-ui/build/static/kusto-DBaBX58G.js +0 -1
- package/web-ui/build/static/lasso-BKSAUuYM.js +0 -1
- package/web-ui/build/static/latex-BRrZyaQT.js +0 -1
- package/web-ui/build/static/latex-m1lQaqf1.js +0 -1
- package/web-ui/build/static/latte-eiBbKf65.js +0 -1
- package/web-ui/build/static/ldif-y2LZUUyZ.js +0 -1
- package/web-ui/build/static/leaf-hIUS2wti.js +0 -1
- package/web-ui/build/static/less-Bo6R8taI.js +0 -1
- package/web-ui/build/static/less-DuKmENyN.js +0 -1
- package/web-ui/build/static/lilypond-BBpJhRQ9.js +0 -1
- package/web-ui/build/static/liquid-CAprdcX2.js +0 -1
- package/web-ui/build/static/lisp-Bf1XYdUw.js +0 -1
- package/web-ui/build/static/lisp-CK4NShQS.js +0 -1
- package/web-ui/build/static/livecodeserver-D-7DT8n5.js +0 -1
- package/web-ui/build/static/livescript-C53jjB4u.js +0 -1
- package/web-ui/build/static/livescript-C6BLAugR.js +0 -1
- package/web-ui/build/static/llvm-DwsfQGGS.js +0 -1
- package/web-ui/build/static/llvm-x2WOwJip.js +0 -1
- package/web-ui/build/static/log-ycx4d2kp.js +0 -1
- package/web-ui/build/static/lolcode-kQPJj9kJ.js +0 -1
- package/web-ui/build/static/lsl-DYPjhHe3.js +0 -1
- package/web-ui/build/static/lua-DbyfdtuA.js +0 -1
- package/web-ui/build/static/lua-k-RdWswg.js +0 -1
- package/web-ui/build/static/magma-C0BRcgX4.js +0 -1
- package/web-ui/build/static/makefile-CZQdxsni.js +0 -1
- package/web-ui/build/static/makefile-D-G1cICu.js +0 -1
- package/web-ui/build/static/markdown-BXgB-fA-.js +0 -1
- package/web-ui/build/static/markdown-Ce-22f29.js +0 -1
- package/web-ui/build/static/markup-templating-BpdQJTBM.js +0 -1
- package/web-ui/build/static/mathematica-IkAnPpu4.js +0 -1
- package/web-ui/build/static/matlab-D00TnflQ.js +0 -1
- package/web-ui/build/static/matlab-D9nj0uha.js +0 -1
- package/web-ui/build/static/maxima-C7a7zrie.js +0 -1
- package/web-ui/build/static/maxscript-BV3koaAu.js +0 -1
- package/web-ui/build/static/mel-C7fC2vR0.js +0 -1
- package/web-ui/build/static/mel-DUFmm8LA.js +0 -1
- package/web-ui/build/static/mercury-D0zWajPt.js +0 -1
- package/web-ui/build/static/mermaid-BcIFh8lC.js +0 -1
- package/web-ui/build/static/mipsasm-Ch8zsfD7.js +0 -1
- package/web-ui/build/static/mizar-D72L8LdH.js +0 -1
- package/web-ui/build/static/mizar-H2a4eeQU.js +0 -1
- package/web-ui/build/static/mojolicious-CXGZY6wR.js +0 -1
- package/web-ui/build/static/mongodb-ycbZ-Gtu.js +0 -1
- package/web-ui/build/static/monkey-B1PWgo4u.js +0 -1
- package/web-ui/build/static/monkey-BTLKqHiE.js +0 -1
- package/web-ui/build/static/moonscript-CGujt4hQ.js +0 -1
- package/web-ui/build/static/moonscript-Cd65ANue.js +0 -1
- package/web-ui/build/static/n1ql-5SoXRWF5.js +0 -1
- package/web-ui/build/static/n1ql-SrTc8dgR.js +0 -1
- package/web-ui/build/static/n4js-DcydNbvU.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-DgTjIFTD.js +0 -1
- package/web-ui/build/static/naniscript-Cgu0Uhgv.js +0 -1
- package/web-ui/build/static/nasm-C6Jwlhb3.js +0 -1
- package/web-ui/build/static/neon-BlmLz-44.js +0 -1
- package/web-ui/build/static/nevod-QYVtYYuZ.js +0 -1
- package/web-ui/build/static/nginx-BuLLVaOi.js +0 -1
- package/web-ui/build/static/nginx-D32yC6aV.js +0 -1
- package/web-ui/build/static/nim-lYMS-Zao.js +0 -1
- package/web-ui/build/static/nim-mOq8l1DZ.js +0 -1
- package/web-ui/build/static/nix-BF2uUjB0.js +0 -1
- package/web-ui/build/static/nix-CvXMc2Qe.js +0 -1
- package/web-ui/build/static/node-repl-b6WSKwpJ.js +0 -1
- package/web-ui/build/static/nsis-By4cMroz.js +0 -1
- package/web-ui/build/static/nsis-CdtEDB4h.js +0 -1
- package/web-ui/build/static/objectivec-1qRjQ45C.js +0 -1
- package/web-ui/build/static/objectivec-B_fabLIN.js +0 -1
- package/web-ui/build/static/ocaml-CgNFmQRO.js +0 -1
- package/web-ui/build/static/ocaml-RYK_k0qm.js +0 -1
- package/web-ui/build/static/opencl-DS8fpnDf.js +0 -1
- package/web-ui/build/static/openqasm-DJaB3Rq-.js +0 -1
- package/web-ui/build/static/openscad-CG2Cr9_f.js +0 -1
- package/web-ui/build/static/oxygene-C5StnXkF.js +0 -1
- package/web-ui/build/static/oz-Chp4Q4tx.js +0 -1
- package/web-ui/build/static/parigp-CHrkrXXH.js +0 -1
- package/web-ui/build/static/parser-oClS8RsF.js +0 -1
- package/web-ui/build/static/parser3-DAnZ8BBa.js +0 -1
- package/web-ui/build/static/pascal-C3UXKTAg.js +0 -1
- package/web-ui/build/static/pascaligo-bQ2eEItJ.js +0 -1
- package/web-ui/build/static/pcaxis-Cb18v5lb.js +0 -1
- package/web-ui/build/static/peoplecode-DSinbacy.js +0 -1
- package/web-ui/build/static/perl-CJyKzdWx.js +0 -1
- package/web-ui/build/static/perl-DPC7B2HS.js +0 -1
- package/web-ui/build/static/pf-CufleM0I.js +0 -1
- package/web-ui/build/static/pgsql-C_0MdqVp.js +0 -1
- package/web-ui/build/static/php-BO1Ap_Os.js +0 -1
- package/web-ui/build/static/php-CJgcNJVe.js +0 -1
- package/web-ui/build/static/php-extras-BXgszKUS.js +0 -1
- package/web-ui/build/static/php-template-Cb_xvIiQ.js +0 -1
- package/web-ui/build/static/phpdoc-BfOts4aJ.js +0 -1
- package/web-ui/build/static/plaintext-DN7uh6jc.js +0 -1
- package/web-ui/build/static/plsql-v3WUpEeY.js +0 -1
- package/web-ui/build/static/pony-DJxNA-H0.js +0 -1
- package/web-ui/build/static/powerquery-BtsNylnn.js +0 -1
- package/web-ui/build/static/powershell-C6cTgKNj.js +0 -1
- package/web-ui/build/static/powershell-w7qa2Po0.js +0 -1
- package/web-ui/build/static/processing-B4LQG2qT.js +0 -1
- package/web-ui/build/static/processing-sqZsG0Ty.js +0 -1
- package/web-ui/build/static/profile-BmJYpErx.js +0 -1
- package/web-ui/build/static/prolog-BesbmNtC.js +0 -1
- package/web-ui/build/static/prolog-Bhfih4kN.js +0 -1
- package/web-ui/build/static/promql-C0f632z2.js +0 -1
- package/web-ui/build/static/properties-D4QlRz8E.js +0 -1
- package/web-ui/build/static/properties-jKkliMyl.js +0 -1
- package/web-ui/build/static/protobuf-1DEpY6d3.js +0 -1
- package/web-ui/build/static/protobuf-BGXS-kPK.js +0 -1
- package/web-ui/build/static/psl-C0CZXE-V.js +0 -1
- package/web-ui/build/static/pug-BF9VjA3d.js +0 -1
- package/web-ui/build/static/puppet-DbCz1V2e.js +0 -1
- package/web-ui/build/static/puppet-sw6E5TP0.js +0 -1
- package/web-ui/build/static/pure-C7mJA0tr.js +0 -1
- package/web-ui/build/static/purebasic-BSMar56G.js +0 -1
- package/web-ui/build/static/purebasic-lZ85aQ75.js +0 -1
- package/web-ui/build/static/purescript-7W6hcoJU.js +0 -1
- package/web-ui/build/static/python-Cf1rHsAv.js +0 -1
- package/web-ui/build/static/python-D6YthG1T.js +0 -1
- package/web-ui/build/static/python-repl-L_ce-JlI.js +0 -1
- package/web-ui/build/static/q-C4jLiln2.js +0 -1
- package/web-ui/build/static/q-DbbElowk.js +0 -1
- package/web-ui/build/static/qml-BpzqRYBe.js +0 -1
- package/web-ui/build/static/qml-DhqooLOn.js +0 -1
- package/web-ui/build/static/qore-CDdWlH4L.js +0 -1
- package/web-ui/build/static/qsharp-CYjzWQn8.js +0 -1
- package/web-ui/build/static/r-C0m7OAlP.js +0 -1
- package/web-ui/build/static/r-nRzPzIPC.js +0 -1
- package/web-ui/build/static/racket-BMk7mOQz.js +0 -1
- package/web-ui/build/static/reason-BXQPEhQe.js +0 -1
- package/web-ui/build/static/reasonml-BX4tkmG7.js +0 -1
- package/web-ui/build/static/regex-I514pFOx.js +0 -1
- package/web-ui/build/static/rego-nryy7Qo5.js +0 -1
- package/web-ui/build/static/renpy-73dSR30u.js +0 -1
- package/web-ui/build/static/rest-BVkqAn_D.js +0 -1
- package/web-ui/build/static/rib-CkA1SeIw.js +0 -1
- package/web-ui/build/static/rip-DdqP7xQ_.js +0 -1
- package/web-ui/build/static/roboconf-B1xFEP2z.js +0 -1
- package/web-ui/build/static/roboconf-MHZ9iUN8.js +0 -1
- package/web-ui/build/static/robotframework-Be6JB4Sm.js +0 -1
- package/web-ui/build/static/routeros-BDbHsrl3.js +0 -1
- package/web-ui/build/static/rsl-vBbR8fM2.js +0 -1
- package/web-ui/build/static/ruby-Bl6coIpX.js +0 -1
- package/web-ui/build/static/ruby-CYoX7aZ3.js +0 -1
- package/web-ui/build/static/ruleslanguage-CNda0rO_.js +0 -1
- package/web-ui/build/static/rust-Cn7CeLWb.js +0 -1
- package/web-ui/build/static/rust-DqfPHA-4.js +0 -1
- package/web-ui/build/static/sas-DX4nVHMx.js +0 -1
- package/web-ui/build/static/sas-TP86Lr_H.js +0 -1
- package/web-ui/build/static/sass-DLbsRbZq.js +0 -1
- package/web-ui/build/static/scala-BnuBUE7N.js +0 -1
- package/web-ui/build/static/scala-e0xCO3PH.js +0 -1
- package/web-ui/build/static/scheme-CgksT1_b.js +0 -1
- package/web-ui/build/static/scheme-wKIEujhs.js +0 -1
- package/web-ui/build/static/scilab-BK5XtNGf.js +0 -1
- package/web-ui/build/static/scss-CgF0LqaR.js +0 -1
- package/web-ui/build/static/scss-DtfwOUSt.js +0 -1
- package/web-ui/build/static/shell-mV_H_B9k.js +0 -1
- package/web-ui/build/static/shell-session-CcycyI-F.js +0 -1
- package/web-ui/build/static/smali-DUHlxZcA.js +0 -1
- package/web-ui/build/static/smali-vgrIyB1v.js +0 -1
- package/web-ui/build/static/smalltalk-C0Ge9l_D.js +0 -1
- package/web-ui/build/static/smalltalk-CXwx9xen.js +0 -1
- package/web-ui/build/static/smarty-ATfkwbr-.js +0 -1
- package/web-ui/build/static/sml-CPHHv48a.js +0 -1
- package/web-ui/build/static/sml-D8zKZZ0g.js +0 -1
- package/web-ui/build/static/solidity-DU2sGoWA.js +0 -1
- package/web-ui/build/static/solution-file-D20yiaNa.js +0 -1
- package/web-ui/build/static/soy-NkZd2NuM.js +0 -1
- package/web-ui/build/static/sparql-CURkC9N5.js +0 -1
- package/web-ui/build/static/splunk-spl-DACtCZRc.js +0 -1
- package/web-ui/build/static/sqf-BEdMNLDm.js +0 -1
- package/web-ui/build/static/sqf-RqYJHX2k.js +0 -1
- package/web-ui/build/static/sql-Bgepr53d.js +0 -1
- package/web-ui/build/static/sql-CW0TRs77.js +0 -1
- package/web-ui/build/static/sql_more-C2HWexYA.js +0 -1
- package/web-ui/build/static/squirrel-B6wcVYWs.js +0 -1
- package/web-ui/build/static/stan-Dl3AavYY.js +0 -1
- package/web-ui/build/static/stan-RZ2M2r7-.js +0 -1
- package/web-ui/build/static/stata-PGzYv80j.js +0 -1
- package/web-ui/build/static/step21-yyjO2ozE.js +0 -1
- package/web-ui/build/static/stylus-CA7oCY6H.js +0 -1
- package/web-ui/build/static/stylus-CMppe6Nc.js +0 -1
- package/web-ui/build/static/subunit-CgXzRGNV.js +0 -1
- package/web-ui/build/static/swift-BEZPFJIt.js +0 -1
- package/web-ui/build/static/swift-N42216FZ.js +0 -1
- package/web-ui/build/static/systemd-DFn17zHD.js +0 -1
- package/web-ui/build/static/t4-cs-D2og3B0M.js +0 -1
- package/web-ui/build/static/t4-templating-D9rCAn0c.js +0 -1
- package/web-ui/build/static/t4-vb-DG0xTVDc.js +0 -1
- package/web-ui/build/static/taggerscript-C89CvllW.js +0 -1
- package/web-ui/build/static/tap-D19DYT30.js +0 -1
- package/web-ui/build/static/tap-ERFF4Ark.js +0 -1
- package/web-ui/build/static/tcl-BCrLy0kY.js +0 -1
- package/web-ui/build/static/tcl-Db3hH49l.js +0 -1
- package/web-ui/build/static/textile-C45CZf2E.js +0 -1
- package/web-ui/build/static/thrift-DPSiQbdQ.js +0 -1
- package/web-ui/build/static/toml-OY_aaWwT.js +0 -1
- package/web-ui/build/static/tp-B3eRQVO4.js +0 -1
- package/web-ui/build/static/tremor-BqAT46SE.js +0 -1
- package/web-ui/build/static/tsx-BCfhl9AT.js +0 -1
- package/web-ui/build/static/tt2-C0sqlstv.js +0 -1
- package/web-ui/build/static/turtle-ClBSXu8f.js +0 -1
- package/web-ui/build/static/twig-BxxoTcyR.js +0 -1
- package/web-ui/build/static/twig-D1iWWft8.js +0 -1
- package/web-ui/build/static/typescript-D92P7Q_T.js +0 -1
- package/web-ui/build/static/typescript-IMBE9asI.js +0 -1
- package/web-ui/build/static/typoscript-Ct5LqTJd.js +0 -1
- package/web-ui/build/static/unrealscript-DzhFlMW5.js +0 -1
- package/web-ui/build/static/uorazor-DR4IM7ll.js +0 -1
- package/web-ui/build/static/uri-D10KlPiP.js +0 -1
- package/web-ui/build/static/v-CHHzCtfa.js +0 -1
- package/web-ui/build/static/vala-ChoAAQZv.js +0 -1
- package/web-ui/build/static/vala-CsGoPWkE.js +0 -1
- package/web-ui/build/static/vbnet-BSMzhrci.js +0 -1
- package/web-ui/build/static/vbnet-tWgXxlpd.js +0 -1
- package/web-ui/build/static/vbscript-C5MSBjcM.js +0 -1
- package/web-ui/build/static/vbscript-html-DgC8phmk.js +0 -1
- package/web-ui/build/static/velocity-ChLZNkgf.js +0 -1
- package/web-ui/build/static/verilog-RKDyj9CP.js +0 -1
- package/web-ui/build/static/verilog-qAYw6v_5.js +0 -1
- package/web-ui/build/static/vhdl-CRSvweFg.js +0 -1
- package/web-ui/build/static/vhdl-DnTmxitY.js +0 -1
- package/web-ui/build/static/vim-CnOJH9xw.js +0 -1
- package/web-ui/build/static/vim-LKJY3Sb8.js +0 -1
- package/web-ui/build/static/visual-basic-DZTN8GNq.js +0 -1
- package/web-ui/build/static/warpscript-Bz5PHWGb.js +0 -1
- package/web-ui/build/static/wasm-DjXA7rVQ.js +0 -1
- package/web-ui/build/static/web-idl-qpPnV3-c.js +0 -1
- package/web-ui/build/static/wiki-h1S7Uj0l.js +0 -1
- package/web-ui/build/static/wolfram-BsqW0Evw.js +0 -1
- package/web-ui/build/static/wren-2NkHwSLr.js +0 -1
- package/web-ui/build/static/x86asm-D8Cg9MTd.js +0 -1
- package/web-ui/build/static/xeora-CIwPPgRx.js +0 -1
- package/web-ui/build/static/xl-DIsgBj_c.js +0 -1
- package/web-ui/build/static/xml-D19j4_jb.js +0 -1
- package/web-ui/build/static/xml-doc-DMtIXpse.js +0 -1
- package/web-ui/build/static/xojo-Yr0egAH7.js +0 -1
- package/web-ui/build/static/xquery-3A0gaIyY.js +0 -1
- package/web-ui/build/static/xquery-ondigVMj.js +0 -1
- package/web-ui/build/static/yaml-BC7GbQPc.js +0 -1
- package/web-ui/build/static/yaml-DvN1W_m1.js +0 -1
- package/web-ui/build/static/yang-BJH3-Oqi.js +0 -1
- package/web-ui/build/static/zephir-DsXXe3UC.js +0 -1
- package/web-ui/build/static/zig-9jAF8TxG.js +0 -1
package/package.json
CHANGED
|
@@ -393,6 +393,66 @@ describe('AgentPool', () => {
|
|
|
393
393
|
test('throws for non-existent agent', async () => {
|
|
394
394
|
await expect(pool.addUserMessage('nonexistent', { content: 'hi' })).rejects.toThrow('Agent not found');
|
|
395
395
|
});
|
|
396
|
+
|
|
397
|
+
test('clears a future scheduler-applied delayEndTime on user message', async () => {
|
|
398
|
+
// A user message is an explicit signal to act now — any back-off
|
|
399
|
+
// delay set by the scheduler (rate-limit, network error, builtin
|
|
400
|
+
// tool delay) should evaporate rather than making the user wait
|
|
401
|
+
// out the remainder.
|
|
402
|
+
const agent = await pool.createAgent(agentCfg());
|
|
403
|
+
agent.delayEndTime = new Date(Date.now() + 60_000).toISOString();
|
|
404
|
+
|
|
405
|
+
await pool.addUserMessage(agent.id, { content: 'please act now' });
|
|
406
|
+
|
|
407
|
+
expect(agent.delayEndTime).toBeNull();
|
|
408
|
+
expect(agent.messageQueues.userMessages).toHaveLength(1);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
test('leaves a past/expired delayEndTime alone', async () => {
|
|
412
|
+
// Already-expired delays don't need clearing — the scheduler ignores
|
|
413
|
+
// them on the next tick anyway. We only act on actively-blocking delays.
|
|
414
|
+
const agent = await pool.createAgent(agentCfg());
|
|
415
|
+
const pastIso = new Date(Date.now() - 1_000).toISOString();
|
|
416
|
+
agent.delayEndTime = pastIso;
|
|
417
|
+
|
|
418
|
+
await pool.addUserMessage(agent.id, { content: 'go' });
|
|
419
|
+
|
|
420
|
+
expect(agent.delayEndTime).toBe(pastIso);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
test('no-ops when delayEndTime is null', async () => {
|
|
424
|
+
const agent = await pool.createAgent(agentCfg());
|
|
425
|
+
agent.delayEndTime = null;
|
|
426
|
+
|
|
427
|
+
await pool.addUserMessage(agent.id, { content: 'go' });
|
|
428
|
+
|
|
429
|
+
expect(agent.delayEndTime).toBeNull();
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
test('broadcasts agent state update when a delay was cleared', async () => {
|
|
433
|
+
// The UI's delay chip listens for `agent_state_updated` — when we
|
|
434
|
+
// clear a delay we should surface it immediately so the chip
|
|
435
|
+
// disappears without a reload.
|
|
436
|
+
const agent = await pool.createAgent(agentCfg());
|
|
437
|
+
agent.delayEndTime = new Date(Date.now() + 30_000).toISOString();
|
|
438
|
+
|
|
439
|
+
const broadcast = jest.fn().mockResolvedValue(undefined);
|
|
440
|
+
pool.scheduler = { broadcastAgentStateUpdate: broadcast };
|
|
441
|
+
|
|
442
|
+
await pool.addUserMessage(agent.id, { content: 'now' });
|
|
443
|
+
|
|
444
|
+
expect(broadcast).toHaveBeenCalledWith(agent.id, 'user-message-clears-delay');
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
test('does not broadcast when no delay was set', async () => {
|
|
448
|
+
const agent = await pool.createAgent(agentCfg());
|
|
449
|
+
const broadcast = jest.fn().mockResolvedValue(undefined);
|
|
450
|
+
pool.scheduler = { broadcastAgentStateUpdate: broadcast };
|
|
451
|
+
|
|
452
|
+
await pool.addUserMessage(agent.id, { content: 'hi' });
|
|
453
|
+
|
|
454
|
+
expect(broadcast).not.toHaveBeenCalled();
|
|
455
|
+
});
|
|
396
456
|
});
|
|
397
457
|
|
|
398
458
|
describe('addInterAgentMessage', () => {
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageProcessor — source-header injection.
|
|
3
|
+
*
|
|
4
|
+
* Contract:
|
|
5
|
+
* When a user message arrives carrying a `context.source` produced by
|
|
6
|
+
* services/messageSource.js (Discord / Telegram ingress), the message
|
|
7
|
+
* content queued on the agent is prefixed with a parenthesized
|
|
8
|
+
* attribution line:
|
|
9
|
+
*
|
|
10
|
+
* (Message by alice from Discord > MyGuild > #ops)
|
|
11
|
+
* hi is anyone there?
|
|
12
|
+
*
|
|
13
|
+
* The source object itself is also preserved on the queued message for
|
|
14
|
+
* downstream consumers (relays, logs). Re-invocation with a message that
|
|
15
|
+
* already carries the header is idempotent.
|
|
16
|
+
*
|
|
17
|
+
* These tests mock agentPool but exercise the real prependSourceHeader +
|
|
18
|
+
* createDiscordSource / createTelegramSource paths so the contract is
|
|
19
|
+
* verified end-to-end through the processMessage boundary.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { jest, describe, test, expect, beforeEach } from '@jest/globals';
|
|
23
|
+
import { createMockLogger, createMockConfig, createMockAiService } from '../../__test-utils__/mockFactories.js';
|
|
24
|
+
|
|
25
|
+
jest.unstable_mockModule('../../services/visualEditorBridge.js', () => ({
|
|
26
|
+
getVisualEditorBridge: jest.fn(() => ({
|
|
27
|
+
isEnabled: () => false,
|
|
28
|
+
hasInstance: () => false,
|
|
29
|
+
})),
|
|
30
|
+
InstanceStatus: { IDLE: 'idle', RUNNING: 'running', ERROR: 'error' },
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
jest.unstable_mockModule('../../utilities/tagParser.js', () => ({
|
|
34
|
+
default: jest.fn().mockImplementation(() => ({
|
|
35
|
+
extractToolCommands: jest.fn().mockReturnValue([]),
|
|
36
|
+
normalizeToolCommand: jest.fn((c) => c),
|
|
37
|
+
extractAgentRedirects: jest.fn().mockReturnValue([]),
|
|
38
|
+
parseXMLParameters: jest.fn().mockReturnValue({}),
|
|
39
|
+
decodeHtmlEntities: jest.fn((s) => s),
|
|
40
|
+
})),
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
jest.unstable_mockModule('../../tools/visualEditorTool.js', () => ({
|
|
44
|
+
VisualEditorTool: { injectContextIntoMessage: jest.fn((msg) => msg) },
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
// Import the REAL messageSource factories — this is intentional. The
|
|
48
|
+
// integration value of these tests is the end-to-end contract between the
|
|
49
|
+
// source module and the processor.
|
|
50
|
+
const { createDiscordSource, createTelegramSource, createWebSource } =
|
|
51
|
+
await import('../../services/messageSource.js');
|
|
52
|
+
const { default: MessageProcessor } = await import('../messageProcessor.js');
|
|
53
|
+
|
|
54
|
+
function makeMP() {
|
|
55
|
+
const config = createMockConfig();
|
|
56
|
+
const logger = createMockLogger();
|
|
57
|
+
const agentPool = {
|
|
58
|
+
getAgent: jest.fn().mockResolvedValue({
|
|
59
|
+
id: 'agent-1',
|
|
60
|
+
name: 'TestAgent',
|
|
61
|
+
mode: 'chat',
|
|
62
|
+
conversations: { full: { messages: [] } },
|
|
63
|
+
messageQueues: { userMessages: [], interAgentMessages: [], toolResults: [] },
|
|
64
|
+
}),
|
|
65
|
+
addUserMessage: jest.fn().mockResolvedValue(undefined),
|
|
66
|
+
addInterAgentMessage: jest.fn().mockResolvedValue(undefined),
|
|
67
|
+
};
|
|
68
|
+
const contextManager = { getContext: jest.fn() };
|
|
69
|
+
const mp = new MessageProcessor(
|
|
70
|
+
config, logger, { getTool: jest.fn() }, agentPool, contextManager, createMockAiService()
|
|
71
|
+
);
|
|
72
|
+
return { mp, agentPool };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
describe('MessageProcessor — source header injection', () => {
|
|
76
|
+
let mp, agentPool;
|
|
77
|
+
beforeEach(() => {
|
|
78
|
+
jest.clearAllMocks();
|
|
79
|
+
({ mp, agentPool } = makeMP());
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('Discord guild message → content prefixed with attribution line', async () => {
|
|
83
|
+
const source = createDiscordSource({
|
|
84
|
+
id: 'm1',
|
|
85
|
+
author: { id: 'u1', username: 'alice' },
|
|
86
|
+
guild: { id: 'g1', name: 'MyGuild' },
|
|
87
|
+
channel: { id: 'c1', name: 'ops', isThread: () => false },
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
await mp.processMessage('agent-1', 'hi is anyone there?', {
|
|
91
|
+
sessionId: 'discord-g1-c1',
|
|
92
|
+
source,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
expect(agentPool.addUserMessage).toHaveBeenCalledTimes(1);
|
|
96
|
+
const [, queued] = agentPool.addUserMessage.mock.calls[0];
|
|
97
|
+
expect(queued.content).toBe(
|
|
98
|
+
'(Message by alice from Discord > MyGuild > #ops)\nhi is anyone there?'
|
|
99
|
+
);
|
|
100
|
+
// Source is also preserved structurally for downstream consumers.
|
|
101
|
+
expect(queued.source).toBe(source);
|
|
102
|
+
expect(queued.role).toBe('user');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('Telegram private message → Telegram > DM attribution', async () => {
|
|
106
|
+
const source = createTelegramSource({
|
|
107
|
+
message_id: 1,
|
|
108
|
+
chat: { id: 42, type: 'private' },
|
|
109
|
+
from: { id: 7, username: 'alice' },
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
await mp.processMessage('agent-1', 'status?', {
|
|
113
|
+
sessionId: 'telegram-42',
|
|
114
|
+
source,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const [, queued] = agentPool.addUserMessage.mock.calls[0];
|
|
118
|
+
expect(queued.content).toBe('(Message by alice from Telegram > DM)\nstatus?');
|
|
119
|
+
expect(queued.source).toBe(source);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('Discord thread message → parent + thread path in header', async () => {
|
|
123
|
+
const source = createDiscordSource({
|
|
124
|
+
id: 'm2',
|
|
125
|
+
author: { username: 'alice' },
|
|
126
|
+
guild: { id: 'g', name: 'MyGuild' },
|
|
127
|
+
channel: {
|
|
128
|
+
id: 't1', name: 'deploy-thread',
|
|
129
|
+
parentId: 'c1', parent: { name: 'ops' },
|
|
130
|
+
isThread: () => true,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
await mp.processMessage('agent-1', 'deploy status?', { sessionId: 's', source });
|
|
135
|
+
|
|
136
|
+
const [, queued] = agentPool.addUserMessage.mock.calls[0];
|
|
137
|
+
expect(queued.content).toBe(
|
|
138
|
+
'(Message by alice from Discord > MyGuild > #ops > deploy-thread)\ndeploy status?'
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test('no source on context → content passes through untouched', async () => {
|
|
143
|
+
await mp.processMessage('agent-1', 'raw input', { sessionId: 's' });
|
|
144
|
+
const [, queued] = agentPool.addUserMessage.mock.calls[0];
|
|
145
|
+
expect(queued.content).toBe('raw input');
|
|
146
|
+
expect(queued.source).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test('web source → no header (web UI interactions stay clean)', async () => {
|
|
150
|
+
const source = createWebSource({ sessionId: 'web-1', userName: 'operator' });
|
|
151
|
+
await mp.processMessage('agent-1', 'hello', { sessionId: 'web-1', source });
|
|
152
|
+
|
|
153
|
+
const [, queued] = agentPool.addUserMessage.mock.calls[0];
|
|
154
|
+
expect(queued.content).toBe('hello');
|
|
155
|
+
expect(queued.source).toBe(source); // structurally preserved even when no header rendered
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test('idempotency — re-processing a message that already has the header does not double-prefix', async () => {
|
|
159
|
+
const source = createDiscordSource({
|
|
160
|
+
author: { username: 'alice' },
|
|
161
|
+
guild: { name: 'MyGuild' },
|
|
162
|
+
channel: { id: 'c', name: 'ops', isThread: () => false },
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// First call — fresh content gets prefixed.
|
|
166
|
+
await mp.processMessage('agent-1', 'hi', { source });
|
|
167
|
+
const firstContent = agentPool.addUserMessage.mock.calls[0][1].content;
|
|
168
|
+
expect(firstContent.startsWith('(Message by alice')).toBe(true);
|
|
169
|
+
|
|
170
|
+
// Second call — pass the ALREADY-prefixed content back through (as
|
|
171
|
+
// would happen on replay / state-restore paths). The header must not
|
|
172
|
+
// be duplicated.
|
|
173
|
+
jest.clearAllMocks();
|
|
174
|
+
({ mp, agentPool } = makeMP());
|
|
175
|
+
await mp.processMessage('agent-1', firstContent, { source });
|
|
176
|
+
const secondContent = agentPool.addUserMessage.mock.calls[0][1].content;
|
|
177
|
+
expect(secondContent).toBe(firstContent);
|
|
178
|
+
// i.e. not "(Message by alice ...)\n(Message by alice ...)\nhi"
|
|
179
|
+
const headerCount = (secondContent.match(/\(Message by alice/g) || []).length;
|
|
180
|
+
expect(headerCount).toBe(1);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('unknown user fallback keeps the header well-formed', async () => {
|
|
184
|
+
const source = createDiscordSource({
|
|
185
|
+
// no author
|
|
186
|
+
guild: { name: 'G' },
|
|
187
|
+
channel: { id: 'c', name: 'general', isThread: () => false },
|
|
188
|
+
});
|
|
189
|
+
await mp.processMessage('agent-1', 'ping', { source });
|
|
190
|
+
const [, queued] = agentPool.addUserMessage.mock.calls[0];
|
|
191
|
+
expect(queued.content).toBe(
|
|
192
|
+
'(Message by unknown user from Discord > G > #general)\nping'
|
|
193
|
+
);
|
|
194
|
+
});
|
|
195
|
+
});
|
package/src/core/agentPool.js
CHANGED
|
@@ -1306,6 +1306,20 @@ class AgentPool {
|
|
|
1306
1306
|
await this.resumeAgent(agentId);
|
|
1307
1307
|
}
|
|
1308
1308
|
|
|
1309
|
+
// Clear any scheduler-enforced delay when the user explicitly addresses
|
|
1310
|
+
// the agent. Delays are set by the scheduler as a back-off for
|
|
1311
|
+
// rate-limit / network / api-key / builtin-tool-delay situations and
|
|
1312
|
+
// only make sense while the agent is left alone — a new user message is
|
|
1313
|
+
// an explicit signal to act NOW, and waiting out the remaining delay
|
|
1314
|
+
// would feel unresponsive. We clear the field and let the scheduler
|
|
1315
|
+
// pick the agent up on its next tick. Broadcast the state update so
|
|
1316
|
+
// the UI's delay chip disappears immediately.
|
|
1317
|
+
const hadDelay = !!(agent.delayEndTime && new Date(agent.delayEndTime).getTime() > Date.now());
|
|
1318
|
+
if (hadDelay) {
|
|
1319
|
+
agent.delayEndTime = null;
|
|
1320
|
+
this.logger.info(`Cleared scheduler delay for agent ${agentId} — user message takes precedence`);
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1309
1323
|
const queuedMessage = {
|
|
1310
1324
|
...message,
|
|
1311
1325
|
id: message.id || `user-msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
@@ -1323,6 +1337,16 @@ class AgentPool {
|
|
|
1323
1337
|
|
|
1324
1338
|
await this.persistAgentState(agentId);
|
|
1325
1339
|
|
|
1340
|
+
// If we cleared a delay, surface it on the WS so the delay chip in the
|
|
1341
|
+
// chat header disappears without waiting for the next scheduler cycle.
|
|
1342
|
+
if (hadDelay && this.scheduler?.broadcastAgentStateUpdate) {
|
|
1343
|
+
try {
|
|
1344
|
+
await this.scheduler.broadcastAgentStateUpdate(agentId, 'user-message-clears-delay');
|
|
1345
|
+
} catch (err) {
|
|
1346
|
+
this.logger.warn(`Failed to broadcast delay-clear for ${agentId}: ${err.message}`);
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1326
1350
|
this.logger.info(`User message queued for agent: ${agentId}`, {
|
|
1327
1351
|
messageId: queuedMessage.id,
|
|
1328
1352
|
queueSize: agent.messageQueues.userMessages.length
|
|
@@ -685,21 +685,32 @@ class AgentScheduler {
|
|
|
685
685
|
return;
|
|
686
686
|
}
|
|
687
687
|
|
|
688
|
-
// Check if this exact state was just processed (immediate duplicate)
|
|
689
|
-
if (loopDetection.isImmediateDuplicate) {
|
|
690
|
-
this.logger.debug(`Agent ${agentId} state unchanged from last iteration, skipping`, {
|
|
691
|
-
stateHash: currentStateHash,
|
|
692
|
-
agentMode: agent.mode
|
|
693
|
-
});
|
|
694
|
-
return; // Skip - nothing new to process
|
|
695
|
-
}
|
|
696
|
-
|
|
697
688
|
// Get message queue status
|
|
698
689
|
const queues = agent.messageQueues || {};
|
|
699
690
|
const totalMessages = (queues.toolResults?.length || 0) +
|
|
700
691
|
(queues.interAgentMessages?.length || 0) +
|
|
701
692
|
(queues.userMessages?.length || 0);
|
|
702
693
|
|
|
694
|
+
// Check if this exact state was just processed (immediate duplicate).
|
|
695
|
+
// The hash is computed from the agent's OUTPUT (last assistant
|
|
696
|
+
// messages) so when nothing new has been emitted since the previous
|
|
697
|
+
// cycle the hash repeats. But we must NOT skip when there is pending
|
|
698
|
+
// input queued — tool results, user messages, or inter-agent
|
|
699
|
+
// messages all change the effective "state" even though the output
|
|
700
|
+
// history looks the same. Without this guard, an agent that
|
|
701
|
+
// finishes a turn, gets tool results back, and then matches the
|
|
702
|
+
// prior hash stalls forever: processAgent returns early every
|
|
703
|
+
// cycle, the queued tool results never get consumed, no new
|
|
704
|
+
// assistant message is produced, hash never changes — perpetual
|
|
705
|
+
// skip. Starvation, not a loop.
|
|
706
|
+
if (loopDetection.isImmediateDuplicate && totalMessages === 0) {
|
|
707
|
+
this.logger.debug(`Agent ${agentId} state unchanged and no pending input, skipping`, {
|
|
708
|
+
stateHash: currentStateHash,
|
|
709
|
+
agentMode: agent.mode
|
|
710
|
+
});
|
|
711
|
+
return; // Skip - nothing new to process
|
|
712
|
+
}
|
|
713
|
+
|
|
703
714
|
// Log if user messages are present (highest priority)
|
|
704
715
|
if (queues.userMessages?.length > 0) {
|
|
705
716
|
this.logger.info(`User message detected for agent ${agentId} - will be prioritized`, {
|
|
@@ -12,6 +12,7 @@ import TagParser from '../utilities/tagParser.js';
|
|
|
12
12
|
import { TOOL_IDS, COMMAND_FORMATS } from '../utilities/toolConstants.js';
|
|
13
13
|
import { getVisualEditorBridge } from '../services/visualEditorBridge.js';
|
|
14
14
|
import { VisualEditorTool } from '../tools/visualEditorTool.js';
|
|
15
|
+
import { prependSourceHeader } from '../services/messageSource.js';
|
|
15
16
|
|
|
16
17
|
class MessageProcessor {
|
|
17
18
|
constructor(config, logger, toolsRegistry, agentPool, contextManager, aiService, modelRouterService = null, modelsService = null) {
|
|
@@ -132,6 +133,18 @@ class MessageProcessor {
|
|
|
132
133
|
this.logger.warn?.(`Failed to inject visual context: ${err.message}`);
|
|
133
134
|
}
|
|
134
135
|
|
|
136
|
+
// Prepend the source attribution header when the message arrived from
|
|
137
|
+
// an external channel (Discord / Telegram). The header is plain text
|
|
138
|
+
// of the form "(Message by alice from Discord > MyGuild > #ops)" and
|
|
139
|
+
// becomes part of the persisted content, so the agent sees it in its
|
|
140
|
+
// LLM context and the operator sees it in the web-UI transcript. The
|
|
141
|
+
// operation is idempotent — re-serialization (state restore, replay)
|
|
142
|
+
// won't double-prefix. Sources of kind web/api/internal produce no
|
|
143
|
+
// header and leave the content untouched. See services/messageSource.js.
|
|
144
|
+
if (context.source) {
|
|
145
|
+
enhancedMessage = prependSourceHeader(enhancedMessage, context.source);
|
|
146
|
+
}
|
|
147
|
+
|
|
135
148
|
await this.agentPool.addUserMessage(agentId, {
|
|
136
149
|
content: enhancedMessage,
|
|
137
150
|
role: 'user',
|
|
@@ -140,6 +153,10 @@ class MessageProcessor {
|
|
|
140
153
|
sessionId: context.sessionId,
|
|
141
154
|
visualContextInjected,
|
|
142
155
|
streamingEnabled: context.streamingEnabled !== false, // Pass streaming preference from context
|
|
156
|
+
// Preserve the structured source on the queued message too, so any
|
|
157
|
+
// downstream consumer (logs, analytics, relay) can reason about
|
|
158
|
+
// provenance without re-parsing the inline header.
|
|
159
|
+
source: context.source || null,
|
|
143
160
|
// Flow execution context (if this message is part of a flow)
|
|
144
161
|
isFlowExecution: context.isFlowExecution || false,
|
|
145
162
|
flowRunId: context.flowRunId,
|
package/src/core/orchestrator.js
CHANGED
|
@@ -388,7 +388,7 @@ class Orchestrator {
|
|
|
388
388
|
* @private
|
|
389
389
|
*/
|
|
390
390
|
async _handleSendMessage(request) {
|
|
391
|
-
const { agentId, message, mode, contextReferences, apiKey, customApiKeys, streamingEnabled } = request.payload;
|
|
391
|
+
const { agentId, message, mode, contextReferences, apiKey, customApiKeys, streamingEnabled, source } = request.payload;
|
|
392
392
|
|
|
393
393
|
const context = {
|
|
394
394
|
projectDir: request.projectDir,
|
|
@@ -398,7 +398,11 @@ class Orchestrator {
|
|
|
398
398
|
contextReferences: contextReferences || [],
|
|
399
399
|
apiKey: apiKey, // Pass Loxia API key through context
|
|
400
400
|
customApiKeys: customApiKeys || {}, // Pass custom API keys through context
|
|
401
|
-
streamingEnabled: streamingEnabled !== false // Default to true if not specified
|
|
401
|
+
streamingEnabled: streamingEnabled !== false, // Default to true if not specified
|
|
402
|
+
// Provenance metadata from the inbound adapter (Discord/Telegram/…).
|
|
403
|
+
// Preserved verbatim by messageProcessor and agentPool so the agent
|
|
404
|
+
// can see where the message came from. See services/messageSource.js.
|
|
405
|
+
source: source || null,
|
|
402
406
|
};
|
|
403
407
|
|
|
404
408
|
return await this.routeToAgent(agentId, message, context);
|
|
@@ -4862,6 +4862,32 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
4862
4862
|
}
|
|
4863
4863
|
});
|
|
4864
4864
|
|
|
4865
|
+
// DEBUG: manually fire a `visual_editor_open` broadcast so the UI's
|
|
4866
|
+
// panel-open path can be tested independently of the agent tool path.
|
|
4867
|
+
// Exercised via: POST /api/visual-editor/debug-broadcast { agentId, appUrl }.
|
|
4868
|
+
// This isolates the two failure surfaces when open-editor doesn't work —
|
|
4869
|
+
// either the backend never emits the WS event (bug in the tool / context /
|
|
4870
|
+
// webServer wiring) or the UI never reacts to it (bug in store / hook).
|
|
4871
|
+
this.app.post('/api/visual-editor/debug-broadcast', async (req, res) => {
|
|
4872
|
+
const { agentId, appUrl, editorUrl } = req.body || {};
|
|
4873
|
+
if (!agentId || !appUrl) {
|
|
4874
|
+
return res.status(400).json({ success: false, error: 'agentId and appUrl are required' });
|
|
4875
|
+
}
|
|
4876
|
+
try {
|
|
4877
|
+
this.broadcastToSession(null, {
|
|
4878
|
+
type: 'visual_editor_open',
|
|
4879
|
+
data: {
|
|
4880
|
+
agentId,
|
|
4881
|
+
appUrl,
|
|
4882
|
+
editorUrl: editorUrl || `http://localhost:4000?agentId=${agentId}&appUrl=${encodeURIComponent(appUrl)}`
|
|
4883
|
+
}
|
|
4884
|
+
});
|
|
4885
|
+
res.json({ success: true, message: 'visual_editor_open broadcast to all connections' });
|
|
4886
|
+
} catch (err) {
|
|
4887
|
+
res.status(500).json({ success: false, error: err.message });
|
|
4888
|
+
}
|
|
4889
|
+
});
|
|
4890
|
+
|
|
4865
4891
|
// Disconnect agent from visual editor (server keeps running)
|
|
4866
4892
|
this.app.post('/api/visual-editor/stop', async (req, res) => {
|
|
4867
4893
|
try {
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-module coherence: the aliases emitted by messageSource factories
|
|
3
|
+
* must compose correctly with channelFilter.resolveBlockTargets.
|
|
4
|
+
*
|
|
5
|
+
* This is the single test that catches "we renamed the alias format on one
|
|
6
|
+
* side of the fence and forgot the other side" — the exact kind of quiet
|
|
7
|
+
* drift that turns source-awareness back into a ghost feature.
|
|
8
|
+
*
|
|
9
|
+
* The agent's contract is:
|
|
10
|
+
* 1. Read an attribution header like "(Message by alice from Discord > G > #ops)".
|
|
11
|
+
* 2. Look up the corresponding alias in the bridged-channels list it was given.
|
|
12
|
+
* 3. Write <external to="<alias>">…</external>.
|
|
13
|
+
* 4. The relay resolves that back to the concrete channel and sends the reply.
|
|
14
|
+
*
|
|
15
|
+
* Step 2 resolves to messageSource's alias output. Step 4 resolves through
|
|
16
|
+
* channelFilter.resolveBlockTargets. These tests assert the two agree.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { describe, test, expect } from '@jest/globals';
|
|
20
|
+
import {
|
|
21
|
+
createDiscordSource,
|
|
22
|
+
createTelegramSource,
|
|
23
|
+
} from '../messageSource.js';
|
|
24
|
+
import { resolveBlockTargets } from '../channelFilter.js';
|
|
25
|
+
|
|
26
|
+
describe('messageSource ↔ channelFilter alias coherence', () => {
|
|
27
|
+
test('Discord guild alias resolves when the agent addresses it verbatim', () => {
|
|
28
|
+
const src = createDiscordSource({
|
|
29
|
+
author: { username: 'alice' },
|
|
30
|
+
guild: { name: 'MyGuild' },
|
|
31
|
+
channel: { id: 'c1', name: 'ops', isThread: () => false },
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// The relay advertises bridged aliases in the same shape messageSource
|
|
35
|
+
// produces (both use `discord:#<name>`). Lock it in.
|
|
36
|
+
const ownedAliases = [src.alias];
|
|
37
|
+
const block = { to: [src.alias], text: 'reply' };
|
|
38
|
+
|
|
39
|
+
expect(resolveBlockTargets(block, ownedAliases)).toEqual([src.alias]);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('agent can use shorthand (#ops) and it still resolves via substring match', () => {
|
|
43
|
+
const src = createDiscordSource({
|
|
44
|
+
author: { username: 'alice' },
|
|
45
|
+
guild: { name: 'MyGuild' },
|
|
46
|
+
channel: { id: 'c1', name: 'ops', isThread: () => false },
|
|
47
|
+
});
|
|
48
|
+
// Agent sees "#ops" in the header path, writes a short `to="#ops"`.
|
|
49
|
+
// channelFilter's substring match should still find the canonical alias.
|
|
50
|
+
const block = { to: ['#ops'], text: 'reply' };
|
|
51
|
+
expect(resolveBlockTargets(block, [src.alias])).toEqual([src.alias]);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('guild-prefixed owned alias matches when agent addresses via channel shorthand', () => {
|
|
55
|
+
// The relay may advertise a guild-qualified alias (`discord:guild-123:#ops`)
|
|
56
|
+
// while the agent, reading the header path "Discord > MyGuild > #ops",
|
|
57
|
+
// writes the natural short form `to="#ops"`. channelFilter's endsWith
|
|
58
|
+
// path is what makes this pair compose — this locks that in.
|
|
59
|
+
const ownedAliases = ['discord:guild-123:#ops'];
|
|
60
|
+
const block = { to: ['#ops'], text: 'reply' };
|
|
61
|
+
expect(resolveBlockTargets(block, ownedAliases)).toEqual(ownedAliases);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('Telegram per-chat alias routes when owned alias set advertises it', () => {
|
|
65
|
+
const src = createTelegramSource({
|
|
66
|
+
message_id: 1,
|
|
67
|
+
chat: { id: 999, type: 'supergroup', title: 'Ops' },
|
|
68
|
+
from: { username: 'alice' },
|
|
69
|
+
});
|
|
70
|
+
const ownedAliases = [src.alias, 'telegram'];
|
|
71
|
+
const block = { to: [src.alias], text: 'reply' };
|
|
72
|
+
expect(resolveBlockTargets(block, ownedAliases)).toContain(src.alias);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('Telegram per-chat source alias DOES NOT wildcard-match bare owned "telegram"', () => {
|
|
76
|
+
// Regression guard on a tempting mistake. channelFilter matches "owned
|
|
77
|
+
// contains wanted", not the reverse. If the relay owns only 'telegram',
|
|
78
|
+
// an agent addressing `to="telegram:chat-999"` will NOT be routed there
|
|
79
|
+
// — by design. The agent is expected to use the alias advertised in its
|
|
80
|
+
// bridged-channel list (the system-prompt contract), not to invent
|
|
81
|
+
// narrower aliases from the header. Locking this in prevents accidental
|
|
82
|
+
// bidirectional-substring loosening of channelFilter later.
|
|
83
|
+
const src = createTelegramSource({
|
|
84
|
+
message_id: 1,
|
|
85
|
+
chat: { id: 999, type: 'supergroup', title: 'Ops' },
|
|
86
|
+
from: { username: 'alice' },
|
|
87
|
+
});
|
|
88
|
+
const ownedAliases = ['telegram'];
|
|
89
|
+
const block = { to: [src.alias], text: 'reply' };
|
|
90
|
+
expect(resolveBlockTargets(block, ownedAliases)).toEqual([]);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('default block (no to=) still broadcasts to every owned alias', () => {
|
|
94
|
+
// Regression guard: adding source-awareness must not change the meaning
|
|
95
|
+
// of an unaddressed <external> block. It remains "broadcast to every
|
|
96
|
+
// bridged channel," exactly as before.
|
|
97
|
+
const block = { to: null, text: 'broadcast' };
|
|
98
|
+
const owned = ['discord:#ops', 'telegram'];
|
|
99
|
+
expect(resolveBlockTargets(block, owned).sort()).toEqual(owned.sort());
|
|
100
|
+
});
|
|
101
|
+
});
|