UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

374 lines (373 loc) 14.6 kB
import { c as normalizeOptionalString, s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js"; import { n as inheritOptionFromParent } from "./command-options-Dhjl7AMa.js"; import { n as defaultRuntime } from "./runtime-B4lgFmsS.js"; import { t as danger } from "./globals-GTrXU4s9.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { n as runCommandWithRuntime } from "./cli-utils-Cuzzfy1Q.js"; import { n as ACT_MAX_VIEWPORT_DIMENSION } from "./act-policy-ChvnirnB.js"; import { d as parseBooleanValue } from "./config-C2rsUqn7.js"; import "./core-api-Cugd5en1.js"; import "./core-api-CXEZTE_E.js"; import { n as callBrowserRequest, s as parseBrowserPositiveIntegerValue, t as BROWSER_TAB_REFERENCE_HELP } from "./browser-cli-shared-BGezcJey.js"; import { t as runBrowserResizeWithOutput } from "./browser-cli-resize-D9ZHR_Rj.js"; //#region extensions/browser/src/cli/browser-cli-state.cookies-storage.ts function resolveUrl(opts, command) { return normalizeOptionalString(opts.url) ?? normalizeOptionalString(inheritOptionFromParent(command, "url")); } function resolveTargetId(rawTargetId, command) { return normalizeOptionalString(rawTargetId) ?? normalizeOptionalString(inheritOptionFromParent(command, "targetId")); } async function runMutationRequest(params) { try { const result = await callBrowserRequest(params.parent, params.request, { timeoutMs: 2e4 }); if (params.parent?.json) { defaultRuntime.writeJson(result); return; } defaultRuntime.log(params.successMessage); } catch (err) { defaultRuntime.error(danger(String(err))); defaultRuntime.exit(1); } } /** Registers Browser cookies and storage subcommands. */ function registerBrowserCookiesAndStorageCommands(browser, parentOpts) { const cookies = browser.command("cookies").description("Read/write cookies"); cookies.option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (opts, cmd) => { const parent = parentOpts(cmd); const profile = parent?.browserProfile; const targetId = resolveTargetId(opts.targetId, cmd); try { const result = await callBrowserRequest(parent, { method: "GET", path: "/cookies", query: { targetId, profile } }, { timeoutMs: 2e4 }); if (parent?.json) { defaultRuntime.writeJson(result); return; } defaultRuntime.writeJson(result.cookies ?? []); } catch (err) { defaultRuntime.error(danger(String(err))); defaultRuntime.exit(1); } }); cookies.command("set").description("Set a cookie (requires --url or domain+path)").argument("<name>", "Cookie name").argument("<value>", "Cookie value").option("--url <url>", "Cookie URL scope (recommended)").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (name, value, opts, cmd) => { const parent = parentOpts(cmd); const profile = parent?.browserProfile; const targetId = resolveTargetId(opts.targetId, cmd); const url = resolveUrl(opts, cmd); if (!url) { defaultRuntime.error(danger("Missing required --url option for cookies set")); defaultRuntime.exit(1); return; } await runMutationRequest({ parent, request: { method: "POST", path: "/cookies/set", query: profile ? { profile } : void 0, body: { targetId, cookie: { name, value, url } } }, successMessage: `cookie set: ${name}` }); }); cookies.command("clear").description("Clear all cookies").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (opts, cmd) => { const parent = parentOpts(cmd); const profile = parent?.browserProfile; const targetId = resolveTargetId(opts.targetId, cmd); await runMutationRequest({ parent, request: { method: "POST", path: "/cookies/clear", query: profile ? { profile } : void 0, body: { targetId } }, successMessage: "cookies cleared" }); }); const storage = browser.command("storage").description("Read/write localStorage/sessionStorage"); function registerStorageKind(kind) { const cmd = storage.command(kind).description(`${kind}Storage commands`); cmd.command("get").description(`Get ${kind}Storage (all keys or one key)`).argument("[key]", "Key (optional)").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (key, opts, cmd2) => { const parent = parentOpts(cmd2); const profile = parent?.browserProfile; const targetId = resolveTargetId(opts.targetId, cmd2); try { const result = await callBrowserRequest(parent, { method: "GET", path: `/storage/${kind}`, query: { key: normalizeOptionalString(key), targetId, profile } }, { timeoutMs: 2e4 }); if (parent?.json) { defaultRuntime.writeJson(result); return; } defaultRuntime.writeJson(result.values ?? {}); } catch (err) { defaultRuntime.error(danger(String(err))); defaultRuntime.exit(1); } }); cmd.command("set").description(`Set a ${kind}Storage key`).argument("<key>", "Key").argument("<value>", "Value").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (key, value, opts, cmd2) => { const parent = parentOpts(cmd2); const profile = parent?.browserProfile; const targetId = resolveTargetId(opts.targetId, cmd2); await runMutationRequest({ parent, request: { method: "POST", path: `/storage/${kind}/set`, query: profile ? { profile } : void 0, body: { key, value, targetId } }, successMessage: `${kind}Storage set: ${key}` }); }); cmd.command("clear").description(`Clear all ${kind}Storage keys`).option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (opts, cmd2) => { const parent = parentOpts(cmd2); const profile = parent?.browserProfile; const targetId = resolveTargetId(opts.targetId, cmd2); await runMutationRequest({ parent, request: { method: "POST", path: `/storage/${kind}/clear`, query: profile ? { profile } : void 0, body: { targetId } }, successMessage: `${kind}Storage cleared` }); }); } registerStorageKind("local"); registerStorageKind("session"); } //#endregion //#region extensions/browser/src/cli/browser-cli-state.ts function parseOnOff(raw) { const parsed = parseBooleanValue(raw); return parsed === void 0 ? null : parsed; } function parsePositiveInteger(value, label) { const parsed = parseBrowserPositiveIntegerValue(value); if (parsed === void 0) { defaultRuntime.error(danger(`Invalid ${label}: must be a positive integer`)); defaultRuntime.exit(1); return; } if (parsed > 8192) { defaultRuntime.error(danger(`Invalid ${label}: maximum is ${ACT_MAX_VIEWPORT_DIMENSION}`)); defaultRuntime.exit(1); return; } return parsed; } function parseFiniteNumberOption(value, label) { if (value === void 0) return; const raw = value.trim(); const parsed = /^[+-]?(?:(?:\d+\.?\d*)|(?:\.\d+))(?:e[+-]?\d+)?$/i.test(raw) ? Number(raw) : NaN; if (!Number.isFinite(parsed)) { defaultRuntime.error(danger(`Invalid ${label}: must be a finite number`)); defaultRuntime.exit(1); return; } return parsed; } function runBrowserCommand(action) { return runCommandWithRuntime(defaultRuntime, action, (err) => { defaultRuntime.error(danger(String(err))); defaultRuntime.exit(1); }); } async function runBrowserSetRequest(params) { await runBrowserCommand(async () => { const profile = params.parent?.browserProfile; const result = await callBrowserRequest(params.parent, { method: "POST", path: params.path, query: profile ? { profile } : void 0, body: params.body }, { timeoutMs: 2e4 }); if (params.parent?.json) { defaultRuntime.writeJson(result); return; } defaultRuntime.log(params.successMessage); }); } /** Registers Browser state/configuration commands. */ function registerBrowserStateCommands(browser, parentOpts) { registerBrowserCookiesAndStorageCommands(browser, parentOpts); const set = browser.command("set").description("Browser environment settings"); set.command("viewport").description("Set viewport size (alias for resize)").argument("<width>", "Viewport width").argument("<height>", "Viewport height").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (widthRaw, heightRaw, opts, cmd) => { const width = parsePositiveInteger(widthRaw, "width"); const height = parsePositiveInteger(heightRaw, "height"); if (width === void 0 || height === void 0) return; const parent = parentOpts(cmd); const profile = parent?.browserProfile; await runBrowserCommand(async () => { await runBrowserResizeWithOutput({ parent, profile, width, height, targetId: opts.targetId, timeoutMs: 2e4, successMessage: `viewport set: ${width}x${height}` }); }); }); set.command("offline").description("Toggle offline mode").argument("<on|off>", "on/off").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (value, opts, cmd) => { const parent = parentOpts(cmd); const offline = parseOnOff(value); if (offline === null) { defaultRuntime.error(danger("Expected on|off")); defaultRuntime.exit(1); return; } await runBrowserSetRequest({ parent, path: "/set/offline", body: { offline, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `offline: ${offline}` }); }); set.command("headers").description("Set extra HTTP headers (JSON object)").argument("[headersJson]", "JSON object of headers (alternative to --headers-json)").option("--headers-json <json>", "JSON object of headers").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (headersJson, opts, cmd) => { const parent = parentOpts(cmd); await runBrowserCommand(async () => { const headersJsonValue = normalizeOptionalString(opts.headersJson) ?? normalizeOptionalString(headersJson); if (!headersJsonValue) throw new Error("Missing headers JSON (pass --headers-json or positional JSON argument)"); const parsed = JSON.parse(headersJsonValue); if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("Headers JSON must be a JSON object"); const headers = {}; for (const [k, v] of Object.entries(parsed)) if (typeof v === "string") headers[k] = v; const profile = parent?.browserProfile; const result = await callBrowserRequest(parent, { method: "POST", path: "/set/headers", query: profile ? { profile } : void 0, body: { headers, targetId: normalizeOptionalString(opts.targetId) } }, { timeoutMs: 2e4 }); if (parent?.json) { defaultRuntime.writeJson(result); return; } defaultRuntime.log("headers set"); }); }); set.command("credentials").description("Set HTTP basic auth credentials").option("--clear", "Clear credentials", false).argument("[username]", "Username").argument("[password]", "Password").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (username, password, opts, cmd) => { await runBrowserSetRequest({ parent: parentOpts(cmd), path: "/set/credentials", body: { username: normalizeOptionalString(username), password, clear: Boolean(opts.clear), targetId: normalizeOptionalString(opts.targetId) }, successMessage: opts.clear ? "credentials cleared" : "credentials set" }); }); set.command("geo").description("Set geolocation (and grant permission)").option("--clear", "Clear geolocation + permissions", false).argument("[latitude]", "Latitude").argument("[longitude]", "Longitude").option("--accuracy <m>", "Accuracy in meters").option("--origin <origin>", "Origin to grant permissions for").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (latitudeRaw, longitudeRaw, opts, cmd) => { const parent = parentOpts(cmd); const latitude = parseFiniteNumberOption(latitudeRaw, "latitude"); const longitude = parseFiniteNumberOption(longitudeRaw, "longitude"); const accuracy = parseFiniteNumberOption(opts.accuracy, "--accuracy"); if (latitudeRaw !== void 0 && latitude === void 0 || longitudeRaw !== void 0 && longitude === void 0 || opts.accuracy !== void 0 && accuracy === void 0) return; await runBrowserSetRequest({ parent, path: "/set/geolocation", body: { latitude, longitude, accuracy, origin: normalizeOptionalString(opts.origin), clear: Boolean(opts.clear), targetId: normalizeOptionalString(opts.targetId) }, successMessage: opts.clear ? "geolocation cleared" : "geolocation set" }); }); set.command("media").description("Emulate prefers-color-scheme").argument("<dark|light|none>", "dark/light/none").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (value, opts, cmd) => { const parent = parentOpts(cmd); const v = normalizeOptionalLowercaseString(value); const colorScheme = v === "dark" ? "dark" : v === "light" ? "light" : v === "none" ? "none" : null; if (!colorScheme) { defaultRuntime.error(danger("Expected dark|light|none")); defaultRuntime.exit(1); return; } await runBrowserSetRequest({ parent, path: "/set/media", body: { colorScheme, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `media colorScheme: ${colorScheme}` }); }); set.command("timezone").description("Override timezone (CDP)").argument("<timezoneId>", "Timezone ID (e.g. America/New_York)").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (timezoneId, opts, cmd) => { await runBrowserSetRequest({ parent: parentOpts(cmd), path: "/set/timezone", body: { timezoneId, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `timezone: ${timezoneId}` }); }); set.command("locale").description("Override locale (CDP)").argument("<locale>", "Locale (e.g. en-US)").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (locale, opts, cmd) => { await runBrowserSetRequest({ parent: parentOpts(cmd), path: "/set/locale", body: { locale, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `locale: ${locale}` }); }); set.command("device").description("Apply a Playwright device descriptor (e.g. \"iPhone 14\")").argument("<name>", "Device name (Playwright devices)").option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (name, opts, cmd) => { await runBrowserSetRequest({ parent: parentOpts(cmd), path: "/set/device", body: { name, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `device: ${name}` }); }); } //#endregion export { registerBrowserStateCommands };