feat: add focused draft remove commands

This commit is contained in:
lda
2026-06-28 18:15:54 +07:00 Verified
parent 10d6314882
commit 270e646bbb
22 changed files with 1870 additions and 0 deletions
+33
View File
@@ -286,6 +286,39 @@ class AddStepFromCapabilityRequest(BaseModel):
)
class RemoveDraftRouteRequest(BaseModel):
"""Typed MCP request for removing one route from a draft step."""
workspace_id: WorkspaceId
revision: int = Field(ge=1, description="Expected current workspace revision.")
step_id: str = Field(description="Draft step id whose route should be removed.")
outcome: str = Field(description="Outcome label to remove from the step route map.")
class RemoveDraftStepRequest(BaseModel):
"""Typed MCP request for removing a draft step and its outgoing routes."""
workspace_id: WorkspaceId
revision: int = Field(ge=1, description="Expected current workspace revision.")
step_id: str = Field(description="Draft step id to remove.")
class RemoveDraftBindingRequest(BaseModel):
"""Typed MCP request for removing input/output bindings from a draft step."""
workspace_id: WorkspaceId
revision: int = Field(ge=1, description="Expected current workspace revision.")
step_id: str = Field(description="Draft step id whose bindings should be removed.")
inputs: list[str] = Field(
default_factory=list,
description="Local input target names to remove.",
)
outputs: list[str] = Field(
default_factory=list,
description="Local output source names to remove.",
)
class BranchDraftRequest(BaseModel):
"""Typed MCP request for branching routes on a draft step."""
+64
View File
@@ -29,6 +29,9 @@ from .models import (
DraftWorkspaceResult,
HandleDraftRequest,
PatchDraftWorkspaceRequest,
RemoveDraftBindingRequest,
RemoveDraftRouteRequest,
RemoveDraftStepRequest,
RunDeploymentResult,
SetDraftNameRequest,
SetDraftRouteRequest,
@@ -543,6 +546,67 @@ def register_workflow_tools(server: FastMCP[Any], service: WfMcpService) -> None
)
)
@server.tool(
name="wf.workflow.remove_draft_route",
title="Remove Draft Route",
description=(
"Remove one route from a draft step. Missing routes are safe no-ops. "
"Removal may return status: invalid; validate after cleanup."
),
)
async def remove_draft_route(
request: RemoveDraftRouteRequest,
) -> DraftWorkspaceResult:
return DraftWorkspaceResult.model_validate(
await handlers.remove_draft_route(
workspace_id=request.workspace_id,
revision=request.revision,
step_id=request.step_id,
outcome=request.outcome,
)
)
@server.tool(
name="wf.workflow.remove_draft_step",
title="Remove Draft Step",
description=(
"Remove a step and its outgoing route map from a draft workspace. "
"Inbound routes remain explicit. Use remove_draft_route to clean them up."
),
)
async def remove_draft_step(
request: RemoveDraftStepRequest,
) -> DraftWorkspaceResult:
return DraftWorkspaceResult.model_validate(
await handlers.remove_draft_step(
workspace_id=request.workspace_id,
revision=request.revision,
step_id=request.step_id,
)
)
@server.tool(
name="wf.workflow.remove_draft_binding",
title="Remove Draft Binding",
description=(
"Remove selected input/output bindings from one draft step. "
"Pass inputs and/or outputs lists to identify bindings by target/source name. "
"Removal may return status: invalid; validate after cleanup."
),
)
async def remove_draft_binding(
request: RemoveDraftBindingRequest,
) -> DraftWorkspaceResult:
return DraftWorkspaceResult.model_validate(
await handlers.remove_draft_binding(
workspace_id=request.workspace_id,
revision=request.revision,
step_id=request.step_id,
inputs=request.inputs,
outputs=request.outputs,
)
)
@server.tool(
name="wf.workflow.create_minimal_draft_workspace",
title="Create Minimal Draft Workspace",