xworkmate-app/docs/ai-context/chain-map.md

13 KiB
Raw Blame History

Chain Map — 跨仓库调用链

生成日期: 2026-06-05 | 文件级调用链,标注协议边界


Chain 1: 用户发起 AI 对话 (主流程)

xworkmate-app                                    xworkmate-bridge
─────────────                                    ────────────────
lib/app/app_controller_desktop.dart
  → handleChatSend()
    └─ lib/runtime/gateway_runtime_core.dart
         GatewayRuntime.sendMessage()
           │
           ├── (ACP WebSocket 路径)
           │   └─ lib/runtime/gateway_acp_client.dart
           │        GatewayAcpClient.request(method: "session.start", ...)
           │          → WebSocket /acp ──────────────────► internal/acp/http_handler.go
           │                                                HandleWebSocket()
           │                                                  └─ internal/acp/rpc_handler.go
           │                                                       handleRequest("session.start", ...)
           │                                                         └─ internal/router/
           │                                                              Resolve(provider)
           │                                                                └─ Provider handler
           │
           └── (ACP HTTP/SSE 路径)
               └─ lib/runtime/gateway_acp_client.dart
                    GatewayAcpClient.request()
                      → HTTP POST /acp/rpc ──────────────► internal/acp/http_handler.go
                                                             HandleRPC()
                                                               └─ internal/acp/rpc_handler.go
                                                                    handleRequest(...)

涉及的 key files:

文件 作用
app lib/app/app_controller_desktop.dart 用户输入入口
app lib/runtime/gateway_runtime_core.dart Gateway runtime 核心
app lib/runtime/gateway_acp_client.dart ACP 客户端 (JSON-RPC 封装)
app lib/runtime/acp_endpoint_paths.dart 端点路径解析
bridge internal/acp/http_handler.go HTTP/WS 请求入口
bridge internal/acp/rpc_handler.go JSON-RPC 方法分发
bridge internal/router/ 提供商路由

协议: ACP JSON-RPC 2.0 over WebSocket (主) / HTTP SSE (后备)

断点风险:

  • ACP 客户端 120s 超时 → 长任务可能超时
  • SSE 流中断后降级为轮询 (xworkmate.tasks.get)
  • WebSocket 断线需重连 (30s ping/10s 超时)

Chain 2: OpenClaw 网关任务执行

xworkmate-app                                    xworkmate-bridge
─────────────                                    ────────────────
lib/runtime/external_code_agent_acp_desktop_transport.dart
  ExternalCodeAgentAcpTransport
    → session.start(routing: gateway/openclaw,
                    metadata.xworkmateTaskArtifactContract.expectedArtifactDirs)
      └─ lib/runtime/gateway_acp_client.dart
           → WebSocket /acp or POST /acp/rpc ───────► internal/acp/http_handler.go
           │                                            HandleWebSocket()/HandleRPC()
           │                                              └─ internal/acp/rpc_handler.go
           │                                                   Orchestrator.Process()
           │                                                     │
           │                                                     ├─ 本地 gateway
           │                                                     │   └─ internal/gatewayruntime/runtime.go
           │                                                     │        GatewayRuntime.Connect()
           │                                                     │          → WebSocket ────► OpenClaw Gateway
           │                                                     │                              ws://127.0.0.1:18789
           │                                                     │                                │
           │                                                     │                                ├─ chat.send
           │                                                     │                                ├─ agent.wait
           │                                                     │                                └─ xworkmate.artifacts.*
           │                                                     │                                      │
           │                                                     │                                      ▼
           │                                                     │                           openclaw-multi-session-plugins
           │                                                     │                           ─────────────────────────────
           │                                                     │                           index.ts → register()
           │                                                     │                             xworkmate.artifacts.prepare
           │                                                     │                             xworkmate.artifacts.export
           │                                                     │                             xworkmate.artifacts.read
           │                                                     │
           │                                                     └─ 分布式转发
           │                                                         └─ internal/acp/distributed_forwarder.go
           │                                                              ForwardToPeer()
           │                                                                → HTTP POST → 远端 bridge /acp/rpc
           │
           ◄── SSE stream (token by token) ────────────
           ◄── xworkmate.gateway.push (chat events) ───

lib/app/app_controller_openclaw_task_queue.dart
  OpenClawTaskQueue
    → 本地队列管理 (max 5 active, 20 queued)
    → 持久化 typed association
    → 恢复查询只发送 appThreadKey/openclawSessionKey/runId 到 native task-registry

Protocol boundary:

  • expectedArtifactDirs is not a chat.send root parameter.
  • App sends it only as metadata.xworkmateTaskArtifactContract.expectedArtifactDirs on session.start.
  • Bridge maps it only into xworkmate.artifacts.export and xworkmate.artifacts.collect-and-snapshot.
  • Bridge must reject old root/metadata compatibility paths instead of probing fallback keys.

涉及的 key files:

文件 作用
app lib/runtime/external_code_agent_acp_desktop_transport.dart 任务传输层
app lib/runtime/go_task_service_client.dart 任务接口定义
app lib/runtime/go_task_service_desktop_service.dart 桌面任务服务
app lib/app/app_controller_openclaw_task_queue.dart 客户端任务队列
bridge internal/acp/gateway.go OpenClaw 集成
bridge internal/acp/http_handler.go /acp / /acp/rpc 端点
bridge internal/gatewayruntime/runtime.go 网关 WS 客户端
bridge internal/acp/distributed_forwarder.go 分布式转发
plugins index.ts 插件入口
plugins src/exportArtifacts.ts 工件逻辑

协议: ACP JSON-RPC → Gateway RPC (WebSocket, Ed25519 握手)

断点风险:

  • 网关 WebSocket 断连 → 任务丢失
  • 分布式转发 hop=3 限制 → 深层拓扑不可达
  • 任务轮询恢复依赖 xworkmate.tasks.get → Bridge 只转发 typed lookup terminal state 以 OpenClaw native task-registry 为准;缺少 native task record 时返回 no_native_task_record,不从 artifactScope/runId 重建任务。

Chain 3: 工件下载流

xworkmate-app                                    xworkmate-bridge
─────────────                                    ────────────────
lib/app/app_controller_desktop_thread_storage.dart
  syncArtifactsFromBridge()
    → GET /artifacts/openclaw/download ───────────► internal/acp/http_handler.go
           ?ref=<signed>&t=<expiry>                  HandleArtifactDownload()
                                                       └─ internal/gatewayruntime/runtime.go
                                                            gateway.RequestByMode(
                                                              "openclaw",
                                                              "xworkmate.artifacts.read",
                                                              params
                                                            )
                                                              │
                                                              ▼
                                                    openclaw-multi-session-plugins
                                                    ─────────────────────────────
                                                    src/exportArtifacts.ts
                                                      xworkmate.artifacts.read()
                                                        → 验证 HMAC 签名
                                                        → 读取文件内容
                                                        → 返回 artifact

涉及的 key files:

文件 作用
app lib/app/app_controller_desktop_thread_storage.dart 工件同步
bridge internal/acp/http_handler.go 下载端点
bridge internal/gatewayruntime/runtime.go 网关调用
plugins src/exportArtifacts.ts read 逻辑

安全: HMAC-SHA256 签名绑定 (workspaceRoot, session, run, path, size, hash)

断点风险:

  • 签名过期 (24h) → 下载失败
  • 签名密钥不一致 → 验证失败

Chain 4: MCP 配置生成

xworkmate-app                                    xworkmate-bridge
─────────────                                    ────────────────
lib/runtime/codex_config_bridge.dart
  CodexConfigBridge.generate()
    → 写入 ~/.codex/config.toml
      [mcp_servers.xworkmate]
      command = "openclaw-mcp"
      args = ["--gateway", "https://xworkmate-bridge.svc.plus"]
      # BEGIN XWORKMATE MANAGED MCP BLOCK
      ...
      # END XWORKMATE MANAGED MCP BLOCK

lib/runtime/opencode_config_bridge.dart
  OpencodeConfigBridge.generate()
    → 写入 ~/.opencode/config.toml
      [mcp_servers.xworkmate]
      url = "https://xworkmate-bridge.svc.plus/acp"
      # 或 type="stdio" + command="openclaw-mcp" + args=["--gateway", url]

涉及的 key files:

文件 作用
app lib/runtime/codex_config_bridge.dart Codex CLI 配置
app lib/runtime/opencode_config_bridge.dart OpenCode CLI 配置
bridge internal/mounts/reconcile.go MCP 配置管理 (服务端)

断点风险:

  • 配置 block 标记 (# BEGIN XWORKMATE MANAGED MCP BLOCK) 冲突 → 覆盖用户配置
  • Gateway URL 变更 → 需重新生成配置

Chain 5: 已移除的 Plugin → Bridge 反向调用

旧链路:
  openclaw-multi-session-plugins/src/bridgeAgents.ts
    → HTTP POST xworkmate-bridge /acp/rpc
    → session.start(multiAgent=true)

当前链路:
  xworkmate-bridge → OpenClaw Gateway → openclaw-multi-session-plugins
    → xworkmate.artifacts.*

涉及的 key files:

文件 作用
plugins index.ts / src/exportArtifacts.ts artifact scope adapter
bridge internal/acp/orchestrator.go OpenClaw gateway orchestration

协议: 无 Plugin→Bridge 运行时协议

断点风险:

  • 旧版本插件若仍暴露 bridge agents 工具,会恢复循环依赖,应从 manifest 和 dist 中删除

跨仓库调用矩阵

                    调用方
                app    bridge    plugins
              ┌───────┬───────┬───────┐
      app     │   -   │ ACP   │   -   │
被调   bridge  │   -   │  -    │  -    │
方    plugins │   -   │ GW    │   -   │
              └───────┴───────┴───────┘

ACP  = JSON-RPC 2.0 over WebSocket/HTTP SSE
GW   = OpenClaw Gateway RPC over WebSocket (Ed25519)

调用链复杂度评分

Chain 跨仓库跳数 协议变换 风险等级
Chain 1 (AI 对话) 2 (app→bridge→provider) 1 (ACP)
Chain 2 (OpenClaw 任务) 4 (app→bridge→gateway→plugins) 2 (ACP + GW RPC)
Chain 3 (工件下载) 3 (app→bridge→gateway→plugins) 2 (HTTPS + GW RPC)
Chain 4 (MCP 配置) 1 (app→本地文件) 0
Chain 5 (多 Agent) 2 (plugins→bridge→provider) + 2 (bridge→gateway→plugins) 2 (HTTP + GW RPC) 高/循环