refactor: move broker dto conversions out of wf_sources_mcp

This commit is contained in:
lda
2026-06-08 13:01:47 +07:00 Verified
parent 4d9b785fbd
commit be417e2a44
13 changed files with 802 additions and 167 deletions
+79 -4
View File
@@ -1,6 +1,8 @@
"""Compatibility shim for MCP source registry models.
"""Compatibility and broker conversion helpers for MCP source registry state.
Canonical implementation lives in `wf_sources_mcp.source_registry`.
Canonical registry models and stores live in `wf_sources_mcp.source_registry`.
Helpers that construct `ConnectionConfig` stay here because `ConnectionConfig`
is a broker compatibility DTO.
"""
from __future__ import annotations
@@ -8,19 +10,92 @@ from __future__ import annotations
from wf_sources_mcp.source_registry import (
FileSourceRegistryStore,
HttpSourceTransport,
LegacyConnectionConfigLike,
McpSourceRegistryEntry,
SourceRegistryFile,
SourceRegistryStore,
SourceTransport,
StdioSourceTransport,
connection_config_to_registry_entry,
registry_entry_to_connection_config,
workflow_mcp_source_to_connection_config,
)
from .models import ConnectionConfig
def registry_entry_to_connection_config(
entry: McpSourceRegistryEntry,
) -> ConnectionConfig:
"""Convert a registry entry to a broker connection config."""
return ConnectionConfig(
id=entry.id,
server=entry.provider,
account=entry.account,
enabled=entry.enabled,
metadata={
**entry.metadata,
"auth_ref": entry.auth_ref,
"profile": entry.profile,
"transport": entry.transport.model_dump(mode="json"),
"source_registry": True,
},
)
def workflow_mcp_source_to_connection_config(source: object) -> ConnectionConfig:
"""Convert neutral wf_config MCP source config into a broker connection.
This helper stays in the broker compatibility package because its output is
the temporary `ConnectionConfig` DTO. The input is intentionally typed as
object to avoid making `wf_config` part of this package's import graph.
"""
if getattr(source, "kind", None) != "mcp":
raise ValueError("expected wf_config MCP source")
for field in ("id", "provider", "account", "enabled", "ownership", "transport"):
if getattr(source, field, None) is None:
raise ValueError(f"wf_config MCP source missing required field: {field}")
transport = getattr(source, "transport")
metadata = dict(getattr(source, "metadata", {}))
if transport.kind == "stdio":
metadata.update(
{
"transport": "stdio",
"command": transport.command,
"args": list(transport.args),
"env": dict(transport.env),
"source_registry": False,
}
)
elif transport.kind == "http":
metadata.update(
{
"transport": "streamable_http",
"url": str(transport.url),
"headers": dict(transport.headers),
"source_registry": False,
}
)
else:
raise ValueError(f"unsupported wf_config MCP transport {transport.kind!r}")
profile = getattr(source, "profile", None)
if profile is not None:
metadata["profile"] = profile
auth_ref = getattr(source, "auth_ref", None)
if auth_ref is not None:
metadata["auth_ref"] = auth_ref
return ConnectionConfig(
id=getattr(source, "id"),
server=getattr(source, "provider"),
account=getattr(source, "account"),
enabled=getattr(source, "enabled"),
metadata=metadata,
source_config_ownership=getattr(source, "ownership"),
)
__all__ = [
"FileSourceRegistryStore",
"HttpSourceTransport",
"LegacyConnectionConfigLike",
"McpSourceRegistryEntry",
"SourceRegistryFile",
"SourceRegistryStore",