UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

219 lines (218 loc) • 9.89 kB
import { c as normalizeOptionalLowercaseString, l as normalizeOptionalString, m as readNonBlankString } from "./string-coerce-1VuiLaaR.mjs"; import { x as parseStrictFiniteNumber } from "./number-coercion-CkhMiRw8.mjs"; import { n as parseBooleanValue } from "./boolean-CFfzB3ix.mjs"; import { r as defaultRuntime } from "./runtime-BRg2NubB.mjs"; import { n as inheritOptionFromParent } from "./command-options-BDuSHeWG.mjs"; import { t as danger } from "./globals-yEiTitH8.mjs"; import "./string-coerce-runtime-BbIJhy7G.mjs"; import "./runtime-env-CySdLHPX.mjs"; import "./number-runtime-D3v2w3D4.mjs"; import "./cli-runtime-CphihcPm.mjs"; import { a as printBrowserJsonResult, c as runBrowserCliCommand, l as runBrowserCliRequest, n as callBrowserRequest, t as BROWSER_TAB_REFERENCE_HELP } from "./browser-cli-shared-Un7moqdm.mjs"; import { t as registerBrowserResizeCommand } from "./browser-cli-resize-DY3bxGie.mjs"; //#region extensions/browser/src/cli/browser-cli-state.cookies-storage.ts function resolveTargetId(rawTargetId, command) { return normalizeOptionalString(rawTargetId) ?? normalizeOptionalString(inheritOptionFromParent(command, "targetId")); } function registerBrowserCookiesAndStorageCommands(browser, parentOpts) { const cookies = browser.command("cookies").description("Read/write cookies"); const storage = browser.command("storage").description("Read/write localStorage/sessionStorage"); for (const kind of [ "cookies", "local", "session" ]) { const isCookies = kind === "cookies"; const cmd = isCookies ? cookies : storage.command(kind).description(`${kind}Storage commands`); const route = isCookies ? "/cookies" : `/storage/${kind}`; const label = isCookies ? "cookie" : `${kind}Storage`; const read = async (key, opts, command) => { const parent = parentOpts(command); const targetId = resolveTargetId(opts.targetId, command); await runBrowserCliRequest({ parent, method: "GET", path: route, query: isCookies ? { targetId } : { key: readNonBlankString(key), targetId }, errorPolicy: "inline", print: (result) => defaultRuntime.writeJson(isCookies ? result.cookies ?? [] : result.values ?? {}) }); }; if (isCookies) cmd.option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action((opts, command) => read(void 0, opts, command)); else 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(read); const set = cmd.command("set").description(isCookies ? "Set a cookie (requires --url or domain+path)" : `Set a ${kind}Storage key`).argument(isCookies ? "<name>" : "<key>", isCookies ? "Cookie name" : "Key").argument("<value>", isCookies ? "Cookie value" : "Value"); if (isCookies) set.option("--url <url>", "Cookie URL scope (recommended)"); set.option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (key, value, opts, command) => { const parent = parentOpts(command); const targetId = resolveTargetId(opts.targetId, command); const url = isCookies ? normalizeOptionalString(opts.url) : void 0; if (isCookies && !url) { defaultRuntime.error(danger("Missing required --url option for cookies set")); defaultRuntime.exit(1); return; } await runBrowserCliRequest({ parent, path: `${route}/set`, body: isCookies ? { targetId, cookie: { name: key, value, url } } : { key, value, targetId }, errorPolicy: "inline", successMessage: `${label} set: ${key}` }); }); cmd.command("clear").description(isCookies ? "Clear all cookies" : `Clear all ${kind}Storage keys`).option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (opts, command) => { const parent = parentOpts(command); const targetId = resolveTargetId(opts.targetId, command); await runBrowserCliRequest({ parent, path: `${route}/clear`, body: { targetId }, errorPolicy: "inline", successMessage: `${isCookies ? "cookies" : label} cleared` }); }); } } //#endregion //#region extensions/browser/src/cli/browser-cli-state.ts function parseFiniteNumberOption(value, label) { if (value === void 0) return; const parsed = parseStrictFiniteNumber(value); if (parsed === void 0) { defaultRuntime.error(danger(`Invalid ${label}: must be a finite number`)); defaultRuntime.exit(1); return; } return parsed; } function registerBrowserStateCommands(browser, parentOpts) { registerBrowserCookiesAndStorageCommands(browser, parentOpts); const set = browser.command("set").description("Browser environment settings"); registerBrowserResizeCommand(set.command("viewport").description("Set viewport size (alias for resize)"), parentOpts, true); const registerParsedSetting = (kind) => { const offline = kind === "offline"; const choices = offline ? "on|off" : "dark|light|no-preference|none"; set.command(kind).description(offline ? "Toggle offline mode" : "Emulate prefers-color-scheme").argument(`<${choices}>`, choices.replaceAll("|", "/")).option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (value, opts, cmd) => { const parent = parentOpts(cmd); const parsed = offline ? parseBooleanValue(value) : normalizeOptionalLowercaseString(value); if (parsed === void 0 || typeof parsed === "string" && !choices.split("|").includes(parsed)) { defaultRuntime.error(danger(`Expected ${choices}`)); defaultRuntime.exit(1); return; } await runBrowserCliRequest({ parent, path: `/set/${kind}`, body: { [offline ? "offline" : "colorScheme"]: parsed, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `${offline ? "offline" : "media colorScheme"}: ${parsed}` }); }); }; registerParsedSetting("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 runBrowserCliCommand(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) } }); if (printBrowserJsonResult(parent, 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) => { const parent = parentOpts(cmd); await runBrowserCliRequest({ parent, 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 runBrowserCliRequest({ 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" }); }); registerParsedSetting("media"); for (const [command, description, parameter, argumentHelp] of [ [ "timezone", "Override timezone (CDP)", "timezoneId", "Timezone ID (e.g. America/New_York)" ], [ "locale", "Override locale (CDP)", "locale", "Locale (e.g. en-US)" ], [ "device", "Apply a Playwright device descriptor (e.g. \"iPhone 14\")", "name", "Device name (Playwright devices)" ] ]) set.command(command).description(description).argument(`<${parameter}>`, argumentHelp).option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (value, opts, cmd) => { await runBrowserCliRequest({ parent: parentOpts(cmd), path: `/set/${command}`, body: { [parameter]: value, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `${command}: ${value}` }); }); } //#endregion export { registerBrowserStateCommands };