draft -> wrapper

This commit is contained in:
lda
2026-05-19 06:59:25 +07:00 Verified
parent 6ad3d20975
commit 01897cc21b
10 changed files with 293 additions and 16 deletions
+88 -6
View File
@@ -111,6 +111,34 @@ def test_workflow_surface_filters_capabilities_by_source() -> None:
assert payload["capabilities"][0]["source_id"] == "wf.mcp"
def test_workflow_surface_lists_saved_wrapper_capabilities() -> None:
artifact_store = FileWorkflowArtifactStore(
local_temp_root() / "surface_wrapper_caps"
)
artifact_store.save_artifact(
_echo_artifact().model_copy(
update={
"id": "echo_wrapper",
"kind": "wrapper",
"description": "Reusable echo wrapper.",
}
)
)
artifact_store.save_artifact(_echo_artifact())
handlers = _handlers(artifact_store)
payload = asyncio.run(
handlers.list_capabilities(source_id="workflow", query="echo")
)
names = [capability["name"] for capability in payload["capabilities"]]
assert names == ["workflow.echo_wrapper.v1"]
assert payload["capabilities"][0]["source_id"] == "workflow"
assert payload["capabilities"][0]["outcomes"] == ["completed"]
assert payload["capabilities"][0]["input_fields"] == ["text"]
assert payload["capabilities"][0]["output_fields"] == ["echoed"]
def test_workflow_surface_inspects_one_capability() -> None:
handlers = _handlers(
FileWorkflowArtifactStore(local_temp_root() / "surface_inspect_cap")
@@ -125,6 +153,27 @@ def test_workflow_surface_inspects_one_capability() -> None:
assert "input_schema" in payload
def test_workflow_surface_inspects_saved_wrapper_capability() -> None:
artifact_store = FileWorkflowArtifactStore(
local_temp_root() / "surface_inspect_wrapper_cap"
)
artifact_store.save_artifact(
_echo_artifact().model_copy(update={"id": "echo_wrapper", "kind": "wrapper"})
)
handlers = _handlers(artifact_store)
payload = asyncio.run(
handlers.inspect_capability(qualified_name="workflow.echo_wrapper.v1")
)
assert payload["name"] == "workflow.echo_wrapper.v1"
assert payload["source_id"] == "workflow"
assert payload["kind"] == "wrapper_artifact"
assert payload["artifact_id"] == "echo_wrapper"
assert payload["outcomes"] == ["completed"]
assert "input_schema" in payload
def test_workflow_surface_validates_deployment_dependencies() -> None:
artifact_store = FileWorkflowArtifactStore(local_temp_root() / "surface_validate")
artifact_store.save_artifact(_artifact())
@@ -419,9 +468,7 @@ def test_workflow_surface_deletes_draft_workspace() -> None:
)
)
deleted = asyncio.run(
handlers.delete_draft_workspace(workspace_id="echo_draft")
)
deleted = asyncio.run(handlers.delete_draft_workspace(workspace_id="echo_draft"))
deleted_again = asyncio.run(
handlers.delete_draft_workspace(workspace_id="echo_draft")
)
@@ -514,9 +561,7 @@ def test_workflow_surface_validates_draft_workspace_with_live_outcomes() -> None
)
)
payload = asyncio.run(
handlers.validate_draft_workspace(workspace_id="echo_draft")
)
payload = asyncio.run(handlers.validate_draft_workspace(workspace_id="echo_draft"))
fetched = asyncio.run(handlers.get_draft_workspace(workspace_id="echo_draft"))
assert payload["revision"] == 1
@@ -629,6 +674,43 @@ def test_workflow_surface_creates_artifact_from_workspace() -> None:
assert artifact.id == "workspace_echo"
def test_workflow_surface_creates_wrapper_from_workspace() -> None:
artifact_store = FileWorkflowArtifactStore(
local_temp_root() / "surface_workspace_wrapper"
)
service = WfMcpService(
store=FileStore(local_temp_root() / "surface_workspace_wrapper_mcp"),
artifact_store=artifact_store,
)
service.register_connection(
ConnectionConfig(id="demo.personal", server="demo", account="personal")
)
service.register_specs("demo.personal", echo_tool)
handlers = WorkflowSurfaceHandlers(service)
asyncio.run(
handlers.create_draft_workspace(
workspace_id="echo_draft",
draft=_echo_draft(),
)
)
result = asyncio.run(
handlers.create_wrapper_from_workspace(
workspace_id="echo_draft",
artifact_id="workspace_echo_wrapper",
version=1,
title="Workspace Echo Wrapper",
outcomes=("completed",),
source_bindings={"demo": "demo.personal"},
)
)
artifact = artifact_store.get_artifact("workspace_echo_wrapper", 1)
assert result["saved"] is True
assert artifact.kind == "wrapper"
assert artifact.plan["nodes"][0]["node"] == "demo.echo_tool"
def test_raw_workflow_plan_uses_core_step_and_edge_models() -> None:
plan = RawWorkflowPlan.model_validate(_echo_artifact().plan)