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
@@ -1,12 +1,12 @@
1
1
  <script lang="ts">import SchemaForm from './SchemaForm.svelte';
2
- import TestJobLoader from './TestJobLoader.svelte';
2
+ import JobLoader from './JobLoader.svelte';
3
3
  import { Button } from './common';
4
4
  import { WindmillIcon } from './icons';
5
5
  import LogPanel from './scriptEditor/LogPanel.svelte';
6
6
  import { JobService, OpenAPI, WorkspaceService } from '../gen';
7
7
  import { inferArgs } from '../infer';
8
8
  import { setCopilotInfo, userStore, workspaceStore } from '../stores';
9
- import { emptySchema, sendUserToast } from '../utils';
9
+ import { emptySchema, readFieldsRecursively, sendUserToast } from '../utils';
10
10
  import { Pane, Splitpanes } from 'svelte-splitpanes';
11
11
  import { onDestroy, onMount, setContext, untrack } from 'svelte';
12
12
  import DarkModeToggle from './sidebar/DarkModeToggle.svelte';
@@ -66,7 +66,7 @@ function initializeMode() {
66
66
  modeInitialized = true;
67
67
  darkModeToggle?.toggle();
68
68
  }
69
- let testJobLoader = $state();
69
+ let jobLoader = $state();
70
70
  let socket = undefined;
71
71
  // Test args input
72
72
  let args = $state({});
@@ -78,7 +78,8 @@ let pastPreviews = $state([]);
78
78
  let validCode = $state(true);
79
79
  // Flow preview
80
80
  let flowPreviewButtons = $state();
81
- const job = $derived(flowPreviewButtons?.getJob());
81
+ const flowPreviewContent = $derived(flowPreviewButtons?.getFlowPreviewContent());
82
+ const job = $derived(flowPreviewContent?.getJob());
82
83
  let showJobStatus = $state(false);
83
84
  let testModuleId = $state(undefined);
84
85
  let currentScript = $state(undefined);
@@ -113,7 +114,11 @@ const el = (event) => {
113
114
  }
114
115
  else if (event.data.type == 'testPreviewBundle') {
115
116
  if (event.data.id == lastCommandId && currentScript) {
116
- testJobLoader?.runPreview(currentScript.path, event.data.file, currentScript.language, args, currentScript.tag, useLock ? currentScript.lock : undefined);
117
+ jobLoader?.runPreview(currentScript.path, event.data.file, currentScript.language, args, currentScript.tag, useLock ? currentScript.lock : undefined, undefined, {
118
+ done(x) {
119
+ loadPastTests();
120
+ }
121
+ });
117
122
  }
118
123
  else {
119
124
  sendUserToast(`Bundle received ${lastCommandId} was obsolete, ignoring`, true);
@@ -164,7 +169,7 @@ onMount(() => {
164
169
  window.parent?.postMessage({ type: 'refresh' }, '*');
165
170
  });
166
171
  async function testBundle(file, isTar) {
167
- testJobLoader?.abstractRun(async () => {
172
+ jobLoader?.abstractRun(async () => {
168
173
  try {
169
174
  const form = new FormData();
170
175
  form.append('preview', JSON.stringify({
@@ -205,6 +210,10 @@ async function testBundle(file, isTar) {
205
210
  sendUserToast(`Failed to send bundle ${e}`, true);
206
211
  throw Error(e);
207
212
  }
213
+ }, {
214
+ done(x) {
215
+ loadPastTests();
216
+ }
208
217
  });
209
218
  loadingCodebaseButton = false;
210
219
  }
@@ -273,7 +282,7 @@ function runTest() {
273
282
  }
274
283
  else {
275
284
  //@ts-ignore
276
- testJobLoader.runPreview(currentScript.path, currentScript.content, currentScript.language, args, currentScript.tag, useLock ? currentScript.lock : undefined);
285
+ jobLoader.runPreview(currentScript.path, currentScript.content, currentScript.language, args, currentScript.tag, useLock ? currentScript.lock : undefined);
277
286
  }
278
287
  }
279
288
  }
@@ -419,8 +428,8 @@ function updateFlow(flow) {
419
428
  return;
420
429
  }
421
430
  if (!deepEqual(flow, lastSent)) {
422
- lastSent = JSON.parse(JSON.stringify(flow));
423
- window?.parent.postMessage({ type: 'flow', flow, uriPath: lastUriPath }, '*');
431
+ lastSent = $state.snapshot(flow);
432
+ window?.parent.postMessage({ type: 'flow', flow: lastSent, uriPath: lastUriPath }, '*');
424
433
  }
425
434
  }
426
435
  let reload = $state(0);
@@ -429,7 +438,7 @@ async function inferModuleArgs(selectedIdStore) {
429
438
  return;
430
439
  }
431
440
  //@ts-ignore
432
- dfs(flowStore.value.modules, async (mod) => {
441
+ dfs(flowStore.val.value.modules, async (mod) => {
433
442
  if (mod.id == selectedIdStore) {
434
443
  if (mod.value.type == 'rawscript' ||
435
444
  mod.value.type === 'script' ||
@@ -481,14 +490,15 @@ $effect(() => {
481
490
  untrack(() => initializeMode());
482
491
  });
483
492
  $effect(() => {
493
+ readFieldsRecursively(flowStore.val);
484
494
  flowStore.val && untrack(() => updateFlow(flowStore.val));
485
495
  });
486
496
  $effect(() => {
487
497
  $selectedIdStore && untrack(() => inferModuleArgs($selectedIdStore));
488
498
  });
489
- const localModuleStates = $derived(flowPreviewButtons?.getLocalModuleStates() ?? writable({}));
490
- const localDurationStatuses = $derived(flowPreviewButtons?.getLocalDurationStatuses() ?? writable({}));
491
- const suspendStatus = $derived(flowPreviewButtons?.getSuspendStatus() ?? writable({}));
499
+ const localModuleStates = $derived(flowPreviewContent?.getLocalModuleStates() ?? writable({}));
500
+ const localDurationStatuses = $derived(flowPreviewContent?.getLocalDurationStatuses() ?? writable({}));
501
+ const suspendStatus = $derived(flowPreviewContent?.getSuspendStatus() ?? writable({}));
492
502
  // Create a derived store that only shows the module states when showModuleStatus is true
493
503
  // this store can also be updated
494
504
  let derivedModuleStates = writable({});
@@ -533,16 +543,12 @@ function resetModulesStates() {
533
543
  showJobStatus = false;
534
544
  }
535
545
  const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($derivedModuleStates).length > 0);
546
+ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
536
547
  </script>
537
548
 
538
549
  <svelte:window onkeydown={onKeyDown} />
539
550
 
540
- <TestJobLoader
541
- on:done={loadPastTests}
542
- bind:this={testJobLoader}
543
- bind:isLoading={testIsLoading}
544
- bind:job={testJob}
545
- />
551
+ <JobLoader noCode={true} bind:this={jobLoader} bind:isLoading={testIsLoading} bind:job={testJob} />
546
552
 
547
553
  <main class="h-screen w-full">
548
554
  {#if mode == 'script'}
@@ -603,7 +609,7 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
603
609
  {/if}
604
610
  <div class="flex justify-center pt-1">
605
611
  {#if testIsLoading}
606
- <Button on:click={testJobLoader?.cancelJob} btnClasses="w-full" color="red" size="xs">
612
+ <Button on:click={jobLoader?.cancelJob} btnClasses="w-full" color="red" size="xs">
607
613
  <WindmillIcon
608
614
  white={true}
609
615
  class="mr-2 text-white"
@@ -692,10 +698,10 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
692
698
  disableStaticInputs
693
699
  localModuleStates={derivedModuleStates}
694
700
  onTestUpTo={flowPreviewButtons?.testUpTo}
695
- isOwner={flowPreviewButtons?.getIsOwner()}
701
+ isOwner={flowPreviewContent?.getIsOwner?.()}
696
702
  onTestFlow={flowPreviewButtons?.runPreview}
697
- isRunning={flowPreviewButtons?.getIsRunning()}
698
- onCancelTestFlow={flowPreviewButtons?.cancelTest}
703
+ isRunning={flowPreviewContent?.getIsRunning?.()}
704
+ onCancelTestFlow={flowPreviewContent?.cancelTest}
699
705
  onOpenPreview={flowPreviewButtons?.openPreview}
700
706
  onHideJobStatus={resetModulesStates}
701
707
  {individualStepTests}
@@ -704,6 +710,7 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
704
710
  onDelete={(id) => {
705
711
  delete $derivedModuleStates[id]
706
712
  }}
713
+ {flowHasChanged}
707
714
  />
708
715
  {:else}
709
716
  <div class="text-red-400 mt-20">Missing flow modules</div>
@@ -725,7 +732,7 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
725
732
  }}
726
733
  onTestFlow={flowPreviewButtons?.runPreview}
727
734
  {job}
728
- isOwner={flowPreviewButtons?.getIsOwner()}
735
+ isOwner={flowPreviewContent?.getIsOwner()}
729
736
  {localDurationStatuses}
730
737
  {suspendStatus}
731
738
  onOpenDetails={flowPreviewButtons?.openPreview}
@@ -24,6 +24,7 @@ import Tooltip from './Tooltip.svelte';
24
24
  import HighlightTheme from './HighlightTheme.svelte';
25
25
  import { getContext, hasContext, createEventDispatcher, onDestroy } from 'svelte';
26
26
  import { toJsonStr } from '../utils';
27
+ import { userStore } from '../stores';
27
28
  const IMG_MAX_SIZE = 10000000;
28
29
  const TABLE_MAX_SIZE = 5000000;
29
30
  const DISPLAY_MAX_SIZE = 100000;
@@ -183,6 +184,28 @@ function inferResultKind(result) {
183
184
  else if (isTableCol(result, keys)) {
184
185
  return 'table-col';
185
186
  }
187
+ else if (keys.length < 1000 && keys.includes('wm_renderer')) {
188
+ const renderer = result['wm_renderer'];
189
+ if (typeof renderer === 'string') {
190
+ if ([
191
+ 'json',
192
+ 'html',
193
+ 'png',
194
+ 'file',
195
+ 'jpeg',
196
+ 'gif',
197
+ 'svg',
198
+ 'filename',
199
+ 's3object',
200
+ 'plain',
201
+ 'markdown',
202
+ 'map',
203
+ 'pdf'
204
+ ].includes(renderer)) {
205
+ return renderer;
206
+ }
207
+ }
208
+ }
186
209
  }
187
210
  }
188
211
  catch (err) { }
@@ -624,34 +647,38 @@ $effect(() => {
624
647
  language={json}
625
648
  code={toJsonStr(result).replace(/\\n/g, '\n')}
626
649
  />
627
- <button
628
- class="text-secondary underline text-2xs whitespace-nowrap"
629
- onclick={() => {
630
- s3FileViewer?.open?.(result)
631
- }}
632
- ><span class="flex items-center gap-1"
633
- ><PanelRightOpen size={12} />object store explorer<Tooltip
634
- >Require admin privilege or "S3 resource details and content can be accessed
635
- by all users of this workspace" of S3 Storage to be set in the workspace
636
- settings</Tooltip
637
- ></span
638
- >
639
- </button>
650
+ {#if $userStore}
651
+ <button
652
+ class="text-secondary underline text-2xs whitespace-nowrap"
653
+ onclick={() => {
654
+ s3FileViewer?.open?.(result)
655
+ }}
656
+ ><span class="flex items-center gap-1"
657
+ ><PanelRightOpen size={12} />object store explorer<Tooltip
658
+ >Require admin privilege or "S3 resource details and content can be accessed
659
+ by all users of this workspace" of S3 Storage to be set in the workspace
660
+ settings</Tooltip
661
+ ></span
662
+ >
663
+ </button>
664
+ {/if}
640
665
  {:else if !result?.disable_download}
641
666
  <FileDownload {workspaceId} s3object={result} {appPath} />
642
- <button
643
- class="text-secondary underline text-2xs whitespace-nowrap"
644
- onclick={() => {
645
- s3FileViewer?.open?.(result)
646
- }}
647
- ><span class="flex items-center gap-1"
648
- ><PanelRightOpen size={12} />object store explorer<Tooltip
649
- >Require admin privilege or "S3 resource details and content can be accessed
650
- by all users of this workspace" of S3 Storage to be set in the workspace
651
- settings</Tooltip
652
- ></span
653
- >
654
- </button>
667
+ {#if $userStore}
668
+ <button
669
+ class="text-secondary underline text-2xs whitespace-nowrap"
670
+ onclick={() => {
671
+ s3FileViewer?.open?.(result)
672
+ }}
673
+ ><span class="flex items-center gap-1"
674
+ ><PanelRightOpen size={12} />object store explorer<Tooltip
675
+ >Require admin privilege or "S3 resource details and content can be accessed
676
+ by all users of this workspace" of S3 Storage to be set in the workspace
677
+ settings</Tooltip
678
+ ></span
679
+ >
680
+ </button>
681
+ {/if}
655
682
  {/if}
656
683
  </div>
657
684
  {#if typeof result?.s3 === 'string'}
@@ -40,6 +40,6 @@ declare const DisplayResult: $$__sveltets_2_IsomorphicComponent<Props, {
40
40
  }, {}, {
41
41
  openDrawer: () => void;
42
42
  getToolbarLocation: () => "external" | "self" | undefined;
43
- }, "forceJson" | "drawerOpen">;
43
+ }, "drawerOpen" | "forceJson">;
44
44
  type DisplayResult = InstanceType<typeof DisplayResult>;
45
45
  export default DisplayResult;
@@ -16,7 +16,7 @@ function validSelectObject(x) {
16
16
 
17
17
  <script lang="ts">import { usePromise } from '../svelte5Utils.svelte';
18
18
  import { deepEqual } from 'fast-equals';
19
- import ResultJobLoader from './ResultJobLoader.svelte';
19
+ import JobLoader from './JobLoader.svelte';
20
20
  import Select from './select/Select.svelte';
21
21
  import Tooltip from './Tooltip.svelte';
22
22
  import { Loader2 } from 'lucide-svelte';
@@ -54,7 +54,7 @@ async function getItemsFromOptions() {
54
54
  error: (err) => reject(err)
55
55
  };
56
56
  helperScript?.type == 'inline'
57
- ? resultJobLoader?.runPreview(helperScript?.path ?? 'NO_PATH', helperScript.code, helperScript.lang, { ...args, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, undefined, cb)
57
+ ? resultJobLoader?.runPreview(helperScript?.path ?? 'NO_PATH', helperScript.code, helperScript.lang, { ...args, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, undefined, undefined, undefined, cb)
58
58
  : resultJobLoader?.runScriptByHash(helperScript?.hash ?? 'NO_HASH', { ...args, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, cb);
59
59
  });
60
60
  }
@@ -71,7 +71,7 @@ let open = $state(false);
71
71
  </script>
72
72
 
73
73
  {#if helperScript}
74
- <ResultJobLoader bind:this={resultJobLoader} />
74
+ <JobLoader bind:this={resultJobLoader} />
75
75
 
76
76
  <div class="w-full flex-col flex">
77
77
  <Select
@@ -1074,11 +1074,14 @@ async function loadMonaco() {
1074
1074
  });
1075
1075
  editor?.onDidFocusEditorText(() => {
1076
1076
  dispatch('focus');
1077
- editor?.addCommand(KeyCode.Escape, function () {
1078
- if (showInlineAIChat) {
1079
- closeAIInlineWidget();
1077
+ // for escape we use onkeydown instead of addCommand because addCommand on escape specifically prevents default behavior (like autocomplete cancellation)
1078
+ editor?.onKeyDown((e) => {
1079
+ if (e.keyCode === KeyCode.Escape) {
1080
+ if (showInlineAIChat) {
1081
+ closeAIInlineWidget();
1082
+ }
1083
+ aiChatEditorHandler?.rejectAll();
1080
1084
  }
1081
- aiChatEditorHandler?.rejectAll();
1082
1085
  });
1083
1086
  editor?.addCommand(KeyMod.CtrlCmd | KeyCode.DownArrow, function () {
1084
1087
  if (aiChatManager.pendingNewCode) {
@@ -500,10 +500,10 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
500
500
  let t = { postgresql: 'postgres', mysql: 'mysql', bigquery: 'bigquery' }[resType]
501
501
  if (!t) {
502
502
  sendUserToast(`Resource type ${resType} is not supported in DuckDB`, true)
503
- editor.insertAtCursor(`'$res:${path}'`)
503
+ editor.insertAtCursor(`'res://${path}'`)
504
504
  return
505
505
  } else {
506
- editor.insertAtCursor(`ATTACH '$res:${path}' AS db (TYPE ${t});`)
506
+ editor.insertAtCursor(`ATTACH 'res://${path}' AS db (TYPE ${t});`)
507
507
  }
508
508
  }
509
509
 
@@ -18,24 +18,15 @@ const slackSuccessHandler = hubPaths.slackSuccessHandler;
18
18
  const teamsRecoveryHandler = hubPaths.teamsRecoveryHandler;
19
19
  const teamsHandlerScriptPath = hubPaths.teamsErrorHandler;
20
20
  const teamsSuccessHandler = hubPaths.teamsSuccessHandler;
21
- export let errorOrRecovery;
22
- export let isEditable;
23
- export let toggleText = 'Enable';
24
- export let showScriptHelpText = false;
25
- export let handlerSelected;
26
- export let handlerPath;
27
- export let handlerExtraArgs;
28
- export let customInitialScriptPath;
29
- export let customScriptTemplate;
30
- export let customHandlerKind = 'script';
31
- let customHandlerSchema;
32
- let slackHandlerSchema;
33
- let isFetching = false;
34
- let teams_channels = [];
35
- let teams_team_name = undefined;
36
- let workspaceConnectedToSlack = undefined;
37
- let workspaceConnectedToTeams = undefined;
38
- let connectionTestJob;
21
+ let { errorOrRecovery, isEditable, toggleText = 'Enable', showScriptHelpText = false, handlerSelected = $bindable(), handlerPath = $bindable(), handlerExtraArgs = $bindable(), customScriptTemplate, customHandlerKind = $bindable('script'), customTabTooltip } = $props();
22
+ let customHandlerSchema = $state();
23
+ let slackHandlerSchema = $state();
24
+ let isFetching = $state(false);
25
+ let teams_channels = $state([]);
26
+ let teams_team_name = $state(undefined);
27
+ let workspaceConnectedToSlack = $state(undefined);
28
+ let workspaceConnectedToTeams = $state(undefined);
29
+ let connectionTestJob = $state();
39
30
  async function loadSlackResources() {
40
31
  const settings = await WorkspaceService.getSettings({ workspace: $workspaceStore });
41
32
  if (!emptyString(settings.slack_name) && !emptyString(settings.slack_team_id)) {
@@ -146,7 +137,7 @@ async function loadHandlerScriptArgs(p, defaultArgs = []) {
146
137
  }
147
138
  }
148
139
  function isSlackHandler(scriptPath) {
149
- if (scriptPath === undefined) {
140
+ if (!scriptPath) {
150
141
  return false;
151
142
  }
152
143
  if (errorOrRecovery == 'error') {
@@ -161,7 +152,7 @@ function isSlackHandler(scriptPath) {
161
152
  }
162
153
  }
163
154
  function isTeamsHandler(scriptPath) {
164
- if (scriptPath === undefined) {
155
+ if (!scriptPath) {
165
156
  return false;
166
157
  }
167
158
  if (errorOrRecovery == 'error') {
@@ -175,67 +166,82 @@ function isTeamsHandler(scriptPath) {
175
166
  return scriptPath.startsWith('hub/') && scriptPath.endsWith('/schedule-success-handler-teams');
176
167
  }
177
168
  }
178
- $: {
169
+ $effect(() => {
179
170
  if ($workspaceStore) {
180
171
  loadSlackResources();
181
172
  loadTeamsResources();
182
173
  }
183
- }
184
- let lastHandlerSelected = undefined;
185
- let channelCache = {
174
+ });
175
+ $effect(() => {
176
+ if (handlerSelected === 'slack' && isSlackHandler(handlerPath)) {
177
+ handlerExtraArgs['slack'] = '$res:f/slack_bot/bot_token';
178
+ }
179
+ else {
180
+ handlerExtraArgs['slack'] = undefined;
181
+ }
182
+ });
183
+ let lastHandlerSelected = $state(undefined);
184
+ let channelCache = $state({
186
185
  slack: undefined,
187
186
  teams: undefined
188
- };
189
- $: {
187
+ });
188
+ $effect(() => {
190
189
  if (lastHandlerSelected !== handlerSelected && lastHandlerSelected !== undefined) {
191
190
  if (lastHandlerSelected === 'teams' || lastHandlerSelected === 'slack') {
192
191
  channelCache[lastHandlerSelected] = handlerExtraArgs['channel'];
193
192
  }
194
193
  if (handlerSelected === 'custom') {
195
194
  handlerExtraArgs['channel'] = '';
195
+ handlerPath = undefined;
196
196
  }
197
197
  else {
198
198
  handlerExtraArgs['channel'] = channelCache[handlerSelected] ?? '';
199
199
  }
200
200
  }
201
201
  lastHandlerSelected = handlerSelected;
202
- }
203
- $: handlerPath &&
204
- !isSlackHandler(handlerPath) &&
205
- !isTeamsHandler(handlerPath) &&
206
- loadHandlerScriptArgs(handlerPath, [
207
- 'path',
208
- 'workspace_id',
209
- 'job_id',
210
- 'is_flow',
211
- 'schedule_path',
212
- 'error',
213
- 'error_started_at',
214
- 'failed_times',
215
- 'started_at',
216
- 'success_times',
217
- 'success_result',
218
- 'success_started_at',
219
- 'email'
220
- ]).then((schema) => (customHandlerSchema = schema));
221
- $: handlerPath &&
222
- isSlackHandler(handlerPath) &&
223
- loadHandlerScriptArgs(handlerPath, [
224
- 'path',
225
- 'workspace_id',
226
- 'job_id',
227
- 'is_flow',
228
- 'schedule_path',
229
- 'error',
230
- 'error_started_at',
231
- 'failed_times',
232
- 'started_at',
233
- 'success_times',
234
- 'success_result',
235
- 'success_started_at',
236
- 'email',
237
- 'slack'
238
- ]).then((schema) => (slackHandlerSchema = schema));
202
+ });
203
+ $effect(() => {
204
+ handlerPath &&
205
+ !isSlackHandler(handlerPath) &&
206
+ !isTeamsHandler(handlerPath) &&
207
+ loadHandlerScriptArgs(handlerPath, [
208
+ 'path',
209
+ 'workspace_id',
210
+ 'job_id',
211
+ 'is_flow',
212
+ 'schedule_path',
213
+ 'error',
214
+ 'error_started_at',
215
+ 'failed_times',
216
+ 'started_at',
217
+ 'success_times',
218
+ 'success_result',
219
+ 'success_started_at',
220
+ 'email',
221
+ 'trigger_path'
222
+ ]).then((schema) => (customHandlerSchema = schema));
223
+ });
224
+ $effect(() => {
225
+ handlerPath &&
226
+ isSlackHandler(handlerPath) &&
227
+ loadHandlerScriptArgs(handlerPath, [
228
+ 'path',
229
+ 'workspace_id',
230
+ 'job_id',
231
+ 'is_flow',
232
+ 'schedule_path',
233
+ 'error',
234
+ 'error_started_at',
235
+ 'failed_times',
236
+ 'started_at',
237
+ 'success_times',
238
+ 'success_result',
239
+ 'success_started_at',
240
+ 'email',
241
+ 'trigger_path',
242
+ 'slack'
243
+ ]).then((schema) => (slackHandlerSchema = schema));
244
+ });
239
245
  </script>
240
246
 
241
247
  <div>
@@ -244,7 +250,7 @@ $: handlerPath &&
244
250
  <Tab value="teams" disabled={!isEditable}>Teams</Tab>
245
251
  <Tab value="custom" disabled={!isEditable}>
246
252
  Custom
247
- <slot name="custom-tab-tooltip" />
253
+ {@render customTabTooltip?.()}
248
254
  </Tab>
249
255
  </Tabs>
250
256
  </div>
@@ -253,15 +259,15 @@ $: handlerPath &&
253
259
  <div class="flex flex-row mb-2">
254
260
  <ScriptPicker
255
261
  disabled={!isEditable || !$enterpriseLicense}
256
- initialPath={customInitialScriptPath}
257
262
  kinds={['script', 'failure']}
258
263
  allowFlow={true}
259
264
  bind:scriptPath={handlerPath}
260
265
  bind:itemKind={customHandlerKind}
261
266
  allowRefresh={isEditable}
267
+ clearable
262
268
  />
263
269
 
264
- {#if handlerPath === undefined}
270
+ {#if !handlerPath}
265
271
  <Button
266
272
  btnClasses="ml-4 mt-2"
267
273
  color="dark"
@@ -427,7 +433,7 @@ $: handlerPath &&
427
433
  />
428
434
  <div class="flex-shrink-0">
429
435
  <button
430
- on:click={loadTeamsResources}
436
+ onclick={loadTeamsResources}
431
437
  class="flex items-center gap-1 p-1.5 rounded hover:bg-surface-hover focus:bg-surface-hover"
432
438
  >
433
439
  <RefreshCcw size={16} class={isFetching ? 'animate-spin' : ''} />
@@ -1,31 +1,15 @@
1
- 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> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const ErrorOrRecoveryHandler: $$__sveltets_2_IsomorphicComponent<{
15
- errorOrRecovery: "error" | "recovery" | "success";
1
+ interface Props {
2
+ errorOrRecovery: 'error' | 'recovery' | 'success';
16
3
  isEditable: boolean;
17
4
  toggleText?: string;
18
5
  showScriptHelpText?: boolean;
19
- handlerSelected: "custom" | "slack" | "teams";
6
+ handlerSelected: 'custom' | 'slack' | 'teams';
20
7
  handlerPath: string | undefined;
21
8
  handlerExtraArgs: Record<string, any>;
22
- customInitialScriptPath: string | undefined;
23
9
  customScriptTemplate: string;
24
- customHandlerKind?: "flow" | "script";
25
- }, {
26
- [evt: string]: CustomEvent<any>;
27
- }, {
28
- 'custom-tab-tooltip': {};
29
- }, {}, string>;
30
- type ErrorOrRecoveryHandler = InstanceType<typeof ErrorOrRecoveryHandler>;
10
+ customHandlerKind?: 'flow' | 'script';
11
+ customTabTooltip?: import('svelte').Snippet;
12
+ }
13
+ declare const ErrorOrRecoveryHandler: import("svelte").Component<Props, {}, "handlerSelected" | "handlerPath" | "handlerExtraArgs" | "customHandlerKind">;
14
+ type ErrorOrRecoveryHandler = ReturnType<typeof ErrorOrRecoveryHandler>;
31
15
  export default ErrorOrRecoveryHandler;
@@ -37,6 +37,7 @@ import { TestSteps } from './flows/testSteps.svelte';
37
37
  import { aiChatManager } from './copilot/chat/AIChatManager.svelte';
38
38
  import { setStepHistoryLoaderContext, StepHistoryLoader } from './stepHistoryLoader.svelte';
39
39
  import { ModulesTestStates } from './modulesTest.svelte';
40
+ import FlowAssetsHandler, { initFlowGraphAssetsCtx } from './flows/FlowAssetsHandler.svelte';
40
41
  let { initialPath = $bindable(''), pathStoreInit = undefined, newFlow, selectedId, initialArgs = {}, loading = false, flowStore, flowStateStore, savedFlow = $bindable(undefined), diffDrawer = undefined, customUi = {}, disableAi = false, disabledFlowInputs = false, savedPrimarySchedule = undefined, version = undefined, setSavedraftCb = undefined, draftTriggersFromUrl = undefined, selectedTriggerIndexFromUrl = undefined, children, loadedFromHistoryFromUrl, noInitial = false, onSaveInitial, onSaveDraft, onDeploy, onDeployError, onDetails, onSaveDraftError, onSaveDraftOnlyAtNewPath, onHistoryRestore } = $props();
41
42
  let initialPathStore = writable(initialPath);
42
43
  // used for new flows for captures
@@ -475,6 +476,7 @@ setContext('FlowEditorContext', {
475
476
  modulesTestStates,
476
477
  outputPickerOpenFns
477
478
  });
479
+ setContext('FlowGraphAssetContext', initFlowGraphAssetsCtx({ getModules: () => flowStore.val.value.modules }));
478
480
  // Add triggers context store
479
481
  const triggersState = $state(new Triggers([
480
482
  { type: 'webhook', path: '', isDraft: false },
@@ -784,9 +786,9 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
784
786
  redoProps={{ disabled: $history.index === $history.history.length - 1 }}
785
787
  on:undo={() => {
786
788
  const currentModules = flowStore.val?.value?.modules
787
- console.log('undo before', flowStore.val, JSON.stringify(flowStore.val, null, 2))
789
+ // console.log('undo before', flowStore.val, JSON.stringify(flowStore.val, null, 2))
788
790
  flowStore.val = undo(history, flowStore.val)
789
- console.log('undo after', flowStore.val, JSON.stringify(flowStore.val, null, 2))
791
+ // console.log('undo after', flowStore.val, JSON.stringify(flowStore.val, null, 2))
790
792
 
791
793
  const newModules = flowStore.val?.value?.modules
792
794
  const restoredModules = newModules?.filter(
@@ -1030,3 +1032,10 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
1030
1032
  renderCount += 1
1031
1033
  }}
1032
1034
  />
1035
+
1036
+ <FlowAssetsHandler
1037
+ modules={flowStore.val.value.modules}
1038
+ enableParser
1039
+ enableDbExplore
1040
+ enablePathScriptAndFlowAssets
1041
+ />