stageflow 0.3.0 → 0.8.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 +22 -1
- package/dist/agent/activity.d.ts +2 -0
- package/dist/agent/cursorProvider.d.ts +1 -10
- package/dist/agent/cursorProvider.js +18 -10
- package/dist/agent/fakeAgent.js +11 -7
- package/dist/agent/piAdapter.d.ts +2 -1
- package/dist/agent/piAdapter.js +28 -25
- package/dist/agent/port.d.ts +6 -1
- package/dist/agent/port.js +3 -0
- package/dist/cli/artifactCommand.d.ts +10 -0
- package/dist/cli/artifactCommand.js +120 -0
- package/dist/cli/envelopeCommand.d.ts +32 -0
- package/dist/cli/envelopeCommand.js +285 -0
- package/dist/cli/exportRunCommand.d.ts +10 -0
- package/dist/cli/exportRunCommand.js +150 -0
- package/dist/cli/handoffFormat.d.ts +22 -0
- package/dist/cli/handoffFormat.js +61 -0
- package/dist/cli/runCommand.d.ts +5 -1
- package/dist/cli/runCommand.js +36 -5
- package/dist/cli/runOutput.d.ts +4 -1
- package/dist/cli/runOutput.js +36 -8
- package/dist/cli/skillsCommand.d.ts +16 -0
- package/dist/cli/skillsCommand.js +459 -0
- package/dist/cli.js +78 -5
- package/dist/config/loadPipeline.js +5 -1
- package/dist/config/normalizePipelineStageEntry.d.ts +2 -0
- package/dist/config/normalizePipelineStageEntry.js +25 -1
- package/dist/config/pipelineStageKeys.js +1 -1
- package/dist/config/resolveForkEmitContext.d.ts +2 -1
- package/dist/config/resolveForkEmitContext.js +23 -1
- package/dist/config/resolvePipelineDag.js +36 -4
- package/dist/envelope/check.d.ts +2 -0
- package/dist/envelope/check.js +51 -0
- package/dist/envelope/cloneForks.d.ts +2 -0
- package/dist/envelope/cloneForks.js +62 -0
- package/dist/envelope/forkChoice.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/mcp/catalogTools.d.ts +3 -0
- package/dist/mcp/catalogTools.js +187 -0
- package/dist/mcp/controlTools.d.ts +3 -0
- package/dist/mcp/controlTools.js +147 -0
- package/dist/mcp/deps.d.ts +11 -0
- package/dist/mcp/deps.js +1 -0
- package/dist/mcp/projectRun.d.ts +1 -40
- package/dist/mcp/projectRun.js +1 -64
- package/dist/mcp/resources.d.ts +5 -0
- package/dist/mcp/resources.js +45 -0
- package/dist/mcp/server.d.ts +16 -3
- package/dist/mcp/server.js +159 -3
- package/dist/mcp/toolResults.d.ts +7 -0
- package/dist/mcp/toolResults.js +6 -0
- package/dist/mcp/tools.d.ts +2 -7
- package/dist/mcp/tools.js +52 -103
- package/dist/mcp/waitRun.d.ts +46 -0
- package/dist/mcp/waitRun.js +146 -0
- package/dist/mcp/waitingGates.d.ts +12 -0
- package/dist/mcp/waitingGates.js +83 -0
- package/dist/projection/projectRun.d.ts +44 -0
- package/dist/projection/projectRun.js +71 -0
- package/dist/prompt/priorEnvelope.d.ts +1 -1
- package/dist/prompt/priorEnvelope.js +4 -1
- package/dist/runstore/paths.js +2 -0
- package/dist/runstore/pipelineDagSnapshot.d.ts +9 -0
- package/dist/runstore/pipelineDagSnapshot.js +90 -1
- package/dist/runstore/port.d.ts +13 -2
- package/dist/runstore/port.js +4 -1
- package/dist/runstore/runProjection.d.ts +1 -1
- package/dist/runstore/runProjection.js +14 -3
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +3 -2
- package/dist/runstore/sqlite/SqliteRunStore.js +35 -3
- package/dist/runstore/stageInstanceId.d.ts +4 -0
- package/dist/runstore/stageInstanceId.js +23 -0
- package/dist/runstore/syntheticStageSnapshot.d.ts +1 -1
- package/dist/runstore/syntheticStageSnapshot.js +2 -1
- package/dist/runstore/trackProjection.js +28 -12
- package/dist/runstore/workspaceLayout.d.ts +1 -0
- package/dist/runstore/workspaceLayout.js +1 -1
- package/dist/runtime/cloneSchedule.d.ts +18 -0
- package/dist/runtime/cloneSchedule.js +233 -0
- package/dist/runtime/envelopeRouting.d.ts +2 -1
- package/dist/runtime/envelopeRouting.js +80 -13
- package/dist/runtime/pipelineScheduler.d.ts +6 -2
- package/dist/runtime/pipelineScheduler.js +166 -30
- package/dist/runtime/resumeReconstruct.js +8 -3
- package/dist/runtime/runChangeBus.d.ts +18 -0
- package/dist/runtime/runChangeBus.js +83 -0
- package/dist/runtime/stageAttemptBootstrap.d.ts +1 -0
- package/dist/runtime/stageAttemptBootstrap.js +17 -9
- package/dist/runtime/stageRunner.d.ts +1 -0
- package/dist/runtime/stageRunner.js +17 -15
- package/dist/runtime/stageWorker.js +11 -4
- package/dist/server/bootstrap.d.ts +32 -0
- package/dist/server/bootstrap.js +56 -0
- package/dist/server/createHttpHost.d.ts +34 -0
- package/dist/server/createHttpHost.js +70 -0
- package/dist/server/http.d.ts +6 -13
- package/dist/server/http.js +295 -374
- package/dist/server/mcpHost.d.ts +22 -0
- package/dist/server/mcpHost.js +21 -0
- package/dist/server/operatorResults.d.ts +13 -0
- package/dist/server/operatorResults.js +22 -0
- package/dist/tools/emitStageEnvelope.d.ts +11 -2
- package/dist/tools/emitStageEnvelope.js +22 -6
- package/dist/types/envelope.d.ts +2 -0
- package/dist/types/forkChoice.d.ts +22 -0
- package/dist/types/pipeline.d.ts +8 -0
- package/dist/ui/assets/{index-DefBlEvN.css → index-C3N7MXAC.css} +1 -1
- package/dist/ui/assets/index-CSoGDA3A.js +118 -0
- package/dist/ui/index.html +2 -2
- package/package.json +2 -1
- package/skills/install-suite.sh +107 -0
- package/skills/stageflow/SKILL.md +26 -0
- package/skills/stageflow/references/control-surface.md +26 -0
- package/skills/stageflow/scripts/detect-host.mjs +54 -0
- package/skills/stageflow/scripts/detect-host.test.mjs +97 -0
- package/skills/stageflow-author/SKILL.md +58 -0
- package/skills/stageflow-author/assets/examples/branch-decision/hotfix.yaml +10 -0
- package/skills/stageflow-author/assets/examples/branch-decision/release-gate.pipeline.yaml +12 -0
- package/skills/stageflow-author/assets/examples/branch-decision/run-tests.yaml +13 -0
- package/skills/stageflow-author/assets/examples/branch-decision/ship.yaml +10 -0
- package/skills/stageflow-author/assets/examples/linear-review/draft.yaml +9 -0
- package/skills/stageflow-author/assets/examples/linear-review/publish.yaml +10 -0
- package/skills/stageflow-author/assets/examples/linear-review/review-loop.pipeline.yaml +10 -0
- package/skills/stageflow-author/assets/examples/linear-review/review.yaml +15 -0
- package/skills/stageflow-author/assets/examples/non-sdlc-digest/gather.yaml +9 -0
- package/skills/stageflow-author/assets/examples/non-sdlc-digest/research-digest.pipeline.yaml +10 -0
- package/skills/stageflow-author/assets/examples/non-sdlc-digest/send.yaml +10 -0
- package/skills/stageflow-author/assets/examples/non-sdlc-digest/summarize.yaml +9 -0
- package/skills/stageflow-author/references/catalog-mapping.md +131 -0
- package/skills/stageflow-author/references/catalog-write-conventions.md +29 -0
- package/skills/stageflow-author/references/stage-prompt-template.md +55 -0
- package/skills/stageflow-author/references/validate-and-report.md +38 -0
- package/skills/stageflow-delegate/SKILL.md +18 -0
- package/skills/stageflow-delegate/references/authoring-or-run.md +15 -0
- package/skills/stageflow-delegate/references/example-walkthrough.md +30 -0
- package/skills/stageflow-delegate/references/pattern-detection.md +44 -0
- package/skills/stageflow-run/SKILL.md +151 -0
- package/skills/stageflow-run/references/mcp-call.md +17 -0
- package/skills/stageflow-run/references/task-and-pipeline-selection.md +52 -0
- package/skills/stageflow-run/scripts/mcp-call.mjs +299 -0
- package/skills/stageflow-run/scripts/mcp-call.test.mjs +271 -0
- package/skills/stageflow-session-capture/SKILL.md +94 -0
- package/skills/stageflow-session-capture/assets/example-pipeline/example.pipeline.yaml +7 -0
- package/skills/stageflow-session-capture/assets/example-pipeline/implement.yaml +8 -0
- package/skills/stageflow-session-capture/assets/example-pipeline/research.yaml +8 -0
- package/skills/stageflow-session-capture/references/catalog-authoring.md +40 -0
- package/skills/stageflow-session-capture/references/transcript-sources.md +25 -0
- package/skills/stageflow-session-capture/scripts/check-provider-gate.mjs +43 -0
- package/skills/stageflow-session-capture/scripts/locate-session-transcript.mjs +141 -0
- package/skills/stageflow-session-capture/scripts/resolve-catalog-id.mjs +119 -0
- package/skills/stageflow-setup/SKILL.md +110 -0
- package/dist/ui/assets/index-CFSzDZje.js +0 -118
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentPort } from "../agent/port.js";
|
|
2
|
+
import type { ProviderAuthContext } from "../agent/providerAuth.js";
|
|
3
|
+
import type { RunStoreKind } from "../runstore/createStore.js";
|
|
4
|
+
import type { RunStore } from "../runstore/port.js";
|
|
5
|
+
import type { RunChangeBus } from "../runtime/runChangeBus.js";
|
|
6
|
+
import { DEFAULT_PORT, type HttpHostEnvelope } from "./createHttpHost.js";
|
|
7
|
+
export type McpServerOptions = {
|
|
8
|
+
agent: AgentPort;
|
|
9
|
+
cwd?: string;
|
|
10
|
+
agentDir?: string;
|
|
11
|
+
rootDir?: string;
|
|
12
|
+
store?: RunStore;
|
|
13
|
+
storeKind?: RunStoreKind;
|
|
14
|
+
port?: number;
|
|
15
|
+
host?: string;
|
|
16
|
+
maxConcurrent?: number;
|
|
17
|
+
providerAuthContext?: ProviderAuthContext;
|
|
18
|
+
mcpStateless?: boolean;
|
|
19
|
+
runChangeBus?: RunChangeBus;
|
|
20
|
+
};
|
|
21
|
+
export declare function startMcpServer(options: McpServerOptions): Promise<HttpHostEnvelope>;
|
|
22
|
+
export { DEFAULT_PORT };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { bootstrapStageflowHost, } from "./bootstrap.js";
|
|
2
|
+
import { createHttpHost, DEFAULT_PORT, } from "./createHttpHost.js";
|
|
3
|
+
export async function startMcpServer(options) {
|
|
4
|
+
const host = options.host ?? "127.0.0.1";
|
|
5
|
+
const port = options.port ?? DEFAULT_PORT;
|
|
6
|
+
const boot = await bootstrapStageflowHost(options);
|
|
7
|
+
return createHttpHost({
|
|
8
|
+
boot,
|
|
9
|
+
host,
|
|
10
|
+
port,
|
|
11
|
+
routes: async ({ method, pathname, res, json, boot: b }) => {
|
|
12
|
+
if (method === "GET" && pathname === "/api/health") {
|
|
13
|
+
json(res, 200, b.manager.getHealth());
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
json(res, 404, { error: "Not found" });
|
|
17
|
+
return true;
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export { DEFAULT_PORT };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RetryStageResult, StartRunResult } from "../runtime/runManager.js";
|
|
2
|
+
export declare function inferRetryStageErrorCode(reason: string): string | undefined;
|
|
3
|
+
export declare function mapRetryStageFailure(result: Extract<RetryStageResult, {
|
|
4
|
+
ok: false;
|
|
5
|
+
}>): {
|
|
6
|
+
error: string;
|
|
7
|
+
code?: string;
|
|
8
|
+
} & Record<string, unknown>;
|
|
9
|
+
export declare function mapStartFailure(result: Extract<StartRunResult, {
|
|
10
|
+
ok: false;
|
|
11
|
+
}>): {
|
|
12
|
+
error: string;
|
|
13
|
+
} & Record<string, unknown>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function inferRetryStageErrorCode(reason) {
|
|
2
|
+
if (/retry already in progress/i.test(reason))
|
|
3
|
+
return "retry_in_progress";
|
|
4
|
+
if (/waiting for input/i.test(reason))
|
|
5
|
+
return "hitl_not_retriable";
|
|
6
|
+
if (/already has active orchestration/i.test(reason))
|
|
7
|
+
return "run_not_retryable";
|
|
8
|
+
if (/run is not failed/i.test(reason))
|
|
9
|
+
return "run_not_retryable";
|
|
10
|
+
if (/stage is not failed/i.test(reason))
|
|
11
|
+
return "stage_not_failed";
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
export function mapRetryStageFailure(result) {
|
|
15
|
+
const { ok: _ok, status: _status, reason, ...rest } = result;
|
|
16
|
+
const code = inferRetryStageErrorCode(reason);
|
|
17
|
+
return { error: reason, ...(code ? { code } : {}), ...rest };
|
|
18
|
+
}
|
|
19
|
+
export function mapStartFailure(result) {
|
|
20
|
+
const { ok: _ok, status: _status, reason, ...rest } = result;
|
|
21
|
+
return { error: reason, ...rest };
|
|
22
|
+
}
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { Type } from "typebox";
|
|
13
13
|
import type { StageEnvelope } from "../types/envelope.js";
|
|
14
|
-
import type { ForkEmitContext } from "../types/forkChoice.js";
|
|
14
|
+
import type { CloneEmitContext, ForkEmitContext } from "../types/forkChoice.js";
|
|
15
15
|
export type EmitCapture = {
|
|
16
16
|
envelope?: StageEnvelope;
|
|
17
17
|
error?: string;
|
|
18
18
|
};
|
|
19
|
-
export declare function createEmitStageEnvelopeTool(capture: EmitCapture, payloadSchema?: unknown, forkEmitContext?: ForkEmitContext): {
|
|
19
|
+
export declare function createEmitStageEnvelopeTool(capture: EmitCapture, payloadSchema?: unknown, forkEmitContext?: ForkEmitContext, cloneEmitContext?: CloneEmitContext): {
|
|
20
20
|
name: string;
|
|
21
21
|
label: string;
|
|
22
22
|
description: string;
|
|
@@ -26,6 +26,15 @@ export declare function createEmitStageEnvelopeTool(capture: EmitCapture, payloa
|
|
|
26
26
|
artifacts: Type.TArray<Type.TString>;
|
|
27
27
|
payload: Type.TSchema;
|
|
28
28
|
fork_choice: Type.TArray<Type.TString>;
|
|
29
|
+
clone_forks?: Type.TArray<Type.TObject<{
|
|
30
|
+
successor_id: Type.TString;
|
|
31
|
+
action: Type.TUnion<[Type.TLiteral<"skip">, Type.TLiteral<"once">, Type.TLiteral<"fanout">]>;
|
|
32
|
+
envelope: Type.TOptional<Type.TUnknown>;
|
|
33
|
+
mode: Type.TOptional<Type.TUnion<[Type.TLiteral<"parallel">, Type.TLiteral<"sequential">]>>;
|
|
34
|
+
clones: Type.TOptional<Type.TArray<Type.TObject<{
|
|
35
|
+
envelope: Type.TUnknown;
|
|
36
|
+
}>>>;
|
|
37
|
+
}>> | undefined;
|
|
29
38
|
stage_id: Type.TOptional<Type.TString>;
|
|
30
39
|
notes: Type.TOptional<Type.TString>;
|
|
31
40
|
}>;
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { Type } from "typebox";
|
|
13
13
|
import { assertRequiredEnvelope, isAdvancingEnvelope, } from "../envelope/check.js";
|
|
14
|
+
import { assertCloneForks } from "../envelope/cloneForks.js";
|
|
14
15
|
import { normalizeForkChoice } from "../envelope/forkChoice.js";
|
|
15
16
|
import { assertEnvelopePayload, compilePayloadSchema, } from "../envelope/payloadSchema.js";
|
|
16
17
|
function toolResult(text, details, options) {
|
|
@@ -21,10 +22,23 @@ function toolResult(text, details, options) {
|
|
|
21
22
|
...(options?.terminate ? { terminate: true } : {}),
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
|
-
export function createEmitStageEnvelopeTool(capture, payloadSchema, forkEmitContext) {
|
|
25
|
+
export function createEmitStageEnvelopeTool(capture, payloadSchema, forkEmitContext, cloneEmitContext) {
|
|
25
26
|
const compiledPayload = payloadSchema !== undefined
|
|
26
27
|
? compilePayloadSchema(payloadSchema)
|
|
27
28
|
: undefined;
|
|
29
|
+
const cloneForksSchema = Type.Array(Type.Object({
|
|
30
|
+
successor_id: Type.String(),
|
|
31
|
+
action: Type.Union([
|
|
32
|
+
Type.Literal("skip"),
|
|
33
|
+
Type.Literal("once"),
|
|
34
|
+
Type.Literal("fanout"),
|
|
35
|
+
]),
|
|
36
|
+
envelope: Type.Optional(Type.Unknown()),
|
|
37
|
+
mode: Type.Optional(Type.Union([Type.Literal("parallel"), Type.Literal("sequential")])),
|
|
38
|
+
clones: Type.Optional(Type.Array(Type.Object({
|
|
39
|
+
envelope: Type.Unknown(),
|
|
40
|
+
}))),
|
|
41
|
+
}));
|
|
28
42
|
return {
|
|
29
43
|
name: "emit_stage_envelope",
|
|
30
44
|
label: "Emit stage envelope",
|
|
@@ -39,6 +53,7 @@ export function createEmitStageEnvelopeTool(capture, payloadSchema, forkEmitCont
|
|
|
39
53
|
fork_choice: forkEmitContext !== undefined
|
|
40
54
|
? Type.Array(Type.String())
|
|
41
55
|
: Type.Optional(Type.Array(Type.String())),
|
|
56
|
+
...(cloneEmitContext !== undefined ? { clone_forks: cloneForksSchema } : {}),
|
|
42
57
|
stage_id: Type.Optional(Type.String()),
|
|
43
58
|
notes: Type.Optional(Type.String()),
|
|
44
59
|
}),
|
|
@@ -47,11 +62,12 @@ export function createEmitStageEnvelopeTool(capture, payloadSchema, forkEmitCont
|
|
|
47
62
|
return toolResult("Envelope already accepted; later emits are ignored.", { advancing: isAdvancingEnvelope(capture.envelope), error: "" }, { terminate: true });
|
|
48
63
|
}
|
|
49
64
|
try {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
65
|
+
const record = params;
|
|
66
|
+
if (record.status !== "failure" && forkEmitContext !== undefined) {
|
|
67
|
+
normalizeForkChoice(record.fork_choice, "emit", forkEmitContext);
|
|
68
|
+
}
|
|
69
|
+
if (record.status !== "failure" && cloneEmitContext !== undefined) {
|
|
70
|
+
assertCloneForks(params, cloneEmitContext);
|
|
55
71
|
}
|
|
56
72
|
const envelope = assertRequiredEnvelope(params);
|
|
57
73
|
assertEnvelopePayload(envelope, payloadSchema);
|
package/dist/types/envelope.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CloneForkItem } from "./forkChoice.js";
|
|
1
2
|
export type EnvelopeStatus = "success" | "failure";
|
|
2
3
|
export type StageEnvelope = {
|
|
3
4
|
status: EnvelopeStatus;
|
|
@@ -5,6 +6,7 @@ export type StageEnvelope = {
|
|
|
5
6
|
artifacts: string[];
|
|
6
7
|
payload?: Record<string, unknown>;
|
|
7
8
|
fork_choice?: string[];
|
|
9
|
+
clone_forks?: CloneForkItem[];
|
|
8
10
|
stage_id?: string;
|
|
9
11
|
notes?: string;
|
|
10
12
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { StageEnvelope } from "./envelope.js";
|
|
1
2
|
export type ForkChoiceShape = {
|
|
2
3
|
cardinality: "one" | "subset";
|
|
3
4
|
allowNone: boolean;
|
|
@@ -6,3 +7,24 @@ export type ForkEmitContext = {
|
|
|
6
7
|
immediateSuccessorIds: string[];
|
|
7
8
|
forkShape: ForkChoiceShape | null;
|
|
8
9
|
};
|
|
10
|
+
export type CloneForkItem = {
|
|
11
|
+
successor_id: string;
|
|
12
|
+
action: "skip";
|
|
13
|
+
} | {
|
|
14
|
+
successor_id: string;
|
|
15
|
+
action: "once";
|
|
16
|
+
envelope: StageEnvelope;
|
|
17
|
+
} | {
|
|
18
|
+
successor_id: string;
|
|
19
|
+
action: "fanout";
|
|
20
|
+
mode: "parallel" | "sequential";
|
|
21
|
+
clones: Array<{
|
|
22
|
+
envelope: StageEnvelope;
|
|
23
|
+
}>;
|
|
24
|
+
};
|
|
25
|
+
export type CloneEmitContext = {
|
|
26
|
+
clonableSuccessors: Array<{
|
|
27
|
+
successorId: string;
|
|
28
|
+
cloneCap: number;
|
|
29
|
+
}>;
|
|
30
|
+
};
|
package/dist/types/pipeline.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export type PipelineStageRef = {
|
|
|
14
14
|
select: "one" | "subset";
|
|
15
15
|
allow_none?: boolean;
|
|
16
16
|
};
|
|
17
|
+
clonable?: boolean;
|
|
18
|
+
clone_cap?: number;
|
|
17
19
|
};
|
|
18
20
|
export type PipelineStageYamlEntry = PipelineStageRef & {
|
|
19
21
|
uses?: string;
|
|
@@ -37,6 +39,9 @@ export type NormalizedPipelineStageEntry = {
|
|
|
37
39
|
select: "one" | "subset";
|
|
38
40
|
allow_none?: boolean;
|
|
39
41
|
};
|
|
42
|
+
clonable?: boolean;
|
|
43
|
+
clone_cap?: number;
|
|
44
|
+
skill?: string;
|
|
40
45
|
body: {
|
|
41
46
|
kind: "inline";
|
|
42
47
|
raw: Record<string, unknown>;
|
|
@@ -59,6 +64,9 @@ export type ResolvedPipelineStageNode = {
|
|
|
59
64
|
ancestors: string[];
|
|
60
65
|
stageIndex: number;
|
|
61
66
|
fork?: PipelineForkConfig;
|
|
67
|
+
clonable?: boolean;
|
|
68
|
+
clone_cap?: number;
|
|
69
|
+
definition_id?: string;
|
|
62
70
|
};
|
|
63
71
|
export type ResolvedPipelineDag = {
|
|
64
72
|
nodes: ResolvedPipelineStageNode[];
|