windmill-components 1.665.1 → 1.677.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
  2. package/dist/sharedUtils/base.d.ts +1 -0
  3. package/dist/sharedUtils/cloud.d.ts +1 -0
  4. package/dist/sharedUtils/common.d.ts +111 -0
  5. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
  6. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
  7. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
  8. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
  9. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
  10. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
  11. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
  12. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
  13. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
  14. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
  15. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
  16. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
  17. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
  18. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
  19. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
  20. package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
  21. package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
  22. package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
  23. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
  24. package/dist/sharedUtils/components/apps/types.d.ts +274 -0
  25. package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
  26. package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
  27. package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
  28. package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
  29. package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
  30. package/dist/sharedUtils/components/common/index.d.ts +24 -0
  31. package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
  32. package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
  33. package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
  34. package/dist/sharedUtils/components/ducklake.d.ts +1 -0
  35. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
  36. package/dist/sharedUtils/components/icons/index.d.ts +101 -0
  37. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
  38. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
  39. package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
  40. package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
  41. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
  42. package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
  43. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
  44. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
  45. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
  46. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
  47. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
  48. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
  49. package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
  50. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
  51. package/dist/sharedUtils/components/triggers.d.ts +20 -0
  52. package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
  53. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
  54. package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
  55. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
  56. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
  57. package/dist/sharedUtils/gen/core/request.d.ts +29 -0
  58. package/dist/sharedUtils/gen/index.d.ts +6 -0
  59. package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
  60. package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
  61. package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
  62. package/dist/sharedUtils/history.svelte.d.ts +9 -0
  63. package/dist/sharedUtils/hub.d.ts +49 -0
  64. package/dist/sharedUtils/jsr.json +6 -0
  65. package/dist/sharedUtils/lib.d.ts +5 -0
  66. package/dist/sharedUtils/lib.es.js +1588 -0
  67. package/dist/sharedUtils/package.json +12 -0
  68. package/dist/sharedUtils/schema.d.ts +3 -0
  69. package/dist/sharedUtils/stores.d.ts +97 -0
  70. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
  71. package/dist/sharedUtils/toast.d.ts +8 -0
  72. package/dist/sharedUtils/utils.d.ts +265 -0
  73. package/package/components/AddUser.svelte +67 -34
  74. package/package/components/AppConnectInner.svelte +9 -1
  75. package/package/components/ArgInfo.svelte +9 -1
  76. package/package/components/ArgInput.svelte +21 -1
  77. package/package/components/CompareWorkspaces.svelte +11 -2
  78. package/package/components/DedicatedWorkersSelector.svelte +262 -247
  79. package/package/components/DefaultTagsInner.svelte +40 -2
  80. package/package/components/DeployWorkspace.svelte +13 -0
  81. package/package/components/DiffEditor.svelte +44 -1
  82. package/package/components/EditableSchemaForm.svelte +5 -2
  83. package/package/components/EditableSchemaForm.svelte.d.ts +1 -0
  84. package/package/components/Editor.svelte +5 -1
  85. package/package/components/EditorBar.svelte +12 -3
  86. package/package/components/FilterSearchbar.svelte +26 -2
  87. package/package/components/FlowBuilder.svelte +6 -3
  88. package/package/components/FlowGraphDiffViewer.svelte +16 -17
  89. package/package/components/FlowGraphViewer.svelte +20 -6
  90. package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
  91. package/package/components/FlowGraphViewerStep.svelte +14 -32
  92. package/package/components/FlowMetadata.svelte +4 -1
  93. package/package/components/FlowPreviewContent.svelte +2 -0
  94. package/package/components/FlowStatusWaitingForEvents.svelte +25 -4
  95. package/package/components/HighlightCode.svelte +3 -0
  96. package/package/components/InstanceSetting.svelte +9 -25
  97. package/package/components/InstanceSettings.svelte +16 -0
  98. package/package/components/LabelsInput.svelte +149 -0
  99. package/package/components/LabelsInput.svelte.d.ts +8 -0
  100. package/package/components/Login.svelte +6 -1
  101. package/package/components/ObjectStoreConfigSettings.svelte +273 -1
  102. package/package/components/OktaSetting.svelte +6 -5
  103. package/package/components/Password.svelte +74 -20
  104. package/package/components/Password.svelte.d.ts +1 -0
  105. package/package/components/PasswordArgInput.svelte +2 -2
  106. package/package/components/PasswordArgInput.svelte.d.ts +1 -0
  107. package/package/components/Path.svelte +8 -10
  108. package/package/components/PathNameAutocomplete.svelte +308 -0
  109. package/package/components/PathNameAutocomplete.svelte.d.ts +27 -0
  110. package/package/components/PowerShellCommonParams.svelte +84 -0
  111. package/package/components/PowerShellCommonParams.svelte.d.ts +6 -0
  112. package/package/components/Range.svelte +8 -3
  113. package/package/components/ResourceEditor.svelte +6 -2
  114. package/package/components/RunForm.svelte +71 -7
  115. package/package/components/RunForm.svelte.d.ts +2 -1
  116. package/package/components/ScriptBuilder.svelte +7 -3
  117. package/package/components/ScriptEditor.svelte +221 -187
  118. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  119. package/package/components/ScriptSchema.svelte +1 -1
  120. package/package/components/StringTypeNarrowing.svelte +1 -1
  121. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  122. package/package/components/SummaryPathDisplay.svelte +32 -10
  123. package/package/components/SummaryPathDisplay.svelte.d.ts +2 -1
  124. package/package/components/VariableEditor.svelte +9 -2
  125. package/package/components/WorkerGroup.svelte +47 -2
  126. package/package/components/apps/editor/DeploymentHistory.svelte +112 -13
  127. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +135 -35
  128. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +3 -1
  129. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +11 -35
  130. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.d.ts +10 -0
  131. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.js +14 -0
  132. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.d.ts +1 -0
  133. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.js +34 -0
  134. package/package/components/assets/AssetButtons.svelte +21 -25
  135. package/package/components/assets/AssetsUsageDrawer.svelte +7 -9
  136. package/package/components/common/fileUpload/FileUpload.svelte +6 -2
  137. package/package/components/common/languageIcons/LanguageIcon.svelte +3 -0
  138. package/package/components/common/table/AppRow.svelte +18 -0
  139. package/package/components/common/table/FlowRow.svelte +18 -0
  140. package/package/components/common/table/ScriptRow.svelte +18 -0
  141. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -3
  142. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  143. package/package/components/copilot/chat/flow/openFlowZod.js +3 -3
  144. package/package/components/custom_ui.d.ts +2 -0
  145. package/package/components/details/DetailPageHeader.svelte +2 -2
  146. package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
  147. package/package/components/flows/agentToolUtils.d.ts +5 -0
  148. package/package/components/flows/agentToolUtils.js +49 -0
  149. package/package/components/flows/agentToolUtils.test.d.ts +1 -0
  150. package/package/components/flows/agentToolUtils.test.js +55 -0
  151. package/package/components/flows/content/FlowInput.svelte +2 -0
  152. package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
  153. package/package/components/flows/content/FlowLoop.svelte +5 -12
  154. package/package/components/flows/content/FlowModuleScript.svelte +5 -3
  155. package/package/components/flows/content/FlowPathViewer.svelte +2 -2
  156. package/package/components/flows/content/FlowPathViewer.svelte.d.ts +1 -0
  157. package/package/components/flows/content/FlowSettings.svelte +2 -0
  158. package/package/components/flows/content/FlowWhileLoop.svelte +5 -12
  159. package/package/components/flows/flowInfers.js +8 -3
  160. package/package/components/flows/map/FlowModuleSchemaMap.svelte +49 -9
  161. package/package/components/flows/pickers/PickHubScriptQuick.svelte +5 -3
  162. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -1
  163. package/package/components/flows/scheduleUtils.js +2 -1
  164. package/package/components/graph/FlowGraphV2.svelte +13 -1
  165. package/package/components/graph/WacDiagram.svelte +96 -0
  166. package/package/components/graph/WacDiagram.svelte.d.ts +7 -0
  167. package/package/components/graph/noteEditor.svelte.d.ts +1 -1
  168. package/package/components/graph/noteEditor.svelte.js +12 -1
  169. package/package/components/graph/noteUtils.svelte.d.ts +1 -1
  170. package/package/components/graph/noteUtils.svelte.js +9 -2
  171. package/package/components/graph/renderers/edges/WacEdge.svelte +41 -0
  172. package/package/components/graph/renderers/edges/WacEdge.svelte.d.ts +4 -0
  173. package/package/components/graph/renderers/nodes/WacControlNode.svelte +51 -0
  174. package/package/components/graph/renderers/nodes/WacControlNode.svelte.d.ts +9 -0
  175. package/package/components/graph/renderers/nodes/WacStepNode.svelte +35 -0
  176. package/package/components/graph/renderers/nodes/WacStepNode.svelte.d.ts +9 -0
  177. package/package/components/graph/wacDagLayout.d.ts +10 -0
  178. package/package/components/graph/wacDagLayout.js +120 -0
  179. package/package/components/graph/wacToFlow.js +1 -1
  180. package/package/components/home/ItemsList.svelte +28 -4
  181. package/package/components/icons/RIcon.svelte +32 -0
  182. package/package/components/icons/RIcon.svelte.d.ts +7 -0
  183. package/package/components/instanceSettings/DbHealth.svelte +723 -0
  184. package/package/components/instanceSettings/DbHealth.svelte.d.ts +3 -0
  185. package/package/components/instanceSettings/SecretBackendConfig.svelte +343 -304
  186. package/package/components/instanceSettings/SmtpSettings.svelte +8 -0
  187. package/package/components/instanceSettings.js +14 -5
  188. package/package/components/mcp/McpScopeSelector.svelte +82 -16
  189. package/package/components/moveRenameManager.d.ts +1 -0
  190. package/package/components/moveRenameManager.js +7 -4
  191. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +14 -1
  192. package/package/components/raw_apps/rawAppPolicy.js +3 -2
  193. package/package/components/raw_apps/utils.test.d.ts +1 -0
  194. package/package/components/raw_apps/utils.test.js +38 -0
  195. package/package/components/resources/resourcesFilter.d.ts +15 -2
  196. package/package/components/resources/resourcesFilter.js +11 -2
  197. package/package/components/runs/JobDetailFieldConfig.js +5 -3
  198. package/package/components/runs/JobDetailHeader.svelte +5 -2
  199. package/package/components/runs/JobRunsPreview.svelte +1 -0
  200. package/package/components/runs/RunBadges.svelte +7 -4
  201. package/package/components/runs/RunRow.svelte +7 -7
  202. package/package/components/schedules/schedulesFilter.d.ts +15 -2
  203. package/package/components/schedules/schedulesFilter.js +11 -2
  204. package/package/components/schema/EditableSchemaWrapper.svelte +6 -8
  205. package/package/components/schema/PropertyEditor.svelte +22 -1
  206. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -0
  207. package/package/components/schema/editable_schema_wrapper.d.ts +1 -0
  208. package/package/components/secretArgUtils.d.ts +7 -0
  209. package/package/components/secretArgUtils.js +45 -0
  210. package/package/components/settings/WorkspaceUserSettings.svelte +359 -286
  211. package/package/components/sidebar/OperatorMenu.svelte +215 -197
  212. package/package/components/triggers/CaptureWrapper.svelte +1 -1
  213. package/package/components/triggers/TriggerFilters.svelte +17 -5
  214. package/package/components/triggers/TriggerFilters.svelte.d.ts +2 -1
  215. package/package/components/triggers/kafka/KafkaCapture.svelte +6 -2
  216. package/package/components/triggers/kafka/KafkaCapture.svelte.d.ts +1 -1
  217. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +5 -1
  218. package/package/components/triggers/kafka/utils.js +1 -0
  219. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +6 -0
  220. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +87 -1
  221. package/package/components/triggers/websocket/utils.js +2 -0
  222. package/package/components/variables/variablesFilter.d.ts +15 -2
  223. package/package/components/variables/variablesFilter.js +11 -2
  224. package/package/components/worker_group.js +1 -0
  225. package/package/components/workspaceSettings/DucklakeSettings.svelte +33 -41
  226. package/package/consts.d.ts +1 -0
  227. package/package/consts.js +1 -0
  228. package/package/editorLangUtils.d.ts +1 -1
  229. package/package/editorLangUtils.js +2 -0
  230. package/package/gen/core/OpenAPI.js +1 -1
  231. package/package/gen/schemas.gen.d.ts +94 -294
  232. package/package/gen/schemas.gen.js +94 -294
  233. package/package/gen/services.gen.d.ts +5 -121
  234. package/package/gen/services.gen.js +5 -237
  235. package/package/gen/types.gen.d.ts +91 -715
  236. package/package/hubPaths.json +6 -3
  237. package/package/infer.d.ts +55 -0
  238. package/package/infer.js +131 -0
  239. package/package/infer.svelte.js +2 -0
  240. package/package/mcpEndpointTools.js +213 -22
  241. package/package/script_helpers.d.ts +3 -0
  242. package/package/script_helpers.js +26 -0
  243. package/package/scripts.d.ts +2 -1
  244. package/package/scripts.js +15 -3
  245. package/package/stores.d.ts +2 -0
  246. package/package/system_prompts/prompts.d.ts +6 -5
  247. package/package/system_prompts/prompts.js +188 -29
  248. package/package/user.js +5 -1
  249. package/package/utils.js +21 -0
  250. package/package/utils_deployable.d.ts +7 -0
  251. package/package/utils_workspace_deploy.js +36 -8
  252. package/package.json +6 -5
@@ -179,7 +179,7 @@ export class NoteEditor {
179
179
  /**
180
180
  * Clean up group notes using DAG path completion
181
181
  */
182
- cleanupGroupNotes(flowNodes) {
182
+ cleanupGroupNotes(flowNodes, collapsedModuleIds) {
183
183
  if (!this.isAvailable()) {
184
184
  return;
185
185
  }
@@ -189,6 +189,12 @@ export class NoteEditor {
189
189
  return;
190
190
  let hasChanges = false;
191
191
  const nodeSet = new Set(flowNodes.map((n) => n.id));
192
+ // Include collapsed module IDs as valid — they are hidden but still exist
193
+ if (collapsedModuleIds) {
194
+ for (const id of collapsedModuleIds) {
195
+ nodeSet.add(id);
196
+ }
197
+ }
192
198
  // Step 1: Clean invalid nodes from existing group notes
193
199
  for (const note of groupNotes) {
194
200
  const originalIds = note.contained_node_ids || [];
@@ -204,6 +210,11 @@ export class NoteEditor {
204
210
  const originalNodes = note.contained_node_ids || [];
205
211
  if (originalNodes.length === 0)
206
212
  continue;
213
+ // Skip path completion for notes that reference collapsed modules,
214
+ // since the DAG is incomplete when groups are collapsed
215
+ if (collapsedModuleIds && originalNodes.some((id) => collapsedModuleIds.has(id))) {
216
+ continue;
217
+ }
207
218
  // Use the DAG path completion and splitting algorithm
208
219
  const completedGroups = completeAndSplitGroup(originalNodes, flowNodes);
209
220
  if (completedGroups.length <= 1) {
@@ -58,7 +58,7 @@ export declare function calculateAllNoteZIndexes(notes: FlowNote[], nodes: NodeD
58
58
  /**
59
59
  * Main function to compute note nodes and adjust nodes position based on group notes
60
60
  */
61
- export declare function computeNoteNodes(nodes: NodeDep[], notes: FlowNote[], noteTextHeights: Record<string, number>, onTextHeightChange: (noteId: string, height: number) => void, editMode: boolean | undefined, noteEditorContext: NoteEditorContext | undefined): NoteComputeResult;
61
+ export declare function computeNoteNodes(nodes: NodeDep[], notes: FlowNote[], noteTextHeights: Record<string, number>, onTextHeightChange: (noteId: string, height: number) => void, editMode: boolean | undefined, noteEditorContext: NoteEditorContext | undefined, collapsedModuleIds?: Set<string>): NoteComputeResult;
62
62
  export declare function addGroupNoteContextMenuItem(nodeId: string, noteEditorContext: NoteEditorContext | undefined): {
63
63
  id: string;
64
64
  label: string;
@@ -176,7 +176,7 @@ function createNoteData(note, onTextHeightChange, isGroupNote, editMode) {
176
176
  /**
177
177
  * Main function to compute note nodes and adjust nodes position based on group notes
178
178
  */
179
- export function computeNoteNodes(nodes, notes, noteTextHeights, onTextHeightChange, editMode = false, noteEditorContext) {
179
+ export function computeNoteNodes(nodes, notes, noteTextHeights, onTextHeightChange, editMode = false, noteEditorContext, collapsedModuleIds) {
180
180
  // Check cache first
181
181
  if (computeNoteNodesCache &&
182
182
  deepEqual(nodes, computeNoteNodesCache[0]) &&
@@ -186,7 +186,7 @@ export function computeNoteNodes(nodes, notes, noteTextHeights, onTextHeightChan
186
186
  }
187
187
  if (editMode) {
188
188
  if (noteEditorContext?.noteEditor?.isAvailable()) {
189
- noteEditorContext.noteEditor.cleanupGroupNotes(nodes);
189
+ noteEditorContext.noteEditor.cleanupGroupNotes(nodes, collapsedModuleIds);
190
190
  }
191
191
  }
192
192
  const allNoteNodes = [];
@@ -206,6 +206,13 @@ export function computeNoteNodes(nodes, notes, noteTextHeights, onTextHeightChan
206
206
  const noteZIndexes = calculateAllNoteZIndexes(notes, nodes);
207
207
  for (const note of notes) {
208
208
  const isGroupNote = note.type === 'group';
209
+ // Skip group notes whose contained nodes are all inside collapsed groups
210
+ if (isGroupNote && collapsedModuleIds?.size) {
211
+ const ids = note.contained_node_ids ?? [];
212
+ if (ids.length > 0 && ids.every((id) => collapsedModuleIds.has(id))) {
213
+ continue;
214
+ }
215
+ }
209
216
  const zIndex = noteZIndexes[note.id];
210
217
  // Calculate position and size using node positions for group notes
211
218
  const { position, size } = isGroupNote
@@ -0,0 +1,41 @@
1
+ <script lang="ts">import { BaseEdge as XyBaseEdge, EdgeLabel, getBezierPath } from '@xyflow/svelte';
2
+ let { id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, label, animated } = $props();
3
+ let [path, labelX, labelY] = $derived(getBezierPath({
4
+ sourceX,
5
+ sourceY,
6
+ targetX,
7
+ targetY,
8
+ sourcePosition,
9
+ targetPosition,
10
+ curvature: 0.25
11
+ }));
12
+ </script>
13
+
14
+ <XyBaseEdge {id} {path} interactionWidth={0} />
15
+
16
+ {#if label}
17
+ <EdgeLabel x={labelX} y={labelY}>
18
+ <span class="text-2xs text-tertiary bg-surface px-1 rounded">{label}</span>
19
+ </EdgeLabel>
20
+ {/if}
21
+
22
+ {#if animated}
23
+ <path
24
+ d={path}
25
+ fill="none"
26
+ stroke-dasharray="5 5"
27
+ stroke="var(--color-border)"
28
+ stroke-width="1"
29
+ class="animated-dash"
30
+ />
31
+ {/if}
32
+
33
+ <style>
34
+ .animated-dash {
35
+ animation: dash 1s linear infinite;
36
+ }
37
+ @keyframes dash {
38
+ to {
39
+ stroke-dashoffset: -10;
40
+ }
41
+ }</style>
@@ -0,0 +1,4 @@
1
+ import { type EdgeProps } from '@xyflow/svelte';
2
+ declare const WacEdge: import("svelte").Component<EdgeProps, {}, "">;
3
+ type WacEdge = ReturnType<typeof WacEdge>;
4
+ export default WacEdge;
@@ -0,0 +1,51 @@
1
+ <script lang="ts">import { Handle, Position } from '@xyflow/svelte';
2
+ import { NODE } from '../../util';
3
+ let { data } = $props();
4
+ let dagNode = $derived(data.dagNode);
5
+ let nodeType = $derived(dagNode.node_type.type);
6
+ let displayLabel = $derived.by(() => {
7
+ const nt = dagNode.node_type;
8
+ switch (nt.type) {
9
+ case 'Branch':
10
+ return nt.condition_source;
11
+ case 'ParallelStart':
12
+ return 'parallel';
13
+ case 'ParallelEnd':
14
+ return 'join';
15
+ case 'LoopStart':
16
+ return `${dagNode.label} (${nt.iter_source})`;
17
+ case 'LoopEnd':
18
+ return dagNode.label;
19
+ case 'Sleep':
20
+ return `sleep(${nt.seconds}s)`;
21
+ case 'WaitForApproval':
22
+ return 'wait for approval';
23
+ case 'Return':
24
+ return 'return';
25
+ default:
26
+ return dagNode.label;
27
+ }
28
+ });
29
+ let bgClass = $derived.by(() => {
30
+ switch (nodeType) {
31
+ case 'Return':
32
+ return 'bg-surface-tertiary';
33
+ default:
34
+ return 'bg-component-virtual-node';
35
+ }
36
+ });
37
+ </script>
38
+
39
+ <div class="relative">
40
+ <div
41
+ class="w-full flex relative rounded-md drop-shadow-sm {bgClass} overflow-hidden"
42
+ style="width: {NODE.width}px; height: {NODE.height}px;"
43
+ >
44
+ <div class="flex flex-row items-center justify-center w-full p-2 text-2xs rounded-md">
45
+ <div class="truncate text-center text-emphasis">{displayLabel}</div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+ <Handle type="target" position={Position.Top} isConnectable={false} />
51
+ <Handle type="source" position={Position.Bottom} isConnectable={false} />
@@ -0,0 +1,9 @@
1
+ import type { WacDagNode } from '../../../../infer';
2
+ type $$ComponentProps = {
3
+ data: {
4
+ dagNode: WacDagNode;
5
+ };
6
+ };
7
+ declare const WacControlNode: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type WacControlNode = ReturnType<typeof WacControlNode>;
9
+ export default WacControlNode;
@@ -0,0 +1,35 @@
1
+ <script lang="ts">import { Handle, Position } from '@xyflow/svelte';
2
+ import { Badge } from '../../../common';
3
+ import { NODE } from '../../util';
4
+ let { data } = $props();
5
+ let dagNode = $derived(data.dagNode);
6
+ let isInline = $derived(dagNode.node_type.type === 'InlineStep');
7
+ let label = $derived(dagNode.label);
8
+ let script = $derived(dagNode.node_type.type === 'Step' ? dagNode.node_type.script : undefined);
9
+ let hasExternalPath = $derived(script !== undefined && script !== label);
10
+ </script>
11
+
12
+ <div class="relative">
13
+ <div
14
+ class="w-full flex relative rounded-md drop-shadow-sm bg-surface-tertiary overflow-hidden"
15
+ style="width: {NODE.width}px; height: {NODE.height}px;"
16
+ >
17
+ <div class="flex flex-row items-center w-full p-2 text-2xs text-primary rounded-md gap-2">
18
+ <div class="flex flex-col flex-grow min-w-0">
19
+ <div class="truncate text-center text-emphasis">{label}</div>
20
+ </div>
21
+ {#if hasExternalPath}
22
+ <Badge color="blue" baseClass="max-w-[100px]" title={script}>
23
+ <span class="text-2xs truncate">{script}</span>
24
+ </Badge>
25
+ {:else if isInline}
26
+ <Badge color="indigo" baseClass="max-w-[60px]">
27
+ <span class="text-2xs">inline</span>
28
+ </Badge>
29
+ {/if}
30
+ </div>
31
+ </div>
32
+ </div>
33
+
34
+ <Handle type="target" position={Position.Top} isConnectable={false} />
35
+ <Handle type="source" position={Position.Bottom} isConnectable={false} />
@@ -0,0 +1,9 @@
1
+ import type { WacDagNode } from '../../../../infer';
2
+ type $$ComponentProps = {
3
+ data: {
4
+ dagNode: WacDagNode;
5
+ };
6
+ };
7
+ declare const WacStepNode: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type WacStepNode = ReturnType<typeof WacStepNode>;
9
+ export default WacStepNode;
@@ -0,0 +1,10 @@
1
+ import type { Node, Edge } from '@xyflow/svelte';
2
+ import type { WacWorkflowDag } from '../../infer';
3
+ /**
4
+ * Simple top-to-bottom DAG layout for WAC workflow graphs.
5
+ * Uses the same NODE dimensions as the flow editor for visual consistency.
6
+ */
7
+ export declare function dagToXyflow(dag: WacWorkflowDag): {
8
+ nodes: Node[];
9
+ edges: Edge[];
10
+ };
@@ -0,0 +1,120 @@
1
+ import { NODE } from './util';
2
+ const GAP_X = NODE.gap.horizontal;
3
+ const GAP_Y = NODE.gap.vertical;
4
+ /**
5
+ * Simple top-to-bottom DAG layout for WAC workflow graphs.
6
+ * Uses the same NODE dimensions as the flow editor for visual consistency.
7
+ */
8
+ export function dagToXyflow(dag) {
9
+ if (dag.nodes.length === 0) {
10
+ return { nodes: [], edges: [] };
11
+ }
12
+ // Build adjacency maps
13
+ const childrenMap = new Map();
14
+ const parentMap = new Map();
15
+ for (const edge of dag.edges) {
16
+ if (!childrenMap.has(edge.from))
17
+ childrenMap.set(edge.from, []);
18
+ childrenMap.get(edge.from).push({ id: edge.to, label: edge.label });
19
+ if (!parentMap.has(edge.to))
20
+ parentMap.set(edge.to, []);
21
+ parentMap.get(edge.to).push(edge.from);
22
+ }
23
+ // Find root nodes (no parents, excluding back-edges to loop starts)
24
+ const roots = dag.nodes.filter((n) => {
25
+ const parents = parentMap.get(n.id) ?? [];
26
+ return (parents.length === 0 ||
27
+ parents.every((p) => {
28
+ const edge = dag.edges.find((e) => e.from === p && e.to === n.id);
29
+ return edge?.label === 'next';
30
+ }));
31
+ });
32
+ // Assign layers using BFS (ignoring back-edges)
33
+ const layers = new Map();
34
+ const queue = [];
35
+ for (const root of roots) {
36
+ layers.set(root.id, 0);
37
+ queue.push(root.id);
38
+ }
39
+ while (queue.length > 0) {
40
+ const nodeId = queue.shift();
41
+ const layer = layers.get(nodeId);
42
+ const children = childrenMap.get(nodeId) ?? [];
43
+ for (const child of children) {
44
+ if (child.label === 'next')
45
+ continue; // skip back-edges
46
+ const existing = layers.get(child.id);
47
+ if (existing === undefined || existing < layer + 1) {
48
+ layers.set(child.id, layer + 1);
49
+ queue.push(child.id);
50
+ }
51
+ }
52
+ }
53
+ // Group nodes by layer
54
+ const layerGroups = new Map();
55
+ for (const [nodeId, layer] of layers) {
56
+ if (!layerGroups.has(layer))
57
+ layerGroups.set(layer, []);
58
+ layerGroups.get(layer).push(nodeId);
59
+ }
60
+ const maxLayer = Math.max(...layers.values(), 0);
61
+ // Position nodes — centered, using flow editor dimensions
62
+ const positions = new Map();
63
+ for (let layer = 0; layer <= maxLayer; layer++) {
64
+ const group = layerGroups.get(layer) ?? [];
65
+ const totalWidth = group.length * NODE.width + (group.length - 1) * GAP_X;
66
+ const startX = -totalWidth / 2;
67
+ for (let i = 0; i < group.length; i++) {
68
+ positions.set(group[i], {
69
+ x: startX + i * (NODE.width + GAP_X),
70
+ y: layer * (NODE.height + GAP_Y)
71
+ });
72
+ }
73
+ }
74
+ // Convert to xyflow nodes
75
+ const nodeMap = new Map(dag.nodes.map((n) => [n.id, n]));
76
+ const xyNodes = [];
77
+ for (const [id, pos] of positions) {
78
+ const dagNode = nodeMap.get(id);
79
+ if (!dagNode)
80
+ continue;
81
+ xyNodes.push({
82
+ id,
83
+ type: getXyflowNodeType(dagNode),
84
+ position: { x: pos.x, y: pos.y },
85
+ data: { dagNode },
86
+ width: NODE.width,
87
+ height: NODE.height
88
+ });
89
+ }
90
+ // Convert to xyflow edges
91
+ const xyEdges = dag.edges.map((e, i) => ({
92
+ id: `e-${i}`,
93
+ source: e.from,
94
+ target: e.to,
95
+ type: 'wacEdge',
96
+ label: e.label === 'next' ? '' : (e.label ?? ''),
97
+ animated: e.label === 'next',
98
+ style: e.label === 'next' ? 'stroke-dasharray: 5 5;' : undefined
99
+ }));
100
+ return { nodes: xyNodes, edges: xyEdges };
101
+ }
102
+ function getXyflowNodeType(node) {
103
+ switch (node.node_type.type) {
104
+ case 'Step':
105
+ case 'InlineStep':
106
+ return 'wacStep';
107
+ case 'Sleep':
108
+ case 'WaitForApproval':
109
+ case 'Branch':
110
+ case 'ParallelStart':
111
+ case 'ParallelEnd':
112
+ case 'LoopStart':
113
+ case 'LoopEnd':
114
+ case 'Merge':
115
+ case 'Return':
116
+ return 'wacControl';
117
+ default:
118
+ return 'wacStep';
119
+ }
120
+ }
@@ -8,7 +8,7 @@ export function isWorkflowAsCode(code, language) {
8
8
  if (language === 'bun' || language === 'deno') {
9
9
  return (/workflow\s*\(/.test(code) &&
10
10
  /task\s*\(/.test(code) &&
11
- /import.*(?:workflow|task).*from\s+['"]windmill-client(?:@[^'"]*)?['"]/.test(code));
11
+ /['"]windmill-client(?:@[^'"]*)?['"]/.test(code));
12
12
  }
13
13
  return false;
14
14
  }
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">import CenteredPage from '../CenteredPage.svelte';
2
- import { Button, Skeleton } from '../common';
2
+ import { Badge, Button, Skeleton } from '../common';
3
3
  import Toggle from '../Toggle.svelte';
4
4
  import { AppService, FlowService, ScriptService } from '../../gen';
5
5
  import { userStore, workspaceStore } from '../../stores';
6
- import { ChevronsDownUp, ChevronsUpDown, Code2, LayoutDashboard, ListFilterPlus, SearchCode } from 'lucide-svelte';
6
+ import { ChevronsDownUp, ChevronsUpDown, Code2, LayoutDashboard, ListFilterPlus, SearchCode, Tag } from 'lucide-svelte';
7
7
  import { HOME_SEARCH_SHOW_FLOW, HOME_SEARCH_PLACEHOLDER } from '../../consts';
8
8
  import SearchItems from '../SearchItems.svelte';
9
9
  import ListFilters from './ListFilters.svelte';
@@ -89,6 +89,7 @@ function filterItemsPathsBaseOnUserFilters(item, filterUserFolders, filterUserFo
89
89
  return true; // should not happen
90
90
  }
91
91
  let ownerFilter = $state(undefined);
92
+ let labelFilter = $state(undefined);
92
93
  const cmp = new Intl.Collator('en').compare;
93
94
  const opts = {
94
95
  sort: (info, haystack, needle) => {
@@ -198,17 +199,21 @@ let combinedItems = $derived(flows == undefined || scripts == undefined || apps
198
199
  time: new Date(x.edited_at).getTime()
199
200
  }))
200
201
  ].sort((a, b) => a.starred != b.starred ? (a.starred ? -1 : 1) : a.time - b.time > 0 ? -1 : 1));
202
+ let allLabels = $derived(Array.from(new Set(combinedItems?.flatMap((x) => ('labels' in x && x.labels) || []) ?? [])).sort());
201
203
  $effect(() => {
202
204
  if ($workspaceStore) {
203
205
  ownerFilter = undefined;
206
+ labelFilter = undefined;
204
207
  }
205
208
  });
206
209
  let preFilteredItems = $derived(ownerFilter != undefined
207
210
  ? combinedItems?.filter((x) => x.path.startsWith(ownerFilter + '/') &&
208
211
  (x.type == itemKind || itemKind == 'all') &&
209
- filterItemsPathsBaseOnUserFilters(x, filterUserFolders, filterUserFoldersType))
212
+ filterItemsPathsBaseOnUserFilters(x, filterUserFolders, filterUserFoldersType) &&
213
+ (labelFilter == undefined || ('labels' in x && x.labels?.includes(labelFilter))))
210
214
  : combinedItems?.filter((x) => (x.type == itemKind || itemKind == 'all') &&
211
- filterItemsPathsBaseOnUserFilters(x, filterUserFolders, filterUserFoldersType)));
215
+ filterItemsPathsBaseOnUserFilters(x, filterUserFolders, filterUserFoldersType) &&
216
+ (labelFilter == undefined || ('labels' in x && x.labels?.includes(labelFilter)))));
212
217
  let items = $derived(filter !== '' ? filteredItems : preFilteredItems);
213
218
  $effect(() => {
214
219
  items && resetScroll();
@@ -344,6 +349,25 @@ $effect(() => {
344
349
  filters={owners}
345
350
  bottomMargin={false}
346
351
  />
352
+ {#if allLabels.length > 0}
353
+ <div class="gap-1.5 w-full flex flex-wrap mt-2">
354
+ {#each allLabels as label (label)}
355
+ <Badge
356
+ color="blue"
357
+ small
358
+ clickable
359
+ selected={label === labelFilter}
360
+ title="Label: {label}"
361
+ onclick={() => {
362
+ labelFilter = labelFilter === label ? undefined : label
363
+ }}
364
+ >
365
+ <Tag size={10} class="inline -mt-px" />{label}
366
+ {#if label === labelFilter}&cross;{/if}
367
+ </Badge>
368
+ {/each}
369
+ </div>
370
+ {/if}
347
371
  {#if filteredItems?.length == 0}
348
372
  <div class="mt-10"></div>
349
373
  {/if}
@@ -0,0 +1,32 @@
1
+ <script lang="ts">"use strict";
2
+ let { height = 24, width = 24 } = $props();
3
+ </script>
4
+
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ {width}
8
+ {height}
9
+ viewBox="0 0 724 561"
10
+ preserveAspectRatio="xMidYMid"
11
+ >
12
+ <defs>
13
+ <linearGradient id="r-grad-1" x1="0" x2="1" y1="0" y2="1">
14
+ <stop offset="0" stop-color="rgb(203,206,208)" />
15
+ <stop offset="1" stop-color="rgb(132,131,139)" />
16
+ </linearGradient>
17
+ <linearGradient id="r-grad-2" x1="0" x2="1" y1="0" y2="1">
18
+ <stop offset="0" stop-color="rgb(39,109,195)" />
19
+ <stop offset="1" stop-color="rgb(22,92,170)" />
20
+ </linearGradient>
21
+ </defs>
22
+ <path
23
+ d="M361.453,485.937 C162.329,485.937 0.906,377.828 0.906,244.469 C0.906,111.109 162.329,3.000 361.453,3.000 C560.578,3.000 722.000,111.109 722.000,244.469 C722.000,377.828 560.578,485.937 361.453,485.937 ZM416.641,97.406 C265.289,97.406 142.594,171.314 142.594,262.484 C142.594,353.654 265.289,427.562 416.641,427.562 C567.992,427.562 679.687,377.033 679.687,262.484 C679.687,147.971 567.992,97.406 416.641,97.406 Z"
24
+ fill="url(#r-grad-1)"
25
+ fill-rule="evenodd"
26
+ />
27
+ <path
28
+ d="M550.000,377.000 C550.000,377.000 571.822,383.585 584.500,390.000 C588.899,392.226 596.510,396.668 602.000,402.500 C607.378,408.212 610.000,414.000 610.000,414.000 L696.000,559.000 L557.000,559.062 L492.000,437.000 C492.000,437.000 478.690,414.131 470.500,407.500 C463.668,401.969 460.755,400.000 454.000,400.000 C449.298,400.000 420.974,400.000 420.974,400.000 L421.000,558.974 L298.000,559.026 L298.000,152.938 L545.000,152.938 C545.000,152.938 657.500,154.967 657.500,262.000 C657.500,369.033 550.000,377.000 550.000,377.000 ZM496.500,241.024 L422.037,240.976 L422.000,310.026 L496.500,310.002 C496.500,310.002 531.000,309.895 531.000,274.877 C531.000,239.155 496.500,241.024 496.500,241.024 Z"
29
+ fill="url(#r-grad-2)"
30
+ fill-rule="evenodd"
31
+ />
32
+ </svg>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ height?: number;
3
+ width?: number;
4
+ }
5
+ declare const RIcon: import("svelte").Component<Props, {}, "">;
6
+ type RIcon = ReturnType<typeof RIcon>;
7
+ export default RIcon;