@bian-womp/spark-workbench 0.1.13 → 0.1.14
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 +86 -65
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/cjs/src/misc/WorkbenchStudio.d.ts +12 -2
- package/lib/cjs/src/misc/WorkbenchStudio.d.ts.map +1 -1
- package/lib/cjs/src/misc/context/WorkbenchContext.provider.d.ts.map +1 -1
- package/lib/cjs/src/runtime/GraphRunner.d.ts.map +1 -1
- package/lib/esm/index.js +87 -66
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/src/misc/WorkbenchStudio.d.ts +12 -2
- package/lib/esm/src/misc/WorkbenchStudio.d.ts.map +1 -1
- package/lib/esm/src/misc/context/WorkbenchContext.provider.d.ts.map +1 -1
- package/lib/esm/src/runtime/GraphRunner.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
import { Registry } from "@bian-womp/spark-graph";
|
|
1
|
+
import { Registry, GraphDefinition } from "@bian-womp/spark-graph";
|
|
2
2
|
import { AbstractWorkbench } from "../core/AbstractWorkbench";
|
|
3
|
-
import { GraphRunner } from "../runtime/GraphRunner";
|
|
3
|
+
import { EngineKind, GraphRunner } from "../runtime/GraphRunner";
|
|
4
|
+
type ExampleDescriptor = {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
load: () => Promise<{
|
|
8
|
+
registry?: Registry;
|
|
9
|
+
def: GraphDefinition;
|
|
10
|
+
}>;
|
|
11
|
+
defaultEngine?: EngineKind;
|
|
12
|
+
};
|
|
4
13
|
type WorkbenchOverrides = {
|
|
5
14
|
toString?: (baseToString: (typeId?: string, value?: unknown) => string, ctx: {
|
|
6
15
|
registry: Registry;
|
|
@@ -16,6 +25,7 @@ type WorkbenchOverrides = {
|
|
|
16
25
|
registerUI?: (baseRegisterUI: (wb: AbstractWorkbench) => void, ctx: {
|
|
17
26
|
wb: AbstractWorkbench;
|
|
18
27
|
}) => void;
|
|
28
|
+
getExamples?: (defaults: ExampleDescriptor[]) => ExampleDescriptor[];
|
|
19
29
|
};
|
|
20
30
|
export declare function WorkbenchStudio({ engine, onEngineChange, example, onExampleChange, backendKind, onBackendKindChange, httpBaseUrl, onHttpBaseUrlChange, wsUrl, onWsUrlChange, debug, onDebugChange, showValues, onShowValuesChange, hideWorkbench, onHideWorkbenchChange, autoScroll, onAutoScrollChange, overrides, }: {
|
|
21
31
|
engine?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkbenchStudio.d.ts","sourceRoot":"","sources":["../../../../src/misc/WorkbenchStudio.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,QAAQ,
|
|
1
|
+
{"version":3,"file":"WorkbenchStudio.d.ts","sourceRoot":"","sources":["../../../../src/misc/WorkbenchStudio.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,QAAQ,EACR,eAAe,EAUhB,MAAM,wBAAwB,CAAC;AAWhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EACL,UAAU,EAEV,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC,KAAK,iBAAiB,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,GAAG,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IACnE,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,EAAE,CACT,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,MAAM,EAC1D,GAAG,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE,KACxB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IAClD,SAAS,CAAC,EAAE,CACV,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,CAAC,OAAO,EAChE,GAAG,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE,KACxB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,CAAC,OAAO,CAAC;IACvD,QAAQ,CAAC,EAAE,CACT,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAAK,IAAI,EACxE,GAAG,EAAE;QACH,MAAM,EAAE,WAAW,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,QAAQ,CAAC;KAEpB,KACE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAChE,UAAU,CAAC,EAAE,CACX,cAAc,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,EAC/C,GAAG,EAAE;QAAE,EAAE,EAAE,iBAAiB,CAAA;KAAE,KAC3B,IAAI,CAAC;IAEV,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,CAAC;CACtE,CAAC;AAsiBF,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,cAAc,EACd,OAAO,EACP,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,KAAK,EACL,aAAa,EACb,KAAK,EACL,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,UAAU,EACV,kBAAkB,EAClB,SAAS,GACV,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,OAAO,GAAG,aAAa,GAAG,WAAW,CAAC;IACnD,mBAAmB,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,WAAW,KAAK,IAAI,CAAC;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC,2CAyDA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkbenchContext.provider.d.ts","sourceRoot":"","sources":["../../../../../src/misc/context/WorkbenchContext.provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkbenchContext.provider.d.ts","sourceRoot":"","sources":["../../../../../src/misc/context/WorkbenchContext.provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAKzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAmB,MAAM,2BAA2B,CAAC;AAgBzE,wBAAgB,iBAAiB,CAAC,EAChC,EAAE,EACF,MAAM,EACN,QAAQ,EACR,WAAW,EACX,QAAQ,GACT,EAAE;IACD,EAAE,EAAE,iBAAiB,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CA0ZA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/GraphRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EACf,eAAe,EACf,QAAQ,EAQR,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EAGpB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,KAAK,mBAAmB,CAAC,CAAC,SAAS,eAAe,IAAI,CACpD,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEzE,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEzD,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,qBAAa,WAAW;IAkBV,OAAO,CAAC,QAAQ;IAjB5B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAGb;IACJ,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,OAAO,CAAuC;IAEtD,OAAO,CAAC,MAAM,CAAC,CAKb;gBAEkB,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAIlE,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAWjC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAmBlC,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"GraphRunner.d.ts","sourceRoot":"","sources":["../../../../src/runtime/GraphRunner.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GraphBuilder, StepEngine, HybridEngine, PullEngine, BatchedEngine, PushEngine, createSimpleGraphRegistry, createSimpleGraphDef,
|
|
1
|
+
import { GraphBuilder, StepEngine, HybridEngine, PullEngine, BatchedEngine, PushEngine, createSimpleGraphRegistry, createSimpleGraphDef, createAsyncGraphDef, createAsyncGraphRegistry, createProgressGraphDef, createProgressGraphRegistry, createValidationGraphDef, createValidationGraphRegistry, Registry } from '@bian-womp/spark-graph';
|
|
2
2
|
import { RemoteEngine, HttpPollingTransport, WebSocketTransport, RemoteRunner } from '@bian-womp/spark-remote';
|
|
3
3
|
import React, { useCallback, useState, useEffect, useMemo, createContext, useContext, useRef } from 'react';
|
|
4
4
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -406,6 +406,31 @@ class GraphRunner {
|
|
|
406
406
|
await rc.runner.build(def);
|
|
407
407
|
// Signal UI after remote build as well
|
|
408
408
|
this.emit("invalidate", { reason: "graph-built" });
|
|
409
|
+
// Hydrate current remote inputs/outputs (including defaults) into cache
|
|
410
|
+
try {
|
|
411
|
+
const snap = await rc.runner.snapshot();
|
|
412
|
+
for (const [nodeId, map] of Object.entries(snap.inputs || {})) {
|
|
413
|
+
for (const [handle, value] of Object.entries(map || {})) {
|
|
414
|
+
rc.valueCache.set(`${nodeId}.${handle}`, {
|
|
415
|
+
io: "input",
|
|
416
|
+
value,
|
|
417
|
+
});
|
|
418
|
+
this.emit("value", { nodeId, handle, value, io: "input" });
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
for (const [nodeId, map] of Object.entries(snap.outputs || {})) {
|
|
422
|
+
for (const [handle, value] of Object.entries(map || {})) {
|
|
423
|
+
rc.valueCache.set(`${nodeId}.${handle}`, {
|
|
424
|
+
io: "output",
|
|
425
|
+
value,
|
|
426
|
+
});
|
|
427
|
+
this.emit("value", { nodeId, handle, value, io: "output" });
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
console.error("Failed to hydrate remote inputs/outputs");
|
|
433
|
+
}
|
|
409
434
|
const eng = rc.runner.getEngine();
|
|
410
435
|
if (!rc.listenersBound) {
|
|
411
436
|
eng.on("value", (e) => {
|
|
@@ -450,32 +475,13 @@ class GraphRunner {
|
|
|
450
475
|
Object.assign(this.stagedInputs[nodeId], inputs);
|
|
451
476
|
// Local running: pause, set all inputs, resume, schedule a single recompute
|
|
452
477
|
if (this.backend.kind === "local" && this.engine && this.runtime) {
|
|
453
|
-
this.
|
|
454
|
-
try {
|
|
455
|
-
for (const [handle, value] of Object.entries(inputs)) {
|
|
456
|
-
this.engine.setInput(nodeId, handle, value);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
finally {
|
|
460
|
-
this.runtime.resume();
|
|
461
|
-
try {
|
|
462
|
-
this.runtime.__unsafe_scheduleInputsChanged(nodeId);
|
|
463
|
-
}
|
|
464
|
-
catch { }
|
|
465
|
-
}
|
|
478
|
+
this.engine.setInputs(nodeId, inputs);
|
|
466
479
|
}
|
|
467
480
|
// Remote running: forward inputs individually (no batch API available)
|
|
468
|
-
else if (this.engine &&
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
console.warn("Remote engine does not support setInputs");
|
|
475
|
-
for (const [handle, value] of Object.entries(inputs)) {
|
|
476
|
-
this.engine.setInput(nodeId, handle, value);
|
|
477
|
-
}
|
|
478
|
-
}
|
|
481
|
+
else if (this.engine &&
|
|
482
|
+
this.backend.kind !== "local" &&
|
|
483
|
+
this.engine instanceof RemoteEngine) {
|
|
484
|
+
this.engine.setInputs(nodeId, inputs);
|
|
479
485
|
}
|
|
480
486
|
// Not running: emit value events so UI reflects staged values
|
|
481
487
|
else if (!this.engine) {
|
|
@@ -550,7 +556,7 @@ class GraphRunner {
|
|
|
550
556
|
for (const n of def.nodes) {
|
|
551
557
|
const staged = this.stagedInputs[n.nodeId] ?? {};
|
|
552
558
|
const runtimeInputs = this.runtime
|
|
553
|
-
? this.runtime.
|
|
559
|
+
? this.runtime.getNodeData?.(n.nodeId)?.inputs ?? {}
|
|
554
560
|
: {};
|
|
555
561
|
if (this.isRunning()) {
|
|
556
562
|
out[n.nodeId] = runtimeInputs;
|
|
@@ -875,7 +881,7 @@ function getNodeBorderClassNames(args) {
|
|
|
875
881
|
const status = args.status || {};
|
|
876
882
|
const issues = args.validation?.issues ?? [];
|
|
877
883
|
const hasError = !!status.lastError;
|
|
878
|
-
const hasValidationError = issues.some((i) => i
|
|
884
|
+
const hasValidationError = issues.some((i) => i.level === "error");
|
|
879
885
|
const hasValidationWarning = !hasValidationError && issues.length > 0;
|
|
880
886
|
const isRunning = !!status.activeRuns;
|
|
881
887
|
const isInvalid = !!status.invalidated && !isRunning && !hasError;
|
|
@@ -977,7 +983,8 @@ function WorkbenchProvider({ wb, runner, registry, setRegistry, children, }) {
|
|
|
977
983
|
const add = (source, type) => (payload) => setEvents((prev) => {
|
|
978
984
|
if (source === "workbench" &&
|
|
979
985
|
(type === "graphChanged" || type === "graphUiChanged")) {
|
|
980
|
-
const changeType = payload
|
|
986
|
+
const changeType = payload
|
|
987
|
+
.change?.type;
|
|
981
988
|
if (changeType === "moveNode" || changeType === "moveNodes")
|
|
982
989
|
return prev;
|
|
983
990
|
}
|
|
@@ -1734,6 +1741,45 @@ function WorkbenchStudioCanvas({ setRegistry, autoScroll, onAutoScrollChange, ex
|
|
|
1734
1741
|
? registry.nodes.get(selectedNode.typeId)
|
|
1735
1742
|
: undefined;
|
|
1736
1743
|
const [exampleState, setExampleState] = useState(example ?? "simple");
|
|
1744
|
+
const defaultExamples = useMemo(() => [
|
|
1745
|
+
{
|
|
1746
|
+
id: "simple",
|
|
1747
|
+
label: "Simple",
|
|
1748
|
+
load: async () => ({
|
|
1749
|
+
registry: createSimpleGraphRegistry(),
|
|
1750
|
+
def: createSimpleGraphDef(),
|
|
1751
|
+
}),
|
|
1752
|
+
},
|
|
1753
|
+
{
|
|
1754
|
+
id: "async",
|
|
1755
|
+
label: "Async Chain",
|
|
1756
|
+
load: async () => ({
|
|
1757
|
+
registry: createAsyncGraphRegistry(),
|
|
1758
|
+
def: createAsyncGraphDef(),
|
|
1759
|
+
}),
|
|
1760
|
+
},
|
|
1761
|
+
{
|
|
1762
|
+
id: "progress",
|
|
1763
|
+
label: "Progress + Errors",
|
|
1764
|
+
load: async () => ({
|
|
1765
|
+
registry: createProgressGraphRegistry(),
|
|
1766
|
+
def: createProgressGraphDef(),
|
|
1767
|
+
}),
|
|
1768
|
+
},
|
|
1769
|
+
{
|
|
1770
|
+
id: "validation",
|
|
1771
|
+
label: "Validation",
|
|
1772
|
+
load: async () => ({
|
|
1773
|
+
registry: createValidationGraphRegistry(),
|
|
1774
|
+
def: createValidationGraphDef(),
|
|
1775
|
+
}),
|
|
1776
|
+
},
|
|
1777
|
+
], []);
|
|
1778
|
+
const examples = useMemo(() => {
|
|
1779
|
+
if (overrides?.getExamples)
|
|
1780
|
+
return overrides.getExamples(defaultExamples);
|
|
1781
|
+
return defaultExamples;
|
|
1782
|
+
}, [overrides, defaultExamples]);
|
|
1737
1783
|
const lastAutoLaunched = useRef(undefined);
|
|
1738
1784
|
const autoLayoutRan = useRef(false);
|
|
1739
1785
|
const applyExample = useCallback(async (key) => {
|
|
@@ -1741,46 +1787,21 @@ function WorkbenchStudioCanvas({ setRegistry, autoScroll, onAutoScrollChange, ex
|
|
|
1741
1787
|
alert(`Stop engine before switching example.`);
|
|
1742
1788
|
return;
|
|
1743
1789
|
}
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
}
|
|
1752
|
-
case "async": {
|
|
1753
|
-
const r = createAsyncGraphRegistry();
|
|
1754
|
-
setRegistry(r);
|
|
1755
|
-
wb.setRegistry(r);
|
|
1756
|
-
await wb.load(createAsyncGraphDef());
|
|
1757
|
-
break;
|
|
1758
|
-
}
|
|
1759
|
-
case "progress": {
|
|
1760
|
-
const r = createProgressGraphRegistry();
|
|
1761
|
-
setRegistry(r);
|
|
1762
|
-
wb.setRegistry(r);
|
|
1763
|
-
await wb.load(createProgressGraphDef());
|
|
1764
|
-
break;
|
|
1765
|
-
}
|
|
1766
|
-
case "validation": {
|
|
1767
|
-
const r = createValidationGraphRegistry();
|
|
1768
|
-
setRegistry(r);
|
|
1769
|
-
wb.setRegistry(r);
|
|
1770
|
-
await wb.load(createValidationGraphDef());
|
|
1771
|
-
break;
|
|
1772
|
-
}
|
|
1773
|
-
default: {
|
|
1774
|
-
const r = createSimpleGraphRegistry();
|
|
1775
|
-
setRegistry(r);
|
|
1776
|
-
wb.setRegistry(r);
|
|
1777
|
-
await wb.load(createSimpleGraphDef());
|
|
1778
|
-
}
|
|
1790
|
+
const ex = examples.find((e) => e.id === key) ?? examples[0];
|
|
1791
|
+
if (!ex)
|
|
1792
|
+
return;
|
|
1793
|
+
const { registry: r, def } = await ex.load();
|
|
1794
|
+
if (r) {
|
|
1795
|
+
setRegistry(r);
|
|
1796
|
+
wb.setRegistry(r);
|
|
1779
1797
|
}
|
|
1798
|
+
await wb.load(def);
|
|
1799
|
+
// Build a local runtime so seeded defaults are visible pre-run
|
|
1800
|
+
runner.build(wb.export());
|
|
1780
1801
|
runAutoLayout();
|
|
1781
1802
|
setExampleState(key);
|
|
1782
1803
|
onExampleChange?.(key);
|
|
1783
|
-
}, [runner, wb, onExampleChange, runAutoLayout]);
|
|
1804
|
+
}, [runner, wb, onExampleChange, runAutoLayout, examples, setRegistry]);
|
|
1784
1805
|
const hydrateFromBackend = useCallback(async (kind, base) => {
|
|
1785
1806
|
try {
|
|
1786
1807
|
const transport = kind === "remote-http"
|
|
@@ -2031,9 +2052,9 @@ function WorkbenchStudioCanvas({ setRegistry, autoScroll, onAutoScrollChange, ex
|
|
|
2031
2052
|
return overrides.toElement(baseToElement, { registry });
|
|
2032
2053
|
return baseToElement;
|
|
2033
2054
|
}, [overrides, baseToElement, registry]);
|
|
2034
|
-
return (jsxs("div", { className: "w-full h-screen flex flex-col", children: [jsxs("div", { className: "p-2 border-b border-gray-300 flex gap-2 items-center", children: [runner.isRunning() ? (jsxs("span", { className: "ml-2 text-sm text-green-700", children: ["Running: ", runner.getRunningEngine()] })) : (jsx("span", { className: "ml-2 text-sm text-gray-500", children: "Stopped" })), jsx("label", { className: "ml-2 text-sm", children: "Example:" }),
|
|
2055
|
+
return (jsxs("div", { className: "w-full h-screen flex flex-col", children: [jsxs("div", { className: "p-2 border-b border-gray-300 flex gap-2 items-center", children: [runner.isRunning() ? (jsxs("span", { className: "ml-2 text-sm text-green-700", children: ["Running: ", runner.getRunningEngine()] })) : (jsx("span", { className: "ml-2 text-sm text-gray-500", children: "Stopped" })), jsx("label", { className: "ml-2 text-sm", children: "Example:" }), jsx("select", { className: "border border-gray-300 rounded px-2 py-1", value: exampleState, onChange: (e) => applyExample(e.target.value), disabled: runner.isRunning(), title: runner.isRunning()
|
|
2035
2056
|
? "Stop engine before switching example"
|
|
2036
|
-
: undefined, children:
|
|
2057
|
+
: undefined, children: examples.map((ex) => (jsx("option", { value: ex.id, children: ex.label }, ex.id))) }), jsx("label", { className: "ml-2 text-sm", children: "Backend:" }), jsxs("select", { className: "border border-gray-300 rounded px-2 py-1", value: backendKind, onChange: (e) => onBackendKindChange(e.target.value), disabled: runner.isRunning(), title: runner.isRunning()
|
|
2037
2058
|
? "Stop engine before switching backend"
|
|
2038
2059
|
: undefined, children: [jsx("option", { value: "local", children: "Local" }), jsx("option", { value: "remote-http", children: "Remote (HTTP)" }), jsx("option", { value: "remote-ws", children: "Remote (WebSocket)" })] }), backendKind === "remote-http" && (jsx("input", { className: "ml-2 border border-gray-300 rounded px-2 py-1 w-72", placeholder: "http://127.0.0.1:18080", value: httpBaseUrl, onChange: (e) => onHttpBaseUrlChange(e.target.value) })), backendKind === "remote-ws" && (jsx("input", { className: "ml-2 border border-gray-300 rounded px-2 py-1 w-72", placeholder: "ws://127.0.0.1:18081", value: wsUrl, onChange: (e) => onWsUrlChange(e.target.value) })), jsxs("select", { className: "border border-gray-300 rounded px-2 py-1", value: runner.getRunningEngine() ?? engine ?? "", onChange: (e) => {
|
|
2039
2060
|
const kind = e.target.value || undefined;
|