refactor(profile): drop CDP casts in favour of the typed boundary Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
amankumarsingh77 amankumarsingh7702@gmail.com
Mon, 27 Jul 2026 23:10:18 +0530
2 files changed,
7 insertions(+),
10 deletions(-)
M
src/profile/bind.ts
→
src/profile/bind.ts
@@ -20,6 +20,7 @@ */
import type { BrowserClient } from "../client"; import { attachTo } from "../cdp/attach"; +import type { ResultOf } from "../cdp/commands"; import { type CdpError, cdpError } from "../cdp/errors"; import { getWindowId } from "../cdp/window"; import { type Result, err, ok } from "../util/result";@@ -31,18 +32,12 @@ /** The launch delegates through ProcessSingleton, so allow for a cold profile. */
const SEED_DEADLINE_MS = 15_000; const SEED_POLL_MS = 500; -type PageTarget = { - readonly targetId: string; - readonly type: string; - readonly url: string; - readonly browserContextId?: string; -}; +type PageTarget = ResultOf<"Target.getTargets">["targetInfos"][number]; const pageTargets = async (client: BrowserClient): Promise<ReadonlyArray<PageTarget>> => { const r = await client.session().callBrowser("Target.getTargets"); if (!r.success) return []; - const data = r.data as { targetInfos: ReadonlyArray<PageTarget> }; - return data.targetInfos.filter((t) => t.type === "page"); + return r.data.targetInfos.filter((t) => t.type === "page"); }; const manualFallbackHint = (pin: ProfilePin): string =>
M
src/profile/browser-process.ts
→
src/profile/browser-process.ts
@@ -373,9 +373,11 @@ ? await collectWin32()
: await collectLinux(); if (candidates.length === 0) return { running: false }; - let best = candidates[0] as BrowserCandidate; + const [first, ...rest] = candidates; + if (!first) return { running: false }; + let best = first; let bestRank = rankBrowserCandidate(best, preferUserDataDir); - for (const candidate of candidates.slice(1)) { + for (const candidate of rest) { const rank = rankBrowserCandidate(candidate, preferUserDataDir); if (rank > bestRank) { best = candidate;