windmill-components 1.511.1 → 1.531.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 (446) hide show
  1. package/package/components/AIAgentLogViewer.svelte +123 -0
  2. package/package/components/AIAgentLogViewer.svelte.d.ts +13 -0
  3. package/package/components/AppConnectInner.svelte +10 -10
  4. package/package/components/AppConnectInner.svelte.d.ts +1 -1
  5. package/package/components/ArgInput.svelte +42 -14
  6. package/package/components/ArgInput.svelte.d.ts +2 -10
  7. package/package/components/AssignableTagsInner.svelte +5 -0
  8. package/package/components/AuthSettings.svelte +4 -2
  9. package/package/components/AuthSettings.svelte.d.ts +1 -0
  10. package/package/components/AutoscalingConfigEditor.svelte +76 -2
  11. package/package/components/DBManagerDrawer.svelte +154 -151
  12. package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
  13. package/package/components/DBTable.svelte +3 -3
  14. package/package/components/DBTable.svelte.d.ts +1 -0
  15. package/package/components/DBTableEditor.svelte +7 -7
  16. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  17. package/package/components/DeployWorkspace.svelte +1 -1
  18. package/package/components/Dev.svelte +12 -28
  19. package/package/components/DiffEditor.svelte +6 -3
  20. package/package/components/DiffEditor.svelte.d.ts +1 -0
  21. package/package/components/DisplayResult.svelte +46 -14
  22. package/package/components/DisplayResult.svelte.d.ts +5 -1
  23. package/package/components/DynSelect.svelte +58 -34
  24. package/package/components/DynSelect.svelte.d.ts +3 -11
  25. package/package/components/EditableSchemaForm.svelte +131 -8
  26. package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
  27. package/package/components/Editor.svelte +27 -9
  28. package/package/components/Editor.svelte.d.ts +1 -1
  29. package/package/components/EditorBar.svelte +105 -7
  30. package/package/components/EditorSettings.svelte +6 -0
  31. package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
  32. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
  33. package/package/components/ExploreAssetButton.svelte +14 -4
  34. package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
  35. package/package/components/FirstStepInputs.svelte +2 -2
  36. package/package/components/FlowBuilder.svelte +18 -36
  37. package/package/components/FlowGraphViewerStep.svelte +7 -0
  38. package/package/components/FlowJobResult.svelte +16 -64
  39. package/package/components/FlowJobResult.svelte.d.ts +11 -4
  40. package/package/components/FlowLogViewer.svelte +660 -0
  41. package/package/components/FlowLogViewer.svelte.d.ts +34 -0
  42. package/package/components/FlowLogViewerWrapper.svelte +52 -0
  43. package/package/components/FlowLogViewerWrapper.svelte.d.ts +21 -0
  44. package/package/components/FlowLoopIterationPreview.svelte +3 -3
  45. package/package/components/FlowPreviewContent.svelte +13 -6
  46. package/package/components/FlowPreviewContent.svelte.d.ts +7 -7
  47. package/package/components/FlowPreviewResult.svelte +7 -5
  48. package/package/components/FlowPreviewResult.svelte.d.ts +4 -5
  49. package/package/components/FlowStatusViewer.svelte +28 -16
  50. package/package/components/FlowStatusViewer.svelte.d.ts +19 -27
  51. package/package/components/FlowStatusViewerInner.svelte +500 -295
  52. package/package/components/FlowStatusViewerInner.svelte.d.ts +34 -34
  53. package/package/components/FlowTimeline.svelte +11 -13
  54. package/package/components/FlowTimeline.svelte.d.ts +6 -5
  55. package/package/components/FolderEditor.svelte +1 -1
  56. package/package/components/GitDiffPreview.svelte +14 -18
  57. package/package/components/GitDiffPreview.svelte.d.ts +2 -8
  58. package/package/components/GitHubAppIntegration.svelte +3 -1
  59. package/package/components/HighlightCode.svelte +4 -1
  60. package/package/components/IconedResourceType.svelte +9 -5
  61. package/package/components/IdEditorInput.svelte +25 -22
  62. package/package/components/IdEditorInput.svelte.d.ts +11 -23
  63. package/package/components/InstanceSetting.svelte +7 -2
  64. package/package/components/InstanceSettings.svelte +1 -0
  65. package/package/components/JobLoader.svelte +108 -12
  66. package/package/components/JobLoader.svelte.d.ts +16 -3
  67. package/package/components/LogViewer.svelte +8 -2
  68. package/package/components/LogViewer.svelte.d.ts +1 -0
  69. package/package/components/LogViewerHeader.svelte +32 -0
  70. package/package/components/LogViewerHeader.svelte.d.ts +8 -0
  71. package/package/components/Login.svelte +8 -2
  72. package/package/components/MemoryFootprintViewer.svelte +1 -1
  73. package/package/components/ModulePreviewForm.svelte +10 -6
  74. package/package/components/ModulePreviewResultViewer.svelte +18 -2
  75. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -1
  76. package/package/components/ModuleTest.svelte +59 -16
  77. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  78. package/package/components/NextcloudSetting.svelte +84 -0
  79. package/package/components/NextcloudSetting.svelte.d.ts +7 -0
  80. package/package/components/ObjectResourceInput.svelte +3 -2
  81. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  82. package/package/components/ParqetCsvTableRenderer.svelte +1 -1
  83. package/package/components/RelativeLineNumbers.svelte +16 -0
  84. package/package/components/RelativeLineNumbers.svelte.d.ts +18 -0
  85. package/package/components/ResourceEditor.svelte +10 -5
  86. package/package/components/ResourcePicker.svelte +8 -1
  87. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  88. package/package/components/ResultStreamDisplay.svelte +5 -0
  89. package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
  90. package/package/components/RunForm.svelte +9 -1
  91. package/package/components/SchemaForm.svelte +2 -2
  92. package/package/components/SchemaForm.svelte.d.ts +2 -10
  93. package/package/components/ScriptBuilder.svelte +26 -19
  94. package/package/components/ScriptBuilder.svelte.d.ts +1 -1
  95. package/package/components/ScriptEditor.svelte +2 -2
  96. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  97. package/package/components/ScriptWrapper.svelte +1 -1
  98. package/package/components/ShareModal.svelte.d.ts +1 -1
  99. package/package/components/SimpleAgTable.svelte +2 -0
  100. package/package/components/SimpleAgTable.svelte.d.ts +2 -0
  101. package/package/components/SimpleEditor.svelte +10 -4
  102. package/package/components/SimpleEditor.svelte.d.ts +1 -0
  103. package/package/components/SqlRepl.svelte +21 -7
  104. package/package/components/SqlRepl.svelte.d.ts +2 -2
  105. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  106. package/package/components/TemplateEditor.svelte +1 -1
  107. package/package/components/UserSettings.svelte +4 -4
  108. package/package/components/WorkerTagSelect.svelte +70 -1
  109. package/package/components/apps/components/display/AppAccordionList.svelte +1 -1
  110. package/package/components/apps/components/display/AppCarouselList.svelte +10 -8
  111. package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
  112. package/package/components/apps/components/display/AppJobIdFlowStatus.svelte +3 -3
  113. package/package/components/apps/components/display/AppText.svelte +2 -2
  114. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
  115. package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
  116. package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
  117. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  118. package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
  119. package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
  120. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
  121. package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
  122. package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
  123. package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
  124. package/package/components/apps/components/display/dbtable/utils.js +52 -28
  125. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
  126. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  127. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  128. package/package/components/apps/components/display/table/AppAggridTable.svelte +7 -6
  129. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  130. package/package/components/apps/components/display/table/utils.js +7 -4
  131. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -3
  132. package/package/components/apps/components/helpers/InputValue.svelte +6 -1
  133. package/package/components/apps/components/helpers/NonRunnableComponent.svelte +8 -4
  134. package/package/components/apps/components/helpers/NonRunnableComponent.svelte.d.ts +1 -1
  135. package/package/components/apps/components/helpers/RunnableComponent.svelte +10 -8
  136. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -2
  137. package/package/components/apps/components/helpers/RunnableWrapper.svelte +12 -3
  138. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -1
  139. package/package/components/apps/components/inputs/AppCodeInputComponent.svelte +0 -5
  140. package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
  141. package/package/components/apps/components/layout/AppConditionalWrapper.svelte +1 -1
  142. package/package/components/apps/components/layout/AppContainer.svelte +1 -1
  143. package/package/components/apps/components/layout/AppDecisionTree.svelte +32 -21
  144. package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
  145. package/package/components/apps/components/layout/AppList.svelte +9 -8
  146. package/package/components/apps/components/layout/AppModal.svelte +1 -1
  147. package/package/components/apps/components/layout/AppSplitpanes.svelte +5 -2
  148. package/package/components/apps/components/layout/AppStepper.svelte +10 -6
  149. package/package/components/apps/components/layout/AppTabs.svelte +3 -3
  150. package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
  151. package/package/components/apps/editor/AppJobsDrawer.svelte +2 -2
  152. package/package/components/apps/editor/GridEditor.svelte +24 -19
  153. package/package/components/apps/editor/GridEditor.svelte.d.ts +4 -1
  154. package/package/components/apps/editor/GridViewer.svelte +1 -0
  155. package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
  156. package/package/components/apps/editor/SubGridEditor.svelte +7 -11
  157. package/package/components/apps/editor/SubGridEditor.svelte.d.ts +3 -19
  158. package/package/components/apps/editor/appUtils.js +17 -68
  159. package/package/components/apps/editor/component/ComponentInner.svelte +845 -694
  160. package/package/components/apps/editor/component/componentCallbacks.svelte.js +8 -1
  161. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
  162. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
  163. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +14 -55
  164. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  165. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  166. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  167. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +31 -45
  168. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +2 -1
  169. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte.d.ts +1 -0
  170. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
  171. package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +2 -2
  172. package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte.d.ts +1 -0
  173. package/package/components/apps/svelte-grid/Grid.svelte +23 -25
  174. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +21 -9
  175. package/package/components/apps/svelte-grid/MoveResize.svelte +13 -15
  176. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +17 -24
  177. package/package/components/apps/utils.d.ts +2 -0
  178. package/package/components/apps/utils.js +22 -0
  179. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  180. package/package/components/assets/JobAssetsViewer.svelte +2 -2
  181. package/package/components/assets/lib.js +4 -0
  182. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
  183. package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +1 -1
  184. package/package/components/common/button/Button.svelte +4 -3
  185. package/package/components/common/button/Button.svelte.d.ts +1 -0
  186. package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
  187. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
  188. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
  189. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
  190. package/package/components/common/fileDownload/FileDownload.svelte +1 -3
  191. package/package/components/common/fileDownload/FileDownload.svelte.d.ts +4 -18
  192. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  193. package/package/components/common/modal/Modal.svelte +2 -5
  194. package/package/components/common/tabs/TabsV2.svelte +2 -1
  195. package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
  196. package/package/components/copilot/FlowInlineScriptAIButton.svelte +58 -0
  197. package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +3 -0
  198. package/package/components/copilot/MetadataGen.svelte +19 -1
  199. package/package/components/copilot/MetadataGen.svelte.d.ts +1 -1
  200. package/package/components/copilot/ScriptGen.svelte +23 -31
  201. package/package/components/copilot/ScriptGen.svelte.d.ts +0 -1
  202. package/package/components/copilot/autocomplete/Autocompletor.js +2 -0
  203. package/package/components/copilot/chat/AIChatDisplay.svelte +4 -4
  204. package/package/components/copilot/chat/AIChatInput.svelte +29 -6
  205. package/package/components/copilot/chat/AIChatManager.svelte.js +171 -33
  206. package/package/components/copilot/chat/AIChatMessage.svelte +3 -0
  207. package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
  208. package/package/components/copilot/chat/ToolContentDisplay.svelte +84 -0
  209. package/package/components/copilot/chat/ToolContentDisplay.svelte.d.ts +11 -0
  210. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +105 -0
  211. package/package/components/copilot/chat/ToolExecutionDisplay.svelte.d.ts +7 -0
  212. package/package/components/copilot/chat/api/apiTools.d.ts +7 -0
  213. package/package/components/copilot/chat/api/apiTools.js +192 -0
  214. package/package/components/copilot/chat/api/core.d.ts +7 -0
  215. package/package/components/copilot/chat/api/core.js +61 -0
  216. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -6
  217. package/package/components/copilot/chat/flow/core.js +213 -42
  218. package/package/components/copilot/chat/flow/utils.js +3 -0
  219. package/package/components/copilot/chat/monaco-adapter.d.ts +1 -1
  220. package/package/components/copilot/chat/monaco-adapter.js +10 -4
  221. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  222. package/package/components/copilot/chat/navigator/core.js +20 -22
  223. package/package/components/copilot/chat/script/core.d.ts +11 -3
  224. package/package/components/copilot/chat/script/core.js +120 -44
  225. package/package/components/copilot/chat/shared.d.ts +31 -4
  226. package/package/components/copilot/chat/shared.js +235 -10
  227. package/package/components/copilot/lib.d.ts +1 -1
  228. package/package/components/copilot/lib.js +15 -6
  229. package/package/components/custom_ui.d.ts +4 -0
  230. package/package/components/dbOps.d.ts +20 -8
  231. package/package/components/dbOps.js +85 -40
  232. package/package/components/details/DetailPageHeader.svelte +0 -2
  233. package/package/components/details/DetailPageLayout.svelte +34 -33
  234. package/package/components/flow_builder.d.ts +1 -2
  235. package/package/components/flows/FlowEditor.svelte +3 -3
  236. package/package/components/flows/FlowEditor.svelte.d.ts +7 -6
  237. package/package/components/flows/common/FlowCard.svelte +2 -2
  238. package/package/components/flows/common/FlowCard.svelte.d.ts +1 -0
  239. package/package/components/flows/common/FlowCardHeader.svelte +13 -4
  240. package/package/components/flows/common/FlowCardHeader.svelte.d.ts +1 -0
  241. package/package/components/flows/content/BranchPredicateEditor.svelte +4 -7
  242. package/package/components/flows/content/BranchPredicateEditor.svelte.d.ts +12 -11
  243. package/package/components/flows/content/FlowConstants.svelte +3 -3
  244. package/package/components/flows/content/FlowEditorPanel.svelte +3 -3
  245. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +2 -4
  246. package/package/components/flows/content/FlowInput.svelte +5 -0
  247. package/package/components/flows/content/FlowInputsQuick.svelte +2 -1
  248. package/package/components/flows/content/FlowLoop.svelte +2 -2
  249. package/package/components/flows/content/FlowModuleComponent.svelte +130 -108
  250. package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -0
  251. package/package/components/flows/content/FlowModuleEarlyStop.svelte +2 -2
  252. package/package/components/flows/content/FlowModuleScript.svelte +0 -1
  253. package/package/components/flows/content/FlowModuleSkip.svelte +1 -1
  254. package/package/components/flows/content/FlowModuleSleep.svelte +1 -1
  255. package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
  256. package/package/components/flows/content/FlowModuleWrapper.svelte +15 -5
  257. package/package/components/flows/content/FlowModuleWrapper.svelte.d.ts +1 -0
  258. package/package/components/flows/content/FlowResult.svelte +2 -3
  259. package/package/components/flows/content/FlowResult.svelte.d.ts +2 -4
  260. package/package/components/flows/content/FlowWhileLoop.svelte +1 -1
  261. package/package/components/flows/dfs.d.ts +3 -1
  262. package/package/components/flows/dfs.js +5 -1
  263. package/package/components/flows/flowInfers.js +78 -0
  264. package/package/components/flows/flowState.d.ts +2 -3
  265. package/package/components/flows/flowState.js +2 -2
  266. package/package/components/flows/flowStateUtils.svelte.d.ts +4 -4
  267. package/package/components/flows/flowStateUtils.svelte.js +14 -13
  268. package/package/components/flows/flowStore.d.ts +3 -4
  269. package/package/components/flows/header/FlowPreviewButtons.svelte +2 -1
  270. package/package/components/flows/header/FlowYamlEditor.svelte +10 -1
  271. package/package/components/flows/idUtils.js +2 -1
  272. package/package/components/flows/map/FlowGraphPreviewButton.svelte +1 -1
  273. package/package/components/flows/map/FlowJobsMenu.svelte +7 -3
  274. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -0
  275. package/package/components/flows/map/FlowModuleSchemaItem.svelte +15 -15
  276. package/package/components/flows/map/FlowModuleSchemaMap.svelte +27 -15
  277. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +6 -4
  278. package/package/components/flows/map/InsertModuleButton.svelte +4 -1
  279. package/package/components/flows/map/InsertModuleInner.svelte +9 -1
  280. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +1 -0
  281. package/package/components/flows/map/MapItem.svelte +4 -2
  282. package/package/components/flows/pickers/TopLevelNode.svelte +4 -1
  283. package/package/components/flows/propPicker/InputPickerInner.svelte +5 -4
  284. package/package/components/flows/propPicker/OutputBadge.svelte +16 -10
  285. package/package/components/flows/propPicker/OutputPickerInner.svelte +19 -6
  286. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
  287. package/package/components/flows/propPicker/StepHistory.svelte +4 -1
  288. package/package/components/flows/testSteps.svelte.d.ts +3 -2
  289. package/package/components/flows/testSteps.svelte.js +26 -23
  290. package/package/components/flows/types.d.ts +1 -1
  291. package/package/components/flows/utils.d.ts +3 -5
  292. package/package/components/flows/utils.js +3 -4
  293. package/package/components/git_sync/DetectionFlow.svelte +202 -0
  294. package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
  295. package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
  296. package/package/components/git_sync/GitSyncContext.svelte.js +462 -0
  297. package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
  298. package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
  299. package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
  300. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
  301. package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
  302. package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
  303. package/package/components/git_sync/GitSyncSection.svelte +89 -0
  304. package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
  305. package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
  306. package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
  307. package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
  308. package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
  309. package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
  310. package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
  311. package/package/components/graph/FlowGraphV2.svelte +49 -25
  312. package/package/components/graph/FlowGraphV2.svelte.d.ts +5 -2
  313. package/package/components/graph/graphBuilder.svelte.d.ts +49 -17
  314. package/package/components/graph/graphBuilder.svelte.js +31 -15
  315. package/package/components/graph/model.d.ts +9 -6
  316. package/package/components/graph/renderers/edges/BaseEdge.svelte +3 -3
  317. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +2 -3
  318. package/package/components/graph/renderers/nodes/AIToolNode.svelte +234 -0
  319. package/package/components/graph/renderers/nodes/AIToolNode.svelte.d.ts +24 -0
  320. package/package/components/graph/renderers/nodes/AssetNode.svelte +19 -14
  321. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +18 -1
  322. package/package/components/graph/renderers/nodes/BranchAllEndNode.svelte +1 -1
  323. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +1 -1
  324. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
  325. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +2 -2
  326. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +1 -1
  327. package/package/components/graph/renderers/nodes/ModuleNode.svelte +21 -21
  328. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +64 -0
  329. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte.d.ts +7 -0
  330. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +1 -1
  331. package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
  332. package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
  333. package/package/components/icons/AssetGenericIcon.svelte +3 -0
  334. package/package/components/icons/DucklakeIcon.svelte +18 -0
  335. package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
  336. package/package/components/icons/RubyIcon.svelte +656 -0
  337. package/package/components/icons/RubyIcon.svelte.d.ts +7 -0
  338. package/package/components/instanceSettings.js +20 -3
  339. package/package/components/modulesTest.svelte.d.ts +6 -3
  340. package/package/components/modulesTest.svelte.js +32 -0
  341. package/package/components/preview/FlowPreviewStatus.svelte +3 -1
  342. package/package/components/raw_apps/RawAppEditor.svelte +27 -26
  343. package/package/components/raw_apps/RawAppEditor.svelte.d.ts +17 -17
  344. package/package/components/runs/{JobPreview.svelte → JobRunsPreview.svelte} +2 -5
  345. package/package/components/runs/{JobPreview.svelte.d.ts → JobRunsPreview.svelte.d.ts} +3 -3
  346. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  347. package/package/components/runs/RunRow.svelte +5 -1
  348. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  349. package/package/components/schema/AddProperty.svelte +41 -36
  350. package/package/components/schema/AddProperty.svelte.d.ts +2 -2
  351. package/package/components/schema/AddPropertyV2.svelte +41 -37
  352. package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -1
  353. package/package/components/schema/FlowPropertyEditor.svelte +11 -8
  354. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  355. package/package/components/schema/PropertyEditor.svelte +0 -2
  356. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  357. package/package/components/schema/SchemaFormDND.svelte +2 -1
  358. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
  359. package/package/components/scriptEditor/LogPanel.svelte +5 -3
  360. package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
  361. package/package/components/search/RunsSearch.svelte +1 -1
  362. package/package/components/select/Select.svelte +7 -4
  363. package/package/components/select/Select.svelte.d.ts +5 -0
  364. package/package/components/select/SelectDropdown.svelte +2 -1
  365. package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
  366. package/package/components/settings/CreateToken.svelte +132 -12
  367. package/package/components/settings/CreateToken.svelte.d.ts +3 -20
  368. package/package/components/settings/TokenDisplay.svelte +18 -42
  369. package/package/components/settings/TokenDisplay.svelte.d.ts +0 -1
  370. package/package/components/settings/TokensTable.svelte +2 -4
  371. package/package/components/settings/TokensTable.svelte.d.ts +3 -19
  372. package/package/components/settings/WorkspaceUserSettings.svelte +428 -69
  373. package/package/components/sidebar/MenuButton.svelte +12 -10
  374. package/package/components/sidebar/changelogs.js +5 -0
  375. package/package/components/stepHistoryLoader.svelte.d.ts +2 -2
  376. package/package/components/stepHistoryLoader.svelte.js +7 -12
  377. package/package/components/table/AutoDataTable.svelte +6 -4
  378. package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
  379. package/package/components/table/DataTable.svelte +12 -10
  380. package/package/components/table/DataTable.svelte.d.ts +1 -0
  381. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
  382. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  383. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  384. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
  385. package/package/components/triggers/gcp/utils.js +1 -0
  386. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +2 -2
  387. package/package/components/triggers/http/utils.js +1 -1
  388. package/package/components/triggers/kafka/utils.js +1 -1
  389. package/package/components/triggers/mqtt/utils.js +1 -1
  390. package/package/components/triggers/nats/utils.js +1 -1
  391. package/package/components/triggers/postgres/utils.js +1 -1
  392. package/package/components/triggers/sqs/utils.js +1 -1
  393. package/package/components/triggers/utils.js +2 -1
  394. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
  395. package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
  396. package/package/components/triggers/websocket/utils.js +1 -1
  397. package/package/components/tutorials/FlowBuilderTutorialBranchOne.svelte +1 -1
  398. package/package/components/tutorials/FlowBuilderTutorialForLoop.svelte +4 -4
  399. package/package/components/tutorials/utils.js +3 -0
  400. package/package/components/worker_group.d.ts +4 -1
  401. package/package/components/worker_group.js +3 -2
  402. package/package/components/workspaceSettings/AISettings.svelte +52 -36
  403. package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
  404. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
  405. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
  406. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
  407. package/package/consts.js +2 -1
  408. package/package/editorLangUtils.d.ts +1 -1
  409. package/package/editorLangUtils.js +2 -0
  410. package/package/editorUtils.d.ts +2 -1
  411. package/package/editorUtils.js +2 -1
  412. package/package/gen/core/OpenAPI.js +1 -1
  413. package/package/gen/schemas.gen.d.ts +303 -14
  414. package/package/gen/schemas.gen.js +371 -76
  415. package/package/gen/services.gen.d.ts +136 -16
  416. package/package/gen/services.gen.js +264 -19
  417. package/package/gen/types.gen.d.ts +736 -17
  418. package/package/git-sync.d.ts +36 -0
  419. package/package/git-sync.js +1 -0
  420. package/package/hub.d.ts +1 -0
  421. package/package/hubPaths.json +9 -3
  422. package/package/infer.js +13 -3
  423. package/package/monaco_workers/graphql.worker.bundle.js +144 -110
  424. package/package/script_helpers.d.ts +5 -2
  425. package/package/script_helpers.js +87 -14
  426. package/package/scripts.d.ts +1 -1
  427. package/package/scripts.js +3 -2
  428. package/package/services/JobManager.d.ts +28 -0
  429. package/package/services/JobManager.js +114 -0
  430. package/package/stores.d.ts +3 -1
  431. package/package/stores.js +2 -0
  432. package/package/svelte5Utils.svelte.d.ts +16 -0
  433. package/package/svelte5Utils.svelte.js +26 -0
  434. package/package/utils.d.ts +19 -2
  435. package/package/utils.js +55 -2
  436. package/package.json +24 -22
  437. package/package/components/AllFlowLogs.svelte +0 -31
  438. package/package/components/AllFlowLogs.svelte.d.ts +0 -8
  439. package/package/components/InitGitRepoPopover.svelte +0 -410
  440. package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
  441. package/package/components/PullGitRepoPopover.svelte +0 -355
  442. package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
  443. package/package/components/copilot/chat/navigator/apiTools.d.ts +0 -68
  444. package/package/components/copilot/chat/navigator/apiTools.js +0 -258
  445. package/package/inferArgSig.d.ts +0 -42
  446. package/package/inferArgSig.js +0 -198
@@ -4,7 +4,7 @@ import { workspaceStore } from '../stores';
4
4
  import { base } from '../base';
5
5
  import FlowJobResult from './FlowJobResult.svelte';
6
6
  import DisplayResult from './DisplayResult.svelte';
7
- import { createEventDispatcher, getContext, setContext, tick, untrack } from 'svelte';
7
+ import { getContext, setContext, tick, untrack } from 'svelte';
8
8
  import { onDestroy } from 'svelte';
9
9
  import { Badge, Button, Skeleton, Tab } from './common';
10
10
  import Tabs from './common/tabs/Tabs.svelte';
@@ -16,19 +16,32 @@ import { ChevronDown, Hourglass } from 'lucide-svelte';
16
16
  import { deepEqual } from 'fast-equals';
17
17
  import FlowTimeline from './FlowTimeline.svelte';
18
18
  import { dfs } from './flows/dfs';
19
- import { get, writable } from 'svelte/store';
20
19
  import Alert from './common/alert/Alert.svelte';
21
20
  import FlowGraphViewerStep from './FlowGraphViewerStep.svelte';
22
21
  import FlowGraphV2 from './graph/FlowGraphV2.svelte';
23
22
  import { buildPrefix } from './graph/graphBuilder.svelte';
24
23
  import { parseInputArgsAssets } from './assets/lib';
25
24
  import FlowPreviewResult from './FlowPreviewResult.svelte';
25
+ import FlowLogViewerWrapper from './FlowLogViewerWrapper.svelte';
26
26
  import { createState } from '../svelte5Utils.svelte';
27
27
  import JobLoader from './JobLoader.svelte';
28
- const dispatch = createEventDispatcher();
28
+ import { writable } from 'svelte/store';
29
+ import { AI_TOOL_CALL_PREFIX, AI_TOOL_MESSAGE_PREFIX, getToolCallId } from './graph/renderers/nodes/AIToolNode.svelte';
29
30
  let { flowStateStore, retryStatus, suspendStatus, hideDownloadInGraph, hideTimeline, hideNodeDefinition, hideDownloadLogs, hideJobId } = getContext('FlowStatusViewer');
30
- let { jobId, initialJob = undefined, workspaceId = undefined, flowJobIds = undefined, innerModule = undefined, globalRefreshes = $bindable({}), render = true, isOwner = false, selectedNode = $bindable(undefined), globalModuleStates, globalDurationStatuses, childFlow = false, isSubflow = false, reducedPolling = false, wideResults = false, hideFlowResult = false, workspace = $workspaceStore, prefix = undefined, subflowParentsGlobalModuleStates = [], subflowParentsDurationStatuses = [], isForloopSelected = false, parentRecursiveRefresh = $bindable({}), job = $bindable(undefined), rightColumnSelect = $bindable('timeline'), localModuleStates = writable({}), localDurationStatuses = writable({}), customUi } = $props();
31
+ let { jobId, initialJob = undefined, workspaceId = undefined, flowJobIds = undefined, innerModule = undefined, render = true, isOwner = false, selectedNode = $bindable(undefined), globalModuleStates, globalDurationStatuses = [], globalIterationBounds, updateRecursiveRefreshFn = undefined, isSelectedBranch = true, isSubflow = false, reducedPolling = false, wideResults = false, hideFlowResult = false, workspace = $workspaceStore, prefix = undefined, topModuleStates = undefined, refreshGlobal, updateGlobalRefresh, subflowParentsGlobalModuleStates = [], subflowParentsDurationStatuses = [], isForloopSelected = false, job = $bindable(undefined), rightColumnSelect = $bindable('timeline'), localModuleStates = $bindable({}), localDurationStatuses = $bindable({}), customUi, onResultStreamUpdate = undefined, graphTabOpen, isNodeSelected, loadExtraLogs = undefined, onStart = undefined, onJobsLoaded = undefined, onDone = undefined } = $props();
32
+ let getTopModuleStates = $derived(topModuleStates ?? localModuleStates);
33
+ let resultStreams = $state({});
34
+ if (onResultStreamUpdate == undefined) {
35
+ onResultStreamUpdate = ({ jobId, result_stream }) => {
36
+ resultStreams[jobId] = result_stream;
37
+ };
38
+ }
31
39
  let recursiveRefresh = $state({});
40
+ let updateRecursiveRefreshInner = (childJobId, updateFn) => {
41
+ if (childJobId) {
42
+ recursiveRefresh[childJobId] = updateFn;
43
+ }
44
+ };
32
45
  // Add support for the input args assets shown as an asset node
33
46
  const _flowGraphAssetsCtx = getContext('FlowGraphAssetContext');
34
47
  let extendedFlowGraphAssetsCtx = $state(createState(clone(_flowGraphAssetsCtx)));
@@ -62,178 +75,179 @@ let timeout = undefined;
62
75
  let expandedSubflows = $state({});
63
76
  let selectedId = writable(selectedNode);
64
77
  function onFlowModuleId() {
65
- if (globalRefreshes) {
66
- let modId = flowJobIds?.moduleId;
67
- if (modId) {
68
- globalRefreshes[buildSubflowKey(modId, prefix)] = async (clear, root) => {
69
- await refresh(clear, root); // refresh(true, loopJob)
70
- };
71
- }
78
+ let modId = flowJobIds?.moduleId;
79
+ if (modId) {
80
+ let prefixedId = buildSubflowKey(modId, prefix);
81
+ updateGlobalRefresh(prefixedId, async (clear, root) => {
82
+ // console.debug('updateGlobalRefreshInner refresh', prefixedId, clear, root)
83
+ await refresh(clear, root); // refresh(true, loopJob)
84
+ });
72
85
  }
73
86
  }
74
87
  function updateModuleStates(moduleState, key, newValue, keepType) {
75
- const state = get(moduleState);
76
88
  if (newValue.selectedForloop != undefined &&
77
- state[key]?.selectedForloop != undefined &&
78
- newValue.selectedForloop != state[key].selectedForloop) {
79
- if (newValue.type == 'InProgress' && state[key]?.type != 'InProgress') {
80
- moduleState.update((state) => {
81
- state[key].type = 'InProgress';
82
- return state;
83
- });
89
+ moduleState[key]?.selectedForloop != undefined &&
90
+ newValue.selectedForloop != moduleState[key].selectedForloop) {
91
+ let newState = { ...moduleState[key] };
92
+ if (newValue.type == 'InProgress' &&
93
+ moduleState[key]?.type != 'InProgress' &&
94
+ !(keepType &&
95
+ (moduleState[key]?.type === 'Success' || moduleState[key]?.type === 'Failure'))) {
96
+ newState.type = 'InProgress';
84
97
  }
85
- if (state[key]?.job_id != newValue.job_id ||
86
- !deepEqual(state[key]?.args, newValue.args) ||
87
- !deepEqual(state[key]?.result, newValue.result)) {
88
- moduleState.update((state) => {
89
- state[key].args = newValue.args;
90
- state[key].result = newValue.result;
91
- state[key].job_id = newValue.job_id;
92
- return state;
93
- });
98
+ else if (['Success', 'Failure'].includes(newValue.type)) {
99
+ newState.type = newValue.type;
100
+ }
101
+ if (moduleState[key]?.job_id != newValue.job_id ||
102
+ !deepEqual(moduleState[key]?.args, newValue.args) ||
103
+ !deepEqual(moduleState[key]?.result, newValue.result)) {
104
+ newState.args = newValue.args;
105
+ newState.result = newValue.result;
106
+ newState.job_id = newValue.job_id;
94
107
  }
108
+ moduleState[key] = newState;
95
109
  return;
96
110
  }
97
- if (state[key]?.selectedForLoopSetManually) {
111
+ if (moduleState[key]?.selectedForLoopSetManually) {
98
112
  if (newValue.selectedForloop != undefined &&
99
- state[key]?.selectedForloop != newValue.selectedForloop) {
100
- return state;
113
+ moduleState[key]?.selectedForloop != newValue.selectedForloop) {
114
+ return moduleState;
101
115
  }
102
116
  else {
103
117
  newValue.selectedForLoopSetManually = true;
104
- newValue.selectedForloopIndex = state[key]?.selectedForloopIndex;
105
- newValue.selectedForloop = state[key]?.selectedForloop;
118
+ newValue.selectedForloopIndex = moduleState[key]?.selectedForloopIndex;
119
+ newValue.selectedForloop = moduleState[key]?.selectedForloop;
106
120
  }
107
121
  }
108
- else if (state[key]?.selectedForloopIndex != undefined) {
109
- newValue.selectedForloopIndex = state[key]?.selectedForloopIndex;
110
- newValue.selectedForloop = state[key]?.selectedForloop;
122
+ else if (moduleState[key]?.selectedForloopIndex != undefined) {
123
+ newValue.selectedForloopIndex = moduleState[key]?.selectedForloopIndex;
124
+ newValue.selectedForloop = moduleState[key]?.selectedForloop;
111
125
  }
112
- if (keepType && (state[key]?.type == 'Success' || state[key]?.type == 'Failure')) {
113
- newValue.type = state[key].type;
126
+ if (keepType && (moduleState[key]?.type == 'Success' || moduleState[key]?.type == 'Failure')) {
127
+ newValue.type = moduleState[key].type;
114
128
  }
115
- if (!deepEqual(state[key], newValue)) {
116
- moduleState.update((state) => {
117
- state[key] = newValue;
118
- return state;
119
- });
129
+ if (!deepEqual(moduleState[key], newValue)) {
130
+ // console.debug('updateModuleStates 2', key, $state.snapshot(moduleState))
131
+ moduleState[key] = newValue;
120
132
  }
121
133
  }
122
134
  function buildSubflowKey(key, prefix) {
123
135
  return prefix ? 'subflow:' + prefix + key : key;
124
136
  }
125
137
  async function refresh(clearLoop, rootJob) {
138
+ console.debug('refresh', clearLoop, rootJob);
126
139
  let modId = flowJobIds?.moduleId;
140
+ let topModuleStates = getTopModuleStates;
127
141
  if (clearLoop) {
128
142
  if (!rootJob) {
129
- let topLevelModuleStates = globalModuleStates?.[globalModuleStates?.length - 1];
130
- if (modId) {
131
- topLevelModuleStates?.update((x) => {
132
- if (modId) {
133
- delete x[modId];
134
- }
135
- return x;
136
- });
143
+ if (modId && topModuleStates) {
144
+ let prefixedId = buildSubflowKey(modId, prefix);
145
+ delete topModuleStates[prefixedId]; // TODO: this is not working
137
146
  }
138
147
  if (subflowParentsGlobalModuleStates.length > 0) {
139
- subflowParentsGlobalModuleStates?.[subflowParentsGlobalModuleStates?.length - 1]?.update((x) => {
140
- for (let mod of innerModules ?? []) {
141
- if (mod.id) {
142
- delete x[buildSubflowKey(mod.id, prefix)];
143
- }
148
+ let subflowModuleStates = subflowParentsGlobalModuleStates?.[subflowParentsGlobalModuleStates?.length - 1];
149
+ for (let mod of innerModules ?? []) {
150
+ if (mod.id) {
151
+ delete subflowModuleStates[buildSubflowKey(mod.id, prefix)];
144
152
  }
145
- return x;
146
- });
153
+ }
147
154
  }
148
155
  else {
149
- topLevelModuleStates?.update((x) => {
150
- for (let mod of innerModules ?? []) {
151
- if (mod.id) {
152
- delete x[mod.id];
153
- }
156
+ for (let mod of innerModules ?? []) {
157
+ if (mod.id && topModuleStates) {
158
+ let prefixedId = buildSubflowKey(mod.id, prefix);
159
+ delete topModuleStates[prefixedId];
154
160
  }
155
- return x;
156
- });
161
+ }
157
162
  }
158
163
  }
159
164
  }
160
165
  else {
161
- let state = modId ? getTopModuleStates()?.[modId] : undefined;
166
+ let state = modId ? topModuleStates?.[buildSubflowKey(modId, prefix)] : undefined;
162
167
  let loopjob = state?.selectedForloop;
163
168
  let njob = flowJobIds && modId && loopjob ? storedListJobs?.[loopjob] : job;
164
169
  if (njob) {
165
- dispatch('jobsLoaded', { job: njob, force: true });
170
+ onJobsLoaded?.({ job: njob, force: true });
166
171
  }
167
172
  }
168
- for (let [k, rec] of Object.entries(recursiveRefresh)) {
169
- if (rootJob != undefined && rootJob != k) {
170
- continue;
171
- }
173
+ let callRec = async (rec) => {
172
174
  await tick();
173
175
  await rec(clearLoop, undefined);
176
+ };
177
+ if (rootJob) {
178
+ let rec = recursiveRefresh[rootJob];
179
+ if (rec) {
180
+ await callRec(rec);
181
+ // console.debug('refresh recursive 1', rec)
182
+ }
183
+ else {
184
+ // console.debug('refresh recursive no rec', rootJob)
185
+ }
186
+ }
187
+ else {
188
+ for (let rec of Object.values(recursiveRefresh)) {
189
+ await callRec(rec);
190
+ // console.debug('refresh recursive 2', rec)
191
+ }
174
192
  }
175
193
  }
176
194
  function updateRecursiveRefresh(jobId) {
177
195
  if (jobId) {
178
- parentRecursiveRefresh[jobId] = async (clear, root) => {
196
+ updateRecursiveRefreshFn?.(jobId, async (clear, root) => {
179
197
  if (globalModuleStates.length > 0 || isSubflow) {
180
198
  await refresh(clear, root);
181
199
  }
182
- };
200
+ });
183
201
  }
184
202
  }
185
203
  function setModuleState(key, value, force, keepType) {
186
- let newValue = { ...($localModuleStates[key] ?? {}), ...value };
187
- if (!deepEqual($localModuleStates[key], value) || force) {
204
+ let newValue = { ...(localModuleStates[key] ?? {}), ...value };
205
+ if (!deepEqual(localModuleStates[key], value) || force) {
206
+ // console.debug('setModuleState', key, force, keepType, $state.snapshot(value))
188
207
  ;
189
208
  [localModuleStates, ...globalModuleStates].forEach((s) => {
190
209
  updateModuleStates(s, key, newValue, keepType);
191
210
  });
192
211
  if (prefix) {
193
- subflowParentsGlobalModuleStates.forEach((s) => updateModuleStates(s, buildSubflowKey(key, prefix), newValue, keepType));
212
+ let prefixedId = buildSubflowKey(key, prefix);
213
+ subflowParentsGlobalModuleStates.forEach((s) => {
214
+ updateModuleStates(s, prefixedId, newValue, keepType);
215
+ });
194
216
  }
195
217
  }
196
218
  }
197
219
  function setDurationStatusByJob(key, id, value) {
198
- if (!deepEqual($localDurationStatuses[key]?.byJob[id], value)) {
199
- $localDurationStatuses[key].byJob[id] = value;
220
+ if (!deepEqual(localDurationStatuses[key]?.byJob[id], value)) {
221
+ localDurationStatuses[key].byJob[id] = value;
200
222
  globalDurationStatuses.forEach((s) => {
201
- s.update((x) => {
202
- x[key].byJob[id] = value;
203
- return x;
204
- });
223
+ s[key].byJob[id] = value;
205
224
  });
206
225
  if (prefix) {
207
226
  subflowParentsDurationStatuses.forEach((s) => {
208
- s.update((x) => {
209
- x[buildSubflowKey(key, prefix)].byJob[id] = value;
210
- return x;
211
- });
227
+ s[buildSubflowKey(key, prefix)].byJob[id] = value;
212
228
  });
213
229
  }
214
230
  }
215
231
  }
216
232
  function initializeByJob(modId) {
217
- if ($localDurationStatuses[modId] == undefined) {
218
- $localDurationStatuses[modId] = { byJob: {} };
233
+ if (localDurationStatuses[modId] == undefined) {
234
+ localDurationStatuses[modId] = { byJob: {} };
219
235
  }
220
- globalDurationStatuses.forEach((x) => x.update((x) => {
236
+ globalDurationStatuses.forEach((x) => {
221
237
  if (x[modId] == undefined) {
222
238
  x[modId] = { byJob: {} };
223
239
  }
224
- return x;
225
- }));
240
+ });
226
241
  if (prefix) {
227
- subflowParentsDurationStatuses.forEach((x) => x.update((x) => {
242
+ subflowParentsDurationStatuses.forEach((x) => {
228
243
  let key = buildSubflowKey(modId, prefix);
229
244
  if (x[key] == undefined) {
230
245
  x[key] = { byJob: {} };
231
246
  }
232
- return x;
233
- }));
247
+ });
234
248
  }
235
249
  }
236
- let innerModules = $state([]);
250
+ let innerModules = $state(undefined);
237
251
  function updateStatus(status) {
238
252
  innerModules =
239
253
  status?.modules?.concat(status.failure_module.type != 'WaitingForPriorSteps' ? status.failure_module : []) ?? [];
@@ -243,29 +257,27 @@ function updateStatus(status) {
243
257
  updateInnerModules();
244
258
  let count = status.retry?.fail_count;
245
259
  if (count) {
246
- $retryStatus[jobId ?? ''] = count;
260
+ retryStatus.val[jobId ?? ''] = count;
247
261
  }
248
- else if ($retryStatus[jobId ?? ''] != undefined) {
249
- delete $retryStatus[jobId ?? ''];
250
- $retryStatus = $retryStatus;
262
+ else if (retryStatus.val[jobId ?? ''] != undefined) {
263
+ delete retryStatus.val[jobId ?? ''];
251
264
  }
252
265
  let jobStatus = job?.flow_status?.modules?.[job?.flow_status.step];
253
266
  if (jobStatus && jobStatus.count != undefined) {
254
- $suspendStatus[jobId ?? ''] = { nb: jobStatus.count, job: job };
267
+ suspendStatus.val[jobId ?? ''] = { nb: jobStatus.count, job: job };
255
268
  }
256
- else if ($suspendStatus[jobId ?? ''] != undefined) {
257
- delete $suspendStatus[jobId ?? ''];
258
- $suspendStatus = $suspendStatus;
269
+ else if (suspendStatus.val[jobId ?? ''] != undefined) {
270
+ delete suspendStatus.val[jobId ?? ''];
259
271
  }
260
272
  }
261
273
  function updateInnerModules() {
262
- if ($localModuleStates) {
263
- innerModules.forEach((mod, i) => {
274
+ if (localModuleStates) {
275
+ innerModules?.forEach((mod, i) => {
264
276
  if (mod.type === 'WaitingForEvents' && innerModules?.[i - 1]?.type === 'Success') {
265
277
  setModuleState(mod.id ?? '', { type: mod.type, args: job?.args, tag: job?.tag });
266
278
  }
267
279
  else if (mod.type === 'WaitingForExecutor' &&
268
- $localModuleStates[mod.id ?? '']?.scheduled_for == undefined) {
280
+ localModuleStates[mod.id ?? '']?.scheduled_for == undefined) {
269
281
  JobService.getJob({
270
282
  workspace: workspaceId ?? $workspaceStore ?? '',
271
283
  id: mod.job ?? '',
@@ -289,12 +301,13 @@ function updateInnerModules() {
289
301
  }
290
302
  else if ((mod.flow_jobs || mod.branch_chosen) &&
291
303
  (mod.type == 'Success' || mod.type == 'Failure') &&
292
- !['Success', 'Failure'].includes($localModuleStates?.[mod.id ?? '']?.type)) {
304
+ !['Success', 'Failure'].includes(localModuleStates?.[mod.id ?? '']?.type)) {
293
305
  let branchChosen = mod.branch_chosen
294
306
  ? {
295
307
  branchChosen: mod.branch_chosen.type == 'default' ? 0 : (mod.branch_chosen.branch ?? 0) + 1
296
308
  }
297
309
  : {};
310
+ console.debug('updateInnerModules', mod.id, mod.type, branchChosen);
298
311
  setModuleState(mod.id ?? '', {
299
312
  type: mod.type,
300
313
  ...branchChosen
@@ -303,9 +316,34 @@ function updateInnerModules() {
303
316
  else if (isForloopSelected) {
304
317
  setModuleState(mod.id ?? '', {}, true);
305
318
  }
306
- if (mod.flow_jobs_success) {
319
+ if (mod.flow_jobs_success || mod.flow_jobs) {
307
320
  setModuleState(mod.id ?? '', {
308
- flow_jobs_success: mod.flow_jobs_success
321
+ flow_jobs_success: mod.flow_jobs_success,
322
+ flow_jobs: mod.flow_jobs,
323
+ iteration_total: mod.iterator?.itered?.length ?? mod.flow_jobs?.length
324
+ });
325
+ }
326
+ if (mod.agent_actions && mod.id) {
327
+ setModuleState(mod.id, {
328
+ agent_actions: mod.agent_actions
329
+ });
330
+ mod.agent_actions.forEach((action, idx) => {
331
+ if (mod.id) {
332
+ if (action.type == 'tool_call') {
333
+ const toolCallId = getToolCallId(idx, mod.id, action.module_id);
334
+ const success = mod.agent_actions_success?.[idx];
335
+ setModuleState(toolCallId, {
336
+ job_id: action.job_id,
337
+ type: success != undefined ? (success ? 'Success' : 'Failure') : 'InProgress'
338
+ });
339
+ }
340
+ else if (action.type == 'message') {
341
+ const toolCallId = getToolCallId(idx, mod.id);
342
+ setModuleState(toolCallId, {
343
+ type: 'Success'
344
+ });
345
+ }
346
+ }
309
347
  });
310
348
  }
311
349
  });
@@ -331,20 +369,20 @@ let notAnonynmous = $state(false);
331
369
  let started = false;
332
370
  let jobLoader = undefined;
333
371
  function setJob(newJob, force) {
334
- if (!deepEqual(job, newJob) || isForloopSelected || force) {
372
+ if (!deepEqual(job, newJob) || isForloopSelected || force || innerModules == undefined) {
335
373
  job = newJob;
336
374
  job?.flow_status && updateStatus(job?.flow_status);
337
- dispatch('jobsLoaded', { job, force: false });
375
+ onJobsLoaded?.({ job, force: false });
338
376
  notAnonynmous = false;
339
377
  if (job?.type == 'CompletedJob' && !destroyed) {
340
- dispatch('done', job);
378
+ onDone?.({ job });
341
379
  }
342
380
  }
343
381
  }
344
382
  async function loadJobInProgress() {
345
383
  if (!started) {
346
384
  started = true;
347
- dispatch('start');
385
+ onStart?.();
348
386
  }
349
387
  if (jobId != '00000000-0000-0000-0000-000000000000') {
350
388
  try {
@@ -357,6 +395,17 @@ async function loadJobInProgress() {
357
395
  jobLoader?.watchJob(jobId, {
358
396
  change(newJob) {
359
397
  setJob(newJob, true);
398
+ },
399
+ resultStreamUpdate({ id, result_stream }) {
400
+ onResultStreamUpdate?.({ jobId: id, result_stream });
401
+ },
402
+ loadExtraLogs({ id, logs }) {
403
+ if (id == jobId && job) {
404
+ job.logs = logs;
405
+ }
406
+ if (loadExtraLogs) {
407
+ loadExtraLogs(logs);
408
+ }
360
409
  }
361
410
  });
362
411
  }
@@ -374,61 +423,41 @@ async function loadJobInProgress() {
374
423
  let destroyed = false;
375
424
  updateRecursiveRefresh(jobId);
376
425
  async function updateJobId() {
377
- if (jobId !== job?.id) {
378
- $localModuleStates = {};
426
+ if (jobId !== job?.id || innerModules == undefined) {
427
+ localModuleStates = {};
379
428
  flowTimeline?.reset();
380
429
  timeout && clearTimeout(timeout);
381
- innerModules = [];
430
+ innerModules = undefined;
431
+ console.log('updateJobId', jobId);
382
432
  if (flowJobIds) {
383
433
  let modId = flowJobIds?.moduleId ?? '';
384
- let common = {
434
+ if (localDurationStatuses[modId] == undefined) {
435
+ localDurationStatuses[modId] = { byJob: {} };
436
+ }
437
+ let prefixed = buildSubflowKey(modId, prefix);
438
+ globalDurationStatuses.forEach((x) => {
439
+ if (x[prefixed] == undefined) {
440
+ x[prefixed] = { byJob: {} };
441
+ }
442
+ });
443
+ globalIterationBounds[prefixed] = {
385
444
  iteration_from: flowJobIds?.branchall ? 0 : Math.max(flowJobIds.flowJobs.length - 20, 0),
386
- iteration_total: $localDurationStatuses?.[modId]?.iteration_total ?? flowJobIds?.length
387
- };
388
- $localDurationStatuses[modId] = {
389
- ...($localDurationStatuses[modId] ?? { byJob: {} }),
390
- ...common
445
+ iteration_total: flowJobIds?.length
391
446
  };
392
- let prefixed = modId;
393
- globalDurationStatuses.forEach((x) => x.update((x) => {
394
- x[prefixed] = { ...(x[prefixed] ?? { byJob: {} }), ...common };
395
- return x;
396
- }));
397
447
  }
398
448
  else {
399
- updateRecursiveRefresh(jobId);
400
449
  recursiveRefresh = {};
401
- $localDurationStatuses = {};
450
+ localDurationStatuses = {};
451
+ updateRecursiveRefresh(jobId);
402
452
  }
403
453
  await loadJobInProgress();
404
454
  }
405
455
  }
406
- function getTopModuleStates() {
407
- return get(globalModuleStates?.[globalModuleStates?.length - 1]);
408
- }
409
- let forloop_selected = $state(getTopModuleStates()?.[flowJobIds?.moduleId ?? '']?.selectedForloop);
410
- let sub = undefined;
411
- let timeoutForloopSelectedSub = undefined;
412
- let timeoutForloopSelected = undefined;
413
- function onModuleIdChange() {
414
- clearTimeout(timeoutForloopSelectedSub);
415
- timeoutForloopSelectedSub = setTimeout(() => {
416
- sub?.();
417
- sub = globalModuleStates?.[globalModuleStates?.length - 1].subscribe((x) => {
418
- const newForloopSelected = x[flowJobIds?.moduleId ?? '']?.selectedForloop;
419
- if (newForloopSelected != forloop_selected) {
420
- clearTimeout(timeoutForloopSelected);
421
- timeoutForloopSelected = setTimeout(() => {
422
- forloop_selected = newForloopSelected;
423
- }, 200);
424
- }
425
- });
426
- }, 200);
427
- }
456
+ let forloop_selected = $state(getTopModuleStates?.[buildSubflowKey(flowJobIds?.moduleId ?? '', prefix)]?.selectedForloop);
428
457
  onDestroy(() => {
429
458
  destroyed = true;
430
459
  timeout && clearTimeout(timeout);
431
- sub?.();
460
+ // sub?.()
432
461
  });
433
462
  function isSuccess(arg) {
434
463
  if (arg == undefined) {
@@ -438,24 +467,23 @@ function isSuccess(arg) {
438
467
  return arg == true;
439
468
  }
440
469
  }
441
- function onJobsLoaded(mod, job, force) {
442
- if (mod.id && (mod.flow_jobs ?? []).length == 0) {
443
- if (!childFlow) {
444
- if ($flowStateStore?.[mod.id]) {
445
- $flowStateStore[mod.id] = {
446
- ...$flowStateStore[mod.id],
447
- previewResult: job['result'],
448
- previewArgs: job.args,
449
- previewJobId: job.id,
450
- previewWorkspaceId: job.workspace_id,
451
- previewSuccess: job['success']
452
- };
453
- }
470
+ function onJobsLoadedInner(mod, job, force) {
471
+ let id = mod.id;
472
+ if (id && ((mod.flow_jobs ?? []).length == 0 || force)) {
473
+ // console.debug('onJobsLoadedInner', id, job.id, force)
474
+ if (flowStateStore) {
475
+ flowStateStore[buildSubflowKey(id, prefix)] = {
476
+ ...(flowStateStore?.[buildSubflowKey(id, prefix)] ?? {}),
477
+ previewResult: job['result'],
478
+ previewArgs: job.args,
479
+ previewJobId: job.id,
480
+ previewSuccess: job['success']
481
+ };
454
482
  }
455
- initializeByJob(mod.id);
483
+ initializeByJob(id);
456
484
  let started_at = job.started_at ? new Date(job.started_at).getTime() : undefined;
457
485
  if (job.type == 'QueuedJob') {
458
- setModuleState(mod.id, {
486
+ setModuleState(id, {
459
487
  type: 'InProgress',
460
488
  job_id: job.id,
461
489
  logs: job.logs,
@@ -464,7 +492,7 @@ function onJobsLoaded(mod, job, force) {
464
492
  started_at,
465
493
  parent_module: mod['parent_module']
466
494
  }, force);
467
- setDurationStatusByJob(mod.id, job.id, {
495
+ setDurationStatusByJob(id, job.id, {
468
496
  created_at: job.created_at ? new Date(job.created_at).getTime() : undefined,
469
497
  started_at
470
498
  });
@@ -472,8 +500,8 @@ function onJobsLoaded(mod, job, force) {
472
500
  else {
473
501
  const parent_module = mod['parent_module'];
474
502
  // Delete existing failure node attached to the same parent module
475
- removeFailureNode(mod.id, parent_module);
476
- setModuleState(mod.id, {
503
+ removeFailureNode(id, parent_module);
504
+ setModuleState(id, {
477
505
  args: job.args,
478
506
  type: job['success'] ? 'Success' : 'Failure',
479
507
  logs: job.logs,
@@ -487,10 +515,11 @@ function onJobsLoaded(mod, job, force) {
487
515
  flow_jobs_success: mod.flow_jobs_success,
488
516
  iteration_total: mod.iterator?.itered?.length,
489
517
  retries: mod?.failed_retries?.length,
490
- skipped: mod.skipped
491
- // retries: $flowStateStore?.raw_flow
518
+ skipped: mod.skipped,
519
+ agent_actions: mod.agent_actions
520
+ // retries: flowStateStore?.raw_flow
492
521
  }, force);
493
- setDurationStatusByJob(mod.id, job.id, {
522
+ setDurationStatusByJob(id, job.id, {
494
523
  created_at: job.created_at ? new Date(job.created_at).getTime() : undefined,
495
524
  started_at,
496
525
  duration_ms: job['duration_ms']
@@ -500,11 +529,11 @@ function onJobsLoaded(mod, job, force) {
500
529
  }
501
530
  async function setIteration(j, id, clicked, modId, isForloop) {
502
531
  if (modId) {
503
- let globalState = globalModuleStates?.[globalModuleStates?.length - 1];
504
- let globalStateGet = globalState ? get(globalState) : undefined;
505
- let state = globalStateGet?.[modId];
532
+ let prefixedId = buildSubflowKey(modId, prefix);
533
+ let topModuleStates = getTopModuleStates;
534
+ let state = topModuleStates?.[prefixedId];
506
535
  if (clicked && state?.selectedForloop) {
507
- await globalRefreshes?.[modId]?.(true, state.selectedForloop);
536
+ await refreshGlobal?.(prefixedId, true, state.selectedForloop);
508
537
  }
509
538
  let manualOnce = state?.selectedForLoopSetManually;
510
539
  if (clicked ||
@@ -520,20 +549,19 @@ async function setIteration(j, id, clicked, modId, isForloop) {
520
549
  const selectedNotEqual = id != state?.selectedForloop ||
521
550
  j != state?.selectedForloopIndex ||
522
551
  setManually != state?.selectedForLoopSetManually;
552
+ // console.debug('setIteration', selectedNotEqual, state, topModuleStates)
523
553
  if (selectedNotEqual) {
524
- globalState?.update((topLevelModuleStates) => {
525
- topLevelModuleStates[modId] = {
554
+ if (topModuleStates) {
555
+ topModuleStates[prefixedId] = {
526
556
  type: 'WaitingForPriorSteps',
527
557
  args: {},
528
558
  ...newState
529
559
  };
530
- return topLevelModuleStates;
531
- // clicked && callGlobRefresh(modId, {index: j, job: id, selectedManually: setManually ?? false})
532
- });
560
+ }
533
561
  }
534
562
  }
535
563
  if (clicked) {
536
- await globalRefreshes?.[modId]?.(false, id);
564
+ await refreshGlobal?.(prefixedId, false, id);
537
565
  }
538
566
  }
539
567
  }
@@ -541,27 +569,31 @@ function innerJobLoaded(jobLoaded, j, clicked, force) {
541
569
  let modId = flowJobIds?.moduleId;
542
570
  if (modId) {
543
571
  setIteration(j, jobLoaded.id, clicked, modId, innerModule?.type == 'forloopflow' || innerModule?.type == 'whileloopflow');
544
- if ($flowStateStore && $flowStateStore?.[modId] == undefined) {
545
- $flowStateStore[modId] = {
546
- ...($flowStateStore[modId] ?? {}),
547
- previewResult: jobLoaded.args
548
- };
572
+ let prefixedId = buildSubflowKey(modId, prefix);
573
+ // if (flowStateStore) {
574
+ // flowStateStore[modId] = {
575
+ // ...((flowStateStore[modId] as object) ?? {}),
576
+ // previewResult: jobLoaded.args
577
+ // }
578
+ // }
579
+ if (flowStateStore && flowStateStore[prefixedId] == undefined) {
580
+ flowStateStore[prefixedId] = {};
549
581
  }
550
- if ($flowStateStore?.[modId]) {
551
- if (!childFlow) {
552
- if (!$flowStateStore[modId].previewResult ||
553
- !Array.isArray($flowStateStore[modId]?.previewResult)) {
554
- $flowStateStore[modId].previewResult = [];
555
- }
556
- $flowStateStore[modId].previewArgs = jobLoaded.args;
582
+ if (flowStateStore) {
583
+ if (!flowStateStore?.[prefixedId]?.previewResult ||
584
+ !Array.isArray(flowStateStore[prefixedId]?.previewResult)) {
585
+ flowStateStore[prefixedId].previewResult = [];
557
586
  }
558
- if (jobLoaded.type == 'QueuedJob') {
559
- jobResults[j] = 'Job in progress ...';
560
- }
561
- else if (jobLoaded.type == 'CompletedJob') {
562
- $flowStateStore[modId].previewResult[j] = jobLoaded.result;
563
- jobResults[j] = jobLoaded.result;
587
+ flowStateStore[prefixedId].previewArgs = jobLoaded.args;
588
+ }
589
+ if (jobLoaded.type == 'QueuedJob') {
590
+ jobResults[j] = 'Job in progress ...';
591
+ }
592
+ else if (jobLoaded.type == 'CompletedJob') {
593
+ if (flowStateStore?.[prefixedId]) {
594
+ flowStateStore[prefixedId].previewResult[j] = jobLoaded.result;
564
595
  }
596
+ jobResults[j] = jobLoaded.result;
565
597
  }
566
598
  let started_at = jobLoaded.started_at ? new Date(jobLoaded.started_at).getTime() : undefined;
567
599
  let created_at = jobLoaded.created_at ? new Date(jobLoaded.created_at).getTime() : undefined;
@@ -574,14 +606,14 @@ function innerJobLoaded(jobLoaded, j, clicked, force) {
574
606
  iteration_total: flowJobIds?.length,
575
607
  duration_ms: undefined
576
608
  };
577
- let currentIndex = getTopModuleStates()?.[modId]?.selectedForloopIndex == j;
609
+ let currentIndex = getTopModuleStates?.[prefixedId]?.selectedForloopIndex == j;
578
610
  if (currentIndex) {
579
611
  v.logs = jobLoaded.logs;
580
612
  v.args = jobLoaded.args;
581
613
  v.job_id = jobLoaded.id;
582
614
  }
583
615
  if (jobLoaded.type == 'QueuedJob') {
584
- if (started_at && $localModuleStates[modId]?.type != 'InProgress') {
616
+ if (started_at && localModuleStates[modId]?.type != 'InProgress') {
585
617
  v.type = 'InProgress';
586
618
  }
587
619
  }
@@ -612,47 +644,42 @@ function innerJobLoaded(jobLoaded, j, clicked, force) {
612
644
  id = innerModule?.modules?.[0]?.id;
613
645
  }
614
646
  if (id) {
615
- onJobsLoaded({ id }, jobLoaded);
647
+ onJobsLoadedInner({ id }, jobLoaded);
616
648
  }
617
649
  }
618
650
  }
619
651
  }
620
652
  let flowTimeline = $state();
621
- function loadPreviousIters(lenToAdd) {
622
- let r = $localDurationStatuses[flowJobIds?.moduleId ?? ''];
623
- if (r.iteration_from) {
624
- r.iteration_from -= lenToAdd;
625
- $localDurationStatuses = $localDurationStatuses;
626
- globalDurationStatuses.forEach((x) => x.update((x) => x));
653
+ function loadPreviousIters(innerKey, lenToAdd) {
654
+ let key = buildSubflowKey(innerKey, prefix);
655
+ if (globalIterationBounds[key]) {
656
+ globalIterationBounds[key].iteration_from =
657
+ (globalIterationBounds[key]?.iteration_from ?? 0) - lenToAdd;
627
658
  }
628
- jobResults = [
629
- ...[...new Array(lenToAdd).keys()].map((x) => 'not computed or loaded yet'),
630
- ...jobResults
631
- ];
632
659
  // updateSlicedListJobIds()
633
660
  }
634
661
  let stepDetail = $state(undefined);
635
662
  let storedListJobs = $state({});
663
+ let storedToolCallJobs = $state({});
664
+ let selectedToolCall = $state(undefined);
665
+ let toolCallIndicesToLoad = $state([]);
636
666
  let wrapperHeight = $state(0);
637
667
  function removeFailureNode(id, parent_module) {
638
668
  if (id?.startsWith('failure-') && parent_module) {
639
669
  ;
640
- [...globalModuleStates, localModuleStates].forEach((stateMapStore) => {
641
- stateMapStore.update((stateMap) => {
642
- if (id) {
643
- Object.keys(stateMap).forEach((key) => {
644
- if (stateMap[key]?.parent_module == parent_module) {
645
- delete stateMap[key];
646
- }
647
- });
648
- }
649
- return stateMap;
650
- });
670
+ [...globalModuleStates, localModuleStates].forEach((stateMap) => {
671
+ if (id) {
672
+ Object.keys(stateMap).forEach((key) => {
673
+ if (stateMap[key]?.parent_module == parent_module) {
674
+ delete stateMap[key];
675
+ }
676
+ });
677
+ }
651
678
  });
652
679
  }
653
680
  }
654
681
  function allModulesForTimeline(modules, expandedSubflows) {
655
- const ids = dfs(modules, (x) => x.id);
682
+ const ids = dfs(modules, (x) => x.id, { skipToolNodes: true });
656
683
  function rec(ids, prefix) {
657
684
  return ids.concat(ids.flatMap((id) => {
658
685
  let fms = expandedSubflows[id];
@@ -669,6 +696,45 @@ function allModulesForTimeline(modules, expandedSubflows) {
669
696
  return rec(ids, undefined);
670
697
  }
671
698
  let subflowsSize = $state(500);
699
+ function setParentModuleState(modId, state) {
700
+ ;
701
+ [localModuleStates, ...globalModuleStates].forEach((stateMap) => {
702
+ if (stateMap[modId]) {
703
+ stateMap[modId] = { ...stateMap[modId], ...state };
704
+ }
705
+ });
706
+ if (prefix) {
707
+ let prefixedId = buildSubflowKey(modId, prefix);
708
+ subflowParentsGlobalModuleStates.forEach((stateMap) => {
709
+ if (stateMap[prefixedId]) {
710
+ stateMap[prefixedId] = { ...stateMap[prefixedId], ...state };
711
+ }
712
+ });
713
+ }
714
+ }
715
+ async function onSelectedIteration(detail) {
716
+ let prefixedId = buildSubflowKey(detail.moduleId, prefix);
717
+ if (detail.manuallySet) {
718
+ let rootJobId = detail.id;
719
+ await tick();
720
+ let previousId = getTopModuleStates?.[prefixedId]?.selectedForloop;
721
+ if (previousId) {
722
+ await refreshGlobal?.(prefixedId, true, previousId);
723
+ }
724
+ setParentModuleState(detail.moduleId, {
725
+ selectedForloop: detail.id,
726
+ selectedForloopIndex: detail.index,
727
+ selectedForLoopSetManually: true
728
+ });
729
+ await tick();
730
+ await refreshGlobal?.(prefixedId, false, rootJobId);
731
+ }
732
+ else {
733
+ setParentModuleState(detail.moduleId, {
734
+ selectedForLoopSetManually: false
735
+ });
736
+ }
737
+ }
672
738
  $effect(() => {
673
739
  flowJobIds?.moduleId && untrack(() => onFlowModuleId());
674
740
  });
@@ -680,12 +746,24 @@ $effect(() => {
680
746
  });
681
747
  let isListJob = $derived(flowJobIds != undefined && Array.isArray(flowJobIds?.flowJobs));
682
748
  $effect(() => {
683
- flowJobIds?.moduleId && untrack(() => onModuleIdChange());
749
+ if (isSelectedBranch) {
750
+ let modId = flowJobIds?.moduleId;
751
+ if (modId) {
752
+ let selectedForloop = getTopModuleStates?.[buildSubflowKey(modId, prefix)]?.selectedForloop;
753
+ untrack(() => {
754
+ if (selectedForloop != forloop_selected) {
755
+ forloop_selected = selectedForloop;
756
+ }
757
+ });
758
+ }
759
+ }
684
760
  });
685
761
  let selected = $derived(isListJob ? 'sequence' : 'graph');
762
+ let animateLogsTab = $state(false);
763
+ let noLogs = $derived(graphTabOpen && !isNodeSelected);
686
764
  </script>
687
765
 
688
- <JobLoader noCode noLogs bind:this={jobLoader} />
766
+ <JobLoader workspaceOverride={workspaceId} {noLogs} noCode bind:this={jobLoader} />
689
767
  {#if notAnonynmous}
690
768
  <Alert type="error" title="Required Auth">
691
769
  As a non logged in user, you can only see jobs ran by anonymous users like you
@@ -698,16 +776,17 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
698
776
  <div class="h-8" />
699
777
  {/if} -->
700
778
  {#if isListJob}
701
- {@const sliceFrom = $localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0}
779
+ {@const sliceFrom =
780
+ globalIterationBounds[buildSubflowKey(flowJobIds?.moduleId ?? '', prefix)]
781
+ ?.iteration_from ?? 0}
702
782
  {@const lenToAdd = Math.min(20, sliceFrom)}
703
-
704
783
  {#if (flowJobIds?.flowJobs.length ?? 0) > 20 && lenToAdd > 0}
705
784
  {@const allToAdd = (flowJobIds?.length ?? 0) - sliceFrom}
706
785
  <p class="text-tertiary italic text-xs">
707
786
  For performance reasons, only the last 20 items are shown by default <button
708
787
  class="text-primary underline ml-4"
709
788
  onclick={() => {
710
- loadPreviousIters(lenToAdd)
789
+ loadPreviousIters(flowJobIds?.moduleId ?? '', lenToAdd)
711
790
  }}
712
791
  >Load {lenToAdd} prior
713
792
  </button>
@@ -716,7 +795,7 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
716
795
  <button
717
796
  class="text-primary underline ml-4"
718
797
  onclick={() => {
719
- loadPreviousIters(allToAdd)
798
+ loadPreviousIters(flowJobIds?.moduleId ?? '', allToAdd)
720
799
  }}
721
800
  >Load {allToAdd} prior
722
801
  </button>
@@ -728,6 +807,7 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
728
807
  <DisplayResult
729
808
  workspaceId={job?.workspace_id}
730
809
  {jobId}
810
+ result_stream={job?.result_stream}
731
811
  result={jobResults}
732
812
  language={job?.language}
733
813
  />
@@ -741,17 +821,23 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
741
821
  {isOwner}
742
822
  {hideFlowResult}
743
823
  {hideDownloadLogs}
744
- {localDurationStatuses}
745
824
  {innerModules}
746
825
  {suspendStatus}
747
826
  {hideJobId}
827
+ result_streams={resultStreams}
748
828
  />
749
829
  </div>
750
830
  {/if}
751
831
  {#if render}
752
- {#if innerModules.length > 0 && !isListJob}
832
+ {#if innerModules && innerModules.length > 0 && !isListJob}
753
833
  <Tabs class="mx-auto {wideResults ? '' : 'max-w-7xl'}" bind:selected>
754
834
  <Tab value="graph"><span class="font-semibold text-md">Graph</span></Tab>
835
+ <Tab
836
+ value="logs"
837
+ class={animateLogsTab
838
+ ? 'animate-pulse animate-duration-1000 bg-surface-inverse text-primary-inverse'
839
+ : ''}><span class="font-semibold">Logs</span></Tab
840
+ >
755
841
  <Tab value="sequence"><span class="font-semibold">Details</span></Tab>
756
842
  </Tabs>
757
843
  {:else}
@@ -760,7 +846,9 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
760
846
  {/if}
761
847
  <div class="{selected != 'sequence' ? 'hidden' : ''} max-w-7xl mx-auto">
762
848
  {#if isListJob}
763
- {@const sliceFrom = $localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0}
849
+ {@const sliceFrom =
850
+ globalIterationBounds[buildSubflowKey(flowJobIds?.moduleId ?? '', prefix)]
851
+ ?.iteration_from ?? 0}
764
852
  <h3 class="text-md leading-6 font-bold text-tertiary border-b mb-4">
765
853
  Subflows ({flowJobIds?.flowJobs.length})
766
854
  </h3>
@@ -810,9 +898,10 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
810
898
  <!-- <LogId id={loopJobId} /> -->
811
899
  <div class="border p-6" class:hidden={forloop_selected != loopJobId}>
812
900
  <FlowStatusViewerInner
813
- {globalRefreshes}
814
- parentRecursiveRefresh={recursiveRefresh}
815
- {childFlow}
901
+ topModuleStates={getTopModuleStates}
902
+ {refreshGlobal}
903
+ isSelectedBranch={isSelectedBranch && forloopIsSelected}
904
+ updateRecursiveRefreshFn={updateRecursiveRefreshInner}
816
905
  job={storedListJobs[j]}
817
906
  initialJob={storedListJobs[j]}
818
907
  globalModuleStates={forloopIsSelected
@@ -824,6 +913,7 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
824
913
  ? subflowParentsGlobalModuleStates
825
914
  : []}
826
915
  {subflowParentsDurationStatuses}
916
+ {updateGlobalRefresh}
827
917
  render={forloop_selected == loopJobId && selected == 'sequence' && render}
828
918
  isForloopSelected={forloop_selected == loopJobId &&
829
919
  (innerModule?.type == 'forloopflow' || innerModule?.type == 'whileloopflow')}
@@ -831,24 +921,27 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
831
921
  (!!flowJobIds?.flowJobs.length && flowJobIds?.flowJobs.length > 20)}
832
922
  {workspaceId}
833
923
  jobId={loopJobId}
834
- on:jobsLoaded={(e) => {
835
- let { job, force } = e.detail
924
+ onJobsLoaded={({ job, force }) => {
836
925
  storedListJobs[j] = job
837
926
  innerJobLoaded(job, j, false, force)
838
927
  }}
928
+ {onResultStreamUpdate}
929
+ graphTabOpen={selected == 'graph' && graphTabOpen}
930
+ isNodeSelected={forloop_selected == loopJobId}
931
+ {globalIterationBounds}
839
932
  />
840
933
  </div>
841
934
  {/if}
842
935
  {/each}
843
936
  </div>
844
- {:else if innerModules.length > 0 && (job.raw_flow?.modules.length ?? 0) > 0}
937
+ {:else if innerModules && innerModules.length > 0 && (job.raw_flow?.modules.length ?? 0) > 0}
845
938
  {@const hasPreprocessor = innerModules[0]?.id == 'preprocessor' ? 1 : 0}
846
939
  <ul class="w-full">
847
940
  <h3 class="text-md leading-6 font-bold text-primary border-b mb-4 py-2">
848
941
  Step-by-step
849
942
  </h3>
850
943
 
851
- {#each innerModules as mod, i}
944
+ {#each innerModules ?? [] as mod, i}
852
945
  {#if render}
853
946
  <div class="line w-8 h-10"></div>
854
947
  <h3 class="text-tertiary mb-2 w-full">
@@ -899,9 +992,11 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
899
992
  <!-- <LogId id={loopJobId} /> -->
900
993
  <div class="border p-6" class:hidden={retry_selected != failedRetry}>
901
994
  <FlowStatusViewerInner
902
- {globalRefreshes}
903
- parentRecursiveRefresh={recursiveRefresh}
904
- {childFlow}
995
+ topModuleStates={getTopModuleStates}
996
+ {refreshGlobal}
997
+ isSelectedBranch={isSelectedBranch && retry_selected == failedRetry}
998
+ {updateGlobalRefresh}
999
+ updateRecursiveRefreshFn={updateRecursiveRefreshInner}
905
1000
  globalModuleStates={[localModuleStates, ...globalModuleStates]}
906
1001
  globalDurationStatuses={[localDurationStatuses, ...globalDurationStatuses]}
907
1002
  {prefix}
@@ -911,6 +1006,10 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
911
1006
  {reducedPolling}
912
1007
  {workspaceId}
913
1008
  jobId={failedRetry}
1009
+ {onResultStreamUpdate}
1010
+ graphTabOpen={selected == 'graph' && graphTabOpen}
1011
+ isNodeSelected={retry_selected == failedRetry}
1012
+ {globalIterationBounds}
914
1013
  />
915
1014
  </div>
916
1015
  {/each}
@@ -918,10 +1017,14 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
918
1017
  {#if ['InProgress', 'Success', 'Failure'].includes(mod.type)}
919
1018
  {#if job.raw_flow?.modules[i]?.value.type == 'flow'}
920
1019
  <FlowStatusViewerInner
921
- {globalRefreshes}
922
- parentRecursiveRefresh={recursiveRefresh}
1020
+ topModuleStates={getTopModuleStates}
1021
+ {isSelectedBranch}
1022
+ {refreshGlobal}
1023
+ updateRecursiveRefreshFn={updateRecursiveRefreshInner}
923
1024
  globalModuleStates={[]}
1025
+ {updateGlobalRefresh}
924
1026
  globalDurationStatuses={[]}
1027
+ {globalIterationBounds}
925
1028
  prefix={buildPrefix(prefix, mod.id ?? '')}
926
1029
  subflowParentsGlobalModuleStates={[
927
1030
  localModuleStates,
@@ -938,26 +1041,29 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
938
1041
  jobId={mod.job ?? ''}
939
1042
  {reducedPolling}
940
1043
  isSubflow
941
- childFlow
942
- on:jobsLoaded={(e) => {
943
- let { force, job } = e.detail
944
- onJobsLoaded(mod, job, force)
1044
+ onJobsLoaded={({ job, force }) => {
1045
+ onJobsLoadedInner(mod, job, force)
945
1046
  }}
1047
+ {onResultStreamUpdate}
1048
+ graphTabOpen={selected == 'graph' && graphTabOpen}
1049
+ isNodeSelected={false}
946
1050
  />
947
1051
  {:else if mod.flow_jobs?.length == 0 && mod.job == '00000000-0000-0000-0000-000000000000'}
948
1052
  <div class="text-secondary">no subflow (empty loop?)</div>
949
1053
  {:else}
950
1054
  <FlowStatusViewerInner
951
- {globalRefreshes}
952
- parentRecursiveRefresh={recursiveRefresh}
953
- {childFlow}
1055
+ topModuleStates={getTopModuleStates}
1056
+ {refreshGlobal}
1057
+ updateRecursiveRefreshFn={updateRecursiveRefreshInner}
954
1058
  globalModuleStates={[localModuleStates, ...globalModuleStates]}
955
1059
  globalDurationStatuses={[localDurationStatuses, ...globalDurationStatuses]}
956
1060
  render={selected == 'sequence' && render}
957
1061
  {workspaceId}
958
1062
  {prefix}
1063
+ {updateGlobalRefresh}
959
1064
  {subflowParentsGlobalModuleStates}
960
1065
  {subflowParentsDurationStatuses}
1066
+ {isSelectedBranch}
961
1067
  jobId={mod.job ?? ''}
962
1068
  {reducedPolling}
963
1069
  innerModule={mod.flow_jobs ? job.raw_flow?.modules[i]?.value : undefined}
@@ -970,16 +1076,93 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
970
1076
  branchall: job?.raw_flow?.modules?.[i]?.value?.type == 'branchall'
971
1077
  }
972
1078
  : undefined}
973
- on:jobsLoaded={(e) => {
974
- let { job, force } = e.detail
975
- onJobsLoaded(mod, job, force)
1079
+ onJobsLoaded={({ job, force }) => {
1080
+ onJobsLoadedInner(mod, job, force)
976
1081
  }}
1082
+ loadExtraLogs={(logs) => {
1083
+ setModuleState(mod.id ?? '', {
1084
+ logs
1085
+ })
1086
+ }}
1087
+ {onResultStreamUpdate}
1088
+ graphTabOpen={selected == 'graph' && graphTabOpen}
1089
+ isNodeSelected={localModuleStates?.[selectedNode ?? '']?.job_id == mod.job}
1090
+ {globalIterationBounds}
977
1091
  />
1092
+ {#if mod.agent_actions && mod.agent_actions.length > 0}
1093
+ {#each mod.agent_actions as agentAction, j}
1094
+ {#if agentAction.type === 'tool_call' && mod.id}
1095
+ {@const toolCallId = getToolCallId(j, mod.id, agentAction.module_id)}
1096
+ {@const isSelected = selectedToolCall === j}
1097
+ <Button
1098
+ variant={isSelected ? 'contained' : 'border'}
1099
+ color={mod.agent_actions_success?.[j] === false
1100
+ ? 'red'
1101
+ : isSelected
1102
+ ? 'dark'
1103
+ : 'light'}
1104
+ btnClasses="w-full flex justify-start"
1105
+ on:click={async () => {
1106
+ if (selectedToolCall == j) {
1107
+ selectedToolCall = undefined
1108
+ } else {
1109
+ selectedToolCall = j
1110
+ }
1111
+ }}
1112
+ endIcon={{
1113
+ icon: ChevronDown,
1114
+ classes: isSelected ? '!rotate-180' : ''
1115
+ }}
1116
+ >
1117
+ <span class="truncate font-mono">
1118
+ Tool call: {agentAction.function_name}
1119
+ </span>
1120
+ </Button>
1121
+ {#if isSelected || storedToolCallJobs[j] || toolCallIndicesToLoad.includes(j)}
1122
+ <FlowStatusViewerInner
1123
+ topModuleStates={getTopModuleStates}
1124
+ {refreshGlobal}
1125
+ updateRecursiveRefreshFn={updateRecursiveRefreshInner}
1126
+ globalModuleStates={[localModuleStates, ...globalModuleStates]}
1127
+ globalDurationStatuses={[
1128
+ localDurationStatuses,
1129
+ ...globalDurationStatuses
1130
+ ]}
1131
+ render={selected == 'sequence' && render && isSelected}
1132
+ {workspaceId}
1133
+ {prefix}
1134
+ {updateGlobalRefresh}
1135
+ {subflowParentsGlobalModuleStates}
1136
+ {subflowParentsDurationStatuses}
1137
+ {isSelectedBranch}
1138
+ jobId={agentAction.job_id}
1139
+ job={storedToolCallJobs[j]}
1140
+ initialJob={storedToolCallJobs[j]}
1141
+ {reducedPolling}
1142
+ onJobsLoaded={({ job, force }) => {
1143
+ storedToolCallJobs[j] = job
1144
+ onJobsLoadedInner({ id: toolCallId } as FlowStatusModule, job, force)
1145
+ }}
1146
+ loadExtraLogs={(logs) => {
1147
+ setModuleState(toolCallId, {
1148
+ logs
1149
+ })
1150
+ }}
1151
+ {onResultStreamUpdate}
1152
+ graphTabOpen={selected == 'graph' && graphTabOpen}
1153
+ isNodeSelected={localModuleStates?.[toolCallId]?.job_id ==
1154
+ agentAction.job_id}
1155
+ {globalIterationBounds}
1156
+ />
1157
+ {/if}
1158
+ {/if}
1159
+ {/each}
1160
+ {/if}
978
1161
  {/if}
979
1162
  {:else}
980
1163
  <ModuleStatus
981
1164
  type={mod.type}
982
- scheduled_for={$localModuleStates?.[mod.id ?? '']?.scheduled_for}
1165
+ scheduled_for={localModuleStates?.[mod.id ?? '']?.scheduled_for}
983
1166
  />
984
1167
  {/if}
985
1168
  </li>
@@ -989,6 +1172,15 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
989
1172
  <div class="p-2 text-tertiary text-sm italic">Empty flow</div>
990
1173
  {/if}
991
1174
  </div>
1175
+ <div class="{selected != 'logs' ? 'hidden' : ''} mx-auto h-[800px]">
1176
+ <FlowLogViewerWrapper
1177
+ {job}
1178
+ {localModuleStates}
1179
+ {workspaceId}
1180
+ {render}
1181
+ {onSelectedIteration}
1182
+ />
1183
+ </div>
992
1184
  </div>
993
1185
  {#if render}
994
1186
  {#if job.raw_flow && !isListJob}
@@ -996,14 +1188,14 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
996
1188
  <div class="grid grid-cols-3 border h-full" bind:clientHeight={wrapperHeight}>
997
1189
  <div class="col-span-2 bg-surface-secondary">
998
1190
  <div class="flex flex-col">
999
- {#each Object.values($retryStatus) as count}
1191
+ {#each Object.values(retryStatus?.val ?? {}) as count}
1000
1192
  {#if count}
1001
1193
  <span class="text-sm">
1002
1194
  Retry in progress, # of failed attempts: {count}
1003
1195
  </span>
1004
1196
  {/if}
1005
1197
  {/each}
1006
- {#each Object.values($suspendStatus) as count}
1198
+ {#each Object.values(suspendStatus?.val ?? {}) as count}
1007
1199
  {#if count.nb}
1008
1200
  <span class="text-sm">
1009
1201
  Flow suspended, waiting for {count.nb} events
@@ -1011,14 +1203,13 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
1011
1203
  {/if}
1012
1204
  {/each}
1013
1205
  </div>
1014
-
1015
1206
  <FlowGraphV2
1016
1207
  {selectedId}
1017
1208
  triggerNode={true}
1018
1209
  download={!hideDownloadInGraph}
1019
1210
  minHeight={wrapperHeight}
1020
1211
  success={jobId != undefined && isSuccess(job?.['success'])}
1021
- flowModuleStates={$localModuleStates}
1212
+ flowModuleStates={localModuleStates}
1022
1213
  bind:expandedSubflows
1023
1214
  onSelect={(e) => {
1024
1215
  console.log('onSelect', e)
@@ -1033,42 +1224,26 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
1033
1224
  selectedNode = 'end'
1034
1225
  stepDetail = 'end'
1035
1226
  } else {
1036
- const mod = dfs(job?.raw_flow?.modules ?? [], (m) => m).find((m) => m?.id === e)
1227
+ const id = e.startsWith(AI_TOOL_CALL_PREFIX) ? e.split('-').pop() : e
1228
+ const mod = dfs(job?.raw_flow?.modules ?? [], (m) => m).find(
1229
+ (m) => m?.id === id
1230
+ )
1037
1231
  stepDetail = mod
1038
1232
  selectedNode = e
1233
+ if (e.startsWith(AI_TOOL_CALL_PREFIX)) {
1234
+ const [_prefix, _agentModuleId, j, _toolModuleId] = e.split('-')
1235
+ const jIdx = Number(j)
1236
+ if (!toolCallIndicesToLoad.includes(jIdx)) {
1237
+ toolCallIndicesToLoad.push(jIdx)
1238
+ }
1239
+ }
1039
1240
  }
1040
1241
  } else {
1041
1242
  stepDetail = e
1042
1243
  selectedNode = e.id
1043
1244
  }
1044
1245
  }}
1045
- onSelectedIteration={async (detail) => {
1046
- if (detail.manuallySet) {
1047
- let rootJobId = detail.id
1048
- await tick()
1049
-
1050
- let previousId = $localModuleStates[detail.moduleId]?.selectedForloop
1051
- if (previousId) {
1052
- await globalRefreshes?.[detail.moduleId]?.(true, previousId)
1053
- }
1054
-
1055
- $localModuleStates[detail.moduleId] = {
1056
- ...$localModuleStates[detail.moduleId],
1057
- selectedForloop: detail.id,
1058
- selectedForloopIndex: detail.index,
1059
- selectedForLoopSetManually: true
1060
- }
1061
-
1062
- await tick()
1063
-
1064
- await globalRefreshes?.[detail.moduleId]?.(false, rootJobId)
1065
- } else {
1066
- $localModuleStates[detail.moduleId] = {
1067
- ...$localModuleStates[detail.moduleId],
1068
- selectedForLoopSetManually: false
1069
- }
1070
- }
1071
- }}
1246
+ {onSelectedIteration}
1072
1247
  earlyStop={job.raw_flow?.skip_expr !== undefined}
1073
1248
  cache={job.raw_flow?.cache_ttl !== undefined}
1074
1249
  modules={job.raw_flow?.modules ?? []}
@@ -1104,13 +1279,21 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
1104
1279
  job?.raw_flow?.modules ?? [],
1105
1280
  expandedSubflows ?? {}
1106
1281
  )}
1282
+ buildSubflowKey={(key) => buildSubflowKey(key, prefix)}
1283
+ {globalIterationBounds}
1107
1284
  durationStatuses={localDurationStatuses}
1285
+ decreaseIterationFrom={(key, amount) => {
1286
+ loadPreviousIters(key, amount)
1287
+ }}
1108
1288
  />
1109
1289
  {:else if rightColumnSelect == 'node_status'}
1110
1290
  <div class="pt-2 grow flex flex-col">
1111
- {#if selectedNode}
1112
- {@const node = $localModuleStates[selectedNode]}
1113
-
1291
+ {#if selectedNode?.startsWith(AI_TOOL_MESSAGE_PREFIX)}
1292
+ <div class="pt-2 px-4 pb-4">
1293
+ <Alert type="info" title="Message output is available on the AI agent node" />
1294
+ </div>
1295
+ {:else if selectedNode}
1296
+ {@const node = localModuleStates[selectedNode]}
1114
1297
  {#if selectedNode == 'end'}
1115
1298
  <FlowJobResult
1116
1299
  tagLabel={customUi?.tagLabel}
@@ -1123,7 +1306,6 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
1123
1306
  col
1124
1307
  result={job['result']}
1125
1308
  logs={job.logs ?? ''}
1126
- durationStates={localDurationStatuses}
1127
1309
  downloadLogs={!hideDownloadLogs}
1128
1310
  />
1129
1311
  {:else if selectedNode == 'start'}
@@ -1139,6 +1321,10 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
1139
1321
  <p class="p-2 text-secondary">No arguments</p>
1140
1322
  {/if}
1141
1323
  {:else if node}
1324
+ {@const module =
1325
+ stepDetail && typeof stepDetail !== 'string' ? stepDetail : undefined}
1326
+ {@const agentTools =
1327
+ module && module.value.type === 'aiagent' ? module.value.tools : undefined}
1142
1328
  {#if node.flow_jobs_results}
1143
1329
  <span class="pl-1 text-tertiary"
1144
1330
  >Result of step as collection of all subflows</span
@@ -1197,11 +1383,30 @@ let selected = $derived(isListJob ? 'sequence' : 'graph');
1197
1383
  waitingForExecutor={node.type == 'WaitingForExecutor'}
1198
1384
  refreshLog={node.type == 'InProgress'}
1199
1385
  col
1386
+ result_stream={resultStreams[node.job_id ?? '']}
1200
1387
  result={node.result}
1201
1388
  tag={node.tag}
1202
1389
  logs={node.logs}
1203
- durationStates={localDurationStatuses}
1204
1390
  downloadLogs={!hideDownloadLogs}
1391
+ aiAgentStatus={agentTools &&
1392
+ node.job_id &&
1393
+ (node.type === 'Success' || node.type === 'Failure')
1394
+ ? {
1395
+ tools: agentTools,
1396
+ agentJob: {
1397
+ id: node.job_id,
1398
+ result: node.result,
1399
+ logs: node.logs,
1400
+ args: node.args,
1401
+ success: node.type === 'Success',
1402
+ type: 'CompletedJob'
1403
+ },
1404
+ storedToolCallJobs,
1405
+ onToolJobLoaded: (job, idx) => {
1406
+ storedToolCallJobs[idx] = job
1407
+ }
1408
+ }
1409
+ : undefined}
1205
1410
  />
1206
1411
  {:else}
1207
1412
  <p class="p-2 text-tertiary italic"