@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.
- package/lib/cjs/index.cjs +142 -179
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/cjs/src/builder/GraphBuilder.d.ts.map +1 -1
- package/lib/cjs/src/core/types.d.ts +2 -1
- package/lib/cjs/src/core/types.d.ts.map +1 -1
- package/lib/cjs/src/runtime/GraphRuntime.d.ts +3 -1
- package/lib/cjs/src/runtime/GraphRuntime.d.ts.map +1 -1
- package/lib/esm/index.js +142 -179
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/src/builder/GraphBuilder.d.ts.map +1 -1
- package/lib/esm/src/core/types.d.ts +2 -1
- package/lib/esm/src/core/types.d.ts.map +1 -1
- package/lib/esm/src/runtime/GraphRuntime.d.ts +3 -1
- package/lib/esm/src/runtime/GraphRuntime.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphBuilder.d.ts","sourceRoot":"","sources":["../../../../src/builder/GraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
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":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,eAAe,EAIf,gBAAgB,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1410
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1444
|
-
|
|
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 =
|
|
1454
|
-
const dstNode =
|
|
1506
|
+
const srcNode = nodeById.get(e.source.nodeId);
|
|
1507
|
+
const dstNode = nodeById.get(e.target.nodeId);
|
|
1455
1508
|
if (!srcNode)
|
|
1456
|
-
|
|
1457
|
-
|
|
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
|
-
|
|
1464
|
-
|
|
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
|
-
//
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
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
|
-
|
|
1500
|
-
|
|
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
|
-
|
|
1508
|
-
|
|
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
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
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
|
-
|
|
1550
|
-
|
|
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
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
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
|
|
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: ({
|
|
2599
|
+
resolveHandles: ({ inputs }) => {
|
|
2637
2600
|
const maxLen = 64;
|
|
2638
|
-
const raw =
|
|
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: {} };
|