windmill-components 1.665.1 → 1.677.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 (252) hide show
  1. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
  2. package/dist/sharedUtils/base.d.ts +1 -0
  3. package/dist/sharedUtils/cloud.d.ts +1 -0
  4. package/dist/sharedUtils/common.d.ts +111 -0
  5. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
  6. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
  7. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
  8. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
  9. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
  10. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
  11. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
  12. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
  13. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
  14. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
  15. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
  16. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
  17. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
  18. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
  19. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
  20. package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
  21. package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
  22. package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
  23. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
  24. package/dist/sharedUtils/components/apps/types.d.ts +274 -0
  25. package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
  26. package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
  27. package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
  28. package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
  29. package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
  30. package/dist/sharedUtils/components/common/index.d.ts +24 -0
  31. package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
  32. package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
  33. package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
  34. package/dist/sharedUtils/components/ducklake.d.ts +1 -0
  35. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
  36. package/dist/sharedUtils/components/icons/index.d.ts +101 -0
  37. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
  38. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
  39. package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
  40. package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
  41. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
  42. package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
  43. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
  44. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
  45. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
  46. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
  47. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
  48. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
  49. package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
  50. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
  51. package/dist/sharedUtils/components/triggers.d.ts +20 -0
  52. package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
  53. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
  54. package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
  55. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
  56. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
  57. package/dist/sharedUtils/gen/core/request.d.ts +29 -0
  58. package/dist/sharedUtils/gen/index.d.ts +6 -0
  59. package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
  60. package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
  61. package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
  62. package/dist/sharedUtils/history.svelte.d.ts +9 -0
  63. package/dist/sharedUtils/hub.d.ts +49 -0
  64. package/dist/sharedUtils/jsr.json +6 -0
  65. package/dist/sharedUtils/lib.d.ts +5 -0
  66. package/dist/sharedUtils/lib.es.js +1588 -0
  67. package/dist/sharedUtils/package.json +12 -0
  68. package/dist/sharedUtils/schema.d.ts +3 -0
  69. package/dist/sharedUtils/stores.d.ts +97 -0
  70. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
  71. package/dist/sharedUtils/toast.d.ts +8 -0
  72. package/dist/sharedUtils/utils.d.ts +265 -0
  73. package/package/components/AddUser.svelte +67 -34
  74. package/package/components/AppConnectInner.svelte +9 -1
  75. package/package/components/ArgInfo.svelte +9 -1
  76. package/package/components/ArgInput.svelte +21 -1
  77. package/package/components/CompareWorkspaces.svelte +11 -2
  78. package/package/components/DedicatedWorkersSelector.svelte +262 -247
  79. package/package/components/DefaultTagsInner.svelte +40 -2
  80. package/package/components/DeployWorkspace.svelte +13 -0
  81. package/package/components/DiffEditor.svelte +44 -1
  82. package/package/components/EditableSchemaForm.svelte +5 -2
  83. package/package/components/EditableSchemaForm.svelte.d.ts +1 -0
  84. package/package/components/Editor.svelte +5 -1
  85. package/package/components/EditorBar.svelte +12 -3
  86. package/package/components/FilterSearchbar.svelte +26 -2
  87. package/package/components/FlowBuilder.svelte +6 -3
  88. package/package/components/FlowGraphDiffViewer.svelte +16 -17
  89. package/package/components/FlowGraphViewer.svelte +20 -6
  90. package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
  91. package/package/components/FlowGraphViewerStep.svelte +14 -32
  92. package/package/components/FlowMetadata.svelte +4 -1
  93. package/package/components/FlowPreviewContent.svelte +2 -0
  94. package/package/components/FlowStatusWaitingForEvents.svelte +25 -4
  95. package/package/components/HighlightCode.svelte +3 -0
  96. package/package/components/InstanceSetting.svelte +9 -25
  97. package/package/components/InstanceSettings.svelte +16 -0
  98. package/package/components/LabelsInput.svelte +149 -0
  99. package/package/components/LabelsInput.svelte.d.ts +8 -0
  100. package/package/components/Login.svelte +6 -1
  101. package/package/components/ObjectStoreConfigSettings.svelte +273 -1
  102. package/package/components/OktaSetting.svelte +6 -5
  103. package/package/components/Password.svelte +74 -20
  104. package/package/components/Password.svelte.d.ts +1 -0
  105. package/package/components/PasswordArgInput.svelte +2 -2
  106. package/package/components/PasswordArgInput.svelte.d.ts +1 -0
  107. package/package/components/Path.svelte +8 -10
  108. package/package/components/PathNameAutocomplete.svelte +308 -0
  109. package/package/components/PathNameAutocomplete.svelte.d.ts +27 -0
  110. package/package/components/PowerShellCommonParams.svelte +84 -0
  111. package/package/components/PowerShellCommonParams.svelte.d.ts +6 -0
  112. package/package/components/Range.svelte +8 -3
  113. package/package/components/ResourceEditor.svelte +6 -2
  114. package/package/components/RunForm.svelte +71 -7
  115. package/package/components/RunForm.svelte.d.ts +2 -1
  116. package/package/components/ScriptBuilder.svelte +7 -3
  117. package/package/components/ScriptEditor.svelte +221 -187
  118. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  119. package/package/components/ScriptSchema.svelte +1 -1
  120. package/package/components/StringTypeNarrowing.svelte +1 -1
  121. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  122. package/package/components/SummaryPathDisplay.svelte +32 -10
  123. package/package/components/SummaryPathDisplay.svelte.d.ts +2 -1
  124. package/package/components/VariableEditor.svelte +9 -2
  125. package/package/components/WorkerGroup.svelte +47 -2
  126. package/package/components/apps/editor/DeploymentHistory.svelte +112 -13
  127. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +135 -35
  128. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +3 -1
  129. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +11 -35
  130. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.d.ts +10 -0
  131. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.js +14 -0
  132. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.d.ts +1 -0
  133. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.js +34 -0
  134. package/package/components/assets/AssetButtons.svelte +21 -25
  135. package/package/components/assets/AssetsUsageDrawer.svelte +7 -9
  136. package/package/components/common/fileUpload/FileUpload.svelte +6 -2
  137. package/package/components/common/languageIcons/LanguageIcon.svelte +3 -0
  138. package/package/components/common/table/AppRow.svelte +18 -0
  139. package/package/components/common/table/FlowRow.svelte +18 -0
  140. package/package/components/common/table/ScriptRow.svelte +18 -0
  141. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -3
  142. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  143. package/package/components/copilot/chat/flow/openFlowZod.js +3 -3
  144. package/package/components/custom_ui.d.ts +2 -0
  145. package/package/components/details/DetailPageHeader.svelte +2 -2
  146. package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
  147. package/package/components/flows/agentToolUtils.d.ts +5 -0
  148. package/package/components/flows/agentToolUtils.js +49 -0
  149. package/package/components/flows/agentToolUtils.test.d.ts +1 -0
  150. package/package/components/flows/agentToolUtils.test.js +55 -0
  151. package/package/components/flows/content/FlowInput.svelte +2 -0
  152. package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
  153. package/package/components/flows/content/FlowLoop.svelte +5 -12
  154. package/package/components/flows/content/FlowModuleScript.svelte +5 -3
  155. package/package/components/flows/content/FlowPathViewer.svelte +2 -2
  156. package/package/components/flows/content/FlowPathViewer.svelte.d.ts +1 -0
  157. package/package/components/flows/content/FlowSettings.svelte +2 -0
  158. package/package/components/flows/content/FlowWhileLoop.svelte +5 -12
  159. package/package/components/flows/flowInfers.js +8 -3
  160. package/package/components/flows/map/FlowModuleSchemaMap.svelte +49 -9
  161. package/package/components/flows/pickers/PickHubScriptQuick.svelte +5 -3
  162. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -1
  163. package/package/components/flows/scheduleUtils.js +2 -1
  164. package/package/components/graph/FlowGraphV2.svelte +13 -1
  165. package/package/components/graph/WacDiagram.svelte +96 -0
  166. package/package/components/graph/WacDiagram.svelte.d.ts +7 -0
  167. package/package/components/graph/noteEditor.svelte.d.ts +1 -1
  168. package/package/components/graph/noteEditor.svelte.js +12 -1
  169. package/package/components/graph/noteUtils.svelte.d.ts +1 -1
  170. package/package/components/graph/noteUtils.svelte.js +9 -2
  171. package/package/components/graph/renderers/edges/WacEdge.svelte +41 -0
  172. package/package/components/graph/renderers/edges/WacEdge.svelte.d.ts +4 -0
  173. package/package/components/graph/renderers/nodes/WacControlNode.svelte +51 -0
  174. package/package/components/graph/renderers/nodes/WacControlNode.svelte.d.ts +9 -0
  175. package/package/components/graph/renderers/nodes/WacStepNode.svelte +35 -0
  176. package/package/components/graph/renderers/nodes/WacStepNode.svelte.d.ts +9 -0
  177. package/package/components/graph/wacDagLayout.d.ts +10 -0
  178. package/package/components/graph/wacDagLayout.js +120 -0
  179. package/package/components/graph/wacToFlow.js +1 -1
  180. package/package/components/home/ItemsList.svelte +28 -4
  181. package/package/components/icons/RIcon.svelte +32 -0
  182. package/package/components/icons/RIcon.svelte.d.ts +7 -0
  183. package/package/components/instanceSettings/DbHealth.svelte +723 -0
  184. package/package/components/instanceSettings/DbHealth.svelte.d.ts +3 -0
  185. package/package/components/instanceSettings/SecretBackendConfig.svelte +343 -304
  186. package/package/components/instanceSettings/SmtpSettings.svelte +8 -0
  187. package/package/components/instanceSettings.js +14 -5
  188. package/package/components/mcp/McpScopeSelector.svelte +82 -16
  189. package/package/components/moveRenameManager.d.ts +1 -0
  190. package/package/components/moveRenameManager.js +7 -4
  191. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +14 -1
  192. package/package/components/raw_apps/rawAppPolicy.js +3 -2
  193. package/package/components/raw_apps/utils.test.d.ts +1 -0
  194. package/package/components/raw_apps/utils.test.js +38 -0
  195. package/package/components/resources/resourcesFilter.d.ts +15 -2
  196. package/package/components/resources/resourcesFilter.js +11 -2
  197. package/package/components/runs/JobDetailFieldConfig.js +5 -3
  198. package/package/components/runs/JobDetailHeader.svelte +5 -2
  199. package/package/components/runs/JobRunsPreview.svelte +1 -0
  200. package/package/components/runs/RunBadges.svelte +7 -4
  201. package/package/components/runs/RunRow.svelte +7 -7
  202. package/package/components/schedules/schedulesFilter.d.ts +15 -2
  203. package/package/components/schedules/schedulesFilter.js +11 -2
  204. package/package/components/schema/EditableSchemaWrapper.svelte +6 -8
  205. package/package/components/schema/PropertyEditor.svelte +22 -1
  206. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -0
  207. package/package/components/schema/editable_schema_wrapper.d.ts +1 -0
  208. package/package/components/secretArgUtils.d.ts +7 -0
  209. package/package/components/secretArgUtils.js +45 -0
  210. package/package/components/settings/WorkspaceUserSettings.svelte +359 -286
  211. package/package/components/sidebar/OperatorMenu.svelte +215 -197
  212. package/package/components/triggers/CaptureWrapper.svelte +1 -1
  213. package/package/components/triggers/TriggerFilters.svelte +17 -5
  214. package/package/components/triggers/TriggerFilters.svelte.d.ts +2 -1
  215. package/package/components/triggers/kafka/KafkaCapture.svelte +6 -2
  216. package/package/components/triggers/kafka/KafkaCapture.svelte.d.ts +1 -1
  217. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +5 -1
  218. package/package/components/triggers/kafka/utils.js +1 -0
  219. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +6 -0
  220. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +87 -1
  221. package/package/components/triggers/websocket/utils.js +2 -0
  222. package/package/components/variables/variablesFilter.d.ts +15 -2
  223. package/package/components/variables/variablesFilter.js +11 -2
  224. package/package/components/worker_group.js +1 -0
  225. package/package/components/workspaceSettings/DucklakeSettings.svelte +33 -41
  226. package/package/consts.d.ts +1 -0
  227. package/package/consts.js +1 -0
  228. package/package/editorLangUtils.d.ts +1 -1
  229. package/package/editorLangUtils.js +2 -0
  230. package/package/gen/core/OpenAPI.js +1 -1
  231. package/package/gen/schemas.gen.d.ts +94 -294
  232. package/package/gen/schemas.gen.js +94 -294
  233. package/package/gen/services.gen.d.ts +5 -121
  234. package/package/gen/services.gen.js +5 -237
  235. package/package/gen/types.gen.d.ts +91 -715
  236. package/package/hubPaths.json +6 -3
  237. package/package/infer.d.ts +55 -0
  238. package/package/infer.js +131 -0
  239. package/package/infer.svelte.js +2 -0
  240. package/package/mcpEndpointTools.js +213 -22
  241. package/package/script_helpers.d.ts +3 -0
  242. package/package/script_helpers.js +26 -0
  243. package/package/scripts.d.ts +2 -1
  244. package/package/scripts.js +15 -3
  245. package/package/stores.d.ts +2 -0
  246. package/package/system_prompts/prompts.d.ts +6 -5
  247. package/package/system_prompts/prompts.js +188 -29
  248. package/package/user.js +5 -1
  249. package/package/utils.js +21 -0
  250. package/package/utils_deployable.d.ts +7 -0
  251. package/package/utils_workspace_deploy.js +36 -8
  252. package/package.json +6 -5
@@ -3,7 +3,7 @@ import { ExternalLink, Loader2, Save } from 'lucide-svelte';
3
3
  import { SettingService, WorkerService, WorkspaceService } from '../gen';
4
4
  import { sendUserToast } from '../toast';
5
5
  import { enterpriseLicense, superadmin } from '../stores';
6
- import { DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING } from '../consts';
6
+ import { DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, PREVIEW_TAGS_OVERRIDE_SETTING } from '../consts';
7
7
  import Toggle from './Toggle.svelte';
8
8
  import MultiSelect from './select/MultiSelect.svelte';
9
9
  import { safeSelectItems } from './select/utils.svelte';
@@ -12,13 +12,16 @@ import Section from './Section.svelte';
12
12
  let { defaultTagPerWorkspace = $bindable(undefined), defaultTagWorkspaces = $bindable([]) } = $props();
13
13
  let defaultTags = $state(undefined);
14
14
  let limitToWorkspaces = $state(false);
15
+ let previewTagsOverride = $state(false);
15
16
  // Change detection
16
17
  let originalDefaultTagPerWorkspace = $state(defaultTagPerWorkspace);
17
18
  let originalDefaultTagWorkspaces = $state(defaultTagWorkspaces);
19
+ let originalPreviewTagsOverride = $state(false);
18
20
  // Detect changes
19
21
  let hasChanges = $derived(originalDefaultTagPerWorkspace !== defaultTagPerWorkspace ||
20
22
  JSON.stringify($state.snapshot(originalDefaultTagWorkspaces)?.sort() || []) !==
21
- JSON.stringify($state.snapshot(defaultTagWorkspaces)?.sort() || []));
23
+ JSON.stringify($state.snapshot(defaultTagWorkspaces)?.sort() || []) ||
24
+ originalPreviewTagsOverride !== previewTagsOverride);
22
25
  let workspaces = $state([]);
23
26
  async function loadWorkspaces() {
24
27
  workspaces = (await WorkspaceService.listWorkspacesAsSuperAdmin()).map((m) => m.id);
@@ -31,6 +34,11 @@ async function loadDefaultTags() {
31
34
  key: DEFAULT_TAGS_WORKSPACES_SETTING
32
35
  })) ?? [];
33
36
  limitToWorkspaces = defaultTagWorkspaces ? defaultTagWorkspaces.length > 0 : false;
37
+ previewTagsOverride =
38
+ (await SettingService.getGlobal({
39
+ key: PREVIEW_TAGS_OVERRIDE_SETTING
40
+ })) ?? false;
41
+ originalPreviewTagsOverride = previewTagsOverride;
34
42
  }
35
43
  catch (err) {
36
44
  sendUserToast(`Could not load default tags: ${err}`, true);
@@ -51,9 +59,16 @@ async function handleSave() {
51
59
  : undefined
52
60
  }
53
61
  });
62
+ await SettingService.setGlobal({
63
+ key: PREVIEW_TAGS_OVERRIDE_SETTING,
64
+ requestBody: {
65
+ value: previewTagsOverride
66
+ }
67
+ });
54
68
  // Update original state after save
55
69
  originalDefaultTagPerWorkspace = defaultTagPerWorkspace;
56
70
  originalDefaultTagWorkspaces = [...(defaultTagWorkspaces || [])];
71
+ originalPreviewTagsOverride = previewTagsOverride;
57
72
  loadDefaultTags();
58
73
  sendUserToast('Saved');
59
74
  }
@@ -126,6 +141,18 @@ loadWorkspaces();
126
141
  />
127
142
  {/if}
128
143
  {/if}
144
+ <div class="flex flex-col gap-1">
145
+ <Toggle
146
+ bind:checked={previewTagsOverride}
147
+ options={{
148
+ right: 'route preview jobs to dedicated preview tag',
149
+ rightTooltip:
150
+ 'When enabled, preview jobs (script previews and flow previews) will be routed to the "preview" tag instead of their language-specific tag, allowing you to dedicate specific workers for previews.'
151
+ }}
152
+ class="w-fit"
153
+ disabled={!$enterpriseLicense}
154
+ />
155
+ </div>
129
156
  </div>
130
157
 
131
158
  <div class="flex gap-2 items-center mb-1">
@@ -148,6 +175,17 @@ loadWorkspaces();
148
175
  </div>
149
176
  </div>
150
177
  {/each}
178
+ {#if previewTagsOverride}
179
+ <div class="flex gap-2 items-center">
180
+ <div class="w-36">
181
+ <Badge color="transparent">preview</Badge>
182
+ </div>
183
+ <div class="w-6 flex justify-center text-secondary">&rightarrow;</div>
184
+ <div class="flex-1">
185
+ <Badge color="blue">{defaultTagPerWorkspace ? 'preview-$workspace' : 'preview'}</Badge>
186
+ </div>
187
+ </div>
188
+ {/if}
151
189
  </div>
152
190
  {/if}
153
191
  </Section>
@@ -207,12 +207,25 @@ async function getDependencies(kind, path) {
207
207
  }
208
208
  throw new Error('Missing trigger information');
209
209
  }
210
+ else if (kind == 'script') {
211
+ const imports = await WorkspaceService.getImports({
212
+ workspace: $workspaceStore,
213
+ importerPath: path
214
+ });
215
+ return imports.map((importedPath) => ({ kind: 'script', path: importedPath }));
216
+ }
210
217
  return [];
211
218
  }
212
219
  let toProcess = [{ kind, path }];
220
+ let processedSet = new Set();
213
221
  let processed = [];
214
222
  while (toProcess.length > 0) {
215
223
  const { kind, path } = toProcess.pop();
224
+ const key = `${kind}:${path}`;
225
+ if (processedSet.has(key)) {
226
+ continue;
227
+ }
228
+ processedSet.add(key);
216
229
  toProcess.push(...(await rec(kind, path)));
217
230
  processed.push({ kind, path });
218
231
  }
@@ -63,11 +63,18 @@ async function loadDiffEditor() {
63
63
  }
64
64
  });
65
65
  }
66
- if (defaultLang !== undefined || defaultOriginal !== undefined || defaultModified !== undefined) {
66
+ if (defaultLang !== undefined ||
67
+ defaultOriginal !== undefined ||
68
+ defaultModified !== undefined ||
69
+ modifiedModel !== undefined) {
67
70
  setupModel(defaultLang ?? 'plaintext', defaultOriginal, defaultModified, defaultModifiedLang);
68
71
  }
69
72
  }
70
73
  export function setupModel(lang, original, modified, modifiedLang) {
74
+ defaultLang = lang;
75
+ defaultOriginal = original;
76
+ defaultModified = modified;
77
+ defaultModifiedLang = modifiedLang;
71
78
  const o = meditor.createModel(original ?? '', lang);
72
79
  const m = modifiedModel ?? meditor.createModel(modified ?? '', modifiedLang ?? lang);
73
80
  diffEditor?.setModel({
@@ -87,6 +94,7 @@ export function setModified(code) {
87
94
  defaultModified = code;
88
95
  }
89
96
  export function setModifiedModel(model) {
97
+ modifiedModel = model;
90
98
  const curr = diffEditor?.getModel();
91
99
  if (!curr)
92
100
  return;
@@ -121,6 +129,41 @@ $effect(() => {
121
129
  });
122
130
  }
123
131
  });
132
+ $effect(() => {
133
+ if (!diffEditor) {
134
+ return;
135
+ }
136
+ const lang = defaultLang ?? 'plaintext';
137
+ const modifiedLang = defaultModifiedLang ?? lang;
138
+ const currentModel = diffEditor.getModel();
139
+ if (!currentModel) {
140
+ setupModel(lang, defaultOriginal, defaultModified, defaultModifiedLang);
141
+ return;
142
+ }
143
+ if (currentModel.original.getLanguageId() !== lang) {
144
+ meditor.setModelLanguage(currentModel.original, lang);
145
+ }
146
+ const originalValue = defaultOriginal ?? '';
147
+ if (currentModel.original.getValue() !== originalValue) {
148
+ currentModel.original.setValue(originalValue);
149
+ }
150
+ if (modifiedModel) {
151
+ if (currentModel.modified !== modifiedModel) {
152
+ diffEditor.setModel({
153
+ original: currentModel.original,
154
+ modified: modifiedModel
155
+ });
156
+ }
157
+ return;
158
+ }
159
+ if (currentModel.modified.getLanguageId() !== modifiedLang) {
160
+ meditor.setModelLanguage(currentModel.modified, modifiedLang);
161
+ }
162
+ const modifiedValue = defaultModified ?? '';
163
+ if (currentModel.modified.getValue() !== modifiedValue) {
164
+ currentModel.modified.setValue(modifiedValue);
165
+ }
166
+ });
124
167
  onMount(() => {
125
168
  if (BROWSER) {
126
169
  return () => {
@@ -27,7 +27,7 @@ import Editor from './Editor.svelte';
27
27
  import AddPropertyV2 from './schema/AddPropertyV2.svelte';
28
28
  // export let openEditTab: () => void = () => {}
29
29
  const dispatch = createEventDispatcher();
30
- let { schema = $bindable(), hiddenArgs = [], args = $bindable(undefined), shouldHideNoInputs = false, noVariablePicker = false, flexWrap = false, uiOnly = false, isFlowInput = false, noPreview = false, jsonEnabled = true, isAppInput = false, displayWebhookWarning = false, onlyMaskPassword = false, editTab, previewSchema = undefined, editPanelInitialSize = undefined, editPanelSize = $bindable(0), diff = {}, disableDnd = false, shouldDispatchChanges = false, isValid = $bindable(true), customUi = undefined, pannelExtraButtonWidth = 0, class: clazz = '', dynCode = $bindable(), dynLang = $bindable(), showDynOpt = false, addPropertyInEditorTab = false, openEditTab, addProperty, runButton, extraTab, schemaFormClassName = undefined, onChange = undefined } = $props();
30
+ let { schema = $bindable(), hiddenArgs = [], args = $bindable(undefined), shouldHideNoInputs = false, noVariablePicker = false, flexWrap = false, uiOnly = false, isFlowInput = false, noPreview = false, jsonEnabled = true, isAppInput = false, showSensitiveToggle = false, displayWebhookWarning = false, onlyMaskPassword = false, editTab, previewSchema = undefined, editPanelInitialSize = undefined, editPanelSize = $bindable(0), diff = {}, disableDnd = false, shouldDispatchChanges = false, isValid = $bindable(true), customUi = undefined, pannelExtraButtonWidth = 0, class: clazz = '', dynCode = $bindable(), dynLang = $bindable(), showDynOpt = false, addPropertyInEditorTab = false, openEditTab, addProperty, runButton, extraTab, schemaFormClassName = undefined, onChange = undefined } = $props();
31
31
  $effect.pre(() => {
32
32
  if (args == undefined) {
33
33
  args = {};
@@ -184,7 +184,9 @@ export function updateJson() {
184
184
  editor?.setCode(schemaString);
185
185
  }
186
186
  const editTabDefaultSize = untrack(() => noPreview) ? 100 : 50;
187
- editPanelSize = untrack(() => editTab) ? (untrack(() => editPanelInitialSize) ?? editTabDefaultSize) : 0;
187
+ editPanelSize = untrack(() => editTab)
188
+ ? (untrack(() => editPanelInitialSize) ?? editTabDefaultSize)
189
+ : 0;
188
190
  let inputPanelSize = $state(100 - editPanelSize);
189
191
  let editPanelSizeSmooth = tweened(editPanelSize, {
190
192
  duration: 150
@@ -547,6 +549,7 @@ let dndType = $state(generateRandomString());
547
549
  bind:order={schema.properties[argName].order}
548
550
  {isFlowInput}
549
551
  {isAppInput}
552
+ {showSensitiveToggle}
550
553
  >
551
554
  {#snippet typeeditor()}
552
555
  {#if isFlowInput || isAppInput}
@@ -14,6 +14,7 @@ interface Props {
14
14
  noPreview?: boolean;
15
15
  jsonEnabled?: boolean;
16
16
  isAppInput?: boolean;
17
+ showSensitiveToggle?: boolean;
17
18
  displayWebhookWarning?: boolean;
18
19
  onlyMaskPassword?: boolean;
19
20
  editTab: 'inputEditor' | 'history' | 'savedInputs' | 'json' | 'captures' | 'firstStepInputs' | undefined;
@@ -1599,7 +1599,11 @@ let handleSqlTypingInTs = useDebounce(function handleSqlTypingInTs() {
1599
1599
  // Send SQL query information to the custom TypeScript worker
1600
1600
  // The worker will inject type parameters into the code that TypeScript analyzes
1601
1601
  // Worker async function call freezes if we pass a Proxy, $state.snapshot() is very important here
1602
- updateSqlQueriesInWorker(uri, $state.snapshot(preparedAssetsSqlQueries));
1602
+ // Filter out queries with raw interpolations — they can't be type-checked
1603
+ let queriesToSend = $state
1604
+ .snapshot(preparedAssetsSqlQueries)
1605
+ .filter((q) => !q.has_raw_interpolation);
1606
+ updateSqlQueriesInWorker(uri, queriesToSend);
1603
1607
  }, 250);
1604
1608
  watch([() => preparedAssetsSqlQueries, () => lang, () => isTsWorkerInitialized.current], () => {
1605
1609
  handleSqlTypingInTs();
@@ -71,6 +71,7 @@ let showContextVarPicker = $derived([
71
71
  'nu',
72
72
  'java',
73
73
  'ruby',
74
+ 'rlang',
74
75
  'postgresql',
75
76
  'mysql',
76
77
  'bigquery',
@@ -94,7 +95,8 @@ let showVarPicker = $derived([
94
95
  'csharp',
95
96
  'nu',
96
97
  'java',
97
- 'ruby'
98
+ 'ruby',
99
+ 'rlang'
98
100
  // for related places search: ADD_NEW_LANG
99
101
  ].includes(lang ?? ''));
100
102
  let showResourcePicker = $derived([
@@ -111,7 +113,8 @@ let showResourcePicker = $derived([
111
113
  'csharp',
112
114
  'nu',
113
115
  'java',
114
- 'ruby'
116
+ 'ruby',
117
+ 'rlang'
115
118
  // for related places search: ADD_NEW_LANG
116
119
  ].includes(lang ?? ''));
117
120
  let showS3Picker = $derived(['duckdb', 'python3'].includes(lang ?? '') ||
@@ -402,6 +405,8 @@ function windmillPathToCamelCaseName(path) {
402
405
  // for related places search: ADD_NEW_LANG
403
406
  } else if (lang == 'ruby') {
404
407
  editor.insertAtCursor(`ENV['${name}']`)
408
+ } else if (lang == 'rlang') {
409
+ editor.insertAtCursor(`Sys.getenv("${name}")`)
405
410
  } else if (
406
411
  ['postgresql', 'mysql', 'bigquery', 'mssql', 'oracledb', 'snowflake', 'duckdb'].includes(
407
412
  lang ?? ''
@@ -470,6 +475,8 @@ string ${windmillPathToCamelCaseName(path)} = await client.GetStringAsync(uri);
470
475
  editor.insertAtBeginning("require 'windmill/mini'\n")
471
476
  }
472
477
  editor.insertAtCursor(`get_variable("${path}")`)
478
+ } else if (lang == 'rlang') {
479
+ editor.insertAtCursor(`get_variable("${path}")`)
473
480
  }
474
481
  sendUserToast(`${name} inserted at cursor`)
475
482
  }}
@@ -549,6 +556,8 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
549
556
  editor.insertAtBeginning("require 'windmill/mini'\n")
550
557
  }
551
558
  editor.insertAtCursor(`get_resource("${path}")`)
559
+ } else if (lang == 'rlang') {
560
+ editor.insertAtCursor(`get_resource("${path}")`)
552
561
  } else if (lang == 'duckdb') {
553
562
  let t = { postgresql: 'postgres', mysql: 'mysql', bigquery: 'bigquery' }[resType]
554
563
  if (!t) {
@@ -635,7 +644,7 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
635
644
  startIcon={{ icon: Settings }}
636
645
  target="_blank"
637
646
  variant="accent"
638
- href="{base}/workspace_settings?tab=windmill_lfs"
647
+ href="{base}/workspace_settings?tab=ducklake"
639
648
  >
640
649
  Go to settings
641
650
  </Button>
@@ -419,10 +419,34 @@ function handleKeyDown(e) {
419
419
  e.preventDefault();
420
420
  }
421
421
  let presets = $derived(_presets.filter((p) => {
422
- // Only show presets that aren't already applied in asText
423
- return !asText.val.includes(p.value);
422
+ // Only show presets that aren't already applied
423
+ if (asText.val.includes(p.value))
424
+ return false;
425
+ // For allowMultiple: check if the value is already in the comma-separated list
426
+ const match = p.value.match(/^(\w+):\\\s+(.+)$/);
427
+ if (match) {
428
+ const [, key, val] = match;
429
+ const existing = String(value[key] ?? '');
430
+ if (existing.split(',').some((v) => v.trim() === val))
431
+ return false;
432
+ }
433
+ return true;
424
434
  }));
425
435
  function appendFilterAsText(presetValue) {
436
+ // For allowMultiple fields, append value with comma to existing filter instead of adding duplicate key
437
+ const match = presetValue.match(/^(\w+):\\\s+(.+)$/);
438
+ if (match) {
439
+ const [, key, newVal] = match;
440
+ const filterDef = schema[key];
441
+ if (filterDef?.allowMultiple) {
442
+ const existing = value[key];
443
+ if (existing) {
444
+ value[key] = existing + ',' + newVal;
445
+ asText.reparse();
446
+ return;
447
+ }
448
+ }
449
+ }
426
450
  if (!asText.val.endsWith('\u00A0') && !asText.val.endsWith(' '))
427
451
  asText.val += ' ';
428
452
  asText.val += presetValue + '\u00A0';
@@ -222,7 +222,8 @@ async function saveDraftInternal(forceSave = false) {
222
222
  draft_only: true,
223
223
  ws_error_handler_muted: flow.ws_error_handler_muted,
224
224
  visible_to_runner_only: flow.visible_to_runner_only,
225
- on_behalf_of_email: flow.on_behalf_of_email
225
+ on_behalf_of_email: flow.on_behalf_of_email,
226
+ labels: flow.labels
226
227
  }
227
228
  });
228
229
  }
@@ -381,7 +382,8 @@ async function saveFlow(deploymentMsg, triggersToDeploy) {
381
382
  visible_to_runner_only: flow.visible_to_runner_only,
382
383
  on_behalf_of_email: flow.on_behalf_of_email,
383
384
  preserve_on_behalf_of: $preserveOnBehalfOf || undefined,
384
- deployment_message: deploymentMsg || undefined
385
+ deployment_message: deploymentMsg || undefined,
386
+ labels: flow.labels
385
387
  }
386
388
  });
387
389
  await CaptureService.moveCapturesAndConfigs({
@@ -421,7 +423,8 @@ async function saveFlow(deploymentMsg, triggersToDeploy) {
421
423
  visible_to_runner_only: flow.visible_to_runner_only,
422
424
  on_behalf_of_email: flow.on_behalf_of_email,
423
425
  preserve_on_behalf_of: $preserveOnBehalfOf || undefined,
424
- deployment_message: deploymentMsg || undefined
426
+ deployment_message: deploymentMsg || undefined,
427
+ labels: flow.labels
425
428
  }
426
429
  });
427
430
  }
@@ -8,7 +8,6 @@ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
8
8
  import { DiffIcon, Minus, Plus, SquareSplitHorizontal } from 'lucide-svelte';
9
9
  const SIDE_BY_SIDE_MIN_WIDTH = 700;
10
10
  let { beforeYaml, afterYaml } = $props();
11
- let parseError = $state(undefined);
12
11
  let viewerWidth = $state(SIDE_BY_SIDE_MIN_WIDTH);
13
12
  let beforePaneSize = $state(50);
14
13
  let viewMode = $state('sidebyside');
@@ -16,26 +15,26 @@ let viewMode = $state('sidebyside');
16
15
  let sharedViewport = $state({ x: 0, y: 0, zoom: 1 });
17
16
  let beforeGraph = $state(undefined);
18
17
  let afterGraph = $state(undefined);
19
- let beforeFlow = $derived.by(() => {
18
+ function parseFlow(yaml, label) {
20
19
  try {
21
- const parsed = YAML.parse(beforeYaml);
22
- return parsed;
20
+ return { flow: YAML.parse(yaml), error: undefined };
23
21
  }
24
22
  catch (error) {
25
- parseError = `Error parsing before flow: ${error instanceof Error ? error.message : typeof error === 'string' ? error : 'Unknown error'}`;
26
- return undefined;
23
+ return {
24
+ flow: undefined,
25
+ error: `Error parsing ${label} flow: ${error instanceof Error
26
+ ? error.message
27
+ : typeof error === 'string'
28
+ ? error
29
+ : 'Unknown error'}`
30
+ };
27
31
  }
28
- });
29
- let afterFlow = $derived.by(() => {
30
- try {
31
- const parsed = YAML.parse(afterYaml);
32
- return parsed;
33
- }
34
- catch (error) {
35
- parseError = `Error parsing after flow: ${error instanceof Error ? error.message : typeof error === 'string' ? error : 'Unknown error'}`;
36
- return undefined;
37
- }
38
- });
32
+ }
33
+ let beforeParsed = $derived.by(() => parseFlow(beforeYaml, 'before'));
34
+ let afterParsed = $derived.by(() => parseFlow(afterYaml, 'after'));
35
+ let parseError = $derived(beforeParsed.error ?? afterParsed.error);
36
+ let beforeFlow = $derived(beforeParsed.flow);
37
+ let afterFlow = $derived(afterParsed.flow);
39
38
  // Determine if we should render side-by-side or unified (user controlled via toggle)
40
39
  let isSideBySide = $derived(viewMode === 'sidebyside');
41
40
  // Build timeline using history-based approach
@@ -1,19 +1,31 @@
1
- <script lang="ts">import { createEventDispatcher } from 'svelte';
1
+ <script lang="ts">import { Triggers } from './triggers/triggers.svelte';
2
+ import { createEventDispatcher, hasContext, setContext } from 'svelte';
3
+ import { writable } from 'svelte/store';
2
4
  import { twMerge } from 'tailwind-merge';
3
5
  import FlowGraphViewerStep from './FlowGraphViewerStep.svelte';
4
6
  import FlowGraphV2 from './graph/FlowGraphV2.svelte';
5
7
  import { dfs } from './flows/dfs';
6
8
  import { workspaceStore } from '../stores';
7
- let { flow, overflowAuto = false, noSide = false, download = false, noGraph = false, triggerNode = false, stepDetail = $bindable(undefined), workspace = $workspaceStore, minHeight = 400, noBorder = false, hideDefaultInputs = false } = $props();
9
+ let { flow, overflowAuto = false, noSide = false, download = false, noGraph = false, triggerNode = false, stepDetail = $bindable(undefined), workspace = $workspaceStore, minHeight = 400, noBorder = false, hideDefaultInputs = false, provideTriggerContext = false, fillAvailableHeight = false } = $props();
10
+ let availableHeight = $state(0);
11
+ if (provideTriggerContext && !hasContext('TriggerContext')) {
12
+ const triggersCount = writable(undefined);
13
+ setContext('TriggerContext', {
14
+ triggersCount,
15
+ simplifiedPoll: writable(false),
16
+ showCaptureHint: writable(undefined),
17
+ triggersState: new Triggers()
18
+ });
19
+ }
8
20
  const dispatch = createEventDispatcher();
9
21
  </script>
10
22
 
11
- <div class="grid grid-cols-3 w-full h-full">
23
+ <div bind:clientHeight={availableHeight} class="grid grid-cols-3 w-full h-full min-h-0">
12
24
  {#if !noGraph}
13
25
  <div
14
26
  class="{noSide || (hideDefaultInputs && stepDetail == undefined)
15
27
  ? 'col-span-3'
16
- : 'sm:col-span-2 col-span-3'} w-full max-h-full"
28
+ : 'sm:col-span-2 col-span-3'} w-full h-full min-h-0 max-h-full"
17
29
  class:overflow-auto={overflowAuto}
18
30
  class:border={!noBorder}
19
31
  >
@@ -23,7 +35,7 @@ const dispatch = createEventDispatcher();
23
35
  cache={flow.value.cache_ttl !== undefined}
24
36
  path={flow?.path}
25
37
  {download}
26
- {minHeight}
38
+ minHeight={fillAvailableHeight ? Math.max(minHeight, availableHeight) : minHeight}
27
39
  {workspace}
28
40
  modules={flow?.value?.modules}
29
41
  failureModule={flow?.value?.failure_module}
@@ -50,7 +62,9 @@ const dispatch = createEventDispatcher();
50
62
  {#if !noSide && !(hideDefaultInputs && stepDetail == undefined)}
51
63
  <div
52
64
  class={twMerge(
53
- 'relative w-full h-full min-h-[150px] max-h-[90vh] border-r border-b border-t p-2 pt-0 overflow-auto hidden sm:flex flex-col gap-4',
65
+ fillAvailableHeight
66
+ ? 'relative w-full h-full min-h-0 border-r border-b border-t p-2 pt-0 overflow-auto hidden sm:flex flex-col gap-4'
67
+ : 'relative w-full h-full min-h-[150px] max-h-[90vh] border-r border-b border-t p-2 pt-0 overflow-auto hidden sm:flex flex-col gap-4',
54
68
  noGraph ? 'border-0 w-max' : ''
55
69
  )}
56
70
  >
@@ -17,6 +17,8 @@ interface Props {
17
17
  minHeight?: number;
18
18
  noBorder?: boolean;
19
19
  hideDefaultInputs?: boolean;
20
+ provideTriggerContext?: boolean;
21
+ fillAvailableHeight?: boolean;
20
22
  }
21
23
  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> {
22
24
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -40,17 +40,10 @@ let codeViewer = $state();
40
40
 
41
41
  <InputTransformsViewer inputTransforms={stepDetail?.value?.input_transforms ?? {}} />
42
42
  </div>
43
- {#if stepDetail.value.path.startsWith('hub/')}
44
- <div class="mt-6">
45
- <h3 class="mb-1 mt-6 text-xs font-semibold text-emphasis">Code</h3>
46
- <iframe
47
- class="w-full h-full text-sm"
48
- title="embedded script from hub"
49
- frameborder="0"
50
- src="{$hubBaseUrlStore}/embed/script/{stepDetail.value?.path?.substring(4)}"
51
- ></iframe>
52
- </div>
53
- {/if}
43
+ <div class="mt-6">
44
+ <h3 class="mb-1 mt-6 text-xs font-semibold text-emphasis">Code</h3>
45
+ <FlowModuleScript path={stepDetail.value.path} hash={jobScriptHash} />
46
+ </div>
54
47
  {:else if stepDetail.value.type == 'rawscript'}
55
48
  <div class="text-2xs mb-4 mt-2">
56
49
  <h3 class="mb-1 text-xs font-semibold text-emphasis">Step inputs</h3>
@@ -207,27 +200,16 @@ let codeViewer = $state();
207
200
  <InputTransformsViewer inputTransforms={stepDetail?.value?.input_transforms ?? {}} />
208
201
  </div>
209
202
  {/if}
210
- {#if stepDetail.value.path.startsWith('hub/')}
211
- <div class="flex flex-col grow">
212
- <div class="mb-1 mt-6 flex justify-between items-center">
213
- <h3 class="font-semibold text-xs text-emphasis">Code</h3>
214
- <Button
215
- unifiedSize="sm"
216
- variant="subtle"
217
- onClick={codeViewer?.openDrawer}
218
- startIcon={{ icon: Expand }}>Expand</Button
219
- >
220
- </div>
221
- <iframe
222
- class="w-full grow text-sm h-full"
223
- title="embedded script from hub"
224
- frameborder="0"
225
- src="{$hubBaseUrlStore}/embed/script/{stepDetail.value?.path?.substring(4)}"
226
- ></iframe>
227
- </div>
228
- {:else}
229
- <FlowModuleScript path={stepDetail.value.path} hash={jobScriptHash} />
230
- {/if}
203
+ <div class="mb-1 mt-6 flex justify-between items-center">
204
+ <h3 class="font-semibold text-xs text-emphasis">Code</h3>
205
+ <Button
206
+ unifiedSize="sm"
207
+ variant="subtle"
208
+ onClick={codeViewer?.openDrawer}
209
+ startIcon={{ icon: Expand }}>Expand</Button
210
+ >
211
+ </div>
212
+ <FlowModuleScript path={stepDetail.value.path} hash={jobScriptHash} />
231
213
  {:else if stepDetail.value.type == 'aiagent'}
232
214
  <div class="text-xs">
233
215
  <h3 class="mb-1 font-semibold mt-2 text-xs text-emphasis">Step inputs</h3>
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">import {} from '../gen';
2
2
  import { base } from '../base';
3
3
  import JobStatus from './JobStatus.svelte';
4
+ import { flowPathToHref } from '../scripts';
4
5
  import { displayDate, truncateRev } from '../utils';
5
6
  import ScheduleEditor from './triggers/schedules/ScheduleEditor.svelte';
6
7
  import TimeAgo from './TimeAgo.svelte';
@@ -87,7 +88,9 @@ let { job, scheduleEditor } = $props();
87
88
  {#if (job && job.job_kind == 'flow') || job?.job_kind == 'script'}
88
89
  {@const stem = `${job?.job_kind}s`}
89
90
  {@const isScript = job?.job_kind === 'script'}
90
- {@const viewHref = `${base}/${stem}/get/${isScript ? job?.script_hash : job?.script_path}`}
91
+ {@const viewHref = isScript
92
+ ? `${base}/${stem}/get/${job?.script_hash}`
93
+ : flowPathToHref(job?.script_path ?? '')}
91
94
  <div class="flex flex-row gap-2 items-center">
92
95
  {#if isScript}
93
96
  <Code2 size={SMALL_ICON_SIZE} class="min-w-3.5" />
@@ -3,6 +3,7 @@ import { workspaceStore } from '../stores';
3
3
  import { Badge, Button } from './common';
4
4
  import { createEventDispatcher, getContext, untrack } from 'svelte';
5
5
  import { runFlowPreview } from './flows/utils.svelte';
6
+ import { processSecretArgs } from './secretArgUtils';
6
7
  import SchemaForm from './SchemaForm.svelte';
7
8
  import SchemaFormWithArgPicker from './SchemaFormWithArgPicker.svelte';
8
9
  import FlowStatusViewer from '../components/FlowStatusViewer.svelte';
@@ -80,6 +81,7 @@ export async function runPreview(args, restartedFrom, conversationId) {
80
81
  lastPreviewFlow = JSON.stringify(flowStore.val);
81
82
  flowProgressBar?.reset();
82
83
  const newFlow = extractFlow(previewMode);
84
+ args = await processSecretArgs(args, flowStore.val.schema);
83
85
  newJobId = await runFlowPreview(args, newFlow, $pathStore, restartedFrom, conversationId);
84
86
  jobId = newJobId;
85
87
  isRunning = true;