windmill-components 1.542.5 → 1.555.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 (399) hide show
  1. package/package/aiStore.d.ts +13 -0
  2. package/package/aiStore.js +70 -0
  3. package/package/common.d.ts +6 -2
  4. package/package/components/AIAgentLogViewer.svelte +1 -1
  5. package/package/components/AIProviderPicker.svelte +25 -8
  6. package/package/components/ArgEnum.svelte +17 -7
  7. package/package/components/ArgEnum.svelte.d.ts +1 -0
  8. package/package/components/ArgInput.svelte +257 -188
  9. package/package/components/ArgInput.svelte.d.ts +4 -1
  10. package/package/components/ArrayTypeNarrowing.svelte +38 -32
  11. package/package/components/AutoscalingEvents.svelte +21 -5
  12. package/package/components/AutoscalingEvents.svelte.d.ts +4 -18
  13. package/package/components/ChannelSelector.svelte +92 -18
  14. package/package/components/ChannelSelector.svelte.d.ts +2 -0
  15. package/package/components/ConnectionSection.svelte +12 -1
  16. package/package/components/DateTimeInput.svelte +8 -6
  17. package/package/components/DeployButton.svelte +1 -1
  18. package/package/components/Dev.svelte +24 -9
  19. package/package/components/Dev.svelte.d.ts +23 -1
  20. package/package/components/DisplayResult.svelte +36 -23
  21. package/package/components/DropdownV2.svelte +8 -2
  22. package/package/components/DropdownV2.svelte.d.ts +1 -0
  23. package/package/components/DynamicInput.svelte +10 -10
  24. package/package/components/EditableSchemaForm.svelte +28 -13
  25. package/package/components/Editor.svelte +2 -1
  26. package/package/components/EditorSettings.svelte +5 -5
  27. package/package/components/EditorSettings.svelte.d.ts +4 -18
  28. package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
  29. package/package/components/FakeMonacoPlaceHolder.svelte +4 -2
  30. package/package/components/FakeMonacoPlaceHolder.svelte.d.ts +1 -0
  31. package/package/components/FieldHeader.svelte +5 -7
  32. package/package/components/FirstStepInputs.svelte +1 -1
  33. package/package/components/FlowHistoryJobPicker.svelte +3 -0
  34. package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
  35. package/package/components/FlowJobResult.svelte +5 -5
  36. package/package/components/FlowLogRow.svelte +2 -2
  37. package/package/components/FlowLogViewer.svelte +228 -57
  38. package/package/components/FlowLogViewer.svelte.d.ts +16 -5
  39. package/package/components/FlowLogViewerWrapper.svelte +56 -3
  40. package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
  41. package/package/components/FlowLoopIterationPreview.svelte +4 -4
  42. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  43. package/package/components/FlowMetadata.svelte +3 -4
  44. package/package/components/FlowMetadata.svelte.d.ts +4 -18
  45. package/package/components/FlowPlugConnect.svelte +8 -2
  46. package/package/components/FlowPlugConnect.svelte.d.ts +1 -0
  47. package/package/components/FlowPreviewContent.svelte +121 -94
  48. package/package/components/FlowPreviewContent.svelte.d.ts +3 -3
  49. package/package/components/FlowStatusViewer.svelte +63 -59
  50. package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
  51. package/package/components/FlowStatusViewerInner.svelte +186 -94
  52. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
  53. package/package/components/FlowTimeline.svelte +110 -131
  54. package/package/components/FlowTimeline.svelte.d.ts +13 -4
  55. package/package/components/FlowTimelineBar.svelte +227 -0
  56. package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
  57. package/package/components/FolderEditor.svelte +6 -7
  58. package/package/components/GroupEditor.svelte +148 -141
  59. package/package/components/GroupEditor.svelte.d.ts +5 -4
  60. package/package/components/InputTransformForm.svelte +193 -71
  61. package/package/components/InputTransformForm.svelte.d.ts +3 -0
  62. package/package/components/InputTransformSchemaForm.svelte +10 -5
  63. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  64. package/package/components/InstanceSetting.svelte +34 -51
  65. package/package/components/InstanceSettings.svelte +12 -21
  66. package/package/components/JobArgs.svelte +15 -16
  67. package/package/components/JobArgs.svelte.d.ts +4 -18
  68. package/package/components/JobLoader.svelte +23 -42
  69. package/package/components/JobLoader.svelte.d.ts +2 -0
  70. package/package/components/JobStatus.svelte +1 -1
  71. package/package/components/JobStatus.svelte.d.ts +4 -18
  72. package/package/components/JsonEditor.svelte +18 -9
  73. package/package/components/JsonEditor.svelte.d.ts +1 -1
  74. package/package/components/JsonInputs.svelte +1 -1
  75. package/package/components/ModulePreviewForm.svelte +23 -19
  76. package/package/components/ModulePreviewResultViewer.svelte +1 -7
  77. package/package/components/NextcloudSetting.svelte +6 -1
  78. package/package/components/NumberTypeNarrowing.svelte +32 -16
  79. package/package/components/ObjectStoreConfigSettings.svelte +27 -19
  80. package/package/components/Password.svelte +7 -11
  81. package/package/components/Password.svelte.d.ts +5 -20
  82. package/package/components/PasswordArgInput.svelte +35 -15
  83. package/package/components/PasswordArgInput.svelte.d.ts +4 -18
  84. package/package/components/Path.svelte +2 -8
  85. package/package/components/Path.svelte.d.ts +1 -1
  86. package/package/components/QueuePosition.svelte +6 -2
  87. package/package/components/ResourceEditor.svelte +3 -10
  88. package/package/components/ResourcePicker.svelte +85 -72
  89. package/package/components/ResourcePicker.svelte.d.ts +2 -0
  90. package/package/components/RunChart.svelte +1 -1
  91. package/package/components/RunForm.svelte +16 -21
  92. package/package/components/S3ArrayHelperButton.svelte +18 -0
  93. package/package/components/S3ArrayHelperButton.svelte.d.ts +9 -0
  94. package/package/components/S3FilePicker.svelte +1 -1
  95. package/package/components/SchemaForm.svelte +18 -10
  96. package/package/components/SchemaForm.svelte.d.ts +7 -1
  97. package/package/components/SchemaFormWithArgPicker.svelte +1 -1
  98. package/package/components/ScriptBuilder.svelte +2 -2
  99. package/package/components/ScriptEditor.svelte +9 -9
  100. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  101. package/package/components/ShareModal.svelte +4 -4
  102. package/package/components/SimpleEditor.svelte +6 -2
  103. package/package/components/SimpleEditor.svelte.d.ts +3 -0
  104. package/package/components/StringTypeNarrowing.svelte +44 -25
  105. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  106. package/package/components/SuperadminSettingsInner.svelte +3 -3
  107. package/package/components/TeamSelector.svelte +83 -37
  108. package/package/components/TeamSelector.svelte.d.ts +0 -1
  109. package/package/components/TemplateEditor.svelte +18 -9
  110. package/package/components/Toast.svelte +2 -7
  111. package/package/components/Toast.svelte.d.ts +4 -18
  112. package/package/components/Toggle.svelte +17 -7
  113. package/package/components/ToggleHubWorkspaceQuick.svelte +3 -3
  114. package/package/components/WorkerGroup.svelte +2 -14
  115. package/package/components/apps/components/buttons/AppButton.svelte +66 -38
  116. package/package/components/apps/components/display/dbtable/InsertRow.svelte +32 -2
  117. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -1
  118. package/package/components/apps/components/display/dbtable/utils.d.ts +8 -8
  119. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
  120. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
  121. package/package/components/apps/components/display/table/utils.js +14 -4
  122. package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
  123. package/package/components/apps/components/helpers/RunnableComponent.svelte +3 -5
  124. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  125. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +2 -1
  126. package/package/components/apps/components/layout/AppTabs.svelte +116 -71
  127. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  128. package/package/components/apps/editor/AppEditorHeader.svelte +33 -271
  129. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte +233 -0
  130. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +18 -0
  131. package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte +47 -0
  132. package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte.d.ts +8 -0
  133. package/package/components/apps/editor/GridEditor.svelte +7 -2
  134. package/package/components/apps/editor/appDeploy.svelte.d.ts +1 -0
  135. package/package/components/apps/editor/appDeploy.svelte.js +6 -0
  136. package/package/components/apps/editor/appUtils.d.ts +1 -0
  137. package/package/components/apps/editor/appUtils.js +30 -1
  138. package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
  139. package/package/components/apps/editor/component/ComponentNavigation.svelte +3 -1
  140. package/package/components/apps/editor/component/components.d.ts +19 -4
  141. package/package/components/apps/editor/component/components.js +23 -3
  142. package/package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +1 -1
  143. package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +6 -4
  144. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  145. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  146. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  147. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
  148. package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
  149. package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
  150. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
  151. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
  152. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +58 -8
  153. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -1
  154. package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
  155. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  156. package/package/components/common/CloseButton.svelte +2 -2
  157. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  158. package/package/components/common/ResizeTransitionWrapper.svelte +39 -0
  159. package/package/components/common/ResizeTransitionWrapper.svelte.d.ts +12 -0
  160. package/package/components/common/badge/CountBadge.svelte +29 -0
  161. package/package/components/common/badge/CountBadge.svelte.d.ts +8 -0
  162. package/package/components/common/button/Button.svelte +1 -0
  163. package/package/components/common/button/ConnectionButton.svelte +6 -1
  164. package/package/components/common/button/ConnectionButton.svelte.d.ts +2 -0
  165. package/package/components/common/button/RefreshButton.svelte +8 -4
  166. package/package/components/common/button/RefreshButton.svelte.d.ts +3 -0
  167. package/package/components/common/calendarPicker/CalendarPicker.svelte +1 -1
  168. package/package/components/common/fileInput/FileInput.svelte +7 -6
  169. package/package/components/common/fileUpload/S3ArgInput.svelte +11 -9
  170. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +1 -0
  171. package/package/components/common/layout/List.svelte +3 -7
  172. package/package/components/common/layout/List.svelte.d.ts +7 -29
  173. package/package/components/common/popup/PopupV2.svelte +14 -25
  174. package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
  175. package/package/components/common/table/ScriptRow.svelte +22 -2
  176. package/package/components/common/toggleButton-v2/ToggleButton.svelte +17 -26
  177. package/package/components/common/toggleButton-v2/ToggleButton.svelte.d.ts +16 -30
  178. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +1 -1
  179. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +3 -3
  180. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  181. package/package/components/copilot/CodeCompletionStatus.svelte +2 -1
  182. package/package/components/copilot/CronGen.svelte +1 -1
  183. package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
  184. package/package/components/copilot/FlowInlineScriptAIButton.svelte +2 -2
  185. package/package/components/copilot/IteratorGen.svelte +30 -25
  186. package/package/components/copilot/IteratorGen.svelte.d.ts +8 -7
  187. package/package/components/copilot/MetadataGen.svelte +4 -3
  188. package/package/components/copilot/PredicateGen.svelte +15 -12
  189. package/package/components/copilot/PredicateGen.svelte.d.ts +5 -4
  190. package/package/components/copilot/RegexGen.svelte +1 -1
  191. package/package/components/copilot/ScriptFix.svelte +1 -1
  192. package/package/components/copilot/ScriptGen.svelte +2 -1
  193. package/package/components/copilot/StepGenQuick.svelte +15 -16
  194. package/package/components/copilot/StepGenQuick.svelte.d.ts +14 -13
  195. package/package/components/copilot/StepInputGen.svelte +50 -36
  196. package/package/components/copilot/StepInputGen.svelte.d.ts +13 -10
  197. package/package/components/copilot/StepInputsGen.svelte +18 -19
  198. package/package/components/copilot/StepInputsGen.svelte.d.ts +4 -18
  199. package/package/components/copilot/autocomplete/Autocompletor.js +1 -1
  200. package/package/components/copilot/autocomplete/request.js +1 -1
  201. package/package/components/copilot/chat/AIChat.svelte +2 -1
  202. package/package/components/copilot/chat/AIChatManager.svelte.js +5 -3
  203. package/package/components/copilot/chat/AiChatLayout.svelte +2 -1
  204. package/package/components/copilot/chat/ProviderModelSelector.svelte +11 -10
  205. package/package/components/copilot/chat/ProviderModelSelector.svelte.d.ts +2 -17
  206. package/package/components/copilot/chat/flow/FlowAIButton.svelte +1 -1
  207. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
  208. package/package/components/copilot/chat/script/core.d.ts +4 -4
  209. package/package/components/copilot/chat/script/core.js +95 -35
  210. package/package/components/copilot/chat/shared.js +2 -1
  211. package/package/components/copilot/lib.d.ts +1 -0
  212. package/package/components/copilot/lib.js +7 -3
  213. package/package/components/custom_ui.d.ts +1 -0
  214. package/package/components/details/DetailPageLayout.svelte +3 -2
  215. package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
  216. package/package/components/flows/CreateActionsFlow.svelte +1 -1
  217. package/package/components/flows/FlowChatInterface.svelte +404 -0
  218. package/package/components/flows/FlowChatInterface.svelte.d.ts +19 -0
  219. package/package/components/flows/FlowChatMessage.svelte +41 -0
  220. package/package/components/flows/FlowChatMessage.svelte.d.ts +9 -0
  221. package/package/components/flows/FlowConversationsSidebar.svelte +213 -0
  222. package/package/components/flows/FlowConversationsSidebar.svelte.d.ts +15 -0
  223. package/package/components/flows/FlowEditor.svelte.d.ts +1 -1
  224. package/package/components/flows/FlowModuleIcon.svelte +10 -10
  225. package/package/components/flows/FlowProgressBar.svelte +16 -16
  226. package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
  227. package/package/components/flows/common/FlowCard.svelte +10 -2
  228. package/package/components/flows/common/FlowCard.svelte.d.ts +1 -0
  229. package/package/components/flows/common/FlowCardHeader.svelte +2 -1
  230. package/package/components/flows/common/FlowCardHeader.svelte.d.ts +1 -0
  231. package/package/components/flows/content/DynamicInputHelpBox.svelte +4 -4
  232. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -1
  233. package/package/components/flows/content/FlowInput.svelte +381 -259
  234. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -1
  235. package/package/components/flows/content/FlowInputsQuick.svelte +56 -34
  236. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +3 -2
  237. package/package/components/flows/content/FlowModuleComponent.svelte +29 -11
  238. package/package/components/flows/flowInfers.d.ts +60 -0
  239. package/package/components/flows/flowInfers.js +72 -40
  240. package/package/components/flows/{flowStore.d.ts → flowStore.svelte.d.ts} +5 -1
  241. package/package/components/flows/header/FlowPreviewButtons.svelte +1 -1
  242. package/package/components/flows/map/FlowErrorHandlerItem.svelte +4 -2
  243. package/package/components/flows/map/FlowErrorHandlerItem.svelte.d.ts +1 -0
  244. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  245. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
  246. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
  247. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -2
  248. package/package/components/flows/map/FlowStickyNode.svelte +2 -2
  249. package/package/components/flows/map/FlowStickyNode.svelte.d.ts +1 -0
  250. package/package/components/flows/map/InsertModuleButton.svelte +8 -15
  251. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +4 -4
  252. package/package/components/flows/map/InsertModuleInner.svelte +19 -20
  253. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +2 -2
  254. package/package/components/flows/map/MapItem.svelte +1 -1
  255. package/package/components/flows/map/VirtualItem.svelte +1 -2
  256. package/package/components/flows/pickers/PickHubScriptQuick.svelte +43 -52
  257. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +2 -1
  258. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +41 -26
  259. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
  260. package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
  261. package/package/components/flows/propPicker/PropPickerWrapper.svelte +1 -15
  262. package/package/components/git_sync/DetectionFlow.svelte +33 -44
  263. package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
  264. package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
  265. package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
  266. package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
  267. package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
  268. package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
  269. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
  270. package/package/components/git_sync/GitSyncSection.svelte +134 -14
  271. package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
  272. package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
  273. package/package/components/graph/FlowGraphV2.svelte +2 -1
  274. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  275. package/package/components/graph/graphBuilder.svelte.d.ts +2 -0
  276. package/package/components/graph/graphBuilder.svelte.js +1 -0
  277. package/package/components/graph/model.d.ts +5 -5
  278. package/package/components/graph/renderers/edges/BaseEdge.svelte +1 -0
  279. package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
  280. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
  281. package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
  282. package/package/components/graph/renderers/nodes/InputNode.svelte +13 -2
  283. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
  284. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +2 -27
  285. package/package/components/home/ItemsList.svelte +1 -1
  286. package/package/components/instanceSettings.js +17 -0
  287. package/package/components/jobs/JobProgressBar.svelte +27 -21
  288. package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
  289. package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
  290. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
  291. package/package/components/meltComponents/Popover.svelte +3 -2
  292. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  293. package/package/components/meltComponents/Tooltip.svelte +1 -1
  294. package/package/components/progressBar/ProgressBar.svelte +39 -53
  295. package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
  296. package/package/components/raw_apps/FileEditorIcon.svelte +1 -1
  297. package/package/components/raw_apps/FileEditorIcon.svelte.d.ts +4 -18
  298. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +2 -8
  299. package/package/components/raw_apps/RawAppBackgroundRunner.svelte.d.ts +4 -18
  300. package/package/components/raw_apps/RawAppEditor.svelte +6 -7
  301. package/package/components/raw_apps/RawAppEditorHeader.svelte +48 -301
  302. package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +18 -19
  303. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +10 -16
  304. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +13 -13
  305. package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte +8 -11
  306. package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte.d.ts +1 -2
  307. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +0 -1
  308. package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte +7 -13
  309. package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte.d.ts +8 -8
  310. package/package/components/raw_apps/RawAppPreview.svelte +3 -7
  311. package/package/components/raw_apps/RawAppPreview.svelte.d.ts +5 -19
  312. package/package/components/raw_apps/utils.d.ts +1 -1
  313. package/package/components/raw_apps/utils.js +3 -3
  314. package/package/components/runs/JobsLoader.svelte +1 -1
  315. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  316. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
  317. package/package/components/runs/RunOption.svelte +2 -2
  318. package/package/components/runs/RunsFilter.svelte +15 -12
  319. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  320. package/package/components/schema/AddPropertyV2.svelte +7 -4
  321. package/package/components/schema/EditableSchemaDrawer.svelte +19 -18
  322. package/package/components/schema/FlowPropertyEditor.svelte +9 -2
  323. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  324. package/package/components/schema/PropertyEditor.svelte +22 -26
  325. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  326. package/package/components/schema/SchemaFormDND.svelte +3 -2
  327. package/package/components/schema/SchemaFormDND.svelte.d.ts +1 -0
  328. package/package/components/select/DraggableTags.svelte +2 -2
  329. package/package/components/select/MultiSelect.svelte +15 -9
  330. package/package/components/select/MultiSelect.svelte.d.ts +1 -0
  331. package/package/components/select/Select.svelte +12 -5
  332. package/package/components/select/Select.svelte.d.ts +11 -0
  333. package/package/components/select/SelectDropdown.svelte +98 -46
  334. package/package/components/select/SelectDropdown.svelte.d.ts +10 -0
  335. package/package/components/select/utils.svelte.js +2 -0
  336. package/package/components/settings/CreateToken.svelte +76 -49
  337. package/package/components/settings/WorkspaceUserSettings.svelte +111 -17
  338. package/package/components/sidebar/CriticalAlertTable.svelte +2 -1
  339. package/package/components/sidebar/Linkify.svelte +14 -0
  340. package/package/components/sidebar/Linkify.svelte.d.ts +5 -0
  341. package/package/components/sidebar/MenuLink.svelte +2 -1
  342. package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
  343. package/package/components/sidebar/SidebarContent.svelte +27 -27
  344. package/package/components/sidebar/WorkspaceMenu.svelte +8 -3
  345. package/package/components/table/Cell.svelte +7 -14
  346. package/package/components/table/Cell.svelte.d.ts +13 -35
  347. package/package/components/table/tableUtils.js +1 -1
  348. package/package/components/text_input/TextInput.svelte +30 -0
  349. package/package/components/text_input/TextInput.svelte.d.ts +17 -0
  350. package/package/components/triggers/AddTriggersButton.svelte +1 -0
  351. package/package/components/triggers/TriggersEditor.svelte +11 -1
  352. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  353. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  354. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
  355. package/package/components/triggers/gcp/utils.js +1 -0
  356. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
  357. package/package/components/triggers/triggers.svelte.d.ts +1 -1
  358. package/package/components/triggers/triggers.svelte.js +8 -4
  359. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
  360. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
  361. package/package/components/triggers/websocket/utils.js +1 -0
  362. package/package/components/tutorials/FlowBuilderTutorialErrorHandler.svelte +2 -2
  363. package/package/components/tutorials/FlowBuilderTutorialForLoop.svelte +3 -0
  364. package/package/components/tutorials/FlowBuilderTutorialSimpleFlow.svelte +49 -17
  365. package/package/components/tutorials/Tutorial.svelte +9 -0
  366. package/package/components/tutorials/Tutorial.svelte.d.ts +1 -0
  367. package/package/components/tutorials/app/AppTutorial.svelte +41 -57
  368. package/package/components/tutorials/app/BackgroundRunnablesTutorial.svelte +3 -5
  369. package/package/components/tutorials/app/ConnectionTutorial.svelte +2 -2
  370. package/package/components/tutorials/utils.js +2 -154
  371. package/package/components/vscode.js +16 -8
  372. package/package/components/workspaceSettings/AISettings.svelte +12 -5
  373. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  374. package/package/components/workspaceSettings/CreateWorkspace.svelte +2 -2
  375. package/package/components/workspaceSettings/DucklakeSettings.svelte +64 -7
  376. package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
  377. package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
  378. package/package/components/workspaceSettings/StorageSettings.svelte +147 -77
  379. package/package/editorUtils.d.ts +1 -1
  380. package/package/gen/core/OpenAPI.js +1 -1
  381. package/package/gen/schemas.gen.d.ts +223 -17
  382. package/package/gen/schemas.gen.js +226 -17
  383. package/package/gen/services.gen.d.ts +221 -27
  384. package/package/gen/services.gen.js +440 -48
  385. package/package/gen/types.gen.d.ts +1067 -218
  386. package/package/hubPaths.json +2 -1
  387. package/package/script_helpers.js +5 -5
  388. package/package/services/JobManager.js +14 -9
  389. package/package/stores.d.ts +4 -12
  390. package/package/stores.js +5 -65
  391. package/package/timelineCompute.svelte.d.ts +21 -0
  392. package/package/timelineCompute.svelte.js +113 -0
  393. package/package/toast.js +2 -1
  394. package/package/utils.d.ts +16 -8
  395. package/package/utils.js +65 -12
  396. package/package/workspace_settings.d.ts +13 -8
  397. package/package/workspace_settings.js +46 -11
  398. package/package.json +4 -4
  399. /package/package/components/flows/{flowStore.js → flowStore.svelte.js} +0 -0
@@ -10,7 +10,8 @@ import BarsStaggered from './icons/BarsStaggered.svelte';
10
10
  import { updateLinks } from '../keyboardChain';
11
11
  import FlowLogRow from './FlowLogRow.svelte';
12
12
  import { Tooltip } from './meltComponents';
13
- let { modules, localModuleStates, rootJob, flowStatus, expandedRows, allExpanded, showResultsInputs, toggleExpanded, toggleExpandAll, workspaceId, render, level = 0, flowId = 'root', onSelectedIteration, getSelectedIteration, flowSummary, mode = 'flow', currentId, navigationChain = $bindable(), select } = $props();
13
+ import FlowTimelineBar from './FlowTimelineBar.svelte';
14
+ let { modules, localModuleStates, rootJob, expandedRows, allExpanded, showResultsInputs, toggleExpanded, toggleExpandAll, workspaceId, render, level = 0, flowId = 'root', onSelectedIteration, getSelectedIteration, flowSummary, mode = 'flow', currentId, navigationChain = $bindable(), select, timelineMin: timelineMinAbsolute, timelineTotal: timelineTotalAbsolute, timelineItems, timelineNow, timelineAvailableWidths = $bindable(), timelinelWidth, showTimeline = true } = $props();
14
15
  function getJobLink(jobId) {
15
16
  if (!jobId)
16
17
  return '';
@@ -28,6 +29,8 @@ function getStatusColor(status) {
28
29
  return status ? statusColors[status] : 'text-gray-400';
29
30
  }
30
31
  function getFlowStatus(job) {
32
+ if (!job)
33
+ return undefined;
31
34
  if (job.type === 'CompletedJob') {
32
35
  return job.success ? 'Success' : 'Failure';
33
36
  }
@@ -39,7 +42,7 @@ function getFlowStatus(job) {
39
42
  }
40
43
  }
41
44
  function getStepProgress(job, totalSteps) {
42
- if (totalSteps === 0)
45
+ if (!job || totalSteps === 0)
43
46
  return '';
44
47
  const stepWord = mode === 'aiagent' ? 'action' : 'step';
45
48
  // If flow is completed, show total steps
@@ -122,6 +125,8 @@ function findParentsOfErrors(modules) {
122
125
  }
123
126
  // Get flow info for display
124
127
  const flowInfo = $derived.by(() => {
128
+ if (!rootJob)
129
+ return undefined;
125
130
  const parentsWithErrors = findParentsOfErrors(modules);
126
131
  return {
127
132
  jobId: rootJob.id,
@@ -135,6 +140,7 @@ const flowInfo = $derived.by(() => {
135
140
  };
136
141
  });
137
142
  let subloopNavigationChains = $state({});
143
+ let useRelativeTimeline = $state(false);
138
144
  function buildNavigationLinks() {
139
145
  const items = [];
140
146
  // Flow header (always first)
@@ -143,7 +149,10 @@ function buildNavigationLinks() {
143
149
  return { [`flow-${flowId}`]: { upId: null, downId: null } };
144
150
  }
145
151
  // Flow input (if exists and shown)
146
- if (showResultsInputs && flowInfo.inputs && Object.keys(flowInfo.inputs).length > 0) {
152
+ if (showResultsInputs &&
153
+ flowInfo &&
154
+ flowInfo.inputs &&
155
+ Object.keys(flowInfo.inputs).length > 0) {
147
156
  items.push(`flow-${flowId}-input`);
148
157
  }
149
158
  // Add modules in order
@@ -176,7 +185,10 @@ function buildNavigationLinks() {
176
185
  }
177
186
  });
178
187
  // Flow result (if exists and shown)
179
- if (showResultsInputs && flowInfo.result !== undefined && rootJob.type === 'CompletedJob') {
188
+ if (showResultsInputs &&
189
+ flowInfo &&
190
+ flowInfo.result !== undefined &&
191
+ rootJob?.type === 'CompletedJob') {
180
192
  items.push(`flow-${flowId}-result`);
181
193
  }
182
194
  // Convert items to navigation links
@@ -227,6 +239,14 @@ function getSubflows(module) {
227
239
  });
228
240
  }
229
241
  else if (module.value.type === 'branchall' || module.value.type === 'branchone') {
242
+ // Add default branch for branchone
243
+ if (module.value.type === 'branchone') {
244
+ subflows.push({
245
+ modules: module.value.default,
246
+ label: 'default',
247
+ flowId: `${module.id}-subflow-default`
248
+ });
249
+ }
230
250
  // Add all branches
231
251
  for (let i = 0; i < module.value.branches.length; i++) {
232
252
  const branch = module.value.branches[i];
@@ -236,17 +256,75 @@ function getSubflows(module) {
236
256
  flowId: `${module.id}-subflow-${i}`
237
257
  });
238
258
  }
239
- // Add default branch for branchone
240
- if (module.value.type === 'branchone') {
241
- subflows.push({
242
- modules: module.value.default,
243
- label: 'default',
244
- flowId: `${module.id}-subflow-default`
245
- });
246
- }
247
259
  }
248
260
  return subflows;
249
261
  }
262
+ const { timelineMin, timelineTotal } = $derived({
263
+ timelineMin: useRelativeTimeline && rootJob?.started_at
264
+ ? new Date(rootJob.started_at).getTime()
265
+ : timelineMinAbsolute,
266
+ timelineTotal: useRelativeTimeline && rootJob?.['duration_ms']
267
+ ? rootJob['duration_ms']
268
+ : timelineTotalAbsolute
269
+ });
270
+ function getSubflowJob(moduleId, idx, branchChosen, moduleType) {
271
+ // if a branch is chosen, ignore the other branches
272
+ if (branchChosen !== undefined && branchChosen !== idx) {
273
+ return undefined;
274
+ }
275
+ const jobType = localModuleStates[moduleId]?.type === 'Failure' ||
276
+ localModuleStates[moduleId]?.type === 'Success'
277
+ ? 'CompletedJob'
278
+ : 'QueuedJob';
279
+ let jobId = localModuleStates[moduleId]?.job_id;
280
+ let timelineItem = timelineItems?.[moduleId]?.find((item) => item.id === jobId);
281
+ let success = localModuleStates[moduleId]?.type === 'Success';
282
+ let result = localModuleStates[moduleId]?.result;
283
+ // if the subflow is part of a loop or branchAll
284
+ if (localModuleStates[moduleId]?.flow_jobs) {
285
+ const index = moduleType === 'forloopflow' || moduleType === 'whileloopflow'
286
+ ? (localModuleStates[moduleId]?.selectedForloopIndex ?? idx)
287
+ : idx;
288
+ jobId = localModuleStates[moduleId]?.flow_jobs[index];
289
+ timelineItem = timelineItems?.[moduleId]?.find((item) => item.id === jobId);
290
+ result = localModuleStates[moduleId]?.flow_jobs_results?.[index];
291
+ success = localModuleStates[moduleId]?.flow_jobs_success?.[index] ?? false;
292
+ }
293
+ return {
294
+ id: jobId,
295
+ type: jobType,
296
+ logs: localModuleStates[moduleId]?.logs,
297
+ result: result,
298
+ args: localModuleStates[moduleId]?.args,
299
+ success: success,
300
+ started_at: timelineItem?.started_at,
301
+ created_at: timelineItem?.created_at,
302
+ duration_ms: timelineItem?.duration_ms
303
+ };
304
+ }
305
+ function getSelectedIndex(moduleId, moduleItems) {
306
+ if (!moduleItems || !localModuleStates[moduleId])
307
+ return undefined;
308
+ const idToFind = localModuleStates[moduleId].selectedForloop ?? localModuleStates[moduleId].job_id;
309
+ const index = moduleItems?.findIndex((item) => item.id === idToFind);
310
+ if (index === -1) {
311
+ return undefined;
312
+ }
313
+ return index;
314
+ }
315
+ function isJobFailure(jobId, moduleId) {
316
+ if (!moduleId) {
317
+ return rootJob?.type === 'CompletedJob' && rootJob?.['success'] === false;
318
+ }
319
+ // if a jobId is provided, check the flow_jobs_success array for a specific job
320
+ if (localModuleStates[moduleId]?.flow_jobs_success && !!jobId) {
321
+ const index = localModuleStates[moduleId]?.flow_jobs?.indexOf(jobId);
322
+ if (index !== undefined && index >= 0) {
323
+ return localModuleStates[moduleId]?.flow_jobs_success?.[index] === false;
324
+ }
325
+ }
326
+ return localModuleStates[moduleId]?.type === 'Failure';
327
+ }
250
328
  </script>
251
329
 
252
330
  {#if render}
@@ -258,6 +336,20 @@ function getSubflows(module) {
258
336
  {/snippet}
259
337
  <Keyboard size={16} class="text-tertiary" />
260
338
  </Tooltip>
339
+ <div class="flex items-center gap-2 whitespace-nowrap">
340
+ <label for="showTimeline" class="text-xs text-tertiary hover:text-primary transition-colors"
341
+ >Show timeline</label
342
+ >
343
+ <div class="flex-shrink-0">
344
+ <input
345
+ type="checkbox"
346
+ name="showTimeline"
347
+ id="showTimeline"
348
+ bind:checked={showTimeline}
349
+ class="w-3 h-4 accent-primary -my-1"
350
+ />
351
+ </div>
352
+ </div>
261
353
  <div class="flex items-center gap-2 whitespace-nowrap">
262
354
  <label
263
355
  for="showResultsInputs"
@@ -292,27 +384,60 @@ function getSubflows(module) {
292
384
  <FlowLogRow
293
385
  id={`flow-${flowId}`}
294
386
  isCollapsible={level > 0}
295
- isRunning={rootJob.type === 'QueuedJob'}
387
+ isRunning={rootJob?.type === 'QueuedJob'}
296
388
  {isCurrent}
297
389
  {isExpanded}
298
390
  {toggleExpanded}
299
- class={rootJob.type === undefined ? 'opacity-50' : ''}
391
+ class={rootJob?.type === undefined ? 'opacity-50' : ''}
300
392
  {select}
301
393
  >
302
394
  {#snippet label()}
303
395
  <div class="flex items-center gap-2">
304
396
  <!-- Flow icon -->
305
- {@render flowIcon(level == 0 ? getFlowStatus(rootJob) : flowStatus, flowInfo.hasErrors)}
397
+ {@render flowIcon(getFlowStatus(rootJob), flowInfo?.hasErrors)}
306
398
 
307
- <div class="text-xs text-left font-mono grow min-w-0">
399
+ <div class="text-xs text-left font-mono">
308
400
  {mode === 'aiagent' ? 'AI Agent' : level == 0 ? 'Flow' : 'Subflow'}
309
- {#if flowInfo.label}
401
+ {#if flowInfo?.label}
310
402
  : {flowInfo.label}
311
403
  {/if}
312
404
  <span class="text-tertiary">{getStepProgress(rootJob, modules.length)}</span>
313
405
  </div>
314
406
 
315
- {#if flowInfo.jobId}
407
+ <div
408
+ class="min-w-min grow group"
409
+ bind:clientWidth={
410
+ () => timelineAvailableWidths[flowId] ?? 0,
411
+ (v) => (timelineAvailableWidths[flowId] = v)
412
+ }
413
+ >
414
+ {#if timelineItems && showTimeline && timelineMin != undefined && timelineTotal}
415
+ {@const moduleItems = [
416
+ {
417
+ started_at: rootJob?.started_at
418
+ ? new Date(rootJob.started_at).getTime()
419
+ : undefined,
420
+ duration_ms: rootJob?.['duration_ms'] ?? timelineTotal,
421
+ id: flowId
422
+ }
423
+ ]}
424
+ <FlowTimelineBar
425
+ total={timelineTotal}
426
+ min={timelineMin}
427
+ items={moduleItems}
428
+ now={timelineNow}
429
+ {timelinelWidth}
430
+ showZoomButtons={level > 0 && isExpanded(`flow-${flowId}`)}
431
+ onZoom={() => {
432
+ useRelativeTimeline = !useRelativeTimeline
433
+ }}
434
+ zoom={useRelativeTimeline ? 'in' : 'out'}
435
+ isJobFailure={(id) => isJobFailure(id)}
436
+ />
437
+ {/if}
438
+ </div>
439
+
440
+ {#if flowInfo?.jobId}
316
441
  <a
317
442
  href={getJobLink(flowInfo.jobId)}
318
443
  class="text-xs text-gray-400 hover:text-primary pl-1"
@@ -326,10 +451,10 @@ function getSubflows(module) {
326
451
  </div>
327
452
  {/snippet}
328
453
 
329
- {#if level === 0 || isExpanded(`flow-${flowId}`, rootJob.type === 'QueuedJob')}
454
+ {#if level === 0 || isExpanded(`flow-${flowId}`, rootJob?.type === 'QueuedJob')}
330
455
  <div class="mb-2 transition-all duration-200 ease-in-out w-full">
331
456
  <!-- Flow logs -->
332
- {#if flowInfo.logs}
457
+ {#if flowInfo?.logs}
333
458
  <LogViewer
334
459
  content={flowInfo.logs}
335
460
  jobId={flowInfo.jobId}
@@ -346,7 +471,7 @@ function getSubflows(module) {
346
471
  <!-- Flow steps - nested as children -->
347
472
  <ul class="w-full font-mono text-xs bg-surface-secondary list-none border-l">
348
473
  <!-- Flow inputs as first row entry -->
349
- {#if showResultsInputs && flowInfo.inputs && Object.keys(flowInfo.inputs).length > 0}
474
+ {#if showResultsInputs && flowInfo?.inputs && Object.keys(flowInfo.inputs).length > 0}
350
475
  <FlowLogRow
351
476
  id={`flow-${flowId}-input`}
352
477
  isCollapsible={true}
@@ -379,6 +504,12 @@ function getSubflows(module) {
379
504
  {@const isRunning = status === 'InProgress' || status === 'WaitingForExecutor'}
380
505
  {@const hasEmptySubflowValue = hasEmptySubflow(module.id, module.value.type)}
381
506
  {@const isCollapsible = !hasEmptySubflowValue}
507
+ {@const jobId = localModuleStates[module.id]?.job_id}
508
+ {@const moduleItems = timelineItems?.[module.id]}
509
+ {@const branchChosen =
510
+ module.value.type === 'branchone'
511
+ ? (localModuleStates[module.id]?.branchChosen ?? 0)
512
+ : undefined}
382
513
  <FlowLogRow
383
514
  id={module.id}
384
515
  {isCollapsible}
@@ -400,12 +531,12 @@ function getSubflows(module) {
400
531
  : ''
401
532
  )}
402
533
  >
403
- <div class="flex items-center gap-2 grow min-w-0">
534
+ <div class="flex items-center gap-2">
404
535
  <!-- Step icon -->
405
536
  {@render stepIcon(
406
537
  module.value.type,
407
538
  status as FlowStatusModule['type'],
408
- flowInfo.parentsWithErrors.has(module.id)
539
+ flowInfo?.parentsWithErrors.has(module.id)
409
540
  )}
410
541
 
411
542
  <div class="flex items-center gap-2">
@@ -447,7 +578,7 @@ function getSubflows(module) {
447
578
  </span>
448
579
  {#if !hasEmptySubflowValue && localModuleStates[module.id]?.flow_jobs && (module.value.type === 'forloopflow' || module.value.type === 'whileloopflow')}
449
580
  <span
450
- class="text-xs font-mono font-medium inline-flex items-center grow min-w-0 -my-2"
581
+ class="text-xs font-mono font-medium inline-flex items-center -my-2"
451
582
  >
452
583
  <button onclick={(e) => e.stopPropagation()}>
453
584
  <FlowJobsMenu
@@ -470,49 +601,78 @@ function getSubflows(module) {
470
601
  </div>
471
602
  </div>
472
603
 
473
- {#if isLeafStep}
474
- {@const jobId = localModuleStates[module.id]?.job_id}
475
- {#if jobId}
476
- <a
477
- href={getJobLink(jobId ?? '')}
478
- class="text-xs text-gray-400 hover:text-primary pl-1"
479
- target="_blank"
480
- rel="noopener noreferrer"
481
- >
482
- <ExternalLink size={12} />
483
- </a>
604
+ <div
605
+ class="min-w-min grow {isLeafStep ? 'mr-2' : 'mr-6'} min-h-2"
606
+ bind:clientWidth={
607
+ () => timelineAvailableWidths[module.id] ?? 0,
608
+ (v) => (timelineAvailableWidths[module.id] = v)
609
+ }
610
+ >
611
+ {#if timelineMin != undefined && timelineTotal && moduleItems && showTimeline}
612
+ <FlowTimelineBar
613
+ total={timelineTotal}
614
+ min={timelineMin}
615
+ items={moduleItems ?? []}
616
+ now={timelineNow}
617
+ {timelinelWidth}
618
+ onSelectIteration={(id) => {
619
+ if (
620
+ module.value.type !== 'forloopflow' &&
621
+ module.value.type !== 'whileloopflow'
622
+ ) {
623
+ return
624
+ }
625
+ const index =
626
+ localModuleStates[module.id]?.flow_jobs?.indexOf(id) ?? undefined
627
+ if (index !== undefined) {
628
+ onSelectedIteration?.({
629
+ id,
630
+ index,
631
+ manuallySet: true,
632
+ moduleId: module.id
633
+ })
634
+ }
635
+ }}
636
+ showIterations={localModuleStates[module.id]?.flow_jobs}
637
+ selectedIndex={getSelectedIndex(module.id, moduleItems)}
638
+ idToIterationIndex={(id) => {
639
+ return localModuleStates[module.id]?.flow_jobs?.indexOf(id)
640
+ }}
641
+ isJobFailure={() => isJobFailure(undefined, module.id)}
642
+ />
484
643
  {/if}
644
+ </div>
645
+
646
+ {#if isLeafStep && jobId}
647
+ <a
648
+ href={getJobLink(jobId ?? '')}
649
+ class="text-xs text-gray-400 hover:text-primary pl-1"
650
+ target="_blank"
651
+ rel="noopener noreferrer"
652
+ >
653
+ <ExternalLink size={12} />
654
+ </a>
485
655
  {/if}
486
656
  </div>
487
657
  {/snippet}
488
658
 
489
659
  {#if isCollapsible && isExpanded(module.id, isRunning)}
490
- {@const args = localModuleStates[module.id]?.args}
491
- {@const logs = localModuleStates[module.id]?.logs}
492
- {@const result = localModuleStates[module.id]?.result}
493
- {@const jobId = localModuleStates[module.id]?.job_id}
660
+ {@const subflows = getSubflows(module)}
494
661
  <div class="my-1 transition-all duration-200 ease-in-out border-l">
495
662
  <!-- Show child steps if they exist -->
496
- {#each getSubflows(module) as subflow}
497
- {@const subflowJob = {
498
- id: jobId,
499
- type:
500
- localModuleStates[module.id]?.type === 'Failure' ||
501
- localModuleStates[module.id]?.type === 'Success'
502
- ? 'CompletedJob'
503
- : ('QueuedJob' as Job['type']),
504
- logs,
505
- result,
506
- args,
507
- success: localModuleStates[module.id]?.type === 'Success'
508
- }}
663
+ {#each subflows as subflow, idx}
664
+ {@const subflowJob = getSubflowJob(
665
+ module.id,
666
+ idx,
667
+ branchChosen,
668
+ module.value.type
669
+ )}
509
670
  <div class="border-l mb-2">
510
671
  <!-- Recursively render child steps using FlowLogViewer -->
511
672
  <FlowLogViewer
512
673
  modules={subflow.modules}
513
674
  {localModuleStates}
514
675
  rootJob={subflowJob}
515
- flowStatus={localModuleStates[module.id]?.type}
516
676
  {expandedRows}
517
677
  {allExpanded}
518
678
  {showResultsInputs}
@@ -528,11 +688,22 @@ function getSubflows(module) {
528
688
  {currentId}
529
689
  bind:navigationChain={subloopNavigationChains[subflow.flowId]}
530
690
  {select}
691
+ {timelineNow}
692
+ {timelineMin}
693
+ {timelineTotal}
694
+ {timelineItems}
695
+ bind:timelineAvailableWidths
696
+ {timelinelWidth}
697
+ {showTimeline}
531
698
  />
532
699
  </div>
533
700
  {/each}
534
701
 
535
- {#if getSubflows(module).length === 0}
702
+ {#if subflows.length === 0}
703
+ {@const args = localModuleStates[module.id]?.args}
704
+ {@const logs = localModuleStates[module.id]?.logs}
705
+ {@const result = localModuleStates[module.id]?.result}
706
+ {@const jobId = localModuleStates[module.id]?.job_id}
536
707
  <!-- Show input arguments -->
537
708
  {#if showResultsInputs && isLeafStep && args && Object.keys(args).length > 0}
538
709
  <FlowLogRow
@@ -626,7 +797,7 @@ function getSubflows(module) {
626
797
  {/if}
627
798
 
628
799
  <!-- Flow result as last row entry -->
629
- {#if showResultsInputs && flowInfo.result !== undefined && rootJob.type === 'CompletedJob'}
800
+ {#if showResultsInputs && flowInfo?.result !== undefined && rootJob?.type === 'CompletedJob'}
630
801
  <FlowLogRow
631
802
  id={`flow-${flowId}-result`}
632
803
  isCollapsible={true}
@@ -652,7 +823,7 @@ function getSubflows(module) {
652
823
  </ul>
653
824
  {/if}
654
825
 
655
- {#snippet flowIcon(status: FlowStatusModule['type'] | undefined, hasErrors: boolean)}
826
+ {#snippet flowIcon(status: FlowStatusModule['type'] | undefined, hasErrors: boolean | undefined)}
656
827
  {@const colorClass = getStatusColor(status)}
657
828
  <div class="relative flex items-center">
658
829
  <BarsStaggered
@@ -671,7 +842,7 @@ function getSubflows(module) {
671
842
  {#snippet stepIcon(
672
843
  stepType: string | undefined,
673
844
  status: FlowStatusModule['type'] | undefined,
674
- hasErrors: boolean
845
+ hasErrors: boolean | undefined
675
846
  )}
676
847
  {@const colorClass = getStatusColor(status)}
677
848
  {@const animationClass = status === 'InProgress' ? 'animate-pulse' : ''}
@@ -1,13 +1,12 @@
1
1
  import FlowLogViewer from './FlowLogViewer.svelte';
2
- import type { FlowModule, FlowStatusModule, Job } from '../gen';
2
+ import type { FlowModule, Job } from '../gen';
3
3
  import type { GraphModuleState } from './graph/model';
4
4
  import type { NavigationChain } from '../keyboardChain';
5
5
  type RootJobData = Partial<Job>;
6
6
  interface Props {
7
7
  modules: FlowModule[];
8
8
  localModuleStates: Record<string, GraphModuleState>;
9
- rootJob: RootJobData;
10
- flowStatus: FlowStatusModule['type'] | undefined;
9
+ rootJob: RootJobData | undefined;
11
10
  expandedRows: Record<string, boolean>;
12
11
  allExpanded?: boolean;
13
12
  showResultsInputs?: boolean;
@@ -17,7 +16,7 @@ interface Props {
17
16
  render: boolean;
18
17
  level?: number;
19
18
  flowId: string;
20
- onSelectedIteration: (detail: {
19
+ onSelectedIteration?: (detail: {
21
20
  id: string;
22
21
  index: number;
23
22
  manuallySet: true;
@@ -32,7 +31,19 @@ interface Props {
32
31
  currentId?: string | null;
33
32
  navigationChain?: NavigationChain;
34
33
  select: (id: string) => void;
34
+ timelineMin?: number;
35
+ timelineTotal?: number;
36
+ timelineItems?: Record<string, Array<{
37
+ created_at?: number;
38
+ started_at?: number;
39
+ duration_ms?: number;
40
+ id: string;
41
+ }>>;
42
+ timelineNow: number;
43
+ timelineAvailableWidths: Record<string, number>;
44
+ timelinelWidth: number;
45
+ showTimeline?: boolean;
35
46
  }
36
- declare const FlowLogViewer: import("svelte").Component<Props, {}, "navigationChain">;
47
+ declare const FlowLogViewer: import("svelte").Component<Props, {}, "navigationChain" | "timelineAvailableWidths">;
37
48
  type FlowLogViewer = ReturnType<typeof FlowLogViewer>;
38
49
  export default FlowLogViewer;
@@ -1,8 +1,10 @@
1
1
  <script lang="ts">import FlowLogViewer from './FlowLogViewer.svelte';
2
- import { untrack } from 'svelte';
2
+ import { TimelineCompute } from '../timelineCompute.svelte';
3
+ import { onMount, untrack } from 'svelte';
3
4
  import { ChangeTracker } from '../svelte5Utils.svelte';
4
5
  import { readFieldsRecursively } from '../utils';
5
- let { job, localModuleStates, workspaceId, render, onSelectedIteration, mode = 'flow' } = $props();
6
+ import OnChange from './common/OnChange.svelte';
7
+ let { job, localModuleStates, localDurationStatuses, workspaceId, render, onSelectedIteration, mode = 'flow' } = $props();
6
8
  // State for tracking expanded rows - using Record to allow explicit control
7
9
  let expandedRows = $state({});
8
10
  let allExpanded = $state(false);
@@ -10,6 +12,19 @@ let showResultsInputs = $state(true);
10
12
  // Keyboard navigation state - incremental like expandedRows
11
13
  let currentId = $state('flow-root');
12
14
  let navigationChain = $state({});
15
+ // Timeline state
16
+ let timelineCompute = $state(undefined);
17
+ onMount(() => {
18
+ timelineCompute = new TimelineCompute(modules.map((m) => m.id), localDurationStatuses ?? {}, job.type === 'CompletedJob');
19
+ return () => {
20
+ timelineCompute?.destroy();
21
+ };
22
+ });
23
+ // Derived timeline values
24
+ const timelineMin = $derived(timelineCompute?.min ?? undefined);
25
+ const timelineTotal = $derived(timelineCompute?.total ?? undefined);
26
+ const timelineItems = $derived(timelineCompute?.items ?? undefined);
27
+ const timelineNow = $derived(timelineCompute?.now ?? Date.now());
13
28
  let moduleTracker = new ChangeTracker($state.snapshot(job.raw_flow?.modules ?? []));
14
29
  $effect(() => {
15
30
  readFieldsRecursively(job.raw_flow?.modules ?? []);
@@ -64,8 +79,41 @@ function handleKeydown(event) {
64
79
  function select(id) {
65
80
  currentId = id;
66
81
  }
82
+ let timelineAvailableWidths = $state({});
83
+ let lastJobId = $state(job.id);
84
+ const timelinelWidth = $derived.by(() => {
85
+ const widths = Object.values(timelineAvailableWidths);
86
+ return widths.length > 0 ? Math.max(Math.min(...widths) - 12, 0) : 0;
87
+ });
88
+ function updateJobId() {
89
+ if (job.id !== lastJobId) {
90
+ lastJobId = job.id;
91
+ navigationChain = {};
92
+ timelineAvailableWidths = {};
93
+ currentId = 'flow-root';
94
+ showResultsInputs = true;
95
+ timelineCompute?.reset();
96
+ }
97
+ }
98
+ $effect.pre(() => {
99
+ job.id;
100
+ untrack(() => {
101
+ job.id && updateJobId();
102
+ });
103
+ });
67
104
  </script>
68
105
 
106
+ <OnChange
107
+ key={localDurationStatuses}
108
+ onChange={() => {
109
+ timelineCompute?.updateInputs(
110
+ modules.map((m) => m.id),
111
+ localDurationStatuses ?? {},
112
+ job.type === 'CompletedJob'
113
+ )
114
+ }}
115
+ />
116
+
69
117
  <div
70
118
  class="w-full rounded-md overflow-hidden border focus:border-gray-400 dark:focus:border-gray-400"
71
119
  role="tree"
@@ -86,10 +134,15 @@ function select(id) {
86
134
  {render}
87
135
  {getSelectedIteration}
88
136
  flowId="root"
89
- flowStatus={undefined}
90
137
  {mode}
91
138
  {currentId}
92
139
  bind:navigationChain
93
140
  {select}
141
+ {timelineMin}
142
+ {timelineTotal}
143
+ {timelineItems}
144
+ {timelineNow}
145
+ bind:timelineAvailableWidths
146
+ {timelinelWidth}
94
147
  />
95
148
  </div>
@@ -1,11 +1,12 @@
1
1
  import type { Job } from '../gen';
2
- import type { GraphModuleState } from './graph';
2
+ import type { DurationStatus, GraphModuleState } from './graph';
3
3
  interface Props {
4
4
  job: Partial<Job>;
5
- localModuleStates: Record<string, GraphModuleState>;
5
+ localDurationStatuses?: Record<string, DurationStatus>;
6
6
  workspaceId: string | undefined;
7
7
  render: boolean;
8
- onSelectedIteration: (detail: {
8
+ localModuleStates: Record<string, GraphModuleState>;
9
+ onSelectedIteration?: (detail: {
9
10
  id: string;
10
11
  index: number;
11
12
  manuallySet: true;
@@ -43,14 +43,14 @@ export const whileLoopSchema = {
43
43
  };
44
44
  let selectedJobStep = $state(undefined);
45
45
  let isRunning = $state(false);
46
- let jobProgressReset = $state(undefined);
46
+ let progressBar = $state(undefined);
47
47
  export function test() {
48
48
  runPreview(previewArgs, undefined);
49
49
  }
50
50
  const { flowStateStore, pathStore } = getContext('FlowEditorContext');
51
51
  const dispatch = createEventDispatcher();
52
52
  export async function runPreview(args, restartedFrom) {
53
- jobProgressReset?.();
53
+ progressBar?.reset();
54
54
  const newFlow = { value: { modules }, summary: '' };
55
55
  jobId = await runFlowPreview(args, newFlow, $pathStore, restartedFrom);
56
56
  isRunning = true;
@@ -129,7 +129,7 @@ $effect(() => {
129
129
  <div></div>
130
130
  </div>
131
131
  <div class="w-full flex flex-col gap-y-1">
132
- <FlowProgressBar {job} bind:reset={jobProgressReset} />
132
+ <FlowProgressBar {job} bind:this={progressBar} />
133
133
  </div>
134
134
  <div class="overflow-y-auto grow pr-4">
135
135
  <div class="max-h-1/2 overflow-auto border-b">
@@ -144,7 +144,7 @@ $effect(() => {
144
144
  <div class="pt-4 grow">
145
145
  {#if jobId}
146
146
  <FlowStatusViewer
147
- bind:flowStateStore={flowStateStore.val}
147
+ bind:flowState={flowStateStore.val}
148
148
  {jobId}
149
149
  onJobsLoaded={({ job: newJob }) => {
150
150
  job = newJob
@@ -30,6 +30,6 @@ declare const FlowLoopIterationPreview: $$__sveltets_2_IsomorphicComponent<Props
30
30
  whileLoopSchema: Schema;
31
31
  test: () => void;
32
32
  runPreview: (args: Record<string, any>, restartedFrom: RestartedFrom | undefined) => Promise<void>;
33
- }, "job" | "previewArgs" | "jobId">;
33
+ }, "job" | "jobId" | "previewArgs">;
34
34
  type FlowLoopIterationPreview = InstanceType<typeof FlowLoopIterationPreview>;
35
35
  export default FlowLoopIterationPreview;