Phase 7: Built-in Hooks (audit_log, dangerous_confirmation, security_scan) Phase 8: Plugin system (PluginManager, PluginSandbox, PluginManifest) Phase 9: Skills registry (SkillRegistry, local/plugin/MCP loaders) Phase 10: TeamLeader, RemoteTransport, BackgroundTaskManager
114 lines
2.9 KiB
Python
114 lines
2.9 KiB
Python
"""远程传输层 - Phase 10.2"""
|
|
|
|
import asyncio
|
|
import json
|
|
from typing import Any
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class StructuredMessage:
|
|
"""结构化消息"""
|
|
|
|
type: str # response, event, tool_call, error
|
|
data: dict[str, Any]
|
|
session_id: str | None = None
|
|
|
|
|
|
class RemoteTransport:
|
|
"""远程传输层
|
|
|
|
处理与远程 Agent 的通信。
|
|
"""
|
|
|
|
def __init__(self):
|
|
self._connections: dict[str, Any] = {}
|
|
self._handlers: dict[str, Any] = {}
|
|
|
|
async def send_response(self, session_id: str, response: dict[str, Any]) -> bool:
|
|
"""发送响应
|
|
|
|
Args:
|
|
session_id: 会话 ID
|
|
response: 响应数据
|
|
|
|
Returns:
|
|
是否发送成功
|
|
"""
|
|
message = StructuredMessage(
|
|
type="response",
|
|
data=response,
|
|
session_id=session_id,
|
|
)
|
|
return await self._send(session_id, message)
|
|
|
|
async def send_event(self, session_id: str, event: dict[str, Any]) -> bool:
|
|
"""发送事件
|
|
|
|
Args:
|
|
session_id: 会话 ID
|
|
event: 事件数据
|
|
|
|
Returns:
|
|
是否发送成功
|
|
"""
|
|
message = StructuredMessage(
|
|
type="event",
|
|
data=event,
|
|
session_id=session_id,
|
|
)
|
|
return await self._send(session_id, message)
|
|
|
|
async def send_tool_call(self, session_id: str, tool_call: dict[str, Any]) -> bool:
|
|
"""发送工具调用
|
|
|
|
Args:
|
|
session_id: 会话 ID
|
|
tool_call: 工具调用数据
|
|
|
|
Returns:
|
|
是否发送成功
|
|
"""
|
|
message = StructuredMessage(
|
|
type="tool_call",
|
|
data=tool_call,
|
|
session_id=session_id,
|
|
)
|
|
return await self._send(session_id, message)
|
|
|
|
async def _send(self, session_id: str, message: StructuredMessage) -> bool:
|
|
"""内部发送方法"""
|
|
if session_id not in self._connections:
|
|
return False
|
|
|
|
try:
|
|
connection = self._connections[session_id]
|
|
if hasattr(connection, "send"):
|
|
await connection.send(json.dumps(message.__dict__))
|
|
return True
|
|
except Exception:
|
|
pass
|
|
|
|
return False
|
|
|
|
def register_handler(self, event_type: str, handler: Any) -> None:
|
|
"""注册消息处理器
|
|
|
|
Args:
|
|
event_type: 事件类型
|
|
handler: 处理函数
|
|
"""
|
|
self._handlers[event_type] = handler
|
|
|
|
async def handle_message(self, session_id: str, message: dict[str, Any]) -> None:
|
|
"""处理收到的消息
|
|
|
|
Args:
|
|
session_id: 会话 ID
|
|
message: 消息数据
|
|
"""
|
|
msg_type = message.get("type")
|
|
handler = self._handlers.get(msg_type)
|
|
if handler:
|
|
await handler(session_id, message.get("data"))
|