windmill-components 1.677.1 → 1.695.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 (552) hide show
  1. package/package/components/AppConnectInner.svelte +6 -0
  2. package/package/components/ArgInput.svelte +2 -0
  3. package/package/components/AutoscalingConfigEditor.svelte +18 -4
  4. package/package/components/CiTestResults.svelte +64 -0
  5. package/package/components/CiTestResults.svelte.d.ts +7 -0
  6. package/package/components/CompareWorkspaces.svelte +741 -484
  7. package/package/components/DBManager.svelte +35 -4
  8. package/package/components/DBManager.svelte.d.ts +2 -0
  9. package/package/components/DBManagerContent.svelte +3 -1
  10. package/package/components/DBManagerContent.svelte.d.ts +3 -0
  11. package/package/components/DBManagerDrawer.svelte +145 -3
  12. package/package/components/DBTableEditor.svelte +14 -4
  13. package/package/components/DatatablePicker.svelte +2 -5
  14. package/package/components/DatatableSchemaDiff.svelte +531 -0
  15. package/package/components/DatatableSchemaDiff.svelte.d.ts +29 -0
  16. package/package/components/DedicatedWorkersSelector.svelte +4 -2
  17. package/package/components/DefaultTagsInner.svelte +42 -2
  18. package/package/components/DeployWorkspaceDrawer.svelte +1 -1
  19. package/package/components/Dev.svelte +407 -74
  20. package/package/components/EditableSchemaForm.svelte +4 -0
  21. package/package/components/Editor.svelte +1 -1
  22. package/package/components/EditorBar.svelte +1 -1
  23. package/package/components/EditorBar.svelte.d.ts +1 -1
  24. package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
  25. package/package/components/FlowPreviewContent.svelte +32 -30
  26. package/package/components/FlowRestartButton.svelte +143 -61
  27. package/package/components/FlowRestartButton.svelte.d.ts +37 -0
  28. package/package/components/FlowStatusViewer.svelte +15 -1
  29. package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
  30. package/package/components/FlowStatusViewerInner.svelte +270 -222
  31. package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
  32. package/package/components/FlowTimeline.svelte +1 -1
  33. package/package/components/FolderEditor.svelte +189 -4
  34. package/package/components/ForkConflictModal.svelte +57 -0
  35. package/package/components/ForkConflictModal.svelte.d.ts +3 -0
  36. package/package/components/ForkWorkspaceBanner.svelte +82 -11
  37. package/package/components/GitRepoViewer.svelte +251 -97
  38. package/package/components/GlobalUserOffboardingModal.svelte +293 -0
  39. package/package/components/GlobalUserOffboardingModal.svelte.d.ts +10 -0
  40. package/package/components/InputTransformSchemaForm.svelte +1 -1
  41. package/package/components/InstanceSettings.svelte +58 -19
  42. package/package/components/Login.svelte +133 -36
  43. package/package/components/Login.svelte.d.ts +1 -0
  44. package/package/components/ModuleTest.svelte +2 -1
  45. package/package/components/NoMainFuncBadge.svelte +1 -1
  46. package/package/components/OffboardItemsBox.svelte +56 -0
  47. package/package/components/OffboardItemsBox.svelte.d.ts +12 -0
  48. package/package/components/OffboardReassignControls.svelte +47 -0
  49. package/package/components/OffboardReassignControls.svelte.d.ts +20 -0
  50. package/package/components/OffboardWorkspaceSection.svelte +110 -0
  51. package/package/components/OffboardWorkspaceSection.svelte.d.ts +24 -0
  52. package/package/components/OnBehalfOfSelector.svelte +21 -3
  53. package/package/components/OnBehalfOfSelector.svelte.d.ts +7 -0
  54. package/package/components/Path.svelte +7 -1
  55. package/package/components/Path.svelte.d.ts +1 -1
  56. package/package/components/QueueAlerts.svelte +10 -10
  57. package/package/components/ResourcePicker.svelte +2 -2
  58. package/package/components/RunsPage.svelte +2 -1
  59. package/package/components/S3FilePickerInner.svelte +89 -89
  60. package/package/components/ScriptBuilder.svelte +52 -11
  61. package/package/components/ScriptEditor.svelte +19 -8
  62. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  63. package/package/components/ShareModal.svelte +236 -98
  64. package/package/components/ShareModal.svelte.d.ts +1 -1
  65. package/package/components/SuperadminSettingsInner.svelte +362 -315
  66. package/package/components/UserOffboardingModal.svelte +238 -0
  67. package/package/components/UserOffboardingModal.svelte.d.ts +10 -0
  68. package/package/components/WorkspaceDeployLayout.svelte +3 -3
  69. package/package/components/WorkspaceDeployLayout.svelte.d.ts +1 -0
  70. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
  71. package/package/components/apps/components/helpers/executeRunnable.js +2 -1
  72. package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
  73. package/package/components/apps/editor/appPolicy.js +2 -1
  74. package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
  75. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
  76. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
  77. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +4 -2
  78. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
  79. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
  80. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +12 -0
  81. package/package/components/apps/inputType.d.ts +1 -0
  82. package/package/components/apps/sharedTypes.d.ts +1 -0
  83. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  84. package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
  85. package/package/components/common/confirmationModal/ConfirmationModal.svelte +1 -1
  86. package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
  87. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
  88. package/package/components/common/table/AppRow.svelte +3 -3
  89. package/package/components/common/table/FlowRow.svelte +3 -3
  90. package/package/components/common/table/RawAppRow.svelte +4 -4
  91. package/package/components/common/table/Row.svelte +6 -2
  92. package/package/components/common/table/ScriptRow.svelte +11 -3
  93. package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
  94. package/package/components/copilot/chat/AIChatInput.svelte +56 -47
  95. package/package/components/copilot/chat/AIChatManager.svelte.js +50 -48
  96. package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
  97. package/package/components/copilot/chat/anthropic.d.ts +7 -1
  98. package/package/components/copilot/chat/anthropic.js +5 -2
  99. package/package/components/copilot/chat/app/core.d.ts +12 -20
  100. package/package/components/copilot/chat/app/core.js +230 -159
  101. package/package/components/copilot/chat/app/core.test.js +417 -0
  102. package/package/components/copilot/chat/chatLoop.d.ts +3 -0
  103. package/package/components/copilot/chat/chatLoop.js +13 -5
  104. package/package/components/copilot/chat/context.js +44 -0
  105. package/package/components/copilot/chat/flow/FlowAIChat.svelte +57 -76
  106. package/package/components/copilot/chat/flow/core.d.ts +14 -3
  107. package/package/components/copilot/chat/flow/core.js +494 -116
  108. package/package/components/copilot/chat/flow/helperUtils.d.ts +22 -0
  109. package/package/components/copilot/chat/flow/helperUtils.js +100 -0
  110. package/package/components/copilot/chat/flow/helperUtils.test.js +231 -0
  111. package/package/components/copilot/chat/flow/inlineScriptsUtils.d.ts +5 -24
  112. package/package/components/copilot/chat/flow/inlineScriptsUtils.js +30 -55
  113. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  114. package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
  115. package/package/components/copilot/chat/flow/utils.test.js +59 -0
  116. package/package/components/copilot/chat/openai-responses.d.ts +7 -1
  117. package/package/components/copilot/chat/openai-responses.js +5 -2
  118. package/package/components/copilot/chat/script/core.js +3 -0
  119. package/package/components/copilot/chat/shared.d.ts +7 -2
  120. package/package/components/copilot/chat/shared.js +116 -53
  121. package/package/components/copilot/chat/shared.test.d.ts +1 -0
  122. package/package/components/copilot/chat/shared.test.js +412 -0
  123. package/package/components/copilot/chat/tokenUsage.d.ts +23 -0
  124. package/package/components/copilot/chat/tokenUsage.js +42 -0
  125. package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
  126. package/package/components/copilot/chat/workspaceTools.js +239 -0
  127. package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
  128. package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
  129. package/package/components/copilot/lib.d.ts +5 -1
  130. package/package/components/copilot/lib.js +24 -6
  131. package/package/components/copilot/lib.test.d.ts +1 -0
  132. package/package/components/copilot/lib.test.js +19 -0
  133. package/package/components/copilot/modelConfig.d.ts +3 -0
  134. package/package/components/copilot/modelConfig.js +10 -0
  135. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte +337 -0
  136. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte.d.ts +15 -0
  137. package/package/components/details/CopyableCodeBlock.svelte +18 -8
  138. package/package/components/details/CopyableCodeBlock.svelte.d.ts +1 -0
  139. package/package/components/flows/FlowAssetsHandler.svelte +19 -21
  140. package/package/components/flows/FlowProgressBar.svelte +5 -2
  141. package/package/components/flows/agentToolTree.d.ts +17 -0
  142. package/package/components/flows/agentToolTree.js +114 -0
  143. package/package/components/flows/agentToolTree.test.d.ts +1 -0
  144. package/package/components/flows/agentToolTree.test.js +86 -0
  145. package/package/components/flows/agentToolUtils.d.ts +0 -5
  146. package/package/components/flows/agentToolUtils.js +0 -49
  147. package/package/components/flows/content/FlowLoop.svelte +7 -4
  148. package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
  149. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +15 -7
  150. package/package/components/flows/content/FlowSettings.svelte +29 -0
  151. package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
  152. package/package/components/flows/dfs.d.ts +6 -2
  153. package/package/components/flows/dfs.js +19 -11
  154. package/package/components/flows/flowDeleteController.d.ts +32 -0
  155. package/package/components/flows/flowDeleteController.js +54 -0
  156. package/package/components/flows/flowDeleteController.test.d.ts +1 -0
  157. package/package/components/flows/flowDeleteController.test.js +121 -0
  158. package/package/components/flows/flowDeleteUtils.d.ts +48 -0
  159. package/package/components/flows/flowDeleteUtils.js +150 -0
  160. package/package/components/flows/flowDeleteUtils.test.d.ts +1 -0
  161. package/package/components/flows/flowDeleteUtils.test.js +131 -0
  162. package/package/components/flows/flowDiff.d.ts +2 -47
  163. package/package/components/flows/flowDiff.js +16 -293
  164. package/package/components/flows/flowDiff.testUtils.d.ts +8 -0
  165. package/package/components/flows/flowDiff.testUtils.js +26 -0
  166. package/package/components/flows/flowDiffManager.svelte.js +20 -75
  167. package/package/components/flows/flowDiffManager.svelte.test.js +103 -2
  168. package/package/components/flows/flowExplorer.d.ts +4 -0
  169. package/package/components/flows/flowExplorer.js +7 -30
  170. package/package/components/flows/flowState.d.ts +1 -0
  171. package/package/components/flows/flowStateUtils.svelte.js +11 -2
  172. package/package/components/flows/flowTree.d.ts +91 -0
  173. package/package/components/flows/flowTree.js +326 -0
  174. package/package/components/flows/flowTree.test.d.ts +1 -0
  175. package/package/components/flows/flowTree.test.js +236 -0
  176. package/package/components/flows/map/FlowJobsMenu.svelte +36 -30
  177. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
  178. package/package/components/flows/map/FlowModuleSchemaMap.svelte +73 -229
  179. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -2
  180. package/package/components/flows/pickers/PickHubScriptQuick.svelte +2 -2
  181. package/package/components/flows/previousResults.js +13 -41
  182. package/package/components/flows/previousResults.test.d.ts +1 -0
  183. package/package/components/flows/previousResults.test.js +65 -0
  184. package/package/components/flows/propPicker/OutputPicker.svelte +2 -1
  185. package/package/components/flows/propPicker/OutputPickerInner.svelte +41 -4
  186. package/package/components/flows/propPicker/StepHistory.svelte +9 -1
  187. package/package/components/git_sync/GitSyncContext.svelte.js +11 -7
  188. package/package/components/git_sync/GitSyncRepositoryCard.svelte +2 -29
  189. package/package/components/git_sync/PullWorkspaceModal.svelte +6 -7
  190. package/package/components/graph/FlowGraphV2.svelte +8 -4
  191. package/package/components/graph/FlowGraphV2.svelte.d.ts +2 -0
  192. package/package/components/graph/groupedModulesProxy.svelte.d.ts +10 -0
  193. package/package/components/graph/groupedModulesProxy.svelte.js +17 -1
  194. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +8 -2
  195. package/package/components/home/HomeConnectDrawer.svelte +125 -0
  196. package/package/components/home/HomeConnectDrawer.svelte.d.ts +5 -0
  197. package/package/components/home/deploy_ui.js +1 -1
  198. package/package/components/icons/AzureIcon.svelte +12 -25
  199. package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
  200. package/package/components/icons/GithubIcon.svelte +4 -4
  201. package/package/components/icons/GithubIcon.svelte.d.ts +5 -2
  202. package/package/components/instanceSettings/ExternalJwtTokens.svelte +85 -0
  203. package/package/components/instanceSettings/ExternalJwtTokens.svelte.d.ts +12 -0
  204. package/package/components/instanceSettings/GhesAppSettings.svelte +17 -0
  205. package/package/components/instanceSettings/IndexerMemorySettings.svelte +56 -29
  206. package/package/components/instanceSettings/SecretBackendConfig.svelte +9 -2
  207. package/package/components/instanceSettings.d.ts +1 -0
  208. package/package/components/instanceSettings.js +66 -8
  209. package/package/components/mcp/McpScopeSelector.svelte +119 -9
  210. package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
  211. package/package/components/offboarding-utils.d.ts +11 -0
  212. package/package/components/offboarding-utils.js +102 -0
  213. package/package/components/progressBar/ProgressBar.svelte +9 -5
  214. package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
  215. package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
  216. package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
  217. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
  218. package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -1
  219. package/package/components/raw_apps/RawAppEditor.svelte +186 -102
  220. package/package/components/raw_apps/RawAppEditorHeader.svelte +6 -1
  221. package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +1 -0
  222. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
  223. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
  224. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
  225. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
  226. package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
  227. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
  228. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
  229. package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
  230. package/package/components/raw_apps/RawAppYamlEditor.svelte +81 -0
  231. package/package/components/raw_apps/RawAppYamlEditor.svelte.d.ts +20 -0
  232. package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
  233. package/package/components/raw_apps/dataTableRefUtils.js +34 -0
  234. package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
  235. package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
  236. package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
  237. package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
  238. package/package/components/raw_apps/rawAppPolicy.js +17 -2
  239. package/package/components/resources/resourceTypesFilter.d.ts +19 -0
  240. package/package/components/resources/resourceTypesFilter.js +21 -0
  241. package/package/components/restartFromStepPath.d.ts +39 -0
  242. package/package/components/restartFromStepPath.js +89 -0
  243. package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
  244. package/package/components/runs/JobDetailFieldConfig.js +57 -10
  245. package/package/components/runs/JobDetailHeader.svelte +24 -3
  246. package/package/components/runs/runsFilter.d.ts +1 -1
  247. package/package/components/schema/FlowPropertyEditor.svelte +30 -1
  248. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
  249. package/package/components/script_builder.d.ts +1 -1
  250. package/package/components/search/GlobalSearchModal.svelte +8 -1
  251. package/package/components/select/Select.svelte +3 -2
  252. package/package/components/select/Select.svelte.d.ts +1 -0
  253. package/package/components/settings/CreateToken.svelte +91 -71
  254. package/package/components/settings/CreateToken.svelte.d.ts +3 -0
  255. package/package/components/settings/EditTokenScopesModal.svelte +57 -0
  256. package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
  257. package/package/components/settings/ScopesPicker.svelte +43 -0
  258. package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
  259. package/package/components/settings/TokensTable.svelte +51 -15
  260. package/package/components/settings/WorkspaceUserSettings.svelte +34 -28
  261. package/package/components/sidebar/OperatorMenu.svelte +6 -0
  262. package/package/components/sidebar/SidebarContent.svelte +68 -2
  263. package/package/components/sidebar/WorkspaceMenu.svelte +8 -4
  264. package/package/components/triggers/AddTriggersButton.svelte +17 -0
  265. package/package/components/triggers/CaptureWrapper.svelte +19 -1
  266. package/package/components/triggers/PermissionedAsLine.svelte +37 -3
  267. package/package/components/triggers/PermissionedAsLine.svelte.d.ts +6 -0
  268. package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
  269. package/package/components/triggers/TriggerModeToggle.svelte +36 -7
  270. package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
  271. package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
  272. package/package/components/triggers/TriggersEditor.svelte +10 -2
  273. package/package/components/triggers/TriggersWrapper.svelte +20 -0
  274. package/package/components/triggers/azure/AzureCapture.svelte +41 -0
  275. package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
  276. package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
  277. package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
  278. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
  279. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
  280. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
  281. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
  282. package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
  283. package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
  284. package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
  285. package/package/components/triggers/azure/utils.js +56 -0
  286. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +15 -11
  287. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +22 -14
  288. package/package/components/triggers/http/RouteEditorConfigSection.svelte +15 -7
  289. package/package/components/triggers/http/RouteEditorInner.svelte +16 -14
  290. package/package/components/triggers/http/RoutesGenerator.svelte +6 -1
  291. package/package/components/triggers/http/RoutesPanel.svelte +1 -1
  292. package/package/components/triggers/http/utils.d.ts +1 -1
  293. package/package/components/triggers/http/utils.js +2 -2
  294. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +22 -14
  295. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +22 -14
  296. package/package/components/triggers/native/NativeTriggerEditor.svelte +3 -0
  297. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte +118 -0
  298. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte.d.ts +17 -0
  299. package/package/components/triggers/native/utils.js +14 -0
  300. package/package/components/triggers/nats/NatsTriggerEditor.svelte.d.ts +4 -3
  301. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +22 -14
  302. package/package/components/triggers/postgres/PostgresTriggerEditor.svelte.d.ts +4 -3
  303. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +22 -14
  304. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +22 -14
  305. package/package/components/triggers/sqs/SqsTriggerEditor.svelte.d.ts +4 -3
  306. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +22 -14
  307. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  308. package/package/components/triggers/triggers.svelte.js +24 -1
  309. package/package/components/triggers/utils.js +47 -6
  310. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -14
  311. package/package/components/triggers.d.ts +1 -1
  312. package/package/components/useFolderDefaultPermissionedAs.svelte.d.ts +13 -0
  313. package/package/components/useFolderDefaultPermissionedAs.svelte.js +63 -0
  314. package/package/components/useNestedRestartState.svelte.d.ts +56 -0
  315. package/package/components/useNestedRestartState.svelte.js +320 -0
  316. package/package/components/workspaceSettings/CreateWorkspace.svelte +16 -677
  317. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte +604 -0
  318. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte.d.ts +7 -0
  319. package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +27 -25
  320. package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +46 -8
  321. package/package/components/workspaceSettings/DataTableSettings.svelte +27 -22
  322. package/package/components/workspaceSettings/DucklakeSettings.svelte +1 -1
  323. package/package/components/workspaceSettings/ForkDatatableSection.svelte +228 -0
  324. package/package/components/workspaceSettings/ForkDatatableSection.svelte.d.ts +28 -0
  325. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +8 -2
  326. package/package/components/workspaceSettings/RulesetEditor.svelte +27 -2
  327. package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
  328. package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
  329. package/package/components/workspaceSettings/VolumeStorageSettings.svelte +1 -1
  330. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +17 -1
  331. package/package/consts.d.ts +3 -0
  332. package/package/consts.js +10 -0
  333. package/package/gen/core/OpenAPI.js +1 -1
  334. package/package/gen/schemas.gen.d.ts +795 -59
  335. package/package/gen/schemas.gen.js +801 -60
  336. package/package/gen/services.gen.d.ts +475 -5
  337. package/package/gen/services.gen.js +976 -23
  338. package/package/gen/types.gen.d.ts +1865 -75
  339. package/package/githubApp.js +5 -1
  340. package/package/hubPaths.json +2 -8
  341. package/package/infer.d.ts +1 -1
  342. package/package/infer.js +50 -52
  343. package/package/infer.svelte.js +10 -1
  344. package/package/mcpEndpointTools.js +60 -4
  345. package/package/monaco_workers/sqlTypePlugin.worker.d.ts +10 -0
  346. package/package/monaco_workers/sqlTypePlugin.worker.js +39 -0
  347. package/package/script_helpers.d.ts +8 -2
  348. package/package/script_helpers.js +31 -0
  349. package/package/stores.d.ts +11 -0
  350. package/package/stores.js +6 -0
  351. package/package/system_prompts/index.d.ts +1 -0
  352. package/package/system_prompts/index.js +8 -0
  353. package/package/system_prompts/prompts.d.ts +17 -13
  354. package/package/system_prompts/prompts.js +921 -61
  355. package/package/templates/ci_test_bun.ts.template +27 -0
  356. package/package/templates/ci_test_python.py.template +26 -0
  357. package/package/utils/forkConflict.d.ts +26 -0
  358. package/package/utils/forkConflict.js +56 -0
  359. package/package/utils_deployable.d.ts +164 -121
  360. package/package/utils_deployable.js +61 -11
  361. package/package/utils_workspace_deploy.d.ts +8 -8
  362. package/package/utils_workspace_deploy.js +89 -421
  363. package/package.json +30 -6
  364. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
  365. package/dist/sharedUtils/base.d.ts +0 -1
  366. package/dist/sharedUtils/cloud.d.ts +0 -1
  367. package/dist/sharedUtils/common.d.ts +0 -111
  368. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
  369. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
  370. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
  371. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
  372. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
  373. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
  374. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
  375. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
  376. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
  377. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
  378. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
  379. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
  380. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
  381. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
  382. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
  383. package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
  384. package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
  385. package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
  386. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
  387. package/dist/sharedUtils/components/apps/types.d.ts +0 -274
  388. package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
  389. package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
  390. package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
  391. package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
  392. package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
  393. package/dist/sharedUtils/components/common/index.d.ts +0 -24
  394. package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
  395. package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
  396. package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
  397. package/dist/sharedUtils/components/ducklake.d.ts +0 -1
  398. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
  399. package/dist/sharedUtils/components/icons/index.d.ts +0 -101
  400. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
  401. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
  402. package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
  403. package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
  404. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
  405. package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
  406. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
  407. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
  408. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
  409. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
  410. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
  411. package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
  412. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
  413. package/dist/sharedUtils/components/triggers.d.ts +0 -20
  414. package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
  415. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
  416. package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
  417. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
  418. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
  419. package/dist/sharedUtils/gen/core/request.d.ts +0 -29
  420. package/dist/sharedUtils/gen/index.d.ts +0 -6
  421. package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
  422. package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
  423. package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
  424. package/dist/sharedUtils/history.svelte.d.ts +0 -9
  425. package/dist/sharedUtils/hub.d.ts +0 -49
  426. package/dist/sharedUtils/jsr.json +0 -6
  427. package/dist/sharedUtils/lib.d.ts +0 -5
  428. package/dist/sharedUtils/lib.es.js +0 -1588
  429. package/dist/sharedUtils/package.json +0 -12
  430. package/dist/sharedUtils/schema.d.ts +0 -3
  431. package/dist/sharedUtils/stores.d.ts +0 -97
  432. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
  433. package/dist/sharedUtils/toast.d.ts +0 -8
  434. package/dist/sharedUtils/utils.d.ts +0 -265
  435. package/package/components/copilot/chat/__tests__/app/appChat.eval.test.js +0 -153
  436. package/package/components/copilot/chat/__tests__/app/appEvalComparison.d.ts +0 -21
  437. package/package/components/copilot/chat/__tests__/app/appEvalComparison.js +0 -136
  438. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.d.ts +0 -15
  439. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.js +0 -107
  440. package/package/components/copilot/chat/__tests__/app/appEvalRunner.d.ts +0 -50
  441. package/package/components/copilot/chat/__tests__/app/appEvalRunner.js +0 -93
  442. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.d.ts +0 -29
  443. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.js +0 -134
  444. package/package/components/copilot/chat/__tests__/app/appResultsWriter.d.ts +0 -30
  445. package/package/components/copilot/chat/__tests__/app/appResultsWriter.js +0 -197
  446. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.d.ts +0 -10
  447. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.js +0 -9
  448. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/meta.json +0 -4
  449. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.d.ts +0 -6
  450. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.js +0 -5
  451. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/meta.json +0 -4
  452. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.d.ts +0 -12
  453. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.js +0 -14
  454. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/meta.json +0 -4
  455. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.d.ts +0 -8
  456. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.js +0 -25
  457. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/meta.json +0 -4
  458. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.d.ts +0 -7
  459. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.js +0 -5
  460. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/meta.json +0 -4
  461. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.d.ts +0 -8
  462. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.js +0 -5
  463. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/meta.json +0 -4
  464. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.d.ts +0 -10
  465. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.tsx +0 -26
  466. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.d.ts +0 -10
  467. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.tsx +0 -79
  468. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.d.ts +0 -10
  469. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.tsx +0 -46
  470. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.d.ts +0 -10
  471. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.tsx +0 -56
  472. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.d.ts +0 -6
  473. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.tsx +0 -59
  474. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.d.ts +0 -16
  475. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.tsx +0 -119
  476. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.d.ts +0 -15
  477. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.js +0 -14
  478. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/meta.json +0 -4
  479. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.d.ts +0 -14
  480. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.js +0 -5
  481. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/meta.json +0 -4
  482. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.d.ts +0 -6
  483. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.js +0 -41
  484. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/meta.json +0 -4
  485. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.d.ts +0 -15
  486. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.js +0 -3
  487. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/meta.json +0 -4
  488. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.d.ts +0 -9
  489. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.tsx +0 -51
  490. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.d.ts +0 -8
  491. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.tsx +0 -27
  492. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.d.ts +0 -8
  493. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.tsx +0 -18
  494. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.d.ts +0 -12
  495. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.tsx +0 -81
  496. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.d.ts +0 -3
  497. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.js +0 -3
  498. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/meta.json +0 -4
  499. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.d.ts +0 -3
  500. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.js +0 -3
  501. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/meta.json +0 -4
  502. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.d.ts +0 -2
  503. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.tsx +0 -38
  504. package/package/components/copilot/chat/__tests__/app/variants/baseline.d.ts +0 -6
  505. package/package/components/copilot/chat/__tests__/app/variants/baseline.js +0 -10
  506. package/package/components/copilot/chat/__tests__/app/variants/index.d.ts +0 -3
  507. package/package/components/copilot/chat/__tests__/app/variants/index.js +0 -3
  508. package/package/components/copilot/chat/__tests__/app/variants/streamlined.d.ts +0 -6
  509. package/package/components/copilot/chat/__tests__/app/variants/streamlined.js +0 -137
  510. package/package/components/copilot/chat/__tests__/flow/expected/test1.json +0 -134
  511. package/package/components/copilot/chat/__tests__/flow/expected/test2.json +0 -183
  512. package/package/components/copilot/chat/__tests__/flow/expected/test3.json +0 -204
  513. package/package/components/copilot/chat/__tests__/flow/expected/test4.json +0 -175
  514. package/package/components/copilot/chat/__tests__/flow/expected/test5_modify_simple.json +0 -68
  515. package/package/components/copilot/chat/__tests__/flow/expected/test6_modify_medium.json +0 -142
  516. package/package/components/copilot/chat/__tests__/flow/expected/test7_modify_complex.json +0 -136
  517. package/package/components/copilot/chat/__tests__/flow/flowChat.eval.test.js +0 -294
  518. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.d.ts +0 -17
  519. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.js +0 -49
  520. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.d.ts +0 -12
  521. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.js +0 -79
  522. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.d.ts +0 -50
  523. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.js +0 -102
  524. package/package/components/copilot/chat/__tests__/flow/initial/test5_initial.json +0 -53
  525. package/package/components/copilot/chat/__tests__/flow/initial/test6_initial.json +0 -68
  526. package/package/components/copilot/chat/__tests__/flow/initial/test7_initial.json +0 -120
  527. package/package/components/copilot/chat/__tests__/flow/variants/baseline.d.ts +0 -6
  528. package/package/components/copilot/chat/__tests__/flow/variants/baseline.js +0 -10
  529. package/package/components/copilot/chat/__tests__/flow/variants/index.d.ts +0 -3
  530. package/package/components/copilot/chat/__tests__/flow/variants/index.js +0 -3
  531. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.d.ts +0 -15
  532. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.js +0 -388
  533. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.d.ts +0 -45
  534. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.js +0 -121
  535. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.d.ts +0 -28
  536. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.js +0 -96
  537. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.d.ts +0 -32
  538. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.js +0 -130
  539. package/package/components/copilot/chat/__tests__/shared/baseVariants.d.ts +0 -45
  540. package/package/components/copilot/chat/__tests__/shared/baseVariants.js +0 -57
  541. package/package/components/copilot/chat/__tests__/shared/index.d.ts +0 -10
  542. package/package/components/copilot/chat/__tests__/shared/index.js +0 -5
  543. package/package/components/copilot/chat/__tests__/shared/types.d.ts +0 -105
  544. package/package/components/copilot/chat/__tests__/shared/types.js +0 -9
  545. package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
  546. package/package/components/copilot/chat/flow/utils.d.ts +0 -14
  547. package/package/components/copilot/chat/flow/utils.js +0 -108
  548. package/package/components/flows/agentToolUtils.test.js +0 -55
  549. /package/package/components/copilot/chat/{__tests__/app/appChat.eval.test.d.ts → app/core.test.d.ts} +0 -0
  550. /package/package/components/copilot/chat/{__tests__/flow/flowChat.eval.test.d.ts → flow/helperUtils.test.d.ts} +0 -0
  551. /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
  552. /package/package/components/{flows/agentToolUtils.test.d.ts → copilot/chat/flow/utils.test.d.ts} +0 -0
@@ -0,0 +1,531 @@
1
+ <script module lang="ts">import { diffTableEditorValues, makeAlterTableQueries } from './apps/components/display/dbtable/queries/alterTable';
2
+ import { renderForeignKey } from './apps/components/display/dbtable/queries/dbQueriesUtils';
3
+ export function apiSchemaToEditorSchema(apiSchema) {
4
+ const result = {};
5
+ for (const [schemaName, tables] of Object.entries(apiSchema)) {
6
+ result[schemaName] = {};
7
+ for (const [tableName, table] of Object.entries(tables)) {
8
+ if (!table || typeof table !== 'object')
9
+ continue;
10
+ result[schemaName][tableName] = {
11
+ name: table.name ?? tableName,
12
+ columns: (table.columns ?? []).map((c) => ({
13
+ name: c.name,
14
+ datatype: c.datatype,
15
+ primaryKey: c.primary_key ?? c.primaryKey,
16
+ defaultValue: c.default_value ?? c.defaultValue,
17
+ nullable: c.nullable
18
+ })),
19
+ foreignKeys: (table.foreign_keys ?? table.foreignKeys ?? []).map((fk) => ({
20
+ targetTable: fk.target_table ?? fk.targetTable,
21
+ columns: (fk.columns ?? []).map((col) => ({
22
+ sourceColumn: col.source_column ?? col.sourceColumn,
23
+ targetColumn: col.target_column ?? col.targetColumn
24
+ })),
25
+ onDelete: (fk.on_delete ?? fk.onDelete ?? 'NO ACTION'),
26
+ onUpdate: (fk.on_update ?? fk.onUpdate ?? 'NO ACTION'),
27
+ fk_constraint_name: fk.fk_constraint_name
28
+ })),
29
+ pk_constraint_name: table.pk_constraint_name
30
+ };
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+ export function diffDatabaseSchemas(original, current) {
36
+ const diffs = [];
37
+ const allSchemas = new Set([...Object.keys(original), ...Object.keys(current)]);
38
+ for (const schemaName of allSchemas) {
39
+ const origTables = original[schemaName] ?? {};
40
+ const currTables = current[schemaName] ?? {};
41
+ const allTables = new Set([...Object.keys(origTables), ...Object.keys(currTables)]);
42
+ for (const tableName of allTables) {
43
+ const origTable = origTables[tableName];
44
+ const currTable = currTables[tableName];
45
+ if (!origTable && currTable) {
46
+ diffs.push({ schemaName, tableName, kind: 'added' });
47
+ }
48
+ else if (origTable && !currTable) {
49
+ diffs.push({ schemaName, tableName, kind: 'removed' });
50
+ }
51
+ else if (origTable && currTable) {
52
+ const currWithInitial = {
53
+ ...currTable,
54
+ columns: currTable.columns.map((col) => ({
55
+ ...col,
56
+ initialName: col.name,
57
+ defaultValue: col.defaultValue ? `{${col.defaultValue}}` : undefined
58
+ }))
59
+ };
60
+ const origTableTransformed = {
61
+ ...origTable,
62
+ columns: origTable.columns.map((col) => ({
63
+ ...col,
64
+ defaultValue: col.defaultValue ? `{${col.defaultValue}}` : undefined
65
+ }))
66
+ };
67
+ const diff = diffTableEditorValues(origTableTransformed, currWithInitial);
68
+ if (diff.operations.length > 0) {
69
+ diffs.push({ schemaName, tableName, kind: 'modified', operations: diff });
70
+ }
71
+ }
72
+ }
73
+ }
74
+ return diffs;
75
+ }
76
+ export function computeDatatableDiff(datatableName, originalSchema, parentSchema, forkSchema) {
77
+ return {
78
+ datatableName,
79
+ behindChanges: diffDatabaseSchemas(originalSchema, parentSchema),
80
+ aheadChanges: diffDatabaseSchemas(originalSchema, forkSchema),
81
+ originalSchema,
82
+ parentSchema,
83
+ forkSchema
84
+ };
85
+ }
86
+ /** Detect PostgreSQL auto-increment columns and return the serial type + cleaned props.
87
+ * e.g. bigint + nextval('seq'::regclass) → BIGSERIAL (no DEFAULT needed) */
88
+ function resolveColumnType(c) {
89
+ const dv = c.defaultValue ?? '';
90
+ if (/^{?nextval\(/.test(dv)) {
91
+ const dt = c.datatype?.toLowerCase() ?? '';
92
+ if (dt === 'bigint')
93
+ return { datatype: 'BIGSERIAL', defaultValue: undefined };
94
+ if (dt === 'integer' || dt === 'int')
95
+ return { datatype: 'SERIAL', defaultValue: undefined };
96
+ if (dt === 'smallint')
97
+ return { datatype: 'SMALLSERIAL', defaultValue: undefined };
98
+ }
99
+ return { datatype: c.datatype, defaultValue: c.defaultValue };
100
+ }
101
+ export function generateMigrationSql(change, sourceSchema) {
102
+ if (change.kind === 'modified' && change.operations) {
103
+ const queries = makeAlterTableQueries(change.operations, 'postgresql', change.schemaName);
104
+ if (queries.length === 0)
105
+ return '';
106
+ return 'BEGIN;\n' + queries.join('\n') + '\nCOMMIT;';
107
+ }
108
+ if (change.kind === 'added') {
109
+ const table = sourceSchema[change.schemaName]?.[change.tableName];
110
+ if (!table)
111
+ return '';
112
+ const colDefs = table.columns
113
+ .map((c) => {
114
+ const { datatype, defaultValue } = resolveColumnType(c);
115
+ let def = `"${c.name}" ${datatype}`;
116
+ if (c.nullable === false)
117
+ def += ' NOT NULL';
118
+ if (defaultValue)
119
+ def += ` DEFAULT ${defaultValue}`;
120
+ return def;
121
+ })
122
+ .join(',\n ');
123
+ const pkCols = table.columns.filter((c) => c.primaryKey).map((c) => `"${c.name}"`);
124
+ const pkLine = pkCols.length > 0 ? `,\n PRIMARY KEY (${pkCols.join(', ')})` : '';
125
+ const qualifiedName = `"${change.schemaName}"."${change.tableName}"`;
126
+ let sql = `BEGIN;\nCREATE TABLE ${qualifiedName} (\n ${colDefs}${pkLine}\n);`;
127
+ for (const fk of table.foreignKeys ?? []) {
128
+ const fkSql = renderForeignKey(fk, {
129
+ useSchema: true,
130
+ dbType: 'postgresql',
131
+ tableName: change.tableName
132
+ });
133
+ sql += `\nALTER TABLE ${qualifiedName} ADD ${fkSql};`;
134
+ }
135
+ sql += '\nCOMMIT;';
136
+ return sql;
137
+ }
138
+ if (change.kind === 'removed') {
139
+ return `BEGIN;\nDROP TABLE IF EXISTS "${change.schemaName}"."${change.tableName}";\nCOMMIT;`;
140
+ }
141
+ return '';
142
+ }
143
+ </script>
144
+
145
+ <script lang="ts">import { WorkspaceService } from '../gen';
146
+ import { Loader2, ChevronDown, ChevronRight, Plus, Minus, Pencil, Eye } from 'lucide-svelte';
147
+ import { Button } from './common';
148
+ import Drawer from './common/drawer/Drawer.svelte';
149
+ import SimpleEditor from './SimpleEditor.svelte';
150
+ import { sendUserToast } from '../toast';
151
+ import { runScriptAndPollResult } from './jobs/utils';
152
+ import YAML from 'yaml';
153
+ import DrawerContent from './common/drawer/DrawerContent.svelte';
154
+ import ConfirmationModal from './common/confirmationModal/ConfirmationModal.svelte';
155
+ import Alert from './common/alert/Alert.svelte';
156
+ import ResizeTransitionWrapper from './common/ResizeTransitionWrapper.svelte';
157
+ let { currentWorkspaceId, parentWorkspaceId } = $props();
158
+ let loading = $state(true);
159
+ let error = $state(undefined);
160
+ let diffs = $state([]);
161
+ let expandedDatatables = $state(new Set());
162
+ // Drawer state
163
+ let drawerOpen = $state(false);
164
+ let drawerChange = $state(undefined);
165
+ let drawerDiff = $state(undefined);
166
+ let drawerDirection = $state(undefined);
167
+ let migrationSql = $state('');
168
+ let migrationRunning = $state(false);
169
+ let confirmDeployOpen = $state(false);
170
+ async function loadDiffs() {
171
+ loading = true;
172
+ error = undefined;
173
+ diffs = [];
174
+ try {
175
+ const forkSettings = await WorkspaceService.getPublicSettings({
176
+ workspace: currentWorkspaceId
177
+ });
178
+ const datatables = forkSettings.datatable?.datatables ?? {};
179
+ const forkedEntries = Object.entries(datatables).filter(([_, dt]) => dt.forked_from != null);
180
+ if (forkedEntries.length === 0) {
181
+ loading = false;
182
+ return;
183
+ }
184
+ const results = [];
185
+ for (const [dtName, dt] of forkedEntries) {
186
+ try {
187
+ const originalSchema = apiSchemaToEditorSchema(dt.forked_from?.schema ?? {});
188
+ const [parentSchemaRaw, forkSchemaRaw] = await Promise.all([
189
+ WorkspaceService.getDatatableFullSchema({
190
+ workspace: parentWorkspaceId,
191
+ requestBody: { source: `datatable://${dtName}` }
192
+ }),
193
+ WorkspaceService.getDatatableFullSchema({
194
+ workspace: currentWorkspaceId,
195
+ requestBody: { source: `datatable://${dtName}` }
196
+ })
197
+ ]);
198
+ const parentSchema = apiSchemaToEditorSchema(parentSchemaRaw);
199
+ const forkSchema = apiSchemaToEditorSchema(forkSchemaRaw);
200
+ const diff = computeDatatableDiff(dtName, originalSchema, parentSchema, forkSchema);
201
+ if (diff.aheadChanges.length > 0 || diff.behindChanges.length > 0) {
202
+ results.push(diff);
203
+ }
204
+ }
205
+ catch (e) {
206
+ console.error(`Failed to diff datatable ${dtName}:`, e);
207
+ }
208
+ }
209
+ diffs = results;
210
+ }
211
+ catch (e) {
212
+ error = e?.body ?? e?.message ?? String(e);
213
+ }
214
+ finally {
215
+ loading = false;
216
+ }
217
+ }
218
+ $effect(() => {
219
+ void [currentWorkspaceId, parentWorkspaceId];
220
+ loadDiffs();
221
+ });
222
+ function toggleExpanded(name) {
223
+ const next = new Set(expandedDatatables);
224
+ if (next.has(name))
225
+ next.delete(name);
226
+ else
227
+ next.add(name);
228
+ expandedDatatables = next;
229
+ }
230
+ function operationSummary(d) {
231
+ if (d.kind === 'added')
232
+ return 'New table';
233
+ if (d.kind === 'removed')
234
+ return 'Deleted table';
235
+ const ops = d.operations?.operations ?? [];
236
+ const parts = [];
237
+ const adds = ops.filter((o) => o.kind === 'addColumn').length;
238
+ const drops = ops.filter((o) => o.kind === 'dropColumn').length;
239
+ const alters = ops.filter((o) => o.kind === 'alterColumn').length;
240
+ const renames = ops.filter((o) => o.kind === 'renameTable').length;
241
+ const fkAdds = ops.filter((o) => o.kind === 'addForeignKey').length;
242
+ const fkDrops = ops.filter((o) => o.kind === 'dropForeignKey').length;
243
+ const pkChanges = ops.filter((o) => o.kind === 'addPrimaryKey' || o.kind === 'dropPrimaryKey').length;
244
+ if (adds)
245
+ parts.push(`+${adds} col`);
246
+ if (drops)
247
+ parts.push(`-${drops} col`);
248
+ if (alters)
249
+ parts.push(`~${alters} col`);
250
+ if (renames)
251
+ parts.push('renamed');
252
+ if (fkAdds)
253
+ parts.push(`+${fkAdds} FK`);
254
+ if (fkDrops)
255
+ parts.push(`-${fkDrops} FK`);
256
+ if (pkChanges)
257
+ parts.push('PK changed');
258
+ return parts.join(', ') || 'Modified';
259
+ }
260
+ function openReview(change, diff, direction) {
261
+ drawerChange = change;
262
+ drawerDiff = diff;
263
+ drawerDirection = direction;
264
+ // ahead = fork changed → migration runs on parent to deploy
265
+ // behind = parent changed → migration runs on fork to update
266
+ const sourceSchema = direction === 'ahead' ? diff.forkSchema : diff.parentSchema;
267
+ migrationSql =
268
+ '-- Migration is auto-generated on a best-effort basis. You can adjust it here \n\n' +
269
+ generateMigrationSql(change, sourceSchema);
270
+ drawerOpen = true;
271
+ }
272
+ function getDiffYaml() {
273
+ if (!drawerChange || !drawerDiff || !drawerDirection)
274
+ return { original: '', modified: '' };
275
+ const { schemaName, tableName } = drawerChange;
276
+ const origTable = drawerDiff.originalSchema[schemaName]?.[tableName];
277
+ // ahead = fork changed → show original vs fork
278
+ // behind = parent changed → show original vs parent
279
+ const changedSchema = drawerDirection === 'ahead' ? drawerDiff.forkSchema : drawerDiff.parentSchema;
280
+ const changedTable = changedSchema[schemaName]?.[tableName];
281
+ return {
282
+ original: origTable ? YAML.stringify(origTable) : '# table does not exist',
283
+ modified: changedTable ? YAML.stringify(changedTable) : '# table does not exist'
284
+ };
285
+ }
286
+ async function runMigration() {
287
+ if (!drawerDiff || !drawerChange || !drawerDirection)
288
+ return;
289
+ migrationRunning = true;
290
+ // ahead → run on parent; behind → run on fork
291
+ const targetWorkspace = drawerDirection === 'ahead' ? parentWorkspaceId : currentWorkspaceId;
292
+ const dtName = drawerDiff.datatableName;
293
+ try {
294
+ await runScriptAndPollResult({
295
+ workspace: targetWorkspace,
296
+ requestBody: {
297
+ args: { database: `datatable://${dtName}` },
298
+ language: 'postgresql',
299
+ content: migrationSql
300
+ }
301
+ });
302
+ }
303
+ catch (e) {
304
+ sendUserToast(e?.body ?? e?.message ?? String(e), true);
305
+ migrationRunning = false;
306
+ return;
307
+ }
308
+ // Update forked_from.schema for the migrated table
309
+ try {
310
+ const sourceSchema = drawerDirection === 'ahead' ? drawerDiff.forkSchema : drawerDiff.parentSchema;
311
+ const { schemaName, tableName } = drawerChange;
312
+ const newTableDef = sourceSchema[schemaName]?.[tableName];
313
+ const forkSettings = await WorkspaceService.getPublicSettings({
314
+ workspace: currentWorkspaceId
315
+ });
316
+ const datatableConfig = forkSettings.datatable ?? { datatables: {} };
317
+ const dtConfig = datatableConfig.datatables[dtName];
318
+ if (dtConfig?.forked_from) {
319
+ const forkedFrom = dtConfig.forked_from;
320
+ if (!forkedFrom.schema)
321
+ forkedFrom.schema = {};
322
+ if (!forkedFrom.schema[schemaName])
323
+ forkedFrom.schema[schemaName] = {};
324
+ if (newTableDef) {
325
+ forkedFrom.schema[schemaName][tableName] = newTableDef;
326
+ }
327
+ else {
328
+ delete forkedFrom.schema[schemaName][tableName];
329
+ }
330
+ await WorkspaceService.editDataTableConfig({
331
+ workspace: currentWorkspaceId,
332
+ requestBody: { settings: datatableConfig }
333
+ });
334
+ }
335
+ }
336
+ catch (e) {
337
+ console.error('Failed to update forked_from schema:', e);
338
+ }
339
+ migrationRunning = false;
340
+ drawerOpen = false;
341
+ sendUserToast('Migration applied successfully');
342
+ await loadDiffs();
343
+ }
344
+ </script>
345
+
346
+ <h3 class="text-sm font-semibold">Datatable schema changes</h3>
347
+ {#if loading}
348
+ <div class="flex items-center gap-2 text-xs text-tertiary py-2">
349
+ <Loader2 class="w-4 h-4 animate-spin" /> Loading datatable diffs...
350
+ </div>
351
+ {:else if error}
352
+ <div class="text-xs text-red-500 py-2">Failed to load datatable diffs: {error}</div>
353
+ {:else if diffs.length > 0}
354
+ <div class="flex flex-col gap-2 mt-3 mb-1">
355
+ {#each diffs as diff}
356
+ <ResizeTransitionWrapper class="border rounded-md" innerClass="w-full" vertical>
357
+ <button
358
+ class="w-full flex items-center justify-between px-3 py-2 hover:bg-surface-hover"
359
+ onclick={() => toggleExpanded(diff.datatableName)}
360
+ >
361
+ <span class="text-xs font-medium">{diff.datatableName}</span>
362
+ <div class="flex items-center gap-2 text-2xs text-tertiary">
363
+ {#if diff.aheadChanges.length > 0}
364
+ <span class="text-blue-500">{diff.aheadChanges.length} ahead</span>
365
+ {/if}
366
+ {#if diff.behindChanges.length > 0}
367
+ <span class="text-orange-500">{diff.behindChanges.length} behind</span>
368
+ {/if}
369
+ {#if expandedDatatables.has(diff.datatableName)}
370
+ <ChevronDown class="w-3 h-3" />
371
+ {:else}
372
+ <ChevronRight class="w-3 h-3" />
373
+ {/if}
374
+ </div>
375
+ </button>
376
+
377
+ {#if expandedDatatables.has(diff.datatableName)}
378
+ <div class="border-t divide-y">
379
+ {#if diff.aheadChanges.length > 0}
380
+ <div class="px-3 py-1.5">
381
+ <div class="text-2xs font-semibold text-blue-500 mb-1">Fork changes (ahead)</div>
382
+ {#each diff.aheadChanges as change}
383
+ <div class="flex items-center gap-2 text-xs py-0.5">
384
+ {#if change.kind === 'added'}
385
+ <Plus class="w-3 h-3 text-green-500 shrink-0" />
386
+ {:else if change.kind === 'removed'}
387
+ <Minus class="w-3 h-3 text-red-500 shrink-0" />
388
+ {:else}
389
+ <Pencil class="w-3 h-3 text-yellow-500 shrink-0" />
390
+ {/if}
391
+ <span class="text-tertiary">{change.schemaName}.</span>
392
+ <span class="font-medium">{change.tableName}</span>
393
+ <span class="text-tertiary text-2xs grow">{operationSummary(change)}</span>
394
+ <Button
395
+ size="xs"
396
+ variant="subtle"
397
+ startIcon={{ icon: Eye }}
398
+ onclick={() => openReview(change, diff, 'ahead')}
399
+ >
400
+ Review
401
+ </Button>
402
+ </div>
403
+ {/each}
404
+ </div>
405
+ {/if}
406
+ {#if diff.behindChanges.length > 0}
407
+ <div class="px-3 py-1.5">
408
+ <div class="text-2xs font-semibold text-orange-500 mb-1">
409
+ Parent changes (behind)
410
+ </div>
411
+ {#each diff.behindChanges as change}
412
+ <div class="flex items-center gap-2 text-xs py-0.5">
413
+ {#if change.kind === 'added'}
414
+ <Plus class="w-3 h-3 text-green-500 shrink-0" />
415
+ {:else if change.kind === 'removed'}
416
+ <Minus class="w-3 h-3 text-red-500 shrink-0" />
417
+ {:else}
418
+ <Pencil class="w-3 h-3 text-yellow-500 shrink-0" />
419
+ {/if}
420
+ <span class="text-tertiary">{change.schemaName}.</span>
421
+ <span class="font-medium">{change.tableName}</span>
422
+ <span class="text-tertiary text-2xs grow">{operationSummary(change)}</span>
423
+ <Button
424
+ size="xs"
425
+ variant="subtle"
426
+ startIcon={{ icon: Eye }}
427
+ onclick={() => openReview(change, diff, 'behind')}
428
+ >
429
+ Review
430
+ </Button>
431
+ </div>
432
+ {/each}
433
+ </div>
434
+ {/if}
435
+ </div>
436
+ {/if}
437
+ </ResizeTransitionWrapper>
438
+ {/each}
439
+ </div>
440
+ {:else}
441
+ <span class="text-xs text-secondary"> No changes detected </span>
442
+ {/if}
443
+
444
+ <Drawer bind:open={drawerOpen} size="900px">
445
+ {#if drawerChange && drawerDiff && drawerDirection}
446
+ {@const yaml = getDiffYaml()}
447
+ <DrawerContent
448
+ on:close={() => (drawerOpen = false)}
449
+ title="{drawerChange.schemaName}.{drawerChange.tableName} ({drawerDirection === 'ahead'
450
+ ? 'Fork → Parent'
451
+ : 'Parent → Fork'})"
452
+ >
453
+ {#snippet actions()}
454
+ <Button
455
+ variant="accent"
456
+ loading={migrationRunning}
457
+ onclick={() => {
458
+ if (drawerDirection === 'ahead') {
459
+ confirmDeployOpen = true
460
+ } else {
461
+ runMigration()
462
+ }
463
+ }}
464
+ >
465
+ Run migration
466
+ </Button>
467
+ {/snippet}
468
+ <div class="flex flex-col h-full">
469
+ <Alert title="Changes to {drawerChange.tableName}" type="info">
470
+ {#if drawerDirection == 'ahead'}
471
+ You have made these changes in {currentWorkspaceId} that are not yet deployed in {parentWorkspaceId}.
472
+ {:else if drawerDirection == 'behind'}
473
+ These changes were made in {parentWorkspaceId} but the current workspace is not up to date.
474
+ {/if}
475
+ </Alert>
476
+ <!-- Diff section -->
477
+ <div style="height: 45%;">
478
+ <div class="py-1.5 text-2xs font-semibold text-secondary">
479
+ Schema diff (parent ↔ fork)
480
+ </div>
481
+ <div class="h-[calc(100%-28px)] border rounded-md overflow-clip">
482
+ {#await import('./DiffEditor.svelte')}
483
+ <div class="flex items-center justify-center h-full">
484
+ <Loader2 class="w-5 h-5 animate-spin" />
485
+ </div>
486
+ {:then Module}
487
+ <Module.default
488
+ open={true}
489
+ automaticLayout
490
+ className="h-full"
491
+ defaultLang="yaml"
492
+ defaultOriginal={yaml.original}
493
+ defaultModified={yaml.modified}
494
+ readOnly
495
+ />
496
+ {/await}
497
+ </div>
498
+ </div>
499
+
500
+ <!-- SQL migration section -->
501
+ <div class="flex flex-col grow overflow-hidden mt-4">
502
+ <div class="py-1.5 text-2xs font-semibold text-secondary"> SQL migration </div>
503
+ <div class="grow overflow-clip rounded-md border">
504
+ <SimpleEditor class="h-full" lang="sql" bind:code={migrationSql} />
505
+ </div>
506
+ </div>
507
+ </div>
508
+ </DrawerContent>
509
+ {/if}
510
+ </Drawer>
511
+
512
+ <ConfirmationModal
513
+ open={confirmDeployOpen}
514
+ title="Deploy to parent workspace"
515
+ confirmationText="Run migration"
516
+ onConfirmed={async () => {
517
+ confirmDeployOpen = false
518
+ await runMigration()
519
+ }}
520
+ onCanceled={() => {
521
+ confirmDeployOpen = false
522
+ }}
523
+ >
524
+ <p class="text-sm">
525
+ This will run the following SQL on workspace <b>{parentWorkspaceId}</b>:
526
+ </p>
527
+ <pre
528
+ class="mt-2 p-3 bg-surface-secondary rounded text-xs font-mono whitespace-pre-wrap max-h-60 overflow-auto"
529
+ >{migrationSql}</pre
530
+ >
531
+ </ConfirmationModal>
@@ -0,0 +1,29 @@
1
+ import type { TableEditorValues } from './apps/components/display/dbtable/tableEditor';
2
+ import { type AlterTableValues } from './apps/components/display/dbtable/queries/alterTable';
3
+ import type { GetDatatableFullSchemaResponse } from '../gen';
4
+ export type DatabaseSchema = Record<string, Record<string, TableEditorValues>>;
5
+ export declare function apiSchemaToEditorSchema(apiSchema: GetDatatableFullSchemaResponse): DatabaseSchema;
6
+ export type TableDiff = {
7
+ schemaName: string;
8
+ tableName: string;
9
+ kind: 'added' | 'removed' | 'modified';
10
+ operations?: AlterTableValues;
11
+ };
12
+ export type DatatableDiff = {
13
+ datatableName: string;
14
+ aheadChanges: TableDiff[];
15
+ behindChanges: TableDiff[];
16
+ originalSchema: DatabaseSchema;
17
+ parentSchema: DatabaseSchema;
18
+ forkSchema: DatabaseSchema;
19
+ };
20
+ export declare function diffDatabaseSchemas(original: DatabaseSchema, current: DatabaseSchema): TableDiff[];
21
+ export declare function computeDatatableDiff(datatableName: string, originalSchema: DatabaseSchema, parentSchema: DatabaseSchema, forkSchema: DatabaseSchema): DatatableDiff;
22
+ export declare function generateMigrationSql(change: TableDiff, sourceSchema: DatabaseSchema): string;
23
+ interface Props {
24
+ currentWorkspaceId: string;
25
+ parentWorkspaceId: string;
26
+ }
27
+ declare const DatatableSchemaDiff: import("svelte").Component<Props, {}, "">;
28
+ type DatatableSchemaDiff = ReturnType<typeof DatatableSchemaDiff>;
29
+ export default DatatableSchemaDiff;
@@ -224,12 +224,14 @@ $effect(() => {
224
224
  loadSelectedTagsInfo(selectedTags);
225
225
  });
226
226
  $effect(() => {
227
- loadWorkspaces();
227
+ if (!disabled) {
228
+ loadWorkspaces();
229
+ }
228
230
  });
229
231
  async function loadWorkspaces() {
230
232
  try {
231
233
  workspacesLoading = true;
232
- const ws = await WorkspaceService.listWorkspaces();
234
+ const ws = await WorkspaceService.listWorkspacesAsSuperAdmin();
233
235
  workspaces = ws.map((w) => ({ id: w.id, name: w.name }));
234
236
  }
235
237
  catch (e) {
@@ -3,25 +3,30 @@ import { ExternalLink, Loader2, Save } from 'lucide-svelte';
3
3
  import { SettingService, WorkerService, WorkspaceService } from '../gen';
4
4
  import { sendUserToast } from '../toast';
5
5
  import { enterpriseLicense, superadmin } from '../stores';
6
- import { DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, PREVIEW_TAGS_OVERRIDE_SETTING } from '../consts';
6
+ import { DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, FORK_WORKSPACE_TAG_APPEND_FORK_SUFFIX_SETTING, PREVIEW_TAGS_OVERRIDE_SETTING } from '../consts';
7
7
  import Toggle from './Toggle.svelte';
8
8
  import MultiSelect from './select/MultiSelect.svelte';
9
9
  import { safeSelectItems } from './select/utils.svelte';
10
10
  import Badge from './common/badge/Badge.svelte';
11
11
  import Section from './Section.svelte';
12
+ import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
13
+ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
12
14
  let { defaultTagPerWorkspace = $bindable(undefined), defaultTagWorkspaces = $bindable([]) } = $props();
13
15
  let defaultTags = $state(undefined);
14
16
  let limitToWorkspaces = $state(false);
15
17
  let previewTagsOverride = $state(false);
18
+ let forkAppendForkSuffix = $state(false);
16
19
  // Change detection
17
20
  let originalDefaultTagPerWorkspace = $state(defaultTagPerWorkspace);
18
21
  let originalDefaultTagWorkspaces = $state(defaultTagWorkspaces);
19
22
  let originalPreviewTagsOverride = $state(false);
23
+ let originalForkAppendForkSuffix = $state(false);
20
24
  // Detect changes
21
25
  let hasChanges = $derived(originalDefaultTagPerWorkspace !== defaultTagPerWorkspace ||
22
26
  JSON.stringify($state.snapshot(originalDefaultTagWorkspaces)?.sort() || []) !==
23
27
  JSON.stringify($state.snapshot(defaultTagWorkspaces)?.sort() || []) ||
24
- originalPreviewTagsOverride !== previewTagsOverride);
28
+ originalPreviewTagsOverride !== previewTagsOverride ||
29
+ originalForkAppendForkSuffix !== forkAppendForkSuffix);
25
30
  let workspaces = $state([]);
26
31
  async function loadWorkspaces() {
27
32
  workspaces = (await WorkspaceService.listWorkspacesAsSuperAdmin()).map((m) => m.id);
@@ -39,6 +44,11 @@ async function loadDefaultTags() {
39
44
  key: PREVIEW_TAGS_OVERRIDE_SETTING
40
45
  })) ?? false;
41
46
  originalPreviewTagsOverride = previewTagsOverride;
47
+ const forkSetting = (await SettingService.getGlobal({
48
+ key: FORK_WORKSPACE_TAG_APPEND_FORK_SUFFIX_SETTING
49
+ }));
50
+ forkAppendForkSuffix = forkSetting ?? false;
51
+ originalForkAppendForkSuffix = forkAppendForkSuffix;
42
52
  }
43
53
  catch (err) {
44
54
  sendUserToast(`Could not load default tags: ${err}`, true);
@@ -65,10 +75,17 @@ async function handleSave() {
65
75
  value: previewTagsOverride
66
76
  }
67
77
  });
78
+ await SettingService.setGlobal({
79
+ key: FORK_WORKSPACE_TAG_APPEND_FORK_SUFFIX_SETTING,
80
+ requestBody: {
81
+ value: forkAppendForkSuffix
82
+ }
83
+ });
68
84
  // Update original state after save
69
85
  originalDefaultTagPerWorkspace = defaultTagPerWorkspace;
70
86
  originalDefaultTagWorkspaces = [...(defaultTagWorkspaces || [])];
71
87
  originalPreviewTagsOverride = previewTagsOverride;
88
+ originalForkAppendForkSuffix = forkAppendForkSuffix;
72
89
  loadDefaultTags();
73
90
  sendUserToast('Saved');
74
91
  }
@@ -126,6 +143,29 @@ loadWorkspaces();
126
143
  />
127
144
  </div>
128
145
  {#if defaultTagPerWorkspace}
146
+ <div class="flex flex-col gap-1">
147
+ <span class="text-xs font-semibold">Fork workspace behavior</span>
148
+ <ToggleButtonGroup
149
+ selected={forkAppendForkSuffix ? 'parent-fork' : 'parent'}
150
+ onSelected={(v) => (forkAppendForkSuffix = v === 'parent-fork')}
151
+ disabled={!$enterpriseLicense}
152
+ >
153
+ {#snippet children({ item })}
154
+ <ToggleButton
155
+ value="parent"
156
+ label="Use parent workspace tag"
157
+ tooltip={'Fork jobs are tagged with the parent workspace id (e.g. python3-{parent_id}), so they are picked up by workers assigned to the parent workspace.'}
158
+ {item}
159
+ />
160
+ <ToggleButton
161
+ value="parent-fork"
162
+ label="Use parent workspace tag + -fork suffix"
163
+ tooltip={'Fork jobs are tagged with the parent workspace id and a "-fork" suffix (e.g. python3-{parent_id}-fork), so all forks of a given parent share a dedicated tag. Route these jobs to workers provisioned specifically for forks of the parent.'}
164
+ {item}
165
+ />
166
+ {/snippet}
167
+ </ToggleButtonGroup>
168
+ </div>
129
169
  <Toggle
130
170
  bind:checked={limitToWorkspaces}
131
171
  options={{ right: 'only for some workspaces' }}
@@ -17,7 +17,7 @@ export async function openDrawer(initialPath_l, kind_l, additionalInformation_l)
17
17
  }
18
18
  </script>
19
19
 
20
- <Drawer bind:this={drawer} size="900px">
20
+ <Drawer bind:this={drawer} size="1200px">
21
21
  <DrawerContent title="Deploy {initialPath}" on:close={drawer.closeDrawer}>
22
22
  {#if (kind != 'trigger' && kind != undefined && initialPath != undefined) || (kind === 'trigger' && initialPath != undefined && additionalInformation?.triggers != undefined)}
23
23
  <DeployWorkspace