Files
UHD_Media_Tool/packages/adapters/src/browser/README.md
T
rootandClaude Opus 5.5 effaa32b70 feat(browser): W4-C BrowserProvider contract and camofox-browser adapter skeleton
- 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]>
2026-09-27 21:39:29 +08:00

2.4 KiB

browser

BrowserProvider 合同(provider.ts)及其实现:业务侧访问浏览器服务只走这套接口。产品浏览器能力对接用户已有的 camofox-browser;Playwright 只用于前端截图测试,不是产品浏览器能力。设计说明见 docs/design/browser-provider.md。

  • camofox/:camofox-browser 适配器。按 jo-inc/camofox-browser master openapi.json(1.17.0)与 README 实现,Authorization: Bearer <CAMOFOX_ACCESS_KEY>,凭据每次请求经 BrowserSecretResolver 解出,不缓存、不入日志。camofox userId = 本项目 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 与上游文档验证,未连接真实实例。