@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,690 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Terminal Node Component
|
|
3
|
+
A circular node for workflow terminal points (start, end, exit/abort)
|
|
4
|
+
Configurable via metadata to display different variants:
|
|
5
|
+
- start: Green with play icon, output-only
|
|
6
|
+
- end: Gray with stop icon, input-only
|
|
7
|
+
- exit: Red with X icon, input-only (for abort/error exits)
|
|
8
|
+
Styled with BEM syntax
|
|
9
|
+
-->
|
|
10
|
+
|
|
11
|
+
<script lang="ts">
|
|
12
|
+
import { Position, Handle } from '@xyflow/svelte';
|
|
13
|
+
import type { ConfigValues, NodeMetadata, NodeExtensions, NodePort } from '../../types/index.js';
|
|
14
|
+
import Icon from '@iconify/svelte';
|
|
15
|
+
import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors.js';
|
|
16
|
+
import { getNodeIcon } from '../../utils/icons.js';
|
|
17
|
+
import { getCircleHandlePosition } from '../../utils/handlePositioning.js';
|
|
18
|
+
import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Terminal node variant types
|
|
22
|
+
*/
|
|
23
|
+
type TerminalVariant = 'start' | 'end' | 'exit';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Configuration for each terminal variant
|
|
27
|
+
*/
|
|
28
|
+
interface VariantConfig {
|
|
29
|
+
/** Default icon for this variant */
|
|
30
|
+
icon: string;
|
|
31
|
+
/** Default color for this variant */
|
|
32
|
+
color: string;
|
|
33
|
+
/** Default label for this variant */
|
|
34
|
+
label: string;
|
|
35
|
+
/** Whether this variant has input handles */
|
|
36
|
+
hasInputs: boolean;
|
|
37
|
+
/** Whether this variant has output handles */
|
|
38
|
+
hasOutputs: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Variant configurations mapping
|
|
43
|
+
*/
|
|
44
|
+
const VARIANT_CONFIGS: Record<TerminalVariant, VariantConfig> = {
|
|
45
|
+
start: {
|
|
46
|
+
icon: 'mdi:play-circle',
|
|
47
|
+
color: 'var(--fd-node-emerald)',
|
|
48
|
+
label: 'Start',
|
|
49
|
+
hasInputs: false,
|
|
50
|
+
hasOutputs: true
|
|
51
|
+
},
|
|
52
|
+
end: {
|
|
53
|
+
icon: 'mdi:stop-circle',
|
|
54
|
+
color: 'var(--fd-node-slate)',
|
|
55
|
+
label: 'End',
|
|
56
|
+
hasInputs: true,
|
|
57
|
+
hasOutputs: false
|
|
58
|
+
},
|
|
59
|
+
exit: {
|
|
60
|
+
icon: 'mdi:close-circle',
|
|
61
|
+
color: 'var(--fd-node-red)',
|
|
62
|
+
label: 'Exit',
|
|
63
|
+
hasInputs: true,
|
|
64
|
+
hasOutputs: false
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const props = $props<{
|
|
69
|
+
data: {
|
|
70
|
+
label: string;
|
|
71
|
+
config: ConfigValues;
|
|
72
|
+
metadata: NodeMetadata;
|
|
73
|
+
nodeId?: string;
|
|
74
|
+
extensions?: NodeExtensions;
|
|
75
|
+
onConfigOpen?: (node: {
|
|
76
|
+
id: string;
|
|
77
|
+
type: string;
|
|
78
|
+
data: { label: string; config: ConfigValues; metadata: NodeMetadata };
|
|
79
|
+
}) => void;
|
|
80
|
+
};
|
|
81
|
+
selected?: boolean;
|
|
82
|
+
isProcessing?: boolean;
|
|
83
|
+
isError?: boolean;
|
|
84
|
+
}>();
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Determine terminal variant from config or metadata
|
|
88
|
+
* Priority: config.variant > metadata tag detection > default to "start"
|
|
89
|
+
*/
|
|
90
|
+
function getVariant(): TerminalVariant {
|
|
91
|
+
// Check config first
|
|
92
|
+
const configVariant = props.data.config?.variant as string | undefined;
|
|
93
|
+
if (configVariant && configVariant in VARIANT_CONFIGS) {
|
|
94
|
+
return configVariant as TerminalVariant;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Check metadata tags for variant hints
|
|
98
|
+
const tags = props.data.metadata?.tags || [];
|
|
99
|
+
if (tags.includes('start') || tags.includes('entry')) {
|
|
100
|
+
return 'start';
|
|
101
|
+
}
|
|
102
|
+
if (tags.includes('exit') || tags.includes('abort') || tags.includes('error')) {
|
|
103
|
+
return 'exit';
|
|
104
|
+
}
|
|
105
|
+
if (tags.includes('end') || tags.includes('finish') || tags.includes('complete')) {
|
|
106
|
+
return 'end';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Check metadata id/name for hints
|
|
110
|
+
const idLower = (props.data.metadata?.id || '').toLowerCase();
|
|
111
|
+
const nameLower = (props.data.metadata?.name || '').toLowerCase();
|
|
112
|
+
if (idLower.includes('start') || nameLower.includes('start')) {
|
|
113
|
+
return 'start';
|
|
114
|
+
}
|
|
115
|
+
if (
|
|
116
|
+
idLower.includes('exit') ||
|
|
117
|
+
idLower.includes('abort') ||
|
|
118
|
+
nameLower.includes('exit') ||
|
|
119
|
+
nameLower.includes('abort')
|
|
120
|
+
) {
|
|
121
|
+
return 'exit';
|
|
122
|
+
}
|
|
123
|
+
if (idLower.includes('end') || nameLower.includes('end')) {
|
|
124
|
+
return 'end';
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Default to start
|
|
128
|
+
return 'start';
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let variant = $derived(getVariant());
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Get current variant configuration
|
|
135
|
+
*/
|
|
136
|
+
let variantConfig = $derived(VARIANT_CONFIGS[variant]);
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Get the hideUnconnectedHandles setting from extensions
|
|
140
|
+
* Merges node type defaults with instance overrides
|
|
141
|
+
*/
|
|
142
|
+
const hideUnconnectedHandles = $derived(() => {
|
|
143
|
+
const typeDefault = props.data.metadata?.extensions?.ui?.hideUnconnectedHandles ?? false;
|
|
144
|
+
const instanceOverride = props.data.extensions?.ui?.hideUnconnectedHandles;
|
|
145
|
+
return instanceOverride ?? typeDefault;
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Check if a port should be visible based on connection state and settings
|
|
150
|
+
*/
|
|
151
|
+
function isPortVisible(port: NodePort, type: 'input' | 'output'): boolean {
|
|
152
|
+
if (!hideUnconnectedHandles()) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
if (port.required) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
const handleId = `${props.data.nodeId}-${type}-${port.id}`;
|
|
159
|
+
return getConnectedHandles().has(handleId);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Get icon using the same resolution as WorkflowNode
|
|
164
|
+
* Uses getNodeIcon utility with category fallback, or variant default
|
|
165
|
+
*/
|
|
166
|
+
let terminalIcon = $derived(
|
|
167
|
+
props.data.metadata?.icon
|
|
168
|
+
? getNodeIcon(props.data.metadata.icon, props.data.metadata?.category)
|
|
169
|
+
: variantConfig.icon
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Get color using category-based color tokens for consistency
|
|
174
|
+
* Falls back to variant default color if category not available
|
|
175
|
+
*/
|
|
176
|
+
let terminalColor = $derived(
|
|
177
|
+
props.data.metadata?.category
|
|
178
|
+
? getCategoryColorToken(props.data.metadata.category)
|
|
179
|
+
: variantConfig.color
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Instance-specific title override from config.
|
|
184
|
+
* Falls back to the original label if not set.
|
|
185
|
+
* This allows users to customize the node title per-instance via config.
|
|
186
|
+
*/
|
|
187
|
+
const displayTitle = $derived(
|
|
188
|
+
(props.data.config?.instanceTitle as string) ||
|
|
189
|
+
props.data.label ||
|
|
190
|
+
props.data.metadata?.name ||
|
|
191
|
+
variantConfig.label
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Instance-specific description override from config.
|
|
196
|
+
* Falls back to the metadata description if not set.
|
|
197
|
+
* This allows users to customize the node description per-instance via config.
|
|
198
|
+
*/
|
|
199
|
+
const displayDescription = $derived(
|
|
200
|
+
(props.data.config?.instanceDescription as string) || props.data.metadata?.description || ''
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Check if metadata explicitly defines inputs (including empty array)
|
|
205
|
+
* This allows API to control ports:
|
|
206
|
+
* - undefined: use variant default
|
|
207
|
+
* - []: explicitly no inputs
|
|
208
|
+
* - [{...}]: use these inputs
|
|
209
|
+
*/
|
|
210
|
+
let hasExplicitInputs = $derived(Array.isArray(props.data.metadata?.inputs));
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Check if metadata explicitly defines outputs (including empty array)
|
|
214
|
+
*/
|
|
215
|
+
let hasExplicitOutputs = $derived(Array.isArray(props.data.metadata?.outputs));
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Default trigger input port for end/exit nodes
|
|
219
|
+
*/
|
|
220
|
+
const DEFAULT_INPUT_PORT = {
|
|
221
|
+
id: 'trigger',
|
|
222
|
+
name: 'Trigger',
|
|
223
|
+
type: 'input' as const,
|
|
224
|
+
dataType: 'trigger',
|
|
225
|
+
description: 'Workflow trigger input'
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Default trigger output port for start nodes
|
|
230
|
+
*/
|
|
231
|
+
const DEFAULT_OUTPUT_PORT = {
|
|
232
|
+
id: 'trigger',
|
|
233
|
+
name: 'Trigger',
|
|
234
|
+
type: 'output' as const,
|
|
235
|
+
dataType: 'trigger',
|
|
236
|
+
description: 'Workflow trigger output'
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get input ports from metadata or create default trigger input
|
|
241
|
+
* Priority:
|
|
242
|
+
* 1. If metadata.inputs is defined (even empty array), use it exactly
|
|
243
|
+
* 2. Otherwise, use variant default (trigger port for end/exit)
|
|
244
|
+
*/
|
|
245
|
+
let inputPorts = $derived(
|
|
246
|
+
hasExplicitInputs
|
|
247
|
+
? props.data.metadata.inputs
|
|
248
|
+
: variantConfig.hasInputs
|
|
249
|
+
? [DEFAULT_INPUT_PORT]
|
|
250
|
+
: []
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Get output ports from metadata or create default trigger output
|
|
255
|
+
* Priority:
|
|
256
|
+
* 1. If metadata.outputs is defined (even empty array), use it exactly
|
|
257
|
+
* 2. Otherwise, use variant default (trigger port for start)
|
|
258
|
+
*/
|
|
259
|
+
let outputPorts = $derived(
|
|
260
|
+
hasExplicitOutputs
|
|
261
|
+
? props.data.metadata.outputs
|
|
262
|
+
: variantConfig.hasOutputs
|
|
263
|
+
? [DEFAULT_OUTPUT_PORT]
|
|
264
|
+
: []
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Visible input ports filtered by hideUnconnectedHandles setting
|
|
269
|
+
*/
|
|
270
|
+
let visibleInputPorts = $derived(
|
|
271
|
+
inputPorts.filter((port: NodePort) => isPortVisible(port, 'input'))
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Visible output ports filtered by hideUnconnectedHandles setting
|
|
276
|
+
*/
|
|
277
|
+
let visibleOutputPorts = $derived(
|
|
278
|
+
outputPorts.filter((port: NodePort) => isPortVisible(port, 'output'))
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Determine if we should show inputs based on visible ports
|
|
283
|
+
*/
|
|
284
|
+
let showInputs = $derived(visibleInputPorts.length > 0);
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Determine if we should show outputs based on visible ports
|
|
288
|
+
*/
|
|
289
|
+
let showOutputs = $derived(visibleOutputPorts.length > 0);
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Handle configuration sidebar - using global ConfigSidebar
|
|
293
|
+
*/
|
|
294
|
+
function openConfigSidebar(): void {
|
|
295
|
+
if (props.data.onConfigOpen) {
|
|
296
|
+
const nodeForConfig = {
|
|
297
|
+
id: props.data.nodeId || 'unknown',
|
|
298
|
+
type: 'terminal',
|
|
299
|
+
data: props.data
|
|
300
|
+
};
|
|
301
|
+
props.data.onConfigOpen(nodeForConfig);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Handle double-click to open config
|
|
307
|
+
*/
|
|
308
|
+
function handleDoubleClick(): void {
|
|
309
|
+
openConfigSidebar();
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Handle single click - only handle selection
|
|
314
|
+
*/
|
|
315
|
+
function handleClick(): void {
|
|
316
|
+
// Node selection is handled by Svelte Flow
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Handle keyboard events for accessibility
|
|
321
|
+
*/
|
|
322
|
+
function handleKeydown(event: KeyboardEvent): void {
|
|
323
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
324
|
+
event.preventDefault();
|
|
325
|
+
handleDoubleClick();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
</script>
|
|
329
|
+
|
|
330
|
+
<!-- Terminal Node -->
|
|
331
|
+
<div
|
|
332
|
+
class="flowdrop-terminal-node"
|
|
333
|
+
class:flowdrop-terminal-node--selected={props.selected}
|
|
334
|
+
class:flowdrop-terminal-node--processing={props.isProcessing}
|
|
335
|
+
class:flowdrop-terminal-node--error={props.isError}
|
|
336
|
+
class:flowdrop-terminal-node--start={variant === 'start'}
|
|
337
|
+
class:flowdrop-terminal-node--end={variant === 'end'}
|
|
338
|
+
class:flowdrop-terminal-node--exit={variant === 'exit'}
|
|
339
|
+
style="--terminal-color: {terminalColor};"
|
|
340
|
+
onclick={handleClick}
|
|
341
|
+
ondblclick={handleDoubleClick}
|
|
342
|
+
onkeydown={handleKeydown}
|
|
343
|
+
role="button"
|
|
344
|
+
tabindex="0"
|
|
345
|
+
aria-label="{variant} node: {displayTitle}"
|
|
346
|
+
>
|
|
347
|
+
<!-- Config button at top -->
|
|
348
|
+
<button
|
|
349
|
+
class="flowdrop-terminal-node__config-btn"
|
|
350
|
+
onclick={openConfigSidebar}
|
|
351
|
+
title="Configure node"
|
|
352
|
+
>
|
|
353
|
+
<Icon icon="mdi:cog" />
|
|
354
|
+
</button>
|
|
355
|
+
|
|
356
|
+
<!-- Circle wrapper for proper handle positioning -->
|
|
357
|
+
<div class="flowdrop-terminal-node__circle-wrapper">
|
|
358
|
+
<!-- Input Handles (for end/exit variants) -->
|
|
359
|
+
{#if showInputs}
|
|
360
|
+
{#each visibleInputPorts as port, index (`${port.id}-${visibleInputPorts.length}`)}
|
|
361
|
+
{@const pos = getCircleHandlePosition(index, visibleInputPorts.length, 'left')}
|
|
362
|
+
<Handle
|
|
363
|
+
type="target"
|
|
364
|
+
position={Position.Left}
|
|
365
|
+
style="--fd-handle-fill: {getDataTypeColor(
|
|
366
|
+
port.dataType
|
|
367
|
+
)}; --fd-handle-border-color: var(--fd-handle-border); left: {pos.left}px; top: {pos.top}px; transform: translate(-50%, -50%); z-index: 30;"
|
|
368
|
+
id={`${props.data.nodeId}-input-${port.id}`}
|
|
369
|
+
/>
|
|
370
|
+
{/each}
|
|
371
|
+
{/if}
|
|
372
|
+
|
|
373
|
+
<!-- Circular content with icon in squircle wrapper -->
|
|
374
|
+
<div class="flowdrop-terminal-node__content">
|
|
375
|
+
<div class="flowdrop-terminal-node__icon-wrapper" style="--_icon-color: {terminalColor}">
|
|
376
|
+
<Icon icon={terminalIcon} class="flowdrop-terminal-node__icon" />
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
|
|
380
|
+
<!-- Output Handles (for start variant) -->
|
|
381
|
+
{#if showOutputs}
|
|
382
|
+
{#each visibleOutputPorts as port, index (`${port.id}-${visibleOutputPorts.length}`)}
|
|
383
|
+
{@const pos = getCircleHandlePosition(index, visibleOutputPorts.length, 'right')}
|
|
384
|
+
<Handle
|
|
385
|
+
type="source"
|
|
386
|
+
position={Position.Right}
|
|
387
|
+
id={`${props.data.nodeId}-output-${port.id}`}
|
|
388
|
+
style="--fd-handle-fill: {getDataTypeColor(
|
|
389
|
+
port.dataType
|
|
390
|
+
)}; --fd-handle-border-color: var(--fd-handle-border); left: {pos.left}px; top: {pos.top}px; transform: translate(-50%, -50%); z-index: 30;"
|
|
391
|
+
/>
|
|
392
|
+
{/each}
|
|
393
|
+
{/if}
|
|
394
|
+
</div>
|
|
395
|
+
|
|
396
|
+
<!-- Label and description below the circle -->
|
|
397
|
+
<div class="flowdrop-terminal-node__label-container">
|
|
398
|
+
<div class="flowdrop-terminal-node__label">
|
|
399
|
+
{displayTitle}
|
|
400
|
+
</div>
|
|
401
|
+
{#if displayDescription}
|
|
402
|
+
<div class="flowdrop-terminal-node__description">
|
|
403
|
+
{displayDescription}
|
|
404
|
+
</div>
|
|
405
|
+
{/if}
|
|
406
|
+
</div>
|
|
407
|
+
|
|
408
|
+
<!-- Processing indicator -->
|
|
409
|
+
{#if props.isProcessing}
|
|
410
|
+
<div class="flowdrop-terminal-node__processing">
|
|
411
|
+
<div class="flowdrop-terminal-node__spinner"></div>
|
|
412
|
+
</div>
|
|
413
|
+
{/if}
|
|
414
|
+
|
|
415
|
+
<!-- Error indicator -->
|
|
416
|
+
{#if props.isError}
|
|
417
|
+
<div class="flowdrop-terminal-node__error">
|
|
418
|
+
<Icon icon="mdi:alert-circle" class="flowdrop-terminal-node__error-icon" />
|
|
419
|
+
</div>
|
|
420
|
+
{/if}
|
|
421
|
+
</div>
|
|
422
|
+
|
|
423
|
+
<style>
|
|
424
|
+
.flowdrop-terminal-node {
|
|
425
|
+
position: relative;
|
|
426
|
+
display: flex;
|
|
427
|
+
flex-direction: column;
|
|
428
|
+
align-items: center;
|
|
429
|
+
gap: var(--fd-space-xs);
|
|
430
|
+
cursor: pointer;
|
|
431
|
+
transition: all var(--fd-transition-normal);
|
|
432
|
+
z-index: 10;
|
|
433
|
+
color: var(--fd-foreground);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/* Wrapper for circle and handles - ensures handles are vertically centered to circle */
|
|
437
|
+
.flowdrop-terminal-node__circle-wrapper {
|
|
438
|
+
position: relative;
|
|
439
|
+
display: flex;
|
|
440
|
+
align-items: center;
|
|
441
|
+
justify-content: center;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.flowdrop-terminal-node__content {
|
|
445
|
+
width: var(--fd-node-terminal-size);
|
|
446
|
+
height: var(--fd-node-terminal-size);
|
|
447
|
+
background-color: var(--fd-background);
|
|
448
|
+
border: 3px solid var(--terminal-color, var(--fd-muted-foreground));
|
|
449
|
+
border-radius: 50%;
|
|
450
|
+
display: flex;
|
|
451
|
+
align-items: center;
|
|
452
|
+
justify-content: center;
|
|
453
|
+
box-shadow: var(--fd-shadow-md);
|
|
454
|
+
transition: all var(--fd-transition-normal);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.flowdrop-terminal-node:hover .flowdrop-terminal-node__content {
|
|
458
|
+
box-shadow: var(--fd-shadow-lg);
|
|
459
|
+
transform: scale(1.05);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
.flowdrop-terminal-node--selected .flowdrop-terminal-node__content {
|
|
463
|
+
box-shadow:
|
|
464
|
+
var(--fd-shadow-lg),
|
|
465
|
+
0 0 0 3px color-mix(in srgb, var(--fd-primary) 50%, transparent);
|
|
466
|
+
border-color: var(--fd-primary);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.flowdrop-terminal-node--selected:hover .flowdrop-terminal-node__content {
|
|
470
|
+
box-shadow:
|
|
471
|
+
var(--fd-shadow-lg),
|
|
472
|
+
0 0 0 3px color-mix(in srgb, var(--fd-primary) 50%, transparent);
|
|
473
|
+
border-color: var(--fd-primary);
|
|
474
|
+
transform: scale(1.05);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.flowdrop-terminal-node:focus-visible .flowdrop-terminal-node__content {
|
|
478
|
+
outline: 2px solid var(--fd-ring);
|
|
479
|
+
outline-offset: 2px;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.flowdrop-terminal-node--processing .flowdrop-terminal-node__content {
|
|
483
|
+
opacity: 0.7;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.flowdrop-terminal-node--error .flowdrop-terminal-node__content {
|
|
487
|
+
border-color: var(--fd-error) !important;
|
|
488
|
+
background-color: var(--fd-error-muted) !important;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/* Variant-specific glow effects */
|
|
492
|
+
.flowdrop-terminal-node--start .flowdrop-terminal-node__content {
|
|
493
|
+
box-shadow:
|
|
494
|
+
0 4px 6px -1px color-mix(in srgb, var(--fd-success) 20%, transparent),
|
|
495
|
+
0 2px 4px -1px color-mix(in srgb, var(--fd-success) 10%, transparent);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
.flowdrop-terminal-node--start:hover .flowdrop-terminal-node__content {
|
|
499
|
+
box-shadow:
|
|
500
|
+
0 10px 15px -3px color-mix(in srgb, var(--fd-success) 30%, transparent),
|
|
501
|
+
0 4px 6px -2px color-mix(in srgb, var(--fd-success) 15%, transparent);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.flowdrop-terminal-node--start.flowdrop-terminal-node--selected:hover
|
|
505
|
+
.flowdrop-terminal-node__content {
|
|
506
|
+
box-shadow:
|
|
507
|
+
0 10px 15px -3px color-mix(in srgb, var(--fd-success) 30%, transparent),
|
|
508
|
+
0 4px 6px -2px color-mix(in srgb, var(--fd-success) 15%, transparent),
|
|
509
|
+
0 0 0 3px color-mix(in srgb, var(--fd-primary) 50%, transparent);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
.flowdrop-terminal-node--exit .flowdrop-terminal-node__content {
|
|
513
|
+
box-shadow:
|
|
514
|
+
0 4px 6px -1px color-mix(in srgb, var(--fd-error) 20%, transparent),
|
|
515
|
+
0 2px 4px -1px color-mix(in srgb, var(--fd-error) 10%, transparent);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
.flowdrop-terminal-node--exit:hover .flowdrop-terminal-node__content {
|
|
519
|
+
box-shadow:
|
|
520
|
+
0 10px 15px -3px color-mix(in srgb, var(--fd-error) 30%, transparent),
|
|
521
|
+
0 4px 6px -2px color-mix(in srgb, var(--fd-error) 15%, transparent);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.flowdrop-terminal-node--exit.flowdrop-terminal-node--selected:hover
|
|
525
|
+
.flowdrop-terminal-node__content {
|
|
526
|
+
box-shadow:
|
|
527
|
+
0 10px 15px -3px color-mix(in srgb, var(--fd-error) 30%, transparent),
|
|
528
|
+
0 4px 6px -2px color-mix(in srgb, var(--fd-error) 15%, transparent),
|
|
529
|
+
0 0 0 3px color-mix(in srgb, var(--fd-primary) 50%, transparent);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/* Squircle icon wrapper - matching WorkflowNode style */
|
|
533
|
+
.flowdrop-terminal-node__icon-wrapper {
|
|
534
|
+
display: flex;
|
|
535
|
+
align-items: center;
|
|
536
|
+
justify-content: center;
|
|
537
|
+
width: 2.75rem;
|
|
538
|
+
height: 2.75rem;
|
|
539
|
+
border-radius: 0.625rem;
|
|
540
|
+
background: color-mix(in srgb, var(--_icon-color) var(--fd-node-icon-bg-opacity), transparent);
|
|
541
|
+
flex-shrink: 0;
|
|
542
|
+
transition: all var(--fd-transition-normal);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.flowdrop-terminal-node:hover .flowdrop-terminal-node__icon-wrapper {
|
|
546
|
+
background: color-mix(
|
|
547
|
+
in srgb,
|
|
548
|
+
var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
|
|
549
|
+
transparent
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
.flowdrop-terminal-node__icon-wrapper :global(.flowdrop-terminal-node__icon) {
|
|
554
|
+
width: 1.5rem;
|
|
555
|
+
height: 1.5rem;
|
|
556
|
+
color: var(--fd-node-icon);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
.flowdrop-terminal-node__label-container {
|
|
560
|
+
display: flex;
|
|
561
|
+
flex-direction: column;
|
|
562
|
+
align-items: center;
|
|
563
|
+
gap: 0.125rem;
|
|
564
|
+
background-color: var(--fd-backdrop);
|
|
565
|
+
padding: var(--fd-space-3xs) var(--fd-space-xs);
|
|
566
|
+
border-radius: var(--fd-radius-sm);
|
|
567
|
+
box-shadow: var(--fd-shadow-sm);
|
|
568
|
+
max-width: 140px;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.flowdrop-terminal-node__label {
|
|
572
|
+
font-size: var(--fd-text-xs);
|
|
573
|
+
font-weight: 500;
|
|
574
|
+
color: var(--fd-foreground);
|
|
575
|
+
text-align: center;
|
|
576
|
+
overflow: hidden;
|
|
577
|
+
text-overflow: ellipsis;
|
|
578
|
+
white-space: nowrap;
|
|
579
|
+
max-width: 100%;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
.flowdrop-terminal-node__description {
|
|
583
|
+
font-size: 0.625rem;
|
|
584
|
+
color: var(--fd-muted-foreground);
|
|
585
|
+
text-align: center;
|
|
586
|
+
overflow: hidden;
|
|
587
|
+
text-overflow: ellipsis;
|
|
588
|
+
white-space: nowrap;
|
|
589
|
+
max-width: 100%;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
.flowdrop-terminal-node__processing {
|
|
593
|
+
position: absolute;
|
|
594
|
+
top: 1.5rem;
|
|
595
|
+
right: 0;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.flowdrop-terminal-node__spinner {
|
|
599
|
+
width: 14px;
|
|
600
|
+
height: 14px;
|
|
601
|
+
border: 2px solid color-mix(in srgb, var(--fd-foreground) 30%, transparent);
|
|
602
|
+
border-top: 2px solid var(--terminal-color, var(--fd-muted-foreground));
|
|
603
|
+
border-radius: 50%;
|
|
604
|
+
animation: spin 1s linear infinite;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
.flowdrop-terminal-node__error {
|
|
608
|
+
position: absolute;
|
|
609
|
+
top: 1.5rem;
|
|
610
|
+
right: 0;
|
|
611
|
+
color: var(--fd-error);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
:global(.flowdrop-terminal-node__error-icon) {
|
|
615
|
+
width: 14px;
|
|
616
|
+
height: 14px;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/* Config button positioned at top center */
|
|
620
|
+
.flowdrop-terminal-node__config-btn {
|
|
621
|
+
position: absolute;
|
|
622
|
+
top: -1.5rem;
|
|
623
|
+
left: 50%;
|
|
624
|
+
transform: translateX(-50%);
|
|
625
|
+
width: 1.5rem;
|
|
626
|
+
height: 1.5rem;
|
|
627
|
+
background-color: var(--fd-backdrop);
|
|
628
|
+
border: 1px solid var(--fd-border);
|
|
629
|
+
border-radius: 50%;
|
|
630
|
+
color: var(--fd-muted-foreground);
|
|
631
|
+
cursor: pointer;
|
|
632
|
+
display: flex;
|
|
633
|
+
align-items: center;
|
|
634
|
+
justify-content: center;
|
|
635
|
+
opacity: 0;
|
|
636
|
+
transition: all var(--fd-transition-normal);
|
|
637
|
+
backdrop-filter: var(--fd-backdrop-blur);
|
|
638
|
+
z-index: 15;
|
|
639
|
+
font-size: var(--fd-text-xs);
|
|
640
|
+
box-shadow: var(--fd-shadow-sm);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
.flowdrop-terminal-node:hover .flowdrop-terminal-node__config-btn {
|
|
644
|
+
opacity: 1;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
.flowdrop-terminal-node__config-btn:hover {
|
|
648
|
+
background-color: var(--fd-muted);
|
|
649
|
+
border-color: var(--fd-border-strong);
|
|
650
|
+
color: var(--fd-foreground);
|
|
651
|
+
transform: translateX(-50%) scale(1.1);
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
@keyframes spin {
|
|
655
|
+
to {
|
|
656
|
+
transform: rotate(360deg);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/* Handle styles - positioned along circle arc using cos/sin */
|
|
661
|
+
:global(.flowdrop-terminal-node__circle-wrapper .svelte-flow__handle) {
|
|
662
|
+
width: 16px !important;
|
|
663
|
+
height: 16px !important;
|
|
664
|
+
border-radius: 50% !important;
|
|
665
|
+
border: none !important;
|
|
666
|
+
transition: all var(--fd-transition-normal) !important;
|
|
667
|
+
cursor: pointer !important;
|
|
668
|
+
z-index: 20 !important;
|
|
669
|
+
pointer-events: auto !important;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
:global(.flowdrop-terminal-node__circle-wrapper .svelte-flow__handle:hover) {
|
|
673
|
+
transform: translate(-50%, -50%) scale(1.2) !important;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
:global(.flowdrop-terminal-node__circle-wrapper .svelte-flow__handle:focus) {
|
|
677
|
+
outline: 2px solid var(--fd-ring) !important;
|
|
678
|
+
outline-offset: 2px !important;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* Also keep node-level handle styles for fallback */
|
|
682
|
+
:global(.svelte-flow__node-terminal .svelte-flow__handle) {
|
|
683
|
+
z-index: 20 !important;
|
|
684
|
+
pointer-events: auto !important;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
:global(.svelte-flow__node-terminal .svelte-flow__handle:hover) {
|
|
688
|
+
transform: translate(-50%, -50%) scale(1.2) !important;
|
|
689
|
+
}
|
|
690
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ConfigValues, NodeMetadata, NodeExtensions } from '../../types/index.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
label: string;
|
|
5
|
+
config: ConfigValues;
|
|
6
|
+
metadata: NodeMetadata;
|
|
7
|
+
nodeId?: string;
|
|
8
|
+
extensions?: NodeExtensions;
|
|
9
|
+
onConfigOpen?: (node: {
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
data: {
|
|
13
|
+
label: string;
|
|
14
|
+
config: ConfigValues;
|
|
15
|
+
metadata: NodeMetadata;
|
|
16
|
+
};
|
|
17
|
+
}) => void;
|
|
18
|
+
};
|
|
19
|
+
selected?: boolean;
|
|
20
|
+
isProcessing?: boolean;
|
|
21
|
+
isError?: boolean;
|
|
22
|
+
};
|
|
23
|
+
declare const TerminalNode: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
24
|
+
type TerminalNode = ReturnType<typeof TerminalNode>;
|
|
25
|
+
export default TerminalNode;
|