windmill-components 1.379.4 → 1.382.3

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 (199) hide show
  1. package/package/base.d.ts +1 -1
  2. package/package/base.js +1 -1
  3. package/package/components/ArgInput.svelte +33 -3
  4. package/package/components/DisplayResult.svelte +17 -5
  5. package/package/components/EditorBar.svelte +48 -38
  6. package/package/components/EditorBar.svelte.d.ts +2 -0
  7. package/package/components/ErrorOrRecoveryHandler.svelte +3 -2
  8. package/package/components/FlowBuilder.svelte +18 -12
  9. package/package/components/FlowBuilder.svelte.d.ts +3 -2
  10. package/package/components/FlowGraphViewer.svelte +6 -5
  11. package/package/components/FlowJobResult.svelte +4 -2
  12. package/package/components/FlowJobResult.svelte.d.ts +2 -0
  13. package/package/components/FlowStatusViewer.svelte +7 -1
  14. package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
  15. package/package/components/FlowStatusViewerInner.svelte +29 -11
  16. package/package/components/FlowViewer.svelte +3 -1
  17. package/package/components/FlowViewer.svelte.d.ts +1 -0
  18. package/package/components/HighlightCode.svelte +2 -2
  19. package/package/components/ModulePreviewForm.svelte +1 -1
  20. package/package/components/ObjectResourceInput.svelte +7 -2
  21. package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
  22. package/package/components/ResourcePicker.svelte +60 -48
  23. package/package/components/ScriptBuilder.svelte +42 -36
  24. package/package/components/ScriptBuilder.svelte.d.ts +2 -0
  25. package/package/components/ScriptEditor.svelte +3 -1
  26. package/package/components/ScriptEditor.svelte.d.ts +2 -0
  27. package/package/components/ScriptVersionHistory.svelte +63 -7
  28. package/package/components/apps/components/display/AppText.svelte +8 -3
  29. package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte +3 -2
  30. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +22 -5
  31. package/package/components/apps/components/display/table/AppAggridTable.svelte +14 -5
  32. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +23 -8
  33. package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +5 -3
  34. package/package/components/apps/components/display/table/utils.js +8 -7
  35. package/package/components/apps/components/helpers/RunnableComponent.svelte +13 -1
  36. package/package/components/apps/components/helpers/eval.js +31 -25
  37. package/package/components/apps/components/inputs/AppSelect.svelte +45 -29
  38. package/package/components/apps/editor/AppEditorHeader.svelte +1 -0
  39. package/package/components/apps/editor/AppReportsDrawer.svelte +4 -3
  40. package/package/components/apps/editor/component/components.d.ts +7 -1
  41. package/package/components/apps/editor/component/components.js +6 -0
  42. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +0 -1
  43. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte +55 -45
  44. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte.d.ts +7 -9
  45. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +66 -59
  46. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +9 -11
  47. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +213 -254
  48. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte.d.ts +0 -1
  49. package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.d.ts +1 -1
  50. package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.js +2 -6
  51. package/package/components/custom_ui.d.ts +35 -1
  52. package/package/components/details/DetailPageDetailPanel.svelte +9 -1
  53. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
  54. package/package/components/details/DetailPageLayout.svelte +2 -0
  55. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  56. package/package/components/details/EmailTriggerPanel.svelte +128 -0
  57. package/package/components/details/EmailTriggerPanel.svelte.d.ts +20 -0
  58. package/package/components/details/WebhooksPanel.svelte +10 -71
  59. package/package/components/flows/FlowHistory.svelte +1 -0
  60. package/package/components/flows/content/FlowInputs.svelte +0 -1
  61. package/package/components/flows/content/FlowModuleComponent.svelte +8 -2
  62. package/package/components/flows/content/FlowModuleEarlyStop.svelte +193 -66
  63. package/package/components/flows/content/FlowModuleHeader.svelte +1 -1
  64. package/package/components/flows/content/FlowModuleScript.svelte +33 -3
  65. package/package/components/flows/content/FlowModuleScript.svelte.d.ts +2 -0
  66. package/package/components/flows/content/FlowModuleSuspend.svelte +15 -0
  67. package/package/components/flows/content/FlowSettings.svelte +26 -15
  68. package/package/components/flows/flowExplorer.js +3 -0
  69. package/package/components/flows/flowInfers.js +1 -1
  70. package/package/components/flows/map/FlowJobsMenu.svelte +39 -44
  71. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -2
  72. package/package/components/flows/map/FlowModuleSchemaMap.svelte +4 -3
  73. package/package/components/flows/map/InsertModuleButton.svelte +16 -9
  74. package/package/components/flows/map/MapItem.svelte +4 -98
  75. package/package/components/flows/map/MapItem.svelte.d.ts +0 -5
  76. package/package/components/flows/map/VirtualItem.svelte +6 -159
  77. package/package/components/flows/map/VirtualItem.svelte.d.ts +0 -15
  78. package/package/components/flows/propPicker/PropPickerWrapper.svelte +2 -0
  79. package/package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +1 -0
  80. package/package/components/flows/types.d.ts +2 -0
  81. package/package/components/graph/FlowGraphV2.svelte +256 -0
  82. package/package/components/graph/{FlowGraph.svelte.d.ts → FlowGraphV2.svelte.d.ts} +8 -8
  83. package/package/components/graph/graphBuilder.d.ts +15 -0
  84. package/package/components/graph/graphBuilder.js +337 -0
  85. package/package/components/graph/index.d.ts +0 -1
  86. package/package/components/graph/index.js +0 -1
  87. package/package/components/graph/model.d.ts +4 -8
  88. package/package/components/graph/renderers/edges/BaseEdge.svelte +109 -0
  89. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +35 -0
  90. package/package/components/graph/renderers/edges/DataflowEdge.svelte +37 -0
  91. package/package/components/graph/renderers/edges/DataflowEdge.svelte.d.ts +29 -0
  92. package/package/components/graph/renderers/edges/EmptyEdge.svelte +22 -0
  93. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +23 -0
  94. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +44 -0
  95. package/package/components/graph/renderers/nodes/BranchAllStart.svelte.d.ts +29 -0
  96. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +41 -0
  97. package/package/components/graph/renderers/nodes/BranchOneStart.svelte.d.ts +29 -0
  98. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +19 -0
  99. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte.d.ts +24 -0
  100. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +20 -0
  101. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte.d.ts +25 -0
  102. package/package/components/graph/renderers/nodes/InputNode.svelte +74 -0
  103. package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +23 -0
  104. package/package/components/graph/renderers/nodes/ModuleNode.svelte +71 -0
  105. package/package/components/graph/renderers/nodes/ModuleNode.svelte.d.ts +41 -0
  106. package/package/components/graph/renderers/nodes/NoBranchNode.svelte +20 -0
  107. package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +27 -0
  108. package/package/components/graph/renderers/nodes/NodeWrapper.svelte +21 -0
  109. package/package/components/graph/renderers/nodes/NodeWrapper.svelte.d.ts +22 -0
  110. package/package/components/graph/renderers/nodes/ResultNode.svelte +24 -0
  111. package/package/components/graph/renderers/nodes/ResultNode.svelte.d.ts +22 -0
  112. package/package/components/graph/renderers/nodes/branchAllEndNode.svelte +19 -0
  113. package/package/components/graph/renderers/nodes/branchAllEndNode.svelte.d.ts +26 -0
  114. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +19 -0
  115. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte.d.ts +24 -0
  116. package/package/components/graph/renderers/utils.d.ts +8 -0
  117. package/package/components/graph/renderers/utils.js +26 -0
  118. package/package/components/graph/util.d.ts +1 -2
  119. package/package/components/graph/util.js +2 -8
  120. package/package/components/propertyPicker/PropPickerResult.svelte +6 -1
  121. package/package/components/propertyPicker/PropPickerResult.svelte.d.ts +1 -0
  122. package/package/components/runs/RunsFilter.svelte +15 -17
  123. package/package/components/sidebar/changelogs.js +5 -0
  124. package/package/gen/core/OpenAPI.js +1 -1
  125. package/package/gen/schemas.gen.d.ts +3 -0
  126. package/package/gen/schemas.gen.js +3 -0
  127. package/package/gen/services.gen.d.ts +22 -3
  128. package/package/gen/services.gen.js +38 -2
  129. package/package/gen/types.gen.d.ts +69 -6
  130. package/package/hub.d.ts +11 -0
  131. package/package/hub.js +2 -0
  132. package/package/hubPaths.json +9 -0
  133. package/package/init_scripts/python_failure_module.d.ts +1 -1
  134. package/package/init_scripts/python_failure_module.js +4 -3
  135. package/package/script_helpers.d.ts +2 -2
  136. package/package/script_helpers.js +11 -9
  137. package/package.json +2 -1
  138. package/package/components/graph/FlowGraph.svelte +0 -614
  139. package/package/components/graph/svelvet/LICENSE +0 -21
  140. package/package/components/graph/svelvet/container/README.md +0 -7
  141. package/package/components/graph/svelvet/container/controllers/middleware.d.ts +0 -11
  142. package/package/components/graph/svelvet/container/controllers/middleware.js +0 -87
  143. package/package/components/graph/svelvet/container/models/index.d.ts +0 -0
  144. package/package/components/graph/svelvet/container/models/index.js +0 -1
  145. package/package/components/graph/svelvet/container/views/GraphView.svelte +0 -262
  146. package/package/components/graph/svelvet/container/views/GraphView.svelte.d.ts +0 -26
  147. package/package/components/graph/svelvet/container/views/Svelvet.svelte +0 -121
  148. package/package/components/graph/svelvet/container/views/Svelvet.svelte.d.ts +0 -36
  149. package/package/components/graph/svelvet/customCss/controllers/getCss.d.ts +0 -2
  150. package/package/components/graph/svelvet/customCss/controllers/getCss.js +0 -46
  151. package/package/components/graph/svelvet/d3/controllers/d3.d.ts +0 -5
  152. package/package/components/graph/svelvet/d3/controllers/d3.js +0 -59
  153. package/package/components/graph/svelvet/edges/controllers/anchorCbDev.d.ts +0 -4
  154. package/package/components/graph/svelvet/edges/controllers/anchorCbDev.js +0 -92
  155. package/package/components/graph/svelvet/edges/controllers/anchorCbUser.d.ts +0 -57
  156. package/package/components/graph/svelvet/edges/controllers/anchorCbUser.js +0 -73
  157. package/package/components/graph/svelvet/edges/controllers/util.d.ts +0 -37
  158. package/package/components/graph/svelvet/edges/controllers/util.js +0 -71
  159. package/package/components/graph/svelvet/edges/models/Anchor.d.ts +0 -48
  160. package/package/components/graph/svelvet/edges/models/Anchor.js +0 -122
  161. package/package/components/graph/svelvet/edges/models/Edge.d.ts +0 -48
  162. package/package/components/graph/svelvet/edges/models/Edge.js +0 -109
  163. package/package/components/graph/svelvet/edges/types/types.d.ts +0 -18
  164. package/package/components/graph/svelvet/edges/types/types.js +0 -1
  165. package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte +0 -104
  166. package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte.d.ts +0 -18
  167. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +0 -42
  168. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte.d.ts +0 -17
  169. package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +0 -151
  170. package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte.d.ts +0 -17
  171. package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte +0 -157
  172. package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte.d.ts +0 -60
  173. package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte +0 -8
  174. package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte.d.ts +0 -25
  175. package/package/components/graph/svelvet/edges/views/Edges/types.d.ts +0 -52
  176. package/package/components/graph/svelvet/edges/views/Edges/types.js +0 -1
  177. package/package/components/graph/svelvet/edges/views/Edges/utils.d.ts +0 -33
  178. package/package/components/graph/svelvet/edges/views/Edges/utils.js +0 -31
  179. package/package/components/graph/svelvet/nodes/controllers/util.d.ts +0 -9
  180. package/package/components/graph/svelvet/nodes/controllers/util.js +0 -13
  181. package/package/components/graph/svelvet/nodes/models/Node.d.ts +0 -74
  182. package/package/components/graph/svelvet/nodes/models/Node.js +0 -156
  183. package/package/components/graph/svelvet/nodes/views/Node.svelte +0 -84
  184. package/package/components/graph/svelvet/nodes/views/Node.svelte.d.ts +0 -21
  185. package/package/components/graph/svelvet/store/controllers/storeApi.d.ts +0 -25
  186. package/package/components/graph/svelvet/store/controllers/storeApi.js +0 -91
  187. package/package/components/graph/svelvet/store/controllers/userApi.d.ts +0 -3
  188. package/package/components/graph/svelvet/store/controllers/userApi.js +0 -18
  189. package/package/components/graph/svelvet/store/controllers/util.d.ts +0 -24
  190. package/package/components/graph/svelvet/store/controllers/util.js +0 -148
  191. package/package/components/graph/svelvet/store/models/store.d.ts +0 -13
  192. package/package/components/graph/svelvet/store/models/store.js +0 -12
  193. package/package/components/graph/svelvet/store/types/types.d.ts +0 -127
  194. package/package/components/graph/svelvet/store/types/types.js +0 -1
  195. package/package/components/graph/svelvet/types/README.md +0 -3
  196. package/package/components/graph/svelvet/types/index.d.ts +0 -2
  197. package/package/components/graph/svelvet/types/index.js +0 -1
  198. package/package/components/graph/svelvet/types/types.d.ts +0 -50
  199. package/package/components/graph/svelvet/types/types.js +0 -18
package/package/base.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const base: string;
1
+ export declare let base: string;
package/package/base.js CHANGED
@@ -1 +1 @@
1
- export const base = import.meta.env.VITE_BASE_URL ?? '';
1
+ export let base = import.meta.env.VITE_BASE_URL ?? '';
@@ -364,8 +364,24 @@ $: shouldDispatchChanges && debounced(value);
364
364
  enum_={itemsType?.enum ?? []}
365
365
  enumLabels={extra['enumLabels']}
366
366
  />
367
- {:else if itemsType?.type == 'resource' && itemsType?.resourceType}
368
- <ResourcePicker bind:value={v} resourceType={itemsType?.resourceType} />
367
+ {:else if itemsType?.type == 'resource' && itemsType?.resourceType && resourceTypes?.includes(itemsType.resourceType)}
368
+ <ObjectResourceInput
369
+ bind:value={v}
370
+ format={'resource-' + itemsType?.resourceType}
371
+ defaultValue={undefined}
372
+ />
373
+ {:else if itemsType?.type == 'resource'}
374
+ <JsonEditor
375
+ bind:editor
376
+ on:focus={(e) => {
377
+ dispatch('focus')
378
+ }}
379
+ on:blur={(e) => {
380
+ dispatch('blur')
381
+ }}
382
+ code={JSON.stringify(v, null, 2)}
383
+ bind:value={v}
384
+ />
369
385
  {:else if itemsType?.type === 'object' && itemsType?.properties}
370
386
  <div class="p-8 border rounded-md w-full">
371
387
  <SchemaForm
@@ -412,7 +428,20 @@ $: shouldDispatchChanges && debounced(value);
412
428
  if (value == undefined || !Array.isArray(value)) {
413
429
  value = []
414
430
  }
415
- value = value.concat('')
431
+ if (itemsType?.type == 'number') {
432
+ value = value.concat(0)
433
+ } else if (
434
+ itemsType?.type == 'object' ||
435
+ (itemsType?.type == 'resource' &&
436
+ !(
437
+ itemsType?.resourceType &&
438
+ resourceTypes?.includes(itemsType?.resourceType)
439
+ ))
440
+ ) {
441
+ value = value.concat({})
442
+ } else {
443
+ value = value.concat('')
444
+ }
416
445
  }}
417
446
  id="arg-input-add-item"
418
447
  startIcon={{ icon: Plus }}
@@ -452,6 +481,7 @@ $: shouldDispatchChanges && debounced(value);
452
481
  {disablePortal}
453
482
  {format}
454
483
  bind:value
484
+ bind:editor
455
485
  {showSchemaExplorer}
456
486
  />
457
487
  {:else if inputCat == 'resource-object' && format.split('-').length > 1 && format
@@ -68,9 +68,14 @@ function checkIfS3(result, keys) {
68
68
  let is_render_all = false;
69
69
  let download_as_csv = false;
70
70
  function inferResultKind(result) {
71
- if (result == 'WINDMILL_TOO_BIG') {
72
- largeObject = true;
73
- return 'json';
71
+ try {
72
+ if (result == 'WINDMILL_TOO_BIG') {
73
+ largeObject = true;
74
+ return 'json';
75
+ }
76
+ }
77
+ catch (err) {
78
+ return 'nondisplayable';
74
79
  }
75
80
  if (result !== undefined) {
76
81
  download_as_csv = false;
@@ -189,7 +194,13 @@ function inferResultKind(result) {
189
194
  let jsonViewer;
190
195
  let s3FileViewer;
191
196
  function toJsonStr(result) {
192
- return JSON.stringify(result ?? null, null, 4) ?? 'null';
197
+ try {
198
+ // console.log(result)
199
+ return JSON.stringify(result ?? null, null, 4) ?? 'null';
200
+ }
201
+ catch (e) {
202
+ return 'error stringifying object: ' + e.toString();
203
+ }
193
204
  }
194
205
  function contentOrRootString(obj) {
195
206
  if (typeof obj === 'string') {
@@ -297,7 +308,8 @@ let seeS3PreviewFileFromList = '';
297
308
  />
298
309
  {/each}</div
299
310
  >
300
- {:else}<div
311
+ {:else if resultKind == 'nondisplayable'}<div class="text-red-400">Non displayable object</div
312
+ >{:else}<div
301
313
  class="inline-highlight relative grow {['plain', 'markdown'].includes(resultKind ?? '')
302
314
  ? ''
303
315
  : 'min-h-[200px]'}"
@@ -43,6 +43,7 @@ export let diffEditor = undefined;
43
43
  export let args;
44
44
  export let noHistory = false;
45
45
  export let saveToWorkspace = false;
46
+ export let customUi = {};
46
47
  let contextualVariablePicker;
47
48
  let variablePicker;
48
49
  let resourcePicker;
@@ -284,6 +285,7 @@ let historyBrowserDrawerOpen = false;
284
285
  {/if}
285
286
  </DrawerContent>
286
287
  </Drawer>
288
+
287
289
  <ItemPicker
288
290
  bind:this={contextualVariablePicker}
289
291
  pickCallback={(path, name) => {
@@ -484,7 +486,7 @@ $res = json_decode(curl_exec($ch));`)
484
486
  class="rounded-full w-2 h-2 mx-2 {validCode ? 'bg-green-300' : 'bg-red-300'}"
485
487
  />
486
488
  <div class="flex items-center gap-0.5">
487
- {#if showContextVarPicker}
489
+ {#if showContextVarPicker && customUi?.contextVar != false}
488
490
  <Button
489
491
  title="Add context variable"
490
492
  color="light"
@@ -497,7 +499,7 @@ $res = json_decode(curl_exec($ch));`)
497
499
  >+Context Var
498
500
  </Button>
499
501
  {/if}
500
- {#if showVarPicker}
502
+ {#if showVarPicker && customUi?.variable != false}
501
503
  <Button
502
504
  title="Add variable"
503
505
  color="light"
@@ -527,7 +529,7 @@ $res = json_decode(curl_exec($ch));`)
527
529
  </Button>
528
530
  {/if}
529
531
 
530
- {#if showResourceTypePicker}
532
+ {#if showResourceTypePicker && customUi?.type != false}
531
533
  <Button
532
534
  title="Add resource type"
533
535
  btnClasses="!font-medium text-tertiary"
@@ -555,37 +557,41 @@ $res = json_decode(curl_exec($ch));`)
555
557
  Reset
556
558
  </Button>
557
559
 
558
- {#if lang == 'deno' || lang == 'python3' || lang == 'go' || lang == 'bash'}
559
- <Button
560
- btnClasses="!font-medium text-tertiary"
561
- size="xs"
562
- spacingSize="md"
563
- color="light"
564
- on:click={() => editor?.reloadWebsocket()}
565
- startIcon={{
566
- icon: RotateCw,
567
- classes: websocketAlive[lang] == false ? 'animate-spin' : ''
568
- }}
569
- title="Reload assistants"
570
- >
571
- {#if !iconOnly}
572
- Assistants
573
- {/if}
574
- <span class="-my-1">
575
- {#if lang == 'deno'}
576
- (<span class={websocketAlive.deno ? 'green' : 'text-red-700'}>Deno</span>)
577
- {:else if lang == 'go'}
578
- (<span class={websocketAlive.go ? 'green' : 'text-red-700'}>Go</span>)
579
- {:else if lang == 'python3'}
580
- (<span class={websocketAlive.pyright ? 'green' : 'text-red-700'}>Pyright</span>
581
- <span class={websocketAlive.ruff ? 'green' : 'text-red-700'}>Ruff</span>)
582
- {:else if lang == 'bash'}
583
- (<span class={websocketAlive.shellcheck ? 'green' : 'text-red-700'}>Shellcheck</span>)
560
+ {#if customUi?.assistants != false}
561
+ {#if lang == 'deno' || lang == 'python3' || lang == 'go' || lang == 'bash'}
562
+ <Button
563
+ btnClasses="!font-medium text-tertiary"
564
+ size="xs"
565
+ spacingSize="md"
566
+ color="light"
567
+ on:click={() => editor?.reloadWebsocket()}
568
+ startIcon={{
569
+ icon: RotateCw,
570
+ classes: websocketAlive[lang] == false ? 'animate-spin' : ''
571
+ }}
572
+ title="Reload assistants"
573
+ >
574
+ {#if !iconOnly}
575
+ Assistants
584
576
  {/if}
585
- </span>
586
- </Button>
577
+ <span class="-my-1">
578
+ {#if lang == 'deno'}
579
+ (<span class={websocketAlive.deno ? 'green' : 'text-red-700'}>Deno</span>)
580
+ {:else if lang == 'go'}
581
+ (<span class={websocketAlive.go ? 'green' : 'text-red-700'}>Go</span>)
582
+ {:else if lang == 'python3'}
583
+ (<span class={websocketAlive.pyright ? 'green' : 'text-red-700'}>Pyright</span>
584
+ <span class={websocketAlive.ruff ? 'green' : 'text-red-700'}>Ruff</span>)
585
+ {:else if lang == 'bash'}
586
+ (<span class={websocketAlive.shellcheck ? 'green' : 'text-red-700'}>Shellcheck</span
587
+ >)
588
+ {/if}
589
+ </span>
590
+ </Button>
591
+ {/if}
587
592
  {/if}
588
- {#if collabMode}
593
+
594
+ {#if collabMode && customUi?.multiplayer != false}
589
595
  <div class="flex items-center px-3">
590
596
  <Toggle
591
597
  options={{ right: '' }}
@@ -619,11 +625,15 @@ $res = json_decode(curl_exec($ch));`)
619
625
  </div>
620
626
  {/if}
621
627
 
622
- <FormatOnSave />
623
-
624
- <ScriptGen {editor} {diffEditor} {lang} {iconOnly} {args} />
625
-
626
- <CodeCompletionStatus />
628
+ {#if customUi?.autoformatting != false}
629
+ <FormatOnSave />
630
+ {/if}
631
+ {#if customUi?.aiGen != false}
632
+ <ScriptGen {editor} {diffEditor} {lang} {iconOnly} {args} />
633
+ {/if}
634
+ {#if customUi?.aiFix != false}
635
+ <CodeCompletionStatus />
636
+ {/if}
627
637
  </div>
628
638
  </div>
629
639
 
@@ -642,7 +652,7 @@ $res = json_decode(curl_exec($ch));`)
642
652
  History
643
653
  </Button>
644
654
  {/if}
645
- {#if SCRIPT_EDITOR_SHOW_EXPLORE_OTHER_SCRIPTS}
655
+ {#if SCRIPT_EDITOR_SHOW_EXPLORE_OTHER_SCRIPTS && customUi?.library != false}
646
656
  <Button
647
657
  btnClasses="!font-medium text-tertiary"
648
658
  size="xs"
@@ -3,6 +3,7 @@ export declare const EDITOR_BAR_WIDTH_THRESHOLD = 1044;
3
3
  import type Editor from './Editor.svelte';
4
4
  import type { SupportedLanguage } from '../common';
5
5
  import type DiffEditor from './DiffEditor.svelte';
6
+ import type { EditorBarUi } from './custom_ui';
6
7
  declare const __propDef: {
7
8
  props: {
8
9
  lang: SupportedLanguage | 'bunnative' | undefined;
@@ -28,6 +29,7 @@ declare const __propDef: {
28
29
  args: Record<string, any>;
29
30
  noHistory?: boolean | undefined;
30
31
  saveToWorkspace?: boolean | undefined;
32
+ customUi?: EditorBarUi | undefined;
31
33
  };
32
34
  events: {
33
35
  toggleCollabMode: CustomEvent<any>;
@@ -9,8 +9,9 @@ import { FlowService, JobService, ScriptService, WorkspaceService } from '../gen
9
9
  import { inferArgs } from '../infer';
10
10
  import { hubBaseUrlStore } from '../stores';
11
11
  import { CheckCircle2, Loader2, RotateCw, XCircle } from 'lucide-svelte';
12
- const slackRecoveryHandler = 'hub/2430/slack/schedule-recovery-handler-slack';
13
- const slackHandlerScriptPath = 'hub/6512/workspace-or-schedule-error-handler-slack';
12
+ import { hubPaths } from '../hub';
13
+ const slackRecoveryHandler = hubPaths.slackRecoveryHandler;
14
+ const slackHandlerScriptPath = hubPaths.slackErrorHandler;
14
15
  export let errorOrRecovery;
15
16
  export let isEditable;
16
17
  export let slackToggleText = 'Enable';
@@ -146,14 +146,17 @@ async function saveDraft(forceSave = false) {
146
146
  path: $pathStore
147
147
  }
148
148
  };
149
+ let savedAtNewPath = false;
149
150
  if (newFlow) {
150
151
  dispatch('saveInitial', $pathStore);
151
152
  }
152
153
  else if (savedFlow?.draft_only && $pathStore !== initialPath) {
154
+ savedAtNewPath = true;
153
155
  initialPath = $pathStore;
154
156
  // this is so we can use the flow builder outside of sveltekit
155
157
  dispatch('saveDraftOnlyAtNewPath', { path: $pathStore, selectedId: getSelectedId() });
156
158
  }
159
+ dispatch('saveDraft', { path: $pathStore, savedAtNewPath, newFlow });
157
160
  sendUserToast('Saved as draft');
158
161
  }
159
162
  catch (error) {
@@ -327,7 +330,8 @@ setContext('FlowEditorContext', {
327
330
  testStepStore,
328
331
  saveDraft,
329
332
  initialPath,
330
- flowInputsStore: writable({})
333
+ flowInputsStore: writable({}),
334
+ customUi
331
335
  });
332
336
  async function loadSchedule() {
333
337
  loadFlowSchedule(initialPath, $workspaceStore)
@@ -400,17 +404,19 @@ function generateIds() {
400
404
  ];
401
405
  }
402
406
  const dropdownItems = [];
403
- if (savedFlow?.draft_only === false || savedFlow?.draft_only === undefined) {
404
- dropdownItems.push({
405
- label: 'Exit & see details',
406
- onClick: () => dispatch('details', $pathStore)
407
- });
408
- }
409
- if (!newFlow) {
410
- dropdownItems.push({
411
- label: 'Fork',
412
- onClick: () => window.open(`/flows/add?template=${initialPath}`)
413
- });
407
+ if (customUi.topBar?.extraDeployOptions != false) {
408
+ if (savedFlow?.draft_only === false || savedFlow?.draft_only === undefined) {
409
+ dropdownItems.push({
410
+ label: 'Exit & see details',
411
+ onClick: () => dispatch('details', $pathStore)
412
+ });
413
+ }
414
+ if (!newFlow) {
415
+ dropdownItems.push({
416
+ label: 'Fork',
417
+ onClick: () => window.open(`/flows/add?template=${initialPath}`)
418
+ });
419
+ }
414
420
  }
415
421
  let flowCopilotContext = {
416
422
  drawerStore: writable(undefined),
@@ -3,7 +3,7 @@ import { type Flow, type OpenFlow } from '../gen';
3
3
  import { type Writable } from 'svelte/store';
4
4
  import type { FlowState } from './flows/flowState';
5
5
  import type DiffDrawer from './DiffDrawer.svelte';
6
- import type { WhitelabelCustomUi } from './custom_ui';
6
+ import type { FlowBuilderWhitelabelCustomUi } from './custom_ui';
7
7
  declare const __propDef: {
8
8
  props: {
9
9
  initialPath?: string | undefined;
@@ -18,7 +18,7 @@ declare const __propDef: {
18
18
  draft?: Flow | undefined;
19
19
  }) | undefined;
20
20
  diffDrawer?: DiffDrawer | undefined;
21
- customUi?: WhitelabelCustomUi | undefined;
21
+ customUi?: FlowBuilderWhitelabelCustomUi | undefined;
22
22
  computeUnlockedSteps?: ((flow: Flow) => {
23
23
  [k: string]: string;
24
24
  }) | undefined;
@@ -29,6 +29,7 @@ declare const __propDef: {
29
29
  historyRestore: CustomEvent<any>;
30
30
  saveInitial: CustomEvent<any>;
31
31
  saveDraftOnlyAtNewPath: CustomEvent<any>;
32
+ saveDraft: CustomEvent<any>;
32
33
  deploy: CustomEvent<any>;
33
34
  details: CustomEvent<any>;
34
35
  } & {
@@ -1,7 +1,8 @@
1
- <script>import { FlowGraph } from './graph';
2
- import { createEventDispatcher } from 'svelte';
1
+ <script>import { createEventDispatcher } from 'svelte';
3
2
  import { twMerge } from 'tailwind-merge';
4
3
  import FlowGraphViewerStep from './FlowGraphViewerStep.svelte';
4
+ import FlowGraphV2 from './graph/FlowGraphV2.svelte';
5
+ import { dfs } from './flows/dfs';
5
6
  export let flow;
6
7
  export let overflowAuto = false;
7
8
  export let noSide = false;
@@ -17,16 +18,16 @@ const dispatch = createEventDispatcher();
17
18
  class="{noSide ? 'col-span-3' : 'sm:col-span-2 col-span-3'} w-full border max-h-full"
18
19
  class:overflow-auto={overflowAuto}
19
20
  >
20
- <FlowGraph
21
+ <FlowGraphV2
21
22
  {download}
22
23
  minHeight={400}
23
24
  modules={flow?.value?.modules}
24
25
  failureModule={flow?.value?.failure_module}
25
26
  on:select={(e) => {
26
- stepDetail = e.detail
27
+ const mod = dfs(flow?.value?.modules ?? [], (m) => m).find((m) => m?.id === e?.detail)
28
+ stepDetail = mod ?? e.detail
27
29
  dispatch('select', stepDetail)
28
30
  }}
29
- rebuildOnChange={flow}
30
31
  />
31
32
  </div>
32
33
  {/if}
@@ -6,6 +6,7 @@ import { workspaceStore } from '../stores';
6
6
  import DrawerContent from './common/drawer/DrawerContent.svelte';
7
7
  import { Drawer } from './common';
8
8
  import AllFlowLogs from './AllFlowLogs.svelte';
9
+ export let waitingForExecutor = false;
9
10
  export let result;
10
11
  export let logs;
11
12
  export let col = false;
@@ -13,6 +14,7 @@ export let noBorder = false;
13
14
  export let loading;
14
15
  export let filename = undefined;
15
16
  export let jobId = undefined;
17
+ export let tag = undefined;
16
18
  export let workspaceId = undefined;
17
19
  export let refreshLog = false;
18
20
  export let durationStates;
@@ -71,9 +73,9 @@ async function getLogs() {
71
73
  {/if}
72
74
  </div>
73
75
  <div class="overflow-auto {col ? '' : 'max-h-80'} relative">
74
- <div class="absolute z-40 text-sm top-1.5 left-2"
76
+ <div class="absolute z-40 text-xs top-0 left-1"
75
77
  ><button class="" on:click={drawer.openDrawer}>explore all steps' logs</button></div
76
78
  >
77
- <LogViewer content={logs ?? ''} {jobId} isLoading={false} tag={undefined} />
79
+ <LogViewer content={logs ?? ''} {jobId} isLoading={waitingForExecutor} {tag} />
78
80
  </div>
79
81
  </div>
@@ -3,6 +3,7 @@ import type { DurationStatus } from './graph';
3
3
  import type { Writable } from 'svelte/store';
4
4
  declare const __propDef: {
5
5
  props: {
6
+ waitingForExecutor?: boolean | undefined;
6
7
  result: any;
7
8
  logs: string | undefined;
8
9
  col?: boolean | undefined;
@@ -10,6 +11,7 @@ declare const __propDef: {
10
11
  loading: boolean;
11
12
  filename?: string | undefined;
12
13
  jobId?: string | undefined;
14
+ tag?: string | undefined;
13
15
  workspaceId?: string | undefined;
14
16
  refreshLog?: boolean | undefined;
15
17
  durationStates: Writable<Record<string, DurationStatus>> | undefined;
@@ -8,6 +8,9 @@ export let workspaceId = undefined;
8
8
  export let flowStateStore = writable({});
9
9
  export let selectedJobStep = undefined;
10
10
  export let hideFlowResult = false;
11
+ export let hideTimeline = false;
12
+ export let hideDownloadInGraph = false;
13
+ export let hideNodeDefinition = false;
11
14
  export let isOwner = false;
12
15
  export let wideResults = false;
13
16
  let lastJobId = jobId;
@@ -16,7 +19,10 @@ let suspendStatus = writable({});
16
19
  setContext('FlowStatusViewer', {
17
20
  flowStateStore,
18
21
  suspendStatus,
19
- retryStatus
22
+ retryStatus,
23
+ hideDownloadInGraph,
24
+ hideNodeDefinition,
25
+ hideTimeline
20
26
  });
21
27
  function loadOwner(path) {
22
28
  isOwner = loadIsOwner(path, $userStore, workspaceId ?? $workspaceStore);
@@ -8,6 +8,9 @@ declare const __propDef: {
8
8
  flowStateStore?: Writable<FlowState> | undefined;
9
9
  selectedJobStep?: string | undefined;
10
10
  hideFlowResult?: boolean | undefined;
11
+ hideTimeline?: boolean | undefined;
12
+ hideDownloadInGraph?: boolean | undefined;
13
+ hideNodeDefinition?: boolean | undefined;
11
14
  isOwner?: boolean | undefined;
12
15
  wideResults?: boolean | undefined;
13
16
  };
@@ -8,7 +8,7 @@ import { onDestroy } from 'svelte';
8
8
  import { Badge, Button, Tab } from './common';
9
9
  import DisplayResult from './DisplayResult.svelte';
10
10
  import Tabs from './common/tabs/Tabs.svelte';
11
- import { FlowGraph } from './graph';
11
+ import {} from './graph';
12
12
  import ModuleStatus from './ModuleStatus.svelte';
13
13
  import { emptyString, msToSec, truncateRev } from '../utils';
14
14
  import JobArgs from './JobArgs.svelte';
@@ -20,8 +20,9 @@ import { dfs } from './flows/dfs';
20
20
  import { writable } from 'svelte/store';
21
21
  import Alert from './common/alert/Alert.svelte';
22
22
  import FlowGraphViewerStep from './FlowGraphViewerStep.svelte';
23
+ import FlowGraphV2 from './graph/FlowGraphV2.svelte';
23
24
  const dispatch = createEventDispatcher();
24
- let { flowStateStore, retryStatus, suspendStatus } = getContext('FlowStatusViewer');
25
+ let { flowStateStore, retryStatus, suspendStatus, hideDownloadInGraph, hideTimeline, hideNodeDefinition } = getContext('FlowStatusViewer');
25
26
  export let jobId;
26
27
  export let workspaceId = undefined;
27
28
  export let flowJobIds = undefined;
@@ -115,7 +116,7 @@ function updateInnerModules() {
115
116
  innerModules.forEach((mod, i) => {
116
117
  if (mod.type === 'WaitingForEvents' &&
117
118
  $localModuleStates?.[innerModules?.[i - 1]?.id ?? '']?.type == 'Success') {
118
- setModuleState(mod.id ?? '', { type: mod.type, args: job?.args });
119
+ setModuleState(mod.id ?? '', { type: mod.type, args: job?.args, tag: job?.tag });
119
120
  }
120
121
  else if (mod.type === 'WaitingForExecutor' &&
121
122
  $localModuleStates[mod.id ?? '']?.scheduled_for == undefined) {
@@ -130,7 +131,8 @@ function updateInnerModules() {
130
131
  scheduled_for: job?.['scheduled_for'],
131
132
  job_id: job?.id,
132
133
  parent_module: mod['parent_module'],
133
- args: job?.args
134
+ args: job?.args,
135
+ tag: job?.tag
134
136
  };
135
137
  setModuleState(mod.id ?? '', newState);
136
138
  })
@@ -309,6 +311,7 @@ function onJobsLoaded(mod, job, force) {
309
311
  job_id: job.id,
310
312
  logs: job.logs,
311
313
  args: job.args,
314
+ tag: job.tag,
312
315
  started_at,
313
316
  parent_module: mod['parent_module']
314
317
  }, force);
@@ -324,6 +327,7 @@ function onJobsLoaded(mod, job, force) {
324
327
  logs: job.logs,
325
328
  result: job['result'],
326
329
  job_id: job.id,
330
+ tag: job.tag,
327
331
  parent_module: mod['parent_module'],
328
332
  duration_ms: job['duration_ms'],
329
333
  started_at: started_at,
@@ -464,6 +468,7 @@ function loadPreviousIters(lenToAdd) {
464
468
  }
465
469
  let stepDetail = undefined;
466
470
  let storedListJobs = {};
471
+ let wrapperHeight = 0;
467
472
  </script>
468
473
 
469
474
  {#if notAnonynmous}
@@ -521,6 +526,7 @@ let storedListJobs = {};
521
526
  <FlowJobResult
522
527
  workspaceId={job?.workspace_id}
523
528
  jobId={job?.id}
529
+ tag={job?.tag}
524
530
  loading={job['running'] == true}
525
531
  result={job.result}
526
532
  logs={job.logs}
@@ -648,7 +654,7 @@ let storedListJobs = {};
648
654
  {/if}
649
655
  {/each}
650
656
  </div>
651
- {:else if innerModules.length > 0}
657
+ {:else if innerModules.length > 0 && (job.raw_flow?.modules.length ?? 0) > 0}
652
658
  <ul class="w-full">
653
659
  <h3 class="text-md leading-6 font-bold text-primary border-b mb-4 py-2">
654
660
  Step-by-step
@@ -768,13 +774,15 @@ let storedListJobs = {};
768
774
  </li>
769
775
  {/each}
770
776
  </ul>
777
+ {:else}
778
+ <div class="p-2 text-tertiary text-sm italic">Empty flow</div>
771
779
  {/if}
772
780
  </div>
773
781
  </div>
774
782
  {#if render}
775
783
  {#if job.raw_flow && !isListJob}
776
784
  <div class="{selected != 'graph' ? 'hidden' : ''} grow mt-4">
777
- <div class="grid grid-cols-3 border h-full">
785
+ <div class="grid grid-cols-3 border h-full" bind:clientHeight={wrapperHeight}>
778
786
  <div class="col-span-2 bg-surface-secondary">
779
787
  <div class="flex flex-col">
780
788
  {#each Object.values($retryStatus) as count}
@@ -793,8 +801,9 @@ let storedListJobs = {};
793
801
  {/each}
794
802
  </div>
795
803
 
796
- <FlowGraph
797
- download
804
+ <FlowGraphV2
805
+ download={!hideDownloadInGraph}
806
+ minHeight={wrapperHeight}
798
807
  success={jobId != undefined && isSuccess(job?.['success'])}
799
808
  flowModuleStates={$localModuleStates}
800
809
  on:select={(e) => {
@@ -819,6 +828,7 @@ let storedListJobs = {};
819
828
  }}
820
829
  on:selectedIteration={(e) => {
821
830
  let detail = e.detail
831
+
822
832
  setModuleState(detail.moduleId, {
823
833
  selectedForloop: detail.id,
824
834
  selectedForloopIndex: detail.index
@@ -826,16 +836,20 @@ let storedListJobs = {};
826
836
  globalRefreshes[detail.moduleId]?.({ job: detail.id, index: detail.index })
827
837
  }}
828
838
  modules={job.raw_flow?.modules ?? []}
829
- failureModule={job.raw_flow?.failure_module}
830
839
  />
831
840
  </div>
832
841
  <div
833
842
  class="border-l border-tertiary-inverse pt-1 overflow-auto min-h-[700px] flex flex-col z-0 h-full"
834
843
  >
835
844
  <Tabs bind:selected={rightColumnSelect}>
836
- <Tab value="timeline"><span class="font-semibold text-md">Timeline</span></Tab>
845
+ {#if !hideTimeline}
846
+ <Tab value="timeline"><span class="font-semibold text-md">Timeline</span></Tab>
847
+ {/if}
837
848
  <Tab value="node_status"><span class="font-semibold">Node status</span></Tab>
838
- <Tab value="node_definition"><span class="font-semibold">Node definition</span></Tab>
849
+ {#if !hideNodeDefinition}
850
+ <Tab value="node_definition"><span class="font-semibold">Node definition</span></Tab
851
+ >
852
+ {/if}
839
853
  {#if Object.keys(job?.flow_status?.user_states ?? {}).length > 0}
840
854
  <Tab value="user_states"><span class="font-semibold">User States</span></Tab>
841
855
  {/if}
@@ -860,6 +874,7 @@ let storedListJobs = {};
860
874
  jobId={job?.id}
861
875
  filename={job.id}
862
876
  loading={job['running']}
877
+ tag={job?.tag}
863
878
  noBorder
864
879
  col
865
880
  result={job['result']}
@@ -923,14 +938,17 @@ let storedListJobs = {};
923
938
  />
924
939
  </div>
925
940
  {/if}
941
+
926
942
  <FlowJobResult
927
943
  workspaceId={job?.workspace_id}
928
944
  jobId={node.job_id}
929
945
  noBorder
930
946
  loading={node.type != 'Success' && node.type != 'Failure'}
947
+ waitingForExecutor={node.type == 'WaitingForExecutor'}
931
948
  refreshLog={node.type == 'InProgress'}
932
949
  col
933
950
  result={node.result}
951
+ tag={node.tag}
934
952
  logs={node.logs}
935
953
  durationStates={localDurationStatuses}
936
954
  />
@@ -21,6 +21,7 @@ $: flowFiltered = {
21
21
  export let noGraph = false;
22
22
  export let tab = noGraph ? 'schema' : 'ui';
23
23
  export let noSummary = false;
24
+ export let noGraphDownload = false;
24
25
  let rawType = 'yaml';
25
26
  let open = {};
26
27
  if (initialOpen) {
@@ -72,7 +73,8 @@ function toAny(x) {
72
73
  {:else}
73
74
  <div class="text-secondary text-xs italic mb-4">No inputs</div>
74
75
  {/if}
75
- <FlowGraphViewer download {noSide} {flow} overflowAuto />
76
+
77
+ <FlowGraphViewer download={!noGraphDownload} {noSide} {flow} overflowAuto />
76
78
  </div>
77
79
  </TabContent>
78
80
  <TabContent value="raw"
@@ -13,6 +13,7 @@ declare const __propDef: {
13
13
  noGraph?: boolean | undefined;
14
14
  tab?: "schema" | "ui" | "raw" | undefined;
15
15
  noSummary?: boolean | undefined;
16
+ noGraphDownload?: boolean | undefined;
16
17
  };
17
18
  events: {
18
19
  [evt: string]: CustomEvent<any>;