onbuzz 4.5.0 → 4.6.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 (989) hide show
  1. package/bin/cli.js +38 -18
  2. package/package.json +2 -1
  3. package/scripts/e2e-flow-live.js +598 -0
  4. package/src/__tests__/resolvePreferredModel.test.js +15 -1
  5. package/src/core/__test-utils__/flowJudge.js +198 -0
  6. package/src/core/__tests__/flowCheckpointStore.test.js +140 -0
  7. package/src/core/__tests__/flowEndToEnd.test.js +565 -0
  8. package/src/core/__tests__/flowExecutor.test.js +950 -0
  9. package/src/core/__tests__/flowFieldMapping.test.js +189 -0
  10. package/src/core/__tests__/flowJudge.test.js +140 -0
  11. package/src/core/__tests__/flowLint.test.js +119 -0
  12. package/src/core/__tests__/flowLintClientMirror.test.js +98 -0
  13. package/src/core/__tests__/flowMigration.test.js +160 -0
  14. package/src/core/__tests__/flowRetry.test.js +145 -0
  15. package/src/core/__tests__/flowSavePayload.test.js +169 -0
  16. package/src/core/__tests__/flowSchema.test.js +438 -0
  17. package/src/core/__tests__/flowTemplates.test.js +183 -0
  18. package/src/core/__tests__/flowTypes.test.js +147 -0
  19. package/src/core/__tests__/flowVersionStore.test.js +123 -0
  20. package/src/core/__tests__/orchestrator.test.js +38 -0
  21. package/src/core/__tests__/stateManager.test.js +281 -0
  22. package/src/core/agentScheduler.js +37 -6
  23. package/src/core/flowCheckpointStore.js +146 -0
  24. package/src/core/flowExecutor.js +669 -87
  25. package/src/core/flowFieldMapping.js +138 -0
  26. package/src/core/flowLint.js +102 -0
  27. package/src/core/flowMigration.js +88 -0
  28. package/src/core/flowRetry.js +103 -0
  29. package/src/core/flowSchema.js +297 -0
  30. package/src/core/flowTypes.js +81 -0
  31. package/src/core/flowVersionStore.js +122 -0
  32. package/src/core/messageProcessor.js +5 -1
  33. package/src/core/stateManager.js +249 -15
  34. package/src/index.js +8 -0
  35. package/src/interfaces/webServer.js +271 -4
  36. package/src/modules/widget/galleryStore.js +27 -2
  37. package/src/services/__tests__/apiKeyManager.test.js +163 -0
  38. package/src/services/__tests__/flowContextService.test.js +391 -0
  39. package/src/services/apiKeyManager.js +54 -3
  40. package/src/services/flowContextService.js +401 -4
  41. package/src/tools/__tests__/imageFormat.test.js +208 -0
  42. package/src/tools/__tests__/jobDoneTool.test.js +285 -0
  43. package/src/tools/imageFormat.js +249 -0
  44. package/src/tools/imageTool.js +107 -18
  45. package/src/tools/jobDoneTool.js +111 -3
  46. package/src/tools/videoTool.js +94 -60
  47. package/src/tools/webTool.js +9 -0
  48. package/src/utilities/__tests__/apiKeyPlaceholders.test.js +120 -0
  49. package/src/utilities/__tests__/brand.test.js +115 -0
  50. package/src/utilities/apiKeyPlaceholders.js +68 -0
  51. package/src/utilities/brand.js +93 -0
  52. package/src/utilities/userDataDir.js +5 -0
  53. package/web-ui/build/index.html +2 -2
  54. package/web-ui/build/static/1c-CvuQ3hv-.js +1 -0
  55. package/web-ui/build/static/abap-BLdv0Jje.js +1 -0
  56. package/web-ui/build/static/abnf-CGGg8KtC.js +1 -0
  57. package/web-ui/build/static/abnf-DRXF8AHh.js +1 -0
  58. package/web-ui/build/static/accesslog-C0v06age.js +1 -0
  59. package/web-ui/build/static/actionscript-5uhk1qo4.js +1 -0
  60. package/web-ui/build/static/actionscript-eFh_rL7l.js +1 -0
  61. package/web-ui/build/static/ada-DX064lsk.js +1 -0
  62. package/web-ui/build/static/ada-DtDpZJA8.js +1 -0
  63. package/web-ui/build/static/agda-DPnmQC2V.js +1 -0
  64. package/web-ui/build/static/al-BJnZv7Mq.js +1 -0
  65. package/web-ui/build/static/angelscript-BzX4egqM.js +1 -0
  66. package/web-ui/build/static/antlr4-CpvLBdqN.js +1 -0
  67. package/web-ui/build/static/apache-CeMpLZgQ.js +1 -0
  68. package/web-ui/build/static/apacheconf-DuxpNgGg.js +1 -0
  69. package/web-ui/build/static/apex-BnvL-Zqw.js +1 -0
  70. package/web-ui/build/static/apl-Cwp1WC58.js +1 -0
  71. package/web-ui/build/static/applescript-Drjf4gZ_.js +1 -0
  72. package/web-ui/build/static/applescript-OCRtzdLy.js +1 -0
  73. package/web-ui/build/static/aql-BT92x5XB.js +1 -0
  74. package/web-ui/build/static/arcade-BS9r1rKb.js +1 -0
  75. package/web-ui/build/static/arduino-Dx4b0RsU.js +1 -0
  76. package/web-ui/build/static/arduino-MC82bxgK.js +1 -0
  77. package/web-ui/build/static/arff-BPbJPmCK.js +1 -0
  78. package/web-ui/build/static/armasm-Ae0OYiNN.js +1 -0
  79. package/web-ui/build/static/asciidoc-BFCjTY8x.js +1 -0
  80. package/web-ui/build/static/asciidoc-Cum1UNn8.js +1 -0
  81. package/web-ui/build/static/asm6502-DRrCRZ3g.js +1 -0
  82. package/web-ui/build/static/asmatmel-QweP0nrX.js +1 -0
  83. package/web-ui/build/static/aspectj-GSWlVl13.js +1 -0
  84. package/web-ui/build/static/aspnet-gFBjg3Gc.js +1 -0
  85. package/web-ui/build/static/autohotkey-BKW8CgdS.js +1 -0
  86. package/web-ui/build/static/autohotkey-PxYn0v1n.js +1 -0
  87. package/web-ui/build/static/autoit-Dm1-Ww37.js +1 -0
  88. package/web-ui/build/static/autoit-ttEVAAKG.js +1 -0
  89. package/web-ui/build/static/avisynth-B7Wkp41N.js +1 -0
  90. package/web-ui/build/static/avrasm-CUPF81zm.js +1 -0
  91. package/web-ui/build/static/avro-idl-DHWmsw82.js +1 -0
  92. package/web-ui/build/static/awk-CjJ3RSZI.js +1 -0
  93. package/web-ui/build/static/axapta-C1qEYhtS.js +1 -0
  94. package/web-ui/build/static/bash-BGEpCDRi.js +1 -0
  95. package/web-ui/build/static/bash-nKHqg4vr.js +1 -0
  96. package/web-ui/build/static/basic-BoEGbohL.js +1 -0
  97. package/web-ui/build/static/basic-LeZDGhzq.js +1 -0
  98. package/web-ui/build/static/batch-AgpF9rt8.js +1 -0
  99. package/web-ui/build/static/bbcode-qAuG7NMV.js +1 -0
  100. package/web-ui/build/static/bicep-BjdiK558.js +1 -0
  101. package/web-ui/build/static/birb-DAe1WhT3.js +1 -0
  102. package/web-ui/build/static/bison-BanDUZpy.js +1 -0
  103. package/web-ui/build/static/bnf-DlBe3_6s.js +1 -0
  104. package/web-ui/build/static/bnf-QgoO3Q8o.js +1 -0
  105. package/web-ui/build/static/brainfuck-B1DXmfDc.js +1 -0
  106. package/web-ui/build/static/brainfuck-B_JhB4QU.js +1 -0
  107. package/web-ui/build/static/brightscript-C0POlK1a.js +1 -0
  108. package/web-ui/build/static/bro-CjGWwSC2.js +1 -0
  109. package/web-ui/build/static/bsl-DXsNn0E7.js +1 -0
  110. package/web-ui/build/static/c-D-Xouzk3.js +1 -0
  111. package/web-ui/build/static/c-Df8JpOdZ.js +1 -0
  112. package/web-ui/build/static/c-like-BQySGMeF.js +1 -0
  113. package/web-ui/build/static/cal-DLefuKn4.js +1 -0
  114. package/web-ui/build/static/capnproto-DuI4CHAK.js +1 -0
  115. package/web-ui/build/static/ceylon-DyUD9r5X.js +1 -0
  116. package/web-ui/build/static/cfscript-B71LgEx4.js +1 -0
  117. package/web-ui/build/static/chaiscript-DUx8exmo.js +1 -0
  118. package/web-ui/build/static/cil-BkH647hL.js +1 -0
  119. package/web-ui/build/static/clean-4G2AsMGw.js +1 -0
  120. package/web-ui/build/static/clojure-C41DUPjJ.js +1 -0
  121. package/web-ui/build/static/clojure-RzWG1SWB.js +1 -0
  122. package/web-ui/build/static/clojure-repl-C12peSNj.js +1 -0
  123. package/web-ui/build/static/cmake-D9dyf1Ef.js +1 -0
  124. package/web-ui/build/static/cmake-X6aOgq7A.js +1 -0
  125. package/web-ui/build/static/cobol-DQBujvW6.js +1 -0
  126. package/web-ui/build/static/coffeescript-3uuDLR0C.js +1 -0
  127. package/web-ui/build/static/coffeescript-BesW_-0N.js +1 -0
  128. package/web-ui/build/static/concurnas-DUqxEcDq.js +1 -0
  129. package/web-ui/build/static/coq-BNw0ZmzS.js +1 -0
  130. package/web-ui/build/static/coq-J6mf-n4i.js +1 -0
  131. package/web-ui/build/static/cos-B-p2VbRC.js +1 -0
  132. package/web-ui/build/static/cpp-B91xny9o.js +1 -0
  133. package/web-ui/build/static/cpp-C-qfcmAQ.js +1 -0
  134. package/web-ui/build/static/crmsh-CXJSYh9n.js +1 -0
  135. package/web-ui/build/static/crystal-BZJ_gkDx.js +1 -0
  136. package/web-ui/build/static/crystal-D7rBvt2Y.js +1 -0
  137. package/web-ui/build/static/csharp-CHWbNjwN.js +1 -0
  138. package/web-ui/build/static/csharp-DHH7lbyr.js +1 -0
  139. package/web-ui/build/static/cshtml-6XKl5N6w.js +1 -0
  140. package/web-ui/build/static/csp-BwQp4uKS.js +1 -0
  141. package/web-ui/build/static/csp-LxTXhb7W.js +1 -0
  142. package/web-ui/build/static/css-JviRe6l1.js +1 -0
  143. package/web-ui/build/static/css-extras-DdIyhyWh.js +1 -0
  144. package/web-ui/build/static/csv-BhyLVYKF.js +1 -0
  145. package/web-ui/build/static/cypher-45QLqKfb.js +1 -0
  146. package/web-ui/build/static/d-BQuCFdtT.js +1 -0
  147. package/web-ui/build/static/d-rDpztdwo.js +1 -0
  148. package/web-ui/build/static/dart-B3HdKwvI.js +1 -0
  149. package/web-ui/build/static/dart-CxIvlNfF.js +1 -0
  150. package/web-ui/build/static/dataweave-CMS5SC_F.js +1 -0
  151. package/web-ui/build/static/dax-C_neqUB4.js +1 -0
  152. package/web-ui/build/static/delphi-D86BXUtC.js +1 -0
  153. package/web-ui/build/static/dhall-BGV0CTjz.js +1 -0
  154. package/web-ui/build/static/diff-Br5L84xu.js +1 -0
  155. package/web-ui/build/static/diff-C8dJOj7p.js +1 -0
  156. package/web-ui/build/static/django-CRpfLgb_.js +1 -0
  157. package/web-ui/build/static/django-Cr0k0BHt.js +1 -0
  158. package/web-ui/build/static/dns-CvhVGt9J.js +1 -0
  159. package/web-ui/build/static/dns-zone-file--waGszJ5.js +1 -0
  160. package/web-ui/build/static/docker-Bp-jYj4d.js +1 -0
  161. package/web-ui/build/static/dockerfile-B9PF5D-H.js +1 -0
  162. package/web-ui/build/static/dos-CGjRa73t.js +1 -0
  163. package/web-ui/build/static/dot---3xJv0W.js +1 -0
  164. package/web-ui/build/static/dsconfig-ChUbMzIk.js +1 -0
  165. package/web-ui/build/static/dts-DzVrXhdk.js +1 -0
  166. package/web-ui/build/static/dust-BuyYJzfS.js +1 -0
  167. package/web-ui/build/static/ebnf-B4Jhny4j.js +1 -0
  168. package/web-ui/build/static/ebnf-wTpKeELK.js +1 -0
  169. package/web-ui/build/static/editorconfig-DijMMyBE.js +1 -0
  170. package/web-ui/build/static/eiffel-gSk8UUfh.js +1 -0
  171. package/web-ui/build/static/ejs-U-J4wHaR.js +1 -0
  172. package/web-ui/build/static/elixir-CLgHOCRk.js +1 -0
  173. package/web-ui/build/static/elixir-KhfnyoV6.js +1 -0
  174. package/web-ui/build/static/elm-B0g83jwv.js +1 -0
  175. package/web-ui/build/static/elm-Bl8qDmwz.js +1 -0
  176. package/web-ui/build/static/erb-CwkagsxA.js +1 -0
  177. package/web-ui/build/static/erb-DXfF2Urb.js +1 -0
  178. package/web-ui/build/static/erlang-BsONy4Br.js +1 -0
  179. package/web-ui/build/static/erlang-C44ddtgw.js +1 -0
  180. package/web-ui/build/static/erlang-repl-DhirJ_Ji.js +1 -0
  181. package/web-ui/build/static/etlua-C71HyvJj.js +1 -0
  182. package/web-ui/build/static/excel-B_RD_Nc6.js +1 -0
  183. package/web-ui/build/static/excel-formula-xRVcfp1T.js +1 -0
  184. package/web-ui/build/static/factor-CftUx68l.js +1 -0
  185. package/web-ui/build/static/false-DqRtSZRC.js +1 -0
  186. package/web-ui/build/static/firestore-security-rules-BCG_0nJP.js +1 -0
  187. package/web-ui/build/static/fix-CnRMAIWg.js +1 -0
  188. package/web-ui/build/static/flix-DLAgo_-e.js +1 -0
  189. package/web-ui/build/static/flow-w5YSIX1I.js +1 -0
  190. package/web-ui/build/static/fortran-CH5byJ0j.js +1 -0
  191. package/web-ui/build/static/fortran-DK-jnXQF.js +1 -0
  192. package/web-ui/build/static/fsharp-Cnfw9xB2.js +1 -0
  193. package/web-ui/build/static/fsharp-hebdfC6F.js +1 -0
  194. package/web-ui/build/static/ftl-DSSTp35t.js +1 -0
  195. package/web-ui/build/static/gams-C3akjfKZ.js +1 -0
  196. package/web-ui/build/static/gap-Dve6kEeL.js +1 -0
  197. package/web-ui/build/static/gauss-BmUqjv1m.js +1 -0
  198. package/web-ui/build/static/gcode-CjPpcuxm.js +1 -0
  199. package/web-ui/build/static/gcode-DdF0Sf0K.js +1 -0
  200. package/web-ui/build/static/gdscript-uyE_Q4Bz.js +1 -0
  201. package/web-ui/build/static/gedcom-9_5CrYud.js +1 -0
  202. package/web-ui/build/static/gherkin-0qL8AiDA.js +1 -0
  203. package/web-ui/build/static/gherkin-CBXpoWw3.js +1 -0
  204. package/web-ui/build/static/git-D6Y51k33.js +1 -0
  205. package/web-ui/build/static/glsl-DnD7skof.js +1 -0
  206. package/web-ui/build/static/glsl-aij7eTLw.js +1 -0
  207. package/web-ui/build/static/gml-3zbjVRHR.js +1 -0
  208. package/web-ui/build/static/gml-BOViyHVy.js +1 -0
  209. package/web-ui/build/static/gn-lYZFOgaG.js +1 -0
  210. package/web-ui/build/static/go-D3NQLBKz.js +1 -0
  211. package/web-ui/build/static/go-_v8tkYQe.js +1 -0
  212. package/web-ui/build/static/go-module-C6c3_rbX.js +1 -0
  213. package/web-ui/build/static/golo-BOIzwgKG.js +1 -0
  214. package/web-ui/build/static/gradle-DdejLgT6.js +1 -0
  215. package/web-ui/build/static/graphql-BWowSWlo.js +1 -0
  216. package/web-ui/build/static/groovy-DE_kIGjj.js +1 -0
  217. package/web-ui/build/static/groovy-DatEqK3Y.js +1 -0
  218. package/web-ui/build/static/haml-CpEpgDyf.js +1 -0
  219. package/web-ui/build/static/haml-DbPIKAsr.js +1 -0
  220. package/web-ui/build/static/handlebars-BcvOygMh.js +1 -0
  221. package/web-ui/build/static/handlebars-CM_40QlT.js +1 -0
  222. package/web-ui/build/static/haskell-DVgDTyj3.js +1 -0
  223. package/web-ui/build/static/haskell-Dm2oiqNu.js +1 -0
  224. package/web-ui/build/static/haxe--0QfWvD_.js +1 -0
  225. package/web-ui/build/static/haxe-DClHSH5I.js +1 -0
  226. package/web-ui/build/static/hcl-BaxNlNAk.js +1 -0
  227. package/web-ui/build/static/hlsl-Di7PYfJn.js +1 -0
  228. package/web-ui/build/static/hoon-Bq4hhWSd.js +1 -0
  229. package/web-ui/build/static/hpkp-Bu1AnCZZ.js +1 -0
  230. package/web-ui/build/static/hsp-CbIHPOnb.js +1 -0
  231. package/web-ui/build/static/hsts-inGzMZHb.js +1 -0
  232. package/web-ui/build/static/htmlbars-B63TZb6k.js +1 -0
  233. package/web-ui/build/static/http-3wWrh86I.js +1 -0
  234. package/web-ui/build/static/http-Bv97BGAr.js +1 -0
  235. package/web-ui/build/static/hy-CIEvnIJC.js +1 -0
  236. package/web-ui/build/static/ichigojam-BAyO373g.js +1 -0
  237. package/web-ui/build/static/icon-CGCawTFI.js +1 -0
  238. package/web-ui/build/static/icu-message-format-C_lOXF7I.js +1 -0
  239. package/web-ui/build/static/idris-D0SaDFta.js +1 -0
  240. package/web-ui/build/static/iecst-DIJ6Ei7g.js +1 -0
  241. package/web-ui/build/static/ignore-CgcF6vXx.js +1 -0
  242. package/web-ui/build/static/index-CCDUVvvx.js +1 -0
  243. package/web-ui/build/static/index-Cjg3uZB9.js +1109 -0
  244. package/web-ui/build/static/index-CjtNtdGN.js +13 -0
  245. package/web-ui/build/static/index-DpMwgPzf.css +1 -0
  246. package/web-ui/build/static/inform7-C_MqBtMp.js +1 -0
  247. package/web-ui/build/static/inform7-CmRJkJSh.js +1 -0
  248. package/web-ui/build/static/ini-BE6jwIzm.js +1 -0
  249. package/web-ui/build/static/ini-BJ50J7Sm.js +1 -0
  250. package/web-ui/build/static/io-Cnt0nyV5.js +1 -0
  251. package/web-ui/build/static/irpf90-BjRJE_kg.js +1 -0
  252. package/web-ui/build/static/isbl-C7912t_8.js +1 -0
  253. package/web-ui/build/static/j-D6ci3wH9.js +1 -0
  254. package/web-ui/build/static/java-B_gtzL63.js +1 -0
  255. package/web-ui/build/static/java-CChyLI1p.js +1 -0
  256. package/web-ui/build/static/javadoc-CGvzgn19.js +1 -0
  257. package/web-ui/build/static/javadoclike-CI4krpLe.js +1 -0
  258. package/web-ui/build/static/javascript-CgORCJsx.js +1 -0
  259. package/web-ui/build/static/javastacktrace-DNnLXvJa.js +1 -0
  260. package/web-ui/build/static/jboss-cli-DIfGm3Rl.js +1 -0
  261. package/web-ui/build/static/jexl-CYQxvL_i.js +1 -0
  262. package/web-ui/build/static/jolie-C2fxUjz7.js +1 -0
  263. package/web-ui/build/static/jq-j1fAl-OU.js +1 -0
  264. package/web-ui/build/static/js-extras-Dqx-da8U.js +1 -0
  265. package/web-ui/build/static/js-templates-jQphR4CW.js +1 -0
  266. package/web-ui/build/static/jsdoc-BCunhOqo.js +1 -0
  267. package/web-ui/build/static/json-CljDde4D.js +1 -0
  268. package/web-ui/build/static/json-Cvzg5_hO.js +1 -0
  269. package/web-ui/build/static/json5-B19V_yl9.js +1 -0
  270. package/web-ui/build/static/jsonp-WdmhO5Oi.js +1 -0
  271. package/web-ui/build/static/jsstacktrace-LpNHn4a_.js +1 -0
  272. package/web-ui/build/static/jsx-Zw6Egddf.js +1 -0
  273. package/web-ui/build/static/julia-DPlpJZNN.js +1 -0
  274. package/web-ui/build/static/julia-DuKc9nrz.js +1 -0
  275. package/web-ui/build/static/julia-repl-C-LuPMzI.js +1 -0
  276. package/web-ui/build/static/keepalived-DDl-dK9a.js +1 -0
  277. package/web-ui/build/static/keyman-DCtgoYKu.js +1 -0
  278. package/web-ui/build/static/kotlin-D9aFeaCS.js +1 -0
  279. package/web-ui/build/static/kotlin-DlrR34XG.js +1 -0
  280. package/web-ui/build/static/kumir-B_aiiAzq.js +1 -0
  281. package/web-ui/build/static/kusto-CD4lHO1B.js +1 -0
  282. package/web-ui/build/static/lasso-BAMF8mdd.js +1 -0
  283. package/web-ui/build/static/latex-BjEyffe7.js +1 -0
  284. package/web-ui/build/static/latex-NaCSqcbD.js +1 -0
  285. package/web-ui/build/static/latte-BACpaGl3.js +1 -0
  286. package/web-ui/build/static/ldif-CRWTiH1W.js +1 -0
  287. package/web-ui/build/static/leaf-BYydRpJx.js +1 -0
  288. package/web-ui/build/static/less-BtFu1MXi.js +1 -0
  289. package/web-ui/build/static/less-COgcqIOM.js +1 -0
  290. package/web-ui/build/static/lilypond-BMLjCV3G.js +1 -0
  291. package/web-ui/build/static/liquid-Dr5bQMAB.js +1 -0
  292. package/web-ui/build/static/lisp-CE1ra7Xs.js +1 -0
  293. package/web-ui/build/static/lisp-CcOEo5DI.js +1 -0
  294. package/web-ui/build/static/livecodeserver-DNuOfASY.js +1 -0
  295. package/web-ui/build/static/livescript-BJor4pxz.js +1 -0
  296. package/web-ui/build/static/livescript-DFaZj6XM.js +1 -0
  297. package/web-ui/build/static/llvm-CJtHIXsX.js +1 -0
  298. package/web-ui/build/static/llvm-d3gQICQs.js +1 -0
  299. package/web-ui/build/static/log-B0pKN1S4.js +1 -0
  300. package/web-ui/build/static/lolcode-C_V6Sffm.js +1 -0
  301. package/web-ui/build/static/lsl-yhp5dB9o.js +1 -0
  302. package/web-ui/build/static/lua-BDTJq_SO.js +1 -0
  303. package/web-ui/build/static/lua-BaKkUUd_.js +1 -0
  304. package/web-ui/build/static/magma-aTzw_jlN.js +1 -0
  305. package/web-ui/build/static/makefile-FyZn4dZ-.js +1 -0
  306. package/web-ui/build/static/makefile-Vk7smupm.js +1 -0
  307. package/web-ui/build/static/markdown-BHavO-Hk.js +1 -0
  308. package/web-ui/build/static/markdown-CTYy6uqC.js +1 -0
  309. package/web-ui/build/static/markup-templating-DJWuQB2F.js +1 -0
  310. package/web-ui/build/static/mathematica-BnMzpFTS.js +1 -0
  311. package/web-ui/build/static/matlab-BsW3yHe5.js +1 -0
  312. package/web-ui/build/static/matlab-C8_ylrUg.js +1 -0
  313. package/web-ui/build/static/maxima-c3e9EB-f.js +1 -0
  314. package/web-ui/build/static/maxscript-DU-NoCpb.js +1 -0
  315. package/web-ui/build/static/mel-CcB2EUO0.js +1 -0
  316. package/web-ui/build/static/mel-u6igP96m.js +1 -0
  317. package/web-ui/build/static/mercury-YZshmW3v.js +1 -0
  318. package/web-ui/build/static/mermaid-C9dmgLlU.js +1 -0
  319. package/web-ui/build/static/mipsasm-BXHH9ztX.js +1 -0
  320. package/web-ui/build/static/mizar-B1317rho.js +1 -0
  321. package/web-ui/build/static/mizar-BjaPUUcM.js +1 -0
  322. package/web-ui/build/static/mojolicious-BQ8vE8HW.js +1 -0
  323. package/web-ui/build/static/mongodb-P-J2PnwH.js +1 -0
  324. package/web-ui/build/static/monkey-DcKZEVh6.js +1 -0
  325. package/web-ui/build/static/monkey-wMAzhDv4.js +1 -0
  326. package/web-ui/build/static/moonscript-C9Ea7K1o.js +1 -0
  327. package/web-ui/build/static/moonscript-DAjW1T8X.js +1 -0
  328. package/web-ui/build/static/n1ql-6nGwiuTr.js +1 -0
  329. package/web-ui/build/static/n1ql-BxgYqKfs.js +1 -0
  330. package/web-ui/build/static/n4js-Cqw8_-b7.js +1 -0
  331. package/web-ui/build/static/nand2tetris-hdl-B3Qrhhfv.js +1 -0
  332. package/web-ui/build/static/naniscript-BpIC5j6P.js +1 -0
  333. package/web-ui/build/static/nasm-Dp1z_ttd.js +1 -0
  334. package/web-ui/build/static/neon-B4RksdIv.js +1 -0
  335. package/web-ui/build/static/nevod-P34zfD9_.js +1 -0
  336. package/web-ui/build/static/nginx-CSaiFc4g.js +1 -0
  337. package/web-ui/build/static/nginx-bZFV7OqP.js +1 -0
  338. package/web-ui/build/static/nim-D04ADsdj.js +1 -0
  339. package/web-ui/build/static/nim-D37nbh5y.js +1 -0
  340. package/web-ui/build/static/nix-BPsQ58gF.js +1 -0
  341. package/web-ui/build/static/nix-keWnuH3h.js +1 -0
  342. package/web-ui/build/static/node-repl-rNkVcb6S.js +1 -0
  343. package/web-ui/build/static/nsis-DT8bhvLc.js +1 -0
  344. package/web-ui/build/static/nsis-DvfCmyQQ.js +1 -0
  345. package/web-ui/build/static/objectivec-BaJIzRqu.js +1 -0
  346. package/web-ui/build/static/objectivec-CmAY0jlQ.js +1 -0
  347. package/web-ui/build/static/ocaml-Dsf96dbW.js +1 -0
  348. package/web-ui/build/static/ocaml-SFQJ7AwJ.js +1 -0
  349. package/web-ui/build/static/opencl-Dp9ILs3s.js +1 -0
  350. package/web-ui/build/static/openqasm-Bsk-xK6C.js +1 -0
  351. package/web-ui/build/static/openscad-Dgvp4h50.js +1 -0
  352. package/web-ui/build/static/oxygene-C9rTsztX.js +1 -0
  353. package/web-ui/build/static/oz-DNlV-Ssf.js +1 -0
  354. package/web-ui/build/static/parigp-B7a5XVP7.js +1 -0
  355. package/web-ui/build/static/parser-nTo2WBxY.js +1 -0
  356. package/web-ui/build/static/parser3-BSD4cYqf.js +1 -0
  357. package/web-ui/build/static/pascal-DJxIFBHG.js +1 -0
  358. package/web-ui/build/static/pascaligo-JdV741ps.js +1 -0
  359. package/web-ui/build/static/pcaxis-DdexNvEQ.js +1 -0
  360. package/web-ui/build/static/peoplecode-DxBgZPZT.js +1 -0
  361. package/web-ui/build/static/perl-C0INln41.js +1 -0
  362. package/web-ui/build/static/perl-DvRuNidH.js +1 -0
  363. package/web-ui/build/static/pf-BjguNjII.js +1 -0
  364. package/web-ui/build/static/pgsql-9w8Z8Ams.js +1 -0
  365. package/web-ui/build/static/php-DKQIY8Pe.js +1 -0
  366. package/web-ui/build/static/php-DibEnIhD.js +1 -0
  367. package/web-ui/build/static/php-extras-CKKhA74Z.js +1 -0
  368. package/web-ui/build/static/php-template-Cjba7UNU.js +1 -0
  369. package/web-ui/build/static/phpdoc-QXtTW5az.js +1 -0
  370. package/web-ui/build/static/plaintext-Cbn61_h_.js +1 -0
  371. package/web-ui/build/static/plsql-f34z7hfB.js +1 -0
  372. package/web-ui/build/static/pony-DBSnXJAW.js +1 -0
  373. package/web-ui/build/static/powerquery-lin81zqH.js +1 -0
  374. package/web-ui/build/static/powershell-BoyP16Ta.js +1 -0
  375. package/web-ui/build/static/powershell-CCpHONl6.js +1 -0
  376. package/web-ui/build/static/processing-Cd7-ycAb.js +1 -0
  377. package/web-ui/build/static/processing-CeGW9CwE.js +1 -0
  378. package/web-ui/build/static/profile-DLYi3Uya.js +1 -0
  379. package/web-ui/build/static/prolog-BVr1f3c4.js +1 -0
  380. package/web-ui/build/static/prolog-C3D6KhoT.js +1 -0
  381. package/web-ui/build/static/promql-dviC9B24.js +1 -0
  382. package/web-ui/build/static/properties-CSNjefFg.js +1 -0
  383. package/web-ui/build/static/properties-DTAWAQKc.js +1 -0
  384. package/web-ui/build/static/protobuf-BCYoMCa-.js +1 -0
  385. package/web-ui/build/static/protobuf-D8G6xbh1.js +1 -0
  386. package/web-ui/build/static/psl-DzehMnl-.js +1 -0
  387. package/web-ui/build/static/pug-Cl4m_Cmv.js +1 -0
  388. package/web-ui/build/static/puppet-CECKDklS.js +1 -0
  389. package/web-ui/build/static/puppet-ZSk9z7h2.js +1 -0
  390. package/web-ui/build/static/pure-CRYVKpUf.js +1 -0
  391. package/web-ui/build/static/purebasic-B1B7jCI9.js +1 -0
  392. package/web-ui/build/static/purebasic-BdOvLN02.js +1 -0
  393. package/web-ui/build/static/purescript-CdFZo5U_.js +1 -0
  394. package/web-ui/build/static/python-B_UnJ1V3.js +1 -0
  395. package/web-ui/build/static/python-BeSi3a8_.js +1 -0
  396. package/web-ui/build/static/python-repl-BBmtoedD.js +1 -0
  397. package/web-ui/build/static/q-Ery9rED_.js +1 -0
  398. package/web-ui/build/static/q-OEzRNQWZ.js +1 -0
  399. package/web-ui/build/static/qml-DdHTOYCC.js +1 -0
  400. package/web-ui/build/static/qml-DqjqC3TV.js +1 -0
  401. package/web-ui/build/static/qore-D3qGrct2.js +1 -0
  402. package/web-ui/build/static/qsharp-DdQgHY8o.js +1 -0
  403. package/web-ui/build/static/r-BsnBh-Gb.js +1 -0
  404. package/web-ui/build/static/r-CgLmD3ej.js +1 -0
  405. package/web-ui/build/static/racket-CgSPkQxA.js +1 -0
  406. package/web-ui/build/static/reason-BRJ4xDT3.js +1 -0
  407. package/web-ui/build/static/reasonml-B8V18bIF.js +1 -0
  408. package/web-ui/build/static/regex-C8qp_5tY.js +1 -0
  409. package/web-ui/build/static/rego-B3dQMEmR.js +1 -0
  410. package/web-ui/build/static/renpy-BmlUaEOQ.js +1 -0
  411. package/web-ui/build/static/rest-XlDNtjp0.js +1 -0
  412. package/web-ui/build/static/rib-BfquiuWk.js +1 -0
  413. package/web-ui/build/static/rip-dGRhlG0v.js +1 -0
  414. package/web-ui/build/static/roboconf-CtBSSFaA.js +1 -0
  415. package/web-ui/build/static/roboconf-wrbztr2r.js +1 -0
  416. package/web-ui/build/static/robotframework-BSxuJaY6.js +1 -0
  417. package/web-ui/build/static/routeros-DHKFvEvZ.js +1 -0
  418. package/web-ui/build/static/rsl-BhjvE0Cr.js +1 -0
  419. package/web-ui/build/static/ruby-BMED8W31.js +1 -0
  420. package/web-ui/build/static/ruby-BkE7uZGd.js +1 -0
  421. package/web-ui/build/static/ruleslanguage-DGe1m8Id.js +1 -0
  422. package/web-ui/build/static/rust-CUje9n_P.js +1 -0
  423. package/web-ui/build/static/rust-O67yEsAu.js +1 -0
  424. package/web-ui/build/static/sas-BpDWmnoa.js +1 -0
  425. package/web-ui/build/static/sas-DRBVod_5.js +1 -0
  426. package/web-ui/build/static/sass-CdUBh_kW.js +1 -0
  427. package/web-ui/build/static/scala-BvUTPbg2.js +1 -0
  428. package/web-ui/build/static/scala-DmXpVBFR.js +1 -0
  429. package/web-ui/build/static/scheme-BfzSegEb.js +1 -0
  430. package/web-ui/build/static/scheme-CL7dxV3L.js +1 -0
  431. package/web-ui/build/static/scilab-Bwx8K6ut.js +1 -0
  432. package/web-ui/build/static/scss-Bk3cnVi-.js +1 -0
  433. package/web-ui/build/static/scss-CEq_Uo2G.js +1 -0
  434. package/web-ui/build/static/shell-CH2lH60k.js +1 -0
  435. package/web-ui/build/static/shell-session-Dsc6nnXg.js +1 -0
  436. package/web-ui/build/static/smali-DR57iO-M.js +1 -0
  437. package/web-ui/build/static/smali-QDgUokkE.js +1 -0
  438. package/web-ui/build/static/smalltalk-CNWYoGI5.js +1 -0
  439. package/web-ui/build/static/smalltalk-DuKK00UG.js +1 -0
  440. package/web-ui/build/static/smarty-CM_K74KX.js +1 -0
  441. package/web-ui/build/static/sml-B-u4vtVQ.js +1 -0
  442. package/web-ui/build/static/sml-CnAed_Dv.js +1 -0
  443. package/web-ui/build/static/solidity-Bc_FUKPw.js +1 -0
  444. package/web-ui/build/static/solution-file-CE-Ffn8a.js +1 -0
  445. package/web-ui/build/static/soy-B__lNQNx.js +1 -0
  446. package/web-ui/build/static/sparql-BZnN0yju.js +1 -0
  447. package/web-ui/build/static/splunk-spl-DIs_BiUo.js +1 -0
  448. package/web-ui/build/static/sqf-DNSlhOUj.js +1 -0
  449. package/web-ui/build/static/sqf-DwPev5qJ.js +1 -0
  450. package/web-ui/build/static/sql-C9UaJUCf.js +1 -0
  451. package/web-ui/build/static/sql-DAnJSRyV.js +1 -0
  452. package/web-ui/build/static/sql_more-DMMfa_Zg.js +1 -0
  453. package/web-ui/build/static/squirrel-Bevu4MOl.js +1 -0
  454. package/web-ui/build/static/stan-Bs_yMVnC.js +1 -0
  455. package/web-ui/build/static/stan-Cduy4Z3W.js +1 -0
  456. package/web-ui/build/static/stata-BrHJdKRc.js +1 -0
  457. package/web-ui/build/static/step21-CGhxzCID.js +1 -0
  458. package/web-ui/build/static/stylus-B2lueE5_.js +1 -0
  459. package/web-ui/build/static/stylus-pKniqDuc.js +1 -0
  460. package/web-ui/build/static/subunit-B5WE5S5P.js +1 -0
  461. package/web-ui/build/static/swift-CEi576mT.js +1 -0
  462. package/web-ui/build/static/swift-CQCuFcEK.js +1 -0
  463. package/web-ui/build/static/systemd-CF-EHggg.js +1 -0
  464. package/web-ui/build/static/t4-cs-DWdn0RQB.js +1 -0
  465. package/web-ui/build/static/t4-templating-C15ubdW6.js +1 -0
  466. package/web-ui/build/static/t4-vb-Cz2QCDLO.js +1 -0
  467. package/web-ui/build/static/taggerscript-CfU_hv7J.js +1 -0
  468. package/web-ui/build/static/tap-2-gLM4Lw.js +1 -0
  469. package/web-ui/build/static/tap-M44CQJkj.js +1 -0
  470. package/web-ui/build/static/tcl-BMpkwsCa.js +1 -0
  471. package/web-ui/build/static/tcl-CfF-clAT.js +1 -0
  472. package/web-ui/build/static/textile-CUkgUEkV.js +1 -0
  473. package/web-ui/build/static/thrift-daJZ1DGJ.js +1 -0
  474. package/web-ui/build/static/toml-DnW5prhH.js +1 -0
  475. package/web-ui/build/static/tp-ZqeJLSGg.js +1 -0
  476. package/web-ui/build/static/tremor-WcELDSvz.js +1 -0
  477. package/web-ui/build/static/tsx-BVww6xUP.js +1 -0
  478. package/web-ui/build/static/tt2-Cxt3LLr_.js +1 -0
  479. package/web-ui/build/static/turtle-DmRTxNN8.js +1 -0
  480. package/web-ui/build/static/twig-DcLADpYg.js +1 -0
  481. package/web-ui/build/static/twig-Drdxszx_.js +1 -0
  482. package/web-ui/build/static/typescript-CgVWCuS9.js +1 -0
  483. package/web-ui/build/static/typescript-D3GjnDi9.js +1 -0
  484. package/web-ui/build/static/typoscript-B4qyGuOT.js +1 -0
  485. package/web-ui/build/static/unrealscript-BtIQeIeR.js +1 -0
  486. package/web-ui/build/static/uorazor-eWa_YDYv.js +1 -0
  487. package/web-ui/build/static/uri-CxsgAGHN.js +1 -0
  488. package/web-ui/build/static/v-D84eyWwn.js +1 -0
  489. package/web-ui/build/static/vala-Ccb9w5DW.js +1 -0
  490. package/web-ui/build/static/vala-MsPY7Xer.js +1 -0
  491. package/web-ui/build/static/vbnet-B33DMpXq.js +1 -0
  492. package/web-ui/build/static/vbnet-CaLY-AOH.js +1 -0
  493. package/web-ui/build/static/vbscript-DrXwNwNu.js +1 -0
  494. package/web-ui/build/static/vbscript-html-OTJEVr5m.js +1 -0
  495. package/web-ui/build/static/velocity-q0bXdAL4.js +1 -0
  496. package/web-ui/build/static/verilog-BD-Nxyqa.js +1 -0
  497. package/web-ui/build/static/verilog-PFy9sucN.js +1 -0
  498. package/web-ui/build/static/vhdl-BeCVyLiK.js +1 -0
  499. package/web-ui/build/static/vhdl-CMHdBpc5.js +1 -0
  500. package/web-ui/build/static/vim-3d_DOCsL.js +1 -0
  501. package/web-ui/build/static/vim-Bl5swMbH.js +1 -0
  502. package/web-ui/build/static/visual-basic-CjOvSeMg.js +1 -0
  503. package/web-ui/build/static/warpscript-C2EL35K2.js +1 -0
  504. package/web-ui/build/static/wasm-DmFD8VgH.js +1 -0
  505. package/web-ui/build/static/web-idl-RnzsvoQV.js +1 -0
  506. package/web-ui/build/static/wiki-Bu-zrPhW.js +1 -0
  507. package/web-ui/build/static/wolfram-CYYr3oaW.js +1 -0
  508. package/web-ui/build/static/wren-BXwkGwpn.js +1 -0
  509. package/web-ui/build/static/x86asm-_F19Kl5Y.js +1 -0
  510. package/web-ui/build/static/xeora-BmVPgL2I.js +1 -0
  511. package/web-ui/build/static/xl-68telKZ2.js +1 -0
  512. package/web-ui/build/static/xml-DPdaRgU0.js +1 -0
  513. package/web-ui/build/static/xml-doc-Aa64lijn.js +1 -0
  514. package/web-ui/build/static/xojo-DminlfyC.js +1 -0
  515. package/web-ui/build/static/xquery-BC1P9u6q.js +1 -0
  516. package/web-ui/build/static/xquery-kRz8gtls.js +1 -0
  517. package/web-ui/build/static/yaml-Bh9xHEaX.js +1 -0
  518. package/web-ui/build/static/yaml-CQW4NAe0.js +1 -0
  519. package/web-ui/build/static/yang-joHFzzXq.js +1 -0
  520. package/web-ui/build/static/zephir-BDGPNzsB.js +1 -0
  521. package/web-ui/build/static/zig-DtLmllYo.js +1 -0
  522. package/web-ui/build/static/1c-Cxgysx0K.js +0 -1
  523. package/web-ui/build/static/abap-D9Pd8DUG.js +0 -1
  524. package/web-ui/build/static/abnf-CHs5P8yl.js +0 -1
  525. package/web-ui/build/static/abnf-D5OtFEZO.js +0 -1
  526. package/web-ui/build/static/accesslog-CTD5Frmr.js +0 -1
  527. package/web-ui/build/static/actionscript-BN0BKQI7.js +0 -1
  528. package/web-ui/build/static/actionscript-DQNwbYlU.js +0 -1
  529. package/web-ui/build/static/ada-8O7AmGii.js +0 -1
  530. package/web-ui/build/static/ada-p8y2qCLB.js +0 -1
  531. package/web-ui/build/static/agda-BzT4bKSx.js +0 -1
  532. package/web-ui/build/static/al-Caq7o9RG.js +0 -1
  533. package/web-ui/build/static/angelscript-DivMpSHf.js +0 -1
  534. package/web-ui/build/static/antlr4-B1D_tnKH.js +0 -1
  535. package/web-ui/build/static/apache-l88_LooT.js +0 -1
  536. package/web-ui/build/static/apacheconf-kaxXABFE.js +0 -1
  537. package/web-ui/build/static/apex-CSdSRWUv.js +0 -1
  538. package/web-ui/build/static/apl-CHwVg89T.js +0 -1
  539. package/web-ui/build/static/applescript-C64qdYZf.js +0 -1
  540. package/web-ui/build/static/applescript-CqTGrBVp.js +0 -1
  541. package/web-ui/build/static/aql-BwKKr7z7.js +0 -1
  542. package/web-ui/build/static/arcade-C6oqHEwh.js +0 -1
  543. package/web-ui/build/static/arduino-DB4E20Km.js +0 -1
  544. package/web-ui/build/static/arduino-DKpgmHjE.js +0 -1
  545. package/web-ui/build/static/arff-CBbf8E8O.js +0 -1
  546. package/web-ui/build/static/armasm-Bogg7lrz.js +0 -1
  547. package/web-ui/build/static/asciidoc-3ZlDsfKD.js +0 -1
  548. package/web-ui/build/static/asciidoc-Cc88g_au.js +0 -1
  549. package/web-ui/build/static/asm6502-B4rN-vZ1.js +0 -1
  550. package/web-ui/build/static/asmatmel-B8zZLWGk.js +0 -1
  551. package/web-ui/build/static/aspectj-XdNtCtbN.js +0 -1
  552. package/web-ui/build/static/aspnet-DZVKB5n1.js +0 -1
  553. package/web-ui/build/static/autohotkey-CxDWLQqM.js +0 -1
  554. package/web-ui/build/static/autohotkey-DJStPrtS.js +0 -1
  555. package/web-ui/build/static/autoit-BWirJOCg.js +0 -1
  556. package/web-ui/build/static/autoit-CJcfmsnl.js +0 -1
  557. package/web-ui/build/static/avisynth-C7JQe3L7.js +0 -1
  558. package/web-ui/build/static/avrasm-CMiuHQvu.js +0 -1
  559. package/web-ui/build/static/avro-idl-kaRVyxMP.js +0 -1
  560. package/web-ui/build/static/awk-CQ70Cyh1.js +0 -1
  561. package/web-ui/build/static/axapta-DRxAzlG8.js +0 -1
  562. package/web-ui/build/static/bash-B2XqEYpT.js +0 -1
  563. package/web-ui/build/static/bash-D-D1taMA.js +0 -1
  564. package/web-ui/build/static/basic-Da1x7OIZ.js +0 -1
  565. package/web-ui/build/static/basic-Dslk2ZwT.js +0 -1
  566. package/web-ui/build/static/batch-B0wJNPoF.js +0 -1
  567. package/web-ui/build/static/bbcode-BXDdc2HS.js +0 -1
  568. package/web-ui/build/static/bicep-iiH-nx9J.js +0 -1
  569. package/web-ui/build/static/birb-DuTqqibI.js +0 -1
  570. package/web-ui/build/static/bison-D1Hw6owA.js +0 -1
  571. package/web-ui/build/static/bnf-BRhzfr87.js +0 -1
  572. package/web-ui/build/static/bnf-u1Iy1Ku7.js +0 -1
  573. package/web-ui/build/static/brainfuck-C4R5VJ3_.js +0 -1
  574. package/web-ui/build/static/brainfuck-C8niWF0i.js +0 -1
  575. package/web-ui/build/static/brightscript-DavMfkHx.js +0 -1
  576. package/web-ui/build/static/bro-CEMPoYum.js +0 -1
  577. package/web-ui/build/static/bsl-COeqiMqc.js +0 -1
  578. package/web-ui/build/static/c-BaaVQwFt.js +0 -1
  579. package/web-ui/build/static/c-BvALLiMv.js +0 -1
  580. package/web-ui/build/static/c-like-C4yx6s7b.js +0 -1
  581. package/web-ui/build/static/cal-CSxgKgNR.js +0 -1
  582. package/web-ui/build/static/capnproto-C9cMEmIo.js +0 -1
  583. package/web-ui/build/static/ceylon-Dj67Lf2T.js +0 -1
  584. package/web-ui/build/static/cfscript-BhALECgj.js +0 -1
  585. package/web-ui/build/static/chaiscript-Cg5weNRB.js +0 -1
  586. package/web-ui/build/static/cil-BR-JCsPu.js +0 -1
  587. package/web-ui/build/static/clean-xJMmqZ4X.js +0 -1
  588. package/web-ui/build/static/clojure-9C3tRo_T.js +0 -1
  589. package/web-ui/build/static/clojure-C2KNwa0h.js +0 -1
  590. package/web-ui/build/static/clojure-repl-B-pke3nS.js +0 -1
  591. package/web-ui/build/static/cmake-C0BFHpjZ.js +0 -1
  592. package/web-ui/build/static/cmake-DYoa_Kz_.js +0 -1
  593. package/web-ui/build/static/cobol-Bj_qcMsY.js +0 -1
  594. package/web-ui/build/static/coffeescript-C2KEz8d0.js +0 -1
  595. package/web-ui/build/static/coffeescript-CQsP9N_M.js +0 -1
  596. package/web-ui/build/static/concurnas-Ceu24KQb.js +0 -1
  597. package/web-ui/build/static/coq-CP7VW0bo.js +0 -1
  598. package/web-ui/build/static/coq-DQry0I8v.js +0 -1
  599. package/web-ui/build/static/cos-DAjhu7pi.js +0 -1
  600. package/web-ui/build/static/cpp-BwHJ0JtK.js +0 -1
  601. package/web-ui/build/static/cpp-Dro3stzS.js +0 -1
  602. package/web-ui/build/static/crmsh-Bnwknpi9.js +0 -1
  603. package/web-ui/build/static/crystal-B7TVeIo6.js +0 -1
  604. package/web-ui/build/static/crystal-Cy5JlSrW.js +0 -1
  605. package/web-ui/build/static/csharp-CeouYZK3.js +0 -1
  606. package/web-ui/build/static/csharp-Dv2oxLAS.js +0 -1
  607. package/web-ui/build/static/cshtml-C9IRHsFH.js +0 -1
  608. package/web-ui/build/static/csp-C85pVqYT.js +0 -1
  609. package/web-ui/build/static/csp-MJntgwIj.js +0 -1
  610. package/web-ui/build/static/css-DWTfQjN4.js +0 -1
  611. package/web-ui/build/static/css-extras-BmVbsPjr.js +0 -1
  612. package/web-ui/build/static/csv-zUw-JkSo.js +0 -1
  613. package/web-ui/build/static/cypher-DQOOp0bG.js +0 -1
  614. package/web-ui/build/static/d-B7Cku9c8.js +0 -1
  615. package/web-ui/build/static/d-Lnzvs4Wd.js +0 -1
  616. package/web-ui/build/static/dart-CeK_W9Mg.js +0 -1
  617. package/web-ui/build/static/dart-Z5nwVCn_.js +0 -1
  618. package/web-ui/build/static/dataweave-Bv7GTsiJ.js +0 -1
  619. package/web-ui/build/static/dax-CxkNT7ml.js +0 -1
  620. package/web-ui/build/static/delphi-BnBBHmHI.js +0 -1
  621. package/web-ui/build/static/dhall-DzzkunJZ.js +0 -1
  622. package/web-ui/build/static/diff-BKZzYJzc.js +0 -1
  623. package/web-ui/build/static/diff-BfTiUZV3.js +0 -1
  624. package/web-ui/build/static/django-BY4l8873.js +0 -1
  625. package/web-ui/build/static/django-NRVGlUZ_.js +0 -1
  626. package/web-ui/build/static/dns-Dvc8YawT.js +0 -1
  627. package/web-ui/build/static/dns-zone-file-CkaiOrlK.js +0 -1
  628. package/web-ui/build/static/docker-BQXYNHPO.js +0 -1
  629. package/web-ui/build/static/dockerfile-CkHfYmB1.js +0 -1
  630. package/web-ui/build/static/dos-Cj0YcQAg.js +0 -1
  631. package/web-ui/build/static/dot-zgBkKTS-.js +0 -1
  632. package/web-ui/build/static/dsconfig-Yy07ZSap.js +0 -1
  633. package/web-ui/build/static/dts-DyTWnuFT.js +0 -1
  634. package/web-ui/build/static/dust-CKq7f4u7.js +0 -1
  635. package/web-ui/build/static/ebnf-DJRrwYUt.js +0 -1
  636. package/web-ui/build/static/ebnf-RHbRUELR.js +0 -1
  637. package/web-ui/build/static/editorconfig-BPnyfBW2.js +0 -1
  638. package/web-ui/build/static/eiffel-yj-2JB74.js +0 -1
  639. package/web-ui/build/static/ejs-DitQDEAj.js +0 -1
  640. package/web-ui/build/static/elixir-3QGdRPiZ.js +0 -1
  641. package/web-ui/build/static/elixir-DjVihWJd.js +0 -1
  642. package/web-ui/build/static/elm-BY6TIO5U.js +0 -1
  643. package/web-ui/build/static/elm-CRkIBVgc.js +0 -1
  644. package/web-ui/build/static/erb-Djhpl6Qv.js +0 -1
  645. package/web-ui/build/static/erb-T-e_0q4M.js +0 -1
  646. package/web-ui/build/static/erlang-BHne0Sow.js +0 -1
  647. package/web-ui/build/static/erlang-BwFMbXMn.js +0 -1
  648. package/web-ui/build/static/erlang-repl-BkeLNBB1.js +0 -1
  649. package/web-ui/build/static/etlua-C7wAJl9b.js +0 -1
  650. package/web-ui/build/static/excel-DxE1g8nj.js +0 -1
  651. package/web-ui/build/static/excel-formula-CJfyOSIQ.js +0 -1
  652. package/web-ui/build/static/factor-CoKZ2w9G.js +0 -1
  653. package/web-ui/build/static/false-R3UgYwdZ.js +0 -1
  654. package/web-ui/build/static/firestore-security-rules-Na-FK95T.js +0 -1
  655. package/web-ui/build/static/fix-CvUjGqrP.js +0 -1
  656. package/web-ui/build/static/flix-DZcdobtd.js +0 -1
  657. package/web-ui/build/static/flow-Bs4ybDfF.js +0 -1
  658. package/web-ui/build/static/fortran-Bo7HQHVz.js +0 -1
  659. package/web-ui/build/static/fortran-C01QKAjv.js +0 -1
  660. package/web-ui/build/static/fsharp-Bl0db-E4.js +0 -1
  661. package/web-ui/build/static/fsharp-CyZIu__H.js +0 -1
  662. package/web-ui/build/static/ftl-CWXbnuJ8.js +0 -1
  663. package/web-ui/build/static/gams-BqHeBOiK.js +0 -1
  664. package/web-ui/build/static/gap-Dotaw9CX.js +0 -1
  665. package/web-ui/build/static/gauss-BT78eAPL.js +0 -1
  666. package/web-ui/build/static/gcode-MKCsCHbV.js +0 -1
  667. package/web-ui/build/static/gcode-bZIzS7dq.js +0 -1
  668. package/web-ui/build/static/gdscript-BfFdzROd.js +0 -1
  669. package/web-ui/build/static/gedcom-C-0fkvQT.js +0 -1
  670. package/web-ui/build/static/gherkin-Bgefs1Ac.js +0 -1
  671. package/web-ui/build/static/gherkin-BwLhttSG.js +0 -1
  672. package/web-ui/build/static/git-Cf3XNFwK.js +0 -1
  673. package/web-ui/build/static/glsl-BRBvgtKX.js +0 -1
  674. package/web-ui/build/static/glsl-Ci0Ywihb.js +0 -1
  675. package/web-ui/build/static/gml-BGED3ZV5.js +0 -1
  676. package/web-ui/build/static/gml-Bo5ybH2Z.js +0 -1
  677. package/web-ui/build/static/gn-Dvq3uq8q.js +0 -1
  678. package/web-ui/build/static/go-DEXubI7V.js +0 -1
  679. package/web-ui/build/static/go-DQ-rOBtr.js +0 -1
  680. package/web-ui/build/static/go-module-CJ0C_rZQ.js +0 -1
  681. package/web-ui/build/static/golo-BMZyESOG.js +0 -1
  682. package/web-ui/build/static/gradle-DamtVT5m.js +0 -1
  683. package/web-ui/build/static/graphql-BERukF58.js +0 -1
  684. package/web-ui/build/static/groovy-B-WmRKEQ.js +0 -1
  685. package/web-ui/build/static/groovy-BzgGHCpW.js +0 -1
  686. package/web-ui/build/static/haml-B50hpu0J.js +0 -1
  687. package/web-ui/build/static/haml-vZAqNnLr.js +0 -1
  688. package/web-ui/build/static/handlebars-ChvSiZA5.js +0 -1
  689. package/web-ui/build/static/handlebars-z32GTNvC.js +0 -1
  690. package/web-ui/build/static/haskell-BWLVCHRl.js +0 -1
  691. package/web-ui/build/static/haskell-CZ4HT-QV.js +0 -1
  692. package/web-ui/build/static/haxe-Dff2UzKb.js +0 -1
  693. package/web-ui/build/static/haxe-DtUMfT4Y.js +0 -1
  694. package/web-ui/build/static/hcl-CPdCn21C.js +0 -1
  695. package/web-ui/build/static/hlsl-Ddnzpafa.js +0 -1
  696. package/web-ui/build/static/hoon-BmzYN5g6.js +0 -1
  697. package/web-ui/build/static/hpkp-Cf4BtYzp.js +0 -1
  698. package/web-ui/build/static/hsp-CtNdizh5.js +0 -1
  699. package/web-ui/build/static/hsts-ChmUnrWY.js +0 -1
  700. package/web-ui/build/static/htmlbars-FvxUz397.js +0 -1
  701. package/web-ui/build/static/http-C91BqIc4.js +0 -1
  702. package/web-ui/build/static/http-DUkMpz6R.js +0 -1
  703. package/web-ui/build/static/hy-BgEorqc6.js +0 -1
  704. package/web-ui/build/static/ichigojam-CyJ85XqZ.js +0 -1
  705. package/web-ui/build/static/icon-CWVwUSUB.js +0 -1
  706. package/web-ui/build/static/icu-message-format-DQ5Vf-57.js +0 -1
  707. package/web-ui/build/static/idris-25epvnkz.js +0 -1
  708. package/web-ui/build/static/iecst-D_Q4A3Ao.js +0 -1
  709. package/web-ui/build/static/ignore-Dn3TUem-.js +0 -1
  710. package/web-ui/build/static/index-1GAqwN2P.js +0 -1029
  711. package/web-ui/build/static/index-Bbt0N_qA.css +0 -1
  712. package/web-ui/build/static/index-COM0znG6.js +0 -13
  713. package/web-ui/build/static/index-Cq1FjdFd.js +0 -1
  714. package/web-ui/build/static/inform7-CFrNuUCE.js +0 -1
  715. package/web-ui/build/static/inform7-DKEqg7Td.js +0 -1
  716. package/web-ui/build/static/ini-C-WeV3rA.js +0 -1
  717. package/web-ui/build/static/ini-DNeLlQLb.js +0 -1
  718. package/web-ui/build/static/io-CHx2lS-R.js +0 -1
  719. package/web-ui/build/static/irpf90-D4fNrYKT.js +0 -1
  720. package/web-ui/build/static/isbl-BwxgZUmw.js +0 -1
  721. package/web-ui/build/static/j-EkuSi-Ss.js +0 -1
  722. package/web-ui/build/static/java-BtphFsNb.js +0 -1
  723. package/web-ui/build/static/java-D6Ksxtks.js +0 -1
  724. package/web-ui/build/static/javadoc-COfrpXIF.js +0 -1
  725. package/web-ui/build/static/javadoclike-C0DIBgSo.js +0 -1
  726. package/web-ui/build/static/javascript-D9_bdns_.js +0 -1
  727. package/web-ui/build/static/javastacktrace-BgesTIoE.js +0 -1
  728. package/web-ui/build/static/jboss-cli-BCBm8RaA.js +0 -1
  729. package/web-ui/build/static/jexl-Bur7gjJl.js +0 -1
  730. package/web-ui/build/static/jolie-CG2HtqVF.js +0 -1
  731. package/web-ui/build/static/jq-BjcZo4Ta.js +0 -1
  732. package/web-ui/build/static/js-extras-DPWP-xWb.js +0 -1
  733. package/web-ui/build/static/js-templates-BYQFylC_.js +0 -1
  734. package/web-ui/build/static/jsdoc-CiOxmgl5.js +0 -1
  735. package/web-ui/build/static/json-C2-b3Xpo.js +0 -1
  736. package/web-ui/build/static/json-D7ok2MJS.js +0 -1
  737. package/web-ui/build/static/json5-DRNOdkus.js +0 -1
  738. package/web-ui/build/static/jsonp-FFJzAxUk.js +0 -1
  739. package/web-ui/build/static/jsstacktrace-C4ki-LaP.js +0 -1
  740. package/web-ui/build/static/jsx-ZxGQpUNq.js +0 -1
  741. package/web-ui/build/static/julia-7ooB8a4b.js +0 -1
  742. package/web-ui/build/static/julia-DzjCRNEr.js +0 -1
  743. package/web-ui/build/static/julia-repl-pceaZSLt.js +0 -1
  744. package/web-ui/build/static/keepalived-BQgTZddo.js +0 -1
  745. package/web-ui/build/static/keyman-Cqlba6tn.js +0 -1
  746. package/web-ui/build/static/kotlin-BygmvqBG.js +0 -1
  747. package/web-ui/build/static/kotlin-DrN0ycN8.js +0 -1
  748. package/web-ui/build/static/kumir-YhasANvI.js +0 -1
  749. package/web-ui/build/static/kusto-LQa6MD2B.js +0 -1
  750. package/web-ui/build/static/lasso-Ca3RFbcE.js +0 -1
  751. package/web-ui/build/static/latex-BoQj21fG.js +0 -1
  752. package/web-ui/build/static/latex-ZxewREOs.js +0 -1
  753. package/web-ui/build/static/latte-40SpSG4q.js +0 -1
  754. package/web-ui/build/static/ldif-CzTJxBjJ.js +0 -1
  755. package/web-ui/build/static/leaf-DO9LaVNe.js +0 -1
  756. package/web-ui/build/static/less-BoClFdvD.js +0 -1
  757. package/web-ui/build/static/less-C1s1U6-n.js +0 -1
  758. package/web-ui/build/static/lilypond-D5wHKW8A.js +0 -1
  759. package/web-ui/build/static/liquid-BRQzL-S2.js +0 -1
  760. package/web-ui/build/static/lisp-8q-QRYKi.js +0 -1
  761. package/web-ui/build/static/lisp-J8TPaPPb.js +0 -1
  762. package/web-ui/build/static/livecodeserver-Dcr3yGmD.js +0 -1
  763. package/web-ui/build/static/livescript-BUEQmlAe.js +0 -1
  764. package/web-ui/build/static/livescript-DsId63Ot.js +0 -1
  765. package/web-ui/build/static/llvm-B3CCzYxo.js +0 -1
  766. package/web-ui/build/static/llvm-kQGfyqnj.js +0 -1
  767. package/web-ui/build/static/log-BlA5152b.js +0 -1
  768. package/web-ui/build/static/lolcode-8WRAMeb2.js +0 -1
  769. package/web-ui/build/static/lsl-BZUMQNE2.js +0 -1
  770. package/web-ui/build/static/lua-C4hJ-Gql.js +0 -1
  771. package/web-ui/build/static/lua-RxOeZV_z.js +0 -1
  772. package/web-ui/build/static/magma-U9kYv2QD.js +0 -1
  773. package/web-ui/build/static/makefile-1Cu2rVDg.js +0 -1
  774. package/web-ui/build/static/makefile-mmZ8lbad.js +0 -1
  775. package/web-ui/build/static/markdown-CCqDOXhR.js +0 -1
  776. package/web-ui/build/static/markdown-CVOmqzdD.js +0 -1
  777. package/web-ui/build/static/markup-templating-C7eiVR0j.js +0 -1
  778. package/web-ui/build/static/mathematica-BbKHQ6zH.js +0 -1
  779. package/web-ui/build/static/matlab-BbMwJ6T0.js +0 -1
  780. package/web-ui/build/static/matlab-gHn5UhMb.js +0 -1
  781. package/web-ui/build/static/maxima-CuB3n0ri.js +0 -1
  782. package/web-ui/build/static/maxscript-jhOix4gn.js +0 -1
  783. package/web-ui/build/static/mel-Bpjqa7Ec.js +0 -1
  784. package/web-ui/build/static/mel-QxMxBq03.js +0 -1
  785. package/web-ui/build/static/mercury-C8IdDyFB.js +0 -1
  786. package/web-ui/build/static/mermaid-v41WDixf.js +0 -1
  787. package/web-ui/build/static/mipsasm-kYH27KXy.js +0 -1
  788. package/web-ui/build/static/mizar-BCJI9Jxa.js +0 -1
  789. package/web-ui/build/static/mizar-BCxP_6pj.js +0 -1
  790. package/web-ui/build/static/mojolicious-C7DC_CUp.js +0 -1
  791. package/web-ui/build/static/mongodb-DvBX00WY.js +0 -1
  792. package/web-ui/build/static/monkey-B7KjOZtt.js +0 -1
  793. package/web-ui/build/static/monkey-CFKZd6lx.js +0 -1
  794. package/web-ui/build/static/moonscript-44jD_uAZ.js +0 -1
  795. package/web-ui/build/static/moonscript-B3KahKf5.js +0 -1
  796. package/web-ui/build/static/n1ql-CxJOkBbD.js +0 -1
  797. package/web-ui/build/static/n1ql-FJFE6P7E.js +0 -1
  798. package/web-ui/build/static/n4js-D5jJTGdO.js +0 -1
  799. package/web-ui/build/static/nand2tetris-hdl-DlsCaky2.js +0 -1
  800. package/web-ui/build/static/naniscript-C3YsvWgN.js +0 -1
  801. package/web-ui/build/static/nasm-DCGKvOZq.js +0 -1
  802. package/web-ui/build/static/neon-nyFNinx-.js +0 -1
  803. package/web-ui/build/static/nevod-C5PnMzAW.js +0 -1
  804. package/web-ui/build/static/nginx-BUgMakda.js +0 -1
  805. package/web-ui/build/static/nginx-C5JBKsuz.js +0 -1
  806. package/web-ui/build/static/nim-BFu6fQgc.js +0 -1
  807. package/web-ui/build/static/nim-D0uh-nR9.js +0 -1
  808. package/web-ui/build/static/nix-BiOn3l1e.js +0 -1
  809. package/web-ui/build/static/nix-tapJszPl.js +0 -1
  810. package/web-ui/build/static/node-repl-BTp9CFzE.js +0 -1
  811. package/web-ui/build/static/nsis-B7hV5A06.js +0 -1
  812. package/web-ui/build/static/nsis-DLshnCv-.js +0 -1
  813. package/web-ui/build/static/objectivec-BKjt_sKE.js +0 -1
  814. package/web-ui/build/static/objectivec-KUMYgk5w.js +0 -1
  815. package/web-ui/build/static/ocaml-CV2nKA_A.js +0 -1
  816. package/web-ui/build/static/ocaml-ZyZ-dXmE.js +0 -1
  817. package/web-ui/build/static/opencl-igIWfc0n.js +0 -1
  818. package/web-ui/build/static/openqasm-ByCPmCpS.js +0 -1
  819. package/web-ui/build/static/openscad-Db6ypam1.js +0 -1
  820. package/web-ui/build/static/oxygene-CBbaQWRB.js +0 -1
  821. package/web-ui/build/static/oz-lEl_mXVw.js +0 -1
  822. package/web-ui/build/static/parigp-c2FbheBr.js +0 -1
  823. package/web-ui/build/static/parser-Ba6uivHf.js +0 -1
  824. package/web-ui/build/static/parser3-Cm5cgVSQ.js +0 -1
  825. package/web-ui/build/static/pascal-JgY-dd52.js +0 -1
  826. package/web-ui/build/static/pascaligo-BjSdyegq.js +0 -1
  827. package/web-ui/build/static/pcaxis-CDdxDfqJ.js +0 -1
  828. package/web-ui/build/static/peoplecode-BCPhsbK6.js +0 -1
  829. package/web-ui/build/static/perl-ClVPikLH.js +0 -1
  830. package/web-ui/build/static/perl-pRjXJ4uc.js +0 -1
  831. package/web-ui/build/static/pf-D6VrFfuf.js +0 -1
  832. package/web-ui/build/static/pgsql-DAv4ezCU.js +0 -1
  833. package/web-ui/build/static/php-Bz3Bn1G_.js +0 -1
  834. package/web-ui/build/static/php-extras-B8k1hZ7O.js +0 -1
  835. package/web-ui/build/static/php-template-DJJiMC8Q.js +0 -1
  836. package/web-ui/build/static/php-zCXGNRnB.js +0 -1
  837. package/web-ui/build/static/phpdoc-CpnPjGDk.js +0 -1
  838. package/web-ui/build/static/plaintext-BRkRKfKN.js +0 -1
  839. package/web-ui/build/static/plsql-BARhkvBo.js +0 -1
  840. package/web-ui/build/static/pony-guYTDEtj.js +0 -1
  841. package/web-ui/build/static/powerquery-DcM2Yj3O.js +0 -1
  842. package/web-ui/build/static/powershell-DJ8ftCxt.js +0 -1
  843. package/web-ui/build/static/powershell-DSRUQzqt.js +0 -1
  844. package/web-ui/build/static/processing-BCmW5Adu.js +0 -1
  845. package/web-ui/build/static/processing-DDMjYIa-.js +0 -1
  846. package/web-ui/build/static/profile-C9J13WXr.js +0 -1
  847. package/web-ui/build/static/prolog-CUyUfIUU.js +0 -1
  848. package/web-ui/build/static/prolog-wjvrQEy3.js +0 -1
  849. package/web-ui/build/static/promql-BkN3_kL1.js +0 -1
  850. package/web-ui/build/static/properties-B7zGUFLC.js +0 -1
  851. package/web-ui/build/static/properties-DHKWbrVz.js +0 -1
  852. package/web-ui/build/static/protobuf-CVwMi4py.js +0 -1
  853. package/web-ui/build/static/protobuf-CWUzVSVD.js +0 -1
  854. package/web-ui/build/static/psl-DdX6HMd3.js +0 -1
  855. package/web-ui/build/static/pug-D-Sn469u.js +0 -1
  856. package/web-ui/build/static/puppet-B6ZR9-D4.js +0 -1
  857. package/web-ui/build/static/puppet-m66LRiIo.js +0 -1
  858. package/web-ui/build/static/pure-7deZH-sc.js +0 -1
  859. package/web-ui/build/static/purebasic-DQLUcurt.js +0 -1
  860. package/web-ui/build/static/purebasic-DYMw9jTh.js +0 -1
  861. package/web-ui/build/static/purescript-DpysoAya.js +0 -1
  862. package/web-ui/build/static/python-D66_vufV.js +0 -1
  863. package/web-ui/build/static/python-DYxaIENO.js +0 -1
  864. package/web-ui/build/static/python-repl-DPjvQNxf.js +0 -1
  865. package/web-ui/build/static/q-DDHNKITB.js +0 -1
  866. package/web-ui/build/static/q-xV1Q9ILw.js +0 -1
  867. package/web-ui/build/static/qml-DSENM1u-.js +0 -1
  868. package/web-ui/build/static/qml-DfhbPQ-t.js +0 -1
  869. package/web-ui/build/static/qore-LQCffrzv.js +0 -1
  870. package/web-ui/build/static/qsharp-BcSf2ZGH.js +0 -1
  871. package/web-ui/build/static/r-Dc6GR0yQ.js +0 -1
  872. package/web-ui/build/static/r-vludgk3t.js +0 -1
  873. package/web-ui/build/static/racket-DJYIkQwh.js +0 -1
  874. package/web-ui/build/static/reason-D75i_ede.js +0 -1
  875. package/web-ui/build/static/reasonml-DhRXKjo3.js +0 -1
  876. package/web-ui/build/static/regex-D67iENuu.js +0 -1
  877. package/web-ui/build/static/rego-CJ2Eeb4g.js +0 -1
  878. package/web-ui/build/static/renpy-DUDNyFqb.js +0 -1
  879. package/web-ui/build/static/rest-Dn7SYTNt.js +0 -1
  880. package/web-ui/build/static/rib-BVUY5dIb.js +0 -1
  881. package/web-ui/build/static/rip-Bu9K3Hu9.js +0 -1
  882. package/web-ui/build/static/roboconf-CUzY2sLf.js +0 -1
  883. package/web-ui/build/static/roboconf-DBEmoD-Z.js +0 -1
  884. package/web-ui/build/static/robotframework-70EV7ffL.js +0 -1
  885. package/web-ui/build/static/routeros-KgfwmDVO.js +0 -1
  886. package/web-ui/build/static/rsl-D3oCnFGa.js +0 -1
  887. package/web-ui/build/static/ruby-Dqa0HtB4.js +0 -1
  888. package/web-ui/build/static/ruby-PeJYeL87.js +0 -1
  889. package/web-ui/build/static/ruleslanguage-vo3eM_mz.js +0 -1
  890. package/web-ui/build/static/rust-CwU6t4_Y.js +0 -1
  891. package/web-ui/build/static/rust-WXADYh9r.js +0 -1
  892. package/web-ui/build/static/sas-Cg6ADdDH.js +0 -1
  893. package/web-ui/build/static/sas-DWoEaeXv.js +0 -1
  894. package/web-ui/build/static/sass-DbHJHeBV.js +0 -1
  895. package/web-ui/build/static/scala-B6oE2QKr.js +0 -1
  896. package/web-ui/build/static/scala-NFQGPaYa.js +0 -1
  897. package/web-ui/build/static/scheme-C8Jx4oX7.js +0 -1
  898. package/web-ui/build/static/scheme-CUMBJaUf.js +0 -1
  899. package/web-ui/build/static/scilab-D1VqsdSy.js +0 -1
  900. package/web-ui/build/static/scss-CSH87oUD.js +0 -1
  901. package/web-ui/build/static/scss-GLX6NNDB.js +0 -1
  902. package/web-ui/build/static/shell-CbOhN21M.js +0 -1
  903. package/web-ui/build/static/shell-session-BQPdJJZS.js +0 -1
  904. package/web-ui/build/static/smali-BYbEOQX5.js +0 -1
  905. package/web-ui/build/static/smali-DcoYSibw.js +0 -1
  906. package/web-ui/build/static/smalltalk-CQkedD8N.js +0 -1
  907. package/web-ui/build/static/smalltalk-DihI81Cd.js +0 -1
  908. package/web-ui/build/static/smarty-RRvllERL.js +0 -1
  909. package/web-ui/build/static/sml-BJkMhBLU.js +0 -1
  910. package/web-ui/build/static/sml-Bm2IN0wP.js +0 -1
  911. package/web-ui/build/static/solidity-CsCW8kyX.js +0 -1
  912. package/web-ui/build/static/solution-file-B5YSxWQt.js +0 -1
  913. package/web-ui/build/static/soy-Dek2_YCW.js +0 -1
  914. package/web-ui/build/static/sparql-BeTxhWa4.js +0 -1
  915. package/web-ui/build/static/splunk-spl-hq6BW85c.js +0 -1
  916. package/web-ui/build/static/sqf-C-u4en-i.js +0 -1
  917. package/web-ui/build/static/sqf-DP0IhDYt.js +0 -1
  918. package/web-ui/build/static/sql-BzL0uonb.js +0 -1
  919. package/web-ui/build/static/sql-Zy6tV_us.js +0 -1
  920. package/web-ui/build/static/sql_more-BP2G6Vh5.js +0 -1
  921. package/web-ui/build/static/squirrel-C3MnMYx5.js +0 -1
  922. package/web-ui/build/static/stan-7iKo211G.js +0 -1
  923. package/web-ui/build/static/stan-C1lcIZjJ.js +0 -1
  924. package/web-ui/build/static/stata-DJ6GKcaw.js +0 -1
  925. package/web-ui/build/static/step21-Pg-uClDB.js +0 -1
  926. package/web-ui/build/static/stylus-DFAxYuRi.js +0 -1
  927. package/web-ui/build/static/stylus-DT6xc_Nv.js +0 -1
  928. package/web-ui/build/static/subunit-aGvGJXZZ.js +0 -1
  929. package/web-ui/build/static/swift-Sqmdmb4O.js +0 -1
  930. package/web-ui/build/static/swift-cUX-MVl4.js +0 -1
  931. package/web-ui/build/static/systemd-qIaU0Trg.js +0 -1
  932. package/web-ui/build/static/t4-cs-DtO6Bgg1.js +0 -1
  933. package/web-ui/build/static/t4-templating-DSSM2N5M.js +0 -1
  934. package/web-ui/build/static/t4-vb-tKIiE5uC.js +0 -1
  935. package/web-ui/build/static/taggerscript-Dt2Kgr-W.js +0 -1
  936. package/web-ui/build/static/tap-BMEgEMIk.js +0 -1
  937. package/web-ui/build/static/tap-C4TdzsNz.js +0 -1
  938. package/web-ui/build/static/tcl-B6k4Af9f.js +0 -1
  939. package/web-ui/build/static/tcl-Dq4_i5q5.js +0 -1
  940. package/web-ui/build/static/textile-C0uqAPk0.js +0 -1
  941. package/web-ui/build/static/thrift-DybQEjaA.js +0 -1
  942. package/web-ui/build/static/toml-DG1a2FSS.js +0 -1
  943. package/web-ui/build/static/tp-BwdfEEST.js +0 -1
  944. package/web-ui/build/static/tremor-JSTukmt-.js +0 -1
  945. package/web-ui/build/static/tsx-YUfsqzPf.js +0 -1
  946. package/web-ui/build/static/tt2-D9A_ACnF.js +0 -1
  947. package/web-ui/build/static/turtle-BKxwLa_-.js +0 -1
  948. package/web-ui/build/static/twig-BeEDK9Ri.js +0 -1
  949. package/web-ui/build/static/twig-TnOWwD7-.js +0 -1
  950. package/web-ui/build/static/typescript-BjZl8C3q.js +0 -1
  951. package/web-ui/build/static/typescript-qtW5Xh-j.js +0 -1
  952. package/web-ui/build/static/typoscript-Dj4sO7Jx.js +0 -1
  953. package/web-ui/build/static/unrealscript-DInimzNQ.js +0 -1
  954. package/web-ui/build/static/uorazor-B_9tFVKw.js +0 -1
  955. package/web-ui/build/static/uri-CTuMA7_k.js +0 -1
  956. package/web-ui/build/static/v-CvE0Ujqx.js +0 -1
  957. package/web-ui/build/static/vala-CLGf3xEs.js +0 -1
  958. package/web-ui/build/static/vala-Dm8LmEpm.js +0 -1
  959. package/web-ui/build/static/vbnet-Cwm2TjGP.js +0 -1
  960. package/web-ui/build/static/vbnet-LCd9GiMJ.js +0 -1
  961. package/web-ui/build/static/vbscript-DVj94_-y.js +0 -1
  962. package/web-ui/build/static/vbscript-html-CDHtSX-o.js +0 -1
  963. package/web-ui/build/static/velocity-C-OrhdDf.js +0 -1
  964. package/web-ui/build/static/verilog-Bh18N7TM.js +0 -1
  965. package/web-ui/build/static/verilog-C-YNXb8j.js +0 -1
  966. package/web-ui/build/static/vhdl-BFNm41_R.js +0 -1
  967. package/web-ui/build/static/vhdl-CyLgBDKk.js +0 -1
  968. package/web-ui/build/static/vim-BTafUqR0.js +0 -1
  969. package/web-ui/build/static/vim-Xg1pEHJe.js +0 -1
  970. package/web-ui/build/static/visual-basic-CDgUOlvq.js +0 -1
  971. package/web-ui/build/static/warpscript-1ELDmkt5.js +0 -1
  972. package/web-ui/build/static/wasm-C25KdQk5.js +0 -1
  973. package/web-ui/build/static/web-idl-CsdVYgpL.js +0 -1
  974. package/web-ui/build/static/wiki-4RrZuyhV.js +0 -1
  975. package/web-ui/build/static/wolfram-DMiRIwvp.js +0 -1
  976. package/web-ui/build/static/wren-Vk5PBcVB.js +0 -1
  977. package/web-ui/build/static/x86asm-D9TFTgye.js +0 -1
  978. package/web-ui/build/static/xeora-SAn_K3Ts.js +0 -1
  979. package/web-ui/build/static/xl-Da2Fl8D9.js +0 -1
  980. package/web-ui/build/static/xml-CeLm6l4V.js +0 -1
  981. package/web-ui/build/static/xml-doc-DypYH408.js +0 -1
  982. package/web-ui/build/static/xojo-CrfMiv1-.js +0 -1
  983. package/web-ui/build/static/xquery-8tOqVkgP.js +0 -1
  984. package/web-ui/build/static/xquery-CLOnNPtx.js +0 -1
  985. package/web-ui/build/static/yaml-CXiycPmU.js +0 -1
  986. package/web-ui/build/static/yaml-cIKjKW-H.js +0 -1
  987. package/web-ui/build/static/yang-KVshO9Ce.js +0 -1
  988. package/web-ui/build/static/zephir-B88JNqlj.js +0 -1
  989. package/web-ui/build/static/zig-C6GYIeFs.js +0 -1
@@ -10,6 +10,9 @@
10
10
  */
11
11
 
12
12
  import { AGENT_MODES } from '../utilities/constants.js';
13
+ import { validateFlowDefinition } from './flowSchema.js';
14
+ import { assembleNodeInputs } from './flowFieldMapping.js';
15
+ import { runWithRetry, FlowRetryError } from './flowRetry.js';
13
16
 
14
17
  class FlowExecutor {
15
18
  constructor(config, logger, stateManager, agentPool, messageProcessor) {
@@ -27,6 +30,40 @@ class FlowExecutor {
27
30
 
28
31
  // Completion listeners per run
29
32
  this.completionListeners = new Map();
33
+
34
+ // Phase 8: agentId → currently-awaited node contract.
35
+ // Set when an agent is invoked inside a flow node; cleared when
36
+ // the await resolves. The jobdone tool reads this to validate
37
+ // the agent's job-done call AT TOOL TIME — rejecting partial
38
+ // calls before they propagate into the executor.
39
+ this.activeContracts = new Map();
40
+
41
+ // Optional disk checkpointing — when set, every successful node
42
+ // persists its result so the run can resume after a crash. Off by
43
+ // default (preserves pre-Phase-4 behavior; opt in via setCheckpointStore).
44
+ this.checkpointStore = null;
45
+ }
46
+
47
+ /**
48
+ * Phase 8: get the currently-awaited node contract for an agent (if any).
49
+ * Returns the contract object { inputs, outputs, instructions, ... } so
50
+ * the jobdone tool can validate the agent's call against it AT TOOL TIME
51
+ * — much faster recovery than waiting for executor-level re-prompts.
52
+ *
53
+ * @param {string} agentId
54
+ * @returns {object|null} the contract, or null when the agent isn't in
55
+ * a flow step right now.
56
+ */
57
+ getActiveContract(agentId) {
58
+ return this.activeContracts.get(agentId) || null;
59
+ }
60
+
61
+ /**
62
+ * Phase 4: enable disk checkpoints + resume by injecting a store.
63
+ * Calling with null disables checkpointing.
64
+ */
65
+ setCheckpointStore(store) {
66
+ this.checkpointStore = store || null;
30
67
  }
31
68
 
32
69
  /**
@@ -51,6 +88,21 @@ class FlowExecutor {
51
88
  throw new Error(`Flow not found: ${flowId}`);
52
89
  }
53
90
 
91
+ // Belt-and-suspenders schema check. The POST/PUT routes already gate
92
+ // on this, but flows can also be authored by importing JSON files
93
+ // directly into the index, or by older clients that bypassed the
94
+ // route. Catching here means we never queue agents on a flow that
95
+ // we can't actually execute. Errors include path so the caller can
96
+ // surface them in the run-detail view.
97
+ const validation = validateFlowDefinition(flow);
98
+ if (!validation.ok) {
99
+ const detail = validation.errors.map(e => e.message).join('; ');
100
+ this.logger.warn(`Flow ${flowId} failed schema validation; refusing to execute`, {
101
+ errors: validation.errors,
102
+ });
103
+ throw new Error(`Flow definition is invalid: ${detail}`);
104
+ }
105
+
54
106
  // Create flow run record
55
107
  const run = await this.stateManager.createFlowRun(flowId, initialInput);
56
108
  const runId = run.id;
@@ -71,8 +123,13 @@ class FlowExecutor {
71
123
  startedAt: new Date()
72
124
  });
73
125
 
74
- // Update run status to running
75
- await this.stateManager.updateFlowRun(runId, { status: 'running' });
126
+ // Update run status to running. Phase 6.3: stamp the flow's
127
+ // current version onto the run so we can later answer "which
128
+ // definition produced this output?" — important after rollbacks.
129
+ await this.stateManager.updateFlowRun(runId, {
130
+ status: 'running',
131
+ flowVersion: flow.version ?? null,
132
+ });
76
133
  const startedAt = new Date().toISOString();
77
134
  this.broadcastFlowUpdate(sessionId, {
78
135
  type: 'flow_run_started',
@@ -120,6 +177,14 @@ class FlowExecutor {
120
177
  return { runId, status: 'stopped' };
121
178
  }
122
179
 
180
+ // Phase 4: skip nodes already completed in a previous run that
181
+ // we're resuming from. Their outputs were rehydrated into
182
+ // context.nodeOutputs by resumeFlow before the loop started.
183
+ if (context.skipCompletedNodeIds?.has?.(node.id)) {
184
+ this.logger.info(`Flow ${flowId}: skipping already-completed node ${node.id} on resume`);
185
+ continue;
186
+ }
187
+
123
188
  // Execute node
124
189
  const nodeResult = await this.executeNode(node, context, runId, sessionId, flow);
125
190
 
@@ -133,6 +198,18 @@ class FlowExecutor {
133
198
 
134
199
  // Update node state in run
135
200
  await this.updateNodeState(runId, node.id, 'completed', nodeResult);
201
+
202
+ // Phase 4: persist a checkpoint after each successful node so a
203
+ // resume can skip back here. Best-effort — checkpoint failures
204
+ // don't fail the run (we'd rather complete without resumability
205
+ // than blow up because disk is full).
206
+ if (this.checkpointStore) {
207
+ try {
208
+ await this.checkpointStore.saveNodeResult(runId, node.id, nodeResult);
209
+ } catch (err) {
210
+ this.logger.warn(`Flow ${flowId}: failed to checkpoint node ${node.id}`, { error: err.message });
211
+ }
212
+ }
136
213
  }
137
214
 
138
215
  // Flow completed successfully
@@ -182,6 +259,111 @@ class FlowExecutor {
182
259
  }
183
260
  }
184
261
 
262
+ /**
263
+ * Phase 4: resume a previously-failed or interrupted run.
264
+ *
265
+ * Loads the run record + per-node checkpoints, rehydrates the
266
+ * execution context with all completed nodes' outputs, and re-runs
267
+ * the loop. The standard executeFlow loop skips any node whose ID is
268
+ * present in `context.skipCompletedNodeIds`, so completed work isn't
269
+ * repeated.
270
+ *
271
+ * Requires `setCheckpointStore` to have been called — without it,
272
+ * there are no per-node checkpoints to read and resume is a no-op
273
+ * fall-through.
274
+ *
275
+ * @param {string} runId
276
+ * @param {string|null} sessionId
277
+ * @returns {Promise<{ runId, status, output? }>}
278
+ */
279
+ async resumeFlow(runId, sessionId = null) {
280
+ if (!this.checkpointStore) {
281
+ throw new Error('Cannot resume: no checkpoint store configured (call setCheckpointStore first)');
282
+ }
283
+
284
+ const run = await this.stateManager.getFlowRun(runId);
285
+ if (!run) throw new Error(`Cannot resume: flow run not found: ${runId}`);
286
+ if (run.status === 'completed') {
287
+ return { runId, status: 'completed', output: run.output };
288
+ }
289
+
290
+ const flow = await this.stateManager.getFlow(run.flowId);
291
+ if (!flow) throw new Error(`Cannot resume: flow definition not found: ${run.flowId}`);
292
+
293
+ // Same schema gate as executeFlow — the flow definition might have
294
+ // been edited between runs into an invalid shape.
295
+ const validation = validateFlowDefinition(flow);
296
+ if (!validation.ok) {
297
+ const detail = validation.errors.map(e => e.message).join('; ');
298
+ throw new Error(`Cannot resume: flow definition is invalid: ${detail}`);
299
+ }
300
+
301
+ // Rehydrate completed-node outputs from disk.
302
+ const persistedOutputs = await this.checkpointStore.loadAllNodeResults(runId);
303
+ const completedIds = new Set(Object.keys(persistedOutputs));
304
+ this.logger.info(`Resuming flow ${run.flowId} run ${runId}`, {
305
+ completedNodes: completedIds.size,
306
+ totalNodes: flow.nodes.length,
307
+ });
308
+
309
+ this.activeExecutions.set(runId, {
310
+ flowId: run.flowId, flow, runId, sessionId,
311
+ status: 'running', startedAt: new Date(),
312
+ });
313
+ await this.stateManager.updateFlowRun(runId, { status: 'running', resumedAt: new Date().toISOString() });
314
+ this.broadcastFlowUpdate(sessionId, { type: 'flow_run_resumed', runId, flowId: run.flowId });
315
+
316
+ try {
317
+ await this.ensureAgentsLoaded(flow.nodes);
318
+ const sortedNodes = this.topologicalSort(flow.nodes, flow.edges);
319
+ if (sortedNodes.length === 0) throw new Error('Flow has no executable nodes');
320
+
321
+ const context = {
322
+ input: run.initialInput?.userInput || run.initialInput?.input || '',
323
+ nodeOutputs: { ...persistedOutputs },
324
+ variables: { ...flow.variables },
325
+ sortedNodes,
326
+ flow,
327
+ skipCompletedNodeIds: completedIds,
328
+ };
329
+
330
+ for (const node of sortedNodes) {
331
+ const execution = this.activeExecutions.get(runId);
332
+ if (!execution || execution.status === 'stopped') {
333
+ await this.stateManager.updateFlowRun(runId, { status: 'stopped', completedAt: new Date().toISOString() });
334
+ this.broadcastFlowUpdate(sessionId, { type: 'flow_run_stopped', runId, flowId: run.flowId });
335
+ return { runId, status: 'stopped' };
336
+ }
337
+ if (completedIds.has(node.id)) {
338
+ this.logger.info(`Resume: skipping already-completed node ${node.id}`);
339
+ continue;
340
+ }
341
+ const nodeResult = await this.executeNode(node, context, runId, sessionId, flow);
342
+ context.nodeOutputs[node.id] = nodeResult;
343
+ if (node.data?.outputKey) context.nodeOutputs[node.data.outputKey] = nodeResult;
344
+ await this.updateNodeState(runId, node.id, 'completed', nodeResult);
345
+ try { await this.checkpointStore.saveNodeResult(runId, node.id, nodeResult); }
346
+ catch (err) { this.logger.warn(`Resume: checkpoint save failed for ${node.id}`, { error: err.message }); }
347
+ }
348
+
349
+ const finalOutput = this.collectFinalOutput(sortedNodes, context);
350
+ await this.stateManager.updateFlowRun(runId, {
351
+ status: 'completed', output: finalOutput, completedAt: new Date().toISOString(),
352
+ });
353
+ this.broadcastFlowUpdate(sessionId, { type: 'flow_run_completed', runId, flowId: run.flowId, output: finalOutput });
354
+ this.activeExecutions.delete(runId);
355
+ return { runId, status: 'completed', output: finalOutput };
356
+ } catch (error) {
357
+ this.logger.error(`Flow resume failed: ${run.flowId}`, { runId, error: error.message });
358
+ await this.stateManager.updateFlowRun(runId, {
359
+ status: 'failed', error: error.message, completedAt: new Date().toISOString(),
360
+ });
361
+ this.broadcastFlowUpdate(sessionId, { type: 'flow_run_failed', runId, flowId: run.flowId, error: error.message });
362
+ this.activeExecutions.delete(runId);
363
+ return { runId, status: 'failed', error: error.message };
364
+ }
365
+ }
366
+
185
367
  /**
186
368
  * Stop a flow execution
187
369
  * @param {string} runId - Run identifier
@@ -210,6 +392,21 @@ class FlowExecutor {
210
392
  async ensureAgentsLoaded(nodes) {
211
393
  if (!nodes || nodes.length === 0) return;
212
394
 
395
+ // First: surface ALL agent nodes that have no agentId at all (e.g.
396
+ // a template was loaded but the user hasn't picked agents yet).
397
+ // Better one clear "you haven't filled in N agents yet" than a
398
+ // confusing chain of partial loads followed by a "name === ''" error.
399
+ const unbound = nodes.filter(n =>
400
+ n.type === 'agent' &&
401
+ (typeof n.data?.agentId !== 'string' || n.data.agentId.trim().length === 0)
402
+ );
403
+ if (unbound.length > 0) {
404
+ const labels = unbound.map(n => n.data?.label || n.id).join(', ');
405
+ throw new Error(
406
+ `Cannot run flow: ${unbound.length} agent node(s) have no agent assigned (${labels}). Open each node and pick an agent in the properties panel.`
407
+ );
408
+ }
409
+
213
410
  // Extract agent IDs from agent nodes
214
411
  const agentNodes = nodes.filter(n => n.type === 'agent' && n.data?.agentId);
215
412
  const agentIds = [...new Set(agentNodes.map(n => n.data.agentId))];
@@ -235,18 +432,33 @@ class FlowExecutor {
235
432
  const agent = await this.stateManager.importArchivedAgent(agentId, projectDir, this.agentPool);
236
433
  this.logger.info(`Successfully loaded agent: ${agentId}`);
237
434
 
238
- // Broadcast agent-loaded event so UI sidebar updates
435
+ // Broadcast agent-loaded event so UI sidebar updates.
436
+ // Defensive: this is pure UX — it must NEVER kill the load.
437
+ // The WebServer instance exposes broadcastToSession(null, msg)
438
+ // for "broadcast to all"; some other manager shapes use
439
+ // broadcast(msg). Use whichever is available, swallow errors.
239
440
  if (this.webSocketManager && agent) {
240
- this.webSocketManager.broadcast({
241
- type: 'agent-loaded',
242
- agent: {
243
- id: agent.id,
244
- name: agent.name,
245
- status: agent.status,
246
- model: agent.currentModel || agent.preferredModel,
247
- capabilities: agent.capabilities
441
+ try {
442
+ const msg = {
443
+ type: 'agent-loaded',
444
+ agent: {
445
+ id: agent.id,
446
+ name: agent.name,
447
+ status: agent.status,
448
+ model: agent.currentModel || agent.preferredModel,
449
+ capabilities: agent.capabilities,
450
+ },
451
+ };
452
+ if (typeof this.webSocketManager.broadcast === 'function') {
453
+ this.webSocketManager.broadcast(msg);
454
+ } else if (typeof this.webSocketManager.broadcastToSession === 'function') {
455
+ this.webSocketManager.broadcastToSession(null, msg);
248
456
  }
249
- });
457
+ } catch (broadcastErr) {
458
+ this.logger.warn(`Failed to broadcast agent-loaded event (non-fatal)`, {
459
+ agentId, error: broadcastErr.message,
460
+ });
461
+ }
250
462
  }
251
463
  } catch (error) {
252
464
  throw new Error(`Failed to load agent ${agentId}: ${error.message}. Make sure the agent exists.`);
@@ -413,13 +625,25 @@ class FlowExecutor {
413
625
  return result;
414
626
 
415
627
  } catch (error) {
416
- await this.updateNodeState(runId, node.id, 'failed', { error: error.message });
628
+ // Phase 6.1: capture structured error info — kind classification
629
+ // (timeout / agent-error / agent-failure) + per-attempt history
630
+ // (from runWithRetry). Persisted on the node state so the run-
631
+ // detail UI can show "node-B timed out after 3 attempts" without
632
+ // re-parsing log files.
633
+ const errorInfo = {
634
+ kind: error?.kind || 'agent-error',
635
+ message: error?.message || String(error),
636
+ attempts: error?.attempts || null,
637
+ lastAt: new Date().toISOString(),
638
+ };
639
+ await this.updateNodeState(runId, node.id, 'failed', { error: error.message }, errorInfo);
417
640
  this.broadcastFlowUpdate(sessionId, {
418
641
  type: 'flow_node_failed',
419
642
  runId,
420
643
  nodeId: node.id,
421
644
  nodeType: node.type,
422
- error: error.message
645
+ error: error.message,
646
+ errorInfo,
423
647
  });
424
648
  throw error;
425
649
  }
@@ -467,17 +691,38 @@ class FlowExecutor {
467
691
  throw new Error(`Agent not found: ${agentId}`);
468
692
  }
469
693
 
470
- // Get input from previous nodes
694
+ // ---- Phase 1: typed-input assembly ---------------------------------
695
+ // For v2 nodes (with declared inputs[]), assemble typed values from
696
+ // upstream outputs by following the edge field mappings. For legacy
697
+ // nodes (no inputs[]), this falls back to {input, previousOutput}
698
+ // built by concatenating upstream outputs — identical to v1 behavior.
699
+ const assembled = assembleNodeInputs(node, flow.edges, context.nodeOutputs);
700
+
701
+ if (!assembled.legacy && assembled.missing.length > 0) {
702
+ // v2 fail-fast: a required input has no upstream value. Better to
703
+ // bail here with a clear error than send the agent half its data.
704
+ throw new Error(
705
+ `Agent node ${node.id} (${agentId}) is missing required input(s): ${assembled.missing.join(', ')}`
706
+ );
707
+ }
708
+
709
+ // Legacy fallback also exposes inputNodeIds + previousOutput for the
710
+ // existing buildPreviousAgentData / context-injection code paths.
471
711
  const inputNodeIds = this.getInputNodeIds(node.id, flow.edges);
472
- const previousOutput = this.collectPreviousOutput(inputNodeIds, context.nodeOutputs);
712
+ const previousOutput = assembled.legacy
713
+ ? assembled.values.previousOutput
714
+ : this.collectPreviousOutput(inputNodeIds, context.nodeOutputs);
473
715
 
474
- // Apply prompt template
716
+ // Apply prompt template. Typed input values are exposed BY NAME so
717
+ // templates can write {{topic}}, {{research}}, etc. Legacy keys
718
+ // {{input}} / {{previousOutput}} stay available for backwards compat.
475
719
  const template = node.data?.promptTemplate || '{{input}}';
476
720
  const prompt = this.applyTemplate(template, {
477
721
  input: previousOutput,
478
722
  previousOutput,
479
723
  ...context.variables,
480
- ...context.nodeOutputs
724
+ ...context.nodeOutputs,
725
+ ...assembled.values, // typed inputs win over collisions
481
726
  });
482
727
 
483
728
  this.logger.info(`Sending message to agent: ${agentId}`, {
@@ -485,66 +730,252 @@ class FlowExecutor {
485
730
  nodeId: node.id
486
731
  });
487
732
 
488
- // Store current agent mode to restore later
489
- const originalMode = agent.mode;
490
-
491
- // Reset completion state from any previous run, then put in AGENT mode
492
- agent.autonomousWorkComplete = false;
493
- agent.lastCompletionSummary = null;
494
- agent.lastCompletionDetails = null;
495
- agent.mode = AGENT_MODES.AGENT;
496
- await this.agentPool.persistAgentState(agentId);
497
-
498
- // Clear conversation history for a fresh execution context
499
- try {
500
- await this.agentPool.clearConversation(agentId);
501
- this.logger.info(`Cleared conversation for agent ${agentId} before flow execution`);
502
- } catch (error) {
503
- this.logger.warn(`Failed to clear conversation for agent ${agentId}`, { error: error.message });
504
- }
505
-
506
- // Create completion promise
507
- const completionPromise = this.waitForAgentCompletion(agentId, runId);
508
-
509
- // Build flow metadata for context injection
733
+ // Build flow metadata + previous-agent data ONCE reused per retry
510
734
  const sortedNodes = context.sortedNodes || [];
511
735
  const nodePosition = sortedNodes.findIndex(n => n.id === node.id) + 1;
512
736
  const flowMetadata = {
513
737
  flowId: flow.id,
514
738
  flowName: flow.name || 'Unnamed Flow',
739
+ // Phase 7: forward flow.description so system prompt can render
740
+ // a "FLOW GOAL" section orienting each agent to the bigger picture.
741
+ flowDescription: flow.description,
515
742
  nodeName: node.data?.label || 'Agent',
516
743
  nodePosition: nodePosition || 1,
517
744
  totalNodes: sortedNodes.length
518
745
  };
519
-
520
- // Build previous agent data for context passing
521
746
  const previousAgentData = this.buildPreviousAgentData(node, context, flow);
522
747
 
523
- this.logger.info(`Flow context for agent ${agentId}`, {
524
- flowMetadata,
525
- hasPreviousAgent: !!previousAgentData,
526
- previousAgentId: previousAgentData?.agentId
527
- });
748
+ // v2: derive the node's typed I/O contract for system-prompt
749
+ // advertisement (handled downstream in agentScheduler). v1 nodes
750
+ // don't have inputs/outputs declared → contract is undefined and
751
+ // the scheduler skips the contract section.
752
+ // Phase 7: also forward node.data.instructions (the per-node role
753
+ // + success-criteria description) so the prompt can render a
754
+ // NODE INSTRUCTIONS section.
755
+ const hasTypedIO = Array.isArray(node.inputs) || Array.isArray(node.outputs);
756
+ const hasInstructions = typeof node.data?.instructions === 'string' && node.data.instructions.trim().length > 0;
757
+ const nodeContract = (hasTypedIO || hasInstructions)
758
+ ? {
759
+ inputs: node.inputs || [],
760
+ outputs: node.outputs || [],
761
+ instructions: node.data?.instructions,
762
+ // Phase 8: opt-out flag — when true, scheduler keeps the
763
+ // agent's native system prompt and APPENDS flow context
764
+ // (legacy behavior). When false/absent, scheduler REPLACES
765
+ // the system prompt with a flow-worker version, eliminating
766
+ // identity conflicts.
767
+ useNativeSystemPrompt: node.data?.useNativeSystemPrompt === true,
768
+ }
769
+ : undefined;
770
+
771
+ // ---- Phase 3: per-node retry + per-node timeout -------------------
772
+ // The closure below is "one full agent invocation" — clear conv,
773
+ // queue message, wait for jobdone, validate outputs. Each retry is
774
+ // a brand-new invocation with the agent's conversation reset.
775
+ // Precedence: node.execution > flow.execution > config.flows.execution > defaults.
776
+ const exec = this._resolveExecutionConfig(node, flow);
777
+
778
+ // Store original mode for potential restoration on hard fail (not
779
+ // currently restored — same as pre-Phase 3 behavior — but useful
780
+ // to capture if we add cleanup).
781
+ const originalMode = agent.mode; // eslint-disable-line no-unused-vars
782
+
783
+ // Compute the list of missing required outputs given a job-done result.
784
+ // Returns [] when contract is satisfied (or no contract). Used both
785
+ // inside attemptOnce (to drive in-conversation re-prompts) and once
786
+ // more after the retry loop as a defensive belt-and-suspenders check.
787
+ const detectMissingOutputs = (result) => {
788
+ if (!nodeContract || !Array.isArray(nodeContract.outputs) || nodeContract.outputs.length === 0) return [];
789
+ const provided = (result?.outputs && typeof result.outputs === 'object') ? result.outputs : {};
790
+ const missing = [];
791
+ for (const decl of nodeContract.outputs) {
792
+ if (!decl || typeof decl.name !== 'string') continue;
793
+ if (!(decl.name in provided) || provided[decl.name] === null || provided[decl.name] === undefined) {
794
+ missing.push(decl.name);
795
+ }
796
+ }
797
+ return missing;
798
+ };
528
799
 
529
- // Queue message to agent with enhanced flow context
530
- await this.messageProcessor.processMessage(agentId, prompt, {
531
- sessionId,
532
- isFlowExecution: true,
533
- flowRunId: runId,
534
- flowNodeId: node.id,
535
- flowMetadata,
536
- previousAgentData
537
- });
800
+ // Build a corrective re-prompt that lists EXACTLY which fields are
801
+ // missing and shows the JSON shape the agent must emit on the next
802
+ // job-done. This is sent in the SAME conversation — the agent keeps
803
+ // its working memory and just patches the handoff.
804
+ const MAX_REPROMPTS_PER_ATTEMPT = 2;
805
+ const buildRepromptMessage = (missing) => {
806
+ // Phase 7: enrich the corrective message with each declared
807
+ // output's description + example so the agent has the FULL
808
+ // contract to satisfy on the retry, not just a list of names.
809
+ const required = nodeContract.outputs.map(o => {
810
+ const lines = [` • ${o.name}: ${o.type}`];
811
+ if (typeof o.description === 'string' && o.description.trim()) {
812
+ lines.push(` ${o.description.trim()}`);
813
+ }
814
+ if (o.example !== undefined && o.example !== null) {
815
+ try {
816
+ const ex = (typeof o.example === 'string')
817
+ ? JSON.stringify(o.example)
818
+ : JSON.stringify(o.example, null, 2);
819
+ const oneLine = !ex.includes('\n');
820
+ lines.push(oneLine ? ` Example: ${ex}` : ` Example: ${ex.split('\n').join('\n ')}`);
821
+ } catch { /* ignore unstringifiable examples */ }
822
+ }
823
+ return lines.join('\n');
824
+ }).join('\n');
825
+ const example = nodeContract.outputs
826
+ .map(o => ` "${o.name}": <${o.type} value>`).join(',\n');
827
+ return [
828
+ `⚠ Your previous job-done was incomplete. The flow node declares REQUIRED OUTPUTS that must all be present in the "outputs" field of job-done.`,
829
+ ``,
830
+ `Missing field(s): ${missing.join(', ')}`,
831
+ ``,
832
+ `All required outputs:`,
833
+ required,
834
+ ``,
835
+ `Please call job-done AGAIN with the complete payload. The "outputs" object must include EVERY field above. Example structure:`,
836
+ ``,
837
+ `{`,
838
+ ` "toolId": "jobdone",`,
839
+ ` "actions": [{`,
840
+ ` "action": "complete",`,
841
+ ` "summary": "<your summary>",`,
842
+ ` "outputs": {`,
843
+ example,
844
+ ` }`,
845
+ ` }]`,
846
+ `}`,
847
+ ``,
848
+ `Use the work you've already done — do not redo the task. Just emit the structured outputs.`,
849
+ ].join('\n');
850
+ };
538
851
 
539
- // Wait for agent to complete (via jobdone tool)
540
- const completionResult = await Promise.race([
541
- completionPromise,
542
- this.createTimeoutPromise(this.config.flows?.nodeTimeout || 300000) // 5 min default
543
- ]);
852
+ const attemptOnce = async (attemptIndex) => {
853
+ // Phase 8: register the active contract so the jobdone tool can
854
+ // validate the agent's job-done call AT TOOL TIME — rejecting
855
+ // partial calls before they propagate. Cleared in the finally
856
+ // block of the outer try (see below) when the attempt completes
857
+ // (success OR failure).
858
+ if (nodeContract) {
859
+ this.activeContracts.set(agentId, nodeContract);
860
+ }
544
861
 
545
- if (completionResult.timeout) {
546
- throw new Error(`Agent ${agentId} timed out`);
862
+ // Reset completion state + conversation for a clean slate every
863
+ // OUTER retry. In-conversation re-prompts (below) keep history.
864
+ agent.autonomousWorkComplete = false;
865
+ agent.lastCompletionSummary = null;
866
+ agent.lastCompletionDetails = null;
867
+ agent.mode = AGENT_MODES.AGENT;
868
+ await this.agentPool.persistAgentState(agentId);
869
+ try {
870
+ await this.agentPool.clearConversation(agentId);
871
+ } catch (error) {
872
+ this.logger.warn(`Failed to clear conversation for agent ${agentId}`, { error: error.message });
873
+ }
874
+
875
+ // Register the listener BEFORE queuing the message so a fast jobdone
876
+ // can resolve us immediately.
877
+ let completionPromise = this.waitForAgentCompletion(agentId, runId);
878
+
879
+ await this.messageProcessor.processMessage(agentId, prompt, {
880
+ sessionId,
881
+ isFlowExecution: true,
882
+ flowRunId: runId,
883
+ flowNodeId: node.id,
884
+ flowMetadata,
885
+ previousAgentData,
886
+ nodeContract,
887
+ attemptIndex,
888
+ });
889
+
890
+ let result = await completionPromise;
891
+
892
+ // v2 in-conversation re-prompt loop: when outputs are missing, ask
893
+ // the agent to fix the LAST job-done call WITHOUT clearing memory.
894
+ // Cheap (~1 model call vs full re-run) and almost always succeeds
895
+ // because the agent already produced the data — they just forgot
896
+ // to put it in the outputs field. After MAX_REPROMPTS, we fall
897
+ // through to the outer retry which DOES clear conversation.
898
+ let reprompts = 0;
899
+ while (reprompts < MAX_REPROMPTS_PER_ATTEMPT) {
900
+ const missing = detectMissingOutputs(result);
901
+ if (missing.length === 0) break;
902
+
903
+ this.logger.warn(`Flow node ${node.id}: re-prompting agent for missing outputs`, {
904
+ missing, reprompts, attemptIndex,
905
+ });
906
+
907
+ // Re-arm the listener BEFORE sending — the agent's response will
908
+ // resolve it.
909
+ agent.autonomousWorkComplete = false;
910
+ await this.agentPool.persistAgentState(agentId);
911
+ completionPromise = this.waitForAgentCompletion(agentId, runId);
912
+
913
+ await this.messageProcessor.processMessage(agentId, buildRepromptMessage(missing), {
914
+ sessionId,
915
+ isFlowExecution: true,
916
+ flowRunId: runId,
917
+ flowNodeId: node.id,
918
+ flowMetadata,
919
+ previousAgentData,
920
+ nodeContract,
921
+ attemptIndex,
922
+ isReprompt: true,
923
+ });
924
+
925
+ result = await completionPromise;
926
+ reprompts++;
927
+ }
928
+
929
+ // Final check: if still missing after re-prompts, throw a retryable
930
+ // error so the OUTER loop (runWithRetry) starts a fresh agent
931
+ // invocation with cleared conversation.
932
+ const stillMissing = detectMissingOutputs(result);
933
+ if (stillMissing.length > 0) {
934
+ throw new FlowRetryError(
935
+ `Agent ${agentId} (node ${node.id}) job-done is missing required output(s) after ${reprompts} re-prompt(s): ${stillMissing.join(', ')}. ` +
936
+ `Declared outputs: ${nodeContract.outputs.map(o => `${o.name}:${o.type}`).join(', ')}`,
937
+ 'agent-error'
938
+ );
939
+ }
940
+ return result;
941
+ };
942
+
943
+ let attemptHistory = [];
944
+ let completionResult;
945
+ try {
946
+ const ran = await runWithRetry(attemptOnce, {
947
+ timeoutMs: exec.timeoutMs,
948
+ maxRetries: exec.maxRetries,
949
+ retryOn: exec.retryOn,
950
+ backoffBaseMs: exec.backoffBaseMs,
951
+ backoffMultiplier: exec.backoffMultiplier,
952
+ onAttempt: (meta) => {
953
+ this.logger.warn(`Flow node ${node.id} attempt ${meta.attempt} failed`, {
954
+ kind: meta.error?.kind, message: meta.error?.message, willRetry: meta.willRetry,
955
+ });
956
+ },
957
+ });
958
+ completionResult = ran.result;
959
+ attemptHistory = ran.attempts;
960
+ } catch (e) {
961
+ // Surface the kind on the thrown error so the caller (executeFlow)
962
+ // and observability can distinguish timeout vs agent-error vs
963
+ // explicit failure.
964
+ const kind = e?.kind || 'agent-error';
965
+ const friendly = kind === 'timeout'
966
+ ? `Agent ${agentId} timed out (after ${exec.maxRetries + 1} attempt(s))`
967
+ : (e?.message || `Agent ${agentId} failed`);
968
+ const wrapped = new Error(friendly);
969
+ wrapped.kind = kind;
970
+ wrapped.attempts = e?.attempts;
971
+ // Phase 8: clear active contract on failure so the jobdone tool
972
+ // doesn't validate against a stale node when the agent gets used
973
+ // outside the flow later.
974
+ this.activeContracts.delete(agentId);
975
+ throw wrapped;
547
976
  }
977
+ // Phase 8: clear active contract on success too.
978
+ this.activeContracts.delete(agentId);
548
979
 
549
980
  // Get the agent's response (last assistant message)
550
981
  const updatedAgent = await this.agentPool.getAgent(agentId);
@@ -553,17 +984,105 @@ class FlowExecutor {
553
984
  // Extract files created during this agent's execution (from completion result or messages)
554
985
  const filesCreated = completionResult.filesCreated || this.extractFilesFromCompletion(completionResult);
555
986
 
987
+ // v2: outputs validation already happened inside attemptOnce; this
988
+ // block stays only as a defensive belt-and-suspenders for the case
989
+ // where attemptOnce somehow returns without outputs. Same logic.
990
+ if (nodeContract && Array.isArray(nodeContract.outputs) && nodeContract.outputs.length > 0) {
991
+ const provided = (completionResult.outputs && typeof completionResult.outputs === 'object')
992
+ ? completionResult.outputs : {};
993
+ const missing = [];
994
+ for (const decl of nodeContract.outputs) {
995
+ if (!decl || typeof decl.name !== 'string') continue;
996
+ if (!(decl.name in provided) || provided[decl.name] === null || provided[decl.name] === undefined) {
997
+ missing.push(decl.name);
998
+ }
999
+ }
1000
+ if (missing.length > 0) {
1001
+ throw new Error(
1002
+ `Agent ${agentId} (node ${node.id}) job-done is missing required output(s): ${missing.join(', ')}. ` +
1003
+ `Declared outputs: ${nodeContract.outputs.map(o => `${o.name}:${o.type}`).join(', ')}`
1004
+ );
1005
+ }
1006
+ }
1007
+
1008
+ // Choose what becomes the legacy `output` field used by v1 handoff
1009
+ // and the prose preview in the next agent's system prompt.
1010
+ //
1011
+ // Preference order:
1012
+ // 1. summary + details (if both present, glue them)
1013
+ // 2. lastResponse (the agent's full final assistant message)
1014
+ // 3. summary alone
1015
+ // 4. ''
1016
+ //
1017
+ // Why: tiny "Done." summaries used to flow through as the next
1018
+ // agent's entire context — agents had nothing to work with. Falling
1019
+ // back to the assistant's last message gives the next agent a real
1020
+ // payload even when the upstream agent skipped `details`.
1021
+ const summary = (completionResult.summary || '').trim();
1022
+ const details = (completionResult.details || '').trim();
1023
+ let prose;
1024
+ if (summary && details) prose = `${summary}\n\n${details}`;
1025
+ else if (summary && summary.length < 40 && lastResponse) prose = lastResponse;
1026
+ else prose = summary || lastResponse || '';
1027
+
556
1028
  return {
557
1029
  type: 'agent',
558
1030
  agentId,
559
1031
  agentName: agent.name,
560
- output: completionResult.summary || lastResponse || '',
1032
+ output: prose,
1033
+ // v2: structured outputs bag — keyed by declared field name. This
1034
+ // is what assembleNodeInputs reads when wiring the next node.
1035
+ outputs: completionResult.outputs,
561
1036
  details: completionResult.details,
562
1037
  filesCreated,
1038
+ // Phase 3: attempt history (one entry per try; failed entries
1039
+ // include { kind, message }). Surfaces in run-detail UI later.
1040
+ attempts: attemptHistory,
563
1041
  success: completionResult.success !== false
564
1042
  };
565
1043
  }
566
1044
 
1045
+ /**
1046
+ * Resolve effective per-node execution config — timeout, retries,
1047
+ * backoff, retryOn classes. Precedence (highest wins):
1048
+ * node.execution > flow.execution > config.flows.execution > defaults
1049
+ *
1050
+ * Defaults:
1051
+ * timeoutMs 300000 (5min, matches pre-Phase-3 behavior; legacy
1052
+ * config.flows.nodeTimeout still honored as a global
1053
+ * timeout for back-compat)
1054
+ * maxRetries 1 (one fresh-conversation retry after re-prompts
1055
+ * exhaust — without this, structured-output
1056
+ * misses by some models cause flow failure
1057
+ * after only 2 in-conversation re-prompts).
1058
+ * Override per node to 0 to disable retries.
1059
+ * retryOn ['timeout', 'agent-error']
1060
+ * backoffBaseMs 1000
1061
+ * backoffMultiplier 2
1062
+ */
1063
+ _resolveExecutionConfig(node, flow) {
1064
+ const globalCfg = this.config?.flows?.execution || {};
1065
+ const flowCfg = flow?.execution || {};
1066
+ const nodeCfg = node?.execution || {};
1067
+ // Legacy: config.flows.nodeTimeout was the only knob in v1. Keep
1068
+ // it as the default timeout if more-specific configs aren't set.
1069
+ const legacyTimeout = this.config?.flows?.nodeTimeout;
1070
+
1071
+ const pick = (k, fallback) =>
1072
+ nodeCfg[k] !== undefined ? nodeCfg[k] :
1073
+ flowCfg[k] !== undefined ? flowCfg[k] :
1074
+ globalCfg[k] !== undefined ? globalCfg[k] :
1075
+ fallback;
1076
+
1077
+ return {
1078
+ timeoutMs: pick('timeoutMs', legacyTimeout ?? 300000),
1079
+ maxRetries: pick('maxRetries', 1),
1080
+ retryOn: pick('retryOn', ['timeout', 'agent-error']),
1081
+ backoffBaseMs: pick('backoffBaseMs', 1000),
1082
+ backoffMultiplier: pick('backoffMultiplier', 2),
1083
+ };
1084
+ }
1085
+
567
1086
  /**
568
1087
  * Build previous agent data for context passing to next agent
569
1088
  * @param {Object} currentNode - Current agent node
@@ -575,25 +1094,52 @@ class FlowExecutor {
575
1094
  // Find the previous agent node that feeds into this one
576
1095
  const inputNodeIds = this.getInputNodeIds(currentNode.id, flow.edges);
577
1096
 
578
- // Look for the most recent agent node in the inputs
1097
+ // Look for the most recent agent node in the inputs.
1098
+ // We collect ALL upstream agent contributions (not just one) so a
1099
+ // node fed by multiple agents gets a merged outputs bag and a
1100
+ // labeled list of contributors. v1 fallback: pick the first.
1101
+ const contributors = [];
579
1102
  for (const inputId of inputNodeIds) {
580
1103
  const nodeOutput = context.nodeOutputs[inputId];
581
-
582
- // Check if this is an agent node output
583
- if (nodeOutput && nodeOutput.type === 'agent') {
584
- return {
585
- agentId: nodeOutput.agentId,
586
- agentName: nodeOutput.agentName || nodeOutput.agentId,
587
- summary: nodeOutput.output,
588
- details: nodeOutput.details,
589
- filesCreated: nodeOutput.filesCreated || [],
590
- output: nodeOutput.output
591
- };
1104
+ if (nodeOutput && nodeOutput.type === 'agent') contributors.push(nodeOutput);
1105
+ }
1106
+ if (contributors.length === 0) return null;
1107
+
1108
+ // Merge structured outputs from all contributors. When the same
1109
+ // field name appears on multiple upstream agents, the LATER one
1110
+ // wins (sortedNodes order in context.sortedNodes is topological).
1111
+ const mergedOutputs = {};
1112
+ for (const c of contributors) {
1113
+ if (c.outputs && typeof c.outputs === 'object') {
1114
+ Object.assign(mergedOutputs, c.outputs);
592
1115
  }
593
1116
  }
594
1117
 
595
- // No previous agent found (first agent in flow or only non-agent predecessors)
596
- return null;
1118
+ // Primary "previous agent" used for the legacy fields stays the
1119
+ // most recent contributor (last one in topo order).
1120
+ const primary = contributors[contributors.length - 1];
1121
+
1122
+ return {
1123
+ agentId: primary.agentId,
1124
+ agentName: primary.agentName || primary.agentId,
1125
+ summary: primary.output,
1126
+ details: primary.details,
1127
+ filesCreated: primary.filesCreated || [],
1128
+ output: primary.output,
1129
+ // Phase 5/6 fix: forward the structured outputs bag end-to-end.
1130
+ // Without this the next agent never sees the typed handoff —
1131
+ // only the free-text summary, defeating the whole v2 contract.
1132
+ outputs: Object.keys(mergedOutputs).length > 0 ? mergedOutputs : undefined,
1133
+ // When multiple agents fed this node, list them so the system
1134
+ // prompt can show "you received outputs from agents A, B".
1135
+ contributors: contributors.length > 1
1136
+ ? contributors.map(c => ({
1137
+ agentId: c.agentId,
1138
+ agentName: c.agentName || c.agentId,
1139
+ outputs: c.outputs || null,
1140
+ }))
1141
+ : undefined,
1142
+ };
597
1143
  }
598
1144
 
599
1145
  /**
@@ -736,6 +1282,9 @@ class FlowExecutor {
736
1282
  completed: true,
737
1283
  summary: completionData.summary || '',
738
1284
  details: completionData.details || null,
1285
+ // v2: structured outputs bag — forwarded through to the
1286
+ // executor's contract validator. v1 callers don't set this.
1287
+ outputs: completionData.outputs,
739
1288
  success: completionData.success !== false
740
1289
  });
741
1290
  return true;
@@ -838,22 +1387,32 @@ class FlowExecutor {
838
1387
  }
839
1388
 
840
1389
  /**
841
- * Update node state in the run record
842
- * @param {string} runId - Run ID
843
- * @param {string} nodeId - Node ID
844
- * @param {string} status - Node status
845
- * @param {Object} result - Node result
1390
+ * Update node state in the run record.
1391
+ *
1392
+ * Phase 6.1: optional `errorInfo` captures classified failure detail
1393
+ * (kind, message, attempts) for run-detail diagnostics. Stored as
1394
+ * `nodeStates[id].error` alongside the truncated result.
1395
+ *
1396
+ * @param {string} runId
1397
+ * @param {string} nodeId
1398
+ * @param {string} status 'running' | 'completed' | 'failed'
1399
+ * @param {Object} result
1400
+ * @param {Object} [errorInfo] { kind, message, attempts, lastAt }
846
1401
  */
847
- async updateNodeState(runId, nodeId, status, result) {
1402
+ async updateNodeState(runId, nodeId, status, result, errorInfo) {
848
1403
  const run = await this.stateManager.getFlowRun(runId);
849
1404
  if (!run) return;
850
1405
 
851
1406
  const nodeStates = run.nodeStates || {};
852
- nodeStates[nodeId] = {
1407
+ const entry = {
853
1408
  status,
854
1409
  result: result ? this.truncateOutput(result) : null,
855
1410
  updatedAt: new Date().toISOString()
856
1411
  };
1412
+ if (errorInfo && typeof errorInfo === 'object') {
1413
+ entry.error = errorInfo;
1414
+ }
1415
+ nodeStates[nodeId] = entry;
857
1416
 
858
1417
  await this.stateManager.updateFlowRun(runId, { nodeStates });
859
1418
  }
@@ -874,7 +1433,16 @@ class FlowExecutor {
874
1433
  }
875
1434
 
876
1435
  /**
877
- * Truncate output for storage/transmission
1436
+ * Truncate output for storage/transmission.
1437
+ *
1438
+ * Special-case: when the output is an agent completion result with a
1439
+ * structured `outputs` field, preserve the `outputs` object verbatim.
1440
+ * Those are the typed contract values that downstream nodes consume —
1441
+ * truncating them silently breaks edge field-mapping (`writer.bullets
1442
+ * → critic.bullets` would deliver a string-truncation marker instead
1443
+ * of the real list). Long prose lives in `output` / `summary` /
1444
+ * `details`; those get the legacy string truncation.
1445
+ *
878
1446
  * @param {Object} output - Output to truncate
879
1447
  * @returns {Object} Truncated output
880
1448
  */
@@ -882,7 +1450,21 @@ class FlowExecutor {
882
1450
  if (typeof output === 'string' && output.length > 1000) {
883
1451
  return output.substring(0, 1000) + '... (truncated)';
884
1452
  }
885
- if (typeof output === 'object') {
1453
+ if (output && typeof output === 'object') {
1454
+ // Agent-completion shape: preserve structured `outputs`, truncate
1455
+ // only the long prose fields. Keeps the run dump useful for
1456
+ // post-mortem inspection AND keeps downstream edges working.
1457
+ const hasStructuredOutputs = output.outputs && typeof output.outputs === 'object';
1458
+ if (hasStructuredOutputs) {
1459
+ const trunc = { ...output };
1460
+ for (const k of ['output', 'summary', 'details']) {
1461
+ if (typeof trunc[k] === 'string' && trunc[k].length > 1000) {
1462
+ trunc[k] = trunc[k].substring(0, 1000) + '... (truncated)';
1463
+ }
1464
+ }
1465
+ // outputs object preserved as-is; it's structured contract data.
1466
+ return trunc;
1467
+ }
886
1468
  const str = JSON.stringify(output);
887
1469
  if (str.length > 1000) {
888
1470
  return { truncated: true, preview: str.substring(0, 1000) };