onbuzz 4.7.0 → 4.7.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/scripts/debug-balance-probe.mjs +35 -0
- package/src/__tests__/autoUpdateConfig.test.js +48 -12
- package/src/core/__tests__/messageProcessor.sourceHeader.test.js +7 -2
- package/src/index.js +16 -0
- package/src/interfaces/__tests__/accountRoutes.test.js +60 -2
- package/src/interfaces/accountRoutes.js +155 -7
- package/src/interfaces/webServer.js +41 -5
- package/src/services/__tests__/channelRelay.integration.test.js +49 -12
- package/src/services/__tests__/messageSource.test.js +6 -2
- package/src/services/__tests__/telegramBlockParser.test.js +183 -0
- package/src/services/__tests__/telegramService.test.js +838 -0
- package/src/services/messageSource.js +11 -11
- package/src/services/telegramBlockParser.js +145 -0
- package/src/services/telegramService.js +1273 -431
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-BLo2-5GS.js +1 -0
- package/web-ui/build/static/abap-BjUneMMr.js +1 -0
- package/web-ui/build/static/abnf-CZTz-l7P.js +1 -0
- package/web-ui/build/static/abnf-ITJ5mkBo.js +1 -0
- package/web-ui/build/static/accesslog-Dj78lZOU.js +1 -0
- package/web-ui/build/static/actionscript-Chivtu59.js +1 -0
- package/web-ui/build/static/actionscript-CrvMFXnx.js +1 -0
- package/web-ui/build/static/ada-DdJtyoYe.js +1 -0
- package/web-ui/build/static/ada-GIvogaLi.js +1 -0
- package/web-ui/build/static/agda-DbPp4fQi.js +1 -0
- package/web-ui/build/static/al-BZ24KwRS.js +1 -0
- package/web-ui/build/static/angelscript-DzsFypYt.js +1 -0
- package/web-ui/build/static/antlr4-3qb4rD3S.js +1 -0
- package/web-ui/build/static/apache-DF0P5ZRm.js +1 -0
- package/web-ui/build/static/apacheconf-C8KuNf9c.js +1 -0
- package/web-ui/build/static/apex-CPV-DeVE.js +1 -0
- package/web-ui/build/static/apl-C60bVxxW.js +1 -0
- package/web-ui/build/static/applescript-uz0i0tu1.js +1 -0
- package/web-ui/build/static/applescript-xcPRUBia.js +1 -0
- package/web-ui/build/static/aql-CRh4IGkA.js +1 -0
- package/web-ui/build/static/arcade-CmLedeqc.js +1 -0
- package/web-ui/build/static/arduino-3pr1BvXB.js +1 -0
- package/web-ui/build/static/arduino-C2BejAip.js +1 -0
- package/web-ui/build/static/arff-DE6Wr9MU.js +1 -0
- package/web-ui/build/static/armasm-DXodTfP4.js +1 -0
- package/web-ui/build/static/asciidoc-BU2BDFme.js +1 -0
- package/web-ui/build/static/asciidoc-CgvtvdeC.js +1 -0
- package/web-ui/build/static/asm6502-BMuYCKmP.js +1 -0
- package/web-ui/build/static/asmatmel-Dwxzg4kq.js +1 -0
- package/web-ui/build/static/aspectj-XZIldIRI.js +1 -0
- package/web-ui/build/static/aspnet-UxY2bZ9O.js +1 -0
- package/web-ui/build/static/autohotkey-BdZoQT7s.js +1 -0
- package/web-ui/build/static/autohotkey-DLWs6p8o.js +1 -0
- package/web-ui/build/static/autoit-CxcZx_kh.js +1 -0
- package/web-ui/build/static/autoit-HY_BHh1p.js +1 -0
- package/web-ui/build/static/avisynth-4Q4be9zq.js +1 -0
- package/web-ui/build/static/avrasm-CFqVJML2.js +1 -0
- package/web-ui/build/static/avro-idl-DVTV2YZm.js +1 -0
- package/web-ui/build/static/awk-C1Udi4As.js +1 -0
- package/web-ui/build/static/axapta-B9lexIDC.js +1 -0
- package/web-ui/build/static/bash-DDZrx0R1.js +1 -0
- package/web-ui/build/static/bash-Uuijyc_K.js +1 -0
- package/web-ui/build/static/basic-B29QFWwp.js +1 -0
- package/web-ui/build/static/basic-DKDOc42O.js +1 -0
- package/web-ui/build/static/batch-CA3q9wRr.js +1 -0
- package/web-ui/build/static/bbcode-DkUDcqrp.js +1 -0
- package/web-ui/build/static/bicep-AHSQiVgQ.js +1 -0
- package/web-ui/build/static/birb-BsAnN1j3.js +1 -0
- package/web-ui/build/static/bison-BIq5-ZXo.js +1 -0
- package/web-ui/build/static/bnf-BexLm6hz.js +1 -0
- package/web-ui/build/static/bnf-Dm46EM5S.js +1 -0
- package/web-ui/build/static/brainfuck-CBG8MHhD.js +1 -0
- package/web-ui/build/static/brainfuck-DrHuUFVv.js +1 -0
- package/web-ui/build/static/brightscript-CoQ7s_l3.js +1 -0
- package/web-ui/build/static/bro-Cz5RmvoK.js +1 -0
- package/web-ui/build/static/bsl-C9wXomkX.js +1 -0
- package/web-ui/build/static/c-BZFEFWwC.js +1 -0
- package/web-ui/build/static/c-CfFWLEL7.js +1 -0
- package/web-ui/build/static/c-like-CvIii1QP.js +1 -0
- package/web-ui/build/static/cal-be-Dz3GC.js +1 -0
- package/web-ui/build/static/capnproto-Bcaxak1e.js +1 -0
- package/web-ui/build/static/ceylon-QH_iQXnW.js +1 -0
- package/web-ui/build/static/cfscript-BRgBlxCO.js +1 -0
- package/web-ui/build/static/chaiscript-DSBx5kyN.js +1 -0
- package/web-ui/build/static/cil-C90LIbge.js +1 -0
- package/web-ui/build/static/clean-D2X3fSKw.js +1 -0
- package/web-ui/build/static/clojure-CvKE0e-3.js +1 -0
- package/web-ui/build/static/clojure-Cy3Zg4vZ.js +1 -0
- package/web-ui/build/static/clojure-repl-D0kONHv2.js +1 -0
- package/web-ui/build/static/cmake-DIDVe3n_.js +1 -0
- package/web-ui/build/static/cmake-DPijEs9c.js +1 -0
- package/web-ui/build/static/cobol-BPEjLjGY.js +1 -0
- package/web-ui/build/static/coffeescript-CoSx9MQU.js +1 -0
- package/web-ui/build/static/coffeescript-L5CBXrnP.js +1 -0
- package/web-ui/build/static/concurnas-q5sXhVU4.js +1 -0
- package/web-ui/build/static/coq-BAEq82zI.js +1 -0
- package/web-ui/build/static/coq-BBgtQZwi.js +1 -0
- package/web-ui/build/static/cos-9FdwfBC5.js +1 -0
- package/web-ui/build/static/cpp-CYt8UYn2.js +1 -0
- package/web-ui/build/static/cpp-CZ2lOXlm.js +1 -0
- package/web-ui/build/static/crmsh-C_TZWkES.js +1 -0
- package/web-ui/build/static/crystal-BDf_0NDz.js +1 -0
- package/web-ui/build/static/crystal-BrTR9dGT.js +1 -0
- package/web-ui/build/static/csharp-BSBrba50.js +1 -0
- package/web-ui/build/static/csharp-Cerqyqbn.js +1 -0
- package/web-ui/build/static/cshtml-heNA_ya5.js +1 -0
- package/web-ui/build/static/csp-CJprtNTl.js +1 -0
- package/web-ui/build/static/csp-CyYfNNga.js +1 -0
- package/web-ui/build/static/css-ClMfqSLF.js +1 -0
- package/web-ui/build/static/css-extras-BRU-Fmfk.js +1 -0
- package/web-ui/build/static/csv-VxPQSCnT.js +1 -0
- package/web-ui/build/static/cypher-COR7lVoB.js +1 -0
- package/web-ui/build/static/d-CjJIoaqU.js +1 -0
- package/web-ui/build/static/d-DrTea74c.js +1 -0
- package/web-ui/build/static/dart-Dx1CtbrO.js +1 -0
- package/web-ui/build/static/dart-Kqlt_5Iy.js +1 -0
- package/web-ui/build/static/dataweave-DpoRPYaa.js +1 -0
- package/web-ui/build/static/dax-BdRNDjXh.js +1 -0
- package/web-ui/build/static/delphi-C6ZfxFVF.js +1 -0
- package/web-ui/build/static/dhall-DZrga6Gc.js +1 -0
- package/web-ui/build/static/diff-BuMvzPYe.js +1 -0
- package/web-ui/build/static/diff-DZYXzKCb.js +1 -0
- package/web-ui/build/static/django-D_vRowuc.js +1 -0
- package/web-ui/build/static/django-NYcglI2i.js +1 -0
- package/web-ui/build/static/dns-Cd7tDS1i.js +1 -0
- package/web-ui/build/static/dns-zone-file-C3-2vwxy.js +1 -0
- package/web-ui/build/static/docker-DQ7ZFefk.js +1 -0
- package/web-ui/build/static/dockerfile-BpU0w0F-.js +1 -0
- package/web-ui/build/static/dos-B1_ZGbVG.js +1 -0
- package/web-ui/build/static/dot-BGB_tXU7.js +1 -0
- package/web-ui/build/static/dsconfig-BbDxyV_e.js +1 -0
- package/web-ui/build/static/dts-BfjOjY8l.js +1 -0
- package/web-ui/build/static/dust-BdwQ-7T_.js +1 -0
- package/web-ui/build/static/ebnf-BQTMmaYU.js +1 -0
- package/web-ui/build/static/ebnf-BwwBWilG.js +1 -0
- package/web-ui/build/static/editorconfig-DWS4VSOM.js +1 -0
- package/web-ui/build/static/eiffel-DVvlc0AI.js +1 -0
- package/web-ui/build/static/ejs-DsD496m-.js +1 -0
- package/web-ui/build/static/elixir-CLxuo9eh.js +1 -0
- package/web-ui/build/static/elixir-Cnyg3Ezx.js +1 -0
- package/web-ui/build/static/elm-CMAIkLMI.js +1 -0
- package/web-ui/build/static/elm-DZBnlwPV.js +1 -0
- package/web-ui/build/static/erb-B5xezjly.js +1 -0
- package/web-ui/build/static/erb-CJr8Ab4S.js +1 -0
- package/web-ui/build/static/erlang-BKy_rMFs.js +1 -0
- package/web-ui/build/static/erlang-DtaEL15_.js +1 -0
- package/web-ui/build/static/erlang-repl-CC5OZ0oZ.js +1 -0
- package/web-ui/build/static/etlua-1AfbSbi_.js +1 -0
- package/web-ui/build/static/excel-AEWYaJMN.js +1 -0
- package/web-ui/build/static/excel-formula-DXCH31eV.js +1 -0
- package/web-ui/build/static/factor-BvZsNxRC.js +1 -0
- package/web-ui/build/static/false-Y69sPjTa.js +1 -0
- package/web-ui/build/static/firestore-security-rules-BAYXaIU_.js +1 -0
- package/web-ui/build/static/fix-D7wVox5L.js +1 -0
- package/web-ui/build/static/flix-xYG3kZl-.js +1 -0
- package/web-ui/build/static/flow-zBPh0c8a.js +1 -0
- package/web-ui/build/static/fortran-C7OgAOwk.js +1 -0
- package/web-ui/build/static/fortran-D7HqnRra.js +1 -0
- package/web-ui/build/static/fsharp-Dz8jq_YD.js +1 -0
- package/web-ui/build/static/fsharp-wem8e879.js +1 -0
- package/web-ui/build/static/ftl-BNZhFjQT.js +1 -0
- package/web-ui/build/static/gams-C0WL3JTk.js +1 -0
- package/web-ui/build/static/gap-C3QTJPj2.js +1 -0
- package/web-ui/build/static/gauss-HDeDt6Js.js +1 -0
- package/web-ui/build/static/gcode-B6xVa-Q4.js +1 -0
- package/web-ui/build/static/gcode-KfjFk59Y.js +1 -0
- package/web-ui/build/static/gdscript-CZWTW6OT.js +1 -0
- package/web-ui/build/static/gedcom-DGTBZtDe.js +1 -0
- package/web-ui/build/static/gherkin-BM2fti5q.js +1 -0
- package/web-ui/build/static/gherkin-BsD-keLP.js +1 -0
- package/web-ui/build/static/git-CwXnrvg5.js +1 -0
- package/web-ui/build/static/glsl-CEL-DKdu.js +1 -0
- package/web-ui/build/static/glsl-DClg1hhL.js +1 -0
- package/web-ui/build/static/gml-BuyC2nUx.js +1 -0
- package/web-ui/build/static/gml-CaV0fexF.js +1 -0
- package/web-ui/build/static/gn-RZ4XHU09.js +1 -0
- package/web-ui/build/static/go-2fZP5dFL.js +1 -0
- package/web-ui/build/static/go-B-2r4QAR.js +1 -0
- package/web-ui/build/static/go-module-DSWZUUGo.js +1 -0
- package/web-ui/build/static/golo-BLZaLyU5.js +1 -0
- package/web-ui/build/static/gradle--RLe7WtU.js +1 -0
- package/web-ui/build/static/graphql-Dersm5rs.js +1 -0
- package/web-ui/build/static/groovy-BhCtzyFe.js +1 -0
- package/web-ui/build/static/groovy-CvbHavu3.js +1 -0
- package/web-ui/build/static/haml-CQhB89Xl.js +1 -0
- package/web-ui/build/static/haml-CemWzAX2.js +1 -0
- package/web-ui/build/static/handlebars-B39jLKjQ.js +1 -0
- package/web-ui/build/static/handlebars-Cl4dI91M.js +1 -0
- package/web-ui/build/static/haskell-CO9Ug-Kw.js +1 -0
- package/web-ui/build/static/haskell-EXme4CFR.js +1 -0
- package/web-ui/build/static/haxe-BDkCyqBy.js +1 -0
- package/web-ui/build/static/haxe-ahczQlFA.js +1 -0
- package/web-ui/build/static/hcl-liOTbdHr.js +1 -0
- package/web-ui/build/static/hlsl-Bnkb1zrP.js +1 -0
- package/web-ui/build/static/hoon-DCXHuTNp.js +1 -0
- package/web-ui/build/static/hpkp-CPJOGDF_.js +1 -0
- package/web-ui/build/static/hsp-BdeT0enM.js +1 -0
- package/web-ui/build/static/hsts-BoIN2VGK.js +1 -0
- package/web-ui/build/static/htmlbars-B5Ruf2zT.js +1 -0
- package/web-ui/build/static/http-BacVzmeC.js +1 -0
- package/web-ui/build/static/http-DifjpER4.js +1 -0
- package/web-ui/build/static/hy-DQ-M6mjk.js +1 -0
- package/web-ui/build/static/ichigojam-CcVrpthd.js +1 -0
- package/web-ui/build/static/icon-B4N1Fnx2.js +1 -0
- package/web-ui/build/static/icu-message-format-aDIl6Oaf.js +1 -0
- package/web-ui/build/static/idris-DKvV6i27.js +1 -0
- package/web-ui/build/static/iecst-zqZH79Dw.js +1 -0
- package/web-ui/build/static/ignore-BBbP-u2O.js +1 -0
- package/web-ui/build/static/index-CkhVK4lF.js +1164 -0
- package/web-ui/build/static/index-Cm1gK3R7.css +1 -0
- package/web-ui/build/static/index-D9JNKR2k.js +13 -0
- package/web-ui/build/static/index-DqZhvIWG.js +1 -0
- package/web-ui/build/static/inform7-BwvEArfL.js +1 -0
- package/web-ui/build/static/inform7-YkPDg57k.js +1 -0
- package/web-ui/build/static/ini-DU4drXRb.js +1 -0
- package/web-ui/build/static/ini-OhDTn0L5.js +1 -0
- package/web-ui/build/static/io-4thQGR-r.js +1 -0
- package/web-ui/build/static/irpf90-BnhmotbX.js +1 -0
- package/web-ui/build/static/isbl-BKcWS-M5.js +1 -0
- package/web-ui/build/static/j-Bw6CUCl9.js +1 -0
- package/web-ui/build/static/java-8IzvJ-mZ.js +1 -0
- package/web-ui/build/static/java-_jaQp1m2.js +1 -0
- package/web-ui/build/static/javadoc-D6KaHkhq.js +1 -0
- package/web-ui/build/static/javadoclike-B-DnR3Tl.js +1 -0
- package/web-ui/build/static/javascript-CfOOSye9.js +1 -0
- package/web-ui/build/static/javastacktrace-DHyDfhlB.js +1 -0
- package/web-ui/build/static/jboss-cli-zEH5UaRS.js +1 -0
- package/web-ui/build/static/jexl-CRpgdJ2f.js +1 -0
- package/web-ui/build/static/jolie-C5S16-nE.js +1 -0
- package/web-ui/build/static/jq-Dy-2LJZM.js +1 -0
- package/web-ui/build/static/js-extras-CNfXr3kE.js +1 -0
- package/web-ui/build/static/js-templates-DCJ1syUw.js +1 -0
- package/web-ui/build/static/jsdoc-BamyoRCh.js +1 -0
- package/web-ui/build/static/json-Buz-eeND.js +1 -0
- package/web-ui/build/static/json-D4xr_AK1.js +1 -0
- package/web-ui/build/static/json5-CS3uAaJP.js +1 -0
- package/web-ui/build/static/jsonp-CmEAdOcH.js +1 -0
- package/web-ui/build/static/jsstacktrace-D35jXpCN.js +1 -0
- package/web-ui/build/static/jsx-DRMEK-Qn.js +1 -0
- package/web-ui/build/static/julia-BgYJV7ho.js +1 -0
- package/web-ui/build/static/julia-CRsGDmxp.js +1 -0
- package/web-ui/build/static/julia-repl-D0vTZKUn.js +1 -0
- package/web-ui/build/static/keepalived-BlhBatvM.js +1 -0
- package/web-ui/build/static/keyman-B_-J66sg.js +1 -0
- package/web-ui/build/static/kotlin-B7HqYBGK.js +1 -0
- package/web-ui/build/static/kotlin-CszxhoS4.js +1 -0
- package/web-ui/build/static/kumir-B_wpMfXS.js +1 -0
- package/web-ui/build/static/kusto-BrHkOiE1.js +1 -0
- package/web-ui/build/static/lasso-xizuiq1s.js +1 -0
- package/web-ui/build/static/latex-62pryLTa.js +1 -0
- package/web-ui/build/static/latex-D7Tnbs2l.js +1 -0
- package/web-ui/build/static/latte-B_8xJj-y.js +1 -0
- package/web-ui/build/static/ldif-B69eIciC.js +1 -0
- package/web-ui/build/static/leaf-DPnh4k7N.js +1 -0
- package/web-ui/build/static/less-Bg3xuki-.js +1 -0
- package/web-ui/build/static/less-Cm-zhk4i.js +1 -0
- package/web-ui/build/static/lilypond-BFSXmrKQ.js +1 -0
- package/web-ui/build/static/liquid-D_jMXN_8.js +1 -0
- package/web-ui/build/static/lisp-CDWjXhWU.js +1 -0
- package/web-ui/build/static/lisp-DAu9fWrQ.js +1 -0
- package/web-ui/build/static/livecodeserver-BNgd6rBu.js +1 -0
- package/web-ui/build/static/livescript-C6sYNsdz.js +1 -0
- package/web-ui/build/static/livescript-CMOawYYt.js +1 -0
- package/web-ui/build/static/llvm-Yx2vcmJw.js +1 -0
- package/web-ui/build/static/llvm-w4vVb6qs.js +1 -0
- package/web-ui/build/static/log-CqhluDSP.js +1 -0
- package/web-ui/build/static/lolcode-Ck0rxP3x.js +1 -0
- package/web-ui/build/static/lsl-BwPX-Qjm.js +1 -0
- package/web-ui/build/static/lua-4H_Ijh4D.js +1 -0
- package/web-ui/build/static/lua-dDdlvQ6u.js +1 -0
- package/web-ui/build/static/magma-2nRRraug.js +1 -0
- package/web-ui/build/static/makefile-C887R9mV.js +1 -0
- package/web-ui/build/static/makefile-hlNtZePL.js +1 -0
- package/web-ui/build/static/markdown-DCALPnuW.js +1 -0
- package/web-ui/build/static/markdown-DGM_Z5tW.js +1 -0
- package/web-ui/build/static/marketplaceInstall-DbaC5Wr0.js +1 -0
- package/web-ui/build/static/markup-templating-PAvYDmBZ.js +1 -0
- package/web-ui/build/static/mathematica-CGL-Gomp.js +1 -0
- package/web-ui/build/static/matlab-C46ZZzlH.js +1 -0
- package/web-ui/build/static/matlab-WUgx8roJ.js +1 -0
- package/web-ui/build/static/maxima-Dd_TIy4H.js +1 -0
- package/web-ui/build/static/maxscript-f8SP9Ybn.js +1 -0
- package/web-ui/build/static/mel-6l2ZAh7F.js +1 -0
- package/web-ui/build/static/mel-BYdNMJzZ.js +1 -0
- package/web-ui/build/static/mercury-CdHf1buq.js +1 -0
- package/web-ui/build/static/mermaid-IRgUMtb1.js +1 -0
- package/web-ui/build/static/mipsasm-CRPpDKP4.js +1 -0
- package/web-ui/build/static/mizar-B4DBCLSi.js +1 -0
- package/web-ui/build/static/mizar-DiuZyDh7.js +1 -0
- package/web-ui/build/static/mojolicious-ChuQv8wb.js +1 -0
- package/web-ui/build/static/mongodb-CE5Epj0T.js +1 -0
- package/web-ui/build/static/monkey-BAz4pIwb.js +1 -0
- package/web-ui/build/static/monkey-i_g3gMkJ.js +1 -0
- package/web-ui/build/static/moonscript-BNaNpboV.js +1 -0
- package/web-ui/build/static/moonscript-uHlQVjxf.js +1 -0
- package/web-ui/build/static/n1ql-CBDLma2D.js +1 -0
- package/web-ui/build/static/n1ql-u4YLlLfk.js +1 -0
- package/web-ui/build/static/n4js-IVFjZEMP.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-Ba72aD32.js +1 -0
- package/web-ui/build/static/naniscript-CjMhybrb.js +1 -0
- package/web-ui/build/static/nasm-DjKhk70h.js +1 -0
- package/web-ui/build/static/neon-JEhMoh8P.js +1 -0
- package/web-ui/build/static/nevod-6tgpQVCA.js +1 -0
- package/web-ui/build/static/nginx-C6NwXcw_.js +1 -0
- package/web-ui/build/static/nginx-CquSTZbP.js +1 -0
- package/web-ui/build/static/nim-0bOOYxfL.js +1 -0
- package/web-ui/build/static/nim-aCQGMs_4.js +1 -0
- package/web-ui/build/static/nix-BV4kRCY_.js +1 -0
- package/web-ui/build/static/nix-FvSL2V8j.js +1 -0
- package/web-ui/build/static/node-repl-GtjTvb93.js +1 -0
- package/web-ui/build/static/nsis-DsftItKH.js +1 -0
- package/web-ui/build/static/nsis-pu7O80Pq.js +1 -0
- package/web-ui/build/static/objectivec-Bx7Bj0U_.js +1 -0
- package/web-ui/build/static/objectivec-GtO6Znp9.js +1 -0
- package/web-ui/build/static/ocaml-B71sR3qa.js +1 -0
- package/web-ui/build/static/ocaml-BlhoK75p.js +1 -0
- package/web-ui/build/static/opencl-40JZ6XXw.js +1 -0
- package/web-ui/build/static/openqasm-cDL6l7w3.js +1 -0
- package/web-ui/build/static/openscad-BQ0gNGv9.js +1 -0
- package/web-ui/build/static/oxygene-1fX2ftBa.js +1 -0
- package/web-ui/build/static/oz-Cgq2yQZq.js +1 -0
- package/web-ui/build/static/parigp-DfRO3DxU.js +1 -0
- package/web-ui/build/static/parser-hZcHrq-n.js +1 -0
- package/web-ui/build/static/parser3-Cf2p4Ryg.js +1 -0
- package/web-ui/build/static/pascal-C6tg_yvS.js +1 -0
- package/web-ui/build/static/pascaligo-9U9PdOS6.js +1 -0
- package/web-ui/build/static/pcaxis-B5EnEKrt.js +1 -0
- package/web-ui/build/static/peoplecode-Cf2sGzFJ.js +1 -0
- package/web-ui/build/static/perl-C9FNSHZx.js +1 -0
- package/web-ui/build/static/perl-uzSwl6wJ.js +1 -0
- package/web-ui/build/static/pf-C7Bjci1q.js +1 -0
- package/web-ui/build/static/pgsql-IBD1Cka7.js +1 -0
- package/web-ui/build/static/php-19XvqtTQ.js +1 -0
- package/web-ui/build/static/php-CUjVuQ1J.js +1 -0
- package/web-ui/build/static/php-extras-GWBU2Qbm.js +1 -0
- package/web-ui/build/static/php-template-Chtii014.js +1 -0
- package/web-ui/build/static/phpdoc-BLcJXgrV.js +1 -0
- package/web-ui/build/static/plaintext-BX3hHjdj.js +1 -0
- package/web-ui/build/static/plsql-tCcTmmsx.js +1 -0
- package/web-ui/build/static/pony-CKD16QkU.js +1 -0
- package/web-ui/build/static/powerquery-DXj7kqMe.js +1 -0
- package/web-ui/build/static/powershell-0jB2gvRR.js +1 -0
- package/web-ui/build/static/powershell-Ca6UjZV2.js +1 -0
- package/web-ui/build/static/processing-CPjwH4wc.js +1 -0
- package/web-ui/build/static/processing-ItKy7l8u.js +1 -0
- package/web-ui/build/static/profile-6N_Rzycx.js +1 -0
- package/web-ui/build/static/prolog-BV3TgLfG.js +1 -0
- package/web-ui/build/static/prolog-C5UoVyBz.js +1 -0
- package/web-ui/build/static/promql-CZot8Bw3.js +1 -0
- package/web-ui/build/static/properties-C_r_5f7N.js +1 -0
- package/web-ui/build/static/properties-qycKL1T0.js +1 -0
- package/web-ui/build/static/protobuf-BmdKEOw6.js +1 -0
- package/web-ui/build/static/protobuf-CxWC8PvT.js +1 -0
- package/web-ui/build/static/psl-CFSNRM7z.js +1 -0
- package/web-ui/build/static/pug-8dv12FtI.js +1 -0
- package/web-ui/build/static/puppet-CNjskGXn.js +1 -0
- package/web-ui/build/static/puppet-Cf6xZODN.js +1 -0
- package/web-ui/build/static/pure-exFir566.js +1 -0
- package/web-ui/build/static/purebasic-Bm6QaKku.js +1 -0
- package/web-ui/build/static/purebasic-lfzND9Qp.js +1 -0
- package/web-ui/build/static/purescript-D1xRYVQG.js +1 -0
- package/web-ui/build/static/python-DgkOjU0T.js +1 -0
- package/web-ui/build/static/python-o7BJVaX6.js +1 -0
- package/web-ui/build/static/python-repl-6SyonvH1.js +1 -0
- package/web-ui/build/static/q-CiQ2AFzU.js +1 -0
- package/web-ui/build/static/q-g7rEIWgm.js +1 -0
- package/web-ui/build/static/qml-ARc9Akfg.js +1 -0
- package/web-ui/build/static/qml-rVumxss_.js +1 -0
- package/web-ui/build/static/qore-CUXpqOSx.js +1 -0
- package/web-ui/build/static/qsharp-DMPNcgaz.js +1 -0
- package/web-ui/build/static/r-DCIo6joW.js +1 -0
- package/web-ui/build/static/r-nUBzz4LB.js +1 -0
- package/web-ui/build/static/racket--fPY_Q4o.js +1 -0
- package/web-ui/build/static/reason-CeVN9vJx.js +1 -0
- package/web-ui/build/static/reasonml-49SEasi3.js +1 -0
- package/web-ui/build/static/regex-BS97XMMk.js +1 -0
- package/web-ui/build/static/rego-Brc7DU11.js +1 -0
- package/web-ui/build/static/renpy-C2sPWAHv.js +1 -0
- package/web-ui/build/static/rest-DlZ7ycRe.js +1 -0
- package/web-ui/build/static/rib-C8WsA4on.js +1 -0
- package/web-ui/build/static/rip-dd9bS3Ar.js +1 -0
- package/web-ui/build/static/roboconf-CAEw-rS3.js +1 -0
- package/web-ui/build/static/roboconf-D0TfrLeu.js +1 -0
- package/web-ui/build/static/robotframework-CkgVY4bX.js +1 -0
- package/web-ui/build/static/routeros-DIek1v-Z.js +1 -0
- package/web-ui/build/static/rsl-DExhHtA1.js +1 -0
- package/web-ui/build/static/ruby-BjvzODgO.js +1 -0
- package/web-ui/build/static/ruby-Dflr1gcA.js +1 -0
- package/web-ui/build/static/ruleslanguage-BgzP6UBl.js +1 -0
- package/web-ui/build/static/rust-DxIro-GW.js +1 -0
- package/web-ui/build/static/rust-qWzP5Jcw.js +1 -0
- package/web-ui/build/static/sas-BrCJWU_w.js +1 -0
- package/web-ui/build/static/sas-itaOGZ-D.js +1 -0
- package/web-ui/build/static/sass-BTk1_hyU.js +1 -0
- package/web-ui/build/static/scala-DEtImhEo.js +1 -0
- package/web-ui/build/static/scala-DdZCH_nS.js +1 -0
- package/web-ui/build/static/scheme-CiOCQffl.js +1 -0
- package/web-ui/build/static/scheme-WaU-JPJX.js +1 -0
- package/web-ui/build/static/scilab-03tyg0ft.js +1 -0
- package/web-ui/build/static/scss-DXl2WSdH.js +1 -0
- package/web-ui/build/static/scss-movJ3vcX.js +1 -0
- package/web-ui/build/static/shell-DWmlNcrf.js +1 -0
- package/web-ui/build/static/shell-session-lHcfQbT0.js +1 -0
- package/web-ui/build/static/smali-7RKwn9RZ.js +1 -0
- package/web-ui/build/static/smali-TEMQ7bRM.js +1 -0
- package/web-ui/build/static/smalltalk-B_nVEfab.js +1 -0
- package/web-ui/build/static/smalltalk-BsA9wucb.js +1 -0
- package/web-ui/build/static/smarty-DSf4s_8v.js +1 -0
- package/web-ui/build/static/sml-BDO_Hmie.js +1 -0
- package/web-ui/build/static/sml-DKuy82zG.js +1 -0
- package/web-ui/build/static/solidity-jtWv6laA.js +1 -0
- package/web-ui/build/static/solution-file-DcfiquuJ.js +1 -0
- package/web-ui/build/static/soy-DmBVrDYd.js +1 -0
- package/web-ui/build/static/sparql-_JOxZ7fM.js +1 -0
- package/web-ui/build/static/splunk-spl-CHeBtp33.js +1 -0
- package/web-ui/build/static/sqf-9wI8rp5o.js +1 -0
- package/web-ui/build/static/sqf-BuKh30bG.js +1 -0
- package/web-ui/build/static/sql-ClFFHGMY.js +1 -0
- package/web-ui/build/static/sql-DVXtimpW.js +1 -0
- package/web-ui/build/static/sql_more-CNw-JJON.js +1 -0
- package/web-ui/build/static/squirrel-Bdi8LbT5.js +1 -0
- package/web-ui/build/static/stan-Brcz64A8.js +1 -0
- package/web-ui/build/static/stan-C9Q08Juk.js +1 -0
- package/web-ui/build/static/stata-ES8hryw_.js +1 -0
- package/web-ui/build/static/step21-Cfmoq4Lb.js +1 -0
- package/web-ui/build/static/stylus-DMKHLSvm.js +1 -0
- package/web-ui/build/static/stylus-Dcs8vyW2.js +1 -0
- package/web-ui/build/static/subunit-DRjv565H.js +1 -0
- package/web-ui/build/static/swift-0x_T9zx8.js +1 -0
- package/web-ui/build/static/swift-CUvpRg4a.js +1 -0
- package/web-ui/build/static/systemd-Dl8xGVv9.js +1 -0
- package/web-ui/build/static/t4-cs-DqvXuZwc.js +1 -0
- package/web-ui/build/static/t4-templating-DjN2N1uM.js +1 -0
- package/web-ui/build/static/t4-vb-CZQn9IVK.js +1 -0
- package/web-ui/build/static/taggerscript-CPCJkC2t.js +1 -0
- package/web-ui/build/static/tap-BPfuLhe7.js +1 -0
- package/web-ui/build/static/tap-CSdsd38Q.js +1 -0
- package/web-ui/build/static/tcl-4BqhAKLC.js +1 -0
- package/web-ui/build/static/tcl-Bh0Jg8jj.js +1 -0
- package/web-ui/build/static/textile-BiD4awlU.js +1 -0
- package/web-ui/build/static/thrift-Br1-10xh.js +1 -0
- package/web-ui/build/static/toml-QlLCqVpQ.js +1 -0
- package/web-ui/build/static/tp-B2Ef9EBz.js +1 -0
- package/web-ui/build/static/tremor-DuZdAfVr.js +1 -0
- package/web-ui/build/static/tsx-W3KEjccO.js +1 -0
- package/web-ui/build/static/tt2-D_tdF-56.js +1 -0
- package/web-ui/build/static/turtle-DxrQkFoq.js +1 -0
- package/web-ui/build/static/twig-DD44ApyU.js +1 -0
- package/web-ui/build/static/twig-vA3ZwAxn.js +1 -0
- package/web-ui/build/static/typescript-BfbcKNOu.js +1 -0
- package/web-ui/build/static/typescript-CvKtq1ix.js +1 -0
- package/web-ui/build/static/typoscript-BEu84JpE.js +1 -0
- package/web-ui/build/static/unrealscript-ohUNsJGM.js +1 -0
- package/web-ui/build/static/uorazor-BWer-chm.js +1 -0
- package/web-ui/build/static/uri-CPLTr_NY.js +1 -0
- package/web-ui/build/static/v-gAkMRmmI.js +1 -0
- package/web-ui/build/static/vala-Bktj5SNB.js +1 -0
- package/web-ui/build/static/vala-D1fDPFxI.js +1 -0
- package/web-ui/build/static/vbnet-Cn0g0ohh.js +1 -0
- package/web-ui/build/static/vbnet-TiYHF2WM.js +1 -0
- package/web-ui/build/static/vbscript-BUV-Kjvs.js +1 -0
- package/web-ui/build/static/vbscript-html-s1RgByjf.js +1 -0
- package/web-ui/build/static/velocity-DTy-TOwB.js +1 -0
- package/web-ui/build/static/verilog-4jk4MMXN.js +1 -0
- package/web-ui/build/static/verilog-aR4U-DJX.js +1 -0
- package/web-ui/build/static/vhdl-D72XnBZR.js +1 -0
- package/web-ui/build/static/vhdl-DFdtG28B.js +1 -0
- package/web-ui/build/static/vim-BMqsbQ-a.js +1 -0
- package/web-ui/build/static/vim-Cc3UuKOs.js +1 -0
- package/web-ui/build/static/visual-basic-CyC2kNGV.js +1 -0
- package/web-ui/build/static/warpscript-DpKFeISB.js +1 -0
- package/web-ui/build/static/wasm-SPljCkFH.js +1 -0
- package/web-ui/build/static/web-idl-Cie2yHU9.js +1 -0
- package/web-ui/build/static/wiki-BfYfwsBk.js +1 -0
- package/web-ui/build/static/wolfram-Dgi1K2gQ.js +1 -0
- package/web-ui/build/static/wren-CFQxgLld.js +1 -0
- package/web-ui/build/static/x86asm-CBIt2r64.js +1 -0
- package/web-ui/build/static/xeora-e5JHDF1T.js +1 -0
- package/web-ui/build/static/xl-CPZe-czl.js +1 -0
- package/web-ui/build/static/xml-BEuPuoS1.js +1 -0
- package/web-ui/build/static/xml-doc-DTOJGYE2.js +1 -0
- package/web-ui/build/static/xojo-ByMSKdYJ.js +1 -0
- package/web-ui/build/static/xquery--5iaD5oE.js +1 -0
- package/web-ui/build/static/xquery-DJp5PXZo.js +1 -0
- package/web-ui/build/static/yaml-CH8EnM9M.js +1 -0
- package/web-ui/build/static/yaml-mKr8oN1v.js +1 -0
- package/web-ui/build/static/yang-Nqdvm2mQ.js +1 -0
- package/web-ui/build/static/zephir-BJZaDzrW.js +1 -0
- package/web-ui/build/static/zig-DRkhvZLn.js +1 -0
- package/web-ui/build/static/1c-D_MLuenD.js +0 -1
- package/web-ui/build/static/abap-BNvFMksw.js +0 -1
- package/web-ui/build/static/abnf-WlnRJIp2.js +0 -1
- package/web-ui/build/static/abnf-mx1Wbtnp.js +0 -1
- package/web-ui/build/static/accesslog-CJumJuuV.js +0 -1
- package/web-ui/build/static/actionscript-B6CbK7n7.js +0 -1
- package/web-ui/build/static/actionscript-DZ5xfmPr.js +0 -1
- package/web-ui/build/static/ada-CCVAXM0c.js +0 -1
- package/web-ui/build/static/ada-DtGkgqC4.js +0 -1
- package/web-ui/build/static/agda-gMFRTChb.js +0 -1
- package/web-ui/build/static/al-88fYQh4r.js +0 -1
- package/web-ui/build/static/angelscript-Bibc8YWJ.js +0 -1
- package/web-ui/build/static/antlr4-DgibPJaJ.js +0 -1
- package/web-ui/build/static/apache-_pZ-s8l6.js +0 -1
- package/web-ui/build/static/apacheconf-YDldOH3Q.js +0 -1
- package/web-ui/build/static/apex-CIj23tyF.js +0 -1
- package/web-ui/build/static/apl-DtRSC0Xv.js +0 -1
- package/web-ui/build/static/applescript-CKhcPsla.js +0 -1
- package/web-ui/build/static/applescript-DuJeHJ1r.js +0 -1
- package/web-ui/build/static/aql-BgmI8Ors.js +0 -1
- package/web-ui/build/static/arcade-BX83978b.js +0 -1
- package/web-ui/build/static/arduino-BVdatcJb.js +0 -1
- package/web-ui/build/static/arduino-h6ifuWka.js +0 -1
- package/web-ui/build/static/arff-DHmbMeIA.js +0 -1
- package/web-ui/build/static/armasm-DiDgI5h5.js +0 -1
- package/web-ui/build/static/asciidoc-CBro7xXU.js +0 -1
- package/web-ui/build/static/asciidoc-DRC2X4bq.js +0 -1
- package/web-ui/build/static/asm6502-53VLu0lq.js +0 -1
- package/web-ui/build/static/asmatmel-DlRHdXes.js +0 -1
- package/web-ui/build/static/aspectj-DTSWMNl9.js +0 -1
- package/web-ui/build/static/aspnet-DEUO05ai.js +0 -1
- package/web-ui/build/static/autohotkey-3gt8xVo-.js +0 -1
- package/web-ui/build/static/autohotkey-BWcbMbe_.js +0 -1
- package/web-ui/build/static/autoit-CackGf4X.js +0 -1
- package/web-ui/build/static/autoit-Dyf0FSt2.js +0 -1
- package/web-ui/build/static/avisynth-DfCuxmn5.js +0 -1
- package/web-ui/build/static/avrasm-DdDiRWhx.js +0 -1
- package/web-ui/build/static/avro-idl-DppsvvwR.js +0 -1
- package/web-ui/build/static/awk-Cjk3U-Y4.js +0 -1
- package/web-ui/build/static/axapta-WwnY3TVf.js +0 -1
- package/web-ui/build/static/bash-C5Xkqken.js +0 -1
- package/web-ui/build/static/bash-ckPXa-RG.js +0 -1
- package/web-ui/build/static/basic-BCVHqHd2.js +0 -1
- package/web-ui/build/static/basic-D0dZbGrs.js +0 -1
- package/web-ui/build/static/batch-DUo60tbI.js +0 -1
- package/web-ui/build/static/bbcode-BVzBKrPV.js +0 -1
- package/web-ui/build/static/bicep-DkTjKL2N.js +0 -1
- package/web-ui/build/static/birb-C0rKI0h6.js +0 -1
- package/web-ui/build/static/bison-ChzwcDVc.js +0 -1
- package/web-ui/build/static/bnf-COhTgjpr.js +0 -1
- package/web-ui/build/static/bnf-DUYKVI2p.js +0 -1
- package/web-ui/build/static/brainfuck-BBJLbMxW.js +0 -1
- package/web-ui/build/static/brainfuck-DufOqE73.js +0 -1
- package/web-ui/build/static/brightscript-DXhkwfCc.js +0 -1
- package/web-ui/build/static/bro-BOFEsT-K.js +0 -1
- package/web-ui/build/static/bsl-ClV9GpNm.js +0 -1
- package/web-ui/build/static/c-Cl_3N1WB.js +0 -1
- package/web-ui/build/static/c-D0hFoAJ3.js +0 -1
- package/web-ui/build/static/c-like-D4BQ8VhL.js +0 -1
- package/web-ui/build/static/cal-CVIQ5DKG.js +0 -1
- package/web-ui/build/static/capnproto-l7oAqnCr.js +0 -1
- package/web-ui/build/static/ceylon-BEhCsFMw.js +0 -1
- package/web-ui/build/static/cfscript-DMh-xvVk.js +0 -1
- package/web-ui/build/static/chaiscript-DCvDoIGS.js +0 -1
- package/web-ui/build/static/cil-Ccn-j3TB.js +0 -1
- package/web-ui/build/static/clean-CjrEwcC-.js +0 -1
- package/web-ui/build/static/clojure-Dgo-8qFd.js +0 -1
- package/web-ui/build/static/clojure-M1AknfQi.js +0 -1
- package/web-ui/build/static/clojure-repl-BY1VLOSH.js +0 -1
- package/web-ui/build/static/cmake-CdHJ7Mp0.js +0 -1
- package/web-ui/build/static/cmake-DDGvi7kU.js +0 -1
- package/web-ui/build/static/cobol-BdrXYRxi.js +0 -1
- package/web-ui/build/static/coffeescript-BMDvMAy2.js +0 -1
- package/web-ui/build/static/coffeescript-CAYcMTRg.js +0 -1
- package/web-ui/build/static/concurnas-B8vcX0ec.js +0 -1
- package/web-ui/build/static/coq-CqvluN1S.js +0 -1
- package/web-ui/build/static/coq-vhnnRdWb.js +0 -1
- package/web-ui/build/static/cos-DY4p0y_u.js +0 -1
- package/web-ui/build/static/cpp-C3m_aEUX.js +0 -1
- package/web-ui/build/static/cpp-DRs9bbEm.js +0 -1
- package/web-ui/build/static/crmsh-CY6InunC.js +0 -1
- package/web-ui/build/static/crystal-Cwk1figA.js +0 -1
- package/web-ui/build/static/crystal-DeCJ5Pz7.js +0 -1
- package/web-ui/build/static/csharp-WmvubeKF.js +0 -1
- package/web-ui/build/static/csharp-zL1j7hXr.js +0 -1
- package/web-ui/build/static/cshtml-CbvGCaf_.js +0 -1
- package/web-ui/build/static/csp-BH2nxxKs.js +0 -1
- package/web-ui/build/static/csp-CHlC7KoB.js +0 -1
- package/web-ui/build/static/css-_X0ZO87y.js +0 -1
- package/web-ui/build/static/css-extras-wgFh56PY.js +0 -1
- package/web-ui/build/static/csv-momqe7r6.js +0 -1
- package/web-ui/build/static/cypher-hOeHFCfk.js +0 -1
- package/web-ui/build/static/d-B3d-tfyQ.js +0 -1
- package/web-ui/build/static/d-C6iyl9wX.js +0 -1
- package/web-ui/build/static/dart-BDKSE6LE.js +0 -1
- package/web-ui/build/static/dart-Bjchg8qI.js +0 -1
- package/web-ui/build/static/dataweave-ZgvdD-pH.js +0 -1
- package/web-ui/build/static/dax-yfGYNpUh.js +0 -1
- package/web-ui/build/static/delphi-CRLCdiTE.js +0 -1
- package/web-ui/build/static/dhall-yl1p1XUr.js +0 -1
- package/web-ui/build/static/diff-5SMtcFK7.js +0 -1
- package/web-ui/build/static/diff-y2RTBWsQ.js +0 -1
- package/web-ui/build/static/django-CtjG6w9L.js +0 -1
- package/web-ui/build/static/django-DNXOxI3v.js +0 -1
- package/web-ui/build/static/dns-D7Czwn_S.js +0 -1
- package/web-ui/build/static/dns-zone-file-D3yPxpjz.js +0 -1
- package/web-ui/build/static/docker-CWC5NqQQ.js +0 -1
- package/web-ui/build/static/dockerfile-CKFBVY9d.js +0 -1
- package/web-ui/build/static/dos-B7gYphQ-.js +0 -1
- package/web-ui/build/static/dot-BsisNMX4.js +0 -1
- package/web-ui/build/static/dsconfig-CEWwz7T6.js +0 -1
- package/web-ui/build/static/dts-UM5u5dMt.js +0 -1
- package/web-ui/build/static/dust-DlPmuh4d.js +0 -1
- package/web-ui/build/static/ebnf-BE6vq-fo.js +0 -1
- package/web-ui/build/static/ebnf-Czd8moGp.js +0 -1
- package/web-ui/build/static/editorconfig-Ctn83uRn.js +0 -1
- package/web-ui/build/static/eiffel-CZP01HVF.js +0 -1
- package/web-ui/build/static/ejs-BAXhrtLI.js +0 -1
- package/web-ui/build/static/elixir-C9PFjTwP.js +0 -1
- package/web-ui/build/static/elixir-DMjZPYCh.js +0 -1
- package/web-ui/build/static/elm-BH_KfOxJ.js +0 -1
- package/web-ui/build/static/elm-DRnNerE2.js +0 -1
- package/web-ui/build/static/erb-BhzUuTTy.js +0 -1
- package/web-ui/build/static/erb-DNbmX3N2.js +0 -1
- package/web-ui/build/static/erlang-BBPIw_V_.js +0 -1
- package/web-ui/build/static/erlang-BWdcSiKs.js +0 -1
- package/web-ui/build/static/erlang-repl-DQ9I6Dh_.js +0 -1
- package/web-ui/build/static/etlua-BeVNUecy.js +0 -1
- package/web-ui/build/static/excel-DYFvX5ms.js +0 -1
- package/web-ui/build/static/excel-formula-BtiqixBz.js +0 -1
- package/web-ui/build/static/factor-BCHyN6XZ.js +0 -1
- package/web-ui/build/static/false-UDWS0Dzk.js +0 -1
- package/web-ui/build/static/firestore-security-rules-B1-wJ42j.js +0 -1
- package/web-ui/build/static/fix-DrXU-V21.js +0 -1
- package/web-ui/build/static/flix-BjF0RPW9.js +0 -1
- package/web-ui/build/static/flow-DovuDACs.js +0 -1
- package/web-ui/build/static/fortran-DOqQP_9c.js +0 -1
- package/web-ui/build/static/fortran-DPASe5gH.js +0 -1
- package/web-ui/build/static/fsharp-Ckup0uPw.js +0 -1
- package/web-ui/build/static/fsharp-DyfRmGjn.js +0 -1
- package/web-ui/build/static/ftl-Coj24bDj.js +0 -1
- package/web-ui/build/static/gams-GwREZQh1.js +0 -1
- package/web-ui/build/static/gap-B7d6Bkmk.js +0 -1
- package/web-ui/build/static/gauss-DrLvPj5Z.js +0 -1
- package/web-ui/build/static/gcode-40iTJ2U1.js +0 -1
- package/web-ui/build/static/gcode-CISHXDj4.js +0 -1
- package/web-ui/build/static/gdscript-DmopCB0R.js +0 -1
- package/web-ui/build/static/gedcom-LiECv7gg.js +0 -1
- package/web-ui/build/static/gherkin-CYp_kcve.js +0 -1
- package/web-ui/build/static/gherkin-C_QgMjxf.js +0 -1
- package/web-ui/build/static/git-CfTT-600.js +0 -1
- package/web-ui/build/static/glsl-DRFMhvlG.js +0 -1
- package/web-ui/build/static/glsl-PNmpuSn0.js +0 -1
- package/web-ui/build/static/gml-3qmqfrt3.js +0 -1
- package/web-ui/build/static/gml-BTCmr4y5.js +0 -1
- package/web-ui/build/static/gn-BX0L2dQ-.js +0 -1
- package/web-ui/build/static/go-BXYOf5mS.js +0 -1
- package/web-ui/build/static/go-BnvPVHID.js +0 -1
- package/web-ui/build/static/go-module-BsPBvEmG.js +0 -1
- package/web-ui/build/static/golo-B6l7i4bX.js +0 -1
- package/web-ui/build/static/gradle-9DvvuDBJ.js +0 -1
- package/web-ui/build/static/graphql-OcCfd-Bc.js +0 -1
- package/web-ui/build/static/groovy-B33LZAt0.js +0 -1
- package/web-ui/build/static/groovy-Uyg0ruyE.js +0 -1
- package/web-ui/build/static/haml-D_FDAM6q.js +0 -1
- package/web-ui/build/static/haml-DjG31i1A.js +0 -1
- package/web-ui/build/static/handlebars-BKPDMksf.js +0 -1
- package/web-ui/build/static/handlebars-PP4M-qJ8.js +0 -1
- package/web-ui/build/static/haskell-HD9Gv3Wo.js +0 -1
- package/web-ui/build/static/haskell-nUf9ckz5.js +0 -1
- package/web-ui/build/static/haxe-BSsJNrQU.js +0 -1
- package/web-ui/build/static/haxe-D7yTwhdv.js +0 -1
- package/web-ui/build/static/hcl-_dqjptFs.js +0 -1
- package/web-ui/build/static/hlsl-DKixrsyy.js +0 -1
- package/web-ui/build/static/hoon-Di28eQfV.js +0 -1
- package/web-ui/build/static/hpkp-CXYG9zoQ.js +0 -1
- package/web-ui/build/static/hsp-lYl9KN6o.js +0 -1
- package/web-ui/build/static/hsts-CaYq9R8-.js +0 -1
- package/web-ui/build/static/htmlbars-eoY2PWS6.js +0 -1
- package/web-ui/build/static/http-2DXUmN2h.js +0 -1
- package/web-ui/build/static/http-Yjic3oWm.js +0 -1
- package/web-ui/build/static/hy-DVImg5uG.js +0 -1
- package/web-ui/build/static/ichigojam-Bdk-szlv.js +0 -1
- package/web-ui/build/static/icon-BEs9UbI_.js +0 -1
- package/web-ui/build/static/icu-message-format-DMfiLVs5.js +0 -1
- package/web-ui/build/static/idris-meksg0Ce.js +0 -1
- package/web-ui/build/static/iecst-DMPBiTmw.js +0 -1
- package/web-ui/build/static/ignore-BOQ9ZPvw.js +0 -1
- package/web-ui/build/static/index-BSEOP86D.js +0 -1
- package/web-ui/build/static/index-Be9WvMkI.js +0 -1162
- package/web-ui/build/static/index-Cr9q1fNq.css +0 -1
- package/web-ui/build/static/index-CuZ_erP9.js +0 -13
- package/web-ui/build/static/inform7-CNqu8FhU.js +0 -1
- package/web-ui/build/static/inform7-Cvfrdb0X.js +0 -1
- package/web-ui/build/static/ini-4DHUSW37.js +0 -1
- package/web-ui/build/static/ini-BgZ18Nk6.js +0 -1
- package/web-ui/build/static/io-c519ulw2.js +0 -1
- package/web-ui/build/static/irpf90-Kzq81vn5.js +0 -1
- package/web-ui/build/static/isbl-CeBN_o-W.js +0 -1
- package/web-ui/build/static/j-BmSuFx5E.js +0 -1
- package/web-ui/build/static/java-BezG0JQd.js +0 -1
- package/web-ui/build/static/java-BxBhTA1D.js +0 -1
- package/web-ui/build/static/javadoc-b96LRy9-.js +0 -1
- package/web-ui/build/static/javadoclike-BTNVp6pR.js +0 -1
- package/web-ui/build/static/javascript-B75gzQUI.js +0 -1
- package/web-ui/build/static/javastacktrace-D4xVOdoe.js +0 -1
- package/web-ui/build/static/jboss-cli-DH30pghK.js +0 -1
- package/web-ui/build/static/jexl-DF2RGmtX.js +0 -1
- package/web-ui/build/static/jolie-BlwO_Eyn.js +0 -1
- package/web-ui/build/static/jq-C7YhIw1G.js +0 -1
- package/web-ui/build/static/js-extras-JVZxoi4Q.js +0 -1
- package/web-ui/build/static/js-templates-D1CnsXgJ.js +0 -1
- package/web-ui/build/static/jsdoc-vf63NOxo.js +0 -1
- package/web-ui/build/static/json-CiKwLA5O.js +0 -1
- package/web-ui/build/static/json-pgLQeaes.js +0 -1
- package/web-ui/build/static/json5-_HMAYh1c.js +0 -1
- package/web-ui/build/static/jsonp-BeHQpb2r.js +0 -1
- package/web-ui/build/static/jsstacktrace-nw21JEtY.js +0 -1
- package/web-ui/build/static/jsx-Nxt_XhcW.js +0 -1
- package/web-ui/build/static/julia-BFczE4HB.js +0 -1
- package/web-ui/build/static/julia-DeDNID0K.js +0 -1
- package/web-ui/build/static/julia-repl-CoPTZMue.js +0 -1
- package/web-ui/build/static/keepalived-DP1sFl1b.js +0 -1
- package/web-ui/build/static/keyman-CCQVTHgo.js +0 -1
- package/web-ui/build/static/kotlin-CdZP58gi.js +0 -1
- package/web-ui/build/static/kotlin-CzNKVbXq.js +0 -1
- package/web-ui/build/static/kumir-lPok55sq.js +0 -1
- package/web-ui/build/static/kusto-oLek_zqj.js +0 -1
- package/web-ui/build/static/lasso-BFOYENIx.js +0 -1
- package/web-ui/build/static/latex-BH6YJXW6.js +0 -1
- package/web-ui/build/static/latex-IweVcDOS.js +0 -1
- package/web-ui/build/static/latte-Cmzytj93.js +0 -1
- package/web-ui/build/static/ldif-Bp4o5m10.js +0 -1
- package/web-ui/build/static/leaf-BFbMre84.js +0 -1
- package/web-ui/build/static/less-BVpV_iBx.js +0 -1
- package/web-ui/build/static/less-vdx-pGtM.js +0 -1
- package/web-ui/build/static/lilypond-Da6mCtwg.js +0 -1
- package/web-ui/build/static/liquid-RVC3EWUf.js +0 -1
- package/web-ui/build/static/lisp-Bgt-EmTk.js +0 -1
- package/web-ui/build/static/lisp-E8gUigGo.js +0 -1
- package/web-ui/build/static/livecodeserver-DDFQieJg.js +0 -1
- package/web-ui/build/static/livescript-C7FEDmfm.js +0 -1
- package/web-ui/build/static/livescript-Cc5SDmvx.js +0 -1
- package/web-ui/build/static/llvm-C22gmUEJ.js +0 -1
- package/web-ui/build/static/llvm-CjnVIiX4.js +0 -1
- package/web-ui/build/static/log-duIQICZV.js +0 -1
- package/web-ui/build/static/lolcode-Chrz9tTZ.js +0 -1
- package/web-ui/build/static/lsl-D1sdqECW.js +0 -1
- package/web-ui/build/static/lua-BFoJUb0S.js +0 -1
- package/web-ui/build/static/lua-D8RyRvqw.js +0 -1
- package/web-ui/build/static/magma-Cb3OhPkH.js +0 -1
- package/web-ui/build/static/makefile-BoVTcm8r.js +0 -1
- package/web-ui/build/static/makefile-LpYbnzZi.js +0 -1
- package/web-ui/build/static/markdown-CtQc_FZV.js +0 -1
- package/web-ui/build/static/markdown-DKz9qNdH.js +0 -1
- package/web-ui/build/static/markup-templating-D4EP19Lc.js +0 -1
- package/web-ui/build/static/mathematica-CIjlHVkd.js +0 -1
- package/web-ui/build/static/matlab-2b895p29.js +0 -1
- package/web-ui/build/static/matlab-BuluE4GS.js +0 -1
- package/web-ui/build/static/maxima-BGR8Puew.js +0 -1
- package/web-ui/build/static/maxscript-B429y77A.js +0 -1
- package/web-ui/build/static/mel-CYh_3LnF.js +0 -1
- package/web-ui/build/static/mel-CbYDscql.js +0 -1
- package/web-ui/build/static/mercury-DOee0RcU.js +0 -1
- package/web-ui/build/static/mermaid-Bgnlfred.js +0 -1
- package/web-ui/build/static/mipsasm-CB-uene8.js +0 -1
- package/web-ui/build/static/mizar-7qF42uX5.js +0 -1
- package/web-ui/build/static/mizar-Clogrskx.js +0 -1
- package/web-ui/build/static/mojolicious-BSIpTTKj.js +0 -1
- package/web-ui/build/static/mongodb--rWzrKDS.js +0 -1
- package/web-ui/build/static/monkey-C0lS2_fv.js +0 -1
- package/web-ui/build/static/monkey-DvqsFbfK.js +0 -1
- package/web-ui/build/static/moonscript-D6zFHk1D.js +0 -1
- package/web-ui/build/static/moonscript-JTxm8n_4.js +0 -1
- package/web-ui/build/static/n1ql-BwY55fjF.js +0 -1
- package/web-ui/build/static/n1ql-D8h3fDkJ.js +0 -1
- package/web-ui/build/static/n4js-5XIl8zQT.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-C4b_TExX.js +0 -1
- package/web-ui/build/static/naniscript-h2vnytgY.js +0 -1
- package/web-ui/build/static/nasm-SJmR3Ebn.js +0 -1
- package/web-ui/build/static/neon-B7dnnKEh.js +0 -1
- package/web-ui/build/static/nevod-zunhA02o.js +0 -1
- package/web-ui/build/static/nginx-BR_D0je7.js +0 -1
- package/web-ui/build/static/nginx-Cf7oQt-G.js +0 -1
- package/web-ui/build/static/nim-D-MjIxvw.js +0 -1
- package/web-ui/build/static/nim-D6YOyDC-.js +0 -1
- package/web-ui/build/static/nix-DCZEZqSO.js +0 -1
- package/web-ui/build/static/nix-Dx16U5rS.js +0 -1
- package/web-ui/build/static/node-repl-P-vGpiQ7.js +0 -1
- package/web-ui/build/static/nsis-CjyZMgjR.js +0 -1
- package/web-ui/build/static/nsis-X8NQeZjE.js +0 -1
- package/web-ui/build/static/objectivec-BejNoH7m.js +0 -1
- package/web-ui/build/static/objectivec-CGy2F8n6.js +0 -1
- package/web-ui/build/static/ocaml-C15hcRxR.js +0 -1
- package/web-ui/build/static/ocaml-U7N8L5Z7.js +0 -1
- package/web-ui/build/static/opencl-Bkm-SovU.js +0 -1
- package/web-ui/build/static/openqasm-BOc5975b.js +0 -1
- package/web-ui/build/static/openscad-CRpFnhV_.js +0 -1
- package/web-ui/build/static/oxygene-eHBZbxHy.js +0 -1
- package/web-ui/build/static/oz-B6RWw36L.js +0 -1
- package/web-ui/build/static/parigp-rifRy-ff.js +0 -1
- package/web-ui/build/static/parser-C0HBjZDk.js +0 -1
- package/web-ui/build/static/parser3-DSK81uS5.js +0 -1
- package/web-ui/build/static/pascal-BWha02r-.js +0 -1
- package/web-ui/build/static/pascaligo-B5sQ2hGz.js +0 -1
- package/web-ui/build/static/pcaxis-B1HLYPhm.js +0 -1
- package/web-ui/build/static/peoplecode-C4FPD4Yt.js +0 -1
- package/web-ui/build/static/perl-CyNx_mIa.js +0 -1
- package/web-ui/build/static/perl-rKxEWgtc.js +0 -1
- package/web-ui/build/static/pf-DbL4T2HZ.js +0 -1
- package/web-ui/build/static/pgsql-BKrwbRTY.js +0 -1
- package/web-ui/build/static/php-Cbd5TyJ-.js +0 -1
- package/web-ui/build/static/php-extras-DoVpsRj3.js +0 -1
- package/web-ui/build/static/php-template-DvdLavxo.js +0 -1
- package/web-ui/build/static/php-wYQJLv7J.js +0 -1
- package/web-ui/build/static/phpdoc-DTzZ5d0C.js +0 -1
- package/web-ui/build/static/plaintext-BRfzJjyj.js +0 -1
- package/web-ui/build/static/plsql-BLiE3aGC.js +0 -1
- package/web-ui/build/static/pony-CzLDxYVb.js +0 -1
- package/web-ui/build/static/powerquery-BdGgwM1a.js +0 -1
- package/web-ui/build/static/powershell-Cxl47yK_.js +0 -1
- package/web-ui/build/static/powershell-DrOFoqBE.js +0 -1
- package/web-ui/build/static/processing-9GbETrF_.js +0 -1
- package/web-ui/build/static/processing-M8gRGxck.js +0 -1
- package/web-ui/build/static/profile-CpNlvCnw.js +0 -1
- package/web-ui/build/static/prolog-CKZzbIr9.js +0 -1
- package/web-ui/build/static/prolog-mmIPeMRS.js +0 -1
- package/web-ui/build/static/promql-sDn1PHGN.js +0 -1
- package/web-ui/build/static/properties-CMFMCgWo.js +0 -1
- package/web-ui/build/static/properties-DQUf7KOp.js +0 -1
- package/web-ui/build/static/protobuf-CeY2Q-pH.js +0 -1
- package/web-ui/build/static/protobuf-WpfASK2n.js +0 -1
- package/web-ui/build/static/psl-D2GfEOkk.js +0 -1
- package/web-ui/build/static/pug-OMqhtHt8.js +0 -1
- package/web-ui/build/static/puppet-B68-xib8.js +0 -1
- package/web-ui/build/static/puppet-DEWzLqRg.js +0 -1
- package/web-ui/build/static/pure-C_CchY8g.js +0 -1
- package/web-ui/build/static/purebasic-D6vSqsja.js +0 -1
- package/web-ui/build/static/purebasic-Dy_z6LTs.js +0 -1
- package/web-ui/build/static/purescript-1f1OoM-A.js +0 -1
- package/web-ui/build/static/python-BssLWmNd.js +0 -1
- package/web-ui/build/static/python-CbOivp-X.js +0 -1
- package/web-ui/build/static/python-repl-Dsbi7aBP.js +0 -1
- package/web-ui/build/static/q-BC6w8B4U.js +0 -1
- package/web-ui/build/static/q-Brd1mf_C.js +0 -1
- package/web-ui/build/static/qml-BG4KN74g.js +0 -1
- package/web-ui/build/static/qml-BW-AE2Ma.js +0 -1
- package/web-ui/build/static/qore-m870d7ZA.js +0 -1
- package/web-ui/build/static/qsharp-BC9vEXOd.js +0 -1
- package/web-ui/build/static/r-BQySF8sO.js +0 -1
- package/web-ui/build/static/r-Cur0B9lo.js +0 -1
- package/web-ui/build/static/racket-CiJlajVU.js +0 -1
- package/web-ui/build/static/reason-C3VZcXa9.js +0 -1
- package/web-ui/build/static/reasonml-CpaxZwMO.js +0 -1
- package/web-ui/build/static/regex-bY-o17az.js +0 -1
- package/web-ui/build/static/rego-WPkEW7us.js +0 -1
- package/web-ui/build/static/renpy-DQr5LC4O.js +0 -1
- package/web-ui/build/static/rest-qmfCQ86m.js +0 -1
- package/web-ui/build/static/rib-DYzEblkc.js +0 -1
- package/web-ui/build/static/rip-D-NWUqHZ.js +0 -1
- package/web-ui/build/static/roboconf-CVmdy543.js +0 -1
- package/web-ui/build/static/roboconf-Ray0NGMb.js +0 -1
- package/web-ui/build/static/robotframework-DlxPBTF_.js +0 -1
- package/web-ui/build/static/routeros-S_f-nuVM.js +0 -1
- package/web-ui/build/static/rsl-CHtR71Pc.js +0 -1
- package/web-ui/build/static/ruby-ByuU-3cy.js +0 -1
- package/web-ui/build/static/ruby-DOin939S.js +0 -1
- package/web-ui/build/static/ruleslanguage-zhFrFxeU.js +0 -1
- package/web-ui/build/static/rust-B606UvZv.js +0 -1
- package/web-ui/build/static/rust-BJMuS7if.js +0 -1
- package/web-ui/build/static/sas-Bzk_0rOu.js +0 -1
- package/web-ui/build/static/sas-C-C55Hy4.js +0 -1
- package/web-ui/build/static/sass-DKkkoHtH.js +0 -1
- package/web-ui/build/static/scala-BKlnHttP.js +0 -1
- package/web-ui/build/static/scala-IsJjjIKA.js +0 -1
- package/web-ui/build/static/scheme-Bq_tfrRE.js +0 -1
- package/web-ui/build/static/scheme-DiXFvLKG.js +0 -1
- package/web-ui/build/static/scilab-DVyT87si.js +0 -1
- package/web-ui/build/static/scss-BtDpAVzH.js +0 -1
- package/web-ui/build/static/scss-D8cn4aNM.js +0 -1
- package/web-ui/build/static/shell-YROU1_yo.js +0 -1
- package/web-ui/build/static/shell-session-D06UXOLk.js +0 -1
- package/web-ui/build/static/smali-B1Wl_1dD.js +0 -1
- package/web-ui/build/static/smali-D2R-11j_.js +0 -1
- package/web-ui/build/static/smalltalk-M2S1lL6Z.js +0 -1
- package/web-ui/build/static/smalltalk-OWg84676.js +0 -1
- package/web-ui/build/static/smarty-l1m-zZmR.js +0 -1
- package/web-ui/build/static/sml-B6gSTHMm.js +0 -1
- package/web-ui/build/static/sml-BKURhRNM.js +0 -1
- package/web-ui/build/static/solidity-BcrqESJt.js +0 -1
- package/web-ui/build/static/solution-file-BYpCOi9k.js +0 -1
- package/web-ui/build/static/soy-DOQhQ7Di.js +0 -1
- package/web-ui/build/static/sparql-BwiIX_wO.js +0 -1
- package/web-ui/build/static/splunk-spl-DuIl6XxN.js +0 -1
- package/web-ui/build/static/sqf-8cYPidUR.js +0 -1
- package/web-ui/build/static/sqf-n8nRTmXc.js +0 -1
- package/web-ui/build/static/sql-D0WSLeXV.js +0 -1
- package/web-ui/build/static/sql-D8KWxFl_.js +0 -1
- package/web-ui/build/static/sql_more-D3ozDsf6.js +0 -1
- package/web-ui/build/static/squirrel-C4U4fAL5.js +0 -1
- package/web-ui/build/static/stan-BbFEvT-l.js +0 -1
- package/web-ui/build/static/stan-CJ4ny6dZ.js +0 -1
- package/web-ui/build/static/stata-BKEkbqzD.js +0 -1
- package/web-ui/build/static/step21-52PURHjy.js +0 -1
- package/web-ui/build/static/stylus-buszfxDg.js +0 -1
- package/web-ui/build/static/stylus-y0WOYXDO.js +0 -1
- package/web-ui/build/static/subunit-DU_iInw0.js +0 -1
- package/web-ui/build/static/swift-1VeEUHZi.js +0 -1
- package/web-ui/build/static/swift-Iw0x_Dum.js +0 -1
- package/web-ui/build/static/systemd-BT_5EOz8.js +0 -1
- package/web-ui/build/static/t4-cs-DlHeFrua.js +0 -1
- package/web-ui/build/static/t4-templating-Bz3RFfzp.js +0 -1
- package/web-ui/build/static/t4-vb-BMG0Q3qg.js +0 -1
- package/web-ui/build/static/taggerscript-CxwafGpT.js +0 -1
- package/web-ui/build/static/tap-6QugbkZA.js +0 -1
- package/web-ui/build/static/tap-SB1ST166.js +0 -1
- package/web-ui/build/static/tcl-CpV5bsKx.js +0 -1
- package/web-ui/build/static/tcl-Dikgd33H.js +0 -1
- package/web-ui/build/static/textile-aPmNtrkM.js +0 -1
- package/web-ui/build/static/thrift-B4Snltg5.js +0 -1
- package/web-ui/build/static/toml-B8SfswHQ.js +0 -1
- package/web-ui/build/static/tp-CdO-cn9g.js +0 -1
- package/web-ui/build/static/tremor-CqqCLe4A.js +0 -1
- package/web-ui/build/static/tsx-Ck0ZDqEy.js +0 -1
- package/web-ui/build/static/tt2-BrqZXSkJ.js +0 -1
- package/web-ui/build/static/turtle-DpnSIzmN.js +0 -1
- package/web-ui/build/static/twig-B5Et_eTY.js +0 -1
- package/web-ui/build/static/twig-C3vsy99c.js +0 -1
- package/web-ui/build/static/typescript-DH7tzpeO.js +0 -1
- package/web-ui/build/static/typescript-s1qBbHGm.js +0 -1
- package/web-ui/build/static/typoscript-DD8499cq.js +0 -1
- package/web-ui/build/static/unrealscript-C1zerCVR.js +0 -1
- package/web-ui/build/static/uorazor-CtRNfzg2.js +0 -1
- package/web-ui/build/static/uri-CAfIv8vn.js +0 -1
- package/web-ui/build/static/v-B6_f9ZGJ.js +0 -1
- package/web-ui/build/static/vala-BIpejmrf.js +0 -1
- package/web-ui/build/static/vala-BYLjm9ih.js +0 -1
- package/web-ui/build/static/vbnet-DEW7adbx.js +0 -1
- package/web-ui/build/static/vbnet-D_CuPCaz.js +0 -1
- package/web-ui/build/static/vbscript-Do9hsQ_u.js +0 -1
- package/web-ui/build/static/vbscript-html-4bMQ0-FJ.js +0 -1
- package/web-ui/build/static/velocity-CQjo2-fz.js +0 -1
- package/web-ui/build/static/verilog-C-Xvd__o.js +0 -1
- package/web-ui/build/static/verilog-Dn1ZGsRG.js +0 -1
- package/web-ui/build/static/vhdl-DZ-dTOLA.js +0 -1
- package/web-ui/build/static/vhdl-bDNJfpa7.js +0 -1
- package/web-ui/build/static/vim-BDAo5YHC.js +0 -1
- package/web-ui/build/static/vim-ClkOafc3.js +0 -1
- package/web-ui/build/static/visual-basic-DXIeLZZ8.js +0 -1
- package/web-ui/build/static/warpscript-f7veA-3J.js +0 -1
- package/web-ui/build/static/wasm-TToDlmNk.js +0 -1
- package/web-ui/build/static/web-idl-CrrjMFQT.js +0 -1
- package/web-ui/build/static/wiki-aicisDW2.js +0 -1
- package/web-ui/build/static/wolfram-C_A80rAh.js +0 -1
- package/web-ui/build/static/wren-DkVyeDoy.js +0 -1
- package/web-ui/build/static/x86asm-fx1o_ltw.js +0 -1
- package/web-ui/build/static/xeora-D-uaDMXn.js +0 -1
- package/web-ui/build/static/xl-Dnyvb9_S.js +0 -1
- package/web-ui/build/static/xml-BGV0zG9K.js +0 -1
- package/web-ui/build/static/xml-doc-DOGLcenw.js +0 -1
- package/web-ui/build/static/xojo-B3Qgvb5A.js +0 -1
- package/web-ui/build/static/xquery-C-B5-0Q9.js +0 -1
- package/web-ui/build/static/xquery-KbuiAVhj.js +0 -1
- package/web-ui/build/static/yaml-CBWBoq6m.js +0 -1
- package/web-ui/build/static/yaml-IghlDZf6.js +0 -1
- package/web-ui/build/static/yang-CArp62P5.js +0 -1
- package/web-ui/build/static/zephir-DMLTJ9_9.js +0 -1
- package/web-ui/build/static/zig-CWG2311v.js +0 -1
package/package.json
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Standalone replica of accountRoutes.proxyToBackend, to figure out
|
|
2
|
+
// why the in-process call fails while my curl/node-fetch from the
|
|
3
|
+
// same machine succeed. Run with: node scripts/debug-balance-probe.mjs
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
|
|
6
|
+
const cfg = JSON.parse(readFileSync('config/default.json', 'utf8'));
|
|
7
|
+
const baseUrl = (cfg.backend?.baseUrl || 'https://autopilot-api.azurewebsites.net').replace(/\/$/, '');
|
|
8
|
+
|
|
9
|
+
// Pull JWT from the running server (same path /api/auth/status uses).
|
|
10
|
+
const jwt = await (await fetch('http://localhost:8080/api/auth/status')).json().then(d => d.jwt);
|
|
11
|
+
console.log('Using JWT len:', jwt?.length, 'against baseUrl:', baseUrl);
|
|
12
|
+
console.log();
|
|
13
|
+
|
|
14
|
+
async function proxyLike(path) {
|
|
15
|
+
const url = `${baseUrl}${path}`;
|
|
16
|
+
const t0 = Date.now();
|
|
17
|
+
try {
|
|
18
|
+
const res = await fetch(url, {
|
|
19
|
+
method: 'GET',
|
|
20
|
+
headers: {
|
|
21
|
+
'Authorization': `Bearer ${jwt}`,
|
|
22
|
+
'Content-Type': 'application/json',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
const text = await res.text();
|
|
26
|
+
let parsed; try { parsed = JSON.parse(text); } catch { parsed = { raw: text.slice(0, 200) }; }
|
|
27
|
+
console.log(`${path}: status=${res.status} ms=${Date.now() - t0} body=${JSON.stringify(parsed).slice(0, 200)}`);
|
|
28
|
+
} catch (err) {
|
|
29
|
+
console.log(`${path}: ERR ${err.message}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const p of ['/subscription/status', '/account/profile', '/auth/me', '/auth/apikeys']) {
|
|
34
|
+
await proxyLike(p);
|
|
35
|
+
}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tripwire
|
|
2
|
+
* Tripwire: the auto-update feature requires three things in
|
|
3
|
+
* package.json that are easy to lose in a dep refresh:
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
5
|
+
* 1. `update-notifier` in `dependencies` — drives the npm-CLI
|
|
6
|
+
* banner. Missing → dynamic import in updateNotifier.js
|
|
7
|
+
* silently no-ops (good fail-safe, but the banner disappears
|
|
8
|
+
* without any louder signal).
|
|
9
|
+
* 2. `electron-updater` in `optionalDependencies` — drives the
|
|
10
|
+
* Electron in-app update dialog. Missing → autoUpdate.js
|
|
11
|
+
* silently no-ops.
|
|
12
|
+
* 3. `build.publish` config — pointed at the GitHub Releases the
|
|
13
|
+
* Electron updater reads `latest.yml` from. Missing → the
|
|
14
|
+
* packaged Electron app never sees updates even when
|
|
15
|
+
* `electron-updater` is installed.
|
|
10
16
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
17
|
+
* Each is a silent failure on its own. Together they make the
|
|
18
|
+
* feature look "shipped" but actually inert. This test forces a
|
|
19
|
+
* loud CI signal when any of the three goes missing.
|
|
20
|
+
*
|
|
21
|
+
* If you INTENTIONALLY remove auto-update, change this test in the
|
|
22
|
+
* same commit and explain why in the diff. Don't just delete it.
|
|
13
23
|
*/
|
|
14
24
|
|
|
15
25
|
import { describe, test, expect } from '@jest/globals';
|
|
@@ -33,12 +43,38 @@ describe('package.json — auto-update presence', () => {
|
|
|
33
43
|
|
|
34
44
|
test('electron-builder has a publish provider configured', () => {
|
|
35
45
|
expect(pkg.build).toBeDefined();
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
const publishField = pkg.build.publish;
|
|
47
|
+
expect(Array.isArray(publishField) || (publishField && typeof publishField === 'object')).toBe(true);
|
|
48
|
+
const entries = Array.isArray(publishField) ? publishField : [publishField];
|
|
38
49
|
expect(entries.length).toBeGreaterThan(0);
|
|
39
|
-
// electron-updater requires a `provider` field on each publish entry.
|
|
40
50
|
for (const entry of entries) {
|
|
41
51
|
expect(entry.provider).toBeTruthy();
|
|
42
52
|
}
|
|
43
53
|
});
|
|
54
|
+
|
|
55
|
+
test('GitHub publish target points at a real owner+repo (not the boilerplate `your-org`/`your-repo`)', () => {
|
|
56
|
+
const entries = Array.isArray(pkg.build.publish) ? pkg.build.publish : [pkg.build.publish];
|
|
57
|
+
const github = entries.find(e => e.provider === 'github');
|
|
58
|
+
if (!github) return; // other providers (S3, etc.) are fine
|
|
59
|
+
expect(github.owner).toBeTruthy();
|
|
60
|
+
expect(github.repo).toBeTruthy();
|
|
61
|
+
// Common copy-paste placeholders.
|
|
62
|
+
expect(github.owner).not.toMatch(/^(your-org|TODO|placeholder)$/i);
|
|
63
|
+
expect(github.repo).not.toMatch(/^(your-repo|TODO|placeholder)$/i);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('update-notifier source file exists and is referenced by the CLI entry point', () => {
|
|
67
|
+
// Tripwire against accidental file deletion. The runtime is
|
|
68
|
+
// tolerant of missing dependencies (dynamic import), but if the
|
|
69
|
+
// wrapper FILE goes missing the import line crashes.
|
|
70
|
+
expect(() => readFileSync(join(REPO_ROOT, 'src/utilities/updateNotifier.js'), 'utf8')).not.toThrow();
|
|
71
|
+
const cliEntry = readFileSync(join(REPO_ROOT, 'bin/cli.js'), 'utf8');
|
|
72
|
+
expect(cliEntry).toMatch(/from\s+['"]\.\.\/src\/utilities\/updateNotifier\.js['"]/);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('electron autoUpdate source file exists and is referenced by electron/main.js', () => {
|
|
76
|
+
expect(() => readFileSync(join(REPO_ROOT, 'electron/autoUpdate.js'), 'utf8')).not.toThrow();
|
|
77
|
+
const mainEntry = readFileSync(join(REPO_ROOT, 'electron/main.js'), 'utf8');
|
|
78
|
+
expect(mainEntry).toMatch(/from\s+['"]\.\/autoUpdate\.js['"]/);
|
|
79
|
+
});
|
|
44
80
|
});
|
|
@@ -102,7 +102,12 @@ describe('MessageProcessor — source header injection', () => {
|
|
|
102
102
|
expect(queued.role).toBe('user');
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
test('Telegram private message → Telegram
|
|
105
|
+
test('Telegram private message → collapsed "from Telegram" header (no user/DM noise)', async () => {
|
|
106
|
+
// Telegram private chats have exactly one human; the full
|
|
107
|
+
// "Message by alice ... > DM" header is bloat that pushes content
|
|
108
|
+
// out of the agent's context window. We collapse it to a 2-word
|
|
109
|
+
// prefix instead. Group chats keep the full attribution — see
|
|
110
|
+
// messageSource.test.js for the group case.
|
|
106
111
|
const source = createTelegramSource({
|
|
107
112
|
message_id: 1,
|
|
108
113
|
chat: { id: 42, type: 'private' },
|
|
@@ -115,7 +120,7 @@ describe('MessageProcessor — source header injection', () => {
|
|
|
115
120
|
});
|
|
116
121
|
|
|
117
122
|
const [, queued] = agentPool.addUserMessage.mock.calls[0];
|
|
118
|
-
expect(queued.content).toBe('(
|
|
123
|
+
expect(queued.content).toBe('(from Telegram)\nstatus?');
|
|
119
124
|
expect(queued.source).toBe(source);
|
|
120
125
|
});
|
|
121
126
|
|
package/src/index.js
CHANGED
|
@@ -705,6 +705,22 @@ class LoxiaApplication {
|
|
|
705
705
|
this.telegramService.setAgentPool(this.agentPool);
|
|
706
706
|
this.telegramService.setWebSocketManager(webServer);
|
|
707
707
|
if (this.flowExecutor) this.telegramService.setFlowExecutor(this.flowExecutor);
|
|
708
|
+
// Backend URL + platform API key are needed for the voice-note
|
|
709
|
+
// → /llm/transcribe path. Without these, voice messages return
|
|
710
|
+
// a friendly "voice not configured" message and the user is
|
|
711
|
+
// told to type instead. Both come from the same sources the
|
|
712
|
+
// rest of the CLI's /api/* proxy code uses.
|
|
713
|
+
const backendBaseUrl = this.config?.backend?.baseUrl
|
|
714
|
+
|| webServer?.config?.backend?.baseUrl
|
|
715
|
+
|| null;
|
|
716
|
+
if (backendBaseUrl) this.telegramService.setBackendBaseUrl(backendBaseUrl);
|
|
717
|
+
// Pass a getter (not a snapshotted value) so the key is
|
|
718
|
+
// re-resolved on every transcribe call. This lets the user
|
|
719
|
+
// sign in AFTER boot — voice notes start working immediately
|
|
720
|
+
// without restarting the server.
|
|
721
|
+
this.telegramService.setPlatformApiKey(
|
|
722
|
+
() => this.apiKeyManager?.getKeysForRequest?.(null, { platformProvided: true })?.loxiaApiKey || null
|
|
723
|
+
);
|
|
708
724
|
// Let the scheduler query bridge-state per agent so it can inject
|
|
709
725
|
// the <external> routing guidance into system prompts only when the
|
|
710
726
|
// agent is actually addressable from Telegram.
|
|
@@ -148,7 +148,7 @@ describe('GET /api/account/profile', () => {
|
|
|
148
148
|
});
|
|
149
149
|
|
|
150
150
|
describe('GET /api/account/balance', () => {
|
|
151
|
-
test('
|
|
151
|
+
test('primary path: hits /subscription/status and returns body verbatim', async () => {
|
|
152
152
|
const fetchImpl = jest.fn().mockResolvedValue({
|
|
153
153
|
ok: true, status: 200,
|
|
154
154
|
text: async () => JSON.stringify({ balance: 12.34, plan: 'pro' }),
|
|
@@ -159,7 +159,65 @@ describe('GET /api/account/balance', () => {
|
|
|
159
159
|
const r = await fetch(`${baseUrl}/api/account/balance`);
|
|
160
160
|
const json = await r.json();
|
|
161
161
|
expect(json).toEqual({ balance: 12.34, plan: 'pro' });
|
|
162
|
-
expect(fetchImpl.mock.calls[0][0]).toBe(`${BACKEND_URL}/
|
|
162
|
+
expect(fetchImpl.mock.calls[0][0]).toBe(`${BACKEND_URL}/subscription/status`);
|
|
163
|
+
// Cascade short-circuits on first success — fallback endpoints
|
|
164
|
+
// are not contacted.
|
|
165
|
+
expect(fetchImpl).toHaveBeenCalledTimes(1);
|
|
166
|
+
} finally {
|
|
167
|
+
await stop(server);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test('cascade: falls back to /account/profile when /subscription/status fails', async () => {
|
|
172
|
+
const fetchImpl = jest.fn()
|
|
173
|
+
.mockResolvedValueOnce({ ok: false, status: 503, text: async () => JSON.stringify({ error: 'subs down' }) })
|
|
174
|
+
.mockResolvedValueOnce({ ok: true, status: 200, text: async () => JSON.stringify({ balance: 7.7, plan: 'free' }) });
|
|
175
|
+
const startServer = mountRouter({ fetchImpl });
|
|
176
|
+
const { server, baseUrl } = await startServer();
|
|
177
|
+
try {
|
|
178
|
+
const r = await fetch(`${baseUrl}/api/account/balance`);
|
|
179
|
+
const json = await r.json();
|
|
180
|
+
expect(json).toEqual({ balance: 7.7, plan: 'free' });
|
|
181
|
+
expect(fetchImpl.mock.calls[1][0]).toBe(`${BACKEND_URL}/account/profile`);
|
|
182
|
+
} finally {
|
|
183
|
+
await stop(server);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test('cascade: final fallback uses /auth/me when both fail; returns degraded:true', async () => {
|
|
188
|
+
const fetchImpl = jest.fn()
|
|
189
|
+
.mockResolvedValueOnce({ ok: false, status: 503, text: async () => JSON.stringify({ error: 'subs down' }) })
|
|
190
|
+
.mockResolvedValueOnce({ ok: false, status: 500, text: async () => JSON.stringify({ error: { message: 'ledger down', code: 'ECONNREFUSED' } }) })
|
|
191
|
+
.mockResolvedValueOnce({ ok: true, status: 200, text: async () => JSON.stringify({ user: { creditBalance: 5, accountType: 'free' } }) });
|
|
192
|
+
const startServer = mountRouter({ fetchImpl });
|
|
193
|
+
const { server, baseUrl } = await startServer();
|
|
194
|
+
try {
|
|
195
|
+
const r = await fetch(`${baseUrl}/api/account/balance`);
|
|
196
|
+
const json = await r.json();
|
|
197
|
+
expect(json.balance).toBe(5);
|
|
198
|
+
expect(json.plan).toBe('free');
|
|
199
|
+
expect(json.degraded).toBe(true);
|
|
200
|
+
// The reason field MUST be a string — not an object — so
|
|
201
|
+
// FE `title="..."` tooltips don't render "[object Object]".
|
|
202
|
+
expect(typeof json.reason).toBe('string');
|
|
203
|
+
expect(json.reason.length).toBeGreaterThan(0);
|
|
204
|
+
} finally {
|
|
205
|
+
await stop(server);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test('cascade: every upstream fails → returns degraded with null balance, never 5xx', async () => {
|
|
210
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
211
|
+
ok: false, status: 500, text: async () => JSON.stringify({ error: 'everything is broken' }),
|
|
212
|
+
});
|
|
213
|
+
const startServer = mountRouter({ fetchImpl });
|
|
214
|
+
const { server, baseUrl } = await startServer();
|
|
215
|
+
try {
|
|
216
|
+
const r = await fetch(`${baseUrl}/api/account/balance`);
|
|
217
|
+
expect(r.status).toBe(200); // ← graceful degrade, NOT 500
|
|
218
|
+
const json = await r.json();
|
|
219
|
+
expect(json.balance).toBeNull();
|
|
220
|
+
expect(json.degraded).toBe(true);
|
|
163
221
|
} finally {
|
|
164
222
|
await stop(server);
|
|
165
223
|
}
|
|
@@ -106,6 +106,40 @@ export function createAccountRouter({
|
|
|
106
106
|
const router = express.Router();
|
|
107
107
|
const baseUrl = backendBaseUrl.replace(/\/$/, '');
|
|
108
108
|
|
|
109
|
+
// Last-known-good balance cache, per JWT (so a fast user-switch
|
|
110
|
+
// doesn't show the previous user's balance). Stays in memory only —
|
|
111
|
+
// a server restart wipes it, by design: stale-on-disk balance would
|
|
112
|
+
// be more dangerous than no balance.
|
|
113
|
+
/** @type {Map<string, { balance: number, plan: string|null, savedAt: string }>} */
|
|
114
|
+
const balanceCache = new Map();
|
|
115
|
+
function cacheKey(jwt) {
|
|
116
|
+
if (!jwt) return null;
|
|
117
|
+
// Hash the JWT to keep memory footprint sane (JWTs are ~240 chars
|
|
118
|
+
// each). The hash is a fingerprint, not used as auth.
|
|
119
|
+
let h = 0; for (let i = 0; i < jwt.length; i++) { h = ((h << 5) - h + jwt.charCodeAt(i)) | 0; }
|
|
120
|
+
return String(h);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Coerce whatever the upstream put under `body.error` into a
|
|
125
|
+
* human-readable string. Different upstream services use different
|
|
126
|
+
* envelope shapes — string, `{message,code}`, or even nested objects.
|
|
127
|
+
* Always returns a string so the FE's `title="..."` tooltip never
|
|
128
|
+
* shows `[object Object]`.
|
|
129
|
+
*/
|
|
130
|
+
function extractErrorMessage(body) {
|
|
131
|
+
if (!body) return '';
|
|
132
|
+
const err = body.error;
|
|
133
|
+
if (typeof err === 'string') return err;
|
|
134
|
+
if (err && typeof err === 'object') {
|
|
135
|
+
if (typeof err.message === 'string') return err.message;
|
|
136
|
+
if (typeof err.code === 'string') return err.code;
|
|
137
|
+
try { return JSON.stringify(err); } catch { return ''; }
|
|
138
|
+
}
|
|
139
|
+
if (typeof body.message === 'string') return body.message;
|
|
140
|
+
return '';
|
|
141
|
+
}
|
|
142
|
+
|
|
109
143
|
/**
|
|
110
144
|
* Forward a request to the backend with the user's JWT. Returns a
|
|
111
145
|
* { status, body } tuple the route handlers can hand straight back
|
|
@@ -122,11 +156,13 @@ export function createAccountRouter({
|
|
|
122
156
|
}
|
|
123
157
|
const url = `${baseUrl}${path}`;
|
|
124
158
|
try {
|
|
159
|
+
const t0 = Date.now();
|
|
125
160
|
const res = await fetchImpl(url, {
|
|
126
161
|
method,
|
|
127
162
|
headers: {
|
|
128
163
|
'Authorization': `Bearer ${jwt}`,
|
|
129
164
|
'Content-Type': 'application/json',
|
|
165
|
+
'Connection': 'close',
|
|
130
166
|
},
|
|
131
167
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
132
168
|
});
|
|
@@ -135,12 +171,26 @@ export function createAccountRouter({
|
|
|
135
171
|
let parsed;
|
|
136
172
|
try { parsed = text ? JSON.parse(text) : {}; } catch { parsed = { raw: text }; }
|
|
137
173
|
|
|
174
|
+
// Per-request debug log so a flaky upstream is diagnosable
|
|
175
|
+
// without reproducing in a separate process. Worth the noise
|
|
176
|
+
// because the account proxy currently has an unsolved
|
|
177
|
+
// discrepancy: standalone Node script gets 200s, the in-process
|
|
178
|
+
// fetch gets 5xxs against the same URL with the same JWT.
|
|
179
|
+
logger?.info?.('[accountRoutes] upstream', {
|
|
180
|
+
url,
|
|
181
|
+
method,
|
|
182
|
+
status: res.status,
|
|
183
|
+
ms: Date.now() - t0,
|
|
184
|
+
bodyPreview: typeof text === 'string' ? text.slice(0, 200) : null,
|
|
185
|
+
contentType: res.headers?.get?.('content-type') || null,
|
|
186
|
+
});
|
|
187
|
+
|
|
138
188
|
if (!res.ok) {
|
|
139
189
|
return {
|
|
140
190
|
status: res.status,
|
|
141
191
|
body: {
|
|
142
192
|
success: false,
|
|
143
|
-
error: parsed
|
|
193
|
+
error: extractErrorMessage(parsed) || `Backend returned ${res.status}`,
|
|
144
194
|
code: res.status === 404 ? ERROR_CODES.NOT_FOUND : ERROR_CODES.BACKEND_ERROR,
|
|
145
195
|
},
|
|
146
196
|
};
|
|
@@ -159,6 +209,47 @@ export function createAccountRouter({
|
|
|
159
209
|
}
|
|
160
210
|
}
|
|
161
211
|
|
|
212
|
+
// ── Debug ──────────────────────────────────────────────────────────
|
|
213
|
+
// Temporary diagnostic route. Returns the raw responses from each
|
|
214
|
+
// upstream call the cascade makes so we can see in the browser why
|
|
215
|
+
// /balance falls through to degraded when standalone fetch from the
|
|
216
|
+
// same machine works fine. Remove when the balance issue is closed.
|
|
217
|
+
router.get('/_debug', async (_req, res) => {
|
|
218
|
+
const jwt = getJwt();
|
|
219
|
+
if (!jwt) return res.status(401).json({ error: 'not signed in' });
|
|
220
|
+
const probe = async (path) => {
|
|
221
|
+
const url = `${baseUrl}${path}`;
|
|
222
|
+
const t0 = Date.now();
|
|
223
|
+
try {
|
|
224
|
+
const r = await fetchImpl(url, {
|
|
225
|
+
method: 'GET',
|
|
226
|
+
headers: {
|
|
227
|
+
'Authorization': `Bearer ${jwt}`,
|
|
228
|
+
'Content-Type': 'application/json',
|
|
229
|
+
'Connection': 'close',
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
const text = await r.text();
|
|
233
|
+
return {
|
|
234
|
+
path, url, status: r.status, ms: Date.now() - t0,
|
|
235
|
+
contentType: r.headers?.get?.('content-type') || null,
|
|
236
|
+
bodyPreview: text.slice(0, 400),
|
|
237
|
+
};
|
|
238
|
+
} catch (err) {
|
|
239
|
+
return { path, url, ms: Date.now() - t0, error: err.message, errCode: err.code, errName: err.name };
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
res.json({
|
|
243
|
+
baseUrl,
|
|
244
|
+
jwtLen: jwt.length,
|
|
245
|
+
probes: await Promise.all([
|
|
246
|
+
probe('/subscription/status'),
|
|
247
|
+
probe('/account/profile'),
|
|
248
|
+
probe('/auth/me'),
|
|
249
|
+
]),
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
162
253
|
// ── Profile ────────────────────────────────────────────────────────
|
|
163
254
|
router.get('/profile', async (_req, res) => {
|
|
164
255
|
const r = await proxyToBackend('GET', '/auth/me');
|
|
@@ -172,13 +263,70 @@ export function createAccountRouter({
|
|
|
172
263
|
});
|
|
173
264
|
|
|
174
265
|
// ── Balance ────────────────────────────────────────────────────────
|
|
266
|
+
// Reads `{ plan, balance, ... }` from the backend.
|
|
267
|
+
//
|
|
268
|
+
// Endpoint cascade — first one that returns 2xx wins:
|
|
269
|
+
// 1. /subscription/status — returns { plan, balance, monthlyAllocation,
|
|
270
|
+
// subscriptionStatus, currentPeriodEnd }. Reads from User.creditBalance
|
|
271
|
+
// (cached / DB-direct) so it works even when the ledger is down.
|
|
272
|
+
// This is the PRIMARY because of that resilience.
|
|
273
|
+
// 2. /account/profile — bundles plan + balance from the ledger.
|
|
274
|
+
// Richer data, but 500s if LEDGER_SERVICE_URL is missing.
|
|
275
|
+
// 3. /auth/me — no balance, but at least we can return plan + null.
|
|
276
|
+
//
|
|
277
|
+
// The FE never sees an error here — degraded data + a `degraded: true`
|
|
278
|
+
// flag is the right UX, not an error toast.
|
|
175
279
|
router.get('/balance', async (_req, res) => {
|
|
176
|
-
//
|
|
177
|
-
//
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
280
|
+
// Balance is a per-user query — needs a JWT just like every other
|
|
281
|
+
// /api/account/* route. Early-exit with the same not_signed_in
|
|
282
|
+
// envelope so the FE branches the same way.
|
|
283
|
+
const jwt = getJwt();
|
|
284
|
+
if (!jwt) {
|
|
285
|
+
return res.status(401).json({
|
|
286
|
+
success: false,
|
|
287
|
+
error: 'Sign in to manage your account',
|
|
288
|
+
code: ERROR_CODES.NOT_SIGNED_IN,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
const ck = cacheKey(jwt);
|
|
292
|
+
|
|
293
|
+
const subscription = await proxyToBackend('GET', '/subscription/status');
|
|
294
|
+
if (subscription.status >= 200 && subscription.status < 300) {
|
|
295
|
+
const body = subscription.body || {};
|
|
296
|
+
if (typeof body.balance === 'number') {
|
|
297
|
+
balanceCache.set(ck, { balance: body.balance, plan: body.plan || null, savedAt: new Date().toISOString() });
|
|
298
|
+
}
|
|
299
|
+
return res.status(subscription.status).json(body);
|
|
300
|
+
}
|
|
301
|
+
const profile = await proxyToBackend('GET', '/account/profile');
|
|
302
|
+
if (profile.status >= 200 && profile.status < 300) {
|
|
303
|
+
const body = profile.body || {};
|
|
304
|
+
if (typeof body.balance === 'number') {
|
|
305
|
+
balanceCache.set(ck, { balance: body.balance, plan: body.plan || body.accountType || null, savedAt: new Date().toISOString() });
|
|
306
|
+
}
|
|
307
|
+
return res.status(profile.status).json(body);
|
|
308
|
+
}
|
|
309
|
+
// Both balance-bearing endpoints failed. Hand back the last-known
|
|
310
|
+
// good value (if any) with a `stale: true` flag so the FE shows a
|
|
311
|
+
// number instead of "— CP". The user still gets a visual cue that
|
|
312
|
+
// it might not be current.
|
|
313
|
+
const cached = balanceCache.get(ck);
|
|
314
|
+
const me = await proxyToBackend('GET', '/auth/me');
|
|
315
|
+
const u = me.status >= 200 && me.status < 300 ? (me.body?.user || me.body || {}) : {};
|
|
316
|
+
|
|
317
|
+
// The internal ECONNREFUSED string is useful for debugging but
|
|
318
|
+
// not for users — log it once at warn, surface a friendly reason.
|
|
319
|
+
const technical = extractErrorMessage(subscription.body) || extractErrorMessage(profile.body) || '';
|
|
320
|
+
if (technical) logger?.warn?.('[accountRoutes] balance degraded', { technical });
|
|
321
|
+
|
|
322
|
+
res.json({
|
|
323
|
+
balance: cached ? cached.balance : (typeof u.creditBalance === 'number' ? u.creditBalance : null),
|
|
324
|
+
plan: cached?.plan || u.accountType || null,
|
|
325
|
+
degraded: true,
|
|
326
|
+
stale: !!cached,
|
|
327
|
+
lastUpdatedAt: cached?.savedAt || null,
|
|
328
|
+
reason: 'Balance service is temporarily unavailable',
|
|
329
|
+
});
|
|
182
330
|
});
|
|
183
331
|
|
|
184
332
|
// ── API keys list ──────────────────────────────────────────────────
|
|
@@ -961,7 +961,17 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
961
961
|
});
|
|
962
962
|
|
|
963
963
|
// Auth resolve — resolve user account from an existing API key by calling the remote backend
|
|
964
|
-
// This enables "API key → account auto-link" without requiring a full OAuth login
|
|
964
|
+
// This enables "API key → account auto-link" without requiring a full OAuth login.
|
|
965
|
+
//
|
|
966
|
+
// Preferred path: POST /auth/mint-jwt-from-apikey, which returns
|
|
967
|
+
// {token, user} in one round-trip. We cache the JWT so subsequent
|
|
968
|
+
// /api/account/* calls (which require a JWT, not an API key) work
|
|
969
|
+
// without forcing the user through OAuth.
|
|
970
|
+
//
|
|
971
|
+
// Fallback path: GET /auth/me — used when the backend predates
|
|
972
|
+
// the mint endpoint (older deployment). User is still cached but
|
|
973
|
+
// no JWT is minted; /api/account/* will be unavailable until the
|
|
974
|
+
// user does a real OAuth login.
|
|
965
975
|
this.app.get('/api/auth/resolve', async (req, res) => {
|
|
966
976
|
try {
|
|
967
977
|
const loxiaApiKey = this.apiKeyManager?.getKeysForRequest?.(null, { platformProvided: true })?.loxiaApiKey;
|
|
@@ -970,6 +980,34 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
970
980
|
}
|
|
971
981
|
|
|
972
982
|
const backendBaseUrl = this.config?.backend?.baseUrl || 'https://autopilot-api.azurewebsites.net';
|
|
983
|
+
|
|
984
|
+
// Preferred: mint a session JWT alongside the user lookup.
|
|
985
|
+
try {
|
|
986
|
+
const mintResp = await fetch(`${backendBaseUrl}/auth/mint-jwt-from-apikey`, {
|
|
987
|
+
method: 'POST',
|
|
988
|
+
headers: { 'Authorization': `Bearer ${loxiaApiKey}` },
|
|
989
|
+
});
|
|
990
|
+
if (mintResp.ok) {
|
|
991
|
+
const data = await mintResp.json();
|
|
992
|
+
const user = data.user;
|
|
993
|
+
const jwt = data.token;
|
|
994
|
+
if (user && jwt) {
|
|
995
|
+
await this._setLastAuthResult(recordOAuthResult({
|
|
996
|
+
user,
|
|
997
|
+
jwt,
|
|
998
|
+
hasApiKey: true,
|
|
999
|
+
}));
|
|
1000
|
+
return res.json({ success: true, user, mintedJwt: true });
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
// 404 from older backends → fall through to /auth/me; other
|
|
1004
|
+
// non-2xx → also fall through (the user record is still
|
|
1005
|
+
// worth caching even if we couldn't mint a JWT).
|
|
1006
|
+
} catch (mintErr) {
|
|
1007
|
+
this.logger?.warn('mint-jwt-from-apikey failed; falling back to /auth/me', { error: mintErr.message });
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
// Fallback: just identify the user, no JWT.
|
|
973
1011
|
const response = await fetch(`${backendBaseUrl}/auth/me`, {
|
|
974
1012
|
headers: { 'Authorization': `Bearer ${loxiaApiKey}` }
|
|
975
1013
|
});
|
|
@@ -982,15 +1020,13 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
|
|
|
982
1020
|
const user = data.user || data;
|
|
983
1021
|
|
|
984
1022
|
// Cache the resolved user for subsequent /api/auth/status calls.
|
|
985
|
-
// Preserves any JWT from a prior OAuth login
|
|
986
|
-
// no JWT of its own — it just links a user from an existing
|
|
987
|
-
// API key). See utilities/authCache.js for the invariant.
|
|
1023
|
+
// Preserves any JWT from a prior OAuth login.
|
|
988
1024
|
await this._setLastAuthResult(recordResolvedUser({
|
|
989
1025
|
user,
|
|
990
1026
|
prevCache: this.lastAuthResult,
|
|
991
1027
|
}));
|
|
992
1028
|
|
|
993
|
-
res.json({ success: true, user });
|
|
1029
|
+
res.json({ success: true, user, mintedJwt: false });
|
|
994
1030
|
} catch (error) {
|
|
995
1031
|
this.logger?.warn('Failed to resolve user from API key', { error: error.message });
|
|
996
1032
|
res.json({ success: true, user: null, reason: 'fetch_error', error: error.message });
|
|
@@ -312,18 +312,42 @@ function makeTelegramHarness({ agentId = 'agent-y', chatId = 42 } = {}) {
|
|
|
312
312
|
const logger = createMockLogger();
|
|
313
313
|
const service = new TelegramService(logger);
|
|
314
314
|
service.status = TELEGRAM_STATUS.CONNECTED;
|
|
315
|
-
|
|
316
|
-
|
|
315
|
+
// Multi-chat shape (no more global scalar `chatId`). Each chat carries
|
|
316
|
+
// its own activeAgentIds set + a thinking-message map. The relay
|
|
317
|
+
// pipeline iterates `service.chats` and only sends when the agent is
|
|
318
|
+
// active in that chat — same contract the production code obeys.
|
|
319
|
+
service.chats.set(String(chatId), {
|
|
320
|
+
type: 'private',
|
|
321
|
+
title: null,
|
|
322
|
+
addedAt: new Date().toISOString(),
|
|
323
|
+
watchEnabled: false,
|
|
324
|
+
lastAgentId: agentId,
|
|
325
|
+
activeAgentIds: new Set([agentId]),
|
|
326
|
+
thinkingByAgentId: new Map(),
|
|
327
|
+
});
|
|
317
328
|
// The event handler short-circuits on `!this.bot`; populate a stub so the
|
|
318
|
-
// relay pipeline runs. Our `_send`
|
|
319
|
-
|
|
329
|
+
// relay pipeline runs. Our `_send` / sendPhoto / sendDocument overrides
|
|
330
|
+
// are the interception points.
|
|
331
|
+
service.bot = {
|
|
332
|
+
sendMessage: jest.fn().mockResolvedValue({ message_id: 1 }),
|
|
333
|
+
editMessageText: jest.fn().mockResolvedValue({ ok: true }),
|
|
334
|
+
deleteMessage: jest.fn().mockResolvedValue(undefined),
|
|
335
|
+
sendPhoto: jest.fn().mockResolvedValue({}),
|
|
336
|
+
sendDocument: jest.fn().mockResolvedValue({}),
|
|
337
|
+
sendChatAction: jest.fn().mockResolvedValue({}),
|
|
338
|
+
};
|
|
320
339
|
service.setAgentPool({
|
|
321
340
|
getAgent: jest.fn().mockResolvedValue({ id: agentId, name: 'Agent Y' }),
|
|
322
341
|
});
|
|
323
342
|
|
|
324
|
-
// Intercept the real underlying `
|
|
343
|
+
// Intercept the real underlying `_sendRaw` (and its wrapper `_send`)
|
|
344
|
+
// to avoid hitting node-telegram-bot-api. Capturing at `_sendRaw`
|
|
345
|
+
// catches edit-placeholder and fresh-send paths uniformly.
|
|
325
346
|
const sends = [];
|
|
326
|
-
service.
|
|
347
|
+
service._sendRaw = jest.fn(async (chatIdArg, text /* , opts */) => {
|
|
348
|
+
sends.push({ chatId: chatIdArg, text });
|
|
349
|
+
});
|
|
350
|
+
service._send = jest.fn(async (chatIdArg, text /* , opts */) => {
|
|
327
351
|
sends.push({ chatId: chatIdArg, text });
|
|
328
352
|
});
|
|
329
353
|
|
|
@@ -354,7 +378,10 @@ describe('Telegram relay — end-to-end via _handleBroadcastEvent', () => {
|
|
|
354
378
|
},
|
|
355
379
|
});
|
|
356
380
|
expect(harness.sends).toHaveLength(1);
|
|
357
|
-
|
|
381
|
+
// The service normalises chat IDs to strings (Map keys); the
|
|
382
|
+
// harness factory builds with a numeric `chatId` so we coerce
|
|
383
|
+
// before comparing.
|
|
384
|
+
expect(String(harness.sends[0].chatId)).toBe(String(harness.chatId));
|
|
358
385
|
expect(harness.sends[0].text).toContain('hi from agent');
|
|
359
386
|
});
|
|
360
387
|
|
|
@@ -393,8 +420,13 @@ describe('Telegram relay — end-to-end via _handleBroadcastEvent', () => {
|
|
|
393
420
|
expect(harness.sends.map(s => s.text).join('|')).toMatch(/A.*B.*C/s);
|
|
394
421
|
});
|
|
395
422
|
|
|
396
|
-
test('agent not in activeAgentIds → nothing sent', async () => {
|
|
397
|
-
|
|
423
|
+
test('agent not in any chat\'s activeAgentIds → nothing sent', async () => {
|
|
424
|
+
// Multi-chat refactor: activeAgentIds is now per-chat state. Drop
|
|
425
|
+
// the agent from every chat to simulate "user has stopped
|
|
426
|
+
// following this agent everywhere".
|
|
427
|
+
for (const state of harness.service.chats.values()) {
|
|
428
|
+
state.activeAgentIds.clear();
|
|
429
|
+
}
|
|
398
430
|
await harness.service._handleBroadcastEvent({
|
|
399
431
|
type: 'stream_complete',
|
|
400
432
|
data: {
|
|
@@ -434,9 +466,14 @@ describe('Telegram relay — end-to-end via _handleBroadcastEvent', () => {
|
|
|
434
466
|
expect(harness.sends[0].text).not.toContain('memory');
|
|
435
467
|
});
|
|
436
468
|
|
|
437
|
-
test('getBridgedChannels returns
|
|
438
|
-
|
|
439
|
-
|
|
469
|
+
test('getBridgedChannels returns per-chat aliases plus the bare "telegram" alias', () => {
|
|
470
|
+
// Multi-chat: one alias per chat the agent is active in, plus a
|
|
471
|
+
// bare `telegram` alias for agents that don't know per-chat
|
|
472
|
+
// addressing. With one chat registered (chatId=42), we expect:
|
|
473
|
+
// - `telegram:chat-42` — chat-scoped alias
|
|
474
|
+
// - `telegram` — broadcast-friendly fallback alias
|
|
475
|
+
const aliases = harness.service.getBridgedChannels(harness.agentId).map(c => c.alias);
|
|
476
|
+
expect(aliases).toEqual(expect.arrayContaining(['telegram:chat-42', 'telegram']));
|
|
440
477
|
expect(harness.service.getBridgedChannels('other-agent')).toEqual([]);
|
|
441
478
|
});
|
|
442
479
|
});
|
|
@@ -271,12 +271,16 @@ describe('describeSource', () => {
|
|
|
271
271
|
expect(describeSource(src)).toBe('Message by alice from Telegram > Ops Chat');
|
|
272
272
|
});
|
|
273
273
|
|
|
274
|
-
test('Telegram private chat', () => {
|
|
274
|
+
test('Telegram private chat — collapsed to "from Telegram" (no user/DM noise)', () => {
|
|
275
|
+
// In a private DM the chat has exactly one human; spelling out
|
|
276
|
+
// the username + a redundant "> DM" was just header bloat that
|
|
277
|
+
// pushed real content out of context. The agent still knows the
|
|
278
|
+
// channel is Telegram. Group chats keep the full attribution.
|
|
275
279
|
const src = createTelegramSource({
|
|
276
280
|
chat: { id: 1, type: 'private' },
|
|
277
281
|
from: { username: 'alice' },
|
|
278
282
|
});
|
|
279
|
-
expect(describeSource(src)).toBe('
|
|
283
|
+
expect(describeSource(src)).toBe('from Telegram');
|
|
280
284
|
});
|
|
281
285
|
|
|
282
286
|
test('Telegram group with no title falls back to chat id', () => {
|