@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.
Files changed (44) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/adapters/WorkflowAdapter.js +4 -5
  3. package/dist/adapters/agentspec/AgentSpecAdapter.js +3 -3
  4. package/dist/adapters/agentspec/defaultNodeTypes.js +9 -9
  5. package/dist/commands/executor.js +5 -6
  6. package/dist/commands/types.js +5 -5
  7. package/dist/components/App.svelte +4 -4
  8. package/dist/components/NodeSidebar.svelte +4 -4
  9. package/dist/components/NodeSwapPicker.svelte +2 -2
  10. package/dist/components/UniversalNode.svelte +5 -4
  11. package/dist/components/UniversalNode.svelte.d.ts +1 -1
  12. package/dist/components/console/ConsoleInput.svelte +3 -3
  13. package/dist/components/nodes/AtomNode.svelte +3 -3
  14. package/dist/components/nodes/AtomNode.svelte.d.ts +1 -1
  15. package/dist/components/nodes/GatewayNode.svelte +8 -11
  16. package/dist/components/nodes/GatewayNode.svelte.d.ts +1 -1
  17. package/dist/components/nodes/IdeaNode.svelte +10 -8
  18. package/dist/components/nodes/IdeaNode.svelte.d.ts +8 -4
  19. package/dist/components/nodes/NotesNode.svelte +6 -4
  20. package/dist/components/nodes/NotesNode.svelte.d.ts +8 -4
  21. package/dist/components/nodes/SimpleNode.svelte +10 -8
  22. package/dist/components/nodes/SimpleNode.svelte.d.ts +4 -4
  23. package/dist/components/nodes/SquareNode.svelte +10 -8
  24. package/dist/components/nodes/SquareNode.svelte.d.ts +4 -4
  25. package/dist/components/nodes/TerminalNode.svelte +10 -8
  26. package/dist/components/nodes/TerminalNode.svelte.d.ts +4 -4
  27. package/dist/components/nodes/ToolNode.svelte +10 -8
  28. package/dist/components/nodes/ToolNode.svelte.d.ts +6 -6
  29. package/dist/components/nodes/WorkflowNode.svelte +7 -10
  30. package/dist/components/nodes/WorkflowNode.svelte.d.ts +1 -1
  31. package/dist/components/playground/PipelineKanbanView.svelte +2 -2
  32. package/dist/components/playground/PipelineTableView.svelte +2 -2
  33. package/dist/helpers/workflowEditorHelper.js +4 -5
  34. package/dist/registry/nodeComponentRegistry.d.ts +2 -1
  35. package/dist/services/dynamicSchemaService.d.ts +2 -2
  36. package/dist/services/dynamicSchemaService.js +8 -8
  37. package/dist/stores/playgroundStore.svelte.js +1 -1
  38. package/dist/stores/workflowStore.svelte.js +0 -18
  39. package/dist/types/index.d.ts +6 -7
  40. package/dist/utils/connections.js +6 -6
  41. package/dist/utils/nodeIds.d.ts +1 -1
  42. package/dist/utils/nodeIds.js +1 -1
  43. package/dist/utils/nodeSwap.js +3 -6
  44. package/package.json +1 -1
@@ -327,7 +327,7 @@ export interface AutocompleteConfig {
327
327
  * method: "GET",
328
328
  * headers: { "X-Custom-Header": "value" },
329
329
  * parameterMapping: {
330
- * nodeTypeId: "metadata.id",
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.id", "config.apiKey", "id")
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.id",
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.id", "config.apiKey", "id")
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: string;
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.id === sourceNode.data.metadata.id);
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.id === targetNode.data.metadata.id);
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.id === sourceNode.data.metadata.id);
174
- const targetMetadata = nodeTypes.find((nt) => nt.id === targetNode.data.metadata.id);
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.id === node.data.metadata.id);
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.id === otherNode.data.metadata.id);
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
@@ -12,7 +12,7 @@ interface NodeWithMetadata {
12
12
  id: string;
13
13
  data?: {
14
14
  metadata?: {
15
- id?: string;
15
+ node_type_id?: string;
16
16
  };
17
17
  };
18
18
  }
@@ -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?.id === nodeTypeId)
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
@@ -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.id === currentMetadata.id);
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.id, allNodes);
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.id, allNodes);
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.4",
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"