@flowdrop/flowdrop 1.15.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +475 -0
- package/MIGRATION-2.0.md +472 -0
- package/README.md +23 -23
- package/dist/adapters/WorkflowAdapter.d.ts +1 -1
- package/dist/adapters/WorkflowAdapter.js +14 -8
- package/dist/adapters/agentspec/AgentSpecAdapter.js +7 -7
- package/dist/chat/batchFeedback.d.ts +39 -0
- package/dist/chat/batchFeedback.js +51 -0
- package/dist/commands/executor.js +15 -1
- package/dist/commands/storeIntegration.svelte.d.ts +4 -1
- package/dist/commands/storeIntegration.svelte.js +26 -21
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/App.svelte +162 -192
- package/dist/components/App.svelte.d.ts +47 -8
- package/dist/components/ConfigForm.svelte +71 -47
- package/dist/components/ConfigModal.svelte +7 -2
- package/dist/components/ConnectionLine.svelte +4 -2
- package/dist/components/Navbar.svelte +61 -1
- package/dist/components/NodeSidebar.svelte +27 -45
- package/dist/components/NodeStatusOverlay.svelte +94 -6
- package/dist/components/NodeSwapPicker.svelte +10 -8
- package/dist/components/PipelineStatus.svelte +16 -67
- package/dist/components/PortCoordinateTracker.svelte +5 -6
- package/dist/components/SchemaForm.stories.svelte +1 -3
- package/dist/components/SchemaForm.svelte +18 -25
- package/dist/components/SchemaForm.svelte.d.ts +0 -8
- package/dist/components/SettingsModal.svelte +8 -3
- package/dist/components/SettingsPanel.svelte +20 -4
- package/dist/components/SwapMappingEditor.svelte +67 -49
- package/dist/components/SwapMappingEditor.svelte.d.ts +0 -2
- package/dist/components/UniversalNode.svelte +9 -7
- package/dist/components/WorkflowEditor.svelte +118 -111
- package/dist/components/WorkflowEditor.svelte.d.ts +18 -10
- package/dist/components/chat/AIChatPanel.svelte +93 -89
- package/dist/components/chat/AIChatPanel.svelte.d.ts +0 -4
- package/dist/components/chat/CommandPreview.svelte +2 -1
- package/dist/components/console/CommandConsole.svelte +7 -5
- package/dist/components/console/ConsoleAutocomplete.svelte +10 -11
- package/dist/components/console/ConsoleAutocomplete.svelte.d.ts +6 -0
- package/dist/components/console/ConsoleInput.svelte +15 -6
- package/dist/components/console/ConsoleOutput.svelte +2 -1
- package/dist/components/form/FormArray.svelte +5 -9
- package/dist/components/form/FormArray.svelte.d.ts +2 -1
- package/dist/components/form/FormAutocomplete.svelte +8 -6
- package/dist/components/form/FormField.svelte +4 -2
- package/dist/components/form/FormFieldLight.svelte +4 -2
- package/dist/components/form/FormMarkdownEditor.svelte +9 -4
- package/dist/components/form/FormRangeField.svelte +1 -0
- package/dist/components/form/FormTemplateEditor.svelte +11 -3
- package/dist/components/form/FormToggle.svelte +5 -12
- package/dist/components/form/FormToggle.svelte.d.ts +4 -2
- package/dist/components/form/templateAutocomplete.js +1 -5
- package/dist/components/form/types.d.ts +1 -14
- package/dist/components/interrupt/FormPrompt.svelte +3 -2
- package/dist/components/interrupt/InterruptBubble.svelte +16 -17
- package/dist/components/interrupt/ReviewPrompt.svelte +10 -3
- package/dist/components/interrupt/TextInputPrompt.svelte +2 -1
- package/dist/components/layouts/MainLayout.svelte +20 -13
- package/dist/components/layouts/MainLayout.svelte.d.ts +4 -0
- package/dist/components/nodes/AtomNode.svelte +17 -5
- package/dist/components/nodes/GatewayNode.svelte +19 -10
- package/dist/components/nodes/IdeaNode.svelte +7 -0
- package/dist/components/nodes/SimpleNode.svelte +11 -6
- package/dist/components/nodes/SquareNode.svelte +15 -8
- package/dist/components/nodes/TerminalNode.svelte +9 -4
- package/dist/components/nodes/ToolNode.svelte +7 -1
- package/dist/components/nodes/WorkflowNode.svelte +16 -7
- package/dist/components/playground/ChatInput.svelte +11 -14
- package/dist/components/playground/ChatPanel.svelte +6 -49
- package/dist/components/playground/ChatPanel.svelte.d.ts +0 -14
- package/dist/components/playground/ControlPanel.svelte +134 -123
- package/dist/components/playground/ControlPanel.svelte.d.ts +3 -0
- package/dist/components/playground/ExecutionLogs.svelte +11 -9
- package/dist/components/playground/InputCollector.svelte +11 -9
- package/dist/components/playground/MessageStream.svelte +17 -23
- package/dist/components/playground/PipelineKanbanView.svelte +65 -6
- package/dist/components/playground/PipelinePanel.svelte +11 -5
- package/dist/components/playground/PipelineTableView.svelte +186 -44
- package/dist/components/playground/Playground.svelte +90 -92
- package/dist/components/playground/Playground.svelte.d.ts +2 -0
- package/dist/components/playground/PlaygroundApp.svelte +6 -1
- package/dist/components/playground/PlaygroundApp.svelte.d.ts +3 -0
- package/dist/components/playground/PlaygroundModal.svelte +13 -3
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -0
- package/dist/components/playground/PlaygroundStudio.svelte +34 -32
- package/dist/components/playground/PlaygroundStudio.svelte.d.ts +3 -0
- package/dist/components/playground/SessionManager.svelte +9 -12
- package/dist/components/playground/pipelineViewUtils.svelte.d.ts +28 -0
- package/dist/components/playground/pipelineViewUtils.svelte.js +38 -1
- package/dist/config/endpoints.d.ts +0 -7
- package/dist/config/endpoints.js +2 -10
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +6 -6
- package/dist/display/index.d.ts +0 -2
- package/dist/display/index.js +0 -6
- package/dist/editor/index.d.ts +19 -20
- package/dist/editor/index.js +25 -35
- package/dist/form/code.d.ts +25 -15
- package/dist/form/code.js +44 -41
- package/dist/form/fieldRegistry.d.ts +17 -13
- package/dist/form/fieldRegistry.js +32 -12
- package/dist/form/full.d.ts +17 -13
- package/dist/form/full.js +22 -27
- package/dist/form/index.d.ts +3 -3
- package/dist/form/index.js +3 -3
- package/dist/form/markdown.d.ts +13 -8
- package/dist/form/markdown.js +22 -23
- package/dist/helpers/proximityConnect.d.ts +3 -2
- package/dist/helpers/proximityConnect.js +2 -5
- package/dist/helpers/workflowEditorHelper.d.ts +12 -5
- package/dist/helpers/workflowEditorHelper.js +27 -25
- package/dist/index.d.ts +28 -24
- package/dist/index.js +27 -50
- package/dist/messages/defaults.d.ts +2 -5
- package/dist/messages/defaults.js +3 -6
- package/dist/messages/index.d.ts +0 -1
- package/dist/messages/index.js +0 -1
- package/dist/mocks/app-forms.d.ts +6 -2
- package/dist/mocks/app-forms.js +11 -4
- package/dist/openapi/v1/openapi.yaml +3 -3
- package/dist/playground/index.d.ts +2 -3
- package/dist/playground/index.js +2 -30
- package/dist/playground/mount.d.ts +15 -0
- package/dist/playground/mount.js +46 -20
- package/dist/registry/{BaseRegistry.d.ts → BaseRegistry.svelte.d.ts} +22 -1
- package/dist/registry/{BaseRegistry.js → BaseRegistry.svelte.js} +37 -1
- package/dist/registry/builtinFormats.d.ts +9 -18
- package/dist/registry/builtinFormats.js +9 -39
- package/dist/registry/builtinNodes.d.ts +0 -25
- package/dist/registry/builtinNodes.js +1 -50
- package/dist/registry/index.d.ts +3 -4
- package/dist/registry/index.js +4 -6
- package/dist/registry/nodeComponentRegistry.d.ts +182 -15
- package/dist/registry/nodeComponentRegistry.js +235 -17
- package/dist/registry/workflowFormatRegistry.d.ts +14 -9
- package/dist/registry/workflowFormatRegistry.js +24 -8
- package/dist/{schema → schemas}/index.d.ts +2 -2
- package/dist/{schema → schemas}/index.js +2 -2
- package/dist/schemas/v1/workflow.schema.json +3 -3
- package/dist/services/agentSpecExecutionService.js +0 -1
- package/dist/services/apiVariableService.d.ts +2 -1
- package/dist/services/apiVariableService.js +5 -22
- package/dist/services/autoSaveService.d.ts +7 -0
- package/dist/services/autoSaveService.js +6 -4
- package/dist/services/chatService.d.ts +8 -4
- package/dist/services/chatService.js +15 -15
- package/dist/services/draftStorage.d.ts +129 -13
- package/dist/services/draftStorage.js +185 -37
- package/dist/services/dynamicSchemaService.d.ts +2 -1
- package/dist/services/dynamicSchemaService.js +5 -22
- package/dist/services/globalSave.d.ts +13 -12
- package/dist/services/globalSave.js +29 -51
- package/dist/services/historyService.d.ts +9 -3
- package/dist/services/historyService.js +9 -3
- package/dist/services/interruptService.d.ts +14 -9
- package/dist/services/interruptService.js +27 -27
- package/dist/services/nodeExecutionService.d.ts +18 -3
- package/dist/services/nodeExecutionService.js +71 -45
- package/dist/services/playgroundService.d.ts +14 -9
- package/dist/services/playgroundService.js +31 -30
- package/dist/services/variableService.d.ts +2 -1
- package/dist/services/variableService.js +2 -2
- package/dist/services/workflowStorage.js +6 -6
- package/dist/stores/apiContext.d.ts +45 -0
- package/dist/stores/apiContext.js +65 -0
- package/dist/stores/categoriesStore.svelte.d.ts +28 -23
- package/dist/stores/categoriesStore.svelte.js +70 -64
- package/dist/stores/getInstance.svelte.d.ts +39 -0
- package/dist/stores/getInstance.svelte.js +65 -0
- package/dist/stores/historyStore.svelte.d.ts +77 -93
- package/dist/stores/historyStore.svelte.js +134 -160
- package/dist/stores/instanceContainer.svelte.d.ts +111 -0
- package/dist/stores/instanceContainer.svelte.js +114 -0
- package/dist/stores/interruptStore.svelte.d.ts +112 -82
- package/dist/stores/interruptStore.svelte.js +253 -226
- package/dist/stores/pipelinePanelStore.svelte.d.ts +27 -3
- package/dist/stores/pipelinePanelStore.svelte.js +61 -14
- package/dist/stores/playgroundStore.svelte.d.ts +169 -222
- package/dist/stores/playgroundStore.svelte.js +515 -580
- package/dist/stores/portCoordinateStore.svelte.d.ts +57 -51
- package/dist/stores/portCoordinateStore.svelte.js +109 -98
- package/dist/stores/settingsStore.svelte.d.ts +4 -1
- package/dist/stores/settingsStore.svelte.js +47 -12
- package/dist/stores/workflowStore.svelte.d.ts +178 -213
- package/dist/stores/workflowStore.svelte.js +449 -501
- package/dist/stories/EdgeDecorator.svelte +5 -2
- package/dist/stories/NodeDecorator.svelte +5 -3
- package/dist/svelte-app.d.ts +60 -10
- package/dist/svelte-app.js +157 -53
- package/dist/types/events.d.ts +6 -3
- package/dist/types/index.d.ts +33 -3
- package/dist/types/navbar.d.ts +7 -0
- package/dist/types/playground.d.ts +18 -3
- package/dist/types/settings.d.ts +13 -0
- package/dist/types/settings.js +1 -0
- package/dist/utils/colors.d.ts +47 -21
- package/dist/utils/colors.js +69 -68
- package/dist/utils/connections.d.ts +9 -15
- package/dist/utils/connections.js +13 -32
- package/dist/utils/duration.d.ts +13 -0
- package/dist/utils/duration.js +45 -0
- package/dist/utils/icons.d.ts +5 -2
- package/dist/utils/icons.js +6 -5
- package/dist/utils/nodeSwap.d.ts +6 -2
- package/dist/utils/nodeSwap.js +62 -126
- package/dist/utils/nodeTypes.d.ts +17 -8
- package/dist/utils/nodeTypes.js +26 -19
- package/dist/utils/performanceUtils.js +7 -0
- package/package.json +6 -5
- package/dist/messages/deprecation.d.ts +0 -20
- package/dist/messages/deprecation.js +0 -33
- package/dist/registry/plugin.d.ts +0 -215
- package/dist/registry/plugin.js +0 -249
- package/dist/services/api.d.ts +0 -129
- package/dist/services/api.js +0 -217
|
@@ -5,7 +5,15 @@
|
|
|
5
5
|
* mechanics: Map storage, subscribe/notify, onClear callbacks, and size tracking.
|
|
6
6
|
*
|
|
7
7
|
* Subclasses define their own `register()` method with domain-appropriate
|
|
8
|
-
* signatures, using `this.items` and `this.notifyListeners()
|
|
8
|
+
* signatures, using `this.items`, `this.touch()`, and `this.notifyListeners()`.
|
|
9
|
+
*
|
|
10
|
+
* Reactivity: a `.svelte.ts` module so it can hold a `$state` version counter
|
|
11
|
+
* (`#version`). Every mutating path bumps it via `touch()`; every read method
|
|
12
|
+
* components derive from reads it once at the top. This makes the plain `Map`
|
|
13
|
+
* backing store observable to `$derived`/`$effect`, so registrations made
|
|
14
|
+
* AFTER a component mounts (e.g. `fd.nodes.registerCustom(...)`) invalidate the
|
|
15
|
+
* derived and trigger a re-render. Mirrors WorkflowStore's `#editVersion`
|
|
16
|
+
* monotonic-counter precedent (workflowStore.svelte.ts).
|
|
9
17
|
*
|
|
10
18
|
* @example
|
|
11
19
|
* ```typescript
|
|
@@ -15,6 +23,7 @@
|
|
|
15
23
|
* throw new Error(`Already registered: ${item.id}`);
|
|
16
24
|
* }
|
|
17
25
|
* this.items.set(item.id, item);
|
|
26
|
+
* this.touch();
|
|
18
27
|
* this.notifyListeners();
|
|
19
28
|
* }
|
|
20
29
|
* }
|
|
@@ -23,10 +32,30 @@
|
|
|
23
32
|
export class BaseRegistry {
|
|
24
33
|
/** Internal storage map */
|
|
25
34
|
items = new Map();
|
|
35
|
+
/**
|
|
36
|
+
* Reactive version counter. Bumped by `touch()` on every mutation; read by
|
|
37
|
+
* every observable read method so Svelte tracks the plain Map as a dependency.
|
|
38
|
+
*/
|
|
39
|
+
#version = $state(0);
|
|
26
40
|
/** Change listeners */
|
|
27
41
|
listeners = new Set();
|
|
28
42
|
/** Callbacks invoked when the registry is cleared (for resetting flags) */
|
|
29
43
|
clearCallbacks = new Set();
|
|
44
|
+
/**
|
|
45
|
+
* Bump the reactive version counter. Subclasses MUST call this after any
|
|
46
|
+
* mutation of `this.items` so derived reads invalidate.
|
|
47
|
+
*/
|
|
48
|
+
touch() {
|
|
49
|
+
this.#version++;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Read the reactive version counter. Subclasses that read `this.items`
|
|
53
|
+
* directly (instead of via `get`/`getAll`/etc.) MUST call this so the access
|
|
54
|
+
* is tracked as a reactive dependency.
|
|
55
|
+
*/
|
|
56
|
+
trackVersion() {
|
|
57
|
+
void this.#version; // reactive dependency
|
|
58
|
+
}
|
|
30
59
|
/**
|
|
31
60
|
* Unregister an item by key.
|
|
32
61
|
*
|
|
@@ -36,6 +65,7 @@ export class BaseRegistry {
|
|
|
36
65
|
unregister(key) {
|
|
37
66
|
const result = this.items.delete(key);
|
|
38
67
|
if (result) {
|
|
68
|
+
this.touch();
|
|
39
69
|
this.notifyListeners();
|
|
40
70
|
}
|
|
41
71
|
return result;
|
|
@@ -47,6 +77,7 @@ export class BaseRegistry {
|
|
|
47
77
|
* @returns The item if found, undefined otherwise
|
|
48
78
|
*/
|
|
49
79
|
get(key) {
|
|
80
|
+
this.trackVersion(); // reactive dependency
|
|
50
81
|
return this.items.get(key);
|
|
51
82
|
}
|
|
52
83
|
/**
|
|
@@ -56,6 +87,7 @@ export class BaseRegistry {
|
|
|
56
87
|
* @returns true if the key is registered
|
|
57
88
|
*/
|
|
58
89
|
has(key) {
|
|
90
|
+
this.trackVersion(); // reactive dependency
|
|
59
91
|
return this.items.has(key);
|
|
60
92
|
}
|
|
61
93
|
/**
|
|
@@ -64,6 +96,7 @@ export class BaseRegistry {
|
|
|
64
96
|
* @returns Array of registered keys
|
|
65
97
|
*/
|
|
66
98
|
getKeys() {
|
|
99
|
+
this.trackVersion(); // reactive dependency
|
|
67
100
|
return Array.from(this.items.keys());
|
|
68
101
|
}
|
|
69
102
|
/**
|
|
@@ -72,6 +105,7 @@ export class BaseRegistry {
|
|
|
72
105
|
* @returns Array of all registered items
|
|
73
106
|
*/
|
|
74
107
|
getAll() {
|
|
108
|
+
this.trackVersion(); // reactive dependency
|
|
75
109
|
return Array.from(this.items.values());
|
|
76
110
|
}
|
|
77
111
|
/**
|
|
@@ -102,6 +136,7 @@ export class BaseRegistry {
|
|
|
102
136
|
*/
|
|
103
137
|
clear() {
|
|
104
138
|
this.items.clear();
|
|
139
|
+
this.touch();
|
|
105
140
|
for (const cb of this.clearCallbacks) {
|
|
106
141
|
cb();
|
|
107
142
|
}
|
|
@@ -111,6 +146,7 @@ export class BaseRegistry {
|
|
|
111
146
|
* Get the count of registered items.
|
|
112
147
|
*/
|
|
113
148
|
get size() {
|
|
149
|
+
this.trackVersion(); // reactive dependency
|
|
114
150
|
return this.items.size;
|
|
115
151
|
}
|
|
116
152
|
/**
|
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Built-in Workflow Format
|
|
2
|
+
* Built-in Workflow Format Adapters
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* This module is automatically loaded when imported,
|
|
8
|
-
* ensuring built-in formats are available without user action.
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* Register all built-in workflow format adapters.
|
|
12
|
-
* Safe to call multiple times — will only register once.
|
|
4
|
+
* Provides the default FlowDrop and Agent Spec format adapters. These are used
|
|
5
|
+
* to seed each instance's `WorkflowFormatRegistry` (see `instanceContainer`).
|
|
13
6
|
*/
|
|
14
|
-
|
|
7
|
+
import type { WorkflowFormatAdapter } from './workflowFormatRegistry.js';
|
|
15
8
|
/**
|
|
16
|
-
*
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* Reset the registration state.
|
|
21
|
-
* Primarily useful for testing.
|
|
9
|
+
* Build the built-in workflow format adapters (FlowDrop native + Agent Spec).
|
|
10
|
+
*
|
|
11
|
+
* Returns a fresh array on each call so every instance owns independent
|
|
12
|
+
* adapter objects (the Agent Spec adapter holds per-conversion state).
|
|
22
13
|
*/
|
|
23
|
-
export declare function
|
|
14
|
+
export declare function getBuiltinFormatAdapters(): WorkflowFormatAdapter[];
|
|
@@ -1,27 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Built-in Workflow Format
|
|
2
|
+
* Built-in Workflow Format Adapters
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* This module is automatically loaded when imported,
|
|
8
|
-
* ensuring built-in formats are available without user action.
|
|
4
|
+
* Provides the default FlowDrop and Agent Spec format adapters. These are used
|
|
5
|
+
* to seed each instance's `WorkflowFormatRegistry` (see `instanceContainer`).
|
|
9
6
|
*/
|
|
10
|
-
import { workflowFormatRegistry } from './workflowFormatRegistry.js';
|
|
11
7
|
import { AgentSpecAdapter } from '../adapters/agentspec/AgentSpecAdapter.js';
|
|
12
8
|
import { validateForAgentSpecExport } from '../adapters/agentspec/validator.js';
|
|
13
9
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Register all built-in workflow format adapters.
|
|
20
|
-
* Safe to call multiple times — will only register once.
|
|
10
|
+
* Build the built-in workflow format adapters (FlowDrop native + Agent Spec).
|
|
11
|
+
*
|
|
12
|
+
* Returns a fresh array on each call so every instance owns independent
|
|
13
|
+
* adapter objects (the Agent Spec adapter holds per-conversion state).
|
|
21
14
|
*/
|
|
22
|
-
export function
|
|
23
|
-
if (registered)
|
|
24
|
-
return;
|
|
15
|
+
export function getBuiltinFormatAdapters() {
|
|
25
16
|
// FlowDrop native — passthrough (StandardWorkflow ↔ JSON)
|
|
26
17
|
const flowdropAdapter = {
|
|
27
18
|
id: 'flowdrop',
|
|
@@ -32,7 +23,6 @@ export function registerBuiltinFormats() {
|
|
|
32
23
|
export: (workflow) => JSON.stringify(workflow, null, 2),
|
|
33
24
|
import: (data) => JSON.parse(data)
|
|
34
25
|
};
|
|
35
|
-
workflowFormatRegistry.register(flowdropAdapter);
|
|
36
26
|
// Agent Spec — wraps existing AgentSpecAdapter
|
|
37
27
|
// No bundled nodes — Agent Spec node types are user-provided via
|
|
38
28
|
// getDefaultAgentSpecNodeTypes() or custom definitions passed to mountFlowDropApp()
|
|
@@ -46,25 +36,5 @@ export function registerBuiltinFormats() {
|
|
|
46
36
|
import: (data) => agentSpecAdapter.importJSON(data),
|
|
47
37
|
validate: (workflow) => validateForAgentSpecExport(workflow)
|
|
48
38
|
};
|
|
49
|
-
|
|
50
|
-
registered = true;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Check if built-in formats have been registered.
|
|
54
|
-
*/
|
|
55
|
-
export function areBuiltinFormatsRegistered() {
|
|
56
|
-
return registered;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Reset the registration state.
|
|
60
|
-
* Primarily useful for testing.
|
|
61
|
-
*/
|
|
62
|
-
export function resetBuiltinFormatRegistration() {
|
|
63
|
-
registered = false;
|
|
39
|
+
return [flowdropAdapter, agentSpecFormatAdapter];
|
|
64
40
|
}
|
|
65
|
-
// Sync registration flag with registry.clear() for test isolation
|
|
66
|
-
workflowFormatRegistry.onClear(() => {
|
|
67
|
-
registered = false;
|
|
68
|
-
});
|
|
69
|
-
// Auto-register built-in formats when this module is imported
|
|
70
|
-
registerBuiltinFormats();
|
|
@@ -20,31 +20,6 @@ export declare const BUILTIN_NODE_COMPONENTS: NodeComponentRegistration[];
|
|
|
20
20
|
* Maps alternative type names to their canonical registration.
|
|
21
21
|
*/
|
|
22
22
|
export declare const BUILTIN_TYPE_ALIASES: Record<string, string>;
|
|
23
|
-
/**
|
|
24
|
-
* Initialize the registry with built-in components.
|
|
25
|
-
* This is called automatically when the library loads.
|
|
26
|
-
*
|
|
27
|
-
* Safe to call multiple times - will only register once.
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* ```typescript
|
|
31
|
-
* // Usually not needed - called automatically
|
|
32
|
-
* // But can be called manually if needed
|
|
33
|
-
* registerBuiltinNodes();
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export declare function registerBuiltinNodes(): void;
|
|
37
|
-
/**
|
|
38
|
-
* Check if built-in nodes have been registered.
|
|
39
|
-
*
|
|
40
|
-
* @returns true if registerBuiltinNodes() has been called
|
|
41
|
-
*/
|
|
42
|
-
export declare function areBuiltinsRegistered(): boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Reset the registration state.
|
|
45
|
-
* Primarily useful for testing.
|
|
46
|
-
*/
|
|
47
|
-
export declare function resetBuiltinRegistration(): void;
|
|
48
23
|
/**
|
|
49
24
|
* Get the canonical type for a given type string.
|
|
50
25
|
* Handles aliases like "default" -> "workflowNode".
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* This module is automatically loaded when the library initializes,
|
|
6
6
|
* ensuring all built-in node types are available without user action.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import {} from './nodeComponentRegistry.js';
|
|
9
9
|
import WorkflowNode from '../components/nodes/WorkflowNode.svelte';
|
|
10
10
|
import SimpleNode from '../components/nodes/SimpleNode.svelte';
|
|
11
11
|
import SquareNode from '../components/nodes/SquareNode.svelte';
|
|
@@ -131,49 +131,6 @@ export const BUILTIN_NODE_COMPONENTS = [
|
|
|
131
131
|
export const BUILTIN_TYPE_ALIASES = {
|
|
132
132
|
default: 'workflowNode'
|
|
133
133
|
};
|
|
134
|
-
/**
|
|
135
|
-
* Track whether built-in nodes have been registered.
|
|
136
|
-
* Prevents duplicate registration on hot reload.
|
|
137
|
-
*/
|
|
138
|
-
let builtinsRegistered = false;
|
|
139
|
-
/**
|
|
140
|
-
* Initialize the registry with built-in components.
|
|
141
|
-
* This is called automatically when the library loads.
|
|
142
|
-
*
|
|
143
|
-
* Safe to call multiple times - will only register once.
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* ```typescript
|
|
147
|
-
* // Usually not needed - called automatically
|
|
148
|
-
* // But can be called manually if needed
|
|
149
|
-
* registerBuiltinNodes();
|
|
150
|
-
* ```
|
|
151
|
-
*/
|
|
152
|
-
export function registerBuiltinNodes() {
|
|
153
|
-
if (builtinsRegistered) {
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
// Register all built-in components
|
|
157
|
-
nodeComponentRegistry.registerAll(BUILTIN_NODE_COMPONENTS, true);
|
|
158
|
-
// Set the default type
|
|
159
|
-
nodeComponentRegistry.setDefaultType('workflowNode');
|
|
160
|
-
builtinsRegistered = true;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Check if built-in nodes have been registered.
|
|
164
|
-
*
|
|
165
|
-
* @returns true if registerBuiltinNodes() has been called
|
|
166
|
-
*/
|
|
167
|
-
export function areBuiltinsRegistered() {
|
|
168
|
-
return builtinsRegistered;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Reset the registration state.
|
|
172
|
-
* Primarily useful for testing.
|
|
173
|
-
*/
|
|
174
|
-
export function resetBuiltinRegistration() {
|
|
175
|
-
builtinsRegistered = false;
|
|
176
|
-
}
|
|
177
134
|
/**
|
|
178
135
|
* Get the canonical type for a given type string.
|
|
179
136
|
* Handles aliases like "default" -> "workflowNode".
|
|
@@ -216,9 +173,3 @@ export const BUILTIN_NODE_TYPES = [
|
|
|
216
173
|
'terminal',
|
|
217
174
|
'idea'
|
|
218
175
|
];
|
|
219
|
-
// Sync registration flag with registry.clear() for test isolation
|
|
220
|
-
nodeComponentRegistry.onClear(() => {
|
|
221
|
-
builtinsRegistered = false;
|
|
222
|
-
});
|
|
223
|
-
// Auto-register built-ins when this module is imported
|
|
224
|
-
registerBuiltinNodes();
|
package/dist/registry/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Node Component Registry Module
|
|
3
3
|
* Exports all registry-related functionality.
|
|
4
4
|
*/
|
|
5
|
-
export { BaseRegistry } from './BaseRegistry.js';
|
|
6
|
-
export {
|
|
7
|
-
export { BUILTIN_NODE_COMPONENTS, BUILTIN_NODE_TYPES, FLOWDROP_SOURCE,
|
|
8
|
-
export { registerFlowDropPlugin, unregisterFlowDropPlugin, registerCustomNode, createPlugin, isValidNamespace, getRegisteredPlugins, getPluginNodeCount, type FlowDropPluginConfig, type PluginNodeDefinition, type PluginRegistrationResult } from './plugin.js';
|
|
5
|
+
export { BaseRegistry } from './BaseRegistry.svelte.js';
|
|
6
|
+
export { NodeComponentRegistry, createNamespacedType, parseNamespacedType, createPlugin, isValidNamespace, type NodeComponentProps, type NodeTypeInfo, type NodeComponentRegistration, type NodeComponentCategory, type StatusPosition, type StatusSize, type NodeRegistrationFilter, type FlowDropPluginConfig, type PluginNodeDefinition, type PluginRegistrationResult } from './nodeComponentRegistry.js';
|
|
7
|
+
export { BUILTIN_NODE_COMPONENTS, BUILTIN_NODE_TYPES, FLOWDROP_SOURCE, resolveBuiltinAlias, isBuiltinType, getBuiltinTypes, type BuiltinNodeType } from './builtinNodes.js';
|
package/dist/registry/index.js
CHANGED
|
@@ -3,10 +3,8 @@
|
|
|
3
3
|
* Exports all registry-related functionality.
|
|
4
4
|
*/
|
|
5
5
|
// Base registry
|
|
6
|
-
export { BaseRegistry } from './BaseRegistry.js';
|
|
7
|
-
// Core registry
|
|
8
|
-
export {
|
|
6
|
+
export { BaseRegistry } from './BaseRegistry.svelte.js';
|
|
7
|
+
// Core registry (the class — instances live on `fd.nodes`)
|
|
8
|
+
export { NodeComponentRegistry, createNamespacedType, parseNamespacedType, createPlugin, isValidNamespace } from './nodeComponentRegistry.js';
|
|
9
9
|
// Built-in nodes
|
|
10
|
-
export { BUILTIN_NODE_COMPONENTS, BUILTIN_NODE_TYPES, FLOWDROP_SOURCE,
|
|
11
|
-
// Plugin system
|
|
12
|
-
export { registerFlowDropPlugin, unregisterFlowDropPlugin, registerCustomNode, createPlugin, isValidNamespace, getRegisteredPlugins, getPluginNodeCount } from './plugin.js';
|
|
10
|
+
export { BUILTIN_NODE_COMPONENTS, BUILTIN_NODE_TYPES, FLOWDROP_SOURCE, resolveBuiltinAlias, isBuiltinType, getBuiltinTypes } from './builtinNodes.js';
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { Component } from 'svelte';
|
|
12
12
|
import type { WorkflowNode } from '../types/index.js';
|
|
13
|
-
import { BaseRegistry } from './BaseRegistry.js';
|
|
13
|
+
import { BaseRegistry } from './BaseRegistry.svelte.js';
|
|
14
14
|
/**
|
|
15
15
|
* Props interface that all node components must accept.
|
|
16
16
|
* Any component registered in the registry must be compatible with these props.
|
|
@@ -86,6 +86,73 @@ export interface NodeRegistrationFilter {
|
|
|
86
86
|
/** Custom filter function */
|
|
87
87
|
predicate?: (registration: NodeComponentRegistration) => boolean;
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Plugin configuration for external libraries.
|
|
91
|
+
* Use this to register multiple node types from a library.
|
|
92
|
+
*/
|
|
93
|
+
export interface FlowDropPluginConfig {
|
|
94
|
+
/**
|
|
95
|
+
* Unique namespace for this plugin.
|
|
96
|
+
* Used to prefix all node types (e.g., "mylib" -> "mylib:nodename").
|
|
97
|
+
* Should be lowercase, alphanumeric with optional hyphens.
|
|
98
|
+
*/
|
|
99
|
+
namespace: string;
|
|
100
|
+
/** Display name for the plugin (for UI/debugging purposes) */
|
|
101
|
+
name: string;
|
|
102
|
+
/** Plugin version (optional, for debugging) */
|
|
103
|
+
version?: string;
|
|
104
|
+
/** Description of what this plugin provides */
|
|
105
|
+
description?: string;
|
|
106
|
+
/** Node components to register */
|
|
107
|
+
nodes: PluginNodeDefinition[];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Simplified node definition for plugins.
|
|
111
|
+
* Provides a cleaner API than full NodeComponentRegistration.
|
|
112
|
+
*/
|
|
113
|
+
export interface PluginNodeDefinition {
|
|
114
|
+
/**
|
|
115
|
+
* Type identifier for this node.
|
|
116
|
+
* Will be prefixed with the plugin namespace (e.g., "fancy" -> "mylib:fancy").
|
|
117
|
+
*/
|
|
118
|
+
type: string;
|
|
119
|
+
/** Display name shown in UI */
|
|
120
|
+
displayName: string;
|
|
121
|
+
/** Description of what this node does */
|
|
122
|
+
description?: string;
|
|
123
|
+
/** The Svelte component to render */
|
|
124
|
+
component: Component<NodeComponentProps>;
|
|
125
|
+
/** Icon in iconify format (e.g., "mdi:star") */
|
|
126
|
+
icon?: string;
|
|
127
|
+
/** Category for organizing in UI */
|
|
128
|
+
category?: NodeComponentCategory;
|
|
129
|
+
/** Status overlay position */
|
|
130
|
+
statusPosition?: StatusPosition;
|
|
131
|
+
/** Status overlay size */
|
|
132
|
+
statusSize?: StatusSize;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Result of plugin registration.
|
|
136
|
+
* Contains information about what was registered and any errors.
|
|
137
|
+
*/
|
|
138
|
+
export interface PluginRegistrationResult {
|
|
139
|
+
/** Whether all nodes were registered successfully */
|
|
140
|
+
success: boolean;
|
|
141
|
+
/** The plugin namespace */
|
|
142
|
+
namespace: string;
|
|
143
|
+
/** Array of successfully registered type identifiers (namespaced) */
|
|
144
|
+
registeredTypes: string[];
|
|
145
|
+
/** Array of error messages for failed registrations */
|
|
146
|
+
errors: string[];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if a namespace is valid.
|
|
150
|
+
* Must be lowercase alphanumeric with optional hyphens.
|
|
151
|
+
*
|
|
152
|
+
* @param namespace - The namespace to validate
|
|
153
|
+
* @returns true if valid
|
|
154
|
+
*/
|
|
155
|
+
export declare function isValidNamespace(namespace: string): boolean;
|
|
89
156
|
/**
|
|
90
157
|
* Central registry for node component types.
|
|
91
158
|
* Allows built-in and third-party components to be registered and resolved.
|
|
@@ -95,7 +162,7 @@ export interface NodeRegistrationFilter {
|
|
|
95
162
|
* @example
|
|
96
163
|
* ```typescript
|
|
97
164
|
* // Register a custom node
|
|
98
|
-
*
|
|
165
|
+
* fd.nodes.register({
|
|
99
166
|
* type: "myCustomNode",
|
|
100
167
|
* displayName: "My Custom Node",
|
|
101
168
|
* component: MyCustomNodeComponent,
|
|
@@ -104,14 +171,28 @@ export interface NodeRegistrationFilter {
|
|
|
104
171
|
* });
|
|
105
172
|
*
|
|
106
173
|
* // Get a component
|
|
107
|
-
* const component =
|
|
174
|
+
* const component = fd.nodes.getComponent("myCustomNode");
|
|
108
175
|
* ```
|
|
109
176
|
*/
|
|
110
|
-
declare class NodeComponentRegistry extends BaseRegistry<string, NodeComponentRegistration> {
|
|
177
|
+
export declare class NodeComponentRegistry extends BaseRegistry<string, NodeComponentRegistration> {
|
|
111
178
|
/** Default type to use when requested type is not found */
|
|
112
179
|
private defaultType;
|
|
113
180
|
/** Initial default type, restored on clear() */
|
|
114
181
|
private static readonly INITIAL_DEFAULT_TYPE;
|
|
182
|
+
/**
|
|
183
|
+
* @param seed - Optional initial registrations and default type. When
|
|
184
|
+
* omitted the registry starts empty; instances created via
|
|
185
|
+
* `createFlowDropInstance` pass the built-in node components (see
|
|
186
|
+
* `builtinNodes.ts`).
|
|
187
|
+
*/
|
|
188
|
+
constructor(seed?: {
|
|
189
|
+
registrations?: NodeComponentRegistration[];
|
|
190
|
+
defaultType?: string;
|
|
191
|
+
});
|
|
192
|
+
/**
|
|
193
|
+
* Clear all registrations and reset default type.
|
|
194
|
+
*/
|
|
195
|
+
clear(): void;
|
|
115
196
|
/**
|
|
116
197
|
* Register a node component type.
|
|
117
198
|
*
|
|
@@ -121,7 +202,7 @@ declare class NodeComponentRegistry extends BaseRegistry<string, NodeComponentRe
|
|
|
121
202
|
*
|
|
122
203
|
* @example
|
|
123
204
|
* ```typescript
|
|
124
|
-
*
|
|
205
|
+
* fd.nodes.register({
|
|
125
206
|
* type: "fancy",
|
|
126
207
|
* displayName: "Fancy Node",
|
|
127
208
|
* component: FancyNode,
|
|
@@ -129,10 +210,6 @@ declare class NodeComponentRegistry extends BaseRegistry<string, NodeComponentRe
|
|
|
129
210
|
* });
|
|
130
211
|
* ```
|
|
131
212
|
*/
|
|
132
|
-
/**
|
|
133
|
-
* Clear all registrations and reset default type.
|
|
134
|
-
*/
|
|
135
|
-
clear(): void;
|
|
136
213
|
register(registration: NodeComponentRegistration, overwrite?: boolean): void;
|
|
137
214
|
/**
|
|
138
215
|
* Register multiple components at once.
|
|
@@ -171,10 +248,10 @@ declare class NodeComponentRegistry extends BaseRegistry<string, NodeComponentRe
|
|
|
171
248
|
* @example
|
|
172
249
|
* ```typescript
|
|
173
250
|
* // Get all visual nodes
|
|
174
|
-
* const visualNodes =
|
|
251
|
+
* const visualNodes = fd.nodes.filter({ category: "visual" });
|
|
175
252
|
*
|
|
176
253
|
* // Get nodes from a specific library
|
|
177
|
-
* const libNodes =
|
|
254
|
+
* const libNodes = fd.nodes.filter({ source: "mylib" });
|
|
178
255
|
* ```
|
|
179
256
|
*/
|
|
180
257
|
filter(filter: NodeRegistrationFilter): NodeComponentRegistration[];
|
|
@@ -214,7 +291,7 @@ declare class NodeComponentRegistry extends BaseRegistry<string, NodeComponentRe
|
|
|
214
291
|
*
|
|
215
292
|
* @example
|
|
216
293
|
* ```typescript
|
|
217
|
-
* const oneOf =
|
|
294
|
+
* const oneOf = fd.nodes.getOneOfOptions();
|
|
218
295
|
* // Use in configSchema: { type: "string", oneOf }
|
|
219
296
|
* ```
|
|
220
297
|
*/
|
|
@@ -236,9 +313,100 @@ declare class NodeComponentRegistry extends BaseRegistry<string, NodeComponentRe
|
|
|
236
313
|
* @returns The status size, or default "md"
|
|
237
314
|
*/
|
|
238
315
|
getStatusSize(type: string): StatusSize;
|
|
316
|
+
/**
|
|
317
|
+
* Register a single custom node without a full plugin.
|
|
318
|
+
* Useful for project-specific custom nodes.
|
|
319
|
+
*
|
|
320
|
+
* @param type - Type identifier (can be namespaced or plain)
|
|
321
|
+
* @param displayName - Display name for UI
|
|
322
|
+
* @param component - Svelte component
|
|
323
|
+
* @param options - Additional options
|
|
324
|
+
*
|
|
325
|
+
* @example
|
|
326
|
+
* ```typescript
|
|
327
|
+
* fd.nodes.registerCustom("myproject:special", "Special Node", MyNode, {
|
|
328
|
+
* icon: "mdi:star",
|
|
329
|
+
* description: "A special node for my project"
|
|
330
|
+
* });
|
|
331
|
+
* ```
|
|
332
|
+
*/
|
|
333
|
+
registerCustom(type: string, displayName: string, component: Component<NodeComponentProps>, options?: {
|
|
334
|
+
description?: string;
|
|
335
|
+
icon?: string;
|
|
336
|
+
category?: NodeComponentCategory;
|
|
337
|
+
source?: string;
|
|
338
|
+
statusPosition?: StatusPosition;
|
|
339
|
+
statusSize?: StatusSize;
|
|
340
|
+
}): void;
|
|
341
|
+
/**
|
|
342
|
+
* Register a FlowDrop plugin with custom node components.
|
|
343
|
+
* All node types are automatically namespaced with the plugin namespace.
|
|
344
|
+
*
|
|
345
|
+
* @param config - Plugin configuration with namespace and node definitions
|
|
346
|
+
* @returns Result object with registered types and any errors
|
|
347
|
+
*/
|
|
348
|
+
registerPlugin(config: FlowDropPluginConfig): PluginRegistrationResult;
|
|
349
|
+
/**
|
|
350
|
+
* Unregister all nodes from a plugin by namespace.
|
|
351
|
+
*
|
|
352
|
+
* @param namespace - The plugin namespace to unregister
|
|
353
|
+
* @returns Array of unregistered type identifiers
|
|
354
|
+
*/
|
|
355
|
+
unregisterPlugin(namespace: string): string[];
|
|
356
|
+
/**
|
|
357
|
+
* Get all registered plugins (unique namespaces).
|
|
358
|
+
*
|
|
359
|
+
* @returns Array of namespace strings
|
|
360
|
+
*/
|
|
361
|
+
getRegisteredPlugins(): string[];
|
|
362
|
+
/**
|
|
363
|
+
* Get the count of nodes registered by a plugin.
|
|
364
|
+
*
|
|
365
|
+
* @param namespace - The plugin namespace
|
|
366
|
+
* @returns Number of nodes registered by this plugin
|
|
367
|
+
*/
|
|
368
|
+
getPluginNodeCount(namespace: string): number;
|
|
239
369
|
}
|
|
240
|
-
/**
|
|
241
|
-
|
|
370
|
+
/**
|
|
371
|
+
* Create a plugin builder for a fluent API experience.
|
|
372
|
+
*
|
|
373
|
+
* @param namespace - Plugin namespace
|
|
374
|
+
* @param name - Plugin name
|
|
375
|
+
* @returns Plugin builder with chainable methods
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* ```typescript
|
|
379
|
+
* import { createPlugin } from "@flowdrop/flowdrop/editor";
|
|
380
|
+
*
|
|
381
|
+
* createPlugin("awesome", "Awesome Nodes")
|
|
382
|
+
* .version("1.0.0")
|
|
383
|
+
* .node("fancy", "Fancy Node", FancyNode)
|
|
384
|
+
* .node("glow", "Glowing Node", GlowNode, { icon: "mdi:lightbulb" })
|
|
385
|
+
* .register(fd.nodes);
|
|
386
|
+
* ```
|
|
387
|
+
*/
|
|
388
|
+
export declare function createPlugin(namespace: string, name: string): {
|
|
389
|
+
/**
|
|
390
|
+
* Set plugin version
|
|
391
|
+
*/
|
|
392
|
+
version(v: string): /*elided*/ any;
|
|
393
|
+
/**
|
|
394
|
+
* Set plugin description
|
|
395
|
+
*/
|
|
396
|
+
description(desc: string): /*elided*/ any;
|
|
397
|
+
/**
|
|
398
|
+
* Add a node to the plugin
|
|
399
|
+
*/
|
|
400
|
+
node(type: string, displayName: string, component: Component<NodeComponentProps>, options?: Partial<Omit<PluginNodeDefinition, "type" | "displayName" | "component">>): /*elided*/ any;
|
|
401
|
+
/**
|
|
402
|
+
* Register the plugin into a node component registry (e.g. `fd.nodes`).
|
|
403
|
+
*/
|
|
404
|
+
register(registry: NodeComponentRegistry): PluginRegistrationResult;
|
|
405
|
+
/**
|
|
406
|
+
* Get the config without registering (for testing/inspection)
|
|
407
|
+
*/
|
|
408
|
+
getConfig(): FlowDropPluginConfig;
|
|
409
|
+
};
|
|
242
410
|
/**
|
|
243
411
|
* Helper function to create a namespaced type identifier.
|
|
244
412
|
* Use this to avoid conflicts when registering custom nodes.
|
|
@@ -273,4 +441,3 @@ export declare function parseNamespacedType(namespacedType: string): {
|
|
|
273
441
|
namespace: string;
|
|
274
442
|
type: string;
|
|
275
443
|
} | null;
|
|
276
|
-
export {};
|