refactor: 更新能力实现注册和请求处理,增强类型一致性

This commit is contained in:
DrSmoothl
2026-03-20 22:35:24 +08:00
parent e4850c469f
commit 75cd50ee0f
3 changed files with 14 additions and 17 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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: