UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

146 lines (145 loc) 5.56 kB
import { r as defaultRuntime } from "./runtime-CF2WjnNZ.js"; import { a as resolveSystemCookieSource, i as readSystemProfileCookies, o as cacheKeychainSecret, t as assertSystemCookiePlatform } from "./system-profiles-BfmCES0e.js"; import { t as parseSystemProfileDomains } from "./system-profile-domains-BQKUrgj5.js"; import "./core-api-zb8NP8I7.js"; import { l as runBrowserCliCommand, n as callBrowserRequest } from "./browser-cli-shared-Co4TmZyV.js"; import fs from "node:fs"; import path from "node:path"; //#region extensions/browser/src/cli/browser-cli-cookie-sync.ts /** Host-local macOS system-cookie sync into a managed Browser profile. */ const COOKIE_SYNC_DEBOUNCE_MS = 1500; function parseCookieSyncDomains(raw) { if (raw === void 0) throw new Error("--domains is required; cookie sync never sends an unrestricted cookie jar"); const domains = parseSystemProfileDomains(raw.split(",")); if (!domains) throw new Error("--domains must include at least one non-empty domain"); return domains; } function describeGatewayTarget(parent) { return parent.url?.trim() || "configured/default"; } function formatCookieSyncSummary(summary) { const domains = summary.domains.length > 0 ? summary.domains.join(",") : "none"; return `cookie sync ${summary.browser}/${summary.systemProfile} -> ${summary.into} via ${summary.gateway}: total=${summary.total} pushed=${summary.pushed} skipped=${summary.skipped} failed=${summary.failed} domains=${domains}`; } async function pushSystemProfileCookies(params) { const source = await readSystemProfileCookies({ browser: params.options.browser, systemProfile: params.options.system, domains: params.domains, signal: params.signal }, { readSecret: params.readSecret }); let pushed = 0; if (source.cookies.length > 0) pushed = (await callBrowserRequest(params.parent, { method: "POST", path: "/cookies/set-many", query: { profile: params.options.into }, body: { cookies: source.cookies } })).added; return { browser: source.browser, systemProfile: source.systemProfile, into: params.options.into, gateway: describeGatewayTarget(params.parent), total: source.counts.total, pushed, skipped: source.counts.skipped, failed: source.counts.failed + Math.max(0, source.cookies.length - pushed), domains: source.domains.toSorted() }; } async function watchSystemProfileCookies(params) { assertSystemCookiePlatform(); const source = resolveSystemCookieSource({ browser: params.options.browser, systemProfile: params.options.system }); const controller = new AbortController(); const readSecret = await cacheKeychainSecret(source.browser, controller.signal); let debounce; let inFlight = false; let stopped = false; let stopError; let resolveStopped; let rejectStopped; const stoppedPromise = new Promise((resolve, reject) => { resolveStopped = resolve; rejectStopped = reject; }); const runCycle = async () => { if (stopped || inFlight) return; inFlight = true; try { const summary = await pushSystemProfileCookies({ ...params, readSecret, signal: controller.signal }); defaultRuntime.error(formatCookieSyncSummary(summary)); } catch (error) { if (!stopped) defaultRuntime.error(`cookie sync failed: ${String(error)}`); } finally { inFlight = false; if (stopped) { if (stopError) rejectStopped?.(stopError); else resolveStopped?.(); } } }; const sourceName = path.basename(source.cookiesFile); const watcher = fs.watch(path.dirname(source.cookiesFile), (_event, filename) => { const changedName = filename === null ? null : path.basename(filename); if (changedName !== null && changedName !== sourceName && !changedName.startsWith(`${sourceName}-`)) return; clearTimeout(debounce); debounce = setTimeout(() => void runCycle(), COOKIE_SYNC_DEBOUNCE_MS); }); const stop = () => { if (stopped) return; stopped = true; clearTimeout(debounce); watcher.close(); controller.abort(/* @__PURE__ */ new Error("cookie sync stopped")); if (!inFlight) { if (stopError) rejectStopped?.(stopError); else resolveStopped?.(); } }; const fail = (error) => { stopError = error; stop(); }; watcher.on("error", fail); process.once("SIGINT", stop); process.once("SIGTERM", stop); try { await runCycle(); await stoppedPromise; } finally { process.removeListener("SIGINT", stop); process.removeListener("SIGTERM", stop); watcher.removeListener("error", fail); stop(); } } /** Register `browser cookie-sync`. */ function registerBrowserCookieSyncCommand(browser, parentOpts) { browser.command("cookie-sync").description("Sync allowlisted macOS Chrome-family cookies into a managed profile").option("--domains <list>", "Required comma-separated domain allowlist").option("--into <profile>", "Target managed Browser profile", "imported").option("--browser <browser>", "System browser: chrome, brave, edge, or chromium", "chrome").option("--system <id>", "System browser profile directory", "Default").option("--watch", "Watch the source Cookies database and re-sync changes", false).action((options, command) => runBrowserCliCommand(async () => { const domains = parseCookieSyncDomains(options.domains); const parent = parentOpts(command); if (options.watch) { await watchSystemProfileCookies({ options, parent, domains }); return; } const summary = await pushSystemProfileCookies({ options, parent, domains }); defaultRuntime.log(formatCookieSyncSummary(summary)); })); } //#endregion export { registerBrowserCookieSyncCommand };