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.
- package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
- package/dist/sharedUtils/base.d.ts +1 -0
- package/dist/sharedUtils/cloud.d.ts +1 -0
- package/dist/sharedUtils/common.d.ts +111 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
- package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
- package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
- package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
- package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
- package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
- package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
- package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
- package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
- package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
- package/dist/sharedUtils/components/apps/types.d.ts +274 -0
- package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
- package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
- package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
- package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
- package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
- package/dist/sharedUtils/components/common/index.d.ts +24 -0
- package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
- package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
- package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
- package/dist/sharedUtils/components/ducklake.d.ts +1 -0
- package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
- package/dist/sharedUtils/components/icons/index.d.ts +101 -0
- package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
- package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
- package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
- package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
- package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
- package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
- package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers.d.ts +20 -0
- package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
- package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
- package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
- package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
- package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
- package/dist/sharedUtils/gen/core/request.d.ts +29 -0
- package/dist/sharedUtils/gen/index.d.ts +6 -0
- package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
- package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
- package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
- package/dist/sharedUtils/history.svelte.d.ts +9 -0
- package/dist/sharedUtils/hub.d.ts +49 -0
- package/dist/sharedUtils/jsr.json +6 -0
- package/dist/sharedUtils/lib.d.ts +5 -0
- package/dist/sharedUtils/lib.es.js +1588 -0
- package/dist/sharedUtils/package.json +12 -0
- package/dist/sharedUtils/schema.d.ts +3 -0
- package/dist/sharedUtils/stores.d.ts +97 -0
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
- package/dist/sharedUtils/toast.d.ts +8 -0
- package/dist/sharedUtils/utils.d.ts +265 -0
- package/package/components/AddUser.svelte +67 -34
- package/package/components/AppConnectInner.svelte +9 -1
- package/package/components/ArgInfo.svelte +9 -1
- package/package/components/ArgInput.svelte +21 -1
- package/package/components/CompareWorkspaces.svelte +11 -2
- package/package/components/DedicatedWorkersSelector.svelte +262 -247
- package/package/components/DefaultTagsInner.svelte +40 -2
- package/package/components/DeployWorkspace.svelte +13 -0
- package/package/components/DiffEditor.svelte +44 -1
- package/package/components/EditableSchemaForm.svelte +5 -2
- package/package/components/EditableSchemaForm.svelte.d.ts +1 -0
- package/package/components/Editor.svelte +5 -1
- package/package/components/EditorBar.svelte +12 -3
- package/package/components/FilterSearchbar.svelte +26 -2
- package/package/components/FlowBuilder.svelte +6 -3
- package/package/components/FlowGraphDiffViewer.svelte +16 -17
- package/package/components/FlowGraphViewer.svelte +20 -6
- package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
- package/package/components/FlowGraphViewerStep.svelte +14 -32
- package/package/components/FlowMetadata.svelte +4 -1
- package/package/components/FlowPreviewContent.svelte +2 -0
- package/package/components/FlowStatusWaitingForEvents.svelte +25 -4
- package/package/components/HighlightCode.svelte +3 -0
- package/package/components/InstanceSetting.svelte +9 -25
- package/package/components/InstanceSettings.svelte +16 -0
- package/package/components/LabelsInput.svelte +149 -0
- package/package/components/LabelsInput.svelte.d.ts +8 -0
- package/package/components/Login.svelte +6 -1
- package/package/components/ObjectStoreConfigSettings.svelte +273 -1
- package/package/components/OktaSetting.svelte +6 -5
- package/package/components/Password.svelte +74 -20
- package/package/components/Password.svelte.d.ts +1 -0
- package/package/components/PasswordArgInput.svelte +2 -2
- package/package/components/PasswordArgInput.svelte.d.ts +1 -0
- package/package/components/Path.svelte +8 -10
- package/package/components/PathNameAutocomplete.svelte +308 -0
- package/package/components/PathNameAutocomplete.svelte.d.ts +27 -0
- package/package/components/PowerShellCommonParams.svelte +84 -0
- package/package/components/PowerShellCommonParams.svelte.d.ts +6 -0
- package/package/components/Range.svelte +8 -3
- package/package/components/ResourceEditor.svelte +6 -2
- package/package/components/RunForm.svelte +71 -7
- package/package/components/RunForm.svelte.d.ts +2 -1
- package/package/components/ScriptBuilder.svelte +7 -3
- package/package/components/ScriptEditor.svelte +221 -187
- package/package/components/ScriptEditor.svelte.d.ts +1 -1
- package/package/components/ScriptSchema.svelte +1 -1
- package/package/components/StringTypeNarrowing.svelte +1 -1
- package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
- package/package/components/SummaryPathDisplay.svelte +32 -10
- package/package/components/SummaryPathDisplay.svelte.d.ts +2 -1
- package/package/components/VariableEditor.svelte +9 -2
- package/package/components/WorkerGroup.svelte +47 -2
- package/package/components/apps/editor/DeploymentHistory.svelte +112 -13
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +135 -35
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +3 -1
- package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +11 -35
- package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.d.ts +10 -0
- package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.js +14 -0
- package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.js +34 -0
- package/package/components/assets/AssetButtons.svelte +21 -25
- package/package/components/assets/AssetsUsageDrawer.svelte +7 -9
- package/package/components/common/fileUpload/FileUpload.svelte +6 -2
- package/package/components/common/languageIcons/LanguageIcon.svelte +3 -0
- package/package/components/common/table/AppRow.svelte +18 -0
- package/package/components/common/table/FlowRow.svelte +18 -0
- package/package/components/common/table/ScriptRow.svelte +18 -0
- package/package/components/copilot/chat/AIChatManager.svelte.js +3 -3
- package/package/components/copilot/chat/flow/openFlow.json +1 -1
- package/package/components/copilot/chat/flow/openFlowZod.js +3 -3
- package/package/components/custom_ui.d.ts +2 -0
- package/package/components/details/DetailPageHeader.svelte +2 -2
- package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
- package/package/components/flows/agentToolUtils.d.ts +5 -0
- package/package/components/flows/agentToolUtils.js +49 -0
- package/package/components/flows/agentToolUtils.test.d.ts +1 -0
- package/package/components/flows/agentToolUtils.test.js +55 -0
- package/package/components/flows/content/FlowInput.svelte +2 -0
- package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
- package/package/components/flows/content/FlowLoop.svelte +5 -12
- package/package/components/flows/content/FlowModuleScript.svelte +5 -3
- package/package/components/flows/content/FlowPathViewer.svelte +2 -2
- package/package/components/flows/content/FlowPathViewer.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowSettings.svelte +2 -0
- package/package/components/flows/content/FlowWhileLoop.svelte +5 -12
- package/package/components/flows/flowInfers.js +8 -3
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +49 -9
- package/package/components/flows/pickers/PickHubScriptQuick.svelte +5 -3
- package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -1
- package/package/components/flows/scheduleUtils.js +2 -1
- package/package/components/graph/FlowGraphV2.svelte +13 -1
- package/package/components/graph/WacDiagram.svelte +96 -0
- package/package/components/graph/WacDiagram.svelte.d.ts +7 -0
- package/package/components/graph/noteEditor.svelte.d.ts +1 -1
- package/package/components/graph/noteEditor.svelte.js +12 -1
- package/package/components/graph/noteUtils.svelte.d.ts +1 -1
- package/package/components/graph/noteUtils.svelte.js +9 -2
- package/package/components/graph/renderers/edges/WacEdge.svelte +41 -0
- package/package/components/graph/renderers/edges/WacEdge.svelte.d.ts +4 -0
- package/package/components/graph/renderers/nodes/WacControlNode.svelte +51 -0
- package/package/components/graph/renderers/nodes/WacControlNode.svelte.d.ts +9 -0
- package/package/components/graph/renderers/nodes/WacStepNode.svelte +35 -0
- package/package/components/graph/renderers/nodes/WacStepNode.svelte.d.ts +9 -0
- package/package/components/graph/wacDagLayout.d.ts +10 -0
- package/package/components/graph/wacDagLayout.js +120 -0
- package/package/components/graph/wacToFlow.js +1 -1
- package/package/components/home/ItemsList.svelte +28 -4
- package/package/components/icons/RIcon.svelte +32 -0
- package/package/components/icons/RIcon.svelte.d.ts +7 -0
- package/package/components/instanceSettings/DbHealth.svelte +723 -0
- package/package/components/instanceSettings/DbHealth.svelte.d.ts +3 -0
- package/package/components/instanceSettings/SecretBackendConfig.svelte +343 -304
- package/package/components/instanceSettings/SmtpSettings.svelte +8 -0
- package/package/components/instanceSettings.js +14 -5
- package/package/components/mcp/McpScopeSelector.svelte +82 -16
- package/package/components/moveRenameManager.d.ts +1 -0
- package/package/components/moveRenameManager.js +7 -4
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +14 -1
- package/package/components/raw_apps/rawAppPolicy.js +3 -2
- package/package/components/raw_apps/utils.test.d.ts +1 -0
- package/package/components/raw_apps/utils.test.js +38 -0
- package/package/components/resources/resourcesFilter.d.ts +15 -2
- package/package/components/resources/resourcesFilter.js +11 -2
- package/package/components/runs/JobDetailFieldConfig.js +5 -3
- package/package/components/runs/JobDetailHeader.svelte +5 -2
- package/package/components/runs/JobRunsPreview.svelte +1 -0
- package/package/components/runs/RunBadges.svelte +7 -4
- package/package/components/runs/RunRow.svelte +7 -7
- package/package/components/schedules/schedulesFilter.d.ts +15 -2
- package/package/components/schedules/schedulesFilter.js +11 -2
- package/package/components/schema/EditableSchemaWrapper.svelte +6 -8
- package/package/components/schema/PropertyEditor.svelte +22 -1
- package/package/components/schema/PropertyEditor.svelte.d.ts +1 -0
- package/package/components/schema/editable_schema_wrapper.d.ts +1 -0
- package/package/components/secretArgUtils.d.ts +7 -0
- package/package/components/secretArgUtils.js +45 -0
- package/package/components/settings/WorkspaceUserSettings.svelte +359 -286
- package/package/components/sidebar/OperatorMenu.svelte +215 -197
- package/package/components/triggers/CaptureWrapper.svelte +1 -1
- package/package/components/triggers/TriggerFilters.svelte +17 -5
- package/package/components/triggers/TriggerFilters.svelte.d.ts +2 -1
- package/package/components/triggers/kafka/KafkaCapture.svelte +6 -2
- package/package/components/triggers/kafka/KafkaCapture.svelte.d.ts +1 -1
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +5 -1
- package/package/components/triggers/kafka/utils.js +1 -0
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +6 -0
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +87 -1
- package/package/components/triggers/websocket/utils.js +2 -0
- package/package/components/variables/variablesFilter.d.ts +15 -2
- package/package/components/variables/variablesFilter.js +11 -2
- package/package/components/worker_group.js +1 -0
- package/package/components/workspaceSettings/DucklakeSettings.svelte +33 -41
- package/package/consts.d.ts +1 -0
- package/package/consts.js +1 -0
- package/package/editorLangUtils.d.ts +1 -1
- package/package/editorLangUtils.js +2 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +94 -294
- package/package/gen/schemas.gen.js +94 -294
- package/package/gen/services.gen.d.ts +5 -121
- package/package/gen/services.gen.js +5 -237
- package/package/gen/types.gen.d.ts +91 -715
- package/package/hubPaths.json +6 -3
- package/package/infer.d.ts +55 -0
- package/package/infer.js +131 -0
- package/package/infer.svelte.js +2 -0
- package/package/mcpEndpointTools.js +213 -22
- package/package/script_helpers.d.ts +3 -0
- package/package/script_helpers.js +26 -0
- package/package/scripts.d.ts +2 -1
- package/package/scripts.js +15 -3
- package/package/stores.d.ts +2 -0
- package/package/system_prompts/prompts.d.ts +6 -5
- package/package/system_prompts/prompts.js +188 -29
- package/package/user.js +5 -1
- package/package/utils.js +21 -0
- package/package/utils_deployable.d.ts +7 -0
- package/package/utils_workspace_deploy.js +36 -8
- 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,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
|
-
/
|
|
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}✗{/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>
|