@flowdrop/flowdrop 1.0.1 → 1.1.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 +50 -50
- package/dist/adapters/WorkflowAdapter.d.ts +1 -1
- package/dist/adapters/WorkflowAdapter.js +25 -25
- package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +2 -2
- package/dist/adapters/agentspec/AgentSpecAdapter.js +133 -122
- 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 +2 -2
- 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 +22 -20
- package/dist/api/enhanced-client.d.ts +3 -3
- package/dist/api/enhanced-client.js +73 -72
- package/dist/components/App.svelte +1081 -961
- package/dist/components/App.svelte.d.ts +9 -6
- package/dist/components/CanvasBanner.stories.svelte +23 -20
- package/dist/components/CanvasBanner.stories.svelte.d.ts +1 -1
- package/dist/components/CanvasBanner.svelte +46 -46
- package/dist/components/ConfigForm.svelte +1164 -1065
- package/dist/components/ConfigForm.svelte.d.ts +2 -2
- package/dist/components/ConfigModal.svelte +180 -180
- package/dist/components/ConfigModal.svelte.d.ts +1 -1
- package/dist/components/ConfigPanel.stories.svelte +35 -35
- package/dist/components/ConfigPanel.stories.svelte.d.ts +1 -1
- package/dist/components/ConfigPanel.svelte +178 -167
- package/dist/components/ConfigPanel.svelte.d.ts +1 -1
- package/dist/components/ConnectionLine.svelte +25 -25
- package/dist/components/EdgeRefresher.svelte +26 -26
- package/dist/components/FlowDropEdge.stories.svelte +179 -143
- package/dist/components/FlowDropEdge.svelte +147 -147
- package/dist/components/FlowDropEdge.svelte.d.ts +1 -1
- package/dist/components/FlowDropZone.svelte +63 -60
- package/dist/components/FlowDropZone.svelte.d.ts +1 -1
- package/dist/components/LoadingSpinner.stories.svelte +19 -19
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +1 -1
- package/dist/components/LoadingSpinner.svelte +21 -21
- package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
- package/dist/components/Logo.stories.svelte +13 -13
- package/dist/components/Logo.stories.svelte.d.ts +1 -1
- package/dist/components/Logo.svelte +101 -95
- package/dist/components/LogsSidebar.svelte +553 -546
- package/dist/components/LogsSidebar.svelte.d.ts +1 -1
- package/dist/components/MarkdownDisplay.stories.svelte +29 -23
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +1 -1
- package/dist/components/MarkdownDisplay.svelte +16 -14
- package/dist/components/Navbar.stories.svelte +43 -38
- package/dist/components/Navbar.stories.svelte.d.ts +1 -1
- package/dist/components/Navbar.svelte +760 -706
- package/dist/components/Navbar.svelte.d.ts +1 -1
- package/dist/components/NodeSidebar.svelte +900 -746
- package/dist/components/NodeSidebar.svelte.d.ts +3 -1
- package/dist/components/NodeStatusOverlay.stories.svelte +82 -70
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +1 -1
- package/dist/components/NodeStatusOverlay.svelte +295 -280
- package/dist/components/NodeStatusOverlay.svelte.d.ts +3 -3
- package/dist/components/PipelineStatus.svelte +326 -300
- package/dist/components/PipelineStatus.svelte.d.ts +4 -4
- package/dist/components/PortCoordinateTracker.svelte +49 -47
- package/dist/components/PortCoordinateTracker.svelte.d.ts +1 -1
- package/dist/components/ReadOnlyDetails.svelte +156 -156
- package/dist/components/SchemaForm.stories.svelte +106 -98
- package/dist/components/SchemaForm.stories.svelte.d.ts +1 -1
- package/dist/components/SchemaForm.svelte +490 -463
- package/dist/components/SchemaForm.svelte.d.ts +2 -2
- package/dist/components/SettingsModal.svelte +226 -223
- package/dist/components/SettingsModal.svelte.d.ts +1 -1
- package/dist/components/SettingsPanel.svelte +637 -601
- package/dist/components/SettingsPanel.svelte.d.ts +1 -1
- package/dist/components/StatusIcon.stories.svelte +62 -49
- package/dist/components/StatusIcon.stories.svelte.d.ts +1 -1
- package/dist/components/StatusIcon.svelte +87 -87
- package/dist/components/StatusIcon.svelte.d.ts +2 -2
- package/dist/components/StatusLabel.stories.svelte +12 -12
- package/dist/components/StatusLabel.stories.svelte.d.ts +1 -1
- package/dist/components/StatusLabel.svelte +19 -19
- package/dist/components/ThemeToggle.stories.svelte +16 -16
- package/dist/components/ThemeToggle.stories.svelte.d.ts +1 -1
- package/dist/components/ThemeToggle.svelte +180 -169
- package/dist/components/ThemeToggle.svelte.d.ts +1 -1
- package/dist/components/UniversalNode.svelte +150 -138
- package/dist/components/UniversalNode.svelte.d.ts +3 -3
- package/dist/components/WorkflowEditor.svelte +1069 -1014
- package/dist/components/WorkflowEditor.svelte.d.ts +4 -4
- package/dist/components/form/FormArray.svelte +1034 -973
- package/dist/components/form/FormArray.svelte.d.ts +1 -1
- package/dist/components/form/FormAutocomplete.svelte +1021 -978
- package/dist/components/form/FormAutocomplete.svelte.d.ts +1 -1
- package/dist/components/form/FormCheckboxGroup.stories.svelte +23 -20
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormCheckboxGroup.svelte +136 -136
- package/dist/components/form/FormCodeEditor.svelte +452 -434
- package/dist/components/form/FormField.svelte +366 -355
- package/dist/components/form/FormField.svelte.d.ts +2 -2
- package/dist/components/form/FormFieldLight.svelte +400 -384
- package/dist/components/form/FormFieldLight.svelte.d.ts +1 -1
- package/dist/components/form/FormFieldWrapper.stories.svelte +42 -42
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormFieldWrapper.svelte +100 -93
- package/dist/components/form/FormFieldWrapper.svelte.d.ts +1 -1
- package/dist/components/form/FormFieldset.svelte +108 -108
- package/dist/components/form/FormFieldset.svelte.d.ts +2 -2
- package/dist/components/form/FormMarkdownEditor.svelte +758 -725
- package/dist/components/form/FormNumberField.stories.svelte +25 -25
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormNumberField.svelte +88 -88
- package/dist/components/form/FormRangeField.stories.svelte +20 -20
- package/dist/components/form/FormRangeField.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormRangeField.svelte +234 -226
- package/dist/components/form/FormSelect.stories.svelte +38 -38
- package/dist/components/form/FormSelect.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormSelect.svelte +101 -101
- package/dist/components/form/FormSelect.svelte.d.ts +1 -1
- package/dist/components/form/FormTemplateEditor.svelte +847 -798
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +1 -1
- package/dist/components/form/FormTextField.stories.svelte +29 -23
- package/dist/components/form/FormTextField.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormTextField.svelte +68 -68
- package/dist/components/form/FormTextarea.stories.svelte +28 -25
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormTextarea.svelte +74 -74
- package/dist/components/form/FormToggle.stories.svelte +23 -20
- package/dist/components/form/FormToggle.stories.svelte.d.ts +1 -1
- package/dist/components/form/FormToggle.svelte +98 -98
- package/dist/components/form/FormUISchemaRenderer.svelte +120 -113
- 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 +64 -55
- package/dist/components/form/types.d.ts +6 -6
- package/dist/components/form/types.js +9 -4
- package/dist/components/icons/AlertCircleIcon.svelte +11 -0
- package/dist/components/icons/AlertCircleIcon.svelte.d.ts +26 -0
- package/dist/components/icons/CogIcon.svelte +11 -0
- package/dist/components/icons/CogIcon.svelte.d.ts +26 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +54 -38
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/ChoicePrompt.svelte +407 -383
- package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +48 -48
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/ConfirmationPrompt.svelte +280 -274
- package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/FormPrompt.svelte +223 -218
- package/dist/components/interrupt/FormPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/InterruptBubble.svelte +617 -583
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +2 -2
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +66 -56
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/ReviewPrompt.svelte +861 -841
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +38 -33
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +1 -1
- package/dist/components/interrupt/TextInputPrompt.svelte +333 -328
- package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +1 -1
- package/dist/components/interrupt/index.d.ts +5 -5
- package/dist/components/interrupt/index.js +5 -5
- package/dist/components/layouts/MainLayout.svelte +724 -691
- package/dist/components/layouts/MainLayout.svelte.d.ts +6 -6
- package/dist/components/nodes/GatewayNode.stories.svelte +100 -99
- package/dist/components/nodes/GatewayNode.svelte +605 -571
- package/dist/components/nodes/GatewayNode.svelte.d.ts +3 -3
- package/dist/components/nodes/IdeaNode.stories.svelte +44 -43
- package/dist/components/nodes/IdeaNode.svelte +451 -437
- package/dist/components/nodes/IdeaNode.svelte.d.ts +1 -1
- package/dist/components/nodes/NotesNode.stories.svelte +65 -64
- package/dist/components/nodes/NotesNode.svelte +380 -369
- package/dist/components/nodes/NotesNode.svelte.d.ts +1 -1
- package/dist/components/nodes/SimpleNode.stories.svelte +145 -144
- package/dist/components/nodes/SimpleNode.svelte +486 -424
- package/dist/components/nodes/SimpleNode.svelte.d.ts +1 -1
- package/dist/components/nodes/SquareNode.stories.svelte +73 -73
- package/dist/components/nodes/SquareNode.svelte +439 -380
- package/dist/components/nodes/SquareNode.svelte.d.ts +1 -1
- package/dist/components/nodes/TerminalNode.stories.svelte +13 -13
- package/dist/components/nodes/TerminalNode.svelte +709 -670
- package/dist/components/nodes/TerminalNode.svelte.d.ts +1 -1
- package/dist/components/nodes/ToolNode.stories.svelte +181 -180
- package/dist/components/nodes/ToolNode.svelte +505 -447
- package/dist/components/nodes/ToolNode.svelte.d.ts +1 -1
- package/dist/components/nodes/WorkflowNode.stories.svelte +70 -46
- package/dist/components/nodes/WorkflowNode.svelte +621 -551
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +3 -3
- package/dist/components/playground/ChatPanel.svelte +945 -889
- package/dist/components/playground/ExecutionLogs.svelte +495 -472
- package/dist/components/playground/InputCollector.svelte +449 -428
- package/dist/components/playground/MessageBubble.stories.svelte +47 -47
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +1 -1
- package/dist/components/playground/MessageBubble.svelte +626 -610
- package/dist/components/playground/MessageBubble.svelte.d.ts +1 -1
- package/dist/components/playground/Playground.svelte +1088 -1057
- package/dist/components/playground/Playground.svelte.d.ts +3 -3
- package/dist/components/playground/PlaygroundModal.svelte +208 -204
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -3
- package/dist/components/playground/SessionManager.svelte +527 -521
- 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 +65 -65
- package/dist/config/runtimeConfig.d.ts +2 -2
- package/dist/config/runtimeConfig.js +8 -8
- package/dist/core/index.d.ts +63 -59
- package/dist/core/index.js +35 -33
- package/dist/display/index.d.ts +2 -2
- package/dist/display/index.js +2 -2
- package/dist/editor/index.d.ts +62 -62
- package/dist/editor/index.js +53 -53
- 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 +11 -9
- 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 +34 -32
- package/dist/helpers/workflowEditorHelper.d.ts +5 -5
- package/dist/helpers/workflowEditorHelper.js +108 -96
- 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 +9 -9
- package/dist/mocks/app-navigation.js +11 -11
- package/dist/mocks/app-stores.js +8 -8
- 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 +11 -9
- 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/schemas/v1/workflow.schema.json +22 -107
- package/dist/services/agentSpecExecutionService.d.ts +3 -3
- package/dist/services/agentSpecExecutionService.js +59 -55
- 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 +41 -34
- 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/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 +41 -39
- package/dist/services/globalSave.d.ts +2 -2
- package/dist/services/globalSave.js +41 -38
- package/dist/services/historyService.d.ts +1 -1
- package/dist/services/historyService.js +8 -8
- package/dist/services/interruptService.d.ts +1 -1
- package/dist/services/interruptService.js +35 -29
- package/dist/services/nodeExecutionService.d.ts +1 -1
- package/dist/services/nodeExecutionService.js +45 -44
- 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 +25 -19
- 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 +2 -0
- package/dist/skins/default.js +1 -0
- package/dist/skins/index.d.ts +13 -0
- package/dist/skins/index.js +30 -0
- package/dist/skins/slate.d.ts +2 -0
- package/dist/skins/slate.js +78 -0
- 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 +65 -33
- 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 +25 -18
- package/dist/stores/portCoordinateStore.svelte.d.ts +2 -2
- package/dist/stores/portCoordinateStore.svelte.js +15 -8
- package/dist/stores/settingsStore.svelte.d.ts +2 -2
- package/dist/stores/settingsStore.svelte.js +62 -57
- package/dist/stores/workflowStore.svelte.d.ts +3 -3
- package/dist/stores/workflowStore.svelte.js +50 -47
- package/dist/stories/CanvasDecorator.svelte +35 -32
- package/dist/stories/CanvasDecorator.svelte.d.ts +2 -2
- package/dist/stories/EdgeDecorator.svelte +102 -99
- package/dist/stories/EdgeDecorator.svelte.d.ts +1 -1
- package/dist/stories/NodeDecorator.svelte +59 -53
- package/dist/stories/NodeDecorator.svelte.d.ts +1 -1
- package/dist/stories/utils.d.ts +2 -2
- package/dist/stories/utils.js +105 -67
- package/dist/styles/base.css +599 -595
- package/dist/styles/toast.css +14 -14
- package/dist/styles/tokens.css +409 -378
- package/dist/svelte-app.d.ts +9 -9
- package/dist/svelte-app.js +39 -39
- package/dist/themes/default.d.ts +2 -0
- package/dist/themes/default.js +9 -0
- package/dist/themes/index.d.ts +13 -0
- package/dist/themes/index.js +44 -0
- package/dist/themes/minimal.d.ts +2 -0
- package/dist/themes/minimal.js +11 -0
- 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/config.d.ts +6 -6
- package/dist/types/events.d.ts +2 -2
- 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 +5 -3
- package/dist/types/settings.js +25 -18
- package/dist/types/skin.d.ts +31 -0
- package/dist/types/skin.js +1 -0
- package/dist/types/theme.d.ts +35 -0
- package/dist/types/theme.js +1 -0
- 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 +97 -95
- 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/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/nodeStatus.d.ts +1 -1
- package/dist/utils/nodeStatus.js +48 -48
- package/dist/utils/nodeTypes.d.ts +1 -1
- package/dist/utils/nodeTypes.js +21 -20
- package/dist/utils/nodeWrapper.d.ts +7 -7
- package/dist/utils/nodeWrapper.js +21 -19
- package/dist/utils/performanceUtils.d.ts +1 -1
- package/dist/utils/performanceUtils.js +2 -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 +20 -8
- package/package.json +1 -1
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @see https://github.com/oracle/agent-spec
|
|
11
11
|
*/
|
|
12
|
-
import { getComponentTypeDefaults, extractComponentType, AGENTSPEC_NAMESPACE } from
|
|
13
|
-
import { computeAutoLayout } from
|
|
14
|
-
import { v4 as uuidv4 } from
|
|
15
|
-
import { logger } from
|
|
16
|
-
import { buildHandleId, extractPortId, extractDirection } from
|
|
12
|
+
import { getComponentTypeDefaults, extractComponentType, AGENTSPEC_NAMESPACE, } from "./componentTypeDefaults.js";
|
|
13
|
+
import { computeAutoLayout } from "./autoLayout.js";
|
|
14
|
+
import { v4 as uuidv4 } from "uuid";
|
|
15
|
+
import { logger } from "../../utils/logger.js";
|
|
16
|
+
import { buildHandleId, extractPortId, extractDirection, } from "../../utils/handleIds.js";
|
|
17
17
|
// ============================================================================
|
|
18
18
|
// Property ↔ Port Conversion
|
|
19
19
|
// ============================================================================
|
|
@@ -24,27 +24,27 @@ function agentSpecPropertyToNodePort(prop, portType) {
|
|
|
24
24
|
// Map JSON Schema types to FlowDrop data types
|
|
25
25
|
let dataType;
|
|
26
26
|
switch (prop.type) {
|
|
27
|
-
case
|
|
28
|
-
dataType =
|
|
27
|
+
case "string":
|
|
28
|
+
dataType = "string";
|
|
29
29
|
break;
|
|
30
|
-
case
|
|
31
|
-
case
|
|
32
|
-
dataType =
|
|
30
|
+
case "number":
|
|
31
|
+
case "float":
|
|
32
|
+
dataType = "number";
|
|
33
33
|
break;
|
|
34
|
-
case
|
|
35
|
-
dataType =
|
|
34
|
+
case "integer":
|
|
35
|
+
dataType = "number";
|
|
36
36
|
break;
|
|
37
|
-
case
|
|
38
|
-
dataType =
|
|
37
|
+
case "boolean":
|
|
38
|
+
dataType = "boolean";
|
|
39
39
|
break;
|
|
40
|
-
case
|
|
41
|
-
dataType =
|
|
40
|
+
case "array":
|
|
41
|
+
dataType = "array";
|
|
42
42
|
break;
|
|
43
|
-
case
|
|
44
|
-
dataType =
|
|
43
|
+
case "object":
|
|
44
|
+
dataType = "json";
|
|
45
45
|
break;
|
|
46
46
|
default:
|
|
47
|
-
dataType =
|
|
47
|
+
dataType = "mixed";
|
|
48
48
|
}
|
|
49
49
|
return {
|
|
50
50
|
id: prop.title,
|
|
@@ -52,7 +52,7 @@ function agentSpecPropertyToNodePort(prop, portType) {
|
|
|
52
52
|
type: portType,
|
|
53
53
|
dataType,
|
|
54
54
|
required: false,
|
|
55
|
-
description: prop.description
|
|
55
|
+
description: prop.description,
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
@@ -62,32 +62,32 @@ function nodePortToAgentSpecProperty(port) {
|
|
|
62
62
|
// Map FlowDrop data types to JSON Schema types
|
|
63
63
|
let type;
|
|
64
64
|
switch (port.dataType) {
|
|
65
|
-
case
|
|
66
|
-
type =
|
|
65
|
+
case "string":
|
|
66
|
+
type = "string";
|
|
67
67
|
break;
|
|
68
|
-
case
|
|
69
|
-
case
|
|
70
|
-
type =
|
|
68
|
+
case "number":
|
|
69
|
+
case "float":
|
|
70
|
+
type = "number";
|
|
71
71
|
break;
|
|
72
|
-
case
|
|
73
|
-
type =
|
|
72
|
+
case "integer":
|
|
73
|
+
type = "integer";
|
|
74
74
|
break;
|
|
75
|
-
case
|
|
76
|
-
type =
|
|
75
|
+
case "boolean":
|
|
76
|
+
type = "boolean";
|
|
77
77
|
break;
|
|
78
|
-
case
|
|
79
|
-
type =
|
|
78
|
+
case "array":
|
|
79
|
+
type = "array";
|
|
80
80
|
break;
|
|
81
|
-
case
|
|
82
|
-
case
|
|
83
|
-
type =
|
|
81
|
+
case "json":
|
|
82
|
+
case "object":
|
|
83
|
+
type = "object";
|
|
84
84
|
break;
|
|
85
85
|
default:
|
|
86
|
-
type =
|
|
86
|
+
type = "string";
|
|
87
87
|
}
|
|
88
88
|
const prop = {
|
|
89
89
|
title: port.id,
|
|
90
|
-
type
|
|
90
|
+
type,
|
|
91
91
|
};
|
|
92
92
|
if (port.description)
|
|
93
93
|
prop.description = port.description;
|
|
@@ -130,7 +130,7 @@ export class AgentSpecAdapter {
|
|
|
130
130
|
continue;
|
|
131
131
|
const sourcePortId = extractPortId(edge.sourceHandle);
|
|
132
132
|
const sourcePortDataType = this.getSourcePortDataType(sourceNode, sourcePortId);
|
|
133
|
-
if (sourcePortDataType ===
|
|
133
|
+
if (sourcePortDataType === "trigger") {
|
|
134
134
|
controlFlowEdges.push(this.convertToControlFlowEdge(edge, sourceNode, nodeIdToName));
|
|
135
135
|
}
|
|
136
136
|
else {
|
|
@@ -140,7 +140,7 @@ export class AgentSpecAdapter {
|
|
|
140
140
|
// Find start node
|
|
141
141
|
const startNodeName = this.findStartNodeName(agentSpecNodes, nodeIdToName);
|
|
142
142
|
return {
|
|
143
|
-
component_type:
|
|
143
|
+
component_type: "flow",
|
|
144
144
|
name: workflow.name,
|
|
145
145
|
description: workflow.description,
|
|
146
146
|
start_node: startNodeName,
|
|
@@ -148,11 +148,15 @@ export class AgentSpecAdapter {
|
|
|
148
148
|
control_flow_connections: controlFlowEdges,
|
|
149
149
|
data_flow_connections: dataFlowEdges.length > 0 ? dataFlowEdges : null,
|
|
150
150
|
metadata: {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
...(workflow.metadata?.author
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
"flowdrop:workflow_id": workflow.id,
|
|
152
|
+
"flowdrop:version": workflow.metadata?.version,
|
|
153
|
+
...(workflow.metadata?.author
|
|
154
|
+
? { "flowdrop:author": workflow.metadata.author }
|
|
155
|
+
: {}),
|
|
156
|
+
...(workflow.metadata?.tags
|
|
157
|
+
? { "flowdrop:tags": workflow.metadata.tags }
|
|
158
|
+
: {}),
|
|
159
|
+
},
|
|
156
160
|
};
|
|
157
161
|
}
|
|
158
162
|
/**
|
|
@@ -209,18 +213,19 @@ export class AgentSpecAdapter {
|
|
|
209
213
|
}
|
|
210
214
|
}
|
|
211
215
|
return {
|
|
212
|
-
id: agentSpecFlow.metadata?.[
|
|
216
|
+
id: agentSpecFlow.metadata?.["flowdrop:workflow_id"] ||
|
|
217
|
+
uuidv4(),
|
|
213
218
|
name: agentSpecFlow.name,
|
|
214
219
|
description: agentSpecFlow.description,
|
|
215
220
|
nodes,
|
|
216
221
|
edges,
|
|
217
222
|
metadata: {
|
|
218
|
-
version: agentSpecFlow.metadata?.[
|
|
223
|
+
version: agentSpecFlow.metadata?.["flowdrop:version"] || "1.0.0",
|
|
219
224
|
createdAt: new Date().toISOString(),
|
|
220
225
|
updatedAt: new Date().toISOString(),
|
|
221
|
-
author: agentSpecFlow.metadata?.[
|
|
222
|
-
tags: agentSpecFlow.metadata?.[
|
|
223
|
-
}
|
|
226
|
+
author: agentSpecFlow.metadata?.["flowdrop:author"],
|
|
227
|
+
tags: agentSpecFlow.metadata?.["flowdrop:tags"],
|
|
228
|
+
},
|
|
224
229
|
};
|
|
225
230
|
}
|
|
226
231
|
/**
|
|
@@ -251,10 +256,10 @@ export class AgentSpecAdapter {
|
|
|
251
256
|
const name = nodeIdToName.get(node.id) || node.id;
|
|
252
257
|
// Convert data ports (skip trigger/tool ports — those are handled as edges)
|
|
253
258
|
const dataInputs = node.data.metadata.inputs
|
|
254
|
-
.filter((p) => p.dataType !==
|
|
259
|
+
.filter((p) => p.dataType !== "trigger" && p.dataType !== "tool")
|
|
255
260
|
.map((p) => nodePortToAgentSpecProperty(p));
|
|
256
261
|
const dataOutputs = node.data.metadata.outputs
|
|
257
|
-
.filter((p) => p.dataType !==
|
|
262
|
+
.filter((p) => p.dataType !== "trigger" && p.dataType !== "tool")
|
|
258
263
|
.map((p) => nodePortToAgentSpecProperty(p));
|
|
259
264
|
// Build base node
|
|
260
265
|
const base = {
|
|
@@ -264,10 +269,10 @@ export class AgentSpecAdapter {
|
|
|
264
269
|
inputs: dataInputs.length > 0 ? dataInputs : undefined,
|
|
265
270
|
outputs: dataOutputs.length > 0 ? dataOutputs : undefined,
|
|
266
271
|
metadata: {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
272
|
+
"flowdrop:position": node.position,
|
|
273
|
+
"flowdrop:node_id": node.id,
|
|
274
|
+
"flowdrop:node_type_id": node.data.metadata.id,
|
|
275
|
+
},
|
|
271
276
|
};
|
|
272
277
|
// Add type-specific attributes from config
|
|
273
278
|
return this.addNodeSpecificAttributes(base, node);
|
|
@@ -278,7 +283,7 @@ export class AgentSpecAdapter {
|
|
|
278
283
|
addNodeSpecificAttributes(asNode, fdNode) {
|
|
279
284
|
const config = fdNode.data.config || {};
|
|
280
285
|
switch (asNode.component_type) {
|
|
281
|
-
case
|
|
286
|
+
case "llm_node": {
|
|
282
287
|
const llmNode = asNode;
|
|
283
288
|
if (config.prompt_template)
|
|
284
289
|
llmNode.prompt_template = config.prompt_template;
|
|
@@ -288,19 +293,19 @@ export class AgentSpecAdapter {
|
|
|
288
293
|
llmNode.llm_config = config.llm_config_ref;
|
|
289
294
|
return llmNode;
|
|
290
295
|
}
|
|
291
|
-
case
|
|
296
|
+
case "branching_node": {
|
|
292
297
|
const branchNode = asNode;
|
|
293
298
|
const branches = config.branches;
|
|
294
299
|
branchNode.branches = branches
|
|
295
300
|
? branches.map((b) => ({
|
|
296
301
|
name: b.name,
|
|
297
302
|
condition: b.condition || undefined,
|
|
298
|
-
description: b.description || undefined
|
|
303
|
+
description: b.description || undefined,
|
|
299
304
|
}))
|
|
300
305
|
: [];
|
|
301
306
|
return branchNode;
|
|
302
307
|
}
|
|
303
|
-
case
|
|
308
|
+
case "api_node": {
|
|
304
309
|
const apiNode = asNode;
|
|
305
310
|
if (config.endpoint)
|
|
306
311
|
apiNode.endpoint = config.endpoint;
|
|
@@ -309,30 +314,30 @@ export class AgentSpecAdapter {
|
|
|
309
314
|
if (config.headers) {
|
|
310
315
|
try {
|
|
311
316
|
apiNode.headers =
|
|
312
|
-
typeof config.headers ===
|
|
317
|
+
typeof config.headers === "string"
|
|
313
318
|
? JSON.parse(config.headers)
|
|
314
319
|
: config.headers;
|
|
315
320
|
}
|
|
316
321
|
catch (error) {
|
|
317
322
|
// Ignore parse errors
|
|
318
|
-
logger.warn(
|
|
323
|
+
logger.warn("Failed to parse header JSON", error);
|
|
319
324
|
}
|
|
320
325
|
}
|
|
321
326
|
return apiNode;
|
|
322
327
|
}
|
|
323
|
-
case
|
|
328
|
+
case "agent_node": {
|
|
324
329
|
const agentNode = asNode;
|
|
325
330
|
if (config.agent_ref)
|
|
326
331
|
agentNode.agent = config.agent_ref;
|
|
327
332
|
return agentNode;
|
|
328
333
|
}
|
|
329
|
-
case
|
|
334
|
+
case "flow_node": {
|
|
330
335
|
const flowNode = asNode;
|
|
331
336
|
if (config.flow_ref)
|
|
332
337
|
flowNode.flow = config.flow_ref;
|
|
333
338
|
return flowNode;
|
|
334
339
|
}
|
|
335
|
-
case
|
|
340
|
+
case "map_node": {
|
|
336
341
|
const mapNode = asNode;
|
|
337
342
|
if (config.input_collection)
|
|
338
343
|
mapNode.input_collection = config.input_collection;
|
|
@@ -342,7 +347,7 @@ export class AgentSpecAdapter {
|
|
|
342
347
|
mapNode.map_flow = config.map_flow_ref;
|
|
343
348
|
return mapNode;
|
|
344
349
|
}
|
|
345
|
-
case
|
|
350
|
+
case "tool_node": {
|
|
346
351
|
const toolNode = asNode;
|
|
347
352
|
if (config.tool_ref)
|
|
348
353
|
toolNode.tool = config.tool_ref;
|
|
@@ -357,8 +362,8 @@ export class AgentSpecAdapter {
|
|
|
357
362
|
*/
|
|
358
363
|
resolveComponentType(node) {
|
|
359
364
|
// Check extensions first (round-trip preservation)
|
|
360
|
-
const ext = node.data.metadata.extensions?.[
|
|
361
|
-
if (ext && typeof ext ===
|
|
365
|
+
const ext = node.data.metadata.extensions?.["agentspec:component_type"];
|
|
366
|
+
if (ext && typeof ext === "string") {
|
|
362
367
|
return ext;
|
|
363
368
|
}
|
|
364
369
|
// Infer from FlowDrop node type ID
|
|
@@ -368,22 +373,22 @@ export class AgentSpecAdapter {
|
|
|
368
373
|
// Infer from FlowDrop visual type + category
|
|
369
374
|
const nodeType = node.data.metadata.type;
|
|
370
375
|
const category = node.data.metadata.category;
|
|
371
|
-
if (nodeType ===
|
|
372
|
-
return
|
|
373
|
-
if (nodeType ===
|
|
374
|
-
return
|
|
375
|
-
if (nodeType ===
|
|
376
|
-
return
|
|
377
|
-
if (nodeType ===
|
|
378
|
-
return
|
|
379
|
-
if (category ===
|
|
380
|
-
return
|
|
381
|
-
if (category ===
|
|
382
|
-
return
|
|
383
|
-
if (category ===
|
|
384
|
-
return
|
|
376
|
+
if (nodeType === "terminal" && category === "triggers")
|
|
377
|
+
return "start_node";
|
|
378
|
+
if (nodeType === "terminal" && category === "outputs")
|
|
379
|
+
return "end_node";
|
|
380
|
+
if (nodeType === "gateway")
|
|
381
|
+
return "branching_node";
|
|
382
|
+
if (nodeType === "tool")
|
|
383
|
+
return "tool_node";
|
|
384
|
+
if (category === "ai" || category === "models")
|
|
385
|
+
return "llm_node";
|
|
386
|
+
if (category === "agents")
|
|
387
|
+
return "agent_node";
|
|
388
|
+
if (category === "data")
|
|
389
|
+
return "api_node";
|
|
385
390
|
// Default fallback
|
|
386
|
-
return
|
|
391
|
+
return "llm_node";
|
|
387
392
|
}
|
|
388
393
|
/**
|
|
389
394
|
* Convert an Agent Spec node to a FlowDrop StandardNode.
|
|
@@ -394,14 +399,14 @@ export class AgentSpecAdapter {
|
|
|
394
399
|
*/
|
|
395
400
|
convertNodeFromAgentSpec(asNode, nodeId, position) {
|
|
396
401
|
// Restore position from metadata if available (round-trip)
|
|
397
|
-
const savedPosition = asNode.metadata?.[
|
|
402
|
+
const savedPosition = asNode.metadata?.["flowdrop:position"];
|
|
398
403
|
const finalPosition = savedPosition || position;
|
|
399
404
|
// Convert inputs/outputs to FlowDrop ports
|
|
400
|
-
const dataInputs = (asNode.inputs || []).map((p) => agentSpecPropertyToNodePort(p,
|
|
401
|
-
const dataOutputs = (asNode.outputs || []).map((p) => agentSpecPropertyToNodePort(p,
|
|
405
|
+
const dataInputs = (asNode.inputs || []).map((p) => agentSpecPropertyToNodePort(p, "input"));
|
|
406
|
+
const dataOutputs = (asNode.outputs || []).map((p) => agentSpecPropertyToNodePort(p, "output"));
|
|
402
407
|
// Use lightweight adapter defaults (never throws on unknown types)
|
|
403
408
|
const defaults = getComponentTypeDefaults(asNode.component_type);
|
|
404
|
-
const nodeTypeId = asNode.metadata?.[
|
|
409
|
+
const nodeTypeId = asNode.metadata?.["flowdrop:node_type_id"] ||
|
|
405
410
|
`${AGENTSPEC_NAMESPACE}.${asNode.component_type}`;
|
|
406
411
|
const metadata = {
|
|
407
412
|
id: nodeTypeId,
|
|
@@ -409,18 +414,18 @@ export class AgentSpecAdapter {
|
|
|
409
414
|
type: defaults.visualType,
|
|
410
415
|
description: asNode.description || defaults.defaultDescription,
|
|
411
416
|
category: defaults.category,
|
|
412
|
-
version:
|
|
417
|
+
version: "1.0.0",
|
|
413
418
|
icon: defaults.icon,
|
|
414
419
|
color: defaults.color,
|
|
415
420
|
badge: defaults.badge,
|
|
416
421
|
inputs: [...defaults.triggerInputs, ...dataInputs],
|
|
417
422
|
outputs: [...defaults.triggerOutputs, ...dataOutputs],
|
|
418
|
-
configSchema: { type:
|
|
419
|
-
formats: [
|
|
423
|
+
configSchema: { type: "object", properties: {} },
|
|
424
|
+
formats: ["agentspec"],
|
|
420
425
|
extensions: {
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
}
|
|
426
|
+
"agentspec:component_type": asNode.component_type,
|
|
427
|
+
"agentspec:original_name": asNode.name,
|
|
428
|
+
},
|
|
424
429
|
};
|
|
425
430
|
// Build config from Agent Spec node-specific attributes
|
|
426
431
|
const config = this.extractConfigFromAgentSpec(asNode);
|
|
@@ -431,8 +436,8 @@ export class AgentSpecAdapter {
|
|
|
431
436
|
data: {
|
|
432
437
|
label: asNode.name,
|
|
433
438
|
config,
|
|
434
|
-
metadata
|
|
435
|
-
}
|
|
439
|
+
metadata,
|
|
440
|
+
},
|
|
436
441
|
};
|
|
437
442
|
}
|
|
438
443
|
/**
|
|
@@ -441,7 +446,7 @@ export class AgentSpecAdapter {
|
|
|
441
446
|
extractConfigFromAgentSpec(asNode) {
|
|
442
447
|
const config = {};
|
|
443
448
|
switch (asNode.component_type) {
|
|
444
|
-
case
|
|
449
|
+
case "llm_node": {
|
|
445
450
|
const llm = asNode;
|
|
446
451
|
if (llm.prompt_template)
|
|
447
452
|
config.prompt_template = llm.prompt_template;
|
|
@@ -449,21 +454,23 @@ export class AgentSpecAdapter {
|
|
|
449
454
|
config.system_prompt = llm.system_prompt;
|
|
450
455
|
if (llm.llm_config) {
|
|
451
456
|
config.llm_config_ref =
|
|
452
|
-
typeof llm.llm_config ===
|
|
457
|
+
typeof llm.llm_config === "string"
|
|
458
|
+
? llm.llm_config
|
|
459
|
+
: llm.llm_config.name;
|
|
453
460
|
}
|
|
454
461
|
break;
|
|
455
462
|
}
|
|
456
|
-
case
|
|
463
|
+
case "branching_node": {
|
|
457
464
|
const branch = asNode;
|
|
458
465
|
config.branches = branch.branches.map((b) => ({
|
|
459
466
|
name: b.name,
|
|
460
467
|
label: b.name,
|
|
461
|
-
condition: b.condition ||
|
|
462
|
-
isDefault: !b.condition
|
|
468
|
+
condition: b.condition || "",
|
|
469
|
+
isDefault: !b.condition,
|
|
463
470
|
}));
|
|
464
471
|
break;
|
|
465
472
|
}
|
|
466
|
-
case
|
|
473
|
+
case "api_node": {
|
|
467
474
|
const api = asNode;
|
|
468
475
|
if (api.endpoint)
|
|
469
476
|
config.endpoint = api.endpoint;
|
|
@@ -473,35 +480,39 @@ export class AgentSpecAdapter {
|
|
|
473
480
|
config.headers = JSON.stringify(api.headers, null, 2);
|
|
474
481
|
break;
|
|
475
482
|
}
|
|
476
|
-
case
|
|
483
|
+
case "agent_node": {
|
|
477
484
|
const agent = asNode;
|
|
478
485
|
if (agent.agent) {
|
|
479
|
-
config.agent_ref =
|
|
486
|
+
config.agent_ref =
|
|
487
|
+
typeof agent.agent === "string" ? agent.agent : agent.agent.name;
|
|
480
488
|
}
|
|
481
489
|
break;
|
|
482
490
|
}
|
|
483
|
-
case
|
|
491
|
+
case "flow_node": {
|
|
484
492
|
const flow = asNode;
|
|
485
493
|
if (flow.flow) {
|
|
486
|
-
config.flow_ref =
|
|
494
|
+
config.flow_ref =
|
|
495
|
+
typeof flow.flow === "string" ? flow.flow : flow.flow.name;
|
|
487
496
|
}
|
|
488
497
|
break;
|
|
489
498
|
}
|
|
490
|
-
case
|
|
499
|
+
case "map_node": {
|
|
491
500
|
const map = asNode;
|
|
492
501
|
if (map.input_collection)
|
|
493
502
|
config.input_collection = map.input_collection;
|
|
494
503
|
if (map.output_collection)
|
|
495
504
|
config.output_collection = map.output_collection;
|
|
496
505
|
if (map.map_flow) {
|
|
497
|
-
config.map_flow_ref =
|
|
506
|
+
config.map_flow_ref =
|
|
507
|
+
typeof map.map_flow === "string" ? map.map_flow : map.map_flow.name;
|
|
498
508
|
}
|
|
499
509
|
break;
|
|
500
510
|
}
|
|
501
|
-
case
|
|
511
|
+
case "tool_node": {
|
|
502
512
|
const tool = asNode;
|
|
503
513
|
if (tool.tool) {
|
|
504
|
-
config.tool_ref =
|
|
514
|
+
config.tool_ref =
|
|
515
|
+
typeof tool.tool === "string" ? tool.tool : tool.tool.name;
|
|
505
516
|
}
|
|
506
517
|
break;
|
|
507
518
|
}
|
|
@@ -522,10 +533,10 @@ export class AgentSpecAdapter {
|
|
|
522
533
|
if (port)
|
|
523
534
|
return port.dataType;
|
|
524
535
|
// Check if it's a gateway branch (always trigger)
|
|
525
|
-
if (node.data.metadata.type ===
|
|
536
|
+
if (node.data.metadata.type === "gateway") {
|
|
526
537
|
const branches = node.data.config?.branches;
|
|
527
538
|
if (branches?.some((b) => b.name === portId)) {
|
|
528
|
-
return
|
|
539
|
+
return "trigger";
|
|
529
540
|
}
|
|
530
541
|
}
|
|
531
542
|
// Check dynamic outputs
|
|
@@ -546,17 +557,17 @@ export class AgentSpecAdapter {
|
|
|
546
557
|
const sourcePortId = extractPortId(edge.sourceHandle);
|
|
547
558
|
// Determine from_branch for gateway nodes
|
|
548
559
|
let fromBranch;
|
|
549
|
-
if (sourceNode.data.metadata.type ===
|
|
560
|
+
if (sourceNode.data.metadata.type === "gateway" && sourcePortId) {
|
|
550
561
|
const branches = sourceNode.data.config?.branches;
|
|
551
562
|
if (branches?.some((b) => b.name === sourcePortId)) {
|
|
552
563
|
fromBranch = sourcePortId;
|
|
553
564
|
}
|
|
554
565
|
}
|
|
555
566
|
return {
|
|
556
|
-
name: `${fromNode}_to_${toNode}${fromBranch ? `_${fromBranch}` :
|
|
567
|
+
name: `${fromNode}_to_${toNode}${fromBranch ? `_${fromBranch}` : ""}`,
|
|
557
568
|
from_node: fromNode,
|
|
558
569
|
to_node: toNode,
|
|
559
|
-
from_branch: fromBranch
|
|
570
|
+
from_branch: fromBranch,
|
|
560
571
|
};
|
|
561
572
|
}
|
|
562
573
|
/**
|
|
@@ -565,14 +576,14 @@ export class AgentSpecAdapter {
|
|
|
565
576
|
convertToDataFlowEdge(edge, nodeIdToName) {
|
|
566
577
|
const sourceNode = nodeIdToName.get(edge.source) || edge.source;
|
|
567
578
|
const destNode = nodeIdToName.get(edge.target) || edge.target;
|
|
568
|
-
const sourceOutput = extractPortId(edge.sourceHandle) ||
|
|
569
|
-
const destInput = extractPortId(edge.targetHandle) ||
|
|
579
|
+
const sourceOutput = extractPortId(edge.sourceHandle) || "output";
|
|
580
|
+
const destInput = extractPortId(edge.targetHandle) || "input";
|
|
570
581
|
return {
|
|
571
582
|
name: `${sourceNode}_${sourceOutput}_to_${destNode}_${destInput}`,
|
|
572
583
|
source_node: sourceNode,
|
|
573
584
|
source_output: sourceOutput,
|
|
574
585
|
destination_node: destNode,
|
|
575
|
-
destination_input: destInput
|
|
586
|
+
destination_input: destInput,
|
|
576
587
|
};
|
|
577
588
|
}
|
|
578
589
|
/**
|
|
@@ -584,7 +595,7 @@ export class AgentSpecAdapter {
|
|
|
584
595
|
if (!sourceId || !targetId)
|
|
585
596
|
return null;
|
|
586
597
|
// Determine source handle
|
|
587
|
-
let sourcePortId =
|
|
598
|
+
let sourcePortId = "trigger"; // default for non-branch control flow
|
|
588
599
|
if (cfEdge.from_branch) {
|
|
589
600
|
sourcePortId = cfEdge.from_branch;
|
|
590
601
|
}
|
|
@@ -592,8 +603,8 @@ export class AgentSpecAdapter {
|
|
|
592
603
|
id: uuidv4(),
|
|
593
604
|
source: sourceId,
|
|
594
605
|
target: targetId,
|
|
595
|
-
sourceHandle: buildHandleId(sourceId,
|
|
596
|
-
targetHandle: buildHandleId(targetId,
|
|
606
|
+
sourceHandle: buildHandleId(sourceId, "output", sourcePortId),
|
|
607
|
+
targetHandle: buildHandleId(targetId, "input", "trigger"),
|
|
597
608
|
};
|
|
598
609
|
}
|
|
599
610
|
/**
|
|
@@ -608,8 +619,8 @@ export class AgentSpecAdapter {
|
|
|
608
619
|
id: uuidv4(),
|
|
609
620
|
source: sourceId,
|
|
610
621
|
target: targetId,
|
|
611
|
-
sourceHandle: buildHandleId(sourceId,
|
|
612
|
-
targetHandle: buildHandleId(targetId,
|
|
622
|
+
sourceHandle: buildHandleId(sourceId, "output", dfEdge.source_output),
|
|
623
|
+
targetHandle: buildHandleId(targetId, "input", dfEdge.destination_input),
|
|
613
624
|
};
|
|
614
625
|
}
|
|
615
626
|
/**
|
|
@@ -617,10 +628,10 @@ export class AgentSpecAdapter {
|
|
|
617
628
|
*/
|
|
618
629
|
findStartNodeName(nodes, nodeIdToName) {
|
|
619
630
|
// Look for an explicit start_node
|
|
620
|
-
const startNode = nodes.find((n) => n.component_type ===
|
|
631
|
+
const startNode = nodes.find((n) => n.component_type === "start_node");
|
|
621
632
|
if (startNode)
|
|
622
633
|
return startNode.name;
|
|
623
634
|
// Fall back to the first node
|
|
624
|
-
return nodes.length > 0 ? nodes[0].name :
|
|
635
|
+
return nodes.length > 0 ? nodes[0].name : "start";
|
|
625
636
|
}
|
|
626
637
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Handles conversion between FlowDrop workflows and full Agent Spec Documents
|
|
5
5
|
* (which wrap a Flow with Agent metadata like tools, LLM config, etc.)
|
|
6
6
|
*/
|
|
7
|
-
import type { AgentSpecDocument, AgentSpecTool, AgentSpecLLMConfig } from
|
|
8
|
-
import type { StandardWorkflow } from
|
|
7
|
+
import type { AgentSpecDocument, AgentSpecTool, AgentSpecLLMConfig } from "../../types/agentspec.js";
|
|
8
|
+
import type { StandardWorkflow } from "../WorkflowAdapter.js";
|
|
9
9
|
/**
|
|
10
10
|
* Agent-level configuration that wraps a workflow.
|
|
11
11
|
* Contains the Agent Spec agent metadata that lives outside the flow.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Handles conversion between FlowDrop workflows and full Agent Spec Documents
|
|
5
5
|
* (which wrap a Flow with Agent metadata like tools, LLM config, etc.)
|
|
6
6
|
*/
|
|
7
|
-
import { AgentSpecAdapter } from
|
|
7
|
+
import { AgentSpecAdapter } from "./AgentSpecAdapter.js";
|
|
8
8
|
export class AgentSpecAgentAdapter {
|
|
9
9
|
flowAdapter;
|
|
10
10
|
constructor() {
|
|
@@ -20,18 +20,18 @@ export class AgentSpecAgentAdapter {
|
|
|
20
20
|
const doc = {
|
|
21
21
|
flow,
|
|
22
22
|
metadata: {
|
|
23
|
-
|
|
24
|
-
}
|
|
23
|
+
"flowdrop:exported_at": new Date().toISOString(),
|
|
24
|
+
},
|
|
25
25
|
};
|
|
26
26
|
// Add agent definition if config provided
|
|
27
27
|
if (agentConfig) {
|
|
28
28
|
const agent = {
|
|
29
|
-
component_type:
|
|
29
|
+
component_type: "agent",
|
|
30
30
|
name: agentConfig.name,
|
|
31
31
|
description: agentConfig.description,
|
|
32
32
|
system_prompt: agentConfig.systemPrompt,
|
|
33
33
|
tools: agentConfig.tools,
|
|
34
|
-
llm_config: agentConfig.llmConfig
|
|
34
|
+
llm_config: agentConfig.llmConfig,
|
|
35
35
|
};
|
|
36
36
|
doc.agent = agent;
|
|
37
37
|
}
|
|
@@ -50,11 +50,11 @@ export class AgentSpecAgentAdapter {
|
|
|
50
50
|
*/
|
|
51
51
|
fromAgentSpecDocument(doc) {
|
|
52
52
|
if (!doc.flow) {
|
|
53
|
-
throw new Error(
|
|
53
|
+
throw new Error("AgentSpecDocument has no flow definition");
|
|
54
54
|
}
|
|
55
55
|
const workflow = this.flowAdapter.fromAgentSpec(doc.flow);
|
|
56
56
|
const result = {
|
|
57
|
-
workflow
|
|
57
|
+
workflow,
|
|
58
58
|
};
|
|
59
59
|
// Extract agent config
|
|
60
60
|
if (doc.agent) {
|
|
@@ -62,10 +62,10 @@ export class AgentSpecAgentAdapter {
|
|
|
62
62
|
name: doc.agent.name,
|
|
63
63
|
description: doc.agent.description,
|
|
64
64
|
systemPrompt: doc.agent.system_prompt,
|
|
65
|
-
tools: doc.agent.tools?.filter((t) => typeof t !==
|
|
66
|
-
llmConfig: doc.agent.llm_config && typeof doc.agent.llm_config !==
|
|
65
|
+
tools: doc.agent.tools?.filter((t) => typeof t !== "string"),
|
|
66
|
+
llmConfig: doc.agent.llm_config && typeof doc.agent.llm_config !== "string"
|
|
67
67
|
? doc.agent.llm_config
|
|
68
|
-
: undefined
|
|
68
|
+
: undefined,
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
// Extract shared declarations
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* 3. Position nodes with configurable spacing
|
|
10
10
|
* 4. Fan out branches vertically from BranchingNode
|
|
11
11
|
*/
|
|
12
|
-
import type { AgentSpecFlow } from
|
|
12
|
+
import type { AgentSpecFlow } from "../../types/agentspec.js";
|
|
13
13
|
/** Layout configuration */
|
|
14
14
|
export interface AutoLayoutConfig {
|
|
15
15
|
/** Horizontal spacing between layers (px) */
|