- contracts: isSensitiveQueryParam (whole-name match on SENSITIVE_QUERY_PARAMS or isSensitiveKey), the single source for query credential names - rss/redact: drop local SENSITIVE_QUERY_KEYS; param checks go through isSensitiveQueryParam (+ caller extras); REDACTED re-exported from contracts - browser/redact: CREDENTIAL_PARAM built from SENSITIVE_QUERY_PARAMS, JSON keys also checked with isSensitiveKey; keeps only its own rules (path passkey, cookie names, a11y password fields); remove stray regex statement - redact-consistency.test: 24 credential spellings (pass_key, c_secure_pass, refresh_token, password, uid_key, auth, ...) masked by contracts, rss and browser alike; plain params untouched; rss extract/unredact round-trip Co-Authored-By: Claude Opus 5.5 <[email protected]>
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 与上游文档验证,未连接真实实例。