windmill-components 1.665.1 → 1.677.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/flowStore.svelte.d.ts +1 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +49 -9
- package/package/components/flows/pickers/PickHubScriptQuick.svelte +5 -3
- 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/mqtt/MqttEditorConfigSection.svelte.d.ts +1 -1
- 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 +346 -4
- package/package/gen/schemas.gen.js +347 -5
- package/package/gen/services.gen.d.ts +163 -1
- package/package/gen/services.gen.js +323 -17
- package/package/gen/types.gen.d.ts +671 -5
- 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 +11 -0
- package/package/utils_workspace_deploy.js +36 -8
- package/package.json +5 -4
|
@@ -7,7 +7,7 @@ import { createEventDispatcher, getContext, tick } from 'svelte';
|
|
|
7
7
|
import SummaryPathDisplay from '../SummaryPathDisplay.svelte';
|
|
8
8
|
import { Calendar } from 'lucide-svelte';
|
|
9
9
|
const { triggersCount, triggersState } = $state(getContext('TriggerContext'));
|
|
10
|
-
let { mainButtons = [], menuItems = [], summary, path, tag, errorHandlerKind, scriptOrFlowPath, errorHandlerMuted = $bindable(), onSaved, children, trigger_badges } = $props();
|
|
10
|
+
let { mainButtons = [], menuItems = [], summary, path, tag, errorHandlerKind, scriptOrFlowPath, errorHandlerMuted = $bindable(), labels = $bindable(), onSaved, children, trigger_badges } = $props();
|
|
11
11
|
const dispatch = createEventDispatcher();
|
|
12
12
|
</script>
|
|
13
13
|
|
|
@@ -18,7 +18,7 @@ const dispatch = createEventDispatcher();
|
|
|
18
18
|
>
|
|
19
19
|
<div class="grow px-2 inline-flex items-center gap-4 min-w-0">
|
|
20
20
|
<div class={twMerge('min-w-0', $userStore?.operator ? 'pl-10' : '')}>
|
|
21
|
-
<SummaryPathDisplay {summary} {path} {onSaved} kind={errorHandlerKind} />
|
|
21
|
+
<SummaryPathDisplay {summary} {path} bind:labels {onSaved} kind={errorHandlerKind} />
|
|
22
22
|
</div>
|
|
23
23
|
{#if tag}
|
|
24
24
|
<Badge>tag: {tag}</Badge>
|
|
@@ -19,6 +19,7 @@ interface Props {
|
|
|
19
19
|
errorHandlerKind: 'flow' | 'script';
|
|
20
20
|
scriptOrFlowPath: string;
|
|
21
21
|
errorHandlerMuted: boolean | undefined;
|
|
22
|
+
labels?: string[] | undefined;
|
|
22
23
|
onSaved?: (newPath: string) => void;
|
|
23
24
|
children?: import('svelte').Snippet;
|
|
24
25
|
trigger_badges?: import('svelte').Snippet;
|
|
@@ -40,6 +41,6 @@ declare const DetailPageHeader: $$__sveltets_2_IsomorphicComponent<Props, {
|
|
|
40
41
|
seeTriggers: CustomEvent<any>;
|
|
41
42
|
} & {
|
|
42
43
|
[evt: string]: CustomEvent<any>;
|
|
43
|
-
}, {}, {}, "errorHandlerMuted">;
|
|
44
|
+
}, {}, {}, "labels" | "errorHandlerMuted">;
|
|
44
45
|
type DetailPageHeader = InstanceType<typeof DetailPageHeader>;
|
|
45
46
|
export default DetailPageHeader;
|
|
@@ -51,6 +51,11 @@ export declare function createMcpTool(id: string): McpTool;
|
|
|
51
51
|
* Create a Websearch tool
|
|
52
52
|
*/
|
|
53
53
|
export declare function createWebsearchTool(id: string): WebsearchTool;
|
|
54
|
+
/**
|
|
55
|
+
* Remove an AI agent tool by id, recursively traversing nested modules and nested AI agents.
|
|
56
|
+
* Returns true when a matching tool was found and removed.
|
|
57
|
+
*/
|
|
58
|
+
export declare function removeAgentToolByIdDeep(modules: FlowModule[], id: string, onRemove?: (tool: AgentTool) => void): boolean;
|
|
54
59
|
/**
|
|
55
60
|
* Convert a FlowModuleTool to a FlowModule for use with loadFlowModuleState etc.
|
|
56
61
|
* Strips the extra `tool_type` field and maps AgentTool fields to FlowModule fields.
|
|
@@ -78,6 +78,55 @@ export function createWebsearchTool(id) {
|
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Remove an AI agent tool by id, recursively traversing nested modules and nested AI agents.
|
|
83
|
+
* Returns true when a matching tool was found and removed.
|
|
84
|
+
*/
|
|
85
|
+
export function removeAgentToolByIdDeep(modules, id, onRemove) {
|
|
86
|
+
for (const module of modules) {
|
|
87
|
+
if (module.value.type === 'forloopflow' || module.value.type === 'whileloopflow') {
|
|
88
|
+
if (removeAgentToolByIdDeep(module.value.modules, id, onRemove)) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (module.value.type === 'branchall') {
|
|
94
|
+
for (const branch of module.value.branches) {
|
|
95
|
+
if (removeAgentToolByIdDeep(branch.modules, id, onRemove)) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (module.value.type === 'branchone') {
|
|
102
|
+
if (removeAgentToolByIdDeep(module.value.default, id, onRemove)) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
for (const branch of module.value.branches) {
|
|
106
|
+
if (removeAgentToolByIdDeep(branch.modules, id, onRemove)) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (module.value.type !== 'aiagent') {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const toolIndex = module.value.tools.findIndex((tool) => tool.id === id);
|
|
116
|
+
if (toolIndex !== -1) {
|
|
117
|
+
const [removed] = module.value.tools.splice(toolIndex, 1);
|
|
118
|
+
onRemove?.(removed);
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
const nestedToolModules = module.value.tools
|
|
122
|
+
.filter(isFlowModuleTool)
|
|
123
|
+
.map((tool) => agentToolToFlowModule(tool));
|
|
124
|
+
if (removeAgentToolByIdDeep(nestedToolModules, id, onRemove)) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
81
130
|
/**
|
|
82
131
|
* Convert a FlowModuleTool to a FlowModule for use with loadFlowModuleState etc.
|
|
83
132
|
* Strips the extra `tool_type` field and maps AgentTool fields to FlowModule fields.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
vi.mock('../aiProviderStorage', () => ({
|
|
3
|
+
loadStoredConfig: () => undefined
|
|
4
|
+
}));
|
|
5
|
+
vi.mock('./flowInfers', () => ({
|
|
6
|
+
AI_AGENT_SCHEMA: { properties: {} }
|
|
7
|
+
}));
|
|
8
|
+
import { removeAgentToolByIdDeep } from './agentToolUtils';
|
|
9
|
+
function makeRawModule(id) {
|
|
10
|
+
return {
|
|
11
|
+
id,
|
|
12
|
+
summary: id,
|
|
13
|
+
value: { type: 'rawscript', content: '', language: 'python3' }
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function makeAiAgent(id, tools) {
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
summary: id,
|
|
20
|
+
value: {
|
|
21
|
+
type: 'aiagent',
|
|
22
|
+
tools,
|
|
23
|
+
input_transforms: {}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function makeFlowModuleTool(module) {
|
|
28
|
+
return {
|
|
29
|
+
id: module.id,
|
|
30
|
+
summary: module.summary,
|
|
31
|
+
value: {
|
|
32
|
+
tool_type: 'flowmodule',
|
|
33
|
+
...module.value
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
describe('removeAgentToolByIdDeep', () => {
|
|
38
|
+
it('removes a direct tool from an ai agent', () => {
|
|
39
|
+
const tool = makeFlowModuleTool(makeRawModule('lookup_user'));
|
|
40
|
+
const agent = makeAiAgent('agent', [tool]);
|
|
41
|
+
const removed = [];
|
|
42
|
+
expect(removeAgentToolByIdDeep([agent], 'lookup_user', (x) => removed.push(x.id))).toBe(true);
|
|
43
|
+
expect(agent.value.tools).toEqual([]);
|
|
44
|
+
expect(removed).toEqual(['lookup_user']);
|
|
45
|
+
});
|
|
46
|
+
it('removes a nested tool from a nested ai agent tool', () => {
|
|
47
|
+
const nestedTool = makeFlowModuleTool(makeRawModule('create_ticket'));
|
|
48
|
+
const nestedAgent = makeAiAgent('support_agent', [nestedTool]);
|
|
49
|
+
const rootAgent = makeAiAgent('root_agent', [makeFlowModuleTool(nestedAgent)]);
|
|
50
|
+
const removed = [];
|
|
51
|
+
expect(removeAgentToolByIdDeep([rootAgent], 'create_ticket', (x) => removed.push(x.id))).toBe(true);
|
|
52
|
+
expect(rootAgent.value.tools[0].value.tools).toEqual([]);
|
|
53
|
+
expect(removed).toEqual(['create_ticket']);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -568,6 +568,7 @@ function enableChatMode() {
|
|
|
568
568
|
bind:schema={flowStore.val.schema}
|
|
569
569
|
hiddenArgs={['user_message']}
|
|
570
570
|
isFlowInput
|
|
571
|
+
showSensitiveToggle
|
|
571
572
|
editTab={chatInputsEditTab ? 'inputEditor' : undefined}
|
|
572
573
|
showDynOpt
|
|
573
574
|
bind:dynCode
|
|
@@ -623,6 +624,7 @@ function enableChatMode() {
|
|
|
623
624
|
bind:this={editableSchemaForm}
|
|
624
625
|
bind:schema={flowStore.val.schema}
|
|
625
626
|
isFlowInput
|
|
627
|
+
showSensitiveToggle
|
|
626
628
|
on:delete={(e) => {
|
|
627
629
|
addPropertyV2?.handleDeleteArgument([e.detail])
|
|
628
630
|
}}
|
|
@@ -219,7 +219,7 @@ let aiLength = $derived(funcDesc?.length > 0 && !disableAi && selectedKind != 'f
|
|
|
219
219
|
bind:selectedFilter={selected}
|
|
220
220
|
resourceType
|
|
221
221
|
/>
|
|
222
|
-
{#if !selected}
|
|
222
|
+
{#if !selected && customUi?.suggestIntegration != false}
|
|
223
223
|
<div class="pl-2 py-1">
|
|
224
224
|
<a
|
|
225
225
|
href={`${$hubBaseUrlStore}?suggest_integration=true`}
|
|
@@ -25,7 +25,6 @@ import { emptySchema } from '../../../utils';
|
|
|
25
25
|
import { slide } from 'svelte/transition';
|
|
26
26
|
import ToggleButtonGroup from '../../common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
27
27
|
import ToggleButton from '../../common/toggleButton-v2/ToggleButton.svelte';
|
|
28
|
-
import Badge from '../../common/badge/Badge.svelte';
|
|
29
28
|
const { previewArgs, flowStateStore, flowStore, currentEditor } = getContext('FlowEditorContext');
|
|
30
29
|
let { mod = $bindable(), parentModule, previousModule, noEditor, enableAi = false } = $props();
|
|
31
30
|
let editor = $state(undefined);
|
|
@@ -143,17 +142,11 @@ let suggestion = $state(undefined);
|
|
|
143
142
|
<div class="flex-shrink-0">
|
|
144
143
|
<div class="mb-2 text-sm font-bold"
|
|
145
144
|
>Squash
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
><br />
|
|
152
|
-
Squashing a for loop runs all iterations on the same worker, using a single runner
|
|
153
|
-
per step for the entire loop. This eliminates cold starts between iterations for supported
|
|
154
|
-
languages (Bun, Deno, and Python).
|
|
155
|
-
</Tooltip>
|
|
156
|
-
</Badge>
|
|
145
|
+
<Tooltip documentationLink="https://www.windmill.dev/docs/flows/flow_loops">
|
|
146
|
+
Squashing a for loop runs all iterations on the same worker, using a single runner
|
|
147
|
+
per step for the entire loop. This eliminates cold starts between iterations for
|
|
148
|
+
supported languages (Bun, Deno, and Python).
|
|
149
|
+
</Tooltip>
|
|
157
150
|
</div>
|
|
158
151
|
<Toggle
|
|
159
152
|
bind:checked={mod.value.squash}
|
|
@@ -52,9 +52,11 @@ function toggleShowAll() {
|
|
|
52
52
|
async function loadCode(path, hash) {
|
|
53
53
|
try {
|
|
54
54
|
notFound = false;
|
|
55
|
-
const script =
|
|
56
|
-
? await
|
|
57
|
-
:
|
|
55
|
+
const script = path.startsWith('hub/')
|
|
56
|
+
? await getScriptByPath(path)
|
|
57
|
+
: hash
|
|
58
|
+
? await ScriptService.getScriptByHash({ workspace: $workspaceStore, hash })
|
|
59
|
+
: await getScriptByPath(path);
|
|
58
60
|
code = script.content;
|
|
59
61
|
language = script.language;
|
|
60
62
|
lock = script.lock;
|
|
@@ -6,7 +6,7 @@ import { FlowService } from '../../../gen';
|
|
|
6
6
|
import { workspaceStore } from '../../../stores';
|
|
7
7
|
import { setContext } from 'svelte';
|
|
8
8
|
import { writable } from 'svelte/store';
|
|
9
|
-
let { path, noSide = false } = $props();
|
|
9
|
+
let { path, noSide = false, fillAvailableHeight = false } = $props();
|
|
10
10
|
let flow = $state(undefined);
|
|
11
11
|
const triggersCount = writable(undefined);
|
|
12
12
|
setContext('TriggerContext', {
|
|
@@ -26,7 +26,7 @@ run(() => {
|
|
|
26
26
|
|
|
27
27
|
<div class="flex flex-col flex-1 h-full overflow-auto">
|
|
28
28
|
{#if flow}
|
|
29
|
-
<FlowGraphViewer triggerNode={true} {noSide} {flow} />
|
|
29
|
+
<FlowGraphViewer triggerNode={true} {noSide} {flow} {fillAvailableHeight} />
|
|
30
30
|
{:else}
|
|
31
31
|
<Skeleton layout={[[40]]} />
|
|
32
32
|
{/if}
|
|
@@ -16,6 +16,7 @@ import ErrorHandlerToggleButtonV2 from '../../details/ErrorHandlerToggleButtonV2
|
|
|
16
16
|
import WorkerTagPicker from '../../WorkerTagPicker.svelte';
|
|
17
17
|
import MetadataGen from '../../copilot/MetadataGen.svelte';
|
|
18
18
|
import Badge from '../../Badge.svelte';
|
|
19
|
+
import LabelsInput from '../../LabelsInput.svelte';
|
|
19
20
|
import AIFormSettings from '../../copilot/AIFormSettings.svelte';
|
|
20
21
|
import { twMerge } from 'tailwind-merge';
|
|
21
22
|
import { inputBaseClass, inputBorderClass } from '../../text_input/TextInput.svelte';
|
|
@@ -95,6 +96,7 @@ let numberOfAdvancedOptionsOn = $derived(activeAdvancedOptionNames.length);
|
|
|
95
96
|
}}
|
|
96
97
|
/>
|
|
97
98
|
</Label>
|
|
99
|
+
<LabelsInput bind:labels={(flowStore.val as any).labels} class="-mt-4" />
|
|
98
100
|
|
|
99
101
|
{#if !noEditor}
|
|
100
102
|
<Label label="Path">
|
|
@@ -16,7 +16,6 @@ import FlowModuleDeleteAfterUse from './FlowModuleDeleteAfterUse.svelte';
|
|
|
16
16
|
import FlowModuleSkip from './FlowModuleSkip.svelte';
|
|
17
17
|
import TabsV2 from '../../common/tabs/TabsV2.svelte';
|
|
18
18
|
import { useUiIntent } from '../../copilot/chat/flow/useUiIntent';
|
|
19
|
-
import Badge from '../../common/badge/Badge.svelte';
|
|
20
19
|
const { flowStateStore } = getContext('FlowEditorContext');
|
|
21
20
|
let { mod = $bindable(), previousModule, parentModule, noEditor } = $props();
|
|
22
21
|
let selected = $state('early-stop');
|
|
@@ -90,17 +89,11 @@ useUiIntent(`whileloopflow-${mod.id}`, {
|
|
|
90
89
|
<div class="flex-shrink-0">
|
|
91
90
|
<div class="mb-2 text-sm font-bold"
|
|
92
91
|
>Squash
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
><br />
|
|
99
|
-
Squashing a for loop runs all iterations on the same worker, using a single runner
|
|
100
|
-
per step for the entire loop. This eliminates cold starts between iterations for supported
|
|
101
|
-
languages (Bun, Deno, and Python).
|
|
102
|
-
</Tooltip>
|
|
103
|
-
</Badge>
|
|
92
|
+
<Tooltip documentationLink="https://www.windmill.dev/docs/flows/while_loops">
|
|
93
|
+
Squashing a while loop runs all iterations on the same worker, using a single runner
|
|
94
|
+
per step for the entire loop. This eliminates cold starts between iterations for
|
|
95
|
+
supported languages (Bun, Deno, and Python).
|
|
96
|
+
</Tooltip>
|
|
104
97
|
</div>
|
|
105
98
|
<Toggle
|
|
106
99
|
bind:checked={mod.value.squash}
|
|
@@ -130,9 +130,9 @@ export const AI_AGENT_SCHEMA = {
|
|
|
130
130
|
format: 'json-schema',
|
|
131
131
|
showExpr: "fields.output_type === 'text'"
|
|
132
132
|
},
|
|
133
|
-
|
|
133
|
+
user_attachments: {
|
|
134
134
|
type: 'array',
|
|
135
|
-
description: 'Array of images to give as input to the AI agent. Requires a configured workspace S3 storage.',
|
|
135
|
+
description: 'Array of files (images or PDFs) to give as input to the AI agent. Requires a configured workspace S3 storage.',
|
|
136
136
|
items: {
|
|
137
137
|
type: 'object',
|
|
138
138
|
resourceType: 's3object'
|
|
@@ -163,13 +163,18 @@ export const AI_AGENT_SCHEMA = {
|
|
|
163
163
|
'streaming',
|
|
164
164
|
'memory',
|
|
165
165
|
'output_schema',
|
|
166
|
-
'
|
|
166
|
+
'user_attachments',
|
|
167
167
|
'max_completion_tokens',
|
|
168
168
|
'temperature',
|
|
169
169
|
'max_iterations'
|
|
170
170
|
]
|
|
171
171
|
};
|
|
172
172
|
function migrateAiAgentInputTransforms(inputTransforms) {
|
|
173
|
+
// Migrate user_images → user_attachments
|
|
174
|
+
if ('user_images' in inputTransforms && !('user_attachments' in inputTransforms)) {
|
|
175
|
+
inputTransforms.user_attachments = inputTransforms.user_images;
|
|
176
|
+
delete inputTransforms.user_images;
|
|
177
|
+
}
|
|
173
178
|
// Check if this has the legacy format
|
|
174
179
|
if ('messages_context_length' in inputTransforms && !('memory' in inputTransforms)) {
|
|
175
180
|
const legacyValue = inputTransforms.messages_context_length;
|
|
@@ -65,7 +65,7 @@ export declare function getFirstStepSchema(flowState: FlowState, flow: OpenFlow)
|
|
|
65
65
|
id: string;
|
|
66
66
|
summary: string | undefined;
|
|
67
67
|
value: {
|
|
68
|
-
language?: "deno" | "bun" | "python3" | "go" | "bash" | "powershell" | "postgresql" | "mysql" | "bigquery" | "snowflake" | "mssql" | "oracledb" | "graphql" | "nativets" | "php" | "rust" | "ansible" | "csharp" | "nu" | "java" | "ruby" | "duckdb" | undefined;
|
|
68
|
+
language?: "deno" | "bun" | "python3" | "go" | "bash" | "powershell" | "postgresql" | "mysql" | "bigquery" | "snowflake" | "mssql" | "oracledb" | "graphql" | "nativets" | "php" | "rust" | "ansible" | "csharp" | "nu" | "java" | "ruby" | "rlang" | "duckdb" | undefined;
|
|
69
69
|
path?: string | undefined;
|
|
70
70
|
type: "rawscript" | "script" | "flow" | "forloopflow" | "whileloopflow" | "branchone" | "branchall" | "aiagent" | "identity";
|
|
71
71
|
};
|
|
@@ -21,7 +21,7 @@ import { refreshStateStore } from '../../../svelte5Utils.svelte';
|
|
|
21
21
|
import FlowStickyNode from './FlowStickyNode.svelte';
|
|
22
22
|
import { getStepHistoryLoaderContext } from '../../stepHistoryLoader.svelte';
|
|
23
23
|
import { ModulesTestStates } from '../../modulesTest.svelte';
|
|
24
|
-
import { flowModuleToAgentTool, createMcpTool, createWebsearchTool, createAiAgentTool, SPECIAL_TOOL_KINDS, agentToolToFlowModule } from '../agentToolUtils';
|
|
24
|
+
import { flowModuleToAgentTool, createMcpTool, createWebsearchTool, createAiAgentTool, SPECIAL_TOOL_KINDS, agentToolToFlowModule, removeAgentToolByIdDeep } from '../agentToolUtils';
|
|
25
25
|
import { loadFlowModuleState } from '../flowStateUtils.svelte';
|
|
26
26
|
import { getNoteEditorContext } from '../../graph/noteEditor.svelte';
|
|
27
27
|
import { GroupedModulesProxy } from '../../graph/groupedModulesProxy.svelte';
|
|
@@ -148,7 +148,7 @@ export async function insertNewModuleAtIndex(modules, index, kind, wsScript, wsF
|
|
|
148
148
|
* Tools are always leaf nodes, so we just need to delete their state directly
|
|
149
149
|
*/
|
|
150
150
|
function removeAgentToolById(tools, id) {
|
|
151
|
-
const index = tools.findIndex((tool) => tool.id
|
|
151
|
+
const index = tools.findIndex((tool) => tool.id === id);
|
|
152
152
|
if (index != -1) {
|
|
153
153
|
const [removed] = tools.splice(index, 1);
|
|
154
154
|
deleteFlowStateById(removed.id, flowStateStore);
|
|
@@ -257,6 +257,16 @@ function toggleNoteMode() {
|
|
|
257
257
|
noteMode = !noteMode;
|
|
258
258
|
}
|
|
259
259
|
export function deleteMultiple(ids) {
|
|
260
|
+
const structureIds = [];
|
|
261
|
+
const toolIds = [];
|
|
262
|
+
for (const id of ids) {
|
|
263
|
+
if (findInStructure(proxy.items, id)) {
|
|
264
|
+
structureIds.push(id);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
toolIds.push(id);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
260
270
|
const deletingSet = new Set(ids);
|
|
261
271
|
const allDeps = {};
|
|
262
272
|
for (const id of ids) {
|
|
@@ -268,17 +278,28 @@ export function deleteMultiple(ids) {
|
|
|
268
278
|
}
|
|
269
279
|
}
|
|
270
280
|
const opts = { displayState: groupDisplayState };
|
|
271
|
-
const { emptiedGroups, duplicateGroups, commit } =
|
|
272
|
-
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
281
|
+
const { emptiedGroups, duplicateGroups, commit } = structureIds.length > 0
|
|
282
|
+
? proxy.prepareMutation((tree) => {
|
|
283
|
+
for (const id of structureIds) {
|
|
284
|
+
const found = findInStructure(tree, id);
|
|
285
|
+
if (found)
|
|
286
|
+
found.parentChildren.splice(found.index, 1);
|
|
287
|
+
}
|
|
288
|
+
}, opts)
|
|
289
|
+
: {
|
|
290
|
+
emptiedGroups: [],
|
|
291
|
+
duplicateGroups: [],
|
|
292
|
+
commit: () => { }
|
|
293
|
+
};
|
|
278
294
|
const affectedGroups = [...emptiedGroups, ...duplicateGroups];
|
|
279
295
|
const cb = () => {
|
|
280
296
|
push(history, flowStore.val);
|
|
281
297
|
commit({ removeDuplicates: duplicateGroups.length > 0 });
|
|
298
|
+
for (const id of toolIds) {
|
|
299
|
+
removeAgentToolByIdDeep(flowStore.val.value.modules, id, (removed) => {
|
|
300
|
+
deleteFlowStateById(removed.id, flowStateStore);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
282
303
|
for (const id of ids) {
|
|
283
304
|
delete flowStateStore.val[id];
|
|
284
305
|
}
|
|
@@ -531,6 +552,25 @@ $effect(() => {
|
|
|
531
552
|
return
|
|
532
553
|
}
|
|
533
554
|
|
|
555
|
+
if (!findInStructure(proxy.items, id)) {
|
|
556
|
+
const cb = () => {
|
|
557
|
+
push(history, flowStore.val)
|
|
558
|
+
selectNextId(id)
|
|
559
|
+
const removed = removeAgentToolByIdDeep(flowStore.val.value.modules, id, (tool) => {
|
|
560
|
+
deleteFlowStateById(tool.id, flowStateStore)
|
|
561
|
+
})
|
|
562
|
+
if (!removed) return
|
|
563
|
+
refreshStateStore(flowStore)
|
|
564
|
+
onDelete?.(id)
|
|
565
|
+
}
|
|
566
|
+
if (Object.keys(dependents).length > 0) {
|
|
567
|
+
deleteCallback = cb
|
|
568
|
+
} else {
|
|
569
|
+
cb()
|
|
570
|
+
}
|
|
571
|
+
return
|
|
572
|
+
}
|
|
573
|
+
|
|
534
574
|
const dsOpts = { displayState: groupDisplayState }
|
|
535
575
|
const { emptiedGroups, duplicateGroups, commit } = proxy.prepareMutation((tree) => {
|
|
536
576
|
const found = findInStructure(tree, id)
|
|
@@ -19,7 +19,7 @@ let listHubScriptsCached = createCache(async ({ filter, kind, appFilter }) => {
|
|
|
19
19
|
});
|
|
20
20
|
</script>
|
|
21
21
|
|
|
22
|
-
<script lang="ts">import { createEventDispatcher, untrack } from 'svelte';
|
|
22
|
+
<script lang="ts">import { createEventDispatcher, getContext, untrack } from 'svelte';
|
|
23
23
|
import { Skeleton } from '../../common';
|
|
24
24
|
import { classNames, createCache, sendUserToast } from '../../../utils';
|
|
25
25
|
import { APP_TO_ICON_COMPONENT } from '../../icons';
|
|
@@ -31,6 +31,7 @@ import { disableHubStore, hubBaseUrlStore, userStore } from '../../../stores';
|
|
|
31
31
|
import { get } from 'svelte/store';
|
|
32
32
|
import Button from '../../common/button/Button.svelte';
|
|
33
33
|
import { Alert } from '../../common';
|
|
34
|
+
let customUi = getContext('customUi');
|
|
34
35
|
let hubNotAvailable = $state(false);
|
|
35
36
|
const dispatch = createEventDispatcher();
|
|
36
37
|
let { kind = 'script', filter = $bindable(''), loading = $bindable(false), selected = undefined, appFilter = undefined, items = $bindable([]), displayPath = false, apps = $bindable([]), refreshCount = 0 } = $props();
|
|
@@ -118,7 +119,8 @@ $effect(() => {
|
|
|
118
119
|
{:else if hubNotAvailable}
|
|
119
120
|
<div class="px-3 py-2 mt-2">
|
|
120
121
|
<Alert type="warning" title="Hub not available" size="xs">
|
|
121
|
-
Could not connect to the Windmill Hub. If you are in a closed environment, you can disable the
|
|
122
|
+
Could not connect to the Windmill Hub. If you are in a closed environment, you can disable the
|
|
123
|
+
Hub in the <a href="/#superadmin-settings?tab=private_hub">instance settings</a>.
|
|
122
124
|
</Alert>
|
|
123
125
|
</div>
|
|
124
126
|
{:else if loading}
|
|
@@ -180,7 +182,7 @@ $effect(() => {
|
|
|
180
182
|
<div class="text-2xs text-tercary font-extralight text-center py-2 px-3 items-center">
|
|
181
183
|
There are more items than being displayed. Refine your search.
|
|
182
184
|
</div>
|
|
183
|
-
{:else}
|
|
185
|
+
{:else if customUi?.suggestScript != false}
|
|
184
186
|
<div class="px-2 py-1">
|
|
185
187
|
<a
|
|
186
188
|
href={`${$hubBaseUrlStore}?suggest_script=true`}
|
|
@@ -144,7 +144,8 @@ export async function saveScheduleFromCfg(scheduleCfg, edit, workspace) {
|
|
|
144
144
|
cron_version: scheduleCfg.cron_version,
|
|
145
145
|
dynamic_skip: scheduleCfg.dynamic_skip,
|
|
146
146
|
permissioned_as: scheduleCfg.permissioned_as,
|
|
147
|
-
preserve_permissioned_as: scheduleCfg.preserve_permissioned_as
|
|
147
|
+
preserve_permissioned_as: scheduleCfg.preserve_permissioned_as,
|
|
148
|
+
labels: scheduleCfg.labels
|
|
148
149
|
};
|
|
149
150
|
try {
|
|
150
151
|
if (edit) {
|
|
@@ -416,6 +416,18 @@ async function updateStores() {
|
|
|
416
416
|
...(assetNodesResult?.newAssetNodes ?? []),
|
|
417
417
|
...aiToolNodesResult.toolNodes
|
|
418
418
|
];
|
|
419
|
+
// Collect module IDs hidden inside collapsed groups so note cleanup preserves them
|
|
420
|
+
const collapsedModuleIds = new Set();
|
|
421
|
+
for (const n of finalNodes) {
|
|
422
|
+
if (n.type === 'collapsedGroup') {
|
|
423
|
+
const modules = n.data?.modules;
|
|
424
|
+
if (modules) {
|
|
425
|
+
for (const m of modules) {
|
|
426
|
+
collapsedModuleIds.add(m.id);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
419
431
|
// Compute note nodes (no position remapping)
|
|
420
432
|
let noteNodesResult = showNotes
|
|
421
433
|
? computeNoteNodes(finalNodes.map((n) => ({
|
|
@@ -427,7 +439,7 @@ async function updateStores() {
|
|
|
427
439
|
})), notes ?? [], noteTextHeights, (noteId, height) => {
|
|
428
440
|
noteTextHeights[noteId] = height;
|
|
429
441
|
noteManager.render();
|
|
430
|
-
}, editMode, noteEditorContext)
|
|
442
|
+
}, editMode, noteEditorContext, collapsedModuleIds.size > 0 ? collapsedModuleIds : undefined)
|
|
431
443
|
: undefined;
|
|
432
444
|
// update nodes
|
|
433
445
|
nodes = [...finalNodes, ...(noteNodesResult?.noteNodes ?? [])];
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<script lang="ts">import { SvelteFlow, SvelteFlowProvider, Controls } from '@xyflow/svelte';
|
|
2
|
+
import { parseWacDag } from '../../infer';
|
|
3
|
+
import { dagToXyflow } from './wacDagLayout';
|
|
4
|
+
import WacStepNode from './renderers/nodes/WacStepNode.svelte';
|
|
5
|
+
import WacControlNode from './renderers/nodes/WacControlNode.svelte';
|
|
6
|
+
import WacEdge from './renderers/edges/WacEdge.svelte';
|
|
7
|
+
import { AlertTriangle, Workflow } from 'lucide-svelte';
|
|
8
|
+
let { code, language } = $props();
|
|
9
|
+
let nodes = $state.raw([]);
|
|
10
|
+
let edges = $state.raw([]);
|
|
11
|
+
let errors = $state([]);
|
|
12
|
+
let empty = $state(true);
|
|
13
|
+
let debounceTimer;
|
|
14
|
+
$effect(() => {
|
|
15
|
+
const _code = code;
|
|
16
|
+
const _lang = language;
|
|
17
|
+
clearTimeout(debounceTimer);
|
|
18
|
+
debounceTimer = setTimeout(async () => {
|
|
19
|
+
const result = await parseWacDag(_code, _lang);
|
|
20
|
+
if (result === null) {
|
|
21
|
+
nodes = [];
|
|
22
|
+
edges = [];
|
|
23
|
+
errors = [];
|
|
24
|
+
empty = true;
|
|
25
|
+
}
|
|
26
|
+
else if ('errors' in result) {
|
|
27
|
+
nodes = [];
|
|
28
|
+
edges = [];
|
|
29
|
+
errors = result.errors;
|
|
30
|
+
empty = false;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const dag = result;
|
|
34
|
+
const layout = dagToXyflow(dag);
|
|
35
|
+
nodes = layout.nodes;
|
|
36
|
+
edges = layout.edges;
|
|
37
|
+
errors = [];
|
|
38
|
+
empty = dag.nodes.length === 0;
|
|
39
|
+
}
|
|
40
|
+
}, 300);
|
|
41
|
+
return () => clearTimeout(debounceTimer);
|
|
42
|
+
});
|
|
43
|
+
const nodeTypes = {
|
|
44
|
+
wacStep: WacStepNode,
|
|
45
|
+
wacControl: WacControlNode
|
|
46
|
+
};
|
|
47
|
+
const edgeTypes = {
|
|
48
|
+
wacEdge: WacEdge
|
|
49
|
+
};
|
|
50
|
+
const proOptions = { hideAttribution: true };
|
|
51
|
+
</script>
|
|
52
|
+
|
|
53
|
+
<div class="w-full h-full">
|
|
54
|
+
{#if errors.length > 0}
|
|
55
|
+
<div class="p-4 flex flex-col gap-2">
|
|
56
|
+
{#each errors as error (error.line)}
|
|
57
|
+
<div class="flex items-start gap-2 text-xs text-red-500">
|
|
58
|
+
<AlertTriangle size={14} class="shrink-0 mt-0.5" />
|
|
59
|
+
<span>
|
|
60
|
+
{#if error.line > 0}
|
|
61
|
+
<span class="font-mono">L{error.line}:</span>
|
|
62
|
+
{/if}
|
|
63
|
+
{error.message}
|
|
64
|
+
</span>
|
|
65
|
+
</div>
|
|
66
|
+
{/each}
|
|
67
|
+
</div>
|
|
68
|
+
{:else if empty}
|
|
69
|
+
<div class="p-4 flex flex-col items-center justify-center h-full text-tertiary text-xs gap-2">
|
|
70
|
+
<Workflow size={24} />
|
|
71
|
+
<span>No workflow diagram</span>
|
|
72
|
+
</div>
|
|
73
|
+
{:else}
|
|
74
|
+
<SvelteFlowProvider>
|
|
75
|
+
<SvelteFlow
|
|
76
|
+
{nodes}
|
|
77
|
+
{edges}
|
|
78
|
+
{nodeTypes}
|
|
79
|
+
{edgeTypes}
|
|
80
|
+
fitView
|
|
81
|
+
fitViewOptions={{ padding: 0.2 }}
|
|
82
|
+
nodesDraggable={false}
|
|
83
|
+
elementsSelectable={false}
|
|
84
|
+
panOnDrag={true}
|
|
85
|
+
zoomOnScroll={true}
|
|
86
|
+
zoomOnPinch={true}
|
|
87
|
+
zoomOnDoubleClick={false}
|
|
88
|
+
preventScrolling={true}
|
|
89
|
+
{proOptions}
|
|
90
|
+
style="background: transparent;"
|
|
91
|
+
>
|
|
92
|
+
<Controls position="top-right" orientation="horizontal" showLock={false} />
|
|
93
|
+
</SvelteFlow>
|
|
94
|
+
</SvelteFlowProvider>
|
|
95
|
+
{/if}
|
|
96
|
+
</div>
|