windmill-components 1.511.1 → 1.522.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 (232) hide show
  1. package/package/components/AppConnectInner.svelte.d.ts +1 -1
  2. package/package/components/ArgInput.svelte +42 -14
  3. package/package/components/ArgInput.svelte.d.ts +2 -10
  4. package/package/components/AssignableTagsInner.svelte +5 -0
  5. package/package/components/AuthSettings.svelte +4 -2
  6. package/package/components/AuthSettings.svelte.d.ts +1 -0
  7. package/package/components/DBManagerDrawer.svelte +154 -151
  8. package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
  9. package/package/components/DBTable.svelte +3 -3
  10. package/package/components/DBTable.svelte.d.ts +1 -0
  11. package/package/components/DBTableEditor.svelte +7 -7
  12. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  13. package/package/components/DeployWorkspace.svelte +1 -1
  14. package/package/components/DisplayResult.svelte +34 -8
  15. package/package/components/DisplayResult.svelte.d.ts +4 -1
  16. package/package/components/DynSelect.svelte +58 -34
  17. package/package/components/DynSelect.svelte.d.ts +3 -11
  18. package/package/components/EditableSchemaForm.svelte +126 -6
  19. package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
  20. package/package/components/Editor.svelte +1 -1
  21. package/package/components/EditorBar.svelte +82 -4
  22. package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
  23. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
  24. package/package/components/ExploreAssetButton.svelte +14 -4
  25. package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
  26. package/package/components/FlowJobResult.svelte +3 -3
  27. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  28. package/package/components/FlowPreviewContent.svelte +9 -1
  29. package/package/components/FlowPreviewResult.svelte +4 -1
  30. package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
  31. package/package/components/FlowStatusViewerInner.svelte +21 -3
  32. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -1
  33. package/package/components/FolderEditor.svelte +1 -1
  34. package/package/components/GitDiffPreview.svelte +14 -18
  35. package/package/components/GitDiffPreview.svelte.d.ts +2 -8
  36. package/package/components/GitHubAppIntegration.svelte +3 -1
  37. package/package/components/IdEditorInput.svelte +25 -22
  38. package/package/components/IdEditorInput.svelte.d.ts +11 -23
  39. package/package/components/InstanceSetting.svelte +7 -2
  40. package/package/components/InstanceSettings.svelte +1 -0
  41. package/package/components/JobLoader.svelte +48 -5
  42. package/package/components/JobLoader.svelte.d.ts +7 -2
  43. package/package/components/Login.svelte +8 -2
  44. package/package/components/MemoryFootprintViewer.svelte +1 -1
  45. package/package/components/ModulePreviewResultViewer.svelte +2 -2
  46. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  47. package/package/components/NextcloudSetting.svelte +84 -0
  48. package/package/components/NextcloudSetting.svelte.d.ts +7 -0
  49. package/package/components/ObjectResourceInput.svelte +3 -2
  50. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  51. package/package/components/ParqetCsvTableRenderer.svelte +1 -1
  52. package/package/components/ResourceEditor.svelte +1 -1
  53. package/package/components/ResourcePicker.svelte +8 -1
  54. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  55. package/package/components/ResultStreamDisplay.svelte +5 -0
  56. package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
  57. package/package/components/RunForm.svelte +9 -1
  58. package/package/components/SchemaForm.svelte +2 -2
  59. package/package/components/SchemaForm.svelte.d.ts +2 -10
  60. package/package/components/ScriptBuilder.svelte +13 -8
  61. package/package/components/ScriptBuilder.svelte.d.ts +1 -1
  62. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  63. package/package/components/ScriptWrapper.svelte +1 -1
  64. package/package/components/ShareModal.svelte.d.ts +1 -1
  65. package/package/components/SimpleAgTable.svelte +2 -0
  66. package/package/components/SimpleAgTable.svelte.d.ts +2 -0
  67. package/package/components/SqlRepl.svelte +21 -7
  68. package/package/components/SqlRepl.svelte.d.ts +2 -2
  69. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  70. package/package/components/WorkerTagSelect.svelte +70 -1
  71. package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
  72. package/package/components/apps/components/display/AppText.svelte +2 -2
  73. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
  74. package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
  75. package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
  76. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  77. package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
  78. package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
  79. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
  80. package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
  81. package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
  82. package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
  83. package/package/components/apps/components/display/dbtable/utils.js +52 -28
  84. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
  85. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  86. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  87. package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
  88. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  89. package/package/components/apps/components/display/table/utils.js +7 -4
  90. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
  91. package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
  92. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  93. package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
  94. package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
  95. package/package/components/apps/components/layout/AppStepper.svelte +1 -1
  96. package/package/components/apps/components/layout/AppTabs.svelte +1 -1
  97. package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
  98. package/package/components/apps/editor/GridViewer.svelte +1 -0
  99. package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
  100. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
  101. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
  102. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
  103. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  104. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  105. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  106. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
  107. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
  108. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  109. package/package/components/assets/JobAssetsViewer.svelte +2 -2
  110. package/package/components/assets/lib.js +4 -0
  111. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
  112. package/package/components/common/button/Button.svelte +4 -3
  113. package/package/components/common/button/Button.svelte.d.ts +1 -0
  114. package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
  115. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
  116. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
  117. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
  118. package/package/components/common/modal/Modal.svelte +2 -5
  119. package/package/components/common/tabs/TabsV2.svelte +2 -1
  120. package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
  121. package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
  122. package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
  123. package/package/components/copilot/chat/script/core.js +28 -29
  124. package/package/components/copilot/chat/shared.d.ts +1 -1
  125. package/package/components/copilot/chat/shared.js +8 -2
  126. package/package/components/custom_ui.d.ts +2 -0
  127. package/package/components/dbOps.d.ts +20 -8
  128. package/package/components/dbOps.js +85 -40
  129. package/package/components/details/DetailPageHeader.svelte +0 -2
  130. package/package/components/flows/content/FlowInput.svelte +5 -0
  131. package/package/components/flows/content/FlowModuleScript.svelte +0 -1
  132. package/package/components/flows/idUtils.js +2 -1
  133. package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
  134. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
  135. package/package/components/flows/map/InsertModuleButton.svelte +4 -1
  136. package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
  137. package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
  138. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
  139. package/package/components/flows/propPicker/StepHistory.svelte +4 -1
  140. package/package/components/git_sync/DetectionFlow.svelte +202 -0
  141. package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
  142. package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
  143. package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
  144. package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
  145. package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
  146. package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
  147. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
  148. package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
  149. package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
  150. package/package/components/git_sync/GitSyncSection.svelte +89 -0
  151. package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
  152. package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
  153. package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
  154. package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
  155. package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
  156. package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
  157. package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
  158. package/package/components/graph/FlowGraphV2.svelte +5 -1
  159. package/package/components/graph/graphBuilder.svelte.js +1 -1
  160. package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
  161. package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
  162. package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
  163. package/package/components/icons/AssetGenericIcon.svelte +3 -0
  164. package/package/components/icons/DucklakeIcon.svelte +18 -0
  165. package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
  166. package/package/components/instanceSettings.js +11 -3
  167. package/package/components/runs/JobPreview.svelte +2 -2
  168. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  169. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  170. package/package/components/schema/FlowPropertyEditor.svelte +3 -2
  171. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  172. package/package/components/schema/PropertyEditor.svelte +0 -2
  173. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  174. package/package/components/schema/SchemaFormDND.svelte +2 -1
  175. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
  176. package/package/components/scriptEditor/LogPanel.svelte +5 -3
  177. package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
  178. package/package/components/select/Select.svelte +7 -4
  179. package/package/components/select/Select.svelte.d.ts +5 -0
  180. package/package/components/select/SelectDropdown.svelte +2 -1
  181. package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
  182. package/package/components/sidebar/changelogs.js +5 -0
  183. package/package/components/table/AutoDataTable.svelte +6 -4
  184. package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
  185. package/package/components/table/DataTable.svelte +12 -10
  186. package/package/components/table/DataTable.svelte.d.ts +1 -0
  187. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
  188. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  189. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  190. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
  191. package/package/components/triggers/gcp/utils.js +1 -0
  192. package/package/components/triggers/http/utils.js +1 -1
  193. package/package/components/triggers/kafka/utils.js +1 -1
  194. package/package/components/triggers/mqtt/utils.js +1 -1
  195. package/package/components/triggers/nats/utils.js +1 -1
  196. package/package/components/triggers/postgres/utils.js +1 -1
  197. package/package/components/triggers/sqs/utils.js +1 -1
  198. package/package/components/triggers/utils.js +2 -1
  199. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
  200. package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
  201. package/package/components/triggers/websocket/utils.js +1 -1
  202. package/package/components/workspaceSettings/AISettings.svelte +52 -36
  203. package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
  204. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
  205. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
  206. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
  207. package/package/consts.js +2 -1
  208. package/package/gen/core/OpenAPI.js +1 -1
  209. package/package/gen/schemas.gen.d.ts +7 -6
  210. package/package/gen/schemas.gen.js +7 -6
  211. package/package/gen/services.gen.d.ts +19 -1
  212. package/package/gen/services.gen.js +38 -0
  213. package/package/gen/types.gen.d.ts +78 -3
  214. package/package/git-sync.d.ts +36 -0
  215. package/package/git-sync.js +1 -0
  216. package/package/hub.d.ts +1 -0
  217. package/package/hubPaths.json +5 -2
  218. package/package/infer.js +3 -2
  219. package/package/script_helpers.d.ts +2 -2
  220. package/package/script_helpers.js +29 -11
  221. package/package/services/JobManager.d.ts +28 -0
  222. package/package/services/JobManager.js +114 -0
  223. package/package/stores.d.ts +1 -1
  224. package/package/utils.d.ts +18 -1
  225. package/package/utils.js +55 -2
  226. package/package.json +5 -4
  227. package/package/components/InitGitRepoPopover.svelte +0 -410
  228. package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
  229. package/package/components/PullGitRepoPopover.svelte +0 -355
  230. package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
  231. package/package/inferArgSig.d.ts +0 -42
  232. package/package/inferArgSig.js +0 -198
@@ -0,0 +1,320 @@
1
+ <script lang="ts">import Modal from '../common/modal/Modal.svelte';
2
+ import { Button, Alert } from '../common';
3
+ import { Loader2, CheckCircle2, XCircle, Terminal, ChevronDown, ChevronUp } from 'lucide-svelte';
4
+ import GitDiffPreview from '../GitDiffPreview.svelte';
5
+ import { JobService } from '../../gen';
6
+ import { workspaceStore } from '../../stores';
7
+ import hubPaths from '../../hubPaths.json';
8
+ import { tryEvery } from '../../utils';
9
+ let { open = $bindable(false), gitRepoResourcePath, uiState, onSuccess, isNewConnection = false, onSaveWithoutInit } = $props();
10
+ // Job state
11
+ let previewJobId = $state(null);
12
+ let previewJobStatus = $state(undefined);
13
+ let isPreviewLoading = $state(false);
14
+ let previewError = $state('');
15
+ let applyJobId = $state(null);
16
+ let applyJobStatus = $state(undefined);
17
+ let isApplying = $state(false);
18
+ let applyError = $state('');
19
+ // UI state
20
+ let showCliInstructions = $state(false);
21
+ let previewResult = $state(null);
22
+ // Note: Escape key is handled by the Modal component itself
23
+ // Reset state when modal opens/closes
24
+ $effect(() => {
25
+ if (!open) {
26
+ previewJobId = null;
27
+ previewJobStatus = undefined;
28
+ isPreviewLoading = false;
29
+ previewError = '';
30
+ applyJobId = null;
31
+ applyJobStatus = undefined;
32
+ isApplying = false;
33
+ applyError = '';
34
+ showCliInstructions = false;
35
+ previewResult = null;
36
+ }
37
+ });
38
+ // Execute job with dry run or actual execution
39
+ async function executeJob(isDryRun) {
40
+ const isPreview = isDryRun;
41
+ if (isPreview) {
42
+ isPreviewLoading = true;
43
+ previewError = '';
44
+ previewResult = null;
45
+ previewJobId = null;
46
+ previewJobStatus = undefined;
47
+ }
48
+ else {
49
+ isApplying = true;
50
+ applyError = '';
51
+ applyJobId = null;
52
+ applyJobStatus = undefined;
53
+ }
54
+ try {
55
+ const workspace = $workspaceStore;
56
+ if (!workspace)
57
+ return;
58
+ const payload = {
59
+ workspace_id: workspace,
60
+ repo_url_resource_path: gitRepoResourcePath,
61
+ dry_run: isDryRun,
62
+ pull: false,
63
+ settings_json: JSON.stringify(uiState)
64
+ };
65
+ const jobId = await JobService.runScriptByPath({
66
+ workspace,
67
+ path: hubPaths.gitInitRepo,
68
+ requestBody: payload,
69
+ skipPreprocessor: true
70
+ });
71
+ if (isPreview) {
72
+ previewJobId = jobId;
73
+ previewJobStatus = 'running';
74
+ }
75
+ else {
76
+ applyJobId = jobId;
77
+ applyJobStatus = 'running';
78
+ }
79
+ let jobSuccess = false;
80
+ let result = {};
81
+ await tryEvery({
82
+ tryCode: async () => {
83
+ const testResult = await JobService.getCompletedJob({ workspace, id: jobId });
84
+ jobSuccess = !!testResult.success;
85
+ if (jobSuccess) {
86
+ const jobResult = await JobService.getCompletedJobResult({ workspace, id: jobId });
87
+ result = jobResult;
88
+ }
89
+ },
90
+ timeoutCode: async () => {
91
+ try {
92
+ await JobService.cancelQueuedJob({
93
+ workspace,
94
+ id: jobId,
95
+ requestBody: { reason: `${isPreview ? 'Preview' : 'Apply'} job timed out after 60s` }
96
+ });
97
+ }
98
+ catch (err) { }
99
+ },
100
+ interval: 500,
101
+ timeout: 60000
102
+ });
103
+ if (isPreview) {
104
+ previewJobStatus = jobSuccess ? 'success' : 'failure';
105
+ if (jobSuccess) {
106
+ previewResult = result;
107
+ }
108
+ else {
109
+ previewError = 'Preview failed';
110
+ }
111
+ }
112
+ else {
113
+ applyJobStatus = jobSuccess ? 'success' : 'failure';
114
+ if (jobSuccess) {
115
+ onSuccess?.();
116
+ }
117
+ else {
118
+ applyError = 'Push failed';
119
+ }
120
+ }
121
+ }
122
+ catch (e) {
123
+ const errorMsg = e?.message || 'Operation failed';
124
+ if (isPreview) {
125
+ previewJobStatus = 'failure';
126
+ previewError = errorMsg;
127
+ }
128
+ else {
129
+ applyJobStatus = 'failure';
130
+ applyError = errorMsg;
131
+ }
132
+ }
133
+ finally {
134
+ if (isPreview) {
135
+ isPreviewLoading = false;
136
+ }
137
+ else {
138
+ isApplying = false;
139
+ }
140
+ }
141
+ }
142
+ </script>
143
+
144
+
145
+ <Modal bind:open title="Push Workspace to Git Repository" class="sm:max-w-4xl">
146
+ <div class="flex flex-col gap-4">
147
+ <!-- Description -->
148
+ <p class="text-sm text-secondary">Push your current workspace content to the connected Git repository based on the configured filters.</p>
149
+ <p class="text-sm text-tertiary">Note: This will not update git sync settings in wmill.yaml. Settings can only be pulled from the repository as it is the source of truth.</p>
150
+
151
+ <!-- Settings display for new connections -->
152
+ {#if isNewConnection}
153
+ <div class="bg-surface-secondary border border-border rounded-lg p-3">
154
+ <h4 class="text-sm font-medium text-primary mb-2">Settings that will be pushed to repository</h4>
155
+ <div class="text-xs text-secondary space-y-1">
156
+ <div><strong>Include paths:</strong> {uiState.include_path?.join(', ') || 'None'}</div>
157
+ <div><strong>Exclude paths:</strong> {uiState.exclude_path?.join(', ') || 'None'}</div>
158
+ {#if uiState.extra_include_path?.length > 0}
159
+ <div><strong>Extra include paths:</strong> {uiState.extra_include_path.join(', ')}</div>
160
+ {/if}
161
+ <div><strong>Include types:</strong> {uiState.include_type?.join(', ') || 'None'}</div>
162
+ </div>
163
+ <p class="text-xs text-tertiary mt-2">To modify these settings, cancel and configure them in the workspace settings.</p>
164
+ </div>
165
+ {/if}
166
+
167
+ <!-- Preview section -->
168
+ {#if !previewResult}
169
+ <div class="flex justify-start pt-4">
170
+ <Button
171
+ size="md"
172
+ color="dark"
173
+ onclick={() => executeJob(true)}
174
+ disabled={isPreviewLoading}
175
+ startIcon={{
176
+ icon: isPreviewLoading ? Loader2 : undefined,
177
+ classes: isPreviewLoading ? 'animate-spin' : ''
178
+ }}
179
+ >
180
+ {isPreviewLoading ? 'Previewing...' : 'Preview changes'}
181
+ </Button>
182
+ </div>
183
+ {/if}
184
+
185
+ <!-- Job status for preview -->
186
+ {#if previewJobId}
187
+ <div class="flex items-center gap-2 text-xs text-tertiary">
188
+ {#if previewJobStatus === 'running'}
189
+ <Loader2 class="animate-spin" size={14} />
190
+ {:else if previewJobStatus === 'success'}
191
+ <CheckCircle2 size={14} class="text-green-600" />
192
+ {:else if previewJobStatus === 'failure'}
193
+ <XCircle size={14} class="text-red-700" />
194
+ {/if}
195
+ Preview job:
196
+ <a
197
+ target="_blank"
198
+ class="underline"
199
+ href={`/run/${previewJobId}?workspace=${$workspaceStore}`}
200
+ >
201
+ {previewJobId}
202
+ </a>
203
+ </div>
204
+ {/if}
205
+
206
+ <!-- Preview error -->
207
+ {#if previewError}
208
+ <Alert type="error" title="Preview failed">
209
+ {previewError}
210
+ </Alert>
211
+ {/if}
212
+
213
+ <!-- Preview results -->
214
+ {#if previewResult && !previewError}
215
+ <div class="space-y-3">
216
+ <h4 class="text-sm font-semibold text-primary">Changes to Push</h4>
217
+
218
+ {#if previewResult.changes?.length > 0}
219
+ <GitDiffPreview previewResult={previewResult} />
220
+ {:else}
221
+ <div class="bg-surface-secondary rounded-lg p-3">
222
+ <div class="text-sm text-tertiary">No changes to push to the repository.</div>
223
+ </div>
224
+ {/if}
225
+ </div>
226
+ {/if}
227
+
228
+ <!-- Apply section (shown after successful preview) -->
229
+ {#if previewResult && !previewError}
230
+ {@const hasChanges = previewResult.changes?.length > 0}
231
+ {#if hasChanges}
232
+ <div class="border-t pt-4 mt-4">
233
+ <div class="flex justify-start gap-2">
234
+ <Button
235
+ size="xs"
236
+ onclick={() => executeJob(false)}
237
+ disabled={isApplying}
238
+ startIcon={{
239
+ icon: isApplying ? Loader2 : undefined,
240
+ classes: isApplying ? 'animate-spin' : ''
241
+ }}
242
+ >
243
+ {isApplying ?
244
+ (isNewConnection ? 'Initializing...' : 'Pushing...') :
245
+ (isNewConnection ? 'Initialize repo and save connection' : 'Push to repository')
246
+ }
247
+ </Button>
248
+ {#if isNewConnection && onSaveWithoutInit}
249
+ <Button
250
+ size="xs"
251
+ color="light"
252
+ onclick={onSaveWithoutInit}
253
+ disabled={isApplying}
254
+ >
255
+ Save without initializing repo
256
+ </Button>
257
+ {/if}
258
+ </div>
259
+ </div>
260
+ {/if}
261
+ {/if}
262
+
263
+ <!-- Job status for apply -->
264
+ {#if applyJobId}
265
+ <div class="flex items-center gap-2 text-xs text-tertiary">
266
+ {#if applyJobStatus === 'running'}
267
+ <Loader2 class="animate-spin" size={14} />
268
+ {:else if applyJobStatus === 'success'}
269
+ <CheckCircle2 size={14} class="text-green-600" />
270
+ {:else if applyJobStatus === 'failure'}
271
+ <XCircle size={14} class="text-red-700" />
272
+ {/if}
273
+ Push job:
274
+ <a
275
+ target="_blank"
276
+ class="underline"
277
+ href={`/run/${applyJobId}?workspace=${$workspaceStore}`}
278
+ >
279
+ {applyJobId}
280
+ </a>
281
+ </div>
282
+ {/if}
283
+
284
+ <!-- Apply error -->
285
+ {#if applyError}
286
+ <Alert type="error" title="Push failed">
287
+ {applyError}
288
+ </Alert>
289
+ {/if}
290
+
291
+ <!-- CLI Instructions (collapsible) -->
292
+ <div class="border-t pt-4 mt-4">
293
+ <button
294
+ class="flex items-center gap-2 text-sm text-secondary hover:text-primary transition-colors"
295
+ onclick={() => showCliInstructions = !showCliInstructions}
296
+ >
297
+ <Terminal size={16} />
298
+ <span>CLI Instructions</span>
299
+ {#if showCliInstructions}
300
+ <ChevronUp size={16} />
301
+ {:else}
302
+ <ChevronDown size={16} />
303
+ {/if}
304
+ </button>
305
+
306
+ {#if showCliInstructions}
307
+ <div class="mt-3 bg-surface-secondary rounded-lg p-3">
308
+ <pre class="text-xs bg-surface p-3 rounded overflow-x-auto whitespace-pre-wrap break-all">
309
+ # Setup (only needed if local folder not initialized yet)
310
+ npm install -g windmill-cli
311
+ wmill workspace add {$workspaceStore} {$workspaceStore} {window.location.origin}
312
+ wmill init --workspace {$workspaceStore} --repository {gitRepoResourcePath}
313
+
314
+ # Pull workspace content to git repository
315
+ wmill sync pull --workspace {$workspaceStore} --repository {gitRepoResourcePath}</pre>
316
+ </div>
317
+ {/if}
318
+ </div>
319
+ </div>
320
+ </Modal>
@@ -0,0 +1,12 @@
1
+ import type { SettingsObject } from '../../git-sync';
2
+ interface Props {
3
+ open: boolean;
4
+ gitRepoResourcePath: string;
5
+ uiState: SettingsObject;
6
+ onSuccess?: () => void;
7
+ isNewConnection?: boolean;
8
+ onSaveWithoutInit?: () => void;
9
+ }
10
+ declare const PushWorkspaceModal: import("svelte").Component<Props, {}, "open">;
11
+ type PushWorkspaceModal = ReturnType<typeof PushWorkspaceModal>;
12
+ export default PushWorkspaceModal;
@@ -326,7 +326,11 @@ export function isNodeVisible(nodeId) {
326
326
  <FlowYamlEditor bind:drawer={yamlEditorDrawer} />
327
327
  {/if}
328
328
 
329
- <div style={`height: ${height}px; max-height: ${maxHeight}px;`} bind:clientWidth={debouncedWidth}>
329
+ <div
330
+ style={`height: ${height}px; max-height: ${maxHeight}px;`}
331
+ class="overflow-clip"
332
+ bind:clientWidth={debouncedWidth}
333
+ >
330
334
  {#if graph?.error}
331
335
  <div class="center-center p-2">
332
336
  <Alert title="Error parsing the flow" type="error" class="max-w-1/2">
@@ -436,7 +436,7 @@ export function graphBuilder(modules, extra, failureModule, preprocessorModule,
436
436
  let expanded = expandedSubflows[module.id];
437
437
  if (expanded) {
438
438
  expanded = $state.snapshot(expanded);
439
- const startId = `${module.id}-subflow-start`;
439
+ const startId = `${module.id}`;
440
440
  const idWithoutPrefix = module.id.startsWith('subflow:')
441
441
  ? module.id.substring(8)
442
442
  : module.id;
@@ -189,6 +189,7 @@ const flowGraphAssetsCtx = getContext('FlowGraphAssetContext');
189
189
  let { data } = $props();
190
190
  const isSelected = $derived(assetEq(flowGraphAssetsCtx?.val.selectedAsset, data.asset));
191
191
  const cachedResourceMetadata = $derived(flowGraphAssetsCtx?.val.resourceMetadataCache[data.asset.path]);
192
+ const usageCount = $derived(flowGraphAssetsCtx?.val.computeAssetsCount?.(data.asset));
192
193
  </script>
193
194
 
194
195
  <NodeWrapper>
@@ -232,10 +233,9 @@ const cachedResourceMetadata = $derived(flowGraphAssetsCtx?.val.resourceMetadata
232
233
  {/if}
233
234
  </div>
234
235
  <svelte:fragment slot="text">
235
- Used in {pluralize(
236
- flowGraphAssetsCtx?.val.computeAssetsCount?.(data.asset) ?? -1,
237
- 'step'
238
- )}<br />
236
+ {#if usageCount !== undefined}
237
+ Used in {pluralize(usageCount, 'step')}<br />
238
+ {/if}
239
239
  <a
240
240
  href={undefined}
241
241
  class={twMerge(
@@ -0,0 +1,28 @@
1
+ <script lang="ts">"use strict";
2
+ let { height = '24px', width = '24px', fill = 'black', class: className = '' } = $props();
3
+ </script>
4
+
5
+ <svg
6
+ {width}
7
+ {height}
8
+ class={className}
9
+ viewBox="0 0 22 22"
10
+ fill="none"
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ >
13
+ <path
14
+ d="M11.0586 0.306641C11.3106 0.315989 11.5582 0.378277 11.7822 0.495117C12.0247 0.621655 12.2331 0.805033 12.3897 1.0293L12.3916 1.03223L17.9033 9H16.2022L11.6963 2.4873V9H10.2959V2.4873L1.75196 14.8457C1.72867 14.8796 1.71294 14.9186 1.70508 14.959C1.69725 14.9995 1.69803 15.0418 1.70704 15.082C1.71605 15.1222 1.73351 15.1601 1.75782 15.1934C1.78213 15.2266 1.81309 15.2546 1.84864 15.2754H1.84766L8.75001 19.2158V20.8281L1.14844 16.4883L1.14258 16.4844C0.940872 16.3666 0.765826 16.2081 0.627936 16.0195C0.489969 15.8308 0.391887 15.6158 0.340827 15.3877C0.289772 15.1595 0.286682 14.9229 0.331061 14.6934C0.375447 14.4641 0.466395 14.2462 0.59864 14.0537L0.599616 14.0518L9.59962 1.03223L9.60157 1.0293C9.75823 0.804889 9.9673 0.62167 10.21 0.495117C10.4336 0.378564 10.6802 0.316161 10.9316 0.306641C10.9528 0.304686 10.9744 0.299805 10.9961 0.299805C11.0172 0.299841 11.038 0.304797 11.0586 0.306641Z"
15
+ {fill}
16
+ stroke="none"
17
+ />
18
+ <path
19
+ d="M14.036 10C16.4558 10 18.4768 11.6945 18.9614 13.9535H17.2654C16.8219 12.6035 15.5438 11.6279 14.036 11.6279C12.1603 11.6279 10.6396 13.1376 10.6396 15C10.6396 16.8624 12.1603 18.3721 14.036 18.3721C15.7121 18.3721 17.1044 17.1667 17.3819 15.5814H19.038C18.7478 18.0689 16.6193 20 14.036 20C11.2547 20 9 17.7614 9 15C9 12.2386 11.2547 10 14.036 10Z"
20
+ {fill}
21
+ stroke="none"
22
+ />
23
+ <path
24
+ d="M22 14.7674C22 16.0338 20.9049 16.9767 19.6618 16.9767L18.018 16.9767V15.5814L19.6618 15.5814C20.2251 15.5814 20.5946 15.1708 20.5946 14.7674C20.5946 14.3641 20.2251 13.9535 19.6618 13.9535L18.018 13.9535V12.5581L19.6618 12.5581C20.9049 12.5581 22 13.5011 22 14.7674Z"
25
+ {fill}
26
+ stroke="none"
27
+ />
28
+ </svg>
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ height?: string;
3
+ width?: string;
4
+ fill?: string;
5
+ class?: string;
6
+ }
7
+ declare const AssetDucklakeIcon: import("svelte").Component<Props, {}, "">;
8
+ type AssetDucklakeIcon = ReturnType<typeof AssetDucklakeIcon>;
9
+ export default AssetDucklakeIcon;
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">import { Pyramid } from 'lucide-svelte';
2
2
  import AssetResIcon from './AssetResIcon.svelte';
3
3
  import AssetS3Icon from './AssetS3Icon.svelte';
4
+ import AssetDucklakeIcon from './AssetDucklakeIcon.svelte';
4
5
  let { assetKind, fill, size, class: className = '' } = $props();
5
6
  </script>
6
7
 
@@ -8,6 +9,8 @@ let { assetKind, fill, size, class: className = '' } = $props();
8
9
  <AssetS3Icon {fill} width={size} height={size} class={className} />
9
10
  {:else if assetKind == 'resource'}
10
11
  <AssetResIcon {fill} width={size} height={size} class={className} />
12
+ {:else if assetKind == 'ducklake'}
13
+ <AssetDucklakeIcon {fill} width={size} height={size} class={className} />
11
14
  {:else}
12
15
  <Pyramid {size} color={fill} class={'!fill-none ' + className} />
13
16
  {/if}
@@ -0,0 +1,18 @@
1
+ <script lang="ts">"use strict";
2
+ let { size = 24 } = $props();
3
+ </script>
4
+
5
+ <svg
6
+ width={size}
7
+ height={size}
8
+ viewBox="0 0 13 13"
9
+ style="fill:currentcolor;"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ >
12
+ <path
13
+ d="M5.03604 1.5C7.45583 1.5 9.4768 3.19448 9.96136 5.45349H8.26545C7.82193 4.10348 6.54384 3.12791 5.03604 3.12791C3.16026 3.12791 1.63964 4.63764 1.63964 6.5C1.63964 8.36236 3.16026 9.87209 5.03604 9.87209C6.71211 9.87209 8.10437 8.66667 8.38188 7.0814H10.038C9.74784 9.56889 7.61927 11.5 5.03604 11.5C2.25471 11.5 0 9.26142 0 6.5C0 3.73858 2.25471 1.5 5.03604 1.5Z"
14
+ />
15
+ <path
16
+ d="M13 6.26744C13 7.53379 11.9049 8.47674 10.6618 8.47674L9.01802 8.47674V7.0814L10.6618 7.0814C11.2251 7.0814 11.5946 6.67079 11.5946 6.26744C11.5946 5.86409 11.2251 5.45349 10.6618 5.45349L9.01802 5.45349V4.05814L10.6618 4.05814C11.9049 4.05814 13 5.00109 13 6.26744Z"
17
+ />
18
+ </svg>
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ size?: number;
3
+ }
4
+ declare const DucklakeIcon: import("svelte").Component<Props, {}, "">;
5
+ type DucklakeIcon = ReturnType<typeof DucklakeIcon>;
6
+ export default DucklakeIcon;
@@ -28,11 +28,11 @@ export const settings = {
28
28
  placeholder: 'https://windmill.com',
29
29
  storage: 'setting',
30
30
  error: 'Base url must start with http:// or https:// and not end with / or a space',
31
- isValid: (value) => value == undefined
32
- || value?.startsWith('http') &&
31
+ isValid: (value) => value == undefined ||
32
+ (value?.startsWith('http') &&
33
33
  value.includes('://') &&
34
34
  !value?.endsWith('/') &&
35
- !value?.endsWith(' ')
35
+ !value?.endsWith(' '))
36
36
  },
37
37
  {
38
38
  label: 'Email domain',
@@ -158,6 +158,14 @@ export const settings = {
158
158
  storage: 'setting',
159
159
  ee_only: '',
160
160
  requiresReloadOnChange: true
161
+ },
162
+ {
163
+ label: 'App workspace prefix',
164
+ description: 'When enabled apps will be accessible at /a/{workspace_id}/{custom_path} instead of /a/{custom_path} allowing you to define same custom path for apps in different workspace without conflict',
165
+ key: 'app_workspaced_route',
166
+ fieldType: 'boolean',
167
+ storage: 'setting',
168
+ ee_only: ''
161
169
  }
162
170
  ],
163
171
  'Auth/OAuth/SAML': [],
@@ -60,7 +60,7 @@ $effect(() => {
60
60
  let jobLoader = $state(undefined);
61
61
  </script>
62
62
 
63
- <JobLoader lazyLogs workspaceOverride={workspace} bind:job={currentJob} bind:this={jobLoader} />
63
+ <JobLoader noLogs workspaceOverride={workspace} bind:job={currentJob} bind:this={jobLoader} />
64
64
 
65
65
  <div class="p-4 flex flex-col gap-2 items-start h-full">
66
66
  {#if job}
@@ -217,7 +217,7 @@ let jobLoader = $state(undefined);
217
217
  {:else}
218
218
  <Skeleton layout={[[5]]} />
219
219
  {/if}
220
- {:else if job !== undefined && 'result' in job && job.result !== undefined}
220
+ {:else if job !== undefined && (job.result_stream || (job.type == 'CompletedJob' && job.result !== undefined))}
221
221
  <DisplayResult
222
222
  workspaceId={job?.workspace_id}
223
223
  jobId={job?.id}
@@ -8,14 +8,14 @@ let timeout = undefined;
8
8
  let visible = true;
9
9
  async function lookForTag() {
10
10
  try {
11
- const existsWorkerWithTag = await WorkerService.existsWorkerWithTag({ tag });
12
- noWorkerWithTag = !existsWorkerWithTag;
11
+ const existsWorkerWithTag = await WorkerService.existsWorkersWithTags({ tags: tag });
12
+ noWorkerWithTag = !existsWorkerWithTag[tag];
13
13
  if (noWorkerWithTag) {
14
14
  timeout = setTimeout(() => {
15
15
  if (visible) {
16
16
  lookForTag();
17
17
  }
18
- }, 1000);
18
+ }, 2500);
19
19
  }
20
20
  }
21
21
  catch (err) {
@@ -40,6 +40,6 @@ declare const RunsFilter: $$__sveltets_2_IsomorphicComponent<Props, {
40
40
  successChange: CustomEvent<any>;
41
41
  } & {
42
42
  [evt: string]: CustomEvent<any>;
43
- }, {}, {}, "path" | "tag" | "success" | "worker" | "label" | "folder" | "user" | "isSkipped" | "argFilter" | "resultFilter" | "schedulePath" | "jobKindsCat" | "concurrencyKey" | "argError" | "resultError" | "allWorkspaces" | "allowWildcards" | "filterBy">;
43
+ }, {}, {}, "path" | "folder" | "user" | "tag" | "success" | "worker" | "label" | "isSkipped" | "argFilter" | "resultFilter" | "schedulePath" | "jobKindsCat" | "concurrencyKey" | "argError" | "resultError" | "allWorkspaces" | "allowWildcards" | "filterBy">;
44
44
  type RunsFilter = InstanceType<typeof RunsFilter>;
45
45
  export default RunsFilter;
@@ -57,6 +57,7 @@ function renameVariant(name, selected) {
57
57
  }
58
58
  }
59
59
  let initialObjectSelected = $state(Object.keys(properties ?? {}).length == 0 ? 'resource' : 'custom-object');
60
+ let isDynSelect = $derived(format?.startsWith('dynselect-') ?? false);
60
61
  </script>
61
62
 
62
63
  <div class="flex flex-col gap-2">
@@ -217,7 +218,7 @@ let initialObjectSelected = $state(Object.keys(properties ?? {}).length == 0 ? '
217
218
  }}
218
219
  />
219
220
  {/if}
220
- {:else if type === 'object' && format !== 'resource-s3_object'}
221
+ {:else if type === 'object' && format !== 'resource-s3_object' && !isDynSelect}
221
222
  <Tabs
222
223
  bind:selected={initialObjectSelected}
223
224
  on:selected={(e) => {
@@ -258,7 +259,7 @@ let initialObjectSelected = $state(Object.keys(properties ?? {}).length == 0 ? '
258
259
  </Tabs>
259
260
  {/if}
260
261
 
261
- {#if !(type === 'object' && oneOf && oneOf.length >= 2) && !(type == 'object' && initialObjectSelected == 'custom-object')}
262
+ {#if !(type === 'object' && oneOf && oneOf.length >= 2) && !(type == 'object' && initialObjectSelected == 'custom-object') && !isDynSelect}
262
263
  <Label label="Default">
263
264
  <ArgInput
264
265
  noDefaultOnSelectFirst
@@ -47,6 +47,6 @@ declare const FlowPropertyEditor: $$__sveltets_2_IsomorphicComponent<Props, {
47
47
  requiredChange: CustomEvent<any>;
48
48
  } & {
49
49
  [evt: string]: CustomEvent<any>;
50
- }, {}, {}, "disabled" | "properties" | "defaultValue" | "oneOf" | "format" | "showExpr" | "order" | "nullable" | "requiredProperty">;
50
+ }, {}, {}, "disabled" | "properties" | "defaultValue" | "oneOf" | "format" | "order" | "nullable" | "showExpr" | "requiredProperty">;
51
51
  type FlowPropertyEditor = InstanceType<typeof FlowPropertyEditor>;
52
52
  export default FlowPropertyEditor;
@@ -198,8 +198,6 @@ $effect(() => {
198
198
  />
199
199
  </div>
200
200
  {/if}
201
- {:else if type == 'object' && format?.startsWith('dynselect-')}
202
- <div class="text-tertiary text-xs">No settings available for Dynamic Select</div>
203
201
  {:else if type == 'object' && !format?.startsWith('resource-') && !isFlowInput && !isAppInput}
204
202
  <div class="border">
205
203
  <EditableSchemaForm
@@ -46,6 +46,6 @@ declare const PropertyEditor: $$__sveltets_2_IsomorphicComponent<Props, {
46
46
  [evt: string]: CustomEvent<any>;
47
47
  }, {}, {
48
48
  focus: () => void;
49
- }, "description" | "title" | "properties" | "placeholder" | "pattern" | "extra" | "oneOf" | "format" | "contentEncoding" | "customErrorMessage" | "order" | "enum_" | "itemsType">;
49
+ }, "description" | "title" | "properties" | "placeholder" | "pattern" | "extra" | "oneOf" | "format" | "order" | "enum_" | "contentEncoding" | "itemsType" | "customErrorMessage">;
50
50
  type PropertyEditor = InstanceType<typeof PropertyEditor>;
51
51
  export default PropertyEditor;
@@ -3,7 +3,7 @@ import { dragHandle } from '@windmill-labs/svelte-dnd-action';
3
3
  import SchemaForm from '../SchemaForm.svelte';
4
4
  import { GripVertical } from 'lucide-svelte';
5
5
  import { deepEqual } from 'fast-equals';
6
- let { dndType = undefined, schema = $bindable(), args = $bindable(undefined), prettifyHeader = false, onlyMaskPassword = false, disablePortal = false, disabled = false, hiddenArgs = [], nestedParent = undefined, disableDnd = false, shouldDispatchChanges = false, diff = {}, nestedClasses = '', isValid = $bindable(true), noVariablePicker = false } = $props();
6
+ let { dndType = undefined, schema = $bindable(), args = $bindable(undefined), prettifyHeader = false, onlyMaskPassword = false, disablePortal = false, disabled = false, hiddenArgs = [], nestedParent = undefined, disableDnd = false, shouldDispatchChanges = false, helperScript = undefined, diff = {}, nestedClasses = '', isValid = $bindable(true), noVariablePicker = false } = $props();
7
7
  $effect.pre(() => {
8
8
  if (args == undefined) {
9
9
  args = {};
@@ -66,6 +66,7 @@ $effect(() => {
66
66
  {onlyMaskPassword}
67
67
  {disablePortal}
68
68
  {disabled}
69
+ {helperScript}
69
70
  bind:schema
70
71
  dndConfig={disableDnd
71
72
  ? undefined
@@ -1,5 +1,6 @@
1
1
  import type { Schema } from '../../common';
2
2
  import type { SchemaDiff } from './schemaUtils.svelte';
3
+ import type { DynamicSelect } from '../../utils';
3
4
  interface Props {
4
5
  dndType?: string | undefined;
5
6
  schema: Schema;
@@ -19,6 +20,7 @@ interface Props {
19
20
  nestedClasses?: string;
20
21
  isValid?: boolean;
21
22
  noVariablePicker?: boolean;
23
+ helperScript?: DynamicSelect.HelperScript;
22
24
  }
23
25
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
24
26
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {