@executioncontrolprotocol/format-reactflow 0.12.0
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/README.md +24 -0
- package/dist/extension.d.ts +3 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +94 -0
- package/dist/extension.js.map +1 -0
- package/dist/extract-data-edges.d.ts +17 -0
- package/dist/extract-data-edges.d.ts.map +1 -0
- package/dist/extract-data-edges.js +95 -0
- package/dist/extract-data-edges.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/io-from-schema.d.ts +36 -0
- package/dist/io-from-schema.d.ts.map +1 -0
- package/dist/io-from-schema.js +136 -0
- package/dist/io-from-schema.js.map +1 -0
- package/dist/layout.d.ts +7 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +67 -0
- package/dist/layout.js.map +1 -0
- package/dist/ports-from-zod.d.ts +28 -0
- package/dist/ports-from-zod.d.ts.map +1 -0
- package/dist/ports-from-zod.js +169 -0
- package/dist/ports-from-zod.js.map +1 -0
- package/dist/progress.d.ts +19 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +23 -0
- package/dist/progress.js.map +1 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/value-schema-hint.d.ts +31 -0
- package/dist/value-schema-hint.d.ts.map +1 -0
- package/dist/value-schema-hint.js +156 -0
- package/dist/value-schema-hint.js.map +1 -0
- package/dist/workflow-to-reactflow.d.ts +11 -0
- package/dist/workflow-to-reactflow.d.ts.map +1 -0
- package/dist/workflow-to-reactflow.js +207 -0
- package/dist/workflow-to-reactflow.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# `@executioncontrolprotocol/format-reactflow`
|
|
2
|
+
|
|
3
|
+
Encode-only formatter that turns an `@executioncontrolprotocol.workflow` manifest into React Flow–compatible JSON (flat step nodes, projected Inputs/Outputs from `accepts`/`returns`, `$ref` data edges, and dagre layout).
|
|
4
|
+
|
|
5
|
+
**Render contract (required reading):** [REACTFLOW_RENDER.md](./REACTFLOW_RENDER.md) — flat canvas, data edges only, port bindings, fan-out, and viewer run/configure expectations.
|
|
6
|
+
|
|
7
|
+
Also binds lifecycle hooks that publish run progress on {@link reactFlowRunProgress} for browser viewers.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import "@executioncontrolprotocol/format-reactflow"
|
|
11
|
+
import { registerFormatReactflowExtension, reactFlowRunProgress } from "@executioncontrolprotocol/format-reactflow"
|
|
12
|
+
|
|
13
|
+
await registerFormatReactflowExtension()
|
|
14
|
+
env.addExtensionBinding("@executioncontrolprotocol/format-reactflow", {})
|
|
15
|
+
|
|
16
|
+
const encoded = await ecp
|
|
17
|
+
.encode(manifest)
|
|
18
|
+
.uses("@executioncontrolprotocol/format-reactflow")
|
|
19
|
+
.process()
|
|
20
|
+
|
|
21
|
+
reactFlowRunProgress.addEventListener("step:status", (ev) => {
|
|
22
|
+
// CustomEvent detail: { stepId, status }
|
|
23
|
+
})
|
|
24
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AA4EA,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,8DA0C3B,CAAA"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { catalogExtension, capabilityFor, defineExtension, ecpEncodeInputSchema, ecpEncodeResultSchema, encodeFailure, hook, validateWorkflow, } from "@executioncontrolprotocol/core";
|
|
2
|
+
import { LATEST_ECP_VERSION, } from "@executioncontrolprotocol/types";
|
|
3
|
+
import { reactFlowRunProgress } from "./progress.js";
|
|
4
|
+
import { workflowToReactFlow } from "./workflow-to-reactflow.js";
|
|
5
|
+
function encodeToReactFlow(input, ctx) {
|
|
6
|
+
const sourceSchema = input.sourceSchema;
|
|
7
|
+
if (sourceSchema !== "@executioncontrolprotocol.workflow") {
|
|
8
|
+
return encodeFailure({
|
|
9
|
+
format: "reactflow",
|
|
10
|
+
sourceSchema,
|
|
11
|
+
diagnostics: [
|
|
12
|
+
{
|
|
13
|
+
severity: "error",
|
|
14
|
+
code: "FORMAT_UNSUPPORTED_SOURCE_SCHEMA",
|
|
15
|
+
message: "React Flow encoder supports @executioncontrolprotocol.workflow only",
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const validation = validateWorkflow(input.source);
|
|
21
|
+
if (!validation.valid) {
|
|
22
|
+
return encodeFailure({
|
|
23
|
+
format: "reactflow",
|
|
24
|
+
sourceSchema,
|
|
25
|
+
validation,
|
|
26
|
+
diagnostics: [...validation.errors, ...validation.warnings],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const options = input.options;
|
|
30
|
+
const doc = workflowToReactFlow(input.source, ctx.registry, options);
|
|
31
|
+
return {
|
|
32
|
+
schema: "@executioncontrolprotocol.encode.result",
|
|
33
|
+
version: LATEST_ECP_VERSION,
|
|
34
|
+
success: true,
|
|
35
|
+
format: "reactflow",
|
|
36
|
+
mediaType: "application/vnd.reactflow+json",
|
|
37
|
+
sourceSchema,
|
|
38
|
+
sourceVersion: input.sourceVersion,
|
|
39
|
+
result: JSON.stringify(doc),
|
|
40
|
+
diagnostics: [],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function progressHook(event, handler) {
|
|
44
|
+
return hook(event, async (ctx) => {
|
|
45
|
+
handler(ctx);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** React Flow format extension (encode + run progress hooks). @category Extensions */
|
|
49
|
+
export const formatReactflowExtension = defineExtension("@executioncontrolprotocol", "format-reactflow")
|
|
50
|
+
.withCapabilities([
|
|
51
|
+
capabilityFor("@executioncontrolprotocol/format-reactflow", "encode")
|
|
52
|
+
.withInput(ecpEncodeInputSchema)
|
|
53
|
+
.withOutput(ecpEncodeResultSchema)
|
|
54
|
+
.withHandler((input, ctx) => {
|
|
55
|
+
const utilityCtx = ctx;
|
|
56
|
+
return encodeToReactFlow(input, utilityCtx);
|
|
57
|
+
}),
|
|
58
|
+
])
|
|
59
|
+
.withHooks([
|
|
60
|
+
progressHook("run:before", (ctx) => {
|
|
61
|
+
reactFlowRunProgress.emitReset({ runId: ctx.run.id });
|
|
62
|
+
}),
|
|
63
|
+
progressHook("run:started", (ctx) => {
|
|
64
|
+
reactFlowRunProgress.emitReset({ runId: ctx.run.id });
|
|
65
|
+
}),
|
|
66
|
+
progressHook("step:started", (ctx) => {
|
|
67
|
+
if (ctx.step?.id)
|
|
68
|
+
reactFlowRunProgress.emitStepStatus(ctx.step.id, "running");
|
|
69
|
+
}),
|
|
70
|
+
progressHook("step:before", (ctx) => {
|
|
71
|
+
if (ctx.step?.id)
|
|
72
|
+
reactFlowRunProgress.emitStepStatus(ctx.step.id, "pending");
|
|
73
|
+
}),
|
|
74
|
+
progressHook("step:completed", (ctx) => {
|
|
75
|
+
if (ctx.step?.id)
|
|
76
|
+
reactFlowRunProgress.emitStepStatus(ctx.step.id, "completed");
|
|
77
|
+
}),
|
|
78
|
+
progressHook("step:failed", (ctx) => {
|
|
79
|
+
if (ctx.step?.id)
|
|
80
|
+
reactFlowRunProgress.emitStepStatus(ctx.step.id, "failed");
|
|
81
|
+
}),
|
|
82
|
+
progressHook("run:completed", (ctx) => {
|
|
83
|
+
reactFlowRunProgress.emitDone({ runId: ctx.run.id, outcome: "completed" });
|
|
84
|
+
}),
|
|
85
|
+
progressHook("run:failed", (ctx) => {
|
|
86
|
+
reactFlowRunProgress.emitDone({ runId: ctx.run.id, outcome: "failed" });
|
|
87
|
+
}),
|
|
88
|
+
progressHook("run:cancelled", (ctx) => {
|
|
89
|
+
reactFlowRunProgress.emitDone({ runId: ctx.run.id, outcome: "cancelled" });
|
|
90
|
+
}),
|
|
91
|
+
])
|
|
92
|
+
.build();
|
|
93
|
+
catalogExtension(formatReactflowExtension);
|
|
94
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WorkflowNode } from "@executioncontrolprotocol/types";
|
|
2
|
+
import type { ReactFlowEdge } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Parse `state.<asKey>[.<rest>]` into as-key and optional nested path for handles.
|
|
5
|
+
* @category Encoding
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseStateRef(refPath: string): {
|
|
8
|
+
asKey: string;
|
|
9
|
+
fieldPath: string;
|
|
10
|
+
} | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Extract data edges from step `.with()` `$ref` values.
|
|
13
|
+
* `acceptsKeys` maps `state.<key>` refs to the projected Inputs node.
|
|
14
|
+
* @category Encoding
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractDataEdges(nodes: WorkflowNode[], acceptsKeys?: ReadonlySet<string>): ReactFlowEdge[];
|
|
17
|
+
//# sourceMappingURL=extract-data-edges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-data-edges.d.ts","sourceRoot":"","sources":["../src/extract-data-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAEzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAiC/C;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAQlD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EAAE,EACrB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,aAAa,EAAE,CA4CjB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { WORKFLOW_ACCEPTS_NODE_ID } from "./io-from-schema.js";
|
|
2
|
+
function isStepNode(node) {
|
|
3
|
+
return !node.type || node.type === "step";
|
|
4
|
+
}
|
|
5
|
+
function collectSteps(nodes, out) {
|
|
6
|
+
for (const node of nodes) {
|
|
7
|
+
if (isStepNode(node)) {
|
|
8
|
+
out.push(node);
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
if (node.type === "parallel") {
|
|
12
|
+
for (const branch of node.branches)
|
|
13
|
+
collectSteps(branch, out);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (node.type === "branch") {
|
|
17
|
+
for (const arm of node.branches)
|
|
18
|
+
collectSteps(arm.steps, out);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
collectSteps(node.steps, out);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function isRefValue(value) {
|
|
25
|
+
return (typeof value === "object" &&
|
|
26
|
+
value !== null &&
|
|
27
|
+
"$ref" in value &&
|
|
28
|
+
typeof value.$ref === "string");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse `state.<asKey>[.<rest>]` into as-key and optional nested path for handles.
|
|
32
|
+
* @category Encoding
|
|
33
|
+
*/
|
|
34
|
+
export function parseStateRef(refPath) {
|
|
35
|
+
const normalized = refPath.startsWith("state.") ? refPath.slice("state.".length) : refPath;
|
|
36
|
+
if (!normalized)
|
|
37
|
+
return undefined;
|
|
38
|
+
const parts = normalized.split(".");
|
|
39
|
+
const asKey = parts[0];
|
|
40
|
+
if (!asKey)
|
|
41
|
+
return undefined;
|
|
42
|
+
const fieldPath = parts.slice(1).join(".");
|
|
43
|
+
return { asKey, fieldPath };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Extract data edges from step `.with()` `$ref` values.
|
|
47
|
+
* `acceptsKeys` maps `state.<key>` refs to the projected Inputs node.
|
|
48
|
+
* @category Encoding
|
|
49
|
+
*/
|
|
50
|
+
export function extractDataEdges(nodes, acceptsKeys) {
|
|
51
|
+
const steps = [];
|
|
52
|
+
collectSteps(nodes, steps);
|
|
53
|
+
const asToStepId = new Map();
|
|
54
|
+
for (const step of steps) {
|
|
55
|
+
if (step.as)
|
|
56
|
+
asToStepId.set(step.as, step.id);
|
|
57
|
+
}
|
|
58
|
+
if (acceptsKeys) {
|
|
59
|
+
for (const key of acceptsKeys) {
|
|
60
|
+
if (!asToStepId.has(key))
|
|
61
|
+
asToStepId.set(key, WORKFLOW_ACCEPTS_NODE_ID);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const edges = [];
|
|
65
|
+
let edgeIndex = 0;
|
|
66
|
+
for (const step of steps) {
|
|
67
|
+
if (!step.input)
|
|
68
|
+
continue;
|
|
69
|
+
for (const [paramName, value] of Object.entries(step.input)) {
|
|
70
|
+
if (!isRefValue(value))
|
|
71
|
+
continue;
|
|
72
|
+
const parsed = parseStateRef(value.$ref);
|
|
73
|
+
if (!parsed)
|
|
74
|
+
continue;
|
|
75
|
+
const sourceStepId = asToStepId.get(parsed.asKey);
|
|
76
|
+
if (!sourceStepId)
|
|
77
|
+
continue;
|
|
78
|
+
const sourceHandle = sourceStepId === WORKFLOW_ACCEPTS_NODE_ID
|
|
79
|
+
? parsed.asKey
|
|
80
|
+
: parsed.fieldPath
|
|
81
|
+
? parsed.fieldPath.split(".")[0]
|
|
82
|
+
: "output";
|
|
83
|
+
edges.push({
|
|
84
|
+
id: `data-${edgeIndex++}-${sourceStepId}-${step.id}-${paramName}`,
|
|
85
|
+
source: sourceStepId,
|
|
86
|
+
target: step.id,
|
|
87
|
+
sourceHandle,
|
|
88
|
+
targetHandle: paramName,
|
|
89
|
+
data: { kind: "data" },
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return edges;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=extract-data-edges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-data-edges.js","sourceRoot":"","sources":["../src/extract-data-edges.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Registry } from "@executioncontrolprotocol/core";
|
|
2
|
+
export { formatReactflowExtension } from "./extension.js";
|
|
3
|
+
export { workflowToReactFlow } from "./workflow-to-reactflow.js";
|
|
4
|
+
export { extractDataEdges, parseStateRef } from "./extract-data-edges.js";
|
|
5
|
+
export { acceptsReactFlowNode, returnsReactFlowNode, portsFromJsonSchemaObject, jsonSchemaObjectProperties, WORKFLOW_ACCEPTS_NODE_ID, WORKFLOW_RETURNS_NODE_ID, } from "./io-from-schema.js";
|
|
6
|
+
export { portsForStep, formatLiteralValue, truncateLiteralPreview, ensureOutputPort } from "./ports-from-zod.js";
|
|
7
|
+
export { valueSchemaFromZod, valueSchemaFromEqlLabel, valueSchemaFromJsonSchemaProp, valueSchemasFromCapabilitySchema, unwrapZodType, type ValueSchemaHint, } from "./value-schema-hint.js";
|
|
8
|
+
export { layoutReactFlowDocument } from "./layout.js";
|
|
9
|
+
export { reactFlowRunProgress, ReactFlowRunProgress, type ReactFlowProgressEventName, } from "./progress.js";
|
|
10
|
+
export type { ReactFlowDocument, ReactFlowEdge, ReactFlowEdgeKind, ReactFlowEncodeOptions, ReactFlowGroupData, ReactFlowIoData, ReactFlowIoKind, ReactFlowNode, ReactFlowPort, ReactFlowPortBinding, ReactFlowRunLifecycleDetail, ReactFlowStepData, ReactFlowStepStatus, ReactFlowStepStatusDetail, } from "./types.js";
|
|
11
|
+
/** Register React Flow format extension. @category Extensions */
|
|
12
|
+
export declare function registerFormatReactflowExtension(registry?: Registry): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAG9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAChH,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,6BAA6B,EAC7B,gCAAgC,EAChC,aAAa,EACb,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,0BAA0B,GAChC,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AAEnB,iEAAiE;AACjE,wBAAsB,gCAAgC,CACpD,QAAQ,GAAE,QAAyB,GAClC,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { globalRegistry } from "@executioncontrolprotocol/core";
|
|
2
|
+
import { formatReactflowExtension } from "./extension.js";
|
|
3
|
+
export { formatReactflowExtension } from "./extension.js";
|
|
4
|
+
export { workflowToReactFlow } from "./workflow-to-reactflow.js";
|
|
5
|
+
export { extractDataEdges, parseStateRef } from "./extract-data-edges.js";
|
|
6
|
+
export { acceptsReactFlowNode, returnsReactFlowNode, portsFromJsonSchemaObject, jsonSchemaObjectProperties, WORKFLOW_ACCEPTS_NODE_ID, WORKFLOW_RETURNS_NODE_ID, } from "./io-from-schema.js";
|
|
7
|
+
export { portsForStep, formatLiteralValue, truncateLiteralPreview, ensureOutputPort } from "./ports-from-zod.js";
|
|
8
|
+
export { valueSchemaFromZod, valueSchemaFromEqlLabel, valueSchemaFromJsonSchemaProp, valueSchemasFromCapabilitySchema, unwrapZodType, } from "./value-schema-hint.js";
|
|
9
|
+
export { layoutReactFlowDocument } from "./layout.js";
|
|
10
|
+
export { reactFlowRunProgress, ReactFlowRunProgress, } from "./progress.js";
|
|
11
|
+
/** Register React Flow format extension. @category Extensions */
|
|
12
|
+
export async function registerFormatReactflowExtension(registry = globalRegistry) {
|
|
13
|
+
if (!registry.getExtension("@executioncontrolprotocol/format-reactflow")) {
|
|
14
|
+
await registry.registerExtension(formatReactflowExtension);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAChH,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,6BAA6B,EAC7B,gCAAgC,EAChC,aAAa,GAEd,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAErB,MAAM,eAAe,CAAA;AAkBtB,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAqB,cAAc;IAEnC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,4CAA4C,CAAC,EAAE,CAAC;QACzE,MAAM,QAAQ,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { WorkflowManifest } from "@executioncontrolprotocol/types";
|
|
2
|
+
import type { ReactFlowNode, ReactFlowPort } from "./types.js";
|
|
3
|
+
/** Synthetic React Flow node id for `workflow.accepts`. @category Encoding */
|
|
4
|
+
export declare const WORKFLOW_ACCEPTS_NODE_ID = "ecp:accepts";
|
|
5
|
+
/** Synthetic React Flow node id for `workflow.returns`. @category Encoding */
|
|
6
|
+
export declare const WORKFLOW_RETURNS_NODE_ID = "ecp:returns";
|
|
7
|
+
/**
|
|
8
|
+
* List object-schema properties for workflow `accepts` / `returns`.
|
|
9
|
+
* @category Encoding
|
|
10
|
+
*/
|
|
11
|
+
export declare function jsonSchemaObjectProperties(schema: Record<string, unknown> | undefined): Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
schema: Record<string, unknown>;
|
|
14
|
+
required: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Ports from a JSON Schema object (`accepts` / `returns` properties).
|
|
18
|
+
* @category Encoding
|
|
19
|
+
*/
|
|
20
|
+
export declare function portsFromJsonSchemaObject(schema: Record<string, unknown> | undefined): ReactFlowPort[];
|
|
21
|
+
/**
|
|
22
|
+
* Project workflow `accepts` as an output-only Inputs node (always present).
|
|
23
|
+
* @category Encoding
|
|
24
|
+
*/
|
|
25
|
+
export declare function acceptsReactFlowNode(manifest: WorkflowManifest): ReactFlowNode;
|
|
26
|
+
/**
|
|
27
|
+
* State keys that can source a `returns` port (step `.as` or `accepts` properties).
|
|
28
|
+
* @category Encoding
|
|
29
|
+
*/
|
|
30
|
+
export declare function returnsSourceKeys(manifest: WorkflowManifest): Set<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Project workflow `returns` as an input-only Outputs node when it has properties.
|
|
33
|
+
* @category Encoding
|
|
34
|
+
*/
|
|
35
|
+
export declare function returnsReactFlowNode(manifest: WorkflowManifest): ReactFlowNode | undefined;
|
|
36
|
+
//# sourceMappingURL=io-from-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io-from-schema.d.ts","sourceRoot":"","sources":["../src/io-from-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,gBAAgB,EAAgB,MAAM,iCAAiC,CAAA;AAC/F,OAAO,KAAK,EAAmB,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG/E,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,gBAAgB,CAAA;AAErD,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,gBAAgB,CAAA;AAMrD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAkB7E;AAQD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,aAAa,EAAE,CAYjB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,aAAa,CAc9E;AAwBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,CAMzE;AAWD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,aAAa,GAAG,SAAS,CAgB1F"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { valueSchemaFromEqlLabel, valueSchemaFromJsonSchemaProp } from "./value-schema-hint.js";
|
|
2
|
+
/** Synthetic React Flow node id for `workflow.accepts`. @category Encoding */
|
|
3
|
+
export const WORKFLOW_ACCEPTS_NODE_ID = "ecp:accepts";
|
|
4
|
+
/** Synthetic React Flow node id for `workflow.returns`. @category Encoding */
|
|
5
|
+
export const WORKFLOW_RETURNS_NODE_ID = "ecp:returns";
|
|
6
|
+
function isJsonSchemaObject(schema) {
|
|
7
|
+
return schema !== null && typeof schema === "object" && !Array.isArray(schema);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* List object-schema properties for workflow `accepts` / `returns`.
|
|
11
|
+
* @category Encoding
|
|
12
|
+
*/
|
|
13
|
+
export function jsonSchemaObjectProperties(schema) {
|
|
14
|
+
if (!schema)
|
|
15
|
+
return [];
|
|
16
|
+
const props = schema.properties;
|
|
17
|
+
if (!isJsonSchemaObject(props))
|
|
18
|
+
return [];
|
|
19
|
+
const required = new Set(Array.isArray(schema.required)
|
|
20
|
+
? schema.required.filter((k) => typeof k === "string")
|
|
21
|
+
: []);
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const [name, prop] of Object.entries(props)) {
|
|
24
|
+
out.push({
|
|
25
|
+
name,
|
|
26
|
+
schema: isJsonSchemaObject(prop) ? prop : {},
|
|
27
|
+
required: required.has(name),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
function typeLabelFromSchema(schema, required) {
|
|
33
|
+
const t = schema.type;
|
|
34
|
+
const base = typeof t === "string" ? t : "unknown";
|
|
35
|
+
return required ? `${base}!` : base;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Ports from a JSON Schema object (`accepts` / `returns` properties).
|
|
39
|
+
* @category Encoding
|
|
40
|
+
*/
|
|
41
|
+
export function portsFromJsonSchemaObject(schema) {
|
|
42
|
+
return jsonSchemaObjectProperties(schema).map((field) => {
|
|
43
|
+
const typeLabel = typeLabelFromSchema(field.schema, field.required);
|
|
44
|
+
const port = {
|
|
45
|
+
id: field.name,
|
|
46
|
+
name: field.name,
|
|
47
|
+
typeLabel,
|
|
48
|
+
required: field.required,
|
|
49
|
+
valueSchema: valueSchemaFromJsonSchemaProp(field.schema) ?? valueSchemaFromEqlLabel(typeLabel),
|
|
50
|
+
};
|
|
51
|
+
return port;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Project workflow `accepts` as an output-only Inputs node (always present).
|
|
56
|
+
* @category Encoding
|
|
57
|
+
*/
|
|
58
|
+
export function acceptsReactFlowNode(manifest) {
|
|
59
|
+
const outputs = portsFromJsonSchemaObject(manifest.workflow.accepts);
|
|
60
|
+
const data = {
|
|
61
|
+
label: "Inputs",
|
|
62
|
+
kind: "accepts",
|
|
63
|
+
inputs: [],
|
|
64
|
+
outputs,
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
id: WORKFLOW_ACCEPTS_NODE_ID,
|
|
68
|
+
type: "ecp-io",
|
|
69
|
+
position: { x: 0, y: 0 },
|
|
70
|
+
data,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function isStepNode(node) {
|
|
74
|
+
return !node.type || node.type === "step";
|
|
75
|
+
}
|
|
76
|
+
function collectCommitKeys(nodes, into) {
|
|
77
|
+
for (const node of nodes) {
|
|
78
|
+
if (isStepNode(node)) {
|
|
79
|
+
if (node.as)
|
|
80
|
+
into.add(node.as);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (node.type === "parallel") {
|
|
84
|
+
for (const branch of node.branches)
|
|
85
|
+
collectCommitKeys(branch, into);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (node.type === "branch") {
|
|
89
|
+
for (const arm of node.branches)
|
|
90
|
+
collectCommitKeys(arm.steps, into);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
collectCommitKeys(node.steps, into);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* State keys that can source a `returns` port (step `.as` or `accepts` properties).
|
|
98
|
+
* @category Encoding
|
|
99
|
+
*/
|
|
100
|
+
export function returnsSourceKeys(manifest) {
|
|
101
|
+
const keys = new Set(jsonSchemaObjectProperties(manifest.workflow.accepts).map((field) => field.name));
|
|
102
|
+
collectCommitKeys(manifest.steps, keys);
|
|
103
|
+
return keys;
|
|
104
|
+
}
|
|
105
|
+
function annotateReturnsPorts(manifest, ports) {
|
|
106
|
+
const sources = returnsSourceKeys(manifest);
|
|
107
|
+
for (const port of ports) {
|
|
108
|
+
if (!sources.has(port.id))
|
|
109
|
+
continue;
|
|
110
|
+
port.binding = "ref";
|
|
111
|
+
port.refPath = port.id;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Project workflow `returns` as an input-only Outputs node when it has properties.
|
|
116
|
+
* @category Encoding
|
|
117
|
+
*/
|
|
118
|
+
export function returnsReactFlowNode(manifest) {
|
|
119
|
+
const inputs = portsFromJsonSchemaObject(manifest.workflow.returns);
|
|
120
|
+
if (inputs.length === 0)
|
|
121
|
+
return undefined;
|
|
122
|
+
annotateReturnsPorts(manifest, inputs);
|
|
123
|
+
const data = {
|
|
124
|
+
label: "Outputs",
|
|
125
|
+
kind: "returns",
|
|
126
|
+
inputs,
|
|
127
|
+
outputs: [],
|
|
128
|
+
};
|
|
129
|
+
return {
|
|
130
|
+
id: WORKFLOW_RETURNS_NODE_ID,
|
|
131
|
+
type: "ecp-io",
|
|
132
|
+
position: { x: 0, y: 0 },
|
|
133
|
+
data,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=io-from-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io-from-schema.js","sourceRoot":"","sources":["../src/io-from-schema.ts"],"names":[],"mappings":"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"}
|
package/dist/layout.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReactFlowDocument, ReactFlowEncodeOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Assign dagre layout positions to nodes (mutates a copy).
|
|
4
|
+
* @category Encoding
|
|
5
|
+
*/
|
|
6
|
+
export declare function layoutReactFlowDocument(doc: ReactFlowDocument, options?: ReactFlowEncodeOptions): ReactFlowDocument;
|
|
7
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EAIvB,MAAM,YAAY,CAAA;AAqBnB;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,EACtB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,iBAAiB,CAmDnB"}
|
package/dist/layout.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import dagre from "@dagrejs/dagre";
|
|
2
|
+
const DEFAULT_NODE_WIDTH = 260;
|
|
3
|
+
const DEFAULT_NODE_HEIGHT = 160;
|
|
4
|
+
const PORT_ROW_ESTIMATE = 18;
|
|
5
|
+
const HEADER_ESTIMATE = 72;
|
|
6
|
+
function estimateNodeHeight(node, fallback) {
|
|
7
|
+
if (node.type === "ecp-step") {
|
|
8
|
+
const data = node.data;
|
|
9
|
+
const portRows = Math.max(data.inputs.length, 1) + Math.max(data.outputs.length, 1);
|
|
10
|
+
return Math.max(fallback, HEADER_ESTIMATE + portRows * PORT_ROW_ESTIMATE);
|
|
11
|
+
}
|
|
12
|
+
if (node.type === "ecp-io") {
|
|
13
|
+
const data = node.data;
|
|
14
|
+
const portRows = Math.max(data.inputs.length + data.outputs.length, 1);
|
|
15
|
+
return Math.max(fallback, HEADER_ESTIMATE + portRows * PORT_ROW_ESTIMATE);
|
|
16
|
+
}
|
|
17
|
+
return fallback;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Assign dagre layout positions to nodes (mutates a copy).
|
|
21
|
+
* @category Encoding
|
|
22
|
+
*/
|
|
23
|
+
export function layoutReactFlowDocument(doc, options) {
|
|
24
|
+
const direction = options?.direction ?? "LR";
|
|
25
|
+
const nodeWidth = options?.nodeWidth ?? DEFAULT_NODE_WIDTH;
|
|
26
|
+
const nodeHeight = options?.nodeHeight ?? DEFAULT_NODE_HEIGHT;
|
|
27
|
+
const g = new dagre.graphlib.Graph();
|
|
28
|
+
g.setDefaultEdgeLabel(() => ({}));
|
|
29
|
+
g.setGraph({
|
|
30
|
+
rankdir: direction,
|
|
31
|
+
nodesep: 56,
|
|
32
|
+
ranksep: 96,
|
|
33
|
+
marginx: 24,
|
|
34
|
+
marginy: 24,
|
|
35
|
+
});
|
|
36
|
+
const byId = new Map(doc.nodes.map((n) => [n.id, n]));
|
|
37
|
+
const heights = new Map(doc.nodes.map((node) => [node.id, estimateNodeHeight(node, nodeHeight)]));
|
|
38
|
+
for (const node of doc.nodes) {
|
|
39
|
+
g.setNode(node.id, { width: nodeWidth, height: heights.get(node.id) ?? nodeHeight });
|
|
40
|
+
}
|
|
41
|
+
for (const edge of doc.edges) {
|
|
42
|
+
if (byId.has(edge.source) && byId.has(edge.target)) {
|
|
43
|
+
g.setEdge(edge.source, edge.target);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
dagre.layout(g);
|
|
47
|
+
const nodes = doc.nodes.map((node) => {
|
|
48
|
+
const laid = g.node(node.id);
|
|
49
|
+
const height = heights.get(node.id) ?? nodeHeight;
|
|
50
|
+
if (!laid)
|
|
51
|
+
return { ...node, position: { ...node.position } };
|
|
52
|
+
return {
|
|
53
|
+
...node,
|
|
54
|
+
position: {
|
|
55
|
+
x: laid.x - nodeWidth / 2,
|
|
56
|
+
y: laid.y - height / 2,
|
|
57
|
+
},
|
|
58
|
+
// Width only — height comes from content (top inputs / bottom outputs).
|
|
59
|
+
style: {
|
|
60
|
+
...node.style,
|
|
61
|
+
width: nodeWidth,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
return { nodes, edges: doc.edges.map((e) => ({ ...e })) };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Registry } from "@executioncontrolprotocol/core";
|
|
2
|
+
import type { StepNode } from "@executioncontrolprotocol/types";
|
|
3
|
+
import type { ReactFlowPort } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Compact string form of a literal input value (for previews / editors).
|
|
6
|
+
* @category Encoding
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatLiteralValue(value: unknown): string;
|
|
9
|
+
/**
|
|
10
|
+
* Truncate a literal for port row display.
|
|
11
|
+
* @category Encoding
|
|
12
|
+
*/
|
|
13
|
+
export declare function truncateLiteralPreview(full: string, max?: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Ensure an output port exists for a data-edge source handle.
|
|
16
|
+
* @category Encoding
|
|
17
|
+
*/
|
|
18
|
+
export declare function ensureOutputPort(outputs: ReactFlowPort[], handleId: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Build input/output ports from capability Zod schemas, with input-key fallback
|
|
21
|
+
* and literal / `$ref` binding metadata from `step.input`.
|
|
22
|
+
* @category Encoding
|
|
23
|
+
*/
|
|
24
|
+
export declare function portsForStep(step: StepNode, registry: Registry | undefined): {
|
|
25
|
+
inputs: ReactFlowPort[];
|
|
26
|
+
outputs: ReactFlowPort[];
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=ports-from-zod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports-from-zod.d.ts","sourceRoot":"","sources":["../src/ports-from-zod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAE9D,OAAO,KAAK,EAAc,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AA0C/C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASzD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAsB,GAAG,MAAM,CAGtF;AAmCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOjF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,CA4EvD"}
|