windmill-components 1.504.6 → 1.511.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 (233) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +184 -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 +115 -88
  10. package/package/components/Editor.svelte.d.ts +30 -55
  11. package/package/components/EditorBar.svelte +2 -2
  12. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  13. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  14. package/package/components/FlowBuilder.svelte +11 -2
  15. package/package/components/FlowJobResult.svelte +12 -17
  16. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  17. package/package/components/FlowPreviewContent.svelte +13 -10
  18. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  19. package/package/components/FlowPreviewResult.svelte +14 -6
  20. package/package/components/FlowStatusViewer.svelte +11 -24
  21. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  22. package/package/components/FlowStatusViewerInner.svelte +110 -131
  23. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  24. package/package/components/GitDiffPreview.svelte +55 -0
  25. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  26. package/package/components/HistoricInputs.svelte +2 -2
  27. package/package/components/HttpAgentWorkerDrawer.svelte +1 -1
  28. package/package/components/InitGitRepoPopover.svelte +410 -0
  29. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  30. package/package/components/InstanceSetting.svelte +21 -9
  31. package/package/components/InstanceSettings.svelte +16 -3
  32. package/package/components/JobLoader.svelte +567 -0
  33. package/package/components/JobLoader.svelte.d.ts +53 -0
  34. package/package/components/JobLogs.svelte +6 -4
  35. package/package/components/JobLogs.svelte.d.ts +5 -18
  36. package/package/components/JsonEditor.svelte +11 -11
  37. package/package/components/JsonEditor.svelte.d.ts +14 -56
  38. package/package/components/Label.svelte +6 -11
  39. package/package/components/Label.svelte.d.ts +14 -39
  40. package/package/components/LightweightResourcePicker.svelte +18 -39
  41. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  42. package/package/components/LogViewer.svelte +35 -41
  43. package/package/components/LogViewer.svelte.d.ts +6 -20
  44. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  45. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  46. package/package/components/ModuleTest.svelte +16 -11
  47. package/package/components/NumberTypeNarrowing.svelte +13 -16
  48. package/package/components/NumberTypeNarrowing.svelte.d.ts +4 -18
  49. package/package/components/PullGitRepoPopover.svelte +355 -0
  50. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  51. package/package/components/ResourceTypePicker.svelte +20 -17
  52. package/package/components/ResourceTypePicker.svelte.d.ts +7 -6
  53. package/package/components/S3FilePicker.svelte +5 -3
  54. package/package/components/SavedInputs.svelte +2 -2
  55. package/package/components/ScriptBuilder.svelte +4 -3
  56. package/package/components/ScriptEditor.svelte +34 -31
  57. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  58. package/package/components/Section.svelte +7 -20
  59. package/package/components/Section.svelte.d.ts +20 -47
  60. package/package/components/ServiceLogsInner.svelte +2 -1
  61. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  62. package/package/components/SimpleEditor.svelte +4 -4
  63. package/package/components/SimpleEditor.svelte.d.ts +1 -0
  64. package/package/components/SqlRepl.svelte +0 -1
  65. package/package/components/Subsection.svelte +10 -12
  66. package/package/components/Subsection.svelte.d.ts +15 -39
  67. package/package/components/UserSettings.svelte +1 -1
  68. package/package/components/WorkerGroup.svelte +260 -165
  69. package/package/components/WorkerGroup.svelte.d.ts +2 -0
  70. package/package/components/WorkerTagPicker.svelte +3 -3
  71. package/package/components/WorkerTagSelect.svelte +33 -4
  72. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  73. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  74. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  75. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  76. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  77. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  78. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  79. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  80. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  81. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  82. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  83. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  84. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  85. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  86. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  87. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  88. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  89. package/package/components/apps/editor/component/components.d.ts +12 -0
  90. package/package/components/apps/editor/component/components.js +19 -7
  91. package/package/components/assets/AssetButtons.svelte +38 -0
  92. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  93. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  94. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  95. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  96. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  97. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  98. package/package/components/assets/README_DEV.md +0 -0
  99. package/package/components/assets/lib.d.ts +9 -1
  100. package/package/components/assets/lib.js +48 -7
  101. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  102. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  103. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  104. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  105. package/package/components/common/table/ScriptRow.svelte +3 -1
  106. package/package/components/copilot/AIFormSettings.svelte +3 -4
  107. package/package/components/copilot/AIFormSettings.svelte.d.ts +5 -19
  108. package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
  109. package/package/components/copilot/autocomplete/Autocompletor.js +269 -35
  110. package/package/components/copilot/autocomplete/request.d.ts +3 -0
  111. package/package/components/copilot/autocomplete/request.js +15 -7
  112. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  113. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  114. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  115. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  116. package/package/components/copilot/chat/flow/core.js +2 -38
  117. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  118. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  119. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  120. package/package/components/copilot/chat/navigator/core.js +2 -1
  121. package/package/components/copilot/chat/script/core.d.ts +11 -2
  122. package/package/components/copilot/chat/script/core.js +165 -23
  123. package/package/components/copilot/chat/shared.d.ts +10 -0
  124. package/package/components/copilot/chat/shared.js +56 -0
  125. package/package/components/copilot/lib.d.ts +1 -0
  126. package/package/components/copilot/lib.js +30 -9
  127. package/package/components/custom_ui.d.ts +1 -0
  128. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  129. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  130. package/package/components/flows/content/FlowModuleCache.svelte +4 -4
  131. package/package/components/flows/content/FlowModuleCache.svelte.d.ts +4 -18
  132. package/package/components/flows/content/FlowModuleComponent.svelte +16 -19
  133. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +3 -4
  134. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte.d.ts +4 -18
  135. package/package/components/flows/content/FlowModuleSleep.svelte +6 -7
  136. package/package/components/flows/content/FlowModuleSleep.svelte.d.ts +4 -18
  137. package/package/components/flows/content/FlowModuleSuspend.svelte +19 -17
  138. package/package/components/flows/content/FlowModuleSuspend.svelte.d.ts +4 -18
  139. package/package/components/flows/content/FlowModuleTimeout.svelte +4 -4
  140. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +4 -18
  141. package/package/components/flows/flowStore.d.ts +1 -1
  142. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  143. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  144. package/package/components/flows/scheduleUtils.js +1 -1
  145. package/package/components/flows/types.d.ts +2 -1
  146. package/package/components/graph/FlowGraphV2.svelte +8 -104
  147. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  148. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  149. package/package/components/graph/graphBuilder.svelte.js +35 -9
  150. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  151. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  152. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  153. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  154. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  155. package/package/components/graph/util.js +1 -1
  156. package/package/components/home/ItemsList.svelte +2 -0
  157. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  158. package/package/components/jobs/JobPreview.svelte +10 -6
  159. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  160. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  161. package/package/components/runs/JobPreview.svelte +26 -16
  162. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  163. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  164. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  165. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  166. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  167. package/package/components/script_builder.d.ts +2 -2
  168. package/package/components/settings/CreateToken.svelte +76 -41
  169. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  170. package/package/components/settings/ScopeSelector.svelte +613 -0
  171. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  172. package/package/components/settings/TokenDisplay.svelte +103 -0
  173. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  174. package/package/components/settings/TokensTable.svelte +70 -349
  175. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  176. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  177. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  178. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  179. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  180. package/package/components/triggers/TriggersEditor.svelte +45 -3
  181. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  182. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +47 -6
  183. package/package/components/triggers/gcp/utils.js +9 -1
  184. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +3 -2
  185. package/package/components/triggers/http/RouteEditorConfigSection.svelte +26 -23
  186. package/package/components/triggers/http/RouteEditorConfigSection.svelte.d.ts +5 -19
  187. package/package/components/triggers/http/RouteEditorInner.svelte +219 -175
  188. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  189. package/package/components/triggers/http/utils.js +9 -3
  190. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +47 -6
  191. package/package/components/triggers/kafka/utils.js +9 -1
  192. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  193. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  194. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +182 -13
  195. package/package/components/triggers/mqtt/utils.js +9 -1
  196. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +47 -6
  197. package/package/components/triggers/nats/utils.js +9 -1
  198. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  199. package/package/components/triggers/postgres/utils.js +9 -1
  200. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +38 -92
  201. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +47 -6
  202. package/package/components/triggers/sqs/utils.js +9 -1
  203. package/package/components/triggers/utils.js +12 -0
  204. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +47 -6
  205. package/package/components/triggers/websocket/utils.js +11 -1
  206. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  207. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  208. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  209. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  211. package/package/gen/core/OpenAPI.js +1 -1
  212. package/package/gen/schemas.gen.d.ts +305 -23
  213. package/package/gen/schemas.gen.js +305 -23
  214. package/package/gen/services.gen.d.ts +33 -1
  215. package/package/gen/services.gen.js +66 -2
  216. package/package/gen/types.gen.d.ts +216 -11
  217. package/package/history.svelte.js +0 -2
  218. package/package/hub.d.ts +1 -0
  219. package/package/hubPaths.json +5 -2
  220. package/package/infer.js +16 -10
  221. package/package/svelte5Utils.svelte.d.ts +1 -0
  222. package/package/svelte5Utils.svelte.js +25 -18
  223. package/package/toast.js +10 -0
  224. package/package/utils.d.ts +3 -2
  225. package/package/utils.js +20 -5
  226. package/package.json +11 -11
  227. package/package/components/ResultJobLoader.svelte +0 -219
  228. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  229. package/package/components/TestJobLoader.svelte +0 -274
  230. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  231. package/package/components/icons/AssetVarIcon.svelte +0 -31
  232. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  233. /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
@@ -1,6 +1,4 @@
1
- <!-- <script lang="ts"></script> -->
2
-
3
- <script context="module">
1
+ <script module>
4
2
  import '@codingame/monaco-vscode-standalone-languages'
5
3
  import '@codingame/monaco-vscode-standalone-typescript-language-features'
6
4
  import processStdContent from '../process.d.ts.txt?raw'
@@ -73,7 +71,7 @@
73
71
 
74
72
  <script lang="ts">import { BROWSER } from 'esm-env';
75
73
  import { sendUserToast } from '../toast';
76
- import { createEventDispatcher, onDestroy, onMount } from 'svelte';
74
+ import { createEventDispatcher, onDestroy, onMount, untrack } from 'svelte';
77
75
  // import libStdContent from '../es6.d.ts.txt?raw'
78
76
  // import domContent from '../dom.d.ts.txt?raw'
79
77
  // import denoFetchContent from '../deno_fetch.d.ts.txt?raw'
@@ -113,45 +111,23 @@ import { editorPositionMap } from '../utils';
113
111
  import { extToLang, langToExt } from '../editorLangUtils';
114
112
  import { aiChatManager } from './copilot/chat/AIChatManager.svelte';
115
113
  // import EditorTheme from './EditorTheme.svelte'
116
- let divEl = null;
117
- let editor = null;
118
- // for related places search: ADD_NEW_LANG
119
- export let code = '';
120
- export let cmdEnterAction = undefined;
121
- export let formatAction = undefined;
122
- export let automaticLayout = true;
123
- export let websocketAlive = {
124
- pyright: false,
125
- ruff: false,
126
- deno: false,
127
- go: false,
128
- shellcheck: false
129
- };
130
- export let shouldBindKey = true;
131
- export let fixedOverflowWidgets = true;
132
- export let path = undefined;
133
- export let yContent = undefined;
134
- export let awareness = undefined;
135
- export let folding = false;
136
- export let args = undefined;
137
- export let useWebsockets = true;
138
- export let small = false;
139
- export let scriptLang;
140
- export let disabled = false;
141
- export let lineNumbersMinChars = 3;
142
- export let files = {};
143
- export let extraLib = undefined;
144
- export let changeTimeout = 500;
145
- export let loadAsync = false;
146
- export let key = undefined;
147
- let lang = scriptLangToEditorLang(scriptLang);
148
- $: lang = scriptLangToEditorLang(scriptLang);
149
- let filePath = computePath(path);
150
- $: filePath = computePath(path);
151
- let initialPath = path;
152
- $: path != initialPath &&
153
- (scriptLang == 'deno' || scriptLang == 'bun' || scriptLang == 'bunnative') &&
154
- handlePathChange();
114
+ let divEl = $state(null);
115
+ let editor = $state(null);
116
+ let { code = $bindable(), cmdEnterAction = undefined, formatAction = undefined, automaticLayout = true, websocketAlive = $bindable(), shouldBindKey = true, fixedOverflowWidgets = true, path = undefined, yContent = undefined, awareness = undefined, folding = false, args = undefined, useWebsockets = true, small = false, scriptLang, disabled = false, lineNumbersMinChars = 3, files = {}, extraLib = undefined, changeTimeout = 500, loadAsync = false, key = undefined, class: clazz = undefined } = $props();
117
+ $effect.pre(() => {
118
+ if (websocketAlive == undefined) {
119
+ websocketAlive = {
120
+ pyright: false,
121
+ ruff: false,
122
+ deno: false,
123
+ go: false,
124
+ shellcheck: false
125
+ };
126
+ }
127
+ });
128
+ let lang = $state(scriptLangToEditorLang(scriptLang));
129
+ let filePath = $state(computePath(path));
130
+ let initialPath = $state(path);
155
131
  let websockets = [];
156
132
  let languageClients = [];
157
133
  let websocketInterval;
@@ -160,7 +136,7 @@ let nbWsAttempt = 0;
160
136
  let disposeMethod;
161
137
  const dispatch = createEventDispatcher();
162
138
  let graphqlService = undefined;
163
- let dbSchema = undefined;
139
+ let dbSchema = $state(undefined);
164
140
  let destroyed = false;
165
141
  const uri = computeUri(filePath, scriptLang);
166
142
  console.log('uri', uri);
@@ -375,10 +351,7 @@ export function getScriptLang() {
375
351
  return scriptLang;
376
352
  }
377
353
  let command = undefined;
378
- let sqlTypeCompletor = undefined;
379
- $: initialized && lang === 'sql' && scriptLang
380
- ? addSqlTypeCompletions()
381
- : sqlTypeCompletor?.dispose();
354
+ let sqlTypeCompletor = $state(undefined);
382
355
  function addSqlTypeCompletions() {
383
356
  if (sqlTypeCompletor) {
384
357
  sqlTypeCompletor.dispose();
@@ -441,16 +414,12 @@ function updateSchema() {
441
414
  dbSchema = undefined;
442
415
  }
443
416
  }
444
- $: lang && args && $dbSchemas && updateSchema();
445
- $: initialized && dbSchema && ['sql', 'graphql'].includes(lang) && addDBSchemaCompletions();
446
417
  function disposeSqlSchemaCompletor() {
447
418
  sqlSchemaCompletor?.dispose();
448
419
  }
449
- $: (!dbSchema || lang !== 'sql') && disposeSqlSchemaCompletor();
450
420
  function disposeGaphqlService() {
451
421
  graphqlService = undefined;
452
422
  }
453
- $: (!dbSchema || lang !== 'graphql') && disposeGaphqlService();
454
423
  function addDBSchemaCompletions() {
455
424
  const { lang: schemaLang, schema } = dbSchema || {};
456
425
  if (!schemaLang || !schema) {
@@ -544,12 +513,12 @@ function addDBSchemaCompletions() {
544
513
  });
545
514
  }
546
515
  }
547
- let reviewingChanges = writable(false);
548
- let aiChatEditorHandler = undefined;
516
+ let reviewingChanges = $state(writable(false));
517
+ let aiChatEditorHandler = $state(undefined);
549
518
  // Inline ai chat widget
550
- let showInlineAIChat = false;
551
- let inlineAIChatSelection = null;
552
- let selectedCode = '';
519
+ let showInlineAIChat = $state(false);
520
+ let inlineAIChatSelection = $state(null);
521
+ let selectedCode = $state('');
553
522
  export function reviewAndApplyCode(code) {
554
523
  aiChatEditorHandler?.reviewAndApply(code);
555
524
  }
@@ -562,22 +531,13 @@ function addChatHandler(editor) {
562
531
  console.error('Could not add chat handler', err);
563
532
  }
564
533
  }
565
- let autocompletor = undefined;
534
+ let autocompletor = $state(undefined);
566
535
  function addAutoCompletor(editor, scriptLang) {
567
536
  if (autocompletor) {
568
537
  autocompletor.dispose();
569
538
  }
570
539
  autocompletor = new Autocompletor(editor, scriptLang);
571
540
  }
572
- $: $copilotInfo.enabled &&
573
- $codeCompletionSessionEnabled &&
574
- Autocompletor.isProviderModelSupported($copilotInfo.codeCompletionModel) &&
575
- initialized &&
576
- editor &&
577
- scriptLang &&
578
- addAutoCompletor(editor, scriptLang);
579
- $: $copilotInfo.enabled && initialized && editor && addChatHandler(editor);
580
- $: !$codeCompletionSessionEnabled && autocompletor?.dispose();
581
541
  const outputChannel = {
582
542
  name: 'Language Server Client',
583
543
  appendLine: (msg) => {
@@ -688,6 +648,10 @@ export async function reloadWebsocket() {
688
648
  try {
689
649
  console.log('starting client');
690
650
  await languageClient.start();
651
+ // for python we want to use the pyright client for signature help, not ruff
652
+ if (lang !== 'python' || (lang === 'python' && name == 'pyright')) {
653
+ autocompletor?.setLanguageClient(languageClient);
654
+ }
691
655
  console.log('started client');
692
656
  }
693
657
  catch (err) {
@@ -914,21 +878,15 @@ async function closeWebsockets() {
914
878
  websocketInterval && clearInterval(websocketInterval);
915
879
  }
916
880
  // let widgets: HTMLElement | undefined = document.getElementById('monaco-widgets-root') ?? undefined
917
- let model = undefined;
918
- let monacoBinding = undefined;
919
- $: if (yContent && awareness && model && editor) {
920
- monacoBinding && monacoBinding.destroy();
921
- monacoBinding = new MonacoBinding(yContent, model, new Set([editor]), awareness);
922
- }
923
- let initialized = false;
881
+ let model = $state(undefined);
882
+ let monacoBinding = $state(undefined);
883
+ let initialized = $state(false);
924
884
  let ata = undefined;
925
- let statusDiv = null;
885
+ let statusDiv = $state(null);
926
886
  function saveDraft() {
927
887
  dispatch('saveDraft', code);
928
888
  }
929
- let vimDisposable = undefined;
930
- $: editor && $vimMode && statusDiv && onVimMode();
931
- $: !$vimMode && vimDisposable && onVimDisable();
889
+ let vimDisposable = $state(undefined);
932
890
  function onVimDisable() {
933
891
  vimDisposable?.dispose();
934
892
  }
@@ -937,7 +895,6 @@ function onVimMode() {
937
895
  vimDisposable = initVim(editor, statusDiv, saveDraft);
938
896
  }
939
897
  }
940
- $: files && model && onFileChanges();
941
898
  let svelteRegistered = false;
942
899
  let vueRegistered = false;
943
900
  function onFileChanges() {
@@ -1019,7 +976,7 @@ async function loadMonaco() {
1019
976
  // console.log('af ready')
1020
977
  initialized = true;
1021
978
  try {
1022
- model = meditor.createModel(code, lang == 'nu' ? 'python' : lang, mUri.parse(uri));
979
+ model = meditor.createModel(code ?? '', lang == 'nu' ? 'python' : lang, mUri.parse(uri));
1023
980
  }
1024
981
  catch (err) {
1025
982
  console.log('model already existed', err);
@@ -1033,7 +990,7 @@ async function loadMonaco() {
1033
990
  onFileChanges();
1034
991
  try {
1035
992
  editor = meditor.create(divEl, {
1036
- ...editorConfig(code, lang, automaticLayout, fixedOverflowWidgets),
993
+ ...editorConfig(code ?? '', lang, automaticLayout, fixedOverflowWidgets),
1037
994
  model,
1038
995
  fontSize: !small ? 14 : 12,
1039
996
  lineNumbersMinChars,
@@ -1074,11 +1031,14 @@ async function loadMonaco() {
1074
1031
  });
1075
1032
  editor?.onDidFocusEditorText(() => {
1076
1033
  dispatch('focus');
1077
- editor?.addCommand(KeyCode.Escape, function () {
1078
- if (showInlineAIChat) {
1079
- closeAIInlineWidget();
1034
+ // for escape we use onkeydown instead of addCommand because addCommand on escape specifically prevents default behavior (like autocomplete cancellation)
1035
+ editor?.onKeyDown((e) => {
1036
+ if (e.keyCode === KeyCode.Escape) {
1037
+ if (showInlineAIChat) {
1038
+ closeAIInlineWidget();
1039
+ }
1040
+ aiChatEditorHandler?.rejectAll();
1080
1041
  }
1081
- aiChatEditorHandler?.rejectAll();
1082
1042
  });
1083
1043
  editor?.addCommand(KeyMod.CtrlCmd | KeyCode.DownArrow, function () {
1084
1044
  if (aiChatManager.pendingNewCode) {
@@ -1244,7 +1204,7 @@ async function setTypescriptExtraLibs() {
1244
1204
  });
1245
1205
  if (scriptLang == 'bun') {
1246
1206
  ata?.('import "bun-types"');
1247
- ata?.(code);
1207
+ ata?.(code ?? '');
1248
1208
  }
1249
1209
  dispatch('ataReady');
1250
1210
  }
@@ -1280,7 +1240,7 @@ function closeAIInlineWidget() {
1280
1240
  inlineAIChatSelection = null;
1281
1241
  selectedCode = '';
1282
1242
  }
1283
- let aiChatInlineWidget = null;
1243
+ let aiChatInlineWidget = $state(null);
1284
1244
  let loadTimeout = undefined;
1285
1245
  onMount(async () => {
1286
1246
  if (BROWSER) {
@@ -1334,6 +1294,73 @@ function onKeyDown(e) {
1334
1294
  }
1335
1295
  }
1336
1296
  }
1297
+ $effect(() => {
1298
+ lang = scriptLangToEditorLang(scriptLang);
1299
+ });
1300
+ $effect(() => {
1301
+ filePath = computePath(path);
1302
+ });
1303
+ $effect(() => {
1304
+ path != initialPath &&
1305
+ (scriptLang == 'deno' || scriptLang == 'bun' || scriptLang == 'bunnative') &&
1306
+ untrack(() => {
1307
+ handlePathChange();
1308
+ });
1309
+ });
1310
+ $effect(() => {
1311
+ initialized && lang === 'sql' && scriptLang
1312
+ ? untrack(() => addSqlTypeCompletions())
1313
+ : sqlTypeCompletor?.dispose();
1314
+ });
1315
+ $effect(() => {
1316
+ lang && args && $dbSchemas && untrack(() => updateSchema());
1317
+ });
1318
+ $effect(() => {
1319
+ initialized &&
1320
+ dbSchema &&
1321
+ ['sql', 'graphql'].includes(lang) &&
1322
+ untrack(() => addDBSchemaCompletions());
1323
+ });
1324
+ $effect(() => {
1325
+ ;
1326
+ (!dbSchema || lang !== 'sql') && untrack(() => disposeSqlSchemaCompletor());
1327
+ });
1328
+ $effect(() => {
1329
+ ;
1330
+ (!dbSchema || lang !== 'graphql') && untrack(() => disposeGaphqlService());
1331
+ });
1332
+ $effect(() => {
1333
+ $copilotInfo.enabled &&
1334
+ $codeCompletionSessionEnabled &&
1335
+ Autocompletor.isProviderModelSupported($copilotInfo.codeCompletionModel) &&
1336
+ initialized &&
1337
+ editor &&
1338
+ scriptLang &&
1339
+ untrack(() => editor && addAutoCompletor(editor, scriptLang));
1340
+ });
1341
+ $effect(() => {
1342
+ $copilotInfo.enabled && initialized && editor && untrack(() => editor && addChatHandler(editor));
1343
+ });
1344
+ $effect(() => {
1345
+ !$codeCompletionSessionEnabled && autocompletor?.dispose();
1346
+ });
1347
+ $effect(() => {
1348
+ if (yContent && awareness && model && editor) {
1349
+ monacoBinding && monacoBinding.destroy();
1350
+ untrack(() => {
1351
+ monacoBinding = new MonacoBinding(yContent, model, new Set([editor]), awareness);
1352
+ });
1353
+ }
1354
+ });
1355
+ $effect(() => {
1356
+ editor && $vimMode && statusDiv && untrack(() => onVimMode());
1357
+ });
1358
+ $effect(() => {
1359
+ !$vimMode && vimDisposable && untrack(() => onVimDisable());
1360
+ });
1361
+ $effect(() => {
1362
+ files && model && untrack(() => onFileChanges());
1363
+ });
1337
1364
  </script>
1338
1365
 
1339
1366
  <svelte:window onkeydown={onKeyDown} />
@@ -1343,7 +1370,7 @@ function onKeyDown(e) {
1343
1370
  <FakeMonacoPlaceHolder {code} />
1344
1371
  </div>
1345
1372
  {/if}
1346
- <div bind:this={divEl} class="{$$props.class} editor {disabled ? 'disabled' : ''}"></div>
1373
+ <div bind:this={divEl} class="{clazz} editor {disabled ? 'disabled' : ''}"></div>
1347
1374
  {#if $vimMode}
1348
1375
  <div class="fixed bottom-0 z-30" bind:this={statusDiv}></div>
1349
1376
  {/if}