@flowdrop/flowdrop 2.0.0-beta.4 → 2.0.0-beta.5
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 +13 -0
- package/dist/adapters/WorkflowAdapter.js +4 -5
- package/dist/adapters/agentspec/AgentSpecAdapter.js +3 -3
- package/dist/adapters/agentspec/defaultNodeTypes.js +9 -9
- package/dist/commands/executor.js +5 -6
- package/dist/commands/types.js +5 -5
- package/dist/components/App.svelte +4 -4
- package/dist/components/NodeSidebar.svelte +4 -4
- package/dist/components/NodeSwapPicker.svelte +2 -2
- package/dist/components/UniversalNode.svelte +5 -4
- package/dist/components/UniversalNode.svelte.d.ts +1 -1
- package/dist/components/console/ConsoleInput.svelte +3 -3
- package/dist/components/nodes/AtomNode.svelte +3 -3
- package/dist/components/nodes/AtomNode.svelte.d.ts +1 -1
- package/dist/components/nodes/GatewayNode.svelte +8 -11
- package/dist/components/nodes/GatewayNode.svelte.d.ts +1 -1
- package/dist/components/nodes/IdeaNode.svelte +10 -8
- package/dist/components/nodes/IdeaNode.svelte.d.ts +8 -4
- package/dist/components/nodes/NotesNode.svelte +6 -4
- package/dist/components/nodes/NotesNode.svelte.d.ts +8 -4
- package/dist/components/nodes/SimpleNode.svelte +10 -8
- package/dist/components/nodes/SimpleNode.svelte.d.ts +4 -4
- package/dist/components/nodes/SquareNode.svelte +10 -8
- package/dist/components/nodes/SquareNode.svelte.d.ts +4 -4
- package/dist/components/nodes/TerminalNode.svelte +10 -8
- package/dist/components/nodes/TerminalNode.svelte.d.ts +4 -4
- package/dist/components/nodes/ToolNode.svelte +10 -8
- package/dist/components/nodes/ToolNode.svelte.d.ts +6 -6
- package/dist/components/nodes/WorkflowNode.svelte +7 -10
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +1 -1
- package/dist/components/playground/PipelineKanbanView.svelte +2 -2
- package/dist/components/playground/PipelineTableView.svelte +2 -2
- package/dist/helpers/workflowEditorHelper.js +4 -5
- package/dist/registry/nodeComponentRegistry.d.ts +2 -1
- package/dist/services/dynamicSchemaService.d.ts +2 -2
- package/dist/services/dynamicSchemaService.js +8 -8
- package/dist/stores/playgroundStore.svelte.js +1 -1
- package/dist/stores/workflowStore.svelte.js +0 -18
- package/dist/types/index.d.ts +6 -7
- package/dist/utils/connections.js +6 -6
- package/dist/utils/nodeIds.d.ts +1 -1
- package/dist/utils/nodeIds.js +1 -1
- package/dist/utils/nodeSwap.js +3 -6
- package/package.json +1 -1
package/dist/types/index.d.ts
CHANGED
|
@@ -327,7 +327,7 @@ export interface AutocompleteConfig {
|
|
|
327
327
|
* method: "GET",
|
|
328
328
|
* headers: { "X-Custom-Header": "value" },
|
|
329
329
|
* parameterMapping: {
|
|
330
|
-
* nodeTypeId: "metadata.
|
|
330
|
+
* nodeTypeId: "metadata.node_type_id",
|
|
331
331
|
* instanceId: "id"
|
|
332
332
|
* }
|
|
333
333
|
* };
|
|
@@ -352,7 +352,7 @@ export interface DynamicSchemaEndpoint {
|
|
|
352
352
|
/**
|
|
353
353
|
* Maps template variables to their source paths.
|
|
354
354
|
* Keys are variable names used in the URL, values are dot-notation paths
|
|
355
|
-
* to resolve from the node context (e.g., "metadata.
|
|
355
|
+
* to resolve from the node context (e.g., "metadata.node_type_id", "config.apiKey", "id")
|
|
356
356
|
*/
|
|
357
357
|
parameterMapping?: Record<string, string>;
|
|
358
358
|
/**
|
|
@@ -381,7 +381,7 @@ export interface DynamicSchemaEndpoint {
|
|
|
381
381
|
* url: "https://admin.example.com/nodes/{nodeTypeId}/edit/{instanceId}",
|
|
382
382
|
* label: "Configure in Admin Panel",
|
|
383
383
|
* parameterMapping: {
|
|
384
|
-
* nodeTypeId: "metadata.
|
|
384
|
+
* nodeTypeId: "metadata.node_type_id",
|
|
385
385
|
* instanceId: "id"
|
|
386
386
|
* },
|
|
387
387
|
* openInNewTab: true
|
|
@@ -408,7 +408,7 @@ export interface ExternalEditLink {
|
|
|
408
408
|
/**
|
|
409
409
|
* Maps template variables to their source paths.
|
|
410
410
|
* Keys are variable names used in the URL, values are dot-notation paths
|
|
411
|
-
* to resolve from the node context (e.g., "metadata.
|
|
411
|
+
* to resolve from the node context (e.g., "metadata.node_type_id", "config.apiKey", "id")
|
|
412
412
|
*/
|
|
413
413
|
parameterMapping?: Record<string, string>;
|
|
414
414
|
/**
|
|
@@ -602,7 +602,8 @@ export interface NodeExtensions {
|
|
|
602
602
|
* Node configuration metadata
|
|
603
603
|
*/
|
|
604
604
|
export interface NodeMetadata {
|
|
605
|
-
id
|
|
605
|
+
/** The node type entity id — the runtime's resolution anchor. */
|
|
606
|
+
node_type_id: string;
|
|
606
607
|
name: string;
|
|
607
608
|
type?: NodeType;
|
|
608
609
|
/**
|
|
@@ -1132,8 +1133,6 @@ export interface WorkflowNode extends Node {
|
|
|
1132
1133
|
isProcessing?: boolean;
|
|
1133
1134
|
/** Error message if the node execution failed */
|
|
1134
1135
|
error?: string;
|
|
1135
|
-
/** Alternative node identifier */
|
|
1136
|
-
nodeId?: string;
|
|
1137
1136
|
/** Node execution tracking information */
|
|
1138
1137
|
executionInfo?: NodeExecutionInfo;
|
|
1139
1138
|
/**
|
|
@@ -119,7 +119,7 @@ export class PortCompatibilityChecker {
|
|
|
119
119
|
* Get all possible connections from a source node to target nodes
|
|
120
120
|
*/
|
|
121
121
|
export function getPossibleConnections(checker, sourceNode, targetNodes, nodeTypes) {
|
|
122
|
-
const sourceMetadata = nodeTypes.find((nt) => nt.
|
|
122
|
+
const sourceMetadata = nodeTypes.find((nt) => nt.node_type_id === sourceNode.data.metadata.node_type_id);
|
|
123
123
|
if (!sourceMetadata)
|
|
124
124
|
return [];
|
|
125
125
|
const possibleConnections = [];
|
|
@@ -129,7 +129,7 @@ export function getPossibleConnections(checker, sourceNode, targetNodes, nodeTyp
|
|
|
129
129
|
for (const targetNode of targetNodes) {
|
|
130
130
|
if (targetNode.id === sourceNode.id)
|
|
131
131
|
continue; // Skip self-connection
|
|
132
|
-
const targetMetadata = nodeTypes.find((nt) => nt.
|
|
132
|
+
const targetMetadata = nodeTypes.find((nt) => nt.node_type_id === targetNode.data.metadata.node_type_id);
|
|
133
133
|
if (!targetMetadata)
|
|
134
134
|
continue;
|
|
135
135
|
// Get all input ports from target node
|
|
@@ -170,8 +170,8 @@ export function validateConnection(checker, sourceNodeId, sourcePortId, targetNo
|
|
|
170
170
|
return { valid: false, error: 'Cannot connect node to itself' };
|
|
171
171
|
}
|
|
172
172
|
// Get node metadata
|
|
173
|
-
const sourceMetadata = nodeTypes.find((nt) => nt.
|
|
174
|
-
const targetMetadata = nodeTypes.find((nt) => nt.
|
|
173
|
+
const sourceMetadata = nodeTypes.find((nt) => nt.node_type_id === sourceNode.data.metadata.node_type_id);
|
|
174
|
+
const targetMetadata = nodeTypes.find((nt) => nt.node_type_id === targetNode.data.metadata.node_type_id);
|
|
175
175
|
if (!sourceMetadata || !targetMetadata) {
|
|
176
176
|
return { valid: false, error: 'Node metadata not found' };
|
|
177
177
|
}
|
|
@@ -200,14 +200,14 @@ export function getConnectionSuggestions(checker, nodeId, nodes, nodeTypes) {
|
|
|
200
200
|
const node = nodes.find((n) => n.id === nodeId);
|
|
201
201
|
if (!node)
|
|
202
202
|
return [];
|
|
203
|
-
const metadata = nodeTypes.find((nt) => nt.
|
|
203
|
+
const metadata = nodeTypes.find((nt) => nt.node_type_id === node.data.metadata.node_type_id);
|
|
204
204
|
if (!metadata)
|
|
205
205
|
return [];
|
|
206
206
|
const suggestions = [];
|
|
207
207
|
// Get all other nodes
|
|
208
208
|
const otherNodes = nodes.filter((n) => n.id !== nodeId);
|
|
209
209
|
for (const otherNode of otherNodes) {
|
|
210
|
-
const otherMetadata = nodeTypes.find((nt) => nt.
|
|
210
|
+
const otherMetadata = nodeTypes.find((nt) => nt.node_type_id === otherNode.data.metadata.node_type_id);
|
|
211
211
|
if (!otherMetadata)
|
|
212
212
|
continue;
|
|
213
213
|
// Check outputs from other nodes to inputs of current node
|
package/dist/utils/nodeIds.d.ts
CHANGED
package/dist/utils/nodeIds.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
export function generateNodeId(nodeTypeId, existingNodes) {
|
|
12
12
|
// Count how many nodes of this type already exist
|
|
13
13
|
const existingNodeIds = existingNodes
|
|
14
|
-
.filter((node) => node.data?.metadata?.
|
|
14
|
+
.filter((node) => node.data?.metadata?.node_type_id === nodeTypeId)
|
|
15
15
|
.map((node) => node.id);
|
|
16
16
|
// Extract the numbers from existing IDs with the same prefix
|
|
17
17
|
const existingNumbers = existingNodeIds
|
package/dist/utils/nodeSwap.js
CHANGED
|
@@ -176,9 +176,6 @@ export function executeSwap(oldNode, newMetadata, preview, allNodes, allEdges) {
|
|
|
176
176
|
label: newMetadata.name,
|
|
177
177
|
config: mappedConfig,
|
|
178
178
|
metadata: newMetadata,
|
|
179
|
-
// Node components derive their handle IDs from data.nodeId — without it
|
|
180
|
-
// every edge anchored to this node silently disappears from the canvas.
|
|
181
|
-
nodeId: newNodeId,
|
|
182
179
|
extensions
|
|
183
180
|
}
|
|
184
181
|
};
|
|
@@ -218,7 +215,7 @@ export function executeSwap(oldNode, newMetadata, preview, allNodes, allEdges) {
|
|
|
218
215
|
* @returns The newer NodeMetadata if an upgrade is available, null otherwise
|
|
219
216
|
*/
|
|
220
217
|
export function getVersionUpgrade(currentMetadata, allNodeTypes) {
|
|
221
|
-
const available = allNodeTypes.find((n) => n.
|
|
218
|
+
const available = allNodeTypes.find((n) => n.node_type_id === currentMetadata.node_type_id);
|
|
222
219
|
if (!available)
|
|
223
220
|
return null;
|
|
224
221
|
if (compareSemver(available.version, currentMetadata.version) > 0) {
|
|
@@ -253,7 +250,7 @@ function classifyMatch(oldPort, matchedPort) {
|
|
|
253
250
|
export function computeSwapPreviewWithOptions(oldNode, newMetadata, edges, allNodes, options) {
|
|
254
251
|
const checker = options.checker ?? null;
|
|
255
252
|
const oldNodeId = oldNode.id;
|
|
256
|
-
const newNodeId = generateNodeId(newMetadata.
|
|
253
|
+
const newNodeId = generateNodeId(newMetadata.node_type_id, allNodes);
|
|
257
254
|
// Collect connected edges
|
|
258
255
|
const connectedEdges = edges.filter((e) => e.source === oldNodeId || e.target === oldNodeId);
|
|
259
256
|
// Try strategy-based port mapping
|
|
@@ -420,7 +417,7 @@ export function computeSwapPreviewWithOptions(oldNode, newMetadata, edges, allNo
|
|
|
420
417
|
*/
|
|
421
418
|
export function computeInteractiveState(oldNode, newMetadata, edges, allNodes, options = {}) {
|
|
422
419
|
const oldNodeId = oldNode.id;
|
|
423
|
-
const newNodeId = generateNodeId(newMetadata.
|
|
420
|
+
const newNodeId = generateNodeId(newMetadata.node_type_id, allNodes);
|
|
424
421
|
const connectedEdges = edges.filter((e) => e.source === oldNodeId || e.target === oldNodeId);
|
|
425
422
|
// Compute the base preview to get auto-matched ports
|
|
426
423
|
const preview = computeSwapPreviewWithOptions(oldNode, newMetadata, edges, allNodes, options);
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "A drop-in visual workflow editor for any web application. You own the backend. You own the data. You own the orchestration.",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"private": false,
|
|
6
|
-
"version": "2.0.0-beta.
|
|
6
|
+
"version": "2.0.0-beta.5",
|
|
7
7
|
"author": "Shibin Das (D34dMan)",
|
|
8
8
|
"bugs": {
|
|
9
9
|
"url": "https://github.com/flowdrop-io/flowdrop/issues"
|