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
@@ -6,7 +6,7 @@ import Skeleton from './common/skeleton/Skeleton.svelte';
6
6
  import GroupEditor from './GroupEditor.svelte';
7
7
  import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
8
8
  import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
9
- import { Eye, Plus, Trash } from 'lucide-svelte';
9
+ import { ArrowDown, ArrowUp, Eye, Plus, Trash } from 'lucide-svelte';
10
10
  import Label from './Label.svelte';
11
11
  import { sendUserToast } from '../toast';
12
12
  import { createEventDispatcher, untrack } from 'svelte';
@@ -14,6 +14,9 @@ import Select from './select/Select.svelte';
14
14
  import { safeSelectItems } from './select/utils.svelte';
15
15
  import TextInput from './text_input/TextInput.svelte';
16
16
  import PermissionHistory from './PermissionHistory.svelte';
17
+ import { Minimatch } from 'minimatch';
18
+ import Tooltip from './Tooltip.svelte';
19
+ import CollapseLink from './CollapseLink.svelte';
17
20
  let { name } = $props();
18
21
  let can_write = $state(false);
19
22
  let folder;
@@ -51,6 +54,7 @@ async function loadFolder() {
51
54
  try {
52
55
  folder = await FolderService.getFolder({ workspace: $workspaceStore, name });
53
56
  summary = folder.summary ?? '';
57
+ defaultPermissionedAs = (folder.default_permissioned_as ?? []).map((r) => ({ ...r }));
54
58
  can_write =
55
59
  $userStore != undefined &&
56
60
  (folder?.owners.includes('u/' + $userStore.username) ||
@@ -71,6 +75,73 @@ async function loadFolder() {
71
75
  folderNotFound = true;
72
76
  }
73
77
  }
78
+ // --- default_permissioned_as rules editor ---
79
+ let defaultPermissionedAs = $state([]);
80
+ const canEditDefaults = $derived(can_write &&
81
+ ($userStore?.is_admin ||
82
+ $userStore?.is_super_admin ||
83
+ ($userStore?.groups ?? []).includes('wm_deployers')));
84
+ function isValidGlob(glob) {
85
+ if (!glob)
86
+ return false;
87
+ try {
88
+ new Minimatch(glob);
89
+ return true;
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ }
95
+ function isValidPermissionedAs(value) {
96
+ return /^[ug]\/.+/.test(value) || value.includes('@');
97
+ }
98
+ // Split a permissioned_as value like "u/alice" or "g/prod" into its kind and name.
99
+ function ruleKind(value) {
100
+ return value.startsWith('g/') ? 'group' : 'user';
101
+ }
102
+ function ruleName(value) {
103
+ if (value.startsWith('u/') || value.startsWith('g/'))
104
+ return value.slice(2);
105
+ return value;
106
+ }
107
+ function setRulePermissionedAs(idx, kind, name) {
108
+ const prefix = kind === 'user' ? 'u/' : 'g/';
109
+ defaultPermissionedAs[idx].permissioned_as = prefix + name;
110
+ }
111
+ const defaultRulesInvalid = $derived(defaultPermissionedAs.some((r) => !isValidGlob(r.path_glob) || !isValidPermissionedAs(r.permissioned_as)));
112
+ function addDefaultRule() {
113
+ defaultPermissionedAs = [...defaultPermissionedAs, { path_glob: '**', permissioned_as: '' }];
114
+ }
115
+ function removeDefaultRule(idx) {
116
+ defaultPermissionedAs = defaultPermissionedAs.filter((_, i) => i !== idx);
117
+ }
118
+ function moveDefaultRule(idx, delta) {
119
+ const next = [...defaultPermissionedAs];
120
+ const target = idx + delta;
121
+ if (target < 0 || target >= next.length)
122
+ return;
123
+ [next[idx], next[target]] = [next[target], next[idx]];
124
+ defaultPermissionedAs = next;
125
+ }
126
+ async function saveDefaultRules() {
127
+ if (defaultRulesInvalid) {
128
+ sendUserToast('Some rules have invalid globs or permissioned_as values', true);
129
+ return;
130
+ }
131
+ try {
132
+ await FolderService.updateFolder({
133
+ workspace: $workspaceStore ?? '',
134
+ name,
135
+ requestBody: { default_permissioned_as: defaultPermissionedAs }
136
+ });
137
+ sendUserToast('Default permissioned_as rules updated');
138
+ dispatch('update');
139
+ loadFolder();
140
+ }
141
+ catch (e) {
142
+ sendUserToast(e.body ?? String(e), true);
143
+ }
144
+ }
74
145
  function getRole(x) {
75
146
  const viewer = x in (folder?.extra_perms ?? {});
76
147
  const writer = viewer && (folder?.extra_perms ?? {})[x];
@@ -240,14 +311,13 @@ let reloadHistory = $state(0);
240
311
  {/if}
241
312
  {#if perms}
242
313
  <TableCustom>
243
-
244
314
  {#snippet headerRow()}
245
- <tr >
315
+ <tr>
246
316
  <th>user/group</th>
247
317
  <th></th>
248
318
  <th></th>
249
319
  </tr>
250
- {/snippet}
320
+ {/snippet}
251
321
  {#snippet body()}
252
322
  <tbody>
253
323
  {#each perms ?? [] as { owner_name, role }}<tr>
@@ -418,6 +488,121 @@ let reloadHistory = $state(0);
418
488
  </div>
419
489
  </Label>
420
490
 
491
+ {#if canEditDefaults}
492
+ <CollapseLink text="Default permissioned as (advanced, prod only)">
493
+ <div class="flex flex-col gap-2">
494
+ <Alert type="info" title="Advanced — for prod workspaces (least privilege)" size="xs">
495
+ This setting is mostly relevant on <strong>production workspaces</strong> where you want
496
+ new items under this folder to run under a least-privilege service account rather than the
497
+ deploying admin's identity. When an admin or <code>wm_deployers</code> member creates a
498
+ trigger, schedule, app, script, or flow under this folder, the first matching rule
499
+ determines the default <code>permissioned_as</code>. Globs are relative to the folder root
500
+ (e.g. <code>jobs/**</code> matches <code>f/{name}/jobs/run_a</code>). Existing items are
501
+ never rewritten.
502
+ </Alert>
503
+
504
+ {#if defaultPermissionedAs.length > 0}
505
+ <TableCustom>
506
+ {#snippet headerRow()}
507
+ <tr>
508
+ <th>path_glob <Tooltip>Glob relative to <code>f/{name}/</code></Tooltip></th>
509
+ <th>permissioned as</th>
510
+ <th class="w-24"></th>
511
+ </tr>
512
+ {/snippet}
513
+ {#snippet body()}
514
+ <tbody>
515
+ {#each defaultPermissionedAs as rule, idx (idx)}
516
+ {@const kind = ruleKind(rule.permissioned_as)}
517
+ {@const itemsForKind = kind === 'user' ? usernames : groups}
518
+ <tr>
519
+ <td>
520
+ <TextInput
521
+ bind:value={rule.path_glob}
522
+ inputProps={{ placeholder: '**' }}
523
+ error={!isValidGlob(rule.path_glob)}
524
+ />
525
+ </td>
526
+ <td>
527
+ <div class="flex items-center gap-1">
528
+ <ToggleButtonGroup
529
+ selected={kind}
530
+ on:selected={(e) => setRulePermissionedAs(idx, e.detail, '')}
531
+ >
532
+ {#snippet children({ item })}
533
+ <ToggleButton value="user" label="User" {item} size="sm" />
534
+ <ToggleButton value="group" label="Group" {item} size="sm" />
535
+ {/snippet}
536
+ </ToggleButtonGroup>
537
+ <Select
538
+ items={safeSelectItems(itemsForKind)}
539
+ bind:value={
540
+ () => ruleName(rule.permissioned_as),
541
+ (v) => setRulePermissionedAs(idx, kind, v ?? '')
542
+ }
543
+ class="grow min-w-32"
544
+ />
545
+ </div>
546
+ </td>
547
+ <td>
548
+ <div class="flex items-center gap-1 justify-end">
549
+ <Button
550
+ variant="subtle"
551
+ unifiedSize="sm"
552
+ startIcon={{ icon: ArrowUp }}
553
+ iconOnly
554
+ disabled={idx === 0}
555
+ on:click={() => moveDefaultRule(idx, -1)}
556
+ />
557
+ <Button
558
+ variant="subtle"
559
+ unifiedSize="sm"
560
+ startIcon={{ icon: ArrowDown }}
561
+ iconOnly
562
+ disabled={idx === defaultPermissionedAs.length - 1}
563
+ on:click={() => moveDefaultRule(idx, 1)}
564
+ />
565
+ <Button
566
+ variant="subtle"
567
+ destructive
568
+ unifiedSize="sm"
569
+ startIcon={{ icon: Trash }}
570
+ iconOnly
571
+ on:click={() => removeDefaultRule(idx)}
572
+ />
573
+ </div>
574
+ </td>
575
+ </tr>
576
+ {/each}
577
+ </tbody>
578
+ {/snippet}
579
+ </TableCustom>
580
+ {:else}
581
+ <div class="text-xs text-tertiary">No rules defined.</div>
582
+ {/if}
583
+
584
+ <div class="flex items-center gap-2">
585
+ <Button
586
+ variant="default"
587
+ unifiedSize="sm"
588
+ startIcon={{ icon: Plus }}
589
+ on:click={addDefaultRule}
590
+ >
591
+ Add rule
592
+ </Button>
593
+ <Button
594
+ variant="accent"
595
+ unifiedSize="sm"
596
+ disabled={defaultRulesInvalid}
597
+ on:click={saveDefaultRules}
598
+ >
599
+ Save rules
600
+ </Button>
601
+ </div>
602
+ </div>
603
+ </CollapseLink>
604
+ {/if}
605
+
421
606
  {#if reloadHistory > 0}
422
607
  {#key reloadHistory}
423
608
  <PermissionHistory
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">import { workspaceStore, userWorkspaces } from '../stores';
2
- import { WorkspaceService } from '../gen';
2
+ import { WorkspaceService, ScriptService } from '../gen';
3
3
  import { Button } from './common';
4
- import { AlertTriangle, GitFork } from 'lucide-svelte';
4
+ import { AlertTriangle, GitFork, CircleCheck, CircleX, Loader2 } from 'lucide-svelte';
5
5
  import { goto } from '$app/navigation';
6
6
  import { onMount, untrack } from 'svelte';
7
7
  let loading = $state(false);
@@ -61,6 +61,59 @@ function openComparisonDrawer() {
61
61
  });
62
62
  }
63
63
  }
64
+ let ciTestPassing = $state(0);
65
+ let ciTestFailing = $state(0);
66
+ let ciTestRunning = $state(0);
67
+ let ciTestTotal = $state(0);
68
+ async function fetchCiTestSummary() {
69
+ if (!$workspaceStore || !comparison?.diffs)
70
+ return;
71
+ const items = comparison.diffs
72
+ .filter((d) => d.kind === 'script' || d.kind === 'flow' || d.kind === 'resource')
73
+ .map((d) => ({ path: d.path, kind: d.kind }));
74
+ if (items.length === 0)
75
+ return;
76
+ try {
77
+ const batch = await ScriptService.getCiTestResultsBatch({
78
+ workspace: $workspaceStore,
79
+ requestBody: { items }
80
+ });
81
+ let passing = 0;
82
+ let failing = 0;
83
+ let running = 0;
84
+ let total = 0;
85
+ for (const results of Object.values(batch)) {
86
+ for (const r of results) {
87
+ total++;
88
+ if (r.status === 'success')
89
+ passing++;
90
+ else if (r.status === 'failure' || r.status === 'canceled')
91
+ failing++;
92
+ else if (r.status === 'running' || (r.job_id && !r.status))
93
+ running++;
94
+ }
95
+ }
96
+ ciTestPassing = passing;
97
+ ciTestFailing = failing;
98
+ ciTestRunning = running;
99
+ ciTestTotal = total;
100
+ }
101
+ catch (e) {
102
+ console.error('Failed to fetch CI test summary:', e);
103
+ }
104
+ }
105
+ $effect(() => {
106
+ if (comparison && comparison.summary.total_diffs > 0) {
107
+ fetchCiTestSummary();
108
+ }
109
+ });
110
+ // Poll while any CI test is still running
111
+ $effect(() => {
112
+ if (ciTestRunning <= 0)
113
+ return;
114
+ const interval = setInterval(fetchCiTestSummary, 3000);
115
+ return () => clearInterval(interval);
116
+ });
64
117
  function forkAheadBehindMessage(changesAhead, changesBehind) {
65
118
  let msg = [];
66
119
  if (changesAhead > 0 || changesBehind > 0) {
@@ -162,6 +215,26 @@ function forkAheadBehindMessage(changesAhead, changesBehind) {
162
215
  {/if}
163
216
  </div>
164
217
 
218
+ {#if ciTestTotal > 0}
219
+ -
220
+ {#if ciTestFailing > 0}
221
+ <div class="flex items-center gap-1 text-red-600 dark:text-red-400">
222
+ <CircleX class="w-3 h-3" />
223
+ <span>CI: {ciTestFailing} failing</span>
224
+ </div>
225
+ {:else if ciTestRunning > 0}
226
+ <div class="flex items-center gap-1 text-yellow-600 dark:text-yellow-400">
227
+ <Loader2 class="w-3 h-3 animate-spin" />
228
+ <span>CI: {ciTestRunning} running</span>
229
+ </div>
230
+ {:else}
231
+ <div class="flex items-center gap-1 text-green-600 dark:text-green-400">
232
+ <CircleCheck class="w-3 h-3" />
233
+ <span>CI: {ciTestPassing} passing</span>
234
+ </div>
235
+ {/if}
236
+ {/if}
237
+
165
238
  {#if comparison.summary.conflicts > 0}
166
239
  -
167
240
  <div class="flex items-center gap-1 text-orange-600 dark:text-orange-400">
@@ -186,15 +259,13 @@ function forkAheadBehindMessage(changesAhead, changesBehind) {
186
259
  </div>
187
260
 
188
261
  <div class="flex items-center gap-2">
189
- {#if comparison && comparison.summary.total_diffs > 0}
190
- <Button size="xs" color="blue" on:click={openComparisonDrawer}>
191
- {#if comparison.summary.total_ahead > 0}
192
- Review & Deploy Changes
193
- {:else}
194
- Review & Update fork
195
- {/if}
196
- </Button>
197
- {/if}
262
+ <Button size="xs" color="blue" on:click={openComparisonDrawer}>
263
+ {#if (comparison?.summary.total_ahead ?? 0) > 0}
264
+ Review & Deploy Changes
265
+ {:else}
266
+ Review & Update fork
267
+ {/if}
268
+ </Button>
198
269
  </div>
199
270
  </div>
200
271
  </div>
@@ -0,0 +1,293 @@
1
+ <script lang="ts">import { Alert, Button } from './common';
2
+ import { fade } from 'svelte/transition';
3
+ import { classNames } from '../utils';
4
+ import { AlertTriangle, CornerDownLeft, Loader2 } from 'lucide-svelte';
5
+ import { UserService, FolderService } from '../gen';
6
+ import { sendUserToast } from '../toast';
7
+ import Toggle from './Toggle.svelte';
8
+ import OffboardWorkspaceSection from './OffboardWorkspaceSection.svelte';
9
+ import { countPaths } from './offboarding-utils';
10
+ let { open = $bindable(), email, reassignOnly = false, onClose, onComplete } = $props();
11
+ let workspacePreviews = $state([]);
12
+ let loading = $state(false);
13
+ let submitting = $state(false);
14
+ let doReassign = $state(true);
15
+ let deleteUser = $state(true);
16
+ let conflicts = $state([]);
17
+ $effect(() => {
18
+ deleteUser = !reassignOnly;
19
+ });
20
+ let wsConfigs = $state({});
21
+ let workspacesWithItems = $derived(workspacePreviews.filter((wp) => countPaths(wp.preview.owned) > 0 || countPaths(wp.preview.executing_on_behalf) > 0));
22
+ $effect(() => {
23
+ if (open) {
24
+ loadPreview();
25
+ }
26
+ });
27
+ async function loadPreview() {
28
+ loading = true;
29
+ conflicts = [];
30
+ try {
31
+ const result = await UserService.globalOffboardPreview({ email });
32
+ workspacePreviews = result.workspaces;
33
+ const configPromises = result.workspaces
34
+ .filter((wp) => countPaths(wp.preview.owned) > 0 || countPaths(wp.preview.executing_on_behalf) > 0)
35
+ .map(async (wp) => {
36
+ const [usernamesList, foldersList] = await Promise.all([
37
+ UserService.listUsernames({ workspace: wp.workspace_id }),
38
+ FolderService.listFolders({ workspace: wp.workspace_id })
39
+ ]);
40
+ return {
41
+ workspace_id: wp.workspace_id,
42
+ config: {
43
+ targetKind: 'user',
44
+ selectedUser: undefined,
45
+ selectedFolder: undefined,
46
+ selectedOperator: undefined,
47
+ users: usernamesList
48
+ .filter((u) => u !== wp.username)
49
+ .map((u) => ({ label: u, value: u })),
50
+ folders: foldersList.map((f) => ({
51
+ label: f.name,
52
+ value: f.name
53
+ }))
54
+ }
55
+ };
56
+ });
57
+ const configs = await Promise.all(configPromises);
58
+ for (const { workspace_id, config } of configs) {
59
+ wsConfigs[workspace_id] = config;
60
+ }
61
+ }
62
+ catch (e) {
63
+ sendUserToast('Failed to load offboard preview', true);
64
+ onClose();
65
+ }
66
+ finally {
67
+ loading = false;
68
+ }
69
+ }
70
+ function getReassignTo(wId) {
71
+ const cfg = wsConfigs[wId];
72
+ if (!cfg)
73
+ return undefined;
74
+ return cfg.targetKind === 'user'
75
+ ? cfg.selectedUser
76
+ ? `u/${cfg.selectedUser}`
77
+ : undefined
78
+ : cfg.selectedFolder
79
+ ? `f/${cfg.selectedFolder}`
80
+ : undefined;
81
+ }
82
+ let canSubmit = $derived(!doReassign ||
83
+ workspacesWithItems.every((wp) => {
84
+ const target = getReassignTo(wp.workspace_id);
85
+ const cfg = wsConfigs[wp.workspace_id];
86
+ if (!target)
87
+ return false;
88
+ if (!cfg?.selectedOperator)
89
+ return false;
90
+ return true;
91
+ }));
92
+ async function submit() {
93
+ submitting = true;
94
+ conflicts = [];
95
+ try {
96
+ const reassignments = {};
97
+ for (const wp of workspacesWithItems) {
98
+ const target = getReassignTo(wp.workspace_id);
99
+ const cfg = wsConfigs[wp.workspace_id];
100
+ if (target) {
101
+ reassignments[wp.workspace_id] = {
102
+ reassign_to: target,
103
+ new_on_behalf_of_user: cfg?.selectedOperator
104
+ };
105
+ }
106
+ }
107
+ const result = await UserService.offboardGlobalUser({
108
+ email,
109
+ requestBody: {
110
+ reassignments,
111
+ delete_user: deleteUser
112
+ }
113
+ });
114
+ if (result.conflicts && result.conflicts.length > 0) {
115
+ conflicts = result.conflicts;
116
+ }
117
+ else {
118
+ sendUserToast(deleteUser
119
+ ? `User ${email} offboarded successfully`
120
+ : `Items reassigned from ${email} successfully`);
121
+ onComplete();
122
+ }
123
+ }
124
+ catch (e) {
125
+ sendUserToast(`Offboarding failed: ${e}`, true);
126
+ }
127
+ finally {
128
+ submitting = false;
129
+ }
130
+ }
131
+ function fadeFast(node) {
132
+ return fade(node, { duration: 100 });
133
+ }
134
+ </script>
135
+
136
+ {#if open}
137
+ <div transition:fadeFast|local class="fixed top-0 bottom-0 left-0 right-0 z-[5000]" role="dialog">
138
+ <div
139
+ class={classNames(
140
+ 'fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity',
141
+ 'ease-out duration-300 opacity-100'
142
+ )}
143
+ ></div>
144
+
145
+ <div class="fixed inset-0 z-10 overflow-y-auto">
146
+ <div class="flex min-h-full items-center justify-center p-4">
147
+ <div
148
+ class="relative transform overflow-hidden rounded-lg bg-surface px-4 pt-5 pb-4 text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-2xl sm:p-6 max-h-[80vh] overflow-y-auto"
149
+ >
150
+ <div class="flex">
151
+ <div
152
+ class="flex h-12 w-12 items-center justify-center rounded-full bg-red-100 dark:bg-red-800/50"
153
+ >
154
+ <AlertTriangle class="text-red-500 dark:text-red-400" />
155
+ </div>
156
+ <div class="ml-4 text-left flex-1">
157
+ <h3 class="text-lg font-medium text-primary">
158
+ {reassignOnly ? 'Reassign user items globally' : 'Offboard user globally'}
159
+ </h3>
160
+ <p class="text-sm text-secondary mt-1">
161
+ {reassignOnly
162
+ ? `Reassign items owned by ${email} across all workspaces`
163
+ : `Remove ${email} from instance and reassign their items`}
164
+ </p>
165
+ </div>
166
+ </div>
167
+
168
+ {#if loading}
169
+ <div class="flex items-center justify-center py-8">
170
+ <Loader2 class="animate-spin" size={24} />
171
+ <span class="ml-2 text-sm text-secondary">Loading preview...</span>
172
+ </div>
173
+ {:else}
174
+ <div class="mt-4 space-y-3">
175
+ {#if workspacesWithItems.length === 0}
176
+ <p class="text-sm text-secondary">
177
+ This user has no owned items in any workspace.
178
+ </p>
179
+ {:else}
180
+ {#if !reassignOnly}
181
+ <Toggle
182
+ bind:checked={doReassign}
183
+ size="xs"
184
+ options={{ right: 'Reassign items before removing' }}
185
+ />
186
+ {/if}
187
+
188
+ {#if doReassign}
189
+ {#each workspacesWithItems as wp}
190
+ {@const cfg = wsConfigs[wp.workspace_id]}
191
+ <div class="border border-border rounded-md p-3 space-y-2">
192
+ <div class="flex items-center justify-between">
193
+ <span class="text-sm font-medium text-primary">
194
+ {wp.workspace_id}
195
+ <span class="text-secondary font-normal">({wp.username})</span>
196
+ </span>
197
+ </div>
198
+
199
+ {#if cfg}
200
+ <OffboardWorkspaceSection
201
+ preview={wp.preview}
202
+ username={wp.username}
203
+ {deleteUser}
204
+ bind:targetKind={cfg.targetKind}
205
+ bind:selectedUser={cfg.selectedUser}
206
+ bind:selectedFolder={cfg.selectedFolder}
207
+ bind:selectedOperator={cfg.selectedOperator}
208
+ users={cfg.users}
209
+ folders={cfg.folders}
210
+ size="sm"
211
+ csvFilename="offboard-{email}-{wp.workspace_id}.csv"
212
+ instanceLevel
213
+ />
214
+ {/if}
215
+ </div>
216
+ {/each}
217
+ {:else}
218
+ <Alert type="warning" title="Items will not be reassigned">
219
+ <p class="text-xs">
220
+ All items across {workspacesWithItems.length} workspace(s) will be left as-is.
221
+ Triggers and runnables may stop working if the user is removed.
222
+ </p>
223
+ </Alert>
224
+ {/if}
225
+ {/if}
226
+
227
+ {#if deleteUser}
228
+ <Alert type="warning" title="All tokens will be deleted">
229
+ <p class="text-xs">
230
+ All tokens for {email} will be permanently deleted across all workspaces, including
231
+ non-workspace-scoped tokens. This may break any API calls using these credentials.
232
+ </p>
233
+ </Alert>
234
+ {/if}
235
+
236
+ {#if workspacePreviews.length > workspacesWithItems.length}
237
+ <p class="text-xs text-tertiary">
238
+ {workspacePreviews.length - workspacesWithItems.length} workspace(s) with no items
239
+ to reassign
240
+ </p>
241
+ {/if}
242
+
243
+ {#if conflicts.length > 0}
244
+ <Alert type="error" title="Path conflicts detected">
245
+ <p class="text-xs mb-1"
246
+ >These items already exist at the target. Rename or delete them, or choose a
247
+ different user/folder.</p
248
+ >
249
+ <ul class="text-xs list-disc list-inside max-h-32 overflow-y-auto">
250
+ {#each conflicts as conflict}
251
+ <li>{conflict}</li>
252
+ {/each}
253
+ </ul>
254
+ </Alert>
255
+ {/if}
256
+ </div>
257
+ {/if}
258
+
259
+ <div class="flex items-center space-x-2 flex-row-reverse space-x-reverse mt-4">
260
+ {#if workspacesWithItems.length > 0 || deleteUser}
261
+ <Button
262
+ disabled={submitting || !canSubmit}
263
+ onclick={submit}
264
+ variant="accent"
265
+ size="sm"
266
+ destructive
267
+ shortCut={{ Icon: CornerDownLeft, hide: false, withoutModifier: true }}
268
+ >
269
+ {#if submitting}
270
+ <Loader2 class="animate-spin" />
271
+ {/if}
272
+ <span class="min-w-20">
273
+ {deleteUser ? 'Offboard' : 'Reassign'}
274
+ </span>
275
+ </Button>
276
+ {:else if !loading}
277
+ <Button onclick={onClose} variant="accent" size="sm">Close</Button>
278
+ {/if}
279
+ <Button
280
+ disabled={submitting}
281
+ onclick={onClose}
282
+ variant="default"
283
+ size="sm"
284
+ shortCut={{ key: 'Esc', hide: false, withoutModifier: true }}
285
+ >
286
+ Cancel
287
+ </Button>
288
+ </div>
289
+ </div>
290
+ </div>
291
+ </div>
292
+ </div>
293
+ {/if}
@@ -0,0 +1,10 @@
1
+ type Props = {
2
+ open: boolean;
3
+ email: string;
4
+ reassignOnly?: boolean;
5
+ onClose: () => void;
6
+ onComplete: () => void;
7
+ };
8
+ declare const GlobalUserOffboardingModal: import("svelte").Component<Props, {}, "open">;
9
+ type GlobalUserOffboardingModal = ReturnType<typeof GlobalUserOffboardingModal>;
10
+ export default GlobalUserOffboardingModal;