@flowdrop/flowdrop 1.0.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/LICENSE +21 -0
- package/README.md +252 -0
- package/dist/adapters/WorkflowAdapter.d.ts +167 -0
- package/dist/adapters/WorkflowAdapter.js +368 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +96 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.js +626 -0
- package/dist/adapters/agentspec/agentAdapter.d.ts +59 -0
- package/dist/adapters/agentspec/agentAdapter.js +91 -0
- package/dist/adapters/agentspec/autoLayout.d.ts +34 -0
- package/dist/adapters/agentspec/autoLayout.js +127 -0
- package/dist/adapters/agentspec/componentTypeDefaults.d.ts +73 -0
- package/dist/adapters/agentspec/componentTypeDefaults.js +238 -0
- package/dist/adapters/agentspec/defaultNodeTypes.d.ts +53 -0
- package/dist/adapters/agentspec/defaultNodeTypes.js +561 -0
- package/dist/adapters/agentspec/index.d.ts +37 -0
- package/dist/adapters/agentspec/index.js +39 -0
- package/dist/adapters/agentspec/validator.d.ts +34 -0
- package/dist/adapters/agentspec/validator.js +169 -0
- package/dist/api/enhanced-client.d.ts +183 -0
- package/dist/api/enhanced-client.js +430 -0
- package/dist/components/App.svelte +981 -0
- package/dist/components/App.svelte.d.ts +54 -0
- package/dist/components/CanvasBanner.stories.svelte +29 -0
- package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
- package/dist/components/CanvasBanner.svelte +57 -0
- package/dist/components/CanvasBanner.svelte.d.ts +8 -0
- package/dist/components/ConfigForm.svelte +1138 -0
- package/dist/components/ConfigForm.svelte.d.ts +44 -0
- package/dist/components/ConfigModal.svelte +188 -0
- package/dist/components/ConfigModal.svelte.d.ts +13 -0
- package/dist/components/ConfigPanel.stories.svelte +47 -0
- package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
- package/dist/components/ConfigPanel.svelte +182 -0
- package/dist/components/ConfigPanel.svelte.d.ts +32 -0
- package/dist/components/ConnectionLine.svelte +32 -0
- package/dist/components/ConnectionLine.svelte.d.ts +3 -0
- package/dist/components/EdgeRefresher.svelte +41 -0
- package/dist/components/EdgeRefresher.svelte.d.ts +9 -0
- package/dist/components/FlowDropZone.svelte +83 -0
- package/dist/components/FlowDropZone.svelte.d.ts +13 -0
- package/dist/components/LoadingSpinner.stories.svelte +30 -0
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
- package/dist/components/LoadingSpinner.svelte +36 -0
- package/dist/components/LoadingSpinner.svelte.d.ts +8 -0
- package/dist/components/Logo.stories.svelte +22 -0
- package/dist/components/Logo.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.svelte +102 -0
- package/dist/components/Logo.svelte.d.ts +26 -0
- package/dist/components/LogsSidebar.svelte +563 -0
- package/dist/components/LogsSidebar.svelte.d.ts +17 -0
- package/dist/components/MarkdownDisplay.stories.svelte +36 -0
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
- package/dist/components/MarkdownDisplay.svelte +29 -0
- package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
- package/dist/components/Navbar.stories.svelte +53 -0
- package/dist/components/Navbar.stories.svelte.d.ts +27 -0
- package/dist/components/Navbar.svelte +726 -0
- package/dist/components/Navbar.svelte.d.ts +29 -0
- package/dist/components/NodeSidebar.svelte +762 -0
- package/dist/components/NodeSidebar.svelte.d.ts +9 -0
- package/dist/components/NodeStatusOverlay.stories.svelte +85 -0
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
- package/dist/components/NodeStatusOverlay.svelte +327 -0
- package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
- package/dist/components/PipelineStatus.svelte +314 -0
- package/dist/components/PipelineStatus.svelte.d.ts +20 -0
- package/dist/components/PortCoordinateTracker.svelte +58 -0
- package/dist/components/PortCoordinateTracker.svelte.d.ts +12 -0
- package/dist/components/ReadOnlyDetails.svelte +170 -0
- package/dist/components/ReadOnlyDetails.svelte.d.ts +25 -0
- package/dist/components/SchemaForm.stories.svelte +116 -0
- package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
- package/dist/components/SchemaForm.svelte +536 -0
- package/dist/components/SchemaForm.svelte.d.ts +83 -0
- package/dist/components/SettingsModal.svelte +279 -0
- package/dist/components/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/SettingsPanel.svelte +638 -0
- package/dist/components/SettingsPanel.svelte.d.ts +21 -0
- package/dist/components/StatusIcon.stories.svelte +60 -0
- package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
- package/dist/components/StatusIcon.svelte +119 -0
- package/dist/components/StatusIcon.svelte.d.ts +10 -0
- package/dist/components/StatusLabel.stories.svelte +17 -0
- package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
- package/dist/components/StatusLabel.svelte +33 -0
- package/dist/components/StatusLabel.svelte.d.ts +7 -0
- package/dist/components/ThemeToggle.stories.svelte +25 -0
- package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.svelte +185 -0
- package/dist/components/ThemeToggle.svelte.d.ts +14 -0
- package/dist/components/UniversalNode.svelte +155 -0
- package/dist/components/UniversalNode.svelte.d.ts +15 -0
- package/dist/components/WorkflowEditor.svelte +1035 -0
- package/dist/components/WorkflowEditor.svelte.d.ts +23 -0
- package/dist/components/form/FormArray.svelte +1049 -0
- package/dist/components/form/FormArray.svelte.d.ts +22 -0
- package/dist/components/form/FormAutocomplete.svelte +1009 -0
- package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormCheckboxGroup.svelte +155 -0
- package/dist/components/form/FormCheckboxGroup.svelte.d.ts +17 -0
- package/dist/components/form/FormCodeEditor.svelte +458 -0
- package/dist/components/form/FormCodeEditor.svelte.d.ts +25 -0
- package/dist/components/form/FormField.svelte +417 -0
- package/dist/components/form/FormField.svelte.d.ts +29 -0
- package/dist/components/form/FormFieldLight.svelte +425 -0
- package/dist/components/form/FormFieldLight.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte +53 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormFieldWrapper.svelte +125 -0
- package/dist/components/form/FormFieldWrapper.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldset.svelte +142 -0
- package/dist/components/form/FormFieldset.svelte.d.ts +11 -0
- package/dist/components/form/FormMarkdownEditor.svelte +752 -0
- package/dist/components/form/FormMarkdownEditor.svelte.d.ts +33 -0
- package/dist/components/form/FormNumberField.stories.svelte +36 -0
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormNumberField.svelte +112 -0
- package/dist/components/form/FormNumberField.svelte.d.ts +25 -0
- package/dist/components/form/FormRangeField.stories.svelte +31 -0
- package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormRangeField.svelte +246 -0
- package/dist/components/form/FormRangeField.svelte.d.ts +23 -0
- package/dist/components/form/FormSelect.stories.svelte +50 -0
- package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormSelect.svelte +129 -0
- package/dist/components/form/FormSelect.svelte.d.ts +20 -0
- package/dist/components/form/FormTemplateEditor.svelte +825 -0
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +41 -0
- package/dist/components/form/FormTextField.stories.svelte +30 -0
- package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextField.svelte +91 -0
- package/dist/components/form/FormTextField.svelte.d.ts +19 -0
- package/dist/components/form/FormTextarea.stories.svelte +34 -0
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextarea.svelte +97 -0
- package/dist/components/form/FormTextarea.svelte.d.ts +21 -0
- package/dist/components/form/FormToggle.stories.svelte +30 -0
- package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormToggle.svelte +126 -0
- package/dist/components/form/FormToggle.svelte.d.ts +19 -0
- package/dist/components/form/FormUISchemaRenderer.svelte +136 -0
- package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +32 -0
- package/dist/components/form/index.d.ts +50 -0
- package/dist/components/form/index.js +54 -0
- package/dist/components/form/templateAutocomplete.d.ts +29 -0
- package/dist/components/form/templateAutocomplete.js +254 -0
- package/dist/components/form/types.d.ts +485 -0
- package/dist/components/form/types.js +73 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +52 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ChoicePrompt.svelte +401 -0
- package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +71 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte +292 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +25 -0
- package/dist/components/interrupt/FormPrompt.svelte +236 -0
- package/dist/components/interrupt/FormPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/InterruptBubble.svelte +601 -0
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +16 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +67 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ReviewPrompt.svelte +861 -0
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +47 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/TextInputPrompt.svelte +346 -0
- package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/index.d.ts +13 -0
- package/dist/components/interrupt/index.js +15 -0
- package/dist/components/layouts/MainLayout.svelte +718 -0
- package/dist/components/layouts/MainLayout.svelte.d.ts +62 -0
- package/dist/components/nodes/GatewayNode.stories.svelte +108 -0
- package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/GatewayNode.svelte +591 -0
- package/dist/components/nodes/GatewayNode.svelte.d.ts +15 -0
- package/dist/components/nodes/IdeaNode.stories.svelte +52 -0
- package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/IdeaNode.svelte +455 -0
- package/dist/components/nodes/IdeaNode.svelte.d.ts +24 -0
- package/dist/components/nodes/NotesNode.stories.svelte +76 -0
- package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/NotesNode.svelte +378 -0
- package/dist/components/nodes/NotesNode.svelte.d.ts +24 -0
- package/dist/components/nodes/SimpleNode.stories.svelte +159 -0
- package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SimpleNode.svelte +451 -0
- package/dist/components/nodes/SimpleNode.svelte.d.ts +25 -0
- package/dist/components/nodes/SquareNode.stories.svelte +82 -0
- package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SquareNode.svelte +407 -0
- package/dist/components/nodes/SquareNode.svelte.d.ts +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/TerminalNode.svelte +690 -0
- package/dist/components/nodes/TerminalNode.svelte.d.ts +25 -0
- package/dist/components/nodes/ToolNode.stories.svelte +189 -0
- package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/ToolNode.svelte +471 -0
- package/dist/components/nodes/ToolNode.svelte.d.ts +36 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte +55 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/WorkflowNode.svelte +571 -0
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +15 -0
- package/dist/components/playground/ChatPanel.svelte +905 -0
- package/dist/components/playground/ChatPanel.svelte.d.ts +46 -0
- package/dist/components/playground/ExecutionLogs.svelte +488 -0
- package/dist/components/playground/ExecutionLogs.svelte.d.ts +14 -0
- package/dist/components/playground/InputCollector.svelte +444 -0
- package/dist/components/playground/InputCollector.svelte.d.ts +16 -0
- package/dist/components/playground/MessageBubble.stories.svelte +62 -0
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
- package/dist/components/playground/MessageBubble.svelte +633 -0
- package/dist/components/playground/MessageBubble.svelte.d.ts +24 -0
- package/dist/components/playground/Playground.svelte +1075 -0
- package/dist/components/playground/Playground.svelte.d.ts +25 -0
- package/dist/components/playground/PlaygroundModal.svelte +220 -0
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +25 -0
- package/dist/components/playground/SessionManager.svelte +538 -0
- package/dist/components/playground/SessionManager.svelte.d.ts +20 -0
- package/dist/config/agentSpecEndpoints.d.ts +70 -0
- package/dist/config/agentSpecEndpoints.js +65 -0
- package/dist/config/constants.d.ts +43 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/defaultCategories.d.ts +7 -0
- package/dist/config/defaultCategories.js +126 -0
- package/dist/config/defaultPortConfig.d.ts +6 -0
- package/dist/config/defaultPortConfig.js +201 -0
- package/dist/config/endpoints.d.ts +160 -0
- package/dist/config/endpoints.js +146 -0
- package/dist/config/runtimeConfig.d.ts +47 -0
- package/dist/config/runtimeConfig.js +80 -0
- package/dist/core/index.d.ts +75 -0
- package/dist/core/index.js +92 -0
- package/dist/display/index.d.ts +29 -0
- package/dist/display/index.js +36 -0
- package/dist/editor/index.d.ts +95 -0
- package/dist/editor/index.js +138 -0
- package/dist/form/code.d.ts +101 -0
- package/dist/form/code.js +168 -0
- package/dist/form/fieldRegistry.d.ts +169 -0
- package/dist/form/fieldRegistry.js +152 -0
- package/dist/form/full.d.ts +56 -0
- package/dist/form/full.js +80 -0
- package/dist/form/index.d.ts +77 -0
- package/dist/form/index.js +91 -0
- package/dist/form/markdown.d.ts +69 -0
- package/dist/form/markdown.js +103 -0
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/helpers/proximityConnect.d.ts +94 -0
- package/dist/helpers/proximityConnect.js +314 -0
- package/dist/helpers/workflowEditorHelper.d.ts +183 -0
- package/dist/helpers/workflowEditorHelper.js +595 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +64 -0
- package/dist/mocks/app-environment.d.ts +8 -0
- package/dist/mocks/app-environment.js +16 -0
- package/dist/mocks/app-forms.d.ts +2 -0
- package/dist/mocks/app-forms.js +22 -0
- package/dist/mocks/app-navigation.d.ts +5 -0
- package/dist/mocks/app-navigation.js +36 -0
- package/dist/mocks/app-stores.d.ts +14 -0
- package/dist/mocks/app-stores.js +26 -0
- package/dist/playground/index.d.ts +131 -0
- package/dist/playground/index.js +172 -0
- package/dist/playground/mount.d.ts +203 -0
- package/dist/playground/mount.js +235 -0
- package/dist/registry/BaseRegistry.d.ts +92 -0
- package/dist/registry/BaseRegistry.js +124 -0
- package/dist/registry/builtinFormats.d.ts +23 -0
- package/dist/registry/builtinFormats.js +70 -0
- package/dist/registry/builtinNodes.d.ts +77 -0
- package/dist/registry/builtinNodes.js +211 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/nodeComponentRegistry.d.ts +276 -0
- package/dist/registry/nodeComponentRegistry.js +262 -0
- package/dist/registry/plugin.d.ts +215 -0
- package/dist/registry/plugin.js +249 -0
- package/dist/registry/workflowFormatRegistry.d.ts +122 -0
- package/dist/registry/workflowFormatRegistry.js +96 -0
- package/dist/schema/index.d.ts +23 -0
- package/dist/schema/index.js +23 -0
- package/dist/schemas/v1/workflow.schema.json +1078 -0
- package/dist/services/agentSpecExecutionService.d.ts +106 -0
- package/dist/services/agentSpecExecutionService.js +334 -0
- package/dist/services/api.d.ts +115 -0
- package/dist/services/api.js +214 -0
- package/dist/services/apiVariableService.d.ts +114 -0
- package/dist/services/apiVariableService.js +338 -0
- package/dist/services/autoSaveService.d.ts +112 -0
- package/dist/services/autoSaveService.js +227 -0
- package/dist/services/categoriesApi.d.ts +14 -0
- package/dist/services/categoriesApi.js +49 -0
- package/dist/services/draftStorage.d.ts +171 -0
- package/dist/services/draftStorage.js +299 -0
- package/dist/services/dynamicSchemaService.d.ts +108 -0
- package/dist/services/dynamicSchemaService.js +444 -0
- package/dist/services/globalSave.d.ts +69 -0
- package/dist/services/globalSave.js +248 -0
- package/dist/services/historyService.d.ts +208 -0
- package/dist/services/historyService.js +321 -0
- package/dist/services/interruptService.d.ts +133 -0
- package/dist/services/interruptService.js +280 -0
- package/dist/services/nodeExecutionService.d.ts +63 -0
- package/dist/services/nodeExecutionService.js +266 -0
- package/dist/services/playgroundService.d.ts +130 -0
- package/dist/services/playgroundService.js +321 -0
- package/dist/services/portConfigApi.d.ts +14 -0
- package/dist/services/portConfigApi.js +54 -0
- package/dist/services/settingsService.d.ts +92 -0
- package/dist/services/settingsService.js +196 -0
- package/dist/services/toastService.d.ts +156 -0
- package/dist/services/toastService.js +265 -0
- package/dist/services/variableService.d.ts +141 -0
- package/dist/services/variableService.js +463 -0
- package/dist/services/workflowStorage.d.ts +37 -0
- package/dist/services/workflowStorage.js +116 -0
- package/dist/settings/index.d.ts +25 -0
- package/dist/settings/index.js +33 -0
- package/dist/stores/categoriesStore.svelte.d.ts +32 -0
- package/dist/stores/categoriesStore.svelte.js +77 -0
- package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
- package/dist/stores/editorStateMachine.svelte.js +132 -0
- package/dist/stores/historyStore.svelte.d.ts +136 -0
- package/dist/stores/historyStore.svelte.js +207 -0
- package/dist/stores/interruptStore.svelte.d.ts +179 -0
- package/dist/stores/interruptStore.svelte.js +346 -0
- package/dist/stores/playgroundStore.svelte.d.ts +230 -0
- package/dist/stores/playgroundStore.svelte.js +515 -0
- package/dist/stores/portCoordinateStore.svelte.d.ts +66 -0
- package/dist/stores/portCoordinateStore.svelte.js +186 -0
- package/dist/stores/settingsStore.svelte.d.ts +158 -0
- package/dist/stores/settingsStore.svelte.js +544 -0
- package/dist/stores/workflowStore.svelte.d.ts +260 -0
- package/dist/stores/workflowStore.svelte.js +649 -0
- package/dist/stories/CanvasDecorator.svelte +49 -0
- package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
- package/dist/stories/NodeDecorator.svelte +73 -0
- package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
- package/dist/stories/utils.d.ts +93 -0
- package/dist/stories/utils.js +122 -0
- package/dist/styles/base.css +1300 -0
- package/dist/styles/toast.css +35 -0
- package/dist/styles/tokens.css +475 -0
- package/dist/svelte-app.d.ts +150 -0
- package/dist/svelte-app.js +295 -0
- package/dist/types/agentspec.d.ts +318 -0
- package/dist/types/agentspec.js +48 -0
- package/dist/types/auth.d.ts +263 -0
- package/dist/types/auth.js +229 -0
- package/dist/types/config.d.ts +151 -0
- package/dist/types/config.js +7 -0
- package/dist/types/events.d.ts +190 -0
- package/dist/types/events.js +30 -0
- package/dist/types/index.d.ts +1234 -0
- package/dist/types/index.js +27 -0
- package/dist/types/interrupt.d.ts +390 -0
- package/dist/types/interrupt.js +145 -0
- package/dist/types/interruptState.d.ts +211 -0
- package/dist/types/interruptState.js +308 -0
- package/dist/types/playground.d.ts +351 -0
- package/dist/types/playground.js +95 -0
- package/dist/types/settings.d.ts +189 -0
- package/dist/types/settings.js +97 -0
- package/dist/types/uischema.d.ts +144 -0
- package/dist/types/uischema.js +51 -0
- package/dist/utils/colors.d.ts +288 -0
- package/dist/utils/colors.js +548 -0
- package/dist/utils/config.d.ts +37 -0
- package/dist/utils/config.js +226 -0
- package/dist/utils/connections.d.ts +125 -0
- package/dist/utils/connections.js +414 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.js +44 -0
- package/dist/utils/fetchWithAuth.d.ts +25 -0
- package/dist/utils/fetchWithAuth.js +34 -0
- package/dist/utils/handleIds.d.ts +35 -0
- package/dist/utils/handleIds.js +58 -0
- package/dist/utils/handlePositioning.d.ts +31 -0
- package/dist/utils/handlePositioning.js +35 -0
- package/dist/utils/icons.d.ts +106 -0
- package/dist/utils/icons.js +157 -0
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/nodeStatus.d.ts +53 -0
- package/dist/utils/nodeStatus.js +183 -0
- package/dist/utils/nodeTypes.d.ts +117 -0
- package/dist/utils/nodeTypes.js +244 -0
- package/dist/utils/nodeWrapper.d.ts +39 -0
- package/dist/utils/nodeWrapper.js +62 -0
- package/dist/utils/performanceUtils.d.ts +30 -0
- package/dist/utils/performanceUtils.js +108 -0
- package/dist/utils/sanitize.d.ts +19 -0
- package/dist/utils/sanitize.js +31 -0
- package/dist/utils/uischema.d.ts +52 -0
- package/dist/utils/uischema.js +88 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.js +39 -0
- package/package.json +292 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proximity Connect Helper
|
|
3
|
+
*
|
|
4
|
+
* Provides type-aware proximity connect logic for the workflow editor.
|
|
5
|
+
* When a node is dragged near another node, this helper finds the best
|
|
6
|
+
* compatible port pair and creates a preview/permanent edge.
|
|
7
|
+
*/
|
|
8
|
+
import type { WorkflowNode as WorkflowNodeType, WorkflowEdge, NodePort, PortCoordinateMap } from '../types/index.js';
|
|
9
|
+
/** A candidate proximity edge before it is finalized */
|
|
10
|
+
export interface ProximityEdgeCandidate {
|
|
11
|
+
id: string;
|
|
12
|
+
source: string;
|
|
13
|
+
target: string;
|
|
14
|
+
sourceHandle: string;
|
|
15
|
+
targetHandle: string;
|
|
16
|
+
sourcePortDataType: string;
|
|
17
|
+
targetPortDataType: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class ProximityConnectHelper {
|
|
20
|
+
/**
|
|
21
|
+
* Get ALL ports (static + dynamic + gateway branches) for a node.
|
|
22
|
+
*/
|
|
23
|
+
static getAllPorts(node: WorkflowNodeType, direction: 'input' | 'output'): NodePort[];
|
|
24
|
+
/**
|
|
25
|
+
* Build handle ID in the standard format.
|
|
26
|
+
*/
|
|
27
|
+
static buildHandleId(nodeId: string, direction: 'input' | 'output', portId: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Calculate center-to-center distance between two nodes.
|
|
30
|
+
*/
|
|
31
|
+
static getNodeDistance(nodeA: {
|
|
32
|
+
position: {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
};
|
|
36
|
+
measured?: {
|
|
37
|
+
width?: number;
|
|
38
|
+
height?: number;
|
|
39
|
+
};
|
|
40
|
+
}, nodeB: {
|
|
41
|
+
position: {
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
};
|
|
45
|
+
measured?: {
|
|
46
|
+
width?: number;
|
|
47
|
+
height?: number;
|
|
48
|
+
};
|
|
49
|
+
}): number;
|
|
50
|
+
/**
|
|
51
|
+
* Find the single best compatible edge between a dragged node and nearby nodes.
|
|
52
|
+
*
|
|
53
|
+
* Algorithm:
|
|
54
|
+
* 1. Find the closest node within minDistance (edge-to-edge)
|
|
55
|
+
* 2. Check both directions (dragged->nearby and nearby->dragged)
|
|
56
|
+
* 3. Return the first exact-type match, or first compatible match
|
|
57
|
+
* 4. Skip pairs where an edge already exists
|
|
58
|
+
*
|
|
59
|
+
* @returns Array with at most ONE ProximityEdgeCandidate
|
|
60
|
+
*/
|
|
61
|
+
static findCompatibleEdges(draggedNode: WorkflowNodeType, allNodes: WorkflowNodeType[], existingEdges: WorkflowEdge[], minDistance: number): ProximityEdgeCandidate[];
|
|
62
|
+
/**
|
|
63
|
+
* Find the single best compatible edge using port-to-port distance.
|
|
64
|
+
*
|
|
65
|
+
* Unlike findCompatibleEdges() which uses node center distance,
|
|
66
|
+
* this method compares actual handle positions from the port coordinate store.
|
|
67
|
+
* This is more accurate for large nodes or nodes with many ports.
|
|
68
|
+
*
|
|
69
|
+
* Algorithm:
|
|
70
|
+
* 1. Partition ports by owner (dragged vs other) and direction (input vs output)
|
|
71
|
+
* 2. Group other-node ports by dataType for O(1) lookup of compatible groups
|
|
72
|
+
* 3. For each dragged port, only iterate compatible dataType groups
|
|
73
|
+
* 4. Return the closest compatible pair (exact type match preferred)
|
|
74
|
+
*
|
|
75
|
+
* @returns Array with at most ONE ProximityEdgeCandidate
|
|
76
|
+
*/
|
|
77
|
+
static findCompatibleEdgesByPortCoordinates(draggedNodeId: string, portCoordinates: PortCoordinateMap, existingEdges: WorkflowEdge[], maxDistance: number): ProximityEdgeCandidate[];
|
|
78
|
+
/**
|
|
79
|
+
* Convert candidates to temporary (preview) WorkflowEdge objects with dashed styling.
|
|
80
|
+
*/
|
|
81
|
+
static createPreviewEdges(candidates: ProximityEdgeCandidate[]): WorkflowEdge[];
|
|
82
|
+
/**
|
|
83
|
+
* Convert candidates to permanent WorkflowEdge objects.
|
|
84
|
+
*/
|
|
85
|
+
static createPermanentEdges(candidates: ProximityEdgeCandidate[]): WorkflowEdge[];
|
|
86
|
+
/**
|
|
87
|
+
* Check if an edge is a temporary proximity preview edge.
|
|
88
|
+
*/
|
|
89
|
+
static isProximityPreviewEdge(edge: WorkflowEdge): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Remove all proximity preview edges from an edge array.
|
|
92
|
+
*/
|
|
93
|
+
static removePreviewEdges(edges: WorkflowEdge[]): WorkflowEdge[];
|
|
94
|
+
}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proximity Connect Helper
|
|
3
|
+
*
|
|
4
|
+
* Provides type-aware proximity connect logic for the workflow editor.
|
|
5
|
+
* When a node is dragged near another node, this helper finds the best
|
|
6
|
+
* compatible port pair and creates a preview/permanent edge.
|
|
7
|
+
*/
|
|
8
|
+
import { dynamicPortToNodePort } from '../types/index.js';
|
|
9
|
+
import { getPortCompatibilityChecker } from '../utils/connections.js';
|
|
10
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
11
|
+
/** CSS class applied to proximity preview edges */
|
|
12
|
+
const PROXIMITY_EDGE_CLASS = 'flowdrop--edge--proximity-preview';
|
|
13
|
+
export class ProximityConnectHelper {
|
|
14
|
+
/**
|
|
15
|
+
* Get ALL ports (static + dynamic + gateway branches) for a node.
|
|
16
|
+
*/
|
|
17
|
+
static getAllPorts(node, direction) {
|
|
18
|
+
// Static ports from metadata
|
|
19
|
+
const staticPorts = direction === 'output'
|
|
20
|
+
? (node.data?.metadata?.outputs ?? [])
|
|
21
|
+
: (node.data?.metadata?.inputs ?? []);
|
|
22
|
+
// Dynamic ports from config
|
|
23
|
+
const dynamicKey = direction === 'output' ? 'dynamicOutputs' : 'dynamicInputs';
|
|
24
|
+
const rawDynamic = node.data?.config?.[dynamicKey] ?? [];
|
|
25
|
+
const dynamicPorts = rawDynamic.map((p) => dynamicPortToNodePort(p, direction));
|
|
26
|
+
// Gateway branches (output only, dataType = 'trigger')
|
|
27
|
+
if (direction === 'output') {
|
|
28
|
+
const branches = node.data?.config?.branches;
|
|
29
|
+
const nodeType = node.data?.metadata?.type || node.type;
|
|
30
|
+
if (nodeType === 'gateway' && branches?.length) {
|
|
31
|
+
const branchPorts = branches
|
|
32
|
+
.filter((b) => !staticPorts.some((sp) => sp.id === b.name))
|
|
33
|
+
.map((b) => ({
|
|
34
|
+
id: b.name,
|
|
35
|
+
name: b.name,
|
|
36
|
+
type: 'output',
|
|
37
|
+
dataType: 'trigger'
|
|
38
|
+
}));
|
|
39
|
+
return [...staticPorts, ...dynamicPorts, ...branchPorts];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return [...staticPorts, ...dynamicPorts];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build handle ID in the standard format.
|
|
46
|
+
*/
|
|
47
|
+
static buildHandleId(nodeId, direction, portId) {
|
|
48
|
+
return `${nodeId}-${direction}-${portId}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate center-to-center distance between two nodes.
|
|
52
|
+
*/
|
|
53
|
+
static getNodeDistance(nodeA, nodeB) {
|
|
54
|
+
const aCenterX = nodeA.position.x + (nodeA.measured?.width ?? 0) / 2;
|
|
55
|
+
const aCenterY = nodeA.position.y + (nodeA.measured?.height ?? 0) / 2;
|
|
56
|
+
const bCenterX = nodeB.position.x + (nodeB.measured?.width ?? 0) / 2;
|
|
57
|
+
const bCenterY = nodeB.position.y + (nodeB.measured?.height ?? 0) / 2;
|
|
58
|
+
const dx = aCenterX - bCenterX;
|
|
59
|
+
const dy = aCenterY - bCenterY;
|
|
60
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Find the single best compatible edge between a dragged node and nearby nodes.
|
|
64
|
+
*
|
|
65
|
+
* Algorithm:
|
|
66
|
+
* 1. Find the closest node within minDistance (edge-to-edge)
|
|
67
|
+
* 2. Check both directions (dragged->nearby and nearby->dragged)
|
|
68
|
+
* 3. Return the first exact-type match, or first compatible match
|
|
69
|
+
* 4. Skip pairs where an edge already exists
|
|
70
|
+
*
|
|
71
|
+
* @returns Array with at most ONE ProximityEdgeCandidate
|
|
72
|
+
*/
|
|
73
|
+
static findCompatibleEdges(draggedNode, allNodes, existingEdges, minDistance) {
|
|
74
|
+
const checker = getPortCompatibilityChecker();
|
|
75
|
+
// Build lookup set for O(1) duplicate checks
|
|
76
|
+
const existingEdgeSet = new Set(existingEdges.map((e) => `${e.source}:${e.sourceHandle}->${e.target}:${e.targetHandle}`));
|
|
77
|
+
// Find the closest node within distance
|
|
78
|
+
let closestNode = null;
|
|
79
|
+
let closestDistance = Infinity;
|
|
80
|
+
for (const node of allNodes) {
|
|
81
|
+
if (node.id === draggedNode.id)
|
|
82
|
+
continue;
|
|
83
|
+
const dist = this.getNodeDistance(draggedNode, node);
|
|
84
|
+
if (dist < minDistance && dist < closestDistance) {
|
|
85
|
+
closestDistance = dist;
|
|
86
|
+
closestNode = node;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!closestNode)
|
|
90
|
+
return [];
|
|
91
|
+
const draggedOutputs = this.getAllPorts(draggedNode, 'output');
|
|
92
|
+
const draggedInputs = this.getAllPorts(draggedNode, 'input');
|
|
93
|
+
const nearbyInputs = this.getAllPorts(closestNode, 'input');
|
|
94
|
+
const nearbyOutputs = this.getAllPorts(closestNode, 'output');
|
|
95
|
+
// Collect all compatible pairs, then pick the best one
|
|
96
|
+
let exactMatch = null;
|
|
97
|
+
let compatibleMatch = null;
|
|
98
|
+
// Direction A: dragged (source) -> nearby (target)
|
|
99
|
+
for (const outPort of draggedOutputs) {
|
|
100
|
+
for (const inPort of nearbyInputs) {
|
|
101
|
+
if (!checker.areDataTypesCompatible(outPort.dataType, inPort.dataType))
|
|
102
|
+
continue;
|
|
103
|
+
const sourceHandle = this.buildHandleId(draggedNode.id, 'output', outPort.id);
|
|
104
|
+
const targetHandle = this.buildHandleId(closestNode.id, 'input', inPort.id);
|
|
105
|
+
const edgeKey = `${draggedNode.id}:${sourceHandle}->${closestNode.id}:${targetHandle}`;
|
|
106
|
+
if (existingEdgeSet.has(edgeKey))
|
|
107
|
+
continue;
|
|
108
|
+
const candidate = {
|
|
109
|
+
id: `proximity-${uuidv4()}`,
|
|
110
|
+
source: draggedNode.id,
|
|
111
|
+
target: closestNode.id,
|
|
112
|
+
sourceHandle,
|
|
113
|
+
targetHandle,
|
|
114
|
+
sourcePortDataType: outPort.dataType,
|
|
115
|
+
targetPortDataType: inPort.dataType
|
|
116
|
+
};
|
|
117
|
+
if (outPort.dataType === inPort.dataType) {
|
|
118
|
+
if (!exactMatch)
|
|
119
|
+
exactMatch = candidate;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
if (!compatibleMatch)
|
|
123
|
+
compatibleMatch = candidate;
|
|
124
|
+
}
|
|
125
|
+
// Early exit if we found an exact match
|
|
126
|
+
if (exactMatch)
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
if (exactMatch)
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
// Direction B: nearby (source) -> dragged (target)
|
|
133
|
+
if (!exactMatch) {
|
|
134
|
+
for (const outPort of nearbyOutputs) {
|
|
135
|
+
for (const inPort of draggedInputs) {
|
|
136
|
+
if (!checker.areDataTypesCompatible(outPort.dataType, inPort.dataType))
|
|
137
|
+
continue;
|
|
138
|
+
const sourceHandle = this.buildHandleId(closestNode.id, 'output', outPort.id);
|
|
139
|
+
const targetHandle = this.buildHandleId(draggedNode.id, 'input', inPort.id);
|
|
140
|
+
const edgeKey = `${closestNode.id}:${sourceHandle}->${draggedNode.id}:${targetHandle}`;
|
|
141
|
+
if (existingEdgeSet.has(edgeKey))
|
|
142
|
+
continue;
|
|
143
|
+
const candidate = {
|
|
144
|
+
id: `proximity-${uuidv4()}`,
|
|
145
|
+
source: closestNode.id,
|
|
146
|
+
target: draggedNode.id,
|
|
147
|
+
sourceHandle,
|
|
148
|
+
targetHandle,
|
|
149
|
+
sourcePortDataType: outPort.dataType,
|
|
150
|
+
targetPortDataType: inPort.dataType
|
|
151
|
+
};
|
|
152
|
+
if (outPort.dataType === inPort.dataType) {
|
|
153
|
+
if (!exactMatch)
|
|
154
|
+
exactMatch = candidate;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
if (!compatibleMatch)
|
|
158
|
+
compatibleMatch = candidate;
|
|
159
|
+
}
|
|
160
|
+
if (exactMatch)
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
if (exactMatch)
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const best = exactMatch ?? compatibleMatch;
|
|
168
|
+
return best ? [best] : [];
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Find the single best compatible edge using port-to-port distance.
|
|
172
|
+
*
|
|
173
|
+
* Unlike findCompatibleEdges() which uses node center distance,
|
|
174
|
+
* this method compares actual handle positions from the port coordinate store.
|
|
175
|
+
* This is more accurate for large nodes or nodes with many ports.
|
|
176
|
+
*
|
|
177
|
+
* Algorithm:
|
|
178
|
+
* 1. Partition ports by owner (dragged vs other) and direction (input vs output)
|
|
179
|
+
* 2. Group other-node ports by dataType for O(1) lookup of compatible groups
|
|
180
|
+
* 3. For each dragged port, only iterate compatible dataType groups
|
|
181
|
+
* 4. Return the closest compatible pair (exact type match preferred)
|
|
182
|
+
*
|
|
183
|
+
* @returns Array with at most ONE ProximityEdgeCandidate
|
|
184
|
+
*/
|
|
185
|
+
static findCompatibleEdgesByPortCoordinates(draggedNodeId, portCoordinates, existingEdges, maxDistance) {
|
|
186
|
+
const checker = getPortCompatibilityChecker();
|
|
187
|
+
// Build lookup set for O(1) duplicate checks
|
|
188
|
+
const existingEdgeSet = new Set(existingEdges.map((e) => `${e.source}:${e.sourceHandle}->${e.target}:${e.targetHandle}`));
|
|
189
|
+
// Partition ports by owner and direction, group other-node ports by dataType
|
|
190
|
+
const draggedOutputs = [];
|
|
191
|
+
const draggedInputs = [];
|
|
192
|
+
const otherInputsByType = new Map();
|
|
193
|
+
const otherOutputsByType = new Map();
|
|
194
|
+
for (const coord of portCoordinates.values()) {
|
|
195
|
+
if (coord.nodeId === draggedNodeId) {
|
|
196
|
+
if (coord.direction === 'output')
|
|
197
|
+
draggedOutputs.push(coord);
|
|
198
|
+
else
|
|
199
|
+
draggedInputs.push(coord);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const groupMap = coord.direction === 'input' ? otherInputsByType : otherOutputsByType;
|
|
203
|
+
let group = groupMap.get(coord.dataType);
|
|
204
|
+
if (!group) {
|
|
205
|
+
group = [];
|
|
206
|
+
groupMap.set(coord.dataType, group);
|
|
207
|
+
}
|
|
208
|
+
group.push(coord);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
let bestCandidate = null;
|
|
212
|
+
let bestDistance = Infinity;
|
|
213
|
+
let bestIsExact = false;
|
|
214
|
+
const evaluatePair = (sourceCoord, targetCoord) => {
|
|
215
|
+
// Check for existing edge
|
|
216
|
+
const edgeKey = `${sourceCoord.nodeId}:${sourceCoord.handleId}->${targetCoord.nodeId}:${targetCoord.handleId}`;
|
|
217
|
+
if (existingEdgeSet.has(edgeKey))
|
|
218
|
+
return;
|
|
219
|
+
// Calculate port-to-port distance
|
|
220
|
+
const dx = sourceCoord.x - targetCoord.x;
|
|
221
|
+
const dy = sourceCoord.y - targetCoord.y;
|
|
222
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
223
|
+
if (dist > maxDistance)
|
|
224
|
+
return;
|
|
225
|
+
const isExact = sourceCoord.dataType === targetCoord.dataType;
|
|
226
|
+
// Prefer exact match, then closest distance
|
|
227
|
+
if ((isExact && !bestIsExact) || (isExact === bestIsExact && dist < bestDistance)) {
|
|
228
|
+
bestCandidate = {
|
|
229
|
+
id: `proximity-${uuidv4()}`,
|
|
230
|
+
source: sourceCoord.nodeId,
|
|
231
|
+
target: targetCoord.nodeId,
|
|
232
|
+
sourceHandle: sourceCoord.handleId,
|
|
233
|
+
targetHandle: targetCoord.handleId,
|
|
234
|
+
sourcePortDataType: sourceCoord.dataType,
|
|
235
|
+
targetPortDataType: targetCoord.dataType
|
|
236
|
+
};
|
|
237
|
+
bestDistance = dist;
|
|
238
|
+
bestIsExact = isExact;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
// Direction A: dragged outputs → other inputs (only compatible types)
|
|
242
|
+
for (const srcPort of draggedOutputs) {
|
|
243
|
+
const compatibleTypes = checker.getCompatibleTypes(srcPort.dataType);
|
|
244
|
+
for (const targetType of compatibleTypes) {
|
|
245
|
+
const targets = otherInputsByType.get(targetType);
|
|
246
|
+
if (!targets)
|
|
247
|
+
continue;
|
|
248
|
+
for (const tgtPort of targets) {
|
|
249
|
+
evaluatePair(srcPort, tgtPort);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Direction B: other outputs → dragged inputs (only compatible types)
|
|
254
|
+
for (const tgtPort of draggedInputs) {
|
|
255
|
+
for (const [srcType, sources] of otherOutputsByType) {
|
|
256
|
+
if (!checker.areDataTypesCompatible(srcType, tgtPort.dataType))
|
|
257
|
+
continue;
|
|
258
|
+
for (const srcPort of sources) {
|
|
259
|
+
evaluatePair(srcPort, tgtPort);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return bestCandidate ? [bestCandidate] : [];
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Convert candidates to temporary (preview) WorkflowEdge objects with dashed styling.
|
|
267
|
+
*/
|
|
268
|
+
static createPreviewEdges(candidates) {
|
|
269
|
+
return candidates.map((c) => ({
|
|
270
|
+
id: c.id,
|
|
271
|
+
source: c.source,
|
|
272
|
+
target: c.target,
|
|
273
|
+
sourceHandle: c.sourceHandle,
|
|
274
|
+
targetHandle: c.targetHandle,
|
|
275
|
+
class: PROXIMITY_EDGE_CLASS,
|
|
276
|
+
style: 'stroke-dasharray: 5 5; opacity: 0.6;',
|
|
277
|
+
animated: true,
|
|
278
|
+
selectable: false,
|
|
279
|
+
deletable: false,
|
|
280
|
+
data: {
|
|
281
|
+
metadata: {
|
|
282
|
+
edgeType: 'data',
|
|
283
|
+
sourcePortDataType: c.sourcePortDataType,
|
|
284
|
+
isProximityPreview: true
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Convert candidates to permanent WorkflowEdge objects.
|
|
291
|
+
*/
|
|
292
|
+
static createPermanentEdges(candidates) {
|
|
293
|
+
return candidates.map((c) => ({
|
|
294
|
+
id: uuidv4(),
|
|
295
|
+
source: c.source,
|
|
296
|
+
target: c.target,
|
|
297
|
+
sourceHandle: c.sourceHandle,
|
|
298
|
+
targetHandle: c.targetHandle
|
|
299
|
+
}));
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Check if an edge is a temporary proximity preview edge.
|
|
303
|
+
*/
|
|
304
|
+
static isProximityPreviewEdge(edge) {
|
|
305
|
+
return (edge.id.startsWith('proximity-') ||
|
|
306
|
+
edge.data?.metadata?.isProximityPreview === true);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Remove all proximity preview edges from an edge array.
|
|
310
|
+
*/
|
|
311
|
+
static removePreviewEdges(edges) {
|
|
312
|
+
return edges.filter((e) => !this.isProximityPreviewEdge(e));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Editor Helper
|
|
3
|
+
* Contains business logic for workflow operations
|
|
4
|
+
*/
|
|
5
|
+
import type { WorkflowNode as WorkflowNodeType, NodeMetadata, Workflow, WorkflowEdge, NodeExecutionInfo } from '../types/index.js';
|
|
6
|
+
import type { EndpointConfig } from '../config/endpoints.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate a unique node ID based on node type and existing nodes
|
|
9
|
+
* Format: <node_type>.<number>
|
|
10
|
+
* Example: boolean_gateway.1, calculator.2
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateNodeId(nodeTypeId: string, existingNodes: WorkflowNodeType[]): string;
|
|
13
|
+
/**
|
|
14
|
+
* Edge category type for styling purposes
|
|
15
|
+
* - trigger: For control flow connections (dataType: "trigger")
|
|
16
|
+
* - tool: Dashed amber line for tool connections (dataType: "tool")
|
|
17
|
+
* - loopback: Dashed gray line for loop iteration connections (targets loop_back port)
|
|
18
|
+
* - data: Normal gray line for all other data connections
|
|
19
|
+
*/
|
|
20
|
+
export type EdgeCategory = 'trigger' | 'tool' | 'loopback' | 'data';
|
|
21
|
+
/**
|
|
22
|
+
* Edge styling configuration based on source port data type
|
|
23
|
+
*/
|
|
24
|
+
export declare class EdgeStylingHelper {
|
|
25
|
+
/**
|
|
26
|
+
* Extract the port ID from a handle ID
|
|
27
|
+
* @param handleId - The handle ID string (e.g., "sample-node.1-output-trigger" or "trigger")
|
|
28
|
+
* @returns The port ID (e.g., "trigger") or the handleId itself for short format
|
|
29
|
+
*/
|
|
30
|
+
static extractPortIdFromHandle(handleId: string | undefined): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a port ID matches a dynamic branch in a Gateway node
|
|
33
|
+
* Gateway nodes store branches in config.branches array
|
|
34
|
+
* @param node - The workflow node to check
|
|
35
|
+
* @param portId - The port ID to look up
|
|
36
|
+
* @returns true if the portId matches a gateway branch
|
|
37
|
+
*/
|
|
38
|
+
static isGatewayBranch(node: WorkflowNodeType, portId: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Get the data type of a port from a node's metadata
|
|
41
|
+
* Also handles dynamic ports like Gateway branches
|
|
42
|
+
* @param node - The workflow node containing the port
|
|
43
|
+
* @param portId - The port ID to look up
|
|
44
|
+
* @param portType - Whether to look in "inputs" or "outputs"
|
|
45
|
+
* @returns The port's dataType or null if not found
|
|
46
|
+
*/
|
|
47
|
+
static getPortDataType(node: WorkflowNodeType, portId: string, portType: 'input' | 'output'): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Determine the edge category based on source port data type
|
|
50
|
+
* Note: This method does not check for loopback edges.
|
|
51
|
+
* Use getEdgeCategoryWithLoopback() for full edge categorization.
|
|
52
|
+
*
|
|
53
|
+
* @param sourcePortDataType - The data type of the source output port
|
|
54
|
+
* @returns The edge category for styling
|
|
55
|
+
*/
|
|
56
|
+
static getEdgeCategory(sourcePortDataType: string | null): EdgeCategory;
|
|
57
|
+
/**
|
|
58
|
+
* Determine the full edge category including loopback detection
|
|
59
|
+
* Loopback edges take precedence over source port data type
|
|
60
|
+
*
|
|
61
|
+
* @param edge - The edge to categorize
|
|
62
|
+
* @param sourcePortDataType - The data type of the source output port
|
|
63
|
+
* @returns The edge category for styling
|
|
64
|
+
*/
|
|
65
|
+
static getEdgeCategoryWithLoopback(edge: WorkflowEdge, sourcePortDataType: string | null): EdgeCategory;
|
|
66
|
+
/**
|
|
67
|
+
* Apply custom styling to connection edges based on edge type:
|
|
68
|
+
* - Loopback: Dashed gray line for loop iteration (targets loop_back port)
|
|
69
|
+
* - Trigger ports: Solid black line with arrow
|
|
70
|
+
* - Tool ports: Dashed amber line with arrow
|
|
71
|
+
* - Data ports: Normal gray line with arrow
|
|
72
|
+
*/
|
|
73
|
+
static applyConnectionStyling(edge: WorkflowEdge, sourceNode: WorkflowNodeType, targetNode: WorkflowNodeType): void;
|
|
74
|
+
/**
|
|
75
|
+
* Update existing edges with custom styling rules
|
|
76
|
+
*/
|
|
77
|
+
static updateEdgeStyles(edges: WorkflowEdge[], nodes: WorkflowNodeType[]): WorkflowEdge[];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Node operations helper
|
|
81
|
+
*/
|
|
82
|
+
export declare class NodeOperationsHelper {
|
|
83
|
+
/**
|
|
84
|
+
* Load nodes from API
|
|
85
|
+
*/
|
|
86
|
+
static loadNodesFromApi(providedNodes?: NodeMetadata[]): Promise<NodeMetadata[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Load node execution information for all nodes in the workflow
|
|
89
|
+
*/
|
|
90
|
+
static loadNodeExecutionInfo(workflow: Workflow | null, pipelineId?: string): Promise<Record<string, NodeExecutionInfo>>;
|
|
91
|
+
/**
|
|
92
|
+
* Create a new node from dropped data
|
|
93
|
+
*/
|
|
94
|
+
static createNodeFromDrop(nodeTypeData: string, position: {
|
|
95
|
+
x: number;
|
|
96
|
+
y: number;
|
|
97
|
+
}, existingNodes?: WorkflowNodeType[]): WorkflowNodeType | null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Workflow operations helper
|
|
101
|
+
*/
|
|
102
|
+
export declare class WorkflowOperationsHelper {
|
|
103
|
+
/**
|
|
104
|
+
* Generate workflow metadata for updates
|
|
105
|
+
*/
|
|
106
|
+
static generateMetadata(existingMetadata?: Workflow['metadata']): Workflow['metadata'];
|
|
107
|
+
/**
|
|
108
|
+
* Update workflow with new nodes/edges and generate new metadata
|
|
109
|
+
*/
|
|
110
|
+
static updateWorkflow(workflow: Workflow, nodes: WorkflowNodeType[], edges: WorkflowEdge[]): Workflow;
|
|
111
|
+
/**
|
|
112
|
+
* Clear workflow (remove all nodes and edges)
|
|
113
|
+
*/
|
|
114
|
+
static clearWorkflow(workflow: Workflow): Workflow;
|
|
115
|
+
/**
|
|
116
|
+
* Update node configuration
|
|
117
|
+
*/
|
|
118
|
+
static updateNodeConfig(workflow: Workflow, nodeId: string, newConfig: Record<string, unknown>): Workflow;
|
|
119
|
+
/**
|
|
120
|
+
* Add a new node to the workflow
|
|
121
|
+
*/
|
|
122
|
+
static addNode(workflow: Workflow, node: WorkflowNodeType): Workflow;
|
|
123
|
+
/**
|
|
124
|
+
* Save workflow to backend
|
|
125
|
+
*/
|
|
126
|
+
static saveWorkflow(workflow: Workflow | null): Promise<Workflow | null>;
|
|
127
|
+
/**
|
|
128
|
+
* Export workflow as JSON file
|
|
129
|
+
*/
|
|
130
|
+
static exportWorkflow(workflow: Workflow | null): void;
|
|
131
|
+
/**
|
|
132
|
+
* Export workflow as Agent Spec JSON file.
|
|
133
|
+
*
|
|
134
|
+
* Converts the FlowDrop workflow to Agent Spec format and triggers a download.
|
|
135
|
+
* Validates the workflow for Agent Spec compatibility first.
|
|
136
|
+
*
|
|
137
|
+
* @param workflow - The FlowDrop workflow to export
|
|
138
|
+
* @returns Validation result (check .valid before assuming success)
|
|
139
|
+
*/
|
|
140
|
+
static exportAsAgentSpec(workflow: Workflow | null): {
|
|
141
|
+
valid: boolean;
|
|
142
|
+
errors: string[];
|
|
143
|
+
warnings: string[];
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Import a workflow from an Agent Spec JSON or YAML file.
|
|
147
|
+
*
|
|
148
|
+
* Reads the file, detects format, converts to FlowDrop format,
|
|
149
|
+
* and returns a Workflow ready for the editor.
|
|
150
|
+
*
|
|
151
|
+
* @param file - The file to import (JSON or YAML)
|
|
152
|
+
* @returns Promise resolving to the imported FlowDrop Workflow
|
|
153
|
+
*/
|
|
154
|
+
static importFromAgentSpec(file: File): Promise<Workflow>;
|
|
155
|
+
/**
|
|
156
|
+
* Check if workflow has invalid cycles (excludes valid loopback cycles)
|
|
157
|
+
* Valid loopback cycles are used for ForEach node iteration and should not
|
|
158
|
+
* trigger a warning.
|
|
159
|
+
*
|
|
160
|
+
* @param nodes - Array of workflow nodes
|
|
161
|
+
* @param edges - Array of workflow edges
|
|
162
|
+
* @returns True if there are invalid (non-loopback) cycles
|
|
163
|
+
*/
|
|
164
|
+
static checkWorkflowCycles(nodes: WorkflowNodeType[], edges: WorkflowEdge[]): boolean;
|
|
165
|
+
/**
|
|
166
|
+
* Check if workflow has any cycles (including valid loopback cycles)
|
|
167
|
+
* Use this when you need to detect ALL cycles regardless of type.
|
|
168
|
+
*
|
|
169
|
+
* @param nodes - Array of workflow nodes
|
|
170
|
+
* @param edges - Array of workflow edges
|
|
171
|
+
* @returns True if any cycle exists
|
|
172
|
+
*/
|
|
173
|
+
static checkWorkflowHasAnyCycles(nodes: WorkflowNodeType[], edges: WorkflowEdge[]): boolean;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Configuration helper
|
|
177
|
+
*/
|
|
178
|
+
export declare class ConfigurationHelper {
|
|
179
|
+
/**
|
|
180
|
+
* Configure API endpoints
|
|
181
|
+
*/
|
|
182
|
+
static configureEndpoints(config: EndpointConfig): void;
|
|
183
|
+
}
|