@bian-womp/spark-workbench 0.2.10 → 0.2.12

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.
Files changed (29) hide show
  1. package/lib/cjs/index.cjs +192 -42
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/cjs/src/misc/NodeContextMenu.d.ts +1 -1
  4. package/lib/cjs/src/misc/NodeContextMenu.d.ts.map +1 -1
  5. package/lib/cjs/src/misc/WorkbenchCanvas.d.ts.map +1 -1
  6. package/lib/cjs/src/misc/WorkbenchStudio.d.ts.map +1 -1
  7. package/lib/cjs/src/runtime/AbstractGraphRunner.d.ts +7 -0
  8. package/lib/cjs/src/runtime/AbstractGraphRunner.d.ts.map +1 -1
  9. package/lib/cjs/src/runtime/IGraphRunner.d.ts +7 -0
  10. package/lib/cjs/src/runtime/IGraphRunner.d.ts.map +1 -1
  11. package/lib/cjs/src/runtime/LocalGraphRunner.d.ts +12 -0
  12. package/lib/cjs/src/runtime/LocalGraphRunner.d.ts.map +1 -1
  13. package/lib/cjs/src/runtime/RemoteGraphRunner.d.ts +7 -0
  14. package/lib/cjs/src/runtime/RemoteGraphRunner.d.ts.map +1 -1
  15. package/lib/esm/index.js +192 -42
  16. package/lib/esm/index.js.map +1 -1
  17. package/lib/esm/src/misc/NodeContextMenu.d.ts +1 -1
  18. package/lib/esm/src/misc/NodeContextMenu.d.ts.map +1 -1
  19. package/lib/esm/src/misc/WorkbenchCanvas.d.ts.map +1 -1
  20. package/lib/esm/src/misc/WorkbenchStudio.d.ts.map +1 -1
  21. package/lib/esm/src/runtime/AbstractGraphRunner.d.ts +7 -0
  22. package/lib/esm/src/runtime/AbstractGraphRunner.d.ts.map +1 -1
  23. package/lib/esm/src/runtime/IGraphRunner.d.ts +7 -0
  24. package/lib/esm/src/runtime/IGraphRunner.d.ts.map +1 -1
  25. package/lib/esm/src/runtime/LocalGraphRunner.d.ts +12 -0
  26. package/lib/esm/src/runtime/LocalGraphRunner.d.ts.map +1 -1
  27. package/lib/esm/src/runtime/RemoteGraphRunner.d.ts +7 -0
  28. package/lib/esm/src/runtime/RemoteGraphRunner.d.ts.map +1 -1
  29. package/package.json +4 -4
@@ -4,7 +4,7 @@ export declare function NodeContextMenu({ open, clientPos, nodeId, onClose, }: {
4
4
  x: number;
5
5
  y: number;
6
6
  } | null;
7
- nodeId?: string | null;
7
+ nodeId: string;
8
8
  onClose: () => void;
9
9
  }): import("react/jsx-runtime").JSX.Element | null;
10
10
  //# sourceMappingURL=NodeContextMenu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeContextMenu.d.ts","sourceRoot":"","sources":["../../../../src/misc/NodeContextMenu.tsx"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAS,EACT,MAAM,EACN,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,kDAwSA"}
1
+ {"version":3,"file":"NodeContextMenu.d.ts","sourceRoot":"","sources":["../../../../src/misc/NodeContextMenu.tsx"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAS,EACT,MAAM,EACN,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,kDA2RA"}
@@ -1 +1 @@
1
- {"version":3,"file":"WorkbenchCanvas.d.ts","sourceRoot":"","sources":["../../../../src/misc/WorkbenchCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAkBf,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,eAAe;iBAGX,OAAO;cACV,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,MAAM;eAC3C,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,CAAC,OAAO;yBACvC,CACnB,MAAM,EAAE,MAAM,KACX;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;+CA2VpD,CAAC"}
1
+ {"version":3,"file":"WorkbenchCanvas.d.ts","sourceRoot":"","sources":["../../../../src/misc/WorkbenchCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAkBf,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,eAAe;iBAGX,OAAO;cACV,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,MAAM;eAC3C,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,CAAC,OAAO;yBACvC,CACnB,MAAM,EAAE,MAAM,KACX;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;+CA8VpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"WorkbenchStudio.d.ts","sourceRoot":"","sources":["../../../../src/misc/WorkbenchStudio.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkbenchStudio.d.ts","sourceRoot":"","sources":["../../../../src/misc/WorkbenchStudio.tsx"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { RuntimeSnapshotFull } from "@bian-womp/spark-protocol";
1
2
  import { Engine, GraphDefinition, Registry, GraphRuntime } from "@bian-womp/spark-graph";
2
3
  import { IGraphRunner, RunnerEventName, type RunnerEventListener, EngineKind, ExecutionBackend, RunnerOptions, RunnerEventMap } from "./IGraphRunner";
3
4
  export declare abstract class AbstractGraphRunner implements IGraphRunner {
@@ -16,6 +17,12 @@ export declare abstract class AbstractGraphRunner implements IGraphRunner {
16
17
  abstract flush(): void;
17
18
  abstract getOutputs(def: GraphDefinition): Record<string, Record<string, unknown>>;
18
19
  abstract getInputs(def: GraphDefinition): Record<string, Record<string, unknown>>;
20
+ abstract setEnvironment(env: Record<string, unknown>, opts?: {
21
+ merge?: boolean;
22
+ }): void;
23
+ abstract getEnvironment(): Record<string, unknown> | undefined;
24
+ abstract snapshotFull(): Promise<RuntimeSnapshotFull>;
25
+ abstract applySnapshotFull(payload: RuntimeSnapshotFull): Promise<void>;
19
26
  launch(def: GraphDefinition, opts: RunnerOptions): void;
20
27
  setInput(nodeId: string, handle: string, value: unknown): void;
21
28
  triggerExternal(nodeId: string, event: unknown): void;
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/AbstractGraphRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,eAAe,EACf,QAAQ,EACR,YAAY,EACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,KAAK,mBAAmB,EACxB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,gBAAgB,CAAC;AAExB,8BAAsB,mBAAoB,YAAW,YAAY;IAW7D,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAC5B,SAAS,CAAC,OAAO,EAAE,gBAAgB;IAXrC,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IACjC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,SAAS,CAGb;IACJ,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAM;IACrE,SAAS,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;gBAGvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB;IAGrC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAC1C,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAC3C,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACnD,QAAQ,CAAC,KAAK,IAAI,IAAI;IACtB,QAAQ,CAAC,UAAU,CACjB,GAAG,EAAE,eAAe,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAChB,GAAG,EAAE,eAAe,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1C,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAMvD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAW9D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKrD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAgB1D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,EAAE,CAAC,CAAC,SAAS,eAAe,EAC1B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,MAAM,IAAI;IAOb,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,eAAe,EACtC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,IAAI;IAKP,OAAO,IAAI,IAAI;IAWf,SAAS,IAAI,OAAO;IAIpB,gBAAgB,IAAI,UAAU,GAAG,SAAS;CAG3C"}
1
+ {"version":3,"file":"AbstractGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/AbstractGraphRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,MAAM,EACN,eAAe,EACf,QAAQ,EACR,YAAY,EACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,KAAK,mBAAmB,EACxB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,gBAAgB,CAAC;AAExB,8BAAsB,mBAAoB,YAAW,YAAY;IAW7D,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAC5B,SAAS,CAAC,OAAO,EAAE,gBAAgB;IAXrC,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IACjC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,SAAS,CAGb;IACJ,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAM;IACrE,SAAS,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;gBAGvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB;IAGrC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAC1C,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAC3C,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACnD,QAAQ,CAAC,KAAK,IAAI,IAAI;IACtB,QAAQ,CAAC,UAAU,CACjB,GAAG,EAAE,eAAe,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAChB,GAAG,EAAE,eAAe,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1C,QAAQ,CAAC,cAAc,CACrB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GACzB,IAAI;IAEP,QAAQ,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAE9D,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAErD,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvE,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAMvD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAW9D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKrD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAgB1D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,EAAE,CAAC,CAAC,SAAS,eAAe,EAC1B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,MAAM,IAAI;IAOb,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,eAAe,EACtC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,IAAI;IAKP,OAAO,IAAI,IAAI;IAWf,SAAS,IAAI,OAAO;IAIpB,gBAAgB,IAAI,UAAU,GAAG,SAAS;CAG3C"}
@@ -1,3 +1,4 @@
1
+ import { RuntimeSnapshotFull } from "@bian-womp/spark-protocol";
1
2
  import { EngineEventName, GraphDefinition, Registry, type RuntimeEventMap } from "@bian-womp/spark-graph";
2
3
  import { HttpPollingTransport, WebSocketTransport } from "@bian-womp/spark-remote";
3
4
  export type EngineKind = "push" | "batched" | "pull" | "hybrid" | "step";
@@ -58,5 +59,11 @@ export interface IGraphRunner {
58
59
  dispose(): void;
59
60
  isRunning(): boolean;
60
61
  getRunningEngine(): EngineKind | undefined;
62
+ snapshotFull: () => Promise<RuntimeSnapshotFull>;
63
+ applySnapshotFull: (payload: RuntimeSnapshotFull) => Promise<void>;
64
+ setEnvironment: (env: Record<string, unknown>, opts?: {
65
+ merge?: boolean;
66
+ }) => void;
67
+ getEnvironment: () => Record<string, unknown> | undefined;
61
68
  }
62
69
  //# sourceMappingURL=IGraphRunner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/IGraphRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/IGraphRunner.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { GraphDefinition, Registry } from "@bian-womp/spark-graph";
2
+ import { RuntimeSnapshotFull } from "@bian-womp/spark-protocol";
2
3
  import type { RunnerOptions } from "./IGraphRunner";
3
4
  import { AbstractGraphRunner } from "./AbstractGraphRunner";
4
5
  export declare class LocalGraphRunner extends AbstractGraphRunner {
@@ -11,6 +12,17 @@ export declare class LocalGraphRunner extends AbstractGraphRunner {
11
12
  flush(): void;
12
13
  getOutputs(def: GraphDefinition): Record<string, Record<string, unknown>>;
13
14
  getInputs(def: GraphDefinition): Record<string, Record<string, unknown>>;
15
+ setEnvironment: (env: Record<string, unknown>, opts?: {
16
+ merge?: boolean;
17
+ }) => void;
18
+ getEnvironment: () => Record<string, unknown> | undefined;
19
+ snapshotFull(): Promise<{
20
+ def: any;
21
+ environment: Record<string, unknown>;
22
+ inputs: Record<string, Record<string, unknown>>;
23
+ outputs: Record<string, Record<string, unknown>>;
24
+ }>;
25
+ applySnapshotFull(payload: RuntimeSnapshotFull): Promise<void>;
14
26
  dispose(): void;
15
27
  }
16
28
  //# sourceMappingURL=LocalGraphRunner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/LocalGraphRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,QAAQ,EAOT,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,gBAAiB,SAAQ,mBAAmB;gBAC3C,QAAQ,EAAE,QAAQ;IAK9B,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAOjC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IASlC,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IA0CjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,KAAK,IAAI,IAAI;IAKb,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiBzE,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiBxE,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"LocalGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/LocalGraphRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,QAAQ,EAOT,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,gBAAiB,SAAQ,mBAAmB;gBAC3C,QAAQ,EAAE,QAAQ;IAK9B,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAOjC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IASlC,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IA0CjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,KAAK,IAAI,IAAI;IAKb,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiBzE,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAaxE,cAAc,QACP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SACrB;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,UAU1B;IAEF,cAAc,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAEtD;IAEI,YAAY;;;;;;IA0BZ,iBAAiB,CAAC,OAAO,EAAE,mBAAmB;IAUpD,OAAO,IAAI,IAAI;CAKhB"}
@@ -1,3 +1,4 @@
1
+ import { RuntimeSnapshotFull } from "@bian-womp/spark-protocol";
1
2
  import { GraphDefinition, Registry } from "@bian-womp/spark-graph";
2
3
  import { RemoteRunner } from "@bian-womp/spark-remote";
3
4
  import { RemoteExecutionBackend, RemoteTransport, RunnerOptions } from "./IGraphRunner";
@@ -21,6 +22,12 @@ export declare class RemoteGraphRunner extends AbstractGraphRunner {
21
22
  flush(): void;
22
23
  triggerExternal(nodeId: string, event: unknown): void;
23
24
  coerce(from: string, to: string, value: unknown): Promise<unknown>;
25
+ snapshotFull(): Promise<RuntimeSnapshotFull>;
26
+ applySnapshotFull(payload: RuntimeSnapshotFull): Promise<void>;
27
+ setEnvironment(env: Record<string, unknown>, opts?: {
28
+ merge?: boolean;
29
+ }): void;
30
+ getEnvironment(): Record<string, unknown> | undefined;
24
31
  getOutputs(def: GraphDefinition): Record<string, Record<string, unknown>>;
25
32
  getInputs(def: GraphDefinition): Record<string, Record<string, unknown>>;
26
33
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/RemoteGraphRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAEL,YAAY,EAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EAEtB,eAAe,EACf,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,iBAAkB,SAAQ,mBAAmB;IACxD,SAAS,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACpC,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAChC,SAAS,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;IAEtC,UAAU;YAEF,OAAO,GAAG,QAAQ;eAAS,OAAO;wBAAkB,MAAM;OAC9D;IACJ,cAAc,UAAS;gBAEX,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB;IA8D/D,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAIjC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAWlC,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAyDjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,KAAK,IAAI,IAAI;IAIb,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAQ/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IASxE,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAmBzE,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAkBxE,OAAO,IAAI,IAAI;cAYC,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC;CA0B5D"}
1
+ {"version":3,"file":"RemoteGraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/RemoteGraphRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAU,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAEL,YAAY,EAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EAEtB,eAAe,EACf,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,iBAAkB,SAAQ,mBAAmB;IACxD,SAAS,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACpC,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAChC,SAAS,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;IAEtC,UAAU;YAEF,OAAO,GAAG,QAAQ;eAAS,OAAO;wBAAkB,MAAM;OAC9D;IACJ,cAAc,UAAS;gBAEX,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB;IA8D/D,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAIjC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAWlC,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAyDjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,KAAK,IAAI,IAAI;IAIb,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAQ/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IASlE,YAAY;IASZ,iBAAiB,CAAC,OAAO,EAAE,mBAAmB;IAKpD,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAWvE,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAOrD,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAmBzE,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAkBxE,OAAO,IAAI,IAAI;cAYC,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC;CA0B5D"}
package/lib/esm/index.js CHANGED
@@ -409,6 +409,21 @@ class AbstractGraphRunner {
409
409
  class LocalGraphRunner extends AbstractGraphRunner {
410
410
  constructor(registry) {
411
411
  super(registry, { kind: "local" });
412
+ this.setEnvironment = (env, opts) => {
413
+ if (!this.runtime)
414
+ return;
415
+ if (opts?.merge) {
416
+ const current = this.runtime.getEnvironment();
417
+ const next = { ...(current || {}), ...(env || {}) };
418
+ this.runtime.setEnvironment(next);
419
+ }
420
+ else {
421
+ this.runtime.setEnvironment(env);
422
+ }
423
+ };
424
+ this.getEnvironment = () => {
425
+ return this.runtime?.getEnvironment?.();
426
+ };
412
427
  this.emit("transport", { state: "local" });
413
428
  }
414
429
  build(def) {
@@ -507,17 +522,36 @@ class LocalGraphRunner extends AbstractGraphRunner {
507
522
  const runtimeInputs = this.runtime
508
523
  ? this.runtime.getNodeData?.(n.nodeId)?.inputs ?? {}
509
524
  : {};
510
- if (this.isRunning()) {
511
- out[n.nodeId] = runtimeInputs;
512
- }
513
- else {
514
- const merged = { ...runtimeInputs, ...staged };
515
- if (Object.keys(merged).length > 0)
516
- out[n.nodeId] = merged;
517
- }
525
+ const merged = { ...runtimeInputs, ...staged };
526
+ if (Object.keys(merged).length > 0)
527
+ out[n.nodeId] = merged;
518
528
  }
519
529
  return out;
520
530
  }
531
+ async snapshotFull() {
532
+ const def = undefined; // UI will supply def/positions on download for local
533
+ const inputs = this.getInputs(this.runtime
534
+ ? {
535
+ nodes: Array.from(this.runtime.getNodeIds()).map((id) => ({ nodeId: id, typeId: "" })),
536
+ edges: [],
537
+ }
538
+ : { nodes: [], edges: [] });
539
+ const outputs = this.getOutputs(this.runtime
540
+ ? {
541
+ nodes: Array.from(this.runtime.getNodeIds()).map((id) => ({ nodeId: id, typeId: "" })),
542
+ edges: [],
543
+ }
544
+ : { nodes: [], edges: [] });
545
+ const environment = this.getEnvironment() || {};
546
+ return { def, environment, inputs, outputs };
547
+ }
548
+ async applySnapshotFull(payload) {
549
+ if (payload.def)
550
+ this.build(payload.def);
551
+ this.setEnvironment?.(payload.environment || {}, { merge: false });
552
+ // Hydrate via runtime for exact restore and re-emit
553
+ this.runtime?.hydrate({ inputs: payload.inputs || {}, outputs: payload.outputs || {} }, { reemit: true });
554
+ }
521
555
  dispose() {
522
556
  super.dispose();
523
557
  this.runtime = undefined;
@@ -689,6 +723,36 @@ class RemoteGraphRunner extends AbstractGraphRunner {
689
723
  return value;
690
724
  }
691
725
  }
726
+ async snapshotFull() {
727
+ const runner = await this.ensureRemoteRunner();
728
+ try {
729
+ return await runner.snapshotFull();
730
+ }
731
+ catch {
732
+ return { def: undefined, environment: {}, inputs: {}, outputs: {} };
733
+ }
734
+ }
735
+ async applySnapshotFull(payload) {
736
+ const runner = await this.ensureRemoteRunner();
737
+ await runner.applySnapshotFull(payload);
738
+ }
739
+ setEnvironment(env, opts) {
740
+ const t = this.transport;
741
+ if (!t)
742
+ return;
743
+ t.request({
744
+ message: {
745
+ type: "SetEnvironment",
746
+ payload: { environment: env, merge: opts?.merge },
747
+ },
748
+ }).catch(() => { });
749
+ }
750
+ getEnvironment() {
751
+ // Fetch from remote via lightweight command
752
+ // Note: returns undefined synchronously; callers needing value should use snapshotFull or call runner directly
753
+ // For now, we expose an async helper on RemoteRunner. Keep sync signature per interface.
754
+ return undefined;
755
+ }
692
756
  getOutputs(def) {
693
757
  const out = {};
694
758
  const cache = this.valueCache;
@@ -722,7 +786,7 @@ class RemoteGraphRunner extends AbstractGraphRunner {
722
786
  if (rec && rec.io === "input")
723
787
  cur[h] = rec.value;
724
788
  }
725
- const merged = this.isRunning() ? cur : { ...cur, ...staged };
789
+ const merged = { ...cur, ...staged };
726
790
  if (Object.keys(merged).length > 0)
727
791
  out[n.nodeId] = merged;
728
792
  }
@@ -2238,14 +2302,6 @@ function NodeContextMenu({ open, clientPos, nodeId, onClose, }) {
2238
2302
  if (open)
2239
2303
  ref.current?.focus();
2240
2304
  }, [open]);
2241
- if (!open || !clientPos || !nodeId)
2242
- return null;
2243
- // clamp
2244
- const MENU_MIN_WIDTH = 180;
2245
- const PADDING = 16;
2246
- const x = Math.min(clientPos.x, (typeof window !== "undefined" ? window.innerWidth : 0) -
2247
- (MENU_MIN_WIDTH + PADDING));
2248
- const y = Math.min(clientPos.y, (typeof window !== "undefined" ? window.innerHeight : 0) - 240);
2249
2305
  // Bake helpers
2250
2306
  const getBakeableOutputs = () => {
2251
2307
  try {
@@ -2312,43 +2368,40 @@ function NodeContextMenu({ open, clientPos, nodeId, onClose, }) {
2312
2368
  const arrTarget = isArray ? tArr?.bakeTarget : undefined;
2313
2369
  const elemTarget = isArray ? tElem?.bakeTarget : undefined;
2314
2370
  if (singleTarget) {
2315
- const nodeDesc = registry.nodes.get(String(singleTarget.nodeTypeId));
2316
- const inType = getInputTypeId(nodeDesc?.inputs, String(singleTarget.inputHandle || "Value"));
2371
+ const nodeDesc = registry.nodes.get(singleTarget.nodeTypeId);
2372
+ const inType = getInputTypeId(nodeDesc?.inputs, singleTarget.inputHandle);
2317
2373
  const coerced = await coerceIfNeeded(typeId, inType, unwrap(raw));
2318
2374
  const newId = wb.addNode({
2319
- typeId: String(singleTarget.nodeTypeId),
2375
+ typeId: singleTarget.nodeTypeId,
2320
2376
  position: { x: pos.x + 180, y: pos.y },
2321
2377
  params: {},
2322
2378
  });
2323
2379
  runner.update(wb.export());
2324
2380
  await runner.whenIdle();
2325
- runner.setInputs(newId, {
2326
- [String(singleTarget.inputHandle || "Value")]: coerced,
2327
- });
2381
+ runner.setInputs(newId, { [singleTarget.inputHandle]: coerced });
2328
2382
  return;
2329
2383
  }
2330
2384
  if (isArray && arrTarget) {
2331
- const nodeDesc = registry.nodes.get(String(arrTarget.nodeTypeId));
2332
- const inType = getInputTypeId(nodeDesc?.inputs, String(arrTarget.inputHandle || "Value"));
2385
+ const nodeDesc = registry.nodes.get(arrTarget.nodeTypeId);
2386
+ const inType = getInputTypeId(nodeDesc?.inputs, arrTarget.inputHandle);
2333
2387
  const coerced = await coerceIfNeeded(typeId, inType, unwrap(raw));
2334
2388
  const newId = `n${Math.random().toString(36).slice(2, 8)}`;
2335
2389
  wb.addNode({
2336
2390
  nodeId: newId,
2337
- typeId: String(arrTarget.nodeTypeId),
2391
+ typeId: arrTarget.nodeTypeId,
2338
2392
  position: { x: pos.x + 180, y: pos.y },
2339
2393
  params: {},
2340
2394
  });
2341
2395
  runner.update(wb.export());
2342
2396
  await runner.whenIdle();
2343
- runner.setInputs(newId, {
2344
- [String(arrTarget.inputHandle || "Value")]: coerced,
2345
- });
2397
+ runner.setInputs(newId, { [arrTarget.inputHandle]: coerced });
2346
2398
  return;
2347
2399
  }
2348
- if (isArray && elemTarget && Array.isArray(raw)) {
2349
- const nodeDesc = registry.nodes.get(String(elemTarget.nodeTypeId));
2350
- const inType = getInputTypeId(nodeDesc?.inputs, String(elemTarget.inputHandle || "Value"));
2351
- const items = raw.map(unwrap);
2400
+ if (isArray && elemTarget) {
2401
+ const nodeDesc = registry.nodes.get(elemTarget.nodeTypeId);
2402
+ const inType = getInputTypeId(nodeDesc?.inputs, elemTarget.inputHandle);
2403
+ const src = unwrap(raw);
2404
+ const items = Array.isArray(src) ? src : [src];
2352
2405
  const coercedItems = await Promise.all(items.map((v) => coerceIfNeeded(baseTypeId, inType, v)));
2353
2406
  const COLS = 4;
2354
2407
  const DX = 180;
@@ -2358,18 +2411,14 @@ function NodeContextMenu({ open, clientPos, nodeId, onClose, }) {
2358
2411
  const col = idx % COLS;
2359
2412
  const row = Math.floor(idx / COLS);
2360
2413
  const newId = wb.addNode({
2361
- typeId: String(elemTarget.nodeTypeId),
2414
+ typeId: elemTarget.nodeTypeId,
2362
2415
  position: { x: pos.x + (col + 1) * DX, y: pos.y + row * DY },
2363
2416
  params: {},
2364
- initialInputs: {
2365
- [String(elemTarget.inputHandle || "Value")]: clone(cv),
2366
- },
2417
+ initialInputs: { [elemTarget.inputHandle]: clone(cv) },
2367
2418
  });
2368
2419
  runner.update(wb.export());
2369
2420
  await runner.whenIdle();
2370
- runner.setInputs(newId, {
2371
- [String(elemTarget.inputHandle || "Value")]: cv,
2372
- });
2421
+ runner.setInputs(newId, { [elemTarget.inputHandle]: cv });
2373
2422
  }
2374
2423
  return;
2375
2424
  }
@@ -2412,6 +2461,14 @@ function NodeContextMenu({ open, clientPos, nodeId, onClose, }) {
2412
2461
  catch { }
2413
2462
  onClose();
2414
2463
  }, [nodeId, runner, onClose]);
2464
+ if (!open || !clientPos || !nodeId)
2465
+ return null;
2466
+ // clamp
2467
+ const MENU_MIN_WIDTH = 180;
2468
+ const PADDING = 16;
2469
+ const x = Math.min(clientPos.x, (typeof window !== "undefined" ? window.innerWidth : 0) -
2470
+ (MENU_MIN_WIDTH + PADDING));
2471
+ const y = Math.min(clientPos.y, (typeof window !== "undefined" ? window.innerHeight : 0) - 240);
2415
2472
  const canRunPull = engineKind()?.toString() === "pull";
2416
2473
  const outs = getBakeableOutputs();
2417
2474
  return (jsxs("div", { ref: ref, tabIndex: -1, className: "fixed z-[1000] bg-white border border-gray-300 rounded-lg shadow-lg p-1 min-w-[180px] text-sm text-gray-700", style: { left: x, top: y }, onClick: (e) => e.stopPropagation(), onMouseDown: (e) => e.stopPropagation(), onWheel: (e) => e.stopPropagation(), onContextMenu: (e) => {
@@ -2461,6 +2518,7 @@ const WorkbenchCanvas = React.forwardRef(({ showValues, toString, toElement, get
2461
2518
  outputValues: n.data.outputValues,
2462
2519
  status: n.data.status,
2463
2520
  validation: n.data.validation,
2521
+ inputConnected: n.data.inputConnected,
2464
2522
  },
2465
2523
  });
2466
2524
  return isEqual(pick(a), pick(b));
@@ -2664,7 +2722,7 @@ const WorkbenchCanvas = React.forwardRef(({ showValues, toString, toElement, get
2664
2722
  }, []);
2665
2723
  return (jsx("div", { className: "w-full h-full", onContextMenu: onContextMenu, children: jsx(ReactFlowProvider, { children: jsxs(ReactFlow, { nodes: throttled.nodes, edges: throttled.edges, nodeTypes: nodeTypes, selectionOnDrag: true, onInit: (inst) => {
2666
2724
  rfInstanceRef.current = inst;
2667
- }, onConnect: onConnect, onEdgesChange: onEdgesChange, onEdgesDelete: onEdgesDelete, onNodesDelete: onNodesDelete, onNodesChange: onNodesChange, deleteKeyCode: ["Backspace", "Delete"], proOptions: { hideAttribution: true }, noDragClassName: "wb-nodrag", noWheelClassName: "wb-nowheel", noPanClassName: "wb-nopan", fitView: true, children: [jsx(Background, { id: "workbench-canvas-background", variant: BackgroundVariant.Dots, gap: 12, size: 1 }), jsx(MiniMap, {}), jsx(Controls, {}), jsx(DefaultContextMenu, { open: menuOpen, clientPos: menuPos, onAdd: addNodeAt, onClose: onCloseMenu }), jsx(NodeContextMenu, { open: nodeMenuOpen, clientPos: nodeMenuPos, nodeId: nodeAtMenu, onClose: onCloseNodeMenu })] }) }) }));
2725
+ }, onConnect: onConnect, onEdgesChange: onEdgesChange, onEdgesDelete: onEdgesDelete, onNodesDelete: onNodesDelete, onNodesChange: onNodesChange, deleteKeyCode: ["Backspace", "Delete"], proOptions: { hideAttribution: true }, noDragClassName: "wb-nodrag", noWheelClassName: "wb-nowheel", noPanClassName: "wb-nopan", fitView: true, children: [jsx(Background, { id: "workbench-canvas-background", variant: BackgroundVariant.Dots, gap: 12, size: 1 }), jsx(MiniMap, {}), jsx(Controls, {}), jsx(DefaultContextMenu, { open: menuOpen, clientPos: menuPos, onAdd: addNodeAt, onClose: onCloseMenu }), !!nodeAtMenu && (jsx(NodeContextMenu, { open: nodeMenuOpen, clientPos: nodeMenuPos, nodeId: nodeAtMenu, onClose: onCloseNodeMenu }))] }) }) }));
2668
2726
  });
2669
2727
 
2670
2728
  function WorkbenchStudioCanvas({ setRegistry, autoScroll, onAutoScrollChange, example, onExampleChange, engine, onEngineChange, backendKind, onBackendKindChange, httpBaseUrl, onHttpBaseUrlChange, wsUrl, onWsUrlChange, debug, onDebugChange, showValues, onShowValuesChange, hideWorkbench, onHideWorkbenchChange, overrides, onInit, onChange, }) {
@@ -2719,6 +2777,7 @@ function WorkbenchStudioCanvas({ setRegistry, autoScroll, onAutoScrollChange, ex
2719
2777
  const lastAutoLaunched = useRef(undefined);
2720
2778
  const autoLayoutRan = useRef(false);
2721
2779
  const canvasRef = useRef(null);
2780
+ const uploadInputRef = useRef(null);
2722
2781
  // Expose init callback with setInitialGraph helper
2723
2782
  const initCalled = useRef(false);
2724
2783
  useEffect(() => {
@@ -2823,6 +2882,69 @@ function WorkbenchStudioCanvas({ setRegistry, autoScroll, onAutoScrollChange, ex
2823
2882
  alert(String(err?.message ?? err));
2824
2883
  }
2825
2884
  }, [wb, runner]);
2885
+ const onUploadPicked = useCallback(async (e) => {
2886
+ try {
2887
+ const file = e.target.files?.[0];
2888
+ if (!file)
2889
+ return;
2890
+ const text = await file.text();
2891
+ const parsed = JSON.parse(text);
2892
+ // Support both Graph and Snapshot payloads
2893
+ const isSnapshot = parsed &&
2894
+ typeof parsed === "object" &&
2895
+ (parsed.def || parsed.inputs || parsed.outputs || parsed.environment);
2896
+ if (isSnapshot) {
2897
+ const def = parsed.def;
2898
+ const positions = parsed.positions || {};
2899
+ const environment = parsed.environment || {};
2900
+ const inputs = parsed.inputs || {};
2901
+ if (def && runner.isRunning()) {
2902
+ // Remote exact restore path
2903
+ await runner.applySnapshotFull({
2904
+ def,
2905
+ environment,
2906
+ inputs,
2907
+ outputs: parsed.outputs || {},
2908
+ });
2909
+ await wb.load(def);
2910
+ if (positions && typeof positions === "object")
2911
+ wb.setPositions(positions);
2912
+ }
2913
+ else {
2914
+ alert("Graph definition is empty or engine is not running");
2915
+ }
2916
+ }
2917
+ else {
2918
+ const def = parsed?.def ?? parsed;
2919
+ const inputs = parsed?.inputs ?? {};
2920
+ await wb.load(def);
2921
+ try {
2922
+ runner.build(wb.export());
2923
+ }
2924
+ catch { }
2925
+ if (inputs && typeof inputs === "object") {
2926
+ for (const [nodeId, map] of Object.entries(inputs)) {
2927
+ try {
2928
+ runner.setInputs(nodeId, map);
2929
+ }
2930
+ catch { }
2931
+ }
2932
+ }
2933
+ }
2934
+ runAutoLayout();
2935
+ }
2936
+ catch (err) {
2937
+ alert(String(err?.message ?? err));
2938
+ }
2939
+ finally {
2940
+ // reset input so same file can be picked again
2941
+ if (uploadInputRef.current)
2942
+ uploadInputRef.current.value = "";
2943
+ }
2944
+ }, [wb, runner, runAutoLayout]);
2945
+ const triggerUpload = useCallback(() => {
2946
+ uploadInputRef.current?.click();
2947
+ }, []);
2826
2948
  const hydrateFromBackend = useCallback(async (kind, base) => {
2827
2949
  try {
2828
2950
  const transport = kind === "remote-http"
@@ -3120,7 +3242,35 @@ function WorkbenchStudioCanvas({ setRegistry, autoScroll, onAutoScrollChange, ex
3120
3242
  catch (err) {
3121
3243
  alert(String(err?.message ?? err));
3122
3244
  }
3123
- }, disabled: !engine, children: "Start" })), jsx("button", { className: "border border-gray-300 rounded px-2 py-1.5", onClick: runAutoLayout, children: "Auto Layout" }), jsx("button", { className: "ml-2 border border-gray-300 rounded px-2 py-1.5", onClick: () => canvasRef.current?.fitView?.(), title: "Fit View", children: "Fit View" }), jsx("button", { className: "ml-2 border border-gray-300 rounded px-2 py-1.5", onClick: downloadGraph, children: "Download Graph" }), jsxs("label", { className: "ml-2 flex items-center gap-1", children: [jsx("input", { type: "checkbox", checked: debug, onChange: (e) => onDebugChange(e.target.checked) }), jsx("span", { children: "Debug events" })] }), jsxs("label", { className: "ml-2 flex items-center gap-1", children: [jsx("input", { type: "checkbox", checked: showValues, onChange: (e) => onShowValuesChange(e.target.checked) }), jsx("span", { children: "Show values in nodes" })] })] }), jsxs("div", { className: "flex flex-1 min-h-0", children: [jsx("div", { className: "flex-1 min-w-0", children: jsx(WorkbenchCanvas, { ref: canvasRef, showValues: showValues, toString: toString, toElement: toElement, getDefaultNodeSize: overrides?.getDefaultNodeSize }) }), jsx(Inspector, { setInput: setInput, debug: debug, autoScroll: autoScroll, hideWorkbench: hideWorkbench, onAutoScrollChange: onAutoScrollChange, onHideWorkbenchChange: onHideWorkbenchChange, toString: toString, toElement: toElement, contextPanel: overrides?.contextPanel })] })] }));
3245
+ }, disabled: !engine, children: "Start" })), jsx("button", { className: "border border-gray-300 rounded px-2 py-1.5", onClick: runAutoLayout, children: "Auto Layout" }), jsx("button", { className: "ml-2 border border-gray-300 rounded px-2 py-1.5", onClick: () => canvasRef.current?.fitView?.(), title: "Fit View", children: "Fit View" }), jsx("button", { className: "ml-2 border border-gray-300 rounded px-2 py-1.5", onClick: downloadGraph, children: "Download Graph" }), jsx("button", { className: "ml-2 border border-gray-300 rounded px-2 py-1.5", onClick: async () => {
3246
+ try {
3247
+ const def = wb.export();
3248
+ const positions = wb.getPositions();
3249
+ const snapshot = await runner.snapshotFull();
3250
+ const payload = {
3251
+ ...snapshot,
3252
+ def,
3253
+ positions,
3254
+ schemaVersion: 1,
3255
+ };
3256
+ const pretty = JSON.stringify(payload, null, 2);
3257
+ const blob = new Blob([pretty], { type: "application/json" });
3258
+ const url = URL.createObjectURL(blob);
3259
+ const a = document.createElement("a");
3260
+ const d = new Date();
3261
+ const pad = (n) => String(n).padStart(2, "0");
3262
+ const ts = `${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}`;
3263
+ a.href = url;
3264
+ a.download = `spark-snapshot-${ts}.json`;
3265
+ document.body.appendChild(a);
3266
+ a.click();
3267
+ a.remove();
3268
+ URL.revokeObjectURL(url);
3269
+ }
3270
+ catch (err) {
3271
+ alert(String(err?.message ?? err));
3272
+ }
3273
+ }, children: "Download Snapshot" }), jsx("input", { ref: uploadInputRef, type: "file", accept: "application/json,.json", className: "hidden", onChange: onUploadPicked }), jsx("button", { className: "ml-2 border border-gray-300 rounded px-2 py-1.5", onClick: triggerUpload, children: "Upload Graph/Snapshot" }), jsxs("label", { className: "ml-2 flex items-center gap-1", children: [jsx("input", { type: "checkbox", checked: debug, onChange: (e) => onDebugChange(e.target.checked) }), jsx("span", { children: "Debug events" })] }), jsxs("label", { className: "ml-2 flex items-center gap-1", children: [jsx("input", { type: "checkbox", checked: showValues, onChange: (e) => onShowValuesChange(e.target.checked) }), jsx("span", { children: "Show values in nodes" })] })] }), jsxs("div", { className: "flex flex-1 min-h-0", children: [jsx("div", { className: "flex-1 min-w-0", children: jsx(WorkbenchCanvas, { ref: canvasRef, showValues: showValues, toString: toString, toElement: toElement, getDefaultNodeSize: overrides?.getDefaultNodeSize }) }), jsx(Inspector, { setInput: setInput, debug: debug, autoScroll: autoScroll, hideWorkbench: hideWorkbench, onAutoScrollChange: onAutoScrollChange, onHideWorkbenchChange: onHideWorkbenchChange, toString: toString, toElement: toElement, contextPanel: overrides?.contextPanel })] })] }));
3124
3274
  }
3125
3275
  function WorkbenchStudio({ engine, onEngineChange, example, onExampleChange, backendKind, onBackendKindChange, httpBaseUrl, onHttpBaseUrlChange, wsUrl, onWsUrlChange, debug, onDebugChange, showValues, onShowValuesChange, hideWorkbench, onHideWorkbenchChange, autoScroll, onAutoScrollChange, overrides, onInit, onChange, }) {
3126
3276
  const [registry, setRegistry] = useState(createSimpleGraphRegistry());