@agentproto/browser-profiles 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/known.ts","../src/cookie.ts","../src/auth-signals.ts","../src/local-state.ts","../src/descriptor.ts","../src/store.ts","../src/session-sources.ts","../src/local-session.ts","../src/chrome-identity.ts","../src/chrome-launch.ts","../src/camofox-session.ts","../src/resolve.ts","../src/consent/errors.ts","../src/consent/domains.ts","../src/consent/ledger.ts","../src/consent/grants.ts","../src/consent/ports.ts","../src/consent/host.ts","../src/consent/agent.ts","../src/consent/doctor.ts"],"names":["platform","join","homedir","path","readFileSync","existsSync","readdirSync","osPlatform","rmSync","mkdirSync","writeFileSync","z","cookies","ToolError","dirname","isPosix","statSync","chmodSync","renameSync","mkdtempSync","tmpdir","copyFileSync"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ToolError } from \"@agentproto/tool\"\n\nexport const SESSION_SOURCE_UNKNOWN_CODE = \"browser-profiles:unknown-source\" as const\nexport const SESSION_SOURCE_DUPLICATE_CODE = \"browser-profiles:duplicate-source\" as const\nexport const SESSION_DESCRIPTOR_INVALID_CODE = \"browser-profiles:invalid-descriptor\" as const\n\n/** Thrown when a descriptor names a session source kind nobody registered. */\nexport class SessionSourceUnknownError extends ToolError {\n readonly kind: string\n readonly registered: readonly string[]\n\n constructor(kind: string, registered: readonly string[]) {\n super({\n code: SESSION_SOURCE_UNKNOWN_CODE,\n message:\n `no session source registered for kind \"${kind}\"; ` +\n `registered: ${registered.length ? registered.join(\", \") : \"none\"}. ` +\n `Register one with registry.register({ kind, materialize }) before resolving the session.`,\n })\n this.name = \"SessionSourceUnknownError\"\n this.kind = kind\n this.registered = registered\n }\n}\n\n/** Thrown when a session source kind is registered twice. */\nexport class SessionSourceDuplicateError extends ToolError {\n readonly kind: string\n\n constructor(kind: string) {\n super({\n code: SESSION_SOURCE_DUPLICATE_CODE,\n message: `a session source for kind \"${kind}\" is already registered`,\n })\n this.name = \"SessionSourceDuplicateError\"\n this.kind = kind\n }\n}\n\n/** Thrown when a JSON document is not a readable session descriptor. */\nexport class SessionDescriptorInvalidError extends ToolError {\n readonly issues: readonly string[]\n\n constructor(issues: readonly string[]) {\n super({\n code: SESSION_DESCRIPTOR_INVALID_CODE,\n message: `not a valid session descriptor: ${issues.join(\"; \")}`,\n })\n this.name = \"SessionDescriptorInvalidError\"\n this.issues = issues\n }\n}\n\nexport function isSessionSourceUnknownError(value: unknown): value is SessionSourceUnknownError {\n return value instanceof SessionSourceUnknownError\n}\n\nexport const SESSION_SOURCE_RESERVED_CODE = \"browser-profiles:reserved-source\" as const\nexport const ACCOUNT_SWITCHER_MISSING_CODE = \"browser-profiles:account-switcher-missing\" as const\nexport const CHROME_IDENTITY_CODE = \"browser-profiles:chrome-identity\" as const\nexport const SESSION_RESOLVE_CODE = \"browser-profiles:resolve\" as const\n\n/** Thrown when a host tries to register a session source under a built-in strategy kind. */\nexport class SessionSourceReservedError extends ToolError {\n readonly kind: string\n\n constructor(kind: string) {\n super({\n code: SESSION_SOURCE_RESERVED_CODE,\n message: `\"${kind}\" is a built-in strategy kind and cannot be registered as a session source`,\n })\n this.name = \"SessionSourceReservedError\"\n this.kind = kind\n }\n}\n\n/** Thrown when a descriptor pins a sub-account but no `accountSwitcher` hook was provided. */\nexport class AccountSwitcherMissingError extends ToolError {\n constructor(platform: string) {\n super({\n code: ACCOUNT_SWITCHER_MISSING_CODE,\n message:\n `the session pins a sub-account on \"${platform}\" but no accountSwitcher hook was provided; ` +\n `refusing to continue, since acting as the wrong account is worse than failing`,\n })\n this.name = \"AccountSwitcherMissingError\"\n }\n}\n\n/** A Chrome profile could not be confirmed as the pinned, logged-in identity. */\nexport class ChromeIdentityError extends ToolError {\n constructor(message: string) {\n super({ code: CHROME_IDENTITY_CODE, message })\n this.name = \"ChromeIdentityError\"\n }\n}\n\n/** A session descriptor could not be turned into a live session. */\nexport class SessionResolveError extends ToolError {\n constructor(message: string, cause?: unknown) {\n super({ code: SESSION_RESOLVE_CODE, message, ...(cause !== undefined ? { cause } : {}) })\n this.name = \"SessionResolveError\"\n }\n}\n","/**\n * A value a read might not be able to produce: either a `known` result or an\n * `unknown` with a human reason. A cookie read that threw (sqlite3 missing, the\n * DB copy failed, Chrome holding the Cookies lock) is `{ unknown }`, so a caller\n * can never mistake a failed read for a confident empty or zero result.\n */\nexport type Known<T> = { known: T } | { unknown: string }\n\nexport function isKnown<T>(k: Known<T>): k is { known: T } {\n return \"known\" in k\n}\n\n/** Collapse a {@link Known} to a plain value with an explicit fallback (a deliberate, greppable decision). */\nexport function knownOr<T>(k: Known<T>, fallback: T): T {\n return isKnown(k) ? k.known : fallback\n}\n","/** A cookie to inject into a browser session (camofox and Playwright shape). `value` is a secret: never log it. */\nexport interface SessionCookie {\n name: string\n value: string\n domain: string\n path?: string\n httpOnly?: boolean\n secure?: boolean\n sameSite?: string\n expires?: number\n}\n\n/** The loose shape a cookie file or a decrypted jar yields before normalising. */\nexport interface RawCookie {\n name: string\n value: string\n domain: string\n path?: string\n httpOnly?: boolean\n secure?: boolean\n sameSite?: string\n expires?: number\n expirationDate?: number\n session?: boolean\n}\n\nexport function domainMatches(domain: string | undefined, domains: readonly string[]): boolean {\n const h = String(domain ?? \"\")\n .replace(/^\\./, \"\")\n .toLowerCase()\n return domains.some(d => h === d || h.endsWith(`.${d}`))\n}\n\nexport function toSessionCookie(c: RawCookie): SessionCookie {\n const o: SessionCookie = {\n name: c.name,\n value: c.value,\n domain: c.domain,\n path: c.path || \"/\",\n }\n if (c.httpOnly != null) o.httpOnly = c.httpOnly\n if (c.secure != null) o.secure = c.secure\n if (c.sameSite) o.sameSite = String(c.sameSite)\n const exp = c.expires ?? c.expirationDate\n if (!c.session && exp) o.expires = Math.floor(exp)\n return o\n}\n\n/** Drop duplicates by (name, domain, path); aliased domains otherwise yield the same cookie twice. */\nexport function dedupeCookies(cookies: readonly SessionCookie[]): SessionCookie[] {\n const seen = new Map<string, SessionCookie>()\n for (const c of cookies) seen.set(`${c.name}|${c.domain}|${c.path}`, c)\n return [...seen.values()]\n}\n","/**\n * Per-site \"am I signed in\" detectors, injected. The package ships none: which\n * cookie name proves a live login on a given site is site knowledge, so the host\n * registers it. A detector sees cookie NAMES and expiry only, never values.\n */\n\n/** Cookie metadata a detector may look at. No value, by design. */\nexport interface AuthCookieMeta {\n name: string\n /** Host key without the leading dot, lowercased. */\n host: string\n /** Unix seconds; `undefined` means a session cookie (valid while the browser is open). */\n expiresUnix: number | undefined\n}\n\nexport interface SiteAuthSignal {\n /** Registrable domain the detector is about, e.g. `\"example.com\"`. */\n readonly domain: string\n /** Other hosts whose cookies count as this domain (e.g. a renamed site). */\n readonly aliases?: readonly string[]\n /** Cookie NAME(s) that prove a live login. Any one present and unexpired counts. Ignored when `detect` is set. */\n readonly cookieNames?: readonly string[]\n /** Custom detector over this domain's cookie metadata; overrides the `cookieNames` rule. */\n readonly detect?: (cookies: readonly AuthCookieMeta[], nowMs: number) => boolean\n}\n\nexport interface AuthSignalRegistry {\n register(signal: SiteAuthSignal): void\n /** Domains with a registered detector: the KNOWN side of the known/unknown split. */\n knownDomains(): readonly string[]\n isKnownDomain(domain: string): boolean\n /** Map an alias host onto its registered domain; anything else passes through lowercased. */\n canonicalDomain(domain: string): string\n /** Other hosts that count as the same site as `domain` (its aliases, or its canonical domain plus siblings). */\n equivalentDomains(domain: string): readonly string[]\n /** Whether `host` belongs to `domain` (or one of its aliases). */\n hostBelongsTo(host: string, domain: string): boolean\n /** Run the detector for `domain` over the profile's cookie metadata. `false` when no detector is registered. */\n isAuthed(domain: string, cookies: readonly AuthCookieMeta[], nowMs: number): boolean\n}\n\nconst norm = (d: string): string => d.replace(/^\\./, \"\").toLowerCase()\n\nconst hostMatches = (host: string, domain: string): boolean => host === domain || host.endsWith(`.${domain}`)\n\nexport function createAuthSignalRegistry(initial: readonly SiteAuthSignal[] = []): AuthSignalRegistry {\n const signals = new Map<string, SiteAuthSignal>()\n\n const registry: AuthSignalRegistry = {\n register(signal) {\n signals.set(norm(signal.domain), signal)\n },\n knownDomains: () => [...signals.keys()],\n isKnownDomain: domain => signals.has(norm(domain)),\n canonicalDomain(domain) {\n const d = norm(domain)\n if (signals.has(d)) return d\n for (const s of signals.values()) {\n if (s.aliases?.some(a => norm(a) === d)) return norm(s.domain)\n }\n return d\n },\n equivalentDomains(domain) {\n const d = norm(domain)\n const canon = registry.canonicalDomain(d)\n const s = signals.get(canon)\n const all = [canon, ...(s?.aliases ?? []).map(norm)]\n return [...new Set(all)].filter(x => x !== d)\n },\n hostBelongsTo(host, domain) {\n const h = norm(host)\n const s = signals.get(norm(domain))\n const names = [norm(domain), ...(s?.aliases ?? []).map(norm)]\n return names.some(n => hostMatches(h, n))\n },\n isAuthed(domain, cookies, nowMs) {\n const s = signals.get(norm(domain))\n if (!s) return false\n const mine = cookies.filter(c => registry.hostBelongsTo(c.host, domain))\n if (s.detect) return s.detect(mine, nowMs)\n const names = s.cookieNames ?? []\n return mine.some(c => names.includes(c.name) && (c.expiresUnix === undefined || c.expiresUnix > nowMs / 1000))\n },\n }\n for (const s of initial) registry.register(s)\n return registry\n}\n\n/** Process-wide default registry (empty). Hosts register their detectors here or pass their own. */\nexport const defaultAuthSignalRegistry: AuthSignalRegistry = createAuthSignalRegistry()\n","/**\n * Chrome `Local State` parsing: the one implementation, shared by the Chrome\n * profile scanner here and by `@agentproto/plugin-local-browser`.\n *\n * macOS: ~/Library/Application Support/Google/Chrome/Local State\n * Linux: ~/.config/google-chrome/Local State\n * Win: %LOCALAPPDATA%\\Google\\Chrome\\User Data\\Local State\n */\n\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { homedir, platform } from \"node:os\"\nimport { join } from \"node:path\"\n\n/** Resolves the platform-specific Chrome user-data-dir root. */\nexport function chromeUserDataDir(home: string = homedir()): string {\n switch (platform()) {\n case \"darwin\":\n return join(home, \"Library\", \"Application Support\", \"Google\", \"Chrome\")\n case \"win32\":\n return join(process.env.LOCALAPPDATA ?? join(home, \"AppData\", \"Local\"), \"Google\", \"Chrome\", \"User Data\")\n default:\n return join(home, \".config\", \"google-chrome\")\n }\n}\n\nexport function chromeLocalStatePath(home: string = homedir()): string {\n return join(chromeUserDataDir(home), \"Local State\")\n}\n\n/** One `profile.info_cache` entry, reduced to the fields callers use. */\nexport interface LocalStateProfile {\n /** Directory name under the user-data-dir (`Default`, `Profile 1`). */\n directory: string\n /** Friendly profile name. */\n name: string | undefined\n /** Signed-in Google account email (`user_name`). */\n userName: string | undefined\n /** Google display name. */\n gaiaName: string | undefined\n /** Raw Chrome activity stamp (`active_time`, else `last_active_time`), unconverted. */\n activeTime: unknown\n}\n\nexport interface ParsedLocalState {\n profiles: LocalStateProfile[]\n /** `profile.last_used`, or `null` when absent. */\n lastUsed: string | null\n}\n\ninterface RawProfileInfo {\n name?: unknown\n user_name?: unknown\n gaia_name?: unknown\n active_time?: unknown\n last_active_time?: unknown\n}\n\ninterface RawLocalState {\n profile?: {\n info_cache?: Record<string, RawProfileInfo>\n last_used?: unknown\n }\n}\n\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined)\n\n/** Parse Local State JSON text. Throws on malformed JSON. */\nexport function parseLocalState(text: string): ParsedLocalState {\n const parsed = JSON.parse(text) as RawLocalState\n const cache = parsed.profile?.info_cache ?? {}\n return {\n profiles: Object.entries(cache).map(([directory, info]) => ({\n directory,\n name: str(info.name),\n userName: str(info.user_name),\n gaiaName: str(info.gaia_name),\n activeTime: info.active_time ?? info.last_active_time,\n })),\n lastUsed: str(parsed.profile?.last_used) ?? null,\n }\n}\n\n/** Lenient read of `<chromeRoot>/Local State`: a missing or unreadable file is an empty result. */\nexport function readLocalState(chromeRoot: string): ParsedLocalState {\n const file = join(chromeRoot, \"Local State\")\n if (!existsSync(file)) return { profiles: [], lastUsed: null }\n try {\n return parseLocalState(readFileSync(file, \"utf8\"))\n } catch {\n return { profiles: [], lastUsed: null }\n }\n}\n\n/**\n * Chrome stores timestamps as microseconds since the Windows epoch (1601-01-01\n * UTC). Convert to ISO-8601, or return \"\" when the field is missing or out of\n * plausible range (so callers can't surface 1601 in a UI).\n */\nexport function chromeTimeToIso(raw: unknown): string {\n if (typeof raw !== \"number\" || !Number.isFinite(raw) || raw <= 0) return \"\"\n // > 1e16: microseconds since 1601 (modern Chrome); > 1e12: unix ms; > 1e9: unix seconds (legacy).\n let unixMs: number\n if (raw > 1e16) {\n unixMs = Math.floor(raw / 1000) - 11_644_473_600_000\n } else if (raw > 1e12) {\n unixMs = raw\n } else if (raw > 1e9) {\n unixMs = raw * 1000\n } else {\n return \"\"\n }\n if (unixMs <= 0 || unixMs > Date.now() + 86_400_000) return \"\"\n return new Date(unixMs).toISOString()\n}\n","/**\n * The session descriptor model: a saveable, named description of a browser\n * session and EXACTLY which cookies to inject (by domain, never the whole jar).\n *\n * Wire compatibility is the contract: descriptors already on disk (written by\n * the earlier studio code) load unchanged. The schemas below validate shape but\n * never rewrite it; {@link parseSessionDescriptor} returns the parsed JSON as\n * written, so a load followed by a save is byte-stable.\n */\n\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { z } from \"zod\"\nimport { SessionDescriptorInvalidError } from \"./errors.js\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Built-in strategy kinds. Any other kind is a registered {@link SessionSource}. */\nexport const BUILTIN_STRATEGY_KINDS = [\"chrome-cookie\", \"stored-credential\", \"authed-storageState\"] as const\nexport type BuiltinStrategyKind = (typeof BUILTIN_STRATEGY_KINDS)[number]\n\n/** Built-in `inject.from` tags. Any other tag is a registered {@link SessionSource}. */\nexport const BUILTIN_INJECT_FROM = [\"chrome-profile\", \"file\", \"camofox-native\"] as const\nexport type BuiltinInjectFrom = (typeof BUILTIN_INJECT_FROM)[number]\n\nexport interface ChromeProfileInject {\n from: \"chrome-profile\"\n domains: string[]\n /** Required: with several profiles on one site, \"first match\" would pick at random. */\n profile: string\n /** Sub-account selector for multi-account profiles; needs an `accountSwitcher` hook. */\n account?: { platform: string; userId: string }\n}\n\nexport interface FileInject {\n from: \"file\"\n domains: string[]\n path: string\n}\n\n/** The session owns its login (camofox storageState under the descriptor id); nothing is injected. */\nexport interface CamofoxNativeInject {\n from: \"camofox-native\"\n}\n\n/**\n * Cookies materialised at resolve time by a registered {@link SessionSource}.\n * The descriptor carries only the `sessionRef` and `domains`, never cookies.\n * `from` is the source kind (the studio's private store registers `\"guilde\"`).\n */\nexport interface SourceInject {\n from: string\n domains: string[]\n sessionRef: string\n}\n\nexport type SessionInject = ChromeProfileInject | FileInject | CamofoxNativeInject | SourceInject\n\nexport type SessionInjectFrom = SessionInject[\"from\"]\n\nexport interface ChromeCookieStrategy {\n kind: \"chrome-cookie\"\n domains: string[]\n /** Chrome profile dir (\"Default\", \"Profile 1\"). */\n profile: string\n profileName?: string\n profileEmail?: string\n account?: { platform: string; userId: string }\n}\n\n/** A re-login CAPABILITY: only the credential reference, never the secret. Not a resolve source. */\nexport interface StoredCredentialStrategy {\n kind: \"stored-credential\"\n platform: string\n account: string\n}\n\nexport interface OwnedStorageStateStrategy {\n kind: \"authed-storageState\"\n storageStatePath: string\n capturedAt?: string\n}\n\n/** A registered-source strategy: `kind` is the source kind. */\nexport interface SourceStrategy {\n kind: string\n domains: string[]\n sessionRef: string\n}\n\nexport type Strategy = ChromeCookieStrategy | StoredCredentialStrategy | OwnedStorageStateStrategy | SourceStrategy\n\nexport function isBuiltinStrategyKind(kind: string): kind is BuiltinStrategyKind {\n return (BUILTIN_STRATEGY_KINDS as readonly string[]).includes(kind)\n}\n\nexport const isChromeCookieStrategy = (s: Strategy): s is ChromeCookieStrategy => s.kind === \"chrome-cookie\"\nexport const isStoredCredentialStrategy = (s: Strategy): s is StoredCredentialStrategy => s.kind === \"stored-credential\"\nexport const isOwnedStorageStateStrategy = (s: Strategy): s is OwnedStorageStateStrategy =>\n s.kind === \"authed-storageState\"\nexport const isSourceStrategy = (s: Strategy): s is SourceStrategy => !isBuiltinStrategyKind(s.kind)\n\nexport const isChromeProfileInject = (i: SessionInject): i is ChromeProfileInject => i.from === \"chrome-profile\"\nexport const isFileInject = (i: SessionInject): i is FileInject => i.from === \"file\"\nexport const isCamofoxNativeInject = (i: SessionInject): i is CamofoxNativeInject => i.from === \"camofox-native\"\nexport const isSourceInject = (i: SessionInject): i is SourceInject =>\n !(BUILTIN_INJECT_FROM as readonly string[]).includes(i.from)\n\n/** The account a session is pinned to: for naming and drift detection. */\nexport interface SessionIdentity {\n profile?: string\n account?: string\n platform?: string\n profileName?: string\n profileEmail?: string\n}\n\nexport type AuthStatus = \"authenticated\" | \"auth-wall\" | \"stale\" | \"unknown\"\n\nexport interface SessionDescriptor {\n /** Stable name the agent resolves by. */\n id: string\n /** `camofox`: a stealth browser we inject curated cookies into. `chrome`: the user's own browser over a driver, no injection. */\n backend: \"camofox\" | \"chrome\"\n identity?: SessionIdentity\n /** Legacy single-source seam; {@link strategies} is the multi-source model. */\n inject?: SessionInject\n strategies?: Strategy[]\n base?: string\n url?: string\n savedAt?: string\n lastVerifiedAt?: string\n lastAuthStatus?: AuthStatus\n lastCookieRefreshAt?: string\n}\n\n// ---------------------------------------------------------------------------\n// Schemas (loose: unknown keys survive a round trip)\n// ---------------------------------------------------------------------------\n\nconst accountSchema = z.object({ platform: z.string(), userId: z.string() }).loose()\n\nconst chromeProfileInjectSchema = z\n .object({\n from: z.literal(\"chrome-profile\"),\n domains: z.array(z.string()),\n profile: z.string(),\n account: accountSchema.optional(),\n })\n .loose()\nconst fileInjectSchema = z.object({ from: z.literal(\"file\"), domains: z.array(z.string()), path: z.string() }).loose()\nconst camofoxNativeInjectSchema = z.object({ from: z.literal(\"camofox-native\") }).loose()\nconst sourceInjectSchema = z\n .object({ from: z.string().min(1), domains: z.array(z.string()), sessionRef: z.string() })\n .loose()\n\nexport const sessionInjectSchema = z.union([\n chromeProfileInjectSchema,\n fileInjectSchema,\n camofoxNativeInjectSchema,\n sourceInjectSchema,\n])\n\nconst chromeCookieStrategySchema = z\n .object({\n kind: z.literal(\"chrome-cookie\"),\n domains: z.array(z.string()),\n profile: z.string(),\n profileName: z.string().optional(),\n profileEmail: z.string().optional(),\n account: accountSchema.optional(),\n })\n .loose()\nconst storedCredentialStrategySchema = z\n .object({ kind: z.literal(\"stored-credential\"), platform: z.string(), account: z.string() })\n .loose()\nconst ownedStorageStateStrategySchema = z\n .object({ kind: z.literal(\"authed-storageState\"), storageStatePath: z.string(), capturedAt: z.string().optional() })\n .loose()\nconst sourceStrategySchema = z\n .object({ kind: z.string().min(1), domains: z.array(z.string()), sessionRef: z.string() })\n .loose()\n\nexport const strategySchema = z.union([\n chromeCookieStrategySchema,\n storedCredentialStrategySchema,\n ownedStorageStateStrategySchema,\n sourceStrategySchema,\n])\n\nexport const sessionIdentitySchema = z\n .object({\n profile: z.string().optional(),\n account: z.string().optional(),\n platform: z.string().optional(),\n profileName: z.string().optional(),\n profileEmail: z.string().optional(),\n })\n .loose()\n\nexport const authStatusSchema = z.enum([\"authenticated\", \"auth-wall\", \"stale\", \"unknown\"])\n\nexport const sessionDescriptorSchema = z\n .object({\n id: z.string().min(1),\n backend: z.enum([\"camofox\", \"chrome\"]),\n identity: sessionIdentitySchema.optional(),\n inject: sessionInjectSchema.optional(),\n strategies: z.array(strategySchema).optional(),\n base: z.string().optional(),\n url: z.string().optional(),\n savedAt: z.string().optional(),\n lastVerifiedAt: z.string().optional(),\n lastAuthStatus: authStatusSchema.optional(),\n lastCookieRefreshAt: z.string().optional(),\n })\n .loose()\n\n/**\n * Validate a parsed JSON document as a {@link SessionDescriptor} and return it AS\n * WRITTEN (not the zod output, which reorders keys), so a load then a save is\n * byte-stable. Throws {@link SessionDescriptorInvalidError} on a bad shape.\n */\nexport function parseSessionDescriptor(json: unknown): SessionDescriptor {\n const result = sessionDescriptorSchema.safeParse(json)\n if (!result.success) {\n throw new SessionDescriptorInvalidError(\n result.error.issues.map(i => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`),\n )\n }\n return json as SessionDescriptor\n}\n\n// ---------------------------------------------------------------------------\n// Owned storage state path\n// ---------------------------------------------------------------------------\n\n/** Persisted storageState of an owned camofox session: `<CAMOFOX_PROFILES_DIR or ~/.agentproto/camofox-profiles>/<id>.json`. */\nexport function ownedStorageStatePath(id: string): string {\n const safeId = id.replace(/[^\\w.-]/g, \"_\")\n return join(process.env[\"CAMOFOX_PROFILES_DIR\"] ?? join(homedir(), \".agentproto\", \"camofox-profiles\"), `${safeId}.json`)\n}\n\n// ---------------------------------------------------------------------------\n// Normalisation and strategy selection\n// ---------------------------------------------------------------------------\n\n/** inject.from to strategy kind: file collapses onto chrome-cookie; a source tag is its own kind. */\nexport function injectKindOf(from: SessionInjectFrom): Strategy[\"kind\"] {\n if (from === \"chrome-profile\" || from === \"file\") return \"chrome-cookie\"\n if (from === \"camofox-native\") return \"authed-storageState\"\n return from\n}\n\n/** strategy kind to inject.from; `stored-credential` has no transport. */\nexport function injectFromOf(kind: Strategy[\"kind\"]): SessionInjectFrom | undefined {\n if (kind === \"chrome-cookie\") return \"chrome-profile\"\n if (kind === \"authed-storageState\") return \"camofox-native\"\n if (kind === \"stored-credential\") return undefined\n return kind\n}\n\nexport function chromeCookieStrategyOf(inject: ChromeProfileInject, identity?: SessionIdentity): ChromeCookieStrategy {\n return {\n kind: \"chrome-cookie\",\n domains: inject.domains,\n profile: inject.profile,\n ...(identity?.profileName ? { profileName: identity.profileName } : {}),\n ...(identity?.profileEmail ? { profileEmail: identity.profileEmail } : {}),\n ...(inject.account ? { account: inject.account } : {}),\n }\n}\n\nexport interface NormalizeOptions {\n /** (platform, account) credential index: a match synthesizes a `stored-credential` strategy. Never secrets. */\n credentials?: ReadonlyArray<{ platform: string; account: string }>\n}\n\nfunction deriveStrategies(raw: SessionDescriptor, opts: NormalizeOptions): Strategy[] {\n const out: Strategy[] = []\n const inject = raw.inject\n if (inject) {\n if (isChromeProfileInject(inject)) {\n out.push(chromeCookieStrategyOf(inject, raw.identity))\n } else if (isFileInject(inject)) {\n out.push({\n kind: \"chrome-cookie\",\n domains: inject.domains,\n profile: raw.identity?.profile ?? \"\",\n ...(raw.identity?.profileName ? { profileName: raw.identity.profileName } : {}),\n ...(raw.identity?.profileEmail ? { profileEmail: raw.identity.profileEmail } : {}),\n })\n } else if (isCamofoxNativeInject(inject)) {\n out.push({ kind: \"authed-storageState\", storageStatePath: ownedStorageStatePath(raw.id) })\n } else {\n out.push({ kind: inject.from, domains: inject.domains, sessionRef: inject.sessionRef })\n }\n }\n const platform = raw.identity?.platform\n const account = raw.identity?.account\n if (platform && account && opts.credentials?.some(c => c.platform === platform && c.account === account)) {\n out.push({ kind: \"stored-credential\", platform, account })\n }\n return out\n}\n\n/**\n * The single migration seam: when `strategies` is absent, derive them from the\n * legacy `inject`/`identity` (plus a credential match); when present, return the\n * descriptor unchanged. Never drops or rewrites legacy fields.\n */\nexport function normalizeDescriptor(raw: SessionDescriptor, opts: NormalizeOptions = {}): SessionDescriptor {\n if (raw.strategies && raw.strategies.length > 0) return raw\n const strategies = deriveStrategies(raw, opts)\n return strategies.length > 0 ? { ...raw, strategies } : raw\n}\n\n/**\n * Resolution precedence: `authed-storageState` (unless it last hit an auth wall),\n * then `chrome-cookie`, then any registered-source strategy. `stored-credential`\n * is never selected: it is a recovery capability, not a resolve source.\n */\nexport function selectResolutionStrategy(desc: SessionDescriptor): Strategy | undefined {\n const strategies = desc.strategies\n if (!strategies || strategies.length === 0) return undefined\n if (desc.lastAuthStatus !== \"auth-wall\") {\n const owned = strategies.find(isOwnedStorageStateStrategy)\n if (owned) return owned\n }\n const chrome = strategies.find(isChromeCookieStrategy)\n if (chrome) return chrome\n return strategies.find(isSourceStrategy)\n}\n\n/** The effective `SessionInject` for resolution (see the studio's `resolveInjectFromStrategies`). */\nexport function resolveInjectFromStrategies(desc: SessionDescriptor): SessionInject | undefined {\n const sel = selectResolutionStrategy(desc)\n if (!sel) return desc.inject\n if (isOwnedStorageStateStrategy(sel)) return { from: \"camofox-native\" }\n if (isChromeCookieStrategy(sel)) {\n if (desc.inject && isFileInject(desc.inject)) return desc.inject\n return {\n from: \"chrome-profile\",\n domains: sel.domains,\n profile: sel.profile,\n ...(sel.account ? { account: sel.account } : {}),\n }\n }\n if (isSourceStrategy(sel)) return { from: sel.kind, domains: sel.domains, sessionRef: sel.sessionRef }\n return desc.inject\n}\n\n/** Default staleness TTL for owned cookies (7 days). */\nexport const COOKIE_STALE_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\n/**\n * Pure staleness verdict computed at read time with no probe. Chrome-cookie and\n * file sources are always fresh (re-read each resolve); owned and registered\n * sources go by `lastCookieRefreshAt`.\n */\nexport function cookieFreshness(\n desc: SessionDescriptor,\n now: number,\n ttlMs: number = COOKIE_STALE_TTL_MS,\n): \"fresh\" | \"stale\" | \"unknown\" {\n const eff = resolveInjectFromStrategies(desc)\n if (eff && (isChromeProfileInject(eff) || isFileInject(eff))) return \"fresh\"\n const stamp = desc.lastCookieRefreshAt\n if (!stamp) return \"unknown\"\n const t = Date.parse(stamp)\n if (Number.isNaN(t)) return \"unknown\"\n return now - t <= ttlMs ? \"fresh\" : \"stale\"\n}\n\nexport function priorChromeStrategy(prev?: SessionDescriptor): ChromeCookieStrategy | undefined {\n const v2 = prev?.strategies?.find(isChromeCookieStrategy)\n if (v2) return v2\n if (prev?.inject && isChromeProfileInject(prev.inject)) return chromeCookieStrategyOf(prev.inject, prev.identity)\n return undefined\n}\n\nexport interface BuildOwnedDescriptorInput {\n id: string\n platform: string\n reuseBase: string\n account?: string\n url?: string\n /** ISO timestamp for `savedAt` and the storageState `capturedAt` (injected, not read from the clock). */\n now: string\n /** Prior descriptor whose chrome provenance is preserved (augment, not replace). */\n prev?: SessionDescriptor\n}\n\n/** Build the `camofox-native` descriptor for an owned login, preserving any prior chrome provenance. */\nexport function buildOwnedSessionDescriptor(input: BuildOwnedDescriptorInput): SessionDescriptor {\n const { id, platform, reuseBase, account, url, now, prev } = input\n const chrome = priorChromeStrategy(prev)\n const strategies: Strategy[] = [\n ...(chrome ? [chrome] : []),\n { kind: \"authed-storageState\", storageStatePath: ownedStorageStatePath(id), capturedAt: now },\n ...(account ? [{ kind: \"stored-credential\", platform, account } satisfies StoredCredentialStrategy] : []),\n ]\n return {\n id,\n backend: \"camofox\",\n identity: {\n platform,\n ...(account ? { account } : {}),\n ...(prev?.identity?.profile ? { profile: prev.identity.profile } : {}),\n ...(prev?.identity?.profileName ? { profileName: prev.identity.profileName } : {}),\n ...(prev?.identity?.profileEmail ? { profileEmail: prev.identity.profileEmail } : {}),\n },\n inject: { from: \"camofox-native\" },\n base: reuseBase,\n savedAt: now,\n strategies,\n ...(url ? { url } : {}),\n }\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport {\n normalizeDescriptor,\n parseSessionDescriptor,\n type NormalizeOptions,\n type SessionDescriptor,\n} from \"./descriptor.js\"\n\n/** Saveable store of descriptors, injected so it can be local files or a remote adapter. */\nexport interface SessionStorePort {\n save(desc: SessionDescriptor): Promise<void>\n load(id: string): Promise<SessionDescriptor | null>\n list(): Promise<SessionDescriptor[]>\n remove(id: string): Promise<void>\n}\n\nexport interface FileSessionStoreOptions {\n /** Live credential-index reader (a thunk so it reflects the current index). */\n credentials?: () => ReadonlyArray<{ platform: string; account: string }>\n}\n\n/** Local-file adapter: one `<id>.json` per descriptor under `dir` (dir 0700, file 0600). */\nexport function fileSessionStore(dir: string, opts: FileSessionStoreOptions = {}): SessionStorePort {\n const fileFor = (id: string): string => join(dir, `${id.replace(/[^\\w.-]/g, \"_\")}.json`)\n const normalizeOpts = (): NormalizeOptions => (opts.credentials ? { credentials: opts.credentials() } : {})\n const read = (path: string): SessionDescriptor =>\n normalizeDescriptor(parseSessionDescriptor(JSON.parse(readFileSync(path, \"utf8\")) as unknown), normalizeOpts())\n return {\n async save(desc) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 })\n writeFileSync(fileFor(desc.id), JSON.stringify(desc, null, 2), { mode: 0o600 })\n },\n async load(id) {\n try {\n return read(fileFor(id))\n } catch {\n return null\n }\n },\n async list() {\n if (!existsSync(dir)) return []\n const out: SessionDescriptor[] = []\n for (const f of readdirSync(dir).filter(name => name.endsWith(\".json\"))) {\n try {\n out.push(read(join(dir, f)))\n } catch {\n // an unreadable or foreign json file is not a descriptor; skip it\n }\n }\n return out\n },\n async remove(id) {\n rmSync(fileFor(id), { force: true })\n },\n }\n}\n\n/**\n * Resolve a session by name across several stores. `load` returns the first\n * hit; `list` unions by id (earlier stores win). Writes go to `writeStore`, or\n * throw when none is given.\n */\nexport function compositeSessionStore(readStores: SessionStorePort[], writeStore?: SessionStorePort): SessionStorePort {\n const requireWrite = (): SessionStorePort => {\n if (!writeStore) throw new Error(\"compositeSessionStore is read-only (no writeStore)\")\n return writeStore\n }\n return {\n async save(desc) {\n await requireWrite().save(desc)\n },\n async load(id) {\n for (const s of readStores) {\n const d = await s.load(id)\n if (d) return d\n }\n return null\n },\n async list() {\n const seen = new Map<string, SessionDescriptor>()\n for (const s of readStores) {\n for (const d of await s.list()) if (!seen.has(d.id)) seen.set(d.id, d)\n }\n return [...seen.values()]\n },\n async remove(id) {\n await requireWrite().remove(id)\n },\n }\n}\n","/**\n * The `SessionSource` registry: how a host supplies cookies that live somewhere\n * this package knows nothing about (a managed central store, a vault, a device\n * bridge). The descriptor carries only a `kind`, a `sessionRef` and `domains`;\n * the registered source materialises the cookies at resolve time.\n *\n * Replaces the hard-wired `guilde` inject: the studio registers a `\"guilde\"`\n * source, the open package never mentions it.\n */\n\nimport type { SessionCookie } from \"./cookie.js\"\nimport { isBuiltinStrategyKind, type SessionDescriptor, type SessionIdentity } from \"./descriptor.js\"\nimport {\n SessionSourceDuplicateError,\n SessionSourceReservedError,\n SessionSourceUnknownError,\n} from \"./errors.js\"\nimport type { SessionStorePort } from \"./store.js\"\n\nexport interface SessionSourceRef {\n sessionRef: string\n /** Only these domains' cookies may be returned, never the whole jar. */\n domains: readonly string[]\n}\n\nexport interface SessionSource {\n /** The `inject.from` / `strategy.kind` this source answers to. Not a built-in kind. */\n readonly kind: string\n materialize(ref: SessionSourceRef): Promise<SessionCookie[]>\n}\n\nexport interface SessionSourceRegistry {\n /** Register a source. Throws on a duplicate kind or a built-in kind. */\n register(source: SessionSource): void\n list(): readonly SessionSource[]\n has(kind: string): boolean\n /** The source for `kind`, or a typed {@link SessionSourceUnknownError}. */\n resolve(kind: string): SessionSource\n materialize(kind: string, ref: SessionSourceRef): Promise<SessionCookie[]>\n}\n\nexport function createSessionSourceRegistry(initial: readonly SessionSource[] = []): SessionSourceRegistry {\n const sources = new Map<string, SessionSource>()\n const registry: SessionSourceRegistry = {\n register(source) {\n if (isBuiltinStrategyKind(source.kind) || source.kind === \"chrome-profile\" || source.kind === \"file\" || source.kind === \"camofox-native\") {\n throw new SessionSourceReservedError(source.kind)\n }\n if (sources.has(source.kind)) throw new SessionSourceDuplicateError(source.kind)\n sources.set(source.kind, source)\n },\n list: () => [...sources.values()],\n has: kind => sources.has(kind),\n resolve(kind) {\n const found = sources.get(kind)\n if (!found) throw new SessionSourceUnknownError(kind, [...sources.keys()])\n return found\n },\n materialize: (kind, ref) => registry.resolve(kind).materialize(ref),\n }\n for (const s of initial) registry.register(s)\n return registry\n}\n\n/** Catalog row of a centrally managed session. Carries NO cookies. */\nexport interface SessionSourceMeta {\n ref: string\n domains: string[]\n identity?: SessionIdentity\n url?: string\n}\n\nexport interface SessionSourceCatalog {\n list(): Promise<SessionSourceMeta[]>\n get(ref: string): Promise<SessionSourceMeta | null>\n}\n\nfunction metaToDescriptor(kind: string, m: SessionSourceMeta): SessionDescriptor {\n return {\n id: m.ref,\n backend: \"camofox\",\n ...(m.identity ? { identity: m.identity } : {}),\n inject: { from: kind, sessionRef: m.ref, domains: m.domains },\n ...(m.url ? { url: m.url } : {}),\n }\n}\n\n/**\n * Read-only descriptor store over a catalog of managed sessions, resolving them\n * into `from: <kind>` descriptors. `save` and `remove` throw: sessions are\n * captured elsewhere, so the contract stays loud.\n */\nexport function catalogSessionStore(kind: string, catalog: SessionSourceCatalog): SessionStorePort {\n return {\n async save() {\n throw new Error(`the \"${kind}\" catalog store is read-only; capture sessions in the managing system`)\n },\n async load(id) {\n const m = await catalog.get(id)\n return m ? metaToDescriptor(kind, m) : null\n },\n async list() {\n return (await catalog.list()).map(m => metaToDescriptor(kind, m))\n },\n async remove() {\n throw new Error(`the \"${kind}\" catalog store is read-only; manage sessions in the managing system`)\n },\n }\n}\n","/**\n * Read the logged-in browser on THIS machine, on demand and in memory. Nothing\n * is persisted: the browser is the source of truth. Cookie DB access is a\n * read-only copy to a temp dir; only cookie NAMES and expiry are read for the\n * auth signal, values are decrypted only by {@link decryptChromeCookies}, and\n * never logged.\n *\n * Backend: macOS Chrome/Chromium (Keychain \"Chrome Safe Storage\", PBKDF2-SHA1,\n * AES-128-CBC, `v10` prefix, a 32-byte SHA-256(domain) prefix stripped on newer\n * Chrome). Pass `safeStoragePassword` and `chromeRoot` for anything else.\n */\n\nimport { execFileSync } from \"node:child_process\"\nimport { createDecipheriv, pbkdf2Sync } from \"node:crypto\"\nimport { copyFileSync, existsSync, mkdtempSync, readdirSync, rmSync } from \"node:fs\"\nimport { homedir, platform as osPlatform, tmpdir } from \"node:os\"\nimport path from \"node:path\"\nimport { defaultAuthSignalRegistry, type AuthCookieMeta, type AuthSignalRegistry } from \"./auth-signals.js\"\nimport { domainMatches, type SessionCookie } from \"./cookie.js\"\nimport { knownOr, type Known } from \"./known.js\"\nimport { readLocalState } from \"./local-state.js\"\n\nexport interface LocalBrowserSessionOptions {\n /** Root of the Chrome/Chromium user-data dir. Default: the macOS Chrome path. */\n chromeRoot?: string\n /** Safe-Storage password (e.g. for Chromium's own Keychain service). Default reads the macOS Keychain. */\n safeStoragePassword?: () => string\n /** Per-domain cookie aliases. Default: derived from the auth signal registry's aliases. */\n domainAliases?: Record<string, string[]>\n /** Extra domains for the host-presence scan beyond the registry's known domains. */\n extraDomains?: readonly string[]\n /** Per-site \"signed in\" detectors. Default: {@link defaultAuthSignalRegistry}. */\n authSignals?: AuthSignalRegistry\n}\n\n// A full cookie jar (hex-dumped) blows past execFileSync's 1 MB default (ENOBUFS).\nconst SQLITE_MAX_BUFFER = 256 * 1024 * 1024\n\n/** Chrome stores `expires_utc` as microseconds since 1601-01-01. */\nconst CHROME_EPOCH_TO_UNIX_S = 11644473600\n\n/** Profiles live as sibling dirs (`Default`, `Profile 1`, ...) each with a `Cookies` DB. */\nexport function profileDirs(chromeRoot: string): string[] {\n if (!existsSync(chromeRoot)) return []\n return readdirSync(chromeRoot, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .filter(name => name === \"Default\" || /^Profile \\d+$/.test(name))\n .filter(name => existsSync(path.join(chromeRoot, name, \"Cookies\")))\n}\n\nfunction defaultChromeRoot(): string {\n if (osPlatform() !== \"darwin\") {\n throw new Error(\"local browser sessions currently support macOS only; pass { chromeRoot } for other platforms.\")\n }\n return path.join(homedir(), \"Library\", \"Application Support\", \"Google\", \"Chrome\")\n}\n\n/** The Chrome user-data root the scanner reads. Reading it is fine; launching Chrome against it is refused by the kit (F11). */\nexport function chromeUserDataRoot(opts: LocalBrowserSessionOptions = {}): string {\n return opts.chromeRoot ?? defaultChromeRoot()\n}\n\nfunction deriveKey(password: string): Buffer {\n return pbkdf2Sync(password, \"saltysalt\", 1003, 16, \"sha1\")\n}\n\n/** Read the Chrome Safe Storage key from the macOS Keychain. Touches the Keychain: call only on an explicit user action. */\nexport function readSafeStorageKey(): Buffer {\n const pw = execFileSync(\"security\", [\"find-generic-password\", \"-wa\", \"Chrome\", \"-s\", \"Chrome Safe Storage\"])\n .toString()\n .trim()\n return deriveKey(pw)\n}\n\n/** Decrypt one hex-dumped Chrome `encrypted_value`. Exported for the synthetic-data tests. */\nexport function decryptChromeValue(hex: string, key: Buffer): string {\n const buf = Buffer.from(hex, \"hex\")\n if (buf.subarray(0, 3).toString() !== \"v10\") return buf.toString(\"utf8\")\n const ct = buf.subarray(3)\n const d = createDecipheriv(\"aes-128-cbc\", key, Buffer.alloc(16, \" \"))\n d.setAutoPadding(true)\n let pt = Buffer.concat([d.update(ct), d.final()])\n if (pt.length >= 32) {\n const headPrintable = [...pt.subarray(0, 32)].every(b => b >= 0x20 && b < 0x7f)\n const tail = pt.subarray(32).toString(\"utf8\")\n if (!headPrintable && /^[\\x20-\\x7e]*$/.test(tail)) pt = pt.subarray(32)\n }\n return pt.toString(\"utf8\")\n}\n\n/** Derive the AES key from a Safe-Storage password (Chrome's constants). */\nexport function safeStorageKey(password: string): Buffer {\n return deriveKey(password)\n}\n\nconst errText = (e: unknown): string => (e instanceof Error ? e.message : String(e))\n\n/** Run `fn` against a temp copy of the profile's (often locked) Cookies DB. */\nfunction withCookiesCopy<T>(profileDir: string, prefix: string, fn: (db: string) => T): T {\n const tmpDir = mkdtempSync(path.join(tmpdir(), prefix))\n try {\n const db = path.join(tmpDir, \"Cookies\")\n copyFileSync(path.join(profileDir, \"Cookies\"), db)\n return fn(db)\n } finally {\n rmSync(tmpDir, { recursive: true, force: true })\n }\n}\n\nconst sqlite = (db: string, args: readonly string[]): string =>\n execFileSync(\"sqlite3\", [db, ...args], { maxBuffer: SQLITE_MAX_BUFFER, stdio: [\"ignore\", \"pipe\", \"pipe\"] }).toString().trim()\n\n/** Total cookie count (no decryption). A failed read is `{ unknown }`, never 0. */\nexport function countCookies(profileDir: string): Known<number> {\n try {\n return { known: withCookiesCopy(profileDir, \"bp-ct-\", db => Number(sqlite(db, [\"SELECT count(*) FROM cookies;\"]))) }\n } catch (e) {\n return { unknown: errText(e) }\n }\n}\n\n/** Cookie counts per requested domain (host and subdomains), no decryption. A failed read is `{ unknown }`, never zeros. */\nexport function countCookiesByDomain(profileDir: string, domains: readonly string[]): Known<Record<string, number>> {\n try {\n const hosts = withCookiesCopy(profileDir, \"bp-cd-\", db =>\n sqlite(db, [\"SELECT host_key FROM cookies;\"])\n .split(\"\\n\")\n .filter(Boolean)\n .map(h => h.replace(/^\\./, \"\").toLowerCase()),\n )\n const counts: Record<string, number> = Object.fromEntries(domains.map(d => [d, 0]))\n for (const host of hosts) {\n for (const d of domains) if (host === d || host.endsWith(`.${d}`)) counts[d] = (counts[d] ?? 0) + 1\n }\n return { known: counts }\n } catch (e) {\n return { unknown: errText(e) }\n }\n}\n\n/** Distinct cookie hosts (no decryption) mapped onto the registry's known domains plus `extraDomains`. */\nexport function profileLoggedInDomains(\n profileDir: string,\n registry: AuthSignalRegistry = defaultAuthSignalRegistry,\n extraDomains: readonly string[] = [],\n): Known<string[]> {\n try {\n const hosts = withCookiesCopy(profileDir, \"bp-host-\", db =>\n sqlite(db, [\"SELECT DISTINCT host_key FROM cookies;\"])\n .split(\"\\n\")\n .map(h => h.replace(/^\\./, \"\").toLowerCase()),\n )\n const of = [...new Set([...registry.knownDomains(), ...extraDomains])]\n const found = new Set<string>()\n for (const host of hosts) {\n for (const domain of of) if (registry.hostBelongsTo(host, domain)) found.add(domain)\n }\n return { known: [...found].sort() }\n } catch (e) {\n return { unknown: errText(e) }\n }\n}\n\n/**\n * Known domains the profile holds a valid, non-expired AUTH signal for. Reads\n * cookie NAME and expiry only (no value decryption), then asks the registry's\n * detector. A failed read is `{ unknown }`.\n */\nexport function profileAuthedDomains(\n profileDir: string,\n registry: AuthSignalRegistry = defaultAuthSignalRegistry,\n nowMs: number = Date.now(),\n): Known<string[]> {\n try {\n const rows = withCookiesCopy(profileDir, \"bp-auth-\", db =>\n sqlite(db, [\"SELECT host_key, name, expires_utc FROM cookies;\"]).split(\"\\n\"),\n )\n const metas: AuthCookieMeta[] = []\n for (const row of rows) {\n const [hostRaw, name, expiresRaw] = row.split(\"|\")\n if (!hostRaw || !name) continue\n const exp = Number(expiresRaw)\n metas.push({\n name,\n host: hostRaw.replace(/^\\./, \"\").toLowerCase(),\n expiresUnix: !Number.isFinite(exp) || exp === 0 ? undefined : exp / 1_000_000 - CHROME_EPOCH_TO_UNIX_S,\n })\n }\n const found = registry.knownDomains().filter(d => registry.isAuthed(d, metas, nowMs))\n return { known: found.sort() }\n } catch (e) {\n return { unknown: errText(e) }\n }\n}\n\n/** A logged-in identity behind a Chrome profile: the unit a person reasons about, not the dir name. */\nexport interface ChromeIdentity {\n /** On-disk dir: the addressable key passed back as `label`/`profile`. */\n profile: string\n name: string | null\n email: string | null\n gaiaName: string | null\n lastUsed: boolean\n /** Display only; a failed read collapses to 0 here (see `domainsAuthed` for the honest value). */\n cookieCount: number\n /** Weak host-presence signal: any cookie on the domain counts. */\n domainsLoggedIn: string[]\n /** Strong signal: a valid, non-expired auth cookie, by name and expiry. `Known` so a failed read is never \"authed nowhere\". */\n domainsAuthed: Known<string[]>\n}\n\n/** Enumerate the machine's Chrome profiles as named identities. Pure read: Local State JSON plus a host-key scan. */\nexport function scanChromeIdentities(opts: LocalBrowserSessionOptions = {}): ChromeIdentity[] {\n const chromeRoot = opts.chromeRoot ?? defaultChromeRoot()\n const registry = opts.authSignals ?? defaultAuthSignalRegistry\n const { profiles, lastUsed } = readLocalState(chromeRoot)\n const info = new Map(profiles.map(p => [p.directory, p]))\n return profileDirs(chromeRoot).map(profile => {\n const dir = path.join(chromeRoot, profile)\n const meta = info.get(profile)\n return {\n profile,\n name: meta?.name ?? null,\n email: meta?.userName ?? null,\n gaiaName: meta?.gaiaName ?? null,\n lastUsed: profile === lastUsed,\n cookieCount: knownOr(countCookies(dir), 0),\n domainsLoggedIn: knownOr(profileLoggedInDomains(dir, registry, opts.extraDomains), []),\n domainsAuthed: profileAuthedDomains(dir, registry),\n }\n })\n}\n\n/** Decrypt cookies for `domains` from a single Chrome profile, in memory (the DB copy is removed). */\nexport function decryptChromeCookies(profileDir: string, domains: readonly string[], key: Buffer): SessionCookie[] {\n return withCookiesCopy(profileDir, \"bp-ck-\", db => {\n const rows = sqlite(db, [\n \"-separator\",\n \"\\t\",\n \"SELECT name, host_key, path, hex(encrypted_value), is_secure, is_httponly, expires_utc FROM cookies;\",\n ])\n .split(\"\\n\")\n .filter(Boolean)\n const jar: SessionCookie[] = []\n for (const line of rows) {\n const [name, host, cpath, hex, secure, httpOnly, expires] = line.split(\"\\t\")\n if (!host || !domainMatches(host, domains)) continue\n let value: string\n try {\n value = decryptChromeValue(hex ?? \"\", key)\n } catch {\n continue\n }\n if (!value) continue\n const exp = Number(expires)\n const expiresUnix = exp > 0 ? Math.floor(exp / 1_000_000 - CHROME_EPOCH_TO_UNIX_S) : undefined\n jar.push({\n name: name ?? \"\",\n value,\n domain: host,\n path: cpath || \"/\",\n secure: secure === \"1\",\n httpOnly: httpOnly === \"1\",\n ...(expiresUnix && expiresUnix > 0 ? { expires: expiresUnix } : {}),\n })\n }\n return jar\n })\n}\n\nexport interface LocalBrowserSession {\n /** Decrypted cookies for `domain` (and its aliases) from `profile`, or the first profile that has one. `null` when none. */\n getDecryptedForDomain(domain: string, profile?: string): Promise<{ cookies: SessionCookie[]; capturedAt: string } | null>\n /** One summary per Chrome profile (no decryption). */\n listProfiles(): Array<{ profile: string; cookieCount: Known<number> }>\n}\n\n/** A local, no-persistence provider reading this machine's browser. */\nexport function createLocalBrowserSession(opts: LocalBrowserSessionOptions = {}): LocalBrowserSession {\n const chromeRoot = opts.chromeRoot ?? defaultChromeRoot()\n const registry = opts.authSignals ?? defaultAuthSignalRegistry\n const getKey = opts.safeStoragePassword ? () => deriveKey(opts.safeStoragePassword!()) : readSafeStorageKey\n const domainsFor = (domain: string): string[] => {\n const d = domain.replace(/^\\./, \"\").toLowerCase()\n const aliases = opts.domainAliases ? (opts.domainAliases[d] ?? []) : registry.equivalentDomains(d)\n return [d, ...aliases]\n }\n return {\n async getDecryptedForDomain(domain, profile) {\n const domains = domainsFor(domain)\n const key = getKey()\n const profiles = profile ? [profile] : profileDirs(chromeRoot)\n for (const p of profiles) {\n const dir = path.join(chromeRoot, p)\n if (!existsSync(path.join(dir, \"Cookies\"))) continue\n const cookies = decryptChromeCookies(dir, domains, key)\n if (cookies.length > 0) return { cookies, capturedAt: new Date().toISOString() }\n }\n return null\n },\n listProfiles() {\n return profileDirs(chromeRoot).map(profile => ({ profile, cookieCount: countCookies(path.join(chromeRoot, profile)) }))\n },\n }\n}\n","import { defaultAuthSignalRegistry, type AuthSignalRegistry } from \"./auth-signals.js\"\nimport { ChromeIdentityError } from \"./errors.js\"\nimport type { SessionIdentity, SessionInject, ChromeProfileInject } from \"./descriptor.js\"\nimport { isChromeProfileInject } from \"./descriptor.js\"\nimport { isKnown } from \"./known.js\"\nimport { scanChromeIdentities, type ChromeIdentity, type LocalBrowserSessionOptions } from \"./local-session.js\"\n\nexport interface ChromeIdentityOptions {\n /** Pre-scanned identities. Injectable so tests never scan a real profile. Scanned lazily when absent. */\n scan?: ChromeIdentity[]\n authSignals?: AuthSignalRegistry\n /** Options for the lazy scan (`chromeRoot` etc). */\n scanOptions?: LocalBrowserSessionOptions\n /** Receives non-fatal warnings (never cookie values). Default: dropped. */\n warn?: (message: string) => void\n}\n\n/** Three-valued verdict for one domain. `unknown` must never be treated as `authed`. */\nexport type DomainAuthSignal = \"authed\" | \"not-authed\" | \"unknown\"\n\n/** {@link DomainAuthSignal} plus `not-checked`: the state where no live auth guard applies at all. */\nexport type SessionAuthState = DomainAuthSignal | \"not-checked\"\n\nexport interface SessionAuthDescription {\n state: SessionAuthState\n message: string\n}\n\n/** Classify `domain` for `found`: `unknown` when no detector is registered or the cookie read failed. */\nexport function domainAuthSignal(\n domain: string,\n found: ChromeIdentity,\n registry: AuthSignalRegistry = defaultAuthSignalRegistry,\n): DomainAuthSignal {\n if (!isKnown(found.domainsAuthed)) return \"unknown\"\n if (!registry.isKnownDomain(domain)) return \"unknown\"\n return found.domainsAuthed.known.includes(registry.canonicalDomain(domain)) ? \"authed\" : \"not-authed\"\n}\n\nfunction wantDomains(inject: ChromeProfileInject, registry: AuthSignalRegistry): string[] {\n return [...new Set(inject.domains.map(d => registry.canonicalDomain(d)))]\n}\n\n/** Human label for a Chrome identity: friendly name, email, and the dir key. */\nexport function chromeIdentityLabel(s: ChromeIdentity): string {\n const who = s.name ?? s.email ?? \"?\"\n const email = s.email && s.email !== s.name ? ` (${s.email})` : \"\"\n const dir = s.name && s.name !== s.profile ? ` [${s.profile}]` : \"\"\n return `\"${who}\"${email}${dir}`\n}\n\nfunction scanFor(inject: ChromeProfileInject, opts: ChromeIdentityOptions): ChromeIdentity[] {\n return (\n opts.scan ??\n scanChromeIdentities({\n ...opts.scanOptions,\n ...(opts.authSignals ? { authSignals: opts.authSignals } : {}),\n extraDomains: inject.domains,\n })\n )\n}\n\n/**\n * Which Chrome profile a chrome-profile session's cookies should actually be\n * read from: a still-valid pin wins; otherwise a profile authed for the domain\n * AND on the same Google account; otherwise the pin unchanged. Never heals to a\n * different account.\n */\nexport function resolveChromeProfile(\n inject: SessionInject,\n identity?: SessionIdentity,\n opts: ChromeIdentityOptions = {},\n): string | undefined {\n if (!isChromeProfileInject(inject)) return undefined\n const registry = opts.authSignals ?? defaultAuthSignalRegistry\n const ids = opts.scan ?? scanChromeIdentities({ ...opts.scanOptions, authSignals: registry })\n const pinned = inject.profile\n const want = wantDomains(inject, registry)\n const authed = (s: ChromeIdentity): boolean => {\n const da = s.domainsAuthed\n return isKnown(da) && want.some(d => da.known.includes(d))\n }\n const pin = ids.find(s => s.profile === pinned)\n if (pin && authed(pin)) return pinned\n const email = identity?.account\n if (email) {\n const sameAccount = ids.find(s => s.email === email && authed(s))\n if (sameAccount) return sameAccount.profile\n }\n return pinned\n}\n\n/**\n * Pin guard for chrome-sourced sessions: the profile exists and carries a valid\n * auth signal for the declared domain. Throws {@link ChromeIdentityError} on a\n * hard mismatch. A domain with no registered detector is `unknown`: it falls\n * back to host presence and is never reported as authed.\n */\nexport function verifyChromeIdentity(\n inject: SessionInject,\n identity?: SessionIdentity,\n opts: ChromeIdentityOptions = {},\n): void {\n if (!isChromeProfileInject(inject)) return\n const registry = opts.authSignals ?? defaultAuthSignalRegistry\n const target = inject.profile ?? identity?.profile\n if (!target) return\n const ids = scanFor(inject, opts)\n const found = ids.find(s => s.profile === target)\n if (!found) {\n const avail = ids.map(s => `${s.profile} (${s.name ?? s.email ?? \"?\"})`).join(\", \")\n throw new ChromeIdentityError(`chrome profile \"${target}\" not found; available: ${avail || \"none\"}`)\n }\n if (identity?.account && found.email && found.email !== identity.account) {\n opts.warn?.(`profile \"${target}\" is now ${found.email}, session was pinned to ${identity.account}; using the live account`)\n }\n const want = wantDomains(inject, registry)\n\n if (!isKnown(found.domainsAuthed)) {\n throw new ChromeIdentityError(\n `couldn't read ${chromeIdentityLabel(found)}'s cookie store, so a live ` +\n `${want.join(\"/\")} login can't be confirmed (${found.domainsAuthed.unknown}). ` +\n `Chrome may be holding the Cookies DB lock: fully quit and reopen Chrome, then retry. ` +\n `This is NOT \"not logged in\".`,\n )\n }\n\n const signals = want.map(d => domainAuthSignal(d, found, registry))\n if (signals.includes(\"authed\")) return\n\n if (signals.includes(\"not-authed\")) {\n const authedProfiles = ids.filter(s => {\n const da = s.domainsAuthed\n return isKnown(da) && want.some(d => da.known.includes(d))\n })\n const hint = authedProfiles.length\n ? ` A valid ${want.join(\"/\")} login IS present in: ${authedProfiles.map(chromeIdentityLabel).join(\", \")}` +\n `; re-login to ${want.join(\"/\")} in ${chromeIdentityLabel(found)}, or re-pin this session to \"${authedProfiles[0]!.profile}\".`\n : ` No profile is logged into ${want.join(\"/\")}; log in first.`\n throw new ChromeIdentityError(`${chromeIdentityLabel(found)} has no valid ${want.join(\"/\")} login (only stale crumbs).${hint}`)\n }\n\n const hasAnyCookie = want.some(d => found.domainsLoggedIn.includes(d))\n if (!hasAnyCookie) {\n throw new ChromeIdentityError(\n `${chromeIdentityLabel(found)} carries no cookies at all for ${want.join(\"/\")}; no auth signal is registered ` +\n `for it (register a detector on the AuthSignalRegistry for a real check), and Chrome's on-disk cookie store ` +\n `holds nothing for it either. If you ARE logged in, Chrome may still be buffering the cookie in memory: ` +\n `fully quit and reopen Chrome, then retry.`,\n )\n }\n opts.warn?.(\n `no auth signal registered for ${want.join(\"/\")}; cannot confirm a live login, proceeding on cookie presence only`,\n )\n}\n\n/**\n * What {@link verifyChromeIdentity} established, without throwing, so a renderer\n * can tell \"confirmed\" from every shade of \"not confirmed\". Only `authed` should\n * earn a checkmark. A heuristic (cookie name and expiry, no network).\n */\nexport function describeSessionAuth(\n inject: SessionInject,\n identity?: SessionIdentity,\n opts: ChromeIdentityOptions = {},\n): SessionAuthDescription {\n if (!isChromeProfileInject(inject)) {\n return {\n state: \"not-checked\",\n message:\n `not checked: the \"${inject.from}\" transport carries no live auth-cookie guard ` +\n `(only \"chrome-profile\" sessions are inspected); a resolvable session is the only signal available here`,\n }\n }\n const registry = opts.authSignals ?? defaultAuthSignalRegistry\n const target = inject.profile ?? identity?.profile\n if (!target) return { state: \"not-checked\", message: \"not checked: no profile pinned to verify against\" }\n const ids = scanFor(inject, opts)\n\n const preScan = ids.find(s => s.profile === target)\n if (preScan && !isKnown(preScan.domainsAuthed)) {\n return {\n state: \"unknown\",\n message:\n `unknown: couldn't read ${chromeIdentityLabel(preScan)}'s cookie store (${preScan.domainsAuthed.unknown}); ` +\n `Chrome may hold the DB lock, quit and reopen it. Not \"not logged in\".`,\n }\n }\n try {\n verifyChromeIdentity(inject, identity, { ...opts, scan: ids })\n } catch (e) {\n return { state: \"not-authed\", message: e instanceof Error ? e.message : String(e) }\n }\n const found = ids.find(s => s.profile === target)!\n const want = wantDomains(inject, registry)\n if (want.some(d => domainAuthSignal(d, found, registry) === \"authed\")) {\n return {\n state: \"authed\",\n message: `profile present and logged in: live ${want.join(\"/\")} auth cookie confirmed in ${chromeIdentityLabel(found)}`,\n }\n }\n return {\n state: \"unknown\",\n message: `unknown: no auth signal registered for ${want.join(\"/\")}; proceeding on cookie presence only, not a verified login`,\n }\n}\n","import { assertSpawnArgsSafe, type BrowserProfileRefusedError } from \"@agentproto/driver-browser\"\n\n/**\n * Gate a Chrome launch against `userDataDir` before anything spawns. Delegates\n * to the kit's F11 refusal (`assertSpawnArgsSafe`); nothing is re-implemented\n * here. Throws {@link BrowserProfileRefusedError} (`browser:profile-refused`)\n * when `userDataDir` is, or sits inside, a default Chrome user-data-dir.\n *\n * The scanner in this package only READS cookies from a profile. A host that\n * launches Chrome per profile must pass its `--user-data-dir` through this first.\n */\nexport function assertChromeLaunchDirSafe(userDataDir: string, providerId: string): void {\n assertSpawnArgsSafe([`--user-data-dir=${userDataDir}`], providerId)\n}\n\nexport type { BrowserProfileRefusedError }\n","/**\n * A reused camofox tab per `userId`. A camofox `userId` owns one browser context\n * (cookies); `POST /tabs` always creates a NEW tab, so reuse is the client's job:\n * the tab id is remembered in a small state file and re-navigated on the next run.\n *\n * Public half only: cookie injection, tab reuse, navigation, evaluation, basic\n * input, screenshots and server-side network capture. Human-mode pacing,\n * anti-bot challenge handling and passive in-page capture stay private.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport type { SessionCookie } from \"./cookie.js\"\n\n/** Where the reused tab ids are remembered. Computed on call, never at import. */\nexport function camofoxStatePath(): string {\n return process.env[\"CAMOFOX_TABS_STATE\"] ?? join(homedir(), \".agentproto\", \"camofox-tabs.json\")\n}\n\n/** The camofox instance a session resolves against when no base is pinned: `CAMOFOX_URL`, else `localhost:$CAMOFOX_PORT` (9377). */\nexport function defaultCamofoxBase(): string {\n return (process.env[\"CAMOFOX_URL\"] || `http://localhost:${process.env[\"CAMOFOX_PORT\"] || \"9377\"}`).replace(/\\/$/, \"\")\n}\n\nexport interface OpenSessionOptions {\n /** The camofox `userId` that owns the browser context. */\n userId: string\n base?: string\n /** Curated cookies to inject: the declared domains only, never the whole jar. */\n cookies?: readonly SessionCookie[]\n /** Initial URL to land the tab on. Omitted: no landing navigation. */\n url?: string\n /** Inject cookies before use (default true). */\n injectCookies?: boolean\n /** Absolute path to a Playwright storageState JSON loaded when creating a new tab. */\n storageState?: string\n /** Exempt the tab from camofox's idle reaper. */\n keepAlive?: boolean\n /** If a read returns 401, POST this URL in-page (a token-refresh endpoint) and retry once. */\n refreshUrl?: string\n /** Where tab ids are remembered. Default: {@link camofoxStatePath}. */\n stateFile?: string\n /** Injectable transport, for tests. Default: global `fetch`. */\n fetch?: typeof fetch\n /** Injectable settle delay after navigation (ms). Default 2500. */\n settleMs?: number\n}\n\nexport interface ApiRawResult {\n status: number\n body: unknown\n}\n\nexport interface CamofoxSession {\n tabId: string\n userId: string\n /** In-page authed JSON GET; returns the parsed body, throws on non-2xx. */\n api(pathAndQuery: string): Promise<unknown>\n /** In-page GET returning `{ status, body }` without throwing. */\n apiRaw(pathAndQuery: string): Promise<ApiRawResult>\n evaluate<T = unknown>(expression: string): Promise<T>\n screenshot(opts?: {\n selector?: string\n format?: \"png\" | \"jpeg\"\n quality?: number\n }): Promise<{ imageBase64: string; mimeType: string }>\n goto(url: string, waitUntil?: string): Promise<void>\n click(selector: string): Promise<void>\n type(selector: string, text: string): Promise<void>\n press(key: string): Promise<void>\n /** Arm server-side network capture (Playwright request events). */\n startNetCapture(urlPattern?: string, max?: number): Promise<void>\n readNetCapture(): Promise<\n Array<{\n method: string\n url: string\n resourceType: string\n postData: string | null\n headers: Record<string, string>\n }>\n >\n /** Close and forget the tab. */\n close(): Promise<void>\n}\n\ninterface TabRow {\n tabId?: string\n id?: string\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise(r => setTimeout(r, ms))\n\nfunction readState(file: string): Record<string, string> {\n try {\n return JSON.parse(readFileSync(file, \"utf8\")) as Record<string, string>\n } catch {\n return {}\n }\n}\n\nfunction writeState(file: string, s: Record<string, string>): void {\n if (!existsSync(dirname(file))) mkdirSync(dirname(file), { recursive: true, mode: 0o700 })\n writeFileSync(file, JSON.stringify(s, null, 2), { mode: 0o600 })\n}\n\nexport async function openSession(opts: OpenSessionOptions): Promise<CamofoxSession> {\n const base = (opts.base || defaultCamofoxBase()).replace(/\\/$/, \"\")\n const userId = opts.userId\n const stateFile = opts.stateFile ?? camofoxStatePath()\n const doFetch = opts.fetch ?? fetch\n const settleMs = opts.settleMs ?? 2500\n\n const rest = async (method: string, path: string, body?: unknown): Promise<Record<string, unknown>> => {\n const res = await doFetch(`${base}${path}`, {\n method,\n headers: { \"content-type\": \"application/json\" },\n ...(body ? { body: JSON.stringify(body) } : {}),\n })\n const t = await res.text()\n if (!res.ok) throw new Error(`${method} ${path} -> ${res.status}: ${t.slice(0, 160)}`)\n return t ? (JSON.parse(t) as Record<string, unknown>) : {}\n }\n\n if (opts.injectCookies !== false) {\n await rest(\"POST\", `/sessions/${encodeURIComponent(userId)}/cookies`, {\n cookies: opts.cookies ? [...opts.cookies] : [],\n sessionKey: userId,\n })\n }\n\n const state = readState(stateFile)\n let tabId = \"\"\n let listed: TabRow[] = []\n try {\n const l = await rest(\"GET\", `/tabs?userId=${encodeURIComponent(userId)}`)\n const tabs = (l[\"tabs\"] ?? l) as unknown\n listed = Array.isArray(tabs) ? (tabs as TabRow[]) : []\n } catch {\n // fall through to create\n }\n const ids = new Set(listed.map(t => t.tabId ?? t.id))\n const remembered = state[userId]\n const first = listed[0]\n if (remembered && ids.has(remembered)) {\n tabId = remembered\n } else if (first) {\n tabId = first.tabId ?? first.id ?? \"\"\n } else {\n // With a storageState, create at about:blank so its cookies load BEFORE the\n // first navigation (navigating during init would hit an auth wall).\n const tab = await rest(\"POST\", \"/tabs\", {\n userId,\n sessionKey: userId,\n ...(opts.storageState ? { storageState: opts.storageState } : opts.url ? { url: opts.url } : {}),\n ...(opts.keepAlive ? { keepAlive: true } : {}),\n })\n tabId = String(tab[\"tabId\"] ?? tab[\"id\"] ?? \"\")\n if (opts.storageState && opts.url) {\n await rest(\"POST\", `/tabs/${encodeURIComponent(tabId)}/navigate`, {\n userId,\n url: opts.url,\n waitUntil: \"domcontentloaded\",\n timeout: 15000,\n })\n }\n }\n state[userId] = tabId\n writeState(stateFile, state)\n\n const evaluate = async <T = unknown>(expression: string): Promise<T> => {\n const r = await rest(\"POST\", `/tabs/${encodeURIComponent(tabId)}/evaluate`, { userId, expression })\n return (r[\"result\"] ?? r[\"value\"]) as T\n }\n const goto = async (u: string, waitUntil = \"domcontentloaded\"): Promise<void> => {\n await rest(\"POST\", `/tabs/${encodeURIComponent(tabId)}/navigate`, { userId, url: u, waitUntil })\n if (settleMs > 0) await sleep(settleMs)\n }\n const screenshot = async (\n o: { selector?: string; format?: \"png\" | \"jpeg\"; quality?: number } = {},\n ): Promise<{ imageBase64: string; mimeType: string }> => {\n const format = o.format ?? \"jpeg\"\n const qs = new URLSearchParams({ userId, format })\n if (o.selector) qs.set(\"selector\", o.selector)\n if (o.quality != null) qs.set(\"quality\", String(o.quality))\n const res = await doFetch(`${base}/tabs/${encodeURIComponent(tabId)}/screenshot?${qs.toString()}`)\n if (!res.ok) throw new Error(`screenshot -> ${res.status}: ${(await res.text()).slice(0, 160)}`)\n const buf = Buffer.from(await res.arrayBuffer())\n // Trust the bytes, not the requested format: a wrong mimeType makes vision APIs reject the image.\n const isPng = buf.length > 8 && buf[0] === 0x89 && buf[1] === 0x50\n const isJpeg = buf.length > 2 && buf[0] === 0xff && buf[1] === 0xd8\n const mimeType = isPng ? \"image/png\" : isJpeg ? \"image/jpeg\" : format === \"png\" ? \"image/png\" : \"image/jpeg\"\n return { imageBase64: buf.toString(\"base64\"), mimeType }\n }\n const rawGet = (p: string): Promise<ApiRawResult> =>\n evaluate<ApiRawResult>(\n `(async()=>{try{const r=await fetch(${JSON.stringify(p)},{headers:{accept:\"application/json\",\"x-requested-with\":\"XMLHttpRequest\"},credentials:\"include\"});let b=null;try{b=await r.json()}catch{}return{status:r.status,body:b}}catch(e){return{status:-1,error:String(e)}}})()`,\n )\n const refresh = async (): Promise<boolean> => {\n if (!opts.refreshUrl) return false\n const r = await evaluate<{ status: number }>(\n `(async()=>{try{const r=await fetch(${JSON.stringify(opts.refreshUrl)},{method:\"POST\",credentials:\"include\",headers:{accept:\"application/json\"}});return{status:r.status}}catch(e){return{status:-1}}})()`,\n )\n return r?.status === 200\n }\n const apiRaw = async (p: string): Promise<ApiRawResult> => {\n let r = await rawGet(p)\n if (r?.status === 401 && (await refresh())) r = await rawGet(p)\n return r\n }\n const api = async (p: string): Promise<unknown> => {\n const r = await apiRaw(p)\n if (!r || r.status < 200 || r.status >= 300) throw new Error(`GET ${p} -> ${r?.status}`)\n return r.body\n }\n\n if (opts.url) await goto(opts.url)\n\n return {\n tabId,\n userId,\n api,\n apiRaw,\n evaluate,\n screenshot,\n goto,\n click: async selector => {\n await rest(\"POST\", `/tabs/${encodeURIComponent(tabId)}/click`, { userId, selector })\n },\n type: async (selector, text) => {\n await rest(\"POST\", `/tabs/${encodeURIComponent(tabId)}/type`, { userId, selector, text })\n },\n press: async key => {\n await rest(\"POST\", `/tabs/${encodeURIComponent(tabId)}/press`, { userId, key })\n },\n startNetCapture: async (urlPattern, max) => {\n await rest(\"POST\", `/tabs/${encodeURIComponent(tabId)}/capture`, {\n userId,\n sessionKey: userId,\n ...(urlPattern ? { urlPattern } : {}),\n ...(max ? { max } : {}),\n })\n },\n readNetCapture: async () => {\n const r = await rest(\"GET\", `/tabs/${encodeURIComponent(tabId)}/capture?userId=${encodeURIComponent(userId)}`)\n const reqs = r[\"requests\"]\n return Array.isArray(reqs) ? (reqs as Awaited<ReturnType<CamofoxSession[\"readNetCapture\"]>>) : []\n },\n close: async () => {\n try {\n await rest(\"DELETE\", `/tabs/${encodeURIComponent(tabId)}?userId=${encodeURIComponent(userId)}`)\n } catch {\n // best effort\n }\n const s = readState(stateFile)\n delete s[userId]\n writeState(stateFile, s)\n },\n }\n}\n","import { existsSync } from \"node:fs\"\nimport { readFileSync } from \"node:fs\"\nimport type { BrowserDriver } from \"@agentproto/driver-browser\"\nimport { z } from \"zod\"\nimport { defaultAuthSignalRegistry, type AuthSignalRegistry } from \"./auth-signals.js\"\nimport { openSession, type CamofoxSession, type OpenSessionOptions } from \"./camofox-session.js\"\nimport { resolveChromeProfile, verifyChromeIdentity } from \"./chrome-identity.js\"\nimport { dedupeCookies, domainMatches, toSessionCookie, type RawCookie, type SessionCookie } from \"./cookie.js\"\nimport {\n chromeCookieStrategyOf,\n injectKindOf,\n isChromeCookieStrategy,\n isChromeProfileInject,\n isFileInject,\n isSourceInject,\n isSourceStrategy,\n ownedStorageStatePath,\n selectResolutionStrategy,\n type ChromeCookieStrategy,\n type ChromeProfileInject,\n type SessionDescriptor,\n type SessionInject,\n type Strategy,\n} from \"./descriptor.js\"\nimport { AccountSwitcherMissingError, SessionResolveError } from \"./errors.js\"\nimport { createLocalBrowserSession, scanChromeIdentities, type LocalBrowserSessionOptions } from \"./local-session.js\"\nimport { createSessionSourceRegistry, type SessionSourceRegistry } from \"./session-sources.js\"\n\n/**\n * Optional hook that rewrites a gathered jar so `userId` is the active\n * sub-account on `platform` (for profiles logged into several accounts of one\n * site). Policy about HOW to switch lives with the host; the default is none.\n */\nexport type AccountSwitcher = (platform: string, jar: SessionCookie[], userId: string) => SessionCookie[]\n\nexport interface ResolveSessionDeps {\n /** Single driver, used when a chrome session names no profile. */\n driver?: BrowserDriver\n /** Per-profile driver factory (the multi-account seam). Preferred over `driver`. */\n driverFor?: (profile: string) => BrowserDriver | Promise<BrowserDriver>\n /** Where registered-source cookies come from. Default: an empty registry. */\n sources?: SessionSourceRegistry\n /** Optional sub-account switcher. Never called unless a chrome-profile inject pins an `account`. */\n accountSwitcher?: AccountSwitcher\n /** Per-site \"signed in\" detectors. Default: {@link defaultAuthSignalRegistry}. */\n authSignals?: AuthSignalRegistry\n /** Chrome scanning options (`chromeRoot`, `safeStoragePassword`, ...). */\n local?: LocalBrowserSessionOptions\n /** Camofox opener. Default: {@link openSession}. Injectable so tests need no network. */\n openCamofox?: (opts: OpenSessionOptions) => Promise<CamofoxSession>\n /** Non-fatal warnings (never cookie values). Default: dropped. */\n warn?: (message: string) => void\n}\n\n/** What a descriptor resolves to: a chrome driver, or a live camofox session. */\nexport type ResolvedSession =\n | { backend: \"chrome\"; driver: BrowserDriver }\n | { backend: \"camofox\"; session: CamofoxSession }\n\nconst rawCookieSchema = z\n .object({\n name: z.string(),\n value: z.string(),\n domain: z.string(),\n path: z.string().optional(),\n httpOnly: z.boolean().optional(),\n secure: z.boolean().optional(),\n sameSite: z.string().optional(),\n expires: z.number().optional(),\n expirationDate: z.number().optional(),\n session: z.boolean().optional(),\n })\n .loose()\n\nconst rawCookieFileSchema = z.union([\n z.array(rawCookieSchema),\n z.object({ cookies: z.array(rawCookieSchema).optional() }).loose(),\n])\n\n/** Read a cookie-file jar, domain-scoped. Malformed or foreign JSON degrades to an empty jar. */\nfunction gatherFromFile(path: string, domains: readonly string[]): SessionCookie[] {\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(path, \"utf8\"))\n } catch {\n throw new SessionResolveError(`cookie file \"${path}\" is not valid JSON`)\n }\n const parsed = rawCookieFileSchema.safeParse(raw)\n if (!parsed.success) throw new SessionResolveError(`cookie file \"${path}\" does not hold a cookie jar`)\n const arr = (Array.isArray(parsed.data) ? parsed.data : (parsed.data.cookies ?? [])) as RawCookie[]\n return dedupeCookies(arr.filter(c => domainMatches(c.domain, domains)).map(toSessionCookie))\n}\n\nasync function gatherFromChromeProfile(\n args: { domains: readonly string[]; profile: string; account?: { platform: string; userId: string } },\n deps: ResolveSessionDeps,\n): Promise<SessionCookie[]> {\n if (!args.profile) {\n const avail = scanChromeIdentities({ ...deps.local, ...(deps.authSignals ? { authSignals: deps.authSignals } : {}) })\n .map(s => `${s.profile} (${s.name ?? s.email ?? \"?\"})`)\n .join(\", \")\n throw new SessionResolveError(\n `chrome-profile source needs an explicit \"profile\" (multiple accounts exist); pick one: ${avail || \"none\"}`,\n )\n }\n const provider = createLocalBrowserSession({\n ...deps.local,\n ...(deps.authSignals ? { authSignals: deps.authSignals } : {}),\n })\n const out: SessionCookie[] = []\n for (const domain of args.domains) {\n const payload = await provider.getDecryptedForDomain(domain, args.profile)\n for (const c of payload?.cookies ?? []) out.push(c)\n }\n const jar = dedupeCookies(out)\n if (!args.account) return jar\n if (!deps.accountSwitcher) throw new AccountSwitcherMissingError(args.account.platform)\n return deps.accountSwitcher(args.account.platform, jar, args.account.userId)\n}\n\n/**\n * Cookies for a `chrome-cookie` strategy. A file-sourced descriptor keeps its\n * cookie path in the legacy `file` inject, so `desc` is consulted to recover it.\n */\nexport async function gatherCookiesForStrategy(\n strategy: Strategy,\n desc: SessionDescriptor,\n deps: ResolveSessionDeps = {},\n): Promise<SessionCookie[]> {\n if (!isChromeCookieStrategy(strategy)) {\n throw new SessionResolveError(`no cookies to gather for \"${strategy.kind}\" source`)\n }\n if (desc.inject && isFileInject(desc.inject)) return gatherFromFile(desc.inject.path, desc.inject.domains)\n return gatherFromChromeProfile(\n {\n domains: strategy.domains,\n profile: strategy.profile,\n ...(strategy.account ? { account: strategy.account } : {}),\n },\n deps,\n )\n}\n\n/** Gather cookies for a legacy `SessionInject` (chrome-profile or file only). */\nexport async function gatherCookies(inject: SessionInject, deps: ResolveSessionDeps = {}): Promise<SessionCookie[]> {\n if (isFileInject(inject)) return gatherFromFile(inject.path, inject.domains)\n if (isChromeProfileInject(inject)) return gatherFromChromeProfile(inject, deps)\n throw new SessionResolveError(`no cookies to gather for \"${inject.from}\" source`)\n}\n\n/** Turn a saved descriptor into a live session. */\nexport async function resolveSession(desc: SessionDescriptor, deps: ResolveSessionDeps = {}): Promise<ResolvedSession> {\n const open = deps.openCamofox ?? openSession\n const sources = deps.sources ?? createSessionSourceRegistry()\n const registry = deps.authSignals ?? defaultAuthSignalRegistry\n\n if (desc.backend === \"chrome\") {\n const profile = desc.identity?.profile\n const driver = profile && deps.driverFor ? await deps.driverFor(profile) : deps.driver\n if (!driver) {\n const hint = profile\n ? `deps.driverFor(\"${profile}\") or deps.driver`\n : `deps.driver (or set identity.profile plus deps.driverFor for multi-account)`\n throw new SessionResolveError(`session \"${desc.id}\": backend \"chrome\" needs a live BrowserDriver: ${hint}`)\n }\n return { backend: \"chrome\", driver }\n }\n\n const selected = selectResolutionStrategy(desc)\n const kind = selected?.kind ?? (desc.inject ? injectKindOf(desc.inject.from) : undefined)\n if (!kind) throw new SessionResolveError(`session \"${desc.id}\": backend \"camofox\" needs inject{ from, domains }`)\n\n const openWith = async (extra: Omit<OpenSessionOptions, \"userId\" | \"base\" | \"url\">): Promise<ResolvedSession> => ({\n backend: \"camofox\",\n session: await open({\n userId: desc.id,\n ...(desc.base ? { base: desc.base } : {}),\n ...(desc.url ? { url: desc.url } : {}),\n ...extra,\n }),\n })\n\n if (kind === \"authed-storageState\") {\n const profilePath = ownedStorageStatePath(desc.id)\n return openWith({\n injectCookies: false,\n ...(existsSync(profilePath) ? { storageState: profilePath } : {}),\n keepAlive: true,\n })\n }\n\n if (kind === \"chrome-cookie\") return resolveChromeCookie(desc, selected, deps, openWith, registry)\n\n // Any other kind is a registered source: the registry resolves it or throws a typed error.\n const ref =\n selected && isSourceStrategy(selected)\n ? { sessionRef: selected.sessionRef, domains: selected.domains }\n : desc.inject && isSourceInject(desc.inject)\n ? { sessionRef: desc.inject.sessionRef, domains: desc.inject.domains }\n : undefined\n if (!ref) throw new SessionResolveError(`session \"${desc.id}\": \"${kind}\" source carries no sessionRef/domains`)\n const cookies = await sources.materialize(kind, ref)\n if (cookies.length === 0) {\n throw new SessionResolveError(\n `session \"${desc.id}\": the \"${kind}\" source returned no cookies for ${ref.domains.join(\"/\")} ` +\n `(ref \"${ref.sessionRef}\"): revoked, expired, or not granted`,\n )\n }\n return openWith({ cookies: dedupeCookies(cookies), injectCookies: true, keepAlive: true })\n}\n\nasync function resolveChromeCookie(\n desc: SessionDescriptor,\n selected: Strategy | undefined,\n deps: ResolveSessionDeps,\n openWith: (extra: Omit<OpenSessionOptions, \"userId\" | \"base\" | \"url\">) => Promise<ResolvedSession>,\n registry: AuthSignalRegistry,\n): Promise<ResolvedSession> {\n // A file-backed chrome-cookie carries its cookies in the legacy `file` inject:\n // no Chrome dir to heal or verify, and an empty jar is not an error.\n if (desc.inject && isFileInject(desc.inject)) {\n const cookies = await gatherCookies(desc.inject, deps)\n return openWith({ cookies, injectCookies: true, keepAlive: true })\n }\n const chromeStrat: ChromeCookieStrategy | undefined =\n selected && isChromeCookieStrategy(selected)\n ? selected\n : desc.inject && isChromeProfileInject(desc.inject)\n ? chromeCookieStrategyOf(desc.inject, desc.identity)\n : undefined\n if (!chromeStrat) throw new SessionResolveError(`session \"${desc.id}\": backend \"camofox\" needs inject{ from, domains }`)\n\n const baseInject: ChromeProfileInject = {\n from: \"chrome-profile\",\n domains: chromeStrat.domains,\n profile: chromeStrat.profile,\n ...(chromeStrat.account ? { account: chromeStrat.account } : {}),\n }\n const chromeOpts = {\n authSignals: registry,\n ...(deps.local ? { scanOptions: deps.local } : {}),\n ...(deps.warn ? { warn: deps.warn } : {}),\n }\n const healed = resolveChromeProfile(baseInject, desc.identity, chromeOpts)\n const inject: ChromeProfileInject = healed && healed !== baseInject.profile ? { ...baseInject, profile: healed } : baseInject\n if (inject !== baseInject) {\n deps.warn?.(\n `\"${desc.id}\": pinned profile \"${chromeStrat.profile}\" has no live ${inject.domains.join(\"/\")} login; ` +\n `healed to \"${inject.profile}\" (same account)`,\n )\n }\n verifyChromeIdentity(inject, desc.identity, chromeOpts)\n const healedStrat: ChromeCookieStrategy =\n inject.profile !== chromeStrat.profile ? { ...chromeStrat, profile: inject.profile } : chromeStrat\n const cookies = await gatherCookiesForStrategy(healedStrat, desc, deps)\n if (cookies.length === 0) {\n throw new SessionResolveError(\n `session \"${desc.id}\": no cookies for ${healedStrat.domains.join(\"/\")} in profile ` +\n `\"${healedStrat.profile || \"(any)\"}\": not logged in, or wrong profile`,\n )\n }\n return openWith({ cookies, injectCookies: true, keepAlive: true })\n}\n\n","import { ToolError } from \"@agentproto/tool\"\n\nexport const GRANT_DOMAIN_INVALID_CODE = \"browser-profiles:grant-domain-invalid\" as const\nexport const CONSENT_REQUIRED_CODE = \"browser:consent_required\" as const\nexport const CONSENT_FLAGS_REQUIRED_CODE = \"browser-profiles:consent-flags-required\" as const\nexport const CONSENT_DECLINED_CODE = \"browser-profiles:consent-declined\" as const\nexport const SINK_ACK_REQUIRED_CODE = \"browser-profiles:sink-ack-required\" as const\nexport const AGENT_GRANT_REFUSED_CODE = \"browser-profiles:agent-grant-refused\" as const\nexport const FULL_PROFILE_REFUSED_CODE = \"browser-profiles:full-profile-refused\" as const\nexport const LEDGER_RECORD_INVALID_CODE = \"browser-profiles:ledger-record-invalid\" as const\nexport const GRANT_STORE_INVALID_CODE = \"browser-profiles:grant-store-invalid\" as const\n\nexport type GrantDomainReason = \"empty\" | \"wildcard\" | \"leading-dot\" | \"bare-tld\" | \"public-suffix\" | \"invalid\"\n\nconst DOMAIN_HINT: Record<GrantDomainReason, string> = {\n empty: \"a grant needs at least one explicit domain\",\n wildcard: \"wildcards are not grantable; name each registrable domain (a grant already covers its subdomains)\",\n \"leading-dot\": \"write the domain without a leading dot\",\n \"bare-tld\": \"a bare TLD is not a registrable domain\",\n \"public-suffix\": \"a public suffix is shared by unrelated sites and cannot be granted\",\n invalid: \"expected a lowercase host such as github.com (ASCII or punycode, at least two labels)\",\n}\n\n/** A grant's domain list broke AIP-63 C2 (wildcard, empty, bare TLD, leading dot, public suffix). */\nexport class GrantDomainError extends ToolError {\n readonly reason: GrantDomainReason\n readonly domain: string | undefined\n\n constructor(reason: GrantDomainReason, domain?: string) {\n super({\n code: GRANT_DOMAIN_INVALID_CODE,\n message: `${domain === undefined ? \"domain list\" : `\"${domain}\"`} rejected (${reason}): ${DOMAIN_HINT[reason]}`,\n })\n this.name = \"GrantDomainError\"\n this.reason = reason\n this.domain = domain\n }\n}\n\n/** The caller has no usable grant for this. Also what a device sees for another device's grant (C12). */\nexport class ConsentRequiredError extends ToolError {\n constructor(message = \"no active grant covers this request\") {\n super({ code: CONSENT_REQUIRED_CODE, message })\n this.name = \"ConsentRequiredError\"\n }\n}\n\n/** A non-interactive request lacked `--domains` plus `--yes`, or the named full-profile request (C4). */\nexport class NonInteractiveConsentError extends ToolError {\n readonly missing: readonly string[]\n\n constructor(missing: readonly string[]) {\n super({\n code: CONSENT_FLAGS_REQUIRED_CODE,\n message:\n `non-interactive import refused: pass ${missing.join(\" and \")}. ` +\n `There is no default of \"all domains\"; name each domain and confirm with --yes.`,\n })\n this.name = \"NonInteractiveConsentError\"\n this.missing = missing\n }\n}\n\n/** The human declined at the prompt. */\nexport class ConsentDeclinedError extends ToolError {\n constructor(what: string) {\n super({ code: CONSENT_DECLINED_CODE, message: `consent declined: ${what}` })\n this.name = \"ConsentDeclinedError\"\n }\n}\n\n/** Material would go to a remote sink nobody acknowledged (C6). */\nexport class SinkAckRequiredError extends ToolError {\n readonly sinkId: string\n\n constructor(sinkId: string) {\n super({\n code: SINK_ACK_REQUIRED_CODE,\n message: `remote sink \"${sinkId}\" needs an explicit human acknowledgement (its id and operator) before any session material is sent`,\n })\n this.name = \"SinkAckRequiredError\"\n this.sinkId = sinkId\n }\n}\n\n/** An agent tried something only a human consent path may do (C7). */\nexport class AgentGrantRefusedError extends ToolError {\n readonly attempt: string\n\n constructor(attempt: string) {\n super({\n code: AGENT_GRANT_REFUSED_CODE,\n message:\n `refused: an agent cannot ${attempt}. Ask the user; they widen access through the operator channel, ` +\n `and only a human decision counts.`,\n })\n this.name = \"AgentGrantRefusedError\"\n this.attempt = attempt\n }\n}\n\n/** A full-profile grant was requested the wrong way (not by name, or with a remote sink) (C3). */\nexport class FullProfileGrantError extends ToolError {\n constructor(message: string) {\n super({ code: FULL_PROFILE_REFUSED_CODE, message })\n this.name = \"FullProfileGrantError\"\n }\n}\n\n/** A ledger row broke the AIP-63 `ledgerRecord` shape; nothing was written. */\nexport class LedgerRecordInvalidError extends ToolError {\n readonly issues: readonly string[]\n\n constructor(issues: readonly string[]) {\n super({ code: LEDGER_RECORD_INVALID_CODE, message: `invalid consent ledger record: ${issues.join(\"; \")}` })\n this.name = \"LedgerRecordInvalidError\"\n this.issues = issues\n }\n}\n\n/** The grants file is not a readable grant list. */\nexport class GrantStoreInvalidError extends ToolError {\n constructor(message: string) {\n super({ code: GRANT_STORE_INVALID_CODE, message })\n this.name = \"GrantStoreInvalidError\"\n }\n}\n","import { GrantDomainError } from \"./errors.js\"\n\n/** The AIP-63 `domain` pattern: lowercase, ASCII or punycode, at least two labels. */\nexport const GRANT_DOMAIN_PATTERN =\n /^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+([a-z]{2,63}|xn--[a-z0-9-]{1,59})$/\n\n/**\n * A compact subset of the Public Suffix List: the multi-label suffixes people\n * actually paste, plus the shared hosting suffixes where every subdomain is a\n * different owner. It is NOT the whole list; pass `isPublicSuffix` to\n * {@link validateGrantDomains} to check against the real one.\n */\nconst PUBLIC_SUFFIXES: ReadonlySet<string> = new Set([\n \"co.uk\", \"org.uk\", \"ac.uk\", \"gov.uk\", \"me.uk\", \"ltd.uk\", \"plc.uk\", \"net.uk\", \"sch.uk\",\n \"com.au\", \"net.au\", \"org.au\", \"edu.au\", \"gov.au\", \"id.au\",\n \"co.nz\", \"org.nz\", \"net.nz\", \"govt.nz\",\n \"co.jp\", \"ne.jp\", \"or.jp\", \"ac.jp\", \"go.jp\",\n \"co.kr\", \"or.kr\", \"go.kr\",\n \"com.br\", \"net.br\", \"org.br\", \"gov.br\",\n \"com.cn\", \"net.cn\", \"org.cn\", \"gov.cn\",\n \"com.mx\", \"com.ar\", \"com.tr\", \"com.tw\", \"com.hk\", \"com.sg\", \"com.my\", \"com.ph\", \"com.vn\",\n \"co.in\", \"net.in\", \"org.in\", \"gov.in\", \"co.id\", \"co.th\", \"co.il\", \"co.za\", \"com.ua\", \"com.pl\", \"com.es\", \"com.pt\",\n \"github.io\", \"gitlab.io\", \"herokuapp.com\", \"appspot.com\", \"vercel.app\", \"netlify.app\", \"pages.dev\",\n \"workers.dev\", \"web.app\", \"firebaseapp.com\", \"blogspot.com\", \"cloudfront.net\", \"azurewebsites.net\",\n \"s3.amazonaws.com\", \"fly.dev\", \"onrender.com\", \"ngrok.io\", \"trycloudflare.com\",\n])\n\nexport interface GrantDomainPolicy {\n /** Extra public-suffix check (for example one backed by the full Public Suffix List). */\n isPublicSuffix?: (domain: string) => boolean\n}\n\n/** True for a suffix in the embedded subset. */\nexport function isKnownPublicSuffix(domain: string): boolean {\n return PUBLIC_SUFFIXES.has(domain)\n}\n\n/**\n * Validate a grant's domain list against AIP-63 C2 and return it lowercased and\n * de-duplicated. Rejects `*`, `*.x`, a leading dot, an empty list, a bare TLD,\n * a public suffix and anything that is not a plain host, each with a typed\n * {@link GrantDomainError}. A grant covers the named domain and its subdomains.\n */\nexport function validateGrantDomains(input: readonly string[], policy: GrantDomainPolicy = {}): string[] {\n if (input.length === 0) throw new GrantDomainError(\"empty\")\n const out: string[] = []\n for (const raw of input) {\n if (typeof raw !== \"string\" || raw.length === 0) throw new GrantDomainError(\"invalid\", String(raw))\n if (raw.includes(\"*\")) throw new GrantDomainError(\"wildcard\", raw)\n if (raw.startsWith(\".\")) throw new GrantDomainError(\"leading-dot\", raw)\n const domain = raw.toLowerCase()\n if (!domain.includes(\".\")) throw new GrantDomainError(\"bare-tld\", raw)\n if (domain.length > 253 || !GRANT_DOMAIN_PATTERN.test(domain)) throw new GrantDomainError(\"invalid\", raw)\n if (isKnownPublicSuffix(domain) || policy.isPublicSuffix?.(domain) === true) {\n throw new GrantDomainError(\"public-suffix\", raw)\n }\n if (!out.includes(domain)) out.push(domain)\n }\n return out\n}\n\n/** True when `host` is `domain` or one of its subdomains. */\nexport function hostCoveredBy(host: string, domain: string): boolean {\n const h = host.replace(/^\\./, \"\").toLowerCase()\n return h === domain || h.endsWith(`.${domain}`)\n}\n","/**\n * The consent ledger (AIP-63 C10, C11): an append-only JSONL file, one record per\n * grant, refresh, revoke, sink-ack or deny. The record shape is closed on purpose\n * (see `ledgerRecordSchema`): there is no field a cookie value could go in.\n */\n\nimport { createHash } from \"node:crypto\"\nimport { appendFileSync, chmodSync, existsSync, mkdirSync, readFileSync, statSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport { z } from \"zod\"\nimport { GRANT_DOMAIN_PATTERN } from \"./domains.js\"\nimport { LedgerRecordInvalidError } from \"./errors.js\"\n\n/** `~/.agentproto/bureau/consent.jsonl`. Resolved on call, never at import. */\nexport function defaultConsentLedgerPath(home: string = homedir()): string {\n return join(home, \".agentproto\", \"bureau\", \"consent.jsonl\")\n}\n\nconst domainSchema = z.string().max(253).regex(GRANT_DOMAIN_PATTERN)\nconst sha256Schema = z.string().regex(/^[0-9a-f]{64}$/)\nconst idSchema = z.string().min(1)\n\nexport const ledgerEventSchema = z.enum([\"grant\", \"refresh\", \"revoke\", \"sink-ack\", \"deny\"])\nexport type LedgerEvent = z.infer<typeof ledgerEventSchema>\n\nexport const ledgerActorSchema = z\n .object({\n kind: z.enum([\"human\", \"agent\", \"system\"]),\n via: z.string().optional(),\n deviceId: idSchema.optional(),\n })\n .strict()\nexport type LedgerActor = z.infer<typeof ledgerActorSchema>\n\nexport const ledgerRecordSchema = z\n .object({\n seq: z.number().int().min(0),\n at: z.iso.datetime({ offset: true }),\n event: ledgerEventSchema,\n actor: ledgerActorSchema,\n grantId: idSchema.optional(),\n sessionId: idSchema.optional(),\n domains: z.array(domainSchema).optional(),\n fullProfile: z.literal(true).optional(),\n cookieCount: z.number().int().min(0).optional(),\n nameHashes: z.array(sha256Schema).optional(),\n sinkId: z.string().optional(),\n derived: z\n .object({\n local: z.enum([\"deleted\", \"none\"]),\n remote: z.enum([\"confirmed\", \"unavailable\", \"failed\", \"not-applicable\"]),\n })\n .strict()\n .optional(),\n reason: z.string().max(500).optional(),\n prev: sha256Schema.optional(),\n })\n .strict()\n .superRefine((r, ctx) => {\n const need = (field: keyof typeof r): void => {\n if (r[field] === undefined) ctx.addIssue({ code: \"custom\", message: `${r.event} needs ${field}`, path: [field] })\n }\n if (r.actor.kind === \"agent\" && (r.event === \"grant\" || r.event === \"sink-ack\")) {\n ctx.addIssue({ code: \"custom\", message: \"an agent cannot grant or acknowledge a sink (C7)\", path: [\"actor\", \"kind\"] })\n }\n if (r.event === \"grant\") {\n need(\"grantId\")\n need(\"sessionId\")\n need(\"cookieCount\")\n if ((r.domains === undefined) === (r.fullProfile === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"a grant record has exactly one of domains or fullProfile\", path: [\"domains\"] })\n }\n if (r.domains !== undefined && r.domains.length === 0) {\n ctx.addIssue({ code: \"custom\", message: \"domains must not be empty\", path: [\"domains\"] })\n }\n }\n if (r.event === \"refresh\") {\n need(\"grantId\")\n need(\"domains\")\n need(\"cookieCount\")\n if (r.domains !== undefined && r.domains.length === 0) {\n ctx.addIssue({ code: \"custom\", message: \"domains must not be empty\", path: [\"domains\"] })\n }\n }\n if (r.event === \"revoke\") {\n need(\"grantId\")\n need(\"derived\")\n }\n if (r.event === \"sink-ack\") {\n need(\"grantId\")\n need(\"sinkId\")\n if (r.actor.kind !== \"human\") ctx.addIssue({ code: \"custom\", message: \"a sink-ack is a human act\", path: [\"actor\", \"kind\"] })\n }\n if (r.event === \"deny\") need(\"reason\")\n })\n\nexport type LedgerRecord = z.infer<typeof ledgerRecordSchema>\n\n/** A record before the ledger stamps `seq`, `at` and `prev`. */\nexport type LedgerEntry = Omit<LedgerRecord, \"seq\" | \"at\" | \"prev\">\n\n/** SHA-256 of the grant id, a NUL byte and a cookie name, lowercase hex. Never a value. */\nexport function cookieNameHash(grantId: string, cookieName: string): string {\n return createHash(\"sha256\").update(grantId).update(\"\\0\").update(cookieName).digest(\"hex\")\n}\n\nconst sha256 = (text: string): string => createHash(\"sha256\").update(text).digest(\"hex\")\n\nexport interface ConsentLedgerOptions {\n /** Ledger file. Default {@link defaultConsentLedgerPath}. */\n path?: string\n now?: () => Date\n}\n\nexport interface ConsentLedger {\n readonly path: string\n /** Validate, stamp and append one record. One writer process only: concurrent processes can duplicate `seq` and break the chain, which `verifyChain` reports. Throws {@link LedgerRecordInvalidError} and writes nothing on a bad record. */\n append(entry: LedgerEntry): LedgerRecord\n read(): LedgerRecord[]\n /** True when every `prev` matches the SHA-256 of the line before it and `seq` counts up from 0. */\n verifyChain(): boolean\n}\n\nconst isPosix = process.platform !== \"win32\"\n\nexport function createConsentLedger(opts: ConsentLedgerOptions = {}): ConsentLedger {\n const path = opts.path ?? defaultConsentLedgerPath()\n const now = opts.now ?? ((): Date => new Date())\n\n const lines = (): string[] => {\n if (!existsSync(path)) return []\n return readFileSync(path, \"utf8\").split(\"\\n\").filter(line => line.length > 0)\n }\n\n return {\n path,\n append(entry) {\n const existing = lines()\n const last = existing[existing.length - 1]\n const candidate = {\n ...entry,\n seq: existing.length,\n at: now().toISOString(),\n ...(last !== undefined ? { prev: sha256(last) } : {}),\n }\n const parsed = ledgerRecordSchema.safeParse(candidate)\n if (!parsed.success) {\n throw new LedgerRecordInvalidError(parsed.error.issues.map(i => `${i.path.join(\".\") || \"(record)\"}: ${i.message}`))\n }\n // JSON.stringify of the input keeps key order stable for the prev hash of the next line.\n const line = JSON.stringify(candidate)\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 })\n appendFileSync(path, `${line}\\n`, { mode: 0o600 })\n if (isPosix && (statSync(path).mode & 0o077) !== 0) chmodSync(path, 0o600)\n return parsed.data\n },\n read() {\n return lines().map(line => ledgerRecordSchema.parse(JSON.parse(line)))\n },\n verifyChain() {\n const rows = lines()\n let prevLine: string | undefined\n for (const [i, line] of rows.entries()) {\n const rec = ledgerRecordSchema.safeParse(JSON.parse(line))\n if (!rec.success || rec.data.seq !== i) return false\n if (prevLine !== undefined && rec.data.prev !== sha256(prevLine)) return false\n prevLine = line\n }\n return true\n },\n }\n}\n","/** The grant model of AIP-63 (`$defs/grant`) and where grants are kept. Grants hold no cookie values. */\n\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport { z } from \"zod\"\nimport { GRANT_DOMAIN_PATTERN } from \"./domains.js\"\nimport { GrantStoreInvalidError } from \"./errors.js\"\n\nexport type GrantSink = { kind: \"local\" } | { kind: \"remote\"; providerId: string; ackSeq: number }\n\nexport type GrantSourceKind = \"chrome\" | \"firefox\" | \"file\" | \"native-login\"\n\nexport interface Grant {\n id: string\n sessionId: string\n /** Paired device (AIP-59) this grant is scoped to. Absent: usable by any device the host serves (C12). */\n deviceId?: string\n source: { kind: GrantSourceKind; profile: string }\n /** Explicit registrable domains. Exactly one of `domains` and `fullProfile`. */\n domains?: string[]\n /** The recorded full-profile grant (C3). Not a wildcard domain. */\n fullProfile?: true\n sinks: GrantSink[]\n grantedAt: string\n grantedVia: \"interactive\" | \"flag\"\n expiresAt?: string\n cookieCount: number\n revokedAt?: string\n}\n\nconst grantSinkSchema = z.union([\n z.object({ kind: z.literal(\"local\") }).strict(),\n z.object({ kind: z.literal(\"remote\"), providerId: z.string(), ackSeq: z.number().int().min(0) }).strict(),\n])\n\nexport const grantSchema = z\n .object({\n id: z.string().min(1),\n sessionId: z.string().min(1),\n deviceId: z.string().min(1).optional(),\n source: z.object({ kind: z.enum([\"chrome\", \"firefox\", \"file\", \"native-login\"]), profile: z.string().min(1) }).strict(),\n domains: z.array(z.string().max(253).regex(GRANT_DOMAIN_PATTERN)).min(1).optional(),\n fullProfile: z.literal(true).optional(),\n sinks: z.array(grantSinkSchema).min(1),\n grantedAt: z.iso.datetime({ offset: true }),\n grantedVia: z.enum([\"interactive\", \"flag\"]),\n expiresAt: z.iso.datetime({ offset: true }).optional(),\n cookieCount: z.number().int().min(0),\n revokedAt: z.iso.datetime({ offset: true }).optional(),\n })\n .strict()\n .superRefine((g, ctx) => {\n if ((g.domains === undefined) === (g.fullProfile === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"a grant has exactly one of domains or fullProfile\", path: [\"domains\"] })\n }\n if (g.fullProfile && g.sinks.some(s => s.kind !== \"local\")) {\n ctx.addIssue({ code: \"custom\", message: \"a full-profile grant cannot include a remote sink (C3)\", path: [\"sinks\"] })\n }\n })\n\n/** True while the grant is not revoked and not past `expiresAt`. */\nexport function isGrantActive(grant: Grant, now: Date = new Date()): boolean {\n if (grant.revokedAt !== undefined) return false\n return grant.expiresAt === undefined || Date.parse(grant.expiresAt) > now.getTime()\n}\n\n/** True when a call from `deviceId` may use the grant (C12): unscoped grants serve any device. */\nexport function grantServesDevice(grant: Grant, deviceId: string | undefined): boolean {\n return grant.deviceId === undefined || grant.deviceId === deviceId\n}\n\n/** Where grants live. Synchronous on purpose: a launch asks \"is this grant still active\" inline. */\nexport interface GrantStore {\n list(): Grant[]\n get(id: string): Grant | undefined\n put(grant: Grant): void\n}\n\nexport function memoryGrantStore(initial: readonly Grant[] = []): GrantStore {\n const map = new Map(initial.map(g => [g.id, structuredClone(g)]))\n return {\n list: () => [...map.values()].map(g => structuredClone(g)),\n get: id => {\n const g = map.get(id)\n return g ? structuredClone(g) : undefined\n },\n put: grant => void map.set(grant.id, structuredClone(grant)),\n }\n}\n\n/** `~/.agentproto/bureau/grants.json`. Resolved on call, never at import. */\nexport function defaultGrantStorePath(home: string = homedir()): string {\n return join(home, \".agentproto\", \"bureau\", \"grants.json\")\n}\n\nconst isPosix = process.platform !== \"win32\"\n\n/** One JSON file, dir 0700, file 0600, replaced atomically on every write. */\nexport function fileGrantStore(path: string = defaultGrantStorePath()): GrantStore {\n const load = (): Grant[] => {\n if (!existsSync(path)) return []\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(path, \"utf8\"))\n } catch {\n throw new GrantStoreInvalidError(`grants file ${path} is not valid JSON`)\n }\n const parsed = z.object({ version: z.literal(1), grants: z.array(grantSchema) }).safeParse(raw)\n if (!parsed.success) throw new GrantStoreInvalidError(`grants file ${path} does not hold a grant list`)\n return parsed.data.grants\n }\n return {\n list: load,\n get: id => load().find(g => g.id === id),\n put(grant) {\n const checked = grantSchema.parse(grant)\n const all = load().filter(g => g.id !== checked.id)\n all.push(checked)\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 })\n const tmp = `${path}.tmp`\n writeFileSync(tmp, JSON.stringify({ version: 1, grants: all }, null, 2), { mode: 0o600 })\n renameSync(tmp, path)\n if (isPosix && (statSync(path).mode & 0o077) !== 0) chmodSync(path, 0o600)\n },\n }\n}\n","/** Injected seams of the consent host: the human prompt and the Chrome profile reader. */\n\nimport path from \"node:path\"\nimport { ChromeIdentityError } from \"../errors.js\"\nimport type { SessionCookie } from \"../cookie.js\"\nimport type { Known } from \"../known.js\"\nimport {\n countCookies,\n countCookiesByDomain,\n decryptChromeCookies,\n profileDirs,\n readSafeStorageKey,\n safeStorageKey,\n} from \"../local-session.js\"\n\n/** What the human is being asked. Counts only: a prompt never carries a cookie value. */\nexport type ConsentQuestion =\n | { kind: \"domain\"; domain: string; profile: string; presentCount: number | undefined; deviceId?: string }\n | { kind: \"full-profile\"; profile: string; warning: string; deviceId?: string }\n | { kind: \"sink\"; providerId: string; sessionId: string }\n\n/** The interactive consent port. A CLI wires it to a terminal, a desktop app to a dialog, a test to a fake. */\nexport interface ConsentPrompt {\n confirm(question: ConsentQuestion): Promise<boolean>\n}\n\n/** Reads a Chrome profile. Every method that decrypts values is only called after consent. */\nexport interface ChromeProfilePort {\n /** Presence scan (C5): counts per domain, no values, no Keychain. */\n countByDomain(profile: string, domains: readonly string[]): Known<Record<string, number>>\n /** Whole-profile cookie count, no values. */\n countAll(profile: string): Known<number>\n /** Decrypt the cookies of `domains`. Touches the Keychain: only for an explicit, consented import. */\n readCookies(profile: string, domains: readonly string[]): SessionCookie[]\n}\n\nexport interface LocalChromePortOptions {\n /** Chrome user-data root. Required: this package never guesses the real one here. */\n chromeRoot: string\n /** Safe-Storage password source. Default reads the macOS Keychain at import time. */\n safeStoragePassword?: () => string\n}\n\n/** The default reader over a Chrome user-data dir. The profile must be a real `Default` or `Profile N` dir. */\nexport function localChromePort(opts: LocalChromePortOptions): ChromeProfilePort {\n const dirFor = (profile: string): string => {\n if (!profileDirs(opts.chromeRoot).includes(profile)) {\n throw new ChromeIdentityError(`Chrome profile \"${profile}\" not found under the given user-data dir`)\n }\n return path.join(opts.chromeRoot, profile)\n }\n return {\n countByDomain: (profile, domains) => countCookiesByDomain(dirFor(profile), domains),\n countAll: profile => countCookies(dirFor(profile)),\n readCookies(profile, domains) {\n const key = opts.safeStoragePassword ? safeStorageKey(opts.safeStoragePassword()) : readSafeStorageKey()\n return decryptChromeCookies(dirFor(profile), domains, key)\n },\n }\n}\n","/**\n * The consent host: the one place a grant is created, refreshed or revoked.\n * Human consent paths live here; agents get the narrower surface in `agent.ts`.\n * No cookie value ever reaches the ledger, a thrown error or a returned result:\n * values exist only in the per-grant jar file (derived material) and in the\n * arrays handed to a provider's cookie source.\n */\n\nimport { randomUUID } from \"node:crypto\"\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from \"node:fs\"\nimport path from \"node:path\"\nimport { browserCookieSchema, type BrowserCookie } from \"@agentproto/driver-browser\"\nimport { z } from \"zod\"\nimport type { SessionCookie } from \"../cookie.js\"\nimport { isFileInject, type SessionDescriptor } from \"../descriptor.js\"\nimport type { SessionStorePort } from \"../store.js\"\nimport { validateGrantDomains, hostCoveredBy, type GrantDomainPolicy } from \"./domains.js\"\nimport {\n AgentGrantRefusedError,\n ConsentDeclinedError,\n ConsentRequiredError,\n FullProfileGrantError,\n NonInteractiveConsentError,\n SinkAckRequiredError,\n} from \"./errors.js\"\nimport {\n grantServesDevice,\n isGrantActive,\n type Grant,\n type GrantSink,\n type GrantStore,\n} from \"./grants.js\"\nimport { cookieNameHash, type ConsentLedger, type LedgerActor } from \"./ledger.js\"\nimport type { ChromeProfilePort, ConsentPrompt } from \"./ports.js\"\n\n/** Returned with every full-profile grant. Shown to the human verbatim. */\nexport const FULL_PROFILE_WARNING =\n \"WARNING: full-profile grant. Every cookie in this Chrome profile becomes usable by this device, \" +\n \"for every site, not just the ones you know. It stays on this machine (local sink only). \" +\n \"Prefer naming domains with --domains. Revoke it any time; the grant and the revoke are in the consent ledger.\"\n\nexport type SinkRequest = { kind: \"local\" } | { kind: \"remote\"; providerId: string; acknowledged?: boolean }\n\nexport interface ImportRequest {\n sessionId: string\n /** Chrome profile dir (`Default`, `Profile 1`). */\n profile: string\n /** Explicit registrable domains. There is no \"all\". */\n domains?: readonly string[]\n /** `--yes`: the human confirmed the named domains without a prompt. */\n yes?: boolean\n deviceId?: string\n sinks?: readonly SinkRequest[]\n expiresAt?: string\n /** Defaults to a human. An `agent` here is refused and recorded as a deny row. */\n actor?: LedgerActor\n}\n\nexport interface FullProfileRequest {\n sessionId: string\n profile: string\n yes?: boolean\n deviceId?: string\n expiresAt?: string\n actor?: LedgerActor\n}\n\nexport interface GrantResult {\n grant: Grant\n /** Cookie counts per domain from the presence scan; `undefined` when the scan failed. */\n presence: Record<string, number> | undefined\n warnings: string[]\n}\n\nexport interface FullProfileResult {\n grant: Grant\n /** The loud warning to show the human. */\n warning: string\n warnings: string[]\n}\n\nexport interface RevokeResult {\n grant: Grant\n derived: { local: \"deleted\" | \"none\"; remote: \"confirmed\" | \"unavailable\" | \"failed\" | \"not-applicable\" }\n}\n\nexport interface ConsentHostOptions {\n grants: GrantStore\n ledger: ConsentLedger\n /** L5a store holding the session descriptor this host derives. */\n store: SessionStorePort\n /** Directory of per-grant cookie jars (0700). Derived material: deleted on revoke. */\n jarDir: string\n chrome: ChromeProfilePort\n /** Present: a human can be asked. Absent: non-interactive, so `--domains` and `--yes` are mandatory (C4). */\n prompt?: ConsentPrompt\n domainPolicy?: GrantDomainPolicy\n /** C13: a device-scoped grant is honored only while its device is still paired. */\n isDevicePaired?: (deviceId: string) => boolean\n /** Asks a remote sink to delete what it received. Absent: `remote` is recorded as `unavailable`. */\n revokeRemote?: (grant: Grant) => Promise<\"confirmed\" | \"failed\" | \"unavailable\">\n /** Removes material this host does not own, such as a full-profile clone. True when something was deleted. */\n deleteExtraDerived?: (grant: Grant) => Promise<boolean>\n now?: () => Date\n newId?: () => string\n}\n\nexport interface FullProfileSelector {\n grantId?: string\n sessionId?: string\n profile?: string\n deviceId?: string\n}\n\nexport interface FullProfileProof {\n readonly grantId: string\n isActive(): boolean\n}\n\nexport interface ConsentHost {\n importFromChrome(req: ImportRequest): Promise<GrantResult>\n grantFullProfile(req: FullProfileRequest): Promise<FullProfileResult>\n /** Re-read the grant's own domains from its own profile. Never widens. Allowed for an agent (C7). */\n refresh(grantId: string, opts?: { actor?: LedgerActor }): Promise<{ grant: Grant; cookieCount: number }>\n revoke(grantId: string, opts?: { actor?: LedgerActor }): Promise<RevokeResult>\n /** Proof for the kit's `fullProfile` unlock. Throws {@link FullProfileGrantError} when no active full-profile grant matches. */\n fullProfileProof(selector: FullProfileSelector): FullProfileProof\n /** A provider cookie source that serves only this device's active, granted domains. */\n cookieSourceFor(scope?: { deviceId?: string }): (request: { providerId: string; profile: string }) => readonly BrowserCookie[]\n /** Throws `browser:consent_required` unless an active grant of this session covers `host` for this device. */\n assertCovered(input: { sessionId: string; host: string; deviceId?: string }): Grant\n /** Record a refused agent attempt and throw {@link AgentGrantRefusedError}. */\n refuseAgent(attempt: string, ctx: { actor: LedgerActor; grantId?: string; sessionId?: string; domains?: readonly string[] }): never\n getGrant(id: string): Grant | undefined\n listGrants(): Grant[]\n}\n\nconst jarSchema = z.object({ version: z.literal(1), cookies: z.array(browserCookieSchema) })\n\nconst SAME_SITE: Record<string, BrowserCookie[\"sameSite\"]> = { strict: \"Strict\", lax: \"Lax\", none: \"None\" }\n\nfunction toBrowserCookie(c: SessionCookie): BrowserCookie {\n const sameSite = c.sameSite ? SAME_SITE[c.sameSite.toLowerCase()] : undefined\n return {\n name: c.name,\n value: c.value,\n domain: c.domain,\n path: c.path ?? \"/\",\n ...(c.expires !== undefined && c.expires > 0 ? { expires: c.expires } : {}),\n ...(c.httpOnly !== undefined ? { httpOnly: c.httpOnly } : {}),\n ...(c.secure !== undefined ? { secure: c.secure } : {}),\n ...(sameSite ? { sameSite } : {}),\n }\n}\n\nconst isPosix = process.platform !== \"win32\"\nconst HUMAN: LedgerActor = { kind: \"human\" }\nconst SYSTEM: LedgerActor = { kind: \"system\" }\n\nexport function createConsentHost(opts: ConsentHostOptions): ConsentHost {\n const { grants, ledger, store, chrome } = opts\n const now = opts.now ?? ((): Date => new Date())\n const newId = opts.newId ?? ((): string => `grant_${randomUUID()}`)\n const jarPath = (grantId: string): string => path.join(opts.jarDir, `${grantId.replace(/[^\\w.-]/g, \"_\")}.json`)\n\n const devicePaired = (g: Grant): boolean =>\n g.deviceId === undefined || opts.isDevicePaired === undefined || opts.isDevicePaired(g.deviceId)\n const usable = (g: Grant, deviceId: string | undefined): boolean =>\n isGrantActive(g, now()) && devicePaired(g) && grantServesDevice(g, deviceId)\n\n const writeJar = (grantId: string, cookies: readonly BrowserCookie[]): void => {\n mkdirSync(opts.jarDir, { recursive: true, mode: 0o700 })\n const file = jarPath(grantId)\n const tmp = `${file}.tmp`\n writeFileSync(tmp, JSON.stringify({ version: 1, cookies }), { mode: 0o600 })\n renameSync(tmp, file)\n if (isPosix && (statSync(file).mode & 0o077) !== 0) chmodSync(file, 0o600)\n }\n\n const readJar = (grantId: string): BrowserCookie[] => {\n const file = jarPath(grantId)\n if (!existsSync(file)) return []\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(file, \"utf8\"))\n } catch {\n return []\n }\n const parsed = jarSchema.safeParse(raw)\n return parsed.success ? parsed.data.cookies : []\n }\n\n const nameHashes = (grantId: string, cookies: readonly BrowserCookie[]): string[] =>\n [...new Set(cookies.map(c => c.name))].map(n => cookieNameHash(grantId, n))\n\n /** Recompute the session descriptor from the session's active domain grants, or drop it when none remain. */\n const syncDescriptor = async (sessionId: string): Promise<void> => {\n const active = grants\n .list()\n .filter(g => g.sessionId === sessionId && g.domains !== undefined && isGrantActive(g, now()) && existsSync(jarPath(g.id)))\n .sort((a, b) => a.grantedAt.localeCompare(b.grantedAt))\n const prev = await store.load(sessionId)\n const latest = active[active.length - 1]\n if (!latest || !latest.domains) {\n if (prev?.inject && isFileInject(prev.inject) && path.dirname(prev.inject.path) === opts.jarDir) await store.remove(sessionId)\n return\n }\n const desc: SessionDescriptor = {\n ...(prev ?? { id: sessionId, backend: \"camofox\" as const }),\n identity: { ...(prev?.identity ?? {}), profile: latest.source.profile },\n inject: { from: \"file\", domains: latest.domains, path: jarPath(latest.id) },\n savedAt: now().toISOString(),\n }\n await store.save(desc)\n }\n\n const refuseAgent: ConsentHost[\"refuseAgent\"] = (attempt, ctx) => {\n const named = ctx.domains && ctx.domains.length > 0 ? ` (${ctx.domains.join(\", \")})` : \"\"\n ledger.append({\n event: \"deny\",\n actor: ctx.actor,\n ...(ctx.grantId ? { grantId: ctx.grantId } : {}),\n ...(ctx.sessionId ? { sessionId: ctx.sessionId } : {}),\n reason: `agent attempted to ${attempt}${named}`.slice(0, 500),\n })\n throw new AgentGrantRefusedError(attempt)\n }\n\n const guardHuman = (actor: LedgerActor | undefined, attempt: string, ctx: { sessionId: string; domains?: readonly string[] }): LedgerActor => {\n const a = actor ?? HUMAN\n if (a.kind === \"agent\") refuseAgent(attempt, { actor: a, sessionId: ctx.sessionId, ...(ctx.domains ? { domains: ctx.domains } : {}) })\n return a\n }\n\n return {\n async importFromChrome(req) {\n const actor = guardHuman(req.actor, \"grant access to a Chrome profile\", { sessionId: req.sessionId, ...(req.domains ? { domains: req.domains } : {}) })\n const named = req.domains ?? []\n if (!opts.prompt) {\n const missing: string[] = []\n if (named.length === 0) missing.push(\"--domains\")\n if (req.yes !== true) missing.push(\"--yes\")\n if (missing.length > 0) throw new NonInteractiveConsentError(missing)\n }\n const domains = validateGrantDomains(named, opts.domainPolicy)\n const scan = chrome.countByDomain(req.profile, domains)\n const presence = \"known\" in scan ? scan.known : undefined\n\n if (req.yes !== true && opts.prompt) {\n for (const domain of domains) {\n const ok = await opts.prompt.confirm({\n kind: \"domain\",\n domain,\n profile: req.profile,\n presentCount: presence?.[domain],\n ...(req.deviceId ? { deviceId: req.deviceId } : {}),\n })\n if (!ok) throw new ConsentDeclinedError(`domain ${domain}`)\n }\n }\n\n const remoteSinks: Array<{ providerId: string }> = []\n const sinks: GrantSink[] = []\n for (const s of req.sinks ?? [{ kind: \"local\" as const }]) {\n if (s.kind === \"local\") {\n if (!sinks.some(x => x.kind === \"local\")) sinks.push({ kind: \"local\" })\n continue\n }\n let acked = s.acknowledged === true\n if (!acked && opts.prompt) acked = await opts.prompt.confirm({ kind: \"sink\", providerId: s.providerId, sessionId: req.sessionId })\n if (!acked) throw new SinkAckRequiredError(s.providerId)\n remoteSinks.push({ providerId: s.providerId })\n }\n if (sinks.length === 0 && remoteSinks.length === 0) sinks.push({ kind: \"local\" })\n\n const cookies = chrome.readCookies(req.profile, domains).map(toBrowserCookie)\n const id = newId()\n const via = req.yes === true ? \"flag\" : \"interactive\"\n const grantActor: LedgerActor = { ...actor, via, ...(req.deviceId ? { deviceId: req.deviceId } : {}) }\n\n ledger.append({\n event: \"grant\",\n actor: grantActor,\n grantId: id,\n sessionId: req.sessionId,\n domains,\n cookieCount: cookies.length,\n nameHashes: nameHashes(id, cookies),\n })\n writeJar(id, cookies)\n for (const r of remoteSinks) {\n const row = ledger.append({ event: \"sink-ack\", actor: grantActor, grantId: id, sessionId: req.sessionId, sinkId: r.providerId })\n sinks.push({ kind: \"remote\", providerId: r.providerId, ackSeq: row.seq })\n }\n const grant: Grant = {\n id,\n sessionId: req.sessionId,\n ...(req.deviceId ? { deviceId: req.deviceId } : {}),\n source: { kind: \"chrome\", profile: req.profile },\n domains,\n sinks,\n grantedAt: now().toISOString(),\n grantedVia: via,\n ...(req.expiresAt ? { expiresAt: req.expiresAt } : {}),\n cookieCount: cookies.length,\n }\n grants.put(grant)\n await syncDescriptor(req.sessionId)\n const warnings = presence\n ? domains.filter(d => (presence[d] ?? 0) === 0).map(d => `no cookies found for ${d} in profile ${req.profile}`)\n : [\"presence scan failed; the import may hold fewer cookies than expected\"]\n return { grant, presence, warnings }\n },\n\n async grantFullProfile(req) {\n const actor = guardHuman(req.actor, \"grant a full Chrome profile\", { sessionId: req.sessionId })\n if (!opts.prompt && req.yes !== true) throw new NonInteractiveConsentError([\"--full-profile\", \"--yes\"])\n if (req.yes !== true && opts.prompt) {\n const ok = await opts.prompt.confirm({\n kind: \"full-profile\",\n profile: req.profile,\n warning: FULL_PROFILE_WARNING,\n ...(req.deviceId ? { deviceId: req.deviceId } : {}),\n })\n if (!ok) throw new ConsentDeclinedError(`full profile ${req.profile}`)\n }\n const count = chrome.countAll(req.profile)\n const cookieCount = \"known\" in count ? count.known : 0\n const id = newId()\n const via = req.yes === true ? \"flag\" : \"interactive\"\n ledger.append({\n event: \"grant\",\n actor: { ...actor, via, ...(req.deviceId ? { deviceId: req.deviceId } : {}) },\n grantId: id,\n sessionId: req.sessionId,\n fullProfile: true,\n cookieCount,\n })\n const grant: Grant = {\n id,\n sessionId: req.sessionId,\n ...(req.deviceId ? { deviceId: req.deviceId } : {}),\n source: { kind: \"chrome\", profile: req.profile },\n fullProfile: true,\n sinks: [{ kind: \"local\" }],\n grantedAt: now().toISOString(),\n grantedVia: via,\n ...(req.expiresAt ? { expiresAt: req.expiresAt } : {}),\n cookieCount,\n }\n grants.put(grant)\n const warnings = \"known\" in count ? [] : [\"cookie count unavailable; recorded as 0\"]\n return { grant, warning: FULL_PROFILE_WARNING, warnings }\n },\n\n async refresh(grantId, o = {}) {\n const actor = o.actor ?? SYSTEM\n const grant = grants.get(grantId)\n if (!grant || !usable(grant, actor.deviceId) || !grant.domains) throw new ConsentRequiredError()\n const cookies = chrome.readCookies(grant.source.profile, grant.domains).map(toBrowserCookie)\n ledger.append({\n event: \"refresh\",\n actor,\n grantId,\n sessionId: grant.sessionId,\n domains: grant.domains,\n cookieCount: cookies.length,\n nameHashes: nameHashes(grantId, cookies),\n })\n writeJar(grantId, cookies)\n const next: Grant = { ...grant, cookieCount: cookies.length }\n grants.put(next)\n await syncDescriptor(grant.sessionId)\n return { grant: next, cookieCount: cookies.length }\n },\n\n async revoke(grantId, o = {}) {\n const actor = o.actor ?? HUMAN\n const grant = grants.get(grantId)\n if (!grant) throw new ConsentRequiredError(`no grant \"${grantId}\"`)\n if (grant.revokedAt !== undefined) return { grant, derived: { local: \"none\", remote: \"not-applicable\" } }\n const hadJar = existsSync(jarPath(grantId))\n rmSync(jarPath(grantId), { force: true })\n const extra = opts.deleteExtraDerived ? await opts.deleteExtraDerived(grant) : false\n const hasRemote = grant.sinks.some(s => s.kind === \"remote\")\n const remote: RevokeResult[\"derived\"][\"remote\"] = !hasRemote\n ? \"not-applicable\"\n : opts.revokeRemote\n ? await opts.revokeRemote(grant)\n : \"unavailable\"\n const derived: RevokeResult[\"derived\"] = { local: hadJar || extra ? \"deleted\" : \"none\", remote }\n const revoked: Grant = { ...grant, revokedAt: now().toISOString() }\n grants.put(revoked)\n await syncDescriptor(grant.sessionId)\n ledger.append({ event: \"revoke\", actor, grantId, sessionId: grant.sessionId, derived })\n return { grant: revoked, derived }\n },\n\n fullProfileProof(sel) {\n const match = (g: Grant): boolean =>\n g.fullProfile === true &&\n (sel.grantId === undefined || g.id === sel.grantId) &&\n (sel.sessionId === undefined || g.sessionId === sel.sessionId) &&\n (sel.profile === undefined || g.source.profile === sel.profile) &&\n usable(g, sel.deviceId)\n const found = grants.list().find(match)\n if (!found) {\n throw new FullProfileGrantError(\n \"no active full-profile grant covers this request. --full-profile needs an explicit, recorded grant (run the full-profile consent first).\",\n )\n }\n return {\n grantId: found.id,\n isActive: () => {\n const g = grants.get(found.id)\n return g !== undefined && g.fullProfile === true && usable(g, sel.deviceId)\n },\n }\n },\n\n // Serves domain grants only. A full-profile grant is honored through `fullProfileProof`, never as injected cookies.\n cookieSourceFor(scope = {}) {\n return ({ providerId, profile }) => {\n const out: BrowserCookie[] = []\n for (const g of grants.list()) {\n if (g.sessionId !== profile || !g.domains || !usable(g, scope.deviceId)) continue\n const servesProvider = g.sinks.some(s => s.kind === \"local\" || s.providerId === providerId)\n if (!servesProvider) continue\n const allowed = g.domains\n out.push(...readJar(g.id).filter(c => allowed.some(d => hostCoveredBy(c.domain, d))))\n }\n return out\n }\n },\n\n assertCovered({ sessionId, host, deviceId }) {\n const hit = grants\n .list()\n .find(g => g.sessionId === sessionId && g.domains?.some(d => hostCoveredBy(host, d)) === true && usable(g, deviceId))\n if (!hit) throw new ConsentRequiredError(`no active grant covers ${host} for this device`)\n return hit\n },\n\n refuseAgent,\n getGrant: id => grants.get(id),\n listGrants: () => grants.list(),\n }\n}\n","/**\n * The agent-path surface (AIP-63 C7, plan F4). An agent may refresh inside a\n * grant and revoke. It cannot grant, add a domain, change the profile or add a\n * sink: each attempt is refused with a typed error and appended as a `deny` row.\n */\n\nimport type { ConsentHost } from \"./host.js\"\nimport { ConsentRequiredError } from \"./errors.js\"\nimport { grantServesDevice, type Grant } from \"./grants.js\"\nimport type { LedgerActor } from \"./ledger.js\"\n\nexport interface AgentSyncInput {\n grantId: string\n /** Accepted only when identical to the grant's own domains. Anything else is a refused widening. */\n domains?: readonly string[]\n /** Accepted only when identical to the grant's own profile. */\n profile?: string\n}\n\nexport interface AgentConsentSurface {\n /** `session_sync_from_chrome`: refresh within the grant. Cannot add a domain or change profile. */\n sync(input: AgentSyncInput): Promise<{ grantId: string; cookieCount: number }>\n revoke(grantId: string): Promise<void>\n /** Always refused: only a human consent path creates a grant. */\n grant(input: { sessionId: string; domains?: readonly string[] }): Promise<never>\n addSink(input: { grantId: string; providerId: string }): Promise<never>\n}\n\nexport function createAgentConsentSurface(host: ConsentHost, who: { deviceId?: string; via?: string } = {}): AgentConsentSurface {\n const actor: LedgerActor = {\n kind: \"agent\",\n ...(who.via ? { via: who.via } : {}),\n ...(who.deviceId ? { deviceId: who.deviceId } : {}),\n }\n const own = (grantId: string): Grant => {\n const g = host.getGrant(grantId)\n if (!g || !grantServesDevice(g, who.deviceId)) throw new ConsentRequiredError()\n return g\n }\n const sameSet = (a: readonly string[], b: readonly string[]): boolean => {\n const left = new Set(a.map(x => x.toLowerCase()))\n const right = new Set(b.map(x => x.toLowerCase()))\n return left.size === right.size && [...left].every(x => right.has(x))\n }\n\n return {\n async sync(input) {\n const grant = own(input.grantId)\n const base = { actor, grantId: grant.id, sessionId: grant.sessionId }\n if (input.profile !== undefined && input.profile !== grant.source.profile) {\n host.refuseAgent(\"change the Chrome profile of a grant\", base)\n }\n if (input.domains !== undefined && !sameSet(input.domains, grant.domains ?? [])) {\n host.refuseAgent(\"add a domain to a grant\", { ...base, domains: input.domains })\n }\n const { cookieCount } = await host.refresh(grant.id, { actor })\n return { grantId: grant.id, cookieCount }\n },\n async revoke(grantId) {\n own(grantId)\n await host.revoke(grantId, { actor })\n },\n async grant(input) {\n return host.refuseAgent(\"grant access to a Chrome profile\", {\n actor,\n sessionId: input.sessionId,\n ...(input.domains ? { domains: input.domains } : {}),\n })\n },\n async addSink(input) {\n const g = own(input.grantId)\n return host.refuseAgent(\"add a sink to a grant\", { actor, grantId: g.id, sessionId: g.sessionId })\n },\n }\n}\n","/**\n * `doctor`: why can't Bureau read this Chrome profile? Every probe goes through\n * an injected port, so tests use fakes and never touch a real profile. The\n * Keychain is probed only when the caller asks for it explicitly.\n */\n\nimport { copyFileSync, mkdtempSync, readFileSync, rmSync } from \"node:fs\"\nimport { tmpdir } from \"node:os\"\nimport path from \"node:path\"\nimport { parseLocalState } from \"../local-state.js\"\n\nexport type DoctorFailure = \"missing\" | \"full-disk-access\" | \"unreadable\" | \"keychain-denied\"\n\nexport interface DoctorCheck {\n id: \"local-state\" | \"cookies-db\" | \"keychain\"\n status: \"ok\" | \"fail\" | \"skipped\"\n detail: string\n failure?: DoctorFailure\n /** What to do about it. */\n fix?: string\n}\n\nexport interface DoctorReport {\n ok: boolean\n checks: DoctorCheck[]\n /** Set when any check failed: the way around needing the profile at all. */\n recommendation?: string\n}\n\n/** Probes the doctor runs. Each throws a Node-style error (with `code`) on failure. */\nexport interface DoctorPort {\n /** Raw text of `Local State`. */\n readLocalState(): string\n /** Copy the profile's Cookies db somewhere temporary and remove the copy. */\n copyCookiesDb(profile: string): void\n /** Ask the Keychain for the Safe Storage key. Only called when `checkKeychain` is true. */\n probeKeychain?(): void\n /** The exact executable that needs Full Disk Access. */\n binary: string\n}\n\nexport interface DoctorOptions {\n port: DoctorPort\n profile: string\n /** Explicit action: touch the Keychain. Default false. */\n checkKeychain?: boolean\n}\n\nconst NATIVE_LOGIN_RECOMMENDATION =\n \"Sign in natively instead: run the native-login flow in the Bureau browser. It needs no access to your Chrome profile, Keychain or Full Disk Access.\"\n\nconst errCode = (e: unknown): string | undefined =>\n typeof e === \"object\" && e !== null && \"code\" in e && typeof (e as { code: unknown }).code === \"string\"\n ? (e as { code: string }).code\n : undefined\n\nfunction classify(e: unknown, binary: string, what: string): Pick<DoctorCheck, \"failure\" | \"detail\" | \"fix\"> {\n const code = errCode(e)\n if (code === \"EPERM\" || code === \"EACCES\") {\n return {\n failure: \"full-disk-access\",\n detail: `${what} was blocked (${code}). Full Disk Access is missing for \"${binary}\".`,\n fix: `System Settings > Privacy & Security > Full Disk Access: enable \"${binary}\", then restart it.`,\n }\n }\n if (code === \"ENOENT\") {\n return { failure: \"missing\", detail: `${what} does not exist.`, fix: \"Check the Chrome profile name (Default, Profile 1) and that Chrome is installed.\" }\n }\n return { failure: \"unreadable\", detail: `${what} could not be read (${code ?? \"unknown error\"}).` }\n}\n\nexport function runDoctor(opts: DoctorOptions): DoctorReport {\n const { port } = opts\n const checks: DoctorCheck[] = []\n\n try {\n const state = parseLocalState(port.readLocalState())\n checks.push({ id: \"local-state\", status: \"ok\", detail: `Local State readable, ${state.profiles.length} profile(s) listed.` })\n } catch (e) {\n checks.push({ id: \"local-state\", status: \"fail\", ...classify(e, port.binary, \"Local State\") })\n }\n\n try {\n port.copyCookiesDb(opts.profile)\n checks.push({ id: \"cookies-db\", status: \"ok\", detail: `Cookies db of \"${opts.profile}\" is copyable.` })\n } catch (e) {\n checks.push({ id: \"cookies-db\", status: \"fail\", ...classify(e, port.binary, `Cookies db of \"${opts.profile}\"`) })\n }\n\n if (opts.checkKeychain === true && port.probeKeychain) {\n try {\n port.probeKeychain()\n checks.push({ id: \"keychain\", status: \"ok\", detail: \"Keychain returned the Safe Storage key (value not shown).\" })\n } catch {\n checks.push({\n id: \"keychain\",\n status: \"fail\",\n failure: \"keychain-denied\",\n detail: \"The Keychain did not release the Safe Storage key.\",\n fix: \"Approve the Keychain prompt for this run, or use native login.\",\n })\n }\n } else {\n checks.push({ id: \"keychain\", status: \"skipped\", detail: \"Keychain not touched. Pass the explicit keychain check to probe it.\" })\n }\n\n const ok = checks.every(c => c.status !== \"fail\")\n return { ok, checks, ...(ok ? {} : { recommendation: NATIVE_LOGIN_RECOMMENDATION }) }\n}\n\nexport interface LocalDoctorPortOptions {\n chromeRoot: string\n binary?: string\n probeKeychain?: () => void\n}\n\n/** The real-filesystem port. The Cookies copy lives in a temp dir and is removed at once. */\nexport function localDoctorPort(opts: LocalDoctorPortOptions): DoctorPort {\n return {\n binary: opts.binary ?? process.execPath,\n readLocalState: () => readFileSync(path.join(opts.chromeRoot, \"Local State\"), \"utf8\"),\n copyCookiesDb(profile) {\n const dir = mkdtempSync(path.join(tmpdir(), \"bp-doctor-\"))\n try {\n copyFileSync(path.join(opts.chromeRoot, profile, \"Cookies\"), path.join(dir, \"Cookies\"))\n } finally {\n rmSync(dir, { recursive: true, force: true })\n }\n },\n ...(opts.probeKeychain ? { probeKeychain: opts.probeKeychain } : {}),\n }\n}\n"]}