feat: release v0.88.0 with automation and browser runtime upgrades

This commit is contained in:
coso
2026-03-16 15:28:21 +08:00
parent 88c3bf93e7
commit 723fafe621
271 changed files with 47044 additions and 19216 deletions
+136 -40
View File
@@ -2,7 +2,25 @@
## 概述
ProxyCast 是一个 Tauri 桌面应用,作为 LLM API 代理网关,支持多 Provider 凭证池管理、协议转换、流量监控等功能。
ProxyCast 是一个以创作为中心的本地优先 AI Agent 交互工作台,基于 Tauri 桌面应用构建,面向创作者、内容团队与轻知识工作者。系统由 Workspace、Skills 编排层、MCP 标准能力层、Claw 渠道层、Artifact 交付层与多模型接入能力共同组成。
可以把它理解为三层结构:
1. **产品层**:Workspace、主题工作台、Agent 对话、Skills、Artifact/Canvas、记忆与风格
2. **能力层**:MCP、浏览器运行时、终端、插件、批量/心跳、Claw 渠道
3. **基础设施层**:Aster Agent、Provider 凭证池、协议兼容、路由、服务器、数据库与监控
其中,Provider 接入、协议兼容与运行时服务共同构成底层能力底座。
同时,术语上应与当前 Agent 生态保持一致:
- **Sessions**:长期会话与协作上下文
- **Handoffs**:任务接力与多阶段编排
- **Guardrails**:权限边界、审批与调用限制
- **Tracing**:时间线、步骤与调用轨迹可观测
- **MCP**:tools / resources / prompts / roots 的标准能力接入
在 ProxyCast 中,Skills 处于比 MCP 更贴近产品的一层:它不是底层原语,而是将领域经验、交互方式和执行流程打包后的编排单元。
## 项目结构
@@ -26,51 +44,106 @@ proxycast/
└── docs/ # 文档
```
## 核心模块
## 架构分层
### 后端 (src-tauri/src/)
### 产品层
| 模块 | 说明 |
|------|------|
| `workspace/` | 工作区与项目边界,承载文件、会话与配置上下文 |
| `components/agent/` | Agent 对话主入口,负责会话、流式事件与交互 |
| `components/content-creator/` | 主题化创作工作台与画布联动 |
| `skills/` | 技能加载、标准校验与经验编排能力 |
| `lib/artifact/` | Artifact 解析、状态与轻量渲染器 |
| `memory / style / personas` | 项目记忆、风格策略与人设沉淀 |
### 能力层
| 模块 | 说明 |
|------|------|
| `src/features/browser-runtime/` | 浏览器协助运行时与调试工作区 |
| `src-tauri/src/terminal/` | 内置终端与 PTY 会话 |
| `src-tauri/src/services/heartbeat_service/` | 异步调度、周期任务与投递 |
| `src-tauri/src/plugin/` | 插件系统 |
| `src-tauri/src/services/mcp_service.rs` | MCP 服务器与工具管理 |
| `src-tauri/src/commands/gateway_channel_cmd.rs` | Telegram / Feishu / Discord Claw 渠道运行时 |
| `src-tauri/src/commands/telegram_remote_cmd.rs` | Telegram 远程触发入口 |
### 基础设施层
| 模块 | 说明 |
|------|------|
| `src-tauri/src/agent/` | Aster Agent 集成、会话、工具注册与流式桥接 |
| `providers/` | LLM Provider 认证和 API 实现 |
| `services/` | 业务服务层 |
| `converter/` | 协议转换 (OpenAI ↔ CW/Claude) |
| `converter/` | 协议转换与兼容层 |
| `server/` | HTTP API 服务器 |
| `credential/` | 凭证池管理 |
| `flow_monitor/` | 流量监控 |
| `terminal/` | 内置终端 |
| `database/` | 数据持久化与 DAO |
### 前端 (src/)
## 核心模块视图
### 后端(`src-tauri/src/`)
| 模块 | 说明 |
|------|------|
| `components/` | React 组件 |
| `agent/` | Aster Agent 运行时桥接与会话管理 |
| `skills/` | Skills 标准集成、动态加载与执行回调 |
| `providers/` | 多 Provider 认证与请求发送 |
| `services/` | 心跳、OpenClaw、浏览器窗口、MCP 等业务服务 |
| `converter/` | 协议兼容与转换 |
| `server/` | HTTP Server 与 REST 能力 |
| `terminal/` | 终端与 PTY |
| `plugin/` | 插件加载与运行时 |
| `voice/` | 语音输入输出与 ASR 流程 |
### 前端(`src/`)
| 模块 | 说明 |
|------|------|
| `components/` | 主 UI 组件与主题工作台 |
| `features/` | 浏览器运行时等较独立特性域 |
| `hooks/` | 业务逻辑 Hooks |
| `lib/` | 工具函数和 API 封装 |
| `pages/` | 页面组件 |
| `lib/api/` | Tauri API 与运行时封装 |
| `lib/artifact/` | Artifact 状态与解析 |
| `pages/` | 独立窗口与页面入口 |
## 数据流
```
┌─────────────────────────────────────────────────────────────────┐
│ 客户端请求 (Cursor/Continue) │
│ 用户请求(工作台 / 对话 / Skills / 飞书 / Telegram) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ HTTP Server │
│ Workspace / Project / Memory Layer │
│ 项目路径、工作区配置、主题、记忆、人设、风格、产物上下文 │
└─────────┬───────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Skills / Orchestration Layer │
│ 经验规则、references、scripts、流程推进、任务接力与阶段切换 │
└─────────┬───────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Agent Runtime │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ OpenAI API │ │ Claude API │ │ Flow Monitor │ │
│ │ 兼容端点 │ │ 兼容端点 │ │ (请求拦截) │ │
│ │ Aster Agent │ │ Session │ │ Stream / Action │ │
│ │ 执行 │ │ 状态 │ │ Request │ │
│ └──────┬──────┘ └──────┬──────┘ └───────────┬─────────────┘ │
└─────────┼────────────────┼─────────────────────┼────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Router / Processor │
│ Execution Surface │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ 模型路由 │ │ 协议转换 │ │ 弹性策略 │ │
│ │ (规则匹配) │ │ (Converter) │ │ (重试/超时) │ │
│ │ MCP Tools / │ │ Browser / │ │ Claw Channels / │ │
│ │ Resources / │ │ Terminal / │ │ Heartbeat / Plugins │ │
│ │ Prompts │ │ Files │ │ │ │
│ └──────┬──────┘ └──────┬──────┘ └───────────┬─────────────┘ │
└─────────┼────────────────┼─────────────────────┼────────────────┘
│ │ │
@@ -89,50 +162,73 @@ proxycast/
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Kiro │ │ Gemini │ │ Claude │ │ OpenAI │ ... │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Artifact / Canvas Layer │
│ 文档、脚本、海报、版本链、画布状态、导出结果与任务沉淀 │
└─────────────────────────────────────────────────────────────────┘
```
## 关键特性
### 1. 多 Provider 支持
- OAuth: Kiro, Gemini, Qwen, Claude, Antigravity
- API Key: OpenAI, Claude, 自定义
### 1. Workspace 驱动
- Workspace 既是文件边界,也是 context 边界和配置边界
- 项目、会话、记忆、风格和 Artifact 围绕同一工作区组织
### 2. 凭证池管理
- 多凭证轮询负载均衡
- 自动健康检查和剔除
- Token 自动刷新
### 2. Skills 驱动
- Skills 是经验交互、流程编排与领域方法沉淀的核心单元
- Skills 可封装 prompt、references、scripts、assets 与调用规则
- Agent 运行时可动态加载、自动发现与调用 Skills
### 3. 协议转换
- OpenAI ↔ CodeWhisperer
- OpenAI ↔ Claude
- OpenAI ↔ Antigravity
### 3. MCP 标准能力层
- 基于 MCP 管理 tools、resources、prompts 与读取边界
- 为 Agent 提供标准化能力发现、调用与上下文共享方式
### 4. 流量监控
- 请求/响应拦截
- Token 统计
- 历史查询
### 4. Claw 渠道协作
- 支持 Telegram / Feishu / Discord 等渠道运行时
- 支持远程触发、异步协作、消息回流与外部入口接入
### 5. Agent Runtime
- 基于 Aster Agent,支持会话、流式事件、工具调用与多模型配置
- 支持任务接力、会话持续化、步骤可观测与长期运行
### 6. Artifact First
- 输出不止是聊天文本,还包括文档、草稿、脚本、版本链与画布产物
- `write_file`、画布联动与主题工作流负责把过程沉淀成交付物
### 7. 多 Provider 与兼容层
- OAuth 与 API Key Provider 并存
- 凭证池、模型路由、协议兼容与 HTTP Server 作为底层支撑
### 8. 本地优先与可扩展
- 桌面应用、本地工作区、插件与外部工具扩展
- 允许在不改变产品主形态的前提下向更多执行环境延展
## 文档索引
### 核心系统
### 产品与工作台
- [workspace.md](workspace.md) - Workspace 边界与工作区设计
- [content-creator.md](content-creator.md) - 主题化创作工作台
- [../../src-tauri/src/skills/README.md](../../src-tauri/src/skills/README.md) - Skills 标准与集成
- [terminal.md](terminal.md) - 终端能力
- [mcp.md](mcp.md) - MCP 服务器
- [plugins.md](plugins.md) - 插件系统
- [aster-integration.md](aster-integration.md) - Agent Runtime 集成
### 基础设施
- [providers.md](providers.md) - Provider 系统
- [credential-pool.md](credential-pool.md) - 凭证池管理
- [converter.md](converter.md) - 协议转换
- [server.md](server.md) - HTTP 服务器
### 前端模块
### 前端与公共模块
- [components.md](components.md) - 组件系统
- [hooks.md](hooks.md) - React Hooks
- [lib.md](lib.md) - 工具库
### 功能模块
- [flow-monitor.md](flow-monitor.md) - 流量监控
- [terminal.md](terminal.md) - 内置终端
- [mcp.md](mcp.md) - MCP 服务器
- [plugins.md](plugins.md) - 插件系统
### 配置与服务
### 配置、服务与数据
- [commands.md](commands.md) - Tauri 命令
- [services.md](services.md) - 业务服务
- [database.md](database.md) - 数据库层
@@ -16,16 +16,17 @@ navigation:
## 下载
从 GitHub Releases/Tags 下载最新版本安装包:
从 GitHub Releases 下载最新版本安装包:
[下载 ProxyCast](https://github.com/aiclientproxy/proxycast/tags)
[下载 ProxyCast](https://github.com/aiclientproxy/proxycast/releases)
### 安装包
| 平台 | 文件名 | 说明 |
|------|--------|------|
| macOS | `ProxyCast_x.x.x_aarch64.dmg` | Apple Silicon Mac |
| Windows | `ProxyCast_x.x.x_x64-setup.exe` | Windows 64位 |
| Windows | `ProxyCast_x.x.x_x64-online-setup.exe` | 默认推荐,体积更小,安装时按需下载 WebView2 |
| Windows | `ProxyCast_x.x.x_x64-offline-setup.exe` | 离线、内网或受限网络环境使用 |
## macOS 安装
@@ -40,11 +41,15 @@ navigation:
## Windows 安装
1. 下载 `.exe` 安装程序
1. 优先下载 `ProxyCast_x.x.x_x64-online-setup.exe`
2. 双击运行安装程序
3. 按照安装向导完成安装
4. 从开始菜单启动 ProxyCast
::alert{type="info"}
如果设备处于离线、内网或受限网络环境,请改用 `ProxyCast_x.x.x_x64-offline-setup.exe`。
::
## 验证安装
启动 ProxyCast 后,你应该看到:
@@ -107,10 +107,11 @@ navigation:
### 处理建议
1. 优先重新下载安装 `ProxyCast_*_x64-setup.exe`
1. 优先重新下载安装 `ProxyCast_*_x64-online-setup.exe`
2. 确认 `%APPDATA%\proxycast\` 与 `%USERPROFILE%\.proxycast\` 可写
3. 如被 SmartScreen 拦截,确认来源可信后再继续
4. 如有条件,运行一键收集脚本后再反馈
4. 如果处于离线、内网或受限网络环境,改用 `ProxyCast_*_x64-offline-setup.exe`
5. 如有条件,运行一键收集脚本后再反馈
详见 [Windows 启动与安装问题](/troubleshooting/windows-startup-issues)。
@@ -20,7 +20,7 @@ navigation:
推荐优先使用:
- `ProxyCast_*_x64-setup.exe`
- `ProxyCast_*_x64-online-setup.exe`
不建议优先分发:
@@ -29,8 +29,8 @@ navigation:
原因:
- `setup.exe` 会一并处理 WebView2 Offline Installer
- 在弱网、离线或新系统环境下成功率更高
- 在线安装包体积更小,适合大多数 Windows 10/11 用户
- 如果处于离线、内网或受限网络环境,请改用 `ProxyCast_*_x64-offline-setup.exe`
## 常见症状与处理
@@ -40,14 +40,14 @@ navigation:
1. 确认下载来源可信
2. 如果被 SmartScreen 拦截,点击“更多信息”后再确认是否继续
3. 重新运行 `setup.exe` 覆盖安装
3. 重新运行 Windows setup 安装包覆盖安装
4. 安装后从开始菜单再次启动
### 启动后白屏
处理建议:
1. 优先重装 `setup.exe`,补齐 WebView2 Runtime
1. 优先重装 Windows setup 安装包,补齐 WebView2 Runtime
2. 检查系统是否禁用了 Edge WebView2 Runtime
3. 再确认本地目录是否可写
@@ -56,7 +56,7 @@ navigation:
处理建议:
1. 不要先手动找旧版运行时
2. 先重新运行 `setup.exe`
2. 先重新运行 Windows setup 安装包
3. 如仍失败,再单独检查 WebView2 Runtime 是否安装完整
## 目录权限检查
+6 -3
View File
@@ -50,7 +50,7 @@ xcode-select --install
**Windows:**
- 安装 Visual Studio Build Tools
- 安装 WebView2(开发模式必需;对外分发时建议使用带离线 WebView2 的 NSIS 安装器)
- 安装 WebView2(开发模式必需;对外分发时默认推荐在线小包,离线或受限网络环境再提供离线大包)
**Linux:**
@@ -141,11 +141,14 @@ pnpm tauri build --target universal-apple-darwin
#### Windows 构建
```bash
# 构建 64 位 Windows 安装包(NSIS setup.exe,内置离线 WebView2 安装器)
# 构建 64 位 Windows 在线安装包(推荐,体积更小,安装时按需下载 WebView2)
pnpm tauri build --target x86_64-pc-windows-msvc --config src-tauri/tauri.windows.online.conf.json
# 构建 64 位 Windows 离线安装包(体积更大,内置离线 WebView2 安装器)
pnpm tauri build --target x86_64-pc-windows-msvc --config src-tauri/tauri.windows.conf.json
```
> 建议对外分发 `-setup.exe`,不要把默认 `.msi` 作为首选下载项。
> 建议默认对外分发在线小包;只有内网、离线或受限网络环境,再提供离线大包。
#### Linux 构建
+2 -2
View File
@@ -42,8 +42,8 @@ navigation:
## Windows 启动失败排查
- 优先确认用户安装的是 `ProxyCast_*_x64-setup.exe`,不要默认分发便携包或旧的 `.msi`
- 首次启动若提示缺少运行时,优先重新运行 `setup.exe`,它会一并安装 WebView2 Offline Installer
- 优先确认用户安装的是 `ProxyCast_*_x64-online-setup.exe`;离线、内网或受限网络环境再提供 `ProxyCast_*_x64-offline-setup.exe`
- 首次启动若提示缺少运行时,优先重新运行 Windows setup 安装包;如果在线安装失败,再切换到 offline 安装包
- 检查 `%APPDATA%\proxycast\` 与 `%USERPROFILE%\.proxycast\` 是否可写;数据库、日志与部分运行时状态依赖这两个目录
- 收集 `%USERPROFILE%\.proxycast\logs\` 与 `%USERPROFILE%\.proxycast\request_logs\` 作为一线排障材料
- 若前端出现 Windows 启动自检提示,按提示项优先检查目录权限、数据库可访问性、WebView2 与 Shell 可用性
@@ -1608,3 +1608,474 @@ Proxycast 已经具备了 CDP 基础设施,采用**渐进式增强**策略:
- ✅ Screencast 优先,Screenshot fallback
- ✅ 单 page target 先行,多 tab 后续
- ✅ 高层 action API,原始 CDP 仅调试用
---
## 九、基于当前代码库的差距复盘(截至 2026-03-15)
> 本节用于校正文档前文的“规划态”描述,按当前仓库真实实现判断 Proxycast 已做到什么、还缺什么,以及后续应如何按基础设施优先推进。
### 9.1 当前已经具备的能力底座
#### A. 实时画面与 CDP 会话底座:已具备,可继续加固
- 已有 `BrowserRuntimeManager`、`CdpSessionState`、事件缓冲区、人工接管状态机:
- `src-tauri/crates/browser-runtime/src/manager.rs`
- `src-tauri/crates/browser-runtime/src/types.rs`
- 已支持 `Page.startScreencast`,失败时自动回退到 `Page.captureScreenshot` 轮询:
- `src-tauri/crates/browser-runtime/src/manager.rs`
- 已暴露 Tauri 命令与前端调试页:
- `src-tauri/src/commands/browser_runtime_cmd.rs`
- `src-tauri/src/commands/webview_cmd.rs`
- `src/features/browser-runtime/BrowserRuntimeWorkspace.tsx`
- `src/features/browser-runtime/BrowserRuntimeDebugPanel.tsx`
#### B. 浏览器 Profile 隔离:已具备基础,但还不是产品级“个人资料”
- 已支持按 `profile_key` 启动独立 Chrome 用户目录,天然保留 cookies / localStorage / 登录态:
- `src-tauri/src/commands/webview_cmd.rs`
- 已支持列出和关闭运行中的 Profile 会话:
- `get_chrome_profile_sessions`
- `close_chrome_profile_session`
- 现状问题:
- 只有“运行中的 Chrome profile 目录”概念,没有“可管理的 Profile 实体”概念
- 没有名称、标签、站点、最后使用时间、描述、导入/导出、锁定策略、加密策略
- 没有“保存当前登录为资料”的明确工作流
#### C. 调度引擎:已具备通用能力,但不是浏览器任务编排
- 已有调度器、轮询执行器、Cron/At/Every 调度计算与健康治理:
- `src-tauri/crates/scheduler/src/*`
- `src-tauri/src/app/scheduler_service.rs`
- `src-tauri/src/services/heartbeat_service/*`
- `src-tauri/src/commands/heartbeat_cmd.rs`
- 现状问题:
- 当前主要服务于 Heartbeat/通用任务,不是浏览器自动化任务模板
- 缺少“任务绑定哪个 browser profile / 环境预设 / 输出 schema / 人工检查点”的模型
#### D. 浏览器动作与输出:已具备最小可用能力
- 已支持 `navigate / click / type / scroll / read_page / read_console_messages / read_network_requests`
- 已有统一的 `browser_execute_action` 多后端编排:
- `src-tauri/src/commands/webview_cmd.rs`
- `src-tauri/crates/browser-runtime/src/action.rs`
- 现状问题:
- 输出仍偏底层:`markdown / page_info / console / network event`
- 没有任务级结构化输出合同,例如 `json schema / table / csv / fields mapping`
### 9.2 与截图功能的差距矩阵
| 功能 | 当前状态 | 结论 |
|------|----------|------|
| 实时画面 | 已有 CDP 帧流、回退截图、调试页、人工接管 | 已做基础版,需稳定化和产品化 |
| 个人资料(已保存的登录信息) | 已有独立 Chrome profile 目录和会话复用 | 部分完成,缺产品级资料管理 |
| 计划任务 | 已有通用调度器、Heartbeat、Cron 校验 | 部分完成,缺浏览器任务模型与 UI |
| 输入和输出 | 已有页面信息、控制台、网络事件、动作执行结果 | 部分完成,缺结构化 I/O 层 |
| 位置定制 | 未见浏览器级代理、地理位置、时区、语言、UA、指纹预设 | 未实现 |
| 证书 | 未见浏览器级客户端证书/站点证书选择与存储模型 | 未实现 |
| 自动验证码求解器 | 仅支持人工接管,没有 solver 抽象与供应商接入 | 未实现 |
| 连接 | 现有 `connection_cmd` 是终端/SSH/WSL 连接,不是外部业务连接器 | 未实现截图语义下的连接器 |
### 9.3 架构判断:先不要直接堆功能页
如果现在直接开始补“位置定制 / 计划任务 / 连接 / 输入和输出”这些页面,仓库会出现新的平行概念:
- 一套运行中 session 概念
- 一套 Chrome profile 目录概念
- 一套 Heartbeat 任务概念
- 一套未来的浏览器任务概念
这会导致三类问题:
- 状态源分裂:Profile、Session、Task、Connector 各自一套 id 和生命周期
- 配置不可复用:位置定制、登录资料、任务调度之间无法组合
- 上层功能失去稳定锚点:定时任务、验证码、人机接管都需要先有稳定的会话装配模型
因此正确顺序不是“按截图逐个做页面”,而是先补一层浏览器控制面(control plane)。
### 9.4 建议新增的统一域模型
#### 1. Browser Profile
表示一个“可复用的登录资料容器”,而不是当前仅存在的目录。
建议字段:
- `id`
- `key`
- `name`
- `description`
- `site_scope`
- `storage_mode`:`persistent | ephemeral`
- `profile_dir`
- `last_used_at`
- `created_at`
- `updated_at`
- `archived_at`
#### 2. Browser Environment Preset
承载“位置定制”能力,后续任务和 Profile 都引用它。
建议字段:
- `id`
- `name`
- `proxy_type`
- `proxy_server`
- `proxy_auth_ref`
- `country`
- `region`
- `city`
- `timezone_id`
- `locale`
- `accept_language`
- `geolocation_lat`
- `geolocation_lng`
- `geolocation_accuracy_m`
- `user_agent`
- `viewport_width`
- `viewport_height`
- `device_scale_factor`
- `platform`
#### 3. Browser Task Template
承载“计划任务”的可执行定义,复用现有 scheduler,而不是另起炉灶。
建议字段:
- `id`
- `name`
- `entry_url`
- `profile_id`
- `environment_preset_id`
- `schedule_kind`
- `schedule_payload`
- `steps`
- `requires_human_checkpoint`
- `output_schema`
- `output_destination`
- `enabled`
#### 4. Browser Connector
承载“连接”能力,目标是把结果投递到外部系统,而不是终端连接。
建议字段:
- `id`
- `type`:`google_sheets | gmail | webhook | drive | notion | ...`
- `name`
- `auth_kind`
- `secret_ref`
- `config_json`
- `status`
- `last_checked_at`
#### 5. Browser Certificate Asset
承载浏览器证书与站点绑定。
建议字段:
- `id`
- `name`
- `cert_kind`:`client_tls | custom_ca`
- `file_ref`
- `passphrase_ref`
- `host_patterns`
- `created_at`
### 9.5 推荐实施优先级
#### P0. 收口现有浏览器控制面(最高优先级)
目标:把“运行时会话”变成后续一切能力的稳定底座。
本阶段做什么:
- 把当前 `profile_key` 升级为数据库中的 `Browser Profile` 实体
- 给运行时 session 增加 `profile_id / environment_preset_id / task_id` 关联位
- 把 `open_chrome_profile_window` 的启动参数抽象成 `LaunchBrowserSessionRequest`
- 保持现有 `cdp_direct / extension_bridge / aster_compat` 编排不变,只收口输入模型
- 给浏览器会话增加稳定审计日志:谁启动、带什么环境、来自哪个任务
本阶段不做什么:
- 不先做 CAPTCHA
- 不先做连接器 UI
- 不先做证书上传页
原因:
- 没有统一控制面,上层功能都会变成一次性参数拼装,后续很难维护
#### P1. 个人资料产品化(高优先级)
目标:让“保存的登录”从目录能力升级为可管理资产。
本阶段做什么:
- 新增 Profile 列表、创建、重命名、归档、删除、最近使用
- 支持“从当前运行会话保存为资料”
- 支持“打开资料并进入人工登录”
- 支持资料与站点作用域绑定
- 支持资料锁定策略和敏感信息隔离说明
验收标准:
- 用户可以明确看到哪些登录资料存在
- 用户可以复用而不是记 `profile_key`
- Agent 可以按 `profile_id` 复用资料
#### P2. 位置定制(高优先级)
目标:让 Profile 可以在不同地区/设备语境中稳定复用。
本阶段做什么:
- 浏览器启动参数支持 `--proxy-server`
- CDP 注入 `Emulation.setGeolocationOverride`
- CDP 注入 `Emulation.setTimezoneOverride`
- CDP 注入 `Emulation.setUserAgentOverride`
- 前端提供 Environment Preset 编辑页
- Profile 与 Preset 解耦,可自由组合
关键原则:
- 位置定制必须是独立 Preset,不能直接塞进 Profile
- 否则同一个登录资料无法复用到多个国家/城市场景
### 9.6 当前已落地的基础层(截至 2026-03-15)
#### 已完成
- `P1 Browser Profile` 已完成第一版资产化:
- 已有 `browser_profiles` 表、DAO、Service、Tauri 命令、前端资料管理 UI
- 运行时会话仍以 `profile_key` 驱动,但新需求已经收口到 `Browser Profile` 实体
- `P2 Browser Environment Preset` 已完成第一版基础落地:
- 已有 `browser_environment_presets` 表、DAO、Service、Tauri 命令、前端预设管理 UI
- 浏览器工作台支持“资料 + 环境预设”组合启动
- 启动链已支持:
- Chrome 启动参数 `--proxy-server`
- CDP 注入 `Emulation.setGeolocationOverride`
- CDP 注入 `Emulation.setTimezoneOverride`
- CDP 注入 `Emulation.setUserAgentOverride`
- CDP 注入 `Emulation.setLocaleOverride`
- CDP 注入 `Emulation.setDeviceMetricsOverride`
- 运行时 `session` 已增加 `environment_preset_id / environment_preset_name` 关联位
- 浏览器运行时统一审计已接入基础层:
- 启动链与动作链统一写入同一浏览器运行时审计缓冲区
- `launch` 审计已覆盖 `profile/profile_id`、环境预设、`session_id/target_id`、URL、复用状态、窗口打开方式、流模式、浏览器来源、CDP 端口
- 调试面板高级区可以直接查看最近启动与动作审计
- 浏览器启动请求已完成第一轮收口:
- 新增统一 `LaunchBrowserSessionRequest`
- `profile_id` 与 `profile_key` 启动都收口到同一 session 启动边界
- `BrowserProfileManager`、浏览器工作台恢复链、Chrome Relay、Agent Chat 浏览器协助都已切到统一启动请求
#### 当前限制
- 代理属于浏览器启动参数;若资料对应的 Chrome 进程已在运行,切换代理前必须先关闭该资料会话
- Locale override 依赖目标 Chrome 版本;若方法不存在,当前实现按 best-effort 处理并保留日志告警
- 当前 Environment Preset 只覆盖运行时真正可落地的字段:
- `proxy_server`
- `timezone_id`
- `locale`
- `accept_language`
- `geolocation_*`
- `user_agent`
- `platform`
- `viewport_*`
- `device_scale_factor`
- 尚未实现:
- 地区标签字段的产品化筛选与统计
- 证书资产
- CAPTCHA solver
- 任务模板与 connector 组合编排
#### 当前事实源分类
- `current`
- `browser_profiles`
- `browser_environment_presets`
- `launch_browser_session + LaunchBrowserSessionRequest`
- `automation_job.payload.browser_session + Automation executor`
- `browser_profile_cmd`
- `browser_environment_cmd`
- `BrowserRuntimeAuditRecord` 统一浏览器运行时审计模型
- `BrowserProfileManager`
- `BrowserEnvironmentPresetManager`
- `BrowserRuntimeDebugPanel` 中的最近启动/动作审计面板
- `compat`
- 旧的裸 `profile_key` / Chrome 目录启动链仍保留,但只允许委托到新控制面,不再承载新功能
- `launch_browser_runtime_assist`
- `launch_browser_profile_runtime_assist_cmd`
- `get_browser_action_audit_logs` 命名暂保留,但返回值已升级为统一运行时审计记录
#### P3. 浏览器计划任务(中高优先级)
目标:复用现有 scheduler/heartbeat 底座,做真正的浏览器自动化任务。
当前进展(第一刀已落地):
- 不新增平行调度系统,先把浏览器任务收口为 `automation_jobs.payload.browser_session`
- 调度执行时直接复用 `launch_browser_session`
- profile / environment preset 在保存任务时就做存在性校验
- 执行历史继续写现有 `ExecutionTracker`
- 自动化详情页已直接嵌入现有 `BrowserRuntimeDebugPanel`,复用 `waiting_for_human / human_controlling / live` 状态机处理人工接管
- 浏览器任务不再在启动成功后立即记为 `success`;现在会保持 `agent_runs=running`,并通过 `session_id -> automation_jobs / agent_runs` 回写 `waiting_for_human / human_controlling / agent_resuming`
- 人工点击“恢复给 Agent”后,会在原链路内把自动化任务收口为成功并恢复下一次调度,不新增 `browser_task_runs` 一类旁路表
- 自动化详情页、运行历史和风险任务面板开始直接消费 `agent_runs.metadata.human_reason`,等待人工/人工接管/恢复中的原因不再只藏在实时面板里
- 自动化主列表开始直显 `当前阻塞 / 最近异常` 摘要,值守时无需进入详情页也能判断浏览器任务卡在什么环节
- `delivery_json` 已扩成最小输出投递配置,支持 `output_format=text|json`
- `delivery_json` 已继续扩展为最小输出契约,新增 `output_schema`
- 当前 `output_schema` 第一版支持:
- `text`
- `json`
- `table`
- `csv`
- `links`
- 第一批输出目标先落 `webhook / local_file`;`webhook` 会携带结构化 `output_data`,`local_file` 用于最小闭环落盘,`telegram` 继续只作为兼容通知通道
- `telegram` 现在明确固定为文本提醒,不承诺结构化 output schema;结构化下游集成只允许继续收敛到 `webhook / local_file`
- `automation_jobs` 已补最小 `last_delivery_json`,最近一次投递结果继续收敛在任务主记录里,不新增投递历史旁路表
- 自动化详情页开始直接展示:
- 输出契约
- 最近一次投递结果
- `best_effort=false` 的语义已收口为真实失败:
- 输出投递失败会把本次 job 最终状态记为 `error`
- 最近一次运行 metadata 会携带 `delivery` 摘要,运行历史与详情页不再各写一套投递状态
本阶段做什么:
- 第一阶段:继续基于 `automation_jobs` 承载浏览器任务模板
- 调度执行时自动装配:`automation job -> profile -> environment preset -> browser session`
- 支持一次性、周期性、cron
- 支持“需要人工介入”的挂起态,与当前 `waiting_for_human / human_controlling` 状态机打通
- 执行历史统一写入现有执行追踪体系
原因:
- 没有 P1/P2,任务就不可复现
- 定时任务是对稳定会话装配能力的消费方,不应先于底座实现
#### P4. 输入和输出 + 连接器(中优先级)
目标:让浏览器任务结果可被下游系统稳定消费。
本阶段做什么:
- 定义 `output_schema`
- 支持输出类型:`text / json / table / csv / links`
- 支持输出目标:`download / local_file / webhook / connector`
- 引入 Browser Connector 抽象
- 第一批只做 `webhook` 和 `google_sheets`
建议顺序:
1. 先做结构化输出 schema
2. 再做 connector 适配器
当前进展(第三刀已落地):
- `delivery_json` 已同时承载:
- `output_schema`
- `output_format`
- `output_schema` 负责表达语义契约,`output_format` 只负责投递编码
- `webhook` 当前会稳定输出:
- `output_schema`
- `output_format`
- `output_data`
- `local_file` 当前支持:
- text 模式按 schema 渲染
- json 模式落结构化 payload
- `automation_jobs.last_delivery_json` 已承载最近一次投递结果,历史开关关闭时仍可直接在任务详情中观察
- `agent_runs.metadata.delivery` 已补投递摘要,运行历史和详情页共用同一份运行态事实
当前进展(第四刀已落地):
- 不新增 `browser_connectors` 表,也不引入独立 connector runtime
- 第一个真正 connector 已继续收敛到现有 `delivery` 边界:
- `channel=google_sheets`
- 继续使用 `automation_jobs.delivery_json`
- 继续把最近一次投递结果写回 `automation_jobs.last_delivery_json`
- `google_sheets` 当前采用最小 service account 直连模式:
- 目标串使用 `spreadsheet_id=...;sheet=...;credentials_file=...`
- 可选 `include_header=true`
- 可选 `value_input_option=RAW|USER_ENTERED`
- 输出语义继续复用现有 `output_schema`:
- `table/csv` 直接按行追加
- `links` 追加为链接记录
- `text/json` 追加为单行摘要/JSON 记录
- `telegram` 仍维持 `compat` 文本通知;结构化下游集成只允许继续收敛到 `webhook / local_file / google_sheets`
当前进展(第五刀已落地):
- delivery 幂等与重试语义继续收敛在同一条事实源:
- `automation_service::delivery`
- `automation_jobs.last_delivery_json`
- `agent_runs.metadata.delivery`
- 新增稳定 `delivery_attempt_id`:
- 有 `run_id` 时直接复用 `dlv-{run_id}`
- 无 history/run_id 时按 `job_id + started_at + execution_retry_count` 生成稳定哈希键
- `webhook` 当前会输出并透传:
- payload 字段 `delivery_attempt_id`
- 请求头 `Idempotency-Key`
- 请求头 `X-Proxycast-Delivery-Attempt-Id`
- `google_sheets` 当前会在每一行前置:
- `delivery_attempt_id`
- `run_id`
- `job_id`
- `execution_retry_count`
- 网络型输出目标当前采用最小内建重试:
- `webhook`
- `google_sheets`
- 默认最多 3 次,保留同一个 `delivery_attempt_id`
- `last_delivery_json` 与运行历史 metadata 当前会继续记录:
- `delivery_attempt_id`
- `run_id`
- `execution_retry_count`
- `delivery_attempts`
下一刀不应继续堆通知通道,应该优先补:
- 输出目标的能力边界说明
- 连接器失败重试与幂等策略
原因:
- 没有统一输出 schema,连接器会各自解析页面结果,后续无法维护
#### P5. 证书(中低优先级)
目标:支持企业站点、银行类或需要 mTLS 的场景。
本阶段做什么:
- 先只支持 `client_tls` 证书资产管理
- 支持证书与 host pattern 绑定
- 启动浏览器时注入证书选择策略或使用平台能力完成匹配
为什么不是更早:
- 这是企业纵深能力,不是大多数浏览器任务的基础阻塞项
#### P6. 自动验证码求解器(低优先级)
目标:减少人工介入,但不破坏当前可用的人机协同链路。
本阶段做什么:
- 先定义 `CaptchaSolver` 抽象
- 再接第三方供应商
- 最后支持策略:自动求解失败后回退人工接管
为什么最后做:
- 当前已有人工接管 + 实时画面,可满足可用性底线
- CAPTCHA 成本高、供应商不稳定、风控强,不应先于 Profile/Preset/Task/I-O
### 9.6 建议的数据库与模块落点
建议新增表:
- `browser_profiles`
- `browser_environment_presets`
- `browser_profile_bindings`
- `browser_task_templates`
- `browser_task_runs`
- `browser_connectors`
- `browser_certificate_assets`
建议新增模块:
- `src-tauri/src/browser_control/`
- `profile_service.rs`
- `environment_preset_service.rs`
- `task_template_service.rs`
- `connector_service.rs`
- `certificate_service.rs`
建议保持不动的模块:
- `src-tauri/crates/browser-runtime/`
- 继续只做运行时与 CDP 交互
- `src-tauri/src/commands/webview_cmd.rs`
- 继续做命令入口,但逐步改为调用新 service
- `src-tauri/src/app/scheduler_service.rs`
- 继续复用,不重新发明调度器
### 9.7 结论
从代码现状看,Proxycast 并不是“还没有浏览器底座”,而是已经跨过了最难的第一步:
- 已有实时画面
- 已有 CDP 会话
- 已有人工接管
- 已有独立 Chrome profile
- 已有通用调度器
真正缺的是中间那层“浏览器控制面产品模型”:
- Profile 还是目录,不是资产
- 调度器还是通用任务,不是浏览器任务
- 输出还是原始事件,不是结构化结果
- 连接还是终端连接,不是业务连接器
所以后续路线必须是:
1. 先收口控制面
2. 再做个人资料
3. 再做位置定制
4. 再做浏览器定时任务
5. 再做输入和输出与连接器
6. 最后补证书与自动验证码
这条路线最符合当前仓库状态,也最符合 KISS / YAGNI / DRY:先把已有底座变成稳定平台,再让上层功能自然长出来。