openclaw/ARCHITECTURE_BLUEPRINT.md

22 KiB
Raw Permalink Blame History

OpenClaw 架构蓝图

完整的系统架构可视化


1. 整体系统架构

graph TB
    subgraph "客户端层 Clients"
        APP1[macOS App]
        APP2[iOS App]
        APP3[Android App]
        UI[Web UI]
        CLI[CLI Tool]
        NODES[Nodes<br/>macOS/iOS/Android]
    end

    subgraph "网关层 Gateway (18789)"
        WS[WebSocket Server]
        HTTP[HTTP Server]
        PROTO[Protocol Validator<br/>AJV]
        CHANNELS[Channel Manager]
        EVENTS[Event Dispatcher]
        METHODS[Method Handlers]
        CRON[Cron Service]
        CANVAS["Canvas Host<br/>a2ui (18793)"]
    end

    subgraph "通道层 Channels"
        WA[WhatsApp Web<br/>Baileys]
        TG[Telegram<br/>grammY]
        DC[Discord]
        SL[Slack]
        SG[Signal]
        IM[iMessage]
        LN[LINE]
        GO[Google Chat]
        MS[MS Teams]
        EXT[Extensions<br/>Matrix/Zalo/etc]
    end

    subgraph "Agent 层"
        ROUTER[Message Router<br/>Bindings]
        SESSION[Session Manager]
        AGENT[Agent Runtime]
        TOOLS[Tool Execution]
        MEMORY[Memory Store]
        PROVIDERS[Model Providers<br/>OpenAI/Anthropic/etc]
    end

    subgraph "基础设施层Infrastructure"
        MEDIA[Media Pipeline<br/>Store/Fetch/Process]
        CONFIG[Config System<br/>JSON5/Zod]
        PAIRING[Device Pairing]
        AUTH[Authentication]
        LOGS[Logging System]
        DIAG[Diagnostic Events]
    end

    subgraph "扩展层Plugins"
        PLUGINSDK[Plugin SDK]
        CHANNEL_PLG[Channel Plugins]
        MEMORY_PLG[Memory Plugins]
        PROVIDER_PLG[Provider Plugins]
        HOOKS[Lifecycle Hooks]
    end

    %% 连接关系
    APP1 -->|WebSocket| WS
    APP2 -->|WebSocket| WS
    APP3 -->|WebSocket| WS
    UI -->|WebSocket| WS
    CLI -->|WebSocket| WS
    NODES -->|WebSocket| WS

    WS --> PROTO
    PROTO --> METHODS
    PROTO --> EVENTS

    HTTP --> METHODS

    METHODS --> CHANNELS
    METHODS --> ROUTER
    METHODS --> CONFIG
    METHODS --> MEDIA

    CHANNELS --> WA
    CHANNELS --> TG
    CHANNELS --> DC
    CHANNELS --> SL
    CHANNELS --> SG
    CHANNELS --> IM
    CHANNELS --> LN
    CHANNELS --> GO
    CHANNELS --> MS
    CHANNELS --> EXT

    CHANNELS -.->|事件| EVENTS
    EVENTS -.->|广播| WS

    CRON -.->|触发| EVENTS

    WA -->|入站| CHANNELS
    TG -->|入站| CHANNELS
    DC -->|入站| CHANNELS
    SL -->|入站| CHANNELS
    SG -->|入站| CHANNELS
    IM -->|入站| CHANNELS
    LN -->|入站| CHANNELS
    GO -->|入站| CHANNELS
    MS -->|入站| CHANNELS
    EXT -->|入站| CHANNELS

    CHANNELS -->|路由| ROUTER
    ROUTER --> AGENT

    AGENT --> TOOLS
    AGENT --> MEMORY
    AGENT --> PROVIDERS

    AGENT -->|出站| CHANNELS
    AGENT -.->|事件| EVENTS

    SESSION -->|持久化| ROUTER

    METHODS --> MEDIA
    CONFIG -->|加载| CHANNELS
    CONFIG -->|加载| ROUTER

    WS --> AUTH
    PAIRING --> AUTH

    LOGS -->| everywhere | *
    DIAG -->| everywhere | *

    PLUGINSDK --> CHANNEL_PLG
    PLUGINSDK --> MEMORY_PLG
    PLUGINSDK --> PROVIDER_PLG

    CHANNEL_PLG --> CHANNELS
    MEMORY_PLG --> MEMORY
    PROVIDER_PLG --> PROVIDERS

    HOOKS --> AGENT
    HOOKS --> CHANNELS
    HOOKS --> EVENTS

    style Gateway fill:#e1f5fe
    style Clients fill:#f3e5f5
    style Channels fill:#fff3e0
    style Agent fill:#e8f5e9
    style Infrastructure fill:#fce4ec
    style Plugins fill:#fff9c4

2. Gateway 详细架构

graph TB
    subgraph "Gateway Server端口 18789"
        ENTER[客户端连接] --> WS_CONN

        subgraph "WebSocket 层"
            WS_CONN[WebSocket Server]
            WS_HANDLER[WS Handler]
            FRAME_PARSER[Frame Parser]
            FRAME_VALIDATOR[Frame Validator<br/>JSON Schema]
        end

        subgraph "连接管理 Connect Management"
            HELLO[req:connect]
            AUTH_CHECK[Auth Check<br/>Token Check]
            PAIRING_CHECK[Pairing Check<br/>Device Approval]
            CLIENT_REGISTRY[Client Registry]
        end

        subgraph "方法层 Method Layer"
            METHOD_DISPATCH[Method Dispatcher]
            CORE_HANDLERS[Core Handlers<br/>health/status/send/agent]
            GATEWAY_METHODS[Gateway Methods<br/>channels.* / media.*]
            PLUGIN_METHODS[Plugin Methods]
        end

        subgraph "状态层 State Layer"
            RUNTIME_STATE[Runtime State<br/>健康查看 / 缓冲]
            CHANNEL_STATE[Channel State<br/>运行时实例]
            NODE_REGISTRY[Node Registry]
        end

        subgraph "事件层 Event Layer"
            EVENT_EMITTER[Event Emitter]
            AGENT_EVENTS[agent Events]
            CHAT_EVENTS[chat Events]
            PRESENCE_EVENTS[presence Events]
            HEARTBEAT[heartbeat Events]
            DIAGNOSTICS[diagnostic Events]
        end

        subgraph "资源层 Resource Layer"
            CONFIG_RELOAD[Config Reloader]
            CHANNEL_MANAGER[Channel Manager]
            CANVAS_HOST[Canvas Host<br/>a2ui:18793]
            MEDIA_SERVER[Media Server]
            CRON_SCHEDULER[Cron Scheduler]
        end
    end

    %% 连接关系
    WS_CONN --> WS_HANDLER
    WS_HANDLER --> FRAME_PARSER
    FRAME_PARSER --> FRAME_VALIDATOR

    FRAME_VALIDATOR --> HELLO
    FRAME_VALIDATOR --> METHOD_DISPATCH

    HELLO --> AUTH_CHECK
    AUTH_CHECK --> PAIRING_CHECK
    PAIRING_CHECK --> CLIENT_REGISTRY
    CLIENT_REGISTRY --> RUNTIME_STATE

    METHOD_DISPATCH --> CORE_HANDLERS
    METHOD_DISPATCH --> GATEWAY_METHODS
    METHOD_DISPATCH --> PLUGIN_METHODS

    CORE_HANDLERS -->|使用| RUNTIME_STATE
    CORE_HANDLERS -->|使用| CHANNEL_STATE
    CORE_HANDLERS -->|使用| CHANNEL_MANAGER

    GATEWAY_METHODS --> CHANNEL_MANAGER
    GATEWAY_METHODS --> MEDIA_SERVER
    GATEWAY_METHODS --> NODE_REGISTRY

    CHANNEL_MANAGER --> CHANNEL_STATE
    CHANNEL_MANAGER -->|启动/停止| WA_SVC
    CHANNEL_MANAGER -->|启动/停止| TG_SVC
    CHANNEL_MANAGER -->|启动/停止| DC_SVC

    RLGA_EVENTS -.->|广播| WS_HANDLER
    HEARTBEAT -.->|广播| WS_HANDLER
    DIAGNOSTICS -.->|广播| WS_HANDLER

    CONFIG_RELOAD -.->|通知| CORE_HANDLERS
    CONFIG_RELOAD -.->|通知| CHANNEL_MANAGER

    CRON_SCHEDULER -.->|触发| EVENT_EMITTER
    CRON_SCHEDULER -.->|触发| CANVAS_HOST

    subgraph "外部服务 External Services"
        WA_SVC[WhatsApp Service]
        TG_SVC[Telegram Service]
        DC_SVC[Discord Service]
    end

    style GatewayServer fill:#e1f5fe
    style WebSocket层 fill:#e3f2fd
    style MethodLayer fill:#bbdefb
    style StateLayer fill:#90caf9
    style EventLayer fill:#64b5f6
    style ResourceLayer fill:#42a5f5
    style ExternalServices fill:#ffecb3

3. 消息流转图 Message Flow

sequenceDiagram
    participant USER as 用户
    participant CH as 通道通道<br/>WhatsApp/Telegram/etc
    participant GATEWAY as Gateway
    participant ROUTER as Message Router
    participant AGENT as Agent Runtime
    participant PROVIDER as AI Provider
    participant TOOLS as Tools

    %% 入站消息流
    USER->>CH: 发送消息
    CH->>GATEWAY: 接入事件
    GATEWAY->>ROUTER: 解析路由<br/>(channel/account/peer)
    ROUTER-->>GATEWAY: 返回匹配结果<br/>(agentId, sessionKey)
    GATEWAY->>AGENT: 调用 agent.execute

    AGENT->>AGENT: 加载会话历史
    AGENT->>AGENT: 构建系统提示
    AGENT->>PROVIDER: 发起 LLM 调用

    alt 需要工具调用
        PROVIDER-->>AGENT: 返回 tool_calls
        AGENT->>TOOLS: 执行工具
        TOOLS-->>AGENT: 返回工具结果
        AGENT->>PROVIDER: 继续调用 (with tool results)
    end

    PROVIDER-->>AGENT: 返回完整响应
    AGENT->>AGENT: 更新会话历史
    AGENT-->>GATEWAY: 返回响应 (events: agent)

    GATEWAY->>CH: 发送消息 (channel.message.send)
    CH->>USER: 接收回复

    %% 出站消息流 (CLI/Web/App 触发)
    rect rgb(255, 255, 200)
        Note over GATEWAY,USER: 出站消息流 (从客户端触发)
        USER->>GATEWAY: 调用 gateway.send
        GATEWAY->>ROUTER: 解析路由
        ROUTER-->>GATEWAY: 返回匹配结果
        GATEWAY->>CH: 发送消息
        CH->>USER: 接收消息
    end

4. 插件系统架构 Plugin System

graph TB
    subgraph "插件 API Plugin SDK"
        API[OpenClawPluginApi]
    end

    subgraph "插件运行时 Plugin Runtime"
        RUNTIME[Plugin Runtime]
        CONFIG_API[Config API<br/>loadConfig/writeConfigFile]
        SYSTEM_API[System API<br/>enqueueSystemEvent]
        MEDIA_API[Media API<br/>loadWebMedia/detectMime]
        TTS_API[TTS API<br/>textToSpeechTelephony]
        TOOLS_API[Tools API<br/>createMemoryGetTool]
        CHANNEL_API[Channel API<br/>routing/network/session]
        LOGGING_API[Logging API<br/>getChildLogger]
    end

    subgraph "注册接口 Registrations"
        REG_TOOL[registerTool]
        REG_HOOK[registerHook]
        REG_HTTP[registerHttpRoute/registerHttpHandler]
        REG_CHANNEL[registerChannel]
        REG_GW_METHOD[registerGatewayMethod]
        REG_CLI[registerCli]
        REG_SERVICE[registerService]
        REG_PROVIDER[registerProvider]
        REG_CMD[registerCommand]
    end

    subgraph "钩子系统 Hook System"
        H_BEFORE_AGENT[before_agent_start]
        H_AFTER_AGENT[after_agent_start]
        H_BEFORE_SEND[before_message_send]
        H_AFTER_SEND[after_message_send]
        H_RECEIVED[message_received]
        H_TOOL[tool_called]
        H_CONFIG[config_changed]
    end

    subgraph "插件类型 Plugin Types"
        P_CHANNEL[Channel Plugin<br/>must implement ChannelPlugin]
        P_MEMORY[Memory Plugin<br/>LanceDB/etc]
        P_PROVIDER[Provider Plugin<br/>Custom AI API]
    end

    subgraph "插件生命周期 Plugin Lifecycle"
        LOAD[loadPlugin]
        VALIDATE[validateConfig]
        REGISTER[register]
        ACTIVATE[activate]
        DISPOSE[dispose]
    end

    %% 连接关系
    API --> RUNTIME
    RUNTIME --> CONFIG_API
    RUNTIME --> SYSTEM_API
    RUNTIME --> MEDIA_API
    RUNTIME --> TTS_API
    RUNTIME --> TOOLS_API
    RUNTIME --> CHANNEL_API
    RUNTIME --> LOGGING_API

    API --> REG_TOOL
    API --> REG_HOOK
    API --> REG_HTTP
    API --> REG_CHANNEL
    API --> REG_GW_METHOD
    API --> REG_CLI
    API --> REG_SERVICE
    API --> REG_PROVIDER
    API --> REG_CMD

    REG_HOOK --> H_BEFORE_AGENT
    REG_HOOK --> H_AFTER_AGENT
    REG_HOOK --> H_BEFORE_SEND
    REG_HOOK --> H_AFTER_SEND
    REG_HOOK --> H_RECEIVED
    REG_HOOK --> H_TOOL
    REG_HOOK --> H_CONFIG

    REG_CHANNEL --> P_CHANNEL

    LOAD --> VALIDATE
    VALIDATE --> REGISTER
    REGISTER --> ACTIVATE
    ACTIVATE --> DISPOSE

    P_CHANNEL -.->|loose coupling| H_RECEIVED
    P_CHANNEL -.->|loose coupling| H_BEFORE_SEND

    style PluginSDK fill:#fff9c4
    style PluginRuntime fill:#fff59d
    style Registrations fill:#ffee58
    style HookSystem fill:#fdd835
    style PluginTypes fill:#fbc02d
    style PluginLifecycle fill:#f9a825

5. 路与绑定系统 Routing & Bindings

graph TD
    subgraph "路由输入 Route Input"
        CFG[User Config<br/>bindings 数组]
        IN_CHANNEL[channel<br/>消息来源]
        IN_ACCOUNT[accountId<br/>账户 ID]
        IN_PEER[peer<br/>用户/组 ID]
        IN_GUILD[guildId<br/>Discord 服务器]
        IN_TEAM[teamId<br/>Slack/Teams]
    end

    subgraph "路由匹配优先级 Matching Priority"
        P1[1. peer<br/>具体用户/组]
        P2[2. peer.parent<br/>线程继承]
        P3[3. guildId<br/>Discord 服务器]
        P4[4. teamId<br/>Slack/Teams]
        P5[5. account<br/>非通配符账户]
        P6[6. account<br/>通配符账户]
        P7[7. default<br/>默认绑定]
    end

    subgraph "路由输出 Route Output"
        AGENT_ID[agentId<br/>目标 Agent]
        SESSION_KEY[sessionKey<br/>会话唯一标识]
        MAIN_KEY[mainSessionKey<br/>主会话]
        MATCHED_BY[matchedBy<br/>匹配方式]
    end

    subgraph "会话管理 Session Management"
        SESSION_STORE[Session Store<br/>~/.openclaw/sessions/]
        SESSION_FILE[.jsonl 文件<br/>role/content/timestamp]
        HISTORY[上下文历史<br/>消息 turnover]
    end

    %% 连接关系
    CFG -->|解析| P1
    IN_CHANNEL -->|输入| P1
    IN_ACCOUNT -->|输入| P1
    IN_PEER -->|输入| P1
    IN_GUILD -->|输入| P1
    IN_TEAM -->|输入| P1

    P1 -->|无匹配| P2
    P2 -->|无匹配| P3
    P3 -->|无匹配| P4
    P4 -->|无匹配| P5
    P5 -->|无匹配| P6
    P6 -->|无匹配| P7

    P1 -->|匹配| AGENT_ID
    P2 -->|匹配| AGENT_ID
    P3 -->|匹配| AGENT_ID
    P4 -->|匹配| AGENT_ID
    P5 -->|匹配| AGENT_ID
    P6 -->|匹配| AGENT_ID
    P7 -->|匹配| AGENT_ID

    AGENT_ID -->|构建| SESSION_KEY
    AGENT_ID -->|构建| MAIN_KEY
    P1 -->|设置| MATCHED_BY
    P2 -->|设置| MATCHED_BY
    P3 -->|设置| MATCHED_BY
    P4 -->|设置| MATCHED_BY
    P5 -->|设置| MATCHED_BY
    P6 -->|设置| MATCHED_BY
    P7 -->|设置| MATCHED_BY

    SESSION_KEY -->|读写| SESSION_STORE
    MAIN_KEY -->|读写| SESSION_STORE

    SESSION_STORE -->|包含| SESSION_FILE
    SESSION_FILE -->|构建| HISTORY

    style RouteInput fill:#e8f5e9
    style MatchingPriority fill:#c8e6c9
    style RouteOutput fill:#a5d6a7
    style SessionManagement fill:#81c784

6. 媒体管道架构 Media Pipeline

graph LR
    subgraph "入站 Inbound"
        A[收到媒体] --> B[parse<br/>提取媒体]
        B --> C[mime.ts<br/>检测 MIME]
        C -->|magic number<br/>+ content type| MIME_TYPE{MIME 类型?}
        MIME_TYPE -->|image| D[store.ts<br/>保存到磁盘]
        MIME_TYPE -->|audio| D
        MIME_TYPE -->|video| D
        MIME_TYPE -->|unknown| DROP[丢弃/警告]
    end

    subgraph "存储 Storage"
        D --> STORAGE[~/.openclaw/media/inbound/]
        STORAGE --> FILES["{original}---{uuid}.ext"]
    end

    subgraph "处理 Processing (可选)"
        FILES --> E[image_ops.ts<br/>image/image-ops.ts]
        E -->|resizeToJpeg| RESIZED[调整大小的 JPEG]
    end

    subgraph "出站 Outbound"
        OUT_REQ[出站请求] --> OUT_MIME[mime.ts<br/>检测 MIME]
        OUT_MIME -->|需要处理?| OUT_PROC[image_ops/audio.ts]
        OUT_MIME -->|不需要处理| OUT_STORE[store.ts<br/>保存到磁盘]
        OUT_PROC --> OUT_STORE
        OUT_STORE --> OUT_STORAGE[~/.openclaw/media/outbound/]
    end

    subgraph "服务服务 & Fetch"
        STORAGE --> HOST[host.ts<br/>HTTP 服务]
        OUT_STORAGE --> HOST
        HOST -->|GET /media/*| CLIENT[客户端]
        FETCH[fetch.ts<br/>远程获取] --> STORAGE
    end

    style Inbound fill:#e3f2fd
    style Storage fill:#bbdefb
    style Processing fill:#90caf9
    style Outbound fill:#64b5f6
    style ServeFetch fill:#42a5f5

7. Gateway 通信协议 Gateway Protocol

stateDiagram-v2
    direction LR

    %% 定义带有复杂描述的状态名规避连线上的解析Bug
    state "Authenticated (已认证)" as Authenticated
    state "Connected (已就绪)" as Connected
    state "Requesting (请求中)" as Requesting
    state "Streaming (流式传输中)" as Streaming
    state "Waiting (异步等待中)" as Waiting
    state "Error (发生错误)" as Error
    state "Closed (连接关闭)" as Closed

    [*] --> Disconnected

    note right of Disconnected
        未连接状态
    end note

    Disconnected --> Connecting: 客户端发起WS连接

    %% 连线描述尽量保持简洁,避开特殊字符
    Connecting --> Authenticated: req_connect_auth_ok
    Connecting --> Closed: 认证失败
    Connecting --> Closed: 非首帧为connect

    Authenticated --> Connected: res_hello_ok

    Connected --> Requesting: req_method
    Connected --> Streaming: event_stream

    Requesting --> Connected: res_ok_sync
    Requesting --> Waiting: method_processing

    Waiting --> Connected: res_ok
    Waiting --> Error: res_error

    Streaming --> Connected: stream_end
    Streaming --> Streaming: stream_continue

    Connected --> Closed: 客户端断开
    Error --> Connected: error_recovery
    Authenticated --> Closed: connection_close
    Closed --> [*]

    note right of Streaming
        agent 事件流示例:
        {
          "type": "event",
          "event": "agent",
          "payload": {
            "agentId": "xxx",
            "runId": "yyy",
            "status": "running"
          }
        }
    end note

    note right of Requesting
        request 示例:
        {
          "type": "req",
          "id": 1,
          "method": "send",
          "params": {
            "channel": "whatsapp",
            "target": "...",
            "text": "..."
          }
        }
    end note

8. 认证与配对流程 Authentication & Pairing

sequenceDiagram
    participant DEV as 设备(Device)<br/>CLI/App/Node
    participant WS as Gateway<br/>WebSocket Server
    participant AUTH as Auth Module
    participant PAIRING as Pairing Store
    participant USER as 操作员

    %% 首次连接 - 本地
    rect rgb(200, 255, 200)
        Note over DEV,USER: 场景:首次本地连接 (自动批准)
        DEV->>WS: WS connect
        WS->>AUTH: 生成 deviceIdentity
        AUTH-->>WS: deviceIdentity (含 deviceID)
        WS-->>DEV: res:connect + deviceIdentity
        DEV->>WS: req:connect (带 deviceID)
        WS->>AUTH: 验证 deviceID 是否本地
        AUTH->>PAIRING: 检查 pairing 状态
        PAIRING-->>AUTH: 新设备 (需要批准)
        AUTH->>AUTH: 本地地址 -> 自动批准
        AUTH->>PAIRING: 生成 deviceToken
        AUTH-->>WS: 设备已批准
        WS-->>DEV: res:hello-ok (带 deviceToken)
    end

    %% 首次连接 - 远程
    rect rgb(255, 200, 200)
        Note over DEV,USER: 场景:首次远程连接 (需要批准)
        DEV->>WS: WS connect (via Tailscale/VPN)
        WS->>AUTH: 生成 deviceIdentity (带 challenge)
        AUTH-->>WS: deviceIdentity + challenge
        WS-->>DEV: res:connect + deviceIdentity + challenge
        DEV->>DEV: 签名 challenge
        DEV->>WS: req:connect (带 deviceID + signature)
        WS->>AUTH: 验证签名
        AUTH->>PAIRING: 检查 pairing 状态
        PAIRING-->>AUTH: 新设备,非本地
        AUTH-->>USER: 通知等待批准
        USER-->>AUTH: 批准设备
        AUTH->>PAIRING: 生成并保存 deviceToken
        AUTH-->>WS: 设备已批准
        WS-->>DEV: res:hello-ok (带 deviceToken)
    end

    %% 后续连接
    rect rgb(200, 200, 255)
        Note over DEV,USER: 场景:后续连接
        DEV->>WS: WS connect
        DEV->>WS: req:connect (带 deviceID + deviceToken)
        WS->>PAIRING: 验证 deviceToken
        PAIRING-->>WS: Token 有效
        WS-->>DEV: res:hello-ok
    end

9. 完整组件关系图 Component Relationships

graph TB
    %% CLI 层
    CLI[openclaw CLI<br/>openclaw.mjs]
    PROG[src/index.ts<br/>buildProgram]
    CMDS[src/commands/]

    CLI --> PROG
    PROG --> CMD_DEPS[createDefaultDeps]

    %% Gateway 层
    GW_SERVER[src/gateway/server.impl.ts<br/>startGatewayServer]
    GW_PROT[src/gateway/protocol/]
    GW_METHODS[src/gateway/server-methods/]
    GW_CHAN[src/gateway/server-channels.ts]

    GW_SERVER --> GW_PROT
    GW_SERVER --> GW_METHODS
    GW_SERVER --> GW_CHAN

    %% 通道层
    CHAN_SYS[src/channels/]
    PLUG_TYPES[src/channels/plugins/types.plugin.ts]
    PLUG_ADAPTER[src/channels/plugins/types.adapters.ts]

    WHAST[whatsapp.ts]
    TELEG[telegram.ts]
    DISC[discord.ts]
    SLACK[slack.ts]
    SIGNL[signal.ts]
    IMMSG[imessage.ts]

    CHAN_SYS --> PLUG_TYPES
    CHAN_SYS --> PLUG_ADAPTER
    CHAN_SYS --> WA
    CHAN_SYS --> TG
    CHAN_SYS --> DC
    CHAN_SYS --> SL
    CHAN_SYS --> SI
    CHAN_SYS --> IM

    GW_CHAN --> CHAN_SYS

    %% Agent 层
    AGENT_RT[src/agents/runtime.ts]
    AGENT_TOOLS[src/agents/tools/]
    ROUTER[src/routing/resolve-route.ts]

    ROUTER --> AGENT_RT
    AGENT_RT --> AGENT_TOOLS
    GW_METHODS --> ROUTER

    %% 配置层
    CONFIG[src/config/]
    ZOD_TYPES[src/config/zod-schema.*.ts]

    CONFIG --> ZOD_TYPES
    GW_SERVER --> CONFIG
    ROUTER --> CONFIG

    %% 媒体层
    MEDIA[src/media/]
    MIME[mime.ts]
    STORE[store.ts]
    FETCH[fetch.ts]

    MEDIA --> MIME
    MEDIA --> STORE
    MEDIA --> FETCH
    GW_METHODS --> MEDIA

    %% 插件层
    PLUG_SYS[src/plugins/]
    PLUG_SDK[src/plugin-sdk/]

    PLUG_SYS --> PLUG_SDK
    GW_SERVER --> PLUG_SYS

    %% 钩子
    HOOKS[src/hooks/types.ts]

    HOOKS --> AGENT_RT
    PLUG_SDK --> HOOKS

    %% 基础设施
    INFRA[src/infra/]
    PORTS[ports.ts]
    LOGG[logging/]

    INFRA --> PORTS
    INFRA --> LOGG
    GW_SERVER --> INFRA

    style CLI fill:#e1f5fe
    style GatewayServer fill:#bbdefb
    style ChannelLayer fill:#90caf9
    style AgentLayer fill:#64b5f6
    style ConfigLayer fill:#42a5f5
    style MediaLayer fill:#1e88e5
    style PluginLayer fill:#0d47a1

附录:组件职责

组件 职责
CLI 命令行界面,启动 gateway、发送消息、配置管理等
Gateway WebSocket 服务器,协议验证,事件广播,通道管理
Channels 消息平台适配器,入站/出站消息,状态管理
Routing 消息路由解析,绑定匹配,会话键构建
Agent Runtime AI Agent 执行,工具调用,会话管理
Media Pipeline 媒体上传、存储、处理、服务
Config System 配置加载、验证、迁移、监听
Plugin SDK 插件开发接口,运行时 API
Hooks 生命周期钩子,插件扩展点
Infrastructure 端口管理、日志、诊断事件、SSRF 防护

文档结束