onbuzz 4.6.4 → 4.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (966) hide show
  1. package/bin/cli.js +8 -0
  2. package/package.json +1 -1
  3. package/scripts/debug-balance-probe.mjs +35 -0
  4. package/src/__tests__/autoUpdateConfig.test.js +80 -0
  5. package/src/__tests__/releaseWorkflow.test.js +72 -0
  6. package/src/core/__tests__/messageProcessor.sourceHeader.test.js +7 -2
  7. package/src/index.js +16 -0
  8. package/src/interfaces/__tests__/accountRoutes.test.js +487 -0
  9. package/src/interfaces/__tests__/apiKeyManagerContract.test.js +39 -0
  10. package/src/interfaces/__tests__/authRoutes.test.js +8 -8
  11. package/src/interfaces/accountRoutes.js +398 -0
  12. package/src/interfaces/webServer.js +104 -15
  13. package/src/services/__tests__/apiKeyManager.test.js +4 -6
  14. package/src/services/__tests__/authCacheStore.test.js +118 -0
  15. package/src/services/__tests__/channelRelay.integration.test.js +49 -12
  16. package/src/services/__tests__/messageSource.test.js +6 -2
  17. package/src/services/__tests__/telegramBlockParser.test.js +183 -0
  18. package/src/services/__tests__/telegramService.test.js +838 -0
  19. package/src/services/apiKeyManager.js +12 -99
  20. package/src/services/authCacheStore.js +140 -0
  21. package/src/services/messageSource.js +11 -11
  22. package/src/services/telegramBlockParser.js +145 -0
  23. package/src/services/telegramService.js +1273 -431
  24. package/src/tools/__tests__/webTool.e2e.test.js +9 -1
  25. package/src/tools/webTool.js +20 -4
  26. package/src/utilities/__tests__/secretsCipher.test.js +97 -0
  27. package/src/utilities/__tests__/updateNotifier.test.js +139 -0
  28. package/src/utilities/secretsCipher.js +116 -0
  29. package/src/utilities/updateNotifier.js +140 -0
  30. package/web-ui/build/index.html +2 -2
  31. package/web-ui/build/static/1c-CuE_dLW8.js +1 -0
  32. package/web-ui/build/static/abap-LOu14tBm.js +1 -0
  33. package/web-ui/build/static/abnf-CJpfHQLV.js +1 -0
  34. package/web-ui/build/static/abnf-LdAi7OAY.js +1 -0
  35. package/web-ui/build/static/accesslog-BvrhdZIJ.js +1 -0
  36. package/web-ui/build/static/actionscript-B3NHp9II.js +1 -0
  37. package/web-ui/build/static/actionscript-DVfqv5DS.js +1 -0
  38. package/web-ui/build/static/ada-BVkvHgSu.js +1 -0
  39. package/web-ui/build/static/ada-d33rlRPC.js +1 -0
  40. package/web-ui/build/static/agda-t1mot-jT.js +1 -0
  41. package/web-ui/build/static/al-D2Aw8sYi.js +1 -0
  42. package/web-ui/build/static/angelscript-DGjq6ZLh.js +1 -0
  43. package/web-ui/build/static/antlr4-DQWExQhj.js +1 -0
  44. package/web-ui/build/static/apache-CRX2mGHA.js +1 -0
  45. package/web-ui/build/static/apacheconf-BBhhyVVR.js +1 -0
  46. package/web-ui/build/static/apex-DIJyAF3g.js +1 -0
  47. package/web-ui/build/static/apl-COGQUhmX.js +1 -0
  48. package/web-ui/build/static/applescript-DLPa_bvL.js +1 -0
  49. package/web-ui/build/static/applescript-iEepawXM.js +1 -0
  50. package/web-ui/build/static/aql-vDYotUbW.js +1 -0
  51. package/web-ui/build/static/arcade-5bpnh2Oi.js +1 -0
  52. package/web-ui/build/static/arduino-4OxI8HS8.js +1 -0
  53. package/web-ui/build/static/arduino-zJUNF7Xl.js +1 -0
  54. package/web-ui/build/static/arff-DHcdYO6-.js +1 -0
  55. package/web-ui/build/static/armasm-DVyTHmiD.js +1 -0
  56. package/web-ui/build/static/asciidoc-BRYIR6BF.js +1 -0
  57. package/web-ui/build/static/asciidoc-bd_scw1t.js +1 -0
  58. package/web-ui/build/static/asm6502-DfRcm1MU.js +1 -0
  59. package/web-ui/build/static/asmatmel--fvKJXxu.js +1 -0
  60. package/web-ui/build/static/aspectj-Cnm2Ccyg.js +1 -0
  61. package/web-ui/build/static/aspnet-BK2pQltF.js +1 -0
  62. package/web-ui/build/static/autohotkey-COkKlASn.js +1 -0
  63. package/web-ui/build/static/autohotkey-DNYipPv0.js +1 -0
  64. package/web-ui/build/static/autoit-DiwhqkEo.js +1 -0
  65. package/web-ui/build/static/autoit-DkQ_YDdk.js +1 -0
  66. package/web-ui/build/static/avisynth-DFrkQWrl.js +1 -0
  67. package/web-ui/build/static/avrasm-BbFtsKVm.js +1 -0
  68. package/web-ui/build/static/avro-idl-06_wFrxE.js +1 -0
  69. package/web-ui/build/static/awk-BNO1Hu3Y.js +1 -0
  70. package/web-ui/build/static/axapta-CW0rBEQf.js +1 -0
  71. package/web-ui/build/static/bash-DAP5H41u.js +1 -0
  72. package/web-ui/build/static/bash-DsCT4fHh.js +1 -0
  73. package/web-ui/build/static/basic-DqCcX17x.js +1 -0
  74. package/web-ui/build/static/basic-J3jqGQaz.js +1 -0
  75. package/web-ui/build/static/batch-BzKb0QuF.js +1 -0
  76. package/web-ui/build/static/bbcode-Cxys0qL9.js +1 -0
  77. package/web-ui/build/static/bicep-DPpVhf9I.js +1 -0
  78. package/web-ui/build/static/birb-BDF00uY2.js +1 -0
  79. package/web-ui/build/static/bison-DerSCeTc.js +1 -0
  80. package/web-ui/build/static/bnf--Nxb91Mj.js +1 -0
  81. package/web-ui/build/static/bnf-DKp1OqQh.js +1 -0
  82. package/web-ui/build/static/brainfuck-BgKburBi.js +1 -0
  83. package/web-ui/build/static/brainfuck-CLRabJhl.js +1 -0
  84. package/web-ui/build/static/brightscript-DJ0LrgUU.js +1 -0
  85. package/web-ui/build/static/bro-FVn3137a.js +1 -0
  86. package/web-ui/build/static/bsl-DGcfC5Qq.js +1 -0
  87. package/web-ui/build/static/c-CtBaJxj_.js +1 -0
  88. package/web-ui/build/static/c-DcJBPsOs.js +1 -0
  89. package/web-ui/build/static/c-like-BMAPMOT0.js +1 -0
  90. package/web-ui/build/static/cal-Dwvf5LQJ.js +1 -0
  91. package/web-ui/build/static/capnproto-Be5xeQu8.js +1 -0
  92. package/web-ui/build/static/ceylon-BV9kQegc.js +1 -0
  93. package/web-ui/build/static/cfscript-DqyqkqRV.js +1 -0
  94. package/web-ui/build/static/chaiscript-ab8S5sGz.js +1 -0
  95. package/web-ui/build/static/cil-DU5bEU16.js +1 -0
  96. package/web-ui/build/static/clean-CqKiC4l-.js +1 -0
  97. package/web-ui/build/static/clojure-CdaWManm.js +1 -0
  98. package/web-ui/build/static/clojure-cVIUydqy.js +1 -0
  99. package/web-ui/build/static/clojure-repl-mc7sqsOd.js +1 -0
  100. package/web-ui/build/static/cmake-D2ntzyPv.js +1 -0
  101. package/web-ui/build/static/cmake-Dt7gdCZl.js +1 -0
  102. package/web-ui/build/static/cobol-BYMIYxJY.js +1 -0
  103. package/web-ui/build/static/coffeescript-COUOYE5O.js +1 -0
  104. package/web-ui/build/static/coffeescript-FDyQzH4X.js +1 -0
  105. package/web-ui/build/static/concurnas-D8GglsJx.js +1 -0
  106. package/web-ui/build/static/coq-BvEL_B0N.js +1 -0
  107. package/web-ui/build/static/coq-C6NZeAuz.js +1 -0
  108. package/web-ui/build/static/cos-CjjeNVfD.js +1 -0
  109. package/web-ui/build/static/cpp-BdQQ9k01.js +1 -0
  110. package/web-ui/build/static/cpp-iYGopslr.js +1 -0
  111. package/web-ui/build/static/crmsh-COhOWlQB.js +1 -0
  112. package/web-ui/build/static/crystal-DqVfuZe7.js +1 -0
  113. package/web-ui/build/static/crystal-fkI7WHLA.js +1 -0
  114. package/web-ui/build/static/csharp-BKyMR69a.js +1 -0
  115. package/web-ui/build/static/csharp-KJwk5tFh.js +1 -0
  116. package/web-ui/build/static/cshtml-D-0Bd5yF.js +1 -0
  117. package/web-ui/build/static/csp-C6xrFQUZ.js +1 -0
  118. package/web-ui/build/static/csp-CKOZZjS5.js +1 -0
  119. package/web-ui/build/static/css-DhttYfIQ.js +1 -0
  120. package/web-ui/build/static/css-extras-Cwksdn14.js +1 -0
  121. package/web-ui/build/static/csv-3xOycrIm.js +1 -0
  122. package/web-ui/build/static/cypher-DIQ_IXvU.js +1 -0
  123. package/web-ui/build/static/d-CA3ONaPZ.js +1 -0
  124. package/web-ui/build/static/d-Cpj6yr1P.js +1 -0
  125. package/web-ui/build/static/dart-CStXueOh.js +1 -0
  126. package/web-ui/build/static/dart-DyyN2hCZ.js +1 -0
  127. package/web-ui/build/static/dataweave-C1Z1lf_p.js +1 -0
  128. package/web-ui/build/static/dax-Bra_xxin.js +1 -0
  129. package/web-ui/build/static/delphi-BSp32sTR.js +1 -0
  130. package/web-ui/build/static/dhall-DqULvWhD.js +1 -0
  131. package/web-ui/build/static/diff-DZWp0eai.js +1 -0
  132. package/web-ui/build/static/diff-Dl7Q9ZLJ.js +1 -0
  133. package/web-ui/build/static/django-BKb-9srn.js +1 -0
  134. package/web-ui/build/static/django-D4ZBsr7A.js +1 -0
  135. package/web-ui/build/static/dns-BIl1lqfE.js +1 -0
  136. package/web-ui/build/static/dns-zone-file-BHOpqtwv.js +1 -0
  137. package/web-ui/build/static/docker-DhYlo5KM.js +1 -0
  138. package/web-ui/build/static/dockerfile-DkKcxplU.js +1 -0
  139. package/web-ui/build/static/dos-BL8RAxlP.js +1 -0
  140. package/web-ui/build/static/dot-BLokvOTb.js +1 -0
  141. package/web-ui/build/static/dsconfig-C-HwSveF.js +1 -0
  142. package/web-ui/build/static/dts-D7N7kY9U.js +1 -0
  143. package/web-ui/build/static/dust-BDDbpTgO.js +1 -0
  144. package/web-ui/build/static/ebnf-BXq1reNT.js +1 -0
  145. package/web-ui/build/static/ebnf-DbPDw4Bq.js +1 -0
  146. package/web-ui/build/static/editorconfig-w2ZfPGuw.js +1 -0
  147. package/web-ui/build/static/eiffel-c2MQNBkW.js +1 -0
  148. package/web-ui/build/static/ejs-3QktTSvM.js +1 -0
  149. package/web-ui/build/static/elixir-BpckBbUo.js +1 -0
  150. package/web-ui/build/static/elixir-CdGx--Zx.js +1 -0
  151. package/web-ui/build/static/elm-BZQYORvs.js +1 -0
  152. package/web-ui/build/static/elm-CuB52FFf.js +1 -0
  153. package/web-ui/build/static/erb-BBShdpRp.js +1 -0
  154. package/web-ui/build/static/erb-C6oyD8uR.js +1 -0
  155. package/web-ui/build/static/erlang-CTR2NiVN.js +1 -0
  156. package/web-ui/build/static/erlang-Gyvyd8Bt.js +1 -0
  157. package/web-ui/build/static/erlang-repl-DQ9M2hTB.js +1 -0
  158. package/web-ui/build/static/etlua-WvCpEBL7.js +1 -0
  159. package/web-ui/build/static/excel-Cti8qyDh.js +1 -0
  160. package/web-ui/build/static/excel-formula-CbyjGhLT.js +1 -0
  161. package/web-ui/build/static/factor-DsS7xUlQ.js +1 -0
  162. package/web-ui/build/static/false-By7DT7NY.js +1 -0
  163. package/web-ui/build/static/firestore-security-rules-D818j5mX.js +1 -0
  164. package/web-ui/build/static/fix-Z9CNHO5B.js +1 -0
  165. package/web-ui/build/static/flix-CQ5tU7oG.js +1 -0
  166. package/web-ui/build/static/flow-TAcj5V8G.js +1 -0
  167. package/web-ui/build/static/fortran-CSo4-IB9.js +1 -0
  168. package/web-ui/build/static/fortran-D8ckpcuk.js +1 -0
  169. package/web-ui/build/static/fsharp-CX5IhzHG.js +1 -0
  170. package/web-ui/build/static/fsharp-CjgdWVzI.js +1 -0
  171. package/web-ui/build/static/ftl-BniZfpaP.js +1 -0
  172. package/web-ui/build/static/gams-Dx_Ej7b0.js +1 -0
  173. package/web-ui/build/static/gap-BW8rQPKU.js +1 -0
  174. package/web-ui/build/static/gauss-DP_j2AoM.js +1 -0
  175. package/web-ui/build/static/gcode-C_p0RHK2.js +1 -0
  176. package/web-ui/build/static/gcode-CvPzqlIr.js +1 -0
  177. package/web-ui/build/static/gdscript-BQxanI3X.js +1 -0
  178. package/web-ui/build/static/gedcom-DX22sB95.js +1 -0
  179. package/web-ui/build/static/gherkin-BuM2TN92.js +1 -0
  180. package/web-ui/build/static/gherkin-SyKtGAnl.js +1 -0
  181. package/web-ui/build/static/git-CZsBJbLj.js +1 -0
  182. package/web-ui/build/static/glsl-0gMMTGpT.js +1 -0
  183. package/web-ui/build/static/glsl-DdxyDP7O.js +1 -0
  184. package/web-ui/build/static/gml-Bmf5f_3a.js +1 -0
  185. package/web-ui/build/static/gml-DygwvUqd.js +1 -0
  186. package/web-ui/build/static/gn-CmJ9lVHR.js +1 -0
  187. package/web-ui/build/static/go-DcXIw3ql.js +1 -0
  188. package/web-ui/build/static/go-Dp-1fwju.js +1 -0
  189. package/web-ui/build/static/go-module-CVe5dTg-.js +1 -0
  190. package/web-ui/build/static/golo-Dqz3BdPW.js +1 -0
  191. package/web-ui/build/static/gradle-PY8Q_ptd.js +1 -0
  192. package/web-ui/build/static/graphql-7ynBfuuQ.js +1 -0
  193. package/web-ui/build/static/groovy-CKe3t1A3.js +1 -0
  194. package/web-ui/build/static/groovy-DK_6c_Dy.js +1 -0
  195. package/web-ui/build/static/haml-BjjIreuG.js +1 -0
  196. package/web-ui/build/static/haml-knbHtzU7.js +1 -0
  197. package/web-ui/build/static/handlebars-Bvicc2ZP.js +1 -0
  198. package/web-ui/build/static/handlebars-CWjisUes.js +1 -0
  199. package/web-ui/build/static/haskell-0vOFJmtj.js +1 -0
  200. package/web-ui/build/static/haskell-BjwWvVul.js +1 -0
  201. package/web-ui/build/static/haxe-CXIYhI9-.js +1 -0
  202. package/web-ui/build/static/haxe-Msa_nat5.js +1 -0
  203. package/web-ui/build/static/hcl-DADfqiqO.js +1 -0
  204. package/web-ui/build/static/hlsl-BoecwvZ1.js +1 -0
  205. package/web-ui/build/static/hoon-DoMcF4bN.js +1 -0
  206. package/web-ui/build/static/hpkp-DOkWWV9B.js +1 -0
  207. package/web-ui/build/static/hsp-KvanktXQ.js +1 -0
  208. package/web-ui/build/static/hsts-DP5sAe8p.js +1 -0
  209. package/web-ui/build/static/htmlbars-DpevdeqY.js +1 -0
  210. package/web-ui/build/static/http-CTyudxeK.js +1 -0
  211. package/web-ui/build/static/http-D0_pALtR.js +1 -0
  212. package/web-ui/build/static/hy-KpsNGTaA.js +1 -0
  213. package/web-ui/build/static/ichigojam-B9szb3eY.js +1 -0
  214. package/web-ui/build/static/icon-nqAgdt4t.js +1 -0
  215. package/web-ui/build/static/icu-message-format-DvgC-cKZ.js +1 -0
  216. package/web-ui/build/static/idris-D5VcDmFg.js +1 -0
  217. package/web-ui/build/static/iecst-LbbDhK7w.js +1 -0
  218. package/web-ui/build/static/ignore-rThoz4zA.js +1 -0
  219. package/web-ui/build/static/index-Cm1gK3R7.css +1 -0
  220. package/web-ui/build/static/index-D6blIL5t.js +13 -0
  221. package/web-ui/build/static/index-DqCutaVi.js +1164 -0
  222. package/web-ui/build/static/index-_UVy_UGY.js +1 -0
  223. package/web-ui/build/static/inform7-B2u0-vkK.js +1 -0
  224. package/web-ui/build/static/inform7-Cj2uMx5P.js +1 -0
  225. package/web-ui/build/static/ini-DDC_WfpB.js +1 -0
  226. package/web-ui/build/static/ini-Dafi1wkS.js +1 -0
  227. package/web-ui/build/static/io-Cs5RmCdQ.js +1 -0
  228. package/web-ui/build/static/irpf90-5KuyCx_k.js +1 -0
  229. package/web-ui/build/static/isbl-CZGAUFN3.js +1 -0
  230. package/web-ui/build/static/j-C2U5CNx3.js +1 -0
  231. package/web-ui/build/static/java-B-L3bHbG.js +1 -0
  232. package/web-ui/build/static/java-Dhfb499l.js +1 -0
  233. package/web-ui/build/static/javadoc-_ln2gn5I.js +1 -0
  234. package/web-ui/build/static/javadoclike-CnV_ddKg.js +1 -0
  235. package/web-ui/build/static/javascript-DBUUUlif.js +1 -0
  236. package/web-ui/build/static/javastacktrace-BS1l3Yf6.js +1 -0
  237. package/web-ui/build/static/jboss-cli-RdKEfNzL.js +1 -0
  238. package/web-ui/build/static/jexl-Bu5vdWnx.js +1 -0
  239. package/web-ui/build/static/jolie-LS18mxou.js +1 -0
  240. package/web-ui/build/static/jq-u9QEjWr_.js +1 -0
  241. package/web-ui/build/static/js-extras-C1cS_85G.js +1 -0
  242. package/web-ui/build/static/js-templates-DQxgBfhh.js +1 -0
  243. package/web-ui/build/static/jsdoc-DhLXAtzJ.js +1 -0
  244. package/web-ui/build/static/json-B8DgcmbV.js +1 -0
  245. package/web-ui/build/static/json-ByLJzbD8.js +1 -0
  246. package/web-ui/build/static/json5-DSnccLNQ.js +1 -0
  247. package/web-ui/build/static/jsonp-CcwF40Vu.js +1 -0
  248. package/web-ui/build/static/jsstacktrace-7YvddNWa.js +1 -0
  249. package/web-ui/build/static/jsx-DnHkAc3-.js +1 -0
  250. package/web-ui/build/static/julia-BmadVpf3.js +1 -0
  251. package/web-ui/build/static/julia-GSKCoIBJ.js +1 -0
  252. package/web-ui/build/static/julia-repl-ks3HTctE.js +1 -0
  253. package/web-ui/build/static/keepalived-CWDkM2-Z.js +1 -0
  254. package/web-ui/build/static/keyman-C9jA4-3Y.js +1 -0
  255. package/web-ui/build/static/kotlin-BqzUXT-K.js +1 -0
  256. package/web-ui/build/static/kotlin-BxhEUQAU.js +1 -0
  257. package/web-ui/build/static/kumir-BFYLWJq-.js +1 -0
  258. package/web-ui/build/static/kusto-CQRzYXm2.js +1 -0
  259. package/web-ui/build/static/lasso-D44z_uI8.js +1 -0
  260. package/web-ui/build/static/latex-BEJdTqYC.js +1 -0
  261. package/web-ui/build/static/latex-CStS4ql1.js +1 -0
  262. package/web-ui/build/static/latte-BPXasl8T.js +1 -0
  263. package/web-ui/build/static/ldif-Wxrk2-xQ.js +1 -0
  264. package/web-ui/build/static/leaf-DrTXK-pT.js +1 -0
  265. package/web-ui/build/static/less-BmoAe98U.js +1 -0
  266. package/web-ui/build/static/less-DzWEFsZj.js +1 -0
  267. package/web-ui/build/static/lilypond-C3ZnRm_L.js +1 -0
  268. package/web-ui/build/static/liquid-eXmypvP_.js +1 -0
  269. package/web-ui/build/static/lisp-DcidyoAl.js +1 -0
  270. package/web-ui/build/static/lisp-DhmUig93.js +1 -0
  271. package/web-ui/build/static/livecodeserver-D5lnfCkg.js +1 -0
  272. package/web-ui/build/static/livescript-Bpb_EpXS.js +1 -0
  273. package/web-ui/build/static/livescript-rF5whmjG.js +1 -0
  274. package/web-ui/build/static/llvm-BD9QG7T-.js +1 -0
  275. package/web-ui/build/static/llvm-CVP-jOx8.js +1 -0
  276. package/web-ui/build/static/log-DRzysjS2.js +1 -0
  277. package/web-ui/build/static/lolcode-BmKgPOwi.js +1 -0
  278. package/web-ui/build/static/lsl-DEO2mV0F.js +1 -0
  279. package/web-ui/build/static/lua-BNDDIa9F.js +1 -0
  280. package/web-ui/build/static/lua-C5n4hyV-.js +1 -0
  281. package/web-ui/build/static/magma-UZvvdXue.js +1 -0
  282. package/web-ui/build/static/makefile-BDQ4tARf.js +1 -0
  283. package/web-ui/build/static/makefile-Bjg-ueA2.js +1 -0
  284. package/web-ui/build/static/markdown-BTXvpQos.js +1 -0
  285. package/web-ui/build/static/markdown-BvMdFo1Y.js +1 -0
  286. package/web-ui/build/static/markup-templating-xSAHnnIS.js +1 -0
  287. package/web-ui/build/static/mathematica-CqNsUy6n.js +1 -0
  288. package/web-ui/build/static/matlab-D-A1WMHc.js +1 -0
  289. package/web-ui/build/static/matlab-Us_SxUWG.js +1 -0
  290. package/web-ui/build/static/maxima-BSyBp09v.js +1 -0
  291. package/web-ui/build/static/maxscript-wyb-3dgT.js +1 -0
  292. package/web-ui/build/static/mel-Bpo7JK_A.js +1 -0
  293. package/web-ui/build/static/mel-eZCDX4iS.js +1 -0
  294. package/web-ui/build/static/mercury-CEgBiaXI.js +1 -0
  295. package/web-ui/build/static/mermaid-BJIHmQsO.js +1 -0
  296. package/web-ui/build/static/mipsasm-c70dMcw9.js +1 -0
  297. package/web-ui/build/static/mizar-CeCpdHS-.js +1 -0
  298. package/web-ui/build/static/mizar-DDlOFZXr.js +1 -0
  299. package/web-ui/build/static/mojolicious-b4UGVld0.js +1 -0
  300. package/web-ui/build/static/mongodb-DwkU2uSm.js +1 -0
  301. package/web-ui/build/static/monkey-CNkGqOfo.js +1 -0
  302. package/web-ui/build/static/monkey-DwmdAwUx.js +1 -0
  303. package/web-ui/build/static/moonscript-C2vv4alq.js +1 -0
  304. package/web-ui/build/static/moonscript-GOmGojxm.js +1 -0
  305. package/web-ui/build/static/n1ql-B-uZXYG_.js +1 -0
  306. package/web-ui/build/static/n1ql-CqKgc7lF.js +1 -0
  307. package/web-ui/build/static/n4js-CLkxsn24.js +1 -0
  308. package/web-ui/build/static/nand2tetris-hdl-CAJAzliK.js +1 -0
  309. package/web-ui/build/static/naniscript-DxWjsrnl.js +1 -0
  310. package/web-ui/build/static/nasm-C-GI38un.js +1 -0
  311. package/web-ui/build/static/neon-DWKBFo--.js +1 -0
  312. package/web-ui/build/static/nevod-DGDg1w8a.js +1 -0
  313. package/web-ui/build/static/nginx-BQbAompS.js +1 -0
  314. package/web-ui/build/static/nginx-BQbgG8J2.js +1 -0
  315. package/web-ui/build/static/nim-Bf864jik.js +1 -0
  316. package/web-ui/build/static/nim-DG4Tf5sg.js +1 -0
  317. package/web-ui/build/static/nix-BBq54ypW.js +1 -0
  318. package/web-ui/build/static/nix-DiVQTSyM.js +1 -0
  319. package/web-ui/build/static/node-repl-Dg0rNxhv.js +1 -0
  320. package/web-ui/build/static/nsis-BG8Lm28v.js +1 -0
  321. package/web-ui/build/static/nsis-CwA_MNyF.js +1 -0
  322. package/web-ui/build/static/objectivec-83FM4mu0.js +1 -0
  323. package/web-ui/build/static/objectivec-CbDgPZGc.js +1 -0
  324. package/web-ui/build/static/ocaml-CXrksX9b.js +1 -0
  325. package/web-ui/build/static/ocaml-aktipfk_.js +1 -0
  326. package/web-ui/build/static/opencl-B1Wu4nP5.js +1 -0
  327. package/web-ui/build/static/openqasm-BnUjC0Rq.js +1 -0
  328. package/web-ui/build/static/openscad-CNEF75nQ.js +1 -0
  329. package/web-ui/build/static/oxygene-B5nQHVvu.js +1 -0
  330. package/web-ui/build/static/oz-Dw07HFRJ.js +1 -0
  331. package/web-ui/build/static/parigp-Dkh7PqN8.js +1 -0
  332. package/web-ui/build/static/parser-CAW1btwt.js +1 -0
  333. package/web-ui/build/static/parser3-DO4cmbnD.js +1 -0
  334. package/web-ui/build/static/pascal-B3XwEzrN.js +1 -0
  335. package/web-ui/build/static/pascaligo-CMKmAZ_B.js +1 -0
  336. package/web-ui/build/static/pcaxis-B5RrdB6p.js +1 -0
  337. package/web-ui/build/static/peoplecode-CGkgPJl9.js +1 -0
  338. package/web-ui/build/static/perl-BWBuZ5Vt.js +1 -0
  339. package/web-ui/build/static/perl-CW0_w5xG.js +1 -0
  340. package/web-ui/build/static/pf-B1aiG4iq.js +1 -0
  341. package/web-ui/build/static/pgsql-BgXadqYx.js +1 -0
  342. package/web-ui/build/static/php-BpB9heTH.js +1 -0
  343. package/web-ui/build/static/php-S3LJn70M.js +1 -0
  344. package/web-ui/build/static/php-extras-Dmblzt0I.js +1 -0
  345. package/web-ui/build/static/php-template-BS_uyUS1.js +1 -0
  346. package/web-ui/build/static/phpdoc-BqP_4LKt.js +1 -0
  347. package/web-ui/build/static/plaintext-BvDBRLjE.js +1 -0
  348. package/web-ui/build/static/plsql-DEj_qOIm.js +1 -0
  349. package/web-ui/build/static/pony-DpvrOLZf.js +1 -0
  350. package/web-ui/build/static/powerquery-C0Wobunx.js +1 -0
  351. package/web-ui/build/static/powershell-CY7ZBlTW.js +1 -0
  352. package/web-ui/build/static/powershell-DiEDDrOo.js +1 -0
  353. package/web-ui/build/static/processing-IXybgMWQ.js +1 -0
  354. package/web-ui/build/static/processing-i136WolF.js +1 -0
  355. package/web-ui/build/static/profile-guIih27Q.js +1 -0
  356. package/web-ui/build/static/prolog-CvmO0VDt.js +1 -0
  357. package/web-ui/build/static/prolog-Dmf4klwf.js +1 -0
  358. package/web-ui/build/static/promql-DObZhyF5.js +1 -0
  359. package/web-ui/build/static/properties-CK08qg7k.js +1 -0
  360. package/web-ui/build/static/properties-DmwePx7J.js +1 -0
  361. package/web-ui/build/static/protobuf-BDkUYcAx.js +1 -0
  362. package/web-ui/build/static/protobuf-CBMNyvhU.js +1 -0
  363. package/web-ui/build/static/psl-eW3BB0n6.js +1 -0
  364. package/web-ui/build/static/pug-D0LF-keh.js +1 -0
  365. package/web-ui/build/static/puppet-BUYZQfB-.js +1 -0
  366. package/web-ui/build/static/puppet-Dbo5UDT-.js +1 -0
  367. package/web-ui/build/static/pure-C5ukDHhg.js +1 -0
  368. package/web-ui/build/static/purebasic-B8eqrPTw.js +1 -0
  369. package/web-ui/build/static/purebasic-BA8g0-l-.js +1 -0
  370. package/web-ui/build/static/purescript-CKa_o5qx.js +1 -0
  371. package/web-ui/build/static/python-C-iEDsum.js +1 -0
  372. package/web-ui/build/static/python-CJcHyEGQ.js +1 -0
  373. package/web-ui/build/static/python-repl-WvDxhQ8t.js +1 -0
  374. package/web-ui/build/static/q-Ben5hioy.js +1 -0
  375. package/web-ui/build/static/q-CenUx0Za.js +1 -0
  376. package/web-ui/build/static/qml-CkUJB-7R.js +1 -0
  377. package/web-ui/build/static/qml-G6uEqbt_.js +1 -0
  378. package/web-ui/build/static/qore-CASrYvaT.js +1 -0
  379. package/web-ui/build/static/qsharp-CJMvScJV.js +1 -0
  380. package/web-ui/build/static/r-C3qOLTEa.js +1 -0
  381. package/web-ui/build/static/r-pFTIkWVX.js +1 -0
  382. package/web-ui/build/static/racket-Dj2Pnxz8.js +1 -0
  383. package/web-ui/build/static/reason-BLo81vJj.js +1 -0
  384. package/web-ui/build/static/reasonml-Uso3eiRd.js +1 -0
  385. package/web-ui/build/static/regex-CRRrWtDv.js +1 -0
  386. package/web-ui/build/static/rego-Pd9N41dQ.js +1 -0
  387. package/web-ui/build/static/renpy-B5nJRJ6W.js +1 -0
  388. package/web-ui/build/static/rest-C4KktBYV.js +1 -0
  389. package/web-ui/build/static/rib-WhwJFXjw.js +1 -0
  390. package/web-ui/build/static/rip-BRMu9y5Q.js +1 -0
  391. package/web-ui/build/static/roboconf-BC-HzyUK.js +1 -0
  392. package/web-ui/build/static/roboconf-Wo-TPzlW.js +1 -0
  393. package/web-ui/build/static/robotframework-Cvw8u8mL.js +1 -0
  394. package/web-ui/build/static/routeros-1EUCLy_j.js +1 -0
  395. package/web-ui/build/static/rsl-DcVNeKkF.js +1 -0
  396. package/web-ui/build/static/ruby-B1fqRC3j.js +1 -0
  397. package/web-ui/build/static/ruby-Bl1wXNzL.js +1 -0
  398. package/web-ui/build/static/ruleslanguage-C3rzl2Ma.js +1 -0
  399. package/web-ui/build/static/rust-4iyLrpFQ.js +1 -0
  400. package/web-ui/build/static/rust-V8MRv3os.js +1 -0
  401. package/web-ui/build/static/sas-ClkrCklD.js +1 -0
  402. package/web-ui/build/static/sas-CyFFy3mS.js +1 -0
  403. package/web-ui/build/static/sass-Cege3fu1.js +1 -0
  404. package/web-ui/build/static/scala-DNb7CDvN.js +1 -0
  405. package/web-ui/build/static/scala-c5k_CS9h.js +1 -0
  406. package/web-ui/build/static/scheme-BXrEBzXP.js +1 -0
  407. package/web-ui/build/static/scheme-COq0pstl.js +1 -0
  408. package/web-ui/build/static/scilab-CRMCfvft.js +1 -0
  409. package/web-ui/build/static/scss-C6MDSdKd.js +1 -0
  410. package/web-ui/build/static/scss-D1INSi-r.js +1 -0
  411. package/web-ui/build/static/shell-BHTFz9Xv.js +1 -0
  412. package/web-ui/build/static/shell-session-B6KXgRjz.js +1 -0
  413. package/web-ui/build/static/smali-CXGHC3zj.js +1 -0
  414. package/web-ui/build/static/smali-DFRkIqFc.js +1 -0
  415. package/web-ui/build/static/smalltalk-DWI2TbuJ.js +1 -0
  416. package/web-ui/build/static/smalltalk-jkgxBKRZ.js +1 -0
  417. package/web-ui/build/static/smarty-BPJMXwnj.js +1 -0
  418. package/web-ui/build/static/sml-BHT8CCeD.js +1 -0
  419. package/web-ui/build/static/sml-D5fkPJU1.js +1 -0
  420. package/web-ui/build/static/solidity-BfFvCWqp.js +1 -0
  421. package/web-ui/build/static/solution-file-DmSVfk_X.js +1 -0
  422. package/web-ui/build/static/soy-CXqMJVf8.js +1 -0
  423. package/web-ui/build/static/sparql-BxIpMyhJ.js +1 -0
  424. package/web-ui/build/static/splunk-spl-DMekyRuD.js +1 -0
  425. package/web-ui/build/static/sqf-DeQ-Lyaa.js +1 -0
  426. package/web-ui/build/static/sqf-hkl5BOBV.js +1 -0
  427. package/web-ui/build/static/sql-Di-rn3Od.js +1 -0
  428. package/web-ui/build/static/sql-DuF5aX9R.js +1 -0
  429. package/web-ui/build/static/sql_more-CCmzwYYA.js +1 -0
  430. package/web-ui/build/static/squirrel-fGLPlBkB.js +1 -0
  431. package/web-ui/build/static/stan-BveEpl1w.js +1 -0
  432. package/web-ui/build/static/stan-CM09XtOD.js +1 -0
  433. package/web-ui/build/static/stata-DeFUbv91.js +1 -0
  434. package/web-ui/build/static/step21-DnUE2ZTl.js +1 -0
  435. package/web-ui/build/static/stylus-Bz9XG6KK.js +1 -0
  436. package/web-ui/build/static/stylus-h33ZUR4b.js +1 -0
  437. package/web-ui/build/static/subunit-v4SRMSnP.js +1 -0
  438. package/web-ui/build/static/swift-BMCxsbHv.js +1 -0
  439. package/web-ui/build/static/swift-qFBaTSsZ.js +1 -0
  440. package/web-ui/build/static/systemd-9w7KWsst.js +1 -0
  441. package/web-ui/build/static/t4-cs-DdBrJkO9.js +1 -0
  442. package/web-ui/build/static/t4-templating-B-3iQJ4y.js +1 -0
  443. package/web-ui/build/static/t4-vb-BBuTbPK8.js +1 -0
  444. package/web-ui/build/static/taggerscript-BPvYYpaJ.js +1 -0
  445. package/web-ui/build/static/tap-DiFULuZV.js +1 -0
  446. package/web-ui/build/static/tap-Q9DMgrzh.js +1 -0
  447. package/web-ui/build/static/tcl-BZcwcRUU.js +1 -0
  448. package/web-ui/build/static/tcl-C4DHKxjE.js +1 -0
  449. package/web-ui/build/static/textile-ByLAjlo8.js +1 -0
  450. package/web-ui/build/static/thrift-C_isEMNl.js +1 -0
  451. package/web-ui/build/static/toml-C6ffwJpv.js +1 -0
  452. package/web-ui/build/static/tp-aV8nCrpp.js +1 -0
  453. package/web-ui/build/static/tremor-Bs1SSWo9.js +1 -0
  454. package/web-ui/build/static/tsx-DdryYBa4.js +1 -0
  455. package/web-ui/build/static/tt2-BeCMXvbZ.js +1 -0
  456. package/web-ui/build/static/turtle-B2FzT5Ov.js +1 -0
  457. package/web-ui/build/static/twig-fVEYqAxR.js +1 -0
  458. package/web-ui/build/static/twig-p9k58-hx.js +1 -0
  459. package/web-ui/build/static/typescript-8bhStN7p.js +1 -0
  460. package/web-ui/build/static/typescript-D2zmnuDR.js +1 -0
  461. package/web-ui/build/static/typoscript-DQePQcKL.js +1 -0
  462. package/web-ui/build/static/unrealscript-BZYSnJjB.js +1 -0
  463. package/web-ui/build/static/uorazor-CGaRtqR5.js +1 -0
  464. package/web-ui/build/static/uri-PJ3dz1qj.js +1 -0
  465. package/web-ui/build/static/v-CI9qDsYZ.js +1 -0
  466. package/web-ui/build/static/vala-B4ses542.js +1 -0
  467. package/web-ui/build/static/vala-BLxHpeKp.js +1 -0
  468. package/web-ui/build/static/vbnet-B7Dzk1rR.js +1 -0
  469. package/web-ui/build/static/vbnet-HOI9SMLZ.js +1 -0
  470. package/web-ui/build/static/vbscript-ERv5iDpi.js +1 -0
  471. package/web-ui/build/static/vbscript-html-D-mjpNAX.js +1 -0
  472. package/web-ui/build/static/velocity-B754qmeE.js +1 -0
  473. package/web-ui/build/static/verilog-3PA83Bxs.js +1 -0
  474. package/web-ui/build/static/verilog-D-lqP5ci.js +1 -0
  475. package/web-ui/build/static/vhdl-BjRYdIRF.js +1 -0
  476. package/web-ui/build/static/vhdl-DgrorvTt.js +1 -0
  477. package/web-ui/build/static/vim-3Oixnlee.js +1 -0
  478. package/web-ui/build/static/vim-BJTKcXdU.js +1 -0
  479. package/web-ui/build/static/visual-basic-BG8-3339.js +1 -0
  480. package/web-ui/build/static/warpscript-CEIgv5UG.js +1 -0
  481. package/web-ui/build/static/wasm-BJlpp9rs.js +1 -0
  482. package/web-ui/build/static/web-idl-Dlh9DutO.js +1 -0
  483. package/web-ui/build/static/wiki-CCcmRzkd.js +1 -0
  484. package/web-ui/build/static/wolfram--Xk-fAUi.js +1 -0
  485. package/web-ui/build/static/wren-B9Ajd9OC.js +1 -0
  486. package/web-ui/build/static/x86asm-DJJ72Zy-.js +1 -0
  487. package/web-ui/build/static/xeora-C0tNsSDj.js +1 -0
  488. package/web-ui/build/static/xl-CzEpyjRJ.js +1 -0
  489. package/web-ui/build/static/xml-CdtQTsBH.js +1 -0
  490. package/web-ui/build/static/xml-doc-TtPAAmc6.js +1 -0
  491. package/web-ui/build/static/xojo-B92fAnQE.js +1 -0
  492. package/web-ui/build/static/xquery-D0Z1FZVO.js +1 -0
  493. package/web-ui/build/static/xquery-DwlcRJ7Q.js +1 -0
  494. package/web-ui/build/static/yaml-DySZjPvD.js +1 -0
  495. package/web-ui/build/static/yaml-YgOVzvAS.js +1 -0
  496. package/web-ui/build/static/yang-BJokKPTo.js +1 -0
  497. package/web-ui/build/static/zephir-BWMUFIRD.js +1 -0
  498. package/web-ui/build/static/zig-Bpzj48cM.js +1 -0
  499. package/web-ui/build/static/1c-4BRB87En.js +0 -1
  500. package/web-ui/build/static/abap-BXIqiAfL.js +0 -1
  501. package/web-ui/build/static/abnf-0gk1i0eD.js +0 -1
  502. package/web-ui/build/static/abnf-jcv7vN9a.js +0 -1
  503. package/web-ui/build/static/accesslog-bXE2aOZl.js +0 -1
  504. package/web-ui/build/static/actionscript-CF-bqawj.js +0 -1
  505. package/web-ui/build/static/actionscript-CodwLKar.js +0 -1
  506. package/web-ui/build/static/ada-BBEDI84F.js +0 -1
  507. package/web-ui/build/static/ada-Kb6JvaxP.js +0 -1
  508. package/web-ui/build/static/agda-UvnMXUUo.js +0 -1
  509. package/web-ui/build/static/al-D5QZ0ijQ.js +0 -1
  510. package/web-ui/build/static/angelscript-RpvZxbeT.js +0 -1
  511. package/web-ui/build/static/antlr4-BPyUvfii.js +0 -1
  512. package/web-ui/build/static/apache-CtM2pGik.js +0 -1
  513. package/web-ui/build/static/apacheconf-D-i9eISH.js +0 -1
  514. package/web-ui/build/static/apex-Dhn_SJi4.js +0 -1
  515. package/web-ui/build/static/apl-HWtdSaYy.js +0 -1
  516. package/web-ui/build/static/applescript-Br9NrmTP.js +0 -1
  517. package/web-ui/build/static/applescript-DLL0TuGw.js +0 -1
  518. package/web-ui/build/static/aql-MjCgNRUX.js +0 -1
  519. package/web-ui/build/static/arcade--DFvEPVv.js +0 -1
  520. package/web-ui/build/static/arduino-Cqw5W_fL.js +0 -1
  521. package/web-ui/build/static/arduino-DIDBbB7R.js +0 -1
  522. package/web-ui/build/static/arff-GGvbnOhc.js +0 -1
  523. package/web-ui/build/static/armasm-DKLRDLs1.js +0 -1
  524. package/web-ui/build/static/asciidoc-CN5qfm0K.js +0 -1
  525. package/web-ui/build/static/asciidoc-CeQEWYOj.js +0 -1
  526. package/web-ui/build/static/asm6502-B1l2Hc9j.js +0 -1
  527. package/web-ui/build/static/asmatmel-BAojNNWJ.js +0 -1
  528. package/web-ui/build/static/aspectj-DqZFhwdh.js +0 -1
  529. package/web-ui/build/static/aspnet-C0kQPqSr.js +0 -1
  530. package/web-ui/build/static/autohotkey-DY25td-Z.js +0 -1
  531. package/web-ui/build/static/autohotkey-DlqXINgk.js +0 -1
  532. package/web-ui/build/static/autoit-By7J2Y34.js +0 -1
  533. package/web-ui/build/static/autoit-nsu9sBga.js +0 -1
  534. package/web-ui/build/static/avisynth-DmhvVsr-.js +0 -1
  535. package/web-ui/build/static/avrasm-CHfBwwoQ.js +0 -1
  536. package/web-ui/build/static/avro-idl-BKgIWEIF.js +0 -1
  537. package/web-ui/build/static/awk-CpAb4d4E.js +0 -1
  538. package/web-ui/build/static/axapta-CM4aTfCZ.js +0 -1
  539. package/web-ui/build/static/bash-D1KTDlk-.js +0 -1
  540. package/web-ui/build/static/bash-DShkskxb.js +0 -1
  541. package/web-ui/build/static/basic-C4CfKvhg.js +0 -1
  542. package/web-ui/build/static/basic-CkQS4VwL.js +0 -1
  543. package/web-ui/build/static/batch-DZtrClI1.js +0 -1
  544. package/web-ui/build/static/bbcode-CY2FsfaO.js +0 -1
  545. package/web-ui/build/static/bicep-BeSEpm_3.js +0 -1
  546. package/web-ui/build/static/birb-huu22Mwu.js +0 -1
  547. package/web-ui/build/static/bison-CmbxfR57.js +0 -1
  548. package/web-ui/build/static/bnf-c2l_4HXN.js +0 -1
  549. package/web-ui/build/static/bnf-wucEDTqY.js +0 -1
  550. package/web-ui/build/static/brainfuck-CzWBg5U7.js +0 -1
  551. package/web-ui/build/static/brainfuck-I_YQ4sma.js +0 -1
  552. package/web-ui/build/static/brightscript-LOkD4eYW.js +0 -1
  553. package/web-ui/build/static/bro-CLJ7Afqo.js +0 -1
  554. package/web-ui/build/static/bsl-DbUgC2FQ.js +0 -1
  555. package/web-ui/build/static/c-C0S2D2ge.js +0 -1
  556. package/web-ui/build/static/c-KH25O_pL.js +0 -1
  557. package/web-ui/build/static/c-like-DtAFxyl_.js +0 -1
  558. package/web-ui/build/static/cal-uGiVJBNC.js +0 -1
  559. package/web-ui/build/static/capnproto-DSLchjOW.js +0 -1
  560. package/web-ui/build/static/ceylon-Bbxk66YL.js +0 -1
  561. package/web-ui/build/static/cfscript-CjDdgKbl.js +0 -1
  562. package/web-ui/build/static/chaiscript-CnRXaMae.js +0 -1
  563. package/web-ui/build/static/cil-CM9ygF3R.js +0 -1
  564. package/web-ui/build/static/clean-ppAH0SYy.js +0 -1
  565. package/web-ui/build/static/clojure-C5LVccGq.js +0 -1
  566. package/web-ui/build/static/clojure-DtLXiuuC.js +0 -1
  567. package/web-ui/build/static/clojure-repl-fSdrYuup.js +0 -1
  568. package/web-ui/build/static/cmake-AD1fuzSY.js +0 -1
  569. package/web-ui/build/static/cmake-D-o08Yta.js +0 -1
  570. package/web-ui/build/static/cobol-bDh1KHf9.js +0 -1
  571. package/web-ui/build/static/coffeescript-D8InK8kf.js +0 -1
  572. package/web-ui/build/static/coffeescript-MKWUOXb5.js +0 -1
  573. package/web-ui/build/static/concurnas-CR56nj6R.js +0 -1
  574. package/web-ui/build/static/coq-DDLBsBJu.js +0 -1
  575. package/web-ui/build/static/coq-WbhtANeW.js +0 -1
  576. package/web-ui/build/static/cos-Bfmre3op.js +0 -1
  577. package/web-ui/build/static/cpp-Cdy6A7gI.js +0 -1
  578. package/web-ui/build/static/cpp-De2KZejr.js +0 -1
  579. package/web-ui/build/static/crmsh-uf3vbKnN.js +0 -1
  580. package/web-ui/build/static/crystal-BHMyEVPP.js +0 -1
  581. package/web-ui/build/static/crystal-DXAQwftg.js +0 -1
  582. package/web-ui/build/static/csharp-Ci2MRG6L.js +0 -1
  583. package/web-ui/build/static/csharp-D8MV2a7f.js +0 -1
  584. package/web-ui/build/static/cshtml-kVj3v3uY.js +0 -1
  585. package/web-ui/build/static/csp-B83CCdVc.js +0 -1
  586. package/web-ui/build/static/csp-DUO7zlPh.js +0 -1
  587. package/web-ui/build/static/css-BWsx7mtO.js +0 -1
  588. package/web-ui/build/static/css-extras-oHch2Y5C.js +0 -1
  589. package/web-ui/build/static/csv-DIf0iNlc.js +0 -1
  590. package/web-ui/build/static/cypher-B1rOF_f3.js +0 -1
  591. package/web-ui/build/static/d-BUgLS87u.js +0 -1
  592. package/web-ui/build/static/d-ClM8XTCr.js +0 -1
  593. package/web-ui/build/static/dart-D5rVGtrb.js +0 -1
  594. package/web-ui/build/static/dart-Oal__k4m.js +0 -1
  595. package/web-ui/build/static/dataweave-B0uxnNDC.js +0 -1
  596. package/web-ui/build/static/dax-B9z6d1P6.js +0 -1
  597. package/web-ui/build/static/delphi-KMlx8q8A.js +0 -1
  598. package/web-ui/build/static/dhall-DLWFgSR8.js +0 -1
  599. package/web-ui/build/static/diff-DDMGnyhE.js +0 -1
  600. package/web-ui/build/static/diff-yg1oXq3U.js +0 -1
  601. package/web-ui/build/static/django-BDtkIu_c.js +0 -1
  602. package/web-ui/build/static/django-Bkn9HlyQ.js +0 -1
  603. package/web-ui/build/static/dns-Bx1VHfo6.js +0 -1
  604. package/web-ui/build/static/dns-zone-file-Bgn5zn_J.js +0 -1
  605. package/web-ui/build/static/docker-CTdrZJHc.js +0 -1
  606. package/web-ui/build/static/dockerfile-B7ziWbf_.js +0 -1
  607. package/web-ui/build/static/dos-cbBC5Icj.js +0 -1
  608. package/web-ui/build/static/dot-JXSVTLEH.js +0 -1
  609. package/web-ui/build/static/dsconfig-sEua2C2o.js +0 -1
  610. package/web-ui/build/static/dts-Zem_gT_O.js +0 -1
  611. package/web-ui/build/static/dust-B-dZ6-uQ.js +0 -1
  612. package/web-ui/build/static/ebnf-CXfeZoXF.js +0 -1
  613. package/web-ui/build/static/ebnf-raQs4FpT.js +0 -1
  614. package/web-ui/build/static/editorconfig-hp8ARbHf.js +0 -1
  615. package/web-ui/build/static/eiffel-tO3jaG00.js +0 -1
  616. package/web-ui/build/static/ejs-BGmD5Rvl.js +0 -1
  617. package/web-ui/build/static/elixir-CF0JDN9L.js +0 -1
  618. package/web-ui/build/static/elixir-CFSil_Ou.js +0 -1
  619. package/web-ui/build/static/elm-As6XaD-g.js +0 -1
  620. package/web-ui/build/static/elm-pw5GpqTZ.js +0 -1
  621. package/web-ui/build/static/erb-BrpCJIyN.js +0 -1
  622. package/web-ui/build/static/erb-D2_eJU9C.js +0 -1
  623. package/web-ui/build/static/erlang-5rSv6NMZ.js +0 -1
  624. package/web-ui/build/static/erlang-RCAxVMBd.js +0 -1
  625. package/web-ui/build/static/erlang-repl-BN0h_6XR.js +0 -1
  626. package/web-ui/build/static/etlua-BMtMnKtv.js +0 -1
  627. package/web-ui/build/static/excel-CRNS57iM.js +0 -1
  628. package/web-ui/build/static/excel-formula-BNw56R2m.js +0 -1
  629. package/web-ui/build/static/factor-7lsloWTf.js +0 -1
  630. package/web-ui/build/static/false-CQUvGnfd.js +0 -1
  631. package/web-ui/build/static/firestore-security-rules-WC1PabFS.js +0 -1
  632. package/web-ui/build/static/fix-Cs6kLeYV.js +0 -1
  633. package/web-ui/build/static/flix-1fdMgw2I.js +0 -1
  634. package/web-ui/build/static/flow-CRPduKSH.js +0 -1
  635. package/web-ui/build/static/fortran-C-3TUt5R.js +0 -1
  636. package/web-ui/build/static/fortran-CA4bbZCj.js +0 -1
  637. package/web-ui/build/static/fsharp-BScjCFae.js +0 -1
  638. package/web-ui/build/static/fsharp-BtHWuW4o.js +0 -1
  639. package/web-ui/build/static/ftl-Re-S2zvF.js +0 -1
  640. package/web-ui/build/static/gams-Cr12l-cM.js +0 -1
  641. package/web-ui/build/static/gap-H0O9-Zju.js +0 -1
  642. package/web-ui/build/static/gauss-CW8jwURx.js +0 -1
  643. package/web-ui/build/static/gcode-CIxfYtg9.js +0 -1
  644. package/web-ui/build/static/gcode-CVqRWYeB.js +0 -1
  645. package/web-ui/build/static/gdscript-BltZCaKl.js +0 -1
  646. package/web-ui/build/static/gedcom-nMT5ety_.js +0 -1
  647. package/web-ui/build/static/gherkin-B4M7CGOo.js +0 -1
  648. package/web-ui/build/static/gherkin-DumuqAQF.js +0 -1
  649. package/web-ui/build/static/git-BBiBlZ5H.js +0 -1
  650. package/web-ui/build/static/glsl-D8ckiRVo.js +0 -1
  651. package/web-ui/build/static/glsl-Z4VdDyPa.js +0 -1
  652. package/web-ui/build/static/gml-BHuSndHE.js +0 -1
  653. package/web-ui/build/static/gml-DZpfN_A4.js +0 -1
  654. package/web-ui/build/static/gn-BjpAHNh_.js +0 -1
  655. package/web-ui/build/static/go-BeZ9IgZB.js +0 -1
  656. package/web-ui/build/static/go-HEXrcgIc.js +0 -1
  657. package/web-ui/build/static/go-module-BGdPb7sP.js +0 -1
  658. package/web-ui/build/static/golo-Cr70KUbI.js +0 -1
  659. package/web-ui/build/static/gradle-C7MXrDnB.js +0 -1
  660. package/web-ui/build/static/graphql-CJK0wQjf.js +0 -1
  661. package/web-ui/build/static/groovy-Bwe7hkFG.js +0 -1
  662. package/web-ui/build/static/groovy-Dc6WDoKa.js +0 -1
  663. package/web-ui/build/static/haml-BSsAjltt.js +0 -1
  664. package/web-ui/build/static/haml-CZih7X_4.js +0 -1
  665. package/web-ui/build/static/handlebars-CN8hCpsy.js +0 -1
  666. package/web-ui/build/static/handlebars-XBLc7i13.js +0 -1
  667. package/web-ui/build/static/haskell-BH9WhK10.js +0 -1
  668. package/web-ui/build/static/haskell-Djf2J1vd.js +0 -1
  669. package/web-ui/build/static/haxe-BllD-W9e.js +0 -1
  670. package/web-ui/build/static/haxe-DY8Hyn7u.js +0 -1
  671. package/web-ui/build/static/hcl-CfktAP2o.js +0 -1
  672. package/web-ui/build/static/hlsl-B2JSOD9d.js +0 -1
  673. package/web-ui/build/static/hoon-BILyDobB.js +0 -1
  674. package/web-ui/build/static/hpkp-Bb8rXx4p.js +0 -1
  675. package/web-ui/build/static/hsp-BmjeJC21.js +0 -1
  676. package/web-ui/build/static/hsts-DJhW57Fu.js +0 -1
  677. package/web-ui/build/static/htmlbars-CJe_ZLjw.js +0 -1
  678. package/web-ui/build/static/http-D7SlABvQ.js +0 -1
  679. package/web-ui/build/static/http-DEUJqmEm.js +0 -1
  680. package/web-ui/build/static/hy-DVfsgEbr.js +0 -1
  681. package/web-ui/build/static/ichigojam-CPdz2bOt.js +0 -1
  682. package/web-ui/build/static/icon-DYK9RbU9.js +0 -1
  683. package/web-ui/build/static/icu-message-format-HiZB_alB.js +0 -1
  684. package/web-ui/build/static/idris-Clk3tJIE.js +0 -1
  685. package/web-ui/build/static/iecst-D7wkeksq.js +0 -1
  686. package/web-ui/build/static/ignore-GSm-L3jG.js +0 -1
  687. package/web-ui/build/static/index-BJe5td0v.js +0 -13
  688. package/web-ui/build/static/index-BYvljeMN.js +0 -1
  689. package/web-ui/build/static/index-CLelJq9j.js +0 -1156
  690. package/web-ui/build/static/index-f5UnFSsY.css +0 -1
  691. package/web-ui/build/static/inform7-D3gc0hSc.js +0 -1
  692. package/web-ui/build/static/inform7-DLdvZTxX.js +0 -1
  693. package/web-ui/build/static/ini-CVcWx1TA.js +0 -1
  694. package/web-ui/build/static/ini-CxYBdsvZ.js +0 -1
  695. package/web-ui/build/static/io-D760QF0i.js +0 -1
  696. package/web-ui/build/static/irpf90-DfkXdZut.js +0 -1
  697. package/web-ui/build/static/isbl-Bl3W-krY.js +0 -1
  698. package/web-ui/build/static/j-DyJj9FSc.js +0 -1
  699. package/web-ui/build/static/java-CLw1cH97.js +0 -1
  700. package/web-ui/build/static/java-vXaHBzP4.js +0 -1
  701. package/web-ui/build/static/javadoc-p5hIe48g.js +0 -1
  702. package/web-ui/build/static/javadoclike-OXi-sQ0q.js +0 -1
  703. package/web-ui/build/static/javascript-CTSqES8o.js +0 -1
  704. package/web-ui/build/static/javastacktrace-PC9-3moA.js +0 -1
  705. package/web-ui/build/static/jboss-cli-CxOZKDLi.js +0 -1
  706. package/web-ui/build/static/jexl-C4kSXhD1.js +0 -1
  707. package/web-ui/build/static/jolie-CntM8cWx.js +0 -1
  708. package/web-ui/build/static/jq-D_4bTCm0.js +0 -1
  709. package/web-ui/build/static/js-extras-Cx9VAZJd.js +0 -1
  710. package/web-ui/build/static/js-templates-BqyJUDxJ.js +0 -1
  711. package/web-ui/build/static/jsdoc-CNHLgAph.js +0 -1
  712. package/web-ui/build/static/json-BXIFrbVC.js +0 -1
  713. package/web-ui/build/static/json-DRUrJL_F.js +0 -1
  714. package/web-ui/build/static/json5-EsTrOpXr.js +0 -1
  715. package/web-ui/build/static/jsonp-RijEuTJY.js +0 -1
  716. package/web-ui/build/static/jsstacktrace-dM13uE1y.js +0 -1
  717. package/web-ui/build/static/jsx-Cf0j02DZ.js +0 -1
  718. package/web-ui/build/static/julia-BLrtj5Dj.js +0 -1
  719. package/web-ui/build/static/julia-D0PJgQhi.js +0 -1
  720. package/web-ui/build/static/julia-repl-BLnLCve4.js +0 -1
  721. package/web-ui/build/static/keepalived-SvzEYloD.js +0 -1
  722. package/web-ui/build/static/keyman-B5l2mmmE.js +0 -1
  723. package/web-ui/build/static/kotlin-B_6COR1e.js +0 -1
  724. package/web-ui/build/static/kotlin-vd1Xdz6D.js +0 -1
  725. package/web-ui/build/static/kumir-8mIZWgJQ.js +0 -1
  726. package/web-ui/build/static/kusto-CoV2oHqt.js +0 -1
  727. package/web-ui/build/static/lasso-BjjUNa_o.js +0 -1
  728. package/web-ui/build/static/latex-C9KOfuFk.js +0 -1
  729. package/web-ui/build/static/latex-DhLttY-I.js +0 -1
  730. package/web-ui/build/static/latte-CaYNaOoK.js +0 -1
  731. package/web-ui/build/static/ldif-DFxnpH3G.js +0 -1
  732. package/web-ui/build/static/leaf-DrMpC83a.js +0 -1
  733. package/web-ui/build/static/less-DUoYpEFn.js +0 -1
  734. package/web-ui/build/static/less-nh0XCcut.js +0 -1
  735. package/web-ui/build/static/lilypond-BlqjLr3W.js +0 -1
  736. package/web-ui/build/static/liquid-BVGHSG0T.js +0 -1
  737. package/web-ui/build/static/lisp-CEK8BtYQ.js +0 -1
  738. package/web-ui/build/static/lisp-D_jGHxhc.js +0 -1
  739. package/web-ui/build/static/livecodeserver-CFUDw_SK.js +0 -1
  740. package/web-ui/build/static/livescript-C5xzpiLM.js +0 -1
  741. package/web-ui/build/static/livescript-CKoPcK0c.js +0 -1
  742. package/web-ui/build/static/llvm-BBOVIeTl.js +0 -1
  743. package/web-ui/build/static/llvm-ioC5bCUB.js +0 -1
  744. package/web-ui/build/static/log-CPYTqm4T.js +0 -1
  745. package/web-ui/build/static/lolcode-BkT93adT.js +0 -1
  746. package/web-ui/build/static/lsl-M98YPNRW.js +0 -1
  747. package/web-ui/build/static/lua-D7Lum5n9.js +0 -1
  748. package/web-ui/build/static/lua-DHyr0QwE.js +0 -1
  749. package/web-ui/build/static/magma-BwMFjwQu.js +0 -1
  750. package/web-ui/build/static/makefile-BFYZ-SfG.js +0 -1
  751. package/web-ui/build/static/makefile-D6oyR2lD.js +0 -1
  752. package/web-ui/build/static/markdown-6jtg6KZm.js +0 -1
  753. package/web-ui/build/static/markdown-DTLtPgeP.js +0 -1
  754. package/web-ui/build/static/markup-templating-K8uoAIqY.js +0 -1
  755. package/web-ui/build/static/mathematica-cW5hOuB2.js +0 -1
  756. package/web-ui/build/static/matlab-CwSNWEq8.js +0 -1
  757. package/web-ui/build/static/matlab-MQ972BY-.js +0 -1
  758. package/web-ui/build/static/maxima-CMSFLri-.js +0 -1
  759. package/web-ui/build/static/maxscript-BzcoS2KA.js +0 -1
  760. package/web-ui/build/static/mel-Cd20pAs-.js +0 -1
  761. package/web-ui/build/static/mel-KWG5N49g.js +0 -1
  762. package/web-ui/build/static/mercury-eW1ljJh0.js +0 -1
  763. package/web-ui/build/static/mermaid-D3zeCM84.js +0 -1
  764. package/web-ui/build/static/mipsasm-B5g6Ndra.js +0 -1
  765. package/web-ui/build/static/mizar-C_nZ0Ts9.js +0 -1
  766. package/web-ui/build/static/mizar-CuTNEv2t.js +0 -1
  767. package/web-ui/build/static/mojolicious-C1Xq--lT.js +0 -1
  768. package/web-ui/build/static/mongodb-C_3giArw.js +0 -1
  769. package/web-ui/build/static/monkey-DQ1olPd-.js +0 -1
  770. package/web-ui/build/static/monkey-n4Tbrep7.js +0 -1
  771. package/web-ui/build/static/moonscript-CmnQJuIL.js +0 -1
  772. package/web-ui/build/static/moonscript-DXgmWjLy.js +0 -1
  773. package/web-ui/build/static/n1ql-531a3W-1.js +0 -1
  774. package/web-ui/build/static/n1ql-BYH9EvME.js +0 -1
  775. package/web-ui/build/static/n4js-Cy0LcM-V.js +0 -1
  776. package/web-ui/build/static/nand2tetris-hdl-CKOztBDD.js +0 -1
  777. package/web-ui/build/static/naniscript-oLFpxBGE.js +0 -1
  778. package/web-ui/build/static/nasm-DLPnwFkM.js +0 -1
  779. package/web-ui/build/static/neon-Cn03wGUR.js +0 -1
  780. package/web-ui/build/static/nevod-C_VRvbdf.js +0 -1
  781. package/web-ui/build/static/nginx-60SpLv4t.js +0 -1
  782. package/web-ui/build/static/nginx-DZLHid-q.js +0 -1
  783. package/web-ui/build/static/nim-BnrHdqGC.js +0 -1
  784. package/web-ui/build/static/nim-Ds3pmwtE.js +0 -1
  785. package/web-ui/build/static/nix-Dl-dS0w4.js +0 -1
  786. package/web-ui/build/static/nix-jL62FzTz.js +0 -1
  787. package/web-ui/build/static/node-repl-BAuDzNZd.js +0 -1
  788. package/web-ui/build/static/nsis-CEnFjfNr.js +0 -1
  789. package/web-ui/build/static/nsis-CcCz6HIu.js +0 -1
  790. package/web-ui/build/static/objectivec-CZXfVowS.js +0 -1
  791. package/web-ui/build/static/objectivec-CuaFU-Ef.js +0 -1
  792. package/web-ui/build/static/ocaml-BGAzfwAx.js +0 -1
  793. package/web-ui/build/static/ocaml-BoO1lU26.js +0 -1
  794. package/web-ui/build/static/opencl-DAnD5xP-.js +0 -1
  795. package/web-ui/build/static/openqasm-CO7gdVj9.js +0 -1
  796. package/web-ui/build/static/openscad-B2wMEMQR.js +0 -1
  797. package/web-ui/build/static/oxygene-1erv93gF.js +0 -1
  798. package/web-ui/build/static/oz-D3334gi7.js +0 -1
  799. package/web-ui/build/static/parigp-rQZTN8zi.js +0 -1
  800. package/web-ui/build/static/parser-B4ZSZ1ig.js +0 -1
  801. package/web-ui/build/static/parser3-CCCjkYLG.js +0 -1
  802. package/web-ui/build/static/pascal-DeC9Pvom.js +0 -1
  803. package/web-ui/build/static/pascaligo-CT2u6UpO.js +0 -1
  804. package/web-ui/build/static/pcaxis-CvlRg6t4.js +0 -1
  805. package/web-ui/build/static/peoplecode-BYahULz2.js +0 -1
  806. package/web-ui/build/static/perl-CKgvyY59.js +0 -1
  807. package/web-ui/build/static/perl-E7sx7Izv.js +0 -1
  808. package/web-ui/build/static/pf-D9wnFBt7.js +0 -1
  809. package/web-ui/build/static/pgsql-CrlBdRAn.js +0 -1
  810. package/web-ui/build/static/php-D2O-B3y7.js +0 -1
  811. package/web-ui/build/static/php-extras-BKqZuzgt.js +0 -1
  812. package/web-ui/build/static/php-nfXl9WfB.js +0 -1
  813. package/web-ui/build/static/php-template-Cg8ERLNQ.js +0 -1
  814. package/web-ui/build/static/phpdoc-Z1u90OwH.js +0 -1
  815. package/web-ui/build/static/plaintext-DkNVeXWx.js +0 -1
  816. package/web-ui/build/static/plsql-DO5fJNhS.js +0 -1
  817. package/web-ui/build/static/pony-DXIqq5Bk.js +0 -1
  818. package/web-ui/build/static/powerquery-B2ovxJZi.js +0 -1
  819. package/web-ui/build/static/powershell-BVeqqari.js +0 -1
  820. package/web-ui/build/static/powershell-CskV4qWh.js +0 -1
  821. package/web-ui/build/static/processing-D90SJpnq.js +0 -1
  822. package/web-ui/build/static/processing-DP2mf97Z.js +0 -1
  823. package/web-ui/build/static/profile-H6zk8v_f.js +0 -1
  824. package/web-ui/build/static/prolog-AUfxYiJV.js +0 -1
  825. package/web-ui/build/static/prolog-Dz2WdsVN.js +0 -1
  826. package/web-ui/build/static/promql-CloMJmMW.js +0 -1
  827. package/web-ui/build/static/properties-CTl3mnrP.js +0 -1
  828. package/web-ui/build/static/properties-D2RfteTZ.js +0 -1
  829. package/web-ui/build/static/protobuf-Be9oqQCu.js +0 -1
  830. package/web-ui/build/static/protobuf-BgG8zUnY.js +0 -1
  831. package/web-ui/build/static/psl-Bqx8iN9e.js +0 -1
  832. package/web-ui/build/static/pug-CHfFC0Wg.js +0 -1
  833. package/web-ui/build/static/puppet-__1ifzZS.js +0 -1
  834. package/web-ui/build/static/puppet-pbtRCMgd.js +0 -1
  835. package/web-ui/build/static/pure-B9STuf4F.js +0 -1
  836. package/web-ui/build/static/purebasic-7ADyn-Ce.js +0 -1
  837. package/web-ui/build/static/purebasic-Bc06YQcD.js +0 -1
  838. package/web-ui/build/static/purescript-CU-dDebr.js +0 -1
  839. package/web-ui/build/static/python-BEsXrEbi.js +0 -1
  840. package/web-ui/build/static/python-CZFrgH2X.js +0 -1
  841. package/web-ui/build/static/python-repl-CI9GmJce.js +0 -1
  842. package/web-ui/build/static/q-E7xvTGRo.js +0 -1
  843. package/web-ui/build/static/q-hvg9aQoY.js +0 -1
  844. package/web-ui/build/static/qml-DkZWcxEv.js +0 -1
  845. package/web-ui/build/static/qml-DpdWla8G.js +0 -1
  846. package/web-ui/build/static/qore-Dsm7ACR_.js +0 -1
  847. package/web-ui/build/static/qsharp-BBec6MJR.js +0 -1
  848. package/web-ui/build/static/r-CTVkq_Ky.js +0 -1
  849. package/web-ui/build/static/r-DHGNCupF.js +0 -1
  850. package/web-ui/build/static/racket-hoSh4YPx.js +0 -1
  851. package/web-ui/build/static/reason-CQPUIbsm.js +0 -1
  852. package/web-ui/build/static/reasonml-BXtFFSTZ.js +0 -1
  853. package/web-ui/build/static/regex-BNkF_ufb.js +0 -1
  854. package/web-ui/build/static/rego-BXHrjItC.js +0 -1
  855. package/web-ui/build/static/renpy-CBQvK_5t.js +0 -1
  856. package/web-ui/build/static/rest-Bf8hzmF1.js +0 -1
  857. package/web-ui/build/static/rib-D0a4KzlP.js +0 -1
  858. package/web-ui/build/static/rip-DchN4BQN.js +0 -1
  859. package/web-ui/build/static/roboconf-HXnyGNTm.js +0 -1
  860. package/web-ui/build/static/roboconf-zfK6mgmU.js +0 -1
  861. package/web-ui/build/static/robotframework-DnP-vXyd.js +0 -1
  862. package/web-ui/build/static/routeros-CDirYxZY.js +0 -1
  863. package/web-ui/build/static/rsl-BCK_msc-.js +0 -1
  864. package/web-ui/build/static/ruby--mXX6GNK.js +0 -1
  865. package/web-ui/build/static/ruby-BIdQYq0Y.js +0 -1
  866. package/web-ui/build/static/ruleslanguage-BD07s5RU.js +0 -1
  867. package/web-ui/build/static/rust-Bgni9V7U.js +0 -1
  868. package/web-ui/build/static/rust-OywmQ2ox.js +0 -1
  869. package/web-ui/build/static/sas-B6-82htH.js +0 -1
  870. package/web-ui/build/static/sas-k9XEScbR.js +0 -1
  871. package/web-ui/build/static/sass-BOvNBStT.js +0 -1
  872. package/web-ui/build/static/scala-At07fmMd.js +0 -1
  873. package/web-ui/build/static/scala-DUOfqSaU.js +0 -1
  874. package/web-ui/build/static/scheme-B87lC0bK.js +0 -1
  875. package/web-ui/build/static/scheme-BS7OzWRX.js +0 -1
  876. package/web-ui/build/static/scilab-Bmn4jjcu.js +0 -1
  877. package/web-ui/build/static/scss-DTeB95yE.js +0 -1
  878. package/web-ui/build/static/scss-xilnl6Dx.js +0 -1
  879. package/web-ui/build/static/shell-CKetyy4y.js +0 -1
  880. package/web-ui/build/static/shell-session-B6rat2c7.js +0 -1
  881. package/web-ui/build/static/smali-C9O9CXOD.js +0 -1
  882. package/web-ui/build/static/smali-CBkgbinS.js +0 -1
  883. package/web-ui/build/static/smalltalk-CuUjFHiz.js +0 -1
  884. package/web-ui/build/static/smalltalk-D0xhFL9b.js +0 -1
  885. package/web-ui/build/static/smarty-CY0N0d5x.js +0 -1
  886. package/web-ui/build/static/sml-BVAw3fjB.js +0 -1
  887. package/web-ui/build/static/sml-CO9XB1ax.js +0 -1
  888. package/web-ui/build/static/solidity-BNixD4Dx.js +0 -1
  889. package/web-ui/build/static/solution-file-DHyGXf2y.js +0 -1
  890. package/web-ui/build/static/soy-Cxgjntsl.js +0 -1
  891. package/web-ui/build/static/sparql-CDLqu9vy.js +0 -1
  892. package/web-ui/build/static/splunk-spl-Cmkl_Xmw.js +0 -1
  893. package/web-ui/build/static/sqf-CIGKolw3.js +0 -1
  894. package/web-ui/build/static/sqf-Cfp_lC6-.js +0 -1
  895. package/web-ui/build/static/sql-DHOGwYxe.js +0 -1
  896. package/web-ui/build/static/sql-QIw1Q2yi.js +0 -1
  897. package/web-ui/build/static/sql_more-C0b3-InT.js +0 -1
  898. package/web-ui/build/static/squirrel-DASToo1F.js +0 -1
  899. package/web-ui/build/static/stan-DHMkcFZg.js +0 -1
  900. package/web-ui/build/static/stan-No3nsdnQ.js +0 -1
  901. package/web-ui/build/static/stata-Brkzu5Nv.js +0 -1
  902. package/web-ui/build/static/step21-D2l5M5Ml.js +0 -1
  903. package/web-ui/build/static/stylus-Bx6FaZN_.js +0 -1
  904. package/web-ui/build/static/stylus-CVkTaPns.js +0 -1
  905. package/web-ui/build/static/subunit-CDrsAMuL.js +0 -1
  906. package/web-ui/build/static/swift-BSw_pS-l.js +0 -1
  907. package/web-ui/build/static/swift-BWyqwIo8.js +0 -1
  908. package/web-ui/build/static/systemd-BwqpYcJK.js +0 -1
  909. package/web-ui/build/static/t4-cs-CwsJLOxV.js +0 -1
  910. package/web-ui/build/static/t4-templating-BfxY01xf.js +0 -1
  911. package/web-ui/build/static/t4-vb-BhsKKFhp.js +0 -1
  912. package/web-ui/build/static/taggerscript-Bkew95or.js +0 -1
  913. package/web-ui/build/static/tap-DHovcHbS.js +0 -1
  914. package/web-ui/build/static/tap-DPl9uPo4.js +0 -1
  915. package/web-ui/build/static/tcl-BeozHO-f.js +0 -1
  916. package/web-ui/build/static/tcl-Df_8ItQH.js +0 -1
  917. package/web-ui/build/static/textile-B3m_f58b.js +0 -1
  918. package/web-ui/build/static/thrift-D20n-HpW.js +0 -1
  919. package/web-ui/build/static/toml-C-fTAonK.js +0 -1
  920. package/web-ui/build/static/tp-hGbXe5Eo.js +0 -1
  921. package/web-ui/build/static/tremor-BaVOtRFz.js +0 -1
  922. package/web-ui/build/static/tsx-ChPInNl0.js +0 -1
  923. package/web-ui/build/static/tt2-DAIJ8cpz.js +0 -1
  924. package/web-ui/build/static/turtle-B7z_y-PK.js +0 -1
  925. package/web-ui/build/static/twig-TUEkve6W.js +0 -1
  926. package/web-ui/build/static/twig-stKDItz7.js +0 -1
  927. package/web-ui/build/static/typescript-BPdM-QOM.js +0 -1
  928. package/web-ui/build/static/typescript-DjSY4MvL.js +0 -1
  929. package/web-ui/build/static/typoscript-BQHgQtEL.js +0 -1
  930. package/web-ui/build/static/unrealscript-g8yNPQQ5.js +0 -1
  931. package/web-ui/build/static/uorazor-CnuMiQz9.js +0 -1
  932. package/web-ui/build/static/uri-CfioiemU.js +0 -1
  933. package/web-ui/build/static/v-B69Oau14.js +0 -1
  934. package/web-ui/build/static/vala-C0PjlK3l.js +0 -1
  935. package/web-ui/build/static/vala-COgjD3gU.js +0 -1
  936. package/web-ui/build/static/vbnet-CklOnyuR.js +0 -1
  937. package/web-ui/build/static/vbnet-MxHUC5Mz.js +0 -1
  938. package/web-ui/build/static/vbscript-BxQnA97w.js +0 -1
  939. package/web-ui/build/static/vbscript-html-DOtde7dD.js +0 -1
  940. package/web-ui/build/static/velocity-l8B9m66X.js +0 -1
  941. package/web-ui/build/static/verilog-DF6dF-Vp.js +0 -1
  942. package/web-ui/build/static/verilog-Dgb9SDRX.js +0 -1
  943. package/web-ui/build/static/vhdl-0GarU_AK.js +0 -1
  944. package/web-ui/build/static/vhdl-BfPQnOdI.js +0 -1
  945. package/web-ui/build/static/vim-Likg_-II.js +0 -1
  946. package/web-ui/build/static/vim-k53Sj7A3.js +0 -1
  947. package/web-ui/build/static/visual-basic-BNVZCzlV.js +0 -1
  948. package/web-ui/build/static/warpscript-BkLK5iuW.js +0 -1
  949. package/web-ui/build/static/wasm-CQhA1ece.js +0 -1
  950. package/web-ui/build/static/web-idl-DmNsI0kE.js +0 -1
  951. package/web-ui/build/static/wiki-B3z4pmra.js +0 -1
  952. package/web-ui/build/static/wolfram-Dsf21d_g.js +0 -1
  953. package/web-ui/build/static/wren-BZXZlzrL.js +0 -1
  954. package/web-ui/build/static/x86asm-DpWGZhJU.js +0 -1
  955. package/web-ui/build/static/xeora-8xPZN4DH.js +0 -1
  956. package/web-ui/build/static/xl-XkdWYMGl.js +0 -1
  957. package/web-ui/build/static/xml-BBdROEWt.js +0 -1
  958. package/web-ui/build/static/xml-doc-Cjs4OpTe.js +0 -1
  959. package/web-ui/build/static/xojo-nCen1FPx.js +0 -1
  960. package/web-ui/build/static/xquery-CBFkAxo1.js +0 -1
  961. package/web-ui/build/static/xquery-Dwsc1weX.js +0 -1
  962. package/web-ui/build/static/yaml-DzSAh6jl.js +0 -1
  963. package/web-ui/build/static/yaml-Lg8gnEUU.js +0 -1
  964. package/web-ui/build/static/yang-Bd-v2b0k.js +0 -1
  965. package/web-ui/build/static/zephir-wbJOizIa.js +0 -1
  966. package/web-ui/build/static/zig-Cz384XjE.js +0 -1
@@ -0,0 +1,487 @@
1
+ /**
2
+ * Tests for the account-proxy router on the local CLI server.
3
+ *
4
+ * These tests cover three categories of behavior:
5
+ *
6
+ * 1. Auth gating — every route MUST return 401 + `not_signed_in`
7
+ * when there's no JWT, never silently fall through to the
8
+ * backend with no auth.
9
+ *
10
+ * 2. JWT forwarding + envelope normalisation — when a JWT is
11
+ * present, the backend is called with a Bearer header, and
12
+ * every response (200, 404, 503, JSON-shape variations) lands
13
+ * in our standard `{ success, error?, code? }` envelope.
14
+ *
15
+ * 3. Handoff URL building — the FE never gets to pick which
16
+ * portal we redirect to, and the handoff is only ever the
17
+ * short-lived token, never the long-lived JWT.
18
+ *
19
+ * The router is constructed with injected `getJwt`, `getBrand`, and
20
+ * `fetchImpl` — no real HTTP, no real `lastAuthResult` plumbing.
21
+ */
22
+
23
+ import { describe, test, expect, jest } from '@jest/globals';
24
+ import express from 'express';
25
+ import { createServer } from 'http';
26
+ import { createAccountRouter, ERROR_CODES, __test__ } from '../accountRoutes.js';
27
+
28
+ const SAMPLE_JWT = 'eyJ.sample.jwt';
29
+ const BACKEND_URL = 'https://backend.test';
30
+
31
+ async function startApp(handler) {
32
+ const app = express();
33
+ app.use(express.json());
34
+ handler(app);
35
+ const server = createServer(app);
36
+ await new Promise(r => server.listen(0, r));
37
+ return { server, baseUrl: `http://127.0.0.1:${server.address().port}` };
38
+ }
39
+
40
+ async function stop(server) { if (server) await new Promise(r => server.close(r)); }
41
+
42
+ function mountRouter({ jwt = SAMPLE_JWT, brand = 'autopilot', fetchImpl, logger = { warn: () => {} } } = {}) {
43
+ const router = createAccountRouter({
44
+ getJwt: () => jwt,
45
+ getBrand: () => brand,
46
+ backendBaseUrl: BACKEND_URL,
47
+ fetchImpl,
48
+ logger,
49
+ });
50
+ return async () => {
51
+ return startApp(app => app.use('/api/account', router));
52
+ };
53
+ }
54
+
55
+ // ────────────────────────────────────────────────────────────────────
56
+ // Constructor guards
57
+ // ────────────────────────────────────────────────────────────────────
58
+ describe('createAccountRouter — constructor', () => {
59
+ test('throws when getJwt is missing', () => {
60
+ expect(() => createAccountRouter({ getBrand: () => 'autopilot' })).toThrow(/getJwt/);
61
+ });
62
+ test('throws when getBrand is missing', () => {
63
+ expect(() => createAccountRouter({ getJwt: () => null })).toThrow(/getBrand/);
64
+ });
65
+ });
66
+
67
+ // ────────────────────────────────────────────────────────────────────
68
+ // Auth gating
69
+ // ────────────────────────────────────────────────────────────────────
70
+ describe('account routes — auth gating', () => {
71
+ test.each([
72
+ ['GET', '/api/account/profile', undefined],
73
+ ['GET', '/api/account/balance', undefined],
74
+ ['GET', '/api/account/keys', undefined],
75
+ ['POST', '/api/account/keys', { name: 'CI key' }],
76
+ ['DELETE', '/api/account/keys/some-id', undefined],
77
+ ['POST', '/api/account/handoff', {}],
78
+ ])('%s %s returns 401 not_signed_in when JWT is absent', async (method, path, body) => {
79
+ const startServer = mountRouter({ jwt: null, fetchImpl: jest.fn() });
80
+ const { server, baseUrl } = await startServer();
81
+ try {
82
+ const r = await fetch(`${baseUrl}${path}`, {
83
+ method,
84
+ headers: { 'Content-Type': 'application/json' },
85
+ body: body !== undefined ? JSON.stringify(body) : undefined,
86
+ });
87
+ expect(r.status).toBe(401);
88
+ const json = await r.json();
89
+ expect(json.success).toBe(false);
90
+ expect(json.code).toBe(ERROR_CODES.NOT_SIGNED_IN);
91
+ } finally {
92
+ await stop(server);
93
+ }
94
+ });
95
+
96
+ test('backend is never called when JWT is absent', async () => {
97
+ const fetchImpl = jest.fn();
98
+ const startServer = mountRouter({ jwt: null, fetchImpl });
99
+ const { server, baseUrl } = await startServer();
100
+ try {
101
+ await fetch(`${baseUrl}/api/account/profile`);
102
+ expect(fetchImpl).not.toHaveBeenCalled();
103
+ } finally {
104
+ await stop(server);
105
+ }
106
+ });
107
+ });
108
+
109
+ // ────────────────────────────────────────────────────────────────────
110
+ // Profile + balance + keys list
111
+ // ────────────────────────────────────────────────────────────────────
112
+ describe('GET /api/account/profile', () => {
113
+ test('forwards JWT and returns normalized { user } even when backend returns flat user object', async () => {
114
+ const fetchImpl = jest.fn().mockResolvedValue({
115
+ ok: true, status: 200,
116
+ text: async () => JSON.stringify({ id: 'u-1', email: 'a@b.com' }),
117
+ });
118
+ const startServer = mountRouter({ fetchImpl });
119
+ const { server, baseUrl } = await startServer();
120
+ try {
121
+ const r = await fetch(`${baseUrl}/api/account/profile`);
122
+ expect(r.status).toBe(200);
123
+ const json = await r.json();
124
+ expect(json).toEqual({ success: true, user: { id: 'u-1', email: 'a@b.com' } });
125
+ expect(fetchImpl).toHaveBeenCalledTimes(1);
126
+ const [url, opts] = fetchImpl.mock.calls[0];
127
+ expect(url).toBe(`${BACKEND_URL}/auth/me`);
128
+ expect(opts.headers.Authorization).toBe(`Bearer ${SAMPLE_JWT}`);
129
+ } finally {
130
+ await stop(server);
131
+ }
132
+ });
133
+
134
+ test('passes nested { user } through unchanged', async () => {
135
+ const fetchImpl = jest.fn().mockResolvedValue({
136
+ ok: true, status: 200,
137
+ text: async () => JSON.stringify({ user: { id: 'u-2', email: 'c@d.com' } }),
138
+ });
139
+ const startServer = mountRouter({ fetchImpl });
140
+ const { server, baseUrl } = await startServer();
141
+ try {
142
+ const json = await (await fetch(`${baseUrl}/api/account/profile`)).json();
143
+ expect(json.user).toEqual({ id: 'u-2', email: 'c@d.com' });
144
+ } finally {
145
+ await stop(server);
146
+ }
147
+ });
148
+ });
149
+
150
+ describe('GET /api/account/balance', () => {
151
+ test('primary path: hits /subscription/status and returns body verbatim', async () => {
152
+ const fetchImpl = jest.fn().mockResolvedValue({
153
+ ok: true, status: 200,
154
+ text: async () => JSON.stringify({ balance: 12.34, plan: 'pro' }),
155
+ });
156
+ const startServer = mountRouter({ fetchImpl });
157
+ const { server, baseUrl } = await startServer();
158
+ try {
159
+ const r = await fetch(`${baseUrl}/api/account/balance`);
160
+ const json = await r.json();
161
+ expect(json).toEqual({ balance: 12.34, plan: 'pro' });
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);
221
+ } finally {
222
+ await stop(server);
223
+ }
224
+ });
225
+ });
226
+
227
+ describe('GET /api/account/keys', () => {
228
+ test('returns the backend response verbatim', async () => {
229
+ const fetchImpl = jest.fn().mockResolvedValue({
230
+ ok: true, status: 200,
231
+ text: async () => JSON.stringify({ apiKeys: [{ id: 'k1', name: 'CI', status: 'active' }] }),
232
+ });
233
+ const startServer = mountRouter({ fetchImpl });
234
+ const { server, baseUrl } = await startServer();
235
+ try {
236
+ const r = await fetch(`${baseUrl}/api/account/keys`);
237
+ const json = await r.json();
238
+ expect(json.apiKeys).toHaveLength(1);
239
+ expect(fetchImpl.mock.calls[0][0]).toBe(`${BACKEND_URL}/auth/apikeys`);
240
+ } finally {
241
+ await stop(server);
242
+ }
243
+ });
244
+ });
245
+
246
+ // ────────────────────────────────────────────────────────────────────
247
+ // Key create — input validation + one-time-reveal pass-through
248
+ // ────────────────────────────────────────────────────────────────────
249
+ describe('POST /api/account/keys', () => {
250
+ test('400 + bad_request when name is missing', async () => {
251
+ const fetchImpl = jest.fn();
252
+ const startServer = mountRouter({ fetchImpl });
253
+ const { server, baseUrl } = await startServer();
254
+ try {
255
+ const r = await fetch(`${baseUrl}/api/account/keys`, {
256
+ method: 'POST',
257
+ headers: { 'Content-Type': 'application/json' },
258
+ body: JSON.stringify({}),
259
+ });
260
+ expect(r.status).toBe(400);
261
+ const json = await r.json();
262
+ expect(json.code).toBe(ERROR_CODES.BAD_REQUEST);
263
+ expect(fetchImpl).not.toHaveBeenCalled();
264
+ } finally {
265
+ await stop(server);
266
+ }
267
+ });
268
+
269
+ test('400 + bad_request when name is whitespace-only', async () => {
270
+ const startServer = mountRouter({ fetchImpl: jest.fn() });
271
+ const { server, baseUrl } = await startServer();
272
+ try {
273
+ const r = await fetch(`${baseUrl}/api/account/keys`, {
274
+ method: 'POST',
275
+ headers: { 'Content-Type': 'application/json' },
276
+ body: JSON.stringify({ name: ' ' }),
277
+ });
278
+ expect(r.status).toBe(400);
279
+ } finally {
280
+ await stop(server);
281
+ }
282
+ });
283
+
284
+ test('forwards trimmed name + optional expiresIn, returns one-time key', async () => {
285
+ const fetchImpl = jest.fn().mockResolvedValue({
286
+ ok: true, status: 201,
287
+ text: async () => JSON.stringify({
288
+ message: 'API key generated successfully',
289
+ apiKey: { id: 'k-new', name: 'mykey', key: 'lx_secretvalue', createdAt: '2026-05-11', expiresAt: null },
290
+ }),
291
+ });
292
+ const startServer = mountRouter({ fetchImpl });
293
+ const { server, baseUrl } = await startServer();
294
+ try {
295
+ const r = await fetch(`${baseUrl}/api/account/keys`, {
296
+ method: 'POST',
297
+ headers: { 'Content-Type': 'application/json' },
298
+ body: JSON.stringify({ name: ' mykey ', expiresIn: 30 }),
299
+ });
300
+ expect(r.status).toBe(201);
301
+ const json = await r.json();
302
+ expect(json.apiKey.key).toBe('lx_secretvalue');
303
+ const sentBody = JSON.parse(fetchImpl.mock.calls[0][1].body);
304
+ expect(sentBody.name).toBe('mykey');
305
+ expect(sentBody.expiresIn).toBe(30);
306
+ } finally {
307
+ await stop(server);
308
+ }
309
+ });
310
+ });
311
+
312
+ // ────────────────────────────────────────────────────────────────────
313
+ // Key revoke
314
+ // ────────────────────────────────────────────────────────────────────
315
+ describe('DELETE /api/account/keys/:id', () => {
316
+ test('rejects an id with unsafe characters before hitting the backend', async () => {
317
+ const fetchImpl = jest.fn();
318
+ const startServer = mountRouter({ fetchImpl });
319
+ const { server, baseUrl } = await startServer();
320
+ try {
321
+ // Express routes won't let `..` through directly, but
322
+ // `<script>` would. Either way, our regex blocks it.
323
+ const r = await fetch(`${baseUrl}/api/account/keys/bad%20id%21`, { method: 'DELETE' });
324
+ expect(r.status).toBe(400);
325
+ expect(fetchImpl).not.toHaveBeenCalled();
326
+ } finally {
327
+ await stop(server);
328
+ }
329
+ });
330
+
331
+ test('happy path proxies the revoke', async () => {
332
+ const fetchImpl = jest.fn().mockResolvedValue({
333
+ ok: true, status: 200,
334
+ text: async () => JSON.stringify({ message: 'API key revoked successfully' }),
335
+ });
336
+ const startServer = mountRouter({ fetchImpl });
337
+ const { server, baseUrl } = await startServer();
338
+ try {
339
+ const r = await fetch(`${baseUrl}/api/account/keys/abc-123_XYZ`, { method: 'DELETE' });
340
+ expect(r.status).toBe(200);
341
+ const [url, opts] = fetchImpl.mock.calls[0];
342
+ expect(url).toBe(`${BACKEND_URL}/auth/apikey/abc-123_XYZ`);
343
+ expect(opts.method).toBe('DELETE');
344
+ } finally {
345
+ await stop(server);
346
+ }
347
+ });
348
+ });
349
+
350
+ // ────────────────────────────────────────────────────────────────────
351
+ // Handoff URL
352
+ // ────────────────────────────────────────────────────────────────────
353
+ describe('POST /api/account/handoff', () => {
354
+ test('mints token via backend and returns autopilot portal URL with handoff query', async () => {
355
+ const fetchImpl = jest.fn().mockResolvedValue({
356
+ ok: true, status: 200,
357
+ text: async () => JSON.stringify({ handoff: 'handoff-token-xyz' }),
358
+ });
359
+ const startServer = mountRouter({ brand: 'autopilot', fetchImpl });
360
+ const { server, baseUrl } = await startServer();
361
+ try {
362
+ const r = await fetch(`${baseUrl}/api/account/handoff`, {
363
+ method: 'POST',
364
+ headers: { 'Content-Type': 'application/json' },
365
+ body: JSON.stringify({ destination: 'payment' }),
366
+ });
367
+ expect(r.status).toBe(200);
368
+ const json = await r.json();
369
+ expect(json.url).toBe('https://autopilot.loxia.ai/payment?handoff=handoff-token-xyz');
370
+ const fetchOpts = fetchImpl.mock.calls[0][1];
371
+ expect(fetchOpts.method).toBe('POST');
372
+ expect(JSON.parse(fetchOpts.body).purpose).toBe('portal-payment');
373
+ } finally {
374
+ await stop(server);
375
+ }
376
+ });
377
+
378
+ test('switches portal host for OnBuzz brand', async () => {
379
+ const fetchImpl = jest.fn().mockResolvedValue({
380
+ ok: true, status: 200,
381
+ text: async () => JSON.stringify({ handoff: 'tok' }),
382
+ });
383
+ const startServer = mountRouter({ brand: 'onbuzz', fetchImpl });
384
+ const { server, baseUrl } = await startServer();
385
+ try {
386
+ const json = await (await fetch(`${baseUrl}/api/account/handoff`, {
387
+ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}',
388
+ })).json();
389
+ expect(json.url.startsWith(__test__.PORTAL_URLS_BY_BRAND.onbuzz)).toBe(true);
390
+ } finally {
391
+ await stop(server);
392
+ }
393
+ });
394
+
395
+ test('falls back to "payment" when destination is unknown (closed allowlist)', async () => {
396
+ const fetchImpl = jest.fn().mockResolvedValue({
397
+ ok: true, status: 200,
398
+ text: async () => JSON.stringify({ handoff: 'tok' }),
399
+ });
400
+ const startServer = mountRouter({ fetchImpl });
401
+ const { server, baseUrl } = await startServer();
402
+ try {
403
+ const json = await (await fetch(`${baseUrl}/api/account/handoff`, {
404
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
405
+ body: JSON.stringify({ destination: '../evil' }),
406
+ })).json();
407
+ // Unknown destination falls back to /payment, NOT echoed as /../evil
408
+ expect(json.url).toContain('/payment?handoff=');
409
+ expect(json.url).not.toContain('evil');
410
+ } finally {
411
+ await stop(server);
412
+ }
413
+ });
414
+
415
+ test('502 when backend response lacks handoff field', async () => {
416
+ const fetchImpl = jest.fn().mockResolvedValue({
417
+ ok: true, status: 200, text: async () => JSON.stringify({ something_else: 'x' }),
418
+ });
419
+ const startServer = mountRouter({ fetchImpl });
420
+ const { server, baseUrl } = await startServer();
421
+ try {
422
+ const r = await fetch(`${baseUrl}/api/account/handoff`, {
423
+ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}',
424
+ });
425
+ expect(r.status).toBe(502);
426
+ } finally {
427
+ await stop(server);
428
+ }
429
+ });
430
+ });
431
+
432
+ // ────────────────────────────────────────────────────────────────────
433
+ // Backend error translation
434
+ // ────────────────────────────────────────────────────────────────────
435
+ describe('proxy error envelopes', () => {
436
+ test('non-OK response is converted to { success:false, code:backend_error }', async () => {
437
+ const fetchImpl = jest.fn().mockResolvedValue({
438
+ ok: false, status: 500,
439
+ text: async () => JSON.stringify({ error: 'something broke' }),
440
+ });
441
+ const startServer = mountRouter({ fetchImpl });
442
+ const { server, baseUrl } = await startServer();
443
+ try {
444
+ const r = await fetch(`${baseUrl}/api/account/profile`);
445
+ expect(r.status).toBe(500);
446
+ const json = await r.json();
447
+ expect(json).toEqual({
448
+ success: false,
449
+ error: 'something broke',
450
+ code: ERROR_CODES.BACKEND_ERROR,
451
+ });
452
+ } finally {
453
+ await stop(server);
454
+ }
455
+ });
456
+
457
+ test('404 maps to code:not_found', async () => {
458
+ const fetchImpl = jest.fn().mockResolvedValue({
459
+ ok: false, status: 404,
460
+ text: async () => JSON.stringify({ error: 'nope' }),
461
+ });
462
+ const startServer = mountRouter({ fetchImpl });
463
+ const { server, baseUrl } = await startServer();
464
+ try {
465
+ const r = await fetch(`${baseUrl}/api/account/keys`);
466
+ expect(r.status).toBe(404);
467
+ const json = await r.json();
468
+ expect(json.code).toBe(ERROR_CODES.NOT_FOUND);
469
+ } finally {
470
+ await stop(server);
471
+ }
472
+ });
473
+
474
+ test('network failure becomes 503 + code:network_error', async () => {
475
+ const fetchImpl = jest.fn().mockRejectedValue(new Error('ECONNREFUSED'));
476
+ const startServer = mountRouter({ fetchImpl });
477
+ const { server, baseUrl } = await startServer();
478
+ try {
479
+ const r = await fetch(`${baseUrl}/api/account/profile`);
480
+ expect(r.status).toBe(503);
481
+ const json = await r.json();
482
+ expect(json.code).toBe(ERROR_CODES.NETWORK_ERROR);
483
+ } finally {
484
+ await stop(server);
485
+ }
486
+ });
487
+ });
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Contract test: methods that `webServer.js` calls on `ApiKeyManager`
3
+ * MUST exist on the real class.
4
+ *
5
+ * Bug history this guards against:
6
+ * - 2026-05: webServer's /api/auth/signout called
7
+ * `apiKeyManager.removeKeys(null)` but the real method is
8
+ * `removeSessionKeys`. Sign-out 500'd at runtime. The existing
9
+ * `authRoutes.test.js` happened to pass because it built its own
10
+ * mock `apiKeyManager` with the wrong method names — the mock and
11
+ * the production caller agreed with each other, but neither agreed
12
+ * with the real class. Same drift hit /auth/callback's `setKeys`
13
+ * call, which silently failed to persist API keys from OAuth.
14
+ *
15
+ * This file imports the REAL ApiKeyManager and asserts each method
16
+ * webServer.js calls is a function on it. Cheap to maintain — when
17
+ * webServer starts calling a new method, add it here.
18
+ */
19
+
20
+ import { describe, test, expect } from '@jest/globals';
21
+ import ApiKeyManager from '../../services/apiKeyManager.js';
22
+
23
+ /**
24
+ * Every ApiKeyManager method invoked from webServer.js production paths.
25
+ * Update this list when webServer.js starts using a new method.
26
+ */
27
+ const REQUIRED_METHODS = Object.freeze([
28
+ 'setSessionKeys', // /auth/callback, remote-session bootstrap
29
+ 'removeSessionKeys', // /api/auth/signout
30
+ 'getKeysForRequest', // /api/auth/status, /api/auth/resolve, every AI call
31
+ ]);
32
+
33
+ describe('ApiKeyManager contract (methods called by webServer.js)', () => {
34
+ const instance = new ApiKeyManager(/* logger */ null);
35
+
36
+ test.each(REQUIRED_METHODS)('exposes %s as a function', (methodName) => {
37
+ expect(typeof instance[methodName]).toBe('function');
38
+ });
39
+ });
@@ -53,7 +53,7 @@ function buildAuthApp({ apiKeyManager, broadcastToSession, config, logger, fetch
53
53
  }
54
54
 
55
55
  if (apiKey && apiKeyManager) {
56
- await apiKeyManager.setKeys(null, { loxiaApiKey: apiKey });
56
+ await apiKeyManager.setSessionKeys(null, { loxiaApiKey: apiKey });
57
57
  }
58
58
 
59
59
  ctx.lastAuthResult = {
@@ -137,7 +137,7 @@ function buildAuthApp({ apiKeyManager, broadcastToSession, config, logger, fetch
137
137
  app.post('/api/auth/signout', async (req, res) => {
138
138
  try {
139
139
  if (apiKeyManager) {
140
- await apiKeyManager.removeKeys(null);
140
+ await apiKeyManager.removeSessionKeys(null);
141
141
  }
142
142
  ctx.lastAuthResult = null;
143
143
  broadcastToSession(null, {
@@ -177,8 +177,8 @@ function buildAuthApp({ apiKeyManager, broadcastToSession, config, logger, fetch
177
177
  function makeApiKeyManager(initialKey = null) {
178
178
  let storedKey = initialKey;
179
179
  return {
180
- setKeys: jest.fn(async (sessionId, keys) => { storedKey = keys.loxiaApiKey; }),
181
- removeKeys: jest.fn(async () => { storedKey = null; }),
180
+ setSessionKeys: jest.fn(async (sessionId, keys) => { storedKey = keys.loxiaApiKey; }),
181
+ removeSessionKeys: jest.fn(async () => { storedKey = null; }),
182
182
  getKeysForRequest: jest.fn(() => storedKey ? { loxiaApiKey: storedKey } : {}),
183
183
  _peek: () => storedKey
184
184
  };
@@ -254,7 +254,7 @@ describe('Auth Routes (webServer.js)', () => {
254
254
  expect(await res.text()).toContain('Authenticated!');
255
255
 
256
256
  // Verify API key was stored
257
- expect(apiKeyManager.setKeys).toHaveBeenCalledWith(null, { loxiaApiKey: 'lx_generated_key_123' });
257
+ expect(apiKeyManager.setSessionKeys).toHaveBeenCalledWith(null, { loxiaApiKey: 'lx_generated_key_123' });
258
258
 
259
259
  // Verify broadcast
260
260
  const broadcast = broadcasts[0];
@@ -438,14 +438,14 @@ describe('Auth Routes (webServer.js)', () => {
438
438
 
439
439
  const body = await (await fetch(`${baseUrl}/api/auth/signout`, { method: 'POST' })).json();
440
440
  expect(body.success).toBe(true);
441
- expect(apiKeyManager.removeKeys).toHaveBeenCalledWith(null);
441
+ expect(apiKeyManager.removeSessionKeys).toHaveBeenCalledWith(null);
442
442
  expect(apiKeyManager._peek()).toBeNull();
443
443
  expect(ctx.lastAuthResult).toBeNull();
444
444
  expect(broadcasts[0].msg.type).toBe('auth_signout');
445
445
  });
446
446
 
447
- it('returns 500 when removeKeys throws', async () => {
448
- const apiKeyManager = { removeKeys: jest.fn().mockRejectedValue(new Error('vault locked')) };
447
+ it('returns 500 when removeSessionKeys throws', async () => {
448
+ const apiKeyManager = { removeSessionKeys: jest.fn().mockRejectedValue(new Error('vault locked')) };
449
449
  const app = buildAuthApp({ apiKeyManager, broadcastToSession, config: {}, logger, fetchImpl: mockFetch, ctx });
450
450
  const { server: s, baseUrl } = await startServer(app);
451
451
  server = s;