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
@@ -12,7 +12,7 @@ import { deepEqual } from 'fast-equals';
12
12
  import { inputBaseClass, inputBorderClass, inputSizeClasses } from '../text_input/TextInput.svelte';
13
13
  import { ButtonType } from '../common/button/model';
14
14
  import Tooltip from '../Tooltip.svelte';
15
- let { items, placeholder = 'Please select', value = $bindable(), filterText = $bindable(''), class: className = '', clearable = false, listAutoWidth = true, disabled: _disabled = false, containerStyle = '', inputClass = '', disablePortal = false, loading = false, error = false, autofocus, RightIcon, createText, noItemsMsg, tooltip, open = $bindable(false), id, itemLabelWrapperClasses, itemButtonWrapperClasses, size = 'md', showPlaceholderOnOpen = false, transformInputSelectedText, groupBy, sortBy, onFocus, onBlur, onClear, onCreateItem, startSnippet, endSnippet, bottomSnippet } = $props();
15
+ let { items, placeholder = 'Please select', value = $bindable(), filterText = $bindable(''), class: className = '', clearable = false, listAutoWidth = true, disabled: _disabled = false, containerStyle = '', inputClass = '', disablePortal = false, loading = false, error = false, autofocus, RightIcon, createText, noItemsMsg, tooltip, open = $bindable(false), id, itemLabelWrapperClasses, itemButtonWrapperClasses, size = 'md', showPlaceholderOnOpen = false, dropdownClass, transformInputSelectedText, groupBy, sortBy, onFocus, onBlur, onClear, onCreateItem, startSnippet, endSnippet, bottomSnippet } = $props();
16
16
  let disabled = $derived(_disabled || (loading && !value));
17
17
  let iconSize = $derived(ButtonType.UnifiedIconSizes[size]);
18
18
  let inputEl = $state();
@@ -120,6 +120,7 @@ let inputText = $derived.by(() => {
120
120
  {id}
121
121
  />
122
122
  <SelectDropdown
123
+ class={dropdownClass}
123
124
  {disablePortal}
124
125
  onSelectValue={setValue}
125
126
  {open}
@@ -31,6 +31,7 @@ declare function $$render<Item extends {
31
31
  itemButtonWrapperClasses?: string;
32
32
  size?: "sm" | "md" | "lg";
33
33
  showPlaceholderOnOpen?: boolean;
34
+ dropdownClass?: string;
34
35
  transformInputSelectedText?: (text: string, value: Item["value"]) => string;
35
36
  groupBy?: (item: Item) => string;
36
37
  sortBy?: (a: Item, b: Item) => number;
@@ -9,13 +9,15 @@ import ScopeSelector from './ScopeSelector.svelte';
9
9
  import McpScopeSelector from '../mcp/McpScopeSelector.svelte';
10
10
  import TextInput from '../text_input/TextInput.svelte';
11
11
  import Select from '../select/Select.svelte';
12
- let { showMcpMode = false, defaultNewTokenWorkspace, scopes, onTokenCreated, newTokenLabel = $bindable(undefined), displayCreateToken = true } = $props();
12
+ let { showMcpMode = false, openWithMcpMode = false, mcpOnly = false, lockWorkspace = false, title = 'Add a new token', defaultNewTokenWorkspace, scopes, onTokenCreated, newTokenLabel = $bindable(undefined), displayCreateToken = true } = $props();
13
13
  let newToken = $state(undefined);
14
14
  let newMcpToken = $state(undefined);
15
15
  let newTokenExpiration = $state(undefined);
16
16
  let newTokenWorkspace = $state(untrack(() => defaultNewTokenWorkspace));
17
17
  let mcpCreationMode = $state(false);
18
18
  let mcpScope = $state('mcp:favorites');
19
+ let lastRequestedMcpMode = $state(undefined);
20
+ let mcpLabelAutofilled = $state(false);
19
21
  let customScopes = $state([]);
20
22
  let showCustomScopes = $state(false);
21
23
  function ensureCurrentWorkspaceIncluded(workspacesList, currentWorkspace) {
@@ -28,6 +30,30 @@ function ensureCurrentWorkspaceIncluded(workspacesList, currentWorkspace) {
28
30
  }
29
31
  return [{ id: currentWorkspace, name: currentWorkspace }, ...workspacesList];
30
32
  }
33
+ function enterMcpMode() {
34
+ mcpCreationMode = true;
35
+ newTokenExpiration = undefined;
36
+ newTokenWorkspace = defaultNewTokenWorkspace ?? $workspaceStore;
37
+ newToken = undefined;
38
+ newMcpToken = undefined;
39
+ if (!newTokenLabel) {
40
+ newTokenLabel = 'MCP token';
41
+ mcpLabelAutofilled = true;
42
+ }
43
+ else {
44
+ mcpLabelAutofilled = false;
45
+ }
46
+ }
47
+ function exitMcpMode() {
48
+ mcpCreationMode = false;
49
+ newTokenExpiration = undefined;
50
+ newTokenWorkspace = defaultNewTokenWorkspace;
51
+ newMcpToken = undefined;
52
+ if (mcpLabelAutofilled) {
53
+ newTokenLabel = undefined;
54
+ }
55
+ mcpLabelAutofilled = false;
56
+ }
31
57
  async function createToken(mcpMode = false) {
32
58
  try {
33
59
  let date;
@@ -50,13 +76,17 @@ async function createToken(mcpMode = false) {
50
76
  }
51
77
  });
52
78
  if (mcpMode) {
79
+ newToken = undefined;
53
80
  newMcpToken = `${createdToken}`;
54
81
  }
55
82
  else {
83
+ newMcpToken = undefined;
56
84
  newToken = `${createdToken}`;
57
85
  }
58
- onTokenCreated(newToken ?? newMcpToken ?? '');
59
- mcpCreationMode = false;
86
+ onTokenCreated(`${createdToken}`);
87
+ if (!mcpOnly) {
88
+ mcpCreationMode = false;
89
+ }
60
90
  }
61
91
  catch (err) {
62
92
  console.error('Failed to create token:', err);
@@ -64,13 +94,31 @@ async function createToken(mcpMode = false) {
64
94
  }
65
95
  const workspaces = $derived(ensureCurrentWorkspaceIncluded($userWorkspaces, $workspaceStore));
66
96
  const mcpBaseUrl = $derived(`${window.location.origin}/api/mcp/w/${newTokenWorkspace}/mcp?token=`);
97
+ $effect(() => {
98
+ const requestedMcpMode = mcpOnly || openWithMcpMode;
99
+ if (requestedMcpMode === lastRequestedMcpMode) {
100
+ return;
101
+ }
102
+ if (requestedMcpMode) {
103
+ enterMcpMode();
104
+ }
105
+ else {
106
+ exitMcpMode();
107
+ }
108
+ lastRequestedMcpMode = requestedMcpMode;
109
+ });
110
+ $effect(() => {
111
+ if (mcpLabelAutofilled && newTokenLabel !== 'MCP token') {
112
+ mcpLabelAutofilled = false;
113
+ }
114
+ });
67
115
  </script>
68
116
 
69
117
  <div>
70
118
  <div class="p-4 rounded-md mb-6 min-w-min bg-surface-tertiary">
71
- <h3 class="pb-2 font-semibold text-emphasis text-sm">Add a new token</h3>
119
+ <h3 class="pb-2 font-semibold text-emphasis text-sm">{title}</h3>
72
120
 
73
- {#if showMcpMode}
121
+ {#if showMcpMode && !mcpOnly}
74
122
  <div
75
123
  class="mb-4 flex flex-row flex-shrink-0"
76
124
  use:triggerableByAI={{
@@ -80,15 +128,10 @@ const mcpBaseUrl = $derived(`${window.location.origin}/api/mcp/w/${newTokenWorks
80
128
  >
81
129
  <Toggle
82
130
  on:change={(e) => {
83
- mcpCreationMode = e.detail
84
131
  if (e.detail) {
85
- newTokenLabel = 'MCP token'
86
- newTokenExpiration = undefined
87
- newTokenWorkspace = $workspaceStore
132
+ enterMcpMode()
88
133
  } else {
89
- newTokenLabel = undefined
90
- newTokenExpiration = undefined
91
- newTokenWorkspace = defaultNewTokenWorkspace
134
+ exitMcpMode()
92
135
  }
93
136
  }}
94
137
  checked={mcpCreationMode}
@@ -133,70 +176,76 @@ const mcpBaseUrl = $derived(`${window.location.origin}/api/mcp/w/${newTokenWorks
133
176
  {/if}
134
177
 
135
178
  <div class="mt-2 grid grid-cols-1 md:grid-cols-2 gap-4">
136
- {#if mcpCreationMode}
137
- <div class="col-span-2">
138
- <McpScopeSelector
139
- workspaceId={newTokenWorkspace || $workspaceStore || ''}
140
- bind:scope={mcpScope}
141
- />
142
- </div>
179
+ {#if mcpCreationMode}
180
+ <div class="col-span-2">
181
+ <McpScopeSelector
182
+ workspaceId={newTokenWorkspace || $workspaceStore || ''}
183
+ bind:scope={mcpScope}
184
+ />
185
+ </div>
143
186
 
144
- <div>
145
- <span class="block mb-1 text-emphasis text-xs font-semibold">Workspace</span>
146
- <Select
147
- bind:value={newTokenWorkspace}
148
- items={workspaces.map((w) => ({ label: w.name, value: w.id, subtitle: w.id }))}
149
- />
150
- </div>
151
- {/if}
187
+ {#if !lockWorkspace}
188
+ <div>
189
+ <span class="block mb-1 text-emphasis text-xs font-semibold">Workspace</span>
190
+ <Select
191
+ bind:value={newTokenWorkspace}
192
+ items={workspaces.map((w) => ({ label: w.name, value: w.id, subtitle: w.id }))}
193
+ />
194
+ </div>
195
+ {/if}
196
+ {/if}
152
197
 
153
- <div>
154
- <span class="block mb-1 text-emphasis text-xs font-semibold"
155
- >Label <span class="text-xs text-primary">(optional)</span></span
156
- >
157
- <TextInput inputProps={{ type: 'text' }} bind:value={newTokenLabel} class="w-full" />
158
- </div>
198
+ {#if !mcpOnly}
199
+ <div>
200
+ <span class="block mb-1 text-emphasis text-xs font-semibold"
201
+ >Label <span class="text-xs text-primary">(optional)</span></span
202
+ >
203
+ <TextInput inputProps={{ type: 'text' }} bind:value={newTokenLabel} class="w-full" />
204
+ </div>
205
+ {/if}
159
206
 
160
- {#if !mcpCreationMode}
161
- <div>
162
- <span class="block mb-1 text-xs text-emphasis font-semibold"
163
- >Expires In <span class="text-xs text-primary">(optional)</span></span
164
- >
165
- <Select
166
- bind:value={newTokenExpiration}
167
- placeholder="No expiration"
168
- inputClass="w-full"
169
- items={[
170
- { label: 'No expiration', value: undefined },
171
- { label: '15 minutes', value: 15 * 60 },
172
- { label: '30 minutes', value: 30 * 60 },
173
- { label: '1 hour', value: 1 * 60 * 60 },
174
- { label: '1 day', value: 1 * 24 * 60 * 60 },
175
- { label: '7 days', value: 7 * 24 * 60 * 60 },
176
- { label: '30 days', value: 30 * 24 * 60 * 60 },
177
- { label: '90 days', value: 90 * 24 * 60 * 60 }
178
- ]}
179
- />
180
- </div>
181
- {/if}
207
+ {#if !mcpCreationMode}
208
+ <div>
209
+ <span class="block mb-1 text-xs text-emphasis font-semibold"
210
+ >Expires In <span class="text-xs text-primary">(optional)</span></span
211
+ >
212
+ <Select
213
+ bind:value={newTokenExpiration}
214
+ placeholder="No expiration"
215
+ inputClass="w-full"
216
+ items={[
217
+ { label: 'No expiration', value: undefined },
218
+ { label: '15 minutes', value: 15 * 60 },
219
+ { label: '30 minutes', value: 30 * 60 },
220
+ { label: '1 hour', value: 1 * 60 * 60 },
221
+ { label: '1 day', value: 1 * 24 * 60 * 60 },
222
+ { label: '7 days', value: 7 * 24 * 60 * 60 },
223
+ { label: '30 days', value: 30 * 24 * 60 * 60 },
224
+ { label: '90 days', value: 90 * 24 * 60 * 60 }
225
+ ]}
226
+ />
227
+ </div>
228
+ {/if}
182
229
  </div>
183
230
 
184
231
  <div class="mt-4 flex justify-end gap-2 flex-row">
185
- <Button
186
- on:click={() => {
187
- mcpCreationMode = false
188
- }}
189
- variant="default"
190
- >
191
- Cancel
192
- </Button>
232
+ {#if !mcpOnly}
233
+ <Button
234
+ on:click={() => {
235
+ exitMcpMode()
236
+ }}
237
+ variant="default"
238
+ >
239
+ Cancel
240
+ </Button>
241
+ {/if}
193
242
  <Button
194
243
  on:click={() => createToken(mcpCreationMode)}
195
244
  disabled={mcpCreationMode &&
196
245
  (newTokenWorkspace == undefined || !mcpScope || mcpScope.trim().length === 0)}
197
246
  variant="accent"
198
247
  >
199
- New token
248
+ {mcpCreationMode ? 'Generate MCP URL' : 'New token'}
200
249
  </Button>
201
250
  </div>
202
251
  </div>
@@ -1,6 +1,9 @@
1
1
  interface Props {
2
2
  showMcpMode?: boolean;
3
3
  openWithMcpMode?: boolean;
4
+ mcpOnly?: boolean;
5
+ lockWorkspace?: boolean;
6
+ title?: string;
4
7
  newTokenLabel?: string;
5
8
  defaultNewTokenWorkspace?: string;
6
9
  scopes?: string[];
@@ -19,10 +19,14 @@ import SearchItems from '../SearchItems.svelte';
19
19
  import Cell from '../table/Cell.svelte';
20
20
  import Row from '../table/Row.svelte';
21
21
  import ConfirmationModal from '../common/confirmationModal/ConfirmationModal.svelte';
22
+ import UserOffboardingModal from '../UserOffboardingModal.svelte';
22
23
  import { isCloudHosted } from '../../cloud';
23
24
  import { truncate } from '../../utils';
24
25
  import { onDestroy, untrack } from 'svelte';
25
26
  import { goto } from '../../navigation';
27
+ import { ArrowRightLeft } from 'lucide-svelte';
28
+ let offboardingUser = $state(undefined);
29
+ let offboardingReassignOnly = $state(false);
26
30
  let users = $state(undefined);
27
31
  let invites = $state([]);
28
32
  let filteredUsers = $state(undefined);
@@ -219,7 +223,6 @@ onDestroy(() => {
219
223
  console.warn(e);
220
224
  }
221
225
  });
222
- let deleteConfirmedCallback = $state(undefined);
223
226
  let removeInstanceGroupConfirmedCallback = $state(undefined);
224
227
  let convertConfirmedCallback = $state(undefined);
225
228
  // Auto-add/invite confirmation modal states
@@ -896,14 +899,8 @@ const isAdminsWorkspaceWithoutEE = $derived($workspaceStore === 'admins' && !$en
896
899
  destructive
897
900
  {disabled}
898
901
  onClick={() => {
899
- deleteConfirmedCallback = async () => {
900
- await UserService.deleteUser({
901
- workspace: $workspaceStore ?? '',
902
- username
903
- })
904
- sendUserToast('User removed')
905
- listUsers()
906
- }
902
+ offboardingUser = username
903
+ offboardingReassignOnly = false
907
904
  }}
908
905
  startIcon={{ icon: UserMinus }}
909
906
  >
@@ -932,7 +929,20 @@ const isAdminsWorkspaceWithoutEE = $derived($workspaceStore === 'admins' && !$en
932
929
  Convert
933
930
  </Button>
934
931
  {:else}
935
- {@render removeUserButton(false)}
932
+ <div class="flex items-center gap-1">
933
+ <Button
934
+ unifiedSize="sm"
935
+ variant="subtle"
936
+ onClick={() => {
937
+ offboardingUser = username
938
+ offboardingReassignOnly = true
939
+ }}
940
+ startIcon={{ icon: ArrowRightLeft }}
941
+ >
942
+ Reassign
943
+ </Button>
944
+ {@render removeUserButton(false)}
945
+ </div>
936
946
  {/if}
937
947
  </div>
938
948
  </Cell>
@@ -1073,24 +1083,20 @@ const isAdminsWorkspaceWithoutEE = $derived($workspaceStore === 'admins' && !$en
1073
1083
  {/if}
1074
1084
  </Section>
1075
1085
  {/if}
1076
- <ConfirmationModal
1077
- open={Boolean(deleteConfirmedCallback)}
1078
- title="Remove user"
1079
- confirmationText="Remove"
1080
- on:canceled={() => {
1081
- deleteConfirmedCallback = undefined
1082
- }}
1083
- on:confirmed={() => {
1084
- if (deleteConfirmedCallback) {
1085
- deleteConfirmedCallback()
1086
- }
1087
- deleteConfirmedCallback = undefined
1088
- }}
1089
- >
1090
- <div class="flex flex-col w-full space-y-4">
1091
- <span>Are you sure you want to remove ?</span>
1092
- </div>
1093
- </ConfirmationModal>
1086
+ {#if offboardingUser}
1087
+ <UserOffboardingModal
1088
+ open={offboardingUser != null}
1089
+ username={offboardingUser}
1090
+ reassignOnly={offboardingReassignOnly}
1091
+ onClose={() => {
1092
+ offboardingUser = undefined
1093
+ }}
1094
+ onComplete={() => {
1095
+ offboardingUser = undefined
1096
+ listUsers()
1097
+ }}
1098
+ />
1099
+ {/if}
1094
1100
 
1095
1101
  <div class="[&>div]:!z-[5002]">
1096
1102
  <ConfirmationModal
@@ -8,6 +8,7 @@ import DiscordIcon from '../icons/brands/Discord.svelte';
8
8
  import { WorkspaceService } from '../../gen';
9
9
  import { sendUserToast } from '../../toast';
10
10
  import { clearStores } from '../../storeUtils';
11
+ import Toggle from '../Toggle.svelte';
11
12
  import { goto } from '../../navigation';
12
13
  import ConfirmationModal from '../common/confirmationModal/ConfirmationModal.svelte';
13
14
  import { twMerge } from 'tailwind-merge';
@@ -30,8 +31,39 @@ async function leaveWorkspace() {
30
31
  clearStores();
31
32
  goto('/user/workspaces');
32
33
  }
34
+ let forkedDatatables = $state([]);
35
+ async function loadForkedDatatables() {
36
+ if (!$workspaceStore)
37
+ return;
38
+ try {
39
+ const settings = await WorkspaceService.getSettings({ workspace: $workspaceStore });
40
+ const datatables = settings.datatable?.datatables ?? {};
41
+ forkedDatatables = Object.entries(datatables)
42
+ .filter(([_, dt]) => dt.forked_from != null)
43
+ .map(([name, dt]) => ({
44
+ name,
45
+ resourceType: dt.database.resource_type ?? 'instance',
46
+ resourcePath: dt.database.resource_path ?? '',
47
+ dropOnDelete: true
48
+ }));
49
+ }
50
+ catch {
51
+ forkedDatatables = [];
52
+ }
53
+ }
33
54
  async function deleteFork() {
34
- await WorkspaceService.deleteWorkspace({ workspace: $workspaceStore ?? '' });
55
+ const workspace = $workspaceStore ?? '';
56
+ const dbsToDrop = forkedDatatables.filter((dt) => dt.dropOnDelete).map((dt) => dt.name);
57
+ if (dbsToDrop.length > 0) {
58
+ const errors = await WorkspaceService.dropForkedDatatableDatabases({
59
+ workspace,
60
+ requestBody: { datatable_names: dbsToDrop }
61
+ });
62
+ for (const err of errors) {
63
+ sendUserToast(err, true);
64
+ }
65
+ }
66
+ await WorkspaceService.deleteWorkspace({ workspace });
35
67
  sendUserToast('You deleted the workspace');
36
68
  clearStores();
37
69
  goto('/user/workspaces');
@@ -359,7 +391,8 @@ let secondaryMenuLinks = $derived([
359
391
  ? [
360
392
  {
361
393
  label: 'Delete Forked Workspace',
362
- action: () => {
394
+ action: async () => {
395
+ await loadForkedDatatables();
363
396
  deleteWorkspaceForkModal = true;
364
397
  },
365
398
  icon: Trash2,
@@ -675,6 +708,29 @@ let secondaryMenuLinks = $derived([
675
708
  >
676
709
  <div class="flex flex-col w-full space-y-4">
677
710
  <span>Are you sure you want to delete this workspace fork? (deleting {$workspaceStore})</span>
711
+ {#if forkedDatatables.length > 0}
712
+ <div class="border rounded-md divide-y">
713
+ <div class="px-4 py-2 text-xs font-semibold text-secondary"> Forked databases </div>
714
+ {#each forkedDatatables as dt}
715
+ <div class="flex items-center justify-between px-4 py-2">
716
+ <div class="flex flex-col">
717
+ <span class="text-xs font-medium text-secondary">{dt.name}</span>
718
+ <span class="text-3xs text-hint">
719
+ {dt.resourceType === 'instance'
720
+ ? dt.resourcePath
721
+ : `${$workspaceStore?.replace(/-/g, '_')}__${dt.name}`}
722
+ </span>
723
+ </div>
724
+ <Toggle
725
+ class="shrink-0"
726
+ size="xs"
727
+ bind:checked={dt.dropOnDelete}
728
+ options={{ right: 'Drop database' }}
729
+ />
730
+ </div>
731
+ {/each}
732
+ </div>
733
+ {/if}
678
734
  </div>
679
735
  </ConfirmationModal>
680
736
  {/if}
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { isPremiumStore, superadmin, userStore, userWorkspaces, workspaceStore, workspaceUsageStore, workspaceColor, clearWorkspaceFromStorage } from '../../stores';
1
+ <script lang="ts">import { isPremiumStore, superadmin, userStore, userWorkspaces, workspaceStore, workspaceUsageStore, workspaceColor, clearWorkspaceFromStorage, globalForkModal } from '../../stores';
2
2
  import { isRuleActive } from '../../workspaceProtectionRules.svelte';
3
3
  import { Building, Plus, Settings, GitFork } from 'lucide-svelte';
4
4
  import MenuButton from './MenuButton.svelte';
@@ -63,7 +63,7 @@ const groupedWorkspaces = $derived.by(() => {
63
63
  return [];
64
64
  return buildWorkspaceHierarchy($userWorkspaces);
65
65
  });
66
- const itemClass = 'text-primary flex flex-row gap-2 px-4 py-2 text-xs hover:bg-surface-hover hover:text-primary data-[highlighted]:bg-surface-hover data-[highlighted]:text-primary';
66
+ const itemClass = 'text-primary w-full flex flex-row gap-2 px-4 py-2 text-xs hover:bg-surface-hover hover:text-primary data-[highlighted]:bg-surface-hover data-[highlighted]:text-primary';
67
67
  </script>
68
68
 
69
69
  <Menu {createMenu} usePointerDownOutside>
@@ -155,9 +155,13 @@ const itemClass = 'text-primary flex flex-row gap-2 px-4 py-2 text-xs hover:bg-s
155
155
  </MenuItem>
156
156
  </div>
157
157
  {/if}
158
- {#if !strictWorkspaceSelect && !isCloudHosted() && !isRuleActive('DisableWorkspaceForking')}
158
+ {#if !strictWorkspaceSelect && !isCloudHosted() && !isRuleActive('DisableWorkspaceForking') && $workspaceStore !== 'admins'}
159
159
  <div class="py-1" role="none">
160
- <MenuItem href="{base}/user/fork_workspace" class={itemClass} {item}>
160
+ <MenuItem
161
+ class={itemClass}
162
+ {item}
163
+ onClick={() => (globalForkModal.val = { opened: true })}
164
+ >
161
165
  <GitFork size={16} />
162
166
  Fork current workspace
163
167
  </MenuItem>
@@ -10,14 +10,19 @@ let dropdown;
10
10
  const cloudHosted = isCloudHosted();
11
11
  let nextcloudAvailable = $state(false);
12
12
  let googleAvailable = $state(false);
13
+ let githubAvailable = $state(false);
13
14
  async function setNextcloudState() {
14
15
  nextcloudAvailable = await isServiceAvailable('nextcloud', $workspaceStore);
15
16
  }
16
17
  async function setGoogleState() {
17
18
  googleAvailable = await isServiceAvailable('google', $workspaceStore);
18
19
  }
20
+ async function setGithubState() {
21
+ githubAvailable = await isServiceAvailable('github', $workspaceStore);
22
+ }
19
23
  setNextcloudState();
20
24
  setGoogleState();
25
+ setGithubState();
21
26
  const addTriggerItems = $derived([
22
27
  {
23
28
  displayName: 'Schedule',
@@ -93,6 +98,12 @@ const addTriggerItems = $derived([
93
98
  action: () => onAddDraftTrigger?.('google'),
94
99
  icon: triggerIconMap.google,
95
100
  hidden: !googleAvailable
101
+ },
102
+ {
103
+ displayName: 'GitHub',
104
+ action: () => onAddDraftTrigger?.('github'),
105
+ icon: triggerIconMap.github,
106
+ hidden: !githubAvailable
96
107
  }
97
108
  ].filter((item) => !item.hidden));
98
109
  let triggersButtonWidth = $state(0);
@@ -1,11 +1,34 @@
1
1
  <script lang="ts">import OnBehalfOfSelector, {} from '../OnBehalfOfSelector.svelte';
2
+ import { useFolderDefaultPermissionedAs } from '../useFolderDefaultPermissionedAs.svelte';
2
3
  import { userStore, workspaceStore } from '../../stores';
3
4
  import { AlertTriangle } from 'lucide-svelte';
4
- let { permissionedAs, onPermissionedAsChange } = $props();
5
+ let { permissionedAs, onPermissionedAsChange, path = undefined } = $props();
5
6
  const canPreserve = $derived($userStore?.is_admin || ($userStore?.groups ?? []).includes('wm_deployers'));
6
7
  const myPermissionedAs = $derived($userStore?.username ? `u/${$userStore.username}` : undefined);
8
+ const folderDefault = useFolderDefaultPermissionedAs(() => path);
7
9
  let onBehalfOfChoice = $state(undefined);
8
10
  let customPermissionedAs = $state(undefined);
11
+ let userHasSelected = $state(false);
12
+ // Full reset when permissionedAs changes (e.g. switching between edit/create).
13
+ $effect(() => {
14
+ permissionedAs;
15
+ userHasSelected = false;
16
+ customPermissionedAs = undefined;
17
+ onBehalfOfChoice = undefined;
18
+ });
19
+ // On creation with no folder default, default to "me". When the folder default
20
+ // loads async, transition to undefined so OnBehalfOfSelector's auto-select applies
21
+ // the folder default. Skip if the user has already made an explicit selection.
22
+ $effect(() => {
23
+ if (userHasSelected)
24
+ return;
25
+ if (permissionedAs === undefined && !folderDefault.value) {
26
+ onBehalfOfChoice = 'me';
27
+ }
28
+ else {
29
+ onBehalfOfChoice = undefined;
30
+ }
31
+ });
9
32
  const effectivePermissionedAs = $derived.by(() => {
10
33
  if (onBehalfOfChoice === 'target')
11
34
  return permissionedAs;
@@ -16,7 +39,17 @@ const effectivePermissionedAs = $derived.by(() => {
16
39
  const willChange = $derived(permissionedAs !== undefined &&
17
40
  effectivePermissionedAs !== undefined &&
18
41
  permissionedAs !== effectivePermissionedAs);
42
+ const shouldRender = $derived(!!$workspaceStore && (permissionedAs !== undefined || canPreserve));
43
+ // For non-admin users editing a trigger owned by someone else: signal that
44
+ // permissioned_as will change to the current user (backend ignores preserve for non-admins).
45
+ // Only fires when there's an actual change (DB value differs from current user).
46
+ $effect(() => {
47
+ if (!canPreserve && permissionedAs !== undefined && permissionedAs !== myPermissionedAs) {
48
+ onPermissionedAsChange(undefined, false);
49
+ }
50
+ });
19
51
  function handleSelect(choice, details) {
52
+ userHasSelected = true;
20
53
  onBehalfOfChoice = choice;
21
54
  if (choice === 'target') {
22
55
  customPermissionedAs = undefined;
@@ -33,7 +66,7 @@ function handleSelect(choice, details) {
33
66
  }
34
67
  </script>
35
68
 
36
- {#if permissionedAs && $workspaceStore}
69
+ {#if shouldRender && $workspaceStore}
37
70
  <div class="flex items-center gap-1.5 text-2xs text-tertiary mb-4">
38
71
  <span>Permissioned as</span>
39
72
  {#if canPreserve}
@@ -46,6 +79,7 @@ function handleSelect(choice, details) {
46
79
  {canPreserve}
47
80
  customValue={customPermissionedAs}
48
81
  isDeployment={false}
82
+ folderDefault={folderDefault.value}
49
83
  />
50
84
  {#if willChange}
51
85
  <AlertTriangle class="w-3.5 h-3.5 text-yellow-500" />
@@ -53,7 +87,7 @@ function handleSelect(choice, details) {
53
87
  >will change from <strong>{permissionedAs}</strong> on save</span
54
88
  >
55
89
  {/if}
56
- {:else}
90
+ {:else if permissionedAs}
57
91
  <strong class="text-secondary">{permissionedAs}</strong>
58
92
  {#if willChange}
59
93
  <AlertTriangle class="w-3.5 h-3.5 text-yellow-500" />
@@ -3,6 +3,12 @@ interface Props {
3
3
  permissionedAs: string | undefined;
4
4
  /** Callback when user changes the permissioned_as selection */
5
5
  onPermissionedAsChange: (permissionedAs: string | undefined, preserve: boolean) => void;
6
+ /**
7
+ * Item path (e.g. `f/prod/my_trigger`). When provided and the user is an
8
+ * admin/wm_deployers member, the component fetches the parent folder's
9
+ * `default_permissioned_as` rules and preselects the matching default.
10
+ */
11
+ path?: string | undefined;
6
12
  }
7
13
  declare const PermissionedAsLine: import("svelte").Component<Props, {}, "">;
8
14
  type PermissionedAsLine = ReturnType<typeof PermissionedAsLine>;
@@ -54,7 +54,8 @@ async function deleteDeployedTrigger(triggerIndex) {
54
54
  };
55
55
  const nativeTriggerServices = {
56
56
  nextcloud: 'nextcloud',
57
- google: 'google'
57
+ google: 'google',
58
+ github: 'github'
58
59
  };
59
60
  const deleteHandler = deleteHandlers[triggerType];
60
61
  const nativeServiceName = nativeTriggerServices[triggerType];
@@ -143,6 +144,9 @@ async function handleUpdate(trigger, path) {
143
144
  else if (triggerType === 'google') {
144
145
  await triggersState.fetchNativeTriggers(triggersCount, 'google', $workspaceStore, currentPath, isFlow, $userStore);
145
146
  }
147
+ else if (triggerType === 'github') {
148
+ await triggersState.fetchNativeTriggers(triggersCount, 'github', $workspaceStore, currentPath, isFlow, $userStore);
149
+ }
146
150
  triggersState.selectedTriggerIndex = triggersState.triggers.findIndex((t) => t.path === path && t.type === triggerType);
147
151
  loading = false;
148
152
  onDeployTrigger?.({ type: triggerType, id: triggerId, path: triggerPath });
@@ -155,6 +155,16 @@ $effect(() => {
155
155
  {customLabel}
156
156
  {...props}
157
157
  />
158
+ {:else if selectedTrigger.type === 'github'}
159
+ <NativeTriggersPanel
160
+ service="github"
161
+ {isFlow}
162
+ path={initialPath || fakeInitialPath}
163
+ {selectedTrigger}
164
+ defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
165
+ {customLabel}
166
+ {...props}
167
+ />
158
168
  {:else if selectedTrigger.type === 'cli'}
159
169
  <div class="py-1 flex flex-col gap-6">
160
170
  <ClipboardPanel content={selectedTrigger.extra?.cliCommand ?? ''} />