@bian-womp/spark-graph 0.3.15 → 0.3.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 +150 -15
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/cjs/src/builder/GraphBuilder.d.ts.map +1 -1
- package/lib/cjs/src/runtime/GraphRuntime.d.ts.map +1 -1
- package/lib/cjs/src/runtime/components/EdgePropagator.d.ts.map +1 -1
- package/lib/cjs/src/runtime/components/HandleResolver.d.ts +15 -1
- package/lib/cjs/src/runtime/components/HandleResolver.d.ts.map +1 -1
- package/lib/cjs/src/runtime/components/NodeExecutor.d.ts +3 -2
- package/lib/cjs/src/runtime/components/NodeExecutor.d.ts.map +1 -1
- package/lib/cjs/src/runtime/components/interfaces.d.ts +3 -0
- package/lib/cjs/src/runtime/components/interfaces.d.ts.map +1 -1
- package/lib/esm/index.js +150 -15
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/src/builder/GraphBuilder.d.ts.map +1 -1
- package/lib/esm/src/runtime/GraphRuntime.d.ts.map +1 -1
- package/lib/esm/src/runtime/components/EdgePropagator.d.ts.map +1 -1
- package/lib/esm/src/runtime/components/HandleResolver.d.ts +15 -1
- package/lib/esm/src/runtime/components/HandleResolver.d.ts.map +1 -1
- package/lib/esm/src/runtime/components/NodeExecutor.d.ts +3 -2
- package/lib/esm/src/runtime/components/NodeExecutor.d.ts.map +1 -1
- package/lib/esm/src/runtime/components/interfaces.d.ts +3 -0
- package/lib/esm/src/runtime/components/interfaces.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,EACV,eAAe,EAGhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,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;
|
|
1
|
+
{"version":3,"file":"GraphBuilder.d.ts","sourceRoot":"","sources":["../../../../src/builder/GraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,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;IAmWhD,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;CAmC1C"}
|
|
@@ -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,EAEZ,eAAe,EAGf,OAAO,EACR,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAO/C,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAEV,YAAY,EAEb,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAC7D,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,KAClB,IAAI,CAAC;AAEV,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;CACrB;AAGD,qBAAa,YAAa,YAAW,QAAQ,EAAE,aAAa,EAAE,eAAe;IAE3E,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IAGnC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAAK;;
|
|
1
|
+
{"version":3,"file":"GraphRuntime.d.ts","sourceRoot":"","sources":["../../../../src/runtime/GraphRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EdgePropagator.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/EdgePropagator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,
|
|
1
|
+
{"version":3,"file":"EdgePropagator.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/EdgePropagator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/E;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IAOlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAV/B,OAAO,CAAC,iBAAiB,CAGrB;gBAGe,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,eAAe,EAC/B,YAAY,EAAE,aAAa;IAG9C;;;;OAIG;IACH,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,GAChC,IAAI;IAeP;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoCvB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAgBlC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmD7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAyDrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmBhC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAcjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;OAGG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAuB1C;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIvC;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAG7B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Registry } from "../../builder/Registry";
|
|
2
2
|
import type { EventEmitter } from "./EventEmitter";
|
|
3
3
|
import type { Graph } from "./Graph";
|
|
4
|
-
import type { RunContextManager } from "./RunContextManager";
|
|
4
|
+
import type { RunContextId, RunContextManager } from "./RunContextManager";
|
|
5
5
|
import type { IEdgePropagator, IHandleResolver } from "./interfaces";
|
|
6
6
|
/**
|
|
7
7
|
* HandleResolver component - manages dynamic handle resolution
|
|
@@ -14,9 +14,23 @@ export declare class HandleResolver implements IHandleResolver {
|
|
|
14
14
|
private registry?;
|
|
15
15
|
private recomputeTokenByNode;
|
|
16
16
|
private environment;
|
|
17
|
+
private pendingResolutions;
|
|
18
|
+
private pendingResolutionRunContexts;
|
|
17
19
|
constructor(graph: Graph, eventEmitter: EventEmitter, runContextManager: RunContextManager, edgePropagator: IEdgePropagator, registry?: Registry | undefined, environment?: Record<string, unknown>);
|
|
18
20
|
setRegistry(registry: Registry): void;
|
|
19
21
|
setEnvironment(environment: Record<string, unknown>): void;
|
|
22
|
+
/**
|
|
23
|
+
* Check if handle resolution is pending for a node
|
|
24
|
+
*/
|
|
25
|
+
isResolvingHandles(nodeId: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get the promise for pending handle resolution, or null if none
|
|
28
|
+
*/
|
|
29
|
+
getPendingResolution(nodeId: string): Promise<void> | null;
|
|
30
|
+
/**
|
|
31
|
+
* Track additional run contexts for a pending resolution
|
|
32
|
+
*/
|
|
33
|
+
trackRunContextsForPendingResolution(nodeId: string, runContextIds: Set<RunContextId>): void;
|
|
20
34
|
/**
|
|
21
35
|
* Schedule async recomputation of handles for a node
|
|
22
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleResolver.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/HandleResolver.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"HandleResolver.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/HandleResolver.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKrE;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IAOlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC;IAVnB,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,4BAA4B,CAAwC;gBAGzD,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,eAAe,EACxC,QAAQ,CAAC,EAAE,QAAQ,YAAA,EAC3B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAKvC,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI1D;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI3C;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI1D;;OAEG;IACH,oCAAoC,CAClC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,GAAG,CAAC,YAAY,CAAC,GAC/B,IAAI;IAaP;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAoC9C,OAAO,CAAC,iBAAiB;IA+EzB;;OAEG;YACW,uBAAuB;CA0GtC"}
|
|
@@ -3,7 +3,7 @@ import type { RuntimeNode, RunContextId } from "./types";
|
|
|
3
3
|
import type { Graph } from "./Graph";
|
|
4
4
|
import type { EventEmitter } from "./EventEmitter";
|
|
5
5
|
import type { RunContextManager } from "./RunContextManager";
|
|
6
|
-
import { IEdgePropagator, INodeExecutor, IRuntime } from "./interfaces";
|
|
6
|
+
import { IEdgePropagator, INodeExecutor, IRuntime, IHandleResolver } from "./interfaces";
|
|
7
7
|
/**
|
|
8
8
|
* NodeExecutor component - handles node execution scheduling and lifecycle
|
|
9
9
|
*/
|
|
@@ -11,10 +11,11 @@ export declare class NodeExecutor implements INodeExecutor {
|
|
|
11
11
|
private readonly graph;
|
|
12
12
|
private readonly eventEmitter;
|
|
13
13
|
private readonly runContextManager;
|
|
14
|
+
private readonly handleResolver;
|
|
14
15
|
private readonly edgePropagator;
|
|
15
16
|
private readonly runtime;
|
|
16
17
|
private environment;
|
|
17
|
-
constructor(graph: Graph, eventEmitter: EventEmitter, runContextManager: RunContextManager, edgePropagator: IEdgePropagator, runtime: IRuntime, environment?: Record<string, unknown>);
|
|
18
|
+
constructor(graph: Graph, eventEmitter: EventEmitter, runContextManager: RunContextManager, handleResolver: IHandleResolver, edgePropagator: IEdgePropagator, runtime: IRuntime, environment?: Record<string, unknown>);
|
|
18
19
|
setEnvironment(environment: Record<string, unknown>): void;
|
|
19
20
|
/**
|
|
20
21
|
* Compute effective inputs for a node by merging real inputs with defaults
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeExecutor.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/NodeExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"NodeExecutor.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/NodeExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,9 @@ export interface INodeExecutor {
|
|
|
18
18
|
*/
|
|
19
19
|
export interface IHandleResolver {
|
|
20
20
|
scheduleRecomputeHandles(nodeId: string): void;
|
|
21
|
+
isResolvingHandles(nodeId: string): boolean;
|
|
22
|
+
getPendingResolution(nodeId: string): Promise<void> | null;
|
|
23
|
+
trackRunContextsForPendingResolution(nodeId: string, runContextIds: Set<RunContextId>): void;
|
|
21
24
|
}
|
|
22
25
|
/**
|
|
23
26
|
* Interface for runtime coordination operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,GAChC,IAAI,CAAC;IACR,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/components/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,GAChC,IAAI,CAAC;IACR,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3D,oCAAoC,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;CAC9F;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,IAAI,OAAO,CAAC;IACpB,UAAU,IAAI,OAAO,GAAG,IAAI,CAAC;CAC9B"}
|
package/lib/esm/index.js
CHANGED
|
@@ -1332,6 +1332,8 @@ class HandleResolver {
|
|
|
1332
1332
|
this.registry = registry;
|
|
1333
1333
|
this.recomputeTokenByNode = new Map();
|
|
1334
1334
|
this.environment = {};
|
|
1335
|
+
this.pendingResolutions = new Map();
|
|
1336
|
+
this.pendingResolutionRunContexts = new Map();
|
|
1335
1337
|
this.environment = environment ?? {};
|
|
1336
1338
|
}
|
|
1337
1339
|
setRegistry(registry) {
|
|
@@ -1340,6 +1342,33 @@ class HandleResolver {
|
|
|
1340
1342
|
setEnvironment(environment) {
|
|
1341
1343
|
this.environment = environment;
|
|
1342
1344
|
}
|
|
1345
|
+
/**
|
|
1346
|
+
* Check if handle resolution is pending for a node
|
|
1347
|
+
*/
|
|
1348
|
+
isResolvingHandles(nodeId) {
|
|
1349
|
+
return this.pendingResolutions.has(nodeId);
|
|
1350
|
+
}
|
|
1351
|
+
/**
|
|
1352
|
+
* Get the promise for pending handle resolution, or null if none
|
|
1353
|
+
*/
|
|
1354
|
+
getPendingResolution(nodeId) {
|
|
1355
|
+
return this.pendingResolutions.get(nodeId) || null;
|
|
1356
|
+
}
|
|
1357
|
+
/**
|
|
1358
|
+
* Track additional run contexts for a pending resolution
|
|
1359
|
+
*/
|
|
1360
|
+
trackRunContextsForPendingResolution(nodeId, runContextIds) {
|
|
1361
|
+
if (!this.pendingResolutions.has(nodeId))
|
|
1362
|
+
return;
|
|
1363
|
+
const tracked = this.pendingResolutionRunContexts.get(nodeId) ?? new Set();
|
|
1364
|
+
for (const runContextId of runContextIds) {
|
|
1365
|
+
if (!tracked.has(runContextId)) {
|
|
1366
|
+
this.runContextManager.startHandleResolution(runContextId, nodeId);
|
|
1367
|
+
tracked.add(runContextId);
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
this.pendingResolutionRunContexts.set(nodeId, tracked);
|
|
1371
|
+
}
|
|
1343
1372
|
/**
|
|
1344
1373
|
* Schedule async recomputation of handles for a node
|
|
1345
1374
|
*/
|
|
@@ -1352,14 +1381,25 @@ class HandleResolver {
|
|
|
1352
1381
|
return;
|
|
1353
1382
|
// Track resolver start for all active run-contexts
|
|
1354
1383
|
const activeRunContextIds = this.graph.getNodeRunContextIds(nodeId);
|
|
1384
|
+
const trackedRunContextIds = new Set(activeRunContextIds);
|
|
1355
1385
|
if (activeRunContextIds.size > 0) {
|
|
1356
1386
|
for (const runContextId of activeRunContextIds) {
|
|
1357
1387
|
this.runContextManager.startHandleResolution(runContextId, nodeId);
|
|
1358
1388
|
}
|
|
1359
1389
|
}
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1390
|
+
// Create and track the resolution promise
|
|
1391
|
+
const resolutionPromise = new Promise((resolve) => {
|
|
1392
|
+
setTimeout(async () => {
|
|
1393
|
+
// Get all tracked run contexts (including any added during pending state)
|
|
1394
|
+
const allTracked = this.pendingResolutionRunContexts.get(nodeId) ?? trackedRunContextIds;
|
|
1395
|
+
await this.recomputeHandlesForNode(nodeId, allTracked.size > 0 ? allTracked : undefined);
|
|
1396
|
+
this.pendingResolutions.delete(nodeId);
|
|
1397
|
+
this.pendingResolutionRunContexts.delete(nodeId);
|
|
1398
|
+
resolve();
|
|
1399
|
+
}, 0);
|
|
1400
|
+
});
|
|
1401
|
+
this.pendingResolutions.set(nodeId, resolutionPromise);
|
|
1402
|
+
this.pendingResolutionRunContexts.set(nodeId, trackedRunContextIds);
|
|
1363
1403
|
}
|
|
1364
1404
|
// Update resolved handles for a single node and refresh edge converters/types that touch it
|
|
1365
1405
|
updateNodeHandles(nodeId, handles) {
|
|
@@ -1904,10 +1944,11 @@ class EdgePropagator {
|
|
|
1904
1944
|
* NodeExecutor component - handles node execution scheduling and lifecycle
|
|
1905
1945
|
*/
|
|
1906
1946
|
class NodeExecutor {
|
|
1907
|
-
constructor(graph, eventEmitter, runContextManager, edgePropagator, runtime, environment) {
|
|
1947
|
+
constructor(graph, eventEmitter, runContextManager, handleResolver, edgePropagator, runtime, environment) {
|
|
1908
1948
|
this.graph = graph;
|
|
1909
1949
|
this.eventEmitter = eventEmitter;
|
|
1910
1950
|
this.runContextManager = runContextManager;
|
|
1951
|
+
this.handleResolver = handleResolver;
|
|
1911
1952
|
this.edgePropagator = edgePropagator;
|
|
1912
1953
|
this.runtime = runtime;
|
|
1913
1954
|
this.environment = {};
|
|
@@ -2067,10 +2108,31 @@ class NodeExecutor {
|
|
|
2067
2108
|
// Early validation for auto-mode paused state
|
|
2068
2109
|
if (this.runtime.isPaused())
|
|
2069
2110
|
return;
|
|
2070
|
-
// Attach run-context IDs if provided
|
|
2111
|
+
// Attach run-context IDs if provided - do this BEFORE checking for pending resolution
|
|
2112
|
+
// so that handle resolution can track these run contexts
|
|
2071
2113
|
if (runContextIds) {
|
|
2072
2114
|
this.graph.addNodeRunContextIds(nodeId, runContextIds);
|
|
2073
2115
|
}
|
|
2116
|
+
// Check if handles are being resolved - wait for resolution before executing
|
|
2117
|
+
// Do this AFTER setting up run contexts so handle resolution can track them
|
|
2118
|
+
if (this.handleResolver && this.handleResolver.isResolvingHandles(nodeId)) {
|
|
2119
|
+
// Track run contexts for the pending resolution
|
|
2120
|
+
if (runContextIds && runContextIds.size > 0) {
|
|
2121
|
+
this.handleResolver.trackRunContextsForPendingResolution(nodeId, runContextIds);
|
|
2122
|
+
}
|
|
2123
|
+
const pendingResolution = this.handleResolver.getPendingResolution(nodeId);
|
|
2124
|
+
if (pendingResolution) {
|
|
2125
|
+
// Wait for resolution to complete, then re-execute
|
|
2126
|
+
pendingResolution.then(() => {
|
|
2127
|
+
// Re-check node still exists and conditions
|
|
2128
|
+
const nodeAfter = this.graph.getNode(nodeId);
|
|
2129
|
+
if (nodeAfter) {
|
|
2130
|
+
this.execute(nodeId, runContextIds);
|
|
2131
|
+
}
|
|
2132
|
+
});
|
|
2133
|
+
return;
|
|
2134
|
+
}
|
|
2135
|
+
}
|
|
2074
2136
|
// Handle debouncing
|
|
2075
2137
|
const now = Date.now();
|
|
2076
2138
|
if (this.shouldDebounce(nodeId, node, now)) {
|
|
@@ -2513,8 +2575,8 @@ class GraphRuntime {
|
|
|
2513
2575
|
this.runContextManager = new RunContextManager(this.graph);
|
|
2514
2576
|
this.handleResolver = new HandleResolver(this.graph, this.eventEmitter, this.runContextManager, this);
|
|
2515
2577
|
this.edgePropagator = new EdgePropagator(this.graph, this.eventEmitter, this.runContextManager, this.handleResolver, this);
|
|
2516
|
-
// Create NodeExecutor with EdgePropagator
|
|
2517
|
-
this.nodeExecutor = new NodeExecutor(this.graph, this.eventEmitter, this.runContextManager, this, this);
|
|
2578
|
+
// Create NodeExecutor with EdgePropagator and HandleResolver
|
|
2579
|
+
this.nodeExecutor = new NodeExecutor(this.graph, this.eventEmitter, this.runContextManager, this.handleResolver, this, this);
|
|
2518
2580
|
}
|
|
2519
2581
|
static create(def, registry, opts) {
|
|
2520
2582
|
const gr = new GraphRuntime();
|
|
@@ -2827,19 +2889,30 @@ class GraphRuntime {
|
|
|
2827
2889
|
const releasePause = this.requestPause();
|
|
2828
2890
|
try {
|
|
2829
2891
|
const ins = payload?.inputs || {};
|
|
2892
|
+
const nodesWithChangedInputs = new Set();
|
|
2830
2893
|
for (const [nodeId, map] of Object.entries(ins)) {
|
|
2831
2894
|
if (!this.graph.hasNode(nodeId))
|
|
2832
2895
|
continue;
|
|
2896
|
+
let nodeChanged = false;
|
|
2833
2897
|
for (const [h, v] of Object.entries(map || {})) {
|
|
2898
|
+
const node = this.graph.getNode(nodeId);
|
|
2899
|
+
const prev = node?.inputs[h];
|
|
2834
2900
|
const clonedValue = structuredClone(v);
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
nodeId,
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
2901
|
+
const same = valuesEqual(prev, clonedValue);
|
|
2902
|
+
if (!same) {
|
|
2903
|
+
this.graph.updateNodeInput(nodeId, h, clonedValue);
|
|
2904
|
+
this.eventEmitter.emit("value", {
|
|
2905
|
+
nodeId,
|
|
2906
|
+
handle: h,
|
|
2907
|
+
value: clonedValue,
|
|
2908
|
+
io: "input",
|
|
2909
|
+
runtimeTypeId: getTypedOutputTypeId(clonedValue),
|
|
2910
|
+
});
|
|
2911
|
+
nodeChanged = true;
|
|
2912
|
+
}
|
|
2913
|
+
}
|
|
2914
|
+
if (nodeChanged) {
|
|
2915
|
+
nodesWithChangedInputs.add(nodeId);
|
|
2843
2916
|
}
|
|
2844
2917
|
}
|
|
2845
2918
|
const outs = payload?.outputs || {};
|
|
@@ -2858,6 +2931,10 @@ class GraphRuntime {
|
|
|
2858
2931
|
});
|
|
2859
2932
|
}
|
|
2860
2933
|
}
|
|
2934
|
+
// Trigger handle resolution for nodes with changed inputs
|
|
2935
|
+
for (const nodeId of nodesWithChangedInputs) {
|
|
2936
|
+
this.handleResolver.scheduleRecomputeHandles(nodeId);
|
|
2937
|
+
}
|
|
2861
2938
|
if (opts?.invalidate) {
|
|
2862
2939
|
for (const nodeId of this.graph.getNodeIds()) {
|
|
2863
2940
|
this.invalidateDownstream(nodeId);
|
|
@@ -3040,6 +3117,8 @@ class GraphRuntime {
|
|
|
3040
3117
|
}
|
|
3041
3118
|
if (changed) {
|
|
3042
3119
|
this.edgePropagator.clearArrayBuckets(nodeId);
|
|
3120
|
+
// Trigger handle resolution when inputs are removed
|
|
3121
|
+
this.handleResolver.scheduleRecomputeHandles(nodeId);
|
|
3043
3122
|
if (this.runMode === "auto" &&
|
|
3044
3123
|
this.graph.allInboundHaveValue(nodeId)) {
|
|
3045
3124
|
this.execute(nodeId);
|
|
@@ -3160,6 +3239,17 @@ class GraphBuilder {
|
|
|
3160
3239
|
const arr = Array.isArray(from) ? from : [from];
|
|
3161
3240
|
return arr.every((s) => s === to || !!this.registry.canCoerce(s, to));
|
|
3162
3241
|
};
|
|
3242
|
+
// Helper to validate enum value
|
|
3243
|
+
const validateEnumValue = (typeId, value, nodeId, handle) => {
|
|
3244
|
+
if (!typeId.startsWith("enum:"))
|
|
3245
|
+
return true; // Not an enum type
|
|
3246
|
+
const enumDef = this.registry.enums.get(typeId);
|
|
3247
|
+
if (!enumDef)
|
|
3248
|
+
return true; // Enum not registered, skip validation
|
|
3249
|
+
if (typeof value !== "number")
|
|
3250
|
+
return false; // Enum values must be numbers
|
|
3251
|
+
return enumDef.valueToLabel.has(value);
|
|
3252
|
+
};
|
|
3163
3253
|
const pushIssue = (level, code, message, data) => {
|
|
3164
3254
|
issues.push({ level, code, message, data });
|
|
3165
3255
|
};
|
|
@@ -3183,6 +3273,51 @@ class GraphBuilder {
|
|
|
3183
3273
|
if (!this.registry.categories.has(nodeType.categoryId)) {
|
|
3184
3274
|
pushIssue("error", "CATEGORY_MISSING", `Unknown category ${nodeType.categoryId} for node type ${n.typeId}`);
|
|
3185
3275
|
}
|
|
3276
|
+
// Validate enum values in node params
|
|
3277
|
+
if (n.params) {
|
|
3278
|
+
const effectiveHandles = getEffectiveHandles(n);
|
|
3279
|
+
for (const [paramKey, paramValue] of Object.entries(n.params)) {
|
|
3280
|
+
// Skip policy and other non-input params
|
|
3281
|
+
if (paramKey === "policy")
|
|
3282
|
+
continue;
|
|
3283
|
+
// Check if this param corresponds to an input handle
|
|
3284
|
+
const inputTypeId = getInputTypeId(effectiveHandles.inputs, paramKey);
|
|
3285
|
+
if (inputTypeId && inputTypeId.startsWith("enum:")) {
|
|
3286
|
+
if (!validateEnumValue(inputTypeId, paramValue, n.nodeId)) {
|
|
3287
|
+
const enumDef = this.registry.enums.get(inputTypeId);
|
|
3288
|
+
const validValues = enumDef
|
|
3289
|
+
? Array.from(enumDef.valueToLabel.keys()).join(", ")
|
|
3290
|
+
: "unknown";
|
|
3291
|
+
pushIssue("error", "ENUM_VALUE_INVALID", `Node ${n.nodeId} param ${paramKey} has invalid enum value ${paramValue}. Valid values: ${validValues}`, {
|
|
3292
|
+
nodeId: n.nodeId,
|
|
3293
|
+
input: paramKey,
|
|
3294
|
+
typeId: inputTypeId,
|
|
3295
|
+
});
|
|
3296
|
+
}
|
|
3297
|
+
}
|
|
3298
|
+
}
|
|
3299
|
+
}
|
|
3300
|
+
// Validate enum values in input defaults
|
|
3301
|
+
const resolved = n.resolvedHandles;
|
|
3302
|
+
if (resolved?.inputDefaults) {
|
|
3303
|
+
const effectiveHandles = getEffectiveHandles(n);
|
|
3304
|
+
for (const [handle, defaultValue] of Object.entries(resolved.inputDefaults)) {
|
|
3305
|
+
const inputTypeId = getInputTypeId(effectiveHandles.inputs, handle);
|
|
3306
|
+
if (inputTypeId && inputTypeId.startsWith("enum:")) {
|
|
3307
|
+
if (!validateEnumValue(inputTypeId, defaultValue, n.nodeId)) {
|
|
3308
|
+
const enumDef = this.registry.enums.get(inputTypeId);
|
|
3309
|
+
const validValues = enumDef
|
|
3310
|
+
? Array.from(enumDef.valueToLabel.keys()).join(", ")
|
|
3311
|
+
: "unknown";
|
|
3312
|
+
pushIssue("warning", "ENUM_DEFAULT_INVALID", `Node ${n.nodeId} input default ${handle} has invalid enum value ${defaultValue}. Valid values: ${validValues}`, {
|
|
3313
|
+
nodeId: n.nodeId,
|
|
3314
|
+
input: handle,
|
|
3315
|
+
typeId: inputTypeId,
|
|
3316
|
+
});
|
|
3317
|
+
}
|
|
3318
|
+
}
|
|
3319
|
+
}
|
|
3320
|
+
}
|
|
3186
3321
|
}
|
|
3187
3322
|
// edges validation: nodes exist, handles exist, type exists
|
|
3188
3323
|
const inboundCounts = new Map();
|