@bian-womp/spark-graph 0.3.19 → 0.3.21
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/lib/cjs/index.cjs +257 -157
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/cjs/src/index.d.ts +2 -2
- package/lib/cjs/src/index.d.ts.map +1 -1
- package/lib/cjs/src/misc/utils/json.d.ts +1 -2
- package/lib/cjs/src/misc/utils/json.d.ts.map +1 -1
- package/lib/cjs/src/misc/utils/merge.d.ts +5 -51
- package/lib/cjs/src/misc/utils/merge.d.ts.map +1 -1
- package/lib/cjs/src/runtime/GraphLifecycleApi.d.ts +6 -1
- package/lib/cjs/src/runtime/GraphLifecycleApi.d.ts.map +1 -1
- package/lib/cjs/src/runtime/GraphRuntime.d.ts +4 -1
- package/lib/cjs/src/runtime/GraphRuntime.d.ts.map +1 -1
- package/lib/cjs/src/runtime/LocalEngine.d.ts +1 -1
- package/lib/cjs/src/runtime/LocalEngine.d.ts.map +1 -1
- package/lib/esm/index.js +256 -155
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/src/index.d.ts +2 -2
- package/lib/esm/src/index.d.ts.map +1 -1
- package/lib/esm/src/misc/utils/json.d.ts +1 -2
- package/lib/esm/src/misc/utils/json.d.ts.map +1 -1
- package/lib/esm/src/misc/utils/merge.d.ts +5 -51
- package/lib/esm/src/misc/utils/merge.d.ts.map +1 -1
- package/lib/esm/src/runtime/GraphLifecycleApi.d.ts +6 -1
- package/lib/esm/src/runtime/GraphLifecycleApi.d.ts.map +1 -1
- package/lib/esm/src/runtime/GraphRuntime.d.ts +4 -1
- package/lib/esm/src/runtime/GraphRuntime.d.ts.map +1 -1
- package/lib/esm/src/runtime/LocalEngine.d.ts +1 -1
- package/lib/esm/src/runtime/LocalEngine.d.ts.map +1 -1
- package/package.json +2 -2
package/lib/cjs/index.cjs
CHANGED
|
@@ -2766,6 +2766,7 @@ class GraphRuntime {
|
|
|
2766
2766
|
this.environment = {};
|
|
2767
2767
|
this.runMode = null;
|
|
2768
2768
|
this.pauseRefCount = 0;
|
|
2769
|
+
this.persistentPauseToken = null;
|
|
2769
2770
|
// Initialize components
|
|
2770
2771
|
this.graph = new Graph();
|
|
2771
2772
|
this.eventEmitter = new EventEmitter();
|
|
@@ -2916,7 +2917,7 @@ class GraphRuntime {
|
|
|
2916
2917
|
const node = this.graph.getNode(nodeId);
|
|
2917
2918
|
return node?.outputs[output];
|
|
2918
2919
|
}
|
|
2919
|
-
launch(invalidate = false) {
|
|
2920
|
+
launch(invalidate = false, startPaused = false) {
|
|
2920
2921
|
this.graph.forEachNode((node) => {
|
|
2921
2922
|
const effectiveInputs = this.nodeExecutor.getEffectiveInputs(node.nodeId);
|
|
2922
2923
|
const ctrl = new AbortController();
|
|
@@ -2934,6 +2935,9 @@ class GraphRuntime {
|
|
|
2934
2935
|
this.execute(nodeId);
|
|
2935
2936
|
}
|
|
2936
2937
|
}
|
|
2938
|
+
if (startPaused) {
|
|
2939
|
+
this.pause();
|
|
2940
|
+
}
|
|
2937
2941
|
}
|
|
2938
2942
|
triggerExternal(nodeId, event) {
|
|
2939
2943
|
const node = this.graph.getNode(nodeId);
|
|
@@ -3076,6 +3080,17 @@ class GraphRuntime {
|
|
|
3076
3080
|
isPaused() {
|
|
3077
3081
|
return this.pauseRefCount > 0;
|
|
3078
3082
|
}
|
|
3083
|
+
pause() {
|
|
3084
|
+
if (!this.persistentPauseToken) {
|
|
3085
|
+
this.persistentPauseToken = this.requestPause();
|
|
3086
|
+
}
|
|
3087
|
+
}
|
|
3088
|
+
resume() {
|
|
3089
|
+
if (this.persistentPauseToken) {
|
|
3090
|
+
this.persistentPauseToken();
|
|
3091
|
+
this.persistentPauseToken = null;
|
|
3092
|
+
}
|
|
3093
|
+
}
|
|
3079
3094
|
copyOutputs(fromNodeId, toNodeId, options) {
|
|
3080
3095
|
const fromNode = this.getNodeData(fromNodeId);
|
|
3081
3096
|
if (!fromNode?.outputs)
|
|
@@ -3732,10 +3747,10 @@ class LocalEngine {
|
|
|
3732
3747
|
dispose() {
|
|
3733
3748
|
// this.graphRuntime.dispose();
|
|
3734
3749
|
}
|
|
3735
|
-
launch(invalidate, runMode) {
|
|
3750
|
+
launch(invalidate, runMode, startPaused) {
|
|
3736
3751
|
if (runMode)
|
|
3737
3752
|
this.setRunMode(runMode);
|
|
3738
|
-
this.graphRuntime.launch(invalidate);
|
|
3753
|
+
this.graphRuntime.launch(invalidate, startPaused);
|
|
3739
3754
|
}
|
|
3740
3755
|
/**
|
|
3741
3756
|
* Run only this node, no downstream propagation.
|
|
@@ -5423,62 +5438,42 @@ function findMatchingPaths(obj, pathSegments, currentPath = []) {
|
|
|
5423
5438
|
return results;
|
|
5424
5439
|
}
|
|
5425
5440
|
|
|
5426
|
-
function mergeGraphDefinitions(target, source
|
|
5441
|
+
function mergeGraphDefinitions(target, source) {
|
|
5427
5442
|
const existingNodeIds = new Set(target.nodes.map((n) => n.nodeId));
|
|
5428
5443
|
const existingEdgeIds = new Set(target.edges.map((e) => e.id));
|
|
5429
5444
|
const nodeIdMap = {};
|
|
5445
|
+
const targetInputDefaults = {};
|
|
5446
|
+
const sourceInputDefaults = {};
|
|
5447
|
+
for (const node of target.nodes) {
|
|
5448
|
+
if (node.resolvedHandles?.inputDefaults) {
|
|
5449
|
+
targetInputDefaults[node.nodeId] = {
|
|
5450
|
+
...node.resolvedHandles.inputDefaults,
|
|
5451
|
+
};
|
|
5452
|
+
}
|
|
5453
|
+
}
|
|
5430
5454
|
const importedNodes = source.nodes.map((n) => {
|
|
5431
5455
|
let newId = n.nodeId;
|
|
5432
|
-
|
|
5456
|
+
const isExistingNode = existingNodeIds.has(newId);
|
|
5457
|
+
if (isExistingNode) {
|
|
5433
5458
|
newId = generateId("n", existingNodeIds);
|
|
5434
5459
|
}
|
|
5435
5460
|
else {
|
|
5436
5461
|
existingNodeIds.add(newId);
|
|
5437
5462
|
}
|
|
5438
5463
|
nodeIdMap[n.nodeId] = newId;
|
|
5439
|
-
|
|
5464
|
+
if (n.resolvedHandles?.inputDefaults) {
|
|
5465
|
+
sourceInputDefaults[n.nodeId] = { ...n.resolvedHandles.inputDefaults };
|
|
5466
|
+
}
|
|
5467
|
+
return {
|
|
5440
5468
|
...n,
|
|
5441
5469
|
nodeId: newId,
|
|
5442
|
-
|
|
5443
|
-
|
|
5444
|
-
|
|
5445
|
-
|
|
5446
|
-
const transformedInputDefaults = {};
|
|
5447
|
-
for (const [handleId, value] of Object.entries(transformedNode.resolvedHandles.inputDefaults)) {
|
|
5448
|
-
const handleDataType = transformedNode.resolvedHandles?.inputs?.[handleId]
|
|
5449
|
-
? typeof transformedNode.resolvedHandles.inputs[handleId] ===
|
|
5450
|
-
"string"
|
|
5451
|
-
? transformedNode.resolvedHandles.inputs[handleId]
|
|
5452
|
-
: transformedNode.resolvedHandles.inputs[handleId]?.typeId
|
|
5453
|
-
: undefined;
|
|
5454
|
-
const convertedValue = converter({
|
|
5455
|
-
nodeId: newId,
|
|
5456
|
-
handleId,
|
|
5457
|
-
value,
|
|
5458
|
-
type: "inputDefault",
|
|
5459
|
-
nodeTypeId,
|
|
5460
|
-
handleDataType,
|
|
5461
|
-
});
|
|
5462
|
-
// If converter returns null, skip this input default (delete it)
|
|
5463
|
-
if (convertedValue !== null) {
|
|
5464
|
-
transformedInputDefaults[handleId] = convertedValue;
|
|
5465
|
-
}
|
|
5466
|
-
}
|
|
5467
|
-
// Only set inputDefaults if there are any remaining after conversion
|
|
5468
|
-
if (Object.keys(transformedInputDefaults).length > 0) {
|
|
5469
|
-
transformedNode.resolvedHandles = {
|
|
5470
|
-
...transformedNode.resolvedHandles,
|
|
5471
|
-
inputDefaults: transformedInputDefaults,
|
|
5472
|
-
};
|
|
5473
|
-
}
|
|
5474
|
-
else if (transformedNode.resolvedHandles) {
|
|
5475
|
-
// Remove inputDefaults if all were deleted
|
|
5476
|
-
const { inputDefaults, ...restHandles } = transformedNode.resolvedHandles;
|
|
5477
|
-
transformedNode.resolvedHandles = restHandles;
|
|
5470
|
+
resolvedHandles: n.resolvedHandles
|
|
5471
|
+
? {
|
|
5472
|
+
...n.resolvedHandles,
|
|
5473
|
+
inputDefaults: undefined,
|
|
5478
5474
|
}
|
|
5479
|
-
|
|
5480
|
-
}
|
|
5481
|
-
return transformedNode;
|
|
5475
|
+
: undefined,
|
|
5476
|
+
};
|
|
5482
5477
|
});
|
|
5483
5478
|
const importedEdges = source.edges.map((e) => {
|
|
5484
5479
|
let newEdgeId = e.id;
|
|
@@ -5509,6 +5504,8 @@ function mergeGraphDefinitions(target, source, converter) {
|
|
|
5509
5504
|
edges: [...target.edges, ...importedEdges],
|
|
5510
5505
|
},
|
|
5511
5506
|
nodeIdMap,
|
|
5507
|
+
targetInputDefaults,
|
|
5508
|
+
sourceInputDefaults,
|
|
5512
5509
|
};
|
|
5513
5510
|
}
|
|
5514
5511
|
/**
|
|
@@ -5553,149 +5550,251 @@ function offsetImportedPositions(targetPositions, sourcePositions, sourceDef, no
|
|
|
5553
5550
|
}
|
|
5554
5551
|
return newPositions;
|
|
5555
5552
|
}
|
|
5556
|
-
|
|
5557
|
-
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
|
|
5561
|
-
|
|
5562
|
-
|
|
5563
|
-
|
|
5564
|
-
|
|
5565
|
-
|
|
5566
|
-
|
|
5553
|
+
function buildTypeMaps(def) {
|
|
5554
|
+
const nodeTypeMap = new Map();
|
|
5555
|
+
const handleTypeMap = new Map();
|
|
5556
|
+
for (const node of def.nodes) {
|
|
5557
|
+
nodeTypeMap.set(node.nodeId, node.typeId);
|
|
5558
|
+
const nodeHandleTypes = new Map();
|
|
5559
|
+
if (node.resolvedHandles?.inputs) {
|
|
5560
|
+
for (const [handleId, handleDesc] of Object.entries(node.resolvedHandles.inputs)) {
|
|
5561
|
+
const typeId = typeof handleDesc === "string"
|
|
5562
|
+
? handleDesc
|
|
5563
|
+
: handleDesc?.typeId;
|
|
5564
|
+
if (typeId)
|
|
5565
|
+
nodeHandleTypes.set(handleId, typeId);
|
|
5566
|
+
}
|
|
5567
|
+
}
|
|
5568
|
+
if (node.resolvedHandles?.outputs) {
|
|
5569
|
+
for (const [handleId, handleDesc] of Object.entries(node.resolvedHandles.outputs)) {
|
|
5570
|
+
const typeId = typeof handleDesc === "string"
|
|
5571
|
+
? handleDesc
|
|
5572
|
+
: Array.isArray(handleDesc)
|
|
5573
|
+
? handleDesc[0]
|
|
5574
|
+
: undefined;
|
|
5575
|
+
if (typeId)
|
|
5576
|
+
nodeHandleTypes.set(handleId, typeId);
|
|
5577
|
+
}
|
|
5578
|
+
}
|
|
5579
|
+
if (nodeHandleTypes.size > 0) {
|
|
5580
|
+
handleTypeMap.set(node.nodeId, nodeHandleTypes);
|
|
5581
|
+
}
|
|
5582
|
+
}
|
|
5583
|
+
return { nodeTypeMap, handleTypeMap };
|
|
5584
|
+
}
|
|
5585
|
+
function applyConversion(items, values, converter, type) {
|
|
5586
|
+
for (const item of items) {
|
|
5587
|
+
const convertedValue = converter({
|
|
5588
|
+
nodeId: item.nodeId,
|
|
5589
|
+
handleId: item.handleId,
|
|
5590
|
+
value: item.value,
|
|
5591
|
+
type,
|
|
5592
|
+
nodeTypeId: item.nodeTypeId,
|
|
5593
|
+
handleDataType: item.handleDataType,
|
|
5594
|
+
runtimeTypeId: item.runtimeTypeId,
|
|
5595
|
+
});
|
|
5596
|
+
if (convertedValue === null) {
|
|
5597
|
+
delete values[item.nodeId]?.[item.handleId];
|
|
5598
|
+
if (values[item.nodeId] &&
|
|
5599
|
+
Object.keys(values[item.nodeId]).length === 0) {
|
|
5600
|
+
delete values[item.nodeId];
|
|
5601
|
+
}
|
|
5602
|
+
}
|
|
5603
|
+
else {
|
|
5604
|
+
if (!values[item.nodeId]) {
|
|
5605
|
+
values[item.nodeId] = {};
|
|
5606
|
+
}
|
|
5607
|
+
values[item.nodeId][item.handleId] = convertedValue;
|
|
5608
|
+
}
|
|
5567
5609
|
}
|
|
5568
|
-
|
|
5569
|
-
|
|
5610
|
+
}
|
|
5611
|
+
function collectValuesToConvert(values, nodeTypeMap, handleTypeMap, originalNodeIdMap) {
|
|
5612
|
+
const converted = {};
|
|
5613
|
+
const toConvert = [];
|
|
5614
|
+
for (const [nodeId, nodeValues] of Object.entries(values)) {
|
|
5615
|
+
converted[nodeId] = { ...nodeValues };
|
|
5616
|
+
const originalNodeId = nodeId;
|
|
5617
|
+
const nodeTypeId = nodeTypeMap.get(originalNodeId);
|
|
5618
|
+
for (const [handleId, value] of Object.entries(nodeValues)) {
|
|
5619
|
+
const handleDataType = handleTypeMap.get(originalNodeId)?.get(handleId);
|
|
5620
|
+
const runtimeTypeId = isTypedOutput(value)
|
|
5621
|
+
? getTypedOutputTypeId(value)
|
|
5622
|
+
: undefined;
|
|
5623
|
+
toConvert.push({
|
|
5624
|
+
nodeId,
|
|
5625
|
+
originalNodeId,
|
|
5626
|
+
handleId,
|
|
5627
|
+
value,
|
|
5628
|
+
nodeTypeId,
|
|
5629
|
+
handleDataType,
|
|
5630
|
+
runtimeTypeId,
|
|
5631
|
+
});
|
|
5632
|
+
}
|
|
5570
5633
|
}
|
|
5634
|
+
return { converted, toConvert };
|
|
5635
|
+
}
|
|
5636
|
+
function convertSnapshot(snapshot, converter) {
|
|
5637
|
+
const def = snapshot.def ?? { nodes: [], edges: [] };
|
|
5638
|
+
const { nodeTypeMap, handleTypeMap } = buildTypeMaps(def);
|
|
5639
|
+
const inputDefaults = {};
|
|
5640
|
+
for (const node of def.nodes) {
|
|
5641
|
+
if (node.resolvedHandles?.inputDefaults) {
|
|
5642
|
+
inputDefaults[node.nodeId] = { ...node.resolvedHandles.inputDefaults };
|
|
5643
|
+
}
|
|
5644
|
+
}
|
|
5645
|
+
const { converted: convertedInputs, toConvert: inputsToConvert } = collectValuesToConvert(snapshot.inputs ?? {}, nodeTypeMap, handleTypeMap);
|
|
5646
|
+
const { converted: convertedOutputs, toConvert: outputsToConvert } = collectValuesToConvert(snapshot.outputs ?? {}, nodeTypeMap, handleTypeMap);
|
|
5647
|
+
const { converted: convertedInputDefaults, toConvert: inputDefaultsToConvert, } = collectValuesToConvert(inputDefaults, nodeTypeMap, handleTypeMap);
|
|
5648
|
+
applyConversion(inputsToConvert, convertedInputs, converter, "input");
|
|
5649
|
+
applyConversion(outputsToConvert, convertedOutputs, converter, "output");
|
|
5650
|
+
applyConversion(inputDefaultsToConvert, convertedInputDefaults, converter, "inputDefault");
|
|
5651
|
+
const updatedNodes = def.nodes.map((node) => {
|
|
5652
|
+
const defaults = convertedInputDefaults[node.nodeId];
|
|
5653
|
+
if (!defaults || Object.keys(defaults).length === 0) {
|
|
5654
|
+
if (node.resolvedHandles?.inputDefaults) {
|
|
5655
|
+
const { inputDefaults, ...restHandles } = node.resolvedHandles;
|
|
5656
|
+
return {
|
|
5657
|
+
...node,
|
|
5658
|
+
resolvedHandles: Object.keys(restHandles).length > 0 ? restHandles : undefined,
|
|
5659
|
+
};
|
|
5660
|
+
}
|
|
5661
|
+
return node;
|
|
5662
|
+
}
|
|
5663
|
+
return {
|
|
5664
|
+
...node,
|
|
5665
|
+
resolvedHandles: {
|
|
5666
|
+
...node.resolvedHandles,
|
|
5667
|
+
inputDefaults: defaults,
|
|
5668
|
+
},
|
|
5669
|
+
};
|
|
5670
|
+
});
|
|
5671
|
+
return {
|
|
5672
|
+
...snapshot,
|
|
5673
|
+
def: { ...def, nodes: updatedNodes },
|
|
5674
|
+
inputs: convertedInputs,
|
|
5675
|
+
outputs: convertedOutputs,
|
|
5676
|
+
};
|
|
5677
|
+
}
|
|
5678
|
+
function mergeInputsOutputs(targetInputs, targetOutputs, sourceInputs, sourceOutputs, targetInputDefaults, sourceInputDefaults, nodeIdMap, nodeTypeMap, handleTypeMap) {
|
|
5679
|
+
const mergedInputs = { ...targetInputs };
|
|
5680
|
+
const mergedOutputs = { ...targetOutputs };
|
|
5681
|
+
const mergedInputDefaults = { ...targetInputDefaults };
|
|
5682
|
+
const inputsToConvert = [];
|
|
5683
|
+
const outputsToConvert = [];
|
|
5684
|
+
const inputDefaultsToConvert = [];
|
|
5571
5685
|
for (const [oldId, inputs] of Object.entries(sourceInputs)) {
|
|
5572
5686
|
const newId = nodeIdMap[oldId];
|
|
5573
5687
|
if (newId) {
|
|
5574
|
-
const transformedInputs = {};
|
|
5575
|
-
const nodeTypeId = nodeTypeMap?.get(oldId);
|
|
5576
|
-
// Ensure mergedInputs[newId] exists
|
|
5577
5688
|
if (!mergedInputs[newId]) {
|
|
5578
5689
|
mergedInputs[newId] = {};
|
|
5579
5690
|
}
|
|
5691
|
+
const nodeTypeId = nodeTypeMap?.get(oldId);
|
|
5580
5692
|
for (const [handleId, value] of Object.entries(inputs)) {
|
|
5581
5693
|
const handleDataType = handleTypeMap?.get(oldId)?.get(handleId);
|
|
5582
|
-
|
|
5583
|
-
|
|
5584
|
-
|
|
5585
|
-
|
|
5586
|
-
|
|
5587
|
-
|
|
5588
|
-
|
|
5589
|
-
|
|
5590
|
-
|
|
5591
|
-
: value;
|
|
5592
|
-
// If converter returns null, delete this input
|
|
5593
|
-
if (convertedValue === null) {
|
|
5594
|
-
delete mergedInputs[newId][handleId];
|
|
5595
|
-
}
|
|
5596
|
-
else {
|
|
5597
|
-
// Otherwise, set the converted value
|
|
5598
|
-
transformedInputs[handleId] = convertedValue;
|
|
5599
|
-
}
|
|
5600
|
-
}
|
|
5601
|
-
// Merge transformed inputs
|
|
5602
|
-
if (Object.keys(transformedInputs).length > 0) {
|
|
5603
|
-
mergedInputs[newId] = { ...mergedInputs[newId], ...transformedInputs };
|
|
5604
|
-
}
|
|
5605
|
-
// Clean up empty node input objects
|
|
5606
|
-
if (Object.keys(mergedInputs[newId]).length === 0) {
|
|
5607
|
-
delete mergedInputs[newId];
|
|
5694
|
+
inputsToConvert.push({
|
|
5695
|
+
nodeId: newId,
|
|
5696
|
+
originalNodeId: oldId,
|
|
5697
|
+
handleId,
|
|
5698
|
+
value,
|
|
5699
|
+
nodeTypeId,
|
|
5700
|
+
handleDataType,
|
|
5701
|
+
});
|
|
5702
|
+
mergedInputs[newId][handleId] = value;
|
|
5608
5703
|
}
|
|
5609
5704
|
}
|
|
5610
5705
|
}
|
|
5611
5706
|
for (const [oldId, outputs] of Object.entries(sourceOutputs)) {
|
|
5612
5707
|
const newId = nodeIdMap[oldId];
|
|
5613
5708
|
if (newId) {
|
|
5614
|
-
const transformedOutputs = {};
|
|
5615
|
-
const nodeTypeId = nodeTypeMap?.get(oldId);
|
|
5616
|
-
// Ensure mergedOutputs[newId] exists
|
|
5617
5709
|
if (!mergedOutputs[newId]) {
|
|
5618
5710
|
mergedOutputs[newId] = {};
|
|
5619
5711
|
}
|
|
5712
|
+
const nodeTypeId = nodeTypeMap?.get(oldId);
|
|
5620
5713
|
for (const [handleId, value] of Object.entries(outputs)) {
|
|
5621
5714
|
const handleDataType = handleTypeMap?.get(oldId)?.get(handleId);
|
|
5622
5715
|
const runtimeTypeId = isTypedOutput(value)
|
|
5623
5716
|
? getTypedOutputTypeId(value)
|
|
5624
5717
|
: undefined;
|
|
5625
|
-
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
|
|
5629
|
-
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
: value;
|
|
5636
|
-
// If converter returns null, delete this output
|
|
5637
|
-
if (convertedValue === null) {
|
|
5638
|
-
delete mergedOutputs[newId][handleId];
|
|
5639
|
-
}
|
|
5640
|
-
else {
|
|
5641
|
-
// Otherwise, set the converted value
|
|
5642
|
-
transformedOutputs[handleId] = convertedValue;
|
|
5643
|
-
}
|
|
5644
|
-
}
|
|
5645
|
-
// Merge transformed outputs
|
|
5646
|
-
if (Object.keys(transformedOutputs).length > 0) {
|
|
5647
|
-
mergedOutputs[newId] = {
|
|
5648
|
-
...mergedOutputs[newId],
|
|
5649
|
-
...transformedOutputs,
|
|
5650
|
-
};
|
|
5651
|
-
}
|
|
5652
|
-
// Clean up empty node output objects
|
|
5653
|
-
if (Object.keys(mergedOutputs[newId]).length === 0) {
|
|
5654
|
-
delete mergedOutputs[newId];
|
|
5718
|
+
outputsToConvert.push({
|
|
5719
|
+
nodeId: newId,
|
|
5720
|
+
originalNodeId: oldId,
|
|
5721
|
+
handleId,
|
|
5722
|
+
value,
|
|
5723
|
+
nodeTypeId,
|
|
5724
|
+
handleDataType,
|
|
5725
|
+
runtimeTypeId,
|
|
5726
|
+
});
|
|
5727
|
+
mergedOutputs[newId][handleId] = value;
|
|
5655
5728
|
}
|
|
5656
5729
|
}
|
|
5657
5730
|
}
|
|
5658
|
-
|
|
5659
|
-
|
|
5660
|
-
|
|
5661
|
-
|
|
5662
|
-
|
|
5663
|
-
* UI positions are handled separately by mergeUIState.
|
|
5664
|
-
*/
|
|
5665
|
-
function mergeSnapshotData(targetSnapshot, sourceSnapshot, sourceDef, nodeIdMap, converter) {
|
|
5666
|
-
const nodeTypeMap = new Map();
|
|
5667
|
-
const handleTypeMap = new Map();
|
|
5668
|
-
for (const node of sourceDef.nodes) {
|
|
5669
|
-
nodeTypeMap.set(node.nodeId, node.typeId);
|
|
5670
|
-
const nodeHandleTypes = new Map();
|
|
5671
|
-
if (node.resolvedHandles?.inputs) {
|
|
5672
|
-
for (const [handleId, handleDesc] of Object.entries(node.resolvedHandles.inputs)) {
|
|
5673
|
-
const typeId = typeof handleDesc === "string"
|
|
5674
|
-
? handleDesc
|
|
5675
|
-
: handleDesc?.typeId;
|
|
5676
|
-
if (typeId)
|
|
5677
|
-
nodeHandleTypes.set(handleId, typeId);
|
|
5731
|
+
for (const [oldId, defaults] of Object.entries(sourceInputDefaults)) {
|
|
5732
|
+
const newId = nodeIdMap[oldId];
|
|
5733
|
+
if (newId) {
|
|
5734
|
+
if (!mergedInputDefaults[newId]) {
|
|
5735
|
+
mergedInputDefaults[newId] = {};
|
|
5678
5736
|
}
|
|
5679
|
-
|
|
5680
|
-
|
|
5681
|
-
|
|
5682
|
-
|
|
5683
|
-
|
|
5684
|
-
:
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5737
|
+
const nodeTypeId = nodeTypeMap?.get(oldId);
|
|
5738
|
+
for (const [handleId, value] of Object.entries(defaults)) {
|
|
5739
|
+
const handleDataType = handleTypeMap?.get(oldId)?.get(handleId);
|
|
5740
|
+
inputDefaultsToConvert.push({
|
|
5741
|
+
nodeId: newId,
|
|
5742
|
+
originalNodeId: oldId,
|
|
5743
|
+
handleId,
|
|
5744
|
+
value,
|
|
5745
|
+
nodeTypeId,
|
|
5746
|
+
handleDataType,
|
|
5747
|
+
});
|
|
5748
|
+
mergedInputDefaults[newId][handleId] = value;
|
|
5689
5749
|
}
|
|
5690
5750
|
}
|
|
5691
|
-
if (nodeHandleTypes.size > 0) {
|
|
5692
|
-
handleTypeMap.set(node.nodeId, nodeHandleTypes);
|
|
5693
|
-
}
|
|
5694
5751
|
}
|
|
5695
|
-
const { mergedInputs, mergedOutputs } = mergeInputsOutputs(targetSnapshot.inputs ?? {}, targetSnapshot.outputs ?? {}, sourceSnapshot.inputs ?? {}, sourceSnapshot.outputs ?? {}, nodeIdMap, converter, nodeTypeMap, handleTypeMap);
|
|
5696
5752
|
return {
|
|
5697
5753
|
mergedInputs,
|
|
5698
5754
|
mergedOutputs,
|
|
5755
|
+
mergedInputDefaults,
|
|
5756
|
+
inputsToConvert,
|
|
5757
|
+
outputsToConvert,
|
|
5758
|
+
inputDefaultsToConvert,
|
|
5759
|
+
};
|
|
5760
|
+
}
|
|
5761
|
+
function mergeSnapshotData(targetSnapshot, sourceSnapshot, targetInputDefaults, sourceInputDefaults, nodeIdMap) {
|
|
5762
|
+
const sourceDef = sourceSnapshot.def ?? { nodes: []};
|
|
5763
|
+
const { nodeTypeMap, handleTypeMap } = buildTypeMaps(sourceDef);
|
|
5764
|
+
return mergeInputsOutputs(targetSnapshot.inputs ?? {}, targetSnapshot.outputs ?? {}, sourceSnapshot.inputs ?? {}, sourceSnapshot.outputs ?? {}, targetInputDefaults, sourceInputDefaults, nodeIdMap, nodeTypeMap, handleTypeMap);
|
|
5765
|
+
}
|
|
5766
|
+
function mergeSnapshots(targetSnapshot, sourceSnapshot, converter) {
|
|
5767
|
+
const targetDef = targetSnapshot.def ?? { nodes: [], edges: [] };
|
|
5768
|
+
const sourceDef = sourceSnapshot.def ?? { nodes: [], edges: [] };
|
|
5769
|
+
const { merged, nodeIdMap, targetInputDefaults, sourceInputDefaults } = mergeGraphDefinitions(targetDef, sourceDef);
|
|
5770
|
+
const { mergedInputs, mergedOutputs, mergedInputDefaults, inputsToConvert, outputsToConvert, inputDefaultsToConvert, } = mergeSnapshotData(targetSnapshot, sourceSnapshot, targetInputDefaults, sourceInputDefaults, nodeIdMap);
|
|
5771
|
+
if (converter) {
|
|
5772
|
+
applyConversion(inputDefaultsToConvert, mergedInputDefaults, converter, "inputDefault");
|
|
5773
|
+
applyConversion(inputsToConvert, mergedInputs, converter, "input");
|
|
5774
|
+
applyConversion(outputsToConvert, mergedOutputs, converter, "output");
|
|
5775
|
+
}
|
|
5776
|
+
const nodeMap = new Map(merged.nodes.map((n) => [n.nodeId, n]));
|
|
5777
|
+
for (const nodeId in mergedInputDefaults) {
|
|
5778
|
+
const node = nodeMap.get(nodeId);
|
|
5779
|
+
if (node && Object.keys(mergedInputDefaults[nodeId]).length > 0) {
|
|
5780
|
+
if (!node.resolvedHandles) {
|
|
5781
|
+
node.resolvedHandles = {};
|
|
5782
|
+
}
|
|
5783
|
+
node.resolvedHandles.inputDefaults = mergedInputDefaults[nodeId];
|
|
5784
|
+
}
|
|
5785
|
+
}
|
|
5786
|
+
return {
|
|
5787
|
+
merged: {
|
|
5788
|
+
def: merged,
|
|
5789
|
+
inputs: mergedInputs,
|
|
5790
|
+
outputs: mergedOutputs,
|
|
5791
|
+
environment: {
|
|
5792
|
+
...targetSnapshot.environment,
|
|
5793
|
+
...sourceSnapshot.environment,
|
|
5794
|
+
},
|
|
5795
|
+
extData: { ...targetSnapshot.extData, ...sourceSnapshot.extData },
|
|
5796
|
+
},
|
|
5797
|
+
nodeIdMap,
|
|
5699
5798
|
};
|
|
5700
5799
|
}
|
|
5701
5800
|
/**
|
|
@@ -5740,6 +5839,8 @@ function buildValueConverter(config) {
|
|
|
5740
5839
|
const { nodeId, handleId, value, type, nodeTypeId, handleDataType, runtimeTypeId, } = converterConfig;
|
|
5741
5840
|
const isTyped = isTypedOutput(value);
|
|
5742
5841
|
for (const mapping of config.mappings) {
|
|
5842
|
+
if (mapping.type !== type)
|
|
5843
|
+
continue;
|
|
5743
5844
|
if (!matchesPattern(handleId, mapping.handleId))
|
|
5744
5845
|
continue;
|
|
5745
5846
|
if (!matchesPattern(nodeId, mapping.nodeId))
|
|
@@ -5909,6 +6010,7 @@ exports.LocalEngine = LocalEngine;
|
|
|
5909
6010
|
exports.Registry = Registry;
|
|
5910
6011
|
exports.buildValueConverter = buildValueConverter;
|
|
5911
6012
|
exports.computeGraphCenter = computeGraphCenter;
|
|
6013
|
+
exports.convertSnapshot = convertSnapshot;
|
|
5912
6014
|
exports.createAsyncGraphDef = createAsyncGraphDef;
|
|
5913
6015
|
exports.createAsyncGraphRegistry = createAsyncGraphRegistry;
|
|
5914
6016
|
exports.createProgressGraphDef = createProgressGraphDef;
|
|
@@ -5927,11 +6029,9 @@ exports.getValueAtPath = getValueAtPath;
|
|
|
5927
6029
|
exports.installLogging = installLogging;
|
|
5928
6030
|
exports.isInputPrivate = isInputPrivate;
|
|
5929
6031
|
exports.isTypedOutput = isTypedOutput;
|
|
5930
|
-
exports.mergeGraphDefinitions = mergeGraphDefinitions;
|
|
5931
6032
|
exports.mergeInputHandleDescriptors = mergeInputHandleDescriptors;
|
|
5932
|
-
exports.mergeInputsOutputs = mergeInputsOutputs;
|
|
5933
6033
|
exports.mergeRuntimeState = mergeRuntimeState;
|
|
5934
|
-
exports.
|
|
6034
|
+
exports.mergeSnapshots = mergeSnapshots;
|
|
5935
6035
|
exports.offsetImportedPositions = offsetImportedPositions;
|
|
5936
6036
|
exports.parseJsonPath = parseJsonPath;
|
|
5937
6037
|
exports.registerDelayNode = registerDelayNode;
|