@flowdrop/flowdrop 1.5.0 → 1.6.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/README.md +46 -47
- package/dist/adapters/WorkflowAdapter.d.ts +1 -1
- package/dist/adapters/WorkflowAdapter.js +26 -26
- package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +2 -2
- package/dist/adapters/agentspec/AgentSpecAdapter.js +122 -133
- package/dist/adapters/agentspec/agentAdapter.d.ts +2 -2
- package/dist/adapters/agentspec/agentAdapter.js +10 -10
- package/dist/adapters/agentspec/autoLayout.d.ts +1 -1
- package/dist/adapters/agentspec/autoLayout.js +7 -9
- package/dist/adapters/agentspec/componentTypeDefaults.d.ts +1 -1
- package/dist/adapters/agentspec/componentTypeDefaults.js +120 -120
- package/dist/adapters/agentspec/defaultNodeTypes.d.ts +2 -2
- package/dist/adapters/agentspec/defaultNodeTypes.js +307 -307
- package/dist/adapters/agentspec/index.d.ts +10 -10
- package/dist/adapters/agentspec/index.js +6 -6
- package/dist/adapters/agentspec/validator.d.ts +2 -2
- package/dist/adapters/agentspec/validator.js +20 -22
- package/dist/api/enhanced-client.d.ts +3 -3
- package/dist/api/enhanced-client.js +72 -73
- package/dist/chat/commandClassifier.js +6 -6
- package/dist/chat/index.d.ts +5 -5
- package/dist/chat/index.js +4 -4
- package/dist/chat/responseParser.d.ts +6 -6
- package/dist/chat/responseParser.js +28 -24
- package/dist/commands/batch.d.ts +1 -1
- package/dist/commands/batch.js +5 -7
- package/dist/commands/executor.d.ts +2 -2
- package/dist/commands/executor.js +320 -231
- package/dist/commands/index.d.ts +6 -6
- package/dist/commands/index.js +5 -5
- package/dist/commands/parser.d.ts +1 -1
- package/dist/commands/parser.js +91 -74
- package/dist/commands/positioner.d.ts +2 -2
- package/dist/commands/positioner.js +1 -1
- package/dist/commands/storeIntegration.svelte.d.ts +2 -2
- package/dist/commands/storeIntegration.svelte.js +5 -5
- package/dist/commands/types.d.ts +42 -42
- package/dist/commands/types.js +2 -2
- package/dist/components/App.svelte +240 -294
- package/dist/components/App.svelte.d.ts +9 -9
- package/dist/components/CanvasBanner.stories.svelte +10 -16
- package/dist/components/CanvasBanner.stories.svelte.d.ts +1 -1
- package/dist/components/CanvasBanner.svelte +2 -2
- package/dist/components/CanvasBanner.svelte.d.ts +1 -1
- package/dist/components/CanvasController.svelte +3 -4
- package/dist/components/ConfigForm.svelte +118 -256
- package/dist/components/ConfigForm.svelte.d.ts +2 -2
- package/dist/components/ConfigMappingRow.svelte +7 -9
- package/dist/components/ConfigMappingRow.svelte.d.ts +1 -1
- package/dist/components/ConfigModal.svelte +3 -3
- package/dist/components/ConfigModal.svelte.d.ts +1 -1
- package/dist/components/ConfigPanel.stories.svelte +19 -19
- package/dist/components/ConfigPanel.stories.svelte.d.ts +1 -1
- package/dist/components/ConfigPanel.svelte +9 -20
- package/dist/components/ConfigPanel.svelte.d.ts +1 -1
- package/dist/components/ConnectionLine.svelte +4 -4
- package/dist/components/EdgeRefresher.svelte +1 -1
- package/dist/components/FlowDropEdge.stories.svelte +110 -110
- package/dist/components/FlowDropEdge.svelte +9 -9
- package/dist/components/FlowDropEdge.svelte.d.ts +1 -1
- package/dist/components/FlowDropZone.svelte +6 -9
- package/dist/components/FlowDropZone.svelte.d.ts +1 -1
- package/dist/components/LoadingSpinner.stories.svelte +13 -13
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +1 -1
- package/dist/components/LoadingSpinner.svelte +3 -3
- package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
- package/dist/components/Logo.stories.svelte +4 -4
- package/dist/components/Logo.stories.svelte.d.ts +1 -1
- package/dist/components/Logo.svelte +3 -9
- package/dist/components/LogsSidebar.svelte +41 -48
- package/dist/components/LogsSidebar.svelte.d.ts +1 -1
- package/dist/components/MarkdownDisplay.stories.svelte +10 -14
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +1 -1
- package/dist/components/MarkdownDisplay.svelte +4 -6
- package/dist/components/Navbar.stories.svelte +19 -19
- package/dist/components/Navbar.stories.svelte.d.ts +1 -1
- package/dist/components/Navbar.svelte +28 -49
- package/dist/components/Navbar.svelte.d.ts +2 -2
- package/dist/components/NodeSidebar.svelte +42 -88
- package/dist/components/NodeSidebar.svelte.d.ts +1 -1
- package/dist/components/NodeStatusOverlay.stories.svelte +19 -31
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +1 -1
- package/dist/components/NodeStatusOverlay.svelte +40 -55
- package/dist/components/NodeStatusOverlay.svelte.d.ts +3 -3
- package/dist/components/NodeSwapPicker.svelte +20 -64
- package/dist/components/NodeSwapPicker.svelte.d.ts +1 -1
- package/dist/components/PipelineStatus.svelte +63 -89
- package/dist/components/PipelineStatus.svelte.d.ts +4 -4
- package/dist/components/PortCoordinateTracker.svelte +5 -7
- package/dist/components/PortCoordinateTracker.svelte.d.ts +1 -1
- package/dist/components/PortMappingRow.svelte +20 -24
- package/dist/components/PortMappingRow.svelte.d.ts +2 -2
- package/dist/components/ReadOnlyDetails.svelte +1 -1
- package/dist/components/SchemaForm.stories.svelte +53 -53
- package/dist/components/SchemaForm.stories.svelte.d.ts +1 -1
- package/dist/components/SchemaForm.svelte +24 -51
- package/dist/components/SchemaForm.svelte.d.ts +2 -2
- package/dist/components/SettingsModal.svelte +6 -9
- package/dist/components/SettingsModal.svelte.d.ts +1 -1
- package/dist/components/SettingsPanel.svelte +138 -158
- package/dist/components/SettingsPanel.svelte.d.ts +1 -1
- package/dist/components/StatusIcon.stories.svelte +16 -29
- package/dist/components/StatusIcon.stories.svelte.d.ts +1 -1
- package/dist/components/StatusIcon.svelte +19 -19
- package/dist/components/StatusIcon.svelte.d.ts +2 -2
- package/dist/components/StatusLabel.stories.svelte +8 -8
- package/dist/components/StatusLabel.stories.svelte.d.ts +1 -1
- package/dist/components/SwapMappingEditor.svelte +35 -56
- package/dist/components/SwapMappingEditor.svelte.d.ts +2 -2
- package/dist/components/ThemeToggle.stories.svelte +10 -10
- package/dist/components/ThemeToggle.stories.svelte.d.ts +1 -1
- package/dist/components/ThemeToggle.svelte +22 -33
- package/dist/components/ThemeToggle.svelte.d.ts +1 -1
- package/dist/components/UniversalNode.svelte +29 -41
- package/dist/components/UniversalNode.svelte.d.ts +3 -3
- package/dist/components/WorkflowEditor.svelte +113 -168
- package/dist/components/WorkflowEditor.svelte.d.ts +4 -4
- package/dist/components/chat/AIChatPanel.svelte +272 -133
- package/dist/components/chat/AIChatPanel.svelte.d.ts +3 -3
- package/dist/components/chat/CommandPreview.svelte +74 -24
- package/dist/components/chat/CommandPreview.svelte.d.ts +1 -1
- package/dist/components/console/CommandConsole.stories.svelte +71 -53
- package/dist/components/console/CommandConsole.stories.svelte.d.ts +1 -1
- package/dist/components/console/CommandConsole.svelte +39 -35
- package/dist/components/console/CommandConsole.svelte.d.ts +2 -2
- package/dist/components/console/ConsoleAutocomplete.svelte +6 -3
- package/dist/components/console/ConsoleInput.svelte +148 -89
- package/dist/components/console/ConsoleInput.svelte.d.ts +1 -1
- package/dist/components/console/ConsoleOutput.svelte +5 -10
- package/dist/components/console/ConsoleOutput.svelte.d.ts +1 -1
- package/dist/components/console/formatters.d.ts +1 -1
- package/dist/components/console/formatters.js +27 -29
- package/dist/components/form/FormArray.svelte +75 -132
- package/dist/components/form/FormArray.svelte.d.ts +1 -1
- package/dist/components/form/FormAutocomplete.svelte +65 -108
- package/dist/components/form/FormAutocomplete.svelte.d.ts +1 -1
- package/dist/components/form/FormCheckboxGroup.stories.svelte +13 -16
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormCheckboxGroup.svelte +2 -2
- package/dist/components/form/FormCodeEditor.svelte +42 -56
- package/dist/components/form/FormField.svelte +79 -90
- package/dist/components/form/FormField.svelte.d.ts +2 -2
- package/dist/components/form/FormFieldLight.svelte +72 -88
- package/dist/components/form/FormFieldLight.svelte.d.ts +1 -1
- package/dist/components/form/FormFieldWrapper.stories.svelte +14 -14
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormFieldWrapper.svelte +2 -9
- package/dist/components/form/FormFieldWrapper.svelte.d.ts +1 -1
- package/dist/components/form/FormFieldset.svelte +3 -3
- package/dist/components/form/FormFieldset.svelte.d.ts +2 -2
- package/dist/components/form/FormMarkdownEditor.svelte +123 -156
- package/dist/components/form/FormNumberField.stories.svelte +18 -18
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormNumberField.svelte +6 -6
- package/dist/components/form/FormRangeField.stories.svelte +13 -13
- package/dist/components/form/FormRangeField.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormRangeField.svelte +4 -12
- package/dist/components/form/FormSelect.stories.svelte +21 -21
- package/dist/components/form/FormSelect.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormSelect.svelte +5 -5
- package/dist/components/form/FormSelect.svelte.d.ts +1 -1
- package/dist/components/form/FormTemplateEditor.svelte +126 -175
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +1 -1
- package/dist/components/form/FormTextField.stories.svelte +17 -23
- package/dist/components/form/FormTextField.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormTextField.svelte +4 -4
- package/dist/components/form/FormTextarea.stories.svelte +18 -21
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormTextarea.svelte +4 -4
- package/dist/components/form/FormToggle.stories.svelte +13 -16
- package/dist/components/form/FormToggle.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormToggle.svelte +3 -3
- package/dist/components/form/FormUISchemaRenderer.svelte +12 -19
- package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +3 -3
- package/dist/components/form/index.d.ts +19 -19
- package/dist/components/form/index.js +18 -18
- package/dist/components/form/templateAutocomplete.d.ts +2 -2
- package/dist/components/form/templateAutocomplete.js +55 -64
- package/dist/components/form/types.d.ts +6 -6
- package/dist/components/form/types.js +4 -9
- package/dist/components/icons/AlertCircleIcon.svelte +1 -6
- package/dist/components/icons/CogIcon.svelte +1 -6
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +27 -27
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/ChoicePrompt.svelte +17 -41
- package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +17 -17
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/ConfirmationPrompt.svelte +10 -16
- package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/FormPrompt.svelte +10 -15
- package/dist/components/interrupt/FormPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/InterruptBubble.svelte +87 -121
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +2 -2
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +37 -37
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/ReviewPrompt.svelte +55 -75
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +16 -17
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/TextInputPrompt.svelte +13 -18
- package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/index.d.ts +6 -6
- package/dist/components/interrupt/index.js +6 -6
- package/dist/components/layouts/MainLayout.svelte +46 -84
- package/dist/components/layouts/MainLayout.svelte.d.ts +6 -6
- package/dist/components/nodes/GatewayNode.stories.svelte +64 -65
- package/dist/components/nodes/GatewayNode.svelte +37 -70
- package/dist/components/nodes/GatewayNode.svelte.d.ts +3 -3
- package/dist/components/nodes/IdeaNode.stories.svelte +25 -26
- package/dist/components/nodes/IdeaNode.svelte +22 -36
- package/dist/components/nodes/IdeaNode.svelte.d.ts +1 -1
- package/dist/components/nodes/NotesNode.stories.svelte +37 -38
- package/dist/components/nodes/NotesNode.svelte +28 -39
- package/dist/components/nodes/NotesNode.svelte.d.ts +1 -1
- package/dist/components/nodes/SimpleNode.stories.svelte +137 -138
- package/dist/components/nodes/SimpleNode.svelte +44 -74
- package/dist/components/nodes/SimpleNode.svelte.d.ts +1 -1
- package/dist/components/nodes/SquareNode.stories.svelte +75 -75
- package/dist/components/nodes/SquareNode.svelte +42 -68
- package/dist/components/nodes/SquareNode.svelte.d.ts +1 -1
- package/dist/components/nodes/TerminalNode.stories.svelte +10 -10
- package/dist/components/nodes/TerminalNode.svelte +74 -112
- package/dist/components/nodes/TerminalNode.svelte.d.ts +1 -1
- package/dist/components/nodes/ToolNode.stories.svelte +115 -116
- package/dist/components/nodes/ToolNode.svelte +31 -64
- package/dist/components/nodes/ToolNode.svelte.d.ts +1 -1
- package/dist/components/nodes/WorkflowNode.stories.svelte +84 -89
- package/dist/components/nodes/WorkflowNode.svelte +50 -103
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +3 -3
- package/dist/components/playground/ChatPanel.svelte +47 -103
- package/dist/components/playground/ExecutionLogs.svelte +45 -68
- package/dist/components/playground/InputCollector.svelte +32 -51
- package/dist/components/playground/MessageBubble.stories.svelte +25 -25
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +1 -1
- package/dist/components/playground/MessageBubble.svelte +54 -70
- package/dist/components/playground/MessageBubble.svelte.d.ts +1 -1
- package/dist/components/playground/Playground.svelte +60 -91
- package/dist/components/playground/Playground.svelte.d.ts +3 -3
- package/dist/components/playground/PlaygroundModal.svelte +8 -12
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -3
- package/dist/components/playground/SessionManager.svelte +34 -40
- package/dist/components/playground/SessionManager.svelte.d.ts +1 -1
- package/dist/config/agentSpecEndpoints.d.ts +1 -1
- package/dist/config/agentSpecEndpoints.js +20 -20
- package/dist/config/constants.js +2 -2
- package/dist/config/defaultCategories.d.ts +1 -1
- package/dist/config/defaultCategories.js +86 -86
- package/dist/config/defaultPortConfig.d.ts +1 -1
- package/dist/config/defaultPortConfig.js +144 -144
- package/dist/config/endpoints.d.ts +4 -4
- package/dist/config/endpoints.js +68 -68
- package/dist/config/runtimeConfig.d.ts +2 -2
- package/dist/config/runtimeConfig.js +8 -8
- package/dist/core/index.d.ts +68 -68
- package/dist/core/index.js +38 -38
- package/dist/display/index.d.ts +2 -2
- package/dist/display/index.js +2 -2
- package/dist/editor/index.d.ts +64 -64
- package/dist/editor/index.js +54 -54
- package/dist/form/code.d.ts +5 -5
- package/dist/form/code.js +14 -14
- package/dist/form/fieldRegistry.d.ts +3 -3
- package/dist/form/fieldRegistry.js +9 -11
- package/dist/form/full.d.ts +8 -8
- package/dist/form/full.js +9 -9
- package/dist/form/index.d.ts +18 -18
- package/dist/form/index.js +16 -16
- package/dist/form/markdown.d.ts +4 -4
- package/dist/form/markdown.js +8 -8
- package/dist/helpers/proximityConnect.d.ts +3 -3
- package/dist/helpers/proximityConnect.js +32 -34
- package/dist/helpers/workflowEditorHelper.d.ts +6 -6
- package/dist/helpers/workflowEditorHelper.js +64 -68
- package/dist/index.d.ts +6 -6
- package/dist/index.js +6 -6
- package/dist/mocks/app-environment.js +2 -2
- package/dist/mocks/app-forms.js +1 -1
- package/dist/mocks/app-navigation.js +2 -2
- package/dist/mocks/app-stores.js +3 -3
- package/dist/playground/index.d.ts +19 -19
- package/dist/playground/index.js +16 -16
- package/dist/playground/mount.d.ts +3 -3
- package/dist/playground/mount.js +24 -24
- package/dist/registry/builtinFormats.js +13 -13
- package/dist/registry/builtinNodes.d.ts +2 -2
- package/dist/registry/builtinNodes.js +77 -77
- package/dist/registry/index.d.ts +4 -4
- package/dist/registry/index.js +4 -4
- package/dist/registry/nodeComponentRegistry.d.ts +8 -8
- package/dist/registry/nodeComponentRegistry.js +9 -11
- package/dist/registry/plugin.d.ts +2 -2
- package/dist/registry/plugin.js +11 -11
- package/dist/registry/workflowFormatRegistry.d.ts +3 -3
- package/dist/registry/workflowFormatRegistry.js +2 -2
- package/dist/schema/index.d.ts +1 -1
- package/dist/schema/index.js +2 -2
- package/dist/services/agentSpecExecutionService.d.ts +3 -3
- package/dist/services/agentSpecExecutionService.js +55 -56
- package/dist/services/api.d.ts +2 -2
- package/dist/services/api.js +37 -37
- package/dist/services/apiVariableService.d.ts +1 -1
- package/dist/services/apiVariableService.js +34 -41
- package/dist/services/autoSaveService.js +8 -8
- package/dist/services/categoriesApi.d.ts +2 -2
- package/dist/services/categoriesApi.js +8 -8
- package/dist/services/chatService.d.ts +1 -1
- package/dist/services/chatService.js +18 -18
- package/dist/services/draftStorage.d.ts +1 -1
- package/dist/services/draftStorage.js +11 -11
- package/dist/services/dynamicSchemaService.d.ts +1 -1
- package/dist/services/dynamicSchemaService.js +39 -41
- package/dist/services/globalSave.d.ts +2 -2
- package/dist/services/globalSave.js +38 -41
- package/dist/services/historyService.d.ts +1 -1
- package/dist/services/historyService.js +10 -10
- package/dist/services/interruptService.d.ts +1 -1
- package/dist/services/interruptService.js +29 -35
- package/dist/services/nodeExecutionService.d.ts +1 -1
- package/dist/services/nodeExecutionService.js +44 -45
- package/dist/services/playgroundService.d.ts +1 -1
- package/dist/services/playgroundService.js +29 -29
- package/dist/services/portConfigApi.d.ts +2 -2
- package/dist/services/portConfigApi.js +8 -8
- package/dist/services/settingsService.d.ts +2 -2
- package/dist/services/settingsService.js +19 -25
- package/dist/services/toastService.d.ts +4 -4
- package/dist/services/toastService.js +33 -33
- package/dist/services/variableService.d.ts +1 -1
- package/dist/services/variableService.js +36 -36
- package/dist/services/workflowStorage.d.ts +2 -2
- package/dist/services/workflowStorage.js +13 -13
- package/dist/settings/index.d.ts +7 -7
- package/dist/settings/index.js +6 -6
- package/dist/skins/default.d.ts +1 -1
- package/dist/skins/default.js +1 -1
- package/dist/skins/index.d.ts +3 -3
- package/dist/skins/index.js +7 -7
- package/dist/skins/slate.d.ts +1 -1
- package/dist/skins/slate.js +69 -69
- package/dist/stores/categoriesStore.svelte.d.ts +1 -1
- package/dist/stores/categoriesStore.svelte.js +5 -5
- package/dist/stores/editorStateMachine.svelte.d.ts +2 -2
- package/dist/stores/editorStateMachine.svelte.js +34 -34
- package/dist/stores/historyStore.svelte.d.ts +4 -4
- package/dist/stores/historyStore.svelte.js +4 -4
- package/dist/stores/interruptStore.svelte.d.ts +3 -3
- package/dist/stores/interruptStore.svelte.js +21 -21
- package/dist/stores/playgroundStore.svelte.d.ts +2 -2
- package/dist/stores/playgroundStore.svelte.js +18 -21
- package/dist/stores/portCoordinateStore.svelte.d.ts +2 -2
- package/dist/stores/portCoordinateStore.svelte.js +10 -13
- package/dist/stores/settingsStore.svelte.d.ts +2 -2
- package/dist/stores/settingsStore.svelte.js +57 -62
- package/dist/stores/workflowStore.svelte.d.ts +3 -3
- package/dist/stores/workflowStore.svelte.js +46 -47
- package/dist/stories/CanvasDecorator.svelte +7 -10
- package/dist/stories/CanvasDecorator.svelte.d.ts +2 -2
- package/dist/stories/EdgeDecorator.svelte +28 -31
- package/dist/stories/EdgeDecorator.svelte.d.ts +1 -1
- package/dist/stories/NodeDecorator.svelte +14 -20
- package/dist/stories/NodeDecorator.svelte.d.ts +1 -1
- package/dist/stories/utils.d.ts +2 -2
- package/dist/stories/utils.js +89 -93
- package/dist/styles/base.css +16 -50
- package/dist/styles/tokens.css +10 -28
- package/dist/svelte-app.d.ts +10 -10
- package/dist/svelte-app.js +39 -39
- package/dist/themes/default.d.ts +1 -1
- package/dist/themes/default.js +4 -4
- package/dist/themes/index.d.ts +3 -3
- package/dist/themes/index.js +11 -11
- package/dist/themes/minimal.d.ts +1 -1
- package/dist/themes/minimal.js +5 -5
- package/dist/types/agentspec.d.ts +18 -18
- package/dist/types/agentspec.js +2 -2
- package/dist/types/auth.d.ts +1 -1
- package/dist/types/auth.js +6 -6
- package/dist/types/chat.d.ts +2 -2
- package/dist/types/config.d.ts +6 -6
- package/dist/types/events.d.ts +3 -3
- package/dist/types/events.js +2 -2
- package/dist/types/index.d.ts +32 -32
- package/dist/types/index.js +6 -6
- package/dist/types/interrupt.d.ts +6 -6
- package/dist/types/interrupt.js +21 -21
- package/dist/types/interruptState.d.ts +12 -12
- package/dist/types/interruptState.js +66 -66
- package/dist/types/playground.d.ts +7 -7
- package/dist/types/playground.js +14 -14
- package/dist/types/settings.d.ts +7 -5
- package/dist/types/settings.js +19 -24
- package/dist/types/skin.d.ts +1 -1
- package/dist/types/theme.d.ts +2 -2
- package/dist/types/uischema.d.ts +4 -4
- package/dist/types/uischema.js +3 -3
- package/dist/utils/colors.d.ts +1 -1
- package/dist/utils/colors.js +95 -97
- package/dist/utils/config.d.ts +2 -2
- package/dist/utils/config.js +48 -48
- package/dist/utils/connections.d.ts +2 -2
- package/dist/utils/connections.js +15 -15
- package/dist/utils/edgeStyling.d.ts +2 -2
- package/dist/utils/edgeStyling.js +36 -39
- package/dist/utils/errors.js +3 -3
- package/dist/utils/fetchWithAuth.d.ts +1 -1
- package/dist/utils/fetchWithAuth.js +2 -2
- package/dist/utils/handleIds.d.ts +2 -2
- package/dist/utils/handleIds.js +8 -8
- package/dist/utils/handlePositioning.d.ts +1 -1
- package/dist/utils/handlePositioning.js +2 -2
- package/dist/utils/icons.d.ts +1 -1
- package/dist/utils/icons.js +74 -74
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +7 -7
- package/dist/utils/nodeIds.d.ts +1 -1
- package/dist/utils/nodeIds.js +1 -1
- package/dist/utils/nodeStatus.d.ts +1 -1
- package/dist/utils/nodeStatus.js +48 -48
- package/dist/utils/nodeSwap.d.ts +9 -9
- package/dist/utils/nodeSwap.js +52 -58
- package/dist/utils/nodeTypes.d.ts +1 -1
- package/dist/utils/nodeTypes.js +20 -21
- package/dist/utils/nodeWrapper.d.ts +7 -7
- package/dist/utils/nodeWrapper.js +19 -21
- package/dist/utils/performanceUtils.d.ts +1 -1
- package/dist/utils/performanceUtils.js +1 -2
- package/dist/utils/portUtils.d.ts +2 -2
- package/dist/utils/portUtils.js +1 -1
- package/dist/utils/sanitize.js +1 -1
- package/dist/utils/uischema.d.ts +2 -2
- package/dist/utils/uischema.js +8 -8
- package/dist/utils/validation.js +8 -8
- package/package.json +7 -11
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module services/draftStorage
|
|
8
8
|
*/
|
|
9
|
-
import { logger } from
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
10
10
|
/**
|
|
11
11
|
* Default storage key prefix
|
|
12
12
|
*/
|
|
13
|
-
const STORAGE_KEY_PREFIX =
|
|
13
|
+
const STORAGE_KEY_PREFIX = 'flowdrop:draft';
|
|
14
14
|
/**
|
|
15
15
|
* Generate a storage key for a workflow
|
|
16
16
|
*
|
|
@@ -44,15 +44,15 @@ export function saveDraft(workflow, storageKey) {
|
|
|
44
44
|
metadata: {
|
|
45
45
|
savedAt: new Date().toISOString(),
|
|
46
46
|
workflowId: workflow.id,
|
|
47
|
-
workflowName: workflow.name
|
|
48
|
-
}
|
|
47
|
+
workflowName: workflow.name
|
|
48
|
+
}
|
|
49
49
|
};
|
|
50
50
|
localStorage.setItem(storageKey, JSON.stringify(draft));
|
|
51
51
|
return true;
|
|
52
52
|
}
|
|
53
53
|
catch (error) {
|
|
54
54
|
// localStorage might be full or disabled
|
|
55
|
-
logger.warn(
|
|
55
|
+
logger.warn('Failed to save draft to localStorage:', error);
|
|
56
56
|
return false;
|
|
57
57
|
}
|
|
58
58
|
}
|
|
@@ -71,13 +71,13 @@ export function loadDraft(storageKey) {
|
|
|
71
71
|
const draft = JSON.parse(stored);
|
|
72
72
|
// Validate the draft structure
|
|
73
73
|
if (!draft.workflow || !draft.metadata) {
|
|
74
|
-
logger.warn(
|
|
74
|
+
logger.warn('Invalid draft structure in localStorage');
|
|
75
75
|
return null;
|
|
76
76
|
}
|
|
77
77
|
return draft;
|
|
78
78
|
}
|
|
79
79
|
catch (error) {
|
|
80
|
-
logger.warn(
|
|
80
|
+
logger.warn('Failed to load draft from localStorage:', error);
|
|
81
81
|
return null;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -91,7 +91,7 @@ export function deleteDraft(storageKey) {
|
|
|
91
91
|
localStorage.removeItem(storageKey);
|
|
92
92
|
}
|
|
93
93
|
catch (error) {
|
|
94
|
-
logger.warn(
|
|
94
|
+
logger.warn('Failed to delete draft from localStorage:', error);
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
@@ -272,15 +272,15 @@ export class DraftAutoSaveManager {
|
|
|
272
272
|
nodes: workflow.nodes.map((n) => ({
|
|
273
273
|
id: n.id,
|
|
274
274
|
position: n.position,
|
|
275
|
-
data: n.data
|
|
275
|
+
data: n.data
|
|
276
276
|
})),
|
|
277
277
|
edges: workflow.edges.map((e) => ({
|
|
278
278
|
id: e.id,
|
|
279
279
|
source: e.source,
|
|
280
280
|
target: e.target,
|
|
281
281
|
sourceHandle: e.sourceHandle,
|
|
282
|
-
targetHandle: e.targetHandle
|
|
283
|
-
}))
|
|
282
|
+
targetHandle: e.targetHandle
|
|
283
|
+
}))
|
|
284
284
|
};
|
|
285
285
|
return JSON.stringify(toHash);
|
|
286
286
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module services/dynamicSchemaService
|
|
7
7
|
*/
|
|
8
|
-
import type { ConfigSchema, DynamicSchemaEndpoint, ExternalEditLink, ConfigEditOptions, WorkflowNode } from
|
|
8
|
+
import type { ConfigSchema, DynamicSchemaEndpoint, ExternalEditLink, ConfigEditOptions, WorkflowNode } from '../types/index.js';
|
|
9
9
|
/**
|
|
10
10
|
* Result of a dynamic schema fetch operation
|
|
11
11
|
*/
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module services/dynamicSchemaService
|
|
7
7
|
*/
|
|
8
|
-
import { getEndpointConfig } from
|
|
9
|
-
import { DEFAULT_CACHE_TTL_MS } from
|
|
8
|
+
import { getEndpointConfig } from './api.js';
|
|
9
|
+
import { DEFAULT_CACHE_TTL_MS } from '../config/constants.js';
|
|
10
10
|
/**
|
|
11
11
|
* Schema cache with TTL support
|
|
12
12
|
* Key format: `{nodeTypeId}:{instanceId}` or `{nodeTypeId}` for type-level caching
|
|
@@ -30,13 +30,13 @@ const DEFAULT_CACHE_TTL = DEFAULT_CACHE_TTL_MS;
|
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
32
|
function resolveVariablePath(context, path) {
|
|
33
|
-
const parts = path.split(
|
|
33
|
+
const parts = path.split('.');
|
|
34
34
|
let current = context;
|
|
35
35
|
for (const part of parts) {
|
|
36
36
|
if (current === null || current === undefined) {
|
|
37
37
|
return undefined;
|
|
38
38
|
}
|
|
39
|
-
if (typeof current ===
|
|
39
|
+
if (typeof current === 'object' && part in current) {
|
|
40
40
|
current = current[part];
|
|
41
41
|
}
|
|
42
42
|
else {
|
|
@@ -77,7 +77,7 @@ function resolveTemplate(template, parameterMapping, context) {
|
|
|
77
77
|
const value = resolveVariablePath(context, contextPath);
|
|
78
78
|
if (value !== undefined) {
|
|
79
79
|
// Use global regex to replace all occurrences
|
|
80
|
-
const regex = new RegExp(`\\{${variableName}\\}`,
|
|
80
|
+
const regex = new RegExp(`\\{${variableName}\\}`, 'g');
|
|
81
81
|
resolved = resolved.replace(regex, encodeURIComponent(value));
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -145,7 +145,7 @@ export async function fetchDynamicSchema(endpoint, node, workflowId) {
|
|
|
145
145
|
metadata: node.data.metadata,
|
|
146
146
|
config: node.data.config,
|
|
147
147
|
extensions: node.data.extensions,
|
|
148
|
-
workflowId
|
|
148
|
+
workflowId
|
|
149
149
|
};
|
|
150
150
|
// Generate cache key
|
|
151
151
|
const cacheKey = generateCacheKey(endpoint, context);
|
|
@@ -156,41 +156,39 @@ export async function fetchDynamicSchema(endpoint, node, workflowId) {
|
|
|
156
156
|
return {
|
|
157
157
|
success: true,
|
|
158
158
|
schema: cached.schema,
|
|
159
|
-
fromCache: true
|
|
159
|
+
fromCache: true
|
|
160
160
|
};
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
// Resolve the URL with template variables
|
|
164
164
|
let url = resolveTemplate(endpoint.url, endpoint.parameterMapping, context);
|
|
165
165
|
// If URL is relative, try to prepend base URL from endpoint config
|
|
166
|
-
if (url.startsWith(
|
|
166
|
+
if (url.startsWith('/')) {
|
|
167
167
|
const currentConfig = getEndpointConfig();
|
|
168
168
|
if (currentConfig?.baseUrl) {
|
|
169
169
|
// Remove trailing slash from base URL and leading slash from relative URL
|
|
170
|
-
const baseUrl = currentConfig.baseUrl.replace(/\/$/,
|
|
170
|
+
const baseUrl = currentConfig.baseUrl.replace(/\/$/, '');
|
|
171
171
|
url = `${baseUrl}${url}`;
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
// Prepare request options
|
|
175
|
-
const method = endpoint.method ??
|
|
175
|
+
const method = endpoint.method ?? 'GET';
|
|
176
176
|
const timeout = endpoint.timeout ?? 10000;
|
|
177
177
|
const headers = {
|
|
178
|
-
Accept:
|
|
179
|
-
|
|
180
|
-
...endpoint.headers
|
|
178
|
+
Accept: 'application/json',
|
|
179
|
+
'Content-Type': 'application/json',
|
|
180
|
+
...endpoint.headers
|
|
181
181
|
};
|
|
182
182
|
// Add auth headers from endpoint config if available
|
|
183
183
|
const currentConfig = getEndpointConfig();
|
|
184
184
|
if (currentConfig?.auth) {
|
|
185
|
-
if (currentConfig.auth.type ===
|
|
186
|
-
headers[
|
|
185
|
+
if (currentConfig.auth.type === 'bearer' && currentConfig.auth.token) {
|
|
186
|
+
headers['Authorization'] = `Bearer ${currentConfig.auth.token}`;
|
|
187
187
|
}
|
|
188
|
-
else if (currentConfig.auth.type ===
|
|
189
|
-
currentConfig.auth.apiKey
|
|
190
|
-
headers["X-API-Key"] = currentConfig.auth.apiKey;
|
|
188
|
+
else if (currentConfig.auth.type === 'api_key' && currentConfig.auth.apiKey) {
|
|
189
|
+
headers['X-API-Key'] = currentConfig.auth.apiKey;
|
|
191
190
|
}
|
|
192
|
-
else if (currentConfig.auth.type ===
|
|
193
|
-
currentConfig.auth.headers) {
|
|
191
|
+
else if (currentConfig.auth.type === 'custom' && currentConfig.auth.headers) {
|
|
194
192
|
Object.assign(headers, currentConfig.auth.headers);
|
|
195
193
|
}
|
|
196
194
|
}
|
|
@@ -198,14 +196,14 @@ export async function fetchDynamicSchema(endpoint, node, workflowId) {
|
|
|
198
196
|
const fetchOptions = {
|
|
199
197
|
method,
|
|
200
198
|
headers,
|
|
201
|
-
signal: AbortSignal.timeout(timeout)
|
|
199
|
+
signal: AbortSignal.timeout(timeout)
|
|
202
200
|
};
|
|
203
201
|
// Add body for non-GET requests
|
|
204
|
-
if (method !==
|
|
202
|
+
if (method !== 'GET' && endpoint.body) {
|
|
205
203
|
// Resolve any template variables in the body
|
|
206
204
|
const resolvedBody = {};
|
|
207
205
|
for (const [key, value] of Object.entries(endpoint.body)) {
|
|
208
|
-
if (typeof value ===
|
|
206
|
+
if (typeof value === 'string') {
|
|
209
207
|
resolvedBody[key] = resolveTemplate(value, endpoint.parameterMapping, context);
|
|
210
208
|
}
|
|
211
209
|
else {
|
|
@@ -220,7 +218,7 @@ export async function fetchDynamicSchema(endpoint, node, workflowId) {
|
|
|
220
218
|
const errorText = await response.text();
|
|
221
219
|
return {
|
|
222
220
|
success: false,
|
|
223
|
-
error: `HTTP ${response.status}: ${errorText || response.statusText}
|
|
221
|
+
error: `HTTP ${response.status}: ${errorText || response.statusText}`
|
|
224
222
|
};
|
|
225
223
|
}
|
|
226
224
|
const data = await response.json();
|
|
@@ -229,26 +227,26 @@ export async function fetchDynamicSchema(endpoint, node, workflowId) {
|
|
|
229
227
|
// 2. Wrapped in { data: ConfigSchema } or { schema: ConfigSchema }
|
|
230
228
|
// 3. Wrapped in { success: true, data: ConfigSchema }
|
|
231
229
|
let schema;
|
|
232
|
-
if (data.type ===
|
|
230
|
+
if (data.type === 'object' && data.properties) {
|
|
233
231
|
// Direct ConfigSchema
|
|
234
232
|
schema = data;
|
|
235
233
|
}
|
|
236
|
-
else if (data.data?.type ===
|
|
234
|
+
else if (data.data?.type === 'object' && data.data?.properties) {
|
|
237
235
|
// Wrapped in { data: ... }
|
|
238
236
|
schema = data.data;
|
|
239
237
|
}
|
|
240
|
-
else if (data.schema?.type ===
|
|
238
|
+
else if (data.schema?.type === 'object' && data.schema?.properties) {
|
|
241
239
|
// Wrapped in { schema: ... }
|
|
242
240
|
schema = data.schema;
|
|
243
241
|
}
|
|
244
|
-
else if (data.success && data.data?.type ===
|
|
242
|
+
else if (data.success && data.data?.type === 'object') {
|
|
245
243
|
// Wrapped in { success: true, data: ... }
|
|
246
244
|
schema = data.data;
|
|
247
245
|
}
|
|
248
246
|
if (!schema) {
|
|
249
247
|
return {
|
|
250
248
|
success: false,
|
|
251
|
-
error:
|
|
249
|
+
error: 'Invalid schema format received from endpoint'
|
|
252
250
|
};
|
|
253
251
|
}
|
|
254
252
|
// Cache the schema (if caching is enabled)
|
|
@@ -256,32 +254,32 @@ export async function fetchDynamicSchema(endpoint, node, workflowId) {
|
|
|
256
254
|
schemaCache.set(cacheKey, {
|
|
257
255
|
schema,
|
|
258
256
|
cachedAt: Date.now(),
|
|
259
|
-
cacheKey
|
|
257
|
+
cacheKey
|
|
260
258
|
});
|
|
261
259
|
}
|
|
262
260
|
return {
|
|
263
261
|
success: true,
|
|
264
262
|
schema,
|
|
265
|
-
fromCache: false
|
|
263
|
+
fromCache: false
|
|
266
264
|
};
|
|
267
265
|
}
|
|
268
266
|
catch (error) {
|
|
269
267
|
// Handle specific error types
|
|
270
268
|
if (error instanceof Error) {
|
|
271
|
-
if (error.name ===
|
|
269
|
+
if (error.name === 'AbortError' || error.name === 'TimeoutError') {
|
|
272
270
|
return {
|
|
273
271
|
success: false,
|
|
274
|
-
error: `Request timed out after ${timeout}ms
|
|
272
|
+
error: `Request timed out after ${timeout}ms`
|
|
275
273
|
};
|
|
276
274
|
}
|
|
277
275
|
return {
|
|
278
276
|
success: false,
|
|
279
|
-
error: error.message
|
|
277
|
+
error: error.message
|
|
280
278
|
};
|
|
281
279
|
}
|
|
282
280
|
return {
|
|
283
281
|
success: false,
|
|
284
|
-
error:
|
|
282
|
+
error: 'Unknown error occurred while fetching schema'
|
|
285
283
|
};
|
|
286
284
|
}
|
|
287
285
|
}
|
|
@@ -313,13 +311,13 @@ export function resolveExternalEditUrl(link, node, workflowId, callbackUrl) {
|
|
|
313
311
|
metadata: node.data.metadata,
|
|
314
312
|
config: node.data.config,
|
|
315
313
|
extensions: node.data.extensions,
|
|
316
|
-
workflowId
|
|
314
|
+
workflowId
|
|
317
315
|
};
|
|
318
316
|
// Resolve the URL with template variables
|
|
319
317
|
let url = resolveTemplate(link.url, link.parameterMapping, context);
|
|
320
318
|
// Append callback URL if configured
|
|
321
319
|
if (callbackUrl && link.callbackUrlParam) {
|
|
322
|
-
const separator = url.includes(
|
|
320
|
+
const separator = url.includes('?') ? '&' : '?';
|
|
323
321
|
url = `${url}${separator}${link.callbackUrlParam}=${encodeURIComponent(callbackUrl)}`;
|
|
324
322
|
}
|
|
325
323
|
return url;
|
|
@@ -353,16 +351,16 @@ export function getEffectiveConfigEditOptions(node) {
|
|
|
353
351
|
externalEditLink: (instanceConfig.externalEditLink ?? typeConfig.externalEditLink)
|
|
354
352
|
? {
|
|
355
353
|
...(typeConfig.externalEditLink ?? {}),
|
|
356
|
-
...(instanceConfig.externalEditLink ?? {})
|
|
354
|
+
...(instanceConfig.externalEditLink ?? {})
|
|
357
355
|
}
|
|
358
356
|
: undefined,
|
|
359
357
|
// Deep merge dynamic schema
|
|
360
358
|
dynamicSchema: (instanceConfig.dynamicSchema ?? typeConfig.dynamicSchema)
|
|
361
359
|
? {
|
|
362
360
|
...(typeConfig.dynamicSchema ?? {}),
|
|
363
|
-
...(instanceConfig.dynamicSchema ?? {})
|
|
361
|
+
...(instanceConfig.dynamicSchema ?? {})
|
|
364
362
|
}
|
|
365
|
-
: undefined
|
|
363
|
+
: undefined
|
|
366
364
|
};
|
|
367
365
|
}
|
|
368
366
|
/**
|
|
@@ -395,7 +393,7 @@ export function invalidateSchemaCache(node, endpoint) {
|
|
|
395
393
|
type: node.type,
|
|
396
394
|
metadata: node.data.metadata,
|
|
397
395
|
config: node.data.config,
|
|
398
|
-
extensions: node.data.extensions
|
|
396
|
+
extensions: node.data.extensions
|
|
399
397
|
};
|
|
400
398
|
const cacheKey = generateCacheKey(endpoint, context);
|
|
401
399
|
schemaCache.delete(cacheKey);
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* reimplementing the logic, ensuring "blur active element" flushing and metadata
|
|
8
8
|
* construction happen in exactly one place.
|
|
9
9
|
*/
|
|
10
|
-
import type { Workflow } from
|
|
11
|
-
import type { FlowDropEventHandlers, FlowDropFeatures } from
|
|
10
|
+
import type { Workflow } from '../types/index.js';
|
|
11
|
+
import type { FlowDropEventHandlers, FlowDropFeatures } from '../types/events.js';
|
|
12
12
|
/**
|
|
13
13
|
* Minimal interface for the enhanced API client used when an authProvider is present.
|
|
14
14
|
* Matches the surface of EnhancedFlowDropApiClient that save needs.
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
* reimplementing the logic, ensuring "blur active element" flushing and metadata
|
|
8
8
|
* construction happen in exactly one place.
|
|
9
9
|
*/
|
|
10
|
-
import { tick } from
|
|
11
|
-
import { getWorkflowStore, workflowActions, markAsSaved as storeMarkAsSaved
|
|
12
|
-
import { workflowApi, setEndpointConfig } from
|
|
13
|
-
import { createEndpointConfig } from
|
|
14
|
-
import { v4 as uuidv4 } from
|
|
15
|
-
import { DEFAULT_WORKFLOW_FORMAT } from
|
|
16
|
-
import { apiToasts, workflowToasts, dismissToast } from
|
|
17
|
-
import { DEFAULT_FEATURES } from
|
|
10
|
+
import { tick } from 'svelte';
|
|
11
|
+
import { getWorkflowStore, workflowActions, markAsSaved as storeMarkAsSaved } from '../stores/workflowStore.svelte.js';
|
|
12
|
+
import { workflowApi, setEndpointConfig } from './api.js';
|
|
13
|
+
import { createEndpointConfig } from '../config/endpoints.js';
|
|
14
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
15
|
+
import { DEFAULT_WORKFLOW_FORMAT } from '../types/index.js';
|
|
16
|
+
import { apiToasts, workflowToasts, dismissToast } from './toastService.js';
|
|
17
|
+
import { DEFAULT_FEATURES } from '../types/events.js';
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
19
19
|
// Internal helpers
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
@@ -25,7 +25,7 @@ import { DEFAULT_FEATURES } from "../types/events.js";
|
|
|
25
25
|
*/
|
|
26
26
|
async function ensureApiConfiguration() {
|
|
27
27
|
try {
|
|
28
|
-
const { getEndpointConfig } = await import(
|
|
28
|
+
const { getEndpointConfig } = await import('./api.js');
|
|
29
29
|
const currentConfig = getEndpointConfig();
|
|
30
30
|
if (currentConfig && currentConfig.baseUrl) {
|
|
31
31
|
return;
|
|
@@ -35,20 +35,20 @@ async function ensureApiConfiguration() {
|
|
|
35
35
|
// Could not check existing API configuration, initializing
|
|
36
36
|
}
|
|
37
37
|
// API configuration is not initialized — derive URL from window.location when available
|
|
38
|
-
const apiBaseUrl = typeof window !==
|
|
38
|
+
const apiBaseUrl = typeof window !== 'undefined'
|
|
39
39
|
? `${window.location.protocol}//${window.location.host}/api/flowdrop`
|
|
40
|
-
:
|
|
40
|
+
: '/api/flowdrop';
|
|
41
41
|
const config = createEndpointConfig(apiBaseUrl, {
|
|
42
42
|
auth: {
|
|
43
|
-
type:
|
|
43
|
+
type: 'none'
|
|
44
44
|
},
|
|
45
45
|
timeout: 10000,
|
|
46
46
|
retry: {
|
|
47
47
|
enabled: true,
|
|
48
48
|
maxAttempts: 2,
|
|
49
49
|
delay: 1000,
|
|
50
|
-
backoff:
|
|
51
|
-
}
|
|
50
|
+
backoff: 'exponential'
|
|
51
|
+
}
|
|
52
52
|
});
|
|
53
53
|
setEndpointConfig(config);
|
|
54
54
|
}
|
|
@@ -60,8 +60,7 @@ async function ensureApiConfiguration() {
|
|
|
60
60
|
* Must be called once, in this file only, so the logic lives in exactly one place.
|
|
61
61
|
*/
|
|
62
62
|
async function flushPendingFormChanges() {
|
|
63
|
-
if (typeof document !==
|
|
64
|
-
document.activeElement instanceof HTMLElement) {
|
|
63
|
+
if (typeof document !== 'undefined' && document.activeElement instanceof HTMLElement) {
|
|
65
64
|
document.activeElement.blur();
|
|
66
65
|
}
|
|
67
66
|
// Wait for any pending DOM / Svelte reactive updates before reading the store
|
|
@@ -94,7 +93,7 @@ export async function globalSaveWorkflow(options = {}) {
|
|
|
94
93
|
const currentWorkflow = getWorkflowStore();
|
|
95
94
|
if (!currentWorkflow) {
|
|
96
95
|
if (features.showToasts) {
|
|
97
|
-
apiToasts.error(
|
|
96
|
+
apiToasts.error('Save workflow', 'No workflow to save');
|
|
98
97
|
}
|
|
99
98
|
return;
|
|
100
99
|
}
|
|
@@ -105,9 +104,7 @@ export async function globalSaveWorkflow(options = {}) {
|
|
|
105
104
|
return;
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
|
-
const loadingToast = features.showToasts
|
|
109
|
-
? apiToasts.loading("Saving workflow")
|
|
110
|
-
: null;
|
|
107
|
+
const loadingToast = features.showToasts ? apiToasts.loading('Saving workflow') : null;
|
|
111
108
|
try {
|
|
112
109
|
// Ensure API configuration is initialised (needed when called outside App.svelte)
|
|
113
110
|
await ensureApiConfiguration();
|
|
@@ -121,17 +118,17 @@ export async function globalSaveWorkflow(options = {}) {
|
|
|
121
118
|
const workflowId = currentWorkflow.id || uuidv4();
|
|
122
119
|
const finalWorkflow = {
|
|
123
120
|
id: workflowId,
|
|
124
|
-
name: currentWorkflow.name ||
|
|
125
|
-
description: currentWorkflow.description ||
|
|
121
|
+
name: currentWorkflow.name || 'Untitled Workflow',
|
|
122
|
+
description: currentWorkflow.description || '',
|
|
126
123
|
nodes: currentWorkflow.nodes || [],
|
|
127
124
|
edges: currentWorkflow.edges || [],
|
|
128
125
|
metadata: {
|
|
129
126
|
...currentWorkflow.metadata,
|
|
130
|
-
version: currentWorkflow.metadata?.version ||
|
|
127
|
+
version: currentWorkflow.metadata?.version || '1.0.0',
|
|
131
128
|
format: currentWorkflow.metadata?.format || DEFAULT_WORKFLOW_FORMAT,
|
|
132
129
|
createdAt: currentWorkflow.metadata?.createdAt || new Date().toISOString(),
|
|
133
|
-
updatedAt: new Date().toISOString()
|
|
134
|
-
}
|
|
130
|
+
updatedAt: new Date().toISOString()
|
|
131
|
+
}
|
|
135
132
|
};
|
|
136
133
|
// Step 4 — Persist
|
|
137
134
|
let savedWorkflow;
|
|
@@ -161,8 +158,8 @@ export async function globalSaveWorkflow(options = {}) {
|
|
|
161
158
|
name: finalWorkflow.name,
|
|
162
159
|
metadata: {
|
|
163
160
|
...finalWorkflow.metadata,
|
|
164
|
-
...savedWorkflow.metadata
|
|
165
|
-
}
|
|
161
|
+
...savedWorkflow.metadata
|
|
162
|
+
}
|
|
166
163
|
});
|
|
167
164
|
}
|
|
168
165
|
// Step 6a — Mark dirty state as clean
|
|
@@ -187,7 +184,7 @@ export async function globalSaveWorkflow(options = {}) {
|
|
|
187
184
|
catch (error) {
|
|
188
185
|
if (loadingToast)
|
|
189
186
|
dismissToast(loadingToast);
|
|
190
|
-
const errorObj = error instanceof Error ? error : new Error(
|
|
187
|
+
const errorObj = error instanceof Error ? error : new Error('Unknown error occurred');
|
|
191
188
|
// onSaveError hook
|
|
192
189
|
const currentWorkflowForError = getWorkflowStore();
|
|
193
190
|
if (eventHandlers?.onSaveError && currentWorkflowForError) {
|
|
@@ -196,10 +193,10 @@ export async function globalSaveWorkflow(options = {}) {
|
|
|
196
193
|
// onApiError hook — return true suppresses the default toast
|
|
197
194
|
let suppressToast = false;
|
|
198
195
|
if (eventHandlers?.onApiError) {
|
|
199
|
-
suppressToast = eventHandlers.onApiError(errorObj,
|
|
196
|
+
suppressToast = eventHandlers.onApiError(errorObj, 'save') === true;
|
|
200
197
|
}
|
|
201
198
|
if (features.showToasts && !suppressToast) {
|
|
202
|
-
apiToasts.error(
|
|
199
|
+
apiToasts.error('Save workflow', errorObj.message);
|
|
203
200
|
}
|
|
204
201
|
throw error;
|
|
205
202
|
}
|
|
@@ -220,30 +217,30 @@ export async function globalExportWorkflow(options = {}) {
|
|
|
220
217
|
const currentWorkflow = getWorkflowStore();
|
|
221
218
|
if (!currentWorkflow) {
|
|
222
219
|
if (features.showToasts) {
|
|
223
|
-
apiToasts.error(
|
|
220
|
+
apiToasts.error('Export workflow', 'No workflow to export');
|
|
224
221
|
}
|
|
225
222
|
return;
|
|
226
223
|
}
|
|
227
224
|
// Build the canonical export object — preserve all metadata fields
|
|
228
225
|
const finalWorkflow = {
|
|
229
|
-
id: currentWorkflow.id ||
|
|
230
|
-
name: currentWorkflow.name ||
|
|
231
|
-
description: currentWorkflow.description ||
|
|
226
|
+
id: currentWorkflow.id || 'untitled-workflow',
|
|
227
|
+
name: currentWorkflow.name || 'Untitled Workflow',
|
|
228
|
+
description: currentWorkflow.description || '',
|
|
232
229
|
nodes: currentWorkflow.nodes || [],
|
|
233
230
|
edges: currentWorkflow.edges || [],
|
|
234
231
|
metadata: {
|
|
235
232
|
...currentWorkflow.metadata,
|
|
236
|
-
version: currentWorkflow.metadata?.version ||
|
|
233
|
+
version: currentWorkflow.metadata?.version || '1.0.0',
|
|
237
234
|
format: currentWorkflow.metadata?.format || DEFAULT_WORKFLOW_FORMAT,
|
|
238
235
|
createdAt: currentWorkflow.metadata?.createdAt || new Date().toISOString(),
|
|
239
|
-
updatedAt: new Date().toISOString()
|
|
240
|
-
}
|
|
236
|
+
updatedAt: new Date().toISOString()
|
|
237
|
+
}
|
|
241
238
|
};
|
|
242
239
|
// Trigger browser download
|
|
243
240
|
const dataStr = JSON.stringify(finalWorkflow, null, 2);
|
|
244
|
-
const dataBlob = new Blob([dataStr], { type:
|
|
241
|
+
const dataBlob = new Blob([dataStr], { type: 'application/json' });
|
|
245
242
|
const url = URL.createObjectURL(dataBlob);
|
|
246
|
-
const link = document.createElement(
|
|
243
|
+
const link = document.createElement('a');
|
|
247
244
|
link.href = url;
|
|
248
245
|
link.download = `${finalWorkflow.name}.json`;
|
|
249
246
|
link.click();
|
|
@@ -253,7 +250,7 @@ export async function globalExportWorkflow(options = {}) {
|
|
|
253
250
|
}
|
|
254
251
|
}
|
|
255
252
|
catch (error) {
|
|
256
|
-
const errorObj = error instanceof Error ? error : new Error(
|
|
257
|
-
apiToasts.error(
|
|
253
|
+
const errorObj = error instanceof Error ? error : new Error('Unknown error occurred');
|
|
254
|
+
apiToasts.error('Export workflow', errorObj.message);
|
|
258
255
|
}
|
|
259
256
|
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module services/historyService
|
|
8
8
|
*/
|
|
9
|
-
import { DEFAULT_BEHAVIOR_SETTINGS } from
|
|
10
|
-
import { logger } from
|
|
9
|
+
import { DEFAULT_BEHAVIOR_SETTINGS } from '../types/settings.js';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
11
|
// =========================================================================
|
|
12
12
|
// History Service Class
|
|
13
13
|
// =========================================================================
|
|
@@ -77,7 +77,7 @@ export class HistoryService {
|
|
|
77
77
|
this.undoStack.push({
|
|
78
78
|
snapshot: this.cloneWorkflow(workflow),
|
|
79
79
|
timestamp: Date.now(),
|
|
80
|
-
description:
|
|
80
|
+
description: 'Initial state'
|
|
81
81
|
});
|
|
82
82
|
this.notifyChange();
|
|
83
83
|
}
|
|
@@ -154,7 +154,7 @@ export class HistoryService {
|
|
|
154
154
|
*/
|
|
155
155
|
startTransaction(workflow, description) {
|
|
156
156
|
if (this.inTransaction) {
|
|
157
|
-
logger.warn(
|
|
157
|
+
logger.warn('HistoryService: Transaction already in progress, ignoring startTransaction');
|
|
158
158
|
return;
|
|
159
159
|
}
|
|
160
160
|
this.inTransaction = true;
|
|
@@ -168,7 +168,7 @@ export class HistoryService {
|
|
|
168
168
|
*/
|
|
169
169
|
commitTransaction() {
|
|
170
170
|
if (!this.inTransaction || !this.transactionSnapshot) {
|
|
171
|
-
logger.warn(
|
|
171
|
+
logger.warn('HistoryService: No transaction in progress, ignoring commitTransaction');
|
|
172
172
|
return;
|
|
173
173
|
}
|
|
174
174
|
// Push the snapshot captured at transaction start
|
|
@@ -209,7 +209,7 @@ export class HistoryService {
|
|
|
209
209
|
this.undoStack.push({
|
|
210
210
|
snapshot: this.cloneWorkflow(currentWorkflow),
|
|
211
211
|
timestamp: Date.now(),
|
|
212
|
-
description:
|
|
212
|
+
description: 'Initial state'
|
|
213
213
|
});
|
|
214
214
|
}
|
|
215
215
|
this.notifyChange();
|
|
@@ -225,7 +225,7 @@ export class HistoryService {
|
|
|
225
225
|
canRedo: this.redoStack.length > 0,
|
|
226
226
|
currentIndex: this.undoStack.length - 1,
|
|
227
227
|
historyLength: this.undoStack.length + this.redoStack.length,
|
|
228
|
-
isInTransaction: this.inTransaction
|
|
228
|
+
isInTransaction: this.inTransaction
|
|
229
229
|
};
|
|
230
230
|
}
|
|
231
231
|
/**
|
|
@@ -276,7 +276,7 @@ export class HistoryService {
|
|
|
276
276
|
this.undoStack.push({
|
|
277
277
|
snapshot: this.cloneWorkflow(workflow),
|
|
278
278
|
timestamp: Date.now(),
|
|
279
|
-
description
|
|
279
|
+
description
|
|
280
280
|
});
|
|
281
281
|
// Trim history if over limit
|
|
282
282
|
this.trimHistory();
|
|
@@ -305,8 +305,8 @@ export class HistoryService {
|
|
|
305
305
|
...workflow,
|
|
306
306
|
nodes: workflow.nodes.map((n) => ({
|
|
307
307
|
...n,
|
|
308
|
-
data: { ...n.data, onConfigOpen: undefined }
|
|
309
|
-
}))
|
|
308
|
+
data: { ...n.data, onConfigOpen: undefined }
|
|
309
|
+
}))
|
|
310
310
|
};
|
|
311
311
|
try {
|
|
312
312
|
return structuredClone(cleaned);
|