onbuzz 4.3.0 → 4.4.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 (967) hide show
  1. package/package.json +1 -1
  2. package/src/core/__tests__/agentScheduler.visualizer.test.js +258 -0
  3. package/src/core/agentScheduler.js +7 -1
  4. package/src/index.js +8 -0
  5. package/src/interfaces/__tests__/schedulerRoutes.test.js +176 -0
  6. package/src/interfaces/schedulerRoutes.js +50 -0
  7. package/src/interfaces/webServer.js +66 -20
  8. package/src/modules/widget/__tests__/acceptance.test.js +267 -0
  9. package/src/modules/widget/__tests__/codeAnalyzer.test.js +340 -0
  10. package/src/modules/widget/__tests__/eventBus.test.js +169 -0
  11. package/src/modules/widget/__tests__/galleryActions.test.js +290 -0
  12. package/src/modules/widget/__tests__/galleryStore.test.js +269 -0
  13. package/src/modules/widget/__tests__/isDisabled.test.js +41 -0
  14. package/src/modules/widget/__tests__/phishingScanner.test.js +75 -0
  15. package/src/modules/widget/__tests__/routes.test.js +678 -0
  16. package/src/modules/widget/__tests__/runtime.test.js +401 -0
  17. package/src/modules/widget/__tests__/schema.test.js +155 -0
  18. package/src/modules/widget/__tests__/upgrade.test.js +257 -0
  19. package/src/modules/widget/__tests__/versioning.test.js +309 -0
  20. package/src/modules/widget/__tests__/webComponentRuntime.test.js +565 -0
  21. package/src/modules/widget/__tests__/widgetTool.test.js +316 -0
  22. package/src/modules/widget/codeAnalyzer.js +351 -0
  23. package/src/modules/widget/galleryStore.js +324 -0
  24. package/src/modules/widget/index.js +38 -0
  25. package/src/modules/widget/phishingScanner.js +47 -0
  26. package/src/modules/widget/routes.js +414 -0
  27. package/src/modules/widget/runtime/bundle.js +640 -0
  28. package/src/modules/widget/runtime/webComponentBundle.js +470 -0
  29. package/src/modules/widget/schema.js +133 -0
  30. package/src/modules/widget/widgetTool.js +1336 -0
  31. package/web-ui/build/index.html +2 -2
  32. package/web-ui/build/static/1c-DhNfWMWm.js +1 -0
  33. package/web-ui/build/static/abap-QOWHgSNA.js +1 -0
  34. package/web-ui/build/static/abnf-C9PFiETQ.js +1 -0
  35. package/web-ui/build/static/abnf-DEbBdEpP.js +1 -0
  36. package/web-ui/build/static/accesslog-DaKq5_Ts.js +1 -0
  37. package/web-ui/build/static/actionscript-BcY19SjW.js +1 -0
  38. package/web-ui/build/static/actionscript-CbLJrkm9.js +1 -0
  39. package/web-ui/build/static/ada-D1vjmumu.js +1 -0
  40. package/web-ui/build/static/ada-hAjtW1jL.js +1 -0
  41. package/web-ui/build/static/agda-Bhk3JFT9.js +1 -0
  42. package/web-ui/build/static/al-DYmeq5B0.js +1 -0
  43. package/web-ui/build/static/angelscript-BxCBNQXZ.js +1 -0
  44. package/web-ui/build/static/antlr4-CPmkdILF.js +1 -0
  45. package/web-ui/build/static/apache-CnwL2ZvW.js +1 -0
  46. package/web-ui/build/static/apacheconf-CfeBIh7R.js +1 -0
  47. package/web-ui/build/static/apex-C36kXZsT.js +1 -0
  48. package/web-ui/build/static/apl-CeT_l0YX.js +1 -0
  49. package/web-ui/build/static/applescript-BimsduDW.js +1 -0
  50. package/web-ui/build/static/applescript-CLBFEONC.js +1 -0
  51. package/web-ui/build/static/aql-DcXNMsw5.js +1 -0
  52. package/web-ui/build/static/arcade-CsONs-nh.js +1 -0
  53. package/web-ui/build/static/arduino-1XAf972o.js +1 -0
  54. package/web-ui/build/static/arduino-BkRulzgv.js +1 -0
  55. package/web-ui/build/static/arff-QhmkBHXy.js +1 -0
  56. package/web-ui/build/static/armasm-Cf34TCbg.js +1 -0
  57. package/web-ui/build/static/asciidoc-Dxk-KUUW.js +1 -0
  58. package/web-ui/build/static/asciidoc-mpuuiNok.js +1 -0
  59. package/web-ui/build/static/asm6502-0M2Se3gz.js +1 -0
  60. package/web-ui/build/static/asmatmel-DhFK-DLd.js +1 -0
  61. package/web-ui/build/static/aspectj-BKNOwBC8.js +1 -0
  62. package/web-ui/build/static/aspnet-BZ88RTxR.js +1 -0
  63. package/web-ui/build/static/autohotkey-DGmMm6oy.js +1 -0
  64. package/web-ui/build/static/autohotkey-HUDPuon_.js +1 -0
  65. package/web-ui/build/static/autoit-B-YW8YdA.js +1 -0
  66. package/web-ui/build/static/autoit-CvHRbbE-.js +1 -0
  67. package/web-ui/build/static/avisynth-C6iP20gR.js +1 -0
  68. package/web-ui/build/static/avrasm-AOIVGwnb.js +1 -0
  69. package/web-ui/build/static/avro-idl-CcPf6wBK.js +1 -0
  70. package/web-ui/build/static/awk-Dy8_cKla.js +1 -0
  71. package/web-ui/build/static/axapta-CexCCXgI.js +1 -0
  72. package/web-ui/build/static/bash-DKgFZb-B.js +1 -0
  73. package/web-ui/build/static/bash-DrUQRf4E.js +1 -0
  74. package/web-ui/build/static/basic-BXDUD6us.js +1 -0
  75. package/web-ui/build/static/basic-DlEL_-PG.js +1 -0
  76. package/web-ui/build/static/batch-HHuRbek7.js +1 -0
  77. package/web-ui/build/static/bbcode-D4lEyfHq.js +1 -0
  78. package/web-ui/build/static/bicep-Ca66VjcC.js +1 -0
  79. package/web-ui/build/static/birb-BWDnQG3-.js +1 -0
  80. package/web-ui/build/static/bison-DGEvuoCn.js +1 -0
  81. package/web-ui/build/static/bnf-DNrgnFxK.js +1 -0
  82. package/web-ui/build/static/bnf-DkGg9a6f.js +1 -0
  83. package/web-ui/build/static/brainfuck-BcC5WVuw.js +1 -0
  84. package/web-ui/build/static/brainfuck-Dzx6V6EF.js +1 -0
  85. package/web-ui/build/static/brightscript-26Asmy4_.js +1 -0
  86. package/web-ui/build/static/bro-CFV9ava2.js +1 -0
  87. package/web-ui/build/static/bsl-BHMAYVVg.js +1 -0
  88. package/web-ui/build/static/c-B7WGfC_g.js +1 -0
  89. package/web-ui/build/static/c-CUYmQ5h3.js +1 -0
  90. package/web-ui/build/static/c-like-BSddZquS.js +1 -0
  91. package/web-ui/build/static/cal-DQjwjuMG.js +1 -0
  92. package/web-ui/build/static/capnproto-CBnYJDMr.js +1 -0
  93. package/web-ui/build/static/ceylon-ce3L4vqX.js +1 -0
  94. package/web-ui/build/static/cfscript-CN8IKzxH.js +1 -0
  95. package/web-ui/build/static/chaiscript-DT-qasen.js +1 -0
  96. package/web-ui/build/static/cil-BPu0-6KT.js +1 -0
  97. package/web-ui/build/static/clean-BWcUgtLl.js +1 -0
  98. package/web-ui/build/static/clojure-CVLbUcEn.js +1 -0
  99. package/web-ui/build/static/clojure-mVJcgmKZ.js +1 -0
  100. package/web-ui/build/static/clojure-repl-B1bPQUgE.js +1 -0
  101. package/web-ui/build/static/cmake-ApAYr4_A.js +1 -0
  102. package/web-ui/build/static/cmake-oI81UP1F.js +1 -0
  103. package/web-ui/build/static/cobol-eZdxawKH.js +1 -0
  104. package/web-ui/build/static/coffeescript-BvFq14Nz.js +1 -0
  105. package/web-ui/build/static/coffeescript-CedrhcbC.js +1 -0
  106. package/web-ui/build/static/concurnas-8QctO6Q7.js +1 -0
  107. package/web-ui/build/static/coq-CaQMtKys.js +1 -0
  108. package/web-ui/build/static/coq-Di7lBRJy.js +1 -0
  109. package/web-ui/build/static/cos-3TjiDgk1.js +1 -0
  110. package/web-ui/build/static/cpp-BGwIhR_y.js +1 -0
  111. package/web-ui/build/static/cpp-CRXTx1YD.js +1 -0
  112. package/web-ui/build/static/crmsh-C67REd2u.js +1 -0
  113. package/web-ui/build/static/crystal-C8Rs5smk.js +1 -0
  114. package/web-ui/build/static/crystal-C8jnpN4t.js +1 -0
  115. package/web-ui/build/static/csharp-CqlFLWOu.js +1 -0
  116. package/web-ui/build/static/csharp-D1M9LcKj.js +1 -0
  117. package/web-ui/build/static/cshtml-BrYce3m1.js +1 -0
  118. package/web-ui/build/static/csp-DaMDae_q.js +1 -0
  119. package/web-ui/build/static/csp-DmoB74Pq.js +1 -0
  120. package/web-ui/build/static/css-Bm-MgPWM.js +1 -0
  121. package/web-ui/build/static/css-extras-T3f2IfaH.js +1 -0
  122. package/web-ui/build/static/csv-BgIvUIgl.js +1 -0
  123. package/web-ui/build/static/cypher-Bsq4PGhM.js +1 -0
  124. package/web-ui/build/static/d-Qt9QuUvk.js +1 -0
  125. package/web-ui/build/static/d-h4AYkhsS.js +1 -0
  126. package/web-ui/build/static/dart-DNDTBaSF.js +1 -0
  127. package/web-ui/build/static/dart-Dkg8Mtqj.js +1 -0
  128. package/web-ui/build/static/dataweave-XNvXnB4j.js +1 -0
  129. package/web-ui/build/static/dax-DAM3HOsu.js +1 -0
  130. package/web-ui/build/static/delphi-DTzj2E4U.js +1 -0
  131. package/web-ui/build/static/dhall-Brb1ufqF.js +1 -0
  132. package/web-ui/build/static/diff-3SMw9VwF.js +1 -0
  133. package/web-ui/build/static/diff-ssu7Mr2I.js +1 -0
  134. package/web-ui/build/static/django-CK_xvPUY.js +1 -0
  135. package/web-ui/build/static/django-D9a4uL_8.js +1 -0
  136. package/web-ui/build/static/dns-Uvea7PR7.js +1 -0
  137. package/web-ui/build/static/dns-zone-file-BvD_LLn3.js +1 -0
  138. package/web-ui/build/static/docker-CC3kvxlv.js +1 -0
  139. package/web-ui/build/static/dockerfile-BRFh_Hdm.js +1 -0
  140. package/web-ui/build/static/dos-C-I0-qWQ.js +1 -0
  141. package/web-ui/build/static/dot-BmS_Nrtr.js +1 -0
  142. package/web-ui/build/static/dsconfig-CBWgrIVa.js +1 -0
  143. package/web-ui/build/static/dts-B31mUIV6.js +1 -0
  144. package/web-ui/build/static/dust-BBtJv286.js +1 -0
  145. package/web-ui/build/static/ebnf-CCA0ITCE.js +1 -0
  146. package/web-ui/build/static/ebnf-CeVJpQny.js +1 -0
  147. package/web-ui/build/static/editorconfig-Nhj95Qci.js +1 -0
  148. package/web-ui/build/static/eiffel-E7QJBlEz.js +1 -0
  149. package/web-ui/build/static/ejs-B9gYRoXo.js +1 -0
  150. package/web-ui/build/static/elixir-CYG1GGGp.js +1 -0
  151. package/web-ui/build/static/elixir-fNfEypj7.js +1 -0
  152. package/web-ui/build/static/elm-Td6N7vMU.js +1 -0
  153. package/web-ui/build/static/elm-v0-mxxuQ.js +1 -0
  154. package/web-ui/build/static/erb-BO3LQtQx.js +1 -0
  155. package/web-ui/build/static/erb-ez_pDLEC.js +1 -0
  156. package/web-ui/build/static/erlang-ChOZ-mbI.js +1 -0
  157. package/web-ui/build/static/erlang-DCBIueE-.js +1 -0
  158. package/web-ui/build/static/erlang-repl-CL0-sGxn.js +1 -0
  159. package/web-ui/build/static/etlua-CQdh26X0.js +1 -0
  160. package/web-ui/build/static/excel-BbAj2wuJ.js +1 -0
  161. package/web-ui/build/static/excel-formula-qBXUIcjs.js +1 -0
  162. package/web-ui/build/static/factor-BPO68YSz.js +1 -0
  163. package/web-ui/build/static/false-sZ2iLGj-.js +1 -0
  164. package/web-ui/build/static/firestore-security-rules-BmYLiQGh.js +1 -0
  165. package/web-ui/build/static/fix-Co_Dnq0A.js +1 -0
  166. package/web-ui/build/static/flix-DlEWTbVq.js +1 -0
  167. package/web-ui/build/static/flow-DnsnnZca.js +1 -0
  168. package/web-ui/build/static/fortran-B4OMllck.js +1 -0
  169. package/web-ui/build/static/fortran-_8ltaoLA.js +1 -0
  170. package/web-ui/build/static/fsharp-CY0Ix1iB.js +1 -0
  171. package/web-ui/build/static/fsharp-y6HOJqAr.js +1 -0
  172. package/web-ui/build/static/ftl-DvbP9VWU.js +1 -0
  173. package/web-ui/build/static/gams-DF3rxJoc.js +1 -0
  174. package/web-ui/build/static/gap-BSje56C-.js +1 -0
  175. package/web-ui/build/static/gauss-BqYXtLWM.js +1 -0
  176. package/web-ui/build/static/gcode-CBl-mAWK.js +1 -0
  177. package/web-ui/build/static/gcode-idSM0RsM.js +1 -0
  178. package/web-ui/build/static/gdscript-CniY3oYY.js +1 -0
  179. package/web-ui/build/static/gedcom-C1dJ3jCP.js +1 -0
  180. package/web-ui/build/static/gherkin-4jaQr3Lt.js +1 -0
  181. package/web-ui/build/static/gherkin-BRsS35Ed.js +1 -0
  182. package/web-ui/build/static/git-2a7wzptj.js +1 -0
  183. package/web-ui/build/static/glsl-Ckv4lBKB.js +1 -0
  184. package/web-ui/build/static/glsl-CnGjBp6a.js +1 -0
  185. package/web-ui/build/static/gml-DG3KVI4z.js +1 -0
  186. package/web-ui/build/static/gml-DxKOOp--.js +1 -0
  187. package/web-ui/build/static/gn-DmUPMuZR.js +1 -0
  188. package/web-ui/build/static/go-D8tYdcYa.js +1 -0
  189. package/web-ui/build/static/go-DpIavxCs.js +1 -0
  190. package/web-ui/build/static/go-module-BktUPko9.js +1 -0
  191. package/web-ui/build/static/golo-Ao-diOpI.js +1 -0
  192. package/web-ui/build/static/gradle-DHJSdPoJ.js +1 -0
  193. package/web-ui/build/static/graphql-HpsdbKFp.js +1 -0
  194. package/web-ui/build/static/groovy-B4BrZYtV.js +1 -0
  195. package/web-ui/build/static/groovy-BCIRzoWJ.js +1 -0
  196. package/web-ui/build/static/haml-B8Mj6Hex.js +1 -0
  197. package/web-ui/build/static/haml-Fo-yynuy.js +1 -0
  198. package/web-ui/build/static/handlebars-BnFawcCU.js +1 -0
  199. package/web-ui/build/static/handlebars-YZn3MEyv.js +1 -0
  200. package/web-ui/build/static/haskell-DutAI7D9.js +1 -0
  201. package/web-ui/build/static/haskell-Dvl0Yw7z.js +1 -0
  202. package/web-ui/build/static/haxe-6S205Iem.js +1 -0
  203. package/web-ui/build/static/haxe-aKgbIDi5.js +1 -0
  204. package/web-ui/build/static/hcl-Dt_vNekv.js +1 -0
  205. package/web-ui/build/static/hlsl-CupXb_iv.js +1 -0
  206. package/web-ui/build/static/hoon-Dg19YEzw.js +1 -0
  207. package/web-ui/build/static/hpkp-DCF8Ff3o.js +1 -0
  208. package/web-ui/build/static/hsp-D90yiizY.js +1 -0
  209. package/web-ui/build/static/hsts-Cf63XX0s.js +1 -0
  210. package/web-ui/build/static/htmlbars-DMbRiSo_.js +1 -0
  211. package/web-ui/build/static/http-DklRfzP4.js +1 -0
  212. package/web-ui/build/static/http-U94aUtJB.js +1 -0
  213. package/web-ui/build/static/hy-B2ESVqxB.js +1 -0
  214. package/web-ui/build/static/ichigojam-DrVZWL_q.js +1 -0
  215. package/web-ui/build/static/icon-CMA5sxLF.js +1 -0
  216. package/web-ui/build/static/icu-message-format-DyfbEZSi.js +1 -0
  217. package/web-ui/build/static/idris-lCmRODnZ.js +1 -0
  218. package/web-ui/build/static/iecst-CgrrW0EE.js +1 -0
  219. package/web-ui/build/static/ignore-BmZ03AWS.js +1 -0
  220. package/web-ui/build/static/index-CLLrOcOY.js +1 -0
  221. package/web-ui/build/static/index-Ck0Dg4M1.js +13 -0
  222. package/web-ui/build/static/index-DOAQiM34.css +1 -0
  223. package/web-ui/build/static/index-DjtEf-qv.js +1029 -0
  224. package/web-ui/build/static/inform7-BfOnAvVe.js +1 -0
  225. package/web-ui/build/static/inform7-JJIIMXTB.js +1 -0
  226. package/web-ui/build/static/ini-CIKxMbKN.js +1 -0
  227. package/web-ui/build/static/ini-T3DdG5H-.js +1 -0
  228. package/web-ui/build/static/io-K9Gdeq6M.js +1 -0
  229. package/web-ui/build/static/irpf90-BYsCcwwg.js +1 -0
  230. package/web-ui/build/static/isbl-jcjEwPPP.js +1 -0
  231. package/web-ui/build/static/j-DSNUhn5G.js +1 -0
  232. package/web-ui/build/static/java-BKwYwPEk.js +1 -0
  233. package/web-ui/build/static/java-DuZuc1lQ.js +1 -0
  234. package/web-ui/build/static/javadoc-Bd8CYqmj.js +1 -0
  235. package/web-ui/build/static/javadoclike-BcPQURih.js +1 -0
  236. package/web-ui/build/static/javascript-C7B2Ty3f.js +1 -0
  237. package/web-ui/build/static/javastacktrace-BRZBpTgb.js +1 -0
  238. package/web-ui/build/static/jboss-cli-DaXYYeAA.js +1 -0
  239. package/web-ui/build/static/jexl-oN152m0J.js +1 -0
  240. package/web-ui/build/static/jolie-BUWtG9eQ.js +1 -0
  241. package/web-ui/build/static/jq-ooTdhdbC.js +1 -0
  242. package/web-ui/build/static/js-extras-BQJ_tqbC.js +1 -0
  243. package/web-ui/build/static/js-templates-xygrVmsG.js +1 -0
  244. package/web-ui/build/static/jsdoc-BPMuWUGw.js +1 -0
  245. package/web-ui/build/static/json-DbssHgO1.js +1 -0
  246. package/web-ui/build/static/json-iOY4SV10.js +1 -0
  247. package/web-ui/build/static/json5-C_-PZnKE.js +1 -0
  248. package/web-ui/build/static/jsonp-BQakabW1.js +1 -0
  249. package/web-ui/build/static/jsstacktrace-DyDuNLl8.js +1 -0
  250. package/web-ui/build/static/jsx-DCQITdOi.js +1 -0
  251. package/web-ui/build/static/julia-BF0mftpu.js +1 -0
  252. package/web-ui/build/static/julia-TT2Hy-Ob.js +1 -0
  253. package/web-ui/build/static/julia-repl-UBoVaQSD.js +1 -0
  254. package/web-ui/build/static/keepalived-yNkg9KNG.js +1 -0
  255. package/web-ui/build/static/keyman-7ModFC-k.js +1 -0
  256. package/web-ui/build/static/kotlin-BjJgl7UF.js +1 -0
  257. package/web-ui/build/static/kotlin-GEW2sNY3.js +1 -0
  258. package/web-ui/build/static/kumir-CeWMdLSX.js +1 -0
  259. package/web-ui/build/static/kusto-NufgjlVz.js +1 -0
  260. package/web-ui/build/static/lasso-eUS0tR3e.js +1 -0
  261. package/web-ui/build/static/latex-C7prlA6j.js +1 -0
  262. package/web-ui/build/static/latex-Hx35xemv.js +1 -0
  263. package/web-ui/build/static/latte-Da8RAWgh.js +1 -0
  264. package/web-ui/build/static/ldif-DZVoiKm3.js +1 -0
  265. package/web-ui/build/static/leaf-OEtu9dZj.js +1 -0
  266. package/web-ui/build/static/less-0VwiOSeL.js +1 -0
  267. package/web-ui/build/static/less-CciyvbHx.js +1 -0
  268. package/web-ui/build/static/lilypond-blLDi6bC.js +1 -0
  269. package/web-ui/build/static/liquid-C8_7pWOo.js +1 -0
  270. package/web-ui/build/static/lisp-Dd28CPVg.js +1 -0
  271. package/web-ui/build/static/lisp-hWkYuWd0.js +1 -0
  272. package/web-ui/build/static/livecodeserver-7_v3dVy3.js +1 -0
  273. package/web-ui/build/static/livescript-B8YdZ4uV.js +1 -0
  274. package/web-ui/build/static/livescript-dLNrctPK.js +1 -0
  275. package/web-ui/build/static/llvm-BfTyXy_G.js +1 -0
  276. package/web-ui/build/static/llvm-CLvUvWLu.js +1 -0
  277. package/web-ui/build/static/log-DbsxiU9k.js +1 -0
  278. package/web-ui/build/static/lolcode-CfacgPRH.js +1 -0
  279. package/web-ui/build/static/lsl-nJWe_8hA.js +1 -0
  280. package/web-ui/build/static/lua-BzXX-n4X.js +1 -0
  281. package/web-ui/build/static/lua-Ds6K-rhW.js +1 -0
  282. package/web-ui/build/static/magma-U4RmSh9f.js +1 -0
  283. package/web-ui/build/static/makefile-CSCW5rGm.js +1 -0
  284. package/web-ui/build/static/makefile-kzE_oEn3.js +1 -0
  285. package/web-ui/build/static/markdown-CalHH_DC.js +1 -0
  286. package/web-ui/build/static/markdown-Cqr_u0Ad.js +1 -0
  287. package/web-ui/build/static/markup-templating-BTOI73DQ.js +1 -0
  288. package/web-ui/build/static/mathematica-NX1KG9I0.js +1 -0
  289. package/web-ui/build/static/matlab-BAn1HwNV.js +1 -0
  290. package/web-ui/build/static/matlab-Bdg2LWPm.js +1 -0
  291. package/web-ui/build/static/maxima-DjRYVgK8.js +1 -0
  292. package/web-ui/build/static/maxscript-xwiWU5-Z.js +1 -0
  293. package/web-ui/build/static/mel-BgwB0sDS.js +1 -0
  294. package/web-ui/build/static/mel-CIouMI9e.js +1 -0
  295. package/web-ui/build/static/mercury-Do8hrPEb.js +1 -0
  296. package/web-ui/build/static/mermaid-BGEw9Ybx.js +1 -0
  297. package/web-ui/build/static/mipsasm-BDqQqoDE.js +1 -0
  298. package/web-ui/build/static/mizar-7lZfUsYd.js +1 -0
  299. package/web-ui/build/static/mizar-D7O18zEE.js +1 -0
  300. package/web-ui/build/static/mojolicious-DqmJjzUO.js +1 -0
  301. package/web-ui/build/static/mongodb-CXRl7RlT.js +1 -0
  302. package/web-ui/build/static/monkey-DE9L51qk.js +1 -0
  303. package/web-ui/build/static/monkey-DM9WNqkW.js +1 -0
  304. package/web-ui/build/static/moonscript-D8lRTdQE.js +1 -0
  305. package/web-ui/build/static/moonscript-DFEVxKjh.js +1 -0
  306. package/web-ui/build/static/n1ql-B3BB__pa.js +1 -0
  307. package/web-ui/build/static/n1ql-Br4OECGn.js +1 -0
  308. package/web-ui/build/static/n4js-BPNwKp4U.js +1 -0
  309. package/web-ui/build/static/nand2tetris-hdl-BrjXXFUn.js +1 -0
  310. package/web-ui/build/static/naniscript-COGKQbvR.js +1 -0
  311. package/web-ui/build/static/nasm-BHOt34Wi.js +1 -0
  312. package/web-ui/build/static/neon-CYjyYixT.js +1 -0
  313. package/web-ui/build/static/nevod-CILFZbPW.js +1 -0
  314. package/web-ui/build/static/nginx-B7B9La6b.js +1 -0
  315. package/web-ui/build/static/nginx-Dcs1btfu.js +1 -0
  316. package/web-ui/build/static/nim-B39Qq_sB.js +1 -0
  317. package/web-ui/build/static/nim-Cm0o-zEI.js +1 -0
  318. package/web-ui/build/static/nix-Bb4CX-fQ.js +1 -0
  319. package/web-ui/build/static/nix-C3bIutdy.js +1 -0
  320. package/web-ui/build/static/node-repl-BtbNtavi.js +1 -0
  321. package/web-ui/build/static/nsis-CJpMkpQy.js +1 -0
  322. package/web-ui/build/static/nsis-h39nQk_L.js +1 -0
  323. package/web-ui/build/static/objectivec-BIV3Kmu2.js +1 -0
  324. package/web-ui/build/static/objectivec-CNhpMYiK.js +1 -0
  325. package/web-ui/build/static/ocaml-Ld6KARDY.js +1 -0
  326. package/web-ui/build/static/ocaml-upCImTLO.js +1 -0
  327. package/web-ui/build/static/opencl-CfWJp1hT.js +1 -0
  328. package/web-ui/build/static/openqasm-i8xT4CAo.js +1 -0
  329. package/web-ui/build/static/openscad-CzWxpIx6.js +1 -0
  330. package/web-ui/build/static/oxygene-CCokKj_U.js +1 -0
  331. package/web-ui/build/static/oz-BBdHXCgw.js +1 -0
  332. package/web-ui/build/static/parigp-C6n5F4KO.js +1 -0
  333. package/web-ui/build/static/parser-C2RrTYYO.js +1 -0
  334. package/web-ui/build/static/parser3-BaAVXypg.js +1 -0
  335. package/web-ui/build/static/pascal-UeXMBbP2.js +1 -0
  336. package/web-ui/build/static/pascaligo-CYD4ZqHc.js +1 -0
  337. package/web-ui/build/static/pcaxis-CuN2yCzi.js +1 -0
  338. package/web-ui/build/static/peoplecode-H1Adh-ll.js +1 -0
  339. package/web-ui/build/static/perl-DCyTMUn2.js +1 -0
  340. package/web-ui/build/static/perl-V4mDd6YP.js +1 -0
  341. package/web-ui/build/static/pf-5iH6Mo1D.js +1 -0
  342. package/web-ui/build/static/pgsql-CrmNuytU.js +1 -0
  343. package/web-ui/build/static/php-AWteRwUZ.js +1 -0
  344. package/web-ui/build/static/php-B-dr82M2.js +1 -0
  345. package/web-ui/build/static/php-extras-CVQI7yIC.js +1 -0
  346. package/web-ui/build/static/php-template-BW_DclRa.js +1 -0
  347. package/web-ui/build/static/phpdoc-Cfv3EM5F.js +1 -0
  348. package/web-ui/build/static/plaintext-CyfmYRWM.js +1 -0
  349. package/web-ui/build/static/plsql-DIfiFLDw.js +1 -0
  350. package/web-ui/build/static/pony-DjBwB1l2.js +1 -0
  351. package/web-ui/build/static/powerquery-D80luSMu.js +1 -0
  352. package/web-ui/build/static/powershell-Cai1oPSE.js +1 -0
  353. package/web-ui/build/static/powershell-qk5MHehm.js +1 -0
  354. package/web-ui/build/static/processing-DGNtNe05.js +1 -0
  355. package/web-ui/build/static/processing-DHK3kwAe.js +1 -0
  356. package/web-ui/build/static/profile-D6MBLt-p.js +1 -0
  357. package/web-ui/build/static/prolog-CqKHjX9T.js +1 -0
  358. package/web-ui/build/static/prolog-CwAlj8yp.js +1 -0
  359. package/web-ui/build/static/promql-Cwo7B1q9.js +1 -0
  360. package/web-ui/build/static/properties-03DbKSuC.js +1 -0
  361. package/web-ui/build/static/properties-BlFjiqSF.js +1 -0
  362. package/web-ui/build/static/protobuf-DFZRRGno.js +1 -0
  363. package/web-ui/build/static/protobuf-D_GKOSo6.js +1 -0
  364. package/web-ui/build/static/psl-RSBmgd7b.js +1 -0
  365. package/web-ui/build/static/pug-DzBjT8h1.js +1 -0
  366. package/web-ui/build/static/puppet-BwyNySh7.js +1 -0
  367. package/web-ui/build/static/puppet-CHJRn6Na.js +1 -0
  368. package/web-ui/build/static/pure-XbBeN0U7.js +1 -0
  369. package/web-ui/build/static/purebasic-BeRgP1y5.js +1 -0
  370. package/web-ui/build/static/purebasic-XGD8k1X_.js +1 -0
  371. package/web-ui/build/static/purescript-DPej8C9k.js +1 -0
  372. package/web-ui/build/static/python-DK4CPbFS.js +1 -0
  373. package/web-ui/build/static/python-repl-BDrlZxhA.js +1 -0
  374. package/web-ui/build/static/python-sRExKvGw.js +1 -0
  375. package/web-ui/build/static/q-B8K1uEtE.js +1 -0
  376. package/web-ui/build/static/q-iptUl3TG.js +1 -0
  377. package/web-ui/build/static/qml-Ck-8E28D.js +1 -0
  378. package/web-ui/build/static/qml-DapR8Kud.js +1 -0
  379. package/web-ui/build/static/qore-Bq2u6ALt.js +1 -0
  380. package/web-ui/build/static/qsharp-C9FGwAhI.js +1 -0
  381. package/web-ui/build/static/r-B8PZ1lyW.js +1 -0
  382. package/web-ui/build/static/r-jsXxivRe.js +1 -0
  383. package/web-ui/build/static/racket-BW1YY6oG.js +1 -0
  384. package/web-ui/build/static/reason-CGrwEH7Y.js +1 -0
  385. package/web-ui/build/static/reasonml-D2S9u5tv.js +1 -0
  386. package/web-ui/build/static/regex-Bx_rkaF-.js +1 -0
  387. package/web-ui/build/static/rego-DYSQb1aU.js +1 -0
  388. package/web-ui/build/static/renpy-DoEOEpqT.js +1 -0
  389. package/web-ui/build/static/rest-6xfrLQ1u.js +1 -0
  390. package/web-ui/build/static/rib-BH2XAOdJ.js +1 -0
  391. package/web-ui/build/static/rip-BOcHDByA.js +1 -0
  392. package/web-ui/build/static/roboconf-8nB4fpob.js +1 -0
  393. package/web-ui/build/static/roboconf-BjKYzQ_Z.js +1 -0
  394. package/web-ui/build/static/robotframework-BIAT2wY6.js +1 -0
  395. package/web-ui/build/static/routeros-Bt6cTmB2.js +1 -0
  396. package/web-ui/build/static/rsl-XvWWVxz_.js +1 -0
  397. package/web-ui/build/static/ruby-CEfc9tVA.js +1 -0
  398. package/web-ui/build/static/ruby-CKNSKxB1.js +1 -0
  399. package/web-ui/build/static/ruleslanguage-tpn62qMj.js +1 -0
  400. package/web-ui/build/static/rust-Cb-H3ah6.js +1 -0
  401. package/web-ui/build/static/rust-CmAiRDXU.js +1 -0
  402. package/web-ui/build/static/sas-6JRKVKN4.js +1 -0
  403. package/web-ui/build/static/sas-BnSXGxyB.js +1 -0
  404. package/web-ui/build/static/sass-RPp8p1Ef.js +1 -0
  405. package/web-ui/build/static/scala-BjZ--04s.js +1 -0
  406. package/web-ui/build/static/scala-CbHbqC82.js +1 -0
  407. package/web-ui/build/static/scheme-51taSudc.js +1 -0
  408. package/web-ui/build/static/scheme-FF2J1d7z.js +1 -0
  409. package/web-ui/build/static/scilab-CSU1i7r7.js +1 -0
  410. package/web-ui/build/static/scss-Bf9-1Rwp.js +1 -0
  411. package/web-ui/build/static/scss-kWs2GBCV.js +1 -0
  412. package/web-ui/build/static/shell-B6aH0_VB.js +1 -0
  413. package/web-ui/build/static/shell-session-42tFBoqK.js +1 -0
  414. package/web-ui/build/static/smali-BTC2VGoh.js +1 -0
  415. package/web-ui/build/static/smali-CFCAUthF.js +1 -0
  416. package/web-ui/build/static/smalltalk-C4Z4p5Ld.js +1 -0
  417. package/web-ui/build/static/smalltalk-DS9teHSb.js +1 -0
  418. package/web-ui/build/static/smarty-9tLXgYFw.js +1 -0
  419. package/web-ui/build/static/sml-CvQCOzHl.js +1 -0
  420. package/web-ui/build/static/sml-D7VN7gLP.js +1 -0
  421. package/web-ui/build/static/solidity-C8mgaeFG.js +1 -0
  422. package/web-ui/build/static/solution-file-BW6eSi9-.js +1 -0
  423. package/web-ui/build/static/soy-iYu8WojY.js +1 -0
  424. package/web-ui/build/static/sparql-fr7u_sdF.js +1 -0
  425. package/web-ui/build/static/splunk-spl-C1ELr7BN.js +1 -0
  426. package/web-ui/build/static/sqf-8e9uVb30.js +1 -0
  427. package/web-ui/build/static/sqf-CWavw2F4.js +1 -0
  428. package/web-ui/build/static/sql-DC_QvrP2.js +1 -0
  429. package/web-ui/build/static/sql-yLctL19P.js +1 -0
  430. package/web-ui/build/static/sql_more-KfXMatfe.js +1 -0
  431. package/web-ui/build/static/squirrel-Bjd69daG.js +1 -0
  432. package/web-ui/build/static/stan-CaplZnB-.js +1 -0
  433. package/web-ui/build/static/stan-UYitmAjw.js +1 -0
  434. package/web-ui/build/static/stata-Beng42ZG.js +1 -0
  435. package/web-ui/build/static/step21-jqm1hcSr.js +1 -0
  436. package/web-ui/build/static/stylus-DB7RdP7s.js +1 -0
  437. package/web-ui/build/static/stylus-IFC9sMcH.js +1 -0
  438. package/web-ui/build/static/subunit-B75tNAV5.js +1 -0
  439. package/web-ui/build/static/swift-BRcicKMn.js +1 -0
  440. package/web-ui/build/static/swift-s8OoLWy_.js +1 -0
  441. package/web-ui/build/static/systemd-BC7VQvFw.js +1 -0
  442. package/web-ui/build/static/t4-cs-C6aVcIEq.js +1 -0
  443. package/web-ui/build/static/t4-templating-cVFAPDZQ.js +1 -0
  444. package/web-ui/build/static/t4-vb-DwpqTEJL.js +1 -0
  445. package/web-ui/build/static/taggerscript-GaB8ayWT.js +1 -0
  446. package/web-ui/build/static/tap-DN_-tQNk.js +1 -0
  447. package/web-ui/build/static/tap-XgwFSVSK.js +1 -0
  448. package/web-ui/build/static/tcl-D6eT7YQe.js +1 -0
  449. package/web-ui/build/static/tcl-DiEmh3pJ.js +1 -0
  450. package/web-ui/build/static/textile-cNMT-4v2.js +1 -0
  451. package/web-ui/build/static/thrift-DTgTgcBm.js +1 -0
  452. package/web-ui/build/static/toml-B8XPB_4B.js +1 -0
  453. package/web-ui/build/static/tp-NpmS9CLR.js +1 -0
  454. package/web-ui/build/static/tremor-OVZ172ee.js +1 -0
  455. package/web-ui/build/static/tsx-B1xtIV1E.js +1 -0
  456. package/web-ui/build/static/tt2-DITHT_e6.js +1 -0
  457. package/web-ui/build/static/turtle-D3IrO7qu.js +1 -0
  458. package/web-ui/build/static/twig-Bwmu1-US.js +1 -0
  459. package/web-ui/build/static/twig-CmWIdHrv.js +1 -0
  460. package/web-ui/build/static/typescript-BI4GgjOm.js +1 -0
  461. package/web-ui/build/static/typescript-D6hycyND.js +1 -0
  462. package/web-ui/build/static/typoscript-5S0Q3h4I.js +1 -0
  463. package/web-ui/build/static/unrealscript-CaROCOEp.js +1 -0
  464. package/web-ui/build/static/uorazor-VyIQ6lvW.js +1 -0
  465. package/web-ui/build/static/uri-DDdjLj4-.js +1 -0
  466. package/web-ui/build/static/v-CzPHqjdM.js +1 -0
  467. package/web-ui/build/static/vala-CRK3Oxn2.js +1 -0
  468. package/web-ui/build/static/vala-DTG5j_IY.js +1 -0
  469. package/web-ui/build/static/vbnet-C6z8S410.js +1 -0
  470. package/web-ui/build/static/vbnet-cWNTX8Og.js +1 -0
  471. package/web-ui/build/static/vbscript-CyA_PhGn.js +1 -0
  472. package/web-ui/build/static/vbscript-html-CidnweeC.js +1 -0
  473. package/web-ui/build/static/velocity-Dp6ZU1nS.js +1 -0
  474. package/web-ui/build/static/verilog-CilE-jD9.js +1 -0
  475. package/web-ui/build/static/verilog-RAde9Uda.js +1 -0
  476. package/web-ui/build/static/vhdl-CHS4lDo8.js +1 -0
  477. package/web-ui/build/static/vhdl-D5o9ErDa.js +1 -0
  478. package/web-ui/build/static/vim-B8jwaGJ6.js +1 -0
  479. package/web-ui/build/static/vim-BZrCpxwn.js +1 -0
  480. package/web-ui/build/static/visual-basic-By6WIP3n.js +1 -0
  481. package/web-ui/build/static/warpscript-BQF8R5WL.js +1 -0
  482. package/web-ui/build/static/wasm-DJyk23np.js +1 -0
  483. package/web-ui/build/static/web-idl-DezqVYtV.js +1 -0
  484. package/web-ui/build/static/wiki-CiJcHWqV.js +1 -0
  485. package/web-ui/build/static/wolfram-DjwPz6pa.js +1 -0
  486. package/web-ui/build/static/wren-lzb3aV3F.js +1 -0
  487. package/web-ui/build/static/x86asm-CCNfO4dU.js +1 -0
  488. package/web-ui/build/static/xeora-CRaNjAb0.js +1 -0
  489. package/web-ui/build/static/xl-CRqWPyuc.js +1 -0
  490. package/web-ui/build/static/xml-Uuta5J77.js +1 -0
  491. package/web-ui/build/static/xml-doc-Drc3ho9Y.js +1 -0
  492. package/web-ui/build/static/xojo-D2WT5Q0J.js +1 -0
  493. package/web-ui/build/static/xquery-CwB9Zxcf.js +1 -0
  494. package/web-ui/build/static/xquery-DA5NuZxN.js +1 -0
  495. package/web-ui/build/static/yaml-DJMpA9ia.js +1 -0
  496. package/web-ui/build/static/yaml-DxiY0s1_.js +1 -0
  497. package/web-ui/build/static/yang-DPrwGYlZ.js +1 -0
  498. package/web-ui/build/static/zephir-DOfPWp4I.js +1 -0
  499. package/web-ui/build/static/zig-BE1mX447.js +1 -0
  500. package/web-ui/build/static/1c-BdLpzMAL.js +0 -1
  501. package/web-ui/build/static/abap-CDwRvs0G.js +0 -1
  502. package/web-ui/build/static/abnf-BI7p3j5a.js +0 -1
  503. package/web-ui/build/static/abnf-CNv3r7Uy.js +0 -1
  504. package/web-ui/build/static/accesslog-C06B6TeF.js +0 -1
  505. package/web-ui/build/static/actionscript-4rvU1xh_.js +0 -1
  506. package/web-ui/build/static/actionscript-hzeSNpz-.js +0 -1
  507. package/web-ui/build/static/ada-BKQHlNbk.js +0 -1
  508. package/web-ui/build/static/ada-C-cG6Cnx.js +0 -1
  509. package/web-ui/build/static/agda-BLGp6bzV.js +0 -1
  510. package/web-ui/build/static/al-D1v7f7zb.js +0 -1
  511. package/web-ui/build/static/angelscript-C6fH5Phl.js +0 -1
  512. package/web-ui/build/static/antlr4-CkeL19Pe.js +0 -1
  513. package/web-ui/build/static/apache-JdORoIBq.js +0 -1
  514. package/web-ui/build/static/apacheconf-CapiFi2H.js +0 -1
  515. package/web-ui/build/static/apex-B9woB7hA.js +0 -1
  516. package/web-ui/build/static/apl-lmFlegeo.js +0 -1
  517. package/web-ui/build/static/applescript-BHhW-aLP.js +0 -1
  518. package/web-ui/build/static/applescript-ss_o-t9Q.js +0 -1
  519. package/web-ui/build/static/aql-BLNeECob.js +0 -1
  520. package/web-ui/build/static/arcade-CFXIdOiD.js +0 -1
  521. package/web-ui/build/static/arduino-BnvFM4Uv.js +0 -1
  522. package/web-ui/build/static/arduino-COqLsxBH.js +0 -1
  523. package/web-ui/build/static/arff-D29LT0W3.js +0 -1
  524. package/web-ui/build/static/armasm-4vnDbtEO.js +0 -1
  525. package/web-ui/build/static/asciidoc-B5enjW-U.js +0 -1
  526. package/web-ui/build/static/asciidoc-DXDLuzat.js +0 -1
  527. package/web-ui/build/static/asm6502-BlmY96A-.js +0 -1
  528. package/web-ui/build/static/asmatmel-DsTJaam3.js +0 -1
  529. package/web-ui/build/static/aspectj-CWKdyALZ.js +0 -1
  530. package/web-ui/build/static/aspnet-BMb5ovzr.js +0 -1
  531. package/web-ui/build/static/autohotkey-Bnt4L8Sq.js +0 -1
  532. package/web-ui/build/static/autohotkey-FJP6t7LP.js +0 -1
  533. package/web-ui/build/static/autoit-D_uma-t5.js +0 -1
  534. package/web-ui/build/static/autoit-tV1DvCag.js +0 -1
  535. package/web-ui/build/static/avisynth-C3EGWRqZ.js +0 -1
  536. package/web-ui/build/static/avrasm-SPYupzKN.js +0 -1
  537. package/web-ui/build/static/avro-idl-BVy35bGz.js +0 -1
  538. package/web-ui/build/static/awk-bd20WYWO.js +0 -1
  539. package/web-ui/build/static/axapta-rMrFdrRa.js +0 -1
  540. package/web-ui/build/static/bash-B6JbRSpw.js +0 -1
  541. package/web-ui/build/static/bash-CjDn8CS1.js +0 -1
  542. package/web-ui/build/static/basic-1cr_KdjO.js +0 -1
  543. package/web-ui/build/static/basic-VjzNgL1A.js +0 -1
  544. package/web-ui/build/static/batch-xKrSAbnh.js +0 -1
  545. package/web-ui/build/static/bbcode-D_oXQoMX.js +0 -1
  546. package/web-ui/build/static/bicep-DHCLyehu.js +0 -1
  547. package/web-ui/build/static/birb-LnKeXfOt.js +0 -1
  548. package/web-ui/build/static/bison-D1Y9rGkL.js +0 -1
  549. package/web-ui/build/static/bnf-Dmfxl80x.js +0 -1
  550. package/web-ui/build/static/bnf-Dr4hlA3O.js +0 -1
  551. package/web-ui/build/static/brainfuck-BLTIahWA.js +0 -1
  552. package/web-ui/build/static/brainfuck-DfZP16Cx.js +0 -1
  553. package/web-ui/build/static/brightscript-YT7Nr8GN.js +0 -1
  554. package/web-ui/build/static/bro-Cn2KhPkj.js +0 -1
  555. package/web-ui/build/static/bsl-DFyeWkvL.js +0 -1
  556. package/web-ui/build/static/c-B8jd4ks-.js +0 -1
  557. package/web-ui/build/static/c-CTVZoi8i.js +0 -1
  558. package/web-ui/build/static/c-like-BYR8sR5E.js +0 -1
  559. package/web-ui/build/static/cal-D7KqKxTg.js +0 -1
  560. package/web-ui/build/static/capnproto-Bl9dDXU4.js +0 -1
  561. package/web-ui/build/static/ceylon-DrCHmREL.js +0 -1
  562. package/web-ui/build/static/cfscript-C0sNdmMo.js +0 -1
  563. package/web-ui/build/static/chaiscript-LgrVMZR5.js +0 -1
  564. package/web-ui/build/static/cil-CCNfQAo8.js +0 -1
  565. package/web-ui/build/static/clean-DDw0s_-o.js +0 -1
  566. package/web-ui/build/static/clojure-BFxsxcbQ.js +0 -1
  567. package/web-ui/build/static/clojure-BgMU8fA8.js +0 -1
  568. package/web-ui/build/static/clojure-repl-C174HUrZ.js +0 -1
  569. package/web-ui/build/static/cmake-C6hjTvGt.js +0 -1
  570. package/web-ui/build/static/cmake-CcnmaxXV.js +0 -1
  571. package/web-ui/build/static/cobol-DiLCdCf7.js +0 -1
  572. package/web-ui/build/static/coffeescript-CGB29Opz.js +0 -1
  573. package/web-ui/build/static/coffeescript-DV3V4J6g.js +0 -1
  574. package/web-ui/build/static/concurnas-Cgdt5ES1.js +0 -1
  575. package/web-ui/build/static/coq-BbiJDyLq.js +0 -1
  576. package/web-ui/build/static/coq-DvsBabEJ.js +0 -1
  577. package/web-ui/build/static/cos-B7_pvH_X.js +0 -1
  578. package/web-ui/build/static/cpp-416w6yHT.js +0 -1
  579. package/web-ui/build/static/cpp-pz382MTt.js +0 -1
  580. package/web-ui/build/static/crmsh-BeYTFuCW.js +0 -1
  581. package/web-ui/build/static/crystal-BRtDR8RG.js +0 -1
  582. package/web-ui/build/static/crystal-BZJgl_sw.js +0 -1
  583. package/web-ui/build/static/csharp-BQ-0v8VA.js +0 -1
  584. package/web-ui/build/static/csharp-MlHfKRW4.js +0 -1
  585. package/web-ui/build/static/cshtml-DtS0T24q.js +0 -1
  586. package/web-ui/build/static/csp-6DGTWGnA.js +0 -1
  587. package/web-ui/build/static/csp-CvvAXfUJ.js +0 -1
  588. package/web-ui/build/static/css-DJmvg-kI.js +0 -1
  589. package/web-ui/build/static/css-extras-qVKXZ1K5.js +0 -1
  590. package/web-ui/build/static/csv-HN89Dabm.js +0 -1
  591. package/web-ui/build/static/cypher-zqUo_NN4.js +0 -1
  592. package/web-ui/build/static/d-BDzMr17q.js +0 -1
  593. package/web-ui/build/static/d-DV4MmaJ0.js +0 -1
  594. package/web-ui/build/static/dart-BFkAPQxN.js +0 -1
  595. package/web-ui/build/static/dart-mlgsSLDz.js +0 -1
  596. package/web-ui/build/static/dataweave-BQWIxcgu.js +0 -1
  597. package/web-ui/build/static/dax-FY1jMN3E.js +0 -1
  598. package/web-ui/build/static/delphi-D85b-0Yr.js +0 -1
  599. package/web-ui/build/static/dhall-C8db-g46.js +0 -1
  600. package/web-ui/build/static/diff-BHBVMWZm.js +0 -1
  601. package/web-ui/build/static/diff-Bet-lyrd.js +0 -1
  602. package/web-ui/build/static/django-CFm4coNe.js +0 -1
  603. package/web-ui/build/static/django-DN9SMkSp.js +0 -1
  604. package/web-ui/build/static/dns-C4yo4DHG.js +0 -1
  605. package/web-ui/build/static/dns-zone-file-B3o4w8rf.js +0 -1
  606. package/web-ui/build/static/docker-BxxsATcw.js +0 -1
  607. package/web-ui/build/static/dockerfile-BKIud8Xh.js +0 -1
  608. package/web-ui/build/static/dos-G9yNAV_a.js +0 -1
  609. package/web-ui/build/static/dot-CdN-GBnW.js +0 -1
  610. package/web-ui/build/static/dsconfig-DZ5R9lQR.js +0 -1
  611. package/web-ui/build/static/dts-DwetpYRu.js +0 -1
  612. package/web-ui/build/static/dust-DzEHgUuI.js +0 -1
  613. package/web-ui/build/static/ebnf-COJZCCYQ.js +0 -1
  614. package/web-ui/build/static/ebnf-CkdHWCBJ.js +0 -1
  615. package/web-ui/build/static/editorconfig-Bd3ywZZQ.js +0 -1
  616. package/web-ui/build/static/eiffel-C1Qk3pq5.js +0 -1
  617. package/web-ui/build/static/ejs-DxCI_S1L.js +0 -1
  618. package/web-ui/build/static/elixir-BIIHBb4p.js +0 -1
  619. package/web-ui/build/static/elixir-Cs4wFfMY.js +0 -1
  620. package/web-ui/build/static/elm-CXqZthrB.js +0 -1
  621. package/web-ui/build/static/elm-DBguvIDg.js +0 -1
  622. package/web-ui/build/static/erb-BPbVhlMt.js +0 -1
  623. package/web-ui/build/static/erb-DvRAcKbN.js +0 -1
  624. package/web-ui/build/static/erlang-BUKDJMhm.js +0 -1
  625. package/web-ui/build/static/erlang-iWD1_psr.js +0 -1
  626. package/web-ui/build/static/erlang-repl-CjXC9U4C.js +0 -1
  627. package/web-ui/build/static/etlua-nQ8GCNAu.js +0 -1
  628. package/web-ui/build/static/excel-D8YfiDAv.js +0 -1
  629. package/web-ui/build/static/excel-formula-CdZZRE7Y.js +0 -1
  630. package/web-ui/build/static/factor-wiNoX051.js +0 -1
  631. package/web-ui/build/static/false-CsZdI-HD.js +0 -1
  632. package/web-ui/build/static/firestore-security-rules-9yXT_i-6.js +0 -1
  633. package/web-ui/build/static/fix-BsV5RZTa.js +0 -1
  634. package/web-ui/build/static/flix-rATD1-Qx.js +0 -1
  635. package/web-ui/build/static/flow-B4UMzoDr.js +0 -1
  636. package/web-ui/build/static/fortran-CavcrRz8.js +0 -1
  637. package/web-ui/build/static/fortran-DVZjWi__.js +0 -1
  638. package/web-ui/build/static/fsharp-BCVsmzkR.js +0 -1
  639. package/web-ui/build/static/fsharp-Cj6zPGzQ.js +0 -1
  640. package/web-ui/build/static/ftl-C5VdFKkz.js +0 -1
  641. package/web-ui/build/static/gams-CT90XmM8.js +0 -1
  642. package/web-ui/build/static/gap-Ch518Ngd.js +0 -1
  643. package/web-ui/build/static/gauss-DTmMb1xB.js +0 -1
  644. package/web-ui/build/static/gcode-BLc6YjFp.js +0 -1
  645. package/web-ui/build/static/gcode-DYtkCbZZ.js +0 -1
  646. package/web-ui/build/static/gdscript-xrcGCBEi.js +0 -1
  647. package/web-ui/build/static/gedcom-DMOuE70a.js +0 -1
  648. package/web-ui/build/static/gherkin-BoEzs1SS.js +0 -1
  649. package/web-ui/build/static/gherkin-DHanA7dz.js +0 -1
  650. package/web-ui/build/static/git-BwT7p7t_.js +0 -1
  651. package/web-ui/build/static/glsl-C3_TTBJ-.js +0 -1
  652. package/web-ui/build/static/glsl-Do3cCE-W.js +0 -1
  653. package/web-ui/build/static/gml-CWSUBiZ2.js +0 -1
  654. package/web-ui/build/static/gml-wrCAzzgE.js +0 -1
  655. package/web-ui/build/static/gn-DqmZ0Qq_.js +0 -1
  656. package/web-ui/build/static/go-DLiparlr.js +0 -1
  657. package/web-ui/build/static/go-i67Zsx3x.js +0 -1
  658. package/web-ui/build/static/go-module-S33FcrvV.js +0 -1
  659. package/web-ui/build/static/golo-DZ7qHIok.js +0 -1
  660. package/web-ui/build/static/gradle-BTVIAud8.js +0 -1
  661. package/web-ui/build/static/graphql-BRc7dV6d.js +0 -1
  662. package/web-ui/build/static/groovy-C0xCDIoi.js +0 -1
  663. package/web-ui/build/static/groovy-CqfENDj5.js +0 -1
  664. package/web-ui/build/static/haml-DGEmWQaf.js +0 -1
  665. package/web-ui/build/static/haml-Uc13XeLh.js +0 -1
  666. package/web-ui/build/static/handlebars-2pDOu-qZ.js +0 -1
  667. package/web-ui/build/static/handlebars-fvNs6C2z.js +0 -1
  668. package/web-ui/build/static/haskell-C_0PdpI7.js +0 -1
  669. package/web-ui/build/static/haskell-DPiywQAr.js +0 -1
  670. package/web-ui/build/static/haxe-B-Jmpi4X.js +0 -1
  671. package/web-ui/build/static/haxe-BnwqHNBF.js +0 -1
  672. package/web-ui/build/static/hcl-BkCp99Ns.js +0 -1
  673. package/web-ui/build/static/hlsl-Dhtz76rF.js +0 -1
  674. package/web-ui/build/static/hoon-DLvY-xJE.js +0 -1
  675. package/web-ui/build/static/hpkp-DqGdkrWa.js +0 -1
  676. package/web-ui/build/static/hsp-uyhbGChx.js +0 -1
  677. package/web-ui/build/static/hsts-B_hdMfTA.js +0 -1
  678. package/web-ui/build/static/htmlbars-DBm6s2XZ.js +0 -1
  679. package/web-ui/build/static/http-BJx-7pVa.js +0 -1
  680. package/web-ui/build/static/http-BNr6-Kd5.js +0 -1
  681. package/web-ui/build/static/hy-CCeD6Z5O.js +0 -1
  682. package/web-ui/build/static/ichigojam-HlQ9_0Cd.js +0 -1
  683. package/web-ui/build/static/icon-BVRGWnBS.js +0 -1
  684. package/web-ui/build/static/icu-message-format-DrOF-VCL.js +0 -1
  685. package/web-ui/build/static/idris-BTtsUKQZ.js +0 -1
  686. package/web-ui/build/static/iecst-C8fkotHg.js +0 -1
  687. package/web-ui/build/static/ignore-9L0_iQf0.js +0 -1
  688. package/web-ui/build/static/index-5biw7ctT.js +0 -1
  689. package/web-ui/build/static/index-C6XLF9dS.js +0 -734
  690. package/web-ui/build/static/index-CTO5ggyx.css +0 -1
  691. package/web-ui/build/static/index-CU7QxI6e.js +0 -13
  692. package/web-ui/build/static/inform7-DrLS7QKe.js +0 -1
  693. package/web-ui/build/static/inform7-GeduJ02-.js +0 -1
  694. package/web-ui/build/static/ini-ClRWklj4.js +0 -1
  695. package/web-ui/build/static/ini-CnWkQt74.js +0 -1
  696. package/web-ui/build/static/io-DLrwKpJi.js +0 -1
  697. package/web-ui/build/static/irpf90-D2n0wokI.js +0 -1
  698. package/web-ui/build/static/isbl-DF3cf2zG.js +0 -1
  699. package/web-ui/build/static/j-DFQ008Ab.js +0 -1
  700. package/web-ui/build/static/java-BXn0NYGW.js +0 -1
  701. package/web-ui/build/static/java-DwyOtG2R.js +0 -1
  702. package/web-ui/build/static/javadoc-7lKDS9yO.js +0 -1
  703. package/web-ui/build/static/javadoclike-UZC5a-I2.js +0 -1
  704. package/web-ui/build/static/javascript-BVwVipxy.js +0 -1
  705. package/web-ui/build/static/javastacktrace-Dysb6pma.js +0 -1
  706. package/web-ui/build/static/jboss-cli-DnBJbhvD.js +0 -1
  707. package/web-ui/build/static/jexl-Xt80RITf.js +0 -1
  708. package/web-ui/build/static/jolie-K583lEAy.js +0 -1
  709. package/web-ui/build/static/jq-DzZu56Cz.js +0 -1
  710. package/web-ui/build/static/js-extras-Cnbo_FPE.js +0 -1
  711. package/web-ui/build/static/js-templates-ChGVoxvZ.js +0 -1
  712. package/web-ui/build/static/jsdoc-7PKg08vo.js +0 -1
  713. package/web-ui/build/static/json-CS8btz_1.js +0 -1
  714. package/web-ui/build/static/json-NWyA8Y-S.js +0 -1
  715. package/web-ui/build/static/json5-BTuuCOka.js +0 -1
  716. package/web-ui/build/static/jsonp-CddCenzG.js +0 -1
  717. package/web-ui/build/static/jsstacktrace-Iz7J77qQ.js +0 -1
  718. package/web-ui/build/static/jsx-KHA4XV99.js +0 -1
  719. package/web-ui/build/static/julia-DBE7YTR3.js +0 -1
  720. package/web-ui/build/static/julia-DhbxCJBI.js +0 -1
  721. package/web-ui/build/static/julia-repl-DMdm1IG1.js +0 -1
  722. package/web-ui/build/static/keepalived-B7vqYV9X.js +0 -1
  723. package/web-ui/build/static/keyman-BgxIO8fq.js +0 -1
  724. package/web-ui/build/static/kotlin-DkKt1c_W.js +0 -1
  725. package/web-ui/build/static/kotlin-DkVwHXV3.js +0 -1
  726. package/web-ui/build/static/kumir-ByisfWMX.js +0 -1
  727. package/web-ui/build/static/kusto-D0PVadiC.js +0 -1
  728. package/web-ui/build/static/lasso-DUqlKJ-V.js +0 -1
  729. package/web-ui/build/static/latex-B_KNiR3P.js +0 -1
  730. package/web-ui/build/static/latex-CAna5qNt.js +0 -1
  731. package/web-ui/build/static/latte-IGkHLrSc.js +0 -1
  732. package/web-ui/build/static/ldif-COEZfOAo.js +0 -1
  733. package/web-ui/build/static/leaf-zSqkBknP.js +0 -1
  734. package/web-ui/build/static/less-BZ7CLYuK.js +0 -1
  735. package/web-ui/build/static/less-DTOaHWfJ.js +0 -1
  736. package/web-ui/build/static/lilypond-CXVSkLeK.js +0 -1
  737. package/web-ui/build/static/liquid-C-anTr0A.js +0 -1
  738. package/web-ui/build/static/lisp-CadxWoyo.js +0 -1
  739. package/web-ui/build/static/lisp-hkvi2iDB.js +0 -1
  740. package/web-ui/build/static/livecodeserver-CHrsuOkQ.js +0 -1
  741. package/web-ui/build/static/livescript-B3gz-3aB.js +0 -1
  742. package/web-ui/build/static/livescript-DnHL9ghu.js +0 -1
  743. package/web-ui/build/static/llvm-BahggCBp.js +0 -1
  744. package/web-ui/build/static/llvm-CmHdko4Y.js +0 -1
  745. package/web-ui/build/static/log-Czikd_pI.js +0 -1
  746. package/web-ui/build/static/lolcode-Ch49C9Zh.js +0 -1
  747. package/web-ui/build/static/lsl-C-VWBCeP.js +0 -1
  748. package/web-ui/build/static/lua-CUvtI6AS.js +0 -1
  749. package/web-ui/build/static/lua-z6ZTYh0E.js +0 -1
  750. package/web-ui/build/static/magma-n2Gm1_JJ.js +0 -1
  751. package/web-ui/build/static/makefile-CV719aL9.js +0 -1
  752. package/web-ui/build/static/makefile-D3XU9qyi.js +0 -1
  753. package/web-ui/build/static/markdown-B7ecawDo.js +0 -1
  754. package/web-ui/build/static/markdown-BAZuKAWm.js +0 -1
  755. package/web-ui/build/static/markup-templating-CkJ0kvIz.js +0 -1
  756. package/web-ui/build/static/mathematica-DeYzfKBj.js +0 -1
  757. package/web-ui/build/static/matlab-CkL4qFcf.js +0 -1
  758. package/web-ui/build/static/matlab-DyeBcYxN.js +0 -1
  759. package/web-ui/build/static/maxima-BYkoTgQQ.js +0 -1
  760. package/web-ui/build/static/maxscript-DF4yyx_y.js +0 -1
  761. package/web-ui/build/static/mel-Cvinm-ul.js +0 -1
  762. package/web-ui/build/static/mel-DuhIFj6N.js +0 -1
  763. package/web-ui/build/static/mercury-BgIQH4Io.js +0 -1
  764. package/web-ui/build/static/mermaid-Cu_HXPUU.js +0 -1
  765. package/web-ui/build/static/mipsasm-Bgjx3kJk.js +0 -1
  766. package/web-ui/build/static/mizar-D6qzNoqS.js +0 -1
  767. package/web-ui/build/static/mizar-_PkxIqXq.js +0 -1
  768. package/web-ui/build/static/mojolicious-DUGLQPxV.js +0 -1
  769. package/web-ui/build/static/mongodb-BLMBcuTL.js +0 -1
  770. package/web-ui/build/static/monkey-C5k7PFu0.js +0 -1
  771. package/web-ui/build/static/monkey-DXGsKsbX.js +0 -1
  772. package/web-ui/build/static/moonscript-1TthCNMT.js +0 -1
  773. package/web-ui/build/static/moonscript-DqJs0-Md.js +0 -1
  774. package/web-ui/build/static/n1ql-Bwd4nK-7.js +0 -1
  775. package/web-ui/build/static/n1ql-hfjCkL2y.js +0 -1
  776. package/web-ui/build/static/n4js-gwCvxndi.js +0 -1
  777. package/web-ui/build/static/nand2tetris-hdl-CRRkn3L9.js +0 -1
  778. package/web-ui/build/static/naniscript-C_wnlSUo.js +0 -1
  779. package/web-ui/build/static/nasm-DX-Dob1L.js +0 -1
  780. package/web-ui/build/static/neon-vJIHxlBH.js +0 -1
  781. package/web-ui/build/static/nevod-Bax1uE4z.js +0 -1
  782. package/web-ui/build/static/nginx-BQS7w2F8.js +0 -1
  783. package/web-ui/build/static/nginx-Bt8431vM.js +0 -1
  784. package/web-ui/build/static/nim-0PFojGir.js +0 -1
  785. package/web-ui/build/static/nim-BQVxzPdc.js +0 -1
  786. package/web-ui/build/static/nix-C1td4KJd.js +0 -1
  787. package/web-ui/build/static/nix-CGOaQ4S_.js +0 -1
  788. package/web-ui/build/static/node-repl-BsAGA-kF.js +0 -1
  789. package/web-ui/build/static/nsis-B8d23hVv.js +0 -1
  790. package/web-ui/build/static/nsis-CRfGDpKw.js +0 -1
  791. package/web-ui/build/static/objectivec-CVrobj9V.js +0 -1
  792. package/web-ui/build/static/objectivec-DcVwp8g9.js +0 -1
  793. package/web-ui/build/static/ocaml-b8Cm2pBQ.js +0 -1
  794. package/web-ui/build/static/ocaml-mP-4C0uB.js +0 -1
  795. package/web-ui/build/static/opencl--Qo9pjSM.js +0 -1
  796. package/web-ui/build/static/openqasm-Dt7vKzox.js +0 -1
  797. package/web-ui/build/static/openscad-By-SEqIm.js +0 -1
  798. package/web-ui/build/static/oxygene-BifGHmAP.js +0 -1
  799. package/web-ui/build/static/oz-DHXFoY_V.js +0 -1
  800. package/web-ui/build/static/parigp-CQEx84-o.js +0 -1
  801. package/web-ui/build/static/parser-DevuQ_YA.js +0 -1
  802. package/web-ui/build/static/parser3-IBmULMjM.js +0 -1
  803. package/web-ui/build/static/pascal-hHG_VNBq.js +0 -1
  804. package/web-ui/build/static/pascaligo-DcXZnXMD.js +0 -1
  805. package/web-ui/build/static/pcaxis-paqvl2ov.js +0 -1
  806. package/web-ui/build/static/peoplecode-T-lVjo6Q.js +0 -1
  807. package/web-ui/build/static/perl-BrrOfxJA.js +0 -1
  808. package/web-ui/build/static/perl-DwF9DDkX.js +0 -1
  809. package/web-ui/build/static/pf-CCvQZiY2.js +0 -1
  810. package/web-ui/build/static/pgsql-DYZXTARb.js +0 -1
  811. package/web-ui/build/static/php-C8P7LrqU.js +0 -1
  812. package/web-ui/build/static/php-Jh4xpwhM.js +0 -1
  813. package/web-ui/build/static/php-extras-Ddj6zZ2a.js +0 -1
  814. package/web-ui/build/static/php-template-D0846ZMl.js +0 -1
  815. package/web-ui/build/static/phpdoc-DU8hHiT4.js +0 -1
  816. package/web-ui/build/static/plaintext-BpAdoq1j.js +0 -1
  817. package/web-ui/build/static/plsql-DjRpUwV7.js +0 -1
  818. package/web-ui/build/static/pony-C91UDOZB.js +0 -1
  819. package/web-ui/build/static/powerquery-CbFt66kY.js +0 -1
  820. package/web-ui/build/static/powershell-Bpd_CmgV.js +0 -1
  821. package/web-ui/build/static/powershell-C0-63tFn.js +0 -1
  822. package/web-ui/build/static/processing-COoELNkd.js +0 -1
  823. package/web-ui/build/static/processing-DovufXGj.js +0 -1
  824. package/web-ui/build/static/profile-DSijKis_.js +0 -1
  825. package/web-ui/build/static/prolog-BPJoWbIS.js +0 -1
  826. package/web-ui/build/static/prolog-Cs4I3Exr.js +0 -1
  827. package/web-ui/build/static/promql-aIfsISjo.js +0 -1
  828. package/web-ui/build/static/properties-DWHgjzpz.js +0 -1
  829. package/web-ui/build/static/properties-k4Dmn8BE.js +0 -1
  830. package/web-ui/build/static/protobuf-HvnZbIjE.js +0 -1
  831. package/web-ui/build/static/protobuf-bqbMMmGn.js +0 -1
  832. package/web-ui/build/static/psl-KbjBRrbA.js +0 -1
  833. package/web-ui/build/static/pug-DJVp_q_q.js +0 -1
  834. package/web-ui/build/static/puppet-DloEWvDZ.js +0 -1
  835. package/web-ui/build/static/puppet-WFgyaopG.js +0 -1
  836. package/web-ui/build/static/pure-483zjlGE.js +0 -1
  837. package/web-ui/build/static/purebasic-CZ8DdKkF.js +0 -1
  838. package/web-ui/build/static/purebasic-dlQReKmz.js +0 -1
  839. package/web-ui/build/static/purescript-BQnFvaU3.js +0 -1
  840. package/web-ui/build/static/python-CZ8lWs1l.js +0 -1
  841. package/web-ui/build/static/python-SU3ESoh4.js +0 -1
  842. package/web-ui/build/static/python-repl-BBkzrvQe.js +0 -1
  843. package/web-ui/build/static/q-DTmVFt9r.js +0 -1
  844. package/web-ui/build/static/q-DtzT8sxS.js +0 -1
  845. package/web-ui/build/static/qml-B5F36arQ.js +0 -1
  846. package/web-ui/build/static/qml-BGRIPpl3.js +0 -1
  847. package/web-ui/build/static/qore-CRS2zeE4.js +0 -1
  848. package/web-ui/build/static/qsharp-C4Tv2HNI.js +0 -1
  849. package/web-ui/build/static/r-BrIQscI_.js +0 -1
  850. package/web-ui/build/static/r-C1dTwrK3.js +0 -1
  851. package/web-ui/build/static/racket-CY5XtMxt.js +0 -1
  852. package/web-ui/build/static/reason-BOspKOui.js +0 -1
  853. package/web-ui/build/static/reasonml-CI0bWekr.js +0 -1
  854. package/web-ui/build/static/regex-Bu9fRM2h.js +0 -1
  855. package/web-ui/build/static/rego-DPs1L6rM.js +0 -1
  856. package/web-ui/build/static/renpy-CqxG8TUa.js +0 -1
  857. package/web-ui/build/static/rest-DVBf_JOU.js +0 -1
  858. package/web-ui/build/static/rib-C7f1MpLJ.js +0 -1
  859. package/web-ui/build/static/rip-CnDVKjn3.js +0 -1
  860. package/web-ui/build/static/roboconf-B3CDWS-p.js +0 -1
  861. package/web-ui/build/static/roboconf-Cl96yvBS.js +0 -1
  862. package/web-ui/build/static/robotframework-BitHYBrT.js +0 -1
  863. package/web-ui/build/static/routeros-CfrP9irD.js +0 -1
  864. package/web-ui/build/static/rsl-CGblvP8t.js +0 -1
  865. package/web-ui/build/static/ruby-CJyKAxoz.js +0 -1
  866. package/web-ui/build/static/ruby-KT7L0c-N.js +0 -1
  867. package/web-ui/build/static/ruleslanguage-_MWgFm9V.js +0 -1
  868. package/web-ui/build/static/rust-DAiMZG-s.js +0 -1
  869. package/web-ui/build/static/rust-Dmpa9JNg.js +0 -1
  870. package/web-ui/build/static/sas-CQltIY6v.js +0 -1
  871. package/web-ui/build/static/sas-aM67MfcZ.js +0 -1
  872. package/web-ui/build/static/sass-DEBoFRRa.js +0 -1
  873. package/web-ui/build/static/scala-Cd5U29aY.js +0 -1
  874. package/web-ui/build/static/scala-DzaGwcFi.js +0 -1
  875. package/web-ui/build/static/scheme-Cqqy_i9p.js +0 -1
  876. package/web-ui/build/static/scheme-cIT7gYIT.js +0 -1
  877. package/web-ui/build/static/scilab-DkyaqVYN.js +0 -1
  878. package/web-ui/build/static/scss-Cyi-dRZB.js +0 -1
  879. package/web-ui/build/static/scss-D_mUdkix.js +0 -1
  880. package/web-ui/build/static/shell-BF_xfQdX.js +0 -1
  881. package/web-ui/build/static/shell-session-C4TwlI5u.js +0 -1
  882. package/web-ui/build/static/smali-CvYqcvZD.js +0 -1
  883. package/web-ui/build/static/smali-DdJm0lGk.js +0 -1
  884. package/web-ui/build/static/smalltalk-B4v_uFAj.js +0 -1
  885. package/web-ui/build/static/smalltalk-BHk9orPf.js +0 -1
  886. package/web-ui/build/static/smarty-DCURdYbE.js +0 -1
  887. package/web-ui/build/static/sml-BFUDbMt7.js +0 -1
  888. package/web-ui/build/static/sml-BIbfLMH_.js +0 -1
  889. package/web-ui/build/static/solidity-fyryqi43.js +0 -1
  890. package/web-ui/build/static/solution-file-DoPZY9rL.js +0 -1
  891. package/web-ui/build/static/soy-AjVmvggx.js +0 -1
  892. package/web-ui/build/static/sparql-C4-CLrDw.js +0 -1
  893. package/web-ui/build/static/splunk-spl-DclxQT5j.js +0 -1
  894. package/web-ui/build/static/sqf-CuCGayd3.js +0 -1
  895. package/web-ui/build/static/sqf-uK9OZDXX.js +0 -1
  896. package/web-ui/build/static/sql-B0Pqn1rt.js +0 -1
  897. package/web-ui/build/static/sql-DlNrMSaF.js +0 -1
  898. package/web-ui/build/static/sql_more-BmwYd1jA.js +0 -1
  899. package/web-ui/build/static/squirrel-PzIoP6WH.js +0 -1
  900. package/web-ui/build/static/stan-BZe07EwD.js +0 -1
  901. package/web-ui/build/static/stan-De1mVh5w.js +0 -1
  902. package/web-ui/build/static/stata-Dt6KIbHG.js +0 -1
  903. package/web-ui/build/static/step21-5If4hNHF.js +0 -1
  904. package/web-ui/build/static/stylus-Cfsl-liy.js +0 -1
  905. package/web-ui/build/static/stylus-V2q0pGFi.js +0 -1
  906. package/web-ui/build/static/subunit-Dw4nCzI8.js +0 -1
  907. package/web-ui/build/static/swift-CNMLwgfO.js +0 -1
  908. package/web-ui/build/static/swift-HUQ5YZQh.js +0 -1
  909. package/web-ui/build/static/systemd-C8DE2Z5C.js +0 -1
  910. package/web-ui/build/static/t4-cs-C_Ey5AJK.js +0 -1
  911. package/web-ui/build/static/t4-templating-DwnTc5zw.js +0 -1
  912. package/web-ui/build/static/t4-vb-C-0KWoPY.js +0 -1
  913. package/web-ui/build/static/taggerscript-Bv6_taGx.js +0 -1
  914. package/web-ui/build/static/tap-CFDvzug8.js +0 -1
  915. package/web-ui/build/static/tap-CdJ_Enrg.js +0 -1
  916. package/web-ui/build/static/tcl-BAEseFnT.js +0 -1
  917. package/web-ui/build/static/tcl-BS59XADk.js +0 -1
  918. package/web-ui/build/static/textile-a8y5rAtB.js +0 -1
  919. package/web-ui/build/static/thrift-D7V-eNGh.js +0 -1
  920. package/web-ui/build/static/toml-D8cwTEse.js +0 -1
  921. package/web-ui/build/static/tp-hIAhc2bK.js +0 -1
  922. package/web-ui/build/static/tremor-Czk4wryK.js +0 -1
  923. package/web-ui/build/static/tsx-BOeSrzC2.js +0 -1
  924. package/web-ui/build/static/tt2-BHVJTkSt.js +0 -1
  925. package/web-ui/build/static/turtle-BOWLWZq7.js +0 -1
  926. package/web-ui/build/static/twig-CiL22hfc.js +0 -1
  927. package/web-ui/build/static/twig-fnjh9nSd.js +0 -1
  928. package/web-ui/build/static/typescript-BXgo8AbH.js +0 -1
  929. package/web-ui/build/static/typescript-Bd_EcNlS.js +0 -1
  930. package/web-ui/build/static/typoscript-OvQoCcN-.js +0 -1
  931. package/web-ui/build/static/unrealscript-Dw9u3aN1.js +0 -1
  932. package/web-ui/build/static/uorazor-BYmWZy9R.js +0 -1
  933. package/web-ui/build/static/uri-cZEKPhfB.js +0 -1
  934. package/web-ui/build/static/v-DCUw5P5w.js +0 -1
  935. package/web-ui/build/static/vala-BeMIXdl5.js +0 -1
  936. package/web-ui/build/static/vala-Dchv0k-k.js +0 -1
  937. package/web-ui/build/static/vbnet-CYNUkFEn.js +0 -1
  938. package/web-ui/build/static/vbnet-DJpHrZ4P.js +0 -1
  939. package/web-ui/build/static/vbscript-html-eSFLndJq.js +0 -1
  940. package/web-ui/build/static/vbscript-uo6pZmjr.js +0 -1
  941. package/web-ui/build/static/velocity-BZ4IThJR.js +0 -1
  942. package/web-ui/build/static/verilog-CaEouCrk.js +0 -1
  943. package/web-ui/build/static/verilog-D_yjfQsL.js +0 -1
  944. package/web-ui/build/static/vhdl-3zobHypY.js +0 -1
  945. package/web-ui/build/static/vhdl-DfMoYPtq.js +0 -1
  946. package/web-ui/build/static/vim-DBVHHc5J.js +0 -1
  947. package/web-ui/build/static/vim-DillbvCO.js +0 -1
  948. package/web-ui/build/static/visual-basic-C7H7McST.js +0 -1
  949. package/web-ui/build/static/warpscript-BKjx-dEN.js +0 -1
  950. package/web-ui/build/static/wasm-AVgQyIgy.js +0 -1
  951. package/web-ui/build/static/web-idl-BNNIYzG6.js +0 -1
  952. package/web-ui/build/static/wiki-CLfpaX63.js +0 -1
  953. package/web-ui/build/static/wolfram-DUecju0s.js +0 -1
  954. package/web-ui/build/static/wren-DOzRaRuS.js +0 -1
  955. package/web-ui/build/static/x86asm-FxnmOy9a.js +0 -1
  956. package/web-ui/build/static/xeora-u3RdEzzL.js +0 -1
  957. package/web-ui/build/static/xl-DRkSDCgX.js +0 -1
  958. package/web-ui/build/static/xml-d39yV6YW.js +0 -1
  959. package/web-ui/build/static/xml-doc-CAsyFkZk.js +0 -1
  960. package/web-ui/build/static/xojo-C82wULba.js +0 -1
  961. package/web-ui/build/static/xquery-CdvxjAIl.js +0 -1
  962. package/web-ui/build/static/xquery-ClPcUh76.js +0 -1
  963. package/web-ui/build/static/yaml-C5_f2N79.js +0 -1
  964. package/web-ui/build/static/yaml-ZJm6Uydk.js +0 -1
  965. package/web-ui/build/static/yang-BR7aZNbT.js +0 -1
  966. package/web-ui/build/static/zephir-CnL3vXXJ.js +0 -1
  967. package/web-ui/build/static/zig-e5ovIuAu.js +0 -1
@@ -0,0 +1,1336 @@
1
+ /**
2
+ * WidgetTool — agent-facing tool for rendering custom UI widgets inline
3
+ * in the chat stream. Two modes:
4
+ *
5
+ * kind: 'html' — static HTML+CSS, rendered in an iframe with sandbox=""
6
+ * (no scripts, no forms, no same-origin). Safe for
7
+ * visualisations, decorated callouts, infographics.
8
+ *
9
+ * kind: 'jsx' — Preact+htm render code, rendered in an iframe with
10
+ * sandbox="allow-scripts" (scripts only, no same-origin).
11
+ * Can round-trip user interactions back to the agent
12
+ * via the loxia.sendEvent() SDK baked into the runtime.
13
+ *
14
+ * Agents invoke:
15
+ * { toolId: 'widget', action: 'render', kind, content, widgetId?, props? }
16
+ * { toolId: 'widget', action: 'update', widgetId, props }
17
+ * { toolId: 'widget', action: 'destroy', widgetId }
18
+ * { toolId: 'widget', action: 'list' }
19
+ *
20
+ * Results come back as a tool-result the frontend WidgetRenderer picks up
21
+ * and hands to <IframeWidget>. Agent-visible output intentionally does
22
+ * NOT echo the full content — the content lives in the message feed once,
23
+ * inside the iframe's srcdoc.
24
+ *
25
+ * State lives on the tool instance (Map<agentId, Map<widgetId, widget>>).
26
+ * LRU-evicted per-agent beyond MAX_WIDGETS_PER_AGENT so a runaway agent
27
+ * can't OOM the process.
28
+ */
29
+
30
+ import { EventEmitter } from 'events';
31
+ import { BaseTool } from '../../tools/baseTool.js';
32
+ import {
33
+ validateRenderParams,
34
+ validateUpdateParams,
35
+ validateDestroyParams,
36
+ validateListVersionsParams,
37
+ validateGetVersionParams,
38
+ validateSetMainParams,
39
+ WIDGET_LIMITS,
40
+ } from './schema.js';
41
+ import { scanForPhishingKeywords } from './phishingScanner.js';
42
+ import { GalleryStore } from './galleryStore.js';
43
+ import { analyzeWidgetCode } from './codeAnalyzer.js';
44
+
45
+ /**
46
+ * Generate an opaque, sortable version id. Sortability isn't relied on
47
+ * for ordering (the versions array is chronological by insertion) but
48
+ * helps with audit logs and debugging.
49
+ */
50
+ function generateVersionId() {
51
+ return 'v-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2, 8);
52
+ }
53
+
54
+ /**
55
+ * Build a version record from a render payload. Each version captures
56
+ * everything needed to re-mount the widget at that version: kind,
57
+ * content, initial props, the phishing-scan result at write time, and
58
+ * size in UTF-8 bytes.
59
+ */
60
+ function buildVersion({ kind, content, props }) {
61
+ return {
62
+ versionId: generateVersionId(),
63
+ kind,
64
+ content,
65
+ props: props || {},
66
+ phishingHits: scanForPhishingKeywords(content),
67
+ size: Buffer.byteLength(content, 'utf8'),
68
+ createdAt: new Date().toISOString(),
69
+ };
70
+ }
71
+
72
+ /**
73
+ * Mirror the active version's content/kind/props/etc. onto the widget
74
+ * record's top-level fields. This keeps every existing consumer
75
+ * (frontend WidgetRenderer, /api/widget/audit, list action, tests)
76
+ * working without changes — they read `.content` / `.kind` / `.props`
77
+ * and they get the active (main) version's values.
78
+ *
79
+ * Mutates `widget` in place and returns it for chaining.
80
+ */
81
+ function mirrorActiveVersion(widget) {
82
+ const main = widget.versions.find(v => v.versionId === widget.mainVersionId)
83
+ || widget.versions[widget.versions.length - 1];
84
+ widget.kind = main.kind;
85
+ widget.content = main.content;
86
+ widget.props = main.props;
87
+ widget.phishingHits = main.phishingHits;
88
+ widget.size = main.size;
89
+ widget.updatedAt = main.createdAt; // "active version's effective-since time"
90
+ // Latest-rendered timestamp lives separately so audit/UI can show
91
+ // "last rendered" even if the user pinned an older version as main.
92
+ widget.lastRenderedAt = widget.versions[widget.versions.length - 1].createdAt;
93
+ return widget;
94
+ }
95
+
96
+ export class WidgetTool extends BaseTool {
97
+ constructor(config = {}, logger = null) {
98
+ super(config, logger);
99
+ this.id = 'widget';
100
+
101
+ // Map<agentId, Map<widgetId, widget>> — widgets are per-agent so
102
+ // listings don't leak across the tenancy boundary.
103
+ this._widgetsByAgent = new Map();
104
+ // Monotonic counter for auto-generated ids (user-friendly + unique).
105
+ this._nextAutoId = 1;
106
+
107
+ // Gallery (cross-session shared widget catalog). Lazy — created on
108
+ // first share/list-gallery/render-from-gallery call. Tests/route
109
+ // handlers can replace this with a custom-filePath instance via
110
+ // `setGalleryStore(...)` so they don't touch the user's real file.
111
+ this._gallery = null;
112
+
113
+ // Event bus for widget-state mutations. The web server bridges this
114
+ // to a WebSocket `widget_changed` message so the frontend artifacts
115
+ // panel stays in sync without depending on the chat feed (which is
116
+ // lazy-loaded — older messages may not be mounted, so feed-only
117
+ // observation misses widgets that exist on the backend).
118
+ //
119
+ // Emitted event:
120
+ // 'widget-changed' { agentId, widgetId, changeType, summary, templateId? }
121
+ //
122
+ // changeType ∈ 'rendered' | 'updated' | 'destroyed' | 'main-set'
123
+ // | 'shared' | 'unshared' | 'upgrade-applied'
124
+ //
125
+ // For 'destroyed', `summary` is null and `widgetId` is the removed id.
126
+ this.events = new EventEmitter();
127
+ // Don't crash the process if the bus has no listener attached yet
128
+ // (e.g. tests, or the web server is starting up).
129
+ this.events.setMaxListeners(50);
130
+ }
131
+
132
+ /**
133
+ * Build the summary shape consumed by the artifacts panel and the
134
+ * `widget_changed` WS push. Matches the per-row shape returned by
135
+ * `_list(agentId)` so the frontend can use a single code path.
136
+ * @private
137
+ */
138
+ _buildSummary(widget) {
139
+ if (!widget) return null;
140
+ return {
141
+ widgetId: widget.widgetId,
142
+ kind: widget.kind,
143
+ createdAt: widget.createdAt,
144
+ updatedAt: widget.updatedAt,
145
+ lastRenderedAt: widget.lastRenderedAt,
146
+ size: widget.size,
147
+ phishingHits: widget.phishingHits,
148
+ versionCount: widget.versions ? widget.versions.length : 0,
149
+ mainVersionId: widget.mainVersionId,
150
+ linkedGalleryTemplateId: widget.linkedGalleryTemplateId || null,
151
+ linkedGalleryVersion: widget.linkedGalleryVersion || null,
152
+ divergedFromGallery: !!widget.divergedFromGallery,
153
+ };
154
+ }
155
+
156
+ /**
157
+ * Emit a widget-changed event. Wrapped in a try/catch so a buggy
158
+ * listener can never break the tool call itself — the widget mutation
159
+ * has already happened by the time we emit.
160
+ * @private
161
+ */
162
+ _emitChange(agentId, widgetId, changeType, widget, extra = {}) {
163
+ try {
164
+ this.events.emit('widget-changed', {
165
+ agentId,
166
+ widgetId,
167
+ changeType,
168
+ summary: widget ? this._buildSummary(widget) : null,
169
+ ...extra,
170
+ });
171
+ } catch (err) {
172
+ this.logger?.warn?.('widget-changed listener threw', { error: err?.message });
173
+ }
174
+ }
175
+
176
+ /** Allow tests / routes / app boot to inject a configured GalleryStore. */
177
+ setGalleryStore(store) { this._gallery = store; }
178
+
179
+ /**
180
+ * Lazy-init helper. Returns a GalleryStore — defaults to ~/.loxia/widget-gallery.json.
181
+ * @private
182
+ */
183
+ _galleryStore() {
184
+ if (!this._gallery) this._gallery = new GalleryStore({ logger: this.logger });
185
+ return this._gallery;
186
+ }
187
+
188
+ getDescription() {
189
+ return `
190
+ Widget Tool: Render custom UI widgets inline in the message stream.
191
+
192
+ USAGE:
193
+ \`\`\`json
194
+ { "toolId": "widget", "action": "render", "kind": "html", "content": "<div>...</div>" }
195
+ \`\`\`
196
+
197
+ ACTIONS:
198
+ - render — mount or replace a widget. kind: 'html' (static) or 'jsx' (interactive)
199
+ - update — replace props on an existing widget (jsx only; triggers re-render)
200
+ - destroy — remove a widget from the stream
201
+ - list — return { widgetId, kind, createdAt, size } for all widgets this agent owns
202
+ - list-capabilities — return a structured report of every global, hook, primitive,
203
+ namespace alias, and "not implemented" API with rewrite paths.
204
+ Call this any time you're unsure what's available, or after
205
+ a WIDGET RENDER ERROR mentions an undefined identifier.
206
+
207
+ KINDS:
208
+ - **html**: static HTML+CSS. Script tags, inline handlers, and <form> submissions
209
+ are blocked by the sandbox. Images allowed from 'data:' and 'blob:' URIs only.
210
+ Use this for visualisations, decorated callouts, and anything that doesn't
211
+ need interactivity.
212
+
213
+ - **webcomponent** (RECOMMENDED for interactive widgets): you write a class
214
+ that extends LoxiaElement (an HTMLElement subclass), then call
215
+ loxia.render(YourClass, initialProps). Standard web platform — no JSX,
216
+ no hooks, no namespace imports. The agent surface is just:
217
+ class MyWidget extends LoxiaElement {
218
+ state = { count: 0 };
219
+ template(state) {
220
+ return \`
221
+ <div>
222
+ <span>Count: \${state.count}</span>
223
+ <button data-bind-click="increment">+1</button>
224
+ <input data-bind="name" value="\${state.name || ''}" placeholder="Name" />
225
+ </div>
226
+ \`;
227
+ }
228
+ increment() { this.setState({ count: this.state.count + 1 }); }
229
+ }
230
+ loxia.render(MyWidget, window.__loxiaInitialProps);
231
+
232
+ EVENT WIRING — THE PRIMARY PATTERN:
233
+
234
+ Use addEventListener inside this.afterRender(root). This is web-standard,
235
+ typo-proof, gives full Event API access (AbortSignal, { once, capture,
236
+ passive }, custom events, event delegation), and works for events
237
+ data-on-<event> can't express. afterRender(root) runs after EVERY render
238
+ (including post-setState), so listeners attached there survive state
239
+ updates — innerHTML is rewritten on each render, but the hook re-attaches
240
+ your listeners on the fresh DOM each time.
241
+
242
+ Example:
243
+ class MyWidget extends LoxiaElement {
244
+ state = { count: 0 };
245
+ increment() { this.setState({ count: this.state.count + 1 }); }
246
+ afterRender(root) {
247
+ root.querySelector('#bumpBtn').addEventListener('click', () => this.increment());
248
+ root.querySelector('#nameInput').addEventListener('input', (e) => {
249
+ this.setState({ name: e.target.value });
250
+ });
251
+ }
252
+ template(state) {
253
+ return \`<div>
254
+ <span>Count: \${state.count}</span>
255
+ <button id="bumpBtn">+1</button>
256
+ <input id="nameInput" placeholder="Name" />
257
+ </div>\`;
258
+ }
259
+ }
260
+ loxia.render(MyWidget, window.__loxiaInitialProps);
261
+
262
+ Why afterRender and NOT onMount: onMount fires once on first connection.
263
+ setState rewrites innerHTML, which destroys all DOM listeners attached
264
+ in onMount. They silently stop firing on the first re-render. afterRender
265
+ is the only correct place to attach listeners that need to survive state.
266
+
267
+ AUTO-WIRING SHORTCUTS (optional ergonomics, only for the simple cases):
268
+
269
+ data-bind="key" → input/change events update state[key] automatically.
270
+ Useful for two-way binding text/number inputs.
271
+ data-on-<event>="methodName" → fires any DOM event → calls this.methodName(e).
272
+ Concise alternative to addEventListener for
273
+ trivial cases. Works for any browser event name
274
+ (click, input, keydown, pointerdown, dblclick,
275
+ wheel, transitionend, …).
276
+ \`this\` inside the handler is the LoxiaElement.
277
+
278
+ DO NOT USE for local interactivity:
279
+
280
+ ✗ data-emit="name"
281
+ Sends a postMessage to the AGENT — does NOT call your method on click.
282
+ The button click will appear to do nothing locally; the agent receives
283
+ an event on its NEXT TURN. Use ONLY when you specifically want to
284
+ notify the agent (e.g. "user clicked submit, fetch fresh data").
285
+ For a click that should run a local method, use addEventListener
286
+ in afterRender or data-on-click="methodName".
287
+
288
+ ✗ Inline onclick="this.foo()" / onchange="…"
289
+ Runs in iframe global scope; \`this\` is the element, not your class.
290
+
291
+ ✗ data-bind-click / data-action / data-handler / data-onclick / data-on:click
292
+ Not recognized. The runtime now auto-rewrites these to data-on-<event>
293
+ AND surfaces a warning, but it's better to write data-on-click directly.
294
+
295
+ ✗ addEventListener in onMount()
296
+ Dies on the first setState because innerHTML is rewritten. Use afterRender.
297
+
298
+ SHADOW DOM:
299
+ LoxiaElement attaches a shadow root in its constructor, so this.shadowRoot
300
+ is always available. template()'s output is written to shadowRoot.innerHTML.
301
+ CSS scoped to your widget (in the template's <style>) does NOT leak out;
302
+ CSS custom properties (--gray-500, --loxia-600) DO pierce in. Use
303
+ this.shadowRoot.querySelector / addEventListener for direct DOM access.
304
+
305
+ CRITICAL — HOW TO MOUNT (the #1 failure mode):
306
+ ALWAYS end your code with:
307
+ loxia.render(YourClass, window.__loxiaInitialProps);
308
+
309
+ Do NOT do any of these — they will produce a "Your widget did not mount" error:
310
+ ✗ customElements.define('your-tag', YourClass); // by itself
311
+ ✗ document.body.appendChild(document.createElement('your-tag'));
312
+ ✗ new YourClass(); // without appending
313
+ ✗ class YourClass { ... } // forgetting the loxia.render call entirely
314
+
315
+ loxia.render handles registration, instantiation, and mounting in one call.
316
+
317
+ PROP UPDATES from agent:
318
+ When you call widget.update with new props, the iframe receives them
319
+ and the base class's handleUpdate(props) is called (default: setState).
320
+ Override handleUpdate() if you want custom merge logic.
321
+
322
+ ESCAPE HATCH: extend HTMLElement directly if you want raw DOM control.
323
+ loxia.render still mounts you and bridges events to the agent.
324
+
325
+ - **jsx**: interactive mini-Preact widget rendered in a null-origin
326
+ sandbox iframe. This is NOT React, NOT Preact, NOT a Node environment.
327
+ Read the GLOBALS list below BEFORE writing code — every identifier you
328
+ reference must appear there or it will ReferenceError at runtime.
329
+
330
+ ═══════════════════════════════════════════════════════════════════
331
+ THE COMPLETE LIST OF GLOBALS AVAILABLE INSIDE YOUR WIDGET
332
+ ═══════════════════════════════════════════════════════════════════
333
+ All available as bare identifiers, as properties on \`h\`, and on
334
+ \`loxia\` — pick whichever you like:
335
+
336
+ h(type, props, ...children) — hyperscript (VDOM node constructor)
337
+ html\`…\` — htm tagged-template, compiles to h()
338
+ LoxiaCard, LoxiaButton, LoxiaInput, LoxiaText,
339
+ LoxiaMetric, LoxiaRow, LoxiaCol — component primitives
340
+
341
+ Hooks — these DO work, scoped to the ROOT component:
342
+
343
+ useState(initial) → [value, setValue]
344
+ useEffect(fn, deps) → runs fn after render when deps change;
345
+ fn may return a cleanup function
346
+ useMemo(compute, deps) → cached value
347
+ useCallback(fn, deps) → cached function reference
348
+ useRef(initial) → { current } — stable across renders
349
+ useReducer(reducer, init[, i])→ [state, dispatch] — implemented as
350
+ a useState wrapper
351
+
352
+ loxia-only APIs:
353
+
354
+ loxia.render(Component, props) — mount; call this last
355
+ loxia.sendEvent({ type, payload }) — send event up to the agent
356
+ loxia.onUpdate(fn) — subscribe to prop updates
357
+ loxia.requestHeight(px) — manual height override
358
+
359
+ Browser APIs (standard in every iframe):
360
+
361
+ document, window, console, setTimeout, setInterval, clearTimeout,
362
+ clearInterval, Promise, JSON, Math, Date, Array, Object, String,
363
+ Number, Boolean, Map, Set, Symbol, Error
364
+
365
+ ═══════════════════════════════════════════════════════════════════
366
+ NOT AVAILABLE
367
+ ═══════════════════════════════════════════════════════════════════
368
+
369
+ HARD ERRORS (ReferenceError — environment doesn't provide them):
370
+ ✗ JSX angle-bracket syntax (bare <div>...) → use html\`<div>...\`
371
+ ✗ import, require, export → iframe is null-origin, no modules
372
+ ✗ fetch, XMLHttpRequest, WebSocket → CSP blocks all network
373
+ ✗ localStorage, sessionStorage, cookies → null origin, no storage
374
+ ✗ indexedDB → null origin
375
+ ✗ Any npm package (lodash, d3, chart.js, ...) → none are loaded
376
+ ✗ process, global, Buffer → this is a browser, not Node
377
+ ✗ Hooks in NESTED components → hooks are call-order-keyed
378
+ on the ROOT component. Lift nested state up.
379
+
380
+ NAMED "NOT IMPLEMENTED" ERRORS (APIs that LOOK available via namespaces
381
+ but throw with a specific message so you know exactly what to change):
382
+
383
+ Class components — "X is not implemented … use a function component":
384
+ ✗ Component, PureComponent
385
+ ✗ \`class App extends React.Component { ... }\` → rewrite as
386
+ a function component with useState.
387
+
388
+ React/Preact APIs beyond the 6 supported hooks:
389
+ ✗ useContext, useLayoutEffect, useImperativeHandle,
390
+ useDeferredValue, useTransition, useId, useSyncExternalStore,
391
+ useErrorBoundary
392
+ ✗ createContext, createRef, forwardRef, memo, lazy, Suspense,
393
+ StrictMode, Children, cloneElement, isValidElement
394
+
395
+ When you hit these, the error message names the API and lists
396
+ supported alternatives. Example rewrites:
397
+ - useContext(Context) → prop-drill or move state to agent
398
+ - useLayoutEffect(fn, deps) → useEffect(fn, deps) is close enough
399
+ - Component class → function App() { ... useState ... }
400
+
401
+ For a PROGRAMMATIC list (with rewrite paths for each), call
402
+ { "toolId": "widget", "action": "list-capabilities" }.
403
+
404
+ NAMES THAT ARE AVAILABLE but don't contain what you think:
405
+ - React / ReactDOM / preact / htmPreact / preactHooks / htm — ALL
406
+ alias to the same widget-runtime bundle. They have useState,
407
+ useEffect, useMemo, useCallback, useRef, h, html, createElement,
408
+ Fragment. They do NOT have Component, forwardRef, Suspense, etc.
409
+ (see NOT IMPLEMENTED above).
410
+
411
+ ═══════════════════════════════════════════════════════════════════
412
+ TEMPLATE ATTRIBUTE SYNTAX — GOTCHAS
413
+ ═══════════════════════════════════════════════════════════════════
414
+
415
+ Inside html\`...\` templates, interpolation uses \${expr}. Attributes
416
+ with non-string values (objects, functions) need the \${...} wrapper.
417
+
418
+ INLINE STYLE AS AN OBJECT — the common mistake:
419
+
420
+ ✗ <div style="{ color: 'red' }"> ← wrong: string literal,
421
+ div has no real styling
422
+ ✗ <div style="\${styleObj}"> ← wrong: coerced to string
423
+ ✓ <div style=\${{ color: 'red' }}> ← correct: object interp
424
+ ✓ <div style=\${styleObj}> ← correct: object variable
425
+
426
+ The outer \${...} is the template interpolation; the inner {...} is the
427
+ JS object literal. When an agent uses style="\${expr}" (with the quotes
428
+ closing INSIDE the interpolation), the runtime treats the whole thing
429
+ as a string and your styling gets silently ignored.
430
+
431
+ SAME RULE for event handlers and any non-string attribute:
432
+
433
+ ✓ <button onClick=\${fn}> ← unquoted interpolation
434
+ ✓ <input value=\${s}>
435
+ ✗ <button onClick="\${fn}"> ← string "function..."
436
+ ✗ <input value="\${s}"> ← stringified
437
+
438
+ Quoted interpolations are only right for STRING attributes:
439
+
440
+ ✓ <div class=\${cls}> or class="\${cls}" ← both OK (both strings)
441
+ ✓ <a href=\${url}> ← url is a string anyway
442
+
443
+ ═══════════════════════════════════════════════════════════════════
444
+ STATE MODEL
445
+ ═══════════════════════════════════════════════════════════════════
446
+
447
+ Two patterns — pick based on who needs the state.
448
+
449
+ (A) LOCAL STATE (useState): keep it in the widget. Good for form
450
+ inputs, hover effects, expand/collapse, etc. — anything the
451
+ agent doesn't need to reason about.
452
+
453
+ (B) AGENT-OWNED STATE (sendEvent + widget.update): the widget is a
454
+ view, the agent is the state machine. Good for state the agent
455
+ should track or persist (final decisions, completed selections).
456
+
457
+ Combine both freely: keep typing/dragging state local with useState,
458
+ and sendEvent only on submit/commit.
459
+
460
+ ═══════════════════════════════════════════════════════════════════
461
+ MINIMAL WORKING EXAMPLES
462
+ ═══════════════════════════════════════════════════════════════════
463
+
464
+ Pattern A — local counter with useState:
465
+
466
+ return function App() {
467
+ const [count, setCount] = useState(0);
468
+ return html\`
469
+ <div style=\${{ padding: 16 }}>
470
+ <div>Count: \${count}</div>
471
+ <button onClick=\${() => setCount(count + 1)}>+1</button>
472
+ </div>
473
+ \`;
474
+ };
475
+
476
+ Pattern B — agent-owned counter:
477
+
478
+ return function App({ count = 0 }) {
479
+ return html\`
480
+ <div>
481
+ <div>Count: \${count}</div>
482
+ <button onClick=\${() => loxia.sendEvent({ type: 'increment' })}>
483
+ +1
484
+ </button>
485
+ </div>
486
+ \`;
487
+ };
488
+ // Agent handles the 'increment' event and calls widget.update({ count: count + 1 }).
489
+
490
+ PREFERRED: bare identifiers. They always work, no namespace juggling:
491
+ // just use them directly, no destructure, no import:
492
+ const [n, setN] = useState(0);
493
+ useEffect(() => { ... }, []);
494
+
495
+ Namespace destructure patterns (all equivalent, all work):
496
+ const { useState, useEffect } = h;
497
+ const { useState, useEffect } = htmPreact;
498
+ const { useState, useEffect } = preact;
499
+ const { useState, useEffect } = preactHooks;
500
+ const { useState, useEffect } = React;
501
+ const { useState, useEffect } = hooks;
502
+
503
+ The following global names ALL point at the same hooks bundle so you
504
+ can reach for whichever name you remember — the widget runtime aliases
505
+ them aggressively:
506
+
507
+ htmPreact, htm_preact, preactHtm, htm, Htm,
508
+ preact, Preact, preactjs,
509
+ preactHooks, PreactHooks, preact_hooks, hooks, Hooks,
510
+ React, react, reactHooks, ReactHooks, react_hooks,
511
+ preactStandalone, preact_standalone,
512
+ ReactDOM.render(vnode, target), ReactDOM.createRoot(x).render(vnode)
513
+
514
+ If you reach for a name not in that list, add a fallback:
515
+ const useState = (globalThis.useState || h.useState);
516
+
517
+ NOT IMPLEMENTED (will throw a specific "X is not implemented" error
518
+ you'll see in the next-turn feedback — then switch to the supported
519
+ APIs): useLayoutEffect, useImperativeHandle, useContext, useReducer,
520
+ useDeferredValue, useTransition, useId, useSyncExternalStore,
521
+ createContext, createRef, forwardRef, memo, lazy, Suspense, StrictMode,
522
+ Children, cloneElement, isValidElement.
523
+
524
+ ═══════════════════════════════════════════════════════════════════
525
+ FEEDBACK LOOP
526
+ ═══════════════════════════════════════════════════════════════════
527
+
528
+ When the iframe throws (undefined identifier, bad syntax, handler
529
+ error), a tool result arrives on your NEXT turn shaped like a normal
530
+ failure:
531
+
532
+ [widget] {
533
+ "toolId": "widget",
534
+ "status": "failed",
535
+ "result": {
536
+ "success": false,
537
+ "action": "render",
538
+ "widgetId": "<id>",
539
+ "error": "WIDGET RENDER ERROR — widget \"<id>\" failed during \"<phase>\": <message>. Your widget code did not execute; fix the error and call widget.render again.",
540
+ "phase": "render" | "runtime" | "async" | "runtime-setup",
541
+ "message": "<short cause>",
542
+ "stack": "<stack or (no stack)>"
543
+ }
544
+ }
545
+
546
+ IMPORTANT: the tool CALL returning { success: true } only means the
547
+ backend STORED your widget — it does NOT mean it rendered. If the
548
+ next turn shows a widget tool-result with status:"failed" or the
549
+ error string "WIDGET RENDER ERROR", your widget is broken. FIX the
550
+ specific error from result.message (not guess a different cause) and
551
+ re-issue widget.render.
552
+
553
+ Repeated identical errors are suppressed to protect your context —
554
+ you get at most 5 distinct errors per widget. If you keep hitting
555
+ the same cause, re-read GLOBALS AVAILABLE above before trying again.
556
+
557
+ Common first-try mistakes that produce __widgetError:
558
+ - Using hooks (useState, useEffect, useMemo, useRef) → ReferenceError
559
+ - Importing / requiring packages → ReferenceError: require not defined
560
+ - Calling fetch / XMLHttpRequest → blocked by CSP
561
+ - Writing bare JSX angle-bracket syntax → parse error
562
+ - Assuming React / ReactDOM / preact are globals → ReferenceError
563
+
564
+ PARAMETERS:
565
+ - kind (required): 'html' | 'jsx'
566
+ - content (required): the payload. HTML string for 'html'; JS render function body for 'jsx'
567
+ - widgetId (optional): stable id so you can update/destroy later. Auto-generated if omitted.
568
+ - props (optional): initial props for jsx widgets; merged on render and update.
569
+
570
+ LIMITS:
571
+ - Max ${WIDGET_LIMITS.MAX_CONTENT_BYTES / 1024} KB per widget payload
572
+ - Max ${WIDGET_LIMITS.MAX_WIDGETS_PER_AGENT} concurrent widgets per agent (oldest evicted)
573
+
574
+ SAFETY:
575
+ - Widgets run in a sandboxed iframe with null origin. They cannot read your
576
+ cookies, make network requests, or touch the parent page.
577
+ - If your content includes credential-shaped prompts ("password", "login",
578
+ "credit card" etc.), the user will see a stronger confirmation modal
579
+ before rendering. That is normal and expected — phishing-shape detection
580
+ protects users; it does not indicate a bug in your widget.
581
+ - The user may disable custom widgets entirely per-agent via the widget
582
+ configurator. When disabled, render calls return { disabled: true }
583
+ and the widget is not shown.`;
584
+ }
585
+
586
+ getSupportedActions() {
587
+ return [
588
+ 'render', 'update', 'destroy', 'list', 'list-capabilities',
589
+ // Versioning — each render appends a new version. Agent (and
590
+ // user) can promote a version as main or fetch any version's content.
591
+ 'list-versions', 'get-version', 'set-main',
592
+ // Gallery — cross-session catalog of shared widget templates.
593
+ 'share-to-gallery', 'unshare-from-gallery',
594
+ 'list-gallery', 'render-from-gallery',
595
+ // Upgrade-awareness for gallery-linked widgets.
596
+ 'check-upgrade', 'apply-upgrade',
597
+ ];
598
+ }
599
+
600
+ async execute(params, context = {}) {
601
+ if (!params || typeof params !== 'object') {
602
+ return { success: false, error: 'params must be an object' };
603
+ }
604
+ const action = params.action || 'render';
605
+ const agentId = context?.agentId || 'unknown';
606
+
607
+ // Per-agent kill switch via toolConfig. When the agent has not been
608
+ // granted custom-widget permission, calls short-circuit with a
609
+ // helpful message so the agent knows not to retry.
610
+ const effectiveConfig = this.getEffectiveConfig(context, { allowCustomCode: false });
611
+ const allowed = effectiveConfig.allowCustomCode !== false; // default allowed when unspecified
612
+
613
+ switch (action) {
614
+ case 'render': return this._render(agentId, params, { allowed, context });
615
+ case 'update': return this._update(agentId, params, { allowed });
616
+ case 'destroy': return this._destroy(agentId, params);
617
+ case 'list': return this._list(agentId);
618
+ case 'list-capabilities': return this._listCapabilities();
619
+ case 'list-versions': return this._listVersions(agentId, params);
620
+ case 'get-version': return this._getVersion(agentId, params);
621
+ case 'set-main': return this._setMain(agentId, params);
622
+ case 'share-to-gallery': return this._shareToGallery(agentId, params, context);
623
+ case 'unshare-from-gallery': return this._unshareFromGallery(agentId, params);
624
+ case 'list-gallery': return this._listGallery(params);
625
+ case 'render-from-gallery': return this._renderFromGallery(agentId, params, { allowed });
626
+ case 'check-upgrade': return this._checkUpgrade(agentId, params);
627
+ case 'apply-upgrade': return this._applyUpgrade(agentId, params, { allowed });
628
+ default: return { success: false, error: `Unknown action: ${action}. Supported: ${this.getSupportedActions().join(', ')}` };
629
+ }
630
+ }
631
+
632
+ /**
633
+ * Machine-readable capabilities report. Returned to the agent on
634
+ * `widget.list-capabilities` AND embedded in every render-failure so
635
+ * the agent has a programmatic way to see what IS available without
636
+ * re-parsing the long prose description.
637
+ *
638
+ * Keep this list IN SYNC with the runtime bundle — the tests pin this
639
+ * against runtime/bundle.js so drift is caught at CI time.
640
+ */
641
+ _listCapabilities() {
642
+ return {
643
+ success: true,
644
+ action: 'list-capabilities',
645
+ capabilities: {
646
+ kinds: {
647
+ html: 'static HTML+CSS, no scripts (sandbox="")',
648
+ jsx: 'Preact + htm runtime; hooks (useState/useEffect/...), h(), html``',
649
+ webcomponent: 'class extends LoxiaElement; standard web platform, no custom runtime quirks. RECOMMENDED for new interactive widgets.',
650
+ },
651
+ webcomponent: {
652
+ baseClass: 'LoxiaElement (extends HTMLElement)',
653
+ mountApi: 'loxia.render(YourClass, initialProps) — registers a unique tag, instantiates, mounts to #root',
654
+ ergonomics: {
655
+ 'class field state = {...}': 'initial state',
656
+ 'this.setState(updater)': 'merge OR pass a function for prev-state updates; triggers re-render',
657
+ 'this.template(state) → string': 'override; return innerHTML',
658
+ 'this.emit(type, payload)': 'send event to agent (alias for loxia.sendEvent with type set)',
659
+ 'this.handleUpdate(newProps)': 'called when agent posts widget.update; default setState(newProps)',
660
+ 'this.onMount() / this.onUnmount()': 'lifecycle; called from connectedCallback / disconnectedCallback',
661
+ 'this.afterRender(root)': 'called AFTER every render (including post-setState). Sanctioned hook for manual addEventListener — listeners attached here survive setState because they\'re re-attached on the fresh DOM. (onMount fires only once; addEventListener calls there die on the first re-render.)',
662
+ },
663
+ autoWiredAttrs: {
664
+ 'data-bind="key"': 'input/change → setState({key: value}) (numeric inputs auto-coerced)',
665
+ 'data-emit="name"': 'click → emit(name, { state }) — sends to AGENT',
666
+ 'data-on-<event>="methodName"': 'ANY DOM event (click, input, keydown, pointerdown, dragover, wheel, transitionend, …) → this.methodName(event) — calls LOCAL instance method',
667
+ 'data-payload="{...}"': 'JSON payload merged into the emit (optional, data-emit only)',
668
+ },
669
+ escapeHatch: 'You can extend HTMLElement directly. loxia.render still mounts you. Use attributeChangedCallback for prop updates in that path.',
670
+ },
671
+ // Every name that can appear as a bare identifier and works.
672
+ globals: [
673
+ // VDOM primitives
674
+ 'h', 'html', 'createElement', 'Fragment',
675
+ // Hooks (all implemented — safe to use)
676
+ 'useState', 'useEffect', 'useMemo', 'useCallback', 'useRef', 'useReducer',
677
+ // Component primitives
678
+ 'LoxiaCard', 'LoxiaButton', 'LoxiaInput', 'LoxiaText',
679
+ 'LoxiaMetric', 'LoxiaRow', 'LoxiaCol',
680
+ ],
681
+ // Objects the agent can use as namespaces — all alias the same bundle.
682
+ namespaces: {
683
+ aliased: [
684
+ 'htmPreact', 'htm_preact', 'preactHtm', 'htm', 'Htm',
685
+ 'preact', 'Preact', 'preactjs',
686
+ 'preactHooks', 'PreactHooks', 'preact_hooks', 'hooks', 'Hooks',
687
+ 'React', 'react', 'reactHooks', 'ReactHooks', 'react_hooks',
688
+ 'preactStandalone', 'preact_standalone',
689
+ ],
690
+ reactDomShim: ['ReactDOM.render(vnode, el)', 'ReactDOM.createRoot(el).render(vnode)'],
691
+ },
692
+ // loxia namespace — widget-specific APIs.
693
+ loxia: {
694
+ 'loxia.render(Component, props)': 'mount the root component (call this last)',
695
+ 'loxia.sendEvent({type, payload})': 'send event to the agent; arrives next turn as a tool-result',
696
+ 'loxia.onUpdate(fn)': 'subscribe to prop updates from agent widget.update',
697
+ 'loxia.requestHeight(px)': 'manually override iframe height',
698
+ },
699
+ // Browser APIs the iframe has (standard, always available).
700
+ browserApis: [
701
+ 'document', 'window', 'console', 'setTimeout', 'setInterval',
702
+ 'clearTimeout', 'clearInterval', 'Promise', 'JSON', 'Math',
703
+ 'Date', 'Array', 'Object', 'String', 'Number', 'Boolean',
704
+ 'Map', 'Set', 'Symbol', 'Error',
705
+ ],
706
+ // Named errors — using any of these throws with a specific message.
707
+ notImplemented: {
708
+ classes: ['Component', 'PureComponent'],
709
+ functions: [
710
+ 'useLayoutEffect', 'useImperativeHandle', 'useContext',
711
+ 'useDeferredValue', 'useTransition', 'useId',
712
+ 'useSyncExternalStore', 'useErrorBoundary',
713
+ 'createContext', 'createRef', 'forwardRef', 'memo',
714
+ 'lazy', 'Suspense', 'StrictMode',
715
+ 'Children', 'cloneElement', 'isValidElement',
716
+ ],
717
+ rewritePaths: {
718
+ 'useContext(Ctx)': 'prop-drill, OR move the state to the agent via sendEvent + widget.update',
719
+ 'useLayoutEffect': 'useEffect is a close substitute (fires after paint instead of before)',
720
+ 'useReducer': 'IMPLEMENTED — you can use it directly. (Older docs said not; now supported.)',
721
+ 'forwardRef': 'refs to child components are not supported; use useRef for DOM nodes only',
722
+ 'memo(Component)': 'memoize derived values with useMemo inside the component instead',
723
+ 'Component / class': 'rewrite as a function component — function App(){ const [s,setS]=useState(); ... }',
724
+ },
725
+ },
726
+ // Hard errors — things that throw ReferenceError.
727
+ hardErrors: [
728
+ 'fetch', 'XMLHttpRequest', 'WebSocket',
729
+ 'localStorage', 'sessionStorage', 'cookies', 'indexedDB',
730
+ 'import', 'require', 'export',
731
+ 'process', 'global', 'Buffer',
732
+ 'Any npm package (lodash, d3, chart.js, react-router, etc.)',
733
+ ],
734
+ // Security and scope constraints — immutable, just informational.
735
+ constraints: {
736
+ sandbox: 'null-origin iframe — no cookies, no network, no parent-page access',
737
+ maxContentBytes: WIDGET_LIMITS.MAX_CONTENT_BYTES,
738
+ maxWidgetsPerAgent: WIDGET_LIMITS.MAX_WIDGETS_PER_AGENT,
739
+ hooksScope: 'hooks are call-order-keyed on the ROOT component — nested components can\'t use hooks; lift state up',
740
+ stateModel: 'function components only, no classes',
741
+ },
742
+ },
743
+ };
744
+ }
745
+
746
+ _render(agentId, params, { allowed, context }) {
747
+ const v = validateRenderParams(params);
748
+ if (!v.valid) return { success: false, error: v.error };
749
+
750
+ if (!allowed) {
751
+ return {
752
+ success: false,
753
+ disabled: true,
754
+ error: 'Custom widgets are disabled for this agent. Enable in the widget configurator.',
755
+ };
756
+ }
757
+
758
+ const widgetId = params.widgetId || this._generateWidgetId(params.kind);
759
+ const newVersion = buildVersion({
760
+ kind: params.kind,
761
+ content: params.content,
762
+ props: params.props,
763
+ });
764
+
765
+ const widget = this._appendVersion(agentId, widgetId, newVersion);
766
+
767
+ this.logger?.info?.('Widget rendered', {
768
+ agentId, widgetId,
769
+ kind: widget.kind,
770
+ size: widget.size,
771
+ versionId: newVersion.versionId,
772
+ versionCount: widget.versions.length,
773
+ phishingFlags: newVersion.phishingHits.length,
774
+ });
775
+
776
+ this._emitChange(agentId, widgetId, 'rendered', widget);
777
+
778
+ // Static analysis — surface "looks broken even before rendering"
779
+ // findings (typo attributes, unreferenced handler-shaped methods).
780
+ // Fed back through the tool result so the agent's NEXT turn sees
781
+ // them and can ship a corrected render without waiting for the
782
+ // user to interact with a half-broken widget. iframe-side runtime
783
+ // warnings still fire when the widget actually mounts; the two
784
+ // sources are complementary (this catches things at submission
785
+ // time, the runtime catches things that depend on actual DOM
786
+ // shape after innerHTML).
787
+ const { warnings: codeWarnings } = analyzeWidgetCode(params.content, params.kind);
788
+
789
+ return {
790
+ success: true,
791
+ action: 'render',
792
+ widgetId,
793
+ versionId: newVersion.versionId,
794
+ versionCount: widget.versions.length,
795
+ widget,
796
+ ...(codeWarnings.length > 0 && { warnings: codeWarnings }),
797
+ };
798
+ }
799
+
800
+ _update(agentId, params, { allowed }) {
801
+ const v = validateUpdateParams(params);
802
+ if (!v.valid) return { success: false, error: v.error };
803
+
804
+ if (!allowed) {
805
+ return { success: false, disabled: true, error: 'Custom widgets are disabled for this agent.' };
806
+ }
807
+
808
+ const agentWidgets = this._widgetsByAgent.get(agentId);
809
+ const widget = agentWidgets?.get(params.widgetId);
810
+ if (!widget) {
811
+ return { success: false, error: `Widget not found: ${params.widgetId}` };
812
+ }
813
+
814
+ widget.props = { ...widget.props, ...params.props };
815
+ widget.updatedAt = new Date().toISOString();
816
+
817
+ this.logger?.info?.('Widget updated', { agentId, widgetId: params.widgetId });
818
+ this._emitChange(agentId, params.widgetId, 'updated', widget);
819
+ return { success: true, action: 'update', widgetId: params.widgetId, widget };
820
+ }
821
+
822
+ _destroy(agentId, params) {
823
+ const v = validateDestroyParams(params);
824
+ if (!v.valid) return { success: false, error: v.error };
825
+ const agentWidgets = this._widgetsByAgent.get(agentId);
826
+ if (!agentWidgets?.has(params.widgetId)) {
827
+ return { success: false, error: `Widget not found: ${params.widgetId}` };
828
+ }
829
+ agentWidgets.delete(params.widgetId);
830
+ this.logger?.info?.('Widget destroyed', { agentId, widgetId: params.widgetId });
831
+ this._emitChange(agentId, params.widgetId, 'destroyed', null);
832
+ return { success: true, action: 'destroy', widgetId: params.widgetId };
833
+ }
834
+
835
+ _list(agentId) {
836
+ const agentWidgets = this._widgetsByAgent.get(agentId);
837
+ if (!agentWidgets) return { success: true, widgets: [] };
838
+ // Project to a list-summary shape — names match what the frontend
839
+ // artifacts panel needs to render a card without fetching content.
840
+ const widgets = Array.from(agentWidgets.values()).map(w => ({
841
+ widgetId: w.widgetId,
842
+ kind: w.kind,
843
+ createdAt: w.createdAt,
844
+ updatedAt: w.updatedAt,
845
+ lastRenderedAt: w.lastRenderedAt,
846
+ size: w.size,
847
+ phishingHits: w.phishingHits,
848
+ versionCount: w.versions.length,
849
+ mainVersionId: w.mainVersionId,
850
+ // Gallery linkage (filled in by Phase 4 — null today). Listed
851
+ // here so the frontend can render the share state without a
852
+ // second round-trip.
853
+ linkedGalleryTemplateId: w.linkedGalleryTemplateId || null,
854
+ linkedGalleryVersion: w.linkedGalleryVersion || null,
855
+ divergedFromGallery: !!w.divergedFromGallery,
856
+ }));
857
+ return { success: true, widgets };
858
+ }
859
+
860
+ /**
861
+ * `list-versions { widgetId }` — return the version history for a
862
+ * widget without including each version's content. Useful for the
863
+ * artifacts panel's version dropdown.
864
+ */
865
+ _listVersions(agentId, params) {
866
+ const v = validateListVersionsParams(params);
867
+ if (!v.valid) return { success: false, error: v.error };
868
+ const widget = this._widgetsByAgent.get(agentId)?.get(params.widgetId);
869
+ if (!widget) return { success: false, error: `Widget not found: ${params.widgetId}` };
870
+ return {
871
+ success: true,
872
+ action: 'list-versions',
873
+ widgetId: widget.widgetId,
874
+ mainVersionId: widget.mainVersionId,
875
+ // Chronological — oldest first; the latest version is at the end.
876
+ versions: widget.versions.map(v => ({
877
+ versionId: v.versionId,
878
+ kind: v.kind,
879
+ size: v.size,
880
+ createdAt: v.createdAt,
881
+ phishingHits: v.phishingHits,
882
+ // content omitted on purpose — fetch with get-version
883
+ })),
884
+ };
885
+ }
886
+
887
+ /** `get-version { widgetId, versionId }` — fetch a specific version's content. */
888
+ _getVersion(agentId, params) {
889
+ const v = validateGetVersionParams(params);
890
+ if (!v.valid) return { success: false, error: v.error };
891
+ const widget = this._widgetsByAgent.get(agentId)?.get(params.widgetId);
892
+ if (!widget) return { success: false, error: `Widget not found: ${params.widgetId}` };
893
+ const version = widget.versions.find(x => x.versionId === params.versionId);
894
+ if (!version) {
895
+ return {
896
+ success: false,
897
+ error: `Version not found: ${params.versionId}. Available: ${widget.versions.map(x => x.versionId).join(', ')}`,
898
+ };
899
+ }
900
+ return { success: true, action: 'get-version', widgetId: widget.widgetId, version };
901
+ }
902
+
903
+ /**
904
+ * `set-main { widgetId, versionId }` — promote a version to be the
905
+ * active one. The widget's mirrored top-level fields update so the
906
+ * frontend's next render uses the chosen content.
907
+ */
908
+ _setMain(agentId, params) {
909
+ const v = validateSetMainParams(params);
910
+ if (!v.valid) return { success: false, error: v.error };
911
+ const widget = this._widgetsByAgent.get(agentId)?.get(params.widgetId);
912
+ if (!widget) return { success: false, error: `Widget not found: ${params.widgetId}` };
913
+ const exists = widget.versions.some(x => x.versionId === params.versionId);
914
+ if (!exists) {
915
+ return {
916
+ success: false,
917
+ error: `Version not found: ${params.versionId}. Available: ${widget.versions.map(x => x.versionId).join(', ')}`,
918
+ };
919
+ }
920
+ widget.mainVersionId = params.versionId;
921
+ mirrorActiveVersion(widget);
922
+ this.logger?.info?.('Widget main version set', {
923
+ agentId, widgetId: widget.widgetId, mainVersionId: params.versionId,
924
+ });
925
+ this._emitChange(agentId, widget.widgetId, 'main-set', widget);
926
+ return { success: true, action: 'set-main', widgetId: widget.widgetId, widget };
927
+ }
928
+
929
+ /**
930
+ * Append a new version to a widget (or create a new widget for the
931
+ * agent if none exists). Returns the (mutated) widget record.
932
+ *
933
+ * Enforces TWO independent caps:
934
+ * - MAX_VERSIONS_PER_WIDGET — drop oldest version once we exceed
935
+ * - MAX_WIDGETS_PER_AGENT — drop oldest widget once we exceed
936
+ *
937
+ * Mark `divergedFromGallery` if the widget was linked to a gallery
938
+ * template — once the agent renders new content, it's no longer
939
+ * tracking upstream and shouldn't show upgrade prompts.
940
+ *
941
+ * @private
942
+ */
943
+ _appendVersion(agentId, widgetId, version) {
944
+ let agentWidgets = this._widgetsByAgent.get(agentId);
945
+ if (!agentWidgets) {
946
+ agentWidgets = new Map();
947
+ this._widgetsByAgent.set(agentId, agentWidgets);
948
+ }
949
+
950
+ let widget = agentWidgets.get(widgetId);
951
+ const now = new Date().toISOString();
952
+
953
+ if (!widget) {
954
+ widget = {
955
+ widgetId,
956
+ versions: [version],
957
+ mainVersionId: version.versionId,
958
+ createdAt: now,
959
+ // Gallery linkage fields — initialized null; render-from-gallery
960
+ // (Phase 4) sets them; subsequent local renders will set
961
+ // divergedFromGallery=true via the branch below.
962
+ linkedGalleryTemplateId: null,
963
+ linkedGalleryVersion: null,
964
+ divergedFromGallery: false,
965
+ };
966
+ agentWidgets.set(widgetId, widget);
967
+ } else {
968
+ // Bump LRU recency by re-inserting at the end of the agent's map.
969
+ agentWidgets.delete(widgetId);
970
+ agentWidgets.set(widgetId, widget);
971
+
972
+ widget.versions.push(version);
973
+ widget.mainVersionId = version.versionId;
974
+
975
+ // Cap version history per widget — drop oldest, keep main if it
976
+ // would otherwise be evicted (rare: would need >MAX renders since
977
+ // mainVersionId was set on a since-evicted version).
978
+ while (widget.versions.length > WIDGET_LIMITS.MAX_VERSIONS_PER_WIDGET) {
979
+ const evicted = widget.versions.shift();
980
+ this.logger?.debug?.('Widget version evicted', {
981
+ agentId, widgetId, versionId: evicted.versionId,
982
+ });
983
+ if (evicted.versionId === widget.mainVersionId) {
984
+ // Defensive: re-pin to oldest remaining version so we never
985
+ // dangle an invalid mainVersionId.
986
+ widget.mainVersionId = widget.versions[0].versionId;
987
+ }
988
+ }
989
+
990
+ // Linked-to-gallery widgets diverge as soon as the agent renders
991
+ // anything that isn't the linked content. We don't compare bytes
992
+ // (cheaper + safer to assume divergence on any local render).
993
+ if (widget.linkedGalleryTemplateId) {
994
+ widget.divergedFromGallery = true;
995
+ }
996
+ }
997
+
998
+ mirrorActiveVersion(widget);
999
+
1000
+ // Per-agent widget cap.
1001
+ while (agentWidgets.size > WIDGET_LIMITS.MAX_WIDGETS_PER_AGENT) {
1002
+ const oldestKey = agentWidgets.keys().next().value;
1003
+ agentWidgets.delete(oldestKey);
1004
+ this.logger?.debug?.('Widget evicted (LRU)', { agentId, widgetId: oldestKey });
1005
+ }
1006
+ return widget;
1007
+ }
1008
+
1009
+ _generateWidgetId(kind) {
1010
+ const n = this._nextAutoId++;
1011
+ return `w-${kind}-${n}-${Date.now().toString(36)}`;
1012
+ }
1013
+
1014
+ // ──────────────────────────────────────────────────────────────────
1015
+ // Gallery — cross-session shared widget catalog.
1016
+ // ──────────────────────────────────────────────────────────────────
1017
+
1018
+ /**
1019
+ * `share-to-gallery { widgetId, title?, tags? }` — publish the
1020
+ * widget's CURRENT MAIN VERSION to the gallery as a new template.
1021
+ * Re-sharing the same widget bumps the template's version (so other
1022
+ * sessions can detect upgrades). The agent's local widget gets a
1023
+ * `linkedGalleryTemplateId` pointing at the new template — until the
1024
+ * agent renders new content and `divergedFromGallery` flips.
1025
+ */
1026
+ async _shareToGallery(agentId, params, context) {
1027
+ const widgetId = params?.widgetId;
1028
+ if (typeof widgetId !== 'string' || !widgetId) {
1029
+ return { success: false, error: 'widgetId is required' };
1030
+ }
1031
+ const widget = this._widgetsByAgent.get(agentId)?.get(widgetId);
1032
+ if (!widget) return { success: false, error: `Widget not found: ${widgetId}` };
1033
+
1034
+ const gallery = this._galleryStore();
1035
+ try {
1036
+ const { templateId, version, entry } = await gallery.share(widget, {
1037
+ agentId,
1038
+ agentName: context?.agentName || null,
1039
+ sessionId: context?.sessionId || null,
1040
+ title: params.title,
1041
+ tags: params.tags,
1042
+ forkedFrom: widget.linkedGalleryTemplateId || null,
1043
+ });
1044
+ // Link the widget to the freshly-created template. Reset the
1045
+ // diverged flag — we just synced upstream.
1046
+ widget.linkedGalleryTemplateId = templateId;
1047
+ widget.linkedGalleryVersion = version;
1048
+ widget.divergedFromGallery = false;
1049
+ this.logger?.info?.('Widget shared to gallery', { agentId, widgetId, templateId, version });
1050
+ this._emitChange(agentId, widgetId, 'shared', widget, { templateId, templateVersion: version });
1051
+ return {
1052
+ success: true, action: 'share-to-gallery',
1053
+ templateId, version, entry,
1054
+ widget: this._summarizeWidget(widget),
1055
+ };
1056
+ } catch (err) {
1057
+ return { success: false, error: err.message };
1058
+ }
1059
+ }
1060
+
1061
+ /**
1062
+ * `unshare-from-gallery { templateId }` — remove a template from the
1063
+ * gallery. Local widgets keep working but lose their upstream link
1064
+ * (cleared on the matching widget if any).
1065
+ */
1066
+ async _unshareFromGallery(agentId, params) {
1067
+ const templateId = params?.templateId;
1068
+ if (typeof templateId !== 'string' || !templateId) {
1069
+ return { success: false, error: 'templateId is required' };
1070
+ }
1071
+ const gallery = this._galleryStore();
1072
+ const removed = await gallery.unshare(templateId);
1073
+ // Clear the link on any local widget that pointed at this template.
1074
+ const agentWidgets = this._widgetsByAgent.get(agentId);
1075
+ if (agentWidgets) {
1076
+ for (const w of agentWidgets.values()) {
1077
+ if (w.linkedGalleryTemplateId === templateId) {
1078
+ w.linkedGalleryTemplateId = null;
1079
+ w.linkedGalleryVersion = null;
1080
+ w.divergedFromGallery = false;
1081
+ // Each affected widget gets its own change event so the
1082
+ // frontend can refresh badges without a full re-fetch.
1083
+ this._emitChange(agentId, w.widgetId, 'unshared', w, { templateId });
1084
+ }
1085
+ }
1086
+ }
1087
+ return {
1088
+ success: removed,
1089
+ action: 'unshare-from-gallery',
1090
+ templateId,
1091
+ removed,
1092
+ ...(removed ? {} : { error: `Template not found: ${templateId}` }),
1093
+ };
1094
+ }
1095
+
1096
+ /**
1097
+ * `list-gallery { tag?, agentId? }` — list templates available in
1098
+ * the gallery, optionally filtered. Content is included so the agent
1099
+ * can preview before render-from-gallery; for very large galleries a
1100
+ * future call will return summaries only.
1101
+ */
1102
+ async _listGallery(params = {}) {
1103
+ const gallery = this._galleryStore();
1104
+ const filter = {};
1105
+ if (params.tag) filter.tag = String(params.tag).slice(0, 32);
1106
+ if (params.agentId) filter.agentId = String(params.agentId).slice(0, 128);
1107
+ const entries = await gallery.list(filter);
1108
+ return {
1109
+ success: true,
1110
+ action: 'list-gallery',
1111
+ count: entries.length,
1112
+ templates: entries.map(e => ({
1113
+ templateId: e.templateId,
1114
+ version: e.version,
1115
+ title: e.title,
1116
+ kind: e.kind,
1117
+ tags: e.tags,
1118
+ sharedBy: e.sharedBy,
1119
+ sharedAt: e.sharedAt,
1120
+ renderCount: e.renderCount,
1121
+ starred: e.starred,
1122
+ forkedFrom: e.forkedFrom,
1123
+ phishingHits: e.phishingHits,
1124
+ size: (e.content || '').length,
1125
+ })),
1126
+ };
1127
+ }
1128
+
1129
+ /**
1130
+ * `render-from-gallery { templateId, widgetId?, props? }` — instantiate
1131
+ * a gallery template into the agent's local widgets. The new local
1132
+ * widget is LINKED to the gallery template via `linkedGalleryTemplateId`,
1133
+ * so the upgrade-prompt machinery (Phase 4) can later compare versions.
1134
+ */
1135
+ async _renderFromGallery(agentId, params, { allowed }) {
1136
+ const templateId = params?.templateId;
1137
+ if (typeof templateId !== 'string' || !templateId) {
1138
+ return { success: false, error: 'templateId is required' };
1139
+ }
1140
+ if (!allowed) {
1141
+ return {
1142
+ success: false, disabled: true,
1143
+ error: 'Custom widgets are disabled for this agent. Enable in the widget configurator.',
1144
+ };
1145
+ }
1146
+ const gallery = this._galleryStore();
1147
+ const tpl = await gallery.get(templateId);
1148
+ if (!tpl) return { success: false, error: `Template not found: ${templateId}` };
1149
+
1150
+ const widgetId = params.widgetId || this._generateWidgetId(tpl.kind);
1151
+ const merged = { ...(tpl.defaultProps || {}), ...(params.props || {}) };
1152
+
1153
+ const newVersion = buildVersion({
1154
+ kind: tpl.kind,
1155
+ content: tpl.content,
1156
+ props: merged,
1157
+ });
1158
+ // Append normally, then mark linkage. Note: _appendVersion would
1159
+ // otherwise flip divergedFromGallery to true, so we set linkage
1160
+ // AFTER the append (to a fresh widget; no prior linkage).
1161
+ const widget = this._appendVersion(agentId, widgetId, newVersion);
1162
+ widget.linkedGalleryTemplateId = templateId;
1163
+ widget.linkedGalleryVersion = tpl.version;
1164
+ widget.divergedFromGallery = false;
1165
+
1166
+ // Bump the template's render counter — useful "popular templates" metric.
1167
+ await gallery.bumpRenderCount(templateId);
1168
+
1169
+ this.logger?.info?.('Widget rendered from gallery', { agentId, widgetId, templateId, version: tpl.version });
1170
+ this._emitChange(agentId, widgetId, 'rendered', widget, { templateId, templateVersion: tpl.version });
1171
+ return {
1172
+ success: true, action: 'render-from-gallery',
1173
+ widgetId, versionId: newVersion.versionId,
1174
+ templateId, templateVersion: tpl.version,
1175
+ widget,
1176
+ };
1177
+ }
1178
+
1179
+ /**
1180
+ * `check-upgrade { widgetId }` — for a gallery-linked widget,
1181
+ * report whether a newer template version is available.
1182
+ *
1183
+ * Result shape:
1184
+ * { success, hasUpgrade, currentVersion, latestVersion, latestTemplateId,
1185
+ * diverged, sharedAt, ... }
1186
+ *
1187
+ * Returns hasUpgrade=false (with a reason) when the widget isn't
1188
+ * linked OR has diverged (local edits broke the link).
1189
+ */
1190
+ async _checkUpgrade(agentId, params) {
1191
+ const widgetId = params?.widgetId;
1192
+ if (typeof widgetId !== 'string' || !widgetId) {
1193
+ return { success: false, error: 'widgetId is required' };
1194
+ }
1195
+ const widget = this._widgetsByAgent.get(agentId)?.get(widgetId);
1196
+ if (!widget) return { success: false, error: `Widget not found: ${widgetId}` };
1197
+
1198
+ if (!widget.linkedGalleryTemplateId) {
1199
+ return {
1200
+ success: true, action: 'check-upgrade', widgetId,
1201
+ hasUpgrade: false, reason: 'not-linked',
1202
+ };
1203
+ }
1204
+ if (widget.divergedFromGallery) {
1205
+ return {
1206
+ success: true, action: 'check-upgrade', widgetId,
1207
+ hasUpgrade: false, reason: 'diverged',
1208
+ linkedTemplateId: widget.linkedGalleryTemplateId,
1209
+ currentVersion: widget.linkedGalleryVersion,
1210
+ };
1211
+ }
1212
+
1213
+ const gallery = this._galleryStore();
1214
+ const latest = await gallery.findLatestForOrigin(widget.linkedGalleryTemplateId);
1215
+ if (!latest) {
1216
+ // The linked template was removed from the gallery (unshared upstream).
1217
+ return {
1218
+ success: true, action: 'check-upgrade', widgetId,
1219
+ hasUpgrade: false, reason: 'linked-template-missing',
1220
+ linkedTemplateId: widget.linkedGalleryTemplateId,
1221
+ };
1222
+ }
1223
+ const hasUpgrade = latest.version > (widget.linkedGalleryVersion || 0);
1224
+ return {
1225
+ success: true, action: 'check-upgrade', widgetId,
1226
+ hasUpgrade,
1227
+ currentVersion: widget.linkedGalleryVersion,
1228
+ latestVersion: latest.version,
1229
+ latestTemplateId: latest.templateId,
1230
+ sharedAt: latest.sharedAt,
1231
+ sharedBy: latest.sharedBy,
1232
+ };
1233
+ }
1234
+
1235
+ /**
1236
+ * `apply-upgrade { widgetId }` — pull the latest gallery version
1237
+ * into the linked widget AS A NEW LOCAL VERSION. The user keeps the
1238
+ * old version in their history (so they can revert via set-main).
1239
+ *
1240
+ * Refuses if the widget has diverged — that means the user/agent
1241
+ * edited locally, and we don't want to silently overwrite their work.
1242
+ */
1243
+ async _applyUpgrade(agentId, params, { allowed }) {
1244
+ const widgetId = params?.widgetId;
1245
+ if (typeof widgetId !== 'string' || !widgetId) {
1246
+ return { success: false, error: 'widgetId is required' };
1247
+ }
1248
+ if (!allowed) {
1249
+ return {
1250
+ success: false, disabled: true,
1251
+ error: 'Custom widgets are disabled for this agent.',
1252
+ };
1253
+ }
1254
+ const widget = this._widgetsByAgent.get(agentId)?.get(widgetId);
1255
+ if (!widget) return { success: false, error: `Widget not found: ${widgetId}` };
1256
+ if (!widget.linkedGalleryTemplateId) {
1257
+ return { success: false, error: 'Widget is not linked to any gallery template.' };
1258
+ }
1259
+ if (widget.divergedFromGallery) {
1260
+ return {
1261
+ success: false,
1262
+ error: 'Widget has been edited locally and diverged from the gallery template. Refusing to overwrite local edits — share again or fork.',
1263
+ };
1264
+ }
1265
+
1266
+ const gallery = this._galleryStore();
1267
+ const latest = await gallery.findLatestForOrigin(widget.linkedGalleryTemplateId);
1268
+ if (!latest) {
1269
+ return { success: false, error: 'Linked gallery template no longer exists (was unshared upstream).' };
1270
+ }
1271
+ if (latest.version <= (widget.linkedGalleryVersion || 0)) {
1272
+ return {
1273
+ success: false,
1274
+ error: 'Already on the latest version. Nothing to upgrade.',
1275
+ };
1276
+ }
1277
+
1278
+ // Capture the linkage BEFORE we mutate it — we need to report the
1279
+ // "fromVersion" in the result, and the log entry needs the actual
1280
+ // upgrade arc, not the post-upgrade values.
1281
+ const fromTemplateId = widget.linkedGalleryTemplateId;
1282
+ const fromVersion = widget.linkedGalleryVersion;
1283
+
1284
+ // Append a new local version with the latest content. Important:
1285
+ // _appendVersion would normally flip divergedFromGallery=true on a
1286
+ // linked widget; we restore it to false (and bump linkedVersion)
1287
+ // AFTER the append because this IS the upstream sync.
1288
+ const newVersion = buildVersion({
1289
+ kind: latest.kind,
1290
+ content: latest.content,
1291
+ props: widget.props || latest.defaultProps || {},
1292
+ });
1293
+ this._appendVersion(agentId, widgetId, newVersion);
1294
+ widget.linkedGalleryTemplateId = latest.templateId;
1295
+ widget.linkedGalleryVersion = latest.version;
1296
+ widget.divergedFromGallery = false;
1297
+ await gallery.bumpRenderCount(latest.templateId);
1298
+ this.logger?.info?.('Widget upgraded from gallery', {
1299
+ agentId, widgetId,
1300
+ from: { templateId: fromTemplateId, version: fromVersion },
1301
+ to: { templateId: latest.templateId, version: latest.version },
1302
+ });
1303
+ this._emitChange(agentId, widgetId, 'upgrade-applied', widget, {
1304
+ fromVersion, toVersion: latest.version,
1305
+ });
1306
+ return {
1307
+ success: true, action: 'apply-upgrade', widgetId,
1308
+ newVersionId: newVersion.versionId,
1309
+ fromVersion,
1310
+ toVersion: latest.version,
1311
+ widget,
1312
+ };
1313
+ }
1314
+
1315
+ /** Compact summary used by share-to-gallery (no full versions[] payload). */
1316
+ _summarizeWidget(w) {
1317
+ return {
1318
+ widgetId: w.widgetId,
1319
+ kind: w.kind,
1320
+ versionCount: w.versions.length,
1321
+ mainVersionId: w.mainVersionId,
1322
+ linkedGalleryTemplateId: w.linkedGalleryTemplateId,
1323
+ linkedGalleryVersion: w.linkedGalleryVersion,
1324
+ divergedFromGallery: w.divergedFromGallery,
1325
+ };
1326
+ }
1327
+
1328
+ /** Test-only helper: total widget count across all agents. */
1329
+ _totalWidgetCount() {
1330
+ let n = 0;
1331
+ for (const m of this._widgetsByAgent.values()) n += m.size;
1332
+ return n;
1333
+ }
1334
+ }
1335
+
1336
+ export default WidgetTool;