diff --git a/src/plugin_runtime/capabilities/registry.py b/src/plugin_runtime/capabilities/registry.py index ead5876a..96b190b4 100644 --- a/src/plugin_runtime/capabilities/registry.py +++ b/src/plugin_runtime/capabilities/registry.py @@ -1,6 +1,7 @@ -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from src.common.logger import get_logger +from src.plugin_runtime.host.capability_service import CapabilityImpl from src.plugin_runtime.host.supervisor import PluginSupervisor if TYPE_CHECKING: @@ -12,17 +13,15 @@ logger = get_logger("plugin_runtime.integration") def register_capability_impls(manager: "PluginRuntimeManager", supervisor: PluginSupervisor) -> None: """向指定 Supervisor 注册主程序提供的能力实现。""" cap_service = supervisor.capability_service - rpc_server = supervisor.rpc_server - def _register(name: str, impl: Any) -> None: - """注册单个能力实现及其 RPC 入口。 + def _register(name: str, impl: CapabilityImpl) -> None: + """注册单个能力实现。 Args: name: 能力名称。 impl: 能力实现函数。 """ cap_service.register_capability(name, impl) - rpc_server.register_method(name, cap_service.handle_capability_request) _register("send.text", manager._cap_send_text) _register("send.emoji", manager._cap_send_emoji) diff --git a/src/plugin_runtime/host/capability_service.py b/src/plugin_runtime/host/capability_service.py index 761b20ca..0ff31fe1 100644 --- a/src/plugin_runtime/host/capability_service.py +++ b/src/plugin_runtime/host/capability_service.py @@ -56,19 +56,14 @@ class CapabilityService: 校验权限后调用对应实现。 """ plugin_id = envelope.plugin_id - payload = envelope.payload if isinstance(envelope.payload, dict) else {} try: - req = CapabilityRequestPayload.model_validate(payload) - capability = req.capability - args = req.args - except Exception: - capability = envelope.method - raw_args = payload.get("args", payload) - args = raw_args if isinstance(raw_args, dict) else {} + req = CapabilityRequestPayload.model_validate(envelope.payload) + except Exception as exc: + return envelope.make_error_response(ErrorCode.E_BAD_PAYLOAD.value, f"能力调用 payload 非法: {exc}") - if not capability: - return envelope.make_error_response(ErrorCode.E_BAD_PAYLOAD.value, "能力调用缺少 capability") + capability = req.capability + args = req.args # 1. 权限校验 allowed, reason = self._authorization.check_capability(plugin_id, capability) diff --git a/src/plugin_runtime/runner/runner_main.py b/src/plugin_runtime/runner/runner_main.py index 771e685f..bf36a05c 100644 --- a/src/plugin_runtime/runner/runner_main.py +++ b/src/plugin_runtime/runner/runner_main.py @@ -237,9 +237,12 @@ class PluginRunner: f"插件 {bound_plugin_id} 尝试以 {plugin_id} 身份发起 RPC,已强制绑定回自身身份" ) resp = await rpc_client.send_request( - method=method, + method="cap.call", plugin_id=bound_plugin_id, - payload=payload or {}, + payload={ + "capability": method, + "args": payload or {}, + }, ) # 从响应信封中提取业务结果 if resp.error: