windmill-components 1.687.0 → 1.695.1

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 (264) hide show
  1. package/package/components/ArgInput.svelte +2 -0
  2. package/package/components/AutoscalingConfigEditor.svelte +18 -4
  3. package/package/components/CompareWorkspaces.svelte +206 -157
  4. package/package/components/DatatableSchemaDiff.svelte +2 -2
  5. package/package/components/Dev.svelte +401 -85
  6. package/package/components/EditableSchemaForm.svelte +4 -0
  7. package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
  8. package/package/components/FlowPreviewContent.svelte +32 -30
  9. package/package/components/FlowRestartButton.svelte +143 -61
  10. package/package/components/FlowRestartButton.svelte.d.ts +37 -0
  11. package/package/components/FlowStatusViewer.svelte +15 -1
  12. package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
  13. package/package/components/FlowStatusViewerInner.svelte +1 -2
  14. package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
  15. package/package/components/ForkConflictModal.svelte +57 -0
  16. package/package/components/ForkConflictModal.svelte.d.ts +3 -0
  17. package/package/components/GitRepoViewer.svelte +251 -97
  18. package/package/components/InputTransformSchemaForm.svelte +1 -1
  19. package/package/components/InstanceSettings.svelte +36 -16
  20. package/package/components/Login.svelte +113 -28
  21. package/package/components/Login.svelte.d.ts +1 -0
  22. package/package/components/Path.svelte +7 -1
  23. package/package/components/Path.svelte.d.ts +1 -1
  24. package/package/components/RunsPage.svelte +2 -1
  25. package/package/components/S3FilePickerInner.svelte +89 -89
  26. package/package/components/ScriptEditor.svelte +18 -5
  27. package/package/components/ShareModal.svelte.d.ts +1 -1
  28. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
  29. package/package/components/apps/components/helpers/executeRunnable.js +2 -1
  30. package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
  31. package/package/components/apps/editor/appPolicy.js +2 -1
  32. package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
  33. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
  34. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
  35. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
  36. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
  37. package/package/components/apps/inputType.d.ts +1 -0
  38. package/package/components/apps/sharedTypes.d.ts +1 -0
  39. package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
  40. package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
  41. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
  42. package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
  43. package/package/components/copilot/chat/AIChatInput.svelte +56 -47
  44. package/package/components/copilot/chat/AIChatManager.svelte.js +48 -46
  45. package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
  46. package/package/components/copilot/chat/app/core.d.ts +12 -20
  47. package/package/components/copilot/chat/app/core.js +103 -160
  48. package/package/components/copilot/chat/app/core.test.js +234 -9
  49. package/package/components/copilot/chat/context.js +44 -0
  50. package/package/components/copilot/chat/flow/FlowAIChat.svelte +5 -3
  51. package/package/components/copilot/chat/flow/core.d.ts +2 -1
  52. package/package/components/copilot/chat/flow/core.js +48 -21
  53. package/package/components/copilot/chat/flow/helperUtils.d.ts +5 -2
  54. package/package/components/copilot/chat/flow/helperUtils.js +33 -1
  55. package/package/components/copilot/chat/flow/helperUtils.test.js +116 -1
  56. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  57. package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
  58. package/package/components/copilot/chat/script/core.js +3 -0
  59. package/package/components/copilot/chat/shared.d.ts +6 -0
  60. package/package/components/copilot/chat/shared.js +22 -1
  61. package/package/components/copilot/chat/shared.test.d.ts +1 -0
  62. package/package/components/copilot/chat/shared.test.js +412 -0
  63. package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
  64. package/package/components/copilot/chat/workspaceTools.js +239 -0
  65. package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
  66. package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
  67. package/package/components/copilot/lib.js +3 -1
  68. package/package/components/copilot/lib.test.d.ts +1 -0
  69. package/package/components/copilot/lib.test.js +19 -0
  70. package/package/components/copilot/modelConfig.d.ts +3 -0
  71. package/package/components/copilot/modelConfig.js +10 -0
  72. package/package/components/flows/FlowProgressBar.svelte +5 -2
  73. package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
  74. package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
  75. package/package/components/flows/flowStateUtils.svelte.js +5 -1
  76. package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
  77. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -0
  78. package/package/components/git_sync/GitSyncContext.svelte.js +0 -2
  79. package/package/components/graph/FlowGraphV2.svelte +7 -3
  80. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  81. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -0
  82. package/package/components/home/deploy_ui.js +1 -1
  83. package/package/components/icons/AzureIcon.svelte +12 -25
  84. package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
  85. package/package/components/instanceSettings.js +24 -0
  86. package/package/components/mcp/McpScopeSelector.svelte +119 -9
  87. package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
  88. package/package/components/offboarding-utils.js +2 -0
  89. package/package/components/progressBar/ProgressBar.svelte +9 -5
  90. package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
  91. package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
  92. package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
  93. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
  94. package/package/components/raw_apps/RawAppEditor.svelte +159 -102
  95. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
  96. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
  97. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
  98. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
  99. package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
  100. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
  101. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
  102. package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
  103. package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
  104. package/package/components/raw_apps/dataTableRefUtils.js +34 -0
  105. package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
  106. package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
  107. package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
  108. package/package/components/raw_apps/rawAppPolicy.js +17 -2
  109. package/package/components/resources/resourceTypesFilter.d.ts +19 -0
  110. package/package/components/resources/resourceTypesFilter.js +21 -0
  111. package/package/components/restartFromStepPath.d.ts +39 -0
  112. package/package/components/restartFromStepPath.js +89 -0
  113. package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
  114. package/package/components/runs/JobDetailFieldConfig.js +57 -10
  115. package/package/components/runs/JobDetailHeader.svelte +24 -3
  116. package/package/components/runs/runsFilter.d.ts +1 -1
  117. package/package/components/schema/FlowPropertyEditor.svelte +30 -1
  118. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
  119. package/package/components/search/GlobalSearchModal.svelte +8 -1
  120. package/package/components/select/Select.svelte +1 -1
  121. package/package/components/settings/CreateToken.svelte +48 -77
  122. package/package/components/settings/EditTokenScopesModal.svelte +57 -0
  123. package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
  124. package/package/components/settings/ScopesPicker.svelte +43 -0
  125. package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
  126. package/package/components/settings/TokensTable.svelte +51 -15
  127. package/package/components/sidebar/OperatorMenu.svelte +6 -0
  128. package/package/components/sidebar/SidebarContent.svelte +11 -1
  129. package/package/components/triggers/AddTriggersButton.svelte +6 -0
  130. package/package/components/triggers/CaptureWrapper.svelte +19 -1
  131. package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
  132. package/package/components/triggers/TriggerModeToggle.svelte +36 -7
  133. package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
  134. package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
  135. package/package/components/triggers/TriggersEditor.svelte +5 -1
  136. package/package/components/triggers/TriggersWrapper.svelte +10 -0
  137. package/package/components/triggers/azure/AzureCapture.svelte +41 -0
  138. package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
  139. package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
  140. package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
  141. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
  142. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
  143. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
  144. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
  145. package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
  146. package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
  147. package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
  148. package/package/components/triggers/azure/utils.js +56 -0
  149. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +2 -0
  150. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +9 -3
  151. package/package/components/triggers/http/RouteEditorInner.svelte +2 -0
  152. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +9 -3
  153. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +9 -3
  154. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +9 -3
  155. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +9 -3
  156. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +9 -3
  157. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +9 -3
  158. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  159. package/package/components/triggers/triggers.svelte.js +23 -1
  160. package/package/components/triggers/utils.js +20 -0
  161. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +9 -3
  162. package/package/components/triggers.d.ts +1 -1
  163. package/package/components/useNestedRestartState.svelte.d.ts +56 -0
  164. package/package/components/useNestedRestartState.svelte.js +320 -0
  165. package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
  166. package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
  167. package/package/gen/core/OpenAPI.js +1 -1
  168. package/package/gen/schemas.gen.d.ts +294 -24
  169. package/package/gen/schemas.gen.js +297 -25
  170. package/package/gen/services.gen.d.ts +247 -4
  171. package/package/gen/services.gen.js +498 -7
  172. package/package/gen/types.gen.d.ts +990 -37
  173. package/package/hubPaths.json +2 -5
  174. package/package/infer.d.ts +1 -1
  175. package/package/infer.js +37 -51
  176. package/package/mcpEndpointTools.js +60 -4
  177. package/package/script_helpers.js +17 -0
  178. package/package/stores.d.ts +7 -0
  179. package/package/stores.js +6 -1
  180. package/package/system_prompts/index.d.ts +1 -0
  181. package/package/system_prompts/index.js +8 -0
  182. package/package/system_prompts/prompts.d.ts +16 -13
  183. package/package/system_prompts/prompts.js +653 -43
  184. package/package/templates/ci_test_bun.ts.template +8 -0
  185. package/package/templates/ci_test_python.py.template +8 -0
  186. package/package/utils/forkConflict.d.ts +26 -0
  187. package/package/utils/forkConflict.js +56 -0
  188. package/package/utils_deployable.d.ts +164 -121
  189. package/package/utils_deployable.js +61 -11
  190. package/package/utils_workspace_deploy.js +3 -1
  191. package/package.json +29 -5
  192. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
  193. package/dist/sharedUtils/base.d.ts +0 -1
  194. package/dist/sharedUtils/cloud.d.ts +0 -1
  195. package/dist/sharedUtils/common.d.ts +0 -111
  196. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
  197. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
  198. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
  199. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
  200. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
  201. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
  202. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
  203. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
  204. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
  205. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
  206. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
  207. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
  208. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
  209. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
  210. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
  211. package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
  212. package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
  213. package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
  214. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
  215. package/dist/sharedUtils/components/apps/types.d.ts +0 -274
  216. package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
  217. package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
  218. package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
  219. package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
  220. package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
  221. package/dist/sharedUtils/components/common/index.d.ts +0 -24
  222. package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
  223. package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
  224. package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
  225. package/dist/sharedUtils/components/ducklake.d.ts +0 -1
  226. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
  227. package/dist/sharedUtils/components/icons/index.d.ts +0 -101
  228. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
  229. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
  230. package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
  231. package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
  232. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
  233. package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
  234. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
  235. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
  236. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
  237. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
  238. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
  239. package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
  240. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
  241. package/dist/sharedUtils/components/triggers.d.ts +0 -20
  242. package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
  243. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
  244. package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
  245. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
  246. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
  247. package/dist/sharedUtils/gen/core/request.d.ts +0 -29
  248. package/dist/sharedUtils/gen/index.d.ts +0 -6
  249. package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
  250. package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
  251. package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
  252. package/dist/sharedUtils/history.svelte.d.ts +0 -9
  253. package/dist/sharedUtils/hub.d.ts +0 -49
  254. package/dist/sharedUtils/jsr.json +0 -6
  255. package/dist/sharedUtils/lib.d.ts +0 -5
  256. package/dist/sharedUtils/lib.es.js +0 -1588
  257. package/dist/sharedUtils/package.json +0 -12
  258. package/dist/sharedUtils/schema.d.ts +0 -3
  259. package/dist/sharedUtils/stores.d.ts +0 -97
  260. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
  261. package/dist/sharedUtils/toast.d.ts +0 -8
  262. package/dist/sharedUtils/utils.d.ts +0 -265
  263. package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
  264. /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
@@ -586,6 +586,8 @@ onDestroy(() => {
586
586
  {appPath}
587
587
  {computeS3ForceViewerPolicies}
588
588
  bottom={innerBottomSnippet}
589
+ hideCatalogPicker={extra?.['hideCatalogPicker'] ?? false}
590
+ hideRawInput={extra?.['hideRawInput'] ?? false}
589
591
  />
590
592
  {:else if inputCat == 'object' && format == 'json-schema'}
591
593
  {#await import('./EditableSchemaForm.svelte')}
@@ -13,6 +13,7 @@ import { ConfigService } from '../gen';
13
13
  import Select from './select/Select.svelte';
14
14
  import ScriptPicker from './ScriptPicker.svelte';
15
15
  import Badge from './common/badge/Badge.svelte';
16
+ import { sendUserToast } from '../toast';
16
17
  let { config = $bindable(), worker_tags, disabled, eeOnly = false } = $props();
17
18
  let test_input = $state(3);
18
19
  let healthCheckLoading = $state(false);
@@ -206,13 +207,13 @@ let collapsed = $state(true);
206
207
  id="custom_tag_select"
207
208
  disabled={!config || !config.integration || disabled}
208
209
  bind:value={
209
- () => config?.integration?.['tags'] ?? undefined,
210
+ () => config?.integration?.['tag'] ?? undefined,
210
211
  (v) => {
211
212
  if (!config || !config.integration) return
212
213
  if (!v || v === '') {
213
- delete config.integration['tags']
214
+ delete config.integration['tag']
214
215
  } else {
215
- config.integration['tags'] = v
216
+ config.integration['tag'] = v
216
217
  }
217
218
  }
218
219
  }
@@ -220,7 +221,20 @@ let collapsed = $state(true);
220
221
  />
221
222
 
222
223
  <div class="flex flex-row gap-2 justify-end mt-4">
223
- <Button variant="default" unifiedSize="md">Test scaling</Button>
224
+ <Button
225
+ variant="default"
226
+ unifiedSize="md"
227
+ onclick={() => {
228
+ if (!config?.integration?.['path']) {
229
+ sendUserToast('Please select a script before testing scaling', true)
230
+ return
231
+ }
232
+ if (!config?.integration?.['tag']) {
233
+ sendUserToast('Please select a custom tag before testing scaling', true)
234
+ return
235
+ }
236
+ }}>Test scaling</Button
237
+ >
224
238
  <div class="flex text-xs flex-row gap-2 items-center">
225
239
  <input class="!w-16" type="number" bind:value={test_input} />
226
240
  workers
@@ -1,26 +1,19 @@
1
- <script lang="ts">import { AlertTriangle, ArrowDown, ArrowDownRight, ArrowRight, ArrowUp, ArrowUpRight, Building, CircleCheck, CircleX, DiffIcon, Eye, FileJson, FlaskConical, GitFork, Loader2, Trash2, UserPlus } from 'lucide-svelte';
1
+ <script lang="ts">import { AlertTriangle, ArrowDown, ArrowDownRight, ArrowRight, ArrowUp, ArrowUpRight, Building, CircleCheck, CircleX, DiffIcon, FileJson, FlaskConical, GitFork, Loader2, UserPlus } from 'lucide-svelte';
2
2
  import { Alert, Badge } from './common';
3
- import { AppService, EmailTriggerService, FlowService, FolderService, GcpTriggerService, HttpTriggerService, KafkaTriggerService, MqttTriggerService, NatsTriggerService, PostgresTriggerService, ScheduleService, ScriptService, SqsTriggerService, UserService, WebsocketTriggerService, WorkspaceService } from '../gen';
3
+ import { AppService, EmailTriggerService, FlowService, FolderService, AzureTriggerService, GcpTriggerService, HttpTriggerService, KafkaTriggerService, MqttTriggerService, NatsTriggerService, PostgresTriggerService, ScheduleService, ScriptService, SqsTriggerService, UserService, WebsocketTriggerService, WorkspaceService } from '../gen';
4
4
  import Button from './common/button/Button.svelte';
5
- import ConfirmationModal from './common/confirmationModal/ConfirmationModal.svelte';
6
5
  import DiffDrawer from './DiffDrawer.svelte';
6
+ import DiffEditor from './DiffEditor.svelte';
7
+ import Drawer from './common/drawer/Drawer.svelte';
8
+ import DrawerContent from './common/drawer/DrawerContent.svelte';
7
9
  import ParentWorkspaceProtectionAlert from './ParentWorkspaceProtectionAlert.svelte';
8
- import ScheduleEditor from './triggers/schedules/ScheduleEditor.svelte';
9
- import RouteEditor from './triggers/http/RouteEditor.svelte';
10
- import WebsocketTriggerEditor from './triggers/websocket/WebsocketTriggerEditor.svelte';
11
- import KafkaTriggerEditor from './triggers/kafka/KafkaTriggerEditor.svelte';
12
- import PostgresTriggerEditor from './triggers/postgres/PostgresTriggerEditor.svelte';
13
- import NatsTriggerEditor from './triggers/nats/NatsTriggerEditor.svelte';
14
- import MqttTriggerEditor from './triggers/mqtt/MqttTriggerEditor.svelte';
15
- import SqsTriggerEditor from './triggers/sqs/SqsTriggerEditor.svelte';
16
- import GcpTriggerEditor from './triggers/gcp/GcpTriggerEditor.svelte';
17
- import EmailTriggerEditor from './triggers/email/EmailTriggerEditor.svelte';
18
10
  import { userWorkspaces, workspaceStore } from '../stores';
19
11
  import { deployItem, deleteItemInWorkspace, getItemValue, getOnBehalfOf } from '../utils_workspace_deploy';
20
12
  import Tooltip from './Tooltip.svelte';
21
13
  import OnBehalfOfSelector, { needsOnBehalfOfSelection } from './OnBehalfOfSelector.svelte';
22
14
  import { sendUserToast } from '../toast';
23
15
  import { deepEqual } from 'fast-equals';
16
+ import { orderedJsonStringify, orderedYamlStringify } from '../utils';
24
17
  import WorkspaceDeployLayout from './WorkspaceDeployLayout.svelte';
25
18
  import DeploymentRequestPanel from './deploymentRequest/DeploymentRequestPanel.svelte';
26
19
  import { userStore } from '../stores';
@@ -416,6 +409,8 @@ let deployableItems = $derived.by(() => {
416
409
  }));
417
410
  const triggerItems = forkTriggers
418
411
  .filter((t) => {
412
+ if (!isTriggerRelevantForDirection(t, mergeIntoParent))
413
+ return false;
419
414
  const key = getTriggerKey(t);
420
415
  return deploymentStatus[key]?.status !== 'deployed';
421
416
  })
@@ -423,6 +418,7 @@ let deployableItems = $derived.by(() => {
423
418
  key: getTriggerKey(trigger),
424
419
  path: trigger.path,
425
420
  kind: 'trigger',
421
+ triggerKind: trigger.triggerKind,
426
422
  diff: undefined,
427
423
  trigger
428
424
  }));
@@ -480,185 +476,211 @@ let allCiTests = $derived.by(() => {
480
476
  return [...seen.values()];
481
477
  });
482
478
  let forkTriggers = $state([]);
483
- let triggerToDelete = $state(undefined);
484
479
  let deploymentRequestPanel = $state(undefined);
485
480
  let hasOpenDeploymentRequest = $state(false);
486
- // Trigger detail drawer refs one per trigger kind. Each is lazy-mounted
487
- // on first openEdit() call, so having them all sit here is cheap.
488
- let scheduleEditor = $state();
489
- let routeEditor = $state();
490
- let websocketEditor = $state();
491
- let kafkaEditor = $state();
492
- let postgresEditor = $state();
493
- let natsEditor = $state();
494
- let mqttEditor = $state();
495
- let sqsEditor = $state();
496
- let gcpEditor = $state();
497
- let emailEditor = $state();
498
- function openTriggerDetails(trigger) {
499
- const isFlow = trigger.isFlow;
500
- switch (trigger.triggerKind) {
501
- case 'schedules':
502
- scheduleEditor?.openEdit(trigger.path, isFlow);
503
- break;
504
- case 'routes':
505
- routeEditor?.openEdit(trigger.path, isFlow);
506
- break;
507
- case 'websockets':
508
- websocketEditor?.openEdit(trigger.path, isFlow);
509
- break;
510
- case 'kafka':
511
- kafkaEditor?.openEdit(trigger.path, isFlow);
512
- break;
513
- case 'postgres':
514
- postgresEditor?.openEdit(trigger.path, isFlow);
515
- break;
516
- case 'nats':
517
- natsEditor?.openEdit(trigger.path, isFlow);
518
- break;
519
- case 'mqtt':
520
- mqttEditor?.openEdit(trigger.path, isFlow);
521
- break;
522
- case 'sqs':
523
- sqsEditor?.openEdit(trigger.path, isFlow);
524
- break;
525
- case 'gcp':
526
- gcpEditor?.openEdit(trigger.path, isFlow);
527
- break;
528
- case 'emails':
529
- emailEditor?.openEdit(trigger.path, isFlow);
530
- break;
531
- }
532
- }
533
- /** Deployable trigger kinds and their list+delete services */
481
+ /** Deployable trigger kinds and their list services */
534
482
  const triggerServices = {
535
483
  schedules: {
536
484
  list: (ws) => ScheduleService.listSchedules({ workspace: ws }),
537
- delete: (ws, path) => ScheduleService.deleteSchedule({ workspace: ws, path }),
538
485
  normalize: (item) => ({
539
486
  path: item.path,
540
487
  triggerKind: 'schedules',
541
488
  scriptPath: item.script_path,
542
489
  isFlow: item.is_flow,
543
- enabled: item.enabled,
544
- extraLabel: item.schedule
490
+ extraLabel: item.schedule,
491
+ raw: item
545
492
  })
546
493
  },
547
494
  routes: {
548
495
  list: (ws) => HttpTriggerService.listHttpTriggers({ workspace: ws }),
549
- delete: (ws, path) => HttpTriggerService.deleteHttpTrigger({ workspace: ws, path }),
550
496
  normalize: (item) => ({
551
497
  path: item.path,
552
498
  triggerKind: 'routes',
553
499
  scriptPath: item.script_path,
554
500
  isFlow: item.is_flow,
555
- enabled: item.mode === 'enabled',
556
501
  extraLabel: `${(item.http_method ?? 'get').toUpperCase()} ${item.route_path ?? ''}`
557
502
  })
558
503
  },
559
504
  websockets: {
560
505
  list: (ws) => WebsocketTriggerService.listWebsocketTriggers({ workspace: ws }),
561
- delete: (ws, path) => WebsocketTriggerService.deleteWebsocketTrigger({ workspace: ws, path }),
562
506
  normalize: (item) => ({
563
507
  path: item.path,
564
508
  triggerKind: 'websockets',
565
509
  scriptPath: item.script_path,
566
510
  isFlow: item.is_flow,
567
- enabled: item.mode === 'enabled',
568
- extraLabel: item.url
511
+ extraLabel: item.url,
512
+ raw: item
569
513
  })
570
514
  },
571
515
  kafka: {
572
516
  list: (ws) => KafkaTriggerService.listKafkaTriggers({ workspace: ws }),
573
- delete: (ws, path) => KafkaTriggerService.deleteKafkaTrigger({ workspace: ws, path }),
574
517
  normalize: (item) => ({
575
518
  path: item.path,
576
519
  triggerKind: 'kafka',
577
520
  scriptPath: item.script_path,
578
521
  isFlow: item.is_flow,
579
- enabled: item.mode === 'enabled',
580
- extraLabel: item.topics?.join(', ')
522
+ extraLabel: item.topics?.join(', '),
523
+ raw: item
581
524
  })
582
525
  },
583
526
  postgres: {
584
527
  list: (ws) => PostgresTriggerService.listPostgresTriggers({ workspace: ws }),
585
- delete: (ws, path) => PostgresTriggerService.deletePostgresTrigger({ workspace: ws, path }),
586
528
  normalize: (item) => ({
587
529
  path: item.path,
588
530
  triggerKind: 'postgres',
589
531
  scriptPath: item.script_path,
590
532
  isFlow: item.is_flow,
591
- enabled: item.mode === 'enabled'
533
+ raw: item
592
534
  })
593
535
  },
594
536
  nats: {
595
537
  list: (ws) => NatsTriggerService.listNatsTriggers({ workspace: ws }),
596
- delete: (ws, path) => NatsTriggerService.deleteNatsTrigger({ workspace: ws, path }),
597
538
  normalize: (item) => ({
598
539
  path: item.path,
599
540
  triggerKind: 'nats',
600
541
  scriptPath: item.script_path,
601
542
  isFlow: item.is_flow,
602
- enabled: item.mode === 'enabled',
603
- extraLabel: item.subjects?.join(', ')
543
+ extraLabel: item.subjects?.join(', '),
544
+ raw: item
604
545
  })
605
546
  },
606
547
  mqtt: {
607
548
  list: (ws) => MqttTriggerService.listMqttTriggers({ workspace: ws }),
608
- delete: (ws, path) => MqttTriggerService.deleteMqttTrigger({ workspace: ws, path }),
609
549
  normalize: (item) => ({
610
550
  path: item.path,
611
551
  triggerKind: 'mqtt',
612
552
  scriptPath: item.script_path,
613
553
  isFlow: item.is_flow,
614
- enabled: item.mode === 'enabled'
554
+ raw: item
615
555
  })
616
556
  },
617
557
  sqs: {
618
558
  list: (ws) => SqsTriggerService.listSqsTriggers({ workspace: ws }),
619
- delete: (ws, path) => SqsTriggerService.deleteSqsTrigger({ workspace: ws, path }),
620
559
  normalize: (item) => ({
621
560
  path: item.path,
622
561
  triggerKind: 'sqs',
623
562
  scriptPath: item.script_path,
624
563
  isFlow: item.is_flow,
625
- enabled: item.mode === 'enabled',
626
- extraLabel: item.queue_url
564
+ extraLabel: item.queue_url,
565
+ raw: item
627
566
  })
628
567
  },
629
568
  gcp: {
630
569
  list: (ws) => GcpTriggerService.listGcpTriggers({ workspace: ws }),
631
- delete: (ws, path) => GcpTriggerService.deleteGcpTrigger({ workspace: ws, path }),
632
570
  normalize: (item) => ({
633
571
  path: item.path,
634
572
  triggerKind: 'gcp',
635
573
  scriptPath: item.script_path,
636
574
  isFlow: item.is_flow,
637
- enabled: item.mode === 'enabled',
638
- extraLabel: item.topic_id
575
+ extraLabel: item.topic_id,
576
+ raw: item
577
+ })
578
+ },
579
+ azure: {
580
+ list: (ws) => AzureTriggerService.listAzureTriggers({ workspace: ws }),
581
+ normalize: (item) => ({
582
+ path: item.path,
583
+ triggerKind: 'azure',
584
+ scriptPath: item.script_path,
585
+ isFlow: item.is_flow,
586
+ extraLabel: item.topic_name ?? item.scope_resource_id,
587
+ raw: item
639
588
  })
640
589
  },
641
590
  emails: {
642
591
  list: (ws) => EmailTriggerService.listEmailTriggers({ workspace: ws }),
643
- delete: (ws, path) => EmailTriggerService.deleteEmailTrigger({ workspace: ws, path }),
644
592
  normalize: (item) => ({
645
593
  path: item.path,
646
594
  triggerKind: 'emails',
647
595
  scriptPath: item.script_path,
648
596
  isFlow: item.is_flow,
649
- enabled: item.mode === 'enabled',
650
- extraLabel: getEmailAddress(item.local_part, item.workspaced_local_part, currentWorkspaceId, emailDomain ?? '')
597
+ extraLabel: getEmailAddress(item.local_part, item.workspaced_local_part, currentWorkspaceId, emailDomain ?? ''),
598
+ raw: item
651
599
  })
652
600
  }
653
601
  };
654
602
  let emailDomain = $state(undefined);
603
+ /**
604
+ * Fields that should not count as a "change" between the parent and the
605
+ * fork. Mode/enabled are forced to 'disabled'/false on clone and stripped
606
+ * by the fork-export filter; the rest are runtime state or per-row
607
+ * metadata that always diverges. Comparing without these matches the
608
+ * semantics of "is this trigger configured the same way?" rather than
609
+ * "are these two rows byte-identical?".
610
+ */
611
+ const TRIGGER_COMPARE_IGNORE = new Set([
612
+ 'workspace_id',
613
+ 'mode',
614
+ 'enabled',
615
+ 'edited_at',
616
+ 'edited_by',
617
+ 'last_server_ping',
618
+ 'server_id',
619
+ 'error',
620
+ 'extra_perms',
621
+ 'permissioned_as'
622
+ ]);
623
+ function stripIgnoredFields(row) {
624
+ if (!row || typeof row !== 'object')
625
+ return row;
626
+ const out = {};
627
+ for (const [k, v] of Object.entries(row)) {
628
+ if (!TRIGGER_COMPARE_IGNORE.has(k))
629
+ out[k] = v;
630
+ }
631
+ return out;
632
+ }
633
+ function rowsHaveSameConfig(a, b) {
634
+ return (orderedJsonStringify(stripIgnoredFields(a)) === orderedJsonStringify(stripIgnoredFields(b)));
635
+ }
655
636
  async function fetchAllTriggers() {
656
637
  try {
657
638
  emailDomain = await getEmailDomain();
658
- const entries = Object.values(triggerServices);
659
- const results = await Promise.allSettled(entries.map(async (svc) => {
660
- const items = await svc.list(currentWorkspaceId);
661
- return items.map(svc.normalize);
639
+ const entries = Object.entries(triggerServices);
640
+ // Fetch fork + parent in parallel for each kind. Either side may
641
+ // fail (e.g. permission denied on parent) — fall back to empty.
642
+ const results = await Promise.allSettled(entries.map(async ([kind, svc]) => {
643
+ const [forkItems, parentItems] = await Promise.all([
644
+ svc.list(currentWorkspaceId).catch(() => []),
645
+ svc.list(parentWorkspaceId).catch(() => [])
646
+ ]);
647
+ const byPath = new Map();
648
+ for (const item of forkItems) {
649
+ byPath.set(item.path, { fork: item });
650
+ }
651
+ for (const item of parentItems) {
652
+ const entry = byPath.get(item.path) ?? {};
653
+ entry.parent = item;
654
+ byPath.set(item.path, entry);
655
+ }
656
+ const merged = [];
657
+ for (const [path, entry] of byPath) {
658
+ const sourceItem = entry.fork ?? entry.parent;
659
+ const normalized = svc.normalize(sourceItem);
660
+ let changeKind;
661
+ let hasChanges = false;
662
+ if (entry.fork && !entry.parent) {
663
+ changeKind = 'new';
664
+ }
665
+ else if (!entry.fork && entry.parent) {
666
+ changeKind = 'deleted-in-source';
667
+ }
668
+ else if (entry.fork && entry.parent) {
669
+ hasChanges = !rowsHaveSameConfig(entry.fork, entry.parent);
670
+ if (hasChanges)
671
+ changeKind = 'modified';
672
+ }
673
+ merged.push({
674
+ ...normalized,
675
+ raw: sourceItem,
676
+ hasChanges,
677
+ changeKind,
678
+ sourceRaw: entry.fork,
679
+ targetRaw: entry.parent,
680
+ path
681
+ });
682
+ }
683
+ return merged;
662
684
  }));
663
685
  forkTriggers = results.flatMap((r) => (r.status === 'fulfilled' ? r.value : []));
664
686
  }
@@ -667,33 +689,48 @@ async function fetchAllTriggers() {
667
689
  forkTriggers = [];
668
690
  }
669
691
  }
670
- function deleteTrigger(trigger) {
671
- triggerToDelete = trigger;
672
- }
673
- async function confirmDeleteTrigger() {
674
- const trigger = triggerToDelete;
675
- if (!trigger)
676
- return;
677
- triggerToDelete = undefined;
678
- const triggerType = triggerKindToTriggerType(trigger.triggerKind);
679
- const displayName = triggerType ? triggerDisplayNamesMap[triggerType] : trigger.triggerKind;
680
- try {
681
- const svc = triggerServices[trigger.triggerKind];
682
- if (!svc) {
683
- throw new Error(`No service for trigger kind: ${trigger.triggerKind}`);
684
- }
685
- await svc.delete(currentWorkspaceId, trigger.path);
686
- forkTriggers = forkTriggers.filter((t) => !(t.path === trigger.path && t.triggerKind === trigger.triggerKind));
687
- sendUserToast(`Deleted ${displayName} trigger '${trigger.path}'`);
692
+ /**
693
+ * Triggers worth showing in the merge UI given the current direction.
694
+ * - "Deploy to parent": rows that exist in fork and either don't exist in
695
+ * parent or have config differences.
696
+ * - "Update current" (pull from parent): mirror.
697
+ * Triggers that exist on both sides with identical config are filtered
698
+ * out — they would generate a no-op deploy and only add noise.
699
+ */
700
+ function isTriggerRelevantForDirection(t, deployingToParent) {
701
+ const existsInFork = !!t.sourceRaw;
702
+ const existsInParent = !!t.targetRaw;
703
+ if (deployingToParent) {
704
+ return existsInFork && (!existsInParent || !!t.hasChanges);
688
705
  }
689
- catch (e) {
690
- sendUserToast(`Failed to delete trigger '${trigger.path}': ${e.body || e.message}`, true);
706
+ else {
707
+ return existsInParent && (!existsInFork || !!t.hasChanges);
691
708
  }
692
709
  }
693
710
  function getTriggerDisplayName(triggerKind) {
694
711
  const triggerType = triggerKindToTriggerType(triggerKind);
695
712
  return triggerType ? triggerDisplayNamesMap[triggerType] : triggerKind;
696
713
  }
714
+ let triggerDiffOpen = $state(false);
715
+ let triggerDiffPayload = $state(undefined);
716
+ function openTriggerDiff(t) {
717
+ // `sourceRaw` is the fork row, `targetRaw` is the parent row regardless
718
+ // of direction (set in fetchAllTriggers). The diff reads from the
719
+ // destination (left) to the source (right), matching the deploy arrow.
720
+ const sourceWorkspace = mergeIntoParent ? currentWorkspaceId : parentWorkspaceId;
721
+ const targetWorkspace = mergeIntoParent ? parentWorkspaceId : currentWorkspaceId;
722
+ const fromRow = mergeIntoParent ? t.sourceRaw : t.targetRaw;
723
+ const toRow = mergeIntoParent ? t.targetRaw : t.sourceRaw;
724
+ triggerDiffPayload = {
725
+ kindLabel: getTriggerDisplayName(t.triggerKind),
726
+ path: t.path,
727
+ originalLabel: `${targetWorkspace} (target)`,
728
+ modifiedLabel: `${sourceWorkspace} (source)`,
729
+ original: orderedYamlStringify(stripIgnoredFields(toRow ?? {})),
730
+ modified: orderedYamlStringify(stripIgnoredFields(fromRow ?? {}))
731
+ };
732
+ triggerDiffOpen = true;
733
+ }
697
734
  // Fetch triggers when workspace is available
698
735
  $effect(() => {
699
736
  if (currentWorkspaceId) {
@@ -901,7 +938,10 @@ $effect(() => {
901
938
  {#if item.trigger}
902
939
  {@const t = item.trigger as ForkTrigger}
903
940
  <span class="text-emphasis">{getTriggerDisplayName(t.triggerKind)}</span>
904
- <span class="text-secondary mx-1">&rarr;</span>
941
+ {#if t.extraLabel}
942
+ <span class="text-secondary ml-1">{t.extraLabel}</span>
943
+ {/if}
944
+ <span class="text-tertiary mx-1">&rarr;</span>
905
945
  <span class="text-secondary">{t.scriptPath}</span>
906
946
  {:else}
907
947
  {@const diff = item.diff as WorkspaceItemDiff}
@@ -932,30 +972,38 @@ $effect(() => {
932
972
  {#if item.trigger}
933
973
  {@const t = item.trigger as ForkTrigger}
934
974
  {@const key = item.key}
935
- <Badge color="indigo" size="xs">Fork-only</Badge>
975
+ {#if t.changeKind === 'new'}
976
+ <Badge
977
+ title={mergeIntoParent
978
+ ? `Only exists in '${currentWorkspaceId}'`
979
+ : `Only exists in '${parentWorkspaceId}'`}
980
+ color="indigo"
981
+ size="xs">New</Badge
982
+ >
983
+ {/if}
936
984
  {#if t.isFlow}
937
985
  <Badge color="blue" size="xs">flow</Badge>
938
986
  {/if}
939
- {#if t.extraLabel}
940
- <span class="text-tertiary text-xs">({t.extraLabel})</span>
941
- {/if}
942
- {#if t.enabled != null}
943
- <Badge color={t.enabled ? 'green' : 'gray'} size="xs">
944
- {t.enabled ? 'Enabled' : 'Disabled'}
945
- </Badge>
946
- {/if}
947
987
  {#if !deploymentStatus[key] || deploymentStatus[key].status != 'deployed'}
948
- <Button
949
- size="xs"
950
- variant="subtle"
951
- startIcon={{ icon: Eye }}
952
- onclick={() => openTriggerDetails(t)}
953
- >
954
- Details
955
- </Button>
956
- <Button size="xs" variant="subtle" color="red" onclick={() => deleteTrigger(t)}>
957
- <Trash2 size={12} />
958
- </Button>
988
+ {#if mergeIntoParent}
989
+ <Badge color="green" size="xs">
990
+ <ArrowUpRight class="w-3 h-3 inline" />
991
+ 1 ahead
992
+ </Badge>
993
+ {:else}
994
+ <Badge color="blue" size="xs">
995
+ <ArrowDownRight class="w-3 h-3 inline" />
996
+ 1 behind
997
+ </Badge>
998
+ {/if}
999
+ {#if t.changeKind === 'modified'}
1000
+ <div>
1001
+ <Button size="xs" variant="subtle" onclick={() => openTriggerDiff(t)}>
1002
+ <DiffIcon class="w-3 h-3" />
1003
+ Show diff
1004
+ </Button>
1005
+ </div>
1006
+ {/if}
959
1007
  {/if}
960
1008
  {:else}
961
1009
  {@const diff = item.diff as WorkspaceItemDiff}
@@ -1138,29 +1186,30 @@ $effect(() => {
1138
1186
 
1139
1187
  <DiffDrawer bind:this={diffDrawer} {isFlow} />
1140
1188
 
1141
- <ScheduleEditor bind:this={scheduleEditor} />
1142
- <RouteEditor bind:this={routeEditor} />
1143
- <WebsocketTriggerEditor bind:this={websocketEditor} />
1144
- <KafkaTriggerEditor bind:this={kafkaEditor} />
1145
- <PostgresTriggerEditor bind:this={postgresEditor} />
1146
- <NatsTriggerEditor bind:this={natsEditor} />
1147
- <MqttTriggerEditor bind:this={mqttEditor} />
1148
- <SqsTriggerEditor bind:this={sqsEditor} />
1149
- <GcpTriggerEditor bind:this={gcpEditor} />
1150
- <EmailTriggerEditor bind:this={emailEditor} />
1151
-
1152
- <ConfirmationModal
1153
- title="Delete trigger"
1154
- confirmationText="Delete"
1155
- open={!!triggerToDelete}
1156
- onConfirmed={confirmDeleteTrigger}
1157
- onCanceled={() => (triggerToDelete = undefined)}
1158
- >
1159
- {#if triggerToDelete}
1160
- Are you sure you want to delete the {getTriggerDisplayName(triggerToDelete.triggerKind)} trigger
1161
- '{triggerToDelete.path}'?
1162
- {/if}
1163
- </ConfirmationModal>
1189
+ <Drawer bind:open={triggerDiffOpen} size="900px">
1190
+ <DrawerContent
1191
+ title={triggerDiffPayload
1192
+ ? `${triggerDiffPayload.kindLabel} ${triggerDiffPayload.path}`
1193
+ : 'Trigger diff'}
1194
+ on:close={() => (triggerDiffOpen = false)}
1195
+ >
1196
+ {#if triggerDiffPayload}
1197
+ <div class="flex flex-col h-full">
1198
+ <div class="flex-1 min-h-0">
1199
+ <DiffEditor
1200
+ open={triggerDiffOpen}
1201
+ className="!h-full"
1202
+ defaultLang="yaml"
1203
+ defaultOriginal={triggerDiffPayload.original}
1204
+ defaultModified={triggerDiffPayload.modified}
1205
+ readOnly
1206
+ inlineDiff={false}
1207
+ />
1208
+ </div>
1209
+ </div>
1210
+ {/if}
1211
+ </DrawerContent>
1212
+ </Drawer>
1164
1213
  {:else}
1165
1214
  <div class="flex items-center justify-center h-full">
1166
1215
  <div class="text-gray-500">No comparison data available</div>
@@ -172,7 +172,7 @@ async function loadDiffs() {
172
172
  error = undefined;
173
173
  diffs = [];
174
174
  try {
175
- const forkSettings = await WorkspaceService.getSettings({
175
+ const forkSettings = await WorkspaceService.getPublicSettings({
176
176
  workspace: currentWorkspaceId
177
177
  });
178
178
  const datatables = forkSettings.datatable?.datatables ?? {};
@@ -310,7 +310,7 @@ async function runMigration() {
310
310
  const sourceSchema = drawerDirection === 'ahead' ? drawerDiff.forkSchema : drawerDiff.parentSchema;
311
311
  const { schemaName, tableName } = drawerChange;
312
312
  const newTableDef = sourceSchema[schemaName]?.[tableName];
313
- const forkSettings = await WorkspaceService.getSettings({
313
+ const forkSettings = await WorkspaceService.getPublicSettings({
314
314
  workspace: currentWorkspaceId
315
315
  });
316
316
  const datatableConfig = forkSettings.datatable ?? { datatables: {} };