windmill-components 1.504.6 → 1.510.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 (196) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +161 -29
  3. package/package/components/ArgInput.svelte +33 -103
  4. package/package/components/AuthSettings.svelte +45 -1
  5. package/package/components/Dev.svelte +31 -24
  6. package/package/components/DisplayResult.svelte +53 -26
  7. package/package/components/DisplayResult.svelte.d.ts +1 -1
  8. package/package/components/DynSelect.svelte +3 -3
  9. package/package/components/Editor.svelte +7 -4
  10. package/package/components/EditorBar.svelte +2 -2
  11. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  12. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  13. package/package/components/FlowBuilder.svelte +11 -2
  14. package/package/components/FlowJobResult.svelte +12 -17
  15. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  16. package/package/components/FlowPreviewContent.svelte +13 -10
  17. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  18. package/package/components/FlowPreviewResult.svelte +14 -6
  19. package/package/components/FlowStatusViewer.svelte +11 -24
  20. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  21. package/package/components/FlowStatusViewerInner.svelte +110 -131
  22. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  23. package/package/components/GitDiffPreview.svelte +55 -0
  24. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  25. package/package/components/HistoricInputs.svelte +2 -2
  26. package/package/components/InitGitRepoPopover.svelte +410 -0
  27. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  28. package/package/components/InstanceSetting.svelte +21 -9
  29. package/package/components/InstanceSettings.svelte +16 -3
  30. package/package/components/JobLoader.svelte +567 -0
  31. package/package/components/JobLoader.svelte.d.ts +53 -0
  32. package/package/components/JobLogs.svelte +6 -4
  33. package/package/components/JobLogs.svelte.d.ts +5 -18
  34. package/package/components/LightweightResourcePicker.svelte +18 -39
  35. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  36. package/package/components/LogViewer.svelte +35 -41
  37. package/package/components/LogViewer.svelte.d.ts +6 -20
  38. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  39. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  40. package/package/components/ModuleTest.svelte +16 -11
  41. package/package/components/PullGitRepoPopover.svelte +355 -0
  42. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  43. package/package/components/S3FilePicker.svelte +5 -3
  44. package/package/components/SavedInputs.svelte +2 -2
  45. package/package/components/ScriptBuilder.svelte +4 -3
  46. package/package/components/ScriptEditor.svelte +34 -31
  47. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  48. package/package/components/ServiceLogsInner.svelte +2 -1
  49. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  50. package/package/components/UserSettings.svelte +1 -1
  51. package/package/components/WorkerTagSelect.svelte +32 -3
  52. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  53. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  54. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  55. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  56. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  57. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  58. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  59. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  60. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  61. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  62. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  63. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  64. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  65. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  66. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  67. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  68. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  69. package/package/components/apps/editor/component/components.d.ts +12 -0
  70. package/package/components/apps/editor/component/components.js +19 -7
  71. package/package/components/assets/AssetButtons.svelte +38 -0
  72. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  73. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  74. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  75. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  76. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  77. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  78. package/package/components/assets/README_DEV.md +0 -0
  79. package/package/components/assets/lib.d.ts +9 -1
  80. package/package/components/assets/lib.js +48 -7
  81. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  82. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  83. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  84. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  85. package/package/components/common/table/ScriptRow.svelte +3 -1
  86. package/package/components/copilot/autocomplete/Autocompletor.js +23 -5
  87. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  88. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  89. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  90. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  91. package/package/components/copilot/chat/flow/core.js +2 -38
  92. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  93. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  94. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  95. package/package/components/copilot/chat/navigator/core.js +2 -1
  96. package/package/components/copilot/chat/script/core.d.ts +11 -2
  97. package/package/components/copilot/chat/script/core.js +135 -1
  98. package/package/components/copilot/chat/shared.d.ts +10 -0
  99. package/package/components/copilot/chat/shared.js +56 -0
  100. package/package/components/copilot/lib.d.ts +1 -0
  101. package/package/components/copilot/lib.js +27 -9
  102. package/package/components/custom_ui.d.ts +1 -0
  103. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  104. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  105. package/package/components/flows/content/FlowModuleComponent.svelte +16 -18
  106. package/package/components/flows/flowStore.d.ts +1 -1
  107. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  108. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  109. package/package/components/flows/scheduleUtils.js +1 -1
  110. package/package/components/flows/types.d.ts +2 -1
  111. package/package/components/graph/FlowGraphV2.svelte +8 -104
  112. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  113. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  114. package/package/components/graph/graphBuilder.svelte.js +35 -9
  115. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  116. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  117. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  118. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  119. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  120. package/package/components/graph/util.js +1 -1
  121. package/package/components/home/ItemsList.svelte +2 -0
  122. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  123. package/package/components/jobs/JobPreview.svelte +10 -6
  124. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  125. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  126. package/package/components/runs/JobPreview.svelte +26 -16
  127. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  128. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  129. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  130. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  131. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  132. package/package/components/script_builder.d.ts +2 -2
  133. package/package/components/settings/CreateToken.svelte +76 -41
  134. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  135. package/package/components/settings/ScopeSelector.svelte +613 -0
  136. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  137. package/package/components/settings/TokenDisplay.svelte +103 -0
  138. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  139. package/package/components/settings/TokensTable.svelte +70 -349
  140. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  141. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  142. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  143. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  144. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  145. package/package/components/triggers/TriggersEditor.svelte +45 -3
  146. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  147. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +43 -2
  148. package/package/components/triggers/gcp/utils.js +9 -1
  149. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +1 -0
  150. package/package/components/triggers/http/RouteEditorInner.svelte +208 -164
  151. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  152. package/package/components/triggers/http/utils.js +9 -3
  153. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +43 -2
  154. package/package/components/triggers/kafka/utils.js +9 -1
  155. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  156. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  157. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +178 -9
  158. package/package/components/triggers/mqtt/utils.js +9 -1
  159. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +43 -2
  160. package/package/components/triggers/nats/utils.js +9 -1
  161. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  162. package/package/components/triggers/postgres/utils.js +9 -1
  163. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +34 -88
  164. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +43 -2
  165. package/package/components/triggers/sqs/utils.js +9 -1
  166. package/package/components/triggers/utils.js +12 -0
  167. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +43 -2
  168. package/package/components/triggers/websocket/utils.js +11 -1
  169. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  170. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  171. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  172. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  173. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  174. package/package/gen/core/OpenAPI.js +1 -1
  175. package/package/gen/schemas.gen.d.ts +305 -23
  176. package/package/gen/schemas.gen.js +305 -23
  177. package/package/gen/services.gen.d.ts +33 -1
  178. package/package/gen/services.gen.js +66 -2
  179. package/package/gen/types.gen.d.ts +216 -11
  180. package/package/history.svelte.js +0 -2
  181. package/package/hub.d.ts +1 -0
  182. package/package/hubPaths.json +5 -2
  183. package/package/infer.js +16 -10
  184. package/package/svelte5Utils.svelte.d.ts +1 -0
  185. package/package/svelte5Utils.svelte.js +25 -18
  186. package/package/toast.js +10 -0
  187. package/package/utils.d.ts +3 -2
  188. package/package/utils.js +20 -5
  189. package/package.json +11 -11
  190. package/package/components/ResultJobLoader.svelte +0 -219
  191. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  192. package/package/components/TestJobLoader.svelte +0 -274
  193. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  194. package/package/components/icons/AssetVarIcon.svelte +0 -31
  195. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  196. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -0,0 +1,355 @@
1
+ <script lang="ts">import { Button } from './common';
2
+ import Popover from './meltComponents/Popover.svelte';
3
+ import { Loader2, Eye, Save, CheckCircle2, XCircle, DownloadCloud, AlertTriangle, Terminal, ChevronDown, ChevronUp } from 'lucide-svelte';
4
+ import { workspaceStore } from '../stores';
5
+ import hubPaths from '../hubPaths.json';
6
+ import { JobService } from '../gen';
7
+ import { tryEvery } from '../utils';
8
+ import { sendUserToast } from '../toast';
9
+ import GitDiffPreview from './GitDiffPreview.svelte';
10
+ import { page } from '$app/stores';
11
+ let { gitRepoResourcePath, uiState, onFilterUpdate } = $props();
12
+ let previewResult = $state(undefined);
13
+ let isPreviewLoading = $state(false);
14
+ let isPulling = $state(false);
15
+ let pullGitRepoPopover = $state(null);
16
+ let jobStatus = $state({
17
+ id: null,
18
+ status: undefined,
19
+ type: 'preview'
20
+ });
21
+ let isCliInfoExpanded = $state(false);
22
+ async function handleJobCompletion(jobId, workspace) {
23
+ let success = false;
24
+ await tryEvery({
25
+ tryCode: async () => {
26
+ const result = await JobService.getCompletedJob({
27
+ workspace,
28
+ id: jobId
29
+ });
30
+ success = !!result.success;
31
+ },
32
+ timeoutCode: async () => {
33
+ try {
34
+ await JobService.cancelQueuedJob({
35
+ workspace,
36
+ id: jobId,
37
+ requestBody: {
38
+ reason: 'Job timed out after 5s'
39
+ }
40
+ });
41
+ }
42
+ catch (err) {
43
+ console.error(err);
44
+ }
45
+ },
46
+ interval: 500,
47
+ timeout: 10000
48
+ });
49
+ return success;
50
+ }
51
+ async function previewChanges() {
52
+ const workspace = $workspaceStore;
53
+ if (!workspace)
54
+ return;
55
+ console.log('Previewing changes for repo:', gitRepoResourcePath);
56
+ isPreviewLoading = true;
57
+ jobStatus = { id: null, status: undefined, type: 'preview' };
58
+ try {
59
+ // Always use the simplified JSON approach
60
+ const jobId = await JobService.runScriptByPath({
61
+ workspace,
62
+ path: hubPaths.gitInitRepo,
63
+ requestBody: {
64
+ workspace_id: workspace,
65
+ repo_url_resource_path: gitRepoResourcePath,
66
+ dry_run: true,
67
+ pull: true,
68
+ only_wmill_yaml: false,
69
+ settings_json: JSON.stringify(uiState)
70
+ },
71
+ skipPreprocessor: true
72
+ });
73
+ jobStatus = { id: jobId, status: 'running', type: 'preview' };
74
+ const success = await handleJobCompletion(jobId, workspace);
75
+ if (success) {
76
+ const rawResult = await JobService.getCompletedJobResult({ workspace, id: jobId });
77
+ console.log('Preview result:', rawResult);
78
+ // Convert new CLI format to expected format
79
+ const added = [];
80
+ const deleted = [];
81
+ const modified = [];
82
+ if (rawResult &&
83
+ rawResult.changes &&
84
+ Array.isArray(rawResult.changes)) {
85
+ for (const change of rawResult.changes) {
86
+ if (change.type === 'added') {
87
+ added.push(change.path);
88
+ }
89
+ else if (change.type === 'deleted') {
90
+ deleted.push(change.path);
91
+ }
92
+ else if (change.type === 'modified') {
93
+ modified.push(change.path);
94
+ }
95
+ }
96
+ }
97
+ // For full sync mode, just use the CLI results directly
98
+ // The CLI already handles wmill.yaml changes with --include-wmill-yaml flag
99
+ previewResult = { added, deleted, modified };
100
+ jobStatus.status = 'success';
101
+ }
102
+ else {
103
+ previewResult = undefined;
104
+ jobStatus.status = 'failure';
105
+ }
106
+ }
107
+ catch (error) {
108
+ console.error('Failed to preview changes:', error);
109
+ previewResult = undefined;
110
+ jobStatus = {
111
+ ...jobStatus,
112
+ status: 'failure',
113
+ error: error instanceof Error ? error.message : String(error)
114
+ };
115
+ }
116
+ finally {
117
+ isPreviewLoading = false;
118
+ }
119
+ }
120
+ async function pullFromRepo() {
121
+ const workspace = $workspaceStore;
122
+ if (!workspace)
123
+ return;
124
+ console.log('Pulling from repo:', gitRepoResourcePath);
125
+ isPulling = true;
126
+ jobStatus = { id: null, status: undefined, type: 'pull' };
127
+ try {
128
+ // Use init git repo script with dry_run: false (actual pull operation)
129
+ // The script will read wmill.yaml directly from the cloned repo, no need to pass settings
130
+ const jobId = await JobService.runScriptByPath({
131
+ workspace,
132
+ path: hubPaths.gitInitRepo,
133
+ requestBody: {
134
+ workspace_id: workspace,
135
+ repo_url_resource_path: gitRepoResourcePath,
136
+ dry_run: false,
137
+ branch_to_push: '',
138
+ only_wmill_yaml: false,
139
+ pull: true,
140
+ settings_json: undefined // Let script use wmill.yaml from repo
141
+ },
142
+ skipPreprocessor: true
143
+ });
144
+ jobStatus = { id: jobId, status: 'running', type: 'pull' };
145
+ const success = await handleJobCompletion(jobId, workspace);
146
+ jobStatus.status = success ? 'success' : 'failure';
147
+ if (success) {
148
+ // Get the result which should contain the local git repo settings as JSON
149
+ const result = (await JobService.getCompletedJobResult({ workspace, id: jobId }));
150
+ console.log('Pull result:', result);
151
+ // Apply the settings from the sync operation result to the UI
152
+ if (result?.settings_json) {
153
+ // Directly update the UI state with the JSON result - no YAML conversion needed!
154
+ const settingsJson = result.settings_json;
155
+ onFilterUpdate({
156
+ include_path: settingsJson.include_path || ['f/**'],
157
+ exclude_path: settingsJson.exclude_path || [],
158
+ extra_include_path: settingsJson.extra_include_path || [],
159
+ include_type: settingsJson.include_type || ['script', 'flow', 'app', 'folder']
160
+ });
161
+ sendUserToast('Successfully pulled workspace content from repository');
162
+ // Reset popover state after successful pull
163
+ previewResult = undefined;
164
+ jobStatus = { id: null, status: undefined, type: 'preview' };
165
+ pullGitRepoPopover?.close();
166
+ }
167
+ else {
168
+ console.warn('No settings_json returned from pull operation');
169
+ sendUserToast('Pull completed but could not update filter settings', true);
170
+ }
171
+ }
172
+ }
173
+ catch (error) {
174
+ console.error('Failed to pull from repo:', error);
175
+ jobStatus = {
176
+ ...jobStatus,
177
+ status: 'failure',
178
+ error: error instanceof Error ? error.message : String(error)
179
+ };
180
+ }
181
+ finally {
182
+ isPulling = false;
183
+ }
184
+ }
185
+ </script>
186
+
187
+ <Popover
188
+ bind:this={pullGitRepoPopover}
189
+ floatingConfig={{
190
+ placement: 'top-start',
191
+ strategy: 'fixed',
192
+ flip: false,
193
+ shift: true
194
+ }}
195
+ contentClasses="p-4 w-1/3"
196
+ >
197
+ <svelte:fragment slot="trigger">
198
+ <Button
199
+ color="dark"
200
+ size="sm"
201
+ nonCaptureEvent
202
+ onclick={pullGitRepoPopover?.open}
203
+ startIcon={{ icon: DownloadCloud }}
204
+ >
205
+ Pull workspace from Git repo
206
+ </Button>
207
+ </svelte:fragment>
208
+
209
+ <svelte:fragment slot="content" let:close>
210
+ <div class="flex flex-col gap-4">
211
+ <div class="flex flex-col gap-2">
212
+ <h3 class="text-lg font-semibold">Pull workspace from Git repository</h3>
213
+ <div class="prose max-w-none text-2xs text-tertiary">
214
+ This action will pull all workspace objects from your Git repository according to the
215
+ filters set in the Git repository wmill.yaml file and apply those filter settings to the
216
+ workspace.
217
+ <span class="text-orange-600 flex items-center gap-1">
218
+ <AlertTriangle size={14} /> This will overwrite your current workspace content and Git sync
219
+ filter settings with the content from the Git repository.
220
+ </span>
221
+
222
+ <!-- Collapsible CLI Info Section -->
223
+ <div class="mt-2 border rounded-md">
224
+ <button
225
+ class="w-full flex items-center justify-between p-1.5 bg-surface-secondary hover:bg-surface-hover"
226
+ onclick={() => (isCliInfoExpanded = !isCliInfoExpanded)}
227
+ >
228
+ <span class="font-medium flex items-center gap-2">
229
+ <Terminal size={14} />
230
+ Windmill CLI to push local files to Windmill
231
+ </span>
232
+ {#if isCliInfoExpanded}
233
+ <ChevronUp size={16} />
234
+ {:else}
235
+ <ChevronDown size={16} />
236
+ {/if}
237
+ </button>
238
+
239
+ {#if isCliInfoExpanded}
240
+ <div class="p-1 bg-surface-tertiary">
241
+ <div class="text-2xs mb-2">
242
+ Not familiar with Windmill CLI? <a
243
+ href="https://www.windmill.dev/docs/advanced/cli/sync"
244
+ class="text-blue-500 hover:text-blue-600 underline"
245
+ target="_blank"
246
+ rel="noopener noreferrer">Check out the docs</a
247
+ >
248
+ </div>
249
+ <div class="font-mono text-2xs">
250
+ <pre class="overflow-auto max-h-60"
251
+ ><code
252
+ >npm install -g windmill-cli
253
+ # Clone your git repository
254
+ git clone $REPO_URL
255
+ cd $REPO_NAME
256
+ # Configure Windmill CLI
257
+ wmill workspace add {$workspaceStore} {$workspaceStore} {`${$page.url.protocol}//${$page.url.hostname}/`}
258
+ # Push the content to Windmill
259
+ wmill sync push --yes
260
+ # Optional: add --skip-secrets --skip-variables --skip-resources flags as needed</code
261
+ ></pre
262
+ >
263
+ </div>
264
+ </div>
265
+ {/if}
266
+ </div>
267
+ </div>
268
+ </div>
269
+
270
+ {#if previewResult}
271
+ <GitDiffPreview {previewResult} />
272
+ {/if}
273
+
274
+ {#if jobStatus.id}
275
+ <div class="flex items-center gap-2 text-xs text-tertiary">
276
+ {#if jobStatus.status === 'running'}
277
+ <Loader2 class="animate-spin" size={14} />
278
+ {:else if jobStatus.status === 'success'}
279
+ <CheckCircle2 size={14} class="text-green-600" />
280
+ {:else if jobStatus.status === 'failure'}
281
+ <XCircle size={14} class="text-red-700" />
282
+ {/if}
283
+ {jobStatus.type === 'preview' ? 'Preview' : 'Pull'} job:
284
+ <a
285
+ target="_blank"
286
+ class="underline"
287
+ href={`/run/${jobStatus.id}?workspace=${$workspaceStore}`}
288
+ >
289
+ {jobStatus.id}
290
+ </a>
291
+ </div>
292
+ {#if jobStatus.error}
293
+ <div class="text-xs text-red-600">{jobStatus.error}</div>
294
+ {/if}
295
+ {/if}
296
+
297
+ <div class="flex justify-between items-center mt-4">
298
+ <Button
299
+ color="light"
300
+ size="xs"
301
+ on:click={() => {
302
+ previewResult = undefined
303
+ jobStatus = { id: null, status: undefined, type: 'preview' }
304
+ close()
305
+ }}
306
+ disabled={isPreviewLoading || isPulling}
307
+ >
308
+ Cancel
309
+ </Button>
310
+ <div class="flex gap-2">
311
+ {#if !previewResult}
312
+ <Button
313
+ size="xs"
314
+ on:click={previewChanges}
315
+ disabled={isPreviewLoading || isPulling}
316
+ startIcon={{
317
+ icon: isPreviewLoading ? Loader2 : Eye,
318
+ classes: isPreviewLoading ? 'animate-spin' : ''
319
+ }}
320
+ >
321
+ Preview
322
+ </Button>
323
+ {:else}
324
+ <Button
325
+ size="xs"
326
+ on:click={previewChanges}
327
+ disabled={isPreviewLoading || isPulling}
328
+ startIcon={{
329
+ icon: isPreviewLoading ? Loader2 : Eye,
330
+ classes: isPreviewLoading ? 'animate-spin' : ''
331
+ }}
332
+ title="Preview changes again"
333
+ >
334
+ Preview
335
+ </Button>
336
+ {#if previewResult.added?.length || previewResult.deleted?.length || previewResult.modified?.length}
337
+ <Button
338
+ color="red"
339
+ size="xs"
340
+ on:click={pullFromRepo}
341
+ disabled={isPreviewLoading || isPulling}
342
+ startIcon={{
343
+ icon: isPulling ? Loader2 : Save,
344
+ classes: isPulling ? 'animate-spin' : ''
345
+ }}
346
+ >
347
+ {isPulling ? 'Pulling...' : 'Pull'}
348
+ </Button>
349
+ {/if}
350
+ {/if}
351
+ </div>
352
+ </div>
353
+ </div>
354
+ </svelte:fragment>
355
+ </Popover>
@@ -0,0 +1,18 @@
1
+ type $$ComponentProps = {
2
+ gitRepoResourcePath: string;
3
+ uiState: {
4
+ include_path: string[];
5
+ exclude_path: string[];
6
+ extra_include_path: string[];
7
+ include_type: string[];
8
+ };
9
+ onFilterUpdate: (filters: {
10
+ include_path: string[];
11
+ exclude_path: string[];
12
+ extra_include_path: string[];
13
+ include_type: string[];
14
+ }) => void;
15
+ };
16
+ declare const PullGitRepoPopover: import("svelte").Component<$$ComponentProps, {}, "">;
17
+ type PullGitRepoPopover = ReturnType<typeof PullGitRepoPopover>;
18
+ export default PullGitRepoPopover;
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { run, createBubbler, stopPropagation } from 'svelte/legacy';
1
+ <script lang="ts">import { createBubbler, stopPropagation } from 'svelte/legacy';
2
2
  const bubble = createBubbler();
3
3
  import { File as FileIcon, FolderClosed, FolderOpen, RotateCw, Loader2, Download, Trash, FileUp, MoveRight } from 'lucide-svelte';
4
4
  import { workspaceStore } from '../stores';
@@ -47,8 +47,9 @@ let filter = $state('');
47
47
  let timeout = undefined;
48
48
  let firstLoad = true;
49
49
  let secondaryStorageNames = usePromise(() => SettingService.getSecondaryStorageNames({ workspace: $workspaceStore }), { loadInit: false });
50
+ let wasOpen = $state(false);
50
51
  $effect(() => {
51
- $workspaceStore && untrack(() => secondaryStorageNames.refresh());
52
+ wasOpen && $workspaceStore && untrack(() => secondaryStorageNames.refresh());
52
53
  });
53
54
  function onFilterChange() {
54
55
  if (!firstLoad) {
@@ -294,6 +295,7 @@ async function moveS3File(srcFileKey, destFileKey) {
294
295
  }
295
296
  let storage = $state(undefined);
296
297
  export async function open(_preSelectedFileKey = undefined) {
298
+ wasOpen = true;
297
299
  const preSelectedFileKey = _preSelectedFileKey && parseS3Object(_preSelectedFileKey);
298
300
  storage = preSelectedFileKey?.storage;
299
301
  if (preSelectedFileKey !== undefined) {
@@ -394,7 +396,7 @@ function selectItem(index, toggleCollapsed = true) {
394
396
  loadFileMetadataPlusPreviewAsync(selectedFileKey.s3);
395
397
  }
396
398
  }
397
- run(() => {
399
+ $effect.pre(() => {
398
400
  filter != undefined && untrack(() => onFilterChange());
399
401
  });
400
402
  </script>
@@ -10,7 +10,7 @@ import { ArrowLeftIcon, Edit, ExternalLink, X } from 'lucide-svelte';
10
10
  import Toggle from './Toggle.svelte';
11
11
  import Tooltip from './Tooltip.svelte';
12
12
  import TimeAgo from './TimeAgo.svelte';
13
- import JobLoader from './runs/JobLoader.svelte';
13
+ import JobsLoader from './runs/JobsLoader.svelte';
14
14
  import Skeleton from './common/skeleton/Skeleton.svelte';
15
15
  import SaveInputsButton from './SaveInputsButton.svelte';
16
16
  export let scriptHash = null;
@@ -118,7 +118,7 @@ async function loadLargeArgs(id, input, allowLarge) {
118
118
  </script>
119
119
 
120
120
  {#if runnableId}
121
- <JobLoader
121
+ <JobsLoader
122
122
  bind:jobs
123
123
  path={runnableId}
124
124
  isSkipped={false}
@@ -361,7 +361,7 @@ async function editScript(stay, parentHash, deploymentMsg, triggersToDeploy) {
361
361
  has_preprocessor: script.has_preprocessor,
362
362
  deployment_message: deploymentMsg || undefined,
363
363
  on_behalf_of_email: script.on_behalf_of_email,
364
- fallback_access_types: script.fallback_access_types
364
+ assets: script.assets
365
365
  }
366
366
  });
367
367
  if (!initialPath) {
@@ -488,7 +488,8 @@ async function saveDraft(forceSave = false) {
488
488
  visible_to_runner_only: script.visible_to_runner_only,
489
489
  no_main_func: script.no_main_func,
490
490
  has_preprocessor: script.has_preprocessor,
491
- on_behalf_of_email: script.on_behalf_of_email
491
+ on_behalf_of_email: script.on_behalf_of_email,
492
+ assets: script.assets
492
493
  }
493
494
  });
494
495
  }
@@ -1557,12 +1558,12 @@ async function loadWorkerTags() {
1557
1558
  kind={script.kind}
1558
1559
  {template}
1559
1560
  tag={script.tag}
1560
- bind:fallbackAccessTypes={script.fallback_access_types}
1561
1561
  lastSavedCode={savedScript?.draft?.content}
1562
1562
  lastDeployedCode={savedScript?.draft_only ? undefined : savedScript?.content}
1563
1563
  bind:args
1564
1564
  bind:hasPreprocessor
1565
1565
  bind:captureTable
1566
+ bind:assets={script.assets}
1566
1567
  />
1567
1568
  </div>
1568
1569
  {:else}
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">import { BROWSER } from 'esm-env';
2
- import { AssetService, JobService } from '../gen';
2
+ import { JobService } from '../gen';
3
3
  import { copilotInfo, enterpriseLicense, userStore, workspaceStore } from '../stores';
4
4
  import { copyToClipboard, emptySchema, sendUserToast } from '../utils';
5
5
  import Editor from './Editor.svelte';
@@ -8,7 +8,7 @@ import { Pane, Splitpanes } from 'svelte-splitpanes';
8
8
  import SchemaForm from './SchemaForm.svelte';
9
9
  import LogPanel from './scriptEditor/LogPanel.svelte';
10
10
  import EditorBar, { EDITOR_BAR_WIDTH_THRESHOLD } from './EditorBar.svelte';
11
- import TestJobLoader from './TestJobLoader.svelte';
11
+ import JobLoader from './JobLoader.svelte';
12
12
  import JobProgressBar from './jobs/JobProgressBar.svelte';
13
13
  import { createEventDispatcher, onDestroy, onMount, untrack } from 'svelte';
14
14
  import { Button } from './common';
@@ -34,9 +34,8 @@ import { getStringError } from './copilot/chat/utils';
34
34
  import { aiChatManager, AIMode } from './copilot/chat/AIChatManager.svelte';
35
35
  import { triggerableByAI } from '../actions/triggerableByAI.svelte';
36
36
  import AssetsDropdownButton from './assets/AssetsDropdownButton.svelte';
37
- import { usePromise } from '../svelte5Utils.svelte';
38
37
  import { assetEq } from './assets/lib';
39
- let { schema = $bindable(), code = $bindable(), path, lang, kind = undefined, template = 'script', tag, fixedOverflowWidgets = true, noSyncFromGithub = false, editor = $bindable(undefined), diffEditor = $bindable(undefined), collabMode = false, edit = true, noHistory = false, saveToWorkspace = false, watchChanges = false, customUi = undefined, args = $bindable(), selectedTab = $bindable('main'), hasPreprocessor = $bindable(false), captureTable = $bindable(undefined), showCaptures = true, stablePathForCaptures = '', lastSavedCode = undefined, lastDeployedCode = undefined, disableAi = false, editor_bar_right, fallbackAccessTypes = $bindable() } = $props();
38
+ let { schema = $bindable(), code = $bindable(), path, lang, kind = undefined, template = 'script', tag, fixedOverflowWidgets = true, noSyncFromGithub = false, editor = $bindable(undefined), diffEditor = $bindable(undefined), collabMode = false, edit = true, noHistory = false, saveToWorkspace = false, watchChanges = false, customUi = undefined, args = $bindable(), selectedTab = $bindable('main'), hasPreprocessor = $bindable(false), captureTable = $bindable(undefined), showCaptures = true, stablePathForCaptures = '', lastSavedCode = undefined, lastDeployedCode = undefined, disableAi = false, assets = $bindable(), editor_bar_right } = $props();
40
39
  $effect.pre(() => {
41
40
  if (schema == undefined) {
42
41
  schema = emptySchema();
@@ -58,29 +57,22 @@ $effect(() => {
58
57
  (code != undefined || schema != undefined) &&
59
58
  dispatch('change', { code, schema });
60
59
  });
61
- let parsedAssets = usePromise(() => inferAssets(lang, code), { clearValueOnRefresh: false });
62
60
  $effect(() => {
63
- untrack(() => parsedAssets.refresh()), [lang, code];
64
- });
65
- // Load initial fallbackAccessTypes
66
- if (edit && path) {
67
- AssetService.listAssetsByUsage({
68
- workspace: $workspaceStore,
69
- requestBody: { usages: [{ path, kind: 'script' }] }
70
- }).then((arr) => {
71
- const v = arr[0];
72
- setTimeout(() => {
73
- for (const a of parsedAssets.value ?? []) {
74
- const fallback = v.find((a2) => assetEq(a2, a))?.access_type;
75
- if (!a.access_type && fallback) {
76
- fallbackAccessTypes = [...(fallbackAccessTypes ?? []), { ...a, access_type: fallback }];
77
- }
61
+ ;
62
+ [lang, code];
63
+ untrack(() => {
64
+ inferAssets(lang, code).then((newAssets) => {
65
+ for (const asset of newAssets) {
66
+ const old = assets?.find((a) => assetEq(a, asset));
67
+ if (old?.alt_access_type)
68
+ asset.alt_access_type = old.alt_access_type;
78
69
  }
79
- }, 200);
70
+ assets = newAssets;
71
+ });
80
72
  });
81
- }
73
+ });
82
74
  let width = $state(1200);
83
- let testJobLoader = $state(undefined);
75
+ let jobLoader = $state(undefined);
84
76
  let isValid = $state(true);
85
77
  let scriptProgress = $state(undefined);
86
78
  let logPanel = $state(undefined);
@@ -119,9 +111,17 @@ export async function runTest() {
119
111
  if (jobProgressReset)
120
112
  jobProgressReset();
121
113
  //@ts-ignore
122
- let job = await testJobLoader.runPreview(path, code, lang, selectedTab === 'preprocessor' || kind === 'preprocessor'
114
+ let job = await jobLoader.runPreview(path, code, lang, selectedTab === 'preprocessor' || kind === 'preprocessor'
123
115
  ? { _ENTRYPOINT_OVERRIDE: 'preprocessor', ...(args ?? {}) }
124
- : (args ?? {}), tag);
116
+ : (args ?? {}), tag, undefined, undefined, {
117
+ done(_x) {
118
+ loadPastTests();
119
+ },
120
+ doneError({ error }) {
121
+ console.error(error);
122
+ // sendUserToast('Error running test', true)
123
+ }
124
+ });
125
125
  logPanel?.setFocusToLogs();
126
126
  return job;
127
127
  }
@@ -304,10 +304,10 @@ $effect(() => {
304
304
  });
305
305
  </script>
306
306
 
307
- <TestJobLoader
308
- on:done={loadPastTests}
307
+ <JobLoader
308
+ noCode={true}
309
309
  bind:scriptProgress
310
- bind:this={testJobLoader}
310
+ bind:this={jobLoader}
311
311
  bind:isLoading={testIsLoading}
312
312
  bind:job={testJob}
313
313
  />
@@ -401,8 +401,8 @@ $effect(() => {
401
401
  <Pane bind:size={codePanelSize} minSize={10} class="!overflow-visible">
402
402
  <div class="h-full !overflow-visible bg-gray-50 dark:bg-[#272D38] relative">
403
403
  <div class="absolute top-2 right-4 z-10 flex flex-row gap-2">
404
- {#if parsedAssets.value?.length}
405
- <AssetsDropdownButton assets={parsedAssets.value} bind:fallbackAccessTypes />
404
+ {#if assets?.length}
405
+ <AssetsDropdownButton {assets} />
406
406
  {/if}
407
407
  {#if testPanelSize === 0}
408
408
  <HideButton
@@ -435,6 +435,9 @@ $effect(() => {
435
435
  }}
436
436
  btnClasses="!text-violet-800 dark:!text-violet-400 border border-gray-200 dark:border-gray-600 bg-surface"
437
437
  on:click={() => {
438
+ if (!aiChatManager.open) {
439
+ aiChatManager.changeMode(AIMode.SCRIPT)
440
+ }
438
441
  aiChatManager.toggleOpen()
439
442
  }}
440
443
  >
@@ -532,7 +535,7 @@ $effect(() => {
532
535
  />
533
536
  </div>
534
537
  {#if testIsLoading}
535
- <Button on:click={testJobLoader?.cancelJob} btnClasses="w-full" color="red" size="xs">
538
+ <Button on:click={jobLoader?.cancelJob} btnClasses="w-full" color="red" size="xs">
536
539
  <WindmillIcon
537
540
  white={true}
538
541
  class="mr-2 text-white"
@@ -4,7 +4,7 @@ import Editor from './Editor.svelte';
4
4
  import DiffEditor from './DiffEditor.svelte';
5
5
  import type { ScriptEditorWhitelabelCustomUi } from './custom_ui';
6
6
  import CaptureTable from './triggers/CaptureTable.svelte';
7
- import { type AssetWithAccessType } from './assets/lib';
7
+ import { type AssetWithAltAccessType } from './assets/lib';
8
8
  interface Props {
9
9
  schema?: Schema | any;
10
10
  code: string;
@@ -33,8 +33,8 @@ interface Props {
33
33
  lastSavedCode?: string | undefined;
34
34
  lastDeployedCode?: string | undefined;
35
35
  disableAi?: boolean;
36
+ assets?: AssetWithAltAccessType[];
36
37
  editor_bar_right?: import('svelte').Snippet;
37
- fallbackAccessTypes?: AssetWithAccessType[];
38
38
  }
39
39
  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> {
40
40
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -74,6 +74,6 @@ declare const ScriptEditor: $$__sveltets_2_IsomorphicComponent<Props, {
74
74
  setCollaborationMode: () => Promise<void>;
75
75
  disableCollaboration: () => void;
76
76
  updateArgs: (newArgs: Record<string, any>) => Promise<void>;
77
- }, "args" | "code" | "schema" | "editor" | "selectedTab" | "diffEditor" | "hasPreprocessor" | "fallbackAccessTypes" | "captureTable">;
77
+ }, "args" | "code" | "assets" | "schema" | "editor" | "selectedTab" | "diffEditor" | "hasPreprocessor" | "captureTable">;
78
78
  type ScriptEditor = InstanceType<typeof ScriptEditor>;
79
79
  export default ScriptEditor;
@@ -17,7 +17,7 @@ import SplitPanesOrColumnOnMobile from './splitPanes/SplitPanesOrColumnOnMobile.
17
17
  import Select from './select/Select.svelte';
18
18
  import { goto } from '../navigation';
19
19
  import { page } from '$app/stores';
20
- let { searchTerm, queryParseErrors = $bindable() } = $props();
20
+ let { searchTerm, queryParseErrors = $bindable(), tagLabel } = $props();
21
21
  let minTs = $state(undefined);
22
22
  let maxTs = $state(undefined);
23
23
  let minTsManual = $state($page.url.searchParams.get('minTs') ?? undefined);
@@ -688,6 +688,7 @@ $effect(() => {
688
688
  noMaxH
689
689
  isLoading={false}
690
690
  tag={undefined}
691
+ {tagLabel}
691
692
  content={processLogWithJsonFmt(
692
693
  logsContent[file.file_path].content,
693
694
  file.json_fmt
@@ -1,6 +1,7 @@
1
1
  interface Props {
2
2
  searchTerm: string;
3
3
  queryParseErrors?: string[];
4
+ tagLabel?: string;
4
5
  }
5
6
  declare const ServiceLogsInner: import("svelte").Component<Props, {
6
7
  getLogFile: (hostname: string, path: string) => Promise<void>;
@@ -27,7 +27,7 @@ function handleTokenCreated(event) {
27
27
  }
28
28
  </script>
29
29
 
30
- <Drawer bind:this={drawer} size="800px" on:close={removeHash}>
30
+ <Drawer bind:this={drawer} size="900px" on:close={removeHash}>
31
31
  <DrawerContent title="User Settings" on:close={closeDrawer}>
32
32
  <div class="flex flex-col h-full">
33
33
  {#if scopes == undefined}