- contracts/browser.ts: provider kind, per-capability {supported, verified} flags,
session/tab/control-lease rows, NavigationBudget, redacted BrowserSnapshot,
DownloadArtifact with blob/secret refs, BrowserErrorKind
- adapters/browser: BrowserProvider interface, camofox client (health, capabilities
static + /openapi.json probe, openSession/navigate/snapshot/screenshot; rest
not_implemented for M2), none provider, redactSnapshot, profile serial lock,
domain allowlist budget; Bearer access key via BrowserSecretResolver
- testkit/browser: mock camofox server (auth, fixtures with secrets, faults)
- db 0023: browser_provider/session/tab/control_lease with one-active-lease and
one-live-session-per-profile partial unique indexes; types regenerated
- docs/design/browser-provider.md: contract, camofox OpenAPI 1.17.0 mapping,
unverified items and M2 prototype checklist; Playwright is not a product browser
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2.4 KiB
2.4 KiB
browser
BrowserProvider 合同(provider.ts)及其实现:业务侧访问浏览器服务只走这套接口。产品浏览器能力对接用户已有的 camofox-browser;Playwright 只用于前端截图测试,不是产品浏览器能力。设计说明见 docs/design/browser-provider.md。
camofox/:camofox-browser 适配器。按 jo-inc/camofox-browser masteropenapi.json(1.17.0)与 README 实现,Authorization: Bearer <CAMOFOX_ACCESS_KEY>,凭据每次请求经BrowserSecretResolver解出,不缓存、不入日志。camofoxuserId= 本项目profileKey(站点/账号隔离),sessionKey=browser_session.id。none.ts:默认实现(未配置浏览器),能力全关,动作报unavailable。redact.ts:redactSnapshot/redactBrowserUrl,快照与地址进入模型前遮蔽密码框值、Cookie 值、含 passkey/token 的 URL。profile-lock.ts:同一 profile 串行锁(进程内内存实现;多进程部署换持久化实现,接口不变)。budget.ts:导航域名白名单(含子域),非 http(s) 拒绝。
v0.1 已实现
health(/health,免认证,503 → degraded)、capabilities(静态声明;probe: true 读上游 /openapi.json 推导,缺端点即降级)、openSession(POST /tabs)、navigate(POST /tabs/{id}/navigate,预算内重试 5xx/超时/网络错误)、snapshot(GET /tabs/{id}/snapshot?format=text,字节预算截断 + 脱敏)、screenshot(GET /tabs/{id}/screenshot,JSON base64 或二进制图片;登录页/含凭据地址标 modelSafe: false)。
M2(当前抛 BrowserError('not_implemented'))
| 方法 | 上游候选端点 | 待办 |
|---|---|---|
closeSession |
DELETE /sessions/{userId} |
与 browser_session 持久化、租约释放一起落地 |
listSessions |
GET /tabs?userId= |
上游只列标签页,会话清单以 DB 为准,需对账 |
click / type |
POST /tabs/{id}/click / type / select |
接凭证代理(TypeInput.kind = 'secret');README 示例 pressEnter 与 OpenAPI submit 字段名不一致,需核验 |
extract |
POST /tabs/{id}/extract(JSON Schema + x-ref) |
需先 snapshot 建 ref 表 |
waitForDownload |
GET /tabs/{id}/downloads?includeData&consume&maxBytes |
产物落 blob 暂存 + sha256,交后端核验 |
acquireControl / releaseControl |
无(上游无接管 API) | 服务层以 browser_control_lease 持久化;画面/输入通道待 VNC 原型 |
仅对 mock 与上游文档验证,未连接真实实例。