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]>
This commit is contained in:
1 parent
269a2269a1
commit
effaa32b70
23 files changed
+2290
No files matched your search
@@ -0,0 +1,46 @@
|
||||
import type { BrowserCapabilities, BrowserCapabilityFlag, BrowserHealth } from "@umt/contracts";
|
||||
import { BROWSER_CAPABILITY_KEYS } from "@umt/contracts";
|
||||
import { BrowserError } from "./errors.ts";
|
||||
import type { BrowserProvider } from "./provider.ts";
|
||||
|
||||
const off: BrowserCapabilityFlag = { supported: false, verified: false, source: "static", note: "未配置浏览器服务" };
|
||||
|
||||
export function noneCapabilities(): BrowserCapabilities {
|
||||
const flags = Object.fromEntries(BROWSER_CAPABILITY_KEYS.map((k) => [k, { ...off }])) as Record<
|
||||
(typeof BROWSER_CAPABILITY_KEYS)[number],
|
||||
BrowserCapabilityFlag
|
||||
>;
|
||||
return { ...flags, upstreamVersion: null, probedAt: null };
|
||||
}
|
||||
|
||||
const unavailable = () => Promise.reject(new BrowserError("unavailable", "未配置浏览器服务"));
|
||||
|
||||
/**
|
||||
* 默认实现:未配置浏览器服务。所有动作返回 unavailable,能力全部 false;
|
||||
* 业务侧据此在界面标注"浏览器不可用",不回退到其他浏览器。
|
||||
*/
|
||||
export function createNoneBrowserProvider(): BrowserProvider {
|
||||
return {
|
||||
kind: "none",
|
||||
async health(): Promise<BrowserHealth> {
|
||||
return { status: "disabled", kind: "none", detail: {}, checkedAt: new Date().toISOString() };
|
||||
},
|
||||
async capabilities() {
|
||||
return noneCapabilities();
|
||||
},
|
||||
openSession: unavailable,
|
||||
closeSession: unavailable,
|
||||
async listSessions() {
|
||||
return [];
|
||||
},
|
||||
navigate: unavailable,
|
||||
snapshot: unavailable,
|
||||
screenshot: unavailable,
|
||||
click: unavailable,
|
||||
type: unavailable,
|
||||
extract: unavailable,
|
||||
waitForDownload: unavailable,
|
||||
acquireControl: unavailable,
|
||||
releaseControl: unavailable,
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user