Skip to content

IPC 通信

IPC(进程间通信)是 Electron 前端与 Python 后端的通信桥梁。

三层通信架构

graph LR subgraph Renderer [Renderer - React] IPCR[ipcRenderer.invoke] CB[contextBridge<br/>window.miqi] end subgraph Main [Main Process - Node.js] IPCM[ipcMain.handle] ZOD[Zod 验证] BMS[BridgeManager<br/>子进程生命周期] end subgraph Python [Python Backend] BS[Bridge Server] HANDLE[handle_* handlers] end Renderer -->|invoke CHANNEL| Main -->|bridge.send| Python Python -->|response| Main -->|result| Renderer

IPC 通道定义

所有通道在 apps/desktop/src/shared/ipc.ts 中统一定义,包含 Zod Schema 验证:

// IPC 通道常量
export const IPC = {
  // Chat
  CHAT_SEND:    "chat:send",
  CHAT_ABORT:   "chat:abort",

  // Sessions
  SESSIONS_LIST:        "sessions:list",
  SESSIONS_GET:         "sessions:get",
  SESSIONS_DELETE:      "sessions:delete",
  SESSIONS_ARCHIVE:     "sessions:archive",
  SESSIONS_UNARCHIVE:   "sessions:unarchive",
  SESSIONS_GET_TRACKED_FILES: "sessions:get_tracked_files",

  // Config
  CONFIG_GET:    "config:get",
  CONFIG_SET:    "config:set",

  // Providers
  PROVIDERS_LIST: "providers:list",
  PROVIDERS_TEST: "providers:test",
  PROVIDERS_UPDATE: "providers:update",

  // Memory
  MEMORY_FACTS:    "memory:facts",
  MEMORY_LESSONS:  "memory:lessons",
  MEMORY_DELETE_LESSON: "memory:delete_lesson",
  MEMORY_TOGGLE_LESSON: "memory:toggle_lesson",

  // Skills
  SKILLS_LIST:   "skills:list",
  SKILLS_CREATE: "skills:create",
  SKILLS_UPLOAD: "skills:upload",
  SKILLS_DELETE: "skills:delete",

  // Files
  FILES_DIFF:    "files:diff",
  FILES_REVERT:  "files:revert",
  FILES_ACCEPT:  "files:accept",

  // MCPs
  MCPS_LIST:   "mcps:list",
  MCPS_UPSERT: "mcps:upsert",
  MCPS_DELETE: "mcps:delete",

  // WSL
  WSL_CHECK:  "wsl:check",
  WSL_INSTALL: "wsl:install",

  // Python
  PYTHON_CHECK: "python:check",
} as const;

// Zod Schema 示例
export const ChatSendSchema = z.object({
  message: z.string().min(1),
  sessionId: z.string().optional(),
});

流式事件处理

聊天消息的流式响应通过事件推送实现:

// Renderer 端
const [text, setText] = useState("");

useEffect(() => {
  const cleanup = window.miqi.chat.onProgress((data) => {
    if (data.type === "text") {
      setText(prev => prev + data.content);
    } else if (data.type === "tool_call") {
      // 显示工具调用进度
    } else if (data.type === "done") {
      // 对话完成
    } else if (data.type === "error") {
      // 错误处理
    }
  });
  return cleanup;
}, []);

Main 进程 IPC Handler

// main/ipc/index.ts
ipcMain.handle(IPC.CHAT_SEND, async (event, rawParams) => {
  const params = ChatSendSchema.parse(rawParams);  // Zod 验证
  return bridge.send("chat:send", params);
});

ipcMain.handle(IPC.CONFIG_GET, async () => {
  return bridge.send("config:get", {});
});

Bridge 服务流程

renderer.invoke("chat:send", message)
  → main IPC handler (Zod 验证)
    → bridge.send("chat:send", params)
      → JSON.stringify → Python stdin
        → Bridge Server handle_chat_send()
          → AgentLoop.process_direct()
            → [流式事件 → stdout JSON]
              → BridgeManager.parseLine()
                → ipcMain.emit("chat:progress", data)
                  → renderer 事件回调更新 UI