@bian-womp/spark-workbench 0.3.45 → 0.3.47

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.
@@ -167,16 +167,6 @@ export declare class InMemoryWorkbench extends AbstractWorkbench {
167
167
  width: number;
168
168
  height: number;
169
169
  } | undefined): CopiedGraphData | null;
170
- /**
171
- * Duplicate all selected nodes.
172
- * Returns the list of newly created node IDs.
173
- * Each duplicated node is offset by 24px in both x and y directions.
174
- * Copies inputs without bindings and uses copyOutputsFrom to copy outputs.
175
- */
176
- duplicateSelection(runner: IGraphRunner, options?: {
177
- commit?: boolean;
178
- reason?: string;
179
- }): string[];
180
170
  /**
181
171
  * Bake an output value from a node into a new node.
182
172
  * Creates a new node based on the output type's bakeTarget configuration.
@@ -190,22 +180,22 @@ export declare class InMemoryWorkbench extends AbstractWorkbench {
190
180
  reason?: string;
191
181
  }): Promise<string | undefined>;
192
182
  /**
193
- * Duplicate a single node.
194
- * Returns the ID of the newly created node.
195
- * The duplicated node is offset by 24px in both x and y directions.
183
+ * Duplicate all selected nodes.
184
+ * Returns the list of newly created node IDs.
185
+ * Each duplicated node is offset by 24px in both x and y directions.
196
186
  * Copies inputs without bindings and uses copyOutputsFrom to copy outputs.
197
187
  */
198
- duplicateNode(nodeId: string, runner: IGraphRunner, options?: {
188
+ duplicateSelection(runner: IGraphRunner, options?: {
199
189
  commit?: boolean;
200
190
  reason?: string;
201
- }): string | undefined;
191
+ }): string[];
202
192
  /**
203
193
  * Duplicate a node and all its incoming edges.
204
194
  * Returns the ID of the newly created node.
205
195
  * The duplicated node is offset by 24px in both x and y directions.
206
196
  * All incoming edges are duplicated to point to the new node.
207
197
  */
208
- duplicateNodeWithEdges(nodeId: string, runner: IGraphRunner, options?: {
198
+ duplicateNode(nodeId: string, runner: IGraphRunner, options?: {
209
199
  commit?: boolean;
210
200
  reason?: string;
211
201
  }): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryWorkbench.d.ts","sourceRoot":"","sources":["../../../../src/core/InMemoryWorkbench.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InMemoryWorkbench.d.ts","sourceRoot":"","sources":["../../../../src/core/InMemoryWorkbench.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Inspector.d.ts","sourceRoot":"","sources":["../../../../src/misc/Inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAYhE,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,YAAY,EACZ,QAAQ,GACT,EAAE;IACD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,qBAAqB,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACvD,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACxE,2CAwwBA"}
1
+ {"version":3,"file":"Inspector.d.ts","sourceRoot":"","sources":["../../../../src/misc/Inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAehE,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,YAAY,EACZ,QAAQ,GACT,EAAE;IACD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,qBAAqB,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACvD,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACxE,2CA+xBA"}
package/lib/esm/index.js CHANGED
@@ -607,51 +607,6 @@ class InMemoryWorkbench extends AbstractWorkbench {
607
607
  bounds,
608
608
  };
609
609
  }
610
- /**
611
- * Duplicate all selected nodes.
612
- * Returns the list of newly created node IDs.
613
- * Each duplicated node is offset by 24px in both x and y directions.
614
- * Copies inputs without bindings and uses copyOutputsFrom to copy outputs.
615
- */
616
- duplicateSelection(runner, options) {
617
- const selection = this.getSelection();
618
- if (selection.nodes.length === 0)
619
- return [];
620
- const positions = this.getPositions();
621
- const sizes = this.getSizes();
622
- const newNodes = [];
623
- // Get inputs without bindings (literal values only)
624
- const allInputs = runner.getInputs(this.def) || {};
625
- // Duplicate each selected node
626
- for (const nodeId of selection.nodes) {
627
- const n = this.def.nodes.find((n) => n.nodeId === nodeId);
628
- if (!n)
629
- continue;
630
- const pos = positions[nodeId];
631
- const size = sizes[nodeId];
632
- const inboundHandles = new Set(this.def.edges
633
- .filter((e) => e.target.nodeId === nodeId)
634
- .map((e) => e.target.handle));
635
- const inputsWithoutBindings = Object.fromEntries(Object.entries(allInputs).filter(([handle]) => !inboundHandles.has(handle)));
636
- const newNodeId = this.addNode({
637
- typeId: n.typeId,
638
- params: n.params,
639
- resolvedHandles: n.resolvedHandles,
640
- }, {
641
- inputs: inputsWithoutBindings,
642
- position: pos ? { x: pos.x + 24, y: pos.y + 24 } : undefined,
643
- size,
644
- copyOutputsFrom: nodeId,
645
- dry: true,
646
- });
647
- newNodes.push(newNodeId);
648
- }
649
- // Select all newly duplicated nodes
650
- if (newNodes.length > 0) {
651
- this.setSelectionInternal({ nodes: newNodes, edges: [] }, options || { commit: true, reason: "duplicate-selection" });
652
- }
653
- return newNodes;
654
- }
655
610
  /**
656
611
  * Bake an output value from a node into a new node.
657
612
  * Creates a new node based on the output type's bakeTarget configuration.
@@ -745,37 +700,97 @@ class InMemoryWorkbench extends AbstractWorkbench {
745
700
  }
746
701
  }
747
702
  /**
748
- * Duplicate a single node.
749
- * Returns the ID of the newly created node.
750
- * The duplicated node is offset by 24px in both x and y directions.
703
+ * Duplicate all selected nodes.
704
+ * Returns the list of newly created node IDs.
705
+ * Each duplicated node is offset by 24px in both x and y directions.
751
706
  * Copies inputs without bindings and uses copyOutputsFrom to copy outputs.
752
707
  */
753
- duplicateNode(nodeId, runner, options) {
754
- const n = this.def.nodes.find((n) => n.nodeId === nodeId);
755
- if (!n)
756
- return undefined;
757
- const pos = this.getPositions()[nodeId];
758
- const size = this.getSizes()[nodeId];
759
- // Get inputs without bindings (literal values only)
760
- const allInputs = runner.getInputs(this.def)[nodeId] || {};
761
- const inboundHandles = new Set(this.def.edges
762
- .filter((e) => e.target.nodeId === nodeId)
763
- .map((e) => e.target.handle));
764
- const inputsWithoutBindings = Object.fromEntries(Object.entries(allInputs).filter(([handle]) => !inboundHandles.has(handle)));
765
- const newNodeId = this.addNode({
766
- typeId: n.typeId,
767
- params: n.params,
768
- resolvedHandles: n.resolvedHandles,
769
- }, {
770
- inputs: inputsWithoutBindings,
771
- position: pos ? { x: pos.x + 24, y: pos.y + 24 } : undefined,
772
- size,
773
- copyOutputsFrom: nodeId,
774
- dry: true,
775
- });
776
- // Select the newly duplicated node
777
- this.setSelectionInternal({ nodes: [newNodeId], edges: [] }, options || { commit: true, reason: "duplicate-node" });
778
- return newNodeId;
708
+ duplicateSelection(runner, options) {
709
+ const selection = this.getSelection();
710
+ if (selection.nodes.length === 0)
711
+ return [];
712
+ const positions = this.getPositions();
713
+ const sizes = this.getSizes();
714
+ const newNodes = [];
715
+ const nodeIdMap = new Map(); // Map from original nodeId to new nodeId
716
+ const processedNodes = new Set(); // Track which nodes have been duplicated
717
+ const selectedNodeSet = new Set(selection.nodes);
718
+ const allInputs = runner.getInputs(this.def) || {};
719
+ // Build a map of incoming edges for each selected node
720
+ const incomingEdgesByNode = new Map();
721
+ for (const nodeId of selection.nodes) {
722
+ const incomingEdges = this.def.edges.filter((e) => e.target.nodeId === nodeId);
723
+ incomingEdgesByNode.set(nodeId, incomingEdges);
724
+ }
725
+ // Helper function to check if a node is ready to be processed
726
+ // (all its dependencies from selected nodes have been processed)
727
+ const isNodeReady = (nodeId) => {
728
+ const incomingEdges = incomingEdgesByNode.get(nodeId) || [];
729
+ for (const edge of incomingEdges) {
730
+ // If the source is a selected node, it must have been processed
731
+ if (selectedNodeSet.has(edge.source.nodeId)) {
732
+ if (!processedNodes.has(edge.source.nodeId)) {
733
+ return false;
734
+ }
735
+ }
736
+ }
737
+ return true;
738
+ };
739
+ // Process nodes in topological order
740
+ let remainingNodes = new Set(selection.nodes);
741
+ while (remainingNodes.size > 0) {
742
+ // Find nodes that are ready to be processed (no unprocessed dependencies)
743
+ const readyNodes = Array.from(remainingNodes).filter((nodeId) => isNodeReady(nodeId));
744
+ if (readyNodes.length === 0) {
745
+ // If no nodes are ready, there might be a cycle. Process remaining nodes anyway.
746
+ // This shouldn't happen in a DAG, but handle it gracefully.
747
+ readyNodes.push(...remainingNodes);
748
+ }
749
+ // Process each ready node
750
+ for (const nodeId of readyNodes) {
751
+ const n = this.def.nodes.find((n) => n.nodeId === nodeId);
752
+ if (!n) {
753
+ remainingNodes.delete(nodeId);
754
+ continue;
755
+ }
756
+ const pos = positions[nodeId];
757
+ const size = sizes[nodeId];
758
+ // Get all inputs (including those with bindings, since edges will be duplicated)
759
+ const inputs = allInputs[nodeId] || {};
760
+ // Create the duplicated node
761
+ const newNodeId = this.addNode({
762
+ typeId: n.typeId,
763
+ params: n.params,
764
+ resolvedHandles: n.resolvedHandles,
765
+ }, {
766
+ inputs,
767
+ position: pos ? { x: pos.x + 24, y: pos.y + 24 } : undefined,
768
+ size,
769
+ copyOutputsFrom: nodeId,
770
+ dry: true,
771
+ });
772
+ newNodes.push(newNodeId);
773
+ nodeIdMap.set(nodeId, newNodeId);
774
+ processedNodes.add(nodeId);
775
+ // Connect incoming edges for this node
776
+ const incomingEdges = incomingEdgesByNode.get(nodeId) || [];
777
+ for (const edge of incomingEdges) {
778
+ // Determine the source node: use duplicated node if it was duplicated, otherwise use original
779
+ const sourceNodeId = nodeIdMap.get(edge.source.nodeId) || edge.source.nodeId;
780
+ this.connect({
781
+ source: { nodeId: sourceNodeId, handle: edge.source.handle },
782
+ target: { nodeId: newNodeId, handle: edge.target.handle },
783
+ typeId: edge.typeId,
784
+ }, { dry: true });
785
+ }
786
+ remainingNodes.delete(nodeId);
787
+ }
788
+ }
789
+ // Select all newly duplicated nodes
790
+ if (newNodes.length > 0) {
791
+ this.setSelectionInternal({ nodes: newNodes, edges: [] }, options || { commit: true, reason: "duplicate-selection" });
792
+ }
793
+ return newNodes;
779
794
  }
780
795
  /**
781
796
  * Duplicate a node and all its incoming edges.
@@ -783,7 +798,7 @@ class InMemoryWorkbench extends AbstractWorkbench {
783
798
  * The duplicated node is offset by 24px in both x and y directions.
784
799
  * All incoming edges are duplicated to point to the new node.
785
800
  */
786
- duplicateNodeWithEdges(nodeId, runner, options) {
801
+ duplicateNode(nodeId, runner, options) {
787
802
  const n = this.def.nodes.find((n) => n.nodeId === nodeId);
788
803
  if (!n)
789
804
  return undefined;
@@ -815,7 +830,7 @@ class InMemoryWorkbench extends AbstractWorkbench {
815
830
  }
816
831
  // Select the newly duplicated node
817
832
  if (newNodeId) {
818
- this.setSelectionInternal({ nodes: [newNodeId], edges: [] }, options || { commit: true, reason: "duplicate-node-with-edges" });
833
+ this.setSelectionInternal({ nodes: [newNodeId], edges: [] }, options || { commit: true, reason: "duplicate-node" });
819
834
  }
820
835
  return newNodeId;
821
836
  }
@@ -5089,9 +5104,9 @@ function createNodeContextMenuHandlers(nodeId, wb, runner, registry, outputsMap,
5089
5104
  onClose();
5090
5105
  },
5091
5106
  onDuplicate: async () => {
5092
- wb.duplicateNodeWithEdges(nodeId, runner, {
5107
+ wb.duplicateNode(nodeId, runner, {
5093
5108
  commit: true,
5094
- reason: "duplicate-node-with-edges",
5109
+ reason: "duplicate-node",
5095
5110
  });
5096
5111
  onClose();
5097
5112
  },
@@ -5329,6 +5344,13 @@ function Inspector({ debug, autoScroll, hideWorkbench, onAutoScrollChange, onHid
5329
5344
  return String(value ?? "");
5330
5345
  }
5331
5346
  };
5347
+ const unwrapForDisplay = (declaredTypeId, value) => {
5348
+ if (isTyped(value)) {
5349
+ const t = unwrapTypeId(value) ?? declaredTypeId;
5350
+ return { typeId: t, value: unwrapValue(value) };
5351
+ }
5352
+ return { typeId: declaredTypeId, value };
5353
+ };
5332
5354
  const { wb, registryVersion, selectedNodeId, selectedEdgeId, inputsMap, inputDefaultsMap, outputsMap, outputTypesMap, nodeStatus, edgeStatus, validationByNode, validationByEdge, validationGlobal, valuesTick, updateEdgeType, systemErrors, registryErrors, inputValidationErrors, clearSystemErrors, clearRegistryErrors, clearInputValidationErrors, removeSystemError, removeRegistryError, removeInputValidationError, handlesMap, } = useWorkbenchContext();
5333
5355
  const nodeValidationIssues = validationByNode.issues;
5334
5356
  const edgeValidationIssues = validationByEdge.issues;
@@ -5458,7 +5480,8 @@ function Inspector({ debug, autoScroll, hideWorkbench, onAutoScrollChange, onHid
5458
5480
  for (const h of handles) {
5459
5481
  const typeId = getInputTypeId(effectiveHandles.inputs, h);
5460
5482
  const current = nodeInputs[h];
5461
- const display = safeToString(typeId, current);
5483
+ const { typeId: displayTypeId, value: displayValue } = unwrapForDisplay(typeId, current);
5484
+ const display = safeToString(displayTypeId, displayValue);
5462
5485
  const wasOriginal = originals[h];
5463
5486
  const isDirty = drafts[h] !== undefined &&
5464
5487
  wasOriginal !== undefined &&
@@ -5510,18 +5533,19 @@ function Inspector({ debug, autoScroll, hideWorkbench, onAutoScrollChange, onHid
5510
5533
  .filter((e) => e.target.nodeId === selectedNodeId &&
5511
5534
  e.target.handle === h)
5512
5535
  .map((e) => e.target.handle));
5536
+ const { typeId: defaultTypeId, value: defaultValue } = unwrapForDisplay(typeId, nodeInputsDefaults[h]);
5513
5537
  const hasDefault = !inbound.has(h) && nodeInputsDefaults[h] !== undefined;
5514
5538
  const defaultStr = hasDefault
5515
- ? safeToString(typeId, nodeInputsDefaults[h])
5539
+ ? safeToString(defaultTypeId, defaultValue)
5516
5540
  : undefined;
5517
5541
  const commonProps = {
5518
5542
  style: { flex: 1 },
5519
5543
  disabled: isLinked,
5520
5544
  };
5521
5545
  const current = nodeInputs[h];
5522
- const hasValue = current !== undefined && current !== null;
5523
- const value = drafts[h] ?? safeToString(typeId, current);
5524
- const displayValue = value;
5546
+ const { typeId: displayTypeId, value: displayValue } = unwrapForDisplay(typeId, current);
5547
+ const hasValue = displayValue !== undefined && displayValue !== null;
5548
+ const value = drafts[h] ?? safeToString(displayTypeId, displayValue);
5525
5549
  const placeholder = hasDefault ? defaultStr : undefined;
5526
5550
  const onChangeText = (text) => setDrafts((d) => ({ ...d, [h]: text }));
5527
5551
  const commit = () => {
@@ -5547,7 +5571,7 @@ function Inspector({ debug, autoScroll, hideWorkbench, onAutoScrollChange, onHid
5547
5571
  setDrafts((d) => ({ ...d, [h]: "" }));
5548
5572
  setOriginals((o) => ({ ...o, [h]: "" }));
5549
5573
  };
5550
- const isEnum = typeId?.startsWith("enum:");
5574
+ const isEnum = displayTypeId?.startsWith("enum:");
5551
5575
  const inIssues = selectedNodeHandleValidation.inputs.filter((m) => m.handle === h);
5552
5576
  const hasValidation = inIssues.length > 0;
5553
5577
  const hasErr = inIssues.some((m) => m.level === "error");
@@ -5568,9 +5592,9 @@ function Inspector({ debug, autoScroll, hideWorkbench, onAutoScrollChange, onHid
5568
5592
  ? `Default: ${placeholder}`
5569
5593
  : "(select)" }), wb.registry.enums
5570
5594
  .get(typeId)
5571
- ?.options.map((opt) => (jsx("option", { value: String(opt.value), children: opt.label }, opt.value)))] }), hasValue && !isLinked && (jsx("button", { className: "flex-shrink-0 p-1 hover:bg-gray-100 rounded text-gray-500 hover:text-gray-700", onClick: clearInput, title: "Clear input value", children: jsx(XCircleIcon, { size: 16 }) }))] })) : isLinked ? (jsx("div", { className: "flex items-center gap-1 flex-1", children: jsx("div", { className: "flex-1 min-w-0", children: renderLinkedInputDisplay(typeId, current) }) })) : (jsxs("div", { className: "flex items-center gap-1 flex-1", children: [jsx("input", { className: "border border-gray-300 rounded px-2 py-1 focus:outline-none focus:ring-2 focus:ring-blue-500 flex-1 select-text", placeholder: placeholder
5595
+ ?.options.map((opt) => (jsx("option", { value: String(opt.value), children: opt.label }, opt.value)))] }), hasValue && !isLinked && (jsx("button", { className: "flex-shrink-0 p-1 hover:bg-gray-100 rounded text-gray-500 hover:text-gray-700", onClick: clearInput, title: "Clear input value", children: jsx(XCircleIcon, { size: 16 }) }))] })) : isLinked ? (jsx("div", { className: "flex items-center gap-1 flex-1", children: jsx("div", { className: "flex-1 min-w-0", children: renderLinkedInputDisplay(displayTypeId, displayValue) }) })) : (jsxs("div", { className: "flex items-center gap-1 flex-1", children: [jsx("input", { className: "border border-gray-300 rounded px-2 py-1 focus:outline-none focus:ring-2 focus:ring-blue-500 flex-1 select-text", placeholder: placeholder
5572
5596
  ? `Default: ${placeholder}`
5573
- : undefined, value: displayValue, onChange: (e) => onChangeText(e.target.value), onBlur: commit, onKeyDown: (e) => {
5597
+ : undefined, value: value, onChange: (e) => onChangeText(e.target.value), onBlur: commit, onKeyDown: (e) => {
5574
5598
  if (e.key === "Enter")
5575
5599
  commit();
5576
5600
  if (e.key === "Escape")