onbuzz 4.0.2 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (982) hide show
  1. package/package.json +1 -1
  2. package/scripts/audit-report.js +164 -0
  3. package/src/core/__tests__/agentPoolToolConfig.test.js +191 -0
  4. package/src/core/__tests__/agentPoolWakeOnMessage.test.js +315 -0
  5. package/src/core/__tests__/agentScheduler.emptyResponseDiagnostics.test.js +191 -0
  6. package/src/core/__tests__/agentScheduler.modeTransitions.test.js +233 -0
  7. package/src/core/__tests__/agentScheduler.taskLifecycleInstruction.test.js +78 -0
  8. package/src/core/__tests__/agentScheduler.test.js +31 -13
  9. package/src/core/__tests__/messageProcessor.test.js +42 -0
  10. package/src/core/agentPool.js +127 -25
  11. package/src/core/agentScheduler.js +330 -151
  12. package/src/core/messageProcessor.js +19 -1
  13. package/src/interfaces/__tests__/galleryRoutes.test.js +311 -0
  14. package/src/interfaces/webServer.js +183 -2
  15. package/src/services/__tests__/agentActivityService.test.js +83 -0
  16. package/src/services/__tests__/aiService.reasoningTokens.test.js +66 -0
  17. package/src/services/__tests__/aiService.stream.test.js +301 -0
  18. package/src/services/__tests__/conversationQuery.reasoning.test.js +102 -0
  19. package/src/services/__tests__/conversationQuery.test.js +723 -0
  20. package/src/services/__tests__/toolCallBridgeContract.test.js +129 -0
  21. package/src/services/agentActivityService.js +25 -4
  22. package/src/services/aiService.js +180 -91
  23. package/src/services/conversationQuery.js +803 -0
  24. package/src/tools/__tests__/agentCommunicationTool.test.js +114 -0
  25. package/src/tools/__tests__/baseTool.getEffectiveConfig.test.js +77 -0
  26. package/src/tools/__tests__/baseTool.test.js +471 -420
  27. package/src/tools/__tests__/filesystemTool.test.js +98 -0
  28. package/src/tools/__tests__/memoryTool.reminisce.test.js +363 -0
  29. package/src/tools/__tests__/memoryTool.test.js +2 -2
  30. package/src/tools/__tests__/openaiFunctionSchemas.memoryReminisce.test.js +84 -0
  31. package/src/tools/__tests__/taskManagerTool.lifecycleGuidance.test.js +71 -0
  32. package/src/tools/__tests__/terminalTool.test.js +64 -0
  33. package/src/tools/__tests__/webTool.perAgentConfig.test.js +94 -0
  34. package/src/tools/agentCommunicationTool.js +33 -22
  35. package/src/tools/baseTool.js +980 -899
  36. package/src/tools/fileSystemTool.js +76 -2
  37. package/src/tools/memoryTool.js +270 -4
  38. package/src/tools/openaiFunctionSchemas.js +62 -7
  39. package/src/tools/taskManagerTool.js +21 -4
  40. package/src/tools/terminalTool.js +62 -2
  41. package/src/tools/webTool.js +65 -1
  42. package/src/utilities/__tests__/auditReport.test.js +328 -0
  43. package/src/utilities/__tests__/modeTransitionReasons.test.js +105 -0
  44. package/src/utilities/auditReport.js +331 -0
  45. package/src/utilities/modeTransitionReasons.js +101 -0
  46. package/web-ui/build/index.html +2 -2
  47. package/web-ui/build/static/1c-C_9olPfq.js +1 -0
  48. package/web-ui/build/static/abap--DeFI1OC.js +1 -0
  49. package/web-ui/build/static/abnf-5HzSmxRy.js +1 -0
  50. package/web-ui/build/static/abnf-IG-O3NHT.js +1 -0
  51. package/web-ui/build/static/accesslog-qO_3I5IJ.js +1 -0
  52. package/web-ui/build/static/actionscript-DbFc2Uxo.js +1 -0
  53. package/web-ui/build/static/actionscript-jU7xUh7w.js +1 -0
  54. package/web-ui/build/static/ada-DBOzyNDe.js +1 -0
  55. package/web-ui/build/static/ada-F0QwXh2e.js +1 -0
  56. package/web-ui/build/static/agda-Drhr_GYC.js +1 -0
  57. package/web-ui/build/static/al-bEatcrqU.js +1 -0
  58. package/web-ui/build/static/angelscript-Bp0mqasc.js +1 -0
  59. package/web-ui/build/static/antlr4-BCvixOqW.js +1 -0
  60. package/web-ui/build/static/apache-zSeWcGFf.js +1 -0
  61. package/web-ui/build/static/apacheconf-CEDX0qIZ.js +1 -0
  62. package/web-ui/build/static/apex-BHlvjPxZ.js +1 -0
  63. package/web-ui/build/static/apl-S86eLVnh.js +1 -0
  64. package/web-ui/build/static/applescript-D15JiHTt.js +1 -0
  65. package/web-ui/build/static/applescript-D6g2nIGs.js +1 -0
  66. package/web-ui/build/static/aql-C4SWmhk2.js +1 -0
  67. package/web-ui/build/static/arcade-DrwRCCCh.js +1 -0
  68. package/web-ui/build/static/arduino-Blsw4-hb.js +1 -0
  69. package/web-ui/build/static/arduino-s6CYn6L3.js +1 -0
  70. package/web-ui/build/static/arff-DnrfdsTx.js +1 -0
  71. package/web-ui/build/static/armasm-C2WK9q2y.js +1 -0
  72. package/web-ui/build/static/asciidoc-BiY2pDol.js +1 -0
  73. package/web-ui/build/static/asciidoc-DG128-Q1.js +1 -0
  74. package/web-ui/build/static/asm6502-BEAW0Cck.js +1 -0
  75. package/web-ui/build/static/asmatmel-C4v7boSu.js +1 -0
  76. package/web-ui/build/static/aspectj-Bfek529B.js +1 -0
  77. package/web-ui/build/static/aspnet-8K2PeLn2.js +1 -0
  78. package/web-ui/build/static/autohotkey-BHw78HYu.js +1 -0
  79. package/web-ui/build/static/autohotkey-C5DDQtDL.js +1 -0
  80. package/web-ui/build/static/autoit-CgsSmQkF.js +1 -0
  81. package/web-ui/build/static/autoit-DZ7IS_9i.js +1 -0
  82. package/web-ui/build/static/avisynth-B20WuEUg.js +1 -0
  83. package/web-ui/build/static/avrasm-C7TrcWBg.js +1 -0
  84. package/web-ui/build/static/avro-idl-CfDy8XWE.js +1 -0
  85. package/web-ui/build/static/awk-cjY-7p5o.js +1 -0
  86. package/web-ui/build/static/axapta-Bu9INQG2.js +1 -0
  87. package/web-ui/build/static/bash-B998wxy_.js +1 -0
  88. package/web-ui/build/static/bash-LE6roX2s.js +1 -0
  89. package/web-ui/build/static/basic-Cd6-vDdH.js +1 -0
  90. package/web-ui/build/static/basic-mfY-ovnp.js +1 -0
  91. package/web-ui/build/static/batch-DxVy2cwv.js +1 -0
  92. package/web-ui/build/static/bbcode-Ct3Yu8De.js +1 -0
  93. package/web-ui/build/static/bicep-CexPoMEW.js +1 -0
  94. package/web-ui/build/static/birb-CH1RMpPI.js +1 -0
  95. package/web-ui/build/static/bison-XQFuPB_Q.js +1 -0
  96. package/web-ui/build/static/bnf-CIDGmY3l.js +1 -0
  97. package/web-ui/build/static/bnf-DjN_FU2s.js +1 -0
  98. package/web-ui/build/static/brainfuck-Cu_hvayi.js +1 -0
  99. package/web-ui/build/static/brainfuck-eRbe4_qo.js +1 -0
  100. package/web-ui/build/static/brightscript-Cdq0ttTN.js +1 -0
  101. package/web-ui/build/static/bro-D3aio8LS.js +1 -0
  102. package/web-ui/build/static/bsl-DFEwVZ2J.js +1 -0
  103. package/web-ui/build/static/c-D6RK1vhn.js +1 -0
  104. package/web-ui/build/static/c-DUcBA02q.js +1 -0
  105. package/web-ui/build/static/c-like-BApJDFwD.js +1 -0
  106. package/web-ui/build/static/cal-Ckv8Qnpw.js +1 -0
  107. package/web-ui/build/static/capnproto-DCoblEyS.js +1 -0
  108. package/web-ui/build/static/ceylon-DM-zZDWY.js +1 -0
  109. package/web-ui/build/static/cfscript-CMoOAgUK.js +1 -0
  110. package/web-ui/build/static/chaiscript-B3Vl3wGb.js +1 -0
  111. package/web-ui/build/static/cil-ChEi_uFO.js +1 -0
  112. package/web-ui/build/static/clean-BtA08oDV.js +1 -0
  113. package/web-ui/build/static/clojure-CWMlf7lJ.js +1 -0
  114. package/web-ui/build/static/clojure-Vur8C4jr.js +1 -0
  115. package/web-ui/build/static/clojure-repl-BsfGHdYy.js +1 -0
  116. package/web-ui/build/static/cmake-Csgl_IVr.js +1 -0
  117. package/web-ui/build/static/cmake-DFMKvwxy.js +1 -0
  118. package/web-ui/build/static/cobol-XhlGrCrW.js +1 -0
  119. package/web-ui/build/static/coffeescript-DYldGW35.js +1 -0
  120. package/web-ui/build/static/coffeescript-DvbNKwrC.js +1 -0
  121. package/web-ui/build/static/concurnas-DjALqCYn.js +1 -0
  122. package/web-ui/build/static/coq-D9QGJI6g.js +1 -0
  123. package/web-ui/build/static/coq-fAZpoc7i.js +1 -0
  124. package/web-ui/build/static/cos-GgM7WWVZ.js +1 -0
  125. package/web-ui/build/static/cpp-Cgt5qqfd.js +1 -0
  126. package/web-ui/build/static/cpp-DxVcOuBe.js +1 -0
  127. package/web-ui/build/static/crmsh-BlZWnzbY.js +1 -0
  128. package/web-ui/build/static/crystal--H7HLAQf.js +1 -0
  129. package/web-ui/build/static/crystal-DWm0bbUT.js +1 -0
  130. package/web-ui/build/static/csharp-8dr-wktE.js +1 -0
  131. package/web-ui/build/static/csharp-DFuHLPFe.js +1 -0
  132. package/web-ui/build/static/cshtml-C-L4_dy2.js +1 -0
  133. package/web-ui/build/static/csp-CJ6qbecO.js +1 -0
  134. package/web-ui/build/static/csp-DswTy-5u.js +1 -0
  135. package/web-ui/build/static/css-DdRPdKXQ.js +1 -0
  136. package/web-ui/build/static/css-extras-DMwOZFrB.js +1 -0
  137. package/web-ui/build/static/csv-BiWlhIMC.js +1 -0
  138. package/web-ui/build/static/cypher-ByNaJKO8.js +1 -0
  139. package/web-ui/build/static/d-BR89VlK-.js +1 -0
  140. package/web-ui/build/static/d-KlWvBc4w.js +1 -0
  141. package/web-ui/build/static/dart-BIsk7m6o.js +1 -0
  142. package/web-ui/build/static/dart-BnyP1Rjp.js +1 -0
  143. package/web-ui/build/static/dataweave-CH_Q2gWX.js +1 -0
  144. package/web-ui/build/static/dax-wulX9uc-.js +1 -0
  145. package/web-ui/build/static/delphi-CFowdk_A.js +1 -0
  146. package/web-ui/build/static/dhall-BfCOemEp.js +1 -0
  147. package/web-ui/build/static/diff-DQD2zPaG.js +1 -0
  148. package/web-ui/build/static/diff-DZoEdrYM.js +1 -0
  149. package/web-ui/build/static/django-B0j973Kw.js +1 -0
  150. package/web-ui/build/static/django-CYScL320.js +1 -0
  151. package/web-ui/build/static/dns-DoECkAgz.js +1 -0
  152. package/web-ui/build/static/dns-zone-file-CuoIcXgj.js +1 -0
  153. package/web-ui/build/static/docker-C2nfXTBG.js +1 -0
  154. package/web-ui/build/static/dockerfile-DBalxIH7.js +1 -0
  155. package/web-ui/build/static/dos-GNL9IdmL.js +1 -0
  156. package/web-ui/build/static/dot-rKuRS-PS.js +1 -0
  157. package/web-ui/build/static/dsconfig-CKmenTFr.js +1 -0
  158. package/web-ui/build/static/dts-AxT2qjQU.js +1 -0
  159. package/web-ui/build/static/dust-DpqHWPC4.js +1 -0
  160. package/web-ui/build/static/ebnf-CONEMpLp.js +1 -0
  161. package/web-ui/build/static/ebnf-DRWcOs8R.js +1 -0
  162. package/web-ui/build/static/editorconfig-lmLHmECZ.js +1 -0
  163. package/web-ui/build/static/eiffel-B39e31fw.js +1 -0
  164. package/web-ui/build/static/ejs-DtJwpVdo.js +1 -0
  165. package/web-ui/build/static/elixir-BH4JTqa9.js +1 -0
  166. package/web-ui/build/static/elixir-aH1DLjYD.js +1 -0
  167. package/web-ui/build/static/elm-BcCGkSrW.js +1 -0
  168. package/web-ui/build/static/elm-CCrB1JbX.js +1 -0
  169. package/web-ui/build/static/erb-CcumI1K3.js +1 -0
  170. package/web-ui/build/static/erb-_HK77hx-.js +1 -0
  171. package/web-ui/build/static/erlang-B1qxMZZp.js +1 -0
  172. package/web-ui/build/static/erlang-CCM_ejO_.js +1 -0
  173. package/web-ui/build/static/erlang-repl-D1zC2Zf6.js +1 -0
  174. package/web-ui/build/static/etlua-HJMRx9x7.js +1 -0
  175. package/web-ui/build/static/excel-DqXCKUKa.js +1 -0
  176. package/web-ui/build/static/excel-formula-oNw1T5Gi.js +1 -0
  177. package/web-ui/build/static/factor-BrTp5FZH.js +1 -0
  178. package/web-ui/build/static/false-CAVqV3ok.js +1 -0
  179. package/web-ui/build/static/firestore-security-rules-CxTofGT0.js +1 -0
  180. package/web-ui/build/static/fix-BMooo7-3.js +1 -0
  181. package/web-ui/build/static/flix-DR5Pi_4n.js +1 -0
  182. package/web-ui/build/static/flow-BoCWpUCW.js +1 -0
  183. package/web-ui/build/static/fortran-B9JI5ahV.js +1 -0
  184. package/web-ui/build/static/fortran-LXg81aOn.js +1 -0
  185. package/web-ui/build/static/fsharp-BqcGG-SM.js +1 -0
  186. package/web-ui/build/static/fsharp-Dj5YVL_h.js +1 -0
  187. package/web-ui/build/static/ftl-kuY7uFR8.js +1 -0
  188. package/web-ui/build/static/gams-CzihHKqE.js +1 -0
  189. package/web-ui/build/static/gap-BbS0A-Wl.js +1 -0
  190. package/web-ui/build/static/gauss-BauwG_O4.js +1 -0
  191. package/web-ui/build/static/gcode-VY1OKBcC.js +1 -0
  192. package/web-ui/build/static/gcode-lapsLgV5.js +1 -0
  193. package/web-ui/build/static/gdscript-1UIYB8m0.js +1 -0
  194. package/web-ui/build/static/gedcom-Bhrxt1LM.js +1 -0
  195. package/web-ui/build/static/gherkin-BsUD3vJB.js +1 -0
  196. package/web-ui/build/static/gherkin-hj_asmFX.js +1 -0
  197. package/web-ui/build/static/git-DXIrRKzR.js +1 -0
  198. package/web-ui/build/static/glsl-Bww3i9-P.js +1 -0
  199. package/web-ui/build/static/glsl-tW4hvcaQ.js +1 -0
  200. package/web-ui/build/static/gml-BIqshajA.js +1 -0
  201. package/web-ui/build/static/gml-CQqc9F-B.js +1 -0
  202. package/web-ui/build/static/gn-CBgpy8B9.js +1 -0
  203. package/web-ui/build/static/go-CEUAUIgn.js +1 -0
  204. package/web-ui/build/static/go-DPEd33Yn.js +1 -0
  205. package/web-ui/build/static/go-module-BVPbZOg5.js +1 -0
  206. package/web-ui/build/static/golo-CqB3OATq.js +1 -0
  207. package/web-ui/build/static/gradle-Djj_6FTv.js +1 -0
  208. package/web-ui/build/static/graphql-ymSYYmmE.js +1 -0
  209. package/web-ui/build/static/groovy-BLoXi1Ew.js +1 -0
  210. package/web-ui/build/static/groovy-D8ua3DVO.js +1 -0
  211. package/web-ui/build/static/haml-DKlxHs26.js +1 -0
  212. package/web-ui/build/static/haml-S_iUNysn.js +1 -0
  213. package/web-ui/build/static/handlebars-B7tcAMGB.js +1 -0
  214. package/web-ui/build/static/handlebars-CV-zB05N.js +1 -0
  215. package/web-ui/build/static/haskell-CMxCwdZX.js +1 -0
  216. package/web-ui/build/static/haskell-Dis6rGJ5.js +1 -0
  217. package/web-ui/build/static/haxe-C76IK5YN.js +1 -0
  218. package/web-ui/build/static/haxe-hbmD2uei.js +1 -0
  219. package/web-ui/build/static/hcl-BPI_t80W.js +1 -0
  220. package/web-ui/build/static/hlsl-BmeH3MXM.js +1 -0
  221. package/web-ui/build/static/hoon-BYLX7KiR.js +1 -0
  222. package/web-ui/build/static/hpkp-CFV1lvIV.js +1 -0
  223. package/web-ui/build/static/hsp-_VXPtQPw.js +1 -0
  224. package/web-ui/build/static/hsts-DzmFog1b.js +1 -0
  225. package/web-ui/build/static/htmlbars-uX8JubPS.js +1 -0
  226. package/web-ui/build/static/http-BTDAHgkv.js +1 -0
  227. package/web-ui/build/static/http-Ba1gTHCW.js +1 -0
  228. package/web-ui/build/static/hy-G7MK4TLb.js +1 -0
  229. package/web-ui/build/static/ichigojam-BKKN56jZ.js +1 -0
  230. package/web-ui/build/static/icon-nrqdEYwB.js +1 -0
  231. package/web-ui/build/static/icu-message-format-Bjone7XH.js +1 -0
  232. package/web-ui/build/static/idris-CKkY_0op.js +1 -0
  233. package/web-ui/build/static/iecst-EV3ZvBDC.js +1 -0
  234. package/web-ui/build/static/ignore-LJIbInke.js +1 -0
  235. package/web-ui/build/static/index-C1x426Pt.js +734 -0
  236. package/web-ui/build/static/index-CTzeYMwr.js +13 -0
  237. package/web-ui/build/static/index-CUBjz1OL.css +1 -0
  238. package/web-ui/build/static/index-DnVIkRiR.js +1 -0
  239. package/web-ui/build/static/inform7-BiW6HbUl.js +1 -0
  240. package/web-ui/build/static/inform7-DT-x6SRD.js +1 -0
  241. package/web-ui/build/static/ini-BbnHjAtW.js +1 -0
  242. package/web-ui/build/static/ini-DuNY7Iqz.js +1 -0
  243. package/web-ui/build/static/io-BquAtlCB.js +1 -0
  244. package/web-ui/build/static/irpf90-CZELNeJl.js +1 -0
  245. package/web-ui/build/static/isbl-DhOgOzai.js +1 -0
  246. package/web-ui/build/static/j-r8D3BrBj.js +1 -0
  247. package/web-ui/build/static/java-MjQ5EBN5.js +1 -0
  248. package/web-ui/build/static/java-c3Jyc0B6.js +1 -0
  249. package/web-ui/build/static/javadoc-CfNFziRD.js +1 -0
  250. package/web-ui/build/static/javadoclike-BUcJZQAh.js +1 -0
  251. package/web-ui/build/static/javascript-CL_4g6j3.js +1 -0
  252. package/web-ui/build/static/javastacktrace-4P_J-58S.js +1 -0
  253. package/web-ui/build/static/jboss-cli-DUfK88hO.js +1 -0
  254. package/web-ui/build/static/jexl-DsSijmcs.js +1 -0
  255. package/web-ui/build/static/jolie-DjtNIZB4.js +1 -0
  256. package/web-ui/build/static/jq-BXdSm79y.js +1 -0
  257. package/web-ui/build/static/js-extras-B-C7ngCD.js +1 -0
  258. package/web-ui/build/static/js-templates-CmPAiwFC.js +1 -0
  259. package/web-ui/build/static/jsdoc-CkiXOOMV.js +1 -0
  260. package/web-ui/build/static/json-Bmvhezfj.js +1 -0
  261. package/web-ui/build/static/json-HPR8wBiw.js +1 -0
  262. package/web-ui/build/static/json5-Chcg9nnQ.js +1 -0
  263. package/web-ui/build/static/jsonp-C3KWcfzJ.js +1 -0
  264. package/web-ui/build/static/jsstacktrace-D1jRFy-S.js +1 -0
  265. package/web-ui/build/static/jsx-COtCqQ_9.js +1 -0
  266. package/web-ui/build/static/julia-BVvfw2TB.js +1 -0
  267. package/web-ui/build/static/julia-Ddalvdoa.js +1 -0
  268. package/web-ui/build/static/julia-repl-Bc-uwnIZ.js +1 -0
  269. package/web-ui/build/static/keepalived-CJ9ZYuQx.js +1 -0
  270. package/web-ui/build/static/keyman-BHea-dB6.js +1 -0
  271. package/web-ui/build/static/kotlin-DWOyCb_2.js +1 -0
  272. package/web-ui/build/static/kotlin-fvMiFIS3.js +1 -0
  273. package/web-ui/build/static/kumir-DaNls7gN.js +1 -0
  274. package/web-ui/build/static/kusto-DKweJuKl.js +1 -0
  275. package/web-ui/build/static/lasso-BB9dUrv_.js +1 -0
  276. package/web-ui/build/static/latex-C7U5RUQQ.js +1 -0
  277. package/web-ui/build/static/latex-CXM3EEy0.js +1 -0
  278. package/web-ui/build/static/latte-B4pEA635.js +1 -0
  279. package/web-ui/build/static/ldif-D3wYig10.js +1 -0
  280. package/web-ui/build/static/leaf-uFkjT9sR.js +1 -0
  281. package/web-ui/build/static/less-CbUH4jBX.js +1 -0
  282. package/web-ui/build/static/less-DEGyfeZn.js +1 -0
  283. package/web-ui/build/static/lilypond-UuoBjShK.js +1 -0
  284. package/web-ui/build/static/liquid-DB3a9n7S.js +1 -0
  285. package/web-ui/build/static/lisp-BDbj7Kd2.js +1 -0
  286. package/web-ui/build/static/lisp-D3T0YOb1.js +1 -0
  287. package/web-ui/build/static/livecodeserver-CkZMVLmr.js +1 -0
  288. package/web-ui/build/static/livescript-CJbtbTfA.js +1 -0
  289. package/web-ui/build/static/livescript-CdWg1xgf.js +1 -0
  290. package/web-ui/build/static/llvm-8hpjZ6qF.js +1 -0
  291. package/web-ui/build/static/llvm-DPpuma6i.js +1 -0
  292. package/web-ui/build/static/log-DwsLgecp.js +1 -0
  293. package/web-ui/build/static/lolcode-D3tkyiVB.js +1 -0
  294. package/web-ui/build/static/lsl-BBM4ZYza.js +1 -0
  295. package/web-ui/build/static/lua-DT0su8pZ.js +1 -0
  296. package/web-ui/build/static/lua-DqZXmUwn.js +1 -0
  297. package/web-ui/build/static/magma-DGW0-GCr.js +1 -0
  298. package/web-ui/build/static/makefile-C_K7AaVw.js +1 -0
  299. package/web-ui/build/static/makefile-CarddjPJ.js +1 -0
  300. package/web-ui/build/static/markdown-3dq-8I9T.js +1 -0
  301. package/web-ui/build/static/markdown-c4VYoNo2.js +1 -0
  302. package/web-ui/build/static/markup-templating-BBX0gWS5.js +1 -0
  303. package/web-ui/build/static/mathematica-n-aqoCbO.js +1 -0
  304. package/web-ui/build/static/matlab-B_kYC-A2.js +1 -0
  305. package/web-ui/build/static/matlab-CQP2D_0j.js +1 -0
  306. package/web-ui/build/static/maxima-piaAhCcP.js +1 -0
  307. package/web-ui/build/static/maxscript-CkxNZR1a.js +1 -0
  308. package/web-ui/build/static/mel-BXbrV0aU.js +1 -0
  309. package/web-ui/build/static/mel-CBSpVZcl.js +1 -0
  310. package/web-ui/build/static/mercury-CffeC87B.js +1 -0
  311. package/web-ui/build/static/mermaid-DAZcfksM.js +1 -0
  312. package/web-ui/build/static/mipsasm-DvOPoNgz.js +1 -0
  313. package/web-ui/build/static/mizar-C2ki99qc.js +1 -0
  314. package/web-ui/build/static/mizar-C5AXRrsD.js +1 -0
  315. package/web-ui/build/static/mojolicious-DklqV-uP.js +1 -0
  316. package/web-ui/build/static/mongodb-BbuSPlN0.js +1 -0
  317. package/web-ui/build/static/monkey-CJBb2-mV.js +1 -0
  318. package/web-ui/build/static/monkey-DgERCZQd.js +1 -0
  319. package/web-ui/build/static/moonscript-BovBU9jW.js +1 -0
  320. package/web-ui/build/static/moonscript-lPqbcjjy.js +1 -0
  321. package/web-ui/build/static/n1ql-CjVXW0Z0.js +1 -0
  322. package/web-ui/build/static/n1ql-DkfG2dTH.js +1 -0
  323. package/web-ui/build/static/n4js-6L9QW_kw.js +1 -0
  324. package/web-ui/build/static/nand2tetris-hdl-CqohGHfB.js +1 -0
  325. package/web-ui/build/static/naniscript-CIvQ6y1b.js +1 -0
  326. package/web-ui/build/static/nasm-CQbJbZZf.js +1 -0
  327. package/web-ui/build/static/neon-Cz41RJxQ.js +1 -0
  328. package/web-ui/build/static/nevod-WPRJ2Q9j.js +1 -0
  329. package/web-ui/build/static/nginx-BL2wPbD-.js +1 -0
  330. package/web-ui/build/static/nginx-DsqC_gQT.js +1 -0
  331. package/web-ui/build/static/nim-7qnwzYm_.js +1 -0
  332. package/web-ui/build/static/nim-D6iDo5H6.js +1 -0
  333. package/web-ui/build/static/nix-BQSsaH-G.js +1 -0
  334. package/web-ui/build/static/nix-DgwCtjpD.js +1 -0
  335. package/web-ui/build/static/node-repl-Cb4w8DbD.js +1 -0
  336. package/web-ui/build/static/nsis-CiXZWrqR.js +1 -0
  337. package/web-ui/build/static/nsis-CuwGI5px.js +1 -0
  338. package/web-ui/build/static/objectivec-DZXCqQ1J.js +1 -0
  339. package/web-ui/build/static/objectivec-GNGh-wiY.js +1 -0
  340. package/web-ui/build/static/ocaml-BPg_ANkr.js +1 -0
  341. package/web-ui/build/static/ocaml-DRUpaN8p.js +1 -0
  342. package/web-ui/build/static/opencl-CazTs_sf.js +1 -0
  343. package/web-ui/build/static/openqasm-DHuuXGjm.js +1 -0
  344. package/web-ui/build/static/openscad-YbvBFeLc.js +1 -0
  345. package/web-ui/build/static/oxygene-DDzgbCaQ.js +1 -0
  346. package/web-ui/build/static/oz-BRDBLIjx.js +1 -0
  347. package/web-ui/build/static/parigp-BbApdos7.js +1 -0
  348. package/web-ui/build/static/parser-CbVH4ySK.js +1 -0
  349. package/web-ui/build/static/parser3-BIkvuuuE.js +1 -0
  350. package/web-ui/build/static/pascal-oS7U_3sO.js +1 -0
  351. package/web-ui/build/static/pascaligo-57DdFj76.js +1 -0
  352. package/web-ui/build/static/pcaxis-V-Euf0DV.js +1 -0
  353. package/web-ui/build/static/peoplecode-DjyRW5V8.js +1 -0
  354. package/web-ui/build/static/perl-BEQWvjeP.js +1 -0
  355. package/web-ui/build/static/perl-CiDHRorC.js +1 -0
  356. package/web-ui/build/static/pf-S5x_U1LC.js +1 -0
  357. package/web-ui/build/static/pgsql-DwHZC-iy.js +1 -0
  358. package/web-ui/build/static/php-7enmlb-I.js +1 -0
  359. package/web-ui/build/static/php-extras-BhRDMlXE.js +1 -0
  360. package/web-ui/build/static/php-kIwfq-Jj.js +1 -0
  361. package/web-ui/build/static/php-template-M2RrZc1R.js +1 -0
  362. package/web-ui/build/static/phpdoc-HUeiWlkw.js +1 -0
  363. package/web-ui/build/static/plaintext-CPt25ow_.js +1 -0
  364. package/web-ui/build/static/plsql-BvoRAbdz.js +1 -0
  365. package/web-ui/build/static/pony-BVuhxk7D.js +1 -0
  366. package/web-ui/build/static/powerquery-rnRfiL3F.js +1 -0
  367. package/web-ui/build/static/powershell-BQR2-qjF.js +1 -0
  368. package/web-ui/build/static/powershell-S_XnLato.js +1 -0
  369. package/web-ui/build/static/processing-B-8pt1gx.js +1 -0
  370. package/web-ui/build/static/processing-ozS1KPr7.js +1 -0
  371. package/web-ui/build/static/profile-DOjTmxRs.js +1 -0
  372. package/web-ui/build/static/prolog-BaaxuI5L.js +1 -0
  373. package/web-ui/build/static/prolog-D90dFqfr.js +1 -0
  374. package/web-ui/build/static/promql-BuyoLqtl.js +1 -0
  375. package/web-ui/build/static/properties-C0pMastm.js +1 -0
  376. package/web-ui/build/static/properties-k7bXYQao.js +1 -0
  377. package/web-ui/build/static/protobuf-ChaO1q7B.js +1 -0
  378. package/web-ui/build/static/protobuf-DAGxv01T.js +1 -0
  379. package/web-ui/build/static/psl-BpYOLBqn.js +1 -0
  380. package/web-ui/build/static/pug-BUlJA4UD.js +1 -0
  381. package/web-ui/build/static/puppet-8l--PVpO.js +1 -0
  382. package/web-ui/build/static/puppet-BJDN84xr.js +1 -0
  383. package/web-ui/build/static/pure-DhqjQg1a.js +1 -0
  384. package/web-ui/build/static/purebasic-BHnSz9Yh.js +1 -0
  385. package/web-ui/build/static/purebasic-CeiLO2aV.js +1 -0
  386. package/web-ui/build/static/purescript-BaXXPnKS.js +1 -0
  387. package/web-ui/build/static/python-BXdJ4yqN.js +1 -0
  388. package/web-ui/build/static/python-Cef5Vfx2.js +1 -0
  389. package/web-ui/build/static/python-repl-CRpJP363.js +1 -0
  390. package/web-ui/build/static/q-C6Ov0g11.js +1 -0
  391. package/web-ui/build/static/q-D3tQMiHa.js +1 -0
  392. package/web-ui/build/static/qml-BYofTHXZ.js +1 -0
  393. package/web-ui/build/static/qml-DTxi8T37.js +1 -0
  394. package/web-ui/build/static/qore-Ny7MVtbP.js +1 -0
  395. package/web-ui/build/static/qsharp-Cy_rqHs2.js +1 -0
  396. package/web-ui/build/static/r-BtNaz7Jx.js +1 -0
  397. package/web-ui/build/static/r-DkF7wq0g.js +1 -0
  398. package/web-ui/build/static/racket-C5r8oFZa.js +1 -0
  399. package/web-ui/build/static/reason-BURRGL8T.js +1 -0
  400. package/web-ui/build/static/reasonml-ZPKVqo38.js +1 -0
  401. package/web-ui/build/static/regex-DgaaAttu.js +1 -0
  402. package/web-ui/build/static/rego-CtwYq-qp.js +1 -0
  403. package/web-ui/build/static/renpy-OueysuHf.js +1 -0
  404. package/web-ui/build/static/rest-Co13hzuk.js +1 -0
  405. package/web-ui/build/static/rib-CvGWooaO.js +1 -0
  406. package/web-ui/build/static/rip-5glwZfvx.js +1 -0
  407. package/web-ui/build/static/roboconf-B9R_ZXBj.js +1 -0
  408. package/web-ui/build/static/roboconf-Gf0nTNKt.js +1 -0
  409. package/web-ui/build/static/robotframework-C2axWAv1.js +1 -0
  410. package/web-ui/build/static/routeros-CE_Iedbm.js +1 -0
  411. package/web-ui/build/static/rsl-2QjczbcI.js +1 -0
  412. package/web-ui/build/static/ruby-5q7nApRB.js +1 -0
  413. package/web-ui/build/static/ruby-BUTeEeQo.js +1 -0
  414. package/web-ui/build/static/ruleslanguage-vxFl2T6e.js +1 -0
  415. package/web-ui/build/static/rust-BMuquF4q.js +1 -0
  416. package/web-ui/build/static/rust-CcZQo8qE.js +1 -0
  417. package/web-ui/build/static/sas-B3kZio_a.js +1 -0
  418. package/web-ui/build/static/sas-Bbv6Pcs_.js +1 -0
  419. package/web-ui/build/static/sass-C0q0q-U-.js +1 -0
  420. package/web-ui/build/static/scala-B5vW0oUX.js +1 -0
  421. package/web-ui/build/static/scala-CyVnVDED.js +1 -0
  422. package/web-ui/build/static/scheme-C9JOo4R_.js +1 -0
  423. package/web-ui/build/static/scheme-W2233tzx.js +1 -0
  424. package/web-ui/build/static/scilab-D2Bvw6Ov.js +1 -0
  425. package/web-ui/build/static/scss-CTlab4AI.js +1 -0
  426. package/web-ui/build/static/scss-DZ5g2Z9m.js +1 -0
  427. package/web-ui/build/static/shell-bYpiB--U.js +1 -0
  428. package/web-ui/build/static/shell-session-C4jzoNup.js +1 -0
  429. package/web-ui/build/static/smali-9ucoTzDl.js +1 -0
  430. package/web-ui/build/static/smali-BnluPxDD.js +1 -0
  431. package/web-ui/build/static/smalltalk-CAMGWItN.js +1 -0
  432. package/web-ui/build/static/smalltalk-DNxg0Og_.js +1 -0
  433. package/web-ui/build/static/smarty-YxNaCRZt.js +1 -0
  434. package/web-ui/build/static/sml-CZbvurr2.js +1 -0
  435. package/web-ui/build/static/sml-DGs_TRXx.js +1 -0
  436. package/web-ui/build/static/solidity-CEsviKxI.js +1 -0
  437. package/web-ui/build/static/solution-file-D0Yvaoet.js +1 -0
  438. package/web-ui/build/static/soy-BmVAPY7I.js +1 -0
  439. package/web-ui/build/static/sparql-D8d4i2J8.js +1 -0
  440. package/web-ui/build/static/splunk-spl-CcgWj5Im.js +1 -0
  441. package/web-ui/build/static/sqf-Cd4tBlXZ.js +1 -0
  442. package/web-ui/build/static/sqf-DC8e-wlP.js +1 -0
  443. package/web-ui/build/static/sql-D5KtfAwl.js +1 -0
  444. package/web-ui/build/static/sql-DX4iGc5J.js +1 -0
  445. package/web-ui/build/static/sql_more-9ztUFh5U.js +1 -0
  446. package/web-ui/build/static/squirrel-CiVV01fQ.js +1 -0
  447. package/web-ui/build/static/stan-DCrPYtdq.js +1 -0
  448. package/web-ui/build/static/stan-LL9ScTUT.js +1 -0
  449. package/web-ui/build/static/stata-n-r5-RvF.js +1 -0
  450. package/web-ui/build/static/step21-B2hxGG1E.js +1 -0
  451. package/web-ui/build/static/stylus-D-1wq2uN.js +1 -0
  452. package/web-ui/build/static/stylus-Dr-w1AjW.js +1 -0
  453. package/web-ui/build/static/subunit-DRCyiRHI.js +1 -0
  454. package/web-ui/build/static/swift-B2ZIuBjB.js +1 -0
  455. package/web-ui/build/static/swift-CnRpp8ao.js +1 -0
  456. package/web-ui/build/static/systemd-LPN-yj3b.js +1 -0
  457. package/web-ui/build/static/t4-cs-CXJSMlet.js +1 -0
  458. package/web-ui/build/static/t4-templating-Ciw3keAZ.js +1 -0
  459. package/web-ui/build/static/t4-vb-CXe99AWF.js +1 -0
  460. package/web-ui/build/static/taggerscript-Bm830ZwV.js +1 -0
  461. package/web-ui/build/static/tap-B0WwYGVt.js +1 -0
  462. package/web-ui/build/static/tap-Dw_cgj6K.js +1 -0
  463. package/web-ui/build/static/tcl-Di4JhH4s.js +1 -0
  464. package/web-ui/build/static/tcl-cIeBNf2V.js +1 -0
  465. package/web-ui/build/static/textile-DgMdCAz5.js +1 -0
  466. package/web-ui/build/static/thrift-zY2WxYMk.js +1 -0
  467. package/web-ui/build/static/toml-BtXdKizf.js +1 -0
  468. package/web-ui/build/static/tp-DxY0K8UF.js +1 -0
  469. package/web-ui/build/static/tremor-890wqxvH.js +1 -0
  470. package/web-ui/build/static/tsx-92ElsKxL.js +1 -0
  471. package/web-ui/build/static/tt2-DqcvjDKh.js +1 -0
  472. package/web-ui/build/static/turtle-BZikMsiD.js +1 -0
  473. package/web-ui/build/static/twig-BlxkEMdw.js +1 -0
  474. package/web-ui/build/static/twig-CfsoMGnv.js +1 -0
  475. package/web-ui/build/static/typescript-3xS8yDgH.js +1 -0
  476. package/web-ui/build/static/typescript-Dx0zHssr.js +1 -0
  477. package/web-ui/build/static/typoscript-BdFwMGCV.js +1 -0
  478. package/web-ui/build/static/unrealscript-DJzoqp3G.js +1 -0
  479. package/web-ui/build/static/uorazor-CQO8Ynpw.js +1 -0
  480. package/web-ui/build/static/uri-BUBBJdel.js +1 -0
  481. package/web-ui/build/static/v-XU798JEc.js +1 -0
  482. package/web-ui/build/static/vala-DsH-Nomr.js +1 -0
  483. package/web-ui/build/static/vala-gCVw4o0d.js +1 -0
  484. package/web-ui/build/static/vbnet-BHw8cZ4s.js +1 -0
  485. package/web-ui/build/static/vbnet-DPa2ddOk.js +1 -0
  486. package/web-ui/build/static/vbscript-html-CNADYJ1-.js +1 -0
  487. package/web-ui/build/static/vbscript-ztRmIppj.js +1 -0
  488. package/web-ui/build/static/velocity-DVfeN53w.js +1 -0
  489. package/web-ui/build/static/verilog-C9VDLRl9.js +1 -0
  490. package/web-ui/build/static/verilog-Dsmt_WJW.js +1 -0
  491. package/web-ui/build/static/vhdl-DbylNGny.js +1 -0
  492. package/web-ui/build/static/vhdl-wNJe3yKK.js +1 -0
  493. package/web-ui/build/static/vim-6PLlVaq_.js +1 -0
  494. package/web-ui/build/static/vim-BJpkTTe-.js +1 -0
  495. package/web-ui/build/static/visual-basic-GY3wXjJ3.js +1 -0
  496. package/web-ui/build/static/warpscript-DUb9z3yI.js +1 -0
  497. package/web-ui/build/static/wasm-Dey0RlHH.js +1 -0
  498. package/web-ui/build/static/web-idl-qAF1RqaI.js +1 -0
  499. package/web-ui/build/static/wiki-Dh3Vjtce.js +1 -0
  500. package/web-ui/build/static/wolfram-BrQcRMlt.js +1 -0
  501. package/web-ui/build/static/wren-Cu3Mzln6.js +1 -0
  502. package/web-ui/build/static/x86asm-DD5mhaEi.js +1 -0
  503. package/web-ui/build/static/xeora-DKRZ6hlr.js +1 -0
  504. package/web-ui/build/static/xl-BL8R8sAx.js +1 -0
  505. package/web-ui/build/static/xml-doc-BSpNJbEM.js +1 -0
  506. package/web-ui/build/static/xml-i5BJyEQ7.js +1 -0
  507. package/web-ui/build/static/xojo-r2ieNAyP.js +1 -0
  508. package/web-ui/build/static/xquery-BtAK8Dvl.js +1 -0
  509. package/web-ui/build/static/xquery-CM4Q_TX7.js +1 -0
  510. package/web-ui/build/static/yaml-Mm8ArZA3.js +1 -0
  511. package/web-ui/build/static/yaml-r-QeuY00.js +1 -0
  512. package/web-ui/build/static/yang-qcKR-Y23.js +1 -0
  513. package/web-ui/build/static/zephir-8ApHtH7c.js +1 -0
  514. package/web-ui/build/static/zig-BanqOd9_.js +1 -0
  515. package/web-ui/build/static/1c-alYWzgyM.js +0 -1
  516. package/web-ui/build/static/abap-MNX4MGQu.js +0 -1
  517. package/web-ui/build/static/abnf-PB6umZUe.js +0 -1
  518. package/web-ui/build/static/abnf-lLelqyRq.js +0 -1
  519. package/web-ui/build/static/accesslog-ECfnNf6M.js +0 -1
  520. package/web-ui/build/static/actionscript-48Mv-P2G.js +0 -1
  521. package/web-ui/build/static/actionscript-CmFMkWAF.js +0 -1
  522. package/web-ui/build/static/ada-D0nj2830.js +0 -1
  523. package/web-ui/build/static/ada-DC68kRrL.js +0 -1
  524. package/web-ui/build/static/agda-CjnuTEYG.js +0 -1
  525. package/web-ui/build/static/al-DICLGfy9.js +0 -1
  526. package/web-ui/build/static/angelscript-D7H0wknj.js +0 -1
  527. package/web-ui/build/static/antlr4-C_KsZIwI.js +0 -1
  528. package/web-ui/build/static/apache-Cfj2o0TW.js +0 -1
  529. package/web-ui/build/static/apacheconf-D5jQXqP_.js +0 -1
  530. package/web-ui/build/static/apex-G2rOb7vm.js +0 -1
  531. package/web-ui/build/static/apl-CE_aKOLQ.js +0 -1
  532. package/web-ui/build/static/applescript-BffXi9IZ.js +0 -1
  533. package/web-ui/build/static/applescript-CshVa-pZ.js +0 -1
  534. package/web-ui/build/static/aql-F9xr2xIN.js +0 -1
  535. package/web-ui/build/static/arcade-29Re4fPy.js +0 -1
  536. package/web-ui/build/static/arduino-BGsZiYrf.js +0 -1
  537. package/web-ui/build/static/arduino-HiqNS--s.js +0 -1
  538. package/web-ui/build/static/arff-jPcJv_eJ.js +0 -1
  539. package/web-ui/build/static/armasm-DDockn0p.js +0 -1
  540. package/web-ui/build/static/asciidoc-BW3nh79M.js +0 -1
  541. package/web-ui/build/static/asciidoc-Dxit6U7t.js +0 -1
  542. package/web-ui/build/static/asm6502-eTpxnsNy.js +0 -1
  543. package/web-ui/build/static/asmatmel-BHeErmNQ.js +0 -1
  544. package/web-ui/build/static/aspectj-CX6x53Aw.js +0 -1
  545. package/web-ui/build/static/aspnet-BFDGvlyU.js +0 -1
  546. package/web-ui/build/static/autohotkey-CRNZnW-g.js +0 -1
  547. package/web-ui/build/static/autohotkey-DhdXEUbC.js +0 -1
  548. package/web-ui/build/static/autoit-BrCU_LoC.js +0 -1
  549. package/web-ui/build/static/autoit-CNY5ZLoO.js +0 -1
  550. package/web-ui/build/static/avisynth-CvpX-vR-.js +0 -1
  551. package/web-ui/build/static/avrasm-Ch0VgbnW.js +0 -1
  552. package/web-ui/build/static/avro-idl-DVNgaXeA.js +0 -1
  553. package/web-ui/build/static/awk-DBbMErBm.js +0 -1
  554. package/web-ui/build/static/axapta-BZMCBJyd.js +0 -1
  555. package/web-ui/build/static/bash-B7W9_l_H.js +0 -1
  556. package/web-ui/build/static/bash-nUxPXV93.js +0 -1
  557. package/web-ui/build/static/basic-CncKWTdb.js +0 -1
  558. package/web-ui/build/static/basic-t050Yfrj.js +0 -1
  559. package/web-ui/build/static/batch-DzppEDD6.js +0 -1
  560. package/web-ui/build/static/bbcode-Cxa6xUCC.js +0 -1
  561. package/web-ui/build/static/bicep-CNfRbyLD.js +0 -1
  562. package/web-ui/build/static/birb-BQn3C4qH.js +0 -1
  563. package/web-ui/build/static/bison-CG1ITN82.js +0 -1
  564. package/web-ui/build/static/bnf-BH6EqVfg.js +0 -1
  565. package/web-ui/build/static/bnf-DOOI4ziA.js +0 -1
  566. package/web-ui/build/static/brainfuck-CuvanNT4.js +0 -1
  567. package/web-ui/build/static/brainfuck-DEN53aXA.js +0 -1
  568. package/web-ui/build/static/brightscript-C_qPLhPu.js +0 -1
  569. package/web-ui/build/static/bro-DE4fdxVn.js +0 -1
  570. package/web-ui/build/static/bsl-DhilRMN1.js +0 -1
  571. package/web-ui/build/static/c-DJMkv9RR.js +0 -1
  572. package/web-ui/build/static/c-HH0eyrSO.js +0 -1
  573. package/web-ui/build/static/c-like-CievvBLp.js +0 -1
  574. package/web-ui/build/static/cal-BBz3_HT0.js +0 -1
  575. package/web-ui/build/static/capnproto-BOgD9Wf3.js +0 -1
  576. package/web-ui/build/static/ceylon-MWYZBIMt.js +0 -1
  577. package/web-ui/build/static/cfscript-BiVuxt5i.js +0 -1
  578. package/web-ui/build/static/chaiscript-CPx7l6f-.js +0 -1
  579. package/web-ui/build/static/cil-3DGkdNym.js +0 -1
  580. package/web-ui/build/static/clean-Bxi-hwbJ.js +0 -1
  581. package/web-ui/build/static/clojure-BBMLjTS9.js +0 -1
  582. package/web-ui/build/static/clojure-RPrwnP3x.js +0 -1
  583. package/web-ui/build/static/clojure-repl-BE9VGIhP.js +0 -1
  584. package/web-ui/build/static/cmake-BMeSZbTq.js +0 -1
  585. package/web-ui/build/static/cmake-CLVNptnB.js +0 -1
  586. package/web-ui/build/static/cobol-f-w6Mj2H.js +0 -1
  587. package/web-ui/build/static/coffeescript-CESbl4tN.js +0 -1
  588. package/web-ui/build/static/coffeescript-DmOzsrDS.js +0 -1
  589. package/web-ui/build/static/concurnas-DxQ9U571.js +0 -1
  590. package/web-ui/build/static/coq-4Wu7fuDB.js +0 -1
  591. package/web-ui/build/static/coq-BERQ-1c4.js +0 -1
  592. package/web-ui/build/static/cos-SsvxAn6O.js +0 -1
  593. package/web-ui/build/static/cpp-BkY4KhJS.js +0 -1
  594. package/web-ui/build/static/cpp-CGkeKbAD.js +0 -1
  595. package/web-ui/build/static/crmsh-BL32bNK1.js +0 -1
  596. package/web-ui/build/static/crystal-C4e562-w.js +0 -1
  597. package/web-ui/build/static/crystal-Hu8WDm2E.js +0 -1
  598. package/web-ui/build/static/csharp-DvnJhHBw.js +0 -1
  599. package/web-ui/build/static/csharp-DxFH-E_J.js +0 -1
  600. package/web-ui/build/static/cshtml-BkimeLw1.js +0 -1
  601. package/web-ui/build/static/csp-CDNmbLWI.js +0 -1
  602. package/web-ui/build/static/csp-DXmobqdr.js +0 -1
  603. package/web-ui/build/static/css-VRUoX-cu.js +0 -1
  604. package/web-ui/build/static/css-extras-Dcz-5Gz_.js +0 -1
  605. package/web-ui/build/static/csv-Cy-vj0dX.js +0 -1
  606. package/web-ui/build/static/cypher-CyiGMZEd.js +0 -1
  607. package/web-ui/build/static/d-50yhKzqs.js +0 -1
  608. package/web-ui/build/static/d-CtQcHe9N.js +0 -1
  609. package/web-ui/build/static/dart-Dj05IVm2.js +0 -1
  610. package/web-ui/build/static/dart-kumEUEig.js +0 -1
  611. package/web-ui/build/static/dataweave-CyaTPvHl.js +0 -1
  612. package/web-ui/build/static/dax-BYZEUwTe.js +0 -1
  613. package/web-ui/build/static/delphi-Hrkf0_Zm.js +0 -1
  614. package/web-ui/build/static/dhall-ZfXZcVvQ.js +0 -1
  615. package/web-ui/build/static/diff-B681Qorw.js +0 -1
  616. package/web-ui/build/static/diff-C85U1vU3.js +0 -1
  617. package/web-ui/build/static/django-BbqkMAd3.js +0 -1
  618. package/web-ui/build/static/django-ebEm7IW1.js +0 -1
  619. package/web-ui/build/static/dns-CIKOn0cx.js +0 -1
  620. package/web-ui/build/static/dns-zone-file-Cgfj303q.js +0 -1
  621. package/web-ui/build/static/docker-DezZesK-.js +0 -1
  622. package/web-ui/build/static/dockerfile-HOIJDSPT.js +0 -1
  623. package/web-ui/build/static/dos-Bv0IPgh2.js +0 -1
  624. package/web-ui/build/static/dot-BiJIuPYL.js +0 -1
  625. package/web-ui/build/static/dsconfig-DCPRv9km.js +0 -1
  626. package/web-ui/build/static/dts-CXMbX7gl.js +0 -1
  627. package/web-ui/build/static/dust-Mjmn5ftw.js +0 -1
  628. package/web-ui/build/static/ebnf-469W3R_o.js +0 -1
  629. package/web-ui/build/static/ebnf-Bs6Ftm9u.js +0 -1
  630. package/web-ui/build/static/editorconfig-C4dD8cK_.js +0 -1
  631. package/web-ui/build/static/eiffel-D78uHdvn.js +0 -1
  632. package/web-ui/build/static/ejs-CUydrtqr.js +0 -1
  633. package/web-ui/build/static/elixir-BIxlPrSO.js +0 -1
  634. package/web-ui/build/static/elixir-CLS7rDXm.js +0 -1
  635. package/web-ui/build/static/elm-CdXXWPN7.js +0 -1
  636. package/web-ui/build/static/elm-DT7wSSPo.js +0 -1
  637. package/web-ui/build/static/erb-8Xeo3WFF.js +0 -1
  638. package/web-ui/build/static/erb-DROzrB_O.js +0 -1
  639. package/web-ui/build/static/erlang-DbMlkDTN.js +0 -1
  640. package/web-ui/build/static/erlang-DoF730hs.js +0 -1
  641. package/web-ui/build/static/erlang-repl-B7enXvga.js +0 -1
  642. package/web-ui/build/static/etlua-CehWhSD3.js +0 -1
  643. package/web-ui/build/static/excel-DHmOIegb.js +0 -1
  644. package/web-ui/build/static/excel-formula-DdeWF1_w.js +0 -1
  645. package/web-ui/build/static/factor-DBMZ3xT3.js +0 -1
  646. package/web-ui/build/static/false-AxZ_vqH0.js +0 -1
  647. package/web-ui/build/static/firestore-security-rules-BChGByFG.js +0 -1
  648. package/web-ui/build/static/fix-Cc-mOcI9.js +0 -1
  649. package/web-ui/build/static/flix-CBpO-hKP.js +0 -1
  650. package/web-ui/build/static/flow-FI5Ahl__.js +0 -1
  651. package/web-ui/build/static/fortran-C-jW3mxU.js +0 -1
  652. package/web-ui/build/static/fortran-zFBKdQax.js +0 -1
  653. package/web-ui/build/static/fsharp-Qu8P7ZfJ.js +0 -1
  654. package/web-ui/build/static/fsharp-gJT07_u6.js +0 -1
  655. package/web-ui/build/static/ftl-DcmD2jIl.js +0 -1
  656. package/web-ui/build/static/gams-BAhsVwik.js +0 -1
  657. package/web-ui/build/static/gap-DtjJMac5.js +0 -1
  658. package/web-ui/build/static/gauss-DLNJrvWH.js +0 -1
  659. package/web-ui/build/static/gcode-CbChIRHG.js +0 -1
  660. package/web-ui/build/static/gcode-lgPukEuS.js +0 -1
  661. package/web-ui/build/static/gdscript-ChdqKkXx.js +0 -1
  662. package/web-ui/build/static/gedcom-B3RAxWnR.js +0 -1
  663. package/web-ui/build/static/gherkin-BwKe4UMd.js +0 -1
  664. package/web-ui/build/static/gherkin-D1Q4xoY6.js +0 -1
  665. package/web-ui/build/static/git-CwA8K3Cg.js +0 -1
  666. package/web-ui/build/static/glsl-B_AtY5k6.js +0 -1
  667. package/web-ui/build/static/glsl-BgXyZa9x.js +0 -1
  668. package/web-ui/build/static/gml-O2ebFipB.js +0 -1
  669. package/web-ui/build/static/gml-xLusiP_j.js +0 -1
  670. package/web-ui/build/static/gn-T-uGKQLr.js +0 -1
  671. package/web-ui/build/static/go-B9spniuU.js +0 -1
  672. package/web-ui/build/static/go-DTwlbvuB.js +0 -1
  673. package/web-ui/build/static/go-module-DWCbGNjZ.js +0 -1
  674. package/web-ui/build/static/golo-Dp3ZC9Ry.js +0 -1
  675. package/web-ui/build/static/gradle-DxnYLs2J.js +0 -1
  676. package/web-ui/build/static/graphql-8stFQb3o.js +0 -1
  677. package/web-ui/build/static/groovy-Dbpy85Rs.js +0 -1
  678. package/web-ui/build/static/groovy-zimUQS73.js +0 -1
  679. package/web-ui/build/static/haml-B5gJAH_w.js +0 -1
  680. package/web-ui/build/static/haml-CXW3L0QY.js +0 -1
  681. package/web-ui/build/static/handlebars-BW92WxdN.js +0 -1
  682. package/web-ui/build/static/handlebars-DNysemQE.js +0 -1
  683. package/web-ui/build/static/haskell-BCP5M1h6.js +0 -1
  684. package/web-ui/build/static/haskell-BvSwVdJS.js +0 -1
  685. package/web-ui/build/static/haxe-BBVHLa1y.js +0 -1
  686. package/web-ui/build/static/haxe-DHK7XQB_.js +0 -1
  687. package/web-ui/build/static/hcl-CW0_ZJVS.js +0 -1
  688. package/web-ui/build/static/hlsl-DAH7B5KM.js +0 -1
  689. package/web-ui/build/static/hoon-CXY0i4p4.js +0 -1
  690. package/web-ui/build/static/hpkp-RL8DG2Fy.js +0 -1
  691. package/web-ui/build/static/hsp-DMAT8yb3.js +0 -1
  692. package/web-ui/build/static/hsts-SOCNnT21.js +0 -1
  693. package/web-ui/build/static/htmlbars-Bsrm5Qs8.js +0 -1
  694. package/web-ui/build/static/http-CYjIQwPj.js +0 -1
  695. package/web-ui/build/static/http-Hu8W9pON.js +0 -1
  696. package/web-ui/build/static/hy-CDbyyAxf.js +0 -1
  697. package/web-ui/build/static/ichigojam-CpPBjr7T.js +0 -1
  698. package/web-ui/build/static/icon-UI22EXz2.js +0 -1
  699. package/web-ui/build/static/icu-message-format-DAU066Wq.js +0 -1
  700. package/web-ui/build/static/idris-BuMEL37s.js +0 -1
  701. package/web-ui/build/static/iecst-CEqwKb_G.js +0 -1
  702. package/web-ui/build/static/ignore-CcCxTW7I.js +0 -1
  703. package/web-ui/build/static/index-C9Fa_kgD.css +0 -1
  704. package/web-ui/build/static/index-DexoK8pu.js +0 -834
  705. package/web-ui/build/static/index-DgeaGxMy.js +0 -13
  706. package/web-ui/build/static/index-RM91zq9j.js +0 -1
  707. package/web-ui/build/static/inform7-BdnukB1N.js +0 -1
  708. package/web-ui/build/static/inform7-Chkw-Df3.js +0 -1
  709. package/web-ui/build/static/ini--KUo0NJD.js +0 -1
  710. package/web-ui/build/static/ini-eo_rWFNv.js +0 -1
  711. package/web-ui/build/static/io-CWDVYxeI.js +0 -1
  712. package/web-ui/build/static/irpf90-CWFfmPjK.js +0 -1
  713. package/web-ui/build/static/isbl-BNkdk_dr.js +0 -1
  714. package/web-ui/build/static/j-Bg02P4UL.js +0 -1
  715. package/web-ui/build/static/java-BIDWcDHj.js +0 -1
  716. package/web-ui/build/static/java-D4bhM1sC.js +0 -1
  717. package/web-ui/build/static/javadoc-DxxfkSj4.js +0 -1
  718. package/web-ui/build/static/javadoclike-C3v2LXMS.js +0 -1
  719. package/web-ui/build/static/javascript-CSu6Pvd7.js +0 -1
  720. package/web-ui/build/static/javastacktrace-C50AqeNg.js +0 -1
  721. package/web-ui/build/static/jboss-cli-D4aAEeAL.js +0 -1
  722. package/web-ui/build/static/jexl-F8wyoUqO.js +0 -1
  723. package/web-ui/build/static/jolie-CdEDMXNQ.js +0 -1
  724. package/web-ui/build/static/jq-D95l3yQ0.js +0 -1
  725. package/web-ui/build/static/js-extras-55OlT8yf.js +0 -1
  726. package/web-ui/build/static/js-templates-4m7AkoaU.js +0 -1
  727. package/web-ui/build/static/jsdoc-BC6Ab1D0.js +0 -1
  728. package/web-ui/build/static/json-BHS2wD8g.js +0 -1
  729. package/web-ui/build/static/json-CPEJ9diH.js +0 -1
  730. package/web-ui/build/static/json5-EDQFzkuf.js +0 -1
  731. package/web-ui/build/static/jsonp-Cn_lpjaf.js +0 -1
  732. package/web-ui/build/static/jsstacktrace-pqdhqbKV.js +0 -1
  733. package/web-ui/build/static/jsx-Cop--oM_.js +0 -1
  734. package/web-ui/build/static/julia-B728rR99.js +0 -1
  735. package/web-ui/build/static/julia-Cq6vOawm.js +0 -1
  736. package/web-ui/build/static/julia-repl-BfOfjY_7.js +0 -1
  737. package/web-ui/build/static/keepalived-6ZwoBjFL.js +0 -1
  738. package/web-ui/build/static/keyman-DmOLCkH_.js +0 -1
  739. package/web-ui/build/static/kotlin-Bt385M6s.js +0 -1
  740. package/web-ui/build/static/kotlin-DsTE9me6.js +0 -1
  741. package/web-ui/build/static/kumir-DGpgb_2O.js +0 -1
  742. package/web-ui/build/static/kusto-Bb1U0J5m.js +0 -1
  743. package/web-ui/build/static/lasso-B4Rh4fa1.js +0 -1
  744. package/web-ui/build/static/latex-BlKwUVQO.js +0 -1
  745. package/web-ui/build/static/latex-D4EkT2Sx.js +0 -1
  746. package/web-ui/build/static/latte-8APUTRqH.js +0 -1
  747. package/web-ui/build/static/ldif-C1AH3r9Q.js +0 -1
  748. package/web-ui/build/static/leaf-DgHqqnCU.js +0 -1
  749. package/web-ui/build/static/less-BmLC9UX9.js +0 -1
  750. package/web-ui/build/static/less-D7wanA1u.js +0 -1
  751. package/web-ui/build/static/lilypond-CPpwdP3M.js +0 -1
  752. package/web-ui/build/static/liquid-C9g89s0-.js +0 -1
  753. package/web-ui/build/static/lisp-Ck1UA6zq.js +0 -1
  754. package/web-ui/build/static/lisp-tlR-SVFU.js +0 -1
  755. package/web-ui/build/static/livecodeserver-CfcVUDKK.js +0 -1
  756. package/web-ui/build/static/livescript-BPfp_PIe.js +0 -1
  757. package/web-ui/build/static/livescript-BVClM17E.js +0 -1
  758. package/web-ui/build/static/llvm-1CmNV1WZ.js +0 -1
  759. package/web-ui/build/static/llvm-DzaT3xf4.js +0 -1
  760. package/web-ui/build/static/log-x35sd55_.js +0 -1
  761. package/web-ui/build/static/lolcode-DfGz4a2C.js +0 -1
  762. package/web-ui/build/static/lsl-BJ13xzsn.js +0 -1
  763. package/web-ui/build/static/lua-DHTiU4iK.js +0 -1
  764. package/web-ui/build/static/lua-DttbbyOa.js +0 -1
  765. package/web-ui/build/static/magma-CM6u6Urv.js +0 -1
  766. package/web-ui/build/static/makefile--_TmwP5m.js +0 -1
  767. package/web-ui/build/static/makefile-DoB_xjMl.js +0 -1
  768. package/web-ui/build/static/markdown-BnyhT66e.js +0 -1
  769. package/web-ui/build/static/markdown-DvTREwgd.js +0 -1
  770. package/web-ui/build/static/markup-templating-yOvzgP3Z.js +0 -1
  771. package/web-ui/build/static/mathematica-BtY5tmVE.js +0 -1
  772. package/web-ui/build/static/matlab-DK98sDbn.js +0 -1
  773. package/web-ui/build/static/matlab-sBcSHRlC.js +0 -1
  774. package/web-ui/build/static/maxima-DMUOymL4.js +0 -1
  775. package/web-ui/build/static/maxscript-DaIC7eX6.js +0 -1
  776. package/web-ui/build/static/mel-BuONpgVc.js +0 -1
  777. package/web-ui/build/static/mel-Ckh0frDB.js +0 -1
  778. package/web-ui/build/static/mercury-CDFt4KAe.js +0 -1
  779. package/web-ui/build/static/mermaid-BqSA7Pr5.js +0 -1
  780. package/web-ui/build/static/mipsasm-Dj6mne2g.js +0 -1
  781. package/web-ui/build/static/mizar-CIQIQU-V.js +0 -1
  782. package/web-ui/build/static/mizar-CLTLHCGu.js +0 -1
  783. package/web-ui/build/static/mojolicious-DxjS7wDV.js +0 -1
  784. package/web-ui/build/static/mongodb-BAEipI91.js +0 -1
  785. package/web-ui/build/static/monkey-BBGnwc6s.js +0 -1
  786. package/web-ui/build/static/monkey-CvxTCuiS.js +0 -1
  787. package/web-ui/build/static/moonscript-CqDVk1K9.js +0 -1
  788. package/web-ui/build/static/moonscript-DJyxvZQc.js +0 -1
  789. package/web-ui/build/static/n1ql-AFWwB4Xn.js +0 -1
  790. package/web-ui/build/static/n1ql-VuVk9_MG.js +0 -1
  791. package/web-ui/build/static/n4js-BH6hpdgG.js +0 -1
  792. package/web-ui/build/static/nand2tetris-hdl-kVewh9V1.js +0 -1
  793. package/web-ui/build/static/naniscript-B_oQ4TiW.js +0 -1
  794. package/web-ui/build/static/nasm-B1_bJvcz.js +0 -1
  795. package/web-ui/build/static/neon-CbXfhQIm.js +0 -1
  796. package/web-ui/build/static/nevod-5Fv5cPWk.js +0 -1
  797. package/web-ui/build/static/nginx-BfifkBy-.js +0 -1
  798. package/web-ui/build/static/nginx-D9toNO0V.js +0 -1
  799. package/web-ui/build/static/nim-BFN2inD1.js +0 -1
  800. package/web-ui/build/static/nim-do_UhCvy.js +0 -1
  801. package/web-ui/build/static/nix-D6RLwwOZ.js +0 -1
  802. package/web-ui/build/static/nix-djoKaPeE.js +0 -1
  803. package/web-ui/build/static/node-repl-DDbffQSR.js +0 -1
  804. package/web-ui/build/static/nsis-BiO6b68i.js +0 -1
  805. package/web-ui/build/static/nsis-CHzeu7js.js +0 -1
  806. package/web-ui/build/static/objectivec-B7vXzYuT.js +0 -1
  807. package/web-ui/build/static/objectivec-BLn212SY.js +0 -1
  808. package/web-ui/build/static/ocaml-BvpR0Yig.js +0 -1
  809. package/web-ui/build/static/ocaml-DWZF00Ti.js +0 -1
  810. package/web-ui/build/static/opencl-C2K2Ctu5.js +0 -1
  811. package/web-ui/build/static/openqasm-Cbtnnn3m.js +0 -1
  812. package/web-ui/build/static/openscad-CEPC0-yW.js +0 -1
  813. package/web-ui/build/static/oxygene-KfcdTXi0.js +0 -1
  814. package/web-ui/build/static/oz-B-azwNjQ.js +0 -1
  815. package/web-ui/build/static/parigp-IWtYGphS.js +0 -1
  816. package/web-ui/build/static/parser-CUCdnJ6l.js +0 -1
  817. package/web-ui/build/static/parser3--a7jm4Uq.js +0 -1
  818. package/web-ui/build/static/pascal-BbezKExl.js +0 -1
  819. package/web-ui/build/static/pascaligo-Bd8IN8hq.js +0 -1
  820. package/web-ui/build/static/pcaxis-CfT0dd7B.js +0 -1
  821. package/web-ui/build/static/peoplecode-Dq29i2LW.js +0 -1
  822. package/web-ui/build/static/perl-BZLc5sMP.js +0 -1
  823. package/web-ui/build/static/perl-JJmLLJne.js +0 -1
  824. package/web-ui/build/static/pf-seOENy0q.js +0 -1
  825. package/web-ui/build/static/pgsql-BtkzXwKY.js +0 -1
  826. package/web-ui/build/static/php-8b9a1w98.js +0 -1
  827. package/web-ui/build/static/php-extras-5D00a1Fm.js +0 -1
  828. package/web-ui/build/static/php-imFv4WXA.js +0 -1
  829. package/web-ui/build/static/php-template-CI-0RdMu.js +0 -1
  830. package/web-ui/build/static/phpdoc-DdcPBfc-.js +0 -1
  831. package/web-ui/build/static/plaintext-Ca1WAvT6.js +0 -1
  832. package/web-ui/build/static/plsql-CZV7QAnN.js +0 -1
  833. package/web-ui/build/static/pony-DiomUkGt.js +0 -1
  834. package/web-ui/build/static/powerquery-CKXX2_O_.js +0 -1
  835. package/web-ui/build/static/powershell-2Ctsosr0.js +0 -1
  836. package/web-ui/build/static/powershell-DVPkgaB6.js +0 -1
  837. package/web-ui/build/static/processing-BAuxATGX.js +0 -1
  838. package/web-ui/build/static/processing-DBzyjRsf.js +0 -1
  839. package/web-ui/build/static/profile-Cq2gkRUb.js +0 -1
  840. package/web-ui/build/static/prolog-ByKO_5p_.js +0 -1
  841. package/web-ui/build/static/prolog-CDCLze6j.js +0 -1
  842. package/web-ui/build/static/promql-BYOPu10L.js +0 -1
  843. package/web-ui/build/static/properties-kP8T8mqV.js +0 -1
  844. package/web-ui/build/static/properties-zdANIr61.js +0 -1
  845. package/web-ui/build/static/protobuf-DhAYlNOg.js +0 -1
  846. package/web-ui/build/static/protobuf-a1lLQN1f.js +0 -1
  847. package/web-ui/build/static/psl-DpP1u6wu.js +0 -1
  848. package/web-ui/build/static/pug-BobY0hsa.js +0 -1
  849. package/web-ui/build/static/puppet-CDimLnep.js +0 -1
  850. package/web-ui/build/static/puppet-D7DLS3gG.js +0 -1
  851. package/web-ui/build/static/pure-4QGsilHw.js +0 -1
  852. package/web-ui/build/static/purebasic-D0wI4z6w.js +0 -1
  853. package/web-ui/build/static/purebasic-Du_RxI7h.js +0 -1
  854. package/web-ui/build/static/purescript-CM92Fn9c.js +0 -1
  855. package/web-ui/build/static/python-Bvcn81x2.js +0 -1
  856. package/web-ui/build/static/python-CkfwrdRF.js +0 -1
  857. package/web-ui/build/static/python-repl-C48-EfyF.js +0 -1
  858. package/web-ui/build/static/q-B2-zP3za.js +0 -1
  859. package/web-ui/build/static/q-KuKa9s_e.js +0 -1
  860. package/web-ui/build/static/qml-D8j38-Sx.js +0 -1
  861. package/web-ui/build/static/qml-DTP6fbZN.js +0 -1
  862. package/web-ui/build/static/qore-DY-n97IK.js +0 -1
  863. package/web-ui/build/static/qsharp-Mn8hUKww.js +0 -1
  864. package/web-ui/build/static/r-BBPYkuMA.js +0 -1
  865. package/web-ui/build/static/r-CheuVCRq.js +0 -1
  866. package/web-ui/build/static/racket-2UxWXIqI.js +0 -1
  867. package/web-ui/build/static/reason-CudKWaht.js +0 -1
  868. package/web-ui/build/static/reasonml-BDZgwPxq.js +0 -1
  869. package/web-ui/build/static/regex-DpKrn61Z.js +0 -1
  870. package/web-ui/build/static/rego-CS2iMzor.js +0 -1
  871. package/web-ui/build/static/renpy-0CbyBFae.js +0 -1
  872. package/web-ui/build/static/rest-Ckpz2bGS.js +0 -1
  873. package/web-ui/build/static/rib-g77eioCq.js +0 -1
  874. package/web-ui/build/static/rip-L-KlpyJn.js +0 -1
  875. package/web-ui/build/static/roboconf-BkNeb0Yn.js +0 -1
  876. package/web-ui/build/static/roboconf-CE-yfGxs.js +0 -1
  877. package/web-ui/build/static/robotframework-ZhLv32cH.js +0 -1
  878. package/web-ui/build/static/routeros-C_1I4hFK.js +0 -1
  879. package/web-ui/build/static/rsl-CxEYmrJa.js +0 -1
  880. package/web-ui/build/static/ruby-Cgxmv3hM.js +0 -1
  881. package/web-ui/build/static/ruby-Cs4qnUzE.js +0 -1
  882. package/web-ui/build/static/ruleslanguage-DPK5B1Dg.js +0 -1
  883. package/web-ui/build/static/rust-BbVN6hMu.js +0 -1
  884. package/web-ui/build/static/rust-C6MrX2UK.js +0 -1
  885. package/web-ui/build/static/sas-CGov9per.js +0 -1
  886. package/web-ui/build/static/sas-Cp88q4DD.js +0 -1
  887. package/web-ui/build/static/sass-COOJqQer.js +0 -1
  888. package/web-ui/build/static/scala-BvOmMtdv.js +0 -1
  889. package/web-ui/build/static/scala-D5gnz3xs.js +0 -1
  890. package/web-ui/build/static/scheme-CNBfxsvv.js +0 -1
  891. package/web-ui/build/static/scheme-DiKuURfA.js +0 -1
  892. package/web-ui/build/static/scilab-vGKouaTh.js +0 -1
  893. package/web-ui/build/static/scss-B4PKgroe.js +0 -1
  894. package/web-ui/build/static/scss-BvRxfJ1U.js +0 -1
  895. package/web-ui/build/static/shell-B5TooOs0.js +0 -1
  896. package/web-ui/build/static/shell-session-TNT_ahRW.js +0 -1
  897. package/web-ui/build/static/smali-CiIXEKzG.js +0 -1
  898. package/web-ui/build/static/smali-EGdSXgM9.js +0 -1
  899. package/web-ui/build/static/smalltalk-DVAXFBVS.js +0 -1
  900. package/web-ui/build/static/smalltalk-Dfy8hlRv.js +0 -1
  901. package/web-ui/build/static/smarty-Rc2y-rm6.js +0 -1
  902. package/web-ui/build/static/sml-BoYe_d8x.js +0 -1
  903. package/web-ui/build/static/sml-CaIv1GsI.js +0 -1
  904. package/web-ui/build/static/solidity-Dem-6tsD.js +0 -1
  905. package/web-ui/build/static/solution-file-DfDjJASp.js +0 -1
  906. package/web-ui/build/static/soy-CkrJH5eW.js +0 -1
  907. package/web-ui/build/static/sparql-Dvg1P5oN.js +0 -1
  908. package/web-ui/build/static/splunk-spl-rB2pJQdl.js +0 -1
  909. package/web-ui/build/static/sqf-Cj_KV-kC.js +0 -1
  910. package/web-ui/build/static/sqf-DA_tj5Fb.js +0 -1
  911. package/web-ui/build/static/sql-CYDE0gzH.js +0 -1
  912. package/web-ui/build/static/sql-D8byAq-B.js +0 -1
  913. package/web-ui/build/static/sql_more-bMORpicj.js +0 -1
  914. package/web-ui/build/static/squirrel-rgwbGN0q.js +0 -1
  915. package/web-ui/build/static/stan-C-OYiHTu.js +0 -1
  916. package/web-ui/build/static/stan-CT8cMsn7.js +0 -1
  917. package/web-ui/build/static/stata-BJwZeN-z.js +0 -1
  918. package/web-ui/build/static/step21-WP26kxkW.js +0 -1
  919. package/web-ui/build/static/stylus-Cw9up-Iv.js +0 -1
  920. package/web-ui/build/static/stylus-CyFEQpH2.js +0 -1
  921. package/web-ui/build/static/subunit-B2XhtaLx.js +0 -1
  922. package/web-ui/build/static/swift-Bpyyuvtg.js +0 -1
  923. package/web-ui/build/static/swift-D-jiKNlA.js +0 -1
  924. package/web-ui/build/static/systemd-DE3AeWrd.js +0 -1
  925. package/web-ui/build/static/t4-cs-BSG7rkB_.js +0 -1
  926. package/web-ui/build/static/t4-templating-Cy7LuqAv.js +0 -1
  927. package/web-ui/build/static/t4-vb-ZLfMjXrh.js +0 -1
  928. package/web-ui/build/static/taggerscript-q2zFfkel.js +0 -1
  929. package/web-ui/build/static/tap-CzjhWyhf.js +0 -1
  930. package/web-ui/build/static/tap-ttXfPums.js +0 -1
  931. package/web-ui/build/static/tcl-6ta1XDva.js +0 -1
  932. package/web-ui/build/static/tcl-Cvx4AN_Q.js +0 -1
  933. package/web-ui/build/static/textile-zWm4gRbJ.js +0 -1
  934. package/web-ui/build/static/thrift-Crj4hRsm.js +0 -1
  935. package/web-ui/build/static/toml-hVfLOJr-.js +0 -1
  936. package/web-ui/build/static/tp-D5aJh4yF.js +0 -1
  937. package/web-ui/build/static/tremor-B9gWC4v1.js +0 -1
  938. package/web-ui/build/static/tsx-DtNWBAJO.js +0 -1
  939. package/web-ui/build/static/tt2-eH1L7Bpm.js +0 -1
  940. package/web-ui/build/static/turtle-BYCk4r6f.js +0 -1
  941. package/web-ui/build/static/twig-BQ-dq4no.js +0 -1
  942. package/web-ui/build/static/twig-n3AiXKyV.js +0 -1
  943. package/web-ui/build/static/typescript-CPQ0vD90.js +0 -1
  944. package/web-ui/build/static/typescript-juxiNWRf.js +0 -1
  945. package/web-ui/build/static/typoscript-C5h9SqFN.js +0 -1
  946. package/web-ui/build/static/unrealscript-9ht7jiai.js +0 -1
  947. package/web-ui/build/static/uorazor-36B6okgA.js +0 -1
  948. package/web-ui/build/static/uri-DEwrtmz_.js +0 -1
  949. package/web-ui/build/static/v-CvhXAFWo.js +0 -1
  950. package/web-ui/build/static/vala-CU_jVQ3c.js +0 -1
  951. package/web-ui/build/static/vala-H_yoFBZf.js +0 -1
  952. package/web-ui/build/static/vbnet-BNI0Gy5q.js +0 -1
  953. package/web-ui/build/static/vbnet-D-4O1Hpc.js +0 -1
  954. package/web-ui/build/static/vbscript-1zyalaSG.js +0 -1
  955. package/web-ui/build/static/vbscript-html-ea5_TYi7.js +0 -1
  956. package/web-ui/build/static/velocity-BlEdS1Un.js +0 -1
  957. package/web-ui/build/static/verilog-BGSIJuDJ.js +0 -1
  958. package/web-ui/build/static/verilog-C1vff5Z3.js +0 -1
  959. package/web-ui/build/static/vhdl-5H4C8O-_.js +0 -1
  960. package/web-ui/build/static/vhdl-DHiBEhsE.js +0 -1
  961. package/web-ui/build/static/vim-Bd1MNlxj.js +0 -1
  962. package/web-ui/build/static/vim-DBP2ZsgQ.js +0 -1
  963. package/web-ui/build/static/visual-basic-DI34-9vJ.js +0 -1
  964. package/web-ui/build/static/warpscript-DBQ-KbS6.js +0 -1
  965. package/web-ui/build/static/wasm-CY5W57_Y.js +0 -1
  966. package/web-ui/build/static/web-idl-CF9xaLpZ.js +0 -1
  967. package/web-ui/build/static/wiki-xfSWwdeC.js +0 -1
  968. package/web-ui/build/static/wolfram-DZ6ghwRH.js +0 -1
  969. package/web-ui/build/static/wren-qULNE4ZV.js +0 -1
  970. package/web-ui/build/static/x86asm-DD2-d5-3.js +0 -1
  971. package/web-ui/build/static/xeora-CMja58lL.js +0 -1
  972. package/web-ui/build/static/xl-DKZpXGv8.js +0 -1
  973. package/web-ui/build/static/xml-Xf5ErmV_.js +0 -1
  974. package/web-ui/build/static/xml-doc-Bl_99SZE.js +0 -1
  975. package/web-ui/build/static/xojo-PwcPgmIF.js +0 -1
  976. package/web-ui/build/static/xquery-BshbqrZe.js +0 -1
  977. package/web-ui/build/static/xquery-DY2-GgvB.js +0 -1
  978. package/web-ui/build/static/yaml-9mp-mYjQ.js +0 -1
  979. package/web-ui/build/static/yaml-BnH4Y8-L.js +0 -1
  980. package/web-ui/build/static/yang-CRK7RS7V.js +0 -1
  981. package/web-ui/build/static/zephir-B560hCdS.js +0 -1
  982. package/web-ui/build/static/zig-CBG6H3iO.js +0 -1
@@ -1,900 +1,981 @@
1
- /**
2
- * BaseTool - Abstract base class for all tools in the Loxia AI Agents System
3
- *
4
- * Purpose:
5
- * - Define standardized tool interface
6
- * - Provide common tool functionality
7
- * - Handle parameter validation
8
- * - Manage tool execution lifecycle
9
- * - Support both sync and async operations
10
- */
11
-
12
- import {
13
- TOOL_STATUS,
14
- OPERATION_STATUS,
15
- ERROR_TYPES,
16
- SYSTEM_DEFAULTS
17
- } from '../utilities/constants.js';
18
-
19
- class BaseTool {
20
- constructor(config = {}, logger = null) {
21
- this.id = this.constructor.name.toLowerCase().replace('tool', '');
22
- this.config = config;
23
- this.logger = logger;
24
-
25
- // Tool capabilities
26
- this.requiresProject = false;
27
- this.isAsync = false;
28
- this.timeout = config.timeout || SYSTEM_DEFAULTS.MAX_TOOL_EXECUTION_TIME;
29
- this.maxConcurrentOperations = config.maxConcurrentOperations || 1;
30
-
31
- // Built-in delay (ms) after tool execution before agent continues
32
- // Most tools: 0 (no delay), WebTool: 1000ms (allow browser operations to complete)
33
- this.builtinDelay = 0;
34
-
35
- // Operation tracking
36
- this.activeOperations = new Map();
37
- this.operationHistory = [];
38
-
39
- // Tool state
40
- this.isEnabled = config.enabled !== false;
41
- this.lastUsed = null;
42
- this.usageCount = 0;
43
- }
44
-
45
- /**
46
- * Get tool description for LLM consumption
47
- * Must be implemented by subclasses
48
- * @returns {string} Tool description
49
- */
50
- getDescription() {
51
- throw new Error(`Tool ${this.id} must implement getDescription()`);
52
- }
53
-
54
- /**
55
- * Get a one-line summary of the tool for compact/layered prompts.
56
- * Auto-extracts the first non-empty line from getDescription().
57
- * @returns {string} Brief tool summary
58
- */
59
- getSummary() {
60
- try {
61
- const desc = this.getDescription();
62
- const firstLine = desc.split('\n').find(l => l.trim().length > 0);
63
- return firstLine ? firstLine.trim() : `${this.id} tool`;
64
- } catch {
65
- return `${this.id} tool`;
66
- }
67
- }
68
-
69
- /**
70
- * Parse parameters from tool command content
71
- * Must be implemented by subclasses
72
- * @param {string} content - Raw tool command content
73
- * @returns {Object} Parsed parameters object
74
- */
75
- parseParameters(content) {
76
- throw new Error(`Tool ${this.id} must implement parseParameters()`);
77
- }
78
-
79
- /**
80
- * Execute tool with parsed parameters
81
- * Must be implemented by subclasses
82
- * @param {Object} params - Parsed parameters
83
- * @param {Object} context - Execution context
84
- * @returns {Promise<*>} Execution result
85
- */
86
- async execute(params, context) {
87
- throw new Error(`Tool ${this.id} must implement execute()`);
88
- }
89
-
90
- /**
91
- * Get tool capabilities metadata
92
- * @returns {Object} Capabilities object
93
- */
94
- getCapabilities() {
95
- return {
96
- id: this.id,
97
- async: this.isAsync,
98
- requiresProject: this.requiresProject,
99
- builtinDelay: this.builtinDelay,
100
- timeout: this.timeout,
101
- maxConcurrentOperations: this.maxConcurrentOperations,
102
- enabled: this.isEnabled,
103
- supportedActions: this.getSupportedActions(),
104
- parameterSchema: this.getParameterSchema()
105
- };
106
- }
107
-
108
- /**
109
- * Validate tool parameters
110
- * Can be overridden by subclasses for custom validation
111
- * @param {Object} params - Parameters to validate
112
- * @returns {Object} Validation result with valid flag and error message
113
- */
114
- validateParameters(params) {
115
- try {
116
- if (!params || typeof params !== 'object') {
117
- return {
118
- valid: false,
119
- error: 'Parameters must be an object'
120
- };
121
- }
122
-
123
- // Check required parameters
124
- const requiredParams = this.getRequiredParameters();
125
- for (const required of requiredParams) {
126
- if (!(required in params)) {
127
- return {
128
- valid: false,
129
- error: `Missing required parameter: ${required}`
130
- };
131
- }
132
- }
133
-
134
- // Validate parameter types
135
- const typeValidation = this.validateParameterTypes(params);
136
- if (!typeValidation.valid) {
137
- return typeValidation;
138
- }
139
-
140
- // Custom validation
141
- const customValidation = this.customValidateParameters(params);
142
- if (!customValidation.valid) {
143
- return customValidation;
144
- }
145
-
146
- return { valid: true };
147
-
148
- } catch (error) {
149
- return {
150
- valid: false,
151
- error: `Parameter validation failed: ${error.message}`
152
- };
153
- }
154
- }
155
-
156
- /**
157
- * Execute tool with full lifecycle management
158
- * @param {Object} params - Tool parameters
159
- * @param {Object} context - Execution context
160
- * @returns {Promise<Object>} Execution result with metadata
161
- */
162
- async executeWithLifecycle(params, context) {
163
- const operationId = this.generateOperationId();
164
- const startTime = Date.now();
165
-
166
- // Check if tool is enabled
167
- if (!this.isEnabled) {
168
- throw new Error(`Tool ${this.id} is disabled`);
169
- }
170
-
171
- // Check concurrent operation limits
172
- if (this.activeOperations.size >= this.maxConcurrentOperations) {
173
- throw new Error(`Tool ${this.id} has reached maximum concurrent operations limit`);
174
- }
175
-
176
- // Validate parameters
177
- const validation = this.validateParameters(params);
178
- if (!validation.valid) {
179
- throw new Error(`Parameter validation failed: ${validation.error}`);
180
- }
181
-
182
- // Create operation record
183
- const operation = {
184
- id: operationId,
185
- toolId: this.id,
186
- status: TOOL_STATUS.EXECUTING,
187
- startTime: new Date().toISOString(),
188
- params,
189
- context: this.sanitizeContext(context)
190
- };
191
-
192
- this.activeOperations.set(operationId, operation);
193
-
194
- try {
195
- this.logger?.info(`Tool execution started: ${this.id}`, {
196
- operationId,
197
- toolId: this.id,
198
- context: operation.context
199
- });
200
-
201
- // Execute with timeout
202
- const result = await this.executeWithTimeout(params, context);
203
-
204
- // Update operation status
205
- operation.status = TOOL_STATUS.COMPLETED;
206
- operation.result = result;
207
- operation.endTime = new Date().toISOString();
208
- operation.executionTime = Date.now() - startTime;
209
-
210
- // Update tool statistics
211
- this.lastUsed = new Date().toISOString();
212
- this.usageCount++;
213
-
214
- this.logger?.info(`Tool execution completed: ${this.id}`, {
215
- operationId,
216
- executionTime: operation.executionTime,
217
- success: true
218
- });
219
-
220
- return {
221
- success: true,
222
- operationId,
223
- result,
224
- executionTime: operation.executionTime,
225
- toolId: this.id
226
- };
227
-
228
- } catch (error) {
229
- // Update operation status
230
- operation.status = TOOL_STATUS.FAILED;
231
- operation.error = error.message;
232
- operation.endTime = new Date().toISOString();
233
- operation.executionTime = Date.now() - startTime;
234
-
235
- this.logger?.error(`Tool execution failed: ${this.id}`, {
236
- operationId,
237
- error: error.message,
238
- executionTime: operation.executionTime
239
- });
240
-
241
- throw error;
242
-
243
- } finally {
244
- // Move to history and cleanup
245
- this.operationHistory.push({ ...operation });
246
- this.activeOperations.delete(operationId);
247
-
248
- // Cleanup old history entries
249
- this.cleanupHistory();
250
-
251
- // Perform tool-specific cleanup
252
- await this.cleanup(operationId);
253
- }
254
- }
255
-
256
- /**
257
- * Get status of async operation
258
- * @param {string} operationId - Operation identifier
259
- * @returns {Promise<Object>} Operation status
260
- */
261
- async getStatus(operationId) {
262
- const operation = this.activeOperations.get(operationId);
263
-
264
- if (!operation) {
265
- // Check history
266
- const historyEntry = this.operationHistory.find(op => op.id === operationId);
267
- if (historyEntry) {
268
- return {
269
- operationId,
270
- status: historyEntry.status,
271
- result: historyEntry.result,
272
- error: historyEntry.error,
273
- executionTime: historyEntry.executionTime
274
- };
275
- }
276
-
277
- return {
278
- operationId,
279
- status: OPERATION_STATUS.NOT_FOUND,
280
- error: 'Operation not found'
281
- };
282
- }
283
-
284
- return {
285
- operationId,
286
- status: operation.status,
287
- startTime: operation.startTime,
288
- executionTime: operation.endTime ?
289
- new Date(operation.endTime).getTime() - new Date(operation.startTime).getTime() :
290
- Date.now() - new Date(operation.startTime).getTime()
291
- };
292
- }
293
-
294
- /**
295
- * Resource cleanup after tool execution
296
- * Can be overridden by subclasses
297
- * @param {string} operationId - Operation identifier
298
- * @returns {Promise<void>}
299
- */
300
- async cleanup(operationId) {
301
- // Default implementation - no cleanup needed
302
- }
303
-
304
- /**
305
- * Get supported actions for this tool
306
- * Can be overridden by subclasses
307
- * @returns {Array<string>} Array of supported action names
308
- */
309
- getSupportedActions() {
310
- return ['execute'];
311
- }
312
-
313
- /**
314
- * Get parameter schema for validation
315
- * Can be overridden by subclasses
316
- * @returns {Object} Parameter schema
317
- */
318
- getParameterSchema() {
319
- return {
320
- type: 'object',
321
- properties: {},
322
- required: []
323
- };
324
- }
325
-
326
- /**
327
- * Get required parameters
328
- * Can be overridden by subclasses
329
- * @returns {Array<string>} Array of required parameter names
330
- */
331
- getRequiredParameters() {
332
- return [];
333
- }
334
-
335
- /**
336
- * Validate parameter types
337
- * Can be overridden by subclasses
338
- * @param {Object} params - Parameters to validate
339
- * @returns {Object} Validation result
340
- */
341
- validateParameterTypes(params) {
342
- // Default implementation - all parameters are valid
343
- return { valid: true };
344
- }
345
-
346
- /**
347
- * Custom parameter validation
348
- * Can be overridden by subclasses
349
- * @param {Object} params - Parameters to validate
350
- * @returns {Object} Validation result
351
- */
352
- customValidateParameters(params) {
353
- // Default implementation - no custom validation
354
- return { valid: true };
355
- }
356
-
357
- /**
358
- * Execute tool with timeout protection
359
- * @private
360
- */
361
- async executeWithTimeout(params, context) {
362
- return new Promise(async (resolve, reject) => {
363
- const timeoutId = setTimeout(() => {
364
- reject(new Error(`Tool execution timed out after ${this.timeout}ms`));
365
- }, this.timeout);
366
-
367
- try {
368
- const result = await this.execute(params, context);
369
- clearTimeout(timeoutId);
370
- resolve(result);
371
- } catch (error) {
372
- clearTimeout(timeoutId);
373
- reject(error);
374
- }
375
- });
376
- }
377
-
378
- /**
379
- * Generate unique operation ID
380
- * @private
381
- */
382
- generateOperationId() {
383
- return `${this.id}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
384
- }
385
-
386
- /**
387
- * Sanitize context for logging
388
- * @private
389
- */
390
- sanitizeContext(context) {
391
- const sanitized = { ...context };
392
-
393
- // Remove sensitive information
394
- delete sanitized.apiKeys;
395
- delete sanitized.secrets;
396
- delete sanitized.passwords;
397
-
398
- // Truncate large content
399
- if (sanitized.content && sanitized.content.length > 500) {
400
- sanitized.content = sanitized.content.substring(0, 500) + '... [truncated]';
401
- }
402
-
403
- return sanitized;
404
- }
405
-
406
- /**
407
- * Cleanup old history entries
408
- * @private
409
- */
410
- cleanupHistory() {
411
- const maxHistoryEntries = 100;
412
- if (this.operationHistory.length > maxHistoryEntries) {
413
- this.operationHistory = this.operationHistory.slice(-maxHistoryEntries);
414
- }
415
- }
416
-
417
- /**
418
- * Get tool usage statistics
419
- * @returns {Object} Usage statistics
420
- */
421
- getUsageStats() {
422
- return {
423
- toolId: this.id,
424
- usageCount: this.usageCount,
425
- lastUsed: this.lastUsed,
426
- activeOperations: this.activeOperations.size,
427
- totalOperations: this.operationHistory.length,
428
- averageExecutionTime: this.calculateAverageExecutionTime(),
429
- successRate: this.calculateSuccessRate(),
430
- isEnabled: this.isEnabled
431
- };
432
- }
433
-
434
- /**
435
- * Calculate average execution time
436
- * @private
437
- */
438
- calculateAverageExecutionTime() {
439
- const completedOps = this.operationHistory.filter(op =>
440
- op.status === TOOL_STATUS.COMPLETED && op.executionTime
441
- );
442
-
443
- if (completedOps.length === 0) return 0;
444
-
445
- const totalTime = completedOps.reduce((sum, op) => sum + op.executionTime, 0);
446
- return Math.round(totalTime / completedOps.length);
447
- }
448
-
449
- /**
450
- * Calculate success rate
451
- * @private
452
- */
453
- calculateSuccessRate() {
454
- if (this.operationHistory.length === 0) return 0;
455
-
456
- const successfulOps = this.operationHistory.filter(op =>
457
- op.status === TOOL_STATUS.COMPLETED
458
- );
459
-
460
- return (successfulOps.length / this.operationHistory.length) * 100;
461
- }
462
-
463
- /**
464
- * Enable tool
465
- */
466
- enable() {
467
- this.isEnabled = true;
468
- this.logger?.info(`Tool enabled: ${this.id}`);
469
- }
470
-
471
- /**
472
- * Disable tool
473
- */
474
- disable() {
475
- this.isEnabled = false;
476
- this.logger?.info(`Tool disabled: ${this.id}`);
477
- }
478
-
479
- /**
480
- * Reset tool statistics
481
- */
482
- resetStats() {
483
- this.usageCount = 0;
484
- this.lastUsed = null;
485
- this.operationHistory = [];
486
- this.logger?.info(`Tool statistics reset: ${this.id}`);
487
- }
488
- }
489
-
490
- /**
491
- * ToolsRegistry - Manages registration and discovery of tools
492
- */
493
- class ToolsRegistry {
494
- constructor(logger = null) {
495
- this.logger = logger;
496
- this.tools = new Map();
497
- this.toolDescriptions = new Map();
498
- this.toolSummaries = new Map();
499
- this.toolCapabilities = new Map();
500
- this.asyncOperations = new Map();
501
- }
502
-
503
- /**
504
- * Register a tool class
505
- * @param {Class} toolClass - Tool class to register
506
- * @returns {Promise<void>}
507
- */
508
- async registerTool(toolClass) {
509
- try {
510
- const tool = new toolClass();
511
-
512
- // Propagate the registry's logger to the tool so the tool's own
513
- // diagnostic output (`this.logger?.info(...)`, `this.logger?.warn(...)`,
514
- // etc.) actually reaches the operator's console. Tools extending
515
- // BaseTool default `this.logger = null` unless the class explicitly
516
- // passes one to `super()` — and registration never supplied one,
517
- // which silently swallowed every `this.logger?.…` call in every tool.
518
- // This made debugging things like "why doesn't the visual-editor
519
- // tool ever log [VisualEditorTool] lines?" impossible because the
520
- // logs literally weren't being emitted.
521
- if (this.logger && !tool.logger) {
522
- tool.logger = this.logger;
523
- }
524
-
525
- if (!(tool instanceof BaseTool)) {
526
- throw new Error(`Tool ${toolClass.name} must extend BaseTool`);
527
- }
528
-
529
- const capabilities = tool.getCapabilities();
530
-
531
- // Validate tool implementation
532
- await this.validateTool(tool);
533
-
534
- this.tools.set(tool.id, tool);
535
- this.toolDescriptions.set(tool.id, tool.getDescription());
536
- this.toolSummaries.set(tool.id, tool.getSummary());
537
- this.toolCapabilities.set(tool.id, capabilities);
538
-
539
- this.logger?.info(`Tool registered: ${tool.id}`, {
540
- capabilities: capabilities.supportedActions,
541
- async: capabilities.async,
542
- requiresProject: capabilities.requiresProject
543
- });
544
-
545
- } catch (error) {
546
- this.logger?.error(`Tool registration failed: ${error.message}`, {
547
- toolClass: toolClass.name
548
- });
549
- throw error;
550
- }
551
- }
552
-
553
- /**
554
- * Auto-discover tools in directory
555
- * @param {string} directory - Directory path to scan
556
- * @returns {Promise<number>} Number of tools discovered
557
- */
558
- async discoverTools(directory) {
559
- // Implementation would scan directory for tool files
560
- // For now, return 0
561
- return 0;
562
- }
563
-
564
- /**
565
- * Validate tool implementation
566
- * @param {BaseTool} tool - Tool instance to validate
567
- * @returns {Promise<void>}
568
- */
569
- async validateTool(tool) {
570
- // Check required methods
571
- const requiredMethods = ['getDescription', 'parseParameters', 'execute'];
572
-
573
- for (const method of requiredMethods) {
574
- if (typeof tool[method] !== 'function') {
575
- throw new Error(`Tool ${tool.id} missing required method: ${method}`);
576
- }
577
- }
578
-
579
- // Test parameter parsing
580
- try {
581
- const testParams = tool.parseParameters('test content');
582
- if (typeof testParams !== 'object') {
583
- throw new Error(`Tool ${tool.id} parseParameters must return an object`);
584
- }
585
- } catch (error) {
586
- // Parsing may fail for test content, that's okay
587
- }
588
-
589
- // Validate capabilities
590
- const capabilities = tool.getCapabilities();
591
- if (!capabilities || typeof capabilities !== 'object') {
592
- throw new Error(`Tool ${tool.id} getCapabilities must return an object`);
593
- }
594
- }
595
-
596
- /**
597
- * Get tool by ID
598
- * @param {string} toolId - Tool identifier
599
- * @returns {BaseTool|null} Tool instance or null
600
- */
601
- getTool(toolId) {
602
- return this.tools.get(toolId) || null;
603
- }
604
-
605
- /**
606
- * Get all tool capabilities for LLM consumption
607
- * @returns {Object} All tool capabilities
608
- */
609
- getToolCapabilities() {
610
- const capabilities = {};
611
-
612
- for (const [toolId, tool] of this.tools.entries()) {
613
- if (tool.isEnabled) {
614
- capabilities[toolId] = {
615
- description: this.toolDescriptions.get(toolId),
616
- capabilities: this.toolCapabilities.get(toolId),
617
- usageStats: tool.getUsageStats()
618
- };
619
- }
620
- }
621
-
622
- return capabilities;
623
- }
624
-
625
- /**
626
- * Execute tool securely with validation
627
- * @param {string} toolId - Tool identifier
628
- * @param {Object} params - Tool parameters
629
- * @param {Object} context - Execution context
630
- * @returns {Promise<*>} Execution result
631
- */
632
- async executeToolSecurely(toolId, params, context) {
633
- const tool = this.getTool(toolId);
634
- if (!tool) {
635
- throw new Error(`Tool not found: ${toolId}`);
636
- }
637
-
638
- if (!tool.isEnabled) {
639
- throw new Error(`Tool is disabled: ${toolId}`);
640
- }
641
-
642
- return await tool.executeWithLifecycle(params, context);
643
- }
644
-
645
- /**
646
- * List all registered tools
647
- * @returns {Array<string>} Array of tool IDs
648
- */
649
- listTools() {
650
- return Array.from(this.tools.keys());
651
- }
652
-
653
- /**
654
- * Generate comprehensive tool descriptions for agent system prompts
655
- * @param {Array<string>} capabilities - Specific tool IDs to include (empty = all)
656
- * @param {Object} options - Generation options
657
- * @returns {string} Formatted tool descriptions section
658
- */
659
- generateToolDescriptionsForPrompt(capabilities = [], options = {}) {
660
- const {
661
- includeExamples = true,
662
- includeUsageGuidelines = true,
663
- includeSecurityNotes = true,
664
- compact = false,
665
- layered = false
666
- } = options;
667
-
668
- // Get tools to include — always inject 'help' so agents can query tool docs
669
- let toolIds = capabilities.length > 0
670
- ? capabilities.filter(cap => this.tools.has(cap))
671
- : Array.from(this.tools.keys());
672
-
673
- if (!toolIds.includes('help') && this.tools.has('help')) {
674
- toolIds.push('help');
675
- }
676
-
677
- if (toolIds.length === 0) {
678
- return '';
679
- }
680
-
681
- let description = '';
682
-
683
- // === LAYERED MODE: Compact index + help tool guidance ===
684
- if (layered) {
685
- description += '\n## AVAILABLE TOOLS\n\n';
686
- description += 'You have access to the following tools. Use the **help** tool to get full documentation before first use of any tool.\n\n';
687
-
688
- for (const toolId of toolIds) {
689
- const tool = this.tools.get(toolId);
690
- if (!tool || !tool.isEnabled) continue;
691
- const summary = this.toolSummaries.get(toolId) || `${toolId} tool`;
692
- description += `- **${toolId}**: ${summary}\n`;
693
- }
694
-
695
- // Always include help tool in the list even if not in capabilities
696
- if (!toolIds.includes('help') && this.tools.has('help')) {
697
- const helpSummary = this.toolSummaries.get('help') || 'Get full documentation for any tool';
698
- description += `- **help**: ${helpSummary}\n`;
699
- }
700
-
701
- description += '\n## HOW TO GET TOOL DOCUMENTATION\n\n';
702
- description += 'Before using a tool for the first time, retrieve its full documentation:\n\n';
703
- description += '```json\n';
704
- description += '{\n';
705
- description += ' "toolId": "help",\n';
706
- description += ' "parameters": { "tool": "toolname" }\n';
707
- description += '}\n';
708
- description += '```\n\n';
709
- description += 'To list all available tools with summaries:\n';
710
- description += '```json\n';
711
- description += '{\n';
712
- description += ' "toolId": "help",\n';
713
- description += ' "parameters": { "list": true }\n';
714
- description += '}\n';
715
- description += '```\n\n';
716
-
717
- } else {
718
- // === STANDARD MODE: Full descriptions ===
719
- description += '\n## AVAILABLE TOOLS\n\n';
720
- description += 'You have access to the following tools to perform operations and tasks:\n\n';
721
-
722
- for (const toolId of toolIds) {
723
- const tool = this.tools.get(toolId);
724
- if (!tool || !tool.isEnabled) continue;
725
-
726
- try {
727
- if (compact) {
728
- // Compact format - just tool name and brief description
729
- const caps = tool.getCapabilities();
730
- const actions = caps.supportedActions || ['execute'];
731
- description += `**${toolId}**: ${actions.join(', ')}\n`;
732
- } else {
733
- // Full format - complete tool description
734
- description += `### ${toolId.toUpperCase()} TOOL\n\n`;
735
- description += tool.getDescription();
736
- description += '\n\n---\n\n';
737
- }
738
- } catch (error) {
739
- this.logger?.warn(`Failed to get description for tool: ${toolId}`, {
740
- error: error.message
741
- });
742
- }
743
- }
744
-
745
- if (compact) {
746
- description += '\nUse JSON format in markdown code blocks to invoke tools.\n\n';
747
- }
748
- }
749
-
750
- // Add comprehensive tool invocation instructions - JSON as the standard format
751
- description += '## TOOL INVOCATION SYNTAX\n\n';
752
- description += '**IMPORTANT**: Use JSON format in markdown code blocks to invoke tools:\n\n';
753
- description += '### Standard Format: JSON in Markdown Code Block\n';
754
- description += '```\n';
755
- description += '```json\n';
756
- description += '{\n';
757
- description += ' "toolId": "toolname",\n';
758
- description += ' "parameters": { ... }\n';
759
- description += '}\n';
760
- description += '```\n';
761
- description += '```\n\n';
762
- description += '**Rules:**\n';
763
- description += '- Always wrap JSON tool commands in ```json ... ``` blocks\n';
764
- description += '- Use "toolId" to specify the tool name\n';
765
- description += '- Use "parameters" object for tool-specific parameters\n';
766
- description += '- Use "actions" array for tools that support multiple operations\n';
767
- description += '- **TOOL RESULTS ARE AVAILABLE ONLY AFTER YOUR MESSAGE ENDS**: Tools execute after your entire message is sent. You will NOT see any tool results until your next turn. This means: if the next tool call depends on results from a previous one, they MUST be in separate messages. You may batch independent tool calls in a single message, but never assume or guess the output of a tool — always wait for the actual result in the next turn before proceeding.\n\n';
768
- description += 'After invoking a tool, WAIT for the actual response. Do NOT generate imaginary responses.\n\n';
769
-
770
- // Add exploration strategy if code-map is available
771
- if (toolIds.includes('code-map')) {
772
- description += '## CODE EXPLORATION STRATEGY\n\n';
773
- description += 'When exploring or understanding code, prefer this efficient workflow over reading entire files:\n\n';
774
- description += '1. **Discover structure** Use `file-tree` to see the project layout\n';
775
- description += '2. **Understand code** — Use `code-map` skeleton to extract signatures, classes, and functions with line numbers\n';
776
- description += '3. **Zoom in** — Use `code-map` read-range to read only the specific lines you need\n';
777
- description += '4. **Search** — Use `seek` to find specific terms, then `code-map` read-range to view context around matches\n\n';
778
- description += 'This avoids wasting context on entire file reads. Reserve `filesystem` read for small files or when you need the complete content.\n';
779
- }
780
-
781
- return description;
782
- }
783
-
784
- /**
785
- * Enhance existing system prompt with tool descriptions
786
- * @param {string} existingPrompt - Current system prompt
787
- * @param {Array<string>} capabilities - Agent capabilities
788
- * @param {Object} options - Enhancement options
789
- * @returns {string} Enhanced system prompt
790
- */
791
- enhanceSystemPrompt(existingPrompt, capabilities = [], options = {}) {
792
- const toolSection = this.generateToolDescriptionsForPrompt(capabilities, options);
793
-
794
- if (!toolSection.trim()) {
795
- return existingPrompt || '';
796
- }
797
-
798
- const prompt = existingPrompt || '';
799
-
800
- // If prompt already contains tool section, replace it
801
- if (prompt.includes('## AVAILABLE TOOLS')) {
802
- return prompt.replace(
803
- /## AVAILABLE TOOLS[\s\S]*?(?=##|$)/,
804
- toolSection + '\n'
805
- );
806
- }
807
-
808
- const orientationParagraph = `IMPORTANT: Tools execute only after your full message is sent — you cannot see results mid-message. If a tool call depends on the result of another, put them in separate messages. You may batch independent tool calls in one message. Never guess or fabricate tool output — always wait for actual results before continuing.`;
809
-
810
- // Otherwise, append to the end
811
- return prompt + (prompt.endsWith('\n') ? '' : '\n') + toolSection + orientationParagraph + '\n';
812
- }
813
-
814
- /**
815
- * Get available tools with metadata for web UI
816
- * @returns {Array} Array of tool information objects
817
- */
818
- getAvailableToolsForUI() {
819
- const tools = [];
820
-
821
- for (const [toolId, tool] of this.tools.entries()) {
822
- const capabilities = tool.getCapabilities();
823
-
824
- // Extract tool name and description from the tool's description
825
- const fullDescription = tool.getDescription();
826
- const firstLine = fullDescription.split('\n').find(line => line.trim().length > 0) || '';
827
- const toolName = firstLine.replace(/^.*Tool:\s*/i, '').replace(/\s*-.*$/, '').trim();
828
-
829
- tools.push({
830
- id: toolId, // This is the correct ID to use in capabilities
831
- name: toolName || toolId.charAt(0).toUpperCase() + toolId.slice(1),
832
- description: firstLine,
833
- category: this._getToolCategory(toolId),
834
- enabled: capabilities.enabled,
835
- async: capabilities.async,
836
- requiresProject: capabilities.requiresProject,
837
- className: tool.constructor.name
838
- });
839
- }
840
-
841
- return tools.sort((a, b) => a.name.localeCompare(b.name));
842
- }
843
-
844
- /**
845
- * Get tool category for organization
846
- * @param {string} toolId - Tool identifier
847
- * @returns {string} Tool category
848
- * @private
849
- */
850
- _getToolCategory(toolId) {
851
- const categories = {
852
- 'terminal': 'System',
853
- 'filesystem': 'File Operations',
854
- 'file-content-replace': 'File Operations',
855
- 'seek': 'File Operations',
856
- 'file-tree': 'File Operations',
857
- 'pdf': 'File Operations',
858
- 'web': 'Automation',
859
- 'visual-editor': 'Automation',
860
- 'staticanalysis': 'Analysis',
861
- 'clonedetection': 'Analysis',
862
- 'import-analyzer': 'Analysis',
863
- 'dependency-resolver': 'Analysis',
864
- 'image-gen': 'AI Tools',
865
- // TODO: Re-enable once Sora replacement is available
866
- // 'video-gen': 'AI Tools',
867
- 'taskmanager': 'Utility',
868
- 'jobdone': 'Utility',
869
- 'agentdelay': 'Utility',
870
- 'agentcommunication': 'Collaboration',
871
- 'help': 'System',
872
- 'doc': 'File Operations',
873
- 'spreadsheet': 'File Operations',
874
- 'whatsapp': 'Communication',
875
- 'skills': 'Knowledge',
876
- 'vision': 'AI Tools'
877
- };
878
-
879
- return categories[toolId] || 'Other';
880
- }
881
-
882
- /**
883
- * Get registry statistics
884
- * @returns {Object} Registry statistics
885
- */
886
- getRegistryStats() {
887
- const enabledTools = Array.from(this.tools.values()).filter(tool => tool.isEnabled);
888
- const totalOperations = Array.from(this.tools.values())
889
- .reduce((sum, tool) => sum + tool.usageCount, 0);
890
-
891
- return {
892
- totalTools: this.tools.size,
893
- enabledTools: enabledTools.length,
894
- totalOperations,
895
- activeOperations: this.asyncOperations.size
896
- };
897
- }
898
- }
899
-
1
+ /**
2
+ * BaseTool - Abstract base class for all tools in the Loxia AI Agents System
3
+ *
4
+ * Purpose:
5
+ * - Define standardized tool interface
6
+ * - Provide common tool functionality
7
+ * - Handle parameter validation
8
+ * - Manage tool execution lifecycle
9
+ * - Support both sync and async operations
10
+ */
11
+
12
+ import {
13
+ TOOL_STATUS,
14
+ OPERATION_STATUS,
15
+ ERROR_TYPES,
16
+ SYSTEM_DEFAULTS
17
+ } from '../utilities/constants.js';
18
+
19
+ class BaseTool {
20
+ constructor(config = {}, logger = null) {
21
+ this.id = this.constructor.name.toLowerCase().replace('tool', '');
22
+ this.config = config;
23
+ this.logger = logger;
24
+
25
+ // Tool capabilities
26
+ this.requiresProject = false;
27
+ this.isAsync = false;
28
+ this.timeout = config.timeout || SYSTEM_DEFAULTS.MAX_TOOL_EXECUTION_TIME;
29
+ this.maxConcurrentOperations = config.maxConcurrentOperations || 1;
30
+
31
+ // Built-in delay (ms) after tool execution before agent continues
32
+ // Most tools: 0 (no delay), WebTool: 1000ms (allow browser operations to complete)
33
+ this.builtinDelay = 0;
34
+
35
+ // Operation tracking
36
+ this.activeOperations = new Map();
37
+ this.operationHistory = [];
38
+
39
+ // Tool state
40
+ this.isEnabled = config.enabled !== false;
41
+ this.lastUsed = null;
42
+ this.usageCount = 0;
43
+ }
44
+
45
+ /**
46
+ * Resolve this tool's effective configuration for a given execution.
47
+ *
48
+ * Precedence (later wins):
49
+ * 1. this.config — global defaults (from registerTool)
50
+ * 2. context.toolConfig — per-agent override from
51
+ * agent.toolConfig[this.id]
52
+ * 3. fallbacks — caller-supplied defaults
53
+ *
54
+ * Returns a plain object that tools can read fields off directly, e.g.
55
+ *
56
+ * const { allowedCommands, blockedCommands } =
57
+ * this.getEffectiveConfig(context, { allowedCommands: [], blockedCommands: [] });
58
+ *
59
+ * Tools that don't care about per-agent config can keep reading
60
+ * `this.config` as before — this helper is opt-in.
61
+ *
62
+ * @param {object} context - Tool execution context (from messageProcessor).
63
+ * @param {object} [fallbacks] - Last-resort defaults (optional).
64
+ * @returns {object}
65
+ */
66
+ getEffectiveConfig(context, fallbacks = {}) {
67
+ const perAgent = (context && context.toolConfig && typeof context.toolConfig === 'object' && !Array.isArray(context.toolConfig))
68
+ ? context.toolConfig
69
+ : {};
70
+ return { ...fallbacks, ...(this.config || {}), ...perAgent };
71
+ }
72
+
73
+ /**
74
+ * Get tool description for LLM consumption
75
+ * Must be implemented by subclasses
76
+ * @returns {string} Tool description
77
+ */
78
+ getDescription() {
79
+ throw new Error(`Tool ${this.id} must implement getDescription()`);
80
+ }
81
+
82
+ /**
83
+ * Get a one-line summary of the tool for compact/layered prompts.
84
+ * Auto-extracts the first non-empty line from getDescription().
85
+ * @returns {string} Brief tool summary
86
+ */
87
+ getSummary() {
88
+ try {
89
+ const desc = this.getDescription();
90
+ const firstLine = desc.split('\n').find(l => l.trim().length > 0);
91
+ return firstLine ? firstLine.trim() : `${this.id} tool`;
92
+ } catch {
93
+ return `${this.id} tool`;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Parse parameters from tool command content
99
+ * Must be implemented by subclasses
100
+ * @param {string} content - Raw tool command content
101
+ * @returns {Object} Parsed parameters object
102
+ */
103
+ parseParameters(content) {
104
+ throw new Error(`Tool ${this.id} must implement parseParameters()`);
105
+ }
106
+
107
+ /**
108
+ * Execute tool with parsed parameters
109
+ * Must be implemented by subclasses
110
+ * @param {Object} params - Parsed parameters
111
+ * @param {Object} context - Execution context
112
+ * @returns {Promise<*>} Execution result
113
+ */
114
+ async execute(params, context) {
115
+ throw new Error(`Tool ${this.id} must implement execute()`);
116
+ }
117
+
118
+ /**
119
+ * Get tool capabilities metadata
120
+ * @returns {Object} Capabilities object
121
+ */
122
+ getCapabilities() {
123
+ return {
124
+ id: this.id,
125
+ async: this.isAsync,
126
+ requiresProject: this.requiresProject,
127
+ builtinDelay: this.builtinDelay,
128
+ timeout: this.timeout,
129
+ maxConcurrentOperations: this.maxConcurrentOperations,
130
+ enabled: this.isEnabled,
131
+ supportedActions: this.getSupportedActions(),
132
+ parameterSchema: this.getParameterSchema()
133
+ };
134
+ }
135
+
136
+ /**
137
+ * Validate tool parameters
138
+ * Can be overridden by subclasses for custom validation
139
+ * @param {Object} params - Parameters to validate
140
+ * @returns {Object} Validation result with valid flag and error message
141
+ */
142
+ validateParameters(params) {
143
+ try {
144
+ if (!params || typeof params !== 'object') {
145
+ return {
146
+ valid: false,
147
+ error: 'Parameters must be an object'
148
+ };
149
+ }
150
+
151
+ // Check required parameters
152
+ const requiredParams = this.getRequiredParameters();
153
+ for (const required of requiredParams) {
154
+ if (!(required in params)) {
155
+ return {
156
+ valid: false,
157
+ error: `Missing required parameter: ${required}`
158
+ };
159
+ }
160
+ }
161
+
162
+ // Validate parameter types
163
+ const typeValidation = this.validateParameterTypes(params);
164
+ if (!typeValidation.valid) {
165
+ return typeValidation;
166
+ }
167
+
168
+ // Custom validation
169
+ const customValidation = this.customValidateParameters(params);
170
+ if (!customValidation.valid) {
171
+ return customValidation;
172
+ }
173
+
174
+ return { valid: true };
175
+
176
+ } catch (error) {
177
+ return {
178
+ valid: false,
179
+ error: `Parameter validation failed: ${error.message}`
180
+ };
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Execute tool with full lifecycle management
186
+ * @param {Object} params - Tool parameters
187
+ * @param {Object} context - Execution context
188
+ * @returns {Promise<Object>} Execution result with metadata
189
+ */
190
+ async executeWithLifecycle(params, context) {
191
+ const operationId = this.generateOperationId();
192
+ const startTime = Date.now();
193
+
194
+ // Check if tool is enabled
195
+ if (!this.isEnabled) {
196
+ throw new Error(`Tool ${this.id} is disabled`);
197
+ }
198
+
199
+ // Check concurrent operation limits
200
+ if (this.activeOperations.size >= this.maxConcurrentOperations) {
201
+ throw new Error(`Tool ${this.id} has reached maximum concurrent operations limit`);
202
+ }
203
+
204
+ // Validate parameters
205
+ const validation = this.validateParameters(params);
206
+ if (!validation.valid) {
207
+ throw new Error(`Parameter validation failed: ${validation.error}`);
208
+ }
209
+
210
+ // Create operation record
211
+ const operation = {
212
+ id: operationId,
213
+ toolId: this.id,
214
+ status: TOOL_STATUS.EXECUTING,
215
+ startTime: new Date().toISOString(),
216
+ params,
217
+ context: this.sanitizeContext(context)
218
+ };
219
+
220
+ this.activeOperations.set(operationId, operation);
221
+
222
+ try {
223
+ this.logger?.info(`Tool execution started: ${this.id}`, {
224
+ operationId,
225
+ toolId: this.id,
226
+ context: operation.context
227
+ });
228
+
229
+ // Execute with timeout
230
+ const result = await this.executeWithTimeout(params, context);
231
+
232
+ // Update operation status
233
+ operation.status = TOOL_STATUS.COMPLETED;
234
+ operation.result = result;
235
+ operation.endTime = new Date().toISOString();
236
+ operation.executionTime = Date.now() - startTime;
237
+
238
+ // Update tool statistics
239
+ this.lastUsed = new Date().toISOString();
240
+ this.usageCount++;
241
+
242
+ this.logger?.info(`Tool execution completed: ${this.id}`, {
243
+ operationId,
244
+ executionTime: operation.executionTime,
245
+ success: true
246
+ });
247
+
248
+ return {
249
+ success: true,
250
+ operationId,
251
+ result,
252
+ executionTime: operation.executionTime,
253
+ toolId: this.id
254
+ };
255
+
256
+ } catch (error) {
257
+ // Update operation status
258
+ operation.status = TOOL_STATUS.FAILED;
259
+ operation.error = error.message;
260
+ operation.endTime = new Date().toISOString();
261
+ operation.executionTime = Date.now() - startTime;
262
+
263
+ this.logger?.error(`Tool execution failed: ${this.id}`, {
264
+ operationId,
265
+ error: error.message,
266
+ executionTime: operation.executionTime
267
+ });
268
+
269
+ throw error;
270
+
271
+ } finally {
272
+ // Move to history and cleanup
273
+ this.operationHistory.push({ ...operation });
274
+ this.activeOperations.delete(operationId);
275
+
276
+ // Cleanup old history entries
277
+ this.cleanupHistory();
278
+
279
+ // Perform tool-specific cleanup
280
+ await this.cleanup(operationId);
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Get status of async operation
286
+ * @param {string} operationId - Operation identifier
287
+ * @returns {Promise<Object>} Operation status
288
+ */
289
+ async getStatus(operationId) {
290
+ const operation = this.activeOperations.get(operationId);
291
+
292
+ if (!operation) {
293
+ // Check history
294
+ const historyEntry = this.operationHistory.find(op => op.id === operationId);
295
+ if (historyEntry) {
296
+ return {
297
+ operationId,
298
+ status: historyEntry.status,
299
+ result: historyEntry.result,
300
+ error: historyEntry.error,
301
+ executionTime: historyEntry.executionTime
302
+ };
303
+ }
304
+
305
+ return {
306
+ operationId,
307
+ status: OPERATION_STATUS.NOT_FOUND,
308
+ error: 'Operation not found'
309
+ };
310
+ }
311
+
312
+ return {
313
+ operationId,
314
+ status: operation.status,
315
+ startTime: operation.startTime,
316
+ executionTime: operation.endTime ?
317
+ new Date(operation.endTime).getTime() - new Date(operation.startTime).getTime() :
318
+ Date.now() - new Date(operation.startTime).getTime()
319
+ };
320
+ }
321
+
322
+ /**
323
+ * Resource cleanup after tool execution
324
+ * Can be overridden by subclasses
325
+ * @param {string} operationId - Operation identifier
326
+ * @returns {Promise<void>}
327
+ */
328
+ async cleanup(operationId) {
329
+ // Default implementation - no cleanup needed
330
+ }
331
+
332
+ /**
333
+ * Get supported actions for this tool
334
+ * Can be overridden by subclasses
335
+ * @returns {Array<string>} Array of supported action names
336
+ */
337
+ getSupportedActions() {
338
+ return ['execute'];
339
+ }
340
+
341
+ /**
342
+ * Get parameter schema for validation
343
+ * Can be overridden by subclasses
344
+ * @returns {Object} Parameter schema
345
+ */
346
+ getParameterSchema() {
347
+ return {
348
+ type: 'object',
349
+ properties: {},
350
+ required: []
351
+ };
352
+ }
353
+
354
+ /**
355
+ * Get required parameters
356
+ * Can be overridden by subclasses
357
+ * @returns {Array<string>} Array of required parameter names
358
+ */
359
+ getRequiredParameters() {
360
+ return [];
361
+ }
362
+
363
+ /**
364
+ * Validate parameter types
365
+ * Can be overridden by subclasses
366
+ * @param {Object} params - Parameters to validate
367
+ * @returns {Object} Validation result
368
+ */
369
+ validateParameterTypes(params) {
370
+ // Default implementation - all parameters are valid
371
+ return { valid: true };
372
+ }
373
+
374
+ /**
375
+ * Custom parameter validation
376
+ * Can be overridden by subclasses
377
+ * @param {Object} params - Parameters to validate
378
+ * @returns {Object} Validation result
379
+ */
380
+ customValidateParameters(params) {
381
+ // Default implementation - no custom validation
382
+ return { valid: true };
383
+ }
384
+
385
+ /**
386
+ * Execute tool with timeout protection
387
+ * @private
388
+ */
389
+ async executeWithTimeout(params, context) {
390
+ return new Promise(async (resolve, reject) => {
391
+ const timeoutId = setTimeout(() => {
392
+ reject(new Error(`Tool execution timed out after ${this.timeout}ms`));
393
+ }, this.timeout);
394
+
395
+ try {
396
+ const result = await this.execute(params, context);
397
+ clearTimeout(timeoutId);
398
+ resolve(result);
399
+ } catch (error) {
400
+ clearTimeout(timeoutId);
401
+ reject(error);
402
+ }
403
+ });
404
+ }
405
+
406
+ /**
407
+ * Generate unique operation ID
408
+ * @private
409
+ */
410
+ generateOperationId() {
411
+ return `${this.id}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
412
+ }
413
+
414
+ /**
415
+ * Sanitize context for logging
416
+ * @private
417
+ */
418
+ sanitizeContext(context) {
419
+ const sanitized = { ...context };
420
+
421
+ // Remove sensitive information
422
+ delete sanitized.apiKeys;
423
+ delete sanitized.secrets;
424
+ delete sanitized.passwords;
425
+
426
+ // Truncate large content
427
+ if (sanitized.content && sanitized.content.length > 500) {
428
+ sanitized.content = sanitized.content.substring(0, 500) + '... [truncated]';
429
+ }
430
+
431
+ return sanitized;
432
+ }
433
+
434
+ /**
435
+ * Cleanup old history entries
436
+ * @private
437
+ */
438
+ cleanupHistory() {
439
+ const maxHistoryEntries = 100;
440
+ if (this.operationHistory.length > maxHistoryEntries) {
441
+ this.operationHistory = this.operationHistory.slice(-maxHistoryEntries);
442
+ }
443
+ }
444
+
445
+ /**
446
+ * Get tool usage statistics
447
+ * @returns {Object} Usage statistics
448
+ */
449
+ getUsageStats() {
450
+ return {
451
+ toolId: this.id,
452
+ usageCount: this.usageCount,
453
+ lastUsed: this.lastUsed,
454
+ activeOperations: this.activeOperations.size,
455
+ totalOperations: this.operationHistory.length,
456
+ averageExecutionTime: this.calculateAverageExecutionTime(),
457
+ successRate: this.calculateSuccessRate(),
458
+ isEnabled: this.isEnabled
459
+ };
460
+ }
461
+
462
+ /**
463
+ * Calculate average execution time
464
+ * @private
465
+ */
466
+ calculateAverageExecutionTime() {
467
+ const completedOps = this.operationHistory.filter(op =>
468
+ op.status === TOOL_STATUS.COMPLETED && op.executionTime
469
+ );
470
+
471
+ if (completedOps.length === 0) return 0;
472
+
473
+ const totalTime = completedOps.reduce((sum, op) => sum + op.executionTime, 0);
474
+ return Math.round(totalTime / completedOps.length);
475
+ }
476
+
477
+ /**
478
+ * Calculate success rate
479
+ * @private
480
+ */
481
+ calculateSuccessRate() {
482
+ if (this.operationHistory.length === 0) return 0;
483
+
484
+ const successfulOps = this.operationHistory.filter(op =>
485
+ op.status === TOOL_STATUS.COMPLETED
486
+ );
487
+
488
+ return (successfulOps.length / this.operationHistory.length) * 100;
489
+ }
490
+
491
+ /**
492
+ * Enable tool
493
+ */
494
+ enable() {
495
+ this.isEnabled = true;
496
+ this.logger?.info(`Tool enabled: ${this.id}`);
497
+ }
498
+
499
+ /**
500
+ * Disable tool
501
+ */
502
+ disable() {
503
+ this.isEnabled = false;
504
+ this.logger?.info(`Tool disabled: ${this.id}`);
505
+ }
506
+
507
+ /**
508
+ * Reset tool statistics
509
+ */
510
+ resetStats() {
511
+ this.usageCount = 0;
512
+ this.lastUsed = null;
513
+ this.operationHistory = [];
514
+ this.logger?.info(`Tool statistics reset: ${this.id}`);
515
+ }
516
+ }
517
+
518
+ /**
519
+ * ToolsRegistry - Manages registration and discovery of tools
520
+ */
521
+ class ToolsRegistry {
522
+ constructor(logger = null) {
523
+ this.logger = logger;
524
+ this.tools = new Map();
525
+ this.toolDescriptions = new Map();
526
+ this.toolSummaries = new Map();
527
+ this.toolCapabilities = new Map();
528
+ this.asyncOperations = new Map();
529
+ }
530
+
531
+ /**
532
+ * Register a tool class
533
+ * @param {Class} toolClass - Tool class to register
534
+ * @returns {Promise<void>}
535
+ */
536
+ async registerTool(toolClass) {
537
+ try {
538
+ const tool = new toolClass();
539
+
540
+ // Propagate the registry's logger to the tool so the tool's own
541
+ // diagnostic output (`this.logger?.info(...)`, `this.logger?.warn(...)`,
542
+ // etc.) actually reaches the operator's console. Tools extending
543
+ // BaseTool default `this.logger = null` unless the class explicitly
544
+ // passes one to `super()` — and registration never supplied one,
545
+ // which silently swallowed every `this.logger?.…` call in every tool.
546
+ // This made debugging things like "why doesn't the visual-editor
547
+ // tool ever log [VisualEditorTool] lines?" impossible because the
548
+ // logs literally weren't being emitted.
549
+ if (this.logger && !tool.logger) {
550
+ tool.logger = this.logger;
551
+ }
552
+
553
+ if (!(tool instanceof BaseTool)) {
554
+ throw new Error(`Tool ${toolClass.name} must extend BaseTool`);
555
+ }
556
+
557
+ const capabilities = tool.getCapabilities();
558
+
559
+ // Validate tool implementation
560
+ await this.validateTool(tool);
561
+
562
+ this.tools.set(tool.id, tool);
563
+ this.toolDescriptions.set(tool.id, tool.getDescription());
564
+ this.toolSummaries.set(tool.id, tool.getSummary());
565
+ this.toolCapabilities.set(tool.id, capabilities);
566
+
567
+ this.logger?.info(`Tool registered: ${tool.id}`, {
568
+ capabilities: capabilities.supportedActions,
569
+ async: capabilities.async,
570
+ requiresProject: capabilities.requiresProject
571
+ });
572
+
573
+ } catch (error) {
574
+ this.logger?.error(`Tool registration failed: ${error.message}`, {
575
+ toolClass: toolClass.name
576
+ });
577
+ throw error;
578
+ }
579
+ }
580
+
581
+ /**
582
+ * Auto-discover tools in directory
583
+ * @param {string} directory - Directory path to scan
584
+ * @returns {Promise<number>} Number of tools discovered
585
+ */
586
+ async discoverTools(directory) {
587
+ // Implementation would scan directory for tool files
588
+ // For now, return 0
589
+ return 0;
590
+ }
591
+
592
+ /**
593
+ * Validate tool implementation
594
+ * @param {BaseTool} tool - Tool instance to validate
595
+ * @returns {Promise<void>}
596
+ */
597
+ async validateTool(tool) {
598
+ // Check required methods
599
+ const requiredMethods = ['getDescription', 'parseParameters', 'execute'];
600
+
601
+ for (const method of requiredMethods) {
602
+ if (typeof tool[method] !== 'function') {
603
+ throw new Error(`Tool ${tool.id} missing required method: ${method}`);
604
+ }
605
+ }
606
+
607
+ // Test parameter parsing
608
+ try {
609
+ const testParams = tool.parseParameters('test content');
610
+ if (typeof testParams !== 'object') {
611
+ throw new Error(`Tool ${tool.id} parseParameters must return an object`);
612
+ }
613
+ } catch (error) {
614
+ // Parsing may fail for test content, that's okay
615
+ }
616
+
617
+ // Validate capabilities
618
+ const capabilities = tool.getCapabilities();
619
+ if (!capabilities || typeof capabilities !== 'object') {
620
+ throw new Error(`Tool ${tool.id} getCapabilities must return an object`);
621
+ }
622
+ }
623
+
624
+ /**
625
+ * Get tool by ID
626
+ * @param {string} toolId - Tool identifier
627
+ * @returns {BaseTool|null} Tool instance or null
628
+ */
629
+ getTool(toolId) {
630
+ return this.tools.get(toolId) || null;
631
+ }
632
+
633
+ /**
634
+ * Get all tool capabilities for LLM consumption
635
+ * @returns {Object} All tool capabilities
636
+ */
637
+ getToolCapabilities() {
638
+ const capabilities = {};
639
+
640
+ for (const [toolId, tool] of this.tools.entries()) {
641
+ if (tool.isEnabled) {
642
+ capabilities[toolId] = {
643
+ description: this.toolDescriptions.get(toolId),
644
+ capabilities: this.toolCapabilities.get(toolId),
645
+ usageStats: tool.getUsageStats()
646
+ };
647
+ }
648
+ }
649
+
650
+ return capabilities;
651
+ }
652
+
653
+ /**
654
+ * Execute tool securely with validation
655
+ * @param {string} toolId - Tool identifier
656
+ * @param {Object} params - Tool parameters
657
+ * @param {Object} context - Execution context
658
+ * @returns {Promise<*>} Execution result
659
+ */
660
+ async executeToolSecurely(toolId, params, context) {
661
+ const tool = this.getTool(toolId);
662
+ if (!tool) {
663
+ throw new Error(`Tool not found: ${toolId}`);
664
+ }
665
+
666
+ if (!tool.isEnabled) {
667
+ throw new Error(`Tool is disabled: ${toolId}`);
668
+ }
669
+
670
+ return await tool.executeWithLifecycle(params, context);
671
+ }
672
+
673
+ /**
674
+ * List all registered tools
675
+ * @returns {Array<string>} Array of tool IDs
676
+ */
677
+ listTools() {
678
+ return Array.from(this.tools.keys());
679
+ }
680
+
681
+ /**
682
+ * Generate comprehensive tool descriptions for agent system prompts
683
+ * @param {Array<string>} capabilities - Specific tool IDs to include (empty = all)
684
+ * @param {Object} options - Generation options
685
+ * @returns {string} Formatted tool descriptions section
686
+ */
687
+ generateToolDescriptionsForPrompt(capabilities = [], options = {}) {
688
+ const {
689
+ includeExamples = true,
690
+ includeUsageGuidelines = true,
691
+ includeSecurityNotes = true,
692
+ compact = false,
693
+ layered = false
694
+ } = options;
695
+
696
+ // Get tools to include — always inject 'help' so agents can query tool docs
697
+ let toolIds = capabilities.length > 0
698
+ ? capabilities.filter(cap => this.tools.has(cap))
699
+ : Array.from(this.tools.keys());
700
+
701
+ if (!toolIds.includes('help') && this.tools.has('help')) {
702
+ toolIds.push('help');
703
+ }
704
+
705
+ if (toolIds.length === 0) {
706
+ return '';
707
+ }
708
+
709
+ let description = '';
710
+
711
+ // === LAYERED MODE: Compact index + help tool guidance ===
712
+ if (layered) {
713
+ description += '\n## AVAILABLE TOOLS\n\n';
714
+ description += 'You have access to the following tools. Use the **help** tool to get full documentation before first use of any tool.\n\n';
715
+
716
+ for (const toolId of toolIds) {
717
+ const tool = this.tools.get(toolId);
718
+ if (!tool || !tool.isEnabled) continue;
719
+ const summary = this.toolSummaries.get(toolId) || `${toolId} tool`;
720
+ description += `- **${toolId}**: ${summary}\n`;
721
+ }
722
+
723
+ // Always include help tool in the list even if not in capabilities
724
+ if (!toolIds.includes('help') && this.tools.has('help')) {
725
+ const helpSummary = this.toolSummaries.get('help') || 'Get full documentation for any tool';
726
+ description += `- **help**: ${helpSummary}\n`;
727
+ }
728
+
729
+ description += '\n## HOW TO GET TOOL DOCUMENTATION\n\n';
730
+ description += 'Before using a tool for the first time, retrieve its full documentation:\n\n';
731
+ description += '```json\n';
732
+ description += '{\n';
733
+ description += ' "toolId": "help",\n';
734
+ description += ' "parameters": { "tool": "toolname" }\n';
735
+ description += '}\n';
736
+ description += '```\n\n';
737
+ description += 'To list all available tools with summaries:\n';
738
+ description += '```json\n';
739
+ description += '{\n';
740
+ description += ' "toolId": "help",\n';
741
+ description += ' "parameters": { "list": true }\n';
742
+ description += '}\n';
743
+ description += '```\n\n';
744
+
745
+ } else {
746
+ // === STANDARD MODE: Full descriptions ===
747
+ description += '\n## AVAILABLE TOOLS\n\n';
748
+ description += 'You have access to the following tools to perform operations and tasks:\n\n';
749
+
750
+ for (const toolId of toolIds) {
751
+ const tool = this.tools.get(toolId);
752
+ if (!tool || !tool.isEnabled) continue;
753
+
754
+ try {
755
+ if (compact) {
756
+ // Compact format - just tool name and brief description
757
+ const caps = tool.getCapabilities();
758
+ const actions = caps.supportedActions || ['execute'];
759
+ description += `**${toolId}**: ${actions.join(', ')}\n`;
760
+ } else {
761
+ // Full format - complete tool description
762
+ description += `### ${toolId.toUpperCase()} TOOL\n\n`;
763
+ description += tool.getDescription();
764
+ description += '\n\n---\n\n';
765
+ }
766
+ } catch (error) {
767
+ this.logger?.warn(`Failed to get description for tool: ${toolId}`, {
768
+ error: error.message
769
+ });
770
+ }
771
+ }
772
+
773
+ if (compact) {
774
+ description += '\nUse JSON format in markdown code blocks to invoke tools.\n\n';
775
+ }
776
+ }
777
+
778
+ // Add comprehensive tool invocation instructions - JSON as the standard format
779
+ description += '## TOOL INVOCATION SYNTAX\n\n';
780
+ description += '**IMPORTANT**: Use JSON format in markdown code blocks to invoke tools:\n\n';
781
+ description += '### Standard Format: JSON in Markdown Code Block\n';
782
+ description += '```\n';
783
+ description += '```json\n';
784
+ description += '{\n';
785
+ description += ' "toolId": "toolname",\n';
786
+ description += ' "parameters": { ... }\n';
787
+ description += '}\n';
788
+ description += '```\n';
789
+ description += '```\n\n';
790
+ description += '**Rules:**\n';
791
+ description += '- Always wrap JSON tool commands in ```json ... ``` blocks\n';
792
+ description += '- Use "toolId" to specify the tool name\n';
793
+ description += '- Use "parameters" object for tool-specific parameters\n';
794
+ description += '- Use "actions" array for tools that support multiple operations\n';
795
+ description += '- **TOOL RESULTS ARE AVAILABLE ONLY AFTER YOUR MESSAGE ENDS**: Tools execute after your entire message is sent. You will NOT see any tool results until your next turn. This means: if the next tool call depends on results from a previous one, they MUST be in separate messages. You may batch independent tool calls in a single message, but never assume or guess the output of a tool — always wait for the actual result in the next turn before proceeding.\n\n';
796
+ description += 'After invoking a tool, WAIT for the actual response. Do NOT generate imaginary responses.\n\n';
797
+
798
+ // Add exploration strategy if code-map is available
799
+ if (toolIds.includes('code-map')) {
800
+ description += '## CODE EXPLORATION STRATEGY\n\n';
801
+ description += 'When exploring or understanding code, prefer this efficient workflow over reading entire files:\n\n';
802
+ description += '1. **Discover structure** — Use `file-tree` to see the project layout\n';
803
+ description += '2. **Understand code** — Use `code-map` skeleton to extract signatures, classes, and functions with line numbers\n';
804
+ description += '3. **Zoom in** — Use `code-map` read-range to read only the specific lines you need\n';
805
+ description += '4. **Search** — Use `seek` to find specific terms, then `code-map` read-range to view context around matches\n\n';
806
+ description += 'This avoids wasting context on entire file reads. Reserve `filesystem` read for small files or when you need the complete content.\n';
807
+ }
808
+
809
+ return description;
810
+ }
811
+
812
+ /**
813
+ * Enhance existing system prompt with tool descriptions
814
+ * @param {string} existingPrompt - Current system prompt
815
+ * @param {Array<string>} capabilities - Agent capabilities
816
+ * @param {Object} options - Enhancement options
817
+ * @returns {string} Enhanced system prompt
818
+ */
819
+ enhanceSystemPrompt(existingPrompt, capabilities = [], options = {}) {
820
+ const toolSection = this.generateToolDescriptionsForPrompt(capabilities, options);
821
+
822
+ if (!toolSection.trim()) {
823
+ return existingPrompt || '';
824
+ }
825
+
826
+ const prompt = existingPrompt || '';
827
+
828
+ // If prompt already contains tool section, replace it
829
+ if (prompt.includes('## AVAILABLE TOOLS')) {
830
+ return prompt.replace(
831
+ /## AVAILABLE TOOLS[\s\S]*?(?=##|$)/,
832
+ toolSection + '\n'
833
+ );
834
+ }
835
+
836
+ const orientationParagraph = `IMPORTANT: Tools execute only after your full message is sent — you cannot see results mid-message. If a tool call depends on the result of another, put them in separate messages. You may batch independent tool calls in one message. Never guess or fabricate tool output — always wait for actual results before continuing.`;
837
+
838
+ // Otherwise, append to the end
839
+ return prompt + (prompt.endsWith('\n') ? '' : '\n') + toolSection + orientationParagraph + '\n';
840
+ }
841
+
842
+ /**
843
+ * Get available tools with metadata for web UI
844
+ * @returns {Array} Array of tool information objects
845
+ */
846
+ getAvailableToolsForUI() {
847
+ const tools = [];
848
+
849
+ for (const [toolId, tool] of this.tools.entries()) {
850
+ const capabilities = tool.getCapabilities();
851
+
852
+ // Extract tool name and description from the tool's description
853
+ const fullDescription = tool.getDescription();
854
+ const firstLine = fullDescription.split('\n').find(line => line.trim().length > 0) || '';
855
+ const toolName = firstLine.replace(/^.*Tool:\s*/i, '').replace(/\s*-.*$/, '').trim();
856
+
857
+ tools.push({
858
+ id: toolId, // This is the correct ID to use in capabilities
859
+ name: toolName || toolId.charAt(0).toUpperCase() + toolId.slice(1),
860
+ description: firstLine,
861
+ category: this._getToolCategory(toolId),
862
+ // Heroicon name (outline variant) for the web-UI to render — lets
863
+ // every tool-selection surface share a single icon source without
864
+ // each frontend component maintaining its own map. Frontend falls
865
+ // back to WrenchScrewdriver if the name doesn't resolve.
866
+ iconName: this._getToolIconName(toolId),
867
+ enabled: capabilities.enabled,
868
+ async: capabilities.async,
869
+ requiresProject: capabilities.requiresProject,
870
+ className: tool.constructor.name
871
+ });
872
+ }
873
+
874
+ return tools.sort((a, b) => a.name.localeCompare(b.name));
875
+ }
876
+
877
+ /**
878
+ * Get tool category for organization
879
+ * @param {string} toolId - Tool identifier
880
+ * @returns {string} Tool category
881
+ * @private
882
+ */
883
+ _getToolCategory(toolId) {
884
+ const categories = {
885
+ 'terminal': 'System',
886
+ 'filesystem': 'File Operations',
887
+ 'file-content-replace': 'File Operations',
888
+ 'seek': 'File Operations',
889
+ 'file-tree': 'File Operations',
890
+ 'code-map': 'Analysis',
891
+ 'pdf': 'File Operations',
892
+ 'web': 'Automation',
893
+ 'visual-editor': 'Automation',
894
+ 'staticanalysis': 'Analysis',
895
+ 'clonedetection': 'Analysis',
896
+ 'import-analyzer': 'Analysis',
897
+ 'dependency-resolver': 'Analysis',
898
+ 'image-gen': 'AI Tools',
899
+ // Sora replacement (Sora 2 via Azure Foundry) is live again as of
900
+ // April 2026 — the deployment-name mismatch that caused 404s was
901
+ // fixed in services/llmServiceFactory.js and the tool is exposed
902
+ // to the UI alongside image-gen.
903
+ 'video-gen': 'AI Tools',
904
+ 'vision': 'AI Tools',
905
+ 'taskmanager': 'Utility',
906
+ 'jobdone': 'Utility',
907
+ 'agentdelay': 'Utility',
908
+ 'userprompt': 'Utility',
909
+ 'memory': 'Knowledge',
910
+ 'skills': 'Knowledge',
911
+ 'agentcommunication': 'Collaboration',
912
+ 'help': 'System',
913
+ 'doc': 'File Operations',
914
+ 'spreadsheet': 'File Operations',
915
+ 'whatsapp': 'Communication',
916
+ };
917
+
918
+ return categories[toolId] || 'Other';
919
+ }
920
+
921
+ /**
922
+ * Map tool id → Heroicon (outline variant) name. The web-UI uses this
923
+ * to render an icon next to each tool in selector dropdowns without
924
+ * having to maintain its own per-surface icon map. Unknown tools
925
+ * render the generic wrench.
926
+ * @param {string} toolId
927
+ * @returns {string}
928
+ * @private
929
+ */
930
+ _getToolIconName(toolId) {
931
+ const icons = {
932
+ 'terminal': 'CommandLine',
933
+ 'filesystem': 'FolderOpen',
934
+ 'file-content-replace': 'DocumentText',
935
+ 'seek': 'MagnifyingGlassCircle',
936
+ 'file-tree': 'ListBullet',
937
+ 'code-map': 'MapIcon',
938
+ 'pdf': 'DocumentText',
939
+ 'doc': 'DocumentText',
940
+ 'spreadsheet': 'TableCells',
941
+ 'staticanalysis': 'CodeBracket',
942
+ 'clonedetection': 'DocumentDuplicate',
943
+ 'import-analyzer': 'MagnifyingGlass',
944
+ 'dependency-resolver': 'ArrowsPointingOut',
945
+ 'web': 'GlobeAlt',
946
+ 'visual-editor': 'CursorArrowRays',
947
+ 'image-gen': 'Photo',
948
+ 'video-gen': 'Film',
949
+ 'vision': 'Eye',
950
+ 'taskmanager': 'ClipboardDocumentList',
951
+ 'jobdone': 'CheckCircle',
952
+ 'agentcommunication': 'ChatBubbleLeftRight',
953
+ 'agentdelay': 'Clock',
954
+ 'memory': 'CircleStack',
955
+ 'skills': 'BookOpen',
956
+ 'userprompt': 'QuestionMarkCircle',
957
+ 'help': 'QuestionMarkCircle',
958
+ 'whatsapp': 'ChatBubbleOvalLeft',
959
+ };
960
+ return icons[toolId] || 'WrenchScrewdriver';
961
+ }
962
+
963
+ /**
964
+ * Get registry statistics
965
+ * @returns {Object} Registry statistics
966
+ */
967
+ getRegistryStats() {
968
+ const enabledTools = Array.from(this.tools.values()).filter(tool => tool.isEnabled);
969
+ const totalOperations = Array.from(this.tools.values())
970
+ .reduce((sum, tool) => sum + tool.usageCount, 0);
971
+
972
+ return {
973
+ totalTools: this.tools.size,
974
+ enabledTools: enabledTools.length,
975
+ totalOperations,
976
+ activeOperations: this.asyncOperations.size
977
+ };
978
+ }
979
+ }
980
+
900
981
  export { BaseTool, ToolsRegistry };