onbuzz 4.6.4 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (956) hide show
  1. package/bin/cli.js +8 -0
  2. package/package.json +1 -1
  3. package/src/__tests__/autoUpdateConfig.test.js +44 -0
  4. package/src/__tests__/releaseWorkflow.test.js +72 -0
  5. package/src/interfaces/__tests__/accountRoutes.test.js +429 -0
  6. package/src/interfaces/__tests__/apiKeyManagerContract.test.js +39 -0
  7. package/src/interfaces/__tests__/authRoutes.test.js +8 -8
  8. package/src/interfaces/accountRoutes.js +250 -0
  9. package/src/interfaces/webServer.js +63 -10
  10. package/src/services/__tests__/apiKeyManager.test.js +4 -6
  11. package/src/services/__tests__/authCacheStore.test.js +118 -0
  12. package/src/services/apiKeyManager.js +12 -99
  13. package/src/services/authCacheStore.js +140 -0
  14. package/src/tools/__tests__/webTool.e2e.test.js +9 -1
  15. package/src/tools/webTool.js +20 -4
  16. package/src/utilities/__tests__/secretsCipher.test.js +97 -0
  17. package/src/utilities/__tests__/updateNotifier.test.js +139 -0
  18. package/src/utilities/secretsCipher.js +116 -0
  19. package/src/utilities/updateNotifier.js +140 -0
  20. package/web-ui/build/index.html +2 -2
  21. package/web-ui/build/static/1c-D_MLuenD.js +1 -0
  22. package/web-ui/build/static/abap-BNvFMksw.js +1 -0
  23. package/web-ui/build/static/abnf-WlnRJIp2.js +1 -0
  24. package/web-ui/build/static/abnf-mx1Wbtnp.js +1 -0
  25. package/web-ui/build/static/accesslog-CJumJuuV.js +1 -0
  26. package/web-ui/build/static/actionscript-B6CbK7n7.js +1 -0
  27. package/web-ui/build/static/actionscript-DZ5xfmPr.js +1 -0
  28. package/web-ui/build/static/ada-CCVAXM0c.js +1 -0
  29. package/web-ui/build/static/ada-DtGkgqC4.js +1 -0
  30. package/web-ui/build/static/agda-gMFRTChb.js +1 -0
  31. package/web-ui/build/static/al-88fYQh4r.js +1 -0
  32. package/web-ui/build/static/angelscript-Bibc8YWJ.js +1 -0
  33. package/web-ui/build/static/antlr4-DgibPJaJ.js +1 -0
  34. package/web-ui/build/static/apache-_pZ-s8l6.js +1 -0
  35. package/web-ui/build/static/apacheconf-YDldOH3Q.js +1 -0
  36. package/web-ui/build/static/apex-CIj23tyF.js +1 -0
  37. package/web-ui/build/static/apl-DtRSC0Xv.js +1 -0
  38. package/web-ui/build/static/applescript-CKhcPsla.js +1 -0
  39. package/web-ui/build/static/applescript-DuJeHJ1r.js +1 -0
  40. package/web-ui/build/static/aql-BgmI8Ors.js +1 -0
  41. package/web-ui/build/static/arcade-BX83978b.js +1 -0
  42. package/web-ui/build/static/arduino-BVdatcJb.js +1 -0
  43. package/web-ui/build/static/arduino-h6ifuWka.js +1 -0
  44. package/web-ui/build/static/arff-DHmbMeIA.js +1 -0
  45. package/web-ui/build/static/armasm-DiDgI5h5.js +1 -0
  46. package/web-ui/build/static/asciidoc-CBro7xXU.js +1 -0
  47. package/web-ui/build/static/asciidoc-DRC2X4bq.js +1 -0
  48. package/web-ui/build/static/asm6502-53VLu0lq.js +1 -0
  49. package/web-ui/build/static/asmatmel-DlRHdXes.js +1 -0
  50. package/web-ui/build/static/aspectj-DTSWMNl9.js +1 -0
  51. package/web-ui/build/static/aspnet-DEUO05ai.js +1 -0
  52. package/web-ui/build/static/autohotkey-3gt8xVo-.js +1 -0
  53. package/web-ui/build/static/autohotkey-BWcbMbe_.js +1 -0
  54. package/web-ui/build/static/autoit-CackGf4X.js +1 -0
  55. package/web-ui/build/static/autoit-Dyf0FSt2.js +1 -0
  56. package/web-ui/build/static/avisynth-DfCuxmn5.js +1 -0
  57. package/web-ui/build/static/avrasm-DdDiRWhx.js +1 -0
  58. package/web-ui/build/static/avro-idl-DppsvvwR.js +1 -0
  59. package/web-ui/build/static/awk-Cjk3U-Y4.js +1 -0
  60. package/web-ui/build/static/axapta-WwnY3TVf.js +1 -0
  61. package/web-ui/build/static/bash-C5Xkqken.js +1 -0
  62. package/web-ui/build/static/bash-ckPXa-RG.js +1 -0
  63. package/web-ui/build/static/basic-BCVHqHd2.js +1 -0
  64. package/web-ui/build/static/basic-D0dZbGrs.js +1 -0
  65. package/web-ui/build/static/batch-DUo60tbI.js +1 -0
  66. package/web-ui/build/static/bbcode-BVzBKrPV.js +1 -0
  67. package/web-ui/build/static/bicep-DkTjKL2N.js +1 -0
  68. package/web-ui/build/static/birb-C0rKI0h6.js +1 -0
  69. package/web-ui/build/static/bison-ChzwcDVc.js +1 -0
  70. package/web-ui/build/static/bnf-COhTgjpr.js +1 -0
  71. package/web-ui/build/static/bnf-DUYKVI2p.js +1 -0
  72. package/web-ui/build/static/brainfuck-BBJLbMxW.js +1 -0
  73. package/web-ui/build/static/brainfuck-DufOqE73.js +1 -0
  74. package/web-ui/build/static/brightscript-DXhkwfCc.js +1 -0
  75. package/web-ui/build/static/bro-BOFEsT-K.js +1 -0
  76. package/web-ui/build/static/bsl-ClV9GpNm.js +1 -0
  77. package/web-ui/build/static/c-Cl_3N1WB.js +1 -0
  78. package/web-ui/build/static/c-D0hFoAJ3.js +1 -0
  79. package/web-ui/build/static/c-like-D4BQ8VhL.js +1 -0
  80. package/web-ui/build/static/cal-CVIQ5DKG.js +1 -0
  81. package/web-ui/build/static/capnproto-l7oAqnCr.js +1 -0
  82. package/web-ui/build/static/ceylon-BEhCsFMw.js +1 -0
  83. package/web-ui/build/static/cfscript-DMh-xvVk.js +1 -0
  84. package/web-ui/build/static/chaiscript-DCvDoIGS.js +1 -0
  85. package/web-ui/build/static/cil-Ccn-j3TB.js +1 -0
  86. package/web-ui/build/static/clean-CjrEwcC-.js +1 -0
  87. package/web-ui/build/static/clojure-Dgo-8qFd.js +1 -0
  88. package/web-ui/build/static/clojure-M1AknfQi.js +1 -0
  89. package/web-ui/build/static/clojure-repl-BY1VLOSH.js +1 -0
  90. package/web-ui/build/static/cmake-CdHJ7Mp0.js +1 -0
  91. package/web-ui/build/static/cmake-DDGvi7kU.js +1 -0
  92. package/web-ui/build/static/cobol-BdrXYRxi.js +1 -0
  93. package/web-ui/build/static/coffeescript-BMDvMAy2.js +1 -0
  94. package/web-ui/build/static/coffeescript-CAYcMTRg.js +1 -0
  95. package/web-ui/build/static/concurnas-B8vcX0ec.js +1 -0
  96. package/web-ui/build/static/coq-CqvluN1S.js +1 -0
  97. package/web-ui/build/static/coq-vhnnRdWb.js +1 -0
  98. package/web-ui/build/static/cos-DY4p0y_u.js +1 -0
  99. package/web-ui/build/static/cpp-C3m_aEUX.js +1 -0
  100. package/web-ui/build/static/cpp-DRs9bbEm.js +1 -0
  101. package/web-ui/build/static/crmsh-CY6InunC.js +1 -0
  102. package/web-ui/build/static/crystal-Cwk1figA.js +1 -0
  103. package/web-ui/build/static/crystal-DeCJ5Pz7.js +1 -0
  104. package/web-ui/build/static/csharp-WmvubeKF.js +1 -0
  105. package/web-ui/build/static/csharp-zL1j7hXr.js +1 -0
  106. package/web-ui/build/static/cshtml-CbvGCaf_.js +1 -0
  107. package/web-ui/build/static/csp-BH2nxxKs.js +1 -0
  108. package/web-ui/build/static/csp-CHlC7KoB.js +1 -0
  109. package/web-ui/build/static/css-_X0ZO87y.js +1 -0
  110. package/web-ui/build/static/css-extras-wgFh56PY.js +1 -0
  111. package/web-ui/build/static/csv-momqe7r6.js +1 -0
  112. package/web-ui/build/static/cypher-hOeHFCfk.js +1 -0
  113. package/web-ui/build/static/d-B3d-tfyQ.js +1 -0
  114. package/web-ui/build/static/d-C6iyl9wX.js +1 -0
  115. package/web-ui/build/static/dart-BDKSE6LE.js +1 -0
  116. package/web-ui/build/static/dart-Bjchg8qI.js +1 -0
  117. package/web-ui/build/static/dataweave-ZgvdD-pH.js +1 -0
  118. package/web-ui/build/static/dax-yfGYNpUh.js +1 -0
  119. package/web-ui/build/static/delphi-CRLCdiTE.js +1 -0
  120. package/web-ui/build/static/dhall-yl1p1XUr.js +1 -0
  121. package/web-ui/build/static/diff-5SMtcFK7.js +1 -0
  122. package/web-ui/build/static/diff-y2RTBWsQ.js +1 -0
  123. package/web-ui/build/static/django-CtjG6w9L.js +1 -0
  124. package/web-ui/build/static/django-DNXOxI3v.js +1 -0
  125. package/web-ui/build/static/dns-D7Czwn_S.js +1 -0
  126. package/web-ui/build/static/dns-zone-file-D3yPxpjz.js +1 -0
  127. package/web-ui/build/static/docker-CWC5NqQQ.js +1 -0
  128. package/web-ui/build/static/dockerfile-CKFBVY9d.js +1 -0
  129. package/web-ui/build/static/dos-B7gYphQ-.js +1 -0
  130. package/web-ui/build/static/dot-BsisNMX4.js +1 -0
  131. package/web-ui/build/static/dsconfig-CEWwz7T6.js +1 -0
  132. package/web-ui/build/static/dts-UM5u5dMt.js +1 -0
  133. package/web-ui/build/static/dust-DlPmuh4d.js +1 -0
  134. package/web-ui/build/static/ebnf-BE6vq-fo.js +1 -0
  135. package/web-ui/build/static/ebnf-Czd8moGp.js +1 -0
  136. package/web-ui/build/static/editorconfig-Ctn83uRn.js +1 -0
  137. package/web-ui/build/static/eiffel-CZP01HVF.js +1 -0
  138. package/web-ui/build/static/ejs-BAXhrtLI.js +1 -0
  139. package/web-ui/build/static/elixir-C9PFjTwP.js +1 -0
  140. package/web-ui/build/static/elixir-DMjZPYCh.js +1 -0
  141. package/web-ui/build/static/elm-BH_KfOxJ.js +1 -0
  142. package/web-ui/build/static/elm-DRnNerE2.js +1 -0
  143. package/web-ui/build/static/erb-BhzUuTTy.js +1 -0
  144. package/web-ui/build/static/erb-DNbmX3N2.js +1 -0
  145. package/web-ui/build/static/erlang-BBPIw_V_.js +1 -0
  146. package/web-ui/build/static/erlang-BWdcSiKs.js +1 -0
  147. package/web-ui/build/static/erlang-repl-DQ9I6Dh_.js +1 -0
  148. package/web-ui/build/static/etlua-BeVNUecy.js +1 -0
  149. package/web-ui/build/static/excel-DYFvX5ms.js +1 -0
  150. package/web-ui/build/static/excel-formula-BtiqixBz.js +1 -0
  151. package/web-ui/build/static/factor-BCHyN6XZ.js +1 -0
  152. package/web-ui/build/static/false-UDWS0Dzk.js +1 -0
  153. package/web-ui/build/static/firestore-security-rules-B1-wJ42j.js +1 -0
  154. package/web-ui/build/static/fix-DrXU-V21.js +1 -0
  155. package/web-ui/build/static/flix-BjF0RPW9.js +1 -0
  156. package/web-ui/build/static/flow-DovuDACs.js +1 -0
  157. package/web-ui/build/static/fortran-DOqQP_9c.js +1 -0
  158. package/web-ui/build/static/fortran-DPASe5gH.js +1 -0
  159. package/web-ui/build/static/fsharp-Ckup0uPw.js +1 -0
  160. package/web-ui/build/static/fsharp-DyfRmGjn.js +1 -0
  161. package/web-ui/build/static/ftl-Coj24bDj.js +1 -0
  162. package/web-ui/build/static/gams-GwREZQh1.js +1 -0
  163. package/web-ui/build/static/gap-B7d6Bkmk.js +1 -0
  164. package/web-ui/build/static/gauss-DrLvPj5Z.js +1 -0
  165. package/web-ui/build/static/gcode-40iTJ2U1.js +1 -0
  166. package/web-ui/build/static/gcode-CISHXDj4.js +1 -0
  167. package/web-ui/build/static/gdscript-DmopCB0R.js +1 -0
  168. package/web-ui/build/static/gedcom-LiECv7gg.js +1 -0
  169. package/web-ui/build/static/gherkin-CYp_kcve.js +1 -0
  170. package/web-ui/build/static/gherkin-C_QgMjxf.js +1 -0
  171. package/web-ui/build/static/git-CfTT-600.js +1 -0
  172. package/web-ui/build/static/glsl-DRFMhvlG.js +1 -0
  173. package/web-ui/build/static/glsl-PNmpuSn0.js +1 -0
  174. package/web-ui/build/static/gml-3qmqfrt3.js +1 -0
  175. package/web-ui/build/static/gml-BTCmr4y5.js +1 -0
  176. package/web-ui/build/static/gn-BX0L2dQ-.js +1 -0
  177. package/web-ui/build/static/go-BXYOf5mS.js +1 -0
  178. package/web-ui/build/static/go-BnvPVHID.js +1 -0
  179. package/web-ui/build/static/go-module-BsPBvEmG.js +1 -0
  180. package/web-ui/build/static/golo-B6l7i4bX.js +1 -0
  181. package/web-ui/build/static/gradle-9DvvuDBJ.js +1 -0
  182. package/web-ui/build/static/graphql-OcCfd-Bc.js +1 -0
  183. package/web-ui/build/static/groovy-B33LZAt0.js +1 -0
  184. package/web-ui/build/static/groovy-Uyg0ruyE.js +1 -0
  185. package/web-ui/build/static/haml-D_FDAM6q.js +1 -0
  186. package/web-ui/build/static/haml-DjG31i1A.js +1 -0
  187. package/web-ui/build/static/handlebars-BKPDMksf.js +1 -0
  188. package/web-ui/build/static/handlebars-PP4M-qJ8.js +1 -0
  189. package/web-ui/build/static/haskell-HD9Gv3Wo.js +1 -0
  190. package/web-ui/build/static/haskell-nUf9ckz5.js +1 -0
  191. package/web-ui/build/static/haxe-BSsJNrQU.js +1 -0
  192. package/web-ui/build/static/haxe-D7yTwhdv.js +1 -0
  193. package/web-ui/build/static/hcl-_dqjptFs.js +1 -0
  194. package/web-ui/build/static/hlsl-DKixrsyy.js +1 -0
  195. package/web-ui/build/static/hoon-Di28eQfV.js +1 -0
  196. package/web-ui/build/static/hpkp-CXYG9zoQ.js +1 -0
  197. package/web-ui/build/static/hsp-lYl9KN6o.js +1 -0
  198. package/web-ui/build/static/hsts-CaYq9R8-.js +1 -0
  199. package/web-ui/build/static/htmlbars-eoY2PWS6.js +1 -0
  200. package/web-ui/build/static/http-2DXUmN2h.js +1 -0
  201. package/web-ui/build/static/http-Yjic3oWm.js +1 -0
  202. package/web-ui/build/static/hy-DVImg5uG.js +1 -0
  203. package/web-ui/build/static/ichigojam-Bdk-szlv.js +1 -0
  204. package/web-ui/build/static/icon-BEs9UbI_.js +1 -0
  205. package/web-ui/build/static/icu-message-format-DMfiLVs5.js +1 -0
  206. package/web-ui/build/static/idris-meksg0Ce.js +1 -0
  207. package/web-ui/build/static/iecst-DMPBiTmw.js +1 -0
  208. package/web-ui/build/static/ignore-BOQ9ZPvw.js +1 -0
  209. package/web-ui/build/static/index-BSEOP86D.js +1 -0
  210. package/web-ui/build/static/index-Be9WvMkI.js +1162 -0
  211. package/web-ui/build/static/index-Cr9q1fNq.css +1 -0
  212. package/web-ui/build/static/index-CuZ_erP9.js +13 -0
  213. package/web-ui/build/static/inform7-CNqu8FhU.js +1 -0
  214. package/web-ui/build/static/inform7-Cvfrdb0X.js +1 -0
  215. package/web-ui/build/static/ini-4DHUSW37.js +1 -0
  216. package/web-ui/build/static/ini-BgZ18Nk6.js +1 -0
  217. package/web-ui/build/static/io-c519ulw2.js +1 -0
  218. package/web-ui/build/static/irpf90-Kzq81vn5.js +1 -0
  219. package/web-ui/build/static/isbl-CeBN_o-W.js +1 -0
  220. package/web-ui/build/static/j-BmSuFx5E.js +1 -0
  221. package/web-ui/build/static/java-BezG0JQd.js +1 -0
  222. package/web-ui/build/static/java-BxBhTA1D.js +1 -0
  223. package/web-ui/build/static/javadoc-b96LRy9-.js +1 -0
  224. package/web-ui/build/static/javadoclike-BTNVp6pR.js +1 -0
  225. package/web-ui/build/static/javascript-B75gzQUI.js +1 -0
  226. package/web-ui/build/static/javastacktrace-D4xVOdoe.js +1 -0
  227. package/web-ui/build/static/jboss-cli-DH30pghK.js +1 -0
  228. package/web-ui/build/static/jexl-DF2RGmtX.js +1 -0
  229. package/web-ui/build/static/jolie-BlwO_Eyn.js +1 -0
  230. package/web-ui/build/static/jq-C7YhIw1G.js +1 -0
  231. package/web-ui/build/static/js-extras-JVZxoi4Q.js +1 -0
  232. package/web-ui/build/static/js-templates-D1CnsXgJ.js +1 -0
  233. package/web-ui/build/static/jsdoc-vf63NOxo.js +1 -0
  234. package/web-ui/build/static/json-CiKwLA5O.js +1 -0
  235. package/web-ui/build/static/json-pgLQeaes.js +1 -0
  236. package/web-ui/build/static/json5-_HMAYh1c.js +1 -0
  237. package/web-ui/build/static/jsonp-BeHQpb2r.js +1 -0
  238. package/web-ui/build/static/jsstacktrace-nw21JEtY.js +1 -0
  239. package/web-ui/build/static/jsx-Nxt_XhcW.js +1 -0
  240. package/web-ui/build/static/julia-BFczE4HB.js +1 -0
  241. package/web-ui/build/static/julia-DeDNID0K.js +1 -0
  242. package/web-ui/build/static/julia-repl-CoPTZMue.js +1 -0
  243. package/web-ui/build/static/keepalived-DP1sFl1b.js +1 -0
  244. package/web-ui/build/static/keyman-CCQVTHgo.js +1 -0
  245. package/web-ui/build/static/kotlin-CdZP58gi.js +1 -0
  246. package/web-ui/build/static/kotlin-CzNKVbXq.js +1 -0
  247. package/web-ui/build/static/kumir-lPok55sq.js +1 -0
  248. package/web-ui/build/static/kusto-oLek_zqj.js +1 -0
  249. package/web-ui/build/static/lasso-BFOYENIx.js +1 -0
  250. package/web-ui/build/static/latex-BH6YJXW6.js +1 -0
  251. package/web-ui/build/static/latex-IweVcDOS.js +1 -0
  252. package/web-ui/build/static/latte-Cmzytj93.js +1 -0
  253. package/web-ui/build/static/ldif-Bp4o5m10.js +1 -0
  254. package/web-ui/build/static/leaf-BFbMre84.js +1 -0
  255. package/web-ui/build/static/less-BVpV_iBx.js +1 -0
  256. package/web-ui/build/static/less-vdx-pGtM.js +1 -0
  257. package/web-ui/build/static/lilypond-Da6mCtwg.js +1 -0
  258. package/web-ui/build/static/liquid-RVC3EWUf.js +1 -0
  259. package/web-ui/build/static/lisp-Bgt-EmTk.js +1 -0
  260. package/web-ui/build/static/lisp-E8gUigGo.js +1 -0
  261. package/web-ui/build/static/livecodeserver-DDFQieJg.js +1 -0
  262. package/web-ui/build/static/livescript-C7FEDmfm.js +1 -0
  263. package/web-ui/build/static/livescript-Cc5SDmvx.js +1 -0
  264. package/web-ui/build/static/llvm-C22gmUEJ.js +1 -0
  265. package/web-ui/build/static/llvm-CjnVIiX4.js +1 -0
  266. package/web-ui/build/static/log-duIQICZV.js +1 -0
  267. package/web-ui/build/static/lolcode-Chrz9tTZ.js +1 -0
  268. package/web-ui/build/static/lsl-D1sdqECW.js +1 -0
  269. package/web-ui/build/static/lua-BFoJUb0S.js +1 -0
  270. package/web-ui/build/static/lua-D8RyRvqw.js +1 -0
  271. package/web-ui/build/static/magma-Cb3OhPkH.js +1 -0
  272. package/web-ui/build/static/makefile-BoVTcm8r.js +1 -0
  273. package/web-ui/build/static/makefile-LpYbnzZi.js +1 -0
  274. package/web-ui/build/static/markdown-CtQc_FZV.js +1 -0
  275. package/web-ui/build/static/markdown-DKz9qNdH.js +1 -0
  276. package/web-ui/build/static/markup-templating-D4EP19Lc.js +1 -0
  277. package/web-ui/build/static/mathematica-CIjlHVkd.js +1 -0
  278. package/web-ui/build/static/matlab-2b895p29.js +1 -0
  279. package/web-ui/build/static/matlab-BuluE4GS.js +1 -0
  280. package/web-ui/build/static/maxima-BGR8Puew.js +1 -0
  281. package/web-ui/build/static/maxscript-B429y77A.js +1 -0
  282. package/web-ui/build/static/mel-CYh_3LnF.js +1 -0
  283. package/web-ui/build/static/mel-CbYDscql.js +1 -0
  284. package/web-ui/build/static/mercury-DOee0RcU.js +1 -0
  285. package/web-ui/build/static/mermaid-Bgnlfred.js +1 -0
  286. package/web-ui/build/static/mipsasm-CB-uene8.js +1 -0
  287. package/web-ui/build/static/mizar-7qF42uX5.js +1 -0
  288. package/web-ui/build/static/mizar-Clogrskx.js +1 -0
  289. package/web-ui/build/static/mojolicious-BSIpTTKj.js +1 -0
  290. package/web-ui/build/static/mongodb--rWzrKDS.js +1 -0
  291. package/web-ui/build/static/monkey-C0lS2_fv.js +1 -0
  292. package/web-ui/build/static/monkey-DvqsFbfK.js +1 -0
  293. package/web-ui/build/static/moonscript-D6zFHk1D.js +1 -0
  294. package/web-ui/build/static/moonscript-JTxm8n_4.js +1 -0
  295. package/web-ui/build/static/n1ql-BwY55fjF.js +1 -0
  296. package/web-ui/build/static/n1ql-D8h3fDkJ.js +1 -0
  297. package/web-ui/build/static/n4js-5XIl8zQT.js +1 -0
  298. package/web-ui/build/static/nand2tetris-hdl-C4b_TExX.js +1 -0
  299. package/web-ui/build/static/naniscript-h2vnytgY.js +1 -0
  300. package/web-ui/build/static/nasm-SJmR3Ebn.js +1 -0
  301. package/web-ui/build/static/neon-B7dnnKEh.js +1 -0
  302. package/web-ui/build/static/nevod-zunhA02o.js +1 -0
  303. package/web-ui/build/static/nginx-BR_D0je7.js +1 -0
  304. package/web-ui/build/static/nginx-Cf7oQt-G.js +1 -0
  305. package/web-ui/build/static/nim-D-MjIxvw.js +1 -0
  306. package/web-ui/build/static/nim-D6YOyDC-.js +1 -0
  307. package/web-ui/build/static/nix-DCZEZqSO.js +1 -0
  308. package/web-ui/build/static/nix-Dx16U5rS.js +1 -0
  309. package/web-ui/build/static/node-repl-P-vGpiQ7.js +1 -0
  310. package/web-ui/build/static/nsis-CjyZMgjR.js +1 -0
  311. package/web-ui/build/static/nsis-X8NQeZjE.js +1 -0
  312. package/web-ui/build/static/objectivec-BejNoH7m.js +1 -0
  313. package/web-ui/build/static/objectivec-CGy2F8n6.js +1 -0
  314. package/web-ui/build/static/ocaml-C15hcRxR.js +1 -0
  315. package/web-ui/build/static/ocaml-U7N8L5Z7.js +1 -0
  316. package/web-ui/build/static/opencl-Bkm-SovU.js +1 -0
  317. package/web-ui/build/static/openqasm-BOc5975b.js +1 -0
  318. package/web-ui/build/static/openscad-CRpFnhV_.js +1 -0
  319. package/web-ui/build/static/oxygene-eHBZbxHy.js +1 -0
  320. package/web-ui/build/static/oz-B6RWw36L.js +1 -0
  321. package/web-ui/build/static/parigp-rifRy-ff.js +1 -0
  322. package/web-ui/build/static/parser-C0HBjZDk.js +1 -0
  323. package/web-ui/build/static/parser3-DSK81uS5.js +1 -0
  324. package/web-ui/build/static/pascal-BWha02r-.js +1 -0
  325. package/web-ui/build/static/pascaligo-B5sQ2hGz.js +1 -0
  326. package/web-ui/build/static/pcaxis-B1HLYPhm.js +1 -0
  327. package/web-ui/build/static/peoplecode-C4FPD4Yt.js +1 -0
  328. package/web-ui/build/static/perl-CyNx_mIa.js +1 -0
  329. package/web-ui/build/static/perl-rKxEWgtc.js +1 -0
  330. package/web-ui/build/static/pf-DbL4T2HZ.js +1 -0
  331. package/web-ui/build/static/pgsql-BKrwbRTY.js +1 -0
  332. package/web-ui/build/static/php-Cbd5TyJ-.js +1 -0
  333. package/web-ui/build/static/php-extras-DoVpsRj3.js +1 -0
  334. package/web-ui/build/static/php-template-DvdLavxo.js +1 -0
  335. package/web-ui/build/static/php-wYQJLv7J.js +1 -0
  336. package/web-ui/build/static/phpdoc-DTzZ5d0C.js +1 -0
  337. package/web-ui/build/static/plaintext-BRfzJjyj.js +1 -0
  338. package/web-ui/build/static/plsql-BLiE3aGC.js +1 -0
  339. package/web-ui/build/static/pony-CzLDxYVb.js +1 -0
  340. package/web-ui/build/static/powerquery-BdGgwM1a.js +1 -0
  341. package/web-ui/build/static/powershell-Cxl47yK_.js +1 -0
  342. package/web-ui/build/static/powershell-DrOFoqBE.js +1 -0
  343. package/web-ui/build/static/processing-9GbETrF_.js +1 -0
  344. package/web-ui/build/static/processing-M8gRGxck.js +1 -0
  345. package/web-ui/build/static/profile-CpNlvCnw.js +1 -0
  346. package/web-ui/build/static/prolog-CKZzbIr9.js +1 -0
  347. package/web-ui/build/static/prolog-mmIPeMRS.js +1 -0
  348. package/web-ui/build/static/promql-sDn1PHGN.js +1 -0
  349. package/web-ui/build/static/properties-CMFMCgWo.js +1 -0
  350. package/web-ui/build/static/properties-DQUf7KOp.js +1 -0
  351. package/web-ui/build/static/protobuf-CeY2Q-pH.js +1 -0
  352. package/web-ui/build/static/protobuf-WpfASK2n.js +1 -0
  353. package/web-ui/build/static/psl-D2GfEOkk.js +1 -0
  354. package/web-ui/build/static/pug-OMqhtHt8.js +1 -0
  355. package/web-ui/build/static/puppet-B68-xib8.js +1 -0
  356. package/web-ui/build/static/puppet-DEWzLqRg.js +1 -0
  357. package/web-ui/build/static/pure-C_CchY8g.js +1 -0
  358. package/web-ui/build/static/purebasic-D6vSqsja.js +1 -0
  359. package/web-ui/build/static/purebasic-Dy_z6LTs.js +1 -0
  360. package/web-ui/build/static/purescript-1f1OoM-A.js +1 -0
  361. package/web-ui/build/static/python-BssLWmNd.js +1 -0
  362. package/web-ui/build/static/python-CbOivp-X.js +1 -0
  363. package/web-ui/build/static/python-repl-Dsbi7aBP.js +1 -0
  364. package/web-ui/build/static/q-BC6w8B4U.js +1 -0
  365. package/web-ui/build/static/q-Brd1mf_C.js +1 -0
  366. package/web-ui/build/static/qml-BG4KN74g.js +1 -0
  367. package/web-ui/build/static/qml-BW-AE2Ma.js +1 -0
  368. package/web-ui/build/static/qore-m870d7ZA.js +1 -0
  369. package/web-ui/build/static/qsharp-BC9vEXOd.js +1 -0
  370. package/web-ui/build/static/r-BQySF8sO.js +1 -0
  371. package/web-ui/build/static/r-Cur0B9lo.js +1 -0
  372. package/web-ui/build/static/racket-CiJlajVU.js +1 -0
  373. package/web-ui/build/static/reason-C3VZcXa9.js +1 -0
  374. package/web-ui/build/static/reasonml-CpaxZwMO.js +1 -0
  375. package/web-ui/build/static/regex-bY-o17az.js +1 -0
  376. package/web-ui/build/static/rego-WPkEW7us.js +1 -0
  377. package/web-ui/build/static/renpy-DQr5LC4O.js +1 -0
  378. package/web-ui/build/static/rest-qmfCQ86m.js +1 -0
  379. package/web-ui/build/static/rib-DYzEblkc.js +1 -0
  380. package/web-ui/build/static/rip-D-NWUqHZ.js +1 -0
  381. package/web-ui/build/static/roboconf-CVmdy543.js +1 -0
  382. package/web-ui/build/static/roboconf-Ray0NGMb.js +1 -0
  383. package/web-ui/build/static/robotframework-DlxPBTF_.js +1 -0
  384. package/web-ui/build/static/routeros-S_f-nuVM.js +1 -0
  385. package/web-ui/build/static/rsl-CHtR71Pc.js +1 -0
  386. package/web-ui/build/static/ruby-ByuU-3cy.js +1 -0
  387. package/web-ui/build/static/ruby-DOin939S.js +1 -0
  388. package/web-ui/build/static/ruleslanguage-zhFrFxeU.js +1 -0
  389. package/web-ui/build/static/rust-B606UvZv.js +1 -0
  390. package/web-ui/build/static/rust-BJMuS7if.js +1 -0
  391. package/web-ui/build/static/sas-Bzk_0rOu.js +1 -0
  392. package/web-ui/build/static/sas-C-C55Hy4.js +1 -0
  393. package/web-ui/build/static/sass-DKkkoHtH.js +1 -0
  394. package/web-ui/build/static/scala-BKlnHttP.js +1 -0
  395. package/web-ui/build/static/scala-IsJjjIKA.js +1 -0
  396. package/web-ui/build/static/scheme-Bq_tfrRE.js +1 -0
  397. package/web-ui/build/static/scheme-DiXFvLKG.js +1 -0
  398. package/web-ui/build/static/scilab-DVyT87si.js +1 -0
  399. package/web-ui/build/static/scss-BtDpAVzH.js +1 -0
  400. package/web-ui/build/static/scss-D8cn4aNM.js +1 -0
  401. package/web-ui/build/static/shell-YROU1_yo.js +1 -0
  402. package/web-ui/build/static/shell-session-D06UXOLk.js +1 -0
  403. package/web-ui/build/static/smali-B1Wl_1dD.js +1 -0
  404. package/web-ui/build/static/smali-D2R-11j_.js +1 -0
  405. package/web-ui/build/static/smalltalk-M2S1lL6Z.js +1 -0
  406. package/web-ui/build/static/smalltalk-OWg84676.js +1 -0
  407. package/web-ui/build/static/smarty-l1m-zZmR.js +1 -0
  408. package/web-ui/build/static/sml-B6gSTHMm.js +1 -0
  409. package/web-ui/build/static/sml-BKURhRNM.js +1 -0
  410. package/web-ui/build/static/solidity-BcrqESJt.js +1 -0
  411. package/web-ui/build/static/solution-file-BYpCOi9k.js +1 -0
  412. package/web-ui/build/static/soy-DOQhQ7Di.js +1 -0
  413. package/web-ui/build/static/sparql-BwiIX_wO.js +1 -0
  414. package/web-ui/build/static/splunk-spl-DuIl6XxN.js +1 -0
  415. package/web-ui/build/static/sqf-8cYPidUR.js +1 -0
  416. package/web-ui/build/static/sqf-n8nRTmXc.js +1 -0
  417. package/web-ui/build/static/sql-D0WSLeXV.js +1 -0
  418. package/web-ui/build/static/sql-D8KWxFl_.js +1 -0
  419. package/web-ui/build/static/sql_more-D3ozDsf6.js +1 -0
  420. package/web-ui/build/static/squirrel-C4U4fAL5.js +1 -0
  421. package/web-ui/build/static/stan-BbFEvT-l.js +1 -0
  422. package/web-ui/build/static/stan-CJ4ny6dZ.js +1 -0
  423. package/web-ui/build/static/stata-BKEkbqzD.js +1 -0
  424. package/web-ui/build/static/step21-52PURHjy.js +1 -0
  425. package/web-ui/build/static/stylus-buszfxDg.js +1 -0
  426. package/web-ui/build/static/stylus-y0WOYXDO.js +1 -0
  427. package/web-ui/build/static/subunit-DU_iInw0.js +1 -0
  428. package/web-ui/build/static/swift-1VeEUHZi.js +1 -0
  429. package/web-ui/build/static/swift-Iw0x_Dum.js +1 -0
  430. package/web-ui/build/static/systemd-BT_5EOz8.js +1 -0
  431. package/web-ui/build/static/t4-cs-DlHeFrua.js +1 -0
  432. package/web-ui/build/static/t4-templating-Bz3RFfzp.js +1 -0
  433. package/web-ui/build/static/t4-vb-BMG0Q3qg.js +1 -0
  434. package/web-ui/build/static/taggerscript-CxwafGpT.js +1 -0
  435. package/web-ui/build/static/tap-6QugbkZA.js +1 -0
  436. package/web-ui/build/static/tap-SB1ST166.js +1 -0
  437. package/web-ui/build/static/tcl-CpV5bsKx.js +1 -0
  438. package/web-ui/build/static/tcl-Dikgd33H.js +1 -0
  439. package/web-ui/build/static/textile-aPmNtrkM.js +1 -0
  440. package/web-ui/build/static/thrift-B4Snltg5.js +1 -0
  441. package/web-ui/build/static/toml-B8SfswHQ.js +1 -0
  442. package/web-ui/build/static/tp-CdO-cn9g.js +1 -0
  443. package/web-ui/build/static/tremor-CqqCLe4A.js +1 -0
  444. package/web-ui/build/static/tsx-Ck0ZDqEy.js +1 -0
  445. package/web-ui/build/static/tt2-BrqZXSkJ.js +1 -0
  446. package/web-ui/build/static/turtle-DpnSIzmN.js +1 -0
  447. package/web-ui/build/static/twig-B5Et_eTY.js +1 -0
  448. package/web-ui/build/static/twig-C3vsy99c.js +1 -0
  449. package/web-ui/build/static/typescript-DH7tzpeO.js +1 -0
  450. package/web-ui/build/static/typescript-s1qBbHGm.js +1 -0
  451. package/web-ui/build/static/typoscript-DD8499cq.js +1 -0
  452. package/web-ui/build/static/unrealscript-C1zerCVR.js +1 -0
  453. package/web-ui/build/static/uorazor-CtRNfzg2.js +1 -0
  454. package/web-ui/build/static/uri-CAfIv8vn.js +1 -0
  455. package/web-ui/build/static/v-B6_f9ZGJ.js +1 -0
  456. package/web-ui/build/static/vala-BIpejmrf.js +1 -0
  457. package/web-ui/build/static/vala-BYLjm9ih.js +1 -0
  458. package/web-ui/build/static/vbnet-DEW7adbx.js +1 -0
  459. package/web-ui/build/static/vbnet-D_CuPCaz.js +1 -0
  460. package/web-ui/build/static/vbscript-Do9hsQ_u.js +1 -0
  461. package/web-ui/build/static/vbscript-html-4bMQ0-FJ.js +1 -0
  462. package/web-ui/build/static/velocity-CQjo2-fz.js +1 -0
  463. package/web-ui/build/static/verilog-C-Xvd__o.js +1 -0
  464. package/web-ui/build/static/verilog-Dn1ZGsRG.js +1 -0
  465. package/web-ui/build/static/vhdl-DZ-dTOLA.js +1 -0
  466. package/web-ui/build/static/vhdl-bDNJfpa7.js +1 -0
  467. package/web-ui/build/static/vim-BDAo5YHC.js +1 -0
  468. package/web-ui/build/static/vim-ClkOafc3.js +1 -0
  469. package/web-ui/build/static/visual-basic-DXIeLZZ8.js +1 -0
  470. package/web-ui/build/static/warpscript-f7veA-3J.js +1 -0
  471. package/web-ui/build/static/wasm-TToDlmNk.js +1 -0
  472. package/web-ui/build/static/web-idl-CrrjMFQT.js +1 -0
  473. package/web-ui/build/static/wiki-aicisDW2.js +1 -0
  474. package/web-ui/build/static/wolfram-C_A80rAh.js +1 -0
  475. package/web-ui/build/static/wren-DkVyeDoy.js +1 -0
  476. package/web-ui/build/static/x86asm-fx1o_ltw.js +1 -0
  477. package/web-ui/build/static/xeora-D-uaDMXn.js +1 -0
  478. package/web-ui/build/static/xl-Dnyvb9_S.js +1 -0
  479. package/web-ui/build/static/xml-BGV0zG9K.js +1 -0
  480. package/web-ui/build/static/xml-doc-DOGLcenw.js +1 -0
  481. package/web-ui/build/static/xojo-B3Qgvb5A.js +1 -0
  482. package/web-ui/build/static/xquery-C-B5-0Q9.js +1 -0
  483. package/web-ui/build/static/xquery-KbuiAVhj.js +1 -0
  484. package/web-ui/build/static/yaml-CBWBoq6m.js +1 -0
  485. package/web-ui/build/static/yaml-IghlDZf6.js +1 -0
  486. package/web-ui/build/static/yang-CArp62P5.js +1 -0
  487. package/web-ui/build/static/zephir-DMLTJ9_9.js +1 -0
  488. package/web-ui/build/static/zig-CWG2311v.js +1 -0
  489. package/web-ui/build/static/1c-4BRB87En.js +0 -1
  490. package/web-ui/build/static/abap-BXIqiAfL.js +0 -1
  491. package/web-ui/build/static/abnf-0gk1i0eD.js +0 -1
  492. package/web-ui/build/static/abnf-jcv7vN9a.js +0 -1
  493. package/web-ui/build/static/accesslog-bXE2aOZl.js +0 -1
  494. package/web-ui/build/static/actionscript-CF-bqawj.js +0 -1
  495. package/web-ui/build/static/actionscript-CodwLKar.js +0 -1
  496. package/web-ui/build/static/ada-BBEDI84F.js +0 -1
  497. package/web-ui/build/static/ada-Kb6JvaxP.js +0 -1
  498. package/web-ui/build/static/agda-UvnMXUUo.js +0 -1
  499. package/web-ui/build/static/al-D5QZ0ijQ.js +0 -1
  500. package/web-ui/build/static/angelscript-RpvZxbeT.js +0 -1
  501. package/web-ui/build/static/antlr4-BPyUvfii.js +0 -1
  502. package/web-ui/build/static/apache-CtM2pGik.js +0 -1
  503. package/web-ui/build/static/apacheconf-D-i9eISH.js +0 -1
  504. package/web-ui/build/static/apex-Dhn_SJi4.js +0 -1
  505. package/web-ui/build/static/apl-HWtdSaYy.js +0 -1
  506. package/web-ui/build/static/applescript-Br9NrmTP.js +0 -1
  507. package/web-ui/build/static/applescript-DLL0TuGw.js +0 -1
  508. package/web-ui/build/static/aql-MjCgNRUX.js +0 -1
  509. package/web-ui/build/static/arcade--DFvEPVv.js +0 -1
  510. package/web-ui/build/static/arduino-Cqw5W_fL.js +0 -1
  511. package/web-ui/build/static/arduino-DIDBbB7R.js +0 -1
  512. package/web-ui/build/static/arff-GGvbnOhc.js +0 -1
  513. package/web-ui/build/static/armasm-DKLRDLs1.js +0 -1
  514. package/web-ui/build/static/asciidoc-CN5qfm0K.js +0 -1
  515. package/web-ui/build/static/asciidoc-CeQEWYOj.js +0 -1
  516. package/web-ui/build/static/asm6502-B1l2Hc9j.js +0 -1
  517. package/web-ui/build/static/asmatmel-BAojNNWJ.js +0 -1
  518. package/web-ui/build/static/aspectj-DqZFhwdh.js +0 -1
  519. package/web-ui/build/static/aspnet-C0kQPqSr.js +0 -1
  520. package/web-ui/build/static/autohotkey-DY25td-Z.js +0 -1
  521. package/web-ui/build/static/autohotkey-DlqXINgk.js +0 -1
  522. package/web-ui/build/static/autoit-By7J2Y34.js +0 -1
  523. package/web-ui/build/static/autoit-nsu9sBga.js +0 -1
  524. package/web-ui/build/static/avisynth-DmhvVsr-.js +0 -1
  525. package/web-ui/build/static/avrasm-CHfBwwoQ.js +0 -1
  526. package/web-ui/build/static/avro-idl-BKgIWEIF.js +0 -1
  527. package/web-ui/build/static/awk-CpAb4d4E.js +0 -1
  528. package/web-ui/build/static/axapta-CM4aTfCZ.js +0 -1
  529. package/web-ui/build/static/bash-D1KTDlk-.js +0 -1
  530. package/web-ui/build/static/bash-DShkskxb.js +0 -1
  531. package/web-ui/build/static/basic-C4CfKvhg.js +0 -1
  532. package/web-ui/build/static/basic-CkQS4VwL.js +0 -1
  533. package/web-ui/build/static/batch-DZtrClI1.js +0 -1
  534. package/web-ui/build/static/bbcode-CY2FsfaO.js +0 -1
  535. package/web-ui/build/static/bicep-BeSEpm_3.js +0 -1
  536. package/web-ui/build/static/birb-huu22Mwu.js +0 -1
  537. package/web-ui/build/static/bison-CmbxfR57.js +0 -1
  538. package/web-ui/build/static/bnf-c2l_4HXN.js +0 -1
  539. package/web-ui/build/static/bnf-wucEDTqY.js +0 -1
  540. package/web-ui/build/static/brainfuck-CzWBg5U7.js +0 -1
  541. package/web-ui/build/static/brainfuck-I_YQ4sma.js +0 -1
  542. package/web-ui/build/static/brightscript-LOkD4eYW.js +0 -1
  543. package/web-ui/build/static/bro-CLJ7Afqo.js +0 -1
  544. package/web-ui/build/static/bsl-DbUgC2FQ.js +0 -1
  545. package/web-ui/build/static/c-C0S2D2ge.js +0 -1
  546. package/web-ui/build/static/c-KH25O_pL.js +0 -1
  547. package/web-ui/build/static/c-like-DtAFxyl_.js +0 -1
  548. package/web-ui/build/static/cal-uGiVJBNC.js +0 -1
  549. package/web-ui/build/static/capnproto-DSLchjOW.js +0 -1
  550. package/web-ui/build/static/ceylon-Bbxk66YL.js +0 -1
  551. package/web-ui/build/static/cfscript-CjDdgKbl.js +0 -1
  552. package/web-ui/build/static/chaiscript-CnRXaMae.js +0 -1
  553. package/web-ui/build/static/cil-CM9ygF3R.js +0 -1
  554. package/web-ui/build/static/clean-ppAH0SYy.js +0 -1
  555. package/web-ui/build/static/clojure-C5LVccGq.js +0 -1
  556. package/web-ui/build/static/clojure-DtLXiuuC.js +0 -1
  557. package/web-ui/build/static/clojure-repl-fSdrYuup.js +0 -1
  558. package/web-ui/build/static/cmake-AD1fuzSY.js +0 -1
  559. package/web-ui/build/static/cmake-D-o08Yta.js +0 -1
  560. package/web-ui/build/static/cobol-bDh1KHf9.js +0 -1
  561. package/web-ui/build/static/coffeescript-D8InK8kf.js +0 -1
  562. package/web-ui/build/static/coffeescript-MKWUOXb5.js +0 -1
  563. package/web-ui/build/static/concurnas-CR56nj6R.js +0 -1
  564. package/web-ui/build/static/coq-DDLBsBJu.js +0 -1
  565. package/web-ui/build/static/coq-WbhtANeW.js +0 -1
  566. package/web-ui/build/static/cos-Bfmre3op.js +0 -1
  567. package/web-ui/build/static/cpp-Cdy6A7gI.js +0 -1
  568. package/web-ui/build/static/cpp-De2KZejr.js +0 -1
  569. package/web-ui/build/static/crmsh-uf3vbKnN.js +0 -1
  570. package/web-ui/build/static/crystal-BHMyEVPP.js +0 -1
  571. package/web-ui/build/static/crystal-DXAQwftg.js +0 -1
  572. package/web-ui/build/static/csharp-Ci2MRG6L.js +0 -1
  573. package/web-ui/build/static/csharp-D8MV2a7f.js +0 -1
  574. package/web-ui/build/static/cshtml-kVj3v3uY.js +0 -1
  575. package/web-ui/build/static/csp-B83CCdVc.js +0 -1
  576. package/web-ui/build/static/csp-DUO7zlPh.js +0 -1
  577. package/web-ui/build/static/css-BWsx7mtO.js +0 -1
  578. package/web-ui/build/static/css-extras-oHch2Y5C.js +0 -1
  579. package/web-ui/build/static/csv-DIf0iNlc.js +0 -1
  580. package/web-ui/build/static/cypher-B1rOF_f3.js +0 -1
  581. package/web-ui/build/static/d-BUgLS87u.js +0 -1
  582. package/web-ui/build/static/d-ClM8XTCr.js +0 -1
  583. package/web-ui/build/static/dart-D5rVGtrb.js +0 -1
  584. package/web-ui/build/static/dart-Oal__k4m.js +0 -1
  585. package/web-ui/build/static/dataweave-B0uxnNDC.js +0 -1
  586. package/web-ui/build/static/dax-B9z6d1P6.js +0 -1
  587. package/web-ui/build/static/delphi-KMlx8q8A.js +0 -1
  588. package/web-ui/build/static/dhall-DLWFgSR8.js +0 -1
  589. package/web-ui/build/static/diff-DDMGnyhE.js +0 -1
  590. package/web-ui/build/static/diff-yg1oXq3U.js +0 -1
  591. package/web-ui/build/static/django-BDtkIu_c.js +0 -1
  592. package/web-ui/build/static/django-Bkn9HlyQ.js +0 -1
  593. package/web-ui/build/static/dns-Bx1VHfo6.js +0 -1
  594. package/web-ui/build/static/dns-zone-file-Bgn5zn_J.js +0 -1
  595. package/web-ui/build/static/docker-CTdrZJHc.js +0 -1
  596. package/web-ui/build/static/dockerfile-B7ziWbf_.js +0 -1
  597. package/web-ui/build/static/dos-cbBC5Icj.js +0 -1
  598. package/web-ui/build/static/dot-JXSVTLEH.js +0 -1
  599. package/web-ui/build/static/dsconfig-sEua2C2o.js +0 -1
  600. package/web-ui/build/static/dts-Zem_gT_O.js +0 -1
  601. package/web-ui/build/static/dust-B-dZ6-uQ.js +0 -1
  602. package/web-ui/build/static/ebnf-CXfeZoXF.js +0 -1
  603. package/web-ui/build/static/ebnf-raQs4FpT.js +0 -1
  604. package/web-ui/build/static/editorconfig-hp8ARbHf.js +0 -1
  605. package/web-ui/build/static/eiffel-tO3jaG00.js +0 -1
  606. package/web-ui/build/static/ejs-BGmD5Rvl.js +0 -1
  607. package/web-ui/build/static/elixir-CF0JDN9L.js +0 -1
  608. package/web-ui/build/static/elixir-CFSil_Ou.js +0 -1
  609. package/web-ui/build/static/elm-As6XaD-g.js +0 -1
  610. package/web-ui/build/static/elm-pw5GpqTZ.js +0 -1
  611. package/web-ui/build/static/erb-BrpCJIyN.js +0 -1
  612. package/web-ui/build/static/erb-D2_eJU9C.js +0 -1
  613. package/web-ui/build/static/erlang-5rSv6NMZ.js +0 -1
  614. package/web-ui/build/static/erlang-RCAxVMBd.js +0 -1
  615. package/web-ui/build/static/erlang-repl-BN0h_6XR.js +0 -1
  616. package/web-ui/build/static/etlua-BMtMnKtv.js +0 -1
  617. package/web-ui/build/static/excel-CRNS57iM.js +0 -1
  618. package/web-ui/build/static/excel-formula-BNw56R2m.js +0 -1
  619. package/web-ui/build/static/factor-7lsloWTf.js +0 -1
  620. package/web-ui/build/static/false-CQUvGnfd.js +0 -1
  621. package/web-ui/build/static/firestore-security-rules-WC1PabFS.js +0 -1
  622. package/web-ui/build/static/fix-Cs6kLeYV.js +0 -1
  623. package/web-ui/build/static/flix-1fdMgw2I.js +0 -1
  624. package/web-ui/build/static/flow-CRPduKSH.js +0 -1
  625. package/web-ui/build/static/fortran-C-3TUt5R.js +0 -1
  626. package/web-ui/build/static/fortran-CA4bbZCj.js +0 -1
  627. package/web-ui/build/static/fsharp-BScjCFae.js +0 -1
  628. package/web-ui/build/static/fsharp-BtHWuW4o.js +0 -1
  629. package/web-ui/build/static/ftl-Re-S2zvF.js +0 -1
  630. package/web-ui/build/static/gams-Cr12l-cM.js +0 -1
  631. package/web-ui/build/static/gap-H0O9-Zju.js +0 -1
  632. package/web-ui/build/static/gauss-CW8jwURx.js +0 -1
  633. package/web-ui/build/static/gcode-CIxfYtg9.js +0 -1
  634. package/web-ui/build/static/gcode-CVqRWYeB.js +0 -1
  635. package/web-ui/build/static/gdscript-BltZCaKl.js +0 -1
  636. package/web-ui/build/static/gedcom-nMT5ety_.js +0 -1
  637. package/web-ui/build/static/gherkin-B4M7CGOo.js +0 -1
  638. package/web-ui/build/static/gherkin-DumuqAQF.js +0 -1
  639. package/web-ui/build/static/git-BBiBlZ5H.js +0 -1
  640. package/web-ui/build/static/glsl-D8ckiRVo.js +0 -1
  641. package/web-ui/build/static/glsl-Z4VdDyPa.js +0 -1
  642. package/web-ui/build/static/gml-BHuSndHE.js +0 -1
  643. package/web-ui/build/static/gml-DZpfN_A4.js +0 -1
  644. package/web-ui/build/static/gn-BjpAHNh_.js +0 -1
  645. package/web-ui/build/static/go-BeZ9IgZB.js +0 -1
  646. package/web-ui/build/static/go-HEXrcgIc.js +0 -1
  647. package/web-ui/build/static/go-module-BGdPb7sP.js +0 -1
  648. package/web-ui/build/static/golo-Cr70KUbI.js +0 -1
  649. package/web-ui/build/static/gradle-C7MXrDnB.js +0 -1
  650. package/web-ui/build/static/graphql-CJK0wQjf.js +0 -1
  651. package/web-ui/build/static/groovy-Bwe7hkFG.js +0 -1
  652. package/web-ui/build/static/groovy-Dc6WDoKa.js +0 -1
  653. package/web-ui/build/static/haml-BSsAjltt.js +0 -1
  654. package/web-ui/build/static/haml-CZih7X_4.js +0 -1
  655. package/web-ui/build/static/handlebars-CN8hCpsy.js +0 -1
  656. package/web-ui/build/static/handlebars-XBLc7i13.js +0 -1
  657. package/web-ui/build/static/haskell-BH9WhK10.js +0 -1
  658. package/web-ui/build/static/haskell-Djf2J1vd.js +0 -1
  659. package/web-ui/build/static/haxe-BllD-W9e.js +0 -1
  660. package/web-ui/build/static/haxe-DY8Hyn7u.js +0 -1
  661. package/web-ui/build/static/hcl-CfktAP2o.js +0 -1
  662. package/web-ui/build/static/hlsl-B2JSOD9d.js +0 -1
  663. package/web-ui/build/static/hoon-BILyDobB.js +0 -1
  664. package/web-ui/build/static/hpkp-Bb8rXx4p.js +0 -1
  665. package/web-ui/build/static/hsp-BmjeJC21.js +0 -1
  666. package/web-ui/build/static/hsts-DJhW57Fu.js +0 -1
  667. package/web-ui/build/static/htmlbars-CJe_ZLjw.js +0 -1
  668. package/web-ui/build/static/http-D7SlABvQ.js +0 -1
  669. package/web-ui/build/static/http-DEUJqmEm.js +0 -1
  670. package/web-ui/build/static/hy-DVfsgEbr.js +0 -1
  671. package/web-ui/build/static/ichigojam-CPdz2bOt.js +0 -1
  672. package/web-ui/build/static/icon-DYK9RbU9.js +0 -1
  673. package/web-ui/build/static/icu-message-format-HiZB_alB.js +0 -1
  674. package/web-ui/build/static/idris-Clk3tJIE.js +0 -1
  675. package/web-ui/build/static/iecst-D7wkeksq.js +0 -1
  676. package/web-ui/build/static/ignore-GSm-L3jG.js +0 -1
  677. package/web-ui/build/static/index-BJe5td0v.js +0 -13
  678. package/web-ui/build/static/index-BYvljeMN.js +0 -1
  679. package/web-ui/build/static/index-CLelJq9j.js +0 -1156
  680. package/web-ui/build/static/index-f5UnFSsY.css +0 -1
  681. package/web-ui/build/static/inform7-D3gc0hSc.js +0 -1
  682. package/web-ui/build/static/inform7-DLdvZTxX.js +0 -1
  683. package/web-ui/build/static/ini-CVcWx1TA.js +0 -1
  684. package/web-ui/build/static/ini-CxYBdsvZ.js +0 -1
  685. package/web-ui/build/static/io-D760QF0i.js +0 -1
  686. package/web-ui/build/static/irpf90-DfkXdZut.js +0 -1
  687. package/web-ui/build/static/isbl-Bl3W-krY.js +0 -1
  688. package/web-ui/build/static/j-DyJj9FSc.js +0 -1
  689. package/web-ui/build/static/java-CLw1cH97.js +0 -1
  690. package/web-ui/build/static/java-vXaHBzP4.js +0 -1
  691. package/web-ui/build/static/javadoc-p5hIe48g.js +0 -1
  692. package/web-ui/build/static/javadoclike-OXi-sQ0q.js +0 -1
  693. package/web-ui/build/static/javascript-CTSqES8o.js +0 -1
  694. package/web-ui/build/static/javastacktrace-PC9-3moA.js +0 -1
  695. package/web-ui/build/static/jboss-cli-CxOZKDLi.js +0 -1
  696. package/web-ui/build/static/jexl-C4kSXhD1.js +0 -1
  697. package/web-ui/build/static/jolie-CntM8cWx.js +0 -1
  698. package/web-ui/build/static/jq-D_4bTCm0.js +0 -1
  699. package/web-ui/build/static/js-extras-Cx9VAZJd.js +0 -1
  700. package/web-ui/build/static/js-templates-BqyJUDxJ.js +0 -1
  701. package/web-ui/build/static/jsdoc-CNHLgAph.js +0 -1
  702. package/web-ui/build/static/json-BXIFrbVC.js +0 -1
  703. package/web-ui/build/static/json-DRUrJL_F.js +0 -1
  704. package/web-ui/build/static/json5-EsTrOpXr.js +0 -1
  705. package/web-ui/build/static/jsonp-RijEuTJY.js +0 -1
  706. package/web-ui/build/static/jsstacktrace-dM13uE1y.js +0 -1
  707. package/web-ui/build/static/jsx-Cf0j02DZ.js +0 -1
  708. package/web-ui/build/static/julia-BLrtj5Dj.js +0 -1
  709. package/web-ui/build/static/julia-D0PJgQhi.js +0 -1
  710. package/web-ui/build/static/julia-repl-BLnLCve4.js +0 -1
  711. package/web-ui/build/static/keepalived-SvzEYloD.js +0 -1
  712. package/web-ui/build/static/keyman-B5l2mmmE.js +0 -1
  713. package/web-ui/build/static/kotlin-B_6COR1e.js +0 -1
  714. package/web-ui/build/static/kotlin-vd1Xdz6D.js +0 -1
  715. package/web-ui/build/static/kumir-8mIZWgJQ.js +0 -1
  716. package/web-ui/build/static/kusto-CoV2oHqt.js +0 -1
  717. package/web-ui/build/static/lasso-BjjUNa_o.js +0 -1
  718. package/web-ui/build/static/latex-C9KOfuFk.js +0 -1
  719. package/web-ui/build/static/latex-DhLttY-I.js +0 -1
  720. package/web-ui/build/static/latte-CaYNaOoK.js +0 -1
  721. package/web-ui/build/static/ldif-DFxnpH3G.js +0 -1
  722. package/web-ui/build/static/leaf-DrMpC83a.js +0 -1
  723. package/web-ui/build/static/less-DUoYpEFn.js +0 -1
  724. package/web-ui/build/static/less-nh0XCcut.js +0 -1
  725. package/web-ui/build/static/lilypond-BlqjLr3W.js +0 -1
  726. package/web-ui/build/static/liquid-BVGHSG0T.js +0 -1
  727. package/web-ui/build/static/lisp-CEK8BtYQ.js +0 -1
  728. package/web-ui/build/static/lisp-D_jGHxhc.js +0 -1
  729. package/web-ui/build/static/livecodeserver-CFUDw_SK.js +0 -1
  730. package/web-ui/build/static/livescript-C5xzpiLM.js +0 -1
  731. package/web-ui/build/static/livescript-CKoPcK0c.js +0 -1
  732. package/web-ui/build/static/llvm-BBOVIeTl.js +0 -1
  733. package/web-ui/build/static/llvm-ioC5bCUB.js +0 -1
  734. package/web-ui/build/static/log-CPYTqm4T.js +0 -1
  735. package/web-ui/build/static/lolcode-BkT93adT.js +0 -1
  736. package/web-ui/build/static/lsl-M98YPNRW.js +0 -1
  737. package/web-ui/build/static/lua-D7Lum5n9.js +0 -1
  738. package/web-ui/build/static/lua-DHyr0QwE.js +0 -1
  739. package/web-ui/build/static/magma-BwMFjwQu.js +0 -1
  740. package/web-ui/build/static/makefile-BFYZ-SfG.js +0 -1
  741. package/web-ui/build/static/makefile-D6oyR2lD.js +0 -1
  742. package/web-ui/build/static/markdown-6jtg6KZm.js +0 -1
  743. package/web-ui/build/static/markdown-DTLtPgeP.js +0 -1
  744. package/web-ui/build/static/markup-templating-K8uoAIqY.js +0 -1
  745. package/web-ui/build/static/mathematica-cW5hOuB2.js +0 -1
  746. package/web-ui/build/static/matlab-CwSNWEq8.js +0 -1
  747. package/web-ui/build/static/matlab-MQ972BY-.js +0 -1
  748. package/web-ui/build/static/maxima-CMSFLri-.js +0 -1
  749. package/web-ui/build/static/maxscript-BzcoS2KA.js +0 -1
  750. package/web-ui/build/static/mel-Cd20pAs-.js +0 -1
  751. package/web-ui/build/static/mel-KWG5N49g.js +0 -1
  752. package/web-ui/build/static/mercury-eW1ljJh0.js +0 -1
  753. package/web-ui/build/static/mermaid-D3zeCM84.js +0 -1
  754. package/web-ui/build/static/mipsasm-B5g6Ndra.js +0 -1
  755. package/web-ui/build/static/mizar-C_nZ0Ts9.js +0 -1
  756. package/web-ui/build/static/mizar-CuTNEv2t.js +0 -1
  757. package/web-ui/build/static/mojolicious-C1Xq--lT.js +0 -1
  758. package/web-ui/build/static/mongodb-C_3giArw.js +0 -1
  759. package/web-ui/build/static/monkey-DQ1olPd-.js +0 -1
  760. package/web-ui/build/static/monkey-n4Tbrep7.js +0 -1
  761. package/web-ui/build/static/moonscript-CmnQJuIL.js +0 -1
  762. package/web-ui/build/static/moonscript-DXgmWjLy.js +0 -1
  763. package/web-ui/build/static/n1ql-531a3W-1.js +0 -1
  764. package/web-ui/build/static/n1ql-BYH9EvME.js +0 -1
  765. package/web-ui/build/static/n4js-Cy0LcM-V.js +0 -1
  766. package/web-ui/build/static/nand2tetris-hdl-CKOztBDD.js +0 -1
  767. package/web-ui/build/static/naniscript-oLFpxBGE.js +0 -1
  768. package/web-ui/build/static/nasm-DLPnwFkM.js +0 -1
  769. package/web-ui/build/static/neon-Cn03wGUR.js +0 -1
  770. package/web-ui/build/static/nevod-C_VRvbdf.js +0 -1
  771. package/web-ui/build/static/nginx-60SpLv4t.js +0 -1
  772. package/web-ui/build/static/nginx-DZLHid-q.js +0 -1
  773. package/web-ui/build/static/nim-BnrHdqGC.js +0 -1
  774. package/web-ui/build/static/nim-Ds3pmwtE.js +0 -1
  775. package/web-ui/build/static/nix-Dl-dS0w4.js +0 -1
  776. package/web-ui/build/static/nix-jL62FzTz.js +0 -1
  777. package/web-ui/build/static/node-repl-BAuDzNZd.js +0 -1
  778. package/web-ui/build/static/nsis-CEnFjfNr.js +0 -1
  779. package/web-ui/build/static/nsis-CcCz6HIu.js +0 -1
  780. package/web-ui/build/static/objectivec-CZXfVowS.js +0 -1
  781. package/web-ui/build/static/objectivec-CuaFU-Ef.js +0 -1
  782. package/web-ui/build/static/ocaml-BGAzfwAx.js +0 -1
  783. package/web-ui/build/static/ocaml-BoO1lU26.js +0 -1
  784. package/web-ui/build/static/opencl-DAnD5xP-.js +0 -1
  785. package/web-ui/build/static/openqasm-CO7gdVj9.js +0 -1
  786. package/web-ui/build/static/openscad-B2wMEMQR.js +0 -1
  787. package/web-ui/build/static/oxygene-1erv93gF.js +0 -1
  788. package/web-ui/build/static/oz-D3334gi7.js +0 -1
  789. package/web-ui/build/static/parigp-rQZTN8zi.js +0 -1
  790. package/web-ui/build/static/parser-B4ZSZ1ig.js +0 -1
  791. package/web-ui/build/static/parser3-CCCjkYLG.js +0 -1
  792. package/web-ui/build/static/pascal-DeC9Pvom.js +0 -1
  793. package/web-ui/build/static/pascaligo-CT2u6UpO.js +0 -1
  794. package/web-ui/build/static/pcaxis-CvlRg6t4.js +0 -1
  795. package/web-ui/build/static/peoplecode-BYahULz2.js +0 -1
  796. package/web-ui/build/static/perl-CKgvyY59.js +0 -1
  797. package/web-ui/build/static/perl-E7sx7Izv.js +0 -1
  798. package/web-ui/build/static/pf-D9wnFBt7.js +0 -1
  799. package/web-ui/build/static/pgsql-CrlBdRAn.js +0 -1
  800. package/web-ui/build/static/php-D2O-B3y7.js +0 -1
  801. package/web-ui/build/static/php-extras-BKqZuzgt.js +0 -1
  802. package/web-ui/build/static/php-nfXl9WfB.js +0 -1
  803. package/web-ui/build/static/php-template-Cg8ERLNQ.js +0 -1
  804. package/web-ui/build/static/phpdoc-Z1u90OwH.js +0 -1
  805. package/web-ui/build/static/plaintext-DkNVeXWx.js +0 -1
  806. package/web-ui/build/static/plsql-DO5fJNhS.js +0 -1
  807. package/web-ui/build/static/pony-DXIqq5Bk.js +0 -1
  808. package/web-ui/build/static/powerquery-B2ovxJZi.js +0 -1
  809. package/web-ui/build/static/powershell-BVeqqari.js +0 -1
  810. package/web-ui/build/static/powershell-CskV4qWh.js +0 -1
  811. package/web-ui/build/static/processing-D90SJpnq.js +0 -1
  812. package/web-ui/build/static/processing-DP2mf97Z.js +0 -1
  813. package/web-ui/build/static/profile-H6zk8v_f.js +0 -1
  814. package/web-ui/build/static/prolog-AUfxYiJV.js +0 -1
  815. package/web-ui/build/static/prolog-Dz2WdsVN.js +0 -1
  816. package/web-ui/build/static/promql-CloMJmMW.js +0 -1
  817. package/web-ui/build/static/properties-CTl3mnrP.js +0 -1
  818. package/web-ui/build/static/properties-D2RfteTZ.js +0 -1
  819. package/web-ui/build/static/protobuf-Be9oqQCu.js +0 -1
  820. package/web-ui/build/static/protobuf-BgG8zUnY.js +0 -1
  821. package/web-ui/build/static/psl-Bqx8iN9e.js +0 -1
  822. package/web-ui/build/static/pug-CHfFC0Wg.js +0 -1
  823. package/web-ui/build/static/puppet-__1ifzZS.js +0 -1
  824. package/web-ui/build/static/puppet-pbtRCMgd.js +0 -1
  825. package/web-ui/build/static/pure-B9STuf4F.js +0 -1
  826. package/web-ui/build/static/purebasic-7ADyn-Ce.js +0 -1
  827. package/web-ui/build/static/purebasic-Bc06YQcD.js +0 -1
  828. package/web-ui/build/static/purescript-CU-dDebr.js +0 -1
  829. package/web-ui/build/static/python-BEsXrEbi.js +0 -1
  830. package/web-ui/build/static/python-CZFrgH2X.js +0 -1
  831. package/web-ui/build/static/python-repl-CI9GmJce.js +0 -1
  832. package/web-ui/build/static/q-E7xvTGRo.js +0 -1
  833. package/web-ui/build/static/q-hvg9aQoY.js +0 -1
  834. package/web-ui/build/static/qml-DkZWcxEv.js +0 -1
  835. package/web-ui/build/static/qml-DpdWla8G.js +0 -1
  836. package/web-ui/build/static/qore-Dsm7ACR_.js +0 -1
  837. package/web-ui/build/static/qsharp-BBec6MJR.js +0 -1
  838. package/web-ui/build/static/r-CTVkq_Ky.js +0 -1
  839. package/web-ui/build/static/r-DHGNCupF.js +0 -1
  840. package/web-ui/build/static/racket-hoSh4YPx.js +0 -1
  841. package/web-ui/build/static/reason-CQPUIbsm.js +0 -1
  842. package/web-ui/build/static/reasonml-BXtFFSTZ.js +0 -1
  843. package/web-ui/build/static/regex-BNkF_ufb.js +0 -1
  844. package/web-ui/build/static/rego-BXHrjItC.js +0 -1
  845. package/web-ui/build/static/renpy-CBQvK_5t.js +0 -1
  846. package/web-ui/build/static/rest-Bf8hzmF1.js +0 -1
  847. package/web-ui/build/static/rib-D0a4KzlP.js +0 -1
  848. package/web-ui/build/static/rip-DchN4BQN.js +0 -1
  849. package/web-ui/build/static/roboconf-HXnyGNTm.js +0 -1
  850. package/web-ui/build/static/roboconf-zfK6mgmU.js +0 -1
  851. package/web-ui/build/static/robotframework-DnP-vXyd.js +0 -1
  852. package/web-ui/build/static/routeros-CDirYxZY.js +0 -1
  853. package/web-ui/build/static/rsl-BCK_msc-.js +0 -1
  854. package/web-ui/build/static/ruby--mXX6GNK.js +0 -1
  855. package/web-ui/build/static/ruby-BIdQYq0Y.js +0 -1
  856. package/web-ui/build/static/ruleslanguage-BD07s5RU.js +0 -1
  857. package/web-ui/build/static/rust-Bgni9V7U.js +0 -1
  858. package/web-ui/build/static/rust-OywmQ2ox.js +0 -1
  859. package/web-ui/build/static/sas-B6-82htH.js +0 -1
  860. package/web-ui/build/static/sas-k9XEScbR.js +0 -1
  861. package/web-ui/build/static/sass-BOvNBStT.js +0 -1
  862. package/web-ui/build/static/scala-At07fmMd.js +0 -1
  863. package/web-ui/build/static/scala-DUOfqSaU.js +0 -1
  864. package/web-ui/build/static/scheme-B87lC0bK.js +0 -1
  865. package/web-ui/build/static/scheme-BS7OzWRX.js +0 -1
  866. package/web-ui/build/static/scilab-Bmn4jjcu.js +0 -1
  867. package/web-ui/build/static/scss-DTeB95yE.js +0 -1
  868. package/web-ui/build/static/scss-xilnl6Dx.js +0 -1
  869. package/web-ui/build/static/shell-CKetyy4y.js +0 -1
  870. package/web-ui/build/static/shell-session-B6rat2c7.js +0 -1
  871. package/web-ui/build/static/smali-C9O9CXOD.js +0 -1
  872. package/web-ui/build/static/smali-CBkgbinS.js +0 -1
  873. package/web-ui/build/static/smalltalk-CuUjFHiz.js +0 -1
  874. package/web-ui/build/static/smalltalk-D0xhFL9b.js +0 -1
  875. package/web-ui/build/static/smarty-CY0N0d5x.js +0 -1
  876. package/web-ui/build/static/sml-BVAw3fjB.js +0 -1
  877. package/web-ui/build/static/sml-CO9XB1ax.js +0 -1
  878. package/web-ui/build/static/solidity-BNixD4Dx.js +0 -1
  879. package/web-ui/build/static/solution-file-DHyGXf2y.js +0 -1
  880. package/web-ui/build/static/soy-Cxgjntsl.js +0 -1
  881. package/web-ui/build/static/sparql-CDLqu9vy.js +0 -1
  882. package/web-ui/build/static/splunk-spl-Cmkl_Xmw.js +0 -1
  883. package/web-ui/build/static/sqf-CIGKolw3.js +0 -1
  884. package/web-ui/build/static/sqf-Cfp_lC6-.js +0 -1
  885. package/web-ui/build/static/sql-DHOGwYxe.js +0 -1
  886. package/web-ui/build/static/sql-QIw1Q2yi.js +0 -1
  887. package/web-ui/build/static/sql_more-C0b3-InT.js +0 -1
  888. package/web-ui/build/static/squirrel-DASToo1F.js +0 -1
  889. package/web-ui/build/static/stan-DHMkcFZg.js +0 -1
  890. package/web-ui/build/static/stan-No3nsdnQ.js +0 -1
  891. package/web-ui/build/static/stata-Brkzu5Nv.js +0 -1
  892. package/web-ui/build/static/step21-D2l5M5Ml.js +0 -1
  893. package/web-ui/build/static/stylus-Bx6FaZN_.js +0 -1
  894. package/web-ui/build/static/stylus-CVkTaPns.js +0 -1
  895. package/web-ui/build/static/subunit-CDrsAMuL.js +0 -1
  896. package/web-ui/build/static/swift-BSw_pS-l.js +0 -1
  897. package/web-ui/build/static/swift-BWyqwIo8.js +0 -1
  898. package/web-ui/build/static/systemd-BwqpYcJK.js +0 -1
  899. package/web-ui/build/static/t4-cs-CwsJLOxV.js +0 -1
  900. package/web-ui/build/static/t4-templating-BfxY01xf.js +0 -1
  901. package/web-ui/build/static/t4-vb-BhsKKFhp.js +0 -1
  902. package/web-ui/build/static/taggerscript-Bkew95or.js +0 -1
  903. package/web-ui/build/static/tap-DHovcHbS.js +0 -1
  904. package/web-ui/build/static/tap-DPl9uPo4.js +0 -1
  905. package/web-ui/build/static/tcl-BeozHO-f.js +0 -1
  906. package/web-ui/build/static/tcl-Df_8ItQH.js +0 -1
  907. package/web-ui/build/static/textile-B3m_f58b.js +0 -1
  908. package/web-ui/build/static/thrift-D20n-HpW.js +0 -1
  909. package/web-ui/build/static/toml-C-fTAonK.js +0 -1
  910. package/web-ui/build/static/tp-hGbXe5Eo.js +0 -1
  911. package/web-ui/build/static/tremor-BaVOtRFz.js +0 -1
  912. package/web-ui/build/static/tsx-ChPInNl0.js +0 -1
  913. package/web-ui/build/static/tt2-DAIJ8cpz.js +0 -1
  914. package/web-ui/build/static/turtle-B7z_y-PK.js +0 -1
  915. package/web-ui/build/static/twig-TUEkve6W.js +0 -1
  916. package/web-ui/build/static/twig-stKDItz7.js +0 -1
  917. package/web-ui/build/static/typescript-BPdM-QOM.js +0 -1
  918. package/web-ui/build/static/typescript-DjSY4MvL.js +0 -1
  919. package/web-ui/build/static/typoscript-BQHgQtEL.js +0 -1
  920. package/web-ui/build/static/unrealscript-g8yNPQQ5.js +0 -1
  921. package/web-ui/build/static/uorazor-CnuMiQz9.js +0 -1
  922. package/web-ui/build/static/uri-CfioiemU.js +0 -1
  923. package/web-ui/build/static/v-B69Oau14.js +0 -1
  924. package/web-ui/build/static/vala-C0PjlK3l.js +0 -1
  925. package/web-ui/build/static/vala-COgjD3gU.js +0 -1
  926. package/web-ui/build/static/vbnet-CklOnyuR.js +0 -1
  927. package/web-ui/build/static/vbnet-MxHUC5Mz.js +0 -1
  928. package/web-ui/build/static/vbscript-BxQnA97w.js +0 -1
  929. package/web-ui/build/static/vbscript-html-DOtde7dD.js +0 -1
  930. package/web-ui/build/static/velocity-l8B9m66X.js +0 -1
  931. package/web-ui/build/static/verilog-DF6dF-Vp.js +0 -1
  932. package/web-ui/build/static/verilog-Dgb9SDRX.js +0 -1
  933. package/web-ui/build/static/vhdl-0GarU_AK.js +0 -1
  934. package/web-ui/build/static/vhdl-BfPQnOdI.js +0 -1
  935. package/web-ui/build/static/vim-Likg_-II.js +0 -1
  936. package/web-ui/build/static/vim-k53Sj7A3.js +0 -1
  937. package/web-ui/build/static/visual-basic-BNVZCzlV.js +0 -1
  938. package/web-ui/build/static/warpscript-BkLK5iuW.js +0 -1
  939. package/web-ui/build/static/wasm-CQhA1ece.js +0 -1
  940. package/web-ui/build/static/web-idl-DmNsI0kE.js +0 -1
  941. package/web-ui/build/static/wiki-B3z4pmra.js +0 -1
  942. package/web-ui/build/static/wolfram-Dsf21d_g.js +0 -1
  943. package/web-ui/build/static/wren-BZXZlzrL.js +0 -1
  944. package/web-ui/build/static/x86asm-DpWGZhJU.js +0 -1
  945. package/web-ui/build/static/xeora-8xPZN4DH.js +0 -1
  946. package/web-ui/build/static/xl-XkdWYMGl.js +0 -1
  947. package/web-ui/build/static/xml-BBdROEWt.js +0 -1
  948. package/web-ui/build/static/xml-doc-Cjs4OpTe.js +0 -1
  949. package/web-ui/build/static/xojo-nCen1FPx.js +0 -1
  950. package/web-ui/build/static/xquery-CBFkAxo1.js +0 -1
  951. package/web-ui/build/static/xquery-Dwsc1weX.js +0 -1
  952. package/web-ui/build/static/yaml-DzSAh6jl.js +0 -1
  953. package/web-ui/build/static/yaml-Lg8gnEUU.js +0 -1
  954. package/web-ui/build/static/yang-Bd-v2b0k.js +0 -1
  955. package/web-ui/build/static/zephir-wbJOizIa.js +0 -1
  956. package/web-ui/build/static/zig-Cz384XjE.js +0 -1
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Account & API-key management routes on the local CLI server.
3
+ *
4
+ * These are thin proxies over the autopilot-backend's `/auth/*` and
5
+ * `/account/*` endpoints. The local server holds the user's JWT in
6
+ * `lastAuthResult.jwt` (encrypted on disk via authCacheStore) and
7
+ * forwards it as a `Authorization: Bearer` to the backend. The web-ui
8
+ * never sees the JWT after the initial OAuth landing — keeping it on
9
+ * the local-server side means:
10
+ *
11
+ * 1. No CORS dance between the browser and Azure backend.
12
+ * 2. The web-ui can talk to one origin (its own).
13
+ * 3. A compromised renderer cannot exfiltrate the bearer in plaintext
14
+ * (it lives in localStorage, but everything that NEEDS it goes
15
+ * through the local server).
16
+ * 4. Symmetric with the existing marketplaceApi pattern.
17
+ *
18
+ * Endpoints (mounted by webServer.js at boot):
19
+ * GET /api/account/profile — proxies /auth/me
20
+ * GET /api/account/balance — proxies /account/balance (ledger)
21
+ * GET /api/account/keys — proxies /auth/apikeys
22
+ * POST /api/account/keys — proxies /auth/apikey (one-time-reveal body)
23
+ * DELETE /api/account/keys/:id — proxies /auth/apikey/:id
24
+ * POST /api/account/handoff — mints + returns a portal handoff URL
25
+ *
26
+ * Auth: each route requires `lastAuthResult.jwt` to be present. When
27
+ * the user hasn't OAuth'd yet, we return 401 with a clear `code` the
28
+ * FE can branch on ('not_signed_in') so it can prompt for sign-in
29
+ * rather than show a generic error.
30
+ *
31
+ * Security guarantees:
32
+ * - The local server never returns the JWT to the renderer.
33
+ * - The API-key create endpoint returns the `lx_*` value exactly
34
+ * once (mirroring the backend); subsequent list calls show only
35
+ * metadata + a masked key.
36
+ * - The handoff URL embeds a single-use short-lived token, NOT the
37
+ * long-lived JWT.
38
+ * - All errors are normalised to `{ success: false, error, code? }`
39
+ * so the FE never has to special-case axios vs fetch envelopes.
40
+ *
41
+ * Testable design:
42
+ * `createAccountRouter()` accepts every dependency it needs (fetch
43
+ * impl, backend URL, JWT getter, logger). Production builds inject
44
+ * the real ones; tests inject stubs. See accountRoutes.test.js.
45
+ */
46
+
47
+ import express from 'express';
48
+
49
+ /**
50
+ * Default backend URL — overridable via the same `config.backend.baseUrl`
51
+ * the existing /auth routes use, so a single env-config change moves
52
+ * every backend call to staging or local-dev.
53
+ */
54
+ const DEFAULT_BACKEND_URL = 'https://autopilot-api.azurewebsites.net';
55
+
56
+ /**
57
+ * Portal URL per brand. The handoff endpoint uses this to construct
58
+ * the deep-link the FE opens in the system browser. Two reasons we
59
+ * pick the brand at construction time, not request time:
60
+ * - The local server already knows its brand (loaded at boot).
61
+ * - The renderer should never get to influence which portal we send
62
+ * the user to (mitigation against open-redirect via a tampered
63
+ * request body).
64
+ */
65
+ const PORTAL_URLS_BY_BRAND = Object.freeze({
66
+ autopilot: 'https://autopilot.loxia.ai',
67
+ onbuzz: 'https://onbuzz.loxia.ai',
68
+ });
69
+
70
+ /**
71
+ * Codes the FE branches on. Keep this list in lockstep with web-ui's
72
+ * account API client. New codes must be added to the FE's switch.
73
+ */
74
+ export const ERROR_CODES = Object.freeze({
75
+ NOT_SIGNED_IN: 'not_signed_in',
76
+ BACKEND_ERROR: 'backend_error',
77
+ NETWORK_ERROR: 'network_error',
78
+ BAD_REQUEST: 'bad_request',
79
+ NOT_FOUND: 'not_found',
80
+ });
81
+
82
+ /**
83
+ * Build the account router. Pure DI — every external concern is a
84
+ * function the caller passes in.
85
+ *
86
+ * @param {Object} deps
87
+ * @param {() => string|null} deps.getJwt
88
+ * Returns the user's current JWT or null when unauthenticated.
89
+ * Caller hooks this to `() => webServer.lastAuthResult?.jwt`.
90
+ * @param {() => string} deps.getBrand
91
+ * Returns 'autopilot' | 'onbuzz'. Used to pick portal URL.
92
+ * @param {string} [deps.backendBaseUrl]
93
+ * @param {typeof fetch} [deps.fetchImpl]
94
+ * @param {Object} [deps.logger]
95
+ */
96
+ export function createAccountRouter({
97
+ getJwt,
98
+ getBrand,
99
+ backendBaseUrl = DEFAULT_BACKEND_URL,
100
+ fetchImpl = fetch,
101
+ logger = console,
102
+ } = {}) {
103
+ if (typeof getJwt !== 'function') throw new Error('createAccountRouter: getJwt is required');
104
+ if (typeof getBrand !== 'function') throw new Error('createAccountRouter: getBrand is required');
105
+
106
+ const router = express.Router();
107
+ const baseUrl = backendBaseUrl.replace(/\/$/, '');
108
+
109
+ /**
110
+ * Forward a request to the backend with the user's JWT. Returns a
111
+ * { status, body } tuple the route handlers can hand straight back
112
+ * to Express, normalising every transport failure into the same
113
+ * envelope.
114
+ */
115
+ async function proxyToBackend(method, path, body) {
116
+ const jwt = getJwt();
117
+ if (!jwt) {
118
+ return {
119
+ status: 401,
120
+ body: { success: false, error: 'Sign in to manage your account', code: ERROR_CODES.NOT_SIGNED_IN },
121
+ };
122
+ }
123
+ const url = `${baseUrl}${path}`;
124
+ try {
125
+ const res = await fetchImpl(url, {
126
+ method,
127
+ headers: {
128
+ 'Authorization': `Bearer ${jwt}`,
129
+ 'Content-Type': 'application/json',
130
+ },
131
+ body: body !== undefined ? JSON.stringify(body) : undefined,
132
+ });
133
+
134
+ const text = await res.text();
135
+ let parsed;
136
+ try { parsed = text ? JSON.parse(text) : {}; } catch { parsed = { raw: text }; }
137
+
138
+ if (!res.ok) {
139
+ return {
140
+ status: res.status,
141
+ body: {
142
+ success: false,
143
+ error: parsed.error || parsed.message || `Backend returned ${res.status}`,
144
+ code: res.status === 404 ? ERROR_CODES.NOT_FOUND : ERROR_CODES.BACKEND_ERROR,
145
+ },
146
+ };
147
+ }
148
+ return { status: res.status, body: parsed };
149
+ } catch (err) {
150
+ logger?.warn?.('[accountRoutes] backend fetch failed', { method, path, error: err.message });
151
+ return {
152
+ status: 503,
153
+ body: {
154
+ success: false,
155
+ error: 'Could not reach the account service. Try again in a moment.',
156
+ code: ERROR_CODES.NETWORK_ERROR,
157
+ },
158
+ };
159
+ }
160
+ }
161
+
162
+ // ── Profile ────────────────────────────────────────────────────────
163
+ router.get('/profile', async (_req, res) => {
164
+ const r = await proxyToBackend('GET', '/auth/me');
165
+ // /auth/me returns either `{ user: {...} }` or `{...userFields}`.
166
+ // Normalise so the FE always sees `{ user: {...} }`.
167
+ if (r.status === 200) {
168
+ const u = r.body?.user || r.body;
169
+ return res.json({ success: true, user: u });
170
+ }
171
+ res.status(r.status).json(r.body);
172
+ });
173
+
174
+ // ── Balance ────────────────────────────────────────────────────────
175
+ router.get('/balance', async (_req, res) => {
176
+ // The backend exposes a balance read at /account/profile (which
177
+ // bundles plan + balance) — see autopilot-backend/routes/account.js.
178
+ // Calling this single endpoint instead of /ledger/balance keeps the
179
+ // local server free of ledger credentials.
180
+ const r = await proxyToBackend('GET', '/account/profile');
181
+ res.status(r.status).json(r.body);
182
+ });
183
+
184
+ // ── API keys list ──────────────────────────────────────────────────
185
+ router.get('/keys', async (_req, res) => {
186
+ const r = await proxyToBackend('GET', '/auth/apikeys');
187
+ res.status(r.status).json(r.body);
188
+ });
189
+
190
+ // ── API key create ────────────────────────────────────────────────
191
+ router.post('/keys', express.json(), async (req, res) => {
192
+ const { name, expiresIn } = req.body || {};
193
+ if (!name || typeof name !== 'string' || !name.trim()) {
194
+ return res.status(400).json({
195
+ success: false,
196
+ error: 'Provide a name to identify the key',
197
+ code: ERROR_CODES.BAD_REQUEST,
198
+ });
199
+ }
200
+ const payload = { name: name.trim() };
201
+ if (expiresIn != null) payload.expiresIn = expiresIn;
202
+ const r = await proxyToBackend('POST', '/auth/apikey', payload);
203
+ res.status(r.status).json(r.body);
204
+ });
205
+
206
+ // ── API key revoke ────────────────────────────────────────────────
207
+ router.delete('/keys/:id', async (req, res) => {
208
+ const id = req.params.id;
209
+ if (!id || !/^[a-zA-Z0-9_-]+$/.test(id)) {
210
+ return res.status(400).json({
211
+ success: false,
212
+ error: 'Invalid key id',
213
+ code: ERROR_CODES.BAD_REQUEST,
214
+ });
215
+ }
216
+ const r = await proxyToBackend('DELETE', `/auth/apikey/${encodeURIComponent(id)}`);
217
+ res.status(r.status).json(r.body);
218
+ });
219
+
220
+ // ── Portal handoff (Buy Credits) ──────────────────────────────────
221
+ router.post('/handoff', async (req, res) => {
222
+ const { destination } = req.body || {};
223
+ // Closed allowlist — never let the renderer drive arbitrary portal
224
+ // paths. New destinations must be added here intentionally.
225
+ const ALLOWED_DESTINATIONS = ['payment', 'subscription', 'api-keys', 'account'];
226
+ const path = destination && ALLOWED_DESTINATIONS.includes(destination) ? destination : 'payment';
227
+
228
+ const r = await proxyToBackend('POST', '/auth/handoff-token', { purpose: `portal-${path}` });
229
+ if (r.status !== 200 && r.status !== 201) {
230
+ return res.status(r.status).json(r.body);
231
+ }
232
+ const handoff = r.body?.handoff || r.body?.token;
233
+ if (!handoff) {
234
+ return res.status(502).json({
235
+ success: false,
236
+ error: 'Backend did not return a handoff token',
237
+ code: ERROR_CODES.BACKEND_ERROR,
238
+ });
239
+ }
240
+ const brand = getBrand();
241
+ const portalBase = PORTAL_URLS_BY_BRAND[brand] || PORTAL_URLS_BY_BRAND.autopilot;
242
+ const url = `${portalBase}/${path}?handoff=${encodeURIComponent(handoff)}`;
243
+ res.json({ success: true, url });
244
+ });
245
+
246
+ return router;
247
+ }
248
+
249
+ // Exported so tests + future routes can re-use it.
250
+ export const __test__ = { PORTAL_URLS_BY_BRAND, DEFAULT_BACKEND_URL };
@@ -33,6 +33,9 @@ import { getGalleryService } from '../services/galleryService.js';
33
33
  import { getUserDataPaths } from '../utilities/userDataDir.js';
34
34
  import { projectActiveRuns } from '../utilities/flowRunFilters.js';
35
35
  import { recordOAuthResult, recordResolvedUser, projectAuthStatus } from '../utilities/authCache.js';
36
+ import AuthCacheStore from '../services/authCacheStore.js';
37
+ import { createAccountRouter } from './accountRoutes.js';
38
+ import { getBrand } from '../utilities/brand.js';
36
39
 
37
40
  // Connect visual editor server to bridge (enables element selection forwarding)
38
41
  setBridgeGetter(getVisualEditorBridge);
@@ -419,8 +422,15 @@ class WebServer {
419
422
  // API Key Manager reference (will be set by LoxiaSystem)
420
423
  this.apiKeyManager = null;
421
424
 
422
- // Cached auth result for polling support (set by /auth/callback, cleared by /auth/signout)
423
- this.lastAuthResult = null; // { user, hasApiKey, timestamp }
425
+ // Cached auth result for polling support (set by /auth/callback, cleared by /auth/signout).
426
+ // Shape: { user, hasApiKey, jwt, timestamp }. The JWT is the critical
427
+ // field for marketplace publish/install/rate calls — see authCache.js.
428
+ // Persisted encrypted to <userDataDir>/settings/auth-cache.enc via
429
+ // `authCacheStore` so a server restart no longer wipes the JWT.
430
+ // Use `_setLastAuthResult(value)` rather than assigning directly so
431
+ // every mutation hits disk too.
432
+ this.lastAuthResult = null;
433
+ this.authCacheStore = new AuthCacheStore(this.logger);
424
434
 
425
435
  // Credential Vault for secure credential management
426
436
  this.credentialVault = null;
@@ -447,6 +457,20 @@ class WebServer {
447
457
  */
448
458
  async initialize() {
449
459
  try {
460
+ // Restore the persisted auth cache (JWT + user) so a server restart
461
+ // doesn't strand the FE without a token. Best-effort: a missing or
462
+ // corrupted file just leaves `lastAuthResult` at null.
463
+ await this.authCacheStore.initialize();
464
+ const restored = await this.authCacheStore.load();
465
+ if (restored) {
466
+ this.lastAuthResult = restored;
467
+ this.logger?.info?.('[WebServer] Restored auth cache from disk', {
468
+ hasUser: !!restored.user,
469
+ hasJwt: !!restored.jwt,
470
+ savedAt: restored.timestamp,
471
+ });
472
+ }
473
+
450
474
  this.setupMiddleware();
451
475
  await this.setupRoutes();
452
476
  this.setupWebSocket();
@@ -462,7 +486,7 @@ class WebServer {
462
486
  // In remote session mode, auto-configure API key from environment
463
487
  if (process.env.LOXIA_REMOTE_SESSION === 'true' && process.env.LOXIA_API_KEY && this.apiKeyManager) {
464
488
  try {
465
- await this.apiKeyManager.setKeys(null, { loxiaApiKey: process.env.LOXIA_API_KEY });
489
+ await this.apiKeyManager.setSessionKeys(null, { loxiaApiKey: process.env.LOXIA_API_KEY });
466
490
  this.logger.info('Remote session: API key auto-configured from environment');
467
491
  } catch (err) {
468
492
  this.logger.warn('Remote session: Failed to set API key from environment', { error: err.message });
@@ -485,6 +509,22 @@ class WebServer {
485
509
  }
486
510
  }
487
511
 
512
+ /**
513
+ * Single mutator for `lastAuthResult`. Always writes to disk so a
514
+ * server restart can restore the JWT. Passing null clears both
515
+ * memory and disk. Every call site that previously assigned to
516
+ * `this.lastAuthResult` directly should go through this helper.
517
+ * @param {Object|null} value
518
+ * @returns {Promise<void>}
519
+ */
520
+ async _setLastAuthResult(value) {
521
+ this.lastAuthResult = value || null;
522
+ // Fire-and-forget would be tempting but it lets a fast-following
523
+ // /api/auth/status read race the write. Awaiting is cheap: one
524
+ // ~200B AES-GCM write to a local file.
525
+ await this.authCacheStore.save(this.lastAuthResult);
526
+ }
527
+
488
528
  /**
489
529
  * Start the Visual Editor Server (always-on mode)
490
530
  * Server runs on port 4000 (or configured port) and waits for agent connections
@@ -859,7 +899,7 @@ class WebServer {
859
899
 
860
900
  // Store the API key if generated
861
901
  if (apiKey && this.apiKeyManager) {
862
- await this.apiKeyManager.setKeys(null, { loxiaApiKey: apiKey });
902
+ await this.apiKeyManager.setSessionKeys(null, { loxiaApiKey: apiKey });
863
903
  this.logger?.info('API key auto-configured from OAuth login', { userId: userInfo.id });
864
904
  }
865
905
 
@@ -870,11 +910,11 @@ class WebServer {
870
910
  // marketplace publish/install/rate calls would 401 because the
871
911
  // FE never got the token into localStorage. Logic lives in
872
912
  // `utilities/authCache.js` so unit tests can lock the contract.
873
- this.lastAuthResult = recordOAuthResult({
913
+ await this._setLastAuthResult(recordOAuthResult({
874
914
  user: userInfo,
875
915
  jwt: token,
876
916
  hasApiKey: !!apiKey,
877
- });
917
+ }));
878
918
 
879
919
  // Broadcast auth success to connected web UI clients
880
920
  // Include the raw JWT so the frontend can use it for marketplace API calls
@@ -945,10 +985,10 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
945
985
  // Preserves any JWT from a prior OAuth login (this path mints
946
986
  // no JWT of its own — it just links a user from an existing
947
987
  // API key). See utilities/authCache.js for the invariant.
948
- this.lastAuthResult = recordResolvedUser({
988
+ await this._setLastAuthResult(recordResolvedUser({
949
989
  user,
950
990
  prevCache: this.lastAuthResult,
951
- });
991
+ }));
952
992
 
953
993
  res.json({ success: true, user });
954
994
  } catch (error) {
@@ -961,9 +1001,9 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
961
1001
  this.app.post('/api/auth/signout', async (req, res) => {
962
1002
  try {
963
1003
  if (this.apiKeyManager) {
964
- await this.apiKeyManager.removeKeys(null);
1004
+ await this.apiKeyManager.removeSessionKeys(null);
965
1005
  }
966
- this.lastAuthResult = null;
1006
+ await this._setLastAuthResult(null);
967
1007
  this.broadcastToSession(null, {
968
1008
  type: 'auth_signout',
969
1009
  data: { timestamp: new Date().toISOString() }
@@ -974,6 +1014,19 @@ h2{color:#16a34a;margin-bottom:.5rem;} p{color:#666;}</style></head>
974
1014
  }
975
1015
  });
976
1016
 
1017
+ // =====================================================
1018
+ // Account & API-key management (proxied to autopilot-backend).
1019
+ // Defined in `interfaces/accountRoutes.js`; mounted here so the FE
1020
+ // can hit /api/account/{profile,balance,keys,handoff} without ever
1021
+ // touching the user's JWT directly.
1022
+ // =====================================================
1023
+ this.app.use('/api/account', createAccountRouter({
1024
+ getJwt: () => this.lastAuthResult?.jwt || null,
1025
+ getBrand: () => getBrand().isOnBuzz ? 'onbuzz' : 'autopilot',
1026
+ backendBaseUrl: this.config?.backend?.baseUrl,
1027
+ logger: this.logger,
1028
+ }));
1029
+
977
1030
  // =====================================================
978
1031
  // System Update API
979
1032
  // =====================================================
@@ -85,12 +85,10 @@ describe('ApiKeyManager', () => {
85
85
  expect(logger.warn).toHaveBeenCalled();
86
86
  });
87
87
 
88
- test('_getMachineIdentifier returns colon-separated string', () => {
89
- const id = manager._getMachineIdentifier();
90
- expect(id).toContain('test-host');
91
- expect(id).toContain('testuser');
92
- expect(id).toContain('loxia-api-key-encryption-v1');
93
- });
88
+ // _getMachineIdentifier moved to `utilities/secretsCipher.js` as part
89
+ // of the DRY refactor sharing the cipher with `services/authCacheStore.js`.
90
+ // The equivalent coverage now lives in
91
+ // `src/utilities/__tests__/secretsCipher.test.js`.
94
92
 
95
93
  test('_encrypt throws when no encryption key', () => {
96
94
  expect(() => manager._encrypt('test')).toThrow('Encryption key not initialized');
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Round-trip + failure-mode tests for `services/authCacheStore.js`.
3
+ *
4
+ * The store is the disk half of the marketplace-publish fix: without
5
+ * it, a server restart wipes the JWT cache and the FE's polling
6
+ * fallback gets `{ user: null, jwt: null }` so any browser without the
7
+ * token already in localStorage 401s on publish.
8
+ *
9
+ * These tests exercise the real cipher against a tmp directory by
10
+ * pointing `getUserDataPaths` at it via the harness below.
11
+ */
12
+
13
+ import { describe, test, expect, beforeEach, afterEach, jest } from '@jest/globals';
14
+ import { promises as fs } from 'fs';
15
+ import path from 'path';
16
+ import os from 'os';
17
+ import crypto from 'crypto';
18
+
19
+ // Mock userDataDir BEFORE importing the store so the dynamic import
20
+ // below picks up the mock. Each test resets the tmpdir.
21
+ const tmpRoot = path.join(os.tmpdir(), 'authCacheStore-test-' + crypto.randomBytes(6).toString('hex'));
22
+
23
+ jest.unstable_mockModule('../../utilities/userDataDir.js', () => ({
24
+ getUserDataPaths: () => ({ settings: tmpRoot }),
25
+ ensureUserDataDirs: async () => { await fs.mkdir(tmpRoot, { recursive: true }); },
26
+ }));
27
+
28
+ const { default: AuthCacheStore } = await import('../authCacheStore.js');
29
+
30
+ const SAMPLE_CACHE = Object.freeze({
31
+ user: { id: 'u-1', email: 'a@b.com' },
32
+ hasApiKey: true,
33
+ jwt: 'eyJ.test.jwt',
34
+ timestamp: '2026-05-11T12:00:00.000Z',
35
+ });
36
+
37
+ async function cleanTmp() {
38
+ try { await fs.rm(tmpRoot, { recursive: true, force: true }); } catch { /* ok */ }
39
+ }
40
+
41
+ describe('AuthCacheStore', () => {
42
+ beforeEach(async () => { await cleanTmp(); });
43
+ afterEach(async () => { await cleanTmp(); });
44
+
45
+ test('load returns null when uninitialized (no init() call yet)', async () => {
46
+ const store = new AuthCacheStore(null);
47
+ expect(await store.load()).toBeNull();
48
+ });
49
+
50
+ test('load returns null when file does not exist', async () => {
51
+ const store = new AuthCacheStore(null);
52
+ await store.initialize();
53
+ expect(await store.load()).toBeNull();
54
+ });
55
+
56
+ test('save then load returns the same row', async () => {
57
+ const store = new AuthCacheStore(null);
58
+ await store.initialize();
59
+ await store.save(SAMPLE_CACHE);
60
+ const loaded = await store.load();
61
+ expect(loaded).toEqual(SAMPLE_CACHE);
62
+ });
63
+
64
+ test('save(null) deletes the file', async () => {
65
+ const store = new AuthCacheStore(null);
66
+ await store.initialize();
67
+ await store.save(SAMPLE_CACHE);
68
+ const filePath = path.join(tmpRoot, 'auth-cache.enc');
69
+ await fs.access(filePath); // exists
70
+ await store.save(null);
71
+ await expect(fs.access(filePath)).rejects.toThrow();
72
+ });
73
+
74
+ test('clear() is a no-op when file does not exist', async () => {
75
+ const store = new AuthCacheStore(null);
76
+ await store.initialize();
77
+ await expect(store.clear()).resolves.toBeUndefined();
78
+ });
79
+
80
+ test('two store instances on the same machine share the key — second can read what first wrote', async () => {
81
+ // This is the actual production scenario: restart spawns a fresh
82
+ // AuthCacheStore that must decrypt what the previous instance saved.
83
+ const writer = new AuthCacheStore(null);
84
+ await writer.initialize();
85
+ await writer.save(SAMPLE_CACHE);
86
+
87
+ const reader = new AuthCacheStore(null);
88
+ await reader.initialize();
89
+ expect(await reader.load()).toEqual(SAMPLE_CACHE);
90
+ });
91
+
92
+ test('load returns null on corrupted ciphertext', async () => {
93
+ const store = new AuthCacheStore(null);
94
+ await store.initialize();
95
+ await fs.writeFile(path.join(tmpRoot, 'auth-cache.enc'), 'this-is-not-valid-base64-ciphertext!!');
96
+ expect(await store.load()).toBeNull();
97
+ });
98
+
99
+ test('load returns null on schema-version mismatch', async () => {
100
+ const store = new AuthCacheStore(null);
101
+ await store.initialize();
102
+ // Hand-craft a valid ciphertext with the wrong version.
103
+ const { encrypt } = await import('../../utilities/secretsCipher.js');
104
+ const payload = JSON.stringify({ version: 999, cache: SAMPLE_CACHE });
105
+ const ct = encrypt(payload, store.encryptionKey);
106
+ await fs.writeFile(path.join(tmpRoot, 'auth-cache.enc'), ct);
107
+ expect(await store.load()).toBeNull();
108
+ });
109
+
110
+ test('save survives ENOENT on directory creation between init and save (best-effort)', async () => {
111
+ // Edge case: someone deletes the settings dir mid-flight. save()
112
+ // should warn but not throw, so the request handler can finish.
113
+ const store = new AuthCacheStore(null);
114
+ await store.initialize();
115
+ await fs.rm(tmpRoot, { recursive: true, force: true });
116
+ await expect(store.save(SAMPLE_CACHE)).resolves.toBeUndefined();
117
+ });
118
+ });
@@ -14,18 +14,13 @@
14
14
 
15
15
  import { promises as fs } from 'fs';
16
16
  import path from 'path';
17
- import crypto from 'crypto';
18
- import os from 'os';
19
17
  import { getUserDataPaths, ensureUserDataDirs } from '../utilities/userDataDir.js';
20
18
  import { isPlaceholderApiKey } from '../utilities/apiKeyPlaceholders.js';
21
-
22
- // Encryption configuration
23
- const ALGORITHM = 'aes-256-gcm';
24
- const KEY_LENGTH = 32; // 256 bits
25
- const IV_LENGTH = 16;
26
- const AUTH_TAG_LENGTH = 16;
27
- const SALT_LENGTH = 32;
28
- const PBKDF2_ITERATIONS = 100000;
19
+ import {
20
+ getOrCreateEncryptionKey as _getOrCreateEncryptionKey,
21
+ encrypt as _cipherEncrypt,
22
+ decrypt as _cipherDecrypt,
23
+ } from '../utilities/secretsCipher.js';
29
24
 
30
25
  class ApiKeyManager {
31
26
  constructor(logger) {
@@ -73,103 +68,21 @@ class ApiKeyManager {
73
68
  }
74
69
 
75
70
  /**
76
- * Get or create a machine-specific encryption key
77
- * @param {string} settingsDir - Settings directory path
78
- * @returns {Promise<Buffer>} Encryption key
71
+ * Cipher primitives delegate to `utilities/secretsCipher.js` so the
72
+ * api-keys.enc and auth-cache.enc stores share one implementation
73
+ * and one byte layout. See that module for the on-disk format and
74
+ * the KEY_DERIVATION_DOMAIN constant.
79
75
  */
80
76
  async _getOrCreateEncryptionKey(settingsDir) {
81
- const saltFile = path.join(settingsDir, '.key-salt');
82
- let salt;
83
-
84
- try {
85
- salt = await fs.readFile(saltFile);
86
- } catch (error) {
87
- // Generate new salt
88
- salt = crypto.randomBytes(SALT_LENGTH);
89
- await fs.writeFile(saltFile, salt, { mode: 0o600 });
90
- this.logger?.info('[ApiKeyManager] Generated new encryption salt');
91
- }
92
-
93
- // Derive key from salt + machine-specific data
94
- const machineData = this._getMachineIdentifier();
95
- const key = crypto.pbkdf2Sync(
96
- machineData,
97
- salt,
98
- PBKDF2_ITERATIONS,
99
- KEY_LENGTH,
100
- 'sha256'
101
- );
102
-
103
- return key;
77
+ return _getOrCreateEncryptionKey(settingsDir, this.logger);
104
78
  }
105
79
 
106
- /**
107
- * Get a machine-specific identifier for key derivation
108
- * @returns {string}
109
- */
110
- _getMachineIdentifier() {
111
- const parts = [
112
- os.hostname(),
113
- os.homedir(),
114
- os.userInfo().username,
115
- process.platform,
116
- 'loxia-api-key-encryption-v1'
117
- ];
118
- return parts.join(':');
119
- }
120
-
121
- /**
122
- * Encrypt data using AES-256-GCM
123
- * @param {string} plaintext - Data to encrypt
124
- * @returns {string} Encrypted data as base64
125
- */
126
80
  _encrypt(plaintext) {
127
- if (!this.encryptionKey) {
128
- throw new Error('Encryption key not initialized');
129
- }
130
-
131
- const iv = crypto.randomBytes(IV_LENGTH);
132
- const cipher = crypto.createCipheriv(ALGORITHM, this.encryptionKey, iv);
133
-
134
- let encrypted = cipher.update(plaintext, 'utf8', 'base64');
135
- encrypted += cipher.final('base64');
136
-
137
- const authTag = cipher.getAuthTag();
138
-
139
- // Combine IV + authTag + encrypted data
140
- const combined = Buffer.concat([
141
- iv,
142
- authTag,
143
- Buffer.from(encrypted, 'base64')
144
- ]);
145
-
146
- return combined.toString('base64');
81
+ return _cipherEncrypt(plaintext, this.encryptionKey);
147
82
  }
148
83
 
149
- /**
150
- * Decrypt data using AES-256-GCM
151
- * @param {string} encryptedData - Encrypted data as base64
152
- * @returns {string} Decrypted plaintext
153
- */
154
84
  _decrypt(encryptedData) {
155
- if (!this.encryptionKey) {
156
- throw new Error('Encryption key not initialized');
157
- }
158
-
159
- const combined = Buffer.from(encryptedData, 'base64');
160
-
161
- // Extract IV, authTag, and encrypted data
162
- const iv = combined.subarray(0, IV_LENGTH);
163
- const authTag = combined.subarray(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
164
- const encrypted = combined.subarray(IV_LENGTH + AUTH_TAG_LENGTH);
165
-
166
- const decipher = crypto.createDecipheriv(ALGORITHM, this.encryptionKey, iv);
167
- decipher.setAuthTag(authTag);
168
-
169
- let decrypted = decipher.update(encrypted.toString('base64'), 'base64', 'utf8');
170
- decrypted += decipher.final('utf8');
171
-
172
- return decrypted;
85
+ return _cipherDecrypt(encryptedData, this.encryptionKey);
173
86
  }
174
87
 
175
88
  /**