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
@@ -66,6 +66,20 @@ function getModelMaxTokens(model) {
66
66
  }
67
67
  return 8192;
68
68
  }
69
+ export function getModelContextWindow(model) {
70
+ if (model.startsWith('gpt-4.1') || model.startsWith('gemini')) {
71
+ return 1000000;
72
+ }
73
+ else if (model.startsWith('gpt-4o') || model.startsWith('llama-3.3')) {
74
+ return 128000;
75
+ }
76
+ else if (model.startsWith('claude') || model.startsWith('o4-mini') || model.startsWith('o3')) {
77
+ return 200000;
78
+ }
79
+ else {
80
+ return 128000;
81
+ }
82
+ }
69
83
  function getModelSpecificConfig(modelProvider, tools) {
70
84
  if ((modelProvider.provider === 'openai' || modelProvider.provider === 'azure_openai') &&
71
85
  modelProvider.model.startsWith('o')) {
@@ -373,6 +387,7 @@ const mistralFimResponseSchema = z.object({
373
387
  }))
374
388
  });
375
389
  export const FIM_MAX_TOKENS = 256;
390
+ const FIM_MAX_LINES = 8;
376
391
  export async function getFimCompletion(prompt, suffix, providerModel, abortController) {
377
392
  const fetchOptions = {
378
393
  signal: abortController.signal,
@@ -396,16 +411,19 @@ export async function getFimCompletion(prompt, suffix, providerModel, abortContr
396
411
  const body = await response.json();
397
412
  const parsedBody = mistralFimResponseSchema.parse(body);
398
413
  const choice = parsedBody.choices[0];
399
- if (choice) {
400
- if (choice.finish_reason === 'length' && choice.message.content) {
401
- // take all the lines before the last
402
- const lines = choice.message.content.split('\n');
403
- const joined = lines.slice(0, -1).join('\n');
404
- return joined;
405
- }
406
- else {
407
- return choice.message.content || '';
414
+ if (choice && choice.message.content !== undefined) {
415
+ let lines = choice.message.content.split('\n');
416
+ // If finish_reason is 'length', remove the last line
417
+ if (choice.finish_reason === 'length') {
418
+ if (lines.length > 1) {
419
+ lines = lines.slice(0, -1);
420
+ }
421
+ else {
422
+ lines = [];
423
+ }
408
424
  }
425
+ lines = lines.slice(0, FIM_MAX_LINES);
426
+ return lines.join('\n');
409
427
  }
410
428
  else {
411
429
  return undefined;
@@ -53,6 +53,7 @@ export type PreviewPanelUi = {
53
53
  displayResult?: DisplayResultUi;
54
54
  disableVariablePicker?: boolean;
55
55
  disableDownload?: boolean;
56
+ tagLabel?: string;
56
57
  };
57
58
  export type EditorBarUi = {
58
59
  contextVar?: boolean;
@@ -0,0 +1,133 @@
1
+ <script lang="ts" module>export function initFlowGraphAssetsCtx({ getModules }) {
2
+ let s = $state({
3
+ val: {
4
+ selectedAsset: undefined,
5
+ dbManagerDrawer: undefined,
6
+ s3FilePicker: undefined,
7
+ resourceEditorDrawer: undefined,
8
+ resourceMetadataCache: {},
9
+ additionalAssetsMap: {},
10
+ computeAssetsCount: (asset) => {
11
+ return getAllModules(getModules())
12
+ .flatMap((m) => getFlowModuleAssets(m, s.val.additionalAssetsMap) ?? [])
13
+ .filter((a) => assetEq(asset, a)).length;
14
+ }
15
+ }
16
+ });
17
+ return s;
18
+ }
19
+ </script>
20
+
21
+ <script lang="ts">import { inferAssets } from '../../infer';
22
+ import { assetEq, getFlowModuleAssets } from '../assets/lib';
23
+ import OnChange from '../common/OnChange.svelte';
24
+ import { getAllModules } from './flowExplorer';
25
+ import { getContext, untrack } from 'svelte';
26
+ import { AssetService, ResourceService } from '../../gen';
27
+ import { deepEqual } from 'fast-equals';
28
+ import { workspaceStore } from '../../stores';
29
+ import S3FilePicker from '../S3FilePicker.svelte';
30
+ import DbManagerDrawer from '../DBManagerDrawer.svelte';
31
+ import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte';
32
+ let { modules, enableParser = false, enableDbExplore = false, enablePathScriptAndFlowAssets = false } = $props();
33
+ const flowGraphAssetsCtx = getContext('FlowGraphAssetContext');
34
+ let allModules = $derived(getAllModules(modules));
35
+ // Fetch resource metadata for the ExploreAssetButton
36
+ const resMetadataCache = $derived(flowGraphAssetsCtx?.val.resourceMetadataCache);
37
+ $effect(() => {
38
+ if (!resMetadataCache || !enableDbExplore)
39
+ return;
40
+ const assets = allModules.flatMap((m) => getFlowModuleAssets(m, flowGraphAssetsCtx?.val.additionalAssetsMap) ?? []) ?? [];
41
+ for (const asset of assets) {
42
+ if (asset.kind !== 'resource' || asset.path in resMetadataCache)
43
+ continue;
44
+ resMetadataCache[asset.path] = undefined; // avoid fetching multiple times because of async
45
+ ResourceService.getResource({ path: asset.path, workspace: $workspaceStore })
46
+ .then((r) => (resMetadataCache[asset.path] = { resource_type: r.resource_type }))
47
+ .catch((err) => {
48
+ console.error("Couldn't fetch resource", asset.path, err);
49
+ });
50
+ }
51
+ });
52
+ // Fetch transitive assets (path scripts and flows)
53
+ $effect(() => {
54
+ if (!$workspaceStore || !flowGraphAssetsCtx || !enablePathScriptAndFlowAssets)
55
+ return;
56
+ let usages = [];
57
+ let modIds = [];
58
+ for (const mod of allModules) {
59
+ if (mod.id in flowGraphAssetsCtx.val.additionalAssetsMap)
60
+ continue;
61
+ flowGraphAssetsCtx.val.additionalAssetsMap[mod.id] = []; // avoid fetching multiple times because of async
62
+ if (mod.value.type === 'flow' || mod.value.type === 'script') {
63
+ usages.push({ path: mod.value.path, kind: mod.value.type });
64
+ modIds.push(mod.id);
65
+ }
66
+ }
67
+ if (usages.length) {
68
+ AssetService.listAssetsByUsage({
69
+ workspace: $workspaceStore,
70
+ requestBody: { usages }
71
+ }).then((result) => {
72
+ result.forEach((assets, idx) => {
73
+ flowGraphAssetsCtx.val.additionalAssetsMap[modIds[idx]] = assets;
74
+ });
75
+ });
76
+ }
77
+ });
78
+ // Prune all additionalAssetsMap entries from deleted modules
79
+ $effect(() => {
80
+ if (!flowGraphAssetsCtx)
81
+ return;
82
+ const modulesSet = new Set(allModules.map((m) => m.id));
83
+ for (const key of Object.keys(flowGraphAssetsCtx.val.additionalAssetsMap)) {
84
+ if (!modulesSet.has(key)) {
85
+ delete flowGraphAssetsCtx.val.additionalAssetsMap[key];
86
+ }
87
+ }
88
+ });
89
+ async function parseAndUpdateRawScriptModule(v) {
90
+ try {
91
+ let parsedAssets = await inferAssets(v.language, v.content);
92
+ for (const asset of parsedAssets) {
93
+ const old = v.assets?.find((a) => assetEq(a, asset));
94
+ if (old?.alt_access_type)
95
+ asset.alt_access_type = old.alt_access_type;
96
+ }
97
+ if (!deepEqual(v.assets, parsedAssets))
98
+ v.assets = parsedAssets;
99
+ }
100
+ catch (e) { }
101
+ }
102
+ // Check for raw script modules whose assets were not parsed. Useful for flows created
103
+ // before the assets feature was introduced.
104
+ $effect(() => {
105
+ if (!enableParser)
106
+ return;
107
+ untrack(() => {
108
+ setTimeout(() => {
109
+ for (const mod of allModules) {
110
+ if (mod.value.type === 'rawscript' && mod.value.assets === undefined) {
111
+ console.log('RawScript module', mod.id, 'without assets field, parsing');
112
+ parseAndUpdateRawScriptModule(mod.value);
113
+ }
114
+ }
115
+ }, 500); // ensure modules are loaded
116
+ });
117
+ });
118
+ </script>
119
+
120
+ {#if enableParser}
121
+ {#each allModules as mod (mod.id)}
122
+ {#if mod.value.type === 'rawscript'}
123
+ {@const v = mod.value}
124
+ <OnChange key={v.content} onChange={() => parseAndUpdateRawScriptModule(v)} />
125
+ {/if}
126
+ {/each}
127
+ {/if}
128
+
129
+ {#if flowGraphAssetsCtx}
130
+ <S3FilePicker bind:this={flowGraphAssetsCtx.val.s3FilePicker} readOnlyMode />
131
+ <DbManagerDrawer bind:this={flowGraphAssetsCtx.val.dbManagerDrawer} />
132
+ <ResourceEditorDrawer bind:this={flowGraphAssetsCtx.val.resourceEditorDrawer} />
133
+ {/if}
@@ -0,0 +1,14 @@
1
+ export declare function initFlowGraphAssetsCtx({ getModules }: {
2
+ getModules: () => FlowModule[];
3
+ }): FlowGraphAssetContext;
4
+ import type { FlowGraphAssetContext } from './types';
5
+ import { type FlowModule } from '../../gen';
6
+ type $$ComponentProps = {
7
+ modules: FlowModule[];
8
+ enableParser?: boolean;
9
+ enableDbExplore?: boolean;
10
+ enablePathScriptAndFlowAssets?: boolean;
11
+ };
12
+ declare const FlowAssetsHandler: import("svelte").Component<$$ComponentProps, {}, "">;
13
+ type FlowAssetsHandler = ReturnType<typeof FlowAssetsHandler>;
14
+ export default FlowAssetsHandler;
@@ -45,10 +45,9 @@ import { JobService } from '../../../gen';
45
45
  import { workspaceStore } from '../../../stores';
46
46
  import { checkIfParentLoop } from '../utils';
47
47
  import ModulePreviewResultViewer from '../../ModulePreviewResultViewer.svelte';
48
- import { refreshStateStore, usePromise } from '../../../svelte5Utils.svelte';
48
+ import { refreshStateStore } from '../../../svelte5Utils.svelte';
49
49
  import { getStepHistoryLoaderContext } from '../../stepHistoryLoader.svelte';
50
50
  import AssetsDropdownButton from '../../assets/AssetsDropdownButton.svelte';
51
- import { inferAssets } from '../../../infer';
52
51
  const { selectedId, currentEditor, previewArgs, flowStateStore, flowStore, pathStore, saveDraft, customUi, executionCount } = getContext('FlowEditorContext');
53
52
  let { flowModule = $bindable(), failureModule = false, preprocessorModule = false, parentModule = $bindable(), previousModule, scriptKind = 'script', scriptTemplate = 'script', noEditor, enableAi, savedModule = undefined, forceTestTab = false, highlightArg = undefined } = $props();
54
53
  let workspaceScriptTag = $state(undefined);
@@ -74,6 +73,7 @@ let lastJob = $state(undefined);
74
73
  let testJob = $state(undefined);
75
74
  let testIsLoading = $state(false);
76
75
  let scriptProgress = $state(undefined);
76
+ let assets = $derived((flowModule.value.type === 'rawscript' && flowModule.value.assets) || []);
77
77
  function onModulesChange(savedModule, flowModule) {
78
78
  // console.log('onModulesChange', savedModule, flowModule)
79
79
  return savedModule?.value?.type === 'rawscript' &&
@@ -136,10 +136,12 @@ let forceReload = $state(0);
136
136
  let editorPanelSize = $state(noEditor ? 0 : flowModule.value.type == 'script' ? 30 : 50);
137
137
  let editorSettingsPanelSize = $state(100 - untrack(() => editorPanelSize));
138
138
  let stepHistoryLoader = getStepHistoryLoaderContext();
139
+ let lastJobId = undefined;
139
140
  function onSelectedIdChange() {
140
141
  if (!$flowStateStore?.[$selectedId]?.schema && flowModule) {
141
142
  reload(flowModule);
142
143
  }
144
+ lastJobId = undefined;
143
145
  }
144
146
  async function getLastJob() {
145
147
  if (!$flowStateStore ||
@@ -149,11 +151,19 @@ async function getLastJob() {
149
151
  !$flowStateStore[flowModule.id]?.previewWorkspaceId) {
150
152
  return;
151
153
  }
154
+ if (lastJobId == $flowStateStore[flowModule.id]?.previewJobId ||
155
+ lastJob?.id == $flowStateStore[flowModule.id]?.previewJobId ||
156
+ $flowStateStore[flowModule.id]?.previewSuccess == undefined) {
157
+ return;
158
+ }
159
+ lastJobId = $flowStateStore[flowModule.id]?.previewJobId;
152
160
  const job = await JobService.getJob({
153
161
  workspace: $flowStateStore[flowModule.id]?.previewWorkspaceId ?? '',
154
- id: $flowStateStore[flowModule.id]?.previewJobId ?? ''
162
+ id: $flowStateStore[flowModule.id]?.previewJobId ?? '',
163
+ noCode: true
155
164
  });
156
- if (job) {
165
+ if (job && job.type === 'CompletedJob') {
166
+ lastJobId = $flowStateStore[flowModule.id]?.previewJobId;
157
167
  lastJob = job;
158
168
  }
159
169
  }
@@ -222,15 +232,6 @@ $effect(() => {
222
232
  }, 100);
223
233
  }
224
234
  });
225
- let assets = usePromise(async () => flowModule.value.type === 'rawscript'
226
- ? await inferAssets(flowModule.value.language, flowModule.value.content)
227
- : undefined, { clearValueOnRefresh: false, loadInit: false });
228
- $effect(() => {
229
- if (flowModule.value.type !== 'rawscript')
230
- return;
231
- [flowModule.value.content, flowModule.value.language];
232
- untrack(() => assets.refresh());
233
- });
234
235
  let rawScriptLang = $derived(flowModule.value.type == 'rawscript' ? flowModule.value.language : undefined);
235
236
  </script>
236
237
 
@@ -339,11 +340,8 @@ let rawScriptLang = $derived(flowModule.value.type == 'rawscript' ? flowModule.v
339
340
  {#if !noEditor}
340
341
  {#key flowModule.id}
341
342
  <div class="absolute top-2 right-4 z-10 flex flex-row gap-2">
342
- {#if assets.value?.length}
343
- <AssetsDropdownButton
344
- assets={assets.value}
345
- bind:fallbackAccessTypes={flowModule.value.asset_fallback_access_types}
346
- />
343
+ {#if assets?.length}
344
+ <AssetsDropdownButton {assets} />
347
345
  {/if}
348
346
  </div>
349
347
  <Editor
@@ -14,7 +14,7 @@ export declare function getFirstStepSchema(flowState: FlowState, flow: OpenFlow)
14
14
  value: {
15
15
  language?: "deno" | "bun" | "python3" | "go" | "bash" | "powershell" | "postgresql" | "mysql" | "bigquery" | "snowflake" | "mssql" | "oracledb" | "graphql" | "nativets" | "php" | undefined;
16
16
  path?: string | undefined;
17
- type: "rawscript" | "script" | "flow" | "forloopflow" | "branchone" | "branchall" | "identity" | "whileloopflow";
17
+ type: "rawscript" | "script" | "flow" | "forloopflow" | "whileloopflow" | "branchone" | "branchall" | "identity";
18
18
  };
19
19
  };
20
20
  connectFirstNode: () => void;
@@ -358,6 +358,7 @@ outline-[1px] outline dark:outline-gray-500 outline-gray-300 bg-surface duration
358
358
  onclick={stopPropagation(
359
359
  preventDefault((event) => dispatch('delete', { id, type: modType }))
360
360
  )}
361
+ onpointerdown={stopPropagation(preventDefault(() => {}))}
361
362
  >
362
363
  <X class="mx-[3px]" size={12} strokeWidth={2} />
363
364
  </button>
@@ -46,13 +46,15 @@ function updatePositioning(historyOpen, zoom) {
46
46
  placement: 'bottom',
47
47
  gutter: 0,
48
48
  offset: { mainAxis: 3, crossAxis: 69 * zoom },
49
- overflowPadding: historyOpen ? 250 : 8
49
+ overflowPadding: historyOpen ? 250 : 8,
50
+ flip: false
50
51
  });
51
52
  popover?.updatePositioning({
52
53
  placement: 'bottom',
53
54
  gutter: 0,
54
55
  offset: { mainAxis: 3, crossAxis: showInput ? -69 * zoom : 0 },
55
- overflowPadding: historyOpen ? 250 : 8
56
+ overflowPadding: historyOpen ? 250 : 8,
57
+ flip: false
56
58
  });
57
59
  }
58
60
  $effect(() => {
@@ -104,7 +106,8 @@ onMount(() => {
104
106
  placement: 'bottom',
105
107
  gutter: 0,
106
108
  offset: { mainAxis: 3, crossAxis: 69 },
107
- overflowPadding: historyOpen ? 250 : 8
109
+ overflowPadding: historyOpen ? 250 : 8,
110
+ flip: false
108
111
  }}
109
112
  usePointerDownOutside
110
113
  closeOnOutsideClick={false}
@@ -139,12 +142,14 @@ onMount(() => {
139
142
  {/snippet}
140
143
  </Popover>
141
144
  {/if}
145
+
142
146
  <Popover
143
147
  floatingConfig={{
144
148
  placement: 'bottom',
145
149
  gutter: 0,
146
150
  offset: { mainAxis: 3, crossAxis: showInput ? -69 : 0 },
147
- overflowPadding: historyOpen ? 250 : 8
151
+ overflowPadding: historyOpen ? 250 : 8,
152
+ flip: false
148
153
  }}
149
154
  usePointerDownOutside
150
155
  closeOnOutsideClick={false}
@@ -135,7 +135,7 @@ export async function saveScheduleFromCfg(scheduleCfg, edit, workspace) {
135
135
  on_success: scheduleCfg.on_success,
136
136
  on_success_extra_args: scheduleCfg.on_success_extra_args,
137
137
  ws_error_handler_muted: scheduleCfg.ws_error_handler_muted,
138
- retry: scheduleCfg.retry,
138
+ retry: !scheduleCfg.is_flow ? scheduleCfg.retry : undefined,
139
139
  summary: scheduleCfg.summary,
140
140
  description: scheduleCfg.description,
141
141
  no_flow_overlap: scheduleCfg.no_flow_overlap,
@@ -70,11 +70,12 @@ export type FlowEditorContext = {
70
70
  };
71
71
  export type FlowGraphAssetContext = StateStore<{
72
72
  selectedAsset: Asset | undefined;
73
- assetsMap: Record<string, AssetWithAccessType[]>;
74
73
  s3FilePicker: S3FilePicker | undefined;
75
74
  dbManagerDrawer: DbManagerDrawer | undefined;
76
75
  resourceEditorDrawer: ResourceEditorDrawer | undefined;
77
76
  resourceMetadataCache: Record<string, {
78
77
  resource_type?: string;
79
78
  } | undefined>;
79
+ additionalAssetsMap: Record<string, AssetWithAccessType[]>;
80
+ computeAssetsCount: (asset: Asset) => number;
80
81
  }>;
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { AssetService, FlowService, ResourceService } from '../../gen';
1
+ <script lang="ts">import { FlowService } from '../../gen';
2
2
  import { NODE } from '.';
3
3
  import { getContext, onDestroy, setContext, tick, untrack } from 'svelte';
4
4
  import { get, writable } from 'svelte/store';
@@ -32,20 +32,13 @@ import SubflowBound from './renderers/nodes/SubflowBound.svelte';
32
32
  import { deepEqual } from 'fast-equals';
33
33
  import ViewportResizer from './ViewportResizer.svelte';
34
34
  import AssetNode, { computeAssetNodes } from './renderers/nodes/AssetNode.svelte';
35
- import { getAllModules } from '../flows/flowExplorer';
36
- import { inferAssets } from '../../infer';
37
- import OnChange from '../common/OnChange.svelte';
38
- import S3FilePicker from '../S3FilePicker.svelte';
39
- import DbManagerDrawer from '../DBManagerDrawer.svelte';
40
- import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte';
41
- import { assetEq } from '../assets/lib';
42
35
  import AssetsOverflowedNode from './renderers/nodes/AssetsOverflowedNode.svelte';
43
36
  let useDataflow = writable(false);
44
37
  const triggerContext = getContext('TriggerContext');
45
38
  let fullWidth = 0;
46
39
  let width = $state(0);
47
40
  let simplifiableFlow = $state(undefined);
48
- let { onInsert = undefined, onDelete = undefined, onMove = undefined, onDeleteBranch = undefined, onNewBranch = undefined, onSelect = undefined, onChangeId = undefined, onUpdateMock = undefined, onSelectedIteration = undefined, success = undefined, modules = [], failureModule = undefined, preprocessorModule = undefined, minHeight = 0, maxHeight = undefined, notSelectable = false, flowModuleStates = undefined, selectedId = writable(undefined), path = undefined, newFlow = false, insertable = false, earlyStop = false, cache = false, scroll = false, moving = undefined, download = false, fullSize = false, disableAi = false, triggerNode = false, workspace = $workspaceStore ?? 'NO_WORKSPACE', editMode = false, allowSimplifiedPoll = true, expandedSubflows = $bindable({}), inputAssets, onTestUpTo = undefined, onEditInput = undefined, isOwner = false, onTestFlow = undefined, isRunning = false, onCancelTestFlow = undefined, onOpenPreview = undefined, onHideJobStatus = undefined, individualStepTests = false, flowJob = undefined, showJobStatus = false, suspendStatus = writable({}), flowHasChanged = false } = $props();
41
+ let { onInsert = undefined, onDelete = undefined, onMove = undefined, onDeleteBranch = undefined, onNewBranch = undefined, onSelect = undefined, onChangeId = undefined, onUpdateMock = undefined, onSelectedIteration = undefined, success = undefined, modules = [], failureModule = undefined, preprocessorModule = undefined, minHeight = 0, maxHeight = undefined, notSelectable = false, flowModuleStates = undefined, selectedId = writable(undefined), path = undefined, newFlow = false, insertable = false, earlyStop = false, cache = false, scroll = false, moving = undefined, download = false, fullSize = false, disableAi = false, triggerNode = false, workspace = $workspaceStore ?? 'NO_WORKSPACE', editMode = false, allowSimplifiedPoll = true, expandedSubflows = $bindable({}), onTestUpTo = undefined, onEditInput = undefined, isOwner = false, onTestFlow = undefined, isRunning = false, onCancelTestFlow = undefined, onOpenPreview = undefined, onHideJobStatus = undefined, individualStepTests = false, flowJob = undefined, showJobStatus = false, suspendStatus = writable({}), flowHasChanged = false } = $props();
49
42
  setContext('FlowGraphContext', { selectedId, useDataflow });
50
43
  if (triggerContext && allowSimplifiedPoll) {
51
44
  if (isSimplifiable(modules)) {
@@ -55,66 +48,6 @@ if (triggerContext && allowSimplifiedPoll) {
55
48
  computeSimplifiableFlow(modules ?? [], value ?? false);
56
49
  });
57
50
  }
58
- const flowGraphAssetsCtx = $state({
59
- val: {
60
- assetsMap: inputAssets ? { Input: inputAssets } : {},
61
- selectedAsset: undefined,
62
- dbManagerDrawer: undefined,
63
- s3FilePicker: undefined,
64
- resourceEditorDrawer: undefined,
65
- resourceMetadataCache: {}
66
- }
67
- });
68
- setContext('FlowGraphAssetContext', flowGraphAssetsCtx);
69
- const assetsMap = $derived(flowGraphAssetsCtx.val.assetsMap);
70
- $effect(() => {
71
- if (inputAssets)
72
- flowGraphAssetsCtx.val.assetsMap.Input = inputAssets;
73
- });
74
- // Fetch resource metadata for the ExploreAssetButton
75
- const resMetadataCache = $derived(flowGraphAssetsCtx.val.resourceMetadataCache);
76
- $effect(() => {
77
- for (const asset of Object.values(assetsMap ?? []).flatMap((x) => x)) {
78
- if (asset.kind !== 'resource' || asset.path in resMetadataCache)
79
- continue;
80
- resMetadataCache[asset.path] = undefined; // avoid fetching multiple times because of async
81
- ResourceService.getResource({ path: asset.path, workspace: $workspaceStore }).then((r) => (resMetadataCache[asset.path] = { resource_type: r.resource_type }));
82
- }
83
- });
84
- // Fetch transitive assets (path scripts and flows)
85
- $effect(() => {
86
- if (!$workspaceStore)
87
- return;
88
- let usages = [];
89
- let modIds = [];
90
- for (const mod of getAllModules(modules)) {
91
- if (mod.id in assetsMap)
92
- continue;
93
- assetsMap[mod.id] = []; // avoid fetching multiple times because of async
94
- if (mod.value.type === 'flow' || mod.value.type === 'script') {
95
- usages.push({ path: mod.value.path, kind: mod.value.type });
96
- modIds.push(mod.id);
97
- }
98
- }
99
- if (usages.length) {
100
- AssetService.listAssetsByUsage({
101
- workspace: $workspaceStore,
102
- requestBody: { usages }
103
- }).then((result) => {
104
- result.forEach((assets, idx) => {
105
- assetsMap[modIds[idx]] = assets;
106
- });
107
- });
108
- }
109
- });
110
- // Prune assetsMap to only contain assets that are actually used
111
- $effect(() => {
112
- const allModules = new Set(getAllModules(modules).map((mod) => mod.id));
113
- for (const modId in assetsMap) {
114
- if (modId !== 'Input' && !allModules.has(modId))
115
- delete assetsMap[modId];
116
- }
117
- });
118
51
  function computeSimplifiableFlow(modules, simplifiedFlow) {
119
52
  const isSimplif = isSimplifiable(modules);
120
53
  simplifiableFlow = isSimplif ? { simplifiedFlow } : undefined;
@@ -289,11 +222,7 @@ async function updateStores() {
289
222
  }
290
223
  let newGraph = graph;
291
224
  newGraph.nodes.sort((a, b) => b.id.localeCompare(a.id));
292
- [nodes, edges] = computeAssetNodes(layoutNodes(newGraph.nodes), newGraph.edges, assetsMap, {
293
- moving,
294
- eventHandlers: eventHandler,
295
- disableAi
296
- });
225
+ [nodes, edges] = computeAssetNodes(layoutNodes(newGraph.nodes), newGraph.edges);
297
226
  await tick();
298
227
  height = Math.max(...nodes.map((n) => n.position.y + NODE.height + 100), minHeight);
299
228
  }
@@ -326,11 +255,13 @@ const proOptions = { hideAttribution: true };
326
255
  // centerViewport(width)
327
256
  // })
328
257
  let yamlEditorDrawer = $state(undefined);
258
+ const flowGraphAssetsCtx = getContext('FlowGraphAssetContext');
329
259
  $effect(() => {
330
260
  allowSimplifiedPoll && modules && untrack(() => onModulesChange(modules ?? []));
331
261
  });
332
262
  $effect(() => {
333
- modules && untrack(() => onModulesChange2(modules));
263
+ readFieldsRecursively(modules);
264
+ untrack(() => onModulesChange2(modules));
334
265
  });
335
266
  let graph = $derived.by(() => {
336
267
  moduleCounter;
@@ -350,13 +281,13 @@ let graph = $derived.by(() => {
350
281
  flowJob,
351
282
  showJobStatus,
352
283
  suspendStatus,
353
- flowHasChanged
284
+ flowHasChanged,
285
+ additionalAssetsMap: flowGraphAssetsCtx?.val.additionalAssetsMap
354
286
  }, failureModule, preprocessorModule, eventHandler, success, $useDataflow, $selectedId, moving, simplifiableFlow, triggerNode ? path : undefined, expandedSubflows);
355
287
  });
356
288
  $effect(() => {
357
289
  ;
358
290
  [graph, allowSimplifiedPoll];
359
- readFieldsRecursively(assetsMap);
360
291
  untrack(() => updateStores());
361
292
  });
362
293
  let showDataflow = $derived($selectedId != undefined &&
@@ -481,33 +412,6 @@ export function isNodeVisible(nodeId) {
481
412
  {/if}
482
413
  </div>
483
414
 
484
- {#each getAllModules(modules) as mod (mod.id)}
485
- {#if mod.value.type === 'rawscript'}
486
- {@const v = mod.value}
487
- <OnChange
488
- key={[v.content, v.asset_fallback_access_types]}
489
- runFirstEffect
490
- onChange={() =>
491
- inferAssets(v.language, v.content)
492
- .then((assets) => {
493
- for (const override of v.asset_fallback_access_types ?? []) {
494
- assets = assets.map((asset) => {
495
- if (assetEq(asset, override) && !asset.access_type)
496
- return { ...asset, access_type: override.access_type }
497
- return asset
498
- })
499
- }
500
- if (assetsMap && !deepEqual(assetsMap[mod.id], assets)) assetsMap[mod.id] = assets
501
- })
502
- .catch((e) => {})}
503
- />
504
- {/if}
505
- {/each}
506
-
507
- <S3FilePicker bind:this={flowGraphAssetsCtx.val.s3FilePicker} readOnlyMode />
508
- <DbManagerDrawer bind:this={flowGraphAssetsCtx.val.dbManagerDrawer} />
509
- <ResourceEditorDrawer bind:this={flowGraphAssetsCtx.val.resourceEditorDrawer} />
510
-
511
415
  <style>
512
416
  :global(.svelte-flow__handle) {
513
417
  opacity: 0;
@@ -3,7 +3,6 @@ import { type GraphModuleState } from '.';
3
3
  import { type Writable } from 'svelte/store';
4
4
  import '@xyflow/svelte/dist/base.css';
5
5
  import { type InlineScript, type InsertKind, type onSelectedIteration } from './graphBuilder.svelte';
6
- import { type AssetWithAccessType } from '../assets/lib';
7
6
  interface Props {
8
7
  success?: boolean | undefined;
9
8
  modules?: FlowModule[] | undefined;
@@ -29,7 +28,6 @@ interface Props {
29
28
  editMode?: boolean;
30
29
  allowSimplifiedPoll?: boolean;
31
30
  expandedSubflows?: Record<string, FlowModule[]>;
32
- inputAssets?: AssetWithAccessType[];
33
31
  isOwner?: boolean;
34
32
  isRunning?: boolean;
35
33
  individualStepTests?: boolean;
@@ -1,7 +1,7 @@
1
1
  import type { FlowModule, Job, RawScript, Script } from '../../gen';
2
2
  import { type Edge } from '@xyflow/svelte';
3
3
  import type { GraphModuleState } from './model';
4
- import type { AssetWithAccessType } from '../assets/lib';
4
+ import { type AssetWithAltAccessType } from '../assets/lib';
5
5
  import type { Writable } from 'svelte/store';
6
6
  export type InsertKind = 'script' | 'forloop' | 'whileloop' | 'branchone' | 'branchall' | 'flow' | 'trigger' | 'approval' | 'end';
7
7
  export type InlineScript = {
@@ -88,6 +88,7 @@ export type InputN = {
88
88
  flowJob: Job | undefined;
89
89
  showJobStatus: boolean;
90
90
  flowHasChanged: boolean;
91
+ assets?: AssetWithAltAccessType[] | undefined;
91
92
  };
92
93
  };
93
94
  export type ModuleN = {
@@ -104,6 +105,7 @@ export type ModuleN = {
104
105
  editMode: boolean;
105
106
  flowJob: Job | undefined;
106
107
  isOwner: boolean;
108
+ assets: AssetWithAltAccessType[] | undefined;
107
109
  };
108
110
  };
109
111
  export type BranchAllStartN = {
@@ -236,13 +238,13 @@ export type TriggerN = {
236
238
  export type AssetN = {
237
239
  type: 'asset';
238
240
  data: {
239
- asset: AssetWithAccessType;
241
+ asset: AssetWithAltAccessType;
240
242
  };
241
243
  };
242
244
  export type AssetsOverflowedN = {
243
245
  type: 'assetsOverflowed';
244
246
  data: {
245
- overflowedAssets: AssetWithAccessType[];
247
+ overflowedAssets: AssetWithAltAccessType[];
246
248
  };
247
249
  };
248
250
  export declare function graphBuilder(modules: FlowModule[] | undefined, extra: {
@@ -265,6 +267,7 @@ export declare function graphBuilder(modules: FlowModule[] | undefined, extra: {
265
267
  nb: number;
266
268
  }>>;
267
269
  flowHasChanged: boolean;
270
+ additionalAssetsMap?: Record<string, AssetWithAltAccessType[]>;
268
271
  }, failureModule: FlowModule | undefined, preprocessorModule: FlowModule | undefined, eventHandlers: GraphEventHandlers, success: boolean | undefined, useDataflow: boolean | undefined, selectedId: string | undefined, moving: string | undefined, simplifiableFlow: SimplifiableFlow | undefined, flowPathForTriggerNode: string | undefined, expandedSubflows: Record<string, FlowModule[]>): {
269
272
  nodes: NodeLayout[];
270
273
  edges: Edge[];