feat: add workflow console lifecycle explorer

This commit is contained in:
lda
2026-07-02 21:43:04 +07:00 Verified
parent 2cae5b59eb
commit 3cdcf6ff3b
31 changed files with 4457 additions and 12 deletions
+253
View File
@@ -3,6 +3,21 @@ import {
WorkflowHealthResultSchema,
WorkflowSourcesListPayloadSchema,
WorkflowSourcesListResultSchema,
WorkflowArtifactsListPayloadSchema,
WorkflowArtifactsListResultSchema,
WorkflowArtifactsInspectPayloadSchema,
WorkflowArtifactsInspectResultSchema,
WorkflowDeploymentsListResultSchema,
WorkflowDeploymentsInspectPayloadSchema,
WorkflowDeploymentsInspectResultSchema,
WorkflowDeploymentsValidatePayloadSchema,
WorkflowDeploymentsValidateResultSchema,
WorkflowRunsListPayloadSchema,
WorkflowRunsListResultSchema,
WorkflowRunsInspectPayloadSchema,
WorkflowRunsInspectResultSchema,
WorkflowRunsTracePayloadSchema,
WorkflowRunsTraceResultSchema,
} from "./rpcs.js";
export type OperationMeta = {
@@ -87,6 +102,244 @@ const operationEntries: ReadonlyArray<OperationMeta> = [
};
},
},
{
method: "workflow.artifacts.list",
label: "List artifacts",
explanation: "List workflow artifacts with pagination",
idempotency: "read",
equivalentCli: (params) => {
const p = Schema.decodeUnknownSync(WorkflowArtifactsListPayloadSchema)(
params,
{ onExcessProperty: "error" },
);
const parts = ["uv run wf artifact list"];
if (p.limit != null) parts.push(`--limit ${p.limit}`);
return parts.join(" ");
},
interpret: (result) => {
const decoded = Schema.decodeUnknownSync(
WorkflowArtifactsListResultSchema,
)(result);
return {
items: decoded.nodes.map((node) => ({
key: `${node.artifact_id}@${node.version}`,
artifactId: node.artifact_id,
version: node.version,
kind: node.kind,
displayName: node.display_name,
description: node.description,
outcomes: node.outcomes,
requiredSources: node.required_sources,
diagnosticCount: node.diagnostics.length,
})),
nextCursor: decoded.next_cursor,
total: decoded.total,
};
},
},
{
method: "workflow.artifacts.inspect",
label: "Inspect artifact",
explanation: "Inspect a workflow artifact by id and version",
idempotency: "read",
equivalentCli: (params) => {
const p = Schema.decodeUnknownSync(WorkflowArtifactsInspectPayloadSchema)(
params,
{ onExcessProperty: "error" },
);
return `uv run wf artifact inspect ${p.artifact_id} --version ${p.version}`;
},
interpret: (result) => {
const decoded = Schema.decodeUnknownSync(
WorkflowArtifactsInspectResultSchema,
)(result);
return {
artifactId: decoded.id,
version: decoded.version,
title: decoded.title,
kind: decoded.kind,
description: decoded.description,
outcomes: decoded.outcomes,
plan: decoded.plan,
requiredCapabilities: decoded.required_capabilities,
workflowDependencies: decoded.workflow_dependencies,
createdFromCatalogVersion: decoded.created_from_catalog_version,
};
},
},
{
method: "workflow.deployments.list",
label: "List deployments",
explanation: "List workflow deployments",
idempotency: "read",
equivalentCli: () => "uv run wf deploy list",
interpret: (result) => {
const decoded = Schema.decodeUnknownSync(
WorkflowDeploymentsListResultSchema,
)(result);
return {
items: decoded.deployments.map((d) => ({
id: d.id,
artifactId: d.artifact_id,
artifactVersion: d.artifact_version,
bindingCount: d.binding_count,
driftPolicy: d.drift_policy,
})),
};
},
},
{
method: "workflow.deployments.inspect",
label: "Inspect deployment",
explanation: "Inspect a workflow deployment by id",
idempotency: "read",
equivalentCli: (params) => {
const p = Schema.decodeUnknownSync(
WorkflowDeploymentsInspectPayloadSchema,
)(params, { onExcessProperty: "error" });
return `uv run wf deploy inspect ${p.deployment_id}`;
},
interpret: (result) => {
const decoded = Schema.decodeUnknownSync(
WorkflowDeploymentsInspectResultSchema,
)(result);
return {
id: decoded.id,
artifactId: decoded.artifact_id,
artifactVersion: decoded.artifact_version,
bindings: decoded.bindings.map((b) => ({
logicalSource: b.logical_source,
concreteSource: b.concrete_source,
})),
driftPolicy: decoded.drift_policy,
};
},
},
{
method: "workflow.deployments.validate",
label: "Validate deployment",
explanation: "Validate a workflow deployment",
idempotency: "read",
equivalentCli: (params) => {
const p = Schema.decodeUnknownSync(
WorkflowDeploymentsValidatePayloadSchema,
)(params, { onExcessProperty: "error" });
return `uv run wf deploy validate ${p.deployment_id}`;
},
interpret: (result) => {
const decoded = Schema.decodeUnknownSync(
WorkflowDeploymentsValidateResultSchema,
)(result);
return {
deploymentId: decoded.deployment_id,
artifactId: decoded.artifact_id,
artifactVersion: decoded.artifact_version,
status: decoded.status,
diagnostics: decoded.diagnostics,
nextActions: decoded.next_actions,
};
},
},
{
method: "workflow.runs.list",
label: "List runs",
explanation: "List workflow runs with pagination",
idempotency: "read",
equivalentCli: (params) => {
const p = Schema.decodeUnknownSync(WorkflowRunsListPayloadSchema)(
params,
{ onExcessProperty: "error" },
);
const parts = ["uv run wf run list"];
if (p.limit != null) parts.push(`--limit ${p.limit}`);
return parts.join(" ");
},
interpret: (result) => {
const decoded = Schema.decodeUnknownSync(WorkflowRunsListResultSchema)(
result,
);
return {
items: decoded.runs.map((run) => ({
runId: run.run_id,
deploymentId: run.deployment_id,
artifactId: run.artifact_id,
artifactVersion: run.artifact_version,
status: run.status,
resumeReadiness: run.resume_readiness,
diagnosticCount: run.diagnostic_count,
createdAt: run.created_at,
updatedAt: run.updated_at,
})),
nextCursor: decoded.next_cursor,
total: decoded.total,
};
},
},
{
method: "workflow.runs.inspect",
label: "Inspect run",
explanation: "Inspect a workflow run by id",
idempotency: "read",
equivalentCli: (params) => {
const p = Schema.decodeUnknownSync(WorkflowRunsInspectPayloadSchema)(
params,
{ onExcessProperty: "error" },
);
return `uv run wf run inspect ${p.run_id}`;
},
interpret: (result) => {
const decoded = Schema.decodeUnknownSync(WorkflowRunsInspectResultSchema)(
result,
);
return {
runId: decoded.run_id,
deploymentId: decoded.deployment_id,
artifactId: decoded.artifact_id,
artifactVersion: decoded.artifact_version,
status: decoded.status,
resumeReadiness: decoded.resume_readiness,
interrupt: decoded.interrupt,
outcome: decoded.outcome,
error: decoded.error,
output: decoded.output,
diagnostics: decoded.diagnostics,
traceCount: decoded.trace_count,
nextActions: decoded.next_actions,
};
},
},
{
method: "workflow.runs.trace",
label: "Read run trace",
explanation: "Read trace frames for a workflow run",
idempotency: "read",
equivalentCli: (params) => {
const p = Schema.decodeUnknownSync(WorkflowRunsTracePayloadSchema)(
params,
{ onExcessProperty: "error" },
);
return `uv run wf run trace ${p.run_id} --from ${p.trace_range.start} --limit ${p.trace_range.limit}`;
},
interpret: (result) => {
const r = result as Record<string, unknown>;
const trace = (r.trace as ReadonlyArray<Record<string, unknown>> ?? []).map((entry) => ({
nodeId: entry.node_id,
stepType: entry.step_type,
outcome: entry.outcome,
resolvedInput: entry.resolved_input,
output: entry.output,
stateChanges: entry.state_changes,
}));
return {
runId: r.run_id,
status: r.status,
trace,
traceStart: r.trace_start,
traceLimit: r.trace_limit,
traceTruncated: r.trace_truncated,
};
},
},
];
const registry: ReadonlyMap<string, OperationMeta> = new Map(