@bian-womp/spark-graph 0.2.15 → 0.2.17

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.
@@ -1 +1 @@
1
- {"version":3,"file":"GraphBuilder.d.ts","sourceRoot":"","sources":["../../../../src/builder/GraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAEtC,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB;IAuQhD,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,YAAY;IAI9D,UAAU,CACR,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC3D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC7D,EACD,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAkC1C"}
1
+ {"version":3,"file":"GraphBuilder.d.ts","sourceRoot":"","sources":["../../../../src/builder/GraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAGf,kBAAkB,EAEnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAEtC,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB;IAiRhD,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,YAAY;IAI9D,UAAU,CACR,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC3D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC7D,EACD,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAkC1C"}
@@ -70,8 +70,9 @@ export interface NodeTypeDescriptor<I extends Record<string, InputHandleDescript
70
70
  outputs: O;
71
71
  impl: Impl;
72
72
  resolveHandles?: (ctx: {
73
- params?: Record<string, unknown>;
74
73
  environment: Record<string, unknown>;
74
+ params?: Record<string, unknown>;
75
+ inputs?: Record<string, unknown>;
75
76
  }) => {
76
77
  inputs?: Record<string, InputHandleDescriptor>;
77
78
  outputs?: Record<string, DataTypeId | DataTypeId[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { RuntimeValue, RuntimeInvalidate, RuntimeError, RuntimeStats } from "@bian-womp/spark-protocol";
2
- import type { GraphDefinition, RuntimeNodeStats } from "../core/types";
2
+ import type { GraphDefinition, RuntimeNodeStats, ResolvedHandles } from "../core/types";
3
3
  import { Registry } from "../builder/Registry";
4
4
  export type RuntimeEventListener<K extends RuntimeEventName> = (e: RuntimeEventMap[K]) => void;
5
5
  export type RuntimeEventName = "value" | "invalidate" | "error" | "stats";
@@ -12,6 +12,7 @@ export interface RuntimeEventMap {
12
12
  export declare class GraphRuntime {
13
13
  private nodes;
14
14
  private edges;
15
+ private resolvedByNode;
15
16
  private listeners;
16
17
  private environment;
17
18
  private paused;
@@ -33,6 +34,7 @@ export declare class GraphRuntime {
33
34
  private static computeResolvedHandleMap;
34
35
  private static buildEdges;
35
36
  private reemitNodeOutputs;
37
+ updateNodeHandles(nodeId: string, handles: ResolvedHandles, registry: Registry): void;
36
38
  launch(): void;
37
39
  triggerExternal(nodeId: string, event: unknown): void;
38
40
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"GraphRuntime.d.ts","sourceRoot":"","sources":["../../../../src/runtime/GraphRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GraphRuntime.d.ts","sourceRoot":"","sources":["../../../../src/runtime/GraphRuntime.ts"],"names":[],"mappings":"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"}
package/lib/esm/index.js CHANGED
@@ -404,6 +404,8 @@ class GraphRuntime {
404
404
  constructor() {
405
405
  this.nodes = new Map();
406
406
  this.edges = [];
407
+ // Current resolved handles per node (registry statics merged with per-node overrides)
408
+ this.resolvedByNode = new Map();
407
409
  this.listeners = new Map();
408
410
  this.environment = {};
409
411
  this.paused = false;
@@ -432,7 +434,7 @@ class GraphRuntime {
432
434
  const gr = new GraphRuntime();
433
435
  gr.environment = opts?.environment ?? {};
434
436
  // Precompute per-node resolved handles (use def-provided overrides; do not compute dynamically here)
435
- const resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
437
+ gr.resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
436
438
  // Instantiate nodes
437
439
  for (const n of def.nodes) {
438
440
  const desc = registry.nodes.get(n.typeId);
@@ -472,7 +474,7 @@ class GraphRuntime {
472
474
  gr.nodes.set(n.nodeId, rn);
473
475
  }
474
476
  // Instantiate edges
475
- gr.edges = GraphRuntime.buildEdges(def, registry, resolvedByNode);
477
+ gr.edges = GraphRuntime.buildEdges(def, registry, gr.resolvedByNode);
476
478
  // After nodes and edges exist, seed registry- and graph-level defaults
477
479
  for (const n of def.nodes) {
478
480
  const node = gr.nodes.get(n.nodeId);
@@ -965,6 +967,39 @@ class GraphRuntime {
965
967
  this.propagate(nodeId, handle, value);
966
968
  }
967
969
  }
970
+ // Update resolved handles for a single node and refresh edge converters/types that touch it
971
+ updateNodeHandles(nodeId, handles, registry) {
972
+ this.resolvedByNode.set(nodeId, handles);
973
+ // Recompute edge converter/type for edges where this node is source or target
974
+ for (const e of this.edges) {
975
+ let srcDeclared = e.typeId;
976
+ let dstDeclared = e.dstDeclared;
977
+ if (e.source.nodeId === nodeId) {
978
+ const resolved = this.resolvedByNode.get(nodeId);
979
+ srcDeclared = resolved
980
+ ? resolved.outputs[e.source.handle]
981
+ : srcDeclared;
982
+ // If edge had no explicit typeId, infer from updated src
983
+ if (!e.typeId) {
984
+ e.typeId = Array.isArray(srcDeclared)
985
+ ? srcDeclared?.[0]
986
+ : srcDeclared;
987
+ }
988
+ }
989
+ if (e.target.nodeId === nodeId) {
990
+ const resolved = this.resolvedByNode.get(nodeId);
991
+ if (resolved) {
992
+ dstDeclared = getInputTypeId(resolved.inputs, e.target.handle);
993
+ e.dstDeclared = dstDeclared;
994
+ }
995
+ }
996
+ const conv = GraphRuntime.buildEdgeConverters(srcDeclared, dstDeclared, registry);
997
+ e.convert = conv.convert;
998
+ e.convertAsync = conv.convertAsync;
999
+ }
1000
+ // Invalidate downstream for this node so UI refreshes
1001
+ this.invalidateDownstream(nodeId);
1002
+ }
968
1003
  launch() {
969
1004
  // call onActivated for nodes that implement it
970
1005
  for (const node of this.nodes.values()) {
@@ -1258,9 +1293,9 @@ class GraphRuntime {
1258
1293
  prevOutTargets.set(e.source.nodeId, tmap);
1259
1294
  }
1260
1295
  // Precompute per-node resolved handles for updated graph
1261
- const resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
1296
+ this.resolvedByNode = GraphRuntime.computeResolvedHandleMap(def, registry);
1262
1297
  // Rebuild edges mapping with coercions
1263
- this.edges = GraphRuntime.buildEdges(def, registry, resolvedByNode);
1298
+ this.edges = GraphRuntime.buildEdges(def, registry, this.resolvedByNode);
1264
1299
  // Build new inbound map
1265
1300
  const nextInbound = new Map();
1266
1301
  for (const e of this.edges) {
@@ -1403,35 +1438,56 @@ class GraphBuilder {
1403
1438
  const issues = [];
1404
1439
  const nodeIds = new Set();
1405
1440
  const edgeIds = new Set();
1441
+ // Precompute effective handle maps (registry statics merged with per-node resolvedHandles)
1442
+ const nodeById = new Map();
1443
+ const effByNodeId = new Map();
1444
+ const getEffectiveHandles = (n) => {
1445
+ if (!n)
1446
+ return { inputs: {}, outputs: {} };
1447
+ const desc = this.registry.nodes.get(n.typeId);
1448
+ const resolved = n.resolvedHandles || {};
1449
+ const inputs = { ...desc?.inputs, ...resolved.inputs };
1450
+ const outputs = { ...desc?.outputs, ...resolved.outputs };
1451
+ return { inputs, outputs };
1452
+ };
1453
+ const normOut = (decl) => Array.isArray(decl) ? decl : decl ? [decl] : [];
1454
+ const inferEdgeType = (srcDeclared, dstDeclared, explicit) => {
1455
+ if (explicit)
1456
+ return explicit;
1457
+ if (Array.isArray(srcDeclared) && dstDeclared)
1458
+ return dstDeclared;
1459
+ if (srcDeclared)
1460
+ return Array.isArray(srcDeclared) ? srcDeclared[0] : srcDeclared;
1461
+ return undefined;
1462
+ };
1463
+ const canFlow = (from, to) => {
1464
+ if (!to || !from)
1465
+ return true;
1466
+ const arr = Array.isArray(from) ? from : [from];
1467
+ return arr.every((s) => s === to || !!this.registry.canCoerce(s, to));
1468
+ };
1469
+ const pushIssue = (level, code, message, data) => {
1470
+ issues.push({ level, code, message, data });
1471
+ };
1406
1472
  // nodes exist, ids unique, and categories registered
1407
1473
  for (const n of def.nodes) {
1408
1474
  if (nodeIds.has(n.nodeId)) {
1409
- issues.push({
1410
- level: "error",
1411
- code: "NODE_ID_DUP",
1412
- message: `Duplicate nodeId ${n.nodeId}`,
1413
- data: { nodeId: n.nodeId },
1475
+ pushIssue("error", "NODE_ID_DUP", `Duplicate nodeId ${n.nodeId}`, {
1476
+ nodeId: n.nodeId,
1414
1477
  });
1415
1478
  }
1416
1479
  else {
1417
1480
  nodeIds.add(n.nodeId);
1418
1481
  }
1482
+ nodeById.set(n.nodeId, n);
1483
+ effByNodeId.set(n.nodeId, getEffectiveHandles(n));
1419
1484
  const nodeType = this.registry.nodes.get(n.typeId);
1420
1485
  if (!nodeType) {
1421
- issues.push({
1422
- level: "error",
1423
- code: "NODE_TYPE_MISSING",
1424
- message: `Unknown node type ${n.typeId}`,
1425
- data: { typeId: n.typeId, nodeId: n.nodeId },
1426
- });
1486
+ pushIssue("error", "NODE_TYPE_MISSING", `Unknown node type ${n.typeId}`, { typeId: n.typeId, nodeId: n.nodeId });
1427
1487
  continue;
1428
1488
  }
1429
1489
  if (!this.registry.categories.has(nodeType.categoryId)) {
1430
- issues.push({
1431
- level: "error",
1432
- code: "CATEGORY_MISSING",
1433
- message: `Unknown category ${nodeType.categoryId} for node type ${n.typeId}`,
1434
- });
1490
+ pushIssue("error", "CATEGORY_MISSING", `Unknown category ${nodeType.categoryId} for node type ${n.typeId}`);
1435
1491
  }
1436
1492
  }
1437
1493
  // edges validation: nodes exist, handles exist, type exists
@@ -1440,186 +1496,96 @@ class GraphBuilder {
1440
1496
  const inboundArrayOk = new Set();
1441
1497
  for (const e of def.edges) {
1442
1498
  if (edgeIds.has(e.id)) {
1443
- issues.push({
1444
- level: "error",
1445
- code: "EDGE_ID_DUP",
1446
- message: `Duplicate edge id ${e.id}`,
1447
- data: { edgeId: e.id },
1499
+ pushIssue("error", "EDGE_ID_DUP", `Duplicate edge id ${e.id}`, {
1500
+ edgeId: e.id,
1448
1501
  });
1449
1502
  }
1450
1503
  else {
1451
1504
  edgeIds.add(e.id);
1452
1505
  }
1453
- const srcNode = def.nodes.find((nn) => nn.nodeId === e.source.nodeId);
1454
- const dstNode = def.nodes.find((nn) => nn.nodeId === e.target.nodeId);
1506
+ const srcNode = nodeById.get(e.source.nodeId);
1507
+ const dstNode = nodeById.get(e.target.nodeId);
1455
1508
  if (!srcNode)
1456
- issues.push({
1457
- level: "error",
1458
- code: "EDGE_SOURCE_MISSING",
1459
- message: `Edge ${e.id} source node missing`,
1460
- data: { edgeId: e.id },
1509
+ pushIssue("error", "EDGE_SOURCE_MISSING", `Edge ${e.id} source node missing`, {
1510
+ edgeId: e.id,
1461
1511
  });
1462
1512
  if (!dstNode)
1463
- issues.push({
1464
- level: "error",
1465
- code: "EDGE_TARGET_MISSING",
1466
- message: `Edge ${e.id} target node missing`,
1467
- data: { edgeId: e.id },
1513
+ pushIssue("error", "EDGE_TARGET_MISSING", `Edge ${e.id} target node missing`, {
1514
+ edgeId: e.id,
1468
1515
  });
1469
- // Infer edge type when missing. For union sources, prefer target input type if available.
1470
- let effectiveTypeId = e.typeId;
1471
- let _srcDeclared;
1472
- let _dstDeclared;
1473
- if (srcNode) {
1474
- const srcType = this.registry.nodes.get(srcNode.typeId);
1475
- if (srcType)
1476
- _srcDeclared = srcType.outputs[e.source.handle];
1477
- }
1478
- if (dstNode) {
1479
- const dstType = this.registry.nodes.get(dstNode.typeId);
1480
- if (dstType)
1481
- _dstDeclared = getInputTypeId(dstType.inputs, e.target.handle);
1482
- }
1483
- if (!effectiveTypeId) {
1484
- if (Array.isArray(_srcDeclared) && _dstDeclared) {
1485
- // When source is a union and target input type is known, adopt the input type
1486
- // so validation checks are performed against the target, not an arbitrary variant.
1487
- effectiveTypeId = _dstDeclared;
1488
- }
1489
- else if (_srcDeclared) {
1490
- effectiveTypeId = Array.isArray(_srcDeclared)
1491
- ? _srcDeclared[0]
1492
- : _srcDeclared;
1493
- }
1494
- }
1516
+ // Effective handle declarations
1517
+ const srcEff = effByNodeId.get(e.source.nodeId) || {
1518
+ outputs: {},
1519
+ };
1520
+ const dstEff = effByNodeId.get(e.target.nodeId) || {
1521
+ inputs: {}};
1522
+ const _srcDeclared = srcNode
1523
+ ? srcEff.outputs[e.source.handle]
1524
+ : undefined;
1525
+ const _dstDeclared = dstNode
1526
+ ? getInputTypeId(dstEff.inputs, e.target.handle)
1527
+ : undefined;
1528
+ // Effective edge type
1529
+ const effectiveTypeId = inferEdgeType(_srcDeclared, _dstDeclared, e.typeId);
1495
1530
  const type = effectiveTypeId
1496
1531
  ? this.registry.types.get(effectiveTypeId)
1497
1532
  : undefined;
1498
1533
  if (!type) {
1499
- issues.push({
1500
- level: "error",
1501
- code: "TYPE_MISSING",
1502
- message: `Edge ${e.id} type missing or unknown`,
1503
- data: { edgeId: e.id },
1534
+ pushIssue("error", "TYPE_MISSING", `Edge ${e.id} type missing or unknown`, {
1535
+ edgeId: e.id,
1504
1536
  });
1505
1537
  }
1506
1538
  if (srcNode) {
1507
- const srcType = this.registry.nodes.get(srcNode.typeId);
1508
- if (srcType && !(e.source.handle in srcType.outputs)) {
1509
- issues.push({
1510
- level: "error",
1511
- code: "OUTPUT_MISSING",
1512
- message: `Edge ${e.id} source output ${e.source.handle} missing on ${srcNode.typeId}`,
1513
- data: {
1514
- edgeId: e.id,
1515
- nodeId: srcNode.nodeId,
1516
- output: e.source.handle,
1517
- },
1518
- });
1539
+ if (!(e.source.handle in srcEff.outputs)) {
1540
+ pushIssue("error", "OUTPUT_MISSING", `Edge ${e.id} source output ${e.source.handle} missing on ${srcNode.typeId}`, { edgeId: e.id, nodeId: srcNode.nodeId, output: e.source.handle });
1519
1541
  }
1520
- if (srcType) {
1521
- const declared = srcType.outputs[e.source.handle];
1522
- const declaredArr = Array.isArray(declared)
1523
- ? declared
1524
- : declared
1525
- ? [declared]
1526
- : [];
1527
- if (declaredArr.length > 0 && effectiveTypeId) {
1528
- for (const s of declaredArr) {
1529
- if (s !== effectiveTypeId &&
1530
- !this.registry.canCoerce(s, effectiveTypeId)) {
1531
- issues.push({
1532
- level: "error",
1533
- code: "TYPE_MISMATCH_OUTPUT",
1534
- message: `Edge ${e.id} type ${effectiveTypeId} mismatches source output ${srcNode.typeId}.${e.source.handle} (${s}) and no coercion exists`,
1535
- data: {
1536
- edgeId: e.id,
1537
- nodeId: srcNode.nodeId,
1538
- output: e.source.handle,
1539
- declared: s,
1540
- effectiveTypeId,
1541
- },
1542
- });
1543
- }
1544
- }
1545
- }
1542
+ const declaredArr = normOut(srcEff.outputs[e.source.handle]);
1543
+ if (declaredArr.length > 0 &&
1544
+ effectiveTypeId &&
1545
+ !canFlow(declaredArr, effectiveTypeId)) {
1546
+ pushIssue("error", "TYPE_MISMATCH_OUTPUT", `Edge ${e.id} type ${effectiveTypeId} mismatches source output ${srcNode.typeId}.${e.source.handle} (${declaredArr.join("|")}) and no coercion exists`, {
1547
+ edgeId: e.id,
1548
+ nodeId: srcNode.nodeId,
1549
+ output: e.source.handle,
1550
+ declared: declaredArr.join("|"),
1551
+ effectiveTypeId,
1552
+ });
1546
1553
  }
1547
1554
  }
1548
1555
  if (dstNode) {
1549
- const dstType = this.registry.nodes.get(dstNode.typeId);
1550
- if (dstType && !(e.target.handle in dstType.inputs)) {
1551
- issues.push({
1552
- level: "error",
1553
- code: "INPUT_MISSING",
1554
- message: `Edge ${e.id} target input ${e.target.handle} missing on ${dstNode.typeId}`,
1555
- data: {
1556
- edgeId: e.id,
1557
- nodeId: dstNode.nodeId,
1558
- input: e.target.handle,
1559
- },
1560
- });
1556
+ if (!(e.target.handle in dstEff.inputs)) {
1557
+ pushIssue("error", "INPUT_MISSING", `Edge ${e.id} target input ${e.target.handle} missing on ${dstNode.typeId}`, { edgeId: e.id, nodeId: dstNode.nodeId, input: e.target.handle });
1561
1558
  }
1562
- if (dstType) {
1563
- // Private inputs should not accept edges
1564
- if (isInputPrivate(dstType.inputs, e.target.handle)) {
1565
- issues.push({
1566
- level: "error",
1567
- code: "INPUT_PRIVATE",
1568
- message: `Edge ${e.id} targets private input ${dstNode.typeId}.${e.target.handle}`,
1569
- data: {
1559
+ // Private inputs should not accept edges
1560
+ if (isInputPrivate(dstEff.inputs, e.target.handle)) {
1561
+ pushIssue("error", "INPUT_PRIVATE", `Edge ${e.id} targets private input ${dstNode.typeId}.${e.target.handle}`, { edgeId: e.id, nodeId: dstNode.nodeId, input: e.target.handle });
1562
+ }
1563
+ const declaredIn = getInputTypeId(dstEff.inputs, e.target.handle);
1564
+ if (declaredIn && effectiveTypeId) {
1565
+ if (srcNode) {
1566
+ const srcDeclared = srcEff.outputs[e.source.handle];
1567
+ const srcArr = normOut(srcDeclared).length
1568
+ ? normOut(srcDeclared)
1569
+ : [effectiveTypeId];
1570
+ if (!canFlow(srcArr, declaredIn)) {
1571
+ pushIssue("error", "TYPE_MISMATCH_INPUT", `Edge ${e.id} output type ${srcArr.join("|")} not convertible to target input ${dstNode.typeId}.${e.target.handle} (${declaredIn})`, {
1570
1572
  edgeId: e.id,
1571
1573
  nodeId: dstNode.nodeId,
1572
1574
  input: e.target.handle,
1573
- },
1574
- });
1575
- }
1576
- const declaredIn = getInputTypeId(dstType.inputs, e.target.handle);
1577
- if (declaredIn && effectiveTypeId) {
1578
- // If source is a union, ensure each variant can reach declaredIn
1579
- if (srcNode) {
1580
- const srcType = this.registry.nodes.get(srcNode.typeId);
1581
- const srcDeclared = srcType?.outputs[e.source.handle];
1582
- const srcArr = Array.isArray(srcDeclared)
1583
- ? srcDeclared
1584
- : srcDeclared
1585
- ? [srcDeclared]
1586
- : effectiveTypeId
1587
- ? [effectiveTypeId]
1588
- : [];
1589
- for (const s of srcArr) {
1590
- if (s !== declaredIn &&
1591
- !this.registry.canCoerce(s, declaredIn)) {
1592
- issues.push({
1593
- level: "error",
1594
- code: "TYPE_MISMATCH_INPUT",
1595
- message: `Edge ${e.id} output type ${s} not convertible to target input ${dstNode.typeId}.${e.target.handle} (${declaredIn})`,
1596
- data: {
1597
- edgeId: e.id,
1598
- nodeId: dstNode.nodeId,
1599
- input: e.target.handle,
1600
- declared: declaredIn,
1601
- effectiveTypeId: s,
1602
- },
1603
- });
1604
- }
1605
- }
1606
- }
1607
- else if (declaredIn !== effectiveTypeId &&
1608
- !this.registry.canCoerce(effectiveTypeId, declaredIn)) {
1609
- issues.push({
1610
- level: "error",
1611
- code: "TYPE_MISMATCH_INPUT",
1612
- message: `Edge ${e.id} type ${effectiveTypeId} mismatches target input ${dstNode.typeId}.${e.target.handle} (${declaredIn}) and no coercion exists`,
1613
- data: {
1614
- edgeId: e.id,
1615
- nodeId: dstNode.nodeId,
1616
- input: e.target.handle,
1617
- declared: declaredIn,
1618
- effectiveTypeId,
1619
- },
1575
+ declared: declaredIn,
1576
+ effectiveTypeId: srcArr.join("|"),
1620
1577
  });
1621
1578
  }
1622
1579
  }
1580
+ else if (!canFlow(effectiveTypeId, declaredIn)) {
1581
+ pushIssue("error", "TYPE_MISMATCH_INPUT", `Edge ${e.id} type ${effectiveTypeId} mismatches target input ${dstNode.typeId}.${e.target.handle} (${declaredIn}) and no coercion exists`, {
1582
+ edgeId: e.id,
1583
+ nodeId: dstNode.nodeId,
1584
+ input: e.target.handle,
1585
+ declared: declaredIn,
1586
+ effectiveTypeId,
1587
+ });
1588
+ }
1623
1589
  }
1624
1590
  }
1625
1591
  // Track multiple inbound edges targeting the same input handle
@@ -1627,10 +1593,7 @@ class GraphBuilder {
1627
1593
  inboundCounts.set(inboundKey, (inboundCounts.get(inboundKey) ?? 0) + 1);
1628
1594
  // If the target input is declared as an array type, allow multi-inbound (runtime will append)
1629
1595
  if (dstNode) {
1630
- const dstType = this.registry.nodes.get(dstNode.typeId);
1631
- const declaredIn = dstType
1632
- ? getInputTypeId(dstType.inputs, e.target.handle)
1633
- : undefined;
1596
+ const declaredIn = getInputTypeId((effByNodeId.get(dstNode.nodeId) || { inputs: {} }).inputs, e.target.handle);
1634
1597
  if (typeof declaredIn === "string" && declaredIn.endsWith("[]")) {
1635
1598
  inboundArrayOk.add(inboundKey);
1636
1599
  }
@@ -2633,9 +2596,9 @@ function setupBasicGraphRegistry() {
2633
2596
  categoryId: "compute",
2634
2597
  inputs: { Length: "base.float" },
2635
2598
  outputs: { Items: "base.object" },
2636
- resolveHandles: ({ params }) => {
2599
+ resolveHandles: ({ inputs }) => {
2637
2600
  const maxLen = 64;
2638
- const raw = params?.Length;
2601
+ const raw = inputs?.Length ?? 0;
2639
2602
  const n = Math.max(0, Math.min(maxLen, Math.trunc(Number(raw ?? 0))));
2640
2603
  if (!Number.isFinite(n))
2641
2604
  return { inputs: {} };