From 89cf8ff7a7080de5dc86ef60169f666df3e4d1ab Mon Sep 17 00:00:00 2001 From: Ling Test Date: Sun, 1 Nov 2026 14:09:21 +0800 Subject: [PATCH 1/2] fix(workflows): return typed task admission responses --- packages/daemon/src/features/channels/workflows.ts | 4 ++++ packages/daemon/test/channel-workspace.test.mjs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/daemon/src/features/channels/workflows.ts b/packages/daemon/src/features/channels/workflows.ts index d6a13bdd2..ed8ccd747 100644 --- a/packages/daemon/src/features/channels/workflows.ts +++ b/packages/daemon/src/features/channels/workflows.ts @@ -629,6 +629,8 @@ async function handleChannelWorkflowStepStart( const started = await prepareWorkflowStepStart(store, workflowStepId, input, cwd, validateRunRequest, secretResolver); if (started.kind === "blocked") { writeJson(response, 200, { + status: "blocked", + mode: input.mode, workflow: store.getChannelWorkflow(started.workflowId), workflowStep: store.getChannelWorkflowStep(workflowStepId), blocker: started.blocker, @@ -651,6 +653,8 @@ async function handleChannelWorkflowStepStart( } completeWorkflowIfStepsFinished(store, started.workflowId, finishedAt); writeJson(response, 200, { + status: "started", + mode: "create_task", workflow: store.getChannelWorkflow(started.workflowId), workflowStep: store.getChannelWorkflowStep(workflowStepId), task: started.task, diff --git a/packages/daemon/test/channel-workspace.test.mjs b/packages/daemon/test/channel-workspace.test.mjs index c829e50da..ddc421a42 100644 --- a/packages/daemon/test/channel-workspace.test.mjs +++ b/packages/daemon/test/channel-workspace.test.mjs @@ -9351,6 +9351,8 @@ test("channel handoff workflows start steps, create tasks, and expose blockers", mode: "create_task", taskTitle: "Workflow generated task", }); + assert.equal(started.status, "started"); + assert.equal(started.mode, "create_task"); assert.equal(started.workflow.status, "succeeded"); assert.equal(started.workflowStep.status, "succeeded"); assert.equal(started.task.title, "Workflow generated task"); @@ -9379,6 +9381,8 @@ test("channel handoff workflows start steps, create tasks, and expose blockers", const blocked = await postJson(`${daemon.url}/workflow-steps/${encodeURIComponent(blockedWorkflow.workflowStep.id)}/start?cwd=${encodeURIComponent(cwd)}`, { mode: "create_and_run_task", }); + assert.equal(blocked.status, "blocked"); + assert.equal(blocked.mode, "create_and_run_task"); assert.equal(blocked.workflowStep.status, "blocked"); assert.match(blocked.blocker, /provider preset/i); From 1c83cbdc80cc5b3a11e6b1a64ab8a2bac44d0bae Mon Sep 17 00:00:00 2001 From: Ling Test Date: Sun, 1 Nov 2026 17:12:35 +0800 Subject: [PATCH 2/2] fix(contracts): type workflow admission discriminators --- packages/contracts/src/workflows.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/contracts/src/workflows.ts b/packages/contracts/src/workflows.ts index 2e6ba8686..0ac459145 100644 --- a/packages/contracts/src/workflows.ts +++ b/packages/contracts/src/workflows.ts @@ -1396,6 +1396,8 @@ export interface ChannelWorkflowStepMutationResponse { } export interface ChannelWorkflowStepStartResponse { + readonly status: "started" | "blocked"; + readonly mode: ChannelWorkflowStepStartMode; readonly workflowStep: ChannelWorkflowStep; readonly workflow?: ChannelWorkflow; readonly task?: Task;