move types to new package

This commit is contained in:
lda
2026-05-18 02:04:47 +07:00 Verified
parent 293cc69922
commit ef1e35e1a8
10 changed files with 121 additions and 112 deletions
+1 -2
View File
@@ -2,14 +2,13 @@ from __future__ import annotations
from dataclasses import dataclass
from .service.capability_sources import (
from wf_platform import (
CapabilityBuckets,
CapabilitySource,
SourcePermissions,
SourceVisibility,
)
ADMIN_SOURCE_ID = "wf.admin"
+4 -4
View File
@@ -4,7 +4,6 @@ from typing import TYPE_CHECKING, Any, Protocol
from pydantic import BaseModel, Field
from wf_core.runtime.ops.merges import DEFAULT_REDUCER_DEFINITIONS
from wf_authoring import (
NodeReturn,
NodeSpec,
@@ -19,21 +18,22 @@ from wf_authoring import (
last_item_or_none,
length,
node,
pick_path,
pick_key,
pick_path,
project_fields,
rename_fields,
runtime_error,
truthy,
)
from wf_core.runtime.ops.merges import DEFAULT_REDUCER_DEFINITIONS
from .capability_sources import (
from wf_platform import (
CapabilityBuckets,
CapabilitySource,
SourcePermissions,
SourceVisibility,
)
from .specs import qualify_spec
from wf_mcp.broker.service.specs import qualify_spec
if TYPE_CHECKING:
from wf_core import ReducerSpec
@@ -1,83 +1 @@
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Literal
from wf_authoring import NodeSpec
from wf_core import ReducerSpec
from wf_core.runtime.ops.merges import ReducerDefinition
SourceKind = Literal["system", "connection"]
@dataclass(frozen=True, slots=True)
class SourceVisibility:
planner: bool = False
mcp_client: bool = False
admin_dashboard: bool = True
@dataclass(frozen=True, slots=True)
class SourcePermissions:
safe_for_workflow: bool = False
calls_upstream: bool = False
mutates_config: bool = False
mutates_auth: bool = False
@dataclass(slots=True)
class CapabilityBuckets:
tools: dict[str, Any] = field(default_factory=dict)
node_specs: dict[str, NodeSpec[Any, Any]] = field(default_factory=dict)
reducers: dict[str, ReducerSpec] = field(default_factory=dict)
reducer_definitions: dict[str, ReducerDefinition] = field(default_factory=dict)
prompts: dict[str, Any] = field(default_factory=dict)
resources: dict[str, Any] = field(default_factory=dict)
@dataclass(slots=True)
class CapabilitySource:
id: str
kind: SourceKind
capabilities: CapabilityBuckets = field(default_factory=CapabilityBuckets)
enabled: bool = True
visibility: SourceVisibility = field(default_factory=SourceVisibility)
permissions: SourcePermissions = field(default_factory=SourcePermissions)
description: str | None = None
def as_status(self) -> dict[str, Any]:
return {
"id": self.id,
"kind": self.kind,
"enabled": self.enabled,
"visibility": {
"planner": self.visibility.planner,
"mcp_client": self.visibility.mcp_client,
"admin_dashboard": self.visibility.admin_dashboard,
},
"permissions": {
"safe_for_workflow": self.permissions.safe_for_workflow,
"calls_upstream": self.permissions.calls_upstream,
"mutates_config": self.permissions.mutates_config,
"mutates_auth": self.permissions.mutates_auth,
},
"description": self.description,
"tool_count": len(self.capabilities.tools),
"node_spec_count": len(self.capabilities.node_specs),
"reducer_count": len(self.capabilities.reducers),
"prompt_count": len(self.capabilities.prompts),
"resource_count": len(self.capabilities.resources),
}
def as_inventory(self) -> dict[str, Any]:
"""Return source metadata plus the capability names it owns."""
return {
**self.as_status(),
"capabilities": {
"tools": sorted(self.capabilities.tools),
"node_specs": sorted(self.capabilities.node_specs),
"reducers": sorted(self.capabilities.reducers),
"prompts": sorted(self.capabilities.prompts),
"resources": sorted(self.capabilities.resources),
},
}
+9 -9
View File
@@ -7,17 +7,23 @@ from typing import Any
from pydantic import BaseModel
from wf_authoring import NodeReturn, NodeSpec
from wf_artifacts import (
FileWorkflowArtifactStore,
WorkflowArtifact,
WorkflowArtifactCatalogEntry,
WorkflowDeployment,
WorkflowArtifactStore,
WorkflowDeployment,
artifact_catalog_entry,
)
from wf_authoring import NodeReturn, NodeSpec
from wf_core import NodeUse, Workflow, execute_workflow_async
from wf_platform import (
CapabilityBuckets,
CapabilitySource,
SourcePermissions,
SourceVisibility,
)
from ...connections import ConnectionRegistry, parse_connection_id, qualify_node_name
from ...events import EventBus, McpEvent, make_event
from ...models import (
@@ -35,17 +41,11 @@ from ...shared.names import RESERVED_CONNECTION_IDS
from ...storage import Store
from ...workflow.wrappers import _model_from_schema
from ...workflow_surface.runtime_dependencies import resolve_runtime_dependencies
from ..admin_capabilities import admin_source
from ..catalog import CombinedCatalog, snapshot_from_specs
from ..discovery import discover_connection_capabilities, specs_from_discovered_tools
from ..admin_capabilities import admin_source
from .adapters import require_adapter
from .builtins import builtin_sources
from .capability_sources import (
CapabilityBuckets,
CapabilitySource,
SourcePermissions,
SourceVisibility,
)
from .specs import get_qualified_spec, qualify_spec
+2 -3
View File
@@ -5,9 +5,8 @@ from typing import Any
from wf_authoring import NodeSpec
from ...connections import qualify_node_name
from .capability_sources import CapabilitySource
from wf_platform import CapabilitySource
from wf_mcp.connections import qualify_node_name
def qualify_spec(connection_id: str, spec: NodeSpec[Any, Any]) -> NodeSpec[Any, Any]:
"""Return a copy of a spec with its node name scoped to a connection."""
@@ -6,9 +6,7 @@ from typing import Any
from wf_artifacts import RequiredCapability, WorkflowArtifact, WorkflowDeployment
from wf_authoring import AsyncRegistryHandler, NodeSpec, build_async_registry
from wf_core.runtime.ops.merges import ReducerDefinition
from wf_mcp.broker.service.capability_sources import CapabilitySource
from wf_platform import CapabilitySource
@dataclass(frozen=True, slots=True)
class RuntimeDependencies:
+15
View File
@@ -0,0 +1,15 @@
from .sources import (
CapabilityBuckets,
CapabilitySource,
SourceKind,
SourcePermissions,
SourceVisibility,
)
__all__ = [
"CapabilityBuckets",
"CapabilitySource",
"SourceKind",
"SourcePermissions",
"SourceVisibility",
]
+81
View File
@@ -0,0 +1,81 @@
from dataclasses import dataclass, field
from typing import Any, Literal
from wf_authoring import NodeSpec
from wf_core import ReducerSpec
from wf_core.runtime.ops.merges import ReducerDefinition
SourceKind = Literal["system", "connection"]
@dataclass(frozen=True, slots=True)
class SourceVisibility:
planner: bool = False
mcp_client: bool = False
admin_dashboard: bool = True
@dataclass(frozen=True, slots=True)
class SourcePermissions:
safe_for_workflow: bool = False
calls_upstream: bool = False
mutates_config: bool = False
mutates_auth: bool = False
@dataclass(slots=True)
class CapabilityBuckets:
tools: dict[str, Any] = field(default_factory=dict)
node_specs: dict[str, NodeSpec[Any, Any]] = field(default_factory=dict)
reducers: dict[str, ReducerSpec] = field(default_factory=dict)
reducer_definitions: dict[str, ReducerDefinition] = field(default_factory=dict)
prompts: dict[str, Any] = field(default_factory=dict)
resources: dict[str, Any] = field(default_factory=dict)
@dataclass(slots=True)
class CapabilitySource:
id: str
kind: SourceKind
capabilities: CapabilityBuckets = field(default_factory=CapabilityBuckets)
enabled: bool = True
visibility: SourceVisibility = field(default_factory=SourceVisibility)
permissions: SourcePermissions = field(default_factory=SourcePermissions)
description: str | None = None
def as_status(self) -> dict[str, Any]:
return {
"id": self.id,
"kind": self.kind,
"enabled": self.enabled,
"visibility": {
"planner": self.visibility.planner,
"mcp_client": self.visibility.mcp_client,
"admin_dashboard": self.visibility.admin_dashboard,
},
"permissions": {
"safe_for_workflow": self.permissions.safe_for_workflow,
"calls_upstream": self.permissions.calls_upstream,
"mutates_config": self.permissions.mutates_config,
"mutates_auth": self.permissions.mutates_auth,
},
"description": self.description,
"tool_count": len(self.capabilities.tools),
"node_spec_count": len(self.capabilities.node_specs),
"reducer_count": len(self.capabilities.reducers),
"prompt_count": len(self.capabilities.prompts),
"resource_count": len(self.capabilities.resources),
}
def as_inventory(self) -> dict[str, Any]:
"""Return source metadata plus the capability names it owns."""
return {
**self.as_status(),
"capabilities": {
"tools": sorted(self.capabilities.tools),
"node_specs": sorted(self.capabilities.node_specs),
"reducers": sorted(self.capabilities.reducers),
"prompts": sorted(self.capabilities.prompts),
"resources": sorted(self.capabilities.resources),
},
}
+4 -4
View File
@@ -6,14 +6,14 @@ import shutil
from wf_authoring import NodeSpec
from wf_core import END, NodeUse, RunStatus
from wf_mcp.broker import WfMcpService
from wf_mcp.broker.service.capability_sources import (
from wf_mcp.models import AuthRecord, ConnectionConfig, RawWorkflowPlan
from wf_mcp.shared.errors import error_payload
from wf_mcp.storage import FileStore
from wf_platform import (
CapabilityBuckets,
CapabilitySource,
SourceVisibility,
)
from wf_mcp.models import AuthRecord, ConnectionConfig, RawWorkflowPlan
from wf_mcp.shared.errors import error_payload
from wf_mcp.storage import FileStore
from .test_support import (
FailingDiscoveryAdapter,
+4 -5
View File
@@ -13,16 +13,15 @@ from wf_artifacts import (
)
from wf_authoring import node, reducer
from wf_mcp.broker import WfMcpService
from wf_mcp.broker.service.capability_sources import (
from wf_mcp.models import ConnectionConfig, RawWorkflowPlan
from wf_mcp.storage import FileStore
from wf_mcp.workflow_surface import WorkflowSurfaceHandlers
from wf_platform import (
CapabilityBuckets,
CapabilitySource,
SourcePermissions,
SourceVisibility,
)
from wf_mcp.models import ConnectionConfig
from wf_mcp.models import RawWorkflowPlan
from wf_mcp.storage import FileStore
from wf_mcp.workflow_surface import WorkflowSurfaceHandlers
from .test_support import echo_tool, local_temp_root