windmill-components 1.677.1 → 1.687.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 (354) hide show
  1. package/package/components/AppConnectInner.svelte +6 -0
  2. package/package/components/CiTestResults.svelte +64 -0
  3. package/package/components/CiTestResults.svelte.d.ts +7 -0
  4. package/package/components/CompareWorkspaces.svelte +626 -418
  5. package/package/components/DBManager.svelte +35 -4
  6. package/package/components/DBManager.svelte.d.ts +2 -0
  7. package/package/components/DBManagerContent.svelte +3 -1
  8. package/package/components/DBManagerContent.svelte.d.ts +3 -0
  9. package/package/components/DBManagerDrawer.svelte +145 -3
  10. package/package/components/DBTableEditor.svelte +14 -4
  11. package/package/components/DatatablePicker.svelte +2 -5
  12. package/package/components/DatatableSchemaDiff.svelte +531 -0
  13. package/package/components/DatatableSchemaDiff.svelte.d.ts +29 -0
  14. package/package/components/DedicatedWorkersSelector.svelte +4 -2
  15. package/package/components/DefaultTagsInner.svelte +42 -2
  16. package/package/components/DeployWorkspaceDrawer.svelte +1 -1
  17. package/package/components/Dev.svelte +20 -3
  18. package/package/components/Editor.svelte +1 -1
  19. package/package/components/EditorBar.svelte +1 -1
  20. package/package/components/EditorBar.svelte.d.ts +1 -1
  21. package/package/components/FlowStatusViewerInner.svelte +269 -220
  22. package/package/components/FlowTimeline.svelte +1 -1
  23. package/package/components/FolderEditor.svelte +189 -4
  24. package/package/components/ForkWorkspaceBanner.svelte +82 -11
  25. package/package/components/GlobalUserOffboardingModal.svelte +293 -0
  26. package/package/components/GlobalUserOffboardingModal.svelte.d.ts +10 -0
  27. package/package/components/InstanceSettings.svelte +22 -3
  28. package/package/components/Login.svelte +22 -10
  29. package/package/components/ModuleTest.svelte +2 -1
  30. package/package/components/NoMainFuncBadge.svelte +1 -1
  31. package/package/components/OffboardItemsBox.svelte +56 -0
  32. package/package/components/OffboardItemsBox.svelte.d.ts +12 -0
  33. package/package/components/OffboardReassignControls.svelte +47 -0
  34. package/package/components/OffboardReassignControls.svelte.d.ts +20 -0
  35. package/package/components/OffboardWorkspaceSection.svelte +110 -0
  36. package/package/components/OffboardWorkspaceSection.svelte.d.ts +24 -0
  37. package/package/components/OnBehalfOfSelector.svelte +21 -3
  38. package/package/components/OnBehalfOfSelector.svelte.d.ts +7 -0
  39. package/package/components/QueueAlerts.svelte +10 -10
  40. package/package/components/ResourcePicker.svelte +2 -2
  41. package/package/components/ScriptBuilder.svelte +52 -11
  42. package/package/components/ScriptEditor.svelte +1 -3
  43. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  44. package/package/components/ShareModal.svelte +236 -98
  45. package/package/components/SuperadminSettingsInner.svelte +362 -315
  46. package/package/components/UserOffboardingModal.svelte +238 -0
  47. package/package/components/UserOffboardingModal.svelte.d.ts +10 -0
  48. package/package/components/WorkspaceDeployLayout.svelte +3 -3
  49. package/package/components/WorkspaceDeployLayout.svelte.d.ts +1 -0
  50. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +4 -2
  51. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +12 -0
  52. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  53. package/package/components/common/confirmationModal/ConfirmationModal.svelte +1 -1
  54. package/package/components/common/table/AppRow.svelte +3 -3
  55. package/package/components/common/table/FlowRow.svelte +3 -3
  56. package/package/components/common/table/RawAppRow.svelte +4 -4
  57. package/package/components/common/table/Row.svelte +6 -2
  58. package/package/components/common/table/ScriptRow.svelte +11 -3
  59. package/package/components/copilot/chat/AIChatManager.svelte.js +2 -2
  60. package/package/components/copilot/chat/anthropic.d.ts +7 -1
  61. package/package/components/copilot/chat/anthropic.js +5 -2
  62. package/package/components/copilot/chat/app/core.js +129 -1
  63. package/package/components/copilot/chat/app/core.test.js +192 -0
  64. package/package/components/copilot/chat/chatLoop.d.ts +3 -0
  65. package/package/components/copilot/chat/chatLoop.js +13 -5
  66. package/package/components/copilot/chat/flow/FlowAIChat.svelte +55 -76
  67. package/package/components/copilot/chat/flow/core.d.ts +13 -3
  68. package/package/components/copilot/chat/flow/core.js +467 -116
  69. package/package/components/copilot/chat/flow/helperUtils.d.ts +19 -0
  70. package/package/components/copilot/chat/flow/helperUtils.js +68 -0
  71. package/package/components/copilot/chat/flow/helperUtils.test.js +116 -0
  72. package/package/components/copilot/chat/flow/inlineScriptsUtils.d.ts +5 -24
  73. package/package/components/copilot/chat/flow/inlineScriptsUtils.js +30 -55
  74. package/package/components/copilot/chat/flow/utils.test.js +59 -0
  75. package/package/components/copilot/chat/openai-responses.d.ts +7 -1
  76. package/package/components/copilot/chat/openai-responses.js +5 -2
  77. package/package/components/copilot/chat/shared.d.ts +1 -2
  78. package/package/components/copilot/chat/shared.js +94 -52
  79. package/package/components/copilot/chat/tokenUsage.d.ts +23 -0
  80. package/package/components/copilot/chat/tokenUsage.js +42 -0
  81. package/package/components/copilot/lib.d.ts +5 -1
  82. package/package/components/copilot/lib.js +21 -5
  83. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte +337 -0
  84. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte.d.ts +15 -0
  85. package/package/components/details/CopyableCodeBlock.svelte +18 -8
  86. package/package/components/details/CopyableCodeBlock.svelte.d.ts +1 -0
  87. package/package/components/flows/FlowAssetsHandler.svelte +19 -21
  88. package/package/components/flows/agentToolTree.d.ts +17 -0
  89. package/package/components/flows/agentToolTree.js +114 -0
  90. package/package/components/flows/agentToolTree.test.d.ts +1 -0
  91. package/package/components/flows/agentToolTree.test.js +86 -0
  92. package/package/components/flows/agentToolUtils.d.ts +0 -5
  93. package/package/components/flows/agentToolUtils.js +0 -49
  94. package/package/components/flows/content/FlowLoop.svelte +7 -4
  95. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +15 -7
  96. package/package/components/flows/content/FlowSettings.svelte +29 -0
  97. package/package/components/flows/dfs.d.ts +6 -2
  98. package/package/components/flows/dfs.js +19 -11
  99. package/package/components/flows/flowDeleteController.d.ts +32 -0
  100. package/package/components/flows/flowDeleteController.js +54 -0
  101. package/package/components/flows/flowDeleteController.test.d.ts +1 -0
  102. package/package/components/flows/flowDeleteController.test.js +121 -0
  103. package/package/components/flows/flowDeleteUtils.d.ts +48 -0
  104. package/package/components/flows/flowDeleteUtils.js +150 -0
  105. package/package/components/flows/flowDeleteUtils.test.d.ts +1 -0
  106. package/package/components/flows/flowDeleteUtils.test.js +131 -0
  107. package/package/components/flows/flowDiff.d.ts +2 -47
  108. package/package/components/flows/flowDiff.js +16 -293
  109. package/package/components/flows/flowDiff.testUtils.d.ts +8 -0
  110. package/package/components/flows/flowDiff.testUtils.js +26 -0
  111. package/package/components/flows/flowDiffManager.svelte.js +20 -75
  112. package/package/components/flows/flowDiffManager.svelte.test.js +103 -2
  113. package/package/components/flows/flowExplorer.d.ts +4 -0
  114. package/package/components/flows/flowExplorer.js +7 -30
  115. package/package/components/flows/flowState.d.ts +1 -0
  116. package/package/components/flows/flowStateUtils.svelte.js +6 -1
  117. package/package/components/flows/flowTree.d.ts +91 -0
  118. package/package/components/flows/flowTree.js +326 -0
  119. package/package/components/flows/flowTree.test.d.ts +1 -0
  120. package/package/components/flows/flowTree.test.js +236 -0
  121. package/package/components/flows/map/FlowJobsMenu.svelte +36 -30
  122. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
  123. package/package/components/flows/map/FlowModuleSchemaMap.svelte +70 -227
  124. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +0 -2
  125. package/package/components/flows/pickers/PickHubScriptQuick.svelte +2 -2
  126. package/package/components/flows/previousResults.js +13 -41
  127. package/package/components/flows/previousResults.test.d.ts +1 -0
  128. package/package/components/flows/previousResults.test.js +65 -0
  129. package/package/components/flows/propPicker/OutputPicker.svelte +2 -1
  130. package/package/components/flows/propPicker/OutputPickerInner.svelte +41 -4
  131. package/package/components/flows/propPicker/StepHistory.svelte +9 -1
  132. package/package/components/git_sync/GitSyncContext.svelte.js +11 -5
  133. package/package/components/git_sync/GitSyncRepositoryCard.svelte +2 -29
  134. package/package/components/git_sync/PullWorkspaceModal.svelte +6 -7
  135. package/package/components/graph/FlowGraphV2.svelte +2 -2
  136. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  137. package/package/components/graph/groupedModulesProxy.svelte.d.ts +10 -0
  138. package/package/components/graph/groupedModulesProxy.svelte.js +17 -1
  139. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +5 -2
  140. package/package/components/home/HomeConnectDrawer.svelte +125 -0
  141. package/package/components/home/HomeConnectDrawer.svelte.d.ts +5 -0
  142. package/package/components/icons/GithubIcon.svelte +4 -4
  143. package/package/components/icons/GithubIcon.svelte.d.ts +5 -2
  144. package/package/components/instanceSettings/ExternalJwtTokens.svelte +85 -0
  145. package/package/components/instanceSettings/ExternalJwtTokens.svelte.d.ts +12 -0
  146. package/package/components/instanceSettings/GhesAppSettings.svelte +17 -0
  147. package/package/components/instanceSettings/IndexerMemorySettings.svelte +56 -29
  148. package/package/components/instanceSettings/SecretBackendConfig.svelte +9 -2
  149. package/package/components/instanceSettings.d.ts +1 -0
  150. package/package/components/instanceSettings.js +42 -8
  151. package/package/components/offboarding-utils.d.ts +11 -0
  152. package/package/components/offboarding-utils.js +100 -0
  153. package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -1
  154. package/package/components/raw_apps/RawAppEditor.svelte +27 -0
  155. package/package/components/raw_apps/RawAppEditorHeader.svelte +6 -1
  156. package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +1 -0
  157. package/package/components/raw_apps/RawAppYamlEditor.svelte +81 -0
  158. package/package/components/raw_apps/RawAppYamlEditor.svelte.d.ts +20 -0
  159. package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
  160. package/package/components/runs/runsFilter.d.ts +1 -1
  161. package/package/components/script_builder.d.ts +1 -1
  162. package/package/components/select/Select.svelte +2 -1
  163. package/package/components/select/Select.svelte.d.ts +1 -0
  164. package/package/components/settings/CreateToken.svelte +113 -64
  165. package/package/components/settings/CreateToken.svelte.d.ts +3 -0
  166. package/package/components/settings/WorkspaceUserSettings.svelte +34 -28
  167. package/package/components/sidebar/SidebarContent.svelte +58 -2
  168. package/package/components/sidebar/WorkspaceMenu.svelte +8 -4
  169. package/package/components/triggers/AddTriggersButton.svelte +11 -0
  170. package/package/components/triggers/PermissionedAsLine.svelte +37 -3
  171. package/package/components/triggers/PermissionedAsLine.svelte.d.ts +6 -0
  172. package/package/components/triggers/TriggersEditor.svelte +5 -1
  173. package/package/components/triggers/TriggersWrapper.svelte +10 -0
  174. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +13 -11
  175. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +13 -11
  176. package/package/components/triggers/http/RouteEditorConfigSection.svelte +15 -7
  177. package/package/components/triggers/http/RouteEditorInner.svelte +14 -14
  178. package/package/components/triggers/http/RoutesGenerator.svelte +6 -1
  179. package/package/components/triggers/http/RoutesPanel.svelte +1 -1
  180. package/package/components/triggers/http/utils.d.ts +1 -1
  181. package/package/components/triggers/http/utils.js +2 -2
  182. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +13 -11
  183. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +13 -11
  184. package/package/components/triggers/native/NativeTriggerEditor.svelte +3 -0
  185. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte +118 -0
  186. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte.d.ts +17 -0
  187. package/package/components/triggers/native/utils.js +14 -0
  188. package/package/components/triggers/nats/NatsTriggerEditor.svelte.d.ts +4 -3
  189. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +13 -11
  190. package/package/components/triggers/postgres/PostgresTriggerEditor.svelte.d.ts +4 -3
  191. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +13 -11
  192. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +13 -11
  193. package/package/components/triggers/sqs/SqsTriggerEditor.svelte.d.ts +4 -3
  194. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +13 -11
  195. package/package/components/triggers/triggers.svelte.js +1 -0
  196. package/package/components/triggers/utils.js +27 -6
  197. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +13 -11
  198. package/package/components/triggers.d.ts +1 -1
  199. package/package/components/useFolderDefaultPermissionedAs.svelte.d.ts +13 -0
  200. package/package/components/useFolderDefaultPermissionedAs.svelte.js +63 -0
  201. package/package/components/workspaceSettings/CreateWorkspace.svelte +16 -677
  202. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte +604 -0
  203. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte.d.ts +7 -0
  204. package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +27 -25
  205. package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +46 -8
  206. package/package/components/workspaceSettings/DataTableSettings.svelte +27 -22
  207. package/package/components/workspaceSettings/DucklakeSettings.svelte +1 -1
  208. package/package/components/workspaceSettings/ForkDatatableSection.svelte +228 -0
  209. package/package/components/workspaceSettings/ForkDatatableSection.svelte.d.ts +28 -0
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +8 -2
  211. package/package/components/workspaceSettings/RulesetEditor.svelte +27 -2
  212. package/package/components/workspaceSettings/VolumeStorageSettings.svelte +1 -1
  213. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +17 -1
  214. package/package/consts.d.ts +3 -0
  215. package/package/consts.js +10 -0
  216. package/package/gen/core/OpenAPI.js +1 -1
  217. package/package/gen/schemas.gen.d.ts +485 -19
  218. package/package/gen/schemas.gen.js +489 -20
  219. package/package/gen/services.gen.d.ts +229 -2
  220. package/package/gen/services.gen.js +463 -1
  221. package/package/gen/types.gen.d.ts +866 -29
  222. package/package/githubApp.js +5 -1
  223. package/package/hubPaths.json +1 -4
  224. package/package/infer.js +13 -1
  225. package/package/infer.svelte.js +10 -1
  226. package/package/monaco_workers/sqlTypePlugin.worker.d.ts +10 -0
  227. package/package/monaco_workers/sqlTypePlugin.worker.js +39 -0
  228. package/package/script_helpers.d.ts +8 -2
  229. package/package/script_helpers.js +14 -0
  230. package/package/stores.d.ts +4 -0
  231. package/package/stores.js +1 -0
  232. package/package/system_prompts/prompts.d.ts +4 -3
  233. package/package/system_prompts/prompts.js +270 -20
  234. package/package/templates/ci_test_bun.ts.template +19 -0
  235. package/package/templates/ci_test_python.py.template +18 -0
  236. package/package/utils_workspace_deploy.d.ts +8 -8
  237. package/package/utils_workspace_deploy.js +86 -420
  238. package/package.json +3 -3
  239. package/package/components/copilot/chat/__tests__/app/appChat.eval.test.js +0 -153
  240. package/package/components/copilot/chat/__tests__/app/appEvalComparison.d.ts +0 -21
  241. package/package/components/copilot/chat/__tests__/app/appEvalComparison.js +0 -136
  242. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.d.ts +0 -15
  243. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.js +0 -107
  244. package/package/components/copilot/chat/__tests__/app/appEvalRunner.d.ts +0 -50
  245. package/package/components/copilot/chat/__tests__/app/appEvalRunner.js +0 -93
  246. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.d.ts +0 -29
  247. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.js +0 -134
  248. package/package/components/copilot/chat/__tests__/app/appResultsWriter.d.ts +0 -30
  249. package/package/components/copilot/chat/__tests__/app/appResultsWriter.js +0 -197
  250. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.d.ts +0 -10
  251. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.js +0 -9
  252. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/meta.json +0 -4
  253. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.d.ts +0 -6
  254. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.js +0 -5
  255. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/meta.json +0 -4
  256. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.d.ts +0 -12
  257. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.js +0 -14
  258. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/meta.json +0 -4
  259. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.d.ts +0 -8
  260. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.js +0 -25
  261. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/meta.json +0 -4
  262. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.d.ts +0 -7
  263. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.js +0 -5
  264. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/meta.json +0 -4
  265. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.d.ts +0 -8
  266. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.js +0 -5
  267. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/meta.json +0 -4
  268. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.d.ts +0 -10
  269. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.tsx +0 -26
  270. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.d.ts +0 -10
  271. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.tsx +0 -79
  272. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.d.ts +0 -10
  273. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.tsx +0 -46
  274. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.d.ts +0 -10
  275. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.tsx +0 -56
  276. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.d.ts +0 -6
  277. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.tsx +0 -59
  278. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.d.ts +0 -16
  279. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.tsx +0 -119
  280. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.d.ts +0 -15
  281. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.js +0 -14
  282. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/meta.json +0 -4
  283. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.d.ts +0 -14
  284. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.js +0 -5
  285. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/meta.json +0 -4
  286. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.d.ts +0 -6
  287. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.js +0 -41
  288. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/meta.json +0 -4
  289. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.d.ts +0 -15
  290. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.js +0 -3
  291. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/meta.json +0 -4
  292. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.d.ts +0 -9
  293. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.tsx +0 -51
  294. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.d.ts +0 -8
  295. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.tsx +0 -27
  296. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.d.ts +0 -8
  297. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.tsx +0 -18
  298. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.d.ts +0 -12
  299. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.tsx +0 -81
  300. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.d.ts +0 -3
  301. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.js +0 -3
  302. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/meta.json +0 -4
  303. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.d.ts +0 -3
  304. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.js +0 -3
  305. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/meta.json +0 -4
  306. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.d.ts +0 -2
  307. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.tsx +0 -38
  308. package/package/components/copilot/chat/__tests__/app/variants/baseline.d.ts +0 -6
  309. package/package/components/copilot/chat/__tests__/app/variants/baseline.js +0 -10
  310. package/package/components/copilot/chat/__tests__/app/variants/index.d.ts +0 -3
  311. package/package/components/copilot/chat/__tests__/app/variants/index.js +0 -3
  312. package/package/components/copilot/chat/__tests__/app/variants/streamlined.d.ts +0 -6
  313. package/package/components/copilot/chat/__tests__/app/variants/streamlined.js +0 -137
  314. package/package/components/copilot/chat/__tests__/flow/expected/test1.json +0 -134
  315. package/package/components/copilot/chat/__tests__/flow/expected/test2.json +0 -183
  316. package/package/components/copilot/chat/__tests__/flow/expected/test3.json +0 -204
  317. package/package/components/copilot/chat/__tests__/flow/expected/test4.json +0 -175
  318. package/package/components/copilot/chat/__tests__/flow/expected/test5_modify_simple.json +0 -68
  319. package/package/components/copilot/chat/__tests__/flow/expected/test6_modify_medium.json +0 -142
  320. package/package/components/copilot/chat/__tests__/flow/expected/test7_modify_complex.json +0 -136
  321. package/package/components/copilot/chat/__tests__/flow/flowChat.eval.test.js +0 -294
  322. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.d.ts +0 -17
  323. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.js +0 -49
  324. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.d.ts +0 -12
  325. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.js +0 -79
  326. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.d.ts +0 -50
  327. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.js +0 -102
  328. package/package/components/copilot/chat/__tests__/flow/initial/test5_initial.json +0 -53
  329. package/package/components/copilot/chat/__tests__/flow/initial/test6_initial.json +0 -68
  330. package/package/components/copilot/chat/__tests__/flow/initial/test7_initial.json +0 -120
  331. package/package/components/copilot/chat/__tests__/flow/variants/baseline.d.ts +0 -6
  332. package/package/components/copilot/chat/__tests__/flow/variants/baseline.js +0 -10
  333. package/package/components/copilot/chat/__tests__/flow/variants/index.d.ts +0 -3
  334. package/package/components/copilot/chat/__tests__/flow/variants/index.js +0 -3
  335. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.d.ts +0 -15
  336. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.js +0 -388
  337. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.d.ts +0 -45
  338. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.js +0 -121
  339. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.d.ts +0 -28
  340. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.js +0 -96
  341. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.d.ts +0 -32
  342. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.js +0 -130
  343. package/package/components/copilot/chat/__tests__/shared/baseVariants.d.ts +0 -45
  344. package/package/components/copilot/chat/__tests__/shared/baseVariants.js +0 -57
  345. package/package/components/copilot/chat/__tests__/shared/index.d.ts +0 -10
  346. package/package/components/copilot/chat/__tests__/shared/index.js +0 -5
  347. package/package/components/copilot/chat/__tests__/shared/types.d.ts +0 -105
  348. package/package/components/copilot/chat/__tests__/shared/types.js +0 -9
  349. package/package/components/copilot/chat/flow/utils.d.ts +0 -14
  350. package/package/components/copilot/chat/flow/utils.js +0 -108
  351. package/package/components/flows/agentToolUtils.test.js +0 -55
  352. /package/package/components/copilot/chat/{__tests__/app/appChat.eval.test.d.ts → app/core.test.d.ts} +0 -0
  353. /package/package/components/copilot/chat/{__tests__/flow/flowChat.eval.test.d.ts → flow/helperUtils.test.d.ts} +0 -0
  354. /package/package/components/{flows/agentToolUtils.test.d.ts → copilot/chat/flow/utils.test.d.ts} +0 -0
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ vi.mock('../aiProviderStorage', () => ({
3
+ loadStoredConfig: () => undefined
4
+ }));
5
+ vi.mock('./flowInfers', () => ({
6
+ AI_AGENT_SCHEMA: { properties: {} }
7
+ }));
8
+ import { collectFlowNodeIds, findAgentToolOwner, removeAgentToolOwner } from './agentToolTree';
9
+ function makeRawModule(id) {
10
+ return {
11
+ id,
12
+ summary: id,
13
+ value: { type: 'rawscript', content: '', language: 'python3', input_transforms: {} }
14
+ };
15
+ }
16
+ function makeAiAgent(id, tools) {
17
+ return {
18
+ id,
19
+ summary: id,
20
+ value: {
21
+ type: 'aiagent',
22
+ tools,
23
+ input_transforms: {}
24
+ }
25
+ };
26
+ }
27
+ function makeFlowModuleTool(module) {
28
+ return {
29
+ id: module.id,
30
+ summary: module.summary,
31
+ value: {
32
+ tool_type: 'flowmodule',
33
+ ...module.value
34
+ }
35
+ };
36
+ }
37
+ describe('findAgentToolOwner', () => {
38
+ it('finds a direct tool owner in an ai agent', () => {
39
+ const rootAgent = makeAiAgent('root_agent', [makeFlowModuleTool(makeRawModule('lookup_user'))]);
40
+ expect(findAgentToolOwner([rootAgent], 'lookup_user')).toMatchObject({
41
+ agentId: 'root_agent',
42
+ toolIndex: 0,
43
+ depth: 1
44
+ });
45
+ });
46
+ it('finds a nested tool owner inside a nested ai agent tool', () => {
47
+ const nestedAgent = makeAiAgent('support_agent', [makeFlowModuleTool(makeRawModule('create_ticket'))]);
48
+ const rootAgent = makeAiAgent('root_agent', [makeFlowModuleTool(nestedAgent)]);
49
+ expect(findAgentToolOwner([rootAgent], 'create_ticket')).toMatchObject({
50
+ agentId: 'support_agent',
51
+ toolIndex: 0,
52
+ depth: 2
53
+ });
54
+ });
55
+ });
56
+ describe('removeAgentToolOwner', () => {
57
+ it('removes the matched tool and returns its subtree ids', () => {
58
+ const nestedAgent = makeAiAgent('support_agent', [makeFlowModuleTool(makeRawModule('create_ticket'))]);
59
+ const rootAgent = makeAiAgent('root_agent', [
60
+ makeFlowModuleTool(makeRawModule('lookup_user')),
61
+ makeFlowModuleTool(nestedAgent)
62
+ ]);
63
+ const owner = findAgentToolOwner([rootAgent], 'support_agent');
64
+ expect(owner).toBeDefined();
65
+ expect(removeAgentToolOwner(owner)).toEqual({
66
+ tool: expect.objectContaining({ id: 'support_agent' }),
67
+ removedIds: ['support_agent', 'create_ticket']
68
+ });
69
+ expect(rootAgent.value.tools).toHaveLength(1);
70
+ expect(rootAgent.value.tools.map((tool) => tool.id)).toEqual(['lookup_user']);
71
+ });
72
+ });
73
+ describe('collectFlowNodeIds', () => {
74
+ it('includes ai agent tool ids when deleting an ai agent flow module', () => {
75
+ const agent = makeAiAgent('root_agent', [
76
+ makeFlowModuleTool(makeRawModule('lookup_user')),
77
+ makeFlowModuleTool(makeAiAgent('support_agent', [makeFlowModuleTool(makeRawModule('create_ticket'))]))
78
+ ]);
79
+ expect(collectFlowNodeIds(agent)).toEqual([
80
+ 'root_agent',
81
+ 'lookup_user',
82
+ 'support_agent',
83
+ 'create_ticket'
84
+ ]);
85
+ });
86
+ });
@@ -51,11 +51,6 @@ export declare function createMcpTool(id: string): McpTool;
51
51
  * Create a Websearch tool
52
52
  */
53
53
  export declare function createWebsearchTool(id: string): WebsearchTool;
54
- /**
55
- * Remove an AI agent tool by id, recursively traversing nested modules and nested AI agents.
56
- * Returns true when a matching tool was found and removed.
57
- */
58
- export declare function removeAgentToolByIdDeep(modules: FlowModule[], id: string, onRemove?: (tool: AgentTool) => void): boolean;
59
54
  /**
60
55
  * Convert a FlowModuleTool to a FlowModule for use with loadFlowModuleState etc.
61
56
  * Strips the extra `tool_type` field and maps AgentTool fields to FlowModule fields.
@@ -78,55 +78,6 @@ export function createWebsearchTool(id) {
78
78
  }
79
79
  };
80
80
  }
81
- /**
82
- * Remove an AI agent tool by id, recursively traversing nested modules and nested AI agents.
83
- * Returns true when a matching tool was found and removed.
84
- */
85
- export function removeAgentToolByIdDeep(modules, id, onRemove) {
86
- for (const module of modules) {
87
- if (module.value.type === 'forloopflow' || module.value.type === 'whileloopflow') {
88
- if (removeAgentToolByIdDeep(module.value.modules, id, onRemove)) {
89
- return true;
90
- }
91
- continue;
92
- }
93
- if (module.value.type === 'branchall') {
94
- for (const branch of module.value.branches) {
95
- if (removeAgentToolByIdDeep(branch.modules, id, onRemove)) {
96
- return true;
97
- }
98
- }
99
- continue;
100
- }
101
- if (module.value.type === 'branchone') {
102
- if (removeAgentToolByIdDeep(module.value.default, id, onRemove)) {
103
- return true;
104
- }
105
- for (const branch of module.value.branches) {
106
- if (removeAgentToolByIdDeep(branch.modules, id, onRemove)) {
107
- return true;
108
- }
109
- }
110
- continue;
111
- }
112
- if (module.value.type !== 'aiagent') {
113
- continue;
114
- }
115
- const toolIndex = module.value.tools.findIndex((tool) => tool.id === id);
116
- if (toolIndex !== -1) {
117
- const [removed] = module.value.tools.splice(toolIndex, 1);
118
- onRemove?.(removed);
119
- return true;
120
- }
121
- const nestedToolModules = module.value.tools
122
- .filter(isFlowModuleTool)
123
- .map((tool) => agentToolToFlowModule(tool));
124
- if (removeAgentToolByIdDeep(nestedToolModules, id, onRemove)) {
125
- return true;
126
- }
127
- }
128
- return false;
129
- }
130
81
  /**
131
82
  * Convert a FlowModuleTool to a FlowModule for use with loadFlowModuleState etc.
132
83
  * Strips the extra `tool_type` field and maps AgentTool fields to FlowModule fields.
@@ -198,9 +198,13 @@ let suggestion = $state(undefined);
198
198
  : ''
199
199
  },
200
200
  (value) => {
201
- ;(mod.value as ForloopFlow).parallelism = {
202
- type: 'static',
203
- value
201
+ if (value === '' || value === null || value === undefined) {
202
+ ;(mod.value as ForloopFlow).parallelism = undefined
203
+ } else {
204
+ ;(mod.value as ForloopFlow).parallelism = {
205
+ type: 'static',
206
+ value
207
+ }
204
208
  }
205
209
  }
206
210
  }
@@ -227,7 +231,6 @@ let suggestion = $state(undefined);
227
231
  }
228
232
  }
229
233
  }}
230
- class="h-6"
231
234
  >
232
235
  {#snippet children({ item })}
233
236
  <ToggleButton small label="static" value="static" {item} />
@@ -1,19 +1,22 @@
1
1
  <script lang="ts">import Toggle from '../../Toggle.svelte';
2
2
  import Tooltip from '../../Tooltip.svelte';
3
+ import { SecondsInput } from '../../common';
3
4
  import Section from '../../Section.svelte';
4
5
  let { flowModule = $bindable(), disabled = false } = $props();
6
+ let enabled = $derived(flowModule.delete_after_secs != null);
5
7
  </script>
6
8
 
7
- <Section label="Delete after use">
9
+ <Section label="Delete after completion">
8
10
  {#snippet header()}
9
11
  <Tooltip>
10
12
  The logs, arguments and results of this flow step will be completely deleted from Windmill
11
- once the flow is complete. They might be temporarily visible in UI while the flow is running.
13
+ after the specified delay once the flow is complete. They might be temporarily visible in UI
14
+ while the flow is running.
12
15
  <br />
13
16
  This also applies to a flow step that has failed: the error will not be accessible.
14
17
  <br />
15
18
  <br />
16
- The deletion is irreversible.
19
+ The deletion is irreversible. Set to 0 for immediate deletion.
17
20
  {#if disabled}
18
21
  <br />
19
22
  <br />
@@ -25,16 +28,21 @@ let { flowModule = $bindable(), disabled = false } = $props();
25
28
  <Toggle
26
29
  {disabled}
27
30
  size="sm"
28
- checked={Boolean(flowModule.delete_after_use)}
31
+ checked={enabled}
29
32
  on:change={() => {
30
- if (flowModule.delete_after_use) {
31
- flowModule.delete_after_use = undefined
33
+ if (enabled) {
34
+ flowModule.delete_after_secs = undefined
32
35
  } else {
33
- flowModule.delete_after_use = true
36
+ flowModule.delete_after_secs = 0
34
37
  }
35
38
  }}
36
39
  options={{
37
40
  right: 'Delete logs, arguments and results after the flow is complete'
38
41
  }}
39
42
  />
43
+ {#if enabled}
44
+ <div class="mt-2">
45
+ <SecondsInput bind:seconds={flowModule.delete_after_secs} {disabled} size="sm" />
46
+ </div>
47
+ {/if}
40
48
  </Section>
@@ -96,6 +96,7 @@ let numberOfAdvancedOptionsOn = $derived(activeAdvancedOptionNames.length);
96
96
  }}
97
97
  />
98
98
  </Label>
99
+ <!-- prettier-ignore -->
99
100
  <LabelsInput bind:labels={(flowStore.val as any).labels} class="-mt-4" />
100
101
 
101
102
  {#if !noEditor}
@@ -560,6 +561,34 @@ let numberOfAdvancedOptionsOn = $derived(activeAdvancedOptionNames.length);
560
561
  {/snippet}
561
562
  </Toggle>
562
563
 
564
+ <Toggle
565
+ textClass="font-medium"
566
+ size="xs"
567
+ disabled={!$enterpriseLicense}
568
+ checked={flowStore.val.value.delete_after_secs != null}
569
+ on:change={() => {
570
+ if (flowStore.val.value.delete_after_secs != null) {
571
+ flowStore.val.value.delete_after_secs = undefined
572
+ } else {
573
+ flowStore.val.value.delete_after_secs = 0
574
+ }
575
+ }}
576
+ options={{
577
+ right: 'Delete all step results after completion',
578
+ rightTooltip: `When enabled, the logs, arguments and results of all flow steps will be deleted after the specified delay once the flow completes. Set to 0 for immediate deletion. The deletion is irreversible. ${!$enterpriseLicense ? 'This is a feature only available on enterprise edition.' : ''}`
579
+ }}
580
+ eeOnly={true}
581
+ />
582
+ {#if flowStore.val.value.delete_after_secs != null}
583
+ <div class="ml-6 mt-1">
584
+ <SecondsInput
585
+ bind:seconds={flowStore.val.value.delete_after_secs}
586
+ disabled={!$enterpriseLicense}
587
+ size="sm"
588
+ />
589
+ </div>
590
+ {/if}
591
+
563
592
  <div>
564
593
  <Toggle
565
594
  textClass="font-medium"
@@ -1,4 +1,8 @@
1
1
  import type { FlowModule } from '../../gen';
2
- export declare function dfs<T>(modules: FlowModule[], f: (x: FlowModule, modules: FlowModule[], branches: FlowModule[][]) => T, opts?: {
2
+ type FlowDfsOptions = {
3
3
  skipToolNodes?: boolean;
4
- }): T[];
4
+ };
5
+ type FlowModuleVisitor<T> = (x: FlowModule, modules: FlowModule[], branches: FlowModule[][]) => T;
6
+ export declare function dfs<T>(modules: FlowModule[], f: FlowModuleVisitor<T>, opts?: FlowDfsOptions): T[];
7
+ export declare function forEachFlowModule(modules: FlowModule[], f: FlowModuleVisitor<void>, opts?: FlowDfsOptions): void;
8
+ export {};
@@ -1,31 +1,39 @@
1
- export function dfs(modules, f, opts = {}) {
2
- let result = [];
1
+ function traverseFlowModules(modules, visit, opts = {}) {
3
2
  for (const module of modules) {
4
3
  if (module.value.type == 'forloopflow' || module.value.type == 'whileloopflow') {
5
- result = result.concat(f(module, modules, [module.value.modules]));
6
- result = result.concat(dfs(module.value.modules, f, opts));
4
+ visit(module, modules, [module.value.modules]);
5
+ traverseFlowModules(module.value.modules, visit, opts);
7
6
  }
8
7
  else if (module.value.type == 'branchone') {
9
8
  const allBranches = [module.value.default, ...module.value.branches.map((b) => b.modules)];
10
- result = result.concat(f(module, modules, allBranches));
9
+ visit(module, modules, allBranches);
11
10
  for (const branch of allBranches) {
12
- result = result.concat(dfs(branch, f, opts));
11
+ traverseFlowModules(branch, visit, opts);
13
12
  }
14
13
  }
15
14
  else if (module.value.type == 'branchall') {
16
15
  const allBranches = module.value.branches.map((b) => b.modules);
17
- result = result.concat(f(module, modules, allBranches));
16
+ visit(module, modules, allBranches);
18
17
  for (const branch of allBranches) {
19
- result = result.concat(dfs(branch, f, opts));
18
+ traverseFlowModules(branch, visit, opts);
20
19
  }
21
20
  }
22
21
  else if (module.value.type == 'aiagent' && !opts.skipToolNodes) {
23
- result = result.concat(f(module, modules, [module.value.tools]));
24
- result = result.concat(dfs(module.value.tools, f, opts));
22
+ visit(module, modules, [module.value.tools]);
23
+ traverseFlowModules(module.value.tools, visit, opts);
25
24
  }
26
25
  else {
27
- result.push(f(module, modules, []));
26
+ visit(module, modules, []);
28
27
  }
29
28
  }
29
+ }
30
+ export function dfs(modules, f, opts = {}) {
31
+ let result = [];
32
+ traverseFlowModules(modules, (module, parentModules, branches) => {
33
+ result.push(f(module, parentModules, branches));
34
+ }, opts);
30
35
  return result;
31
36
  }
37
+ export function forEachFlowModule(modules, f, opts = {}) {
38
+ traverseFlowModules(modules, f, opts);
39
+ }
@@ -0,0 +1,32 @@
1
+ import type { GroupDisplayState } from '../graph/groupEditor.svelte';
2
+ import type { GroupedModulesProxy } from '../graph/groupedModulesProxy.svelte';
3
+ import type { SelectionManager } from '../graph/selectionUtils.svelte';
4
+ import type { FlowStructureNode } from '../graph/flowStructure';
5
+ import type { OpenFlow } from '../../gen';
6
+ import { type History } from '../../history.svelte';
7
+ import type { StateStore } from '../../utils';
8
+ import { type DeletePlan } from './flowDeleteUtils';
9
+ import type { FlowState } from './flowState';
10
+ export type PreparedDeleteRequest = {
11
+ plan: DeletePlan;
12
+ needsDependencyConfirmation: boolean;
13
+ };
14
+ export type DeletePlanExecutionContext = {
15
+ history?: History<OpenFlow>;
16
+ flowStore: StateStore<OpenFlow>;
17
+ flowStateStore: StateStore<FlowState>;
18
+ selectionManager: Pick<SelectionManager, 'clearSelection' | 'selectId'>;
19
+ onDelete?: (id: string) => void;
20
+ };
21
+ export type DeletePlanExecutionResult = {
22
+ removedStateIds: string[];
23
+ removedToolStateIds: string[];
24
+ };
25
+ export declare function prepareDeleteRequest(args: {
26
+ ids: string[];
27
+ flow: OpenFlow;
28
+ tree: FlowStructureNode[];
29
+ proxy: GroupedModulesProxy;
30
+ displayState: GroupDisplayState;
31
+ }): PreparedDeleteRequest | undefined;
32
+ export declare function executeDeletePlan(plan: DeletePlan, args: DeletePlanExecutionContext): DeletePlanExecutionResult;
@@ -0,0 +1,54 @@
1
+ import { push } from '../../history.svelte';
2
+ import { refreshStateStore } from '../../svelte5Utils.svelte';
3
+ import { createDeletePlan, removeDeletePlanTools } from './flowDeleteUtils';
4
+ import { deleteFlowStateById } from './flowStateUtils.svelte';
5
+ export function prepareDeleteRequest(args) {
6
+ const plan = createDeletePlan(args);
7
+ if (!plan) {
8
+ return undefined;
9
+ }
10
+ return {
11
+ plan,
12
+ needsDependencyConfirmation: Object.keys(plan.dependents).length > 0
13
+ };
14
+ }
15
+ export function executeDeletePlan(plan, args) {
16
+ push(args.history, args.flowStore.val);
17
+ const removedStructureStateIds = resolvePlannedStructureStateIds(plan.targets);
18
+ if (plan.selection.kind === 'clear') {
19
+ args.selectionManager.clearSelection();
20
+ }
21
+ else {
22
+ args.selectionManager.selectId(plan.selection.id);
23
+ }
24
+ if (plan.targets.some((target) => target.kind === 'preprocessor')) {
25
+ args.flowStore.val.value.preprocessor_module = undefined;
26
+ }
27
+ plan.structureDelete?.commit({ removeDuplicates: plan.removeDuplicates });
28
+ const removedToolStateIds = removeDeletePlanTools(plan.targets, args.flowStore.val.value.modules);
29
+ const removedStateIds = uniqueIds([...removedStructureStateIds, ...removedToolStateIds]);
30
+ for (const id of removedStateIds) {
31
+ deleteFlowStateById(id, args.flowStateStore);
32
+ }
33
+ refreshStateStore(args.flowStore);
34
+ if (plan.inputIds.length === 1) {
35
+ args.onDelete?.(plan.targets[0].id);
36
+ }
37
+ return {
38
+ removedStateIds,
39
+ removedToolStateIds
40
+ };
41
+ }
42
+ function resolvePlannedStructureStateIds(targets) {
43
+ const removedIds = [];
44
+ for (const target of targets) {
45
+ if (target.kind !== 'preprocessor' && target.kind !== 'structure_node') {
46
+ continue;
47
+ }
48
+ removedIds.push(...target.stateIds);
49
+ }
50
+ return uniqueIds(removedIds);
51
+ }
52
+ function uniqueIds(ids) {
53
+ return [...new Set(ids)];
54
+ }
@@ -0,0 +1,121 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ vi.mock('../aiProviderStorage', () => ({
3
+ loadStoredConfig: () => undefined
4
+ }));
5
+ vi.mock('./flowInfers', () => ({
6
+ AI_AGENT_SCHEMA: { properties: {} }
7
+ }));
8
+ import { GroupDisplayState } from '../graph/groupEditor.svelte';
9
+ import { GroupedModulesProxy } from '../graph/groupedModulesProxy.svelte';
10
+ import { executeDeletePlan, prepareDeleteRequest } from './flowDeleteController';
11
+ function makeRawModule(id, expr) {
12
+ return {
13
+ id,
14
+ summary: id,
15
+ value: {
16
+ type: 'rawscript',
17
+ content: '',
18
+ language: 'python3',
19
+ input_transforms: expr
20
+ ? {
21
+ user_input: {
22
+ type: 'javascript',
23
+ expr
24
+ }
25
+ }
26
+ : {}
27
+ }
28
+ };
29
+ }
30
+ function makeAiAgent(id, tools) {
31
+ return {
32
+ id,
33
+ summary: id,
34
+ value: {
35
+ type: 'aiagent',
36
+ tools,
37
+ input_transforms: {}
38
+ }
39
+ };
40
+ }
41
+ function makeFlowModuleTool(module) {
42
+ return {
43
+ id: module.id,
44
+ summary: module.summary,
45
+ value: {
46
+ tool_type: 'flowmodule',
47
+ ...module.value
48
+ }
49
+ };
50
+ }
51
+ describe('flowDeleteController', () => {
52
+ it('prepares confirmations and executes grouped ai-agent deletes end to end', () => {
53
+ const agent = makeAiAgent('agent_step', [
54
+ makeFlowModuleTool(makeRawModule('lookup_user')),
55
+ makeFlowModuleTool(makeAiAgent('support_agent', [makeFlowModuleTool(makeRawModule('create_ticket'))]))
56
+ ]);
57
+ const dependent = makeRawModule('dependent_step', 'results.create_ticket?.value');
58
+ const flowStore = {
59
+ val: {
60
+ summary: 'Flow',
61
+ value: {
62
+ modules: [agent, dependent],
63
+ groups: [
64
+ {
65
+ summary: 'Agent group',
66
+ start_id: 'agent_step',
67
+ end_id: 'agent_step'
68
+ }
69
+ ]
70
+ }
71
+ }
72
+ };
73
+ const proxy = new GroupedModulesProxy(flowStore);
74
+ const displayState = new GroupDisplayState(() => flowStore.val.value.groups ?? []);
75
+ const request = prepareDeleteRequest({
76
+ ids: ['agent_step'],
77
+ flow: flowStore.val,
78
+ tree: proxy.items,
79
+ proxy,
80
+ displayState
81
+ });
82
+ expect(request?.needsDependencyConfirmation).toBe(true);
83
+ expect(request?.plan.structureDelete?.affectedGroups).toHaveLength(1);
84
+ expect(request?.plan.structureDelete?.affectedGroups[0]).toMatchObject({
85
+ summary: 'Agent group',
86
+ start_id: 'agent_step',
87
+ end_id: 'agent_step'
88
+ });
89
+ const selectionManager = {
90
+ clearSelection: vi.fn(),
91
+ selectId: vi.fn()
92
+ };
93
+ const flowStateStore = {
94
+ val: {
95
+ agent_step: {},
96
+ lookup_user: {},
97
+ support_agent: {},
98
+ create_ticket: {},
99
+ dependent_step: {}
100
+ }
101
+ };
102
+ const onDelete = vi.fn();
103
+ const result = executeDeletePlan(request.plan, {
104
+ flowStore,
105
+ flowStateStore,
106
+ selectionManager,
107
+ onDelete
108
+ });
109
+ expect(result.removedStateIds).toEqual([
110
+ 'agent_step',
111
+ 'lookup_user',
112
+ 'support_agent',
113
+ 'create_ticket'
114
+ ]);
115
+ expect(flowStore.val.value.modules.map((module) => module.id)).toEqual(['dependent_step']);
116
+ expect(flowStore.val.value.groups ?? []).toEqual([]);
117
+ expect(Object.keys(flowStateStore.val)).toEqual(['dependent_step']);
118
+ expect(selectionManager.selectId).toHaveBeenCalledWith('dependent_step');
119
+ expect(onDelete).toHaveBeenCalledWith('agent_step');
120
+ });
121
+ });
@@ -0,0 +1,48 @@
1
+ import type { GroupDisplayState } from '../graph/groupEditor.svelte';
2
+ import type { GroupedModulesProxy, PreparedStructureDelete } from '../graph/groupedModulesProxy.svelte';
3
+ import { type FlowStructureNode } from '../graph/flowStructure';
4
+ import type { FlowModule, OpenFlow } from '../../gen';
5
+ import type { AgentTool } from './agentToolUtils';
6
+ export type DeleteSelection = {
7
+ kind: 'clear';
8
+ } | {
9
+ kind: 'select';
10
+ id: string;
11
+ };
12
+ type DeleteTargetBase = {
13
+ id: string;
14
+ stateIds: string[];
15
+ };
16
+ export type PreprocessorDeleteTarget = DeleteTargetBase & {
17
+ kind: 'preprocessor';
18
+ };
19
+ export type StructureDeleteTarget = DeleteTargetBase & {
20
+ kind: 'structure_node';
21
+ };
22
+ export type AgentToolDeleteTarget = DeleteTargetBase & {
23
+ kind: 'agent_tool';
24
+ };
25
+ export type DeleteTarget = PreprocessorDeleteTarget | StructureDeleteTarget | AgentToolDeleteTarget;
26
+ export type DeletePlan = {
27
+ inputIds: string[];
28
+ targets: DeleteTarget[];
29
+ plannedStateIds: string[];
30
+ dependents: Record<string, string[]>;
31
+ selection: DeleteSelection;
32
+ structureDelete?: PreparedStructureDelete;
33
+ removeDuplicates: boolean;
34
+ };
35
+ export type ResolvedDeleteTargets = {
36
+ targets: DeleteTarget[];
37
+ missingIds: string[];
38
+ };
39
+ export declare function resolveDeleteTargets(tree: FlowStructureNode[], modules: FlowModule[], ids: string[], hasPreprocessor: boolean): ResolvedDeleteTargets;
40
+ export declare function createDeletePlan(args: {
41
+ ids: string[];
42
+ flow: OpenFlow;
43
+ tree: FlowStructureNode[];
44
+ proxy: GroupedModulesProxy;
45
+ displayState: GroupDisplayState;
46
+ }): DeletePlan | undefined;
47
+ export declare function removeDeletePlanTools(targets: DeleteTarget[], modules: FlowModule[], onRemove?: (tool: AgentTool) => void): string[];
48
+ export {};