Overlay 桌面端
OpenCorvus 的 Tauri 2 桌面面板——半透明浮层接管本机 opencorvus serve。
Overlay 是 OpenCorvus 的 Tauri 2 桌面面板:半透明浮层驻留在屏幕右下角,接管本机 opencorvus serve,把 agent 工作流以图形化方式呈现给你。
技术栈
| 层 | 选型 |
|---|---|
| 桌面容器 | Tauri 2(Rust 宿主 + WebView2/WKWebView/WebKitGTK) |
| 前端 | Solid.js 1.9 + Vite 7 |
| 状态管理 | Solid signals(src/store/*) |
| 构建 | Bun + tauri build |
| 后端通信 | SSE(EventSource)+ HTTP REST |
来源:packages/overlay/package.json、src-tauri/Cargo.toml。
启动模式
开发
cd packages/overlaybun run dev # tauri dev:Vite HMR + Rust 热重载bun run dev:vite # 仅前端 Vite(调试 UI 用)或从根目录:
bun run dev:overlay # 等价于 cd packages/overlay/src-tauri && cargo run --release打包
bun run build:overlay # 保留的开发构建,生成当前主机绑定的可执行文件正式安装包(.msi、.dmg、.deb 等)由原生平台矩阵调用
packages/overlay/script/build.ts 生成。
核心面板
| 面板 | 作用 | 文件 |
|---|---|---|
| Board | 任务总览:spec/计划/目标/评估/交付各阶段状态 | src/components/Board.tsx |
| WorkLedger | 左侧 Project、Mission、Task 和 Chat 台账 | src/components/WorkLedger.tsx |
| Conversation | Agent 对话 / 工具调用 / 推理过程 | src/components/Conversation.tsx |
| ChatComposer | 输入框,支持发消息 / 附件 | src/components/ChatComposer.tsx |
| InteractionCard | 时间线和对话框中的权限、问题回复 | src/components/InteractionCard.tsx |
| ChangesPanel | 文件变更 diff 预览 | src/components/ChangesPanel.tsx |
| MemoryPanel | Agent 记忆 / 上下文 | src/components/MemoryPanel.tsx |
| TracePanel | 执行轨迹 | src/components/TracePanel.tsx |
| LogViewer | 原始日志 | src/components/LogViewer.tsx |
设置导航由 src/store/dialog.ts 的 CONFIG_SECTIONS 提供;ConfigDialogHost.tsx 将这些标签页归入 Personal、Expert Squad、Chat、Memory & Context、Integrations、Archived 和 About。
通信机制
SSE 事件流(两条长连接)
-
任务详情流(选中任务时建立)
GET http://127.0.0.1:7878/task/{taskID}/events?after={sequence}任务详情流是 Task 记录读取;服务端从
taskID解析项目归属,不需要directory。代码:
src/services/sse.tsstartSSE()用原生EventSource绕过 WebView2 对fetch().body的缓冲延迟。 -
全局任务列表流(应用级)
GET http://127.0.0.1:7878/task/events代码:
src/services/sse.tsstartTaskListSSE()。这条流根据服务端盖章的notify元数据统一负责系统通知,并刷新任务列表徽标投影。
事件路由
src/services/events.ts routeSSEEvent() 把事件分流:
| 事件 | 目的地 |
|---|---|
message.updated / part.updated / part.delta | messageStore 批处理 |
agent.updated | agentEvents |
config.changed | 触发 loadConfigInfo() |
任务详情流里的 task.* / goal.* / plan.* | handleEventStreamEvent,debounce 刷新 Board |
全局任务列表流里带 notify 的事件 | routeNotification();界面 toast / 系统通知的唯一入口 |
Rust 侧原生能力
src-tauri/src/main.rs 是唯一 Rust 源文件,注册所有 Tauri 命令:
| 命令 | 用途 |
|---|---|
overlay_server_info / overlay_server_restart | 嵌入的 opencorvus 后端进程管理 |
overlay_settings_load / overlay_settings_save | 设置以 overlay.jsonc 持久化到 Tauri app config 目录 |
overlay_pick_dir / overlay_pick_files | 目录 / 文件选择对话框 |
overlay_open_url / overlay_open_path | 外部打开 |
overlay_notification_send | 系统通知与原生 informational 注意提示(Dock 弹跳、任务栏闪烁或桌面环境 urgency hint),聚焦后清除注意状态 |
overlay_toggle_devtools | 开发者工具切换 |
进程清理:Windows 用 Job Object + KILL_ON_JOB_CLOSE;Unix 用 SIGKILL 进程组——确保 overlay 退出时后端进程及子进程全部回收。
后端集成
- 启动时(
main.rssetup):定位嵌入二进制opencorvus[.exe],找空闲端口 →opencorvus serve --hostname 127.0.0.1 --port <port> - 握手:前端
initApp()→overlay_server_info→ 获取实际端口 → 更新 API 客户端基地址 - 健康探测:
GET /global/health,最多重试 8 次 - 重连:每 10 秒轮询,离线后自动重启 SSE
配置
Tauri app config 目录下的 overlay.jsonc 存 UI 偏好(主题、位置、缩放、server URL override);托盘菜单的 Restart 会重启后端并 location.reload() 前端。