onbuzz 4.7.2 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (994) hide show
  1. package/package.json +1 -1
  2. package/scripts/grounding-bench/bench.mjs +300 -0
  3. package/scripts/grounding-bench/cases.js +173 -0
  4. package/scripts/grounding-bench/imageBuilder.js +119 -0
  5. package/src/core/__tests__/agentScheduler.nativePromptPick.test.js +319 -0
  6. package/src/core/__tests__/agentScheduler.test.js +74 -0
  7. package/src/core/agentPool.js +12 -0
  8. package/src/core/agentScheduler.js +233 -7
  9. package/src/index.js +36 -0
  10. package/src/interfaces/webServer.js +42 -0
  11. package/src/services/__tests__/memoryService.test.js +521 -450
  12. package/src/services/__tests__/modelRouterNaming.test.js +111 -0
  13. package/src/services/__tests__/modelRouterService.test.js +477 -388
  14. package/src/services/aiService.js +136 -1
  15. package/src/services/grounding/GroundingModel.js +116 -0
  16. package/src/services/grounding/KimiAdapter.js +427 -0
  17. package/src/services/grounding/MockAdapter.js +125 -0
  18. package/src/services/grounding/__tests__/KimiAdapter.test.js +475 -0
  19. package/src/services/grounding/__tests__/MockAdapter.test.js +66 -0
  20. package/src/services/grounding/__tests__/groundingMetrics.test.js +156 -0
  21. package/src/services/grounding/__tests__/registry.test.js +122 -0
  22. package/src/services/grounding/constants.js +121 -0
  23. package/src/services/grounding/groundingMetrics.js +121 -0
  24. package/src/services/grounding/index.js +53 -0
  25. package/src/services/grounding/registry.js +125 -0
  26. package/src/services/grounding/types.js +108 -0
  27. package/src/services/memoryService.js +559 -521
  28. package/src/services/modelRouterService.js +433 -364
  29. package/src/services/tokenCountingService.js +2 -2
  30. package/src/tools/__tests__/agentCommunicationTool.test.js +752 -717
  31. package/src/tools/__tests__/baseTool.test.js +164 -0
  32. package/src/tools/__tests__/codeMapTool.test.js +388 -0
  33. package/src/tools/__tests__/foundryWebSearchTool.test.js +252 -0
  34. package/src/tools/__tests__/memoryTool.reminisce.test.js +364 -363
  35. package/src/tools/__tests__/memoryTool.test.js +391 -297
  36. package/src/tools/__tests__/parserHelpers.test.js +233 -0
  37. package/src/tools/__tests__/webTool.e2e.test.js +13 -1
  38. package/src/tools/agentCommunicationTool.js +1399 -1385
  39. package/src/tools/baseTool.js +102 -5
  40. package/src/tools/codeMapTool.js +794 -130
  41. package/src/tools/desktop/DesktopTool.js +638 -0
  42. package/src/tools/desktop/__tests__/DesktopTool.e2e.test.js +306 -0
  43. package/src/tools/desktop/__tests__/DesktopTool.test.js +507 -0
  44. package/src/tools/desktop/__tests__/osCapabilities.test.js +106 -0
  45. package/src/tools/desktop/__tests__/osController.test.js +364 -0
  46. package/src/tools/desktop/osCapabilities.js +248 -0
  47. package/src/tools/desktop/osController.js +491 -0
  48. package/src/tools/foundryWebSearchTool.js +273 -0
  49. package/src/tools/memoryTool.js +892 -820
  50. package/src/tools/openaiFunctionSchemas.js +14 -0
  51. package/src/tools/parserHelpers.js +296 -0
  52. package/src/tools/skillsTool.js +282 -277
  53. package/src/utilities/__tests__/planInjection.test.js +125 -0
  54. package/src/utilities/__tests__/tagParser.test.js +943 -887
  55. package/src/utilities/constants.js +19 -1
  56. package/src/utilities/planInjection.js +103 -0
  57. package/src/utilities/tagParser.js +918 -896
  58. package/web-ui/build/index.html +2 -2
  59. package/web-ui/build/static/1c-DGpIT7i5.js +1 -0
  60. package/web-ui/build/static/abap-5wFDdWLh.js +1 -0
  61. package/web-ui/build/static/abnf-BP1dpNSE.js +1 -0
  62. package/web-ui/build/static/abnf-DBEIAl8g.js +1 -0
  63. package/web-ui/build/static/accesslog-CWSM_T5E.js +1 -0
  64. package/web-ui/build/static/actionscript-DONkco1J.js +1 -0
  65. package/web-ui/build/static/actionscript-FqBYk5er.js +1 -0
  66. package/web-ui/build/static/ada-C2JLRIaM.js +1 -0
  67. package/web-ui/build/static/ada-gKiygTRK.js +1 -0
  68. package/web-ui/build/static/agda-CkSODqK2.js +1 -0
  69. package/web-ui/build/static/al-BJ_YR6p7.js +1 -0
  70. package/web-ui/build/static/angelscript-Dg2byMGg.js +1 -0
  71. package/web-ui/build/static/antlr4-BnpyaFNr.js +1 -0
  72. package/web-ui/build/static/apache-Dffxsd7O.js +1 -0
  73. package/web-ui/build/static/apacheconf-DLitjtWj.js +1 -0
  74. package/web-ui/build/static/apex-Drr_IvU2.js +1 -0
  75. package/web-ui/build/static/apl-CF6qxmXG.js +1 -0
  76. package/web-ui/build/static/applescript-CjOlw3b_.js +1 -0
  77. package/web-ui/build/static/applescript-DjkSl1Ry.js +1 -0
  78. package/web-ui/build/static/aql-KwVmK1gP.js +1 -0
  79. package/web-ui/build/static/arcade-CENSXx0R.js +1 -0
  80. package/web-ui/build/static/arduino-B3Ta9Fll.js +1 -0
  81. package/web-ui/build/static/arduino-CzcsaB9_.js +1 -0
  82. package/web-ui/build/static/arff-CMJSVt_O.js +1 -0
  83. package/web-ui/build/static/armasm-0zSgSPB4.js +1 -0
  84. package/web-ui/build/static/asciidoc-B8K5ctWq.js +1 -0
  85. package/web-ui/build/static/asciidoc-bk2Sg6b6.js +1 -0
  86. package/web-ui/build/static/asm6502-ji6zm4FQ.js +1 -0
  87. package/web-ui/build/static/asmatmel-DJqObM4Y.js +1 -0
  88. package/web-ui/build/static/aspectj-DqQKI7J5.js +1 -0
  89. package/web-ui/build/static/aspnet-9cenTxW7.js +1 -0
  90. package/web-ui/build/static/autohotkey-C6EhiZvl.js +1 -0
  91. package/web-ui/build/static/autohotkey-sTGJOvMM.js +1 -0
  92. package/web-ui/build/static/autoit-B0Im8iQ1.js +1 -0
  93. package/web-ui/build/static/autoit-CO6pUD0H.js +1 -0
  94. package/web-ui/build/static/avisynth-OvOHTfj5.js +1 -0
  95. package/web-ui/build/static/avrasm-BLWZ5Mye.js +1 -0
  96. package/web-ui/build/static/avro-idl-BB2ODvnw.js +1 -0
  97. package/web-ui/build/static/awk-_jhMabQ0.js +1 -0
  98. package/web-ui/build/static/axapta-DdBRgoYy.js +1 -0
  99. package/web-ui/build/static/bash-CsaRGXBQ.js +1 -0
  100. package/web-ui/build/static/bash-CxLFkwAC.js +1 -0
  101. package/web-ui/build/static/basic-BJyy7JJE.js +1 -0
  102. package/web-ui/build/static/basic-CrMb-gv0.js +1 -0
  103. package/web-ui/build/static/batch-BvcykMe5.js +1 -0
  104. package/web-ui/build/static/bbcode-EOBuY5Y6.js +1 -0
  105. package/web-ui/build/static/bicep-QkDJBA34.js +1 -0
  106. package/web-ui/build/static/birb-TAOxKurn.js +1 -0
  107. package/web-ui/build/static/bison-BEK6cnad.js +1 -0
  108. package/web-ui/build/static/bnf-DfEODxsr.js +1 -0
  109. package/web-ui/build/static/bnf-DhbMjsuA.js +1 -0
  110. package/web-ui/build/static/brainfuck-BoVocOa7.js +1 -0
  111. package/web-ui/build/static/brainfuck-DDC5QXPK.js +1 -0
  112. package/web-ui/build/static/brightscript-DNN598w2.js +1 -0
  113. package/web-ui/build/static/bro-Cn_jjZ8P.js +1 -0
  114. package/web-ui/build/static/bsl-CMCN75Gu.js +1 -0
  115. package/web-ui/build/static/c-DbOGQnEJ.js +1 -0
  116. package/web-ui/build/static/c-kggwYFsy.js +1 -0
  117. package/web-ui/build/static/c-like-BIsuUvof.js +1 -0
  118. package/web-ui/build/static/cal-DpgMsBZE.js +1 -0
  119. package/web-ui/build/static/capnproto-C1AHYI-M.js +1 -0
  120. package/web-ui/build/static/ceylon-pvJffDe1.js +1 -0
  121. package/web-ui/build/static/cfscript-C1qylu52.js +1 -0
  122. package/web-ui/build/static/chaiscript-D417WKRI.js +1 -0
  123. package/web-ui/build/static/cil-CjbZHbcY.js +1 -0
  124. package/web-ui/build/static/clean-Dvc6R-F2.js +1 -0
  125. package/web-ui/build/static/clojure-CSVRQPMQ.js +1 -0
  126. package/web-ui/build/static/clojure-ig1Vkg7X.js +1 -0
  127. package/web-ui/build/static/clojure-repl-C1uyEabk.js +1 -0
  128. package/web-ui/build/static/cmake-DSbVcAB3.js +1 -0
  129. package/web-ui/build/static/cmake-Zp8kPwnH.js +1 -0
  130. package/web-ui/build/static/cobol-OsZSiK_P.js +1 -0
  131. package/web-ui/build/static/coffeescript-D8r0416S.js +1 -0
  132. package/web-ui/build/static/coffeescript-DCpgClxh.js +1 -0
  133. package/web-ui/build/static/concurnas-DKnsxUOc.js +1 -0
  134. package/web-ui/build/static/coq-BQFlywVI.js +1 -0
  135. package/web-ui/build/static/coq-BvS9mQB2.js +1 -0
  136. package/web-ui/build/static/cos-D3ze2791.js +1 -0
  137. package/web-ui/build/static/cpp-Bw-cV3P1.js +1 -0
  138. package/web-ui/build/static/cpp-vi1p7XpB.js +1 -0
  139. package/web-ui/build/static/crmsh-BClnJTeQ.js +1 -0
  140. package/web-ui/build/static/crystal-DGzOUYZq.js +1 -0
  141. package/web-ui/build/static/crystal-DMzk6EvA.js +1 -0
  142. package/web-ui/build/static/csharp-BTom8s2X.js +1 -0
  143. package/web-ui/build/static/csharp-Cp2V3jfR.js +1 -0
  144. package/web-ui/build/static/cshtml-Dmtt9Kto.js +1 -0
  145. package/web-ui/build/static/csp-WPVsLe9_.js +1 -0
  146. package/web-ui/build/static/csp-qddj5fu_.js +1 -0
  147. package/web-ui/build/static/css-B0FAm7kj.js +1 -0
  148. package/web-ui/build/static/css-extras-Bx3pvjiG.js +1 -0
  149. package/web-ui/build/static/csv-CH-edgS5.js +1 -0
  150. package/web-ui/build/static/cypher-c3G8Leew.js +1 -0
  151. package/web-ui/build/static/d-BMDSy22_.js +1 -0
  152. package/web-ui/build/static/d-BdH4oW8-.js +1 -0
  153. package/web-ui/build/static/dart-C-r72q-O.js +1 -0
  154. package/web-ui/build/static/dart-CwpBMrKa.js +1 -0
  155. package/web-ui/build/static/dataweave-BPvqdt4k.js +1 -0
  156. package/web-ui/build/static/dax-Eyy6ixcN.js +1 -0
  157. package/web-ui/build/static/delphi-DhEbPj_5.js +1 -0
  158. package/web-ui/build/static/dhall-Ct1L8sN1.js +1 -0
  159. package/web-ui/build/static/diff-CSTqCgwn.js +1 -0
  160. package/web-ui/build/static/diff-Da97B5vW.js +1 -0
  161. package/web-ui/build/static/django-DGit_lCg.js +1 -0
  162. package/web-ui/build/static/django-DPgqFB8k.js +1 -0
  163. package/web-ui/build/static/dns-DUyXuZ-a.js +1 -0
  164. package/web-ui/build/static/dns-zone-file-D79MDxVG.js +1 -0
  165. package/web-ui/build/static/docker-DTiy4o38.js +1 -0
  166. package/web-ui/build/static/dockerfile-CvwPP8wE.js +1 -0
  167. package/web-ui/build/static/dos-CaIUWxvb.js +1 -0
  168. package/web-ui/build/static/dot-D3504w6Y.js +1 -0
  169. package/web-ui/build/static/dsconfig-Smy1eeX_.js +1 -0
  170. package/web-ui/build/static/dts-DyTYSXZj.js +1 -0
  171. package/web-ui/build/static/dust-CrJyi6qA.js +1 -0
  172. package/web-ui/build/static/ebnf-C8nqfkBH.js +1 -0
  173. package/web-ui/build/static/ebnf-Cuh5Vh2-.js +1 -0
  174. package/web-ui/build/static/editorconfig-C7pTGl6n.js +1 -0
  175. package/web-ui/build/static/eiffel-C75MSJCA.js +1 -0
  176. package/web-ui/build/static/ejs-Dyo7DF5w.js +1 -0
  177. package/web-ui/build/static/elixir-D4yJefOc.js +1 -0
  178. package/web-ui/build/static/elixir-DKRow2SJ.js +1 -0
  179. package/web-ui/build/static/elm-CgbdDlkT.js +1 -0
  180. package/web-ui/build/static/elm-D3N-UgU0.js +1 -0
  181. package/web-ui/build/static/erb-BsITh8qW.js +1 -0
  182. package/web-ui/build/static/erb-lY_LyKyS.js +1 -0
  183. package/web-ui/build/static/erlang-BCnPiYmB.js +1 -0
  184. package/web-ui/build/static/erlang-JEghiPXc.js +1 -0
  185. package/web-ui/build/static/erlang-repl-DzU97ugC.js +1 -0
  186. package/web-ui/build/static/etlua-CsBo8cJa.js +1 -0
  187. package/web-ui/build/static/excel-formula-C2piiCYa.js +1 -0
  188. package/web-ui/build/static/excel-kqNypwQD.js +1 -0
  189. package/web-ui/build/static/factor-DZTOhkyU.js +1 -0
  190. package/web-ui/build/static/false-yLjhfaSw.js +1 -0
  191. package/web-ui/build/static/firestore-security-rules-oaQNoH8l.js +1 -0
  192. package/web-ui/build/static/fix-C9IfnTuS.js +1 -0
  193. package/web-ui/build/static/flix-EmJ_JhPo.js +1 -0
  194. package/web-ui/build/static/flow-DCUl7IAQ.js +1 -0
  195. package/web-ui/build/static/fortran-DvyxJmFN.js +1 -0
  196. package/web-ui/build/static/fortran-EEP9R3S5.js +1 -0
  197. package/web-ui/build/static/fsharp-D_98s3RX.js +1 -0
  198. package/web-ui/build/static/fsharp-Dt9jOO5G.js +1 -0
  199. package/web-ui/build/static/ftl-C8gMHWLo.js +1 -0
  200. package/web-ui/build/static/gams-BHxVPb4z.js +1 -0
  201. package/web-ui/build/static/gap-DFtyHk-q.js +1 -0
  202. package/web-ui/build/static/gauss-BwhJWUcg.js +1 -0
  203. package/web-ui/build/static/gcode-BvmXwp09.js +1 -0
  204. package/web-ui/build/static/gcode-gWcD6Vc7.js +1 -0
  205. package/web-ui/build/static/gdscript-btHoX8RE.js +1 -0
  206. package/web-ui/build/static/gedcom-MgPs9iqh.js +1 -0
  207. package/web-ui/build/static/gherkin-B9c_Q16A.js +1 -0
  208. package/web-ui/build/static/gherkin-BvOgkK6h.js +1 -0
  209. package/web-ui/build/static/git-D9XWOVcQ.js +1 -0
  210. package/web-ui/build/static/glsl-CshBHxHY.js +1 -0
  211. package/web-ui/build/static/glsl-fNRUMTDr.js +1 -0
  212. package/web-ui/build/static/gml-B78deHK8.js +1 -0
  213. package/web-ui/build/static/gml-Cj7d2u8O.js +1 -0
  214. package/web-ui/build/static/gn-CJLD-mF1.js +1 -0
  215. package/web-ui/build/static/go-CT93BEkL.js +1 -0
  216. package/web-ui/build/static/go-CTTlNuQO.js +1 -0
  217. package/web-ui/build/static/go-module-BgnXboUE.js +1 -0
  218. package/web-ui/build/static/golo-2S5tXS-l.js +1 -0
  219. package/web-ui/build/static/gradle-8W8DCcWJ.js +1 -0
  220. package/web-ui/build/static/graphql-DZfp6FNU.js +1 -0
  221. package/web-ui/build/static/groovy-BfsyMb3X.js +1 -0
  222. package/web-ui/build/static/groovy-Dxov7ENz.js +1 -0
  223. package/web-ui/build/static/haml-BlUFsdVV.js +1 -0
  224. package/web-ui/build/static/haml-CjVj6vvW.js +1 -0
  225. package/web-ui/build/static/handlebars-DxrQFkyA.js +1 -0
  226. package/web-ui/build/static/handlebars-FE6fotYl.js +1 -0
  227. package/web-ui/build/static/haskell-B6z0RCD_.js +1 -0
  228. package/web-ui/build/static/haskell-JBFmJTRy.js +1 -0
  229. package/web-ui/build/static/haxe-BtMZMi-_.js +1 -0
  230. package/web-ui/build/static/haxe-C1J8n-fH.js +1 -0
  231. package/web-ui/build/static/hcl-DJP-bFWE.js +1 -0
  232. package/web-ui/build/static/hlsl-DrGjhs1b.js +1 -0
  233. package/web-ui/build/static/hoon-Cg-ZhqIT.js +1 -0
  234. package/web-ui/build/static/hpkp-D07vgmoZ.js +1 -0
  235. package/web-ui/build/static/hsp-CsypPWoA.js +1 -0
  236. package/web-ui/build/static/hsts-B6DMRxvP.js +1 -0
  237. package/web-ui/build/static/htmlbars-BI7_Hw4e.js +1 -0
  238. package/web-ui/build/static/http-90ihEi4s.js +1 -0
  239. package/web-ui/build/static/http-Dp4QXj9E.js +1 -0
  240. package/web-ui/build/static/hy-BMgKvP4K.js +1 -0
  241. package/web-ui/build/static/ichigojam-D6wKvJDb.js +1 -0
  242. package/web-ui/build/static/icon-CrgkmCwl.js +1 -0
  243. package/web-ui/build/static/icu-message-format-Bi2JxCXs.js +1 -0
  244. package/web-ui/build/static/idris-DbUsyZt5.js +1 -0
  245. package/web-ui/build/static/iecst-CQZ9t8fW.js +1 -0
  246. package/web-ui/build/static/ignore-BaFgtNMs.js +1 -0
  247. package/web-ui/build/static/index-DEWSWosh.css +1 -0
  248. package/web-ui/build/static/index-Di1bjCFA.js +13 -0
  249. package/web-ui/build/static/index-otR_WSsL.js +1 -0
  250. package/web-ui/build/static/index-whZPU4as.js +1183 -0
  251. package/web-ui/build/static/inform7-ClyX1Gro.js +1 -0
  252. package/web-ui/build/static/inform7-tZHBS5XP.js +1 -0
  253. package/web-ui/build/static/ini-BrP5JNYL.js +1 -0
  254. package/web-ui/build/static/ini-CVkrAhwV.js +1 -0
  255. package/web-ui/build/static/io-BJ1Y6Bdc.js +1 -0
  256. package/web-ui/build/static/irpf90-fjjcKS_8.js +1 -0
  257. package/web-ui/build/static/isbl-ClpvfUIz.js +1 -0
  258. package/web-ui/build/static/j-CICW77xS.js +1 -0
  259. package/web-ui/build/static/java-B9DFK-0E.js +1 -0
  260. package/web-ui/build/static/java-BL_6rYko.js +1 -0
  261. package/web-ui/build/static/javadoc-Cc4HKpKK.js +1 -0
  262. package/web-ui/build/static/javadoclike-CgNkUDOm.js +1 -0
  263. package/web-ui/build/static/javascript-CM40ZECq.js +1 -0
  264. package/web-ui/build/static/javastacktrace-BHSqXfG5.js +1 -0
  265. package/web-ui/build/static/jboss-cli-Bv5NhVSZ.js +1 -0
  266. package/web-ui/build/static/jexl--Ohk_keA.js +1 -0
  267. package/web-ui/build/static/jolie-DMTN5Vdf.js +1 -0
  268. package/web-ui/build/static/jq-nXRLldXX.js +1 -0
  269. package/web-ui/build/static/js-extras-eLwv3frs.js +1 -0
  270. package/web-ui/build/static/js-templates-Ca0owlrg.js +1 -0
  271. package/web-ui/build/static/jsdoc-KERXp0da.js +1 -0
  272. package/web-ui/build/static/json-BTjLaRsy.js +1 -0
  273. package/web-ui/build/static/json-p7pU0qdW.js +1 -0
  274. package/web-ui/build/static/json5-Cxjy1udc.js +1 -0
  275. package/web-ui/build/static/jsonp-CO52H7Gy.js +1 -0
  276. package/web-ui/build/static/jsstacktrace-8YKfoyJP.js +1 -0
  277. package/web-ui/build/static/jsx-Ct_05KbM.js +1 -0
  278. package/web-ui/build/static/julia-23I1ubCE.js +1 -0
  279. package/web-ui/build/static/julia-d8rVGed_.js +1 -0
  280. package/web-ui/build/static/julia-repl-mwnHedW_.js +1 -0
  281. package/web-ui/build/static/keepalived-E85Rx_fF.js +1 -0
  282. package/web-ui/build/static/keyman-aWd3QUDq.js +1 -0
  283. package/web-ui/build/static/kotlin-Cu370hQq.js +1 -0
  284. package/web-ui/build/static/kotlin-DoJ2WnmZ.js +1 -0
  285. package/web-ui/build/static/kumir-oiOgqcQO.js +1 -0
  286. package/web-ui/build/static/kusto-Bp-B02K5.js +1 -0
  287. package/web-ui/build/static/lasso-BxoQVwOO.js +1 -0
  288. package/web-ui/build/static/latex-CANm5vsX.js +1 -0
  289. package/web-ui/build/static/latex-PMroeNch.js +1 -0
  290. package/web-ui/build/static/latte-2ErU_2XF.js +1 -0
  291. package/web-ui/build/static/ldif-ChPn_F7o.js +1 -0
  292. package/web-ui/build/static/leaf-UkCugDgG.js +1 -0
  293. package/web-ui/build/static/less-CCH5RA89.js +1 -0
  294. package/web-ui/build/static/less-CGZbVU1g.js +1 -0
  295. package/web-ui/build/static/lilypond-BoyM37sv.js +1 -0
  296. package/web-ui/build/static/liquid-DGJVpRBi.js +1 -0
  297. package/web-ui/build/static/lisp-93nne61u.js +1 -0
  298. package/web-ui/build/static/lisp-DYjIRsXz.js +1 -0
  299. package/web-ui/build/static/livecodeserver-CfNaxIE4.js +1 -0
  300. package/web-ui/build/static/livescript-C8kDlQkz.js +1 -0
  301. package/web-ui/build/static/livescript-CoarnRHq.js +1 -0
  302. package/web-ui/build/static/llvm-CBVyNmAh.js +1 -0
  303. package/web-ui/build/static/llvm-DGxq8a7u.js +1 -0
  304. package/web-ui/build/static/log-BivgwFql.js +1 -0
  305. package/web-ui/build/static/lolcode-l5sK2cZz.js +1 -0
  306. package/web-ui/build/static/lsl-Xm44xLRQ.js +1 -0
  307. package/web-ui/build/static/lua-CGvrzfKp.js +1 -0
  308. package/web-ui/build/static/lua-nHwXeY4c.js +1 -0
  309. package/web-ui/build/static/magma-DmNItmna.js +1 -0
  310. package/web-ui/build/static/makefile-CKJNNHGb.js +1 -0
  311. package/web-ui/build/static/makefile-DI6y5Qml.js +1 -0
  312. package/web-ui/build/static/markdown-BgpbxKd-.js +1 -0
  313. package/web-ui/build/static/markdown-CvcxA4yk.js +1 -0
  314. package/web-ui/build/static/markup-templating-DijqesiA.js +1 -0
  315. package/web-ui/build/static/mathematica-Cxll1Q10.js +1 -0
  316. package/web-ui/build/static/matlab-BJo2T1A-.js +1 -0
  317. package/web-ui/build/static/matlab-C6DlZX4l.js +1 -0
  318. package/web-ui/build/static/maxima-DJXO4sbL.js +1 -0
  319. package/web-ui/build/static/maxscript-DdLpUYBs.js +1 -0
  320. package/web-ui/build/static/mel-BIpfnSyZ.js +1 -0
  321. package/web-ui/build/static/mel-BYcTUZJW.js +1 -0
  322. package/web-ui/build/static/mercury-C_LSpbD8.js +1 -0
  323. package/web-ui/build/static/mermaid-D9yBWnrT.js +1 -0
  324. package/web-ui/build/static/mipsasm-nR_K2Ue-.js +1 -0
  325. package/web-ui/build/static/mizar-BeLUPncD.js +1 -0
  326. package/web-ui/build/static/mizar-BesIbZd9.js +1 -0
  327. package/web-ui/build/static/mojolicious-cBx3OWa-.js +1 -0
  328. package/web-ui/build/static/mongodb-DTWKy9ac.js +1 -0
  329. package/web-ui/build/static/monkey-B72bZC3c.js +1 -0
  330. package/web-ui/build/static/monkey-G9XELYPQ.js +1 -0
  331. package/web-ui/build/static/moonscript-BXYVQiqj.js +1 -0
  332. package/web-ui/build/static/moonscript-sDd-5knz.js +1 -0
  333. package/web-ui/build/static/n1ql-0vKSfFAO.js +1 -0
  334. package/web-ui/build/static/n1ql-C9_BSZfz.js +1 -0
  335. package/web-ui/build/static/n4js-B7Ct8dds.js +1 -0
  336. package/web-ui/build/static/nand2tetris-hdl-p9gpphTM.js +1 -0
  337. package/web-ui/build/static/naniscript-6ZVr8Aug.js +1 -0
  338. package/web-ui/build/static/nasm-Ca73yTUt.js +1 -0
  339. package/web-ui/build/static/neon-DNP49oyX.js +1 -0
  340. package/web-ui/build/static/nevod-Qhgt7Bce.js +1 -0
  341. package/web-ui/build/static/nginx-D5e7lu62.js +1 -0
  342. package/web-ui/build/static/nginx-DobnyESB.js +1 -0
  343. package/web-ui/build/static/nim-BPBivUOV.js +1 -0
  344. package/web-ui/build/static/nim-Baoug1Wa.js +1 -0
  345. package/web-ui/build/static/nix-CSPTQs5y.js +1 -0
  346. package/web-ui/build/static/nix-Dk4eNw49.js +1 -0
  347. package/web-ui/build/static/node-repl-NJNL8VFR.js +1 -0
  348. package/web-ui/build/static/nsis-BZ0oMzEw.js +1 -0
  349. package/web-ui/build/static/nsis-CKPCjtCU.js +1 -0
  350. package/web-ui/build/static/objectivec-BkfIRhhV.js +1 -0
  351. package/web-ui/build/static/objectivec-CnQgqhbJ.js +1 -0
  352. package/web-ui/build/static/ocaml-9rGNzRrK.js +1 -0
  353. package/web-ui/build/static/ocaml-CTolCqxL.js +1 -0
  354. package/web-ui/build/static/opencl-9Q3vRDxv.js +1 -0
  355. package/web-ui/build/static/openqasm-D2QiuFBp.js +1 -0
  356. package/web-ui/build/static/openscad-C3HyuzpB.js +1 -0
  357. package/web-ui/build/static/oxygene-4gi-VYy_.js +1 -0
  358. package/web-ui/build/static/oz-BGDEB-1A.js +1 -0
  359. package/web-ui/build/static/parigp-CfZzp1uE.js +1 -0
  360. package/web-ui/build/static/parser-UbGteTcy.js +1 -0
  361. package/web-ui/build/static/parser3-C-Jx-fy7.js +1 -0
  362. package/web-ui/build/static/pascal-D1_R0gW-.js +1 -0
  363. package/web-ui/build/static/pascaligo-B8C-98Np.js +1 -0
  364. package/web-ui/build/static/pcaxis-TGnlUKNs.js +1 -0
  365. package/web-ui/build/static/peoplecode-C5Vf1AH0.js +1 -0
  366. package/web-ui/build/static/perl-CBp1N62T.js +1 -0
  367. package/web-ui/build/static/perl-Z59j904t.js +1 -0
  368. package/web-ui/build/static/pf-Cq8B_xwQ.js +1 -0
  369. package/web-ui/build/static/pgsql-ofJbUHkL.js +1 -0
  370. package/web-ui/build/static/php-OlH7HLQJ.js +1 -0
  371. package/web-ui/build/static/php-extras-GqtrxLuk.js +1 -0
  372. package/web-ui/build/static/php-r09kMDOB.js +1 -0
  373. package/web-ui/build/static/php-template-18uT97Qo.js +1 -0
  374. package/web-ui/build/static/phpdoc-9tRFvup9.js +1 -0
  375. package/web-ui/build/static/plaintext-DsYT6Mu-.js +1 -0
  376. package/web-ui/build/static/plsql-RhWQNJVb.js +1 -0
  377. package/web-ui/build/static/pony-DD6JMLYI.js +1 -0
  378. package/web-ui/build/static/powerquery-CALow-bt.js +1 -0
  379. package/web-ui/build/static/powershell-C2QvIuKF.js +1 -0
  380. package/web-ui/build/static/powershell-yrbJEhCh.js +1 -0
  381. package/web-ui/build/static/processing-1T5w_Q03.js +1 -0
  382. package/web-ui/build/static/processing-DBim_dO-.js +1 -0
  383. package/web-ui/build/static/profile-Cdloh8mZ.js +1 -0
  384. package/web-ui/build/static/prolog-DRSsNnns.js +1 -0
  385. package/web-ui/build/static/prolog-D_ajweDr.js +1 -0
  386. package/web-ui/build/static/promql-BRuwn6Bn.js +1 -0
  387. package/web-ui/build/static/properties-D5Wyl4X4.js +1 -0
  388. package/web-ui/build/static/properties-kn4fl1bl.js +1 -0
  389. package/web-ui/build/static/protobuf-BMO76zWi.js +1 -0
  390. package/web-ui/build/static/protobuf-CTUCF-U-.js +1 -0
  391. package/web-ui/build/static/psl-CiqYdQbY.js +1 -0
  392. package/web-ui/build/static/pug-BLE2Qayj.js +1 -0
  393. package/web-ui/build/static/puppet-CFKLWXft.js +1 -0
  394. package/web-ui/build/static/puppet-DQci0Dl5.js +1 -0
  395. package/web-ui/build/static/pure-D2h_GynV.js +1 -0
  396. package/web-ui/build/static/purebasic-BF8MVw8V.js +1 -0
  397. package/web-ui/build/static/purebasic-BTtHiCkh.js +1 -0
  398. package/web-ui/build/static/purescript-D1ZSh-sH.js +1 -0
  399. package/web-ui/build/static/python-Cp9_Vdhb.js +1 -0
  400. package/web-ui/build/static/python-DdgNw8IW.js +1 -0
  401. package/web-ui/build/static/python-repl-DvK89VMC.js +1 -0
  402. package/web-ui/build/static/q-COaIgwhT.js +1 -0
  403. package/web-ui/build/static/q-Cm0dQkW8.js +1 -0
  404. package/web-ui/build/static/qml-BpsOqqJM.js +1 -0
  405. package/web-ui/build/static/qml-BziQXlU4.js +1 -0
  406. package/web-ui/build/static/qore-Cutz6g-2.js +1 -0
  407. package/web-ui/build/static/qsharp-B16619X1.js +1 -0
  408. package/web-ui/build/static/r-CFUIj5Hd.js +1 -0
  409. package/web-ui/build/static/r-CPrwCi5w.js +1 -0
  410. package/web-ui/build/static/racket-Bh08DFXF.js +1 -0
  411. package/web-ui/build/static/reason-BxjDq4e-.js +1 -0
  412. package/web-ui/build/static/reasonml-Ds5SsGP8.js +1 -0
  413. package/web-ui/build/static/regex-DhBIDIMI.js +1 -0
  414. package/web-ui/build/static/rego-DCwxZXcB.js +1 -0
  415. package/web-ui/build/static/renpy-C2fuQfqb.js +1 -0
  416. package/web-ui/build/static/rest-C52ZpxWQ.js +1 -0
  417. package/web-ui/build/static/rib-Cbl2Mzyj.js +1 -0
  418. package/web-ui/build/static/rip-BTOu5ZIE.js +1 -0
  419. package/web-ui/build/static/roboconf-3Oi2wuVk.js +1 -0
  420. package/web-ui/build/static/roboconf-ndLZLE39.js +1 -0
  421. package/web-ui/build/static/robotframework-BzHXiIj1.js +1 -0
  422. package/web-ui/build/static/routeros-CkpPoqx-.js +1 -0
  423. package/web-ui/build/static/rsl-C0bwOQ38.js +1 -0
  424. package/web-ui/build/static/ruby-C_hIhtuQ.js +1 -0
  425. package/web-ui/build/static/ruby-DvKfZPzj.js +1 -0
  426. package/web-ui/build/static/ruleslanguage-CbZJlddz.js +1 -0
  427. package/web-ui/build/static/rust-BFPIhB-X.js +1 -0
  428. package/web-ui/build/static/rust-sBpUq-qE.js +1 -0
  429. package/web-ui/build/static/sas-BCXvYN9x.js +1 -0
  430. package/web-ui/build/static/sas-D7GAsTY3.js +1 -0
  431. package/web-ui/build/static/sass-BdaErGMN.js +1 -0
  432. package/web-ui/build/static/scala-Cj81oCl9.js +1 -0
  433. package/web-ui/build/static/scala-CvbksfY6.js +1 -0
  434. package/web-ui/build/static/scheme-BM5ZqKnl.js +1 -0
  435. package/web-ui/build/static/scheme-BPvlu9Tk.js +1 -0
  436. package/web-ui/build/static/scilab-CJanLKQN.js +1 -0
  437. package/web-ui/build/static/scss-C53YF_7f.js +1 -0
  438. package/web-ui/build/static/scss-DPp8UZbr.js +1 -0
  439. package/web-ui/build/static/shell-CC9bQXMe.js +1 -0
  440. package/web-ui/build/static/shell-session-CuR3fbf-.js +1 -0
  441. package/web-ui/build/static/smali-CUgLls3D.js +1 -0
  442. package/web-ui/build/static/smali-YODSX8qt.js +1 -0
  443. package/web-ui/build/static/smalltalk-BMJQ4bbs.js +1 -0
  444. package/web-ui/build/static/smalltalk-BVGY3CTl.js +1 -0
  445. package/web-ui/build/static/smarty-C9aNt4-p.js +1 -0
  446. package/web-ui/build/static/sml-C3BIHhfq.js +1 -0
  447. package/web-ui/build/static/sml-DTipyRmY.js +1 -0
  448. package/web-ui/build/static/solidity-1yuPUqoC.js +1 -0
  449. package/web-ui/build/static/solution-file-BgzK4GOU.js +1 -0
  450. package/web-ui/build/static/soy-CFJXRvqc.js +1 -0
  451. package/web-ui/build/static/sparql-CAosYMpl.js +1 -0
  452. package/web-ui/build/static/splunk-spl-DkINtWr8.js +1 -0
  453. package/web-ui/build/static/sqf-DbrWIS2M.js +1 -0
  454. package/web-ui/build/static/sqf-nq8Q9J2W.js +1 -0
  455. package/web-ui/build/static/sql-9bwClhZQ.js +1 -0
  456. package/web-ui/build/static/sql-CqPkY-lX.js +1 -0
  457. package/web-ui/build/static/sql_more-CsY5ts77.js +1 -0
  458. package/web-ui/build/static/squirrel-BuqtzRBD.js +1 -0
  459. package/web-ui/build/static/stan-BNxBSglc.js +1 -0
  460. package/web-ui/build/static/stan-CZVMc34l.js +1 -0
  461. package/web-ui/build/static/stata-DKnVdHCd.js +1 -0
  462. package/web-ui/build/static/step21-Cu_TaBGF.js +1 -0
  463. package/web-ui/build/static/stylus-BS7-OJew.js +1 -0
  464. package/web-ui/build/static/stylus-DtFrp1Nk.js +1 -0
  465. package/web-ui/build/static/subunit-DDCoWkkc.js +1 -0
  466. package/web-ui/build/static/swift-BaguUZbl.js +1 -0
  467. package/web-ui/build/static/swift-mwBsb8Bx.js +1 -0
  468. package/web-ui/build/static/systemd-D6PpyDKk.js +1 -0
  469. package/web-ui/build/static/t4-cs-Cem8g4Ck.js +1 -0
  470. package/web-ui/build/static/t4-templating-BZo-HjmD.js +1 -0
  471. package/web-ui/build/static/t4-vb-B4oVnKa4.js +1 -0
  472. package/web-ui/build/static/taggerscript-DweAZ5pw.js +1 -0
  473. package/web-ui/build/static/tap-DpuvKHHF.js +1 -0
  474. package/web-ui/build/static/tap-hUKmJObZ.js +1 -0
  475. package/web-ui/build/static/tcl-BUvhAi7u.js +1 -0
  476. package/web-ui/build/static/tcl-Dsck63d8.js +1 -0
  477. package/web-ui/build/static/textile-CgKbqJ-j.js +1 -0
  478. package/web-ui/build/static/thrift-B5H6rApp.js +1 -0
  479. package/web-ui/build/static/toml-DggTpfOo.js +1 -0
  480. package/web-ui/build/static/tp-CazB2P2X.js +1 -0
  481. package/web-ui/build/static/tremor-B1jy7S5p.js +1 -0
  482. package/web-ui/build/static/tsx-BqF2lVDi.js +1 -0
  483. package/web-ui/build/static/tt2-BNoNXpEe.js +1 -0
  484. package/web-ui/build/static/turtle-B0evd5mn.js +1 -0
  485. package/web-ui/build/static/twig-B5A7nMdv.js +1 -0
  486. package/web-ui/build/static/twig-DZnLWvh8.js +1 -0
  487. package/web-ui/build/static/typescript-Bbe_P093.js +1 -0
  488. package/web-ui/build/static/typescript-BfhvmSSG.js +1 -0
  489. package/web-ui/build/static/typoscript-BjuZEIgw.js +1 -0
  490. package/web-ui/build/static/unrealscript-C3iUCFRi.js +1 -0
  491. package/web-ui/build/static/uorazor-CbZXwzIj.js +1 -0
  492. package/web-ui/build/static/uri-xMPSnp6m.js +1 -0
  493. package/web-ui/build/static/v-BKcGo5I6.js +1 -0
  494. package/web-ui/build/static/vala-BRoBE4am.js +1 -0
  495. package/web-ui/build/static/vala-B__Iyrma.js +1 -0
  496. package/web-ui/build/static/vbnet-DBxlMRvN.js +1 -0
  497. package/web-ui/build/static/vbnet-DjAXt5BE.js +1 -0
  498. package/web-ui/build/static/vbscript-BNA4oANi.js +1 -0
  499. package/web-ui/build/static/vbscript-html-o8ckLPKG.js +1 -0
  500. package/web-ui/build/static/velocity-D7sc5ggA.js +1 -0
  501. package/web-ui/build/static/verilog-BWJfMIng.js +1 -0
  502. package/web-ui/build/static/verilog-jW2GPC--.js +1 -0
  503. package/web-ui/build/static/vhdl-BIVlXRPa.js +1 -0
  504. package/web-ui/build/static/vhdl-BeqdhhxD.js +1 -0
  505. package/web-ui/build/static/vim-712lI4-g.js +1 -0
  506. package/web-ui/build/static/vim-DMROTzr0.js +1 -0
  507. package/web-ui/build/static/visual-basic-CQfbM-ta.js +1 -0
  508. package/web-ui/build/static/warpscript-DFAvCXFQ.js +1 -0
  509. package/web-ui/build/static/wasm-CiYoxBl0.js +1 -0
  510. package/web-ui/build/static/web-idl-DoCkPK8y.js +1 -0
  511. package/web-ui/build/static/wiki-bvz0AGzB.js +1 -0
  512. package/web-ui/build/static/wolfram-fBuyFEgU.js +1 -0
  513. package/web-ui/build/static/wren-DvATFxjF.js +1 -0
  514. package/web-ui/build/static/x86asm-r4bPbUR_.js +1 -0
  515. package/web-ui/build/static/xeora-B6iOnDJY.js +1 -0
  516. package/web-ui/build/static/xl-Ce6B5slc.js +1 -0
  517. package/web-ui/build/static/xml-DNjyPmhQ.js +1 -0
  518. package/web-ui/build/static/xml-doc-DydogmZD.js +1 -0
  519. package/web-ui/build/static/xojo-DCQLltvr.js +1 -0
  520. package/web-ui/build/static/xquery-C-fAnA0H.js +1 -0
  521. package/web-ui/build/static/xquery-CNeqzhLO.js +1 -0
  522. package/web-ui/build/static/yaml-BsVaGsk5.js +1 -0
  523. package/web-ui/build/static/yaml-kVZvwv_C.js +1 -0
  524. package/web-ui/build/static/yang-B_gq9JEq.js +1 -0
  525. package/web-ui/build/static/zephir-ECIXgXhX.js +1 -0
  526. package/web-ui/build/static/zig-DY325EKG.js +1 -0
  527. package/web-ui/build/static/1c-BLo2-5GS.js +0 -1
  528. package/web-ui/build/static/abap-BjUneMMr.js +0 -1
  529. package/web-ui/build/static/abnf-CZTz-l7P.js +0 -1
  530. package/web-ui/build/static/abnf-ITJ5mkBo.js +0 -1
  531. package/web-ui/build/static/accesslog-Dj78lZOU.js +0 -1
  532. package/web-ui/build/static/actionscript-Chivtu59.js +0 -1
  533. package/web-ui/build/static/actionscript-CrvMFXnx.js +0 -1
  534. package/web-ui/build/static/ada-DdJtyoYe.js +0 -1
  535. package/web-ui/build/static/ada-GIvogaLi.js +0 -1
  536. package/web-ui/build/static/agda-DbPp4fQi.js +0 -1
  537. package/web-ui/build/static/al-BZ24KwRS.js +0 -1
  538. package/web-ui/build/static/angelscript-DzsFypYt.js +0 -1
  539. package/web-ui/build/static/antlr4-3qb4rD3S.js +0 -1
  540. package/web-ui/build/static/apache-DF0P5ZRm.js +0 -1
  541. package/web-ui/build/static/apacheconf-C8KuNf9c.js +0 -1
  542. package/web-ui/build/static/apex-CPV-DeVE.js +0 -1
  543. package/web-ui/build/static/apl-C60bVxxW.js +0 -1
  544. package/web-ui/build/static/applescript-uz0i0tu1.js +0 -1
  545. package/web-ui/build/static/applescript-xcPRUBia.js +0 -1
  546. package/web-ui/build/static/aql-CRh4IGkA.js +0 -1
  547. package/web-ui/build/static/arcade-CmLedeqc.js +0 -1
  548. package/web-ui/build/static/arduino-3pr1BvXB.js +0 -1
  549. package/web-ui/build/static/arduino-C2BejAip.js +0 -1
  550. package/web-ui/build/static/arff-DE6Wr9MU.js +0 -1
  551. package/web-ui/build/static/armasm-DXodTfP4.js +0 -1
  552. package/web-ui/build/static/asciidoc-BU2BDFme.js +0 -1
  553. package/web-ui/build/static/asciidoc-CgvtvdeC.js +0 -1
  554. package/web-ui/build/static/asm6502-BMuYCKmP.js +0 -1
  555. package/web-ui/build/static/asmatmel-Dwxzg4kq.js +0 -1
  556. package/web-ui/build/static/aspectj-XZIldIRI.js +0 -1
  557. package/web-ui/build/static/aspnet-UxY2bZ9O.js +0 -1
  558. package/web-ui/build/static/autohotkey-BdZoQT7s.js +0 -1
  559. package/web-ui/build/static/autohotkey-DLWs6p8o.js +0 -1
  560. package/web-ui/build/static/autoit-CxcZx_kh.js +0 -1
  561. package/web-ui/build/static/autoit-HY_BHh1p.js +0 -1
  562. package/web-ui/build/static/avisynth-4Q4be9zq.js +0 -1
  563. package/web-ui/build/static/avrasm-CFqVJML2.js +0 -1
  564. package/web-ui/build/static/avro-idl-DVTV2YZm.js +0 -1
  565. package/web-ui/build/static/awk-C1Udi4As.js +0 -1
  566. package/web-ui/build/static/axapta-B9lexIDC.js +0 -1
  567. package/web-ui/build/static/bash-DDZrx0R1.js +0 -1
  568. package/web-ui/build/static/bash-Uuijyc_K.js +0 -1
  569. package/web-ui/build/static/basic-B29QFWwp.js +0 -1
  570. package/web-ui/build/static/basic-DKDOc42O.js +0 -1
  571. package/web-ui/build/static/batch-CA3q9wRr.js +0 -1
  572. package/web-ui/build/static/bbcode-DkUDcqrp.js +0 -1
  573. package/web-ui/build/static/bicep-AHSQiVgQ.js +0 -1
  574. package/web-ui/build/static/birb-BsAnN1j3.js +0 -1
  575. package/web-ui/build/static/bison-BIq5-ZXo.js +0 -1
  576. package/web-ui/build/static/bnf-BexLm6hz.js +0 -1
  577. package/web-ui/build/static/bnf-Dm46EM5S.js +0 -1
  578. package/web-ui/build/static/brainfuck-CBG8MHhD.js +0 -1
  579. package/web-ui/build/static/brainfuck-DrHuUFVv.js +0 -1
  580. package/web-ui/build/static/brightscript-CoQ7s_l3.js +0 -1
  581. package/web-ui/build/static/bro-Cz5RmvoK.js +0 -1
  582. package/web-ui/build/static/bsl-C9wXomkX.js +0 -1
  583. package/web-ui/build/static/c-BZFEFWwC.js +0 -1
  584. package/web-ui/build/static/c-CfFWLEL7.js +0 -1
  585. package/web-ui/build/static/c-like-CvIii1QP.js +0 -1
  586. package/web-ui/build/static/cal-be-Dz3GC.js +0 -1
  587. package/web-ui/build/static/capnproto-Bcaxak1e.js +0 -1
  588. package/web-ui/build/static/ceylon-QH_iQXnW.js +0 -1
  589. package/web-ui/build/static/cfscript-BRgBlxCO.js +0 -1
  590. package/web-ui/build/static/chaiscript-DSBx5kyN.js +0 -1
  591. package/web-ui/build/static/cil-C90LIbge.js +0 -1
  592. package/web-ui/build/static/clean-D2X3fSKw.js +0 -1
  593. package/web-ui/build/static/clojure-CvKE0e-3.js +0 -1
  594. package/web-ui/build/static/clojure-Cy3Zg4vZ.js +0 -1
  595. package/web-ui/build/static/clojure-repl-D0kONHv2.js +0 -1
  596. package/web-ui/build/static/cmake-DIDVe3n_.js +0 -1
  597. package/web-ui/build/static/cmake-DPijEs9c.js +0 -1
  598. package/web-ui/build/static/cobol-BPEjLjGY.js +0 -1
  599. package/web-ui/build/static/coffeescript-CoSx9MQU.js +0 -1
  600. package/web-ui/build/static/coffeescript-L5CBXrnP.js +0 -1
  601. package/web-ui/build/static/concurnas-q5sXhVU4.js +0 -1
  602. package/web-ui/build/static/coq-BAEq82zI.js +0 -1
  603. package/web-ui/build/static/coq-BBgtQZwi.js +0 -1
  604. package/web-ui/build/static/cos-9FdwfBC5.js +0 -1
  605. package/web-ui/build/static/cpp-CYt8UYn2.js +0 -1
  606. package/web-ui/build/static/cpp-CZ2lOXlm.js +0 -1
  607. package/web-ui/build/static/crmsh-C_TZWkES.js +0 -1
  608. package/web-ui/build/static/crystal-BDf_0NDz.js +0 -1
  609. package/web-ui/build/static/crystal-BrTR9dGT.js +0 -1
  610. package/web-ui/build/static/csharp-BSBrba50.js +0 -1
  611. package/web-ui/build/static/csharp-Cerqyqbn.js +0 -1
  612. package/web-ui/build/static/cshtml-heNA_ya5.js +0 -1
  613. package/web-ui/build/static/csp-CJprtNTl.js +0 -1
  614. package/web-ui/build/static/csp-CyYfNNga.js +0 -1
  615. package/web-ui/build/static/css-ClMfqSLF.js +0 -1
  616. package/web-ui/build/static/css-extras-BRU-Fmfk.js +0 -1
  617. package/web-ui/build/static/csv-VxPQSCnT.js +0 -1
  618. package/web-ui/build/static/cypher-COR7lVoB.js +0 -1
  619. package/web-ui/build/static/d-CjJIoaqU.js +0 -1
  620. package/web-ui/build/static/d-DrTea74c.js +0 -1
  621. package/web-ui/build/static/dart-Dx1CtbrO.js +0 -1
  622. package/web-ui/build/static/dart-Kqlt_5Iy.js +0 -1
  623. package/web-ui/build/static/dataweave-DpoRPYaa.js +0 -1
  624. package/web-ui/build/static/dax-BdRNDjXh.js +0 -1
  625. package/web-ui/build/static/delphi-C6ZfxFVF.js +0 -1
  626. package/web-ui/build/static/dhall-DZrga6Gc.js +0 -1
  627. package/web-ui/build/static/diff-BuMvzPYe.js +0 -1
  628. package/web-ui/build/static/diff-DZYXzKCb.js +0 -1
  629. package/web-ui/build/static/django-D_vRowuc.js +0 -1
  630. package/web-ui/build/static/django-NYcglI2i.js +0 -1
  631. package/web-ui/build/static/dns-Cd7tDS1i.js +0 -1
  632. package/web-ui/build/static/dns-zone-file-C3-2vwxy.js +0 -1
  633. package/web-ui/build/static/docker-DQ7ZFefk.js +0 -1
  634. package/web-ui/build/static/dockerfile-BpU0w0F-.js +0 -1
  635. package/web-ui/build/static/dos-B1_ZGbVG.js +0 -1
  636. package/web-ui/build/static/dot-BGB_tXU7.js +0 -1
  637. package/web-ui/build/static/dsconfig-BbDxyV_e.js +0 -1
  638. package/web-ui/build/static/dts-BfjOjY8l.js +0 -1
  639. package/web-ui/build/static/dust-BdwQ-7T_.js +0 -1
  640. package/web-ui/build/static/ebnf-BQTMmaYU.js +0 -1
  641. package/web-ui/build/static/ebnf-BwwBWilG.js +0 -1
  642. package/web-ui/build/static/editorconfig-DWS4VSOM.js +0 -1
  643. package/web-ui/build/static/eiffel-DVvlc0AI.js +0 -1
  644. package/web-ui/build/static/ejs-DsD496m-.js +0 -1
  645. package/web-ui/build/static/elixir-CLxuo9eh.js +0 -1
  646. package/web-ui/build/static/elixir-Cnyg3Ezx.js +0 -1
  647. package/web-ui/build/static/elm-CMAIkLMI.js +0 -1
  648. package/web-ui/build/static/elm-DZBnlwPV.js +0 -1
  649. package/web-ui/build/static/erb-B5xezjly.js +0 -1
  650. package/web-ui/build/static/erb-CJr8Ab4S.js +0 -1
  651. package/web-ui/build/static/erlang-BKy_rMFs.js +0 -1
  652. package/web-ui/build/static/erlang-DtaEL15_.js +0 -1
  653. package/web-ui/build/static/erlang-repl-CC5OZ0oZ.js +0 -1
  654. package/web-ui/build/static/etlua-1AfbSbi_.js +0 -1
  655. package/web-ui/build/static/excel-AEWYaJMN.js +0 -1
  656. package/web-ui/build/static/excel-formula-DXCH31eV.js +0 -1
  657. package/web-ui/build/static/factor-BvZsNxRC.js +0 -1
  658. package/web-ui/build/static/false-Y69sPjTa.js +0 -1
  659. package/web-ui/build/static/firestore-security-rules-BAYXaIU_.js +0 -1
  660. package/web-ui/build/static/fix-D7wVox5L.js +0 -1
  661. package/web-ui/build/static/flix-xYG3kZl-.js +0 -1
  662. package/web-ui/build/static/flow-zBPh0c8a.js +0 -1
  663. package/web-ui/build/static/fortran-C7OgAOwk.js +0 -1
  664. package/web-ui/build/static/fortran-D7HqnRra.js +0 -1
  665. package/web-ui/build/static/fsharp-Dz8jq_YD.js +0 -1
  666. package/web-ui/build/static/fsharp-wem8e879.js +0 -1
  667. package/web-ui/build/static/ftl-BNZhFjQT.js +0 -1
  668. package/web-ui/build/static/gams-C0WL3JTk.js +0 -1
  669. package/web-ui/build/static/gap-C3QTJPj2.js +0 -1
  670. package/web-ui/build/static/gauss-HDeDt6Js.js +0 -1
  671. package/web-ui/build/static/gcode-B6xVa-Q4.js +0 -1
  672. package/web-ui/build/static/gcode-KfjFk59Y.js +0 -1
  673. package/web-ui/build/static/gdscript-CZWTW6OT.js +0 -1
  674. package/web-ui/build/static/gedcom-DGTBZtDe.js +0 -1
  675. package/web-ui/build/static/gherkin-BM2fti5q.js +0 -1
  676. package/web-ui/build/static/gherkin-BsD-keLP.js +0 -1
  677. package/web-ui/build/static/git-CwXnrvg5.js +0 -1
  678. package/web-ui/build/static/glsl-CEL-DKdu.js +0 -1
  679. package/web-ui/build/static/glsl-DClg1hhL.js +0 -1
  680. package/web-ui/build/static/gml-BuyC2nUx.js +0 -1
  681. package/web-ui/build/static/gml-CaV0fexF.js +0 -1
  682. package/web-ui/build/static/gn-RZ4XHU09.js +0 -1
  683. package/web-ui/build/static/go-2fZP5dFL.js +0 -1
  684. package/web-ui/build/static/go-B-2r4QAR.js +0 -1
  685. package/web-ui/build/static/go-module-DSWZUUGo.js +0 -1
  686. package/web-ui/build/static/golo-BLZaLyU5.js +0 -1
  687. package/web-ui/build/static/gradle--RLe7WtU.js +0 -1
  688. package/web-ui/build/static/graphql-Dersm5rs.js +0 -1
  689. package/web-ui/build/static/groovy-BhCtzyFe.js +0 -1
  690. package/web-ui/build/static/groovy-CvbHavu3.js +0 -1
  691. package/web-ui/build/static/haml-CQhB89Xl.js +0 -1
  692. package/web-ui/build/static/haml-CemWzAX2.js +0 -1
  693. package/web-ui/build/static/handlebars-B39jLKjQ.js +0 -1
  694. package/web-ui/build/static/handlebars-Cl4dI91M.js +0 -1
  695. package/web-ui/build/static/haskell-CO9Ug-Kw.js +0 -1
  696. package/web-ui/build/static/haskell-EXme4CFR.js +0 -1
  697. package/web-ui/build/static/haxe-BDkCyqBy.js +0 -1
  698. package/web-ui/build/static/haxe-ahczQlFA.js +0 -1
  699. package/web-ui/build/static/hcl-liOTbdHr.js +0 -1
  700. package/web-ui/build/static/hlsl-Bnkb1zrP.js +0 -1
  701. package/web-ui/build/static/hoon-DCXHuTNp.js +0 -1
  702. package/web-ui/build/static/hpkp-CPJOGDF_.js +0 -1
  703. package/web-ui/build/static/hsp-BdeT0enM.js +0 -1
  704. package/web-ui/build/static/hsts-BoIN2VGK.js +0 -1
  705. package/web-ui/build/static/htmlbars-B5Ruf2zT.js +0 -1
  706. package/web-ui/build/static/http-BacVzmeC.js +0 -1
  707. package/web-ui/build/static/http-DifjpER4.js +0 -1
  708. package/web-ui/build/static/hy-DQ-M6mjk.js +0 -1
  709. package/web-ui/build/static/ichigojam-CcVrpthd.js +0 -1
  710. package/web-ui/build/static/icon-B4N1Fnx2.js +0 -1
  711. package/web-ui/build/static/icu-message-format-aDIl6Oaf.js +0 -1
  712. package/web-ui/build/static/idris-DKvV6i27.js +0 -1
  713. package/web-ui/build/static/iecst-zqZH79Dw.js +0 -1
  714. package/web-ui/build/static/ignore-BBbP-u2O.js +0 -1
  715. package/web-ui/build/static/index-CkhVK4lF.js +0 -1164
  716. package/web-ui/build/static/index-Cm1gK3R7.css +0 -1
  717. package/web-ui/build/static/index-D9JNKR2k.js +0 -13
  718. package/web-ui/build/static/index-DqZhvIWG.js +0 -1
  719. package/web-ui/build/static/inform7-BwvEArfL.js +0 -1
  720. package/web-ui/build/static/inform7-YkPDg57k.js +0 -1
  721. package/web-ui/build/static/ini-DU4drXRb.js +0 -1
  722. package/web-ui/build/static/ini-OhDTn0L5.js +0 -1
  723. package/web-ui/build/static/io-4thQGR-r.js +0 -1
  724. package/web-ui/build/static/irpf90-BnhmotbX.js +0 -1
  725. package/web-ui/build/static/isbl-BKcWS-M5.js +0 -1
  726. package/web-ui/build/static/j-Bw6CUCl9.js +0 -1
  727. package/web-ui/build/static/java-8IzvJ-mZ.js +0 -1
  728. package/web-ui/build/static/java-_jaQp1m2.js +0 -1
  729. package/web-ui/build/static/javadoc-D6KaHkhq.js +0 -1
  730. package/web-ui/build/static/javadoclike-B-DnR3Tl.js +0 -1
  731. package/web-ui/build/static/javascript-CfOOSye9.js +0 -1
  732. package/web-ui/build/static/javastacktrace-DHyDfhlB.js +0 -1
  733. package/web-ui/build/static/jboss-cli-zEH5UaRS.js +0 -1
  734. package/web-ui/build/static/jexl-CRpgdJ2f.js +0 -1
  735. package/web-ui/build/static/jolie-C5S16-nE.js +0 -1
  736. package/web-ui/build/static/jq-Dy-2LJZM.js +0 -1
  737. package/web-ui/build/static/js-extras-CNfXr3kE.js +0 -1
  738. package/web-ui/build/static/js-templates-DCJ1syUw.js +0 -1
  739. package/web-ui/build/static/jsdoc-BamyoRCh.js +0 -1
  740. package/web-ui/build/static/json-Buz-eeND.js +0 -1
  741. package/web-ui/build/static/json-D4xr_AK1.js +0 -1
  742. package/web-ui/build/static/json5-CS3uAaJP.js +0 -1
  743. package/web-ui/build/static/jsonp-CmEAdOcH.js +0 -1
  744. package/web-ui/build/static/jsstacktrace-D35jXpCN.js +0 -1
  745. package/web-ui/build/static/jsx-DRMEK-Qn.js +0 -1
  746. package/web-ui/build/static/julia-BgYJV7ho.js +0 -1
  747. package/web-ui/build/static/julia-CRsGDmxp.js +0 -1
  748. package/web-ui/build/static/julia-repl-D0vTZKUn.js +0 -1
  749. package/web-ui/build/static/keepalived-BlhBatvM.js +0 -1
  750. package/web-ui/build/static/keyman-B_-J66sg.js +0 -1
  751. package/web-ui/build/static/kotlin-B7HqYBGK.js +0 -1
  752. package/web-ui/build/static/kotlin-CszxhoS4.js +0 -1
  753. package/web-ui/build/static/kumir-B_wpMfXS.js +0 -1
  754. package/web-ui/build/static/kusto-BrHkOiE1.js +0 -1
  755. package/web-ui/build/static/lasso-xizuiq1s.js +0 -1
  756. package/web-ui/build/static/latex-62pryLTa.js +0 -1
  757. package/web-ui/build/static/latex-D7Tnbs2l.js +0 -1
  758. package/web-ui/build/static/latte-B_8xJj-y.js +0 -1
  759. package/web-ui/build/static/ldif-B69eIciC.js +0 -1
  760. package/web-ui/build/static/leaf-DPnh4k7N.js +0 -1
  761. package/web-ui/build/static/less-Bg3xuki-.js +0 -1
  762. package/web-ui/build/static/less-Cm-zhk4i.js +0 -1
  763. package/web-ui/build/static/lilypond-BFSXmrKQ.js +0 -1
  764. package/web-ui/build/static/liquid-D_jMXN_8.js +0 -1
  765. package/web-ui/build/static/lisp-CDWjXhWU.js +0 -1
  766. package/web-ui/build/static/lisp-DAu9fWrQ.js +0 -1
  767. package/web-ui/build/static/livecodeserver-BNgd6rBu.js +0 -1
  768. package/web-ui/build/static/livescript-C6sYNsdz.js +0 -1
  769. package/web-ui/build/static/livescript-CMOawYYt.js +0 -1
  770. package/web-ui/build/static/llvm-Yx2vcmJw.js +0 -1
  771. package/web-ui/build/static/llvm-w4vVb6qs.js +0 -1
  772. package/web-ui/build/static/log-CqhluDSP.js +0 -1
  773. package/web-ui/build/static/lolcode-Ck0rxP3x.js +0 -1
  774. package/web-ui/build/static/lsl-BwPX-Qjm.js +0 -1
  775. package/web-ui/build/static/lua-4H_Ijh4D.js +0 -1
  776. package/web-ui/build/static/lua-dDdlvQ6u.js +0 -1
  777. package/web-ui/build/static/magma-2nRRraug.js +0 -1
  778. package/web-ui/build/static/makefile-C887R9mV.js +0 -1
  779. package/web-ui/build/static/makefile-hlNtZePL.js +0 -1
  780. package/web-ui/build/static/markdown-DCALPnuW.js +0 -1
  781. package/web-ui/build/static/markdown-DGM_Z5tW.js +0 -1
  782. package/web-ui/build/static/markup-templating-PAvYDmBZ.js +0 -1
  783. package/web-ui/build/static/mathematica-CGL-Gomp.js +0 -1
  784. package/web-ui/build/static/matlab-C46ZZzlH.js +0 -1
  785. package/web-ui/build/static/matlab-WUgx8roJ.js +0 -1
  786. package/web-ui/build/static/maxima-Dd_TIy4H.js +0 -1
  787. package/web-ui/build/static/maxscript-f8SP9Ybn.js +0 -1
  788. package/web-ui/build/static/mel-6l2ZAh7F.js +0 -1
  789. package/web-ui/build/static/mel-BYdNMJzZ.js +0 -1
  790. package/web-ui/build/static/mercury-CdHf1buq.js +0 -1
  791. package/web-ui/build/static/mermaid-IRgUMtb1.js +0 -1
  792. package/web-ui/build/static/mipsasm-CRPpDKP4.js +0 -1
  793. package/web-ui/build/static/mizar-B4DBCLSi.js +0 -1
  794. package/web-ui/build/static/mizar-DiuZyDh7.js +0 -1
  795. package/web-ui/build/static/mojolicious-ChuQv8wb.js +0 -1
  796. package/web-ui/build/static/mongodb-CE5Epj0T.js +0 -1
  797. package/web-ui/build/static/monkey-BAz4pIwb.js +0 -1
  798. package/web-ui/build/static/monkey-i_g3gMkJ.js +0 -1
  799. package/web-ui/build/static/moonscript-BNaNpboV.js +0 -1
  800. package/web-ui/build/static/moonscript-uHlQVjxf.js +0 -1
  801. package/web-ui/build/static/n1ql-CBDLma2D.js +0 -1
  802. package/web-ui/build/static/n1ql-u4YLlLfk.js +0 -1
  803. package/web-ui/build/static/n4js-IVFjZEMP.js +0 -1
  804. package/web-ui/build/static/nand2tetris-hdl-Ba72aD32.js +0 -1
  805. package/web-ui/build/static/naniscript-CjMhybrb.js +0 -1
  806. package/web-ui/build/static/nasm-DjKhk70h.js +0 -1
  807. package/web-ui/build/static/neon-JEhMoh8P.js +0 -1
  808. package/web-ui/build/static/nevod-6tgpQVCA.js +0 -1
  809. package/web-ui/build/static/nginx-C6NwXcw_.js +0 -1
  810. package/web-ui/build/static/nginx-CquSTZbP.js +0 -1
  811. package/web-ui/build/static/nim-0bOOYxfL.js +0 -1
  812. package/web-ui/build/static/nim-aCQGMs_4.js +0 -1
  813. package/web-ui/build/static/nix-BV4kRCY_.js +0 -1
  814. package/web-ui/build/static/nix-FvSL2V8j.js +0 -1
  815. package/web-ui/build/static/node-repl-GtjTvb93.js +0 -1
  816. package/web-ui/build/static/nsis-DsftItKH.js +0 -1
  817. package/web-ui/build/static/nsis-pu7O80Pq.js +0 -1
  818. package/web-ui/build/static/objectivec-Bx7Bj0U_.js +0 -1
  819. package/web-ui/build/static/objectivec-GtO6Znp9.js +0 -1
  820. package/web-ui/build/static/ocaml-B71sR3qa.js +0 -1
  821. package/web-ui/build/static/ocaml-BlhoK75p.js +0 -1
  822. package/web-ui/build/static/opencl-40JZ6XXw.js +0 -1
  823. package/web-ui/build/static/openqasm-cDL6l7w3.js +0 -1
  824. package/web-ui/build/static/openscad-BQ0gNGv9.js +0 -1
  825. package/web-ui/build/static/oxygene-1fX2ftBa.js +0 -1
  826. package/web-ui/build/static/oz-Cgq2yQZq.js +0 -1
  827. package/web-ui/build/static/parigp-DfRO3DxU.js +0 -1
  828. package/web-ui/build/static/parser-hZcHrq-n.js +0 -1
  829. package/web-ui/build/static/parser3-Cf2p4Ryg.js +0 -1
  830. package/web-ui/build/static/pascal-C6tg_yvS.js +0 -1
  831. package/web-ui/build/static/pascaligo-9U9PdOS6.js +0 -1
  832. package/web-ui/build/static/pcaxis-B5EnEKrt.js +0 -1
  833. package/web-ui/build/static/peoplecode-Cf2sGzFJ.js +0 -1
  834. package/web-ui/build/static/perl-C9FNSHZx.js +0 -1
  835. package/web-ui/build/static/perl-uzSwl6wJ.js +0 -1
  836. package/web-ui/build/static/pf-C7Bjci1q.js +0 -1
  837. package/web-ui/build/static/pgsql-IBD1Cka7.js +0 -1
  838. package/web-ui/build/static/php-19XvqtTQ.js +0 -1
  839. package/web-ui/build/static/php-CUjVuQ1J.js +0 -1
  840. package/web-ui/build/static/php-extras-GWBU2Qbm.js +0 -1
  841. package/web-ui/build/static/php-template-Chtii014.js +0 -1
  842. package/web-ui/build/static/phpdoc-BLcJXgrV.js +0 -1
  843. package/web-ui/build/static/plaintext-BX3hHjdj.js +0 -1
  844. package/web-ui/build/static/plsql-tCcTmmsx.js +0 -1
  845. package/web-ui/build/static/pony-CKD16QkU.js +0 -1
  846. package/web-ui/build/static/powerquery-DXj7kqMe.js +0 -1
  847. package/web-ui/build/static/powershell-0jB2gvRR.js +0 -1
  848. package/web-ui/build/static/powershell-Ca6UjZV2.js +0 -1
  849. package/web-ui/build/static/processing-CPjwH4wc.js +0 -1
  850. package/web-ui/build/static/processing-ItKy7l8u.js +0 -1
  851. package/web-ui/build/static/profile-6N_Rzycx.js +0 -1
  852. package/web-ui/build/static/prolog-BV3TgLfG.js +0 -1
  853. package/web-ui/build/static/prolog-C5UoVyBz.js +0 -1
  854. package/web-ui/build/static/promql-CZot8Bw3.js +0 -1
  855. package/web-ui/build/static/properties-C_r_5f7N.js +0 -1
  856. package/web-ui/build/static/properties-qycKL1T0.js +0 -1
  857. package/web-ui/build/static/protobuf-BmdKEOw6.js +0 -1
  858. package/web-ui/build/static/protobuf-CxWC8PvT.js +0 -1
  859. package/web-ui/build/static/psl-CFSNRM7z.js +0 -1
  860. package/web-ui/build/static/pug-8dv12FtI.js +0 -1
  861. package/web-ui/build/static/puppet-CNjskGXn.js +0 -1
  862. package/web-ui/build/static/puppet-Cf6xZODN.js +0 -1
  863. package/web-ui/build/static/pure-exFir566.js +0 -1
  864. package/web-ui/build/static/purebasic-Bm6QaKku.js +0 -1
  865. package/web-ui/build/static/purebasic-lfzND9Qp.js +0 -1
  866. package/web-ui/build/static/purescript-D1xRYVQG.js +0 -1
  867. package/web-ui/build/static/python-DgkOjU0T.js +0 -1
  868. package/web-ui/build/static/python-o7BJVaX6.js +0 -1
  869. package/web-ui/build/static/python-repl-6SyonvH1.js +0 -1
  870. package/web-ui/build/static/q-CiQ2AFzU.js +0 -1
  871. package/web-ui/build/static/q-g7rEIWgm.js +0 -1
  872. package/web-ui/build/static/qml-ARc9Akfg.js +0 -1
  873. package/web-ui/build/static/qml-rVumxss_.js +0 -1
  874. package/web-ui/build/static/qore-CUXpqOSx.js +0 -1
  875. package/web-ui/build/static/qsharp-DMPNcgaz.js +0 -1
  876. package/web-ui/build/static/r-DCIo6joW.js +0 -1
  877. package/web-ui/build/static/r-nUBzz4LB.js +0 -1
  878. package/web-ui/build/static/racket--fPY_Q4o.js +0 -1
  879. package/web-ui/build/static/reason-CeVN9vJx.js +0 -1
  880. package/web-ui/build/static/reasonml-49SEasi3.js +0 -1
  881. package/web-ui/build/static/regex-BS97XMMk.js +0 -1
  882. package/web-ui/build/static/rego-Brc7DU11.js +0 -1
  883. package/web-ui/build/static/renpy-C2sPWAHv.js +0 -1
  884. package/web-ui/build/static/rest-DlZ7ycRe.js +0 -1
  885. package/web-ui/build/static/rib-C8WsA4on.js +0 -1
  886. package/web-ui/build/static/rip-dd9bS3Ar.js +0 -1
  887. package/web-ui/build/static/roboconf-CAEw-rS3.js +0 -1
  888. package/web-ui/build/static/roboconf-D0TfrLeu.js +0 -1
  889. package/web-ui/build/static/robotframework-CkgVY4bX.js +0 -1
  890. package/web-ui/build/static/routeros-DIek1v-Z.js +0 -1
  891. package/web-ui/build/static/rsl-DExhHtA1.js +0 -1
  892. package/web-ui/build/static/ruby-BjvzODgO.js +0 -1
  893. package/web-ui/build/static/ruby-Dflr1gcA.js +0 -1
  894. package/web-ui/build/static/ruleslanguage-BgzP6UBl.js +0 -1
  895. package/web-ui/build/static/rust-DxIro-GW.js +0 -1
  896. package/web-ui/build/static/rust-qWzP5Jcw.js +0 -1
  897. package/web-ui/build/static/sas-BrCJWU_w.js +0 -1
  898. package/web-ui/build/static/sas-itaOGZ-D.js +0 -1
  899. package/web-ui/build/static/sass-BTk1_hyU.js +0 -1
  900. package/web-ui/build/static/scala-DEtImhEo.js +0 -1
  901. package/web-ui/build/static/scala-DdZCH_nS.js +0 -1
  902. package/web-ui/build/static/scheme-CiOCQffl.js +0 -1
  903. package/web-ui/build/static/scheme-WaU-JPJX.js +0 -1
  904. package/web-ui/build/static/scilab-03tyg0ft.js +0 -1
  905. package/web-ui/build/static/scss-DXl2WSdH.js +0 -1
  906. package/web-ui/build/static/scss-movJ3vcX.js +0 -1
  907. package/web-ui/build/static/shell-DWmlNcrf.js +0 -1
  908. package/web-ui/build/static/shell-session-lHcfQbT0.js +0 -1
  909. package/web-ui/build/static/smali-7RKwn9RZ.js +0 -1
  910. package/web-ui/build/static/smali-TEMQ7bRM.js +0 -1
  911. package/web-ui/build/static/smalltalk-B_nVEfab.js +0 -1
  912. package/web-ui/build/static/smalltalk-BsA9wucb.js +0 -1
  913. package/web-ui/build/static/smarty-DSf4s_8v.js +0 -1
  914. package/web-ui/build/static/sml-BDO_Hmie.js +0 -1
  915. package/web-ui/build/static/sml-DKuy82zG.js +0 -1
  916. package/web-ui/build/static/solidity-jtWv6laA.js +0 -1
  917. package/web-ui/build/static/solution-file-DcfiquuJ.js +0 -1
  918. package/web-ui/build/static/soy-DmBVrDYd.js +0 -1
  919. package/web-ui/build/static/sparql-_JOxZ7fM.js +0 -1
  920. package/web-ui/build/static/splunk-spl-CHeBtp33.js +0 -1
  921. package/web-ui/build/static/sqf-9wI8rp5o.js +0 -1
  922. package/web-ui/build/static/sqf-BuKh30bG.js +0 -1
  923. package/web-ui/build/static/sql-ClFFHGMY.js +0 -1
  924. package/web-ui/build/static/sql-DVXtimpW.js +0 -1
  925. package/web-ui/build/static/sql_more-CNw-JJON.js +0 -1
  926. package/web-ui/build/static/squirrel-Bdi8LbT5.js +0 -1
  927. package/web-ui/build/static/stan-Brcz64A8.js +0 -1
  928. package/web-ui/build/static/stan-C9Q08Juk.js +0 -1
  929. package/web-ui/build/static/stata-ES8hryw_.js +0 -1
  930. package/web-ui/build/static/step21-Cfmoq4Lb.js +0 -1
  931. package/web-ui/build/static/stylus-DMKHLSvm.js +0 -1
  932. package/web-ui/build/static/stylus-Dcs8vyW2.js +0 -1
  933. package/web-ui/build/static/subunit-DRjv565H.js +0 -1
  934. package/web-ui/build/static/swift-0x_T9zx8.js +0 -1
  935. package/web-ui/build/static/swift-CUvpRg4a.js +0 -1
  936. package/web-ui/build/static/systemd-Dl8xGVv9.js +0 -1
  937. package/web-ui/build/static/t4-cs-DqvXuZwc.js +0 -1
  938. package/web-ui/build/static/t4-templating-DjN2N1uM.js +0 -1
  939. package/web-ui/build/static/t4-vb-CZQn9IVK.js +0 -1
  940. package/web-ui/build/static/taggerscript-CPCJkC2t.js +0 -1
  941. package/web-ui/build/static/tap-BPfuLhe7.js +0 -1
  942. package/web-ui/build/static/tap-CSdsd38Q.js +0 -1
  943. package/web-ui/build/static/tcl-4BqhAKLC.js +0 -1
  944. package/web-ui/build/static/tcl-Bh0Jg8jj.js +0 -1
  945. package/web-ui/build/static/textile-BiD4awlU.js +0 -1
  946. package/web-ui/build/static/thrift-Br1-10xh.js +0 -1
  947. package/web-ui/build/static/toml-QlLCqVpQ.js +0 -1
  948. package/web-ui/build/static/tp-B2Ef9EBz.js +0 -1
  949. package/web-ui/build/static/tremor-DuZdAfVr.js +0 -1
  950. package/web-ui/build/static/tsx-W3KEjccO.js +0 -1
  951. package/web-ui/build/static/tt2-D_tdF-56.js +0 -1
  952. package/web-ui/build/static/turtle-DxrQkFoq.js +0 -1
  953. package/web-ui/build/static/twig-DD44ApyU.js +0 -1
  954. package/web-ui/build/static/twig-vA3ZwAxn.js +0 -1
  955. package/web-ui/build/static/typescript-BfbcKNOu.js +0 -1
  956. package/web-ui/build/static/typescript-CvKtq1ix.js +0 -1
  957. package/web-ui/build/static/typoscript-BEu84JpE.js +0 -1
  958. package/web-ui/build/static/unrealscript-ohUNsJGM.js +0 -1
  959. package/web-ui/build/static/uorazor-BWer-chm.js +0 -1
  960. package/web-ui/build/static/uri-CPLTr_NY.js +0 -1
  961. package/web-ui/build/static/v-gAkMRmmI.js +0 -1
  962. package/web-ui/build/static/vala-Bktj5SNB.js +0 -1
  963. package/web-ui/build/static/vala-D1fDPFxI.js +0 -1
  964. package/web-ui/build/static/vbnet-Cn0g0ohh.js +0 -1
  965. package/web-ui/build/static/vbnet-TiYHF2WM.js +0 -1
  966. package/web-ui/build/static/vbscript-BUV-Kjvs.js +0 -1
  967. package/web-ui/build/static/vbscript-html-s1RgByjf.js +0 -1
  968. package/web-ui/build/static/velocity-DTy-TOwB.js +0 -1
  969. package/web-ui/build/static/verilog-4jk4MMXN.js +0 -1
  970. package/web-ui/build/static/verilog-aR4U-DJX.js +0 -1
  971. package/web-ui/build/static/vhdl-D72XnBZR.js +0 -1
  972. package/web-ui/build/static/vhdl-DFdtG28B.js +0 -1
  973. package/web-ui/build/static/vim-BMqsbQ-a.js +0 -1
  974. package/web-ui/build/static/vim-Cc3UuKOs.js +0 -1
  975. package/web-ui/build/static/visual-basic-CyC2kNGV.js +0 -1
  976. package/web-ui/build/static/warpscript-DpKFeISB.js +0 -1
  977. package/web-ui/build/static/wasm-SPljCkFH.js +0 -1
  978. package/web-ui/build/static/web-idl-Cie2yHU9.js +0 -1
  979. package/web-ui/build/static/wiki-BfYfwsBk.js +0 -1
  980. package/web-ui/build/static/wolfram-Dgi1K2gQ.js +0 -1
  981. package/web-ui/build/static/wren-CFQxgLld.js +0 -1
  982. package/web-ui/build/static/x86asm-CBIt2r64.js +0 -1
  983. package/web-ui/build/static/xeora-e5JHDF1T.js +0 -1
  984. package/web-ui/build/static/xl-CPZe-czl.js +0 -1
  985. package/web-ui/build/static/xml-BEuPuoS1.js +0 -1
  986. package/web-ui/build/static/xml-doc-DTOJGYE2.js +0 -1
  987. package/web-ui/build/static/xojo-ByMSKdYJ.js +0 -1
  988. package/web-ui/build/static/xquery--5iaD5oE.js +0 -1
  989. package/web-ui/build/static/xquery-DJp5PXZo.js +0 -1
  990. package/web-ui/build/static/yaml-CH8EnM9M.js +0 -1
  991. package/web-ui/build/static/yaml-mKr8oN1v.js +0 -1
  992. package/web-ui/build/static/yang-Nqdvm2mQ.js +0 -1
  993. package/web-ui/build/static/zephir-BJZaDzrW.js +0 -1
  994. package/web-ui/build/static/zig-DRkhvZLn.js +0 -1
@@ -1,897 +1,919 @@
1
- /**
2
- * TagParser - Utility for parsing JSON tool commands
3
- *
4
- * Purpose:
5
- * - Parse JSON tool commands from agent messages (LLM industry standard)
6
- * - Extract parameters from JSON format
7
- * - Agent redirect parsing
8
- *
9
- * Supported format:
10
- * - JSON code blocks: ```json {"toolId": "...", "parameters": {...}} ```
11
- */
12
-
13
- import {
14
- AGENT_REDIRECT_ATTRIBUTES
15
- } from './constants.js';
16
- import {
17
- TOOL_IDS,
18
- COMMAND_FORMATS,
19
- JSON_STRUCTURES,
20
- identifyJsonStructure,
21
- getToolIdFromAction,
22
- isValidToolId
23
- } from './toolConstants.js';
24
- import { parseJSONWithRepair, looksLikeTruncatedJSON } from './jsonRepair.js';
25
-
26
- class TagParser {
27
- constructor() {
28
- // Tag parsing patterns - JSON only (industry standard)
29
- this.patterns = {
30
- attribute: /([\w-]+)=["']([^"']*)["']/g,
31
- agentRedirect: /\[agent-redirect\s+([^\]]*)\](.*?)\[\/agent-redirect\]/gs,
32
- jsonBlock: /```json\s*(\{[\s\S]*?\})\s*```/g,
33
- // Also match plain JSON objects on their own line(s) as fallback
34
- plainJson: /^(\{(?:[^{}]|(?:\{[^{}]*\}))*\})$/gm
35
- };
36
- }
37
-
38
- /**
39
- * Decode HTML entities that might be present in tool content
40
- * @param {string} text - Text that might contain HTML entities
41
- * @returns {string} Decoded text
42
- */
43
- decodeHtmlEntities(text) {
44
- const entityMap = {
45
- '&lt;': '<',
46
- '&gt;': '>',
47
- '&amp;': '&',
48
- '&quot;': '"',
49
- '&#x27;': "'",
50
- '&#x2F;': '/',
51
- '&#39;': "'",
52
- '&#47;': '/'
53
- };
54
-
55
- return text.replace(/&(?:lt|gt|amp|quot|#x27|#x2F|#39|#47);/g, match => entityMap[match] || match);
56
- }
57
-
58
- /**
59
- * Extract tool commands from message content (JSON format only)
60
- * @param {string} content - Message content to parse
61
- * @returns {Array} Array of parsed tool commands
62
- */
63
- extractToolCommands(content) {
64
- const commands = [];
65
-
66
- // Decode HTML entities that might be present in the content
67
- const decodedContent = this.decodeHtmlEntities(content);
68
-
69
- // PHASE 1: Extract JSON code blocks (LLM industry standard format)
70
- // Format: ```json {"toolId": "...", "parameters": {...}} ```
71
- const jsonCodeBlockCommands = this.extractJSONCodeBlocks(decodedContent);
72
- commands.push(...jsonCodeBlockCommands);
73
-
74
- // PHASE 2: Sanitize content by removing already-extracted JSON blocks
75
- // This prevents duplicate extraction
76
- const sanitizedContent = this.removeJsonBlocks(decodedContent);
77
-
78
- // PHASE 3: Extract plain JSON (fallback for agents that don't use code blocks)
79
- // This should rarely find anything if agents follow the ```json block convention
80
- const plainJsonCommands = this.extractPlainJSON(sanitizedContent);
81
- commands.push(...plainJsonCommands);
82
-
83
- return commands;
84
- }
85
-
86
- /**
87
- * Extract top-level parameters from JSON data (excluding toolId)
88
- * Used as fallback when JSON doesn't use standard parameters/actions/files wrappers
89
- * @param {Object} jsonData - JSON data to extract from
90
- * @returns {Object} Extracted parameters
91
- * @private
92
- */
93
- _extractTopLevelParams(jsonData) {
94
- const params = {};
95
- for (const [key, value] of Object.entries(jsonData)) {
96
- // Skip the tool identifier keys
97
- if (key !== 'toolId' && key !== 'tool') {
98
- params[key] = value;
99
- }
100
- }
101
- return params;
102
- }
103
-
104
- /**
105
- * Remove JSON code blocks from content to prevent duplicate extraction
106
- * @param {string} content - Content to sanitize
107
- * @returns {string} Content with JSON code blocks removed
108
- * @private
109
- */
110
- removeJsonBlocks(content) {
111
- let sanitized = content;
112
- let position = 0;
113
-
114
- while (position < sanitized.length) {
115
- const startMarker = '```json';
116
- const endMarker = '```';
117
-
118
- const startIndex = sanitized.indexOf(startMarker, position);
119
- if (startIndex === -1) break;
120
-
121
- const contentStart = startIndex + startMarker.length;
122
- const endIndex = sanitized.indexOf(endMarker, contentStart);
123
- if (endIndex === -1) break;
124
-
125
- // Replace JSON code block with placeholder
126
- const before = sanitized.substring(0, startIndex);
127
- const after = sanitized.substring(endIndex + endMarker.length);
128
- sanitized = before + '[JSON_BLOCK_REMOVED]' + after;
129
-
130
- position = startIndex + '[JSON_BLOCK_REMOVED]'.length;
131
- }
132
-
133
- return sanitized;
134
- }
135
-
136
- /**
137
- * Extract JSON from markdown code blocks using string functions
138
- * @private
139
- */
140
- extractJSONCodeBlocks(content) {
141
- const commands = [];
142
- let searchIndex = 0;
143
-
144
- while (true) {
145
- // Find opening marker
146
- const startMarker = '```json';
147
- const endMarker = '```';
148
-
149
- const startIndex = content.indexOf(startMarker, searchIndex);
150
- if (startIndex === -1) break;
151
-
152
- // Find closing marker - MUST find the MATCHING one, not nested ones
153
- const contentStart = startIndex + startMarker.length;
154
- const endIndex = this._findMatchingCodeBlockEnd(content, contentStart);
155
- if (endIndex === -1) break;
156
-
157
- // Extract JSON content
158
- const jsonString = content.substring(contentStart, endIndex).trim();
159
-
160
- // Use repair-capable JSON parser to handle truncated responses
161
- const parseResult = parseJSONWithRepair(jsonString, { silent: false });
162
-
163
- if (parseResult.error) {
164
- // Even repair failed - skip this block
165
- console.log('TagParser DEBUG: JSON parse failed even with repair:', parseResult.error);
166
- searchIndex = endIndex + endMarker.length;
167
- continue;
168
- }
169
-
170
- const jsonData = parseResult.data;
171
- const wasRepaired = parseResult.wasRepaired;
172
- const wasTruncated = parseResult.wasTruncated;
173
-
174
- if (wasRepaired) {
175
- console.log('TagParser DEBUG: JSON was repaired', {
176
- wasTruncated,
177
- originalLength: jsonString.length,
178
- repairedLength: parseResult.repaired?.length
179
- });
180
- }
181
-
182
- if (this.isToolCommandJSON(jsonData)) {
183
- // ARCHITECTURAL PRINCIPLE: Use OUTER layer (toolId) for tool identification
184
- const toolId = jsonData.toolId || jsonData.tool;
185
-
186
- // Skip if no explicit outer tool identifier
187
- if (!toolId || toolId === 'unknown') {
188
- console.log('TagParser DEBUG: Skipping JSON block - missing explicit toolId');
189
- searchIndex = endIndex + endMarker.length;
190
- continue;
191
- }
192
-
193
- // Extract parameters from JSON:
194
- // - If 'parameters' wrapper exists, use it (standard format)
195
- // - Otherwise, extract ALL top-level properties (operation, headless, actions, files, etc.)
196
- // This ensures tools like 'web' receive operation alongside actions
197
- let extractedParams;
198
- if (jsonData.parameters) {
199
- extractedParams = { ...jsonData.parameters };
200
- // Hoist top-level `action` into the param object when the
201
- // agent emits the action-at-top/params-nested shape:
202
- // { toolId, action: "...", parameters: { url: "..." } }
203
- // Tools that dispatch on `params.action` (visual-editor,
204
- // memory, codemap, etc.) would otherwise never see the
205
- // action and silently fall through to whatever default their
206
- // parseParameters has — which for visual-editor is
207
- // get-context, bypassing set-app-url / open-editor / serve-static
208
- // entirely. Hoisting is guarded so an action nested inside
209
- // parameters (rare but valid) still wins.
210
- if (jsonData.action && !extractedParams.action) {
211
- extractedParams.action = jsonData.action;
212
- }
213
- } else {
214
- // Extract all top-level params (excluding toolId) - includes operation, headless, actions, files, etc.
215
- extractedParams = this._extractTopLevelParams(jsonData);
216
- }
217
-
218
- const command = {
219
- type: COMMAND_FORMATS.JSON,
220
- toolId: toolId,
221
- parameters: extractedParams,
222
- actions: jsonData.actions,
223
- rawContent: content.substring(startIndex, endIndex + endMarker.length),
224
- jsonData,
225
- // Mark if this was repaired/truncated for tool to handle appropriately
226
- wasRepaired,
227
- wasTruncated
228
- };
229
-
230
- commands.push(command);
231
- }
232
-
233
- // Handle toolCommands array format
234
- if (jsonData.toolCommands && Array.isArray(jsonData.toolCommands)) {
235
- for (const toolCommand of jsonData.toolCommands) {
236
- if (this.isToolCommandJSON(toolCommand)) {
237
- // ARCHITECTURAL PRINCIPLE: Use OUTER layer (toolId) for tool identification
238
- const toolId = toolCommand.toolId || toolCommand.tool;
239
-
240
- // Skip if no explicit outer tool identifier
241
- if (!toolId || toolId === 'unknown') {
242
- console.log('TagParser DEBUG: Skipping toolCommand - missing explicit toolId');
243
- continue;
244
- }
245
-
246
- // Extract parameters using same logic as single commands,
247
- // including the top-level `action` hoist (see above for the
248
- // rationale — visual-editor and other action-dispatched
249
- // tools were silently executing the wrong action path).
250
- let cmdParams;
251
- if (toolCommand.parameters) {
252
- cmdParams = { ...toolCommand.parameters };
253
- if (toolCommand.action && !cmdParams.action) {
254
- cmdParams.action = toolCommand.action;
255
- }
256
- } else {
257
- // Extract all top-level params (operation, headless, actions, files, etc.)
258
- cmdParams = this._extractTopLevelParams(toolCommand);
259
- }
260
-
261
- const command = {
262
- type: COMMAND_FORMATS.JSON,
263
- toolId: toolId,
264
- parameters: cmdParams,
265
- actions: toolCommand.actions,
266
- rawContent: JSON.stringify(toolCommand, null, 2),
267
- jsonData: toolCommand,
268
- wasRepaired,
269
- wasTruncated
270
- };
271
-
272
- commands.push(command);
273
- }
274
- }
275
- }
276
-
277
- searchIndex = endIndex + endMarker.length;
278
- }
279
-
280
- return commands;
281
- }
282
-
283
- /**
284
- * Extract plain JSON objects using string functions
285
- * @private
286
- */
287
- extractPlainJSON(content) {
288
- const commands = [];
289
- const lines = content.split('\n');
290
-
291
- for (let i = 0; i < lines.length; i++) {
292
- const line = lines[i].trim();
293
-
294
- // Skip if line doesn't start with {
295
- if (!line.startsWith('{')) continue;
296
-
297
- // Try to find complete JSON object
298
- let jsonString = '';
299
- let braceCount = 0;
300
- let foundComplete = false;
301
-
302
- // Start from current line and look for complete JSON
303
- for (let j = i; j < lines.length; j++) {
304
- const currentLine = lines[j].trim();
305
- jsonString += (j > i ? '\n' : '') + currentLine;
306
-
307
- // Count braces to find complete object
308
- for (const char of currentLine) {
309
- if (char === '{') braceCount++;
310
- if (char === '}') braceCount--;
311
- if (braceCount === 0 && char === '}') {
312
- foundComplete = true;
313
- break;
314
- }
315
- }
316
-
317
- if (foundComplete) break;
318
- }
319
-
320
- if (!foundComplete) continue;
321
-
322
- // Use repair-capable JSON parser
323
- const parseResult = parseJSONWithRepair(jsonString, { silent: true });
324
-
325
- if (parseResult.error) {
326
- // Even repair failed - skip
327
- continue;
328
- }
329
-
330
- const jsonData = parseResult.data;
331
- const wasRepaired = parseResult.wasRepaired;
332
- const wasTruncated = parseResult.wasTruncated;
333
-
334
- // ARCHITECTURAL PRINCIPLE: Use OUTER layer for tool identification
335
- // Only parse INNER content (actions, type) if OUTER identifier missing
336
- // This follows the layered invocation hierarchy:
337
- // OUTER (message level): Tool identification via "toolId"
338
- // INNER (payload level): Action specification via "type"
339
-
340
- // Check if this JSON looks like a tool command
341
- if (this.isToolCommandJSON(jsonData) ||
342
- (jsonData.actions && Array.isArray(jsonData.actions)) ||
343
- (jsonData.type && typeof jsonData.type === 'string')) {
344
-
345
- // CRITICAL: Use OUTER identifier first, only infer from INNER as fallback
346
- const toolId = jsonData.toolId || jsonData.tool || this.inferToolFromActions(jsonData);
347
-
348
- // Skip if we couldn't determine a valid tool
349
- if (!toolId || toolId === 'unknown') {
350
- console.log('TagParser DEBUG: Skipping plain JSON - could not determine valid toolId');
351
- continue;
352
- }
353
-
354
- const command = {
355
- type: COMMAND_FORMATS.JSON_PLAIN,
356
- toolId: toolId,
357
- // Use parameters if wrapped, otherwise extract all top-level params (excluding toolId)
358
- parameters: jsonData.parameters || this._extractTopLevelParams(jsonData),
359
- actions: jsonData.actions,
360
- rawContent: jsonString,
361
- jsonData,
362
- warning: 'Plain JSON detected - should use ```json blocks',
363
- wasRepaired,
364
- wasTruncated
365
- };
366
-
367
- commands.push(command);
368
- }
369
- }
370
-
371
- return commands;
372
- }
373
-
374
- /**
375
- * Infer tool ID from JSON structure
376
- * Uses the constants-based approach for deterministic tool identification
377
- * @private
378
- */
379
- inferToolFromActions(jsonData) {
380
- const structure = identifyJsonStructure(jsonData);
381
-
382
- switch (structure) {
383
- case JSON_STRUCTURES.STANDARD:
384
- // Already has toolId
385
- return jsonData.toolId || 'unknown';
386
-
387
- case JSON_STRUCTURES.ACTIONS_ARRAY:
388
- // Get tool from first action type
389
- if (jsonData.actions && jsonData.actions.length > 0) {
390
- const firstAction = jsonData.actions[0];
391
- const toolId = getToolIdFromAction(firstAction.type);
392
- return toolId || 'unknown';
393
- }
394
- break;
395
-
396
- case JSON_STRUCTURES.DIRECT_ACTION:
397
- // Get tool from type field
398
- const toolId = getToolIdFromAction(jsonData.type);
399
- return toolId || 'unknown';
400
-
401
- case JSON_STRUCTURES.TOOL_COMMANDS:
402
- // Get from first command
403
- if (jsonData.toolCommands && jsonData.toolCommands.length > 0) {
404
- return this.inferToolFromActions(jsonData.toolCommands[0]);
405
- }
406
- break;
407
- }
408
-
409
- return 'unknown';
410
- }
411
-
412
- /**
413
- * Extract agent redirects from content
414
- * @param {string} content - Content to parse
415
- * @returns {Array} Array of parsed agent redirects
416
- */
417
- extractAgentRedirects(content) {
418
- const redirects = [];
419
-
420
- const matches = this.matchAll(content, this.patterns.agentRedirect);
421
-
422
- for (const match of matches) {
423
- const attributeString = match.groups[0];
424
- const messageContent = match.groups[1].trim();
425
-
426
- const attributes = this.parseAttributes(attributeString);
427
-
428
- const redirect = {
429
- to: attributes.to,
430
- content: messageContent,
431
- urgent: attributes[AGENT_REDIRECT_ATTRIBUTES.URGENT] === 'true',
432
- requiresResponse: attributes[AGENT_REDIRECT_ATTRIBUTES.REQUIRES_RESPONSE] === 'true',
433
- context: attributes[AGENT_REDIRECT_ATTRIBUTES.CONTEXT],
434
- rawMatch: match.match
435
- };
436
-
437
- // Add any additional attributes
438
- for (const [key, value] of Object.entries(attributes)) {
439
- if (!['to', AGENT_REDIRECT_ATTRIBUTES.URGENT, AGENT_REDIRECT_ATTRIBUTES.REQUIRES_RESPONSE, AGENT_REDIRECT_ATTRIBUTES.CONTEXT].includes(key)) {
440
- redirect[key] = value;
441
- }
442
- }
443
-
444
- redirects.push(redirect);
445
- }
446
-
447
- return redirects;
448
- }
449
-
450
- /**
451
- * Parse XML parameters from tool content
452
- * @param {string} content - Tool content to parse
453
- * @returns {Object} Parsed parameters
454
- */
455
- parseXMLParameters(content) {
456
- const parameters = {};
457
-
458
- console.log('TagParser DEBUG: parseXMLParameters - content length:', content.length);
459
-
460
- let position = 0;
461
- let foundCount = 0;
462
-
463
- // Look for opening tags like <write>, <read>, etc.
464
- while (position < content.length) {
465
- const openTagStart = content.indexOf('<', position);
466
- if (openTagStart === -1) break;
467
-
468
- const openTagEnd = content.indexOf('>', openTagStart);
469
- if (openTagEnd === -1) break;
470
-
471
- // Extract the full opening tag
472
- const openTag = content.substring(openTagStart, openTagEnd + 1);
473
-
474
- // Parse tag name and attributes from the opening tag
475
- const spaceIndex = openTag.indexOf(' ');
476
- const tagName = spaceIndex > 0
477
- ? openTag.substring(1, spaceIndex)
478
- : openTag.substring(1, openTag.length - 1);
479
-
480
- const isValid = this.isValidXmlTagName(tagName);
481
-
482
- // Skip malformed tags or content that looks like code
483
- if (tagName.includes('/') || !tagName || !this.isValidXmlTagName(tagName)) {
484
- position = openTagEnd + 1;
485
- continue;
486
- }
487
-
488
- // Check if this is a self-closing tag (ends with />)
489
- const isSelfClosing = openTag.endsWith('/>');
490
-
491
- let tagContent = '';
492
- let closingTagStart = openTagEnd;
493
-
494
- if (isSelfClosing) {
495
- // Self-closing tag has no content
496
- tagContent = '';
497
- closingTagStart = openTagEnd; // Position right after the self-closing tag
498
- } else {
499
- // Look for the closing tag
500
- const closingTag = `</${tagName}>`;
501
- closingTagStart = content.indexOf(closingTag, openTagEnd + 1);
502
-
503
- if (closingTagStart === -1) {
504
- position = openTagEnd + 1;
505
- continue;
506
- }
507
-
508
- // Extract the content between tags
509
- tagContent = content.substring(openTagEnd + 1, closingTagStart);
510
- }
511
-
512
- // Extract attributes from the opening tag
513
- let attributeString = spaceIndex > 0
514
- ? openTag.substring(spaceIndex + 1, openTag.length - 1).trim()
515
- : '';
516
-
517
- // For self-closing tags, remove the trailing '/' from attributes
518
- if (isSelfClosing && attributeString.endsWith('/')) {
519
- attributeString = attributeString.substring(0, attributeString.length - 1).trim();
520
- }
521
-
522
- const attributes = this.parseAttributes(attributeString);
523
-
524
- console.log('TagParser DEBUG: parseXMLParameters - found match:', {
525
- paramName: tagName,
526
- attributeString,
527
- valueLength: tagContent.length,
528
- valuePreview: tagContent.substring(0, 50) + (tagContent.length > 50 ? '...' : '')
529
- });
530
-
531
- // CRITICAL FIX: Handle multiple tags with same name (e.g., multiple <write> tags)
532
- // Convert to array if duplicate detected
533
- const paramValue = {
534
- value: tagContent.trim(),
535
- attributes
536
- };
537
-
538
- if (parameters[tagName]) {
539
- // Tag already exists - convert to array or append to existing array
540
- if (Array.isArray(parameters[tagName])) {
541
- // Already an array, append
542
- parameters[tagName].push(paramValue);
543
- console.log('TagParser DEBUG: appended to existing array for tag:', tagName, 'count:', parameters[tagName].length);
544
- } else {
545
- // First duplicate - convert to array
546
- const existingValue = parameters[tagName];
547
- parameters[tagName] = [existingValue, paramValue];
548
- console.log('TagParser DEBUG: converted to array for duplicate tag:', tagName);
549
- }
550
- } else {
551
- // First occurrence - store as single object
552
- parameters[tagName] = paramValue;
553
- }
554
-
555
- // For convenience, also store direct access to value (deprecated, kept for backward compatibility)
556
- // Only define if it doesn't exist (handles multiple tags with same name)
557
- const valuePropertyName = tagName + '_value';
558
- if (!Object.prototype.hasOwnProperty.call(parameters, valuePropertyName)) {
559
- Object.defineProperty(parameters, valuePropertyName, {
560
- value: tagContent.trim(),
561
- enumerable: false
562
- });
563
- }
564
-
565
- foundCount++;
566
-
567
- // Update position based on whether it's self-closing or paired tags
568
- if (isSelfClosing) {
569
- position = openTagEnd + 1;
570
- } else {
571
- const closingTag = `</${tagName}>`;
572
- position = closingTagStart + closingTag.length;
573
- }
574
- }
575
-
576
- console.log('TagParser DEBUG: parseXMLParameters - matches found:', foundCount);
577
- console.log('TagParser DEBUG: parseXMLParameters - final parameters:', Object.keys(parameters));
578
- return parameters;
579
- }
580
-
581
- /**
582
- * Parse attributes from attribute string
583
- * @param {string} attributeString - Attribute string to parse
584
- * @returns {Object} Parsed attributes
585
- */
586
- parseAttributes(attributeString) {
587
- const attributes = {};
588
-
589
- if (!attributeString) return attributes;
590
-
591
- const attrMatches = this.matchAll(attributeString, this.patterns.attribute);
592
-
593
- for (const match of attrMatches) {
594
- const attrName = match.groups[0];
595
- const attrValue = match.groups[1];
596
-
597
- attributes[attrName] = attrValue;
598
- }
599
-
600
- return attributes;
601
- }
602
-
603
- /**
604
- * Extract content from tags
605
- * @param {string} content - Content to search
606
- * @param {string} tagName - Tag name to extract
607
- * @returns {Array} Array of extracted content strings
608
- */
609
- static extractContent(content, tagName) {
610
- const pattern = new RegExp(`<${tagName}[^>]*>([^<]*)<\\/${tagName}>`, 'g');
611
- const matches = [];
612
- let match;
613
-
614
- while ((match = pattern.exec(content)) !== null) {
615
- matches.push(match[1].trim());
616
- }
617
-
618
- return matches;
619
- }
620
-
621
- /**
622
- * Extract tag with attributes
623
- * @param {string} content - Content to search
624
- * @param {string} tagName - Tag name to extract
625
- * @returns {Array} Array of extracted tag objects with content and attributes
626
- */
627
- static extractTagsWithAttributes(content, tagName) {
628
- const pattern = new RegExp(`<${tagName}\\s*([^>]*)>([^<]*)<\\/${tagName}>`, 'g');
629
- const tags = [];
630
- let match;
631
-
632
- while ((match = pattern.exec(content)) !== null) {
633
- const attributeString = match[1];
634
- const tagContent = match[2].trim();
635
-
636
- const parser = new TagParser();
637
- const attributes = parser.parseAttributes(attributeString);
638
-
639
- tags.push({
640
- content: tagContent,
641
- attributes,
642
- rawMatch: match[0]
643
- });
644
- }
645
-
646
- return tags;
647
- }
648
-
649
- /**
650
- * Check if JSON object represents a tool command
651
- * @private
652
- */
653
- isToolCommandJSON(obj) {
654
- return obj &&
655
- typeof obj === 'object' &&
656
- (obj.toolId || obj.tool) &&
657
- (obj.parameters || obj.actions || obj.files || this._hasToolParams(obj));
658
- }
659
-
660
- /**
661
- * Check if object has any tool-related parameters (excluding toolId/tool)
662
- * @private
663
- */
664
- _hasToolParams(obj) {
665
- if (!obj || typeof obj !== 'object') return false;
666
- const keys = Object.keys(obj);
667
- // Has more than just toolId/tool
668
- return keys.some(k => k !== 'toolId' && k !== 'tool');
669
- }
670
-
671
- /**
672
- * Match all occurrences of a pattern
673
- * @private
674
- */
675
- matchAll(content, pattern) {
676
- const matches = [];
677
- let match;
678
-
679
- // Reset pattern lastIndex to ensure clean matching
680
- pattern.lastIndex = 0;
681
-
682
- while ((match = pattern.exec(content)) !== null) {
683
- matches.push({
684
- match: match[0],
685
- groups: match.slice(1),
686
- index: match.index
687
- });
688
- }
689
-
690
- return matches;
691
- }
692
-
693
- /**
694
- * Validate tool command structure (JSON format)
695
- * @param {Object} command - Tool command to validate
696
- * @returns {Object} Validation result
697
- */
698
- validateToolCommand(command) {
699
- const errors = [];
700
-
701
- if (!command.toolId) {
702
- errors.push('Missing toolId');
703
- }
704
-
705
- if (!command.parameters && !command.actions) {
706
- errors.push('Missing parameters or actions');
707
- }
708
-
709
- if (command.type === COMMAND_FORMATS.JSON || command.type === COMMAND_FORMATS.JSON_PLAIN) {
710
- if (!command.jsonData) {
711
- errors.push('Missing jsonData for JSON command');
712
- }
713
- }
714
-
715
- return {
716
- valid: errors.length === 0,
717
- errors
718
- };
719
- }
720
-
721
- /**
722
- * Normalize tool command to consistent format (JSON only)
723
- * @param {Object} command - Tool command to normalize
724
- * @returns {Object} Normalized command
725
- */
726
- normalizeToolCommand(command) {
727
- const normalized = {
728
- toolId: command.toolId,
729
- type: command.type,
730
- parameters: {},
731
- rawContent: command.rawContent
732
- };
733
-
734
- // JSON parameters are already in simple format
735
- normalized.parameters = { ...command.parameters };
736
-
737
- // Handle actions array format (common in agentcommunication tool)
738
- if (command.actions && Array.isArray(command.actions)) {
739
- normalized.parameters.actions = command.actions;
740
-
741
- // For agentcommunication tool, extract the action from the first item
742
- if (command.toolId === TOOL_IDS.AGENT_COMMUNICATION && command.actions.length > 0) {
743
- const firstAction = command.actions[0];
744
- normalized.parameters.action = firstAction.type || firstAction.action;
745
- // Spread the rest of the action properties
746
- Object.assign(normalized.parameters, firstAction);
747
- }
748
- }
749
-
750
- return normalized;
751
- }
752
-
753
- /**
754
- * Find the matching closing ``` for a code block, handling nested code blocks
755
- *
756
- * The challenge: JSON content may contain embedded ``` markers (e.g., README with bash examples)
757
- * We need to find the ``` that closes our JSON block, not a nested one inside the content.
758
- *
759
- * Strategy: Parse character by character, tracking if we're inside a JSON string.
760
- * When inside a string, ``` is just content. When outside strings, ``` closes the block.
761
- *
762
- * @param {string} content - Full content to search
763
- * @param {number} startPos - Position after the opening ```json marker
764
- * @returns {number} Position of the closing ```, or -1 if not found
765
- * @private
766
- */
767
- _findMatchingCodeBlockEnd(content, startPos) {
768
- let pos = startPos;
769
- let inString = false;
770
- let escaped = false;
771
-
772
- while (pos < content.length) {
773
- const char = content[pos];
774
-
775
- // Handle escape sequences inside strings
776
- if (escaped) {
777
- escaped = false;
778
- pos++;
779
- continue;
780
- }
781
-
782
- if (char === '\\' && inString) {
783
- escaped = true;
784
- pos++;
785
- continue;
786
- }
787
-
788
- // Track string boundaries
789
- if (char === '"') {
790
- inString = !inString;
791
- pos++;
792
- continue;
793
- }
794
-
795
- // Only look for ``` when we're outside of JSON strings
796
- if (!inString && content.substring(pos, pos + 3) === '```') {
797
- // Check this is the end marker (not another opening like ```bash)
798
- // The closing ``` should be followed by newline, EOF, or just whitespace
799
- const afterMarker = content.substring(pos + 3, pos + 20);
800
- const isClosingMarker = !afterMarker.match(/^[a-zA-Z]/); // Not followed by language name
801
-
802
- if (isClosingMarker) {
803
- return pos;
804
- }
805
- }
806
-
807
- pos++;
808
- }
809
-
810
- // Fallback: if we couldn't find it with state tracking,
811
- // try to find the last ``` in the content (less accurate but better than nothing)
812
- const lastBackticks = content.lastIndexOf('```', content.length);
813
- if (lastBackticks > startPos) {
814
- console.warn('[TagParser] Used fallback method to find closing code block');
815
- return lastBackticks;
816
- }
817
-
818
- return -1;
819
- }
820
-
821
- /**
822
- * Convert kebab-case or snake_case to camelCase
823
- * @private
824
- */
825
- _toCamelCase(str) {
826
- return str.replace(/[-_](.)/g, (_, char) => char.toUpperCase());
827
- }
828
-
829
- /**
830
- * Extract all content between tags, including nested tags
831
- * @param {string} content - Content to search
832
- * @param {string} startTag - Opening tag
833
- * @param {string} endTag - Closing tag
834
- * @returns {Array} Array of extracted content blocks
835
- */
836
- static extractBetweenTags(content, startTag, endTag) {
837
- const blocks = [];
838
- let startIndex = 0;
839
-
840
- while (true) {
841
- const start = content.indexOf(startTag, startIndex);
842
- if (start === -1) break;
843
-
844
- const end = content.indexOf(endTag, start + startTag.length);
845
- if (end === -1) break;
846
-
847
- const blockContent = content.substring(start + startTag.length, end);
848
- blocks.push({
849
- content: blockContent,
850
- fullMatch: content.substring(start, end + endTag.length),
851
- startIndex: start,
852
- endIndex: end + endTag.length
853
- });
854
-
855
- startIndex = end + endTag.length;
856
- }
857
-
858
- return blocks;
859
- }
860
-
861
- /**
862
- * Clean content by removing all tool commands and agent redirects
863
- * @param {string} content - Content to clean
864
- * @returns {string} Cleaned content
865
- */
866
- cleanContent(content) {
867
- let cleaned = content;
868
-
869
- // Remove tool command blocks
870
- cleaned = cleaned.replace(this.patterns.toolCommand, '');
871
-
872
- // Remove agent redirects
873
- cleaned = cleaned.replace(this.patterns.agentRedirect, '');
874
-
875
- // Remove JSON tool command blocks
876
- cleaned = cleaned.replace(this.patterns.jsonBlock, (match, jsonContent) => {
877
- try {
878
- const jsonData = JSON.parse(jsonContent);
879
- if (this.isToolCommandJSON(jsonData) ||
880
- (jsonData.toolCommands && Array.isArray(jsonData.toolCommands))) {
881
- return '';
882
- }
883
- } catch {
884
- // Not a tool command JSON block, keep it
885
- }
886
- return match;
887
- });
888
-
889
- // Clean up excessive whitespace
890
- cleaned = cleaned.replace(/\n\s*\n\s*\n/g, '\n\n');
891
- cleaned = cleaned.trim();
892
-
893
- return cleaned;
894
- }
895
- }
896
-
1
+ /**
2
+ * TagParser - Utility for parsing JSON tool commands
3
+ *
4
+ * Purpose:
5
+ * - Parse JSON tool commands from agent messages (LLM industry standard)
6
+ * - Extract parameters from JSON format
7
+ * - Agent redirect parsing
8
+ *
9
+ * Supported format:
10
+ * - JSON code blocks: ```json {"toolId": "...", "parameters": {...}} ```
11
+ */
12
+
13
+ import {
14
+ AGENT_REDIRECT_ATTRIBUTES
15
+ } from './constants.js';
16
+ import {
17
+ TOOL_IDS,
18
+ COMMAND_FORMATS,
19
+ JSON_STRUCTURES,
20
+ identifyJsonStructure,
21
+ getToolIdFromAction,
22
+ isValidToolId
23
+ } from './toolConstants.js';
24
+ import { parseJSONWithRepair, looksLikeTruncatedJSON } from './jsonRepair.js';
25
+
26
+ class TagParser {
27
+ constructor() {
28
+ // Tag parsing patterns - JSON only (industry standard)
29
+ this.patterns = {
30
+ attribute: /([\w-]+)=["']([^"']*)["']/g,
31
+ agentRedirect: /\[agent-redirect\s+([^\]]*)\](.*?)\[\/agent-redirect\]/gs,
32
+ jsonBlock: /```json\s*(\{[\s\S]*?\})\s*```/g,
33
+ // Also match plain JSON objects on their own line(s) as fallback
34
+ plainJson: /^(\{(?:[^{}]|(?:\{[^{}]*\}))*\})$/gm
35
+ };
36
+ }
37
+
38
+ /**
39
+ * Decode HTML entities that might be present in tool content
40
+ * @param {string} text - Text that might contain HTML entities
41
+ * @returns {string} Decoded text
42
+ */
43
+ decodeHtmlEntities(text) {
44
+ const entityMap = {
45
+ '&lt;': '<',
46
+ '&gt;': '>',
47
+ '&amp;': '&',
48
+ '&quot;': '"',
49
+ '&#x27;': "'",
50
+ '&#x2F;': '/',
51
+ '&#39;': "'",
52
+ '&#47;': '/'
53
+ };
54
+
55
+ return text.replace(/&(?:lt|gt|amp|quot|#x27|#x2F|#39|#47);/g, match => entityMap[match] || match);
56
+ }
57
+
58
+ /**
59
+ * Extract tool commands from message content (JSON format only)
60
+ * @param {string} content - Message content to parse
61
+ * @returns {Array} Array of parsed tool commands
62
+ */
63
+ extractToolCommands(content) {
64
+ const commands = [];
65
+
66
+ // Decode HTML entities that might be present in the content
67
+ const decodedContent = this.decodeHtmlEntities(content);
68
+
69
+ // PHASE 1: Extract JSON code blocks (LLM industry standard format)
70
+ // Format: ```json {"toolId": "...", "parameters": {...}} ```
71
+ const jsonCodeBlockCommands = this.extractJSONCodeBlocks(decodedContent);
72
+ commands.push(...jsonCodeBlockCommands);
73
+
74
+ // PHASE 2: Sanitize content by removing already-extracted JSON blocks
75
+ // This prevents duplicate extraction
76
+ const sanitizedContent = this.removeJsonBlocks(decodedContent);
77
+
78
+ // PHASE 3: Extract plain JSON (fallback for agents that don't use code blocks)
79
+ // This should rarely find anything if agents follow the ```json block convention
80
+ const plainJsonCommands = this.extractPlainJSON(sanitizedContent);
81
+ commands.push(...plainJsonCommands);
82
+
83
+ return commands;
84
+ }
85
+
86
+ /**
87
+ * Extract top-level parameters from JSON data (excluding toolId)
88
+ * Used as fallback when JSON doesn't use standard parameters/actions/files wrappers
89
+ * @param {Object} jsonData - JSON data to extract from
90
+ * @returns {Object} Extracted parameters
91
+ * @private
92
+ */
93
+ _extractTopLevelParams(jsonData) {
94
+ const params = {};
95
+ for (const [key, value] of Object.entries(jsonData)) {
96
+ // Skip the tool identifier keys
97
+ if (key !== 'toolId' && key !== 'tool') {
98
+ params[key] = value;
99
+ }
100
+ }
101
+ return params;
102
+ }
103
+
104
+ /**
105
+ * Remove JSON code blocks from content to prevent duplicate extraction
106
+ * @param {string} content - Content to sanitize
107
+ * @returns {string} Content with JSON code blocks removed
108
+ * @private
109
+ */
110
+ removeJsonBlocks(content) {
111
+ let sanitized = content;
112
+ let position = 0;
113
+
114
+ while (position < sanitized.length) {
115
+ const startMarker = '```json';
116
+ const endMarker = '```';
117
+
118
+ const startIndex = sanitized.indexOf(startMarker, position);
119
+ if (startIndex === -1) break;
120
+
121
+ const contentStart = startIndex + startMarker.length;
122
+ const endIndex = sanitized.indexOf(endMarker, contentStart);
123
+ if (endIndex === -1) break;
124
+
125
+ // Replace JSON code block with placeholder
126
+ const before = sanitized.substring(0, startIndex);
127
+ const after = sanitized.substring(endIndex + endMarker.length);
128
+ sanitized = before + '[JSON_BLOCK_REMOVED]' + after;
129
+
130
+ position = startIndex + '[JSON_BLOCK_REMOVED]'.length;
131
+ }
132
+
133
+ return sanitized;
134
+ }
135
+
136
+ /**
137
+ * Extract JSON from markdown code blocks using string functions
138
+ * @private
139
+ */
140
+ extractJSONCodeBlocks(content) {
141
+ const commands = [];
142
+ let searchIndex = 0;
143
+
144
+ while (true) {
145
+ // Find opening marker
146
+ const startMarker = '```json';
147
+ const endMarker = '```';
148
+
149
+ const startIndex = content.indexOf(startMarker, searchIndex);
150
+ if (startIndex === -1) break;
151
+
152
+ // Find closing marker - MUST find the MATCHING one, not nested ones
153
+ const contentStart = startIndex + startMarker.length;
154
+ const endIndex = this._findMatchingCodeBlockEnd(content, contentStart);
155
+ if (endIndex === -1) break;
156
+
157
+ // Extract JSON content
158
+ const jsonString = content.substring(contentStart, endIndex).trim();
159
+
160
+ // Use repair-capable JSON parser to handle truncated responses
161
+ const parseResult = parseJSONWithRepair(jsonString, { silent: false });
162
+
163
+ if (parseResult.error) {
164
+ // Even repair failed - skip this block
165
+ console.log('TagParser DEBUG: JSON parse failed even with repair:', parseResult.error);
166
+ searchIndex = endIndex + endMarker.length;
167
+ continue;
168
+ }
169
+
170
+ const jsonData = parseResult.data;
171
+ const wasRepaired = parseResult.wasRepaired;
172
+ const wasTruncated = parseResult.wasTruncated;
173
+
174
+ if (wasRepaired) {
175
+ console.log('TagParser DEBUG: JSON was repaired', {
176
+ wasTruncated,
177
+ originalLength: jsonString.length,
178
+ repairedLength: parseResult.repaired?.length
179
+ });
180
+ }
181
+
182
+ if (this.isToolCommandJSON(jsonData)) {
183
+ // ARCHITECTURAL PRINCIPLE: Use OUTER layer (toolId) for tool identification
184
+ const toolId = jsonData.toolId || jsonData.tool;
185
+
186
+ // Skip if no explicit outer tool identifier
187
+ if (!toolId || toolId === 'unknown') {
188
+ console.log('TagParser DEBUG: Skipping JSON block - missing explicit toolId');
189
+ searchIndex = endIndex + endMarker.length;
190
+ continue;
191
+ }
192
+
193
+ // Extract parameters from JSON:
194
+ // - If 'parameters' wrapper exists, use it (standard format)
195
+ // - Otherwise, extract ALL top-level properties (operation, headless, actions, files, etc.)
196
+ // This ensures tools like 'web' receive operation alongside actions
197
+ let extractedParams;
198
+ if (jsonData.parameters) {
199
+ extractedParams = { ...jsonData.parameters };
200
+ // Hoist top-level `action` into the param object when the
201
+ // agent emits the action-at-top/params-nested shape:
202
+ // { toolId, action: "...", parameters: { url: "..." } }
203
+ // Tools that dispatch on `params.action` (visual-editor,
204
+ // memory, codemap, etc.) would otherwise never see the
205
+ // action and silently fall through to whatever default their
206
+ // parseParameters has — which for visual-editor is
207
+ // get-context, bypassing set-app-url / open-editor / serve-static
208
+ // entirely. Hoisting is guarded so an action nested inside
209
+ // parameters (rare but valid) still wins.
210
+ if (jsonData.action && !extractedParams.action) {
211
+ extractedParams.action = jsonData.action;
212
+ }
213
+ } else {
214
+ // Extract all top-level params (excluding toolId) - includes operation, headless, actions, files, etc.
215
+ extractedParams = this._extractTopLevelParams(jsonData);
216
+ }
217
+
218
+ const command = {
219
+ type: COMMAND_FORMATS.JSON,
220
+ toolId: toolId,
221
+ parameters: extractedParams,
222
+ actions: jsonData.actions,
223
+ rawContent: content.substring(startIndex, endIndex + endMarker.length),
224
+ jsonData,
225
+ // Mark if this was repaired/truncated for tool to handle appropriately
226
+ wasRepaired,
227
+ wasTruncated
228
+ };
229
+
230
+ commands.push(command);
231
+ }
232
+
233
+ // Handle toolCommands array format
234
+ if (jsonData.toolCommands && Array.isArray(jsonData.toolCommands)) {
235
+ for (const toolCommand of jsonData.toolCommands) {
236
+ if (this.isToolCommandJSON(toolCommand)) {
237
+ // ARCHITECTURAL PRINCIPLE: Use OUTER layer (toolId) for tool identification
238
+ const toolId = toolCommand.toolId || toolCommand.tool;
239
+
240
+ // Skip if no explicit outer tool identifier
241
+ if (!toolId || toolId === 'unknown') {
242
+ console.log('TagParser DEBUG: Skipping toolCommand - missing explicit toolId');
243
+ continue;
244
+ }
245
+
246
+ // Extract parameters using same logic as single commands,
247
+ // including the top-level `action` hoist (see above for the
248
+ // rationale — visual-editor and other action-dispatched
249
+ // tools were silently executing the wrong action path).
250
+ let cmdParams;
251
+ if (toolCommand.parameters) {
252
+ cmdParams = { ...toolCommand.parameters };
253
+ if (toolCommand.action && !cmdParams.action) {
254
+ cmdParams.action = toolCommand.action;
255
+ }
256
+ } else {
257
+ // Extract all top-level params (operation, headless, actions, files, etc.)
258
+ cmdParams = this._extractTopLevelParams(toolCommand);
259
+ }
260
+
261
+ const command = {
262
+ type: COMMAND_FORMATS.JSON,
263
+ toolId: toolId,
264
+ parameters: cmdParams,
265
+ actions: toolCommand.actions,
266
+ rawContent: JSON.stringify(toolCommand, null, 2),
267
+ jsonData: toolCommand,
268
+ wasRepaired,
269
+ wasTruncated
270
+ };
271
+
272
+ commands.push(command);
273
+ }
274
+ }
275
+ }
276
+
277
+ searchIndex = endIndex + endMarker.length;
278
+ }
279
+
280
+ return commands;
281
+ }
282
+
283
+ /**
284
+ * Extract plain JSON objects using string functions
285
+ * @private
286
+ */
287
+ extractPlainJSON(content) {
288
+ const commands = [];
289
+ const lines = content.split('\n');
290
+
291
+ for (let i = 0; i < lines.length; i++) {
292
+ const line = lines[i].trim();
293
+
294
+ // Skip if line doesn't start with {
295
+ if (!line.startsWith('{')) continue;
296
+
297
+ // Try to find complete JSON object
298
+ let jsonString = '';
299
+ let braceCount = 0;
300
+ let foundComplete = false;
301
+
302
+ // Start from current line and look for complete JSON
303
+ for (let j = i; j < lines.length; j++) {
304
+ const currentLine = lines[j].trim();
305
+ jsonString += (j > i ? '\n' : '') + currentLine;
306
+
307
+ // Count braces to find complete object
308
+ for (const char of currentLine) {
309
+ if (char === '{') braceCount++;
310
+ if (char === '}') braceCount--;
311
+ if (braceCount === 0 && char === '}') {
312
+ foundComplete = true;
313
+ break;
314
+ }
315
+ }
316
+
317
+ if (foundComplete) break;
318
+ }
319
+
320
+ if (!foundComplete) continue;
321
+
322
+ // Use repair-capable JSON parser
323
+ const parseResult = parseJSONWithRepair(jsonString, { silent: true });
324
+
325
+ if (parseResult.error) {
326
+ // Even repair failed - skip
327
+ continue;
328
+ }
329
+
330
+ const jsonData = parseResult.data;
331
+ const wasRepaired = parseResult.wasRepaired;
332
+ const wasTruncated = parseResult.wasTruncated;
333
+
334
+ // ARCHITECTURAL PRINCIPLE: Use OUTER layer for tool identification
335
+ // Only parse INNER content (actions, type) if OUTER identifier missing
336
+ // This follows the layered invocation hierarchy:
337
+ // OUTER (message level): Tool identification via "toolId"
338
+ // INNER (payload level): Action specification via "type"
339
+
340
+ // Check if this JSON looks like a tool command
341
+ if (this.isToolCommandJSON(jsonData) ||
342
+ (jsonData.actions && Array.isArray(jsonData.actions)) ||
343
+ (jsonData.type && typeof jsonData.type === 'string')) {
344
+
345
+ // CRITICAL: Use OUTER identifier first, only infer from INNER as fallback
346
+ const toolId = jsonData.toolId || jsonData.tool || this.inferToolFromActions(jsonData);
347
+
348
+ // Skip if we couldn't determine a valid tool
349
+ if (!toolId || toolId === 'unknown') {
350
+ console.log('TagParser DEBUG: Skipping plain JSON - could not determine valid toolId');
351
+ continue;
352
+ }
353
+
354
+ const command = {
355
+ type: COMMAND_FORMATS.JSON_PLAIN,
356
+ toolId: toolId,
357
+ // Use parameters if wrapped, otherwise extract all top-level params (excluding toolId)
358
+ parameters: jsonData.parameters || this._extractTopLevelParams(jsonData),
359
+ actions: jsonData.actions,
360
+ rawContent: jsonString,
361
+ jsonData,
362
+ warning: 'Plain JSON detected - should use ```json blocks',
363
+ wasRepaired,
364
+ wasTruncated
365
+ };
366
+
367
+ commands.push(command);
368
+ }
369
+ }
370
+
371
+ return commands;
372
+ }
373
+
374
+ /**
375
+ * Infer tool ID from JSON structure
376
+ * Uses the constants-based approach for deterministic tool identification
377
+ * @private
378
+ */
379
+ inferToolFromActions(jsonData) {
380
+ const structure = identifyJsonStructure(jsonData);
381
+
382
+ switch (structure) {
383
+ case JSON_STRUCTURES.STANDARD:
384
+ // Already has toolId
385
+ return jsonData.toolId || 'unknown';
386
+
387
+ case JSON_STRUCTURES.ACTIONS_ARRAY:
388
+ // Get tool from first action type
389
+ if (jsonData.actions && jsonData.actions.length > 0) {
390
+ const firstAction = jsonData.actions[0];
391
+ const toolId = getToolIdFromAction(firstAction.type);
392
+ return toolId || 'unknown';
393
+ }
394
+ break;
395
+
396
+ case JSON_STRUCTURES.DIRECT_ACTION:
397
+ // Get tool from type field
398
+ const toolId = getToolIdFromAction(jsonData.type);
399
+ return toolId || 'unknown';
400
+
401
+ case JSON_STRUCTURES.TOOL_COMMANDS:
402
+ // Get from first command
403
+ if (jsonData.toolCommands && jsonData.toolCommands.length > 0) {
404
+ return this.inferToolFromActions(jsonData.toolCommands[0]);
405
+ }
406
+ break;
407
+ }
408
+
409
+ return 'unknown';
410
+ }
411
+
412
+ /**
413
+ * Extract agent redirects from content
414
+ * @param {string} content - Content to parse
415
+ * @returns {Array} Array of parsed agent redirects
416
+ */
417
+ extractAgentRedirects(content) {
418
+ const redirects = [];
419
+
420
+ const matches = this.matchAll(content, this.patterns.agentRedirect);
421
+
422
+ for (const match of matches) {
423
+ const attributeString = match.groups[0];
424
+ const messageContent = match.groups[1].trim();
425
+
426
+ const attributes = this.parseAttributes(attributeString);
427
+
428
+ const redirect = {
429
+ to: attributes.to,
430
+ content: messageContent,
431
+ urgent: attributes[AGENT_REDIRECT_ATTRIBUTES.URGENT] === 'true',
432
+ requiresResponse: attributes[AGENT_REDIRECT_ATTRIBUTES.REQUIRES_RESPONSE] === 'true',
433
+ context: attributes[AGENT_REDIRECT_ATTRIBUTES.CONTEXT],
434
+ rawMatch: match.match
435
+ };
436
+
437
+ // Add any additional attributes
438
+ for (const [key, value] of Object.entries(attributes)) {
439
+ if (!['to', AGENT_REDIRECT_ATTRIBUTES.URGENT, AGENT_REDIRECT_ATTRIBUTES.REQUIRES_RESPONSE, AGENT_REDIRECT_ATTRIBUTES.CONTEXT].includes(key)) {
440
+ redirect[key] = value;
441
+ }
442
+ }
443
+
444
+ redirects.push(redirect);
445
+ }
446
+
447
+ return redirects;
448
+ }
449
+
450
+ /**
451
+ * Parse XML parameters from tool content
452
+ * @param {string} content - Tool content to parse
453
+ * @returns {Object} Parsed parameters
454
+ */
455
+ parseXMLParameters(content) {
456
+ const parameters = {};
457
+
458
+ console.log('TagParser DEBUG: parseXMLParameters - content length:', content.length);
459
+
460
+ let position = 0;
461
+ let foundCount = 0;
462
+
463
+ // Look for opening tags like <write>, <read>, etc.
464
+ while (position < content.length) {
465
+ const openTagStart = content.indexOf('<', position);
466
+ if (openTagStart === -1) break;
467
+
468
+ const openTagEnd = content.indexOf('>', openTagStart);
469
+ if (openTagEnd === -1) break;
470
+
471
+ // Extract the full opening tag
472
+ const openTag = content.substring(openTagStart, openTagEnd + 1);
473
+
474
+ // Parse tag name and attributes from the opening tag
475
+ const spaceIndex = openTag.indexOf(' ');
476
+ const tagName = spaceIndex > 0
477
+ ? openTag.substring(1, spaceIndex)
478
+ : openTag.substring(1, openTag.length - 1);
479
+
480
+ const isValid = this.isValidXmlTagName(tagName);
481
+
482
+ // Skip malformed tags or content that looks like code
483
+ if (tagName.includes('/') || !tagName || !this.isValidXmlTagName(tagName)) {
484
+ position = openTagEnd + 1;
485
+ continue;
486
+ }
487
+
488
+ // Check if this is a self-closing tag (ends with />)
489
+ const isSelfClosing = openTag.endsWith('/>');
490
+
491
+ let tagContent = '';
492
+ let closingTagStart = openTagEnd;
493
+
494
+ if (isSelfClosing) {
495
+ // Self-closing tag has no content
496
+ tagContent = '';
497
+ closingTagStart = openTagEnd; // Position right after the self-closing tag
498
+ } else {
499
+ // Look for the closing tag
500
+ const closingTag = `</${tagName}>`;
501
+ closingTagStart = content.indexOf(closingTag, openTagEnd + 1);
502
+
503
+ if (closingTagStart === -1) {
504
+ position = openTagEnd + 1;
505
+ continue;
506
+ }
507
+
508
+ // Extract the content between tags
509
+ tagContent = content.substring(openTagEnd + 1, closingTagStart);
510
+ }
511
+
512
+ // Extract attributes from the opening tag
513
+ let attributeString = spaceIndex > 0
514
+ ? openTag.substring(spaceIndex + 1, openTag.length - 1).trim()
515
+ : '';
516
+
517
+ // For self-closing tags, remove the trailing '/' from attributes
518
+ if (isSelfClosing && attributeString.endsWith('/')) {
519
+ attributeString = attributeString.substring(0, attributeString.length - 1).trim();
520
+ }
521
+
522
+ const attributes = this.parseAttributes(attributeString);
523
+
524
+ console.log('TagParser DEBUG: parseXMLParameters - found match:', {
525
+ paramName: tagName,
526
+ attributeString,
527
+ valueLength: tagContent.length,
528
+ valuePreview: tagContent.substring(0, 50) + (tagContent.length > 50 ? '...' : '')
529
+ });
530
+
531
+ // CRITICAL FIX: Handle multiple tags with same name (e.g., multiple <write> tags)
532
+ // Convert to array if duplicate detected
533
+ const paramValue = {
534
+ value: tagContent.trim(),
535
+ attributes
536
+ };
537
+
538
+ if (parameters[tagName]) {
539
+ // Tag already exists - convert to array or append to existing array
540
+ if (Array.isArray(parameters[tagName])) {
541
+ // Already an array, append
542
+ parameters[tagName].push(paramValue);
543
+ console.log('TagParser DEBUG: appended to existing array for tag:', tagName, 'count:', parameters[tagName].length);
544
+ } else {
545
+ // First duplicate - convert to array
546
+ const existingValue = parameters[tagName];
547
+ parameters[tagName] = [existingValue, paramValue];
548
+ console.log('TagParser DEBUG: converted to array for duplicate tag:', tagName);
549
+ }
550
+ } else {
551
+ // First occurrence - store as single object
552
+ parameters[tagName] = paramValue;
553
+ }
554
+
555
+ // For convenience, also store direct access to value (deprecated, kept for backward compatibility)
556
+ // Only define if it doesn't exist (handles multiple tags with same name)
557
+ const valuePropertyName = tagName + '_value';
558
+ if (!Object.prototype.hasOwnProperty.call(parameters, valuePropertyName)) {
559
+ Object.defineProperty(parameters, valuePropertyName, {
560
+ value: tagContent.trim(),
561
+ enumerable: false
562
+ });
563
+ }
564
+
565
+ foundCount++;
566
+
567
+ // Update position based on whether it's self-closing or paired tags
568
+ if (isSelfClosing) {
569
+ position = openTagEnd + 1;
570
+ } else {
571
+ const closingTag = `</${tagName}>`;
572
+ position = closingTagStart + closingTag.length;
573
+ }
574
+ }
575
+
576
+ console.log('TagParser DEBUG: parseXMLParameters - matches found:', foundCount);
577
+ console.log('TagParser DEBUG: parseXMLParameters - final parameters:', Object.keys(parameters));
578
+ return parameters;
579
+ }
580
+
581
+ /**
582
+ * Parse attributes from attribute string
583
+ * @param {string} attributeString - Attribute string to parse
584
+ * @returns {Object} Parsed attributes
585
+ */
586
+ parseAttributes(attributeString) {
587
+ const attributes = {};
588
+
589
+ if (!attributeString) return attributes;
590
+
591
+ const attrMatches = this.matchAll(attributeString, this.patterns.attribute);
592
+
593
+ for (const match of attrMatches) {
594
+ const attrName = match.groups[0];
595
+ const attrValue = match.groups[1];
596
+
597
+ attributes[attrName] = attrValue;
598
+ }
599
+
600
+ return attributes;
601
+ }
602
+
603
+ /**
604
+ * Extract content from tags
605
+ * @param {string} content - Content to search
606
+ * @param {string} tagName - Tag name to extract
607
+ * @returns {Array} Array of extracted content strings
608
+ */
609
+ static extractContent(content, tagName) {
610
+ const pattern = new RegExp(`<${tagName}[^>]*>([^<]*)<\\/${tagName}>`, 'g');
611
+ const matches = [];
612
+ let match;
613
+
614
+ while ((match = pattern.exec(content)) !== null) {
615
+ matches.push(match[1].trim());
616
+ }
617
+
618
+ return matches;
619
+ }
620
+
621
+ /**
622
+ * Extract tag with attributes
623
+ * @param {string} content - Content to search
624
+ * @param {string} tagName - Tag name to extract
625
+ * @returns {Array} Array of extracted tag objects with content and attributes
626
+ */
627
+ static extractTagsWithAttributes(content, tagName) {
628
+ const pattern = new RegExp(`<${tagName}\\s*([^>]*)>([^<]*)<\\/${tagName}>`, 'g');
629
+ const tags = [];
630
+ let match;
631
+
632
+ while ((match = pattern.exec(content)) !== null) {
633
+ const attributeString = match[1];
634
+ const tagContent = match[2].trim();
635
+
636
+ const parser = new TagParser();
637
+ const attributes = parser.parseAttributes(attributeString);
638
+
639
+ tags.push({
640
+ content: tagContent,
641
+ attributes,
642
+ rawMatch: match[0]
643
+ });
644
+ }
645
+
646
+ return tags;
647
+ }
648
+
649
+ /**
650
+ * Check if JSON object represents a tool command
651
+ * @private
652
+ */
653
+ isToolCommandJSON(obj) {
654
+ return obj &&
655
+ typeof obj === 'object' &&
656
+ (obj.toolId || obj.tool) &&
657
+ (obj.parameters || obj.actions || obj.files || this._hasToolParams(obj));
658
+ }
659
+
660
+ /**
661
+ * Check if object has any tool-related parameters (excluding toolId/tool)
662
+ * @private
663
+ */
664
+ _hasToolParams(obj) {
665
+ if (!obj || typeof obj !== 'object') return false;
666
+ const keys = Object.keys(obj);
667
+ // Has more than just toolId/tool
668
+ return keys.some(k => k !== 'toolId' && k !== 'tool');
669
+ }
670
+
671
+ /**
672
+ * Match all occurrences of a pattern
673
+ * @private
674
+ */
675
+ matchAll(content, pattern) {
676
+ const matches = [];
677
+ let match;
678
+
679
+ // Reset pattern lastIndex to ensure clean matching
680
+ pattern.lastIndex = 0;
681
+
682
+ while ((match = pattern.exec(content)) !== null) {
683
+ matches.push({
684
+ match: match[0],
685
+ groups: match.slice(1),
686
+ index: match.index
687
+ });
688
+ }
689
+
690
+ return matches;
691
+ }
692
+
693
+ /**
694
+ * Validate tool command structure (JSON format)
695
+ * @param {Object} command - Tool command to validate
696
+ * @returns {Object} Validation result
697
+ */
698
+ validateToolCommand(command) {
699
+ const errors = [];
700
+
701
+ if (!command.toolId) {
702
+ errors.push('Missing toolId');
703
+ }
704
+
705
+ if (!command.parameters && !command.actions) {
706
+ errors.push('Missing parameters or actions');
707
+ }
708
+
709
+ if (command.type === COMMAND_FORMATS.JSON || command.type === COMMAND_FORMATS.JSON_PLAIN) {
710
+ if (!command.jsonData) {
711
+ errors.push('Missing jsonData for JSON command');
712
+ }
713
+ }
714
+
715
+ return {
716
+ valid: errors.length === 0,
717
+ errors
718
+ };
719
+ }
720
+
721
+ /**
722
+ * Normalize tool command to consistent format (JSON only)
723
+ * @param {Object} command - Tool command to normalize
724
+ * @returns {Object} Normalized command
725
+ */
726
+ normalizeToolCommand(command) {
727
+ const normalized = {
728
+ toolId: command.toolId,
729
+ type: command.type,
730
+ parameters: {},
731
+ rawContent: command.rawContent
732
+ };
733
+
734
+ // JSON parameters are already in simple format
735
+ normalized.parameters = { ...command.parameters };
736
+
737
+ // Handle actions array format (common in agentcommunication tool)
738
+ if (command.actions && Array.isArray(command.actions)) {
739
+ normalized.parameters.actions = command.actions;
740
+
741
+ // For agentcommunication tool, extract the action from the first item
742
+ if (command.toolId === TOOL_IDS.AGENT_COMMUNICATION && command.actions.length > 0) {
743
+ const firstAction = command.actions[0];
744
+ normalized.parameters.action = firstAction.type || firstAction.action;
745
+ // Spread the rest of the action properties
746
+ Object.assign(normalized.parameters, firstAction);
747
+ }
748
+ }
749
+
750
+ // BUGFIX: same flattening when `actions` was nested INSIDE the
751
+ // `parameters` wrapper instead of at command top-level. Some LLM
752
+ // emissions look like:
753
+ // { toolId, parameters: { actions: [{ type: "..." }] } }
754
+ // Without this hoist, `command.actions` is undefined (lives inside
755
+ // `parameters`), the agentcommunication branch above doesn't fire,
756
+ // and the tool receives `{ actions: [...] }` with no `action`
757
+ // throwing "Action parameter is required" on what looks like a
758
+ // valid call. This produced the "first attempt rejected, second
759
+ // attempt with same syntax succeeds" pattern users reported (the
760
+ // LLM corrected its shape on retry).
761
+ if (
762
+ command.toolId === TOOL_IDS.AGENT_COMMUNICATION &&
763
+ !normalized.parameters.action &&
764
+ Array.isArray(normalized.parameters.actions) &&
765
+ normalized.parameters.actions.length > 0
766
+ ) {
767
+ const firstAction = normalized.parameters.actions[0];
768
+ normalized.parameters.action = firstAction.type || firstAction.action;
769
+ Object.assign(normalized.parameters, firstAction);
770
+ }
771
+
772
+ return normalized;
773
+ }
774
+
775
+ /**
776
+ * Find the matching closing ``` for a code block, handling nested code blocks
777
+ *
778
+ * The challenge: JSON content may contain embedded ``` markers (e.g., README with bash examples)
779
+ * We need to find the ``` that closes our JSON block, not a nested one inside the content.
780
+ *
781
+ * Strategy: Parse character by character, tracking if we're inside a JSON string.
782
+ * When inside a string, ``` is just content. When outside strings, ``` closes the block.
783
+ *
784
+ * @param {string} content - Full content to search
785
+ * @param {number} startPos - Position after the opening ```json marker
786
+ * @returns {number} Position of the closing ```, or -1 if not found
787
+ * @private
788
+ */
789
+ _findMatchingCodeBlockEnd(content, startPos) {
790
+ let pos = startPos;
791
+ let inString = false;
792
+ let escaped = false;
793
+
794
+ while (pos < content.length) {
795
+ const char = content[pos];
796
+
797
+ // Handle escape sequences inside strings
798
+ if (escaped) {
799
+ escaped = false;
800
+ pos++;
801
+ continue;
802
+ }
803
+
804
+ if (char === '\\' && inString) {
805
+ escaped = true;
806
+ pos++;
807
+ continue;
808
+ }
809
+
810
+ // Track string boundaries
811
+ if (char === '"') {
812
+ inString = !inString;
813
+ pos++;
814
+ continue;
815
+ }
816
+
817
+ // Only look for ``` when we're outside of JSON strings
818
+ if (!inString && content.substring(pos, pos + 3) === '```') {
819
+ // Check this is the end marker (not another opening like ```bash)
820
+ // The closing ``` should be followed by newline, EOF, or just whitespace
821
+ const afterMarker = content.substring(pos + 3, pos + 20);
822
+ const isClosingMarker = !afterMarker.match(/^[a-zA-Z]/); // Not followed by language name
823
+
824
+ if (isClosingMarker) {
825
+ return pos;
826
+ }
827
+ }
828
+
829
+ pos++;
830
+ }
831
+
832
+ // Fallback: if we couldn't find it with state tracking,
833
+ // try to find the last ``` in the content (less accurate but better than nothing)
834
+ const lastBackticks = content.lastIndexOf('```', content.length);
835
+ if (lastBackticks > startPos) {
836
+ console.warn('[TagParser] Used fallback method to find closing code block');
837
+ return lastBackticks;
838
+ }
839
+
840
+ return -1;
841
+ }
842
+
843
+ /**
844
+ * Convert kebab-case or snake_case to camelCase
845
+ * @private
846
+ */
847
+ _toCamelCase(str) {
848
+ return str.replace(/[-_](.)/g, (_, char) => char.toUpperCase());
849
+ }
850
+
851
+ /**
852
+ * Extract all content between tags, including nested tags
853
+ * @param {string} content - Content to search
854
+ * @param {string} startTag - Opening tag
855
+ * @param {string} endTag - Closing tag
856
+ * @returns {Array} Array of extracted content blocks
857
+ */
858
+ static extractBetweenTags(content, startTag, endTag) {
859
+ const blocks = [];
860
+ let startIndex = 0;
861
+
862
+ while (true) {
863
+ const start = content.indexOf(startTag, startIndex);
864
+ if (start === -1) break;
865
+
866
+ const end = content.indexOf(endTag, start + startTag.length);
867
+ if (end === -1) break;
868
+
869
+ const blockContent = content.substring(start + startTag.length, end);
870
+ blocks.push({
871
+ content: blockContent,
872
+ fullMatch: content.substring(start, end + endTag.length),
873
+ startIndex: start,
874
+ endIndex: end + endTag.length
875
+ });
876
+
877
+ startIndex = end + endTag.length;
878
+ }
879
+
880
+ return blocks;
881
+ }
882
+
883
+ /**
884
+ * Clean content by removing all tool commands and agent redirects
885
+ * @param {string} content - Content to clean
886
+ * @returns {string} Cleaned content
887
+ */
888
+ cleanContent(content) {
889
+ let cleaned = content;
890
+
891
+ // Remove tool command blocks
892
+ cleaned = cleaned.replace(this.patterns.toolCommand, '');
893
+
894
+ // Remove agent redirects
895
+ cleaned = cleaned.replace(this.patterns.agentRedirect, '');
896
+
897
+ // Remove JSON tool command blocks
898
+ cleaned = cleaned.replace(this.patterns.jsonBlock, (match, jsonContent) => {
899
+ try {
900
+ const jsonData = JSON.parse(jsonContent);
901
+ if (this.isToolCommandJSON(jsonData) ||
902
+ (jsonData.toolCommands && Array.isArray(jsonData.toolCommands))) {
903
+ return '';
904
+ }
905
+ } catch {
906
+ // Not a tool command JSON block, keep it
907
+ }
908
+ return match;
909
+ });
910
+
911
+ // Clean up excessive whitespace
912
+ cleaned = cleaned.replace(/\n\s*\n\s*\n/g, '\n\n');
913
+ cleaned = cleaned.trim();
914
+
915
+ return cleaned;
916
+ }
917
+ }
918
+
897
919
  export default TagParser;