feat: authorize workflow contract authoring

This commit is contained in:
lda
2026-08-14 17:43:14 +07:00 Verified
parent bc23a722c3
commit bd226a2fa7
20 changed files with 1506 additions and 14 deletions
@@ -306,6 +306,52 @@ describe("run operation registry", () => {
},
},
},
{
method: "workflow.draft_workspaces.set_contract" as const,
params: {
workspace_id: "console.demo",
revision: 5,
outcomes: ["ok", "error"],
},
cli: "uv run wf draft set-contract console.demo --revision 5 --outcome ok --outcome error",
result: {
workspace_id: "console.demo",
revision: 6,
title: "Console demo",
status: "valid" as const,
diagnostics: [],
summary: {
name: "console.demo",
start: "echo",
step_count: 1,
route_count: 1,
steps: ["echo"],
},
},
},
{
method: "workflow.draft_workspaces.set_start" as const,
params: {
workspace_id: "console.demo",
revision: 6,
step_id: "echo",
},
cli: "uv run wf draft set-start console.demo --revision 6 --step echo",
result: {
workspace_id: "console.demo",
revision: 7,
title: "Console demo",
status: "valid" as const,
diagnostics: [],
summary: {
name: "console.demo",
start: "echo",
step_count: 1,
route_count: 1,
steps: ["echo"],
},
},
},
{
method: "workflow.draft_workspaces.set_step_input_bindings" as const,
params: {
@@ -367,6 +413,32 @@ describe("run operation registry", () => {
},
},
},
{
method: "workflow.draft_workspaces.set_workflow_output_bindings" as const,
params: {
workspace_id: "console.demo",
revision: 7,
bindings: [
{ path: "state.report", target: "report" },
{ target: "format", value: "markdown" },
],
},
cli: "uv run wf draft set-workflow-output console.demo --revision 7 --map state.report=report --value 'format=\"markdown\"'",
result: {
workspace_id: "console.demo",
revision: 8,
title: "Console demo",
status: "valid" as const,
diagnostics: [],
summary: {
name: "console.demo",
start: "echo",
step_count: 1,
route_count: 1,
steps: ["echo"],
},
},
},
{
method: "workflow.draft_workspaces.validate" as const,
params: { workspace_id: "console.demo" },
@@ -522,6 +594,44 @@ describe("run operation registry", () => {
);
});
it("registers authoring inspection as a read operation", async () => {
const { getOperationMeta } = await import("./method-registry.js");
const operation = getOperationMeta(
"workflow.draft_workspaces.inspect_authoring_contract",
);
if (operation === undefined) throw new Error("missing authoring inspection");
expect(operation.idempotency).toBe("read");
expect(
operation.equivalentCli({
workspace_id: "console.demo",
revision: 8,
selected_step_id: "render",
}),
).toBe(
"uv run wf draft inspect console.demo --include-draft [non-equivalent: unavailable CLI representation for revision, selected_step_id]",
);
expect(
operation.interpret({
workspace_id: "console.demo",
revision: 8,
selected_step_id: null,
readable_sources: [],
step_input_targets: [],
step_output_sources: [],
state_targets: [],
workflow_output_targets: [],
entry_steps: [],
workflow_outcomes: ["ok"],
warnings: [],
}),
).toMatchObject({
workspaceId: "console.demo",
selectedStepId: null,
workflowOutcomes: ["ok"],
});
});
it("does not flatten composite bindings into a fake inline CLI value", async () => {
const { getOperationMeta } = await import("./method-registry.js");
const operation = getOperationMeta(