patch draft common wrappers
This commit is contained in:
@@ -46,6 +46,10 @@ _SEARCH_ALWAYS_VISIBLE_TOOL_NAMES = [
|
||||
"wf.workflow.get_draft_workspace",
|
||||
"wf.workflow.delete_draft_workspace",
|
||||
"wf.workflow.patch_draft_workspace",
|
||||
"wf.workflow.set_draft_name",
|
||||
"wf.workflow.set_draft_route",
|
||||
"wf.workflow.set_step_input_map",
|
||||
"wf.workflow.set_step_output_map",
|
||||
"wf.workflow.create_minimal_draft_workspace",
|
||||
"wf.workflow.create_artifact_from_workspace",
|
||||
"wf.workflow.call_capability",
|
||||
|
||||
@@ -433,6 +433,83 @@ class WorkflowSurfaceHandlers:
|
||||
patch=patch,
|
||||
)
|
||||
|
||||
async def set_draft_name(
|
||||
self,
|
||||
*,
|
||||
workspace_id: str,
|
||||
revision: int,
|
||||
name: str,
|
||||
) -> dict[str, Any]:
|
||||
return await self.patch_draft_workspace(
|
||||
workspace_id=workspace_id,
|
||||
revision=revision,
|
||||
patch=[{"op": "replace", "path": "/name", "value": name}],
|
||||
)
|
||||
|
||||
async def set_draft_route(
|
||||
self,
|
||||
*,
|
||||
workspace_id: str,
|
||||
revision: int,
|
||||
step_id: str,
|
||||
outcome: str,
|
||||
target: str,
|
||||
) -> dict[str, Any]:
|
||||
return await self.patch_draft_workspace(
|
||||
workspace_id=workspace_id,
|
||||
revision=revision,
|
||||
patch=[
|
||||
{
|
||||
"op": "add",
|
||||
"path": (
|
||||
f"/routes/{_escape_json_pointer(step_id)}/"
|
||||
f"{_escape_json_pointer(outcome)}"
|
||||
),
|
||||
"value": target,
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
async def set_step_input_map(
|
||||
self,
|
||||
*,
|
||||
workspace_id: str,
|
||||
revision: int,
|
||||
step_id: str,
|
||||
input_map: dict[str, str],
|
||||
) -> dict[str, Any]:
|
||||
return await self.patch_draft_workspace(
|
||||
workspace_id=workspace_id,
|
||||
revision=revision,
|
||||
patch=[
|
||||
{
|
||||
"op": "replace",
|
||||
"path": f"/steps/{_escape_json_pointer(step_id)}/in",
|
||||
"value": input_map,
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
async def set_step_output_map(
|
||||
self,
|
||||
*,
|
||||
workspace_id: str,
|
||||
revision: int,
|
||||
step_id: str,
|
||||
output_map: dict[str, str],
|
||||
) -> dict[str, Any]:
|
||||
return await self.patch_draft_workspace(
|
||||
workspace_id=workspace_id,
|
||||
revision=revision,
|
||||
patch=[
|
||||
{
|
||||
"op": "replace",
|
||||
"path": f"/steps/{_escape_json_pointer(step_id)}/out",
|
||||
"value": output_map,
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
async def create_minimal_draft_workspace(
|
||||
self,
|
||||
*,
|
||||
@@ -759,6 +836,11 @@ def _first_state_path(output_map: dict[str, str]) -> str | None:
|
||||
return None
|
||||
|
||||
|
||||
def _escape_json_pointer(value: str) -> str:
|
||||
"""Escape one JSON Pointer path segment for generated JSON Patch helpers."""
|
||||
return value.replace("~", "~0").replace("/", "~1")
|
||||
|
||||
|
||||
def _source_id_for_capability(
|
||||
sources: dict[str, CapabilitySource],
|
||||
qualified_name: str,
|
||||
|
||||
@@ -115,6 +115,42 @@ class PatchDraftWorkspaceRequest(BaseModel):
|
||||
patch: JsonPatchOperations
|
||||
|
||||
|
||||
class SetDraftNameRequest(BaseModel):
|
||||
"""Typed MCP request for changing the workflow draft name."""
|
||||
|
||||
workspace_id: WorkspaceId
|
||||
revision: int = Field(ge=1, description="Expected current workspace revision.")
|
||||
name: str = Field(description="New workflow draft name.")
|
||||
|
||||
|
||||
class SetDraftRouteRequest(BaseModel):
|
||||
"""Typed MCP request for setting one outcome route on one 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 edited.")
|
||||
outcome: str = Field(description="Outcome label to route, for example ok or error.")
|
||||
target: str = Field(description="Target step id or __end__.")
|
||||
|
||||
|
||||
class SetStepInputMapRequest(BaseModel):
|
||||
"""Typed MCP request for replacing one step input map."""
|
||||
|
||||
workspace_id: WorkspaceId
|
||||
revision: int = Field(ge=1, description="Expected current workspace revision.")
|
||||
step_id: str = Field(description="Draft step id whose input map should change.")
|
||||
input_map: DraftPathMap
|
||||
|
||||
|
||||
class SetStepOutputMapRequest(BaseModel):
|
||||
"""Typed MCP request for replacing one step output map."""
|
||||
|
||||
workspace_id: WorkspaceId
|
||||
revision: int = Field(ge=1, description="Expected current workspace revision.")
|
||||
step_id: str = Field(description="Draft step id whose output map should change.")
|
||||
output_map: DraftPathMap
|
||||
|
||||
|
||||
class DeleteDraftWorkspaceRequest(BaseModel):
|
||||
"""Typed MCP request payload for deleting one draft workspace."""
|
||||
|
||||
|
||||
@@ -19,6 +19,10 @@ from .models import (
|
||||
DraftWorkspaceListResult,
|
||||
DraftWorkspaceResult,
|
||||
PatchDraftWorkspaceRequest,
|
||||
SetDraftNameRequest,
|
||||
SetDraftRouteRequest,
|
||||
SetStepInputMapRequest,
|
||||
SetStepOutputMapRequest,
|
||||
)
|
||||
|
||||
|
||||
@@ -273,6 +277,70 @@ def register_workflow_tools(server: FastMCP[Any], service: WfMcpService) -> None
|
||||
)
|
||||
)
|
||||
|
||||
@server.tool(
|
||||
name="wf.workflow.set_draft_name",
|
||||
title="Set Draft Name",
|
||||
description="Replace the name field of a stored draft workspace.",
|
||||
)
|
||||
async def set_draft_name(request: SetDraftNameRequest) -> DraftWorkspaceResult:
|
||||
return DraftWorkspaceResult.model_validate(
|
||||
await handlers.set_draft_name(
|
||||
workspace_id=request.workspace_id,
|
||||
revision=request.revision,
|
||||
name=request.name,
|
||||
)
|
||||
)
|
||||
|
||||
@server.tool(
|
||||
name="wf.workflow.set_draft_route",
|
||||
title="Set Draft Route",
|
||||
description="Set one outcome route on one step in a draft workspace.",
|
||||
)
|
||||
async def set_draft_route(request: SetDraftRouteRequest) -> DraftWorkspaceResult:
|
||||
return DraftWorkspaceResult.model_validate(
|
||||
await handlers.set_draft_route(
|
||||
workspace_id=request.workspace_id,
|
||||
revision=request.revision,
|
||||
step_id=request.step_id,
|
||||
outcome=request.outcome,
|
||||
target=request.target,
|
||||
)
|
||||
)
|
||||
|
||||
@server.tool(
|
||||
name="wf.workflow.set_step_input_map",
|
||||
title="Set Step Input Map",
|
||||
description="Replace one step input map in a draft workspace.",
|
||||
)
|
||||
async def set_step_input_map(
|
||||
request: SetStepInputMapRequest,
|
||||
) -> DraftWorkspaceResult:
|
||||
return DraftWorkspaceResult.model_validate(
|
||||
await handlers.set_step_input_map(
|
||||
workspace_id=request.workspace_id,
|
||||
revision=request.revision,
|
||||
step_id=request.step_id,
|
||||
input_map=request.input_map,
|
||||
)
|
||||
)
|
||||
|
||||
@server.tool(
|
||||
name="wf.workflow.set_step_output_map",
|
||||
title="Set Step Output Map",
|
||||
description="Replace one step output map in a draft workspace.",
|
||||
)
|
||||
async def set_step_output_map(
|
||||
request: SetStepOutputMapRequest,
|
||||
) -> DraftWorkspaceResult:
|
||||
return DraftWorkspaceResult.model_validate(
|
||||
await handlers.set_step_output_map(
|
||||
workspace_id=request.workspace_id,
|
||||
revision=request.revision,
|
||||
step_id=request.step_id,
|
||||
output_map=request.output_map,
|
||||
)
|
||||
)
|
||||
|
||||
@server.tool(
|
||||
name="wf.workflow.create_minimal_draft_workspace",
|
||||
title="Create Minimal Draft Workspace",
|
||||
|
||||
Reference in New Issue
Block a user