@bian-womp/spark-graph 0.2.15 → 0.2.16

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 CHANGED
@@ -406,6 +406,8 @@ class GraphRuntime {
406
406
  constructor() {
407
407
  this.nodes = new Map();
408
408
  this.edges = [];
409
+ // Current resolved handles per node (registry statics merged with per-node overrides)
410
+ this.resolvedByNode = new Map();
409
411
  this.listeners = new Map();
410
412
  this.environment = {};
411
413
  this.paused = false;
@@ -434,7 +436,7 @@ class GraphRuntime {
434
436
  const gr = new GraphRuntime();
435
437
  gr.environment = opts?.environment ?? {};
436
438
  // Precompute per-node resolved handles (use def-provided overrides; do not compute dynamically here)
437
- const resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
439
+ gr.resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
438
440
  // Instantiate nodes
439
441
  for (const n of def.nodes) {
440
442
  const desc = registry.nodes.get(n.typeId);
@@ -474,7 +476,7 @@ class GraphRuntime {
474
476
  gr.nodes.set(n.nodeId, rn);
475
477
  }
476
478
  // Instantiate edges
477
- gr.edges = GraphRuntime.buildEdges(def, registry, resolvedByNode);
479
+ gr.edges = GraphRuntime.buildEdges(def, registry, gr.resolvedByNode);
478
480
  // After nodes and edges exist, seed registry- and graph-level defaults
479
481
  for (const n of def.nodes) {
480
482
  const node = gr.nodes.get(n.nodeId);
@@ -967,6 +969,39 @@ class GraphRuntime {
967
969
  this.propagate(nodeId, handle, value);
968
970
  }
969
971
  }
972
+ // Update resolved handles for a single node and refresh edge converters/types that touch it
973
+ updateNodeHandles(nodeId, handles, registry) {
974
+ this.resolvedByNode.set(nodeId, handles);
975
+ // Recompute edge converter/type for edges where this node is source or target
976
+ for (const e of this.edges) {
977
+ let srcDeclared = e.typeId;
978
+ let dstDeclared = e.dstDeclared;
979
+ if (e.source.nodeId === nodeId) {
980
+ const resolved = this.resolvedByNode.get(nodeId);
981
+ srcDeclared = resolved
982
+ ? resolved.outputs[e.source.handle]
983
+ : srcDeclared;
984
+ // If edge had no explicit typeId, infer from updated src
985
+ if (!e.typeId) {
986
+ e.typeId = Array.isArray(srcDeclared)
987
+ ? srcDeclared?.[0]
988
+ : srcDeclared;
989
+ }
990
+ }
991
+ if (e.target.nodeId === nodeId) {
992
+ const resolved = this.resolvedByNode.get(nodeId);
993
+ if (resolved) {
994
+ dstDeclared = getInputTypeId(resolved.inputs, e.target.handle);
995
+ e.dstDeclared = dstDeclared;
996
+ }
997
+ }
998
+ const conv = GraphRuntime.buildEdgeConverters(srcDeclared, dstDeclared, registry);
999
+ e.convert = conv.convert;
1000
+ e.convertAsync = conv.convertAsync;
1001
+ }
1002
+ // Invalidate downstream for this node so UI refreshes
1003
+ this.invalidateDownstream(nodeId);
1004
+ }
970
1005
  launch() {
971
1006
  // call onActivated for nodes that implement it
972
1007
  for (const node of this.nodes.values()) {
@@ -1260,9 +1295,9 @@ class GraphRuntime {
1260
1295
  prevOutTargets.set(e.source.nodeId, tmap);
1261
1296
  }
1262
1297
  // Precompute per-node resolved handles for updated graph
1263
- const resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
1298
+ this.resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
1264
1299
  // Rebuild edges mapping with coercions
1265
- this.edges = GraphRuntime.buildEdges(def, registry, resolvedByNode);
1300
+ this.edges = GraphRuntime.buildEdges(def, registry, this.resolvedByNode);
1266
1301
  // Build new inbound map
1267
1302
  const nextInbound = new Map();
1268
1303
  for (const e of this.edges) {
@@ -2635,9 +2670,9 @@ function setupBasicGraphRegistry() {
2635
2670
  categoryId: "compute",
2636
2671
  inputs: { Length: "base.float" },
2637
2672
  outputs: { Items: "base.object" },
2638
- resolveHandles: ({ params }) => {
2673
+ resolveHandles: ({ inputs }) => {
2639
2674
  const maxLen = 64;
2640
- const raw = params?.Length;
2675
+ const raw = inputs?.Length ?? 0;
2641
2676
  const n = Math.max(0, Math.min(maxLen, Math.trunc(Number(raw ?? 0))));
2642
2677
  if (!Number.isFinite(n))
2643
2678
  return { inputs: {} };