windmill-components 1.532.0 → 1.542.4

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 (371) hide show
  1. package/package/components/AIProviderPicker.svelte +181 -0
  2. package/package/components/AIProviderPicker.svelte.d.ts +15 -0
  3. package/package/components/ArgInfo.svelte +2 -2
  4. package/package/components/ArgInput.svelte +60 -27
  5. package/package/components/ArgInput.svelte.d.ts +3 -3
  6. package/package/components/AssignableTagsInner.svelte +89 -3
  7. package/package/components/Auth0Setting.svelte +8 -3
  8. package/package/components/ConcurrentJobsChart.svelte +36 -48
  9. package/package/components/ConcurrentJobsChart.svelte.d.ts +8 -20
  10. package/package/components/CustomPopover.svelte.d.ts +1 -1
  11. package/package/components/Dev.svelte +5 -4
  12. package/package/components/DiffDrawer.svelte +2 -2
  13. package/package/components/DiffEditor.svelte +34 -37
  14. package/package/components/DiffEditor.svelte.d.ts +23 -39
  15. package/package/components/DropdownSelect.svelte +26 -0
  16. package/package/components/DropdownSelect.svelte.d.ts +11 -0
  17. package/package/components/DropdownV2Inner.svelte +1 -1
  18. package/package/components/{DynSelect.svelte → DynamicInput.svelte} +47 -15
  19. package/package/components/DynamicInput.svelte.d.ts +11 -0
  20. package/package/components/EditableSchemaForm.svelte +155 -140
  21. package/package/components/EditableSchemaForm.svelte.d.ts +6 -7
  22. package/package/components/Editor.svelte +101 -87
  23. package/package/components/Editor.svelte.d.ts +7 -1
  24. package/package/components/EditorBar.svelte +2 -5
  25. package/package/components/FlowBuilder.svelte +10 -7
  26. package/package/components/FlowLogRow.svelte +64 -0
  27. package/package/components/FlowLogRow.svelte.d.ts +15 -0
  28. package/package/components/FlowLogViewer.svelte +406 -373
  29. package/package/components/FlowLogViewer.svelte.d.ts +5 -1
  30. package/package/components/FlowLogViewerWrapper.svelte +44 -1
  31. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  32. package/package/components/FlowPreviewContent.svelte +3 -3
  33. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  34. package/package/components/FlowStatusViewer.svelte +28 -0
  35. package/package/components/FlowStatusViewerInner.svelte +106 -23
  36. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -0
  37. package/package/components/FolderPicker.svelte +1 -1
  38. package/package/components/InputTransformForm.svelte +20 -10
  39. package/package/components/JobArgs.svelte +1 -1
  40. package/package/components/JobLoader.svelte.d.ts +1 -1
  41. package/package/components/JobStatus.svelte +2 -0
  42. package/package/components/LogSnippetViewer.svelte +3 -3
  43. package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
  44. package/package/components/LogViewer.svelte +87 -71
  45. package/package/components/LogViewer.svelte.d.ts +1 -0
  46. package/package/components/ModulePreview.svelte +2 -1
  47. package/package/components/ModulePreview.svelte.d.ts +1 -0
  48. package/package/components/ModulePreviewForm.svelte +72 -65
  49. package/package/components/ModulePreviewResultViewer.svelte +13 -18
  50. package/package/components/ModuleTest.svelte +6 -5
  51. package/package/components/ModuleTest.svelte.d.ts +1 -0
  52. package/package/components/OktaSetting.svelte +8 -3
  53. package/package/components/Path.svelte +7 -1
  54. package/package/components/Path.svelte.d.ts +1 -1
  55. package/package/components/Portal.svelte +11 -7
  56. package/package/components/Portal.svelte.d.ts +19 -39
  57. package/package/components/PrefixedInput.svelte +120 -0
  58. package/package/components/PrefixedInput.svelte.d.ts +8 -0
  59. package/package/components/QueuePosition.svelte +81 -0
  60. package/package/components/QueuePosition.svelte.d.ts +8 -0
  61. package/package/components/ResourceNarrowing.svelte +13 -0
  62. package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
  63. package/package/components/ResourceTypePicker.svelte +49 -74
  64. package/package/components/RunChart.svelte +74 -89
  65. package/package/components/RunChart.svelte.d.ts +10 -22
  66. package/package/components/RunForm.svelte +2 -2
  67. package/package/components/RunForm.svelte.d.ts +1 -1
  68. package/package/components/RunFormAdvancedPopup.svelte +13 -1
  69. package/package/components/S3FilePicker.svelte +1 -1
  70. package/package/components/SchemaForm.svelte +1 -2
  71. package/package/components/SchemaForm.svelte.d.ts +2 -2
  72. package/package/components/ScriptBuilder.svelte +3 -2
  73. package/package/components/ScriptEditor.svelte +25 -10
  74. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  75. package/package/components/ServiceLogsInner.svelte +1 -1
  76. package/package/components/ShareModal.svelte.d.ts +1 -1
  77. package/package/components/SimpleEditor.svelte +4 -68
  78. package/package/components/StringTypeNarrowing.svelte +5 -10
  79. package/package/components/TemplateEditor.svelte +2 -16
  80. package/package/components/TimeAgo.svelte +1 -1
  81. package/package/components/TimeAgo.svelte.d.ts +1 -0
  82. package/package/components/Toggle.svelte +2 -1
  83. package/package/components/Toggle.svelte.d.ts +2 -1
  84. package/package/components/WorkerRepl.svelte +1 -1
  85. package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
  86. package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
  87. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
  88. package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
  89. package/package/components/apps/components/display/table/utils.js +36 -5
  90. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
  91. package/package/components/apps/components/layout/AppModal.svelte +2 -2
  92. package/package/components/apps/editor/AppEditor.svelte +4 -3
  93. package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
  94. package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
  95. package/package/components/apps/editor/SettingsPanel.svelte +2 -2
  96. package/package/components/apps/editor/component/ComponentNavigation.svelte +3 -2
  97. package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
  98. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +1 -1
  99. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  100. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  101. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +0 -1
  102. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  103. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +29 -4
  104. package/package/components/apps/editor/settingsPanel/GridCondition.svelte +3 -1
  105. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +3 -1
  106. package/package/components/apps/editor/settingsPanel/GridTab.svelte +3 -1
  107. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
  108. package/package/components/apps/editor/settingsPanel/OneOfInputSpecsEditor.svelte +55 -53
  109. package/package/components/apps/editor/settingsPanel/TableActions.svelte +3 -1
  110. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
  111. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
  112. package/package/components/assets/JobAssetsViewer.svelte +28 -24
  113. package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
  114. package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
  115. package/package/components/common/OnChange.svelte.d.ts +11 -4
  116. package/package/components/common/badge/Badge.svelte +9 -2
  117. package/package/components/common/badge/Badge.svelte.d.ts +2 -1
  118. package/package/components/common/button/model.d.ts +1 -1
  119. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
  120. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
  121. package/package/components/common/drawer/Disposable.svelte +45 -26
  122. package/package/components/common/drawer/Disposable.svelte.d.ts +12 -44
  123. package/package/components/common/drawer/Drawer.svelte +17 -14
  124. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  125. package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
  126. package/package/components/common/modal/Modal.svelte.d.ts +1 -1
  127. package/package/components/common/tabs/TabContent.svelte +2 -7
  128. package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
  129. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
  130. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
  131. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
  132. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  133. package/package/components/copilot/MetadataGen.svelte +14 -3
  134. package/package/components/copilot/chat/AIChatInput.svelte +0 -1
  135. package/package/components/copilot/chat/AIChatManager.svelte.js +26 -104
  136. package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
  137. package/package/components/copilot/chat/AvailableContextList.svelte +192 -66
  138. package/package/components/copilot/chat/AvailableContextList.svelte.d.ts +2 -2
  139. package/package/components/copilot/chat/ContextElementBadge.svelte +3 -3
  140. package/package/components/copilot/chat/ContextManager.svelte.js +36 -13
  141. package/package/components/copilot/chat/ContextTextarea.svelte +21 -48
  142. package/package/components/copilot/chat/ToolContentDisplay.svelte +10 -1
  143. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +3 -3
  144. package/package/components/copilot/chat/anthropic.d.ts +15 -0
  145. package/package/components/copilot/chat/anthropic.js +208 -0
  146. package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
  147. package/package/components/copilot/chat/api/apiTools.js +10 -7
  148. package/package/components/copilot/chat/api/core.d.ts +1 -1
  149. package/package/components/copilot/chat/api/core.js +7 -2
  150. package/package/components/copilot/chat/ask/core.d.ts +1 -1
  151. package/package/components/copilot/chat/ask/core.js +7 -2
  152. package/package/components/copilot/chat/context.d.ts +7 -2
  153. package/package/components/copilot/chat/flow/FlowAIChat.svelte +110 -8
  154. package/package/components/copilot/chat/flow/core.d.ts +12 -1
  155. package/package/components/copilot/chat/flow/core.js +133 -5
  156. package/package/components/copilot/chat/flow/uiIntents.d.ts +8 -0
  157. package/package/components/copilot/chat/flow/uiIntents.js +5 -0
  158. package/package/components/copilot/chat/flow/useUiIntent.d.ts +5 -0
  159. package/package/components/copilot/chat/flow/useUiIntent.js +12 -0
  160. package/package/components/copilot/chat/monaco-adapter.d.ts +23 -4
  161. package/package/components/copilot/chat/monaco-adapter.js +55 -16
  162. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  163. package/package/components/copilot/chat/navigator/core.js +7 -2
  164. package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
  165. package/package/components/copilot/chat/script/core.d.ts +5 -4
  166. package/package/components/copilot/chat/script/core.js +134 -21
  167. package/package/components/copilot/chat/shared.d.ts +10 -9
  168. package/package/components/copilot/chat/shared.js +24 -12
  169. package/package/components/copilot/lib.d.ts +29 -8
  170. package/package/components/copilot/lib.js +211 -31
  171. package/package/components/copilot/shared.d.ts +1 -1
  172. package/package/components/copilot/shared.js +16 -10
  173. package/package/components/flows/FlowEditor.svelte +4 -2
  174. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  175. package/package/components/flows/FlowModuleIcon.svelte +8 -8
  176. package/package/components/flows/common/FlowCardHeader.svelte +4 -1
  177. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +6 -0
  178. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +6 -0
  179. package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
  180. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  181. package/package/components/flows/content/FlowInput.svelte +36 -39
  182. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  183. package/package/components/flows/content/FlowLoop.svelte +7 -0
  184. package/package/components/flows/content/FlowModuleComponent.svelte +42 -46
  185. package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
  186. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  187. package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
  188. package/package/components/flows/content/FlowModuleSuspend.svelte +15 -18
  189. package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
  190. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
  191. package/package/components/flows/content/FlowRetries.svelte +108 -3
  192. package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
  193. package/package/components/flows/content/FlowWhileLoop.svelte +6 -0
  194. package/package/components/flows/content/ScriptEditorDrawer.svelte +9 -11
  195. package/package/components/flows/dfs.d.ts +1 -1
  196. package/package/components/flows/dfs.js +6 -6
  197. package/package/components/flows/flowInfers.js +15 -42
  198. package/package/components/flows/flowStateUtils.svelte.js +1 -2
  199. package/package/components/flows/flowStore.d.ts +45 -1
  200. package/package/components/flows/flowStore.js +1 -1
  201. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  202. package/package/components/flows/map/FlowModuleSchemaItem.svelte +73 -80
  203. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
  204. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
  205. package/package/components/flows/map/InsertModuleButton.svelte +1 -0
  206. package/package/components/flows/map/InsertModuleInner.svelte +12 -15
  207. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
  208. package/package/components/flows/map/MapItem.svelte +8 -4
  209. package/package/components/flows/map/VirtualItem.svelte +1 -1
  210. package/package/components/flows/pickers/TopLevelNode.svelte +1 -1
  211. package/package/components/flows/propPicker/InputPickerInner.svelte +5 -5
  212. package/package/components/flows/propPicker/OutputPickerInner.svelte +143 -118
  213. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +7 -16
  214. package/package/components/flows/{testSteps.svelte.d.ts → stepsInputArgs.svelte.d.ts} +2 -1
  215. package/package/components/flows/{testSteps.svelte.js → stepsInputArgs.svelte.js} +15 -3
  216. package/package/components/flows/types.d.ts +16 -3
  217. package/package/components/flows/utils.js +3 -0
  218. package/package/components/git_sync/DetectionFlow.svelte +15 -17
  219. package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
  220. package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
  221. package/package/components/graph/FlowGraphV2.svelte +1 -1
  222. package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
  223. package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
  224. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
  225. package/package/components/graph/renderers/nodes/AIToolNode.svelte +4 -4
  226. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
  227. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
  228. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +71 -54
  229. package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
  230. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
  231. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
  232. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
  233. package/package/components/home/ItemsList.svelte +17 -13
  234. package/package/components/home/TreeView.svelte +21 -27
  235. package/package/components/home/TreeView.svelte.d.ts +2 -29
  236. package/package/components/home/TreeViewRoot.svelte +11 -23
  237. package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
  238. package/package/components/icons/GitIcon.svelte +10 -2
  239. package/package/components/icons/GitIcon.svelte.d.ts +1 -0
  240. package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
  241. package/package/components/meltComponents/Popover.svelte +23 -3
  242. package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
  243. package/package/components/monacoLanguagesOptions.d.ts +3 -0
  244. package/package/components/monacoLanguagesOptions.js +109 -0
  245. package/package/components/propertyPicker/ObjectViewer.svelte +18 -5
  246. package/package/components/propertyPicker/PropPicker.svelte +1 -1
  247. package/package/components/propertyPicker/utils.js +14 -7
  248. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +1 -1
  249. package/package/components/runs/JobRunsPreview.svelte +212 -177
  250. package/package/components/runs/JobsLoader.svelte +2 -2
  251. package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
  252. package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
  253. package/package/components/runs/RunBadges.svelte +100 -0
  254. package/package/components/runs/RunBadges.svelte.d.ts +12 -0
  255. package/package/components/runs/RunLabels.svelte +86 -0
  256. package/package/components/runs/RunLabels.svelte.d.ts +10 -0
  257. package/package/components/runs/RunOption.svelte +20 -0
  258. package/package/components/runs/RunOption.svelte.d.ts +10 -0
  259. package/package/components/runs/RunRow.svelte +239 -151
  260. package/package/components/runs/RunRow.svelte.d.ts +12 -9
  261. package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
  262. package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
  263. package/package/components/runs/RunsFilter.svelte +369 -243
  264. package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
  265. package/package/components/runs/RunsQueue.svelte +96 -25
  266. package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
  267. package/package/components/runs/RunsTable.svelte +62 -71
  268. package/package/components/runs/RunsTable.svelte.d.ts +2 -1
  269. package/package/components/runs/runs-grid.css +95 -0
  270. package/package/components/schema/AddPropertyV2.svelte +2 -7
  271. package/package/components/schema/AddPropertyV2.svelte.d.ts +3 -20
  272. package/package/components/schema/EditableSchemaDrawer.svelte +121 -127
  273. package/package/components/schema/EditableSchemaDrawer.svelte.d.ts +2 -1
  274. package/package/components/schema/EditableSchemaSdkWrapper.svelte +16 -3
  275. package/package/components/schema/EditableSchemaSdkWrapper.svelte.d.ts +4 -1
  276. package/package/components/schema/EditableSchemaWrapper.svelte +3 -10
  277. package/package/components/schema/FlowPropertyEditor.svelte +195 -236
  278. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  279. package/package/components/schema/PropertyEditor.svelte +33 -35
  280. package/package/components/schema/SchemaFormDND.svelte +11 -10
  281. package/package/components/schema/SchemaFormDND.svelte.d.ts +4 -3
  282. package/package/components/schema/editable_schema_wrapper.d.ts +0 -3
  283. package/package/components/search/GlobalSearchModal.svelte +8 -1
  284. package/package/components/select/DraggableTags.svelte.d.ts +17 -7
  285. package/package/components/select/MultiSelect.svelte.d.ts +21 -11
  286. package/package/components/select/Select.svelte +2 -1
  287. package/package/components/select/Select.svelte.d.ts +25 -13
  288. package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
  289. package/package/components/settings/PremiumInfo.svelte +7 -2
  290. package/package/components/settings/TokenDisplay.svelte +1 -1
  291. package/package/components/sidebar/OperatorMenu.svelte +5 -0
  292. package/package/components/sidebar/SidebarContent.svelte +48 -2
  293. package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
  294. package/package/components/toast.js +6 -3
  295. package/package/components/triggers/AddTriggersButton.svelte +7 -6
  296. package/package/components/triggers/CaptureWrapper.svelte +21 -16
  297. package/package/components/triggers/CaptureWrapper.svelte.d.ts +1 -1
  298. package/package/components/triggers/TriggerLabel.svelte +8 -0
  299. package/package/components/triggers/TriggerTokens.svelte +1 -1
  300. package/package/components/triggers/TriggersEditor.svelte +9 -5
  301. package/package/components/triggers/TriggersTable.svelte +2 -2
  302. package/package/components/triggers/TriggersWrapper.svelte +17 -5
  303. package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
  304. package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
  305. package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
  306. package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
  307. package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
  308. package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
  309. package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
  310. package/package/components/triggers/email/EmailCapture.svelte +39 -0
  311. package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
  312. package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
  313. package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
  314. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
  315. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
  316. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
  317. package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
  318. package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
  319. package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
  320. package/package/components/triggers/email/utils.d.ts +4 -0
  321. package/package/components/triggers/email/utils.js +52 -0
  322. package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
  323. package/package/components/triggers/http/RouteEditorInner.svelte +1 -1
  324. package/package/components/triggers/http/utils.js +1 -1
  325. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +23 -20
  326. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte +15 -27
  327. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte.d.ts +7 -5
  328. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  329. package/package/components/triggers/triggers.svelte.js +24 -2
  330. package/package/components/triggers/utils.js +19 -5
  331. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +16 -16
  332. package/package/components/triggers.d.ts +1 -1
  333. package/package/components/triggers.js +2 -0
  334. package/package/components/wizards/AgGridWizard.svelte +85 -80
  335. package/package/components/workspaceSettings/AISettings.svelte +74 -22
  336. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  337. package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
  338. package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
  339. package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
  340. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
  341. package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
  342. package/package/gen/core/OpenAPI.js +1 -1
  343. package/package/gen/schemas.gen.d.ts +142 -3
  344. package/package/gen/schemas.gen.js +144 -3
  345. package/package/gen/services.gen.d.ts +129 -1
  346. package/package/gen/services.gen.js +267 -1
  347. package/package/gen/types.gen.d.ts +434 -8
  348. package/package/hubPaths.json +6 -2
  349. package/package/infer.js +1 -1
  350. package/package/keyboardChain.d.ts +5 -0
  351. package/package/keyboardChain.js +40 -0
  352. package/package/script_helpers.d.ts +2 -2
  353. package/package/script_helpers.js +2 -0
  354. package/package/services/JobManager.js +2 -2
  355. package/package/stores.d.ts +4 -1
  356. package/package/stores.js +16 -6
  357. package/package/utils/workspaceHierarchy.d.ts +27 -0
  358. package/package/utils/workspaceHierarchy.js +101 -0
  359. package/package/utils.d.ts +6 -3
  360. package/package/utils.js +30 -15
  361. package/package/workspace_settings.js +2 -3
  362. package/package.json +10 -12
  363. package/package/components/DynSelect.svelte.d.ts +0 -11
  364. package/package/components/ModulePreviewResultViewer.svelte.d.ts +0 -28
  365. package/package/components/ObjectTypeNarrowing.svelte +0 -18
  366. package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
  367. package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
  368. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
  369. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
  370. package/package/components/details/EmailTriggerPanel.svelte +0 -76
  371. package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
@@ -9,7 +9,7 @@ import { loadSchemaFromModule } from '../../../flows/flowInfers';
9
9
  import { aiChatManager } from '../AIChatManager.svelte';
10
10
  import { refreshStateStore } from '../../../../svelte5Utils.svelte';
11
11
  import DiffDrawer from '../../../DiffDrawer.svelte';
12
- let { flowModuleSchemaMap, } = $props();
12
+ let { flowModuleSchemaMap } = $props();
13
13
  const { flowStore, flowStateStore, selectedId, currentEditor } = getContext('FlowEditorContext');
14
14
  const { exprsToSet } = getContext('FlowCopilotContext') ?? {};
15
15
  let affectedModules = $state({});
@@ -71,13 +71,10 @@ const flowHelpers = {
71
71
  hasDiff: () => {
72
72
  return Object.keys(affectedModules).length > 0;
73
73
  },
74
- acceptAllModuleActions: () => {
75
- for (const [id, affectedModule] of Object.entries(affectedModules)) {
76
- if (affectedModule.action === 'removed') {
77
- deleteStep(id);
78
- }
74
+ acceptAllModuleActions() {
75
+ for (const id of Object.keys(affectedModules)) {
76
+ this.acceptModuleAction(id);
79
77
  }
80
- affectedModules = {};
81
78
  },
82
79
  rejectAllModuleActions() {
83
80
  for (const id of Object.keys(affectedModules)) {
@@ -151,7 +148,18 @@ const flowHelpers = {
151
148
  if (!newModule) {
152
149
  throw new Error('Module not found');
153
150
  }
154
- newModule.value = oldModule.value;
151
+ // Apply the old code to the editor and hide diff editor if the reverted module is a rawscript
152
+ if (newModule.value.type === 'rawscript' &&
153
+ $currentEditor?.type === 'script' &&
154
+ $currentEditor.stepId === id) {
155
+ const aiChatEditorHandler = $currentEditor.editor.getAiChatEditorHandler();
156
+ if (aiChatEditorHandler) {
157
+ aiChatEditorHandler.revertAll({ disableReviewCallback: true });
158
+ $currentEditor.hideDiffMode();
159
+ }
160
+ }
161
+ Object.keys(newModule).forEach((k) => delete newModule[k]);
162
+ Object.assign(newModule, $state.snapshot(oldModule));
155
163
  }
156
164
  refreshStateStore(flowStore);
157
165
  delete affectedModules[id];
@@ -162,6 +170,15 @@ const flowHelpers = {
162
170
  if (affectedModules[id]?.action === 'removed') {
163
171
  deleteStep(id);
164
172
  }
173
+ if (affectedModules[id]?.action === 'modified' &&
174
+ $currentEditor &&
175
+ $currentEditor.type === 'script' &&
176
+ $currentEditor.stepId === id) {
177
+ const aiChatEditorHandler = $currentEditor.editor.getAiChatEditorHandler();
178
+ if (aiChatEditorHandler) {
179
+ aiChatEditorHandler.keepAll({ disableReviewCallback: true });
180
+ }
181
+ }
165
182
  delete affectedModules[id];
166
183
  },
167
184
  // ai chat tools
@@ -416,6 +433,72 @@ const flowHelpers = {
416
433
  refreshStateStore(flowStore);
417
434
  }
418
435
  setModuleStatus(id, 'modified');
436
+ },
437
+ setForLoopOptions: async (id, opts) => {
438
+ const module = getModule(id);
439
+ if (!module) {
440
+ throw new Error('Module not found');
441
+ }
442
+ if (module.value.type !== 'forloopflow') {
443
+ throw new Error('Module is not a forloopflow');
444
+ }
445
+ // Apply skip_failures if provided
446
+ if (typeof opts.skip_failures === 'boolean') {
447
+ module.value.skip_failures = opts.skip_failures;
448
+ }
449
+ // Apply parallel if provided
450
+ if (typeof opts.parallel === 'boolean') {
451
+ module.value.parallel = opts.parallel;
452
+ }
453
+ // Handle parallelism
454
+ if (opts.parallel === false) {
455
+ // If parallel is disabled, clear parallelism
456
+ module.value.parallelism = undefined;
457
+ }
458
+ else if (opts.parallelism !== undefined) {
459
+ if (opts.parallelism === null) {
460
+ // Explicitly clear parallelism
461
+ module.value.parallelism = undefined;
462
+ }
463
+ else if (module.value.parallel || opts.parallel === true) {
464
+ // Only set parallelism if parallel is enabled
465
+ const n = Math.max(1, Math.floor(Math.abs(opts.parallelism)));
466
+ module.value.parallelism = n;
467
+ }
468
+ }
469
+ refreshStateStore(flowStore);
470
+ setModuleStatus(id, 'modified');
471
+ },
472
+ setModuleControlOptions: async (id, opts) => {
473
+ const module = getModule(id);
474
+ if (!module) {
475
+ throw new Error('Module not found');
476
+ }
477
+ // Handle stop_after_if
478
+ if (typeof opts.stop_after_if === 'boolean') {
479
+ if (opts.stop_after_if === false) {
480
+ module.stop_after_if = undefined;
481
+ }
482
+ else {
483
+ module.stop_after_if = {
484
+ expr: opts.stop_after_if_expr ?? '',
485
+ skip_if_stopped: opts.stop_after_if
486
+ };
487
+ }
488
+ }
489
+ // Handle skip_if
490
+ if (typeof opts.skip_if === 'boolean') {
491
+ if (opts.skip_if === false) {
492
+ module.skip_if = undefined;
493
+ }
494
+ else {
495
+ module.skip_if = {
496
+ expr: opts.skip_if_expr ?? ''
497
+ };
498
+ }
499
+ }
500
+ refreshStateStore(flowStore);
501
+ setModuleStatus(id, 'modified');
419
502
  }
420
503
  };
421
504
  function deleteStep(id) {
@@ -454,6 +537,25 @@ $effect(() => {
454
537
  const cleanup = aiChatManager.listenForCurrentEditorChanges($currentEditor);
455
538
  return cleanup;
456
539
  });
540
+ // Automatically show revert review when selecting a rawscript module with pending changes
541
+ $effect(() => {
542
+ if ($currentEditor?.type === 'script' &&
543
+ $selectedId &&
544
+ affectedModules[$selectedId] &&
545
+ $currentEditor.editor.getAiChatEditorHandler()) {
546
+ const moduleLastSnapshot = getModule($selectedId, lastSnapshot);
547
+ const content = moduleLastSnapshot?.value.type === 'rawscript' ? moduleLastSnapshot.value.content : '';
548
+ if (content.length > 0) {
549
+ untrack(() => $currentEditor.editor.reviewAppliedCode(content, {
550
+ onFinishedReview: () => {
551
+ const id = $selectedId;
552
+ flowHelpers.acceptModuleAction(id);
553
+ $currentEditor.hideDiffMode();
554
+ }
555
+ }));
556
+ }
557
+ }
558
+ });
457
559
  let diffDrawer = $state(undefined);
458
560
  </script>
459
561
 
@@ -33,6 +33,17 @@ export interface FlowAIChatHelpers {
33
33
  addBranch: (id: string) => Promise<void>;
34
34
  removeBranch: (id: string, branchIndex: number) => Promise<void>;
35
35
  setForLoopIteratorExpression: (id: string, expression: string) => Promise<void>;
36
+ setForLoopOptions: (id: string, opts: {
37
+ skip_failures?: boolean | null;
38
+ parallel?: boolean | null;
39
+ parallelism?: number | null;
40
+ }) => Promise<void>;
41
+ setModuleControlOptions: (id: string, opts: {
42
+ stop_after_if?: boolean | null;
43
+ stop_after_if_expr?: string | null;
44
+ skip_if?: boolean | null;
45
+ skip_if_expr?: string | null;
46
+ }) => Promise<void>;
36
47
  setCode: (id: string, code: string) => Promise<void>;
37
48
  }
38
49
  declare const newStepSchema: z.ZodUnion<[z.ZodObject<{
@@ -127,7 +138,7 @@ declare const insertLocationSchema: z.ZodUnion<[z.ZodObject<{
127
138
  }>]>;
128
139
  type InsertLocation = z.infer<typeof insertLocationSchema>;
129
140
  export declare const flowTools: Tool<FlowAIChatHelpers>[];
130
- export declare function prepareFlowSystemMessage(): ChatCompletionSystemMessageParam;
141
+ export declare function prepareFlowSystemMessage(customPrompt?: string): ChatCompletionSystemMessageParam;
131
142
  export declare function prepareFlowUserMessage(instructions: string, flowAndSelectedId?: {
132
143
  flow: ExtendedOpenFlow;
133
144
  selectedId: string;
@@ -1,4 +1,5 @@
1
1
  import { ScriptService, JobService } from '../../../../gen';
2
+ import { emitUiIntent } from './uiIntents';
2
3
  import YAML from 'yaml';
3
4
  import { z } from 'zod';
4
5
  import uFuzzy from '@leeoniya/ufuzzy';
@@ -98,6 +99,51 @@ const setForLoopIteratorExpressionSchema = z.object({
98
99
  expression: z.string().describe('The JavaScript expression to set for the iterator')
99
100
  });
100
101
  const setForLoopIteratorExpressionToolDef = createToolDef(setForLoopIteratorExpressionSchema, 'set_forloop_iterator_expression', 'Set the iterator JavaScript expression for the given forloop step');
102
+ const setForLoopOptionsSchema = z.object({
103
+ id: z.string().describe('The id of the forloop step to configure'),
104
+ skip_failures: z
105
+ .boolean()
106
+ .nullable()
107
+ .optional()
108
+ .describe('Whether to skip failures in the loop (null to not change)'),
109
+ parallel: z
110
+ .boolean()
111
+ .nullable()
112
+ .optional()
113
+ .describe('Whether to run iterations in parallel (null to not change)'),
114
+ parallelism: z
115
+ .number()
116
+ .int()
117
+ .min(1)
118
+ .nullable()
119
+ .optional()
120
+ .describe('Maximum number of parallel iterations (null to not change)')
121
+ });
122
+ const setForLoopOptionsToolDef = createToolDef(setForLoopOptionsSchema, 'set_forloop_options', 'Set advanced options for a forloop step: skip_failures, parallel, and parallelism');
123
+ const setModuleControlOptionsSchema = z.object({
124
+ id: z.string().describe('The id of the module to configure'),
125
+ stop_after_if: z
126
+ .boolean()
127
+ .nullable()
128
+ .optional()
129
+ .describe('Early stop condition (true to set, false to clear, null to not change)'),
130
+ stop_after_if_expr: z
131
+ .string()
132
+ .nullable()
133
+ .optional()
134
+ .describe('JavaScript expression for early stop condition. Can use `flow_input` or `result`. `result` is the result of the step. `results.<step_id>` is not supported, do not use it. Only used if stop_after_if is true. Example: `flow_input.x > 10` or `result === "failure"`'),
135
+ skip_if: z
136
+ .boolean()
137
+ .nullable()
138
+ .optional()
139
+ .describe('Skip condition (true to set, false to clear, null to not change)'),
140
+ skip_if_expr: z
141
+ .string()
142
+ .nullable()
143
+ .optional()
144
+ .describe('JavaScript expression for skip condition. Can use `flow_input` or `results.<step_id>`. Only used if skip_if is true. Example: `flow_input.x > 10` or `results.a === "failure"`')
145
+ });
146
+ const setModuleControlOptionsToolDef = createToolDef(setModuleControlOptionsSchema, 'set_module_control_options', 'Set control options for any module: stop_after_if (early stop) and skip_if (conditional skip)');
101
147
  const setBranchPredicateSchema = z.object({
102
148
  id: z.string().describe('The id of the branchone step to set the predicates for'),
103
149
  branchIndex: z
@@ -378,6 +424,70 @@ export const flowTools = [
378
424
  return `Forloop '${parsedArgs.id}' iterator expression set`;
379
425
  }
380
426
  },
427
+ {
428
+ def: {
429
+ ...setForLoopOptionsToolDef,
430
+ function: { ...setForLoopOptionsToolDef.function, strict: false }
431
+ },
432
+ fn: async ({ args, helpers, toolId, toolCallbacks }) => {
433
+ const parsedArgs = setForLoopOptionsSchema.parse(args);
434
+ await helpers.setForLoopOptions(parsedArgs.id, {
435
+ skip_failures: parsedArgs.skip_failures,
436
+ parallel: parsedArgs.parallel,
437
+ parallelism: parsedArgs.parallelism
438
+ });
439
+ helpers.selectStep(parsedArgs.id);
440
+ const message = `Set forloop '${parsedArgs.id}' options`;
441
+ toolCallbacks.setToolStatus(toolId, {
442
+ content: message
443
+ });
444
+ return `${message}: ${JSON.stringify(parsedArgs)}`;
445
+ }
446
+ },
447
+ {
448
+ def: {
449
+ ...setModuleControlOptionsToolDef,
450
+ function: { ...setModuleControlOptionsToolDef.function, strict: false }
451
+ },
452
+ fn: async ({ args, helpers, toolId, toolCallbacks }) => {
453
+ const parsedArgs = setModuleControlOptionsSchema.parse(args);
454
+ await helpers.setModuleControlOptions(parsedArgs.id, {
455
+ stop_after_if: parsedArgs.stop_after_if,
456
+ stop_after_if_expr: parsedArgs.stop_after_if_expr,
457
+ skip_if: parsedArgs.skip_if,
458
+ skip_if_expr: parsedArgs.skip_if_expr
459
+ });
460
+ helpers.selectStep(parsedArgs.id);
461
+ // Emit UI intent to show early-stop tab when stop_after_if is configured
462
+ const modules = helpers.getModules();
463
+ const module = findModuleById(modules, parsedArgs.id);
464
+ if (!module) {
465
+ throw new Error(`Module with id '${parsedArgs.id}' not found in flow.`);
466
+ }
467
+ const moduleType = module?.value.type;
468
+ const hasSpecificComponents = ['forloopflow', 'whileloopflow', 'branchall', 'branchone'];
469
+ const prefix = hasSpecificComponents.includes(moduleType) ? `${moduleType}` : 'flow';
470
+ if (typeof parsedArgs.stop_after_if === 'boolean') {
471
+ emitUiIntent({
472
+ kind: 'open_module_tab',
473
+ componentId: `${prefix}-${parsedArgs.id}`,
474
+ tab: 'early-stop'
475
+ });
476
+ }
477
+ if (typeof parsedArgs.skip_if === 'boolean') {
478
+ emitUiIntent({
479
+ kind: 'open_module_tab',
480
+ componentId: `${prefix}-${parsedArgs.id}`,
481
+ tab: 'skip'
482
+ });
483
+ }
484
+ const message = `Set module '${parsedArgs.id}' control options`;
485
+ toolCallbacks.setToolStatus(toolId, {
486
+ content: message
487
+ });
488
+ return `${message}: ${JSON.stringify(parsedArgs)}`;
489
+ }
490
+ },
381
491
  {
382
492
  def: resourceTypeToolDef,
383
493
  fn: async ({ args, toolId, workspace, toolCallbacks }) => {
@@ -532,8 +642,8 @@ export const flowTools = [
532
642
  showDetails: true
533
643
  }
534
644
  ];
535
- export function prepareFlowSystemMessage() {
536
- const content = `You are a helpful assistant that creates and edits workflows on the Windmill platform. You're provided with a bunch of tools to help you edit the flow.
645
+ export function prepareFlowSystemMessage(customPrompt) {
646
+ let content = `You are a helpful assistant that creates and edits workflows on the Windmill platform. You're provided with a bunch of tools to help you edit the flow.
537
647
  Follow the user instructions carefully.
538
648
  Go step by step, and explain what you're doing as you're doing it.
539
649
  DO NOT wait for user confirmation before performing an action. Only do it if the user explicitly asks you to wait in their initial instructions.
@@ -584,10 +694,17 @@ When creating new steps, follow this process for EACH step:
584
694
 
585
695
  ### Special Step Types
586
696
  For special step types, follow these additional steps:
587
- - For forloop steps: Set the iterator expression using set_forloop_iterator_expression
697
+ - For forloop steps:
698
+ - Set the iterator expression using set_forloop_iterator_expression
699
+ - Set advanced options (parallel, parallelism, skip_failures) using set_forloop_options
588
700
  - For branchone steps: Set the predicates for each branch using set_branch_predicate
589
701
  - For branchall steps: No additional setup needed
590
702
 
703
+ ### Module Control Options
704
+ For any module type, you can set control flow options using set_module_control_options:
705
+ - **stop_after_if**: Early stop condition - stops the module if expression evaluates to true. Can use "flow_input" or "result". "result" is the result of the step. "results.<step_id>" is not supported, do not use it. Example: "flow_input.x > 10" or "result === "failure""
706
+ - **skip_if**: Skip condition - skips the module entirely if expression evaluates to true. Can use "flow_input" or "results.<step_id>". Example: "flow_input.x > 10" or "results.a === "failure""
707
+
591
708
  ### Step Insertion Rules
592
709
  When adding steps, carefully consider the execution order:
593
710
  1. Steps are executed in the order they appear in the flow definition, not in the order they were added
@@ -608,6 +725,7 @@ When adding steps, carefully consider the execution order:
608
725
  ### JavaScript Expressions
609
726
  For step inputs, forloop iterator expressions and branch predicates, use JavaScript expressions with these variables:
610
727
  - Step results: results.stepid or results.stepid.property_name
728
+ - Break condition (stop_after_if) in for loops: result (contains the result of the last iteration)
611
729
  - Loop iterator: flow_input.iter.value (inside loops)
612
730
  - Flow inputs: flow_input.property_name
613
731
  - Static values: Use JavaScript syntax (e.g., "hello", true, 3)
@@ -616,6 +734,12 @@ Note: These variables are only accessible in step inputs, forloop iterator expre
616
734
 
617
735
  For truly static values in step inputs (those not linked to previous steps or loop iterations), prefer using flow inputs by default unless explicitly specified otherwise. This makes the flow more configurable and reusable. For example, instead of hardcoding an email address in a step input, create a flow input for it.
618
736
 
737
+ ### For Loop Advanced Options
738
+ When configuring for-loop steps, consider these options:
739
+ - **parallel: true** - Run iterations in parallel for independent operations (significantly faster for I/O bound tasks)
740
+ - **parallelism: N** - Limit concurrent iterations (only applies when parallel=true). Use to prevent overwhelming external APIs
741
+ - **skip_failures: true** - Continue processing remaining iterations even if some fail. Failed iterations return error objects as results
742
+
619
743
  ### Special Modules
620
744
  - Preprocessor: Runs before the first step when triggered externally
621
745
  - ID: 'preprocessor'
@@ -644,12 +768,16 @@ On Windmill, credentials and configuration are stored in resources. Resource typ
644
768
  If the user needs a resource as flow input, you should set the property type in the schema to "object" as well as add a key called "format" and set it to "resource-nameofresourcetype" (e.g. "resource-stripe").
645
769
  If the user wants a specific resource as step input, you should set the step value to a static string in the following format: "$res:path/to/resource".
646
770
  `;
771
+ // If there's a custom prompt, append it to the system prompt
772
+ if (customPrompt?.trim()) {
773
+ content = `${content}\n\nUSER GIVEN INSTRUCTIONS:\n${customPrompt.trim()}`;
774
+ }
647
775
  return {
648
776
  role: 'system',
649
777
  content
650
778
  };
651
779
  }
652
- export function prepareFlowUserMessage(instructions, flowAndSelectedId, selectedContext) {
780
+ export function prepareFlowUserMessage(instructions, flowAndSelectedId, selectedContext = []) {
653
781
  const flow = flowAndSelectedId?.flow;
654
782
  const selectedId = flowAndSelectedId?.selectedId;
655
783
  // Handle context elements
@@ -662,7 +790,7 @@ ${instructions}`;
662
790
  content: userMessage
663
791
  };
664
792
  }
665
- const codePieces = selectedContext?.filter((c) => c.type === 'code_piece') ?? [];
793
+ const codePieces = selectedContext.filter((c) => c.type === 'flow_module_code_piece');
666
794
  const flowModulesYaml = applyCodePiecesToFlowModules(codePieces, flow.value.modules);
667
795
  let flowContent = `## FLOW:
668
796
  flow_input schema:
@@ -0,0 +1,8 @@
1
+ import { type Writable } from 'svelte/store';
2
+ export type UiIntent = {
3
+ kind: 'open_module_tab';
4
+ componentId: string;
5
+ tab: string;
6
+ };
7
+ export declare const uiIntentStore: Writable<UiIntent | null>;
8
+ export declare function emitUiIntent(intent: UiIntent): void;
@@ -0,0 +1,5 @@
1
+ import { writable } from 'svelte/store';
2
+ export const uiIntentStore = writable(null);
3
+ export function emitUiIntent(intent) {
4
+ uiIntentStore.set(intent);
5
+ }
@@ -0,0 +1,5 @@
1
+ type Handlers = {
2
+ openTab?: (tab: string) => void;
3
+ };
4
+ export declare function useUiIntent(componentId: string, handlers: Handlers): void;
5
+ export {};
@@ -0,0 +1,12 @@
1
+ import { uiIntentStore } from './uiIntents';
2
+ import { onDestroy } from 'svelte';
3
+ export function useUiIntent(componentId, handlers) {
4
+ const unsub = uiIntentStore.subscribe((intent) => {
5
+ if (!intent || intent.componentId !== componentId)
6
+ return;
7
+ if (intent.kind === 'open_module_tab')
8
+ handlers.openTab?.(intent.tab);
9
+ uiIntentStore.set(null);
10
+ });
11
+ onDestroy(() => unsub());
12
+ }
@@ -5,6 +5,11 @@ type ExcludeVariant<T, K extends keyof T, V> = T extends Record<K, V> ? never :
5
5
  type VisualChangeWithDiffIndex = ExcludeVariant<VisualChange, 'type', 'added_inline'> & {
6
6
  diffIndex: number;
7
7
  };
8
+ export interface ReviewChangesOpts {
9
+ applyAll?: boolean;
10
+ mode?: 'apply' | 'revert';
11
+ onFinishedReview?: () => void;
12
+ }
8
13
  export declare class AIChatEditorHandler {
9
14
  editor: meditor.IStandaloneCodeEditor;
10
15
  viewZoneIds: string[];
@@ -15,18 +20,32 @@ export declare class AIChatEditorHandler {
15
20
  changes: VisualChangeWithDiffIndex[];
16
21
  groupIndex: number;
17
22
  }[];
23
+ private reviewState;
18
24
  constructor(editor: meditor.IStandaloneCodeEditor);
19
25
  clear(): void;
20
26
  preventWriting(): void;
21
27
  allowWriting(): void;
22
- finish(): Promise<void>;
23
- acceptAll(): Promise<void>;
24
- rejectAll(): Promise<void>;
28
+ finish(opts?: {
29
+ disableReviewCallback?: boolean;
30
+ }): Promise<void>;
31
+ getReviewMode(): 'apply' | 'revert' | null;
32
+ acceptAll(opts?: {
33
+ disableReviewCallback?: boolean;
34
+ }): Promise<void>;
35
+ rejectAll(opts?: {
36
+ disableReviewCallback?: boolean;
37
+ }): Promise<void>;
38
+ keepAll(opts?: {
39
+ disableReviewCallback?: boolean;
40
+ }): Promise<void>;
41
+ revertAll(opts?: {
42
+ disableReviewCallback?: boolean;
43
+ }): Promise<void>;
25
44
  applyGroup(group: {
26
45
  changes: VisualChangeWithDiffIndex[];
27
46
  groupIndex: number;
28
47
  }): void;
29
48
  private calculateVisualChanges;
30
- reviewAndApply(newCode: string, applyAll?: boolean): Promise<void>;
49
+ reviewChanges(targetCode: string, opts?: ReviewChangesOpts): Promise<void>;
31
50
  }
32
51
  export {};
@@ -10,6 +10,8 @@ export class AIChatEditorHandler {
10
10
  readOnlyDisposable = undefined;
11
11
  reviewingChanges = writable(false);
12
12
  groupChanges = [];
13
+ // Track review decisions
14
+ reviewState = null;
13
15
  constructor(editor) {
14
16
  this.editor = editor;
15
17
  }
@@ -48,7 +50,14 @@ export class AIChatEditorHandler {
48
50
  this.readOnlyDisposable.dispose();
49
51
  }
50
52
  }
51
- async finish() {
53
+ async finish(opts) {
54
+ // expose mode getter relies on reviewState
55
+ // Call completion callback if we're tracking review state
56
+ if (this.reviewState?.onFinishedReview && !opts?.disableReviewCallback) {
57
+ this.reviewState.onFinishedReview();
58
+ }
59
+ // Reset review state
60
+ this.reviewState = null;
52
61
  this.clear();
53
62
  this.allowWriting();
54
63
  this.reviewingChanges.set(false);
@@ -56,15 +65,26 @@ export class AIChatEditorHandler {
56
65
  scrollBeyondLastLine: false
57
66
  });
58
67
  }
59
- async acceptAll() {
68
+ getReviewMode() {
69
+ return this.reviewState?.mode ?? null;
70
+ }
71
+ async acceptAll(opts) {
60
72
  this.groupChanges.reverse();
61
73
  for (const group of this.groupChanges) {
62
74
  this.applyGroup(group);
63
75
  }
64
- this.finish();
76
+ this.finish(opts);
77
+ }
78
+ async rejectAll(opts) {
79
+ this.finish(opts);
80
+ }
81
+ // Keep all changes, used in revert mode
82
+ async keepAll(opts) {
83
+ this.finish(opts);
65
84
  }
66
- async rejectAll() {
67
- this.finish();
85
+ // Revert all changes, used in revert mode
86
+ async revertAll(opts) {
87
+ this.acceptAll(opts);
68
88
  }
69
89
  applyGroup(group) {
70
90
  // maximum of 2 changes per group with the deletion first
@@ -147,23 +167,30 @@ export class AIChatEditorHandler {
147
167
  }
148
168
  return changedLines;
149
169
  }
150
- async reviewAndApply(newCode, applyAll = false) {
151
- if (aiChatManager.pendingNewCode === newCode) {
170
+ async reviewChanges(targetCode, opts) {
171
+ if (aiChatManager.pendingNewCode === targetCode && opts?.mode === 'apply') {
152
172
  this.acceptAll();
153
173
  return;
154
174
  }
155
175
  else if (aiChatManager.pendingNewCode) {
156
176
  this.clear();
157
177
  }
158
- aiChatManager.pendingNewCode = newCode;
159
- const changedLines = await this.calculateVisualChanges(newCode);
178
+ aiChatManager.pendingNewCode = targetCode;
179
+ const changedLines = await this.calculateVisualChanges(targetCode);
160
180
  if (changedLines.length === 0)
161
181
  return;
182
+ // Initialize review state for tracking
183
+ this.reviewState = {
184
+ mode: opts?.mode ?? 'apply',
185
+ onFinishedReview: opts?.onFinishedReview
186
+ };
162
187
  let indicesOfRejectedLineChanges = [];
163
188
  for (const [groupIndex, group] of this.groupChanges.entries()) {
164
189
  let collection = undefined;
165
190
  let ids = [];
166
- const acceptFn = () => {
191
+ const isRevert = opts?.mode === 'revert';
192
+ // Apply this group and continue with remaining changes
193
+ const onApply = () => {
167
194
  this.applyGroup(group);
168
195
  this.clear();
169
196
  let newCodeWithRejects = '';
@@ -178,9 +205,11 @@ export class AIChatEditorHandler {
178
205
  newCodeWithRejects += change.value;
179
206
  }
180
207
  }
181
- this.reviewAndApply(newCodeWithRejects);
208
+ this.reviewChanges(newCodeWithRejects, opts);
182
209
  };
183
- const rejectFn = () => {
210
+ // Discard this group and continue with remaining changes
211
+ const onDiscard = () => {
212
+ // This group was not applied (not reverted in revert mode)
184
213
  indicesOfRejectedLineChanges.push(...group.changes.map((c) => c.diffIndex));
185
214
  collection?.clear();
186
215
  this.editor.changeViewZones((acc) => {
@@ -193,25 +222,35 @@ export class AIChatEditorHandler {
193
222
  this.finish();
194
223
  }
195
224
  };
225
+ // In revert mode: Accept = keep current code, Reject = revert to targetCode
226
+ // In apply mode: Accept = apply changes, Reject = discard changes
227
+ const acceptFn = isRevert ? onDiscard : onApply;
228
+ const rejectFn = isRevert ? onApply : onDiscard;
196
229
  const changes = group.changes.map((c, i) => {
197
230
  if (i === group.changes.length - 1) {
198
231
  return {
199
232
  ...c,
200
- options: { ...(c.options ?? {}), review: { acceptFn, rejectFn } }
233
+ options: {
234
+ ...(c.options ?? {}),
235
+ review: {
236
+ acceptFn,
237
+ rejectFn
238
+ }
239
+ }
201
240
  };
202
241
  }
203
242
  else {
204
243
  return c;
205
244
  }
206
245
  });
207
- if (!applyAll) {
246
+ if (!opts?.applyAll) {
208
247
  ;
209
- ({ collection, ids } = await displayVisualChanges('editor-windmill-chat-style', this.editor, changes));
248
+ ({ collection, ids } = await displayVisualChanges('editor-windmill-chat-style', this.editor, changes, isRevert));
210
249
  this.decorationsCollections.push(collection);
211
250
  this.viewZoneIds.push(...ids);
212
251
  }
213
252
  }
214
- if (applyAll) {
253
+ if (opts?.applyAll) {
215
254
  this.acceptAll();
216
255
  }
217
256
  }
@@ -3,5 +3,5 @@ import type { Tool } from '../shared';
3
3
  export declare const CHAT_SYSTEM_PROMPT = "\nYou are Windmill's intelligent assistant, designed to help users navigate the application and answer questions about its functionality. It is your only purpose to help the user in the context of the windmill application.\nWindmill is an open-source developer platform for building internal tools, API integrations, background jobs, workflows, and user interfaces. It offers a unified system where scripts are automatically turned into sharable UIs and can be composed into flows or embedded in custom applications.\n\nYou have access to these tools:\n1. View current buttons and inputs on the page (get_triggerable_components)\n2. Execute buttons and inputs (trigger_component) \n3. Get documentation for user requests (get_documentation)\n4. Change the AI mode to the one specified (change_mode)\n\nINSTRUCTIONS:\n- When users ask about application features or concepts, first use get_documentation internally to retrieve accurate information about how to fulfill the user's request.\n- Then immediately use the available tools to guide the user through the application. Do not wait for the user's confirmation before taking action.\n- If you detect a confirmation modal that needs user confirmation, stop the navigation and let the user know that the action is pending confirmation.\n- Use get_triggerable_components to understand available options, and then trigger the components using trigger_component. Then wait a moment before rescanning the current page, and then continue with the next step. Do this 5 times max.\n- Make sure you navigated as far as possible before responding to the user. Always use get_triggerable_components one last time to make sure you didn't miss anything.\n- If you are not able to fulfill the user's request after 5 attempts, redirect the user to the documentation.\n- If you are asked to fill a form or act on an input, input the existing json object and change the fields the user asked you to change. Take into account the prompt_for_ai field of the schema to know what and how to do changes. Then tell the user that you have updated the form, and ask him to review the changes before running the script or flow.\n- For form inputs where format starts with \"resource-\" and is not \"resource-obj\", fetch the available resources using get_available_resources, and then use the resource_path prefixed with \"$res:\" to fill the input.\n- If you are not sure about an input, set the ones you are sure about, and then ask the user for the value of the input you are not sure about.\n- If the user asks you to make an API call, switch to API mode with the change_mode tool before using the new tools you'll have access to to make the API call.\n\nGENERAL PRINCIPLES:\n- Be concise but thorough\n- Focus on taking action and completing the user's goals\n- Maintain a friendly, professional tone\n- If you encounter an error or can't complete a request, explain why and suggest alternatives\n- When asked about a specific script, flow or app, first check components directly related to the mentioned entity, before checking the other components.\n- When you do not find what you are looking for on the current page, go to the home page by looking for the \"Home\" component, then scan the components again.\n\nIMPORTANT CONSIDERATIONS:\n- The user might have changed the page in the middle of the conversation, so make sure you rescan the page on each user request instead of just responding that you cannot find what the user is asking for.\n- If you navigate to a script creation page, consider this:\n - The page opens with the settings drawer open. After doing the changes mentioned by the user, close the settings drawer.\n - Then if the user has described what he wanted the script to do, switch to script mode with the change_mode tool, and use the new tools you'll have access to to edit the script.\n- If you navigate to a flow creation page, consider this:\n - If the user has described what he wanted the flow to do, switch to flow mode with the change_mode tool before using the new tools you'll have access to to edit the flow.\n\nAlways use the provided tools purposefully and appropriately to achieve the user's goals.\nYour actions only allow you to navigate the application through the provided tools.\nWhen you complete the user's request, do not say \"I created...\" or \"I updated...\" or \"I deleted...\", but rather complete your response with precisions about how it works based on the documentation. Also drop a link to the relevant documentation if possible.\n\nExample of good behavior:\n- User: \"How can I set my AI providers?\"\n- You: <call get_documentation and fetch relevant documentation>\n- You: <call get_triggerable_components to find relevant components>\n- You: <trigger the components>\n- You: \"<precisions about the request based on the documentation>\"\n";
4
4
  export declare const getDocumentationTool: Tool<{}>;
5
5
  export declare const navigatorTools: Tool<{}>[];
6
- export declare function prepareNavigatorSystemMessage(): ChatCompletionSystemMessageParam;
6
+ export declare function prepareNavigatorSystemMessage(customPrompt?: string): ChatCompletionSystemMessageParam;
7
7
  export declare function prepareNavigatorUserMessage(instructions: string): ChatCompletionUserMessageParam;
@@ -319,10 +319,15 @@ export const navigatorTools = [
319
319
  getCurrentPageNameTool,
320
320
  getAvailableResourcesTool
321
321
  ];
322
- export function prepareNavigatorSystemMessage() {
322
+ export function prepareNavigatorSystemMessage(customPrompt) {
323
+ let content = CHAT_SYSTEM_PROMPT;
324
+ // If there's a custom prompt, append it to the system prompt
325
+ if (customPrompt?.trim()) {
326
+ content = `${content}\n\nUSER GIVEN INSTRUCTIONS:\n${customPrompt.trim()}`;
327
+ }
323
328
  return {
324
329
  role: 'system',
325
- content: CHAT_SYSTEM_PROMPT
330
+ content
326
331
  };
327
332
  }
328
333
  export function prepareNavigatorUserMessage(instructions) {