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
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">import { UserService, SettingService } from '../gen';
2
+ import { Tab, Tabs } from './common';
2
3
  import DataTable from './table/DataTable.svelte';
3
4
  import Head from './table/Head.svelte';
4
5
  import Cell from './table/Cell.svelte';
@@ -16,10 +17,11 @@ import { truncate } from '../utils';
16
17
  import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
17
18
  import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
18
19
  import { userStore, workspaceStore } from '../stores';
19
- import { Ban, CheckCircle2, ExternalLink, Pencil, UserMinus, UserPlus } from 'lucide-svelte';
20
+ import { ArrowRightLeft, Ban, CheckCircle2, ExternalLink, Pencil, UserMinus, UserPlus } from 'lucide-svelte';
20
21
  import DropdownV2 from './DropdownV2.svelte';
21
22
  import Popover from './meltComponents/Popover.svelte';
22
23
  import ConfirmationModal from './common/confirmationModal/ConfirmationModal.svelte';
24
+ import GlobalUserOffboardingModal from './GlobalUserOffboardingModal.svelte';
23
25
  import ChangeInstanceUsername from './ChangeInstanceUsername.svelte';
24
26
  import { isCloudHosted } from '../cloud';
25
27
  import InstanceNameEditor from './InstanceNameEditor.svelte';
@@ -32,6 +34,7 @@ import TextInput from './text_input/TextInput.svelte';
32
34
  import SettingsPageHeader from './settings/SettingsPageHeader.svelte';
33
35
  import SettingsSearchInput from './instanceSettings/SettingsSearchInput.svelte';
34
36
  import InstanceAISettings from './instanceSettings/InstanceAISettings.svelte';
37
+ import ExternalJwtTokens from './instanceSettings/ExternalJwtTokens.svelte';
35
38
  let filter = $state('');
36
39
  let { closeDrawer, showHeaderInfo = true, disableChatOffset = false, yamlMode = $bindable(false), hasUnsavedChanges = $bindable(false), hasAnyInvalid = $bindable(false) } = $props();
37
40
  function removeHash() {
@@ -46,8 +49,8 @@ onDestroy(() => {
46
49
  });
47
50
  let users = $state([]);
48
51
  let filteredUsers = $state([]);
49
- let deleteConfirmedCallback = $state(undefined);
50
- let deleteUserEmail = $state('');
52
+ let offboardingEmail = $state(undefined);
53
+ let offboardingReassignOnly = $state(false);
51
54
  let disableConfirmedCallback = $state(undefined);
52
55
  let disableUserEmail = $state('');
53
56
  let editWrappers = $state({});
@@ -58,6 +61,31 @@ async function listUsers(activeOnly) {
58
61
  $effect(() => {
59
62
  listUsers(activeOnly);
60
63
  });
64
+ let usersSubTab = $state('users');
65
+ let extJwtTokens = $state([]);
66
+ let extJwtHasMore = $state(true);
67
+ let extJwtLoading = $state(false);
68
+ let extJwtActiveOnly = $state(false);
69
+ const extJwtPerPage = 50;
70
+ async function loadExtJwtPage(nextPage) {
71
+ extJwtLoading = true;
72
+ try {
73
+ const res = await UserService.listExtJwtTokens({
74
+ page: nextPage,
75
+ perPage: extJwtPerPage,
76
+ activeOnly: extJwtActiveOnly
77
+ });
78
+ extJwtTokens = nextPage === 1 ? res : [...extJwtTokens, ...res];
79
+ extJwtHasMore = res.length === extJwtPerPage;
80
+ }
81
+ catch (e) {
82
+ sendUserToast(`Failed to load external JWT tokens: ${e}`, true);
83
+ }
84
+ finally {
85
+ extJwtLoading = false;
86
+ }
87
+ }
88
+ loadExtJwtPage(1);
61
89
  let tab = $state('users');
62
90
  $effect(() => {
63
91
  tab = $instanceSettingsSelectedTab;
@@ -248,310 +276,337 @@ onDestroy(() => {
248
276
  </div>
249
277
  {/if}
250
278
 
251
- <SettingsPageHeader
252
- title="Instance users ({users.length})"
253
- description="Manage all users across your Windmill instance."
254
- link="https://www.windmill.dev/docs/advanced/instance_settings#global-users"
255
- />
256
- <div class="flex flex-row gap-2 items-center">
257
- <TextInput
258
- inputProps={{ placeholder: 'Search users' }}
259
- bind:value={filter}
260
- class="w-60"
261
- /><Toggle
262
- bind:checked={activeOnly}
263
- options={{
264
- left: 'Recently active only',
265
- leftTooltip:
266
- 'Show only users who have logged in or performed an action in the last 30 days'
267
- }}
279
+ {#if extJwtTokens.length > 0}
280
+ <Tabs bind:selected={usersSubTab} class="mb-4">
281
+ <Tab value="users" label="Users" />
282
+ <Tab value="ext_jwt" label="External JWTs" />
283
+ </Tabs>
284
+ {/if}
285
+
286
+ {#if usersSubTab === 'users' || extJwtTokens.length === 0}
287
+ <SettingsPageHeader
288
+ title="Instance users ({users.length})"
289
+ description="Manage all users across your Windmill instance."
290
+ link="https://www.windmill.dev/docs/advanced/instance_settings#global-users"
268
291
  />
292
+ <div class="flex flex-row gap-2 items-center">
293
+ <TextInput
294
+ inputProps={{ placeholder: 'Search users' }}
295
+ bind:value={filter}
296
+ class="w-60"
297
+ /><Toggle
298
+ bind:checked={activeOnly}
299
+ options={{
300
+ left: 'Recently active only',
301
+ leftTooltip:
302
+ 'Show only users who have logged in or performed an action in the last 30 days'
303
+ }}
304
+ />
269
305
 
270
- <div class="flex-1"></div>
271
- <Popover placement="bottom-end" disableFocusTrap closeButton>
272
- {#snippet trigger()}
273
- <Button
274
- variant="accent"
275
- unifiedSize="md"
276
- startIcon={{ icon: UserPlus }}
277
- nonCaptureEvent
278
- wrapperClasses="w-fit shrink-0"
279
- >
280
- Add new user
281
- </Button>
282
- {/snippet}
283
- {#snippet content()}
284
- <InviteGlobalUser on:new={() => listUsers(activeOnly)} />
285
- {/snippet}
286
- </Popover>
287
- </div>
288
- <p class="text-hint text-2xs mt-2">
289
- {filteredUsers.length} user{filteredUsers.length !== 1 ? 's' : ''} found
290
- </p>
291
- <div class="mt-1">
292
- <DataTable
293
- shouldLoadMore={(filteredUsers?.length ?? 0) > 50}
294
- loadMore={50}
295
- on:loadMore={() => {
296
- nbDisplayed += 50
297
- }}
298
- >
299
- <Head>
300
- <tr>
301
- <Cell head first>Email</Cell>
302
- {#if automateUsernameCreation}
303
- <Cell head>Username</Cell>
304
- {/if}
305
- <Cell head>Name</Cell>
306
- <Cell head>Auth</Cell>
307
- {#if activeOnly}
308
- <Cell head>Kind</Cell>
309
- {/if}
310
- <Cell head>Role</Cell>
311
- <Cell head last>
312
- <span class="sr-only">Actions</span>
313
- </Cell>
314
- </tr>
315
- </Head>
316
- <tbody>
317
- {#if filteredUsers && users}
318
- {#each filteredUsers.slice(0, nbDisplayed) as { email, super_admin, devops, login_type, name, username, operator_only, role_source, disabled }, i (email)}
319
- <tr
320
- class="{i % 2 === 0 ? 'bg-surface-tertiary' : 'bg-surface'} {disabled
321
- ? 'opacity-60'
322
- : ''}"
323
- >
324
- <Cell first class="max-w-[250px]">
325
- <div class="flex items-center gap-1.5">
326
- <a href="mailto:{email}" title={email} class="truncate block"
327
- >{email}</a
328
- >
329
- {#if disabled}
330
- <span
331
- class="text-2xs px-1.5 py-0.5 rounded bg-red-100 text-red-600 dark:bg-red-900 dark:text-red-300 whitespace-nowrap"
332
- >Disabled</span
306
+ <div class="flex-1"></div>
307
+ <Popover placement="bottom-end" disableFocusTrap closeButton>
308
+ {#snippet trigger()}
309
+ <Button
310
+ variant="accent"
311
+ unifiedSize="md"
312
+ startIcon={{ icon: UserPlus }}
313
+ nonCaptureEvent
314
+ wrapperClasses="w-fit shrink-0"
315
+ >
316
+ Add new user
317
+ </Button>
318
+ {/snippet}
319
+ {#snippet content()}
320
+ <InviteGlobalUser on:new={() => listUsers(activeOnly)} />
321
+ {/snippet}
322
+ </Popover>
323
+ </div>
324
+ <p class="text-hint text-2xs mt-2">
325
+ {filteredUsers.length} user{filteredUsers.length !== 1 ? 's' : ''} found
326
+ </p>
327
+ <div class="mt-1">
328
+ <DataTable
329
+ shouldLoadMore={(filteredUsers?.length ?? 0) > 50}
330
+ loadMore={50}
331
+ on:loadMore={() => {
332
+ nbDisplayed += 50
333
+ }}
334
+ >
335
+ <Head>
336
+ <tr>
337
+ <Cell head first>Email</Cell>
338
+ {#if automateUsernameCreation}
339
+ <Cell head>Username</Cell>
340
+ {/if}
341
+ <Cell head>Name</Cell>
342
+ <Cell head>Auth</Cell>
343
+ {#if activeOnly}
344
+ <Cell head>Kind</Cell>
345
+ {/if}
346
+ <Cell head>Role</Cell>
347
+ <Cell head last>
348
+ <span class="sr-only">Actions</span>
349
+ </Cell>
350
+ </tr>
351
+ </Head>
352
+ <tbody>
353
+ {#if filteredUsers && users}
354
+ {#each filteredUsers.slice(0, nbDisplayed) as { email, super_admin, devops, login_type, name, username, operator_only, role_source, disabled }, i (email)}
355
+ <tr
356
+ class="{i % 2 === 0 ? 'bg-surface-tertiary' : 'bg-surface'} {disabled
357
+ ? 'opacity-60'
358
+ : ''}"
359
+ >
360
+ <Cell first class="max-w-[250px]">
361
+ <div class="flex items-center gap-1.5">
362
+ <a href="mailto:{email}" title={email} class="truncate block"
363
+ >{email}</a
333
364
  >
334
- {/if}
335
- </div>
336
- </Cell>
337
- {#if automateUsernameCreation}
338
- <Cell class="max-w-[150px]">
339
- {#if username}
340
- <span title={username} class="truncate block">{username}</span>
341
- {:else}
342
- {#key filteredUsers.map((u) => u.username).join()}
343
- <ChangeInstanceUsername
344
- username=""
345
- {email}
346
- isConflict
347
- on:renamed={() => {
348
- listUsers(activeOnly)
349
- }}
350
- />
351
- {/key}
352
- {/if}
365
+ {#if disabled}
366
+ <span
367
+ class="text-2xs px-1.5 py-0.5 rounded bg-red-100 text-red-600 dark:bg-red-900 dark:text-red-300 whitespace-nowrap"
368
+ >Disabled</span
369
+ >
370
+ {/if}
371
+ </div>
353
372
  </Cell>
354
- {/if}
355
- <Cell class="max-w-[150px]"
356
- ><span title={name ?? ''} class="truncate block"
357
- >{truncate(name ?? '', 30)}</span
358
- ></Cell
359
- >
360
- <Cell class="max-w-[100px]"
361
- ><span title={login_type} class="truncate block">{login_type}</span
362
- ></Cell
363
- >
364
- {#if activeOnly}
373
+ {#if automateUsernameCreation}
374
+ <Cell class="max-w-[150px]">
375
+ {#if username}
376
+ <span title={username} class="truncate block">{username}</span>
377
+ {:else}
378
+ {#key filteredUsers.map((u) => u.username).join()}
379
+ <ChangeInstanceUsername
380
+ username=""
381
+ {email}
382
+ isConflict
383
+ on:renamed={() => {
384
+ listUsers(activeOnly)
385
+ }}
386
+ />
387
+ {/key}
388
+ {/if}
389
+ </Cell>
390
+ {/if}
391
+ <Cell class="max-w-[150px]"
392
+ ><span title={name ?? ''} class="truncate block"
393
+ >{truncate(name ?? '', 30)}</span
394
+ ></Cell
395
+ >
396
+ <Cell class="max-w-[100px]"
397
+ ><span title={login_type} class="truncate block">{login_type}</span
398
+ ></Cell
399
+ >
400
+ {#if activeOnly}
401
+ <Cell>
402
+ {#if operator_only}
403
+ Operator only
404
+ {:else}
405
+ Developer
406
+ {/if}
407
+ </Cell>
408
+ {/if}
365
409
  <Cell>
366
- {#if operator_only}
367
- Operator only
368
- {:else}
369
- Developer
370
- {/if}
371
- </Cell>
372
- {/if}
373
- <Cell>
374
- <div class="flex flex-col items-start">
375
- {#key `${super_admin}_${devops}_${role_source}`}
376
- <ToggleButtonGroup
377
- selected={super_admin
378
- ? 'super_admin'
379
- : devops
380
- ? 'devops'
381
- : 'user'}
382
- on:selected={async (e) => {
383
- if (email == $userStore?.email) {
384
- sendUserToast('You cannot demote yourself', true)
385
- listUsers(activeOnly)
386
- return
387
- }
410
+ <div class="flex flex-col items-start">
411
+ {#key `${super_admin}_${devops}_${role_source}`}
412
+ <ToggleButtonGroup
413
+ selected={super_admin
414
+ ? 'super_admin'
415
+ : devops
416
+ ? 'devops'
417
+ : 'user'}
418
+ on:selected={async (e) => {
419
+ if (email == $userStore?.email) {
420
+ sendUserToast('You cannot demote yourself', true)
421
+ listUsers(activeOnly)
422
+ return
423
+ }
388
424
 
389
- let role = e.detail
425
+ let role = e.detail
390
426
 
391
- if (role === 'super_admin') {
392
- await UserService.globalUserUpdate({
393
- email,
394
- requestBody: {
395
- is_super_admin: true,
396
- is_devops: false
397
- }
398
- })
399
- }
400
- if (role === 'devops') {
401
- await UserService.globalUserUpdate({
402
- email,
403
- requestBody: {
404
- is_super_admin: false,
405
- is_devops: true
406
- }
407
- })
408
- }
409
- if (role === 'user') {
410
- await UserService.globalUserUpdate({
411
- email,
412
- requestBody: {
413
- is_super_admin: false,
414
- is_devops: false
415
- }
416
- })
417
- }
418
- sendUserToast('User updated')
419
- listUsers(activeOnly)
420
- }}
421
- >
422
- {#snippet children({ item })}
423
- <ToggleButton
424
- value={'user'}
425
- small
426
- label="User"
427
- disabled={role_source === 'instance_group' &&
428
- (super_admin || devops)}
429
- tooltip={role_source === 'instance_group' &&
430
- (super_admin || devops)
431
- ? 'Role is set by an instance group. Remove the user from the group to demote to "User".'
432
- : undefined}
433
- showTooltipIcon={role_source === 'instance_group' &&
434
- (super_admin || devops)}
435
- {item}
436
- />
437
- <ToggleButton
438
- value={'devops'}
439
- small
440
- label="Devops"
441
- tooltip="Devops is a role that grants visibilty similar to that of a super admin, but without giving all rights. For example devops users can see service logs and crtical alerts. You can think of it as a 'readonly' super admin"
442
- {item}
443
- />
444
- <ToggleButton
445
- value={'super_admin'}
446
- small
447
- label="Superadmin"
448
- {item}
449
- />
450
- {/snippet}
451
- </ToggleButtonGroup>
452
- {/key}
453
- {#if role_source === 'instance_group' && (super_admin || devops)}
454
- <a
455
- href="{base}/groups"
456
- class="text-2xs text-tertiary mt-0.5 ml-1 hover:underline"
457
- title="Role set by instance group. You can upgrade to a higher role manually, but demoting to &quot;User&quot; requires removing them from the group."
458
- onclick={() => closeDrawer?.()}
459
- >
460
- Set by instance group
461
- </a>
462
- {/if}
463
- </div>
464
- </Cell>
465
- <Cell last>
466
- <div class="flex items-center justify-end">
467
- <div bind:this={editWrappers[email]} class="w-0 h-0 overflow-hidden">
468
- <InstanceNameEditor
469
- {login_type}
470
- value={name}
471
- {username}
472
- {email}
473
- on:refresh={() => {
474
- listUsers(activeOnly)
475
- }}
476
- on:save={(e) => {
477
- updateName(e.detail, email)
478
- }}
479
- on:renamed={() => {
480
- listUsers(activeOnly)
481
- }}
482
- {automateUsernameCreation}
483
- />
484
- </div>
485
- <DropdownV2
486
- items={[
487
- {
488
- displayName: 'Edit',
489
- icon: Pencil,
490
- action: () => {
491
- const btn = editWrappers[email]?.querySelector(
492
- '[aria-label="Popup button"]'
493
- )
494
- if (btn instanceof HTMLElement) btn.click()
495
- }
496
- },
497
- {
498
- displayName: disabled ? 'Enable' : 'Disable',
499
- icon: disabled ? CheckCircle2 : Ban,
500
- action: () => {
501
- if (!disabled) {
502
- disableUserEmail = email
503
- disableConfirmedCallback = async () => {
504
- try {
505
- await UserService.globalUserUpdate({
506
- email,
507
- requestBody: { disabled: true }
508
- })
509
- sendUserToast('User disabled')
510
- listUsers(activeOnly)
511
- } catch (e) {
512
- sendUserToast('Failed to disable user', true)
427
+ if (role === 'super_admin') {
428
+ await UserService.globalUserUpdate({
429
+ email,
430
+ requestBody: {
431
+ is_super_admin: true,
432
+ is_devops: false
513
433
  }
514
- }
515
- } else {
516
- UserService.globalUserUpdate({
434
+ })
435
+ }
436
+ if (role === 'devops') {
437
+ await UserService.globalUserUpdate({
517
438
  email,
518
- requestBody: { disabled: false }
439
+ requestBody: {
440
+ is_super_admin: false,
441
+ is_devops: true
442
+ }
519
443
  })
520
- .then(() => {
521
- sendUserToast('User enabled')
522
- listUsers(activeOnly)
523
- })
524
- .catch(() => {
525
- sendUserToast('Failed to enable user', true)
526
- })
527
444
  }
528
- }
529
- },
530
- {
531
- displayName: 'Remove',
532
- icon: UserMinus,
533
- type: 'delete',
534
- action: () => {
535
- deleteUserEmail = email
536
- deleteConfirmedCallback = async () => {
537
- await UserService.globalUserDelete({
538
- email
445
+ if (role === 'user') {
446
+ await UserService.globalUserUpdate({
447
+ email,
448
+ requestBody: {
449
+ is_super_admin: false,
450
+ is_devops: false
451
+ }
539
452
  })
540
- sendUserToast(`User ${email} removed`)
541
- listUsers(activeOnly)
453
+ }
454
+ sendUserToast('User updated')
455
+ listUsers(activeOnly)
456
+ }}
457
+ >
458
+ {#snippet children({ item })}
459
+ <ToggleButton
460
+ value={'user'}
461
+ small
462
+ label="User"
463
+ disabled={role_source === 'instance_group' &&
464
+ (super_admin || devops)}
465
+ tooltip={role_source === 'instance_group' &&
466
+ (super_admin || devops)
467
+ ? 'Role is set by an instance group. Remove the user from the group to demote to "User".'
468
+ : undefined}
469
+ showTooltipIcon={role_source === 'instance_group' &&
470
+ (super_admin || devops)}
471
+ {item}
472
+ />
473
+ <ToggleButton
474
+ value={'devops'}
475
+ small
476
+ label="Devops"
477
+ tooltip="Devops is a role that grants visibilty similar to that of a super admin, but without giving all rights. For example devops users can see service logs and crtical alerts. You can think of it as a 'readonly' super admin"
478
+ {item}
479
+ />
480
+ <ToggleButton
481
+ value={'super_admin'}
482
+ small
483
+ label="Superadmin"
484
+ {item}
485
+ />
486
+ {/snippet}
487
+ </ToggleButtonGroup>
488
+ {/key}
489
+ {#if role_source === 'instance_group' && (super_admin || devops)}
490
+ <a
491
+ href="{base}/groups"
492
+ class="text-2xs text-tertiary mt-0.5 ml-1 hover:underline"
493
+ title="Role set by instance group. You can upgrade to a higher role manually, but demoting to &quot;User&quot; requires removing them from the group."
494
+ onclick={() => closeDrawer?.()}
495
+ >
496
+ Set by instance group
497
+ </a>
498
+ {/if}
499
+ </div>
500
+ </Cell>
501
+ <Cell last>
502
+ <div class="flex items-center justify-end">
503
+ <div
504
+ bind:this={editWrappers[email]}
505
+ class="w-0 h-0 overflow-hidden"
506
+ >
507
+ <InstanceNameEditor
508
+ {login_type}
509
+ value={name}
510
+ {username}
511
+ {email}
512
+ on:refresh={() => {
513
+ listUsers(activeOnly)
514
+ }}
515
+ on:save={(e) => {
516
+ updateName(e.detail, email)
517
+ }}
518
+ on:renamed={() => {
519
+ listUsers(activeOnly)
520
+ }}
521
+ {automateUsernameCreation}
522
+ />
523
+ </div>
524
+ <DropdownV2
525
+ items={[
526
+ {
527
+ displayName: 'Edit',
528
+ icon: Pencil,
529
+ action: () => {
530
+ const btn = editWrappers[email]?.querySelector(
531
+ '[aria-label="Popup button"]'
532
+ )
533
+ if (btn instanceof HTMLElement) btn.click()
534
+ }
535
+ },
536
+ {
537
+ displayName: disabled ? 'Enable' : 'Disable',
538
+ icon: disabled ? CheckCircle2 : Ban,
539
+ action: () => {
540
+ if (!disabled) {
541
+ disableUserEmail = email
542
+ disableConfirmedCallback = async () => {
543
+ try {
544
+ await UserService.globalUserUpdate({
545
+ email,
546
+ requestBody: { disabled: true }
547
+ })
548
+ sendUserToast('User disabled')
549
+ listUsers(activeOnly)
550
+ } catch (e) {
551
+ sendUserToast('Failed to disable user', true)
552
+ }
553
+ }
554
+ } else {
555
+ UserService.globalUserUpdate({
556
+ email,
557
+ requestBody: { disabled: false }
558
+ })
559
+ .then(() => {
560
+ sendUserToast('User enabled')
561
+ listUsers(activeOnly)
562
+ })
563
+ .catch(() => {
564
+ sendUserToast('Failed to enable user', true)
565
+ })
566
+ }
567
+ }
568
+ },
569
+ {
570
+ displayName: 'Reassign',
571
+ icon: ArrowRightLeft,
572
+ action: () => {
573
+ offboardingEmail = email
574
+ offboardingReassignOnly = true
575
+ }
576
+ },
577
+ {
578
+ displayName: 'Remove',
579
+ icon: UserMinus,
580
+ type: 'delete',
581
+ action: () => {
582
+ offboardingEmail = email
583
+ offboardingReassignOnly = false
542
584
  }
543
585
  }
544
- }
545
- ]}
546
- />
547
- </div>
548
- </Cell>
549
- </tr>
550
- {/each}
551
- {/if}
552
- </tbody>
553
- </DataTable>
554
- </div>
586
+ ]}
587
+ />
588
+ </div>
589
+ </Cell>
590
+ </tr>
591
+ {/each}
592
+ {/if}
593
+ </tbody>
594
+ </DataTable>
595
+ </div>
596
+ {:else if usersSubTab === 'ext_jwt'}
597
+ <ExternalJwtTokens
598
+ tokens={extJwtTokens}
599
+ hasMore={extJwtHasMore}
600
+ loading={extJwtLoading}
601
+ activeOnly={extJwtActiveOnly}
602
+ onLoadMore={() =>
603
+ loadExtJwtPage(Math.floor(extJwtTokens.length / extJwtPerPage) + 1)}
604
+ onActiveOnlyChange={(v) => {
605
+ extJwtActiveOnly = v
606
+ loadExtJwtPage(1)
607
+ }}
608
+ />
609
+ {/if}
555
610
  </div>
556
611
  {:else}
557
612
  <InstanceSettings
@@ -576,28 +631,20 @@ onDestroy(() => {
576
631
  </div>
577
632
  </div>
578
633
  </div>
579
- <ConfirmationModal
580
- open={Boolean(deleteConfirmedCallback)}
581
- title="Remove user"
582
- confirmationText="Remove"
583
- on:canceled={() => {
584
- deleteConfirmedCallback = undefined
585
- }}
586
- on:confirmed={() => {
587
- if (deleteConfirmedCallback) {
588
- deleteConfirmedCallback()
589
- }
590
- deleteConfirmedCallback = undefined
591
- }}
592
- >
593
- <div class="flex flex-col w-full space-y-4">
594
- <span
595
- >Are you sure you want to remove <b>{deleteUserEmail}</b>? They will be removed from all
596
- workspaces and instance groups, and all their sessions and tokens will be revoked. This action
597
- is irreversible. Their workspace content (scripts, flows, apps) will not be deleted.</span
598
- >
599
- </div>
600
- </ConfirmationModal>
634
+ {#if offboardingEmail}
635
+ <GlobalUserOffboardingModal
636
+ open={offboardingEmail != null}
637
+ email={offboardingEmail}
638
+ reassignOnly={offboardingReassignOnly}
639
+ onClose={() => {
640
+ offboardingEmail = undefined
641
+ }}
642
+ onComplete={() => {
643
+ offboardingEmail = undefined
644
+ listUsers(activeOnly)
645
+ }}
646
+ />
647
+ {/if}
601
648
  <ConfirmationModal
602
649
  open={Boolean(disableConfirmedCallback)}
603
650
  title="Disable user"