UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

266 lines (265 loc) • 11.3 kB
import { c as normalizeOptionalLowercaseString, l as normalizeOptionalString, m as readNonBlankString } from "./string-coerce-6kR-86XC.mjs"; import { x as parseStrictFiniteNumber } from "./number-coercion-Dq1l5muL.mjs"; import { r as defaultRuntime } from "./runtime-BC29JSZp.mjs"; import { n as parseBooleanValue } from "./boolean-cOv0ta_w.mjs"; import { n as inheritOptionFromParent } from "./command-options-BDuSHeWG.mjs"; import { t as danger } from "./globals-D2Pr1KIl.mjs"; import "./string-coerce-runtime-B1b8UNzb.mjs"; import "./runtime-env-DMdB1vhM.mjs"; import "./number-runtime-DyNDaYIV.mjs"; import "./cli-runtime-D_E6OBH2.mjs"; import { a as printBrowserJsonResult, c as runBrowserCliRequest, n as callBrowserRequest, s as runBrowserCliCommand, t as BROWSER_TAB_REFERENCE_HELP } from "./browser-cli-shared-B1t7Tybm.mjs"; import { n as runBrowserResizeWithOutput, t as parseBrowserViewportDimension } from "./browser-cli-resize-CbUi9n0M.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"); cookies.option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP).action(async (opts, cmd) => { const parent = parentOpts(cmd); const targetId = resolveTargetId(opts.targetId, cmd); await runBrowserCliRequest({ parent, method: "GET", path: "/cookies", query: { targetId }, errorPolicy: "inline", print: (result) => defaultRuntime.writeJson(result.cookies ?? []) }); }); 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 targetId = resolveTargetId(opts.targetId, cmd); const url = normalizeOptionalString(opts.url); if (!url) { defaultRuntime.error(danger("Missing required --url option for cookies set")); defaultRuntime.exit(1); return; } await runBrowserCliRequest({ parent, path: "/cookies/set", body: { targetId, cookie: { name, value, url } }, errorPolicy: "inline", 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 targetId = resolveTargetId(opts.targetId, cmd); await runBrowserCliRequest({ parent, path: "/cookies/clear", body: { targetId }, errorPolicy: "inline", successMessage: "cookies cleared" }); }); const storage = browser.command("storage").description("Read/write localStorage/sessionStorage"); for (const kind of ["local", "session"]) { 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 targetId = resolveTargetId(opts.targetId, cmd2); await runBrowserCliRequest({ parent, method: "GET", path: `/storage/${kind}`, query: { key: readNonBlankString(key), targetId }, errorPolicy: "inline", print: (result) => defaultRuntime.writeJson(result.values ?? {}) }); }); 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 targetId = resolveTargetId(opts.targetId, cmd2); await runBrowserCliRequest({ parent, path: `/storage/${kind}/set`, body: { key, value, targetId }, errorPolicy: "inline", 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 targetId = resolveTargetId(opts.targetId, cmd2); await runBrowserCliRequest({ parent, path: `/storage/${kind}/clear`, body: { targetId }, errorPolicy: "inline", successMessage: `${kind}Storage 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"); 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 = parseBrowserViewportDimension(widthRaw, "width"); const height = parseBrowserViewportDimension(heightRaw, "height"); if (width === void 0 || height === void 0) return; await runBrowserResizeWithOutput({ parent: parentOpts(cmd), width, height, targetId: opts.targetId, 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 = parseBooleanValue(value); if (offline === void 0) { defaultRuntime.error(danger("Expected on|off")); defaultRuntime.exit(1); return; } await runBrowserCliRequest({ 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 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" }); }); set.command("media").description("Emulate prefers-color-scheme").argument("<dark|light|no-preference|none>", "dark/light/no-preference/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" || v === "light" || v === "no-preference" || v === "none" ? v : null; if (!colorScheme) { defaultRuntime.error(danger("Expected dark|light|no-preference|none")); defaultRuntime.exit(1); return; } await runBrowserCliRequest({ parent, path: "/set/media", body: { colorScheme, targetId: normalizeOptionalString(opts.targetId) }, successMessage: `media colorScheme: ${colorScheme}` }); }); 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 };