@workglow/browser-control 0.2.31 → 0.2.33

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.
@@ -1,42 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/task/register.server.ts", "../src/task/PlaywrightBackend.ts", "../src/task/BrowserTaskDeps.ts", "../src/task/BrowserSessionRegistry.ts", "../src/task/BunWebViewBackend.ts", "../src/task/CDPBrowserBackend.ts", "../src/task/tasks/BrowserSessionTask.ts", "../src/task/tasks/BrowserCloseTask.ts", "../src/task/tasks/BrowserNavigateTask.ts", "../src/task/tasks/BrowserBackTask.ts", "../src/task/tasks/BrowserForwardTask.ts", "../src/task/tasks/BrowserReloadTask.ts", "../src/task/tasks/BrowserSnapshotTask.ts", "../src/task/tasks/BrowserScreenshotTask.ts", "../src/task/tasks/BrowserClickTask.ts", "../src/task/tasks/BrowserFillTask.ts", "../src/task/tasks/BrowserSelectTask.ts", "../src/task/tasks/BrowserHoverTask.ts", "../src/task/tasks/BrowserExtractTextTask.ts", "../src/task/tasks/BrowserExtractHtmlTask.ts", "../src/task/tasks/BrowserAttributeTask.ts", "../src/task/tasks/BrowserQuerySelectorTask.ts", "../src/task/tasks/BrowserEvaluateTask.ts", "../src/task/tasks/BrowserPressKeyTask.ts", "../src/task/tasks/BrowserTypeTask.ts", "../src/task/tasks/BrowserScrollTask.ts", "../src/task/tasks/BrowserUploadTask.ts", "../src/task/tasks/BrowserWaitTask.ts", "../src/task/tasks/BrowserNewTabTask.ts", "../src/task/tasks/BrowserSwitchTabTask.ts", "../src/task/tasks/BrowserCloseTabTask.ts", "../src/task/tasks/BrowserLoginTask.ts", "../src/task/ElectronBackend.ts"],
4
- "sourcesContent": [
5
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n *\n * Side-effect import: registers browser-control task dependencies for Node/Bun server runtimes.\n * Uses Playwright as the backend with filesystem-based profile storage.\n * Import @workglow/browser-control/task-server to auto-wire this registration.\n */\n\nimport path from \"node:path\";\nimport { PlaywrightBackend } from \"./PlaywrightBackend\";\nimport { registerBrowserDeps } from \"./BrowserTaskDeps\";\n\nconst SAFE_NAME_RE = /^[a-zA-Z0-9_-]+$/;\n\nfunction safeName(value: string, label: string): string {\n if (!SAFE_NAME_RE.test(value)) {\n throw new Error(\n `Invalid ${label}: must contain only alphanumeric characters, hyphens, and underscores`\n );\n }\n return value;\n}\n\nregisterBrowserDeps({\n createContext: (_options) => new PlaywrightBackend(),\n availableBackends: [\"local\", \"cloud\"],\n defaultBackend: \"local\",\n profileStorage: {\n async save(projectId, profileName, state) {\n const fs = await import(\"node:fs/promises\");\n const dir = path.join(\n process.cwd(),\n \".workglow\",\n \"browser-profiles\",\n safeName(projectId, \"projectId\")\n );\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(\n path.join(dir, `${safeName(profileName, \"profileName\")}.json`),\n state,\n \"utf-8\"\n );\n },\n async load(projectId, profileName) {\n const fs = await import(\"node:fs/promises\");\n try {\n return await fs.readFile(\n path.join(\n process.cwd(),\n \".workglow\",\n \"browser-profiles\",\n safeName(projectId, \"projectId\"),\n `${safeName(profileName, \"profileName\")}.json`\n ),\n \"utf-8\"\n );\n } catch {\n return null;\n }\n },\n async delete(projectId, profileName) {\n const fs = await import(\"node:fs/promises\");\n try {\n await fs.unlink(\n path.join(\n process.cwd(),\n \".workglow\",\n \"browser-profiles\",\n safeName(projectId, \"projectId\"),\n `${safeName(profileName, \"profileName\")}.json`\n )\n );\n } catch {\n /* ignore */\n }\n },\n },\n});\n",
6
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AccessibilityNode,\n AccessibilityTree,\n AriaRole,\n BrowserConnectOptions,\n ClickOptions,\n ConsoleMessage,\n DialogAction,\n DialogInfo,\n DownloadOptions,\n DownloadResult,\n ElementRef,\n IBrowserContext,\n NavigateOptions,\n NetworkFilter,\n NetworkRequest,\n ScreenshotOptions,\n SnapshotOptions,\n TabInfo,\n WaitOptions,\n} from \"./IBrowserContext\";\n\n// ---------------------------------------------------------------------------\n// Playwright types (not imported at module level — lazy optional dependency)\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyLocator = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyPage = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyBrowserContext = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyBrowser = any;\n\n// ---------------------------------------------------------------------------\n// Lazy Playwright loader\n// ---------------------------------------------------------------------------\n\nlet playwrightModule: typeof import(\"playwright\");\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function getPlaywright(): Promise<Record<string, any>> {\n if (!playwrightModule) {\n playwrightModule = await import(\"playwright\");\n }\n return playwrightModule;\n}\n\n// ---------------------------------------------------------------------------\n// ARIA snapshot parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a single ARIA snapshot line.\n * Format examples:\n * - button \"Sign In\"\n * - heading \"Welcome\" [level=1]\n * - textbox \"Email\"\n * - navigation \"Main\":\n * - list:\n */\ninterface ParsedAriaLine {\n indent: number;\n role: string;\n name: string;\n attrs: Record<string, string>;\n hasChildren: boolean;\n}\n\nfunction parseAriaLine(line: string): ParsedAriaLine | null {\n // Count leading spaces for indentation (2 spaces per level after the \"- \")\n const match = line.match(/^(\\s*)-\\s+(.*)$/);\n if (!match) return null;\n\n const indent = match[1].length;\n let rest = match[2].trim();\n\n // Check if this node has children (trailing colon)\n const hasChildren = rest.endsWith(\":\");\n if (hasChildren) rest = rest.slice(0, -1).trim();\n\n // Extract attributes like [level=1] [checked=true]\n const attrs: Record<string, string> = {};\n rest = rest\n .replace(/\\[([^\\]]+)\\]/g, (_m, attr: string) => {\n const eqIdx = attr.indexOf(\"=\");\n if (eqIdx !== -1) {\n attrs[attr.slice(0, eqIdx).trim()] = attr.slice(eqIdx + 1).trim();\n } else {\n attrs[attr.trim()] = \"true\";\n }\n return \"\";\n })\n .trim();\n\n // Extract role and optional quoted name\n // e.g. `button \"Sign In\"` or `list` or `heading \"Welcome\"`\n const roleNameMatch = rest.match(/^(\\S+)(?:\\s+\"((?:[^\"\\\\]|\\\\.)*)\")?/);\n if (!roleNameMatch) return null;\n\n const role = roleNameMatch[1];\n const name = roleNameMatch[2] !== undefined ? roleNameMatch[2].replace(/\\\\\"/g, '\"') : \"\";\n\n return { indent, role, name, attrs, hasChildren };\n}\n\ninterface MutableAccessibilityNode {\n ref: ElementRef;\n role: AriaRole;\n name: string;\n level?: number;\n checked?: boolean | \"mixed\";\n disabled?: boolean;\n expanded?: boolean;\n pressed?: boolean | \"mixed\";\n selected?: boolean;\n value?: string | number;\n children?: MutableAccessibilityNode[];\n}\n\nfunction parseAriaYaml(\n yaml: string,\n refCounter: { count: number },\n refMap: Map<string, string>\n): AccessibilityNode {\n const lines = yaml.split(\"\\n\");\n\n // Stack of {node, indent} for building the tree\n const stack: Array<{ node: MutableAccessibilityNode; indent: number }> = [];\n let root: MutableAccessibilityNode | null = null;\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n const parsed = parseAriaLine(line);\n if (!parsed) continue;\n\n const ref = `e${++refCounter.count}`;\n\n // Build locator string for this node\n const locatorStr = buildLocatorString(parsed.role, parsed.name);\n refMap.set(ref, locatorStr);\n\n const node: MutableAccessibilityNode = {\n ref,\n role: parsed.role as AriaRole,\n name: parsed.name,\n };\n\n // Apply attributes\n if (parsed.attrs.level !== undefined) {\n node.level = parseInt(parsed.attrs.level, 10);\n }\n if (parsed.attrs.checked !== undefined) {\n node.checked = parsed.attrs.checked === \"mixed\" ? \"mixed\" : parsed.attrs.checked === \"true\";\n }\n if (parsed.attrs.disabled !== undefined) {\n node.disabled = parsed.attrs.disabled === \"true\";\n }\n if (parsed.attrs.expanded !== undefined) {\n node.expanded = parsed.attrs.expanded === \"true\";\n }\n if (parsed.attrs.pressed !== undefined) {\n node.pressed = parsed.attrs.pressed === \"mixed\" ? \"mixed\" : parsed.attrs.pressed === \"true\";\n }\n if (parsed.attrs.selected !== undefined) {\n node.selected = parsed.attrs.selected === \"true\";\n }\n if (parsed.attrs.value !== undefined) {\n const numVal = Number(parsed.attrs.value);\n node.value = isNaN(numVal) ? parsed.attrs.value : numVal;\n }\n\n if (parsed.hasChildren) {\n node.children = [];\n }\n\n // Pop stack elements that are at the same or deeper indentation\n while (stack.length > 0 && stack[stack.length - 1].indent >= parsed.indent) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root = node;\n } else {\n const parent = stack[stack.length - 1].node;\n if (!parent.children) parent.children = [];\n parent.children.push(node);\n }\n\n stack.push({ node, indent: parsed.indent });\n }\n\n if (!root) {\n // Return a synthetic root if parsing fails\n const ref = `e${++refCounter.count}`;\n refMap.set(ref, 'locator(\"body\")');\n return { ref, role: \"document\", name: \"\" };\n }\n\n return root as AccessibilityNode;\n}\n\n/**\n * Build a Playwright locator descriptor string from ARIA role/name.\n * These strings are stored in the refMap and interpreted by resolveRef().\n */\nfunction buildLocatorString(role: string, name: string): string {\n // Roles that are typically text nodes — check before the generic name check\n if (role === \"text\" || role === \"StaticText\") {\n return `getByText:${name}`;\n }\n if (name) {\n return `getByRole:${role}:${name}`;\n }\n return `getByRole:${role}:`;\n}\n\n// ---------------------------------------------------------------------------\n// PlaywrightBackend\n// ---------------------------------------------------------------------------\n\nexport class PlaywrightBackend implements IBrowserContext {\n /**\n * When set, `connect()` reuses this browser for local mode instead of launching a new process.\n * Used by integration tests to avoid per-test launch/teardown flakiness. The caller must not\n * close the browser until all backends that reference it have disconnected.\n */\n constructor(private readonly sharedLocalBrowser?: AnyBrowser) {}\n\n // Internal Playwright state\n private _browser: AnyBrowser | null = null;\n private _context: AnyBrowserContext | null = null;\n private _page: AnyPage | null = null;\n private _connected = false;\n /** True when this backend launched Chromium locally (owns full process tree). */\n private _launchedLocalChromium = false;\n\n // Ref management\n private _refMap = new Map<string, string>();\n private _refCounter = { count: 0 };\n\n // Dialog handler\n private _dialogHandler: ((info: DialogInfo) => DialogAction | Promise<DialogAction>) | null =\n null;\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async connect(options: BrowserConnectOptions = {}): Promise<void> {\n const pw = await getPlaywright();\n const { headless = true, cdpUrl, backend = \"local\" } = options;\n\n if (backend === \"cloud\" || cdpUrl) {\n // Cloud / CDP mode\n if (this.sharedLocalBrowser) {\n throw new Error(\n \"PlaywrightBackend: sharedLocalBrowser is only supported for local backend\"\n );\n }\n this._launchedLocalChromium = false;\n if (!cdpUrl) {\n throw new Error(\"PlaywrightBackend: cdpUrl is required for cloud backend\");\n }\n this._browser = await pw.chromium.connectOverCDP(cdpUrl);\n const contexts: AnyBrowserContext[] = this._browser.contexts();\n this._context = contexts.length > 0 ? contexts[0] : await this._browser.newContext();\n const pages: AnyPage[] = this._context.pages();\n this._page = pages.length > 0 ? pages[0] : await this._context.newPage();\n } else {\n // Local mode\n if (this.sharedLocalBrowser) {\n this._browser = this.sharedLocalBrowser;\n this._launchedLocalChromium = false;\n } else {\n this._launchedLocalChromium = true;\n this._browser = await pw.chromium.launch({\n headless,\n // Reduces hangs / crashes when /dev/shm is small (common in containers).\n args: [\"--disable-dev-shm-usage\"],\n });\n }\n this._context = await this._browser.newContext();\n this._page = await this._context.newPage();\n }\n\n // Wire dialog handler\n this._page.on(\"dialog\", async (dialog: AnyPage) => {\n const info: DialogInfo = {\n type: dialog.type() as DialogInfo[\"type\"],\n message: dialog.message(),\n defaultValue: dialog.defaultValue() ?? undefined,\n };\n if (this._dialogHandler) {\n const action = await this._dialogHandler(info);\n if (action.accept) {\n await dialog.accept(\n \"promptText\" in action\n ? (action as { accept: true; promptText?: string }).promptText\n : undefined\n );\n } else {\n await dialog.dismiss();\n }\n } else {\n // Default: auto-dismiss\n await dialog.dismiss();\n }\n });\n\n this._connected = true;\n }\n\n async disconnect(): Promise<void> {\n this._connected = false;\n const page = this._page;\n const context = this._context;\n const browser = this._browser;\n const launchedLocal = this._launchedLocalChromium;\n const sharedLocal = this.sharedLocalBrowser !== undefined;\n this._page = null;\n this._context = null;\n this._browser = null;\n this._launchedLocalChromium = false;\n\n try {\n if (launchedLocal || sharedLocal) {\n // Tear down in reverse order so the browser process does not stall waiting on pages.\n if (page) {\n try {\n await page.close({ runBeforeUnload: false });\n } catch {\n // ignore\n }\n }\n if (context) {\n try {\n await context.close();\n } catch {\n // ignore\n }\n }\n }\n if (browser && !sharedLocal) {\n await browser.close();\n }\n } finally {\n this._refMap.clear();\n this._refCounter.count = 0;\n }\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private get page(): AnyPage {\n if (!this._page) throw new Error(\"PlaywrightBackend: not connected — call connect() first\");\n return this._page;\n }\n\n private get context(): AnyBrowserContext {\n if (!this._context) throw new Error(\"PlaywrightBackend: not connected — call connect() first\");\n return this._context;\n }\n\n /**\n * Resolve an ElementRef to a Playwright Locator.\n * The refMap stores descriptor strings like:\n * \"getByRole:button:Sign In\"\n * \"getByText:some text\"\n * \"css:.my-class\"\n * \"nth:getByRole:listitem::2\"\n */\n private resolveRef(ref: ElementRef): AnyLocator {\n const descriptor = this._refMap.get(ref);\n if (!descriptor) {\n throw new Error(`PlaywrightBackend: unknown ref \"${ref}\"`);\n }\n return this.descriptorToLocator(descriptor);\n }\n\n private descriptorToLocator(descriptor: string): AnyLocator {\n const page = this.page;\n\n if (descriptor.startsWith(\"getByRole:\")) {\n const rest = descriptor.slice(\"getByRole:\".length);\n const colonIdx = rest.indexOf(\":\");\n const role = rest.slice(0, colonIdx);\n const name = rest.slice(colonIdx + 1);\n if (name) {\n return page.getByRole(role, { name });\n }\n return page.getByRole(role);\n }\n\n if (descriptor.startsWith(\"getByText:\")) {\n const text = descriptor.slice(\"getByText:\".length);\n return page.getByText(text);\n }\n\n if (descriptor.startsWith(\"css:\")) {\n const selector = descriptor.slice(\"css:\".length);\n return page.locator(selector);\n }\n\n if (descriptor.startsWith(\"nth:\")) {\n // Format: \"nth:<inner-descriptor>:<index>\"\n // We need to split off the trailing \":<number>\"\n const withoutPrefix = descriptor.slice(\"nth:\".length);\n const lastColon = withoutPrefix.lastIndexOf(\":\");\n const inner = withoutPrefix.slice(0, lastColon);\n const idx = parseInt(withoutPrefix.slice(lastColon + 1), 10);\n return this.descriptorToLocator(inner).nth(idx);\n }\n\n // Fallback: treat as CSS selector\n return page.locator(descriptor);\n }\n\n // ---------------------------------------------------------------------------\n // Navigation\n // ---------------------------------------------------------------------------\n\n async navigate(url: string, options: NavigateOptions = {}): Promise<void> {\n const { waitUntil = \"load\", timeout = 30_000 } = options;\n await this.page.goto(url, { waitUntil, timeout });\n }\n\n async goBack(options: NavigateOptions = {}): Promise<void> {\n const { waitUntil = \"load\", timeout = 30_000 } = options;\n await this.page.goBack({ waitUntil, timeout });\n }\n\n async goForward(options: NavigateOptions = {}): Promise<void> {\n const { waitUntil = \"load\", timeout = 30_000 } = options;\n await this.page.goForward({ waitUntil, timeout });\n }\n\n async reload(options: NavigateOptions = {}): Promise<void> {\n const { waitUntil = \"load\", timeout = 30_000 } = options;\n await this.page.reload({ waitUntil, timeout });\n }\n\n async currentUrl(): Promise<string> {\n return this.page.url();\n }\n\n async title(): Promise<string> {\n return this.page.title();\n }\n\n // ---------------------------------------------------------------------------\n // Accessibility\n // ---------------------------------------------------------------------------\n\n async snapshot(options: SnapshotOptions = {}): Promise<AccessibilityTree> {\n let locator: AnyLocator;\n\n if (options.ref) {\n locator = this.resolveRef(options.ref);\n } else {\n locator = this.page.locator(\"body\");\n }\n\n const yaml: string = await locator.ariaSnapshot();\n\n // Reset refs so snapshot refs are stable within a session\n // (we keep the monotonic counter to avoid collisions with querySelector refs)\n const root = parseAriaYaml(yaml, this._refCounter, this._refMap);\n\n return { root, yaml };\n }\n\n // ---------------------------------------------------------------------------\n // Element interaction (by ref)\n // ---------------------------------------------------------------------------\n\n async click(ref: ElementRef, options: ClickOptions = {}): Promise<void> {\n const locator = this.resolveRef(ref);\n const { modifiers, button, clickCount, timeout } = options;\n await locator.click({\n ...(modifiers !== undefined ? { modifiers } : {}),\n ...(button !== undefined ? { button } : {}),\n ...(clickCount !== undefined ? { clickCount } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n });\n }\n\n async fill(ref: ElementRef, value: string, options: WaitOptions = {}): Promise<void> {\n const locator = this.resolveRef(ref);\n const { timeout } = options;\n await locator.fill(value, ...(timeout !== undefined ? [{ timeout }] : []));\n }\n\n async selectOption(\n ref: ElementRef,\n values: string | readonly string[],\n options: WaitOptions = {}\n ): Promise<void> {\n const locator = this.resolveRef(ref);\n const { timeout } = options;\n await locator.selectOption(values, ...(timeout !== undefined ? [{ timeout }] : []));\n }\n\n async hover(ref: ElementRef, options: WaitOptions = {}): Promise<void> {\n const locator = this.resolveRef(ref);\n const { timeout } = options;\n await locator.hover(...(timeout !== undefined ? [{ timeout }] : []));\n }\n\n // ---------------------------------------------------------------------------\n // Semantic interaction\n // ---------------------------------------------------------------------------\n\n async clickByRole(role: AriaRole, name: string, options: ClickOptions = {}): Promise<void> {\n const { modifiers, button, clickCount, timeout } = options;\n await this.page.getByRole(role, { name }).click({\n ...(modifiers !== undefined ? { modifiers } : {}),\n ...(button !== undefined ? { button } : {}),\n ...(clickCount !== undefined ? { clickCount } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n });\n }\n\n async fillByLabel(label: string, value: string, options: WaitOptions = {}): Promise<void> {\n const { timeout } = options;\n await this.page.getByLabel(label).fill(value, ...(timeout !== undefined ? [{ timeout }] : []));\n }\n\n // ---------------------------------------------------------------------------\n // Content extraction\n // ---------------------------------------------------------------------------\n\n async content(): Promise<string> {\n return this.page.content();\n }\n\n async innerHTML(ref: ElementRef): Promise<string> {\n const locator = this.resolveRef(ref);\n return locator.innerHTML();\n }\n\n async textContent(ref: ElementRef): Promise<string | null> {\n const locator = this.resolveRef(ref);\n return locator.textContent();\n }\n\n async attribute(ref: ElementRef, name: string): Promise<string | null> {\n const locator = this.resolveRef(ref);\n return locator.getAttribute(name);\n }\n\n // ---------------------------------------------------------------------------\n // CSS selectors\n // ---------------------------------------------------------------------------\n\n async querySelector(selector: string): Promise<ElementRef | null> {\n const locator = this.page.locator(selector);\n const count: number = await locator.count();\n if (count === 0) return null;\n\n const ref = `e${++this._refCounter.count}`;\n this._refMap.set(ref, `css:${selector}`);\n return ref;\n }\n\n async querySelectorAll(selector: string): Promise<readonly ElementRef[]> {\n const locator = this.page.locator(selector);\n const count: number = await locator.count();\n const refs: ElementRef[] = [];\n\n for (let i = 0; i < count; i++) {\n const ref = `e${++this._refCounter.count}`;\n this._refMap.set(ref, `nth:css:${selector}:${i}`);\n refs.push(ref);\n }\n\n return refs;\n }\n\n // ---------------------------------------------------------------------------\n // JS evaluation\n // ---------------------------------------------------------------------------\n\n async evaluate<T>(expression: string): Promise<T> {\n return this.page.evaluate(expression) as Promise<T>;\n }\n\n // ---------------------------------------------------------------------------\n // Capture\n // ---------------------------------------------------------------------------\n\n async screenshot(options: ScreenshotOptions = {}): Promise<Buffer> {\n const { format = \"png\", quality, fullPage = false } = options;\n const screenshotOptions: Record<string, unknown> = {\n type: format,\n fullPage,\n };\n if (format === \"jpeg\" && quality !== undefined) {\n screenshotOptions.quality = quality;\n }\n return this.page.screenshot(screenshotOptions) as Promise<Buffer>;\n }\n\n // ---------------------------------------------------------------------------\n // Input\n // ---------------------------------------------------------------------------\n\n async pressKey(key: string, _options: WaitOptions = {}): Promise<void> {\n await this.page.keyboard.press(key);\n }\n\n async type(text: string, _options: WaitOptions = {}): Promise<void> {\n await this.page.keyboard.type(text);\n }\n\n async scroll(x: number, y: number, ref?: ElementRef): Promise<void> {\n if (ref) {\n // Scroll within element using JavaScript\n const locator = this.resolveRef(ref);\n await locator.evaluate(\n (el: Element, args: { x: number; y: number }) => {\n el.scrollBy(args.x, args.y);\n },\n { x, y }\n );\n } else {\n await this.page.mouse.wheel(x, y);\n }\n }\n\n // ---------------------------------------------------------------------------\n // File operations\n // ---------------------------------------------------------------------------\n\n async uploadFile(ref: ElementRef, paths: string | readonly string[]): Promise<void> {\n const locator = this.resolveRef(ref);\n await locator.setInputFiles(paths);\n }\n\n async download(\n trigger: () => Promise<void>,\n options: DownloadOptions = {}\n ): Promise<DownloadResult> {\n const { timeout } = options;\n const [download] = await Promise.all([\n this.page.waitForEvent(\"download\", ...(timeout !== undefined ? [{ timeout }] : [])),\n trigger(),\n ]);\n\n const path = await download.path();\n const suggestedFilename = download.suggestedFilename();\n\n if (!path) {\n throw new Error(\"PlaywrightBackend: download failed — path is null\");\n }\n\n return { path, suggestedFilename };\n }\n\n // ---------------------------------------------------------------------------\n // Dialogs\n // ---------------------------------------------------------------------------\n\n onDialog(handler: (info: DialogInfo) => DialogAction | Promise<DialogAction>): void {\n this._dialogHandler = handler;\n }\n\n // ---------------------------------------------------------------------------\n // Tabs\n // ---------------------------------------------------------------------------\n\n async tabs(): Promise<readonly TabInfo[]> {\n const pages: AnyPage[] = this.context.pages();\n return Promise.all(\n pages.map(async (p: AnyPage, idx: number) => ({\n tabId: String(idx),\n url: p.url(),\n title: await p.title(),\n }))\n );\n }\n\n async switchTab(tabId: string): Promise<void> {\n const pages: AnyPage[] = this.context.pages();\n const idx = parseInt(tabId, 10);\n if (isNaN(idx) || idx < 0 || idx >= pages.length) {\n throw new Error(`PlaywrightBackend: no tab with id \"${tabId}\"`);\n }\n this._page = pages[idx];\n await this._page.bringToFront();\n }\n\n async newTab(url?: string): Promise<TabInfo> {\n const newPage: AnyPage = await this.context.newPage();\n if (url) {\n await newPage.goto(url, { waitUntil: \"load\" });\n }\n const pages: AnyPage[] = this.context.pages();\n const idx = pages.indexOf(newPage);\n const tabId = String(idx >= 0 ? idx : pages.length - 1);\n return {\n tabId,\n url: newPage.url(),\n title: await newPage.title(),\n };\n }\n\n async closeTab(tabId: string): Promise<void> {\n const pages: AnyPage[] = this.context.pages();\n const idx = parseInt(tabId, 10);\n if (isNaN(idx) || idx < 0 || idx >= pages.length) {\n throw new Error(`PlaywrightBackend: no tab with id \"${tabId}\"`);\n }\n const target = pages[idx];\n await target.close();\n\n // If we closed the active page, switch to the last remaining page\n if (this._page === target) {\n const remaining: AnyPage[] = this.context.pages();\n this._page = remaining.length > 0 ? remaining[remaining.length - 1] : null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Wait\n // ---------------------------------------------------------------------------\n\n async waitForNavigation(options: NavigateOptions = {}): Promise<void> {\n const { timeout } = options;\n await this.page.waitForLoadState(\"load\", ...(timeout !== undefined ? [{ timeout }] : []));\n }\n\n async waitForSelector(selector: string, options: WaitOptions = {}): Promise<ElementRef> {\n const { timeout } = options;\n await this.page.waitForSelector(selector, ...(timeout !== undefined ? [{ timeout }] : []));\n\n const ref = `e${++this._refCounter.count}`;\n this._refMap.set(ref, `css:${selector}`);\n return ref;\n }\n\n async waitForIdle(options: WaitOptions = {}): Promise<void> {\n const { timeout } = options;\n await this.page.waitForLoadState(\n \"networkidle\",\n ...(timeout !== undefined ? [{ timeout }] : [])\n );\n }\n\n // ---------------------------------------------------------------------------\n // Optional capabilities (simplified)\n // ---------------------------------------------------------------------------\n\n readonly networkRequests = (_filter?: NetworkFilter): Promise<readonly NetworkRequest[]> => {\n return Promise.resolve([]);\n };\n\n readonly consoleMessages = (): Promise<readonly ConsoleMessage[]> => {\n return Promise.resolve([]);\n };\n}\n",
7
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createServiceToken, globalServiceRegistry } from \"@workglow/util\";\nimport type { BrowserBackendType, BrowserConnectOptions, IBrowserContext } from \"./IBrowserContext\";\n\nexport interface IBrowserProfileStorage {\n save(projectId: string, profileName: string, state: string): Promise<void>;\n load(projectId: string, profileName: string): Promise<string | null>;\n delete(projectId: string, profileName: string): Promise<void>;\n}\n\nexport interface BrowserTaskDeps {\n readonly createContext: (options: BrowserConnectOptions) => IBrowserContext;\n readonly availableBackends: readonly BrowserBackendType[];\n readonly defaultBackend: BrowserBackendType;\n readonly profileStorage: IBrowserProfileStorage;\n}\n\nexport const BROWSER_CONTROL_TASK_DEPS = createServiceToken<BrowserTaskDeps>(\n \"@workglow/browser-control\"\n);\n\nexport function registerBrowserDeps(deps: BrowserTaskDeps): void {\n globalServiceRegistry.registerInstance(BROWSER_CONTROL_TASK_DEPS, deps);\n}\n\nexport function getBrowserDeps(): BrowserTaskDeps {\n if (!globalServiceRegistry.has(BROWSER_CONTROL_TASK_DEPS)) {\n throw new Error(\n \"Browser task dependencies not registered. Import @workglow/browser-control/task-server (Node/Bun) or @workglow/browser-control/task-electron before using browser-control tasks.\"\n );\n }\n return globalServiceRegistry.get(BROWSER_CONTROL_TASK_DEPS);\n}\n",
8
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { uuid4 } from \"@workglow/util\";\nimport type { IBrowserContext } from \"./IBrowserContext\";\n\nconst sessions = new Map<string, IBrowserContext>();\n\nexport const BrowserSessionRegistry = {\n /**\n * Register a browser context and return a unique session ID.\n */\n register(context: IBrowserContext): string {\n const id = uuid4();\n sessions.set(id, context);\n return id;\n },\n\n /**\n * Retrieve a registered browser context by session ID.\n * Throws if the session does not exist or has been disconnected.\n */\n get(sessionId: string): IBrowserContext {\n const context = sessions.get(sessionId);\n if (!context) {\n throw new Error(`BrowserSessionRegistry: no session found for id \"${sessionId}\"`);\n }\n if (!context.isConnected()) {\n sessions.delete(sessionId);\n throw new Error(`BrowserSessionRegistry: session \"${sessionId}\" is no longer connected`);\n }\n return context;\n },\n\n /**\n * Remove a session from the registry.\n */\n unregister(sessionId: string): void {\n sessions.delete(sessionId);\n },\n\n /**\n * Returns true if a session with the given ID exists.\n */\n has(sessionId: string): boolean {\n return sessions.has(sessionId);\n },\n\n /**\n * Disconnect all registered contexts using Promise.allSettled, then clear the registry.\n */\n async disconnectAll(): Promise<void> {\n const disconnects = Array.from(sessions.values()).map((ctx) => ctx.disconnect());\n await Promise.allSettled(disconnects);\n sessions.clear();\n },\n\n /**\n * Clear all sessions without disconnecting (for tests).\n */\n clear(): void {\n sessions.clear();\n },\n} as const;\n",
9
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { sleep } from \"@workglow/util\";\nimport { CDPBrowserBackend } from \"./CDPBrowserBackend\";\nimport type {\n BrowserConnectOptions,\n ConsoleMessage,\n DialogAction,\n DialogInfo,\n DownloadOptions,\n DownloadResult,\n ElementRef,\n IBrowserContext,\n NavigateOptions,\n NetworkFilter,\n NetworkRequest,\n ScreenshotOptions,\n TabInfo,\n WaitOptions,\n} from \"./IBrowserContext\";\n\n// ---------------------------------------------------------------------------\n// Bun.WebView type (not imported — accessed via globalThis at runtime)\n// ---------------------------------------------------------------------------\n\n/** @type {InstanceType<typeof Bun.WebView>} */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyWebView = any;\n\n// ---------------------------------------------------------------------------\n// BunWebViewBackend\n// ---------------------------------------------------------------------------\n\n/**\n * IBrowserContext implementation using Bun's built-in WebView API + CDP.\n *\n * Bun.WebView provides a headless browser with Chrome DevTools Protocol\n * access. This backend wraps the WebView, delegating CDP operations to the\n * abstract CDPBrowserBackend base class and using native WebView methods\n * for navigation, screenshots, and keyboard input.\n *\n * This file should only be imported in Bun environments.\n */\nexport class BunWebViewBackend extends CDPBrowserBackend implements IBrowserContext {\n private _wv: AnyWebView | null = null;\n private _connected = false;\n\n // Dialog handler\n private _dialogHandler: ((info: DialogInfo) => DialogAction | Promise<DialogAction>) | null =\n null;\n\n protected readonly backendName = \"BunWebViewBackend\";\n\n /**\n * @param defaultChromePath Optional default Chrome binary path. Used when\n * `connect()` is called without `chromePath` in options (e.g., via\n * BrowserSessionTask which doesn't expose chromePath in its config).\n */\n constructor(private readonly defaultChromePath?: string) {\n super();\n }\n\n // ---------------------------------------------------------------------------\n // CDP helper\n // ---------------------------------------------------------------------------\n\n protected async cdp(method: string, params: Record<string, unknown> = {}): Promise<unknown> {\n return this.wv.cdp(method, params);\n }\n\n // ---------------------------------------------------------------------------\n // evaluateInPage (abstract from CDPBrowserBackend)\n // ---------------------------------------------------------------------------\n\n protected async evaluateInPage<T>(script: string): Promise<T> {\n return this.wv.evaluate(script) as Promise<T>;\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async connect(options: BrowserConnectOptions = {}): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const BunWebView = (globalThis as any).Bun?.WebView;\n if (!BunWebView) {\n throw new Error(\n \"BunWebViewBackend: Bun.WebView is not available — \" +\n \"this backend requires Bun with WebView support\"\n );\n }\n\n const { headless = true, chromePath = this.defaultChromePath } = options;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const webViewOptions: Record<string, any> = {\n headless,\n url: \"about:blank\",\n backend: chromePath ? { type: \"chrome\", path: chromePath } : { type: \"chrome\" },\n };\n\n this._wv = new BunWebView(webViewOptions);\n\n // Wait for the initial navigation to complete\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"BunWebViewBackend: initial navigation timed out\"));\n }, 30_000);\n\n this._wv!.onNavigated = () => {\n clearTimeout(timeout);\n this._wv!.onNavigated = null;\n this._wv!.onNavigationFailed = null;\n resolve();\n };\n\n this._wv!.onNavigationFailed = (error: unknown) => {\n clearTimeout(timeout);\n this._wv!.onNavigated = null;\n this._wv!.onNavigationFailed = null;\n reject(new Error(`BunWebViewBackend: initial navigation failed — ${error}`));\n };\n });\n\n // Enable Accessibility domain for snapshot/queryAXTree\n await this.cdp(\"Accessibility.enable\");\n\n this._connected = true;\n }\n\n async disconnect(): Promise<void> {\n this._connected = false;\n try {\n if (this._wv) {\n this._wv.close();\n }\n } finally {\n this._wv = null;\n this._refMap.clear();\n this._refCounter.count = 0;\n }\n }\n\n isConnected(): boolean {\n return this._connected && this._wv !== null;\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private get wv(): AnyWebView {\n if (!this._wv || !this._connected) {\n throw new Error(\"BunWebViewBackend: not connected — call connect() first\");\n }\n return this._wv;\n }\n\n // ---------------------------------------------------------------------------\n // Navigation\n // ---------------------------------------------------------------------------\n\n async navigate(url: string, options: NavigateOptions = {}): Promise<void> {\n const timeout = options.timeout ?? 30_000;\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"BunWebViewBackend: navigate timed out\"));\n }, timeout);\n\n this.wv.onNavigated = () => {\n clearTimeout(timer);\n this.wv.onNavigated = null;\n resolve();\n };\n\n this.wv.onNavigationFailed = (error: unknown) => {\n clearTimeout(timer);\n this.wv.onNavigationFailed = null;\n this.wv.onNavigated = null;\n reject(new Error(`BunWebViewBackend: navigation failed — ${error}`));\n };\n\n this.wv.navigate(url);\n });\n }\n\n async goBack(_options: NavigateOptions = {}): Promise<void> {\n this.wv.back();\n await this.waitForNavigation();\n }\n\n async goForward(_options: NavigateOptions = {}): Promise<void> {\n this.wv.forward();\n await this.waitForNavigation();\n }\n\n async reload(_options: NavigateOptions = {}): Promise<void> {\n this.wv.reload();\n await this.waitForNavigation();\n }\n\n async currentUrl(): Promise<string> {\n return this.wv.url;\n }\n\n async title(): Promise<string> {\n return this.wv.title;\n }\n\n // ---------------------------------------------------------------------------\n // Content extraction\n // ---------------------------------------------------------------------------\n\n async content(): Promise<string> {\n return this.wv.evaluate(\"document.documentElement.outerHTML\") as Promise<string>;\n }\n\n // ---------------------------------------------------------------------------\n // JS evaluation\n // ---------------------------------------------------------------------------\n\n async evaluate<T>(expression: string): Promise<T> {\n return this.wv.evaluate(expression) as Promise<T>;\n }\n\n // ---------------------------------------------------------------------------\n // Capture\n // ---------------------------------------------------------------------------\n\n async screenshot(options: ScreenshotOptions = {}): Promise<Buffer> {\n const { format = \"png\", quality } = options;\n return this.wv.screenshot({\n encoding: \"buffer\",\n format,\n ...(quality !== undefined && { quality }),\n }) as Promise<Buffer>;\n }\n\n // ---------------------------------------------------------------------------\n // Input (native WebView methods)\n // ---------------------------------------------------------------------------\n\n override async pressKey(key: string, _options: WaitOptions = {}): Promise<void> {\n await this.wv.press(key);\n }\n\n override async type(text: string, _options: WaitOptions = {}): Promise<void> {\n await this.wv.type(text);\n }\n\n // ---------------------------------------------------------------------------\n // File operations\n // ---------------------------------------------------------------------------\n\n async download(\n _trigger: () => Promise<void>,\n _options: DownloadOptions = {}\n ): Promise<DownloadResult> {\n throw new Error(\"BunWebViewBackend: download is not supported\");\n }\n\n // ---------------------------------------------------------------------------\n // Dialogs\n // ---------------------------------------------------------------------------\n\n onDialog(handler: (info: DialogInfo) => DialogAction | Promise<DialogAction>): void {\n this._dialogHandler = handler;\n\n void this.cdp(\"Page.enable\")\n .then(() => {\n this.wv.addEventListener(\n \"Page.javascriptDialogOpening\",\n async (params: Record<string, unknown>) => {\n const info: DialogInfo = {\n type: params.type as DialogInfo[\"type\"],\n message: params.message as string,\n defaultValue: (params.defaultPrompt as string) || undefined,\n };\n\n if (this._dialogHandler) {\n const action = await this._dialogHandler(info);\n const accept = action.accept;\n const promptText =\n accept && \"promptText\" in action\n ? (action as { accept: true; promptText?: string }).promptText\n : undefined;\n await this.cdp(\"Page.handleJavaScriptDialog\", {\n accept,\n ...(promptText !== undefined && { promptText }),\n });\n } else {\n await this.cdp(\"Page.handleJavaScriptDialog\", { accept: false });\n }\n }\n );\n })\n .catch(() => {\n // Page.enable failed — dialog handler will not be wired up.\n // This is non-fatal: the session still works, but dialogs won't be\n // handled automatically and may block page execution.\n });\n }\n\n // ---------------------------------------------------------------------------\n // Tabs (single-view model)\n // ---------------------------------------------------------------------------\n\n async tabs(): Promise<readonly TabInfo[]> {\n const url = this.wv.url;\n const title = this.wv.title;\n return [{ tabId: \"0\", url, title }];\n }\n\n async switchTab(_tabId: string): Promise<void> {\n // Single-view model: no-op\n }\n\n async newTab(url?: string): Promise<TabInfo> {\n if (url) {\n await this.navigate(url);\n }\n return {\n tabId: \"0\",\n url: this.wv.url,\n title: this.wv.title,\n };\n }\n\n async closeTab(_tabId: string): Promise<void> {\n // Single-view model: closing the tab means closing the WebView\n await this.disconnect();\n }\n\n // ---------------------------------------------------------------------------\n // Wait\n // ---------------------------------------------------------------------------\n\n async waitForNavigation(options: NavigateOptions = {}): Promise<void> {\n const timeout = options.timeout ?? 30_000;\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.wv.onNavigated = null;\n this.wv.onNavigationFailed = null;\n reject(new Error(\"BunWebViewBackend: waitForNavigation timed out\"));\n }, timeout);\n\n this.wv.onNavigated = () => {\n clearTimeout(timer);\n this.wv.onNavigated = null;\n this.wv.onNavigationFailed = null;\n resolve();\n };\n\n this.wv.onNavigationFailed = (error: unknown) => {\n clearTimeout(timer);\n this.wv.onNavigated = null;\n this.wv.onNavigationFailed = null;\n reject(new Error(`BunWebViewBackend: navigation failed — ${error}`));\n };\n });\n }\n\n async waitForSelector(selector: string, options: WaitOptions = {}): Promise<ElementRef> {\n const timeout = options.timeout ?? 30_000;\n const interval = 100;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const found = await this.wv.evaluate(`!!document.querySelector(${JSON.stringify(selector)})`);\n if (found) {\n const ref = await this.querySelector(selector);\n if (ref) return ref;\n }\n await sleep(interval);\n }\n\n throw new Error(`BunWebViewBackend: waitForSelector timed out for \"${selector}\"`);\n }\n\n async waitForIdle(options: WaitOptions = {}): Promise<void> {\n const timeout = options.timeout ?? 30_000;\n const interval = 100;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const ready = await this.wv.evaluate(`document.readyState === \"complete\"`);\n if (ready) return;\n await sleep(interval);\n }\n\n throw new Error(\"BunWebViewBackend: waitForIdle timed out\");\n }\n\n // ---------------------------------------------------------------------------\n // Optional capabilities (stubs)\n // ---------------------------------------------------------------------------\n\n readonly networkRequests = (_filter?: NetworkFilter): Promise<readonly NetworkRequest[]> => {\n return Promise.resolve([]);\n };\n\n readonly consoleMessages = (): Promise<readonly ConsoleMessage[]> => {\n return Promise.resolve([]);\n };\n}\n",
10
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AccessibilityNode,\n AccessibilityTree,\n AriaRole,\n ClickOptions,\n ElementRef,\n SnapshotOptions,\n WaitOptions,\n} from \"./IBrowserContext\";\n\n// ---------------------------------------------------------------------------\n// CDP AX node types (CDP response shape)\n// ---------------------------------------------------------------------------\n\ninterface CDPAXProperty {\n name: string;\n value: {\n type: string;\n value?: unknown;\n relatedNodes?: Array<{ backendDOMNodeId: number }>;\n };\n}\n\ninterface CDPAXNode {\n nodeId: string;\n role: { type: string; value: string };\n name: { type: string; value: string };\n backendDOMNodeId?: number;\n properties?: CDPAXProperty[];\n childIds?: string[];\n ignored?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Mutable accessibility node (used while building the tree)\n// ---------------------------------------------------------------------------\n\ninterface MutableAccessibilityNode {\n ref: ElementRef;\n role: AriaRole;\n name: string;\n level?: number;\n checked?: boolean | \"mixed\";\n disabled?: boolean;\n expanded?: boolean;\n pressed?: boolean | \"mixed\";\n selected?: boolean;\n value?: string | number;\n children?: MutableAccessibilityNode[];\n}\n\n// ---------------------------------------------------------------------------\n// Roles to skip during accessibility tree parsing\n// ---------------------------------------------------------------------------\n\nconst IGNORED_ROLES = new Set([\"none\", \"generic\", \"ignored\", \"InlineTextBox\"]);\n\n// ---------------------------------------------------------------------------\n// Parse CDP AX tree into AccessibilityNode tree\n// ---------------------------------------------------------------------------\n\nfunction parseCDPAXTree(\n nodes: CDPAXNode[],\n refCounter: { count: number },\n refMap: Map<ElementRef, number | null>\n): AccessibilityNode {\n const nodeMap = new Map<string, CDPAXNode>();\n let rootNode: CDPAXNode | undefined;\n\n for (const node of nodes) {\n nodeMap.set(node.nodeId, node);\n // Root: node whose id is not referenced as a child by any other node\n if (!rootNode) {\n rootNode = node;\n }\n }\n\n // Find actual root: the node not referenced as a child\n const childIds = new Set<string>();\n for (const node of nodes) {\n for (const childId of node.childIds ?? []) {\n childIds.add(childId);\n }\n }\n rootNode = nodes.find((n) => !childIds.has(n.nodeId)) ?? nodes[0];\n\n function buildNode(cdpNode: CDPAXNode): MutableAccessibilityNode | null {\n const role = cdpNode.role?.value ?? \"\";\n\n // Skip ignored/transparent roles\n if (cdpNode.ignored || IGNORED_ROLES.has(role)) {\n return null;\n }\n\n const ref = `e${++refCounter.count}`;\n // Store backendDOMNodeId (or null if unavailable) for later element resolution\n refMap.set(ref, cdpNode.backendDOMNodeId ?? null);\n\n const name = typeof cdpNode.name?.value === \"string\" ? cdpNode.name.value : \"\";\n\n const node: MutableAccessibilityNode = {\n ref,\n role: role as AriaRole,\n name,\n };\n\n // Parse AX properties\n for (const prop of cdpNode.properties ?? []) {\n switch (prop.name) {\n case \"level\":\n if (typeof prop.value.value === \"number\") {\n node.level = prop.value.value;\n }\n break;\n case \"checked\":\n if (prop.value.value === \"mixed\") {\n node.checked = \"mixed\";\n } else if (typeof prop.value.value === \"boolean\") {\n node.checked = prop.value.value;\n }\n break;\n case \"disabled\":\n node.disabled = prop.value.value === true;\n break;\n case \"expanded\":\n node.expanded = prop.value.value === true;\n break;\n case \"pressed\":\n if (prop.value.value === \"mixed\") {\n node.pressed = \"mixed\";\n } else if (typeof prop.value.value === \"boolean\") {\n node.pressed = prop.value.value;\n }\n break;\n case \"selected\":\n node.selected = prop.value.value === true;\n break;\n case \"valuetext\":\n case \"value\":\n if (typeof prop.value.value === \"string\" || typeof prop.value.value === \"number\") {\n node.value = prop.value.value;\n }\n break;\n }\n }\n\n // Recurse into children\n const childNodes: MutableAccessibilityNode[] = [];\n for (const childId of cdpNode.childIds ?? []) {\n const childCdp = nodeMap.get(childId);\n if (childCdp) {\n const child = buildNode(childCdp);\n if (child) childNodes.push(child);\n }\n }\n if (childNodes.length > 0) {\n node.children = childNodes;\n }\n\n return node;\n }\n\n if (!rootNode) {\n const ref = `e${++refCounter.count}`;\n refMap.set(ref, null);\n return { ref, role: \"document\", name: \"\" };\n }\n\n const built = buildNode(rootNode);\n if (!built) {\n const ref = `e${++refCounter.count}`;\n refMap.set(ref, null);\n return { ref, role: \"document\", name: \"\" };\n }\n\n return built as AccessibilityNode;\n}\n\n// ---------------------------------------------------------------------------\n// Build a YAML-like accessibility tree string from the node tree\n// ---------------------------------------------------------------------------\n\nfunction serializeAXTree(node: AccessibilityNode, indent = 0): string {\n const spaces = \" \".repeat(indent);\n let line = `${spaces}- ${node.role}`;\n if (node.name) {\n line += ` \"${node.name.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n if (node.level !== undefined) line += ` [level=${node.level}]`;\n if (node.checked !== undefined) line += ` [checked=${node.checked}]`;\n if (node.disabled) line += ` [disabled=true]`;\n if (node.expanded !== undefined) line += ` [expanded=${node.expanded}]`;\n if (node.pressed !== undefined) line += ` [pressed=${node.pressed}]`;\n if (node.selected) line += ` [selected=true]`;\n if (node.value !== undefined) line += ` [value=${node.value}]`;\n\n const lines: string[] = [line];\n for (const child of node.children ?? []) {\n lines.push(serializeAXTree(child, indent + 1));\n }\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Convert modifier key names to CDP modifier bitmask.\n * Alt=1, Control=2, Meta=4, Shift=8\n */\nfunction buildModifiersMask(\n modifiers?: ReadonlyArray<\"Alt\" | \"Control\" | \"Meta\" | \"Shift\">\n): number {\n if (!modifiers) return 0;\n let mask = 0;\n for (const mod of modifiers) {\n if (mod === \"Alt\") mask |= 1;\n else if (mod === \"Control\") mask |= 2;\n else if (mod === \"Meta\") mask |= 4;\n else if (mod === \"Shift\") mask |= 8;\n }\n return mask;\n}\n\n/** Map Playwright-style key names to CDP key names. */\nconst KEY_CODE_MAP: Record<string, string> = {\n Enter: \"Enter\",\n Tab: \"Tab\",\n Escape: \"Escape\",\n Backspace: \"Backspace\",\n Delete: \"Delete\",\n ArrowUp: \"ArrowUp\",\n ArrowDown: \"ArrowDown\",\n ArrowLeft: \"ArrowLeft\",\n ArrowRight: \"ArrowRight\",\n Home: \"Home\",\n End: \"End\",\n PageUp: \"PageUp\",\n PageDown: \"PageDown\",\n Space: \" \",\n F1: \"F1\",\n F2: \"F2\",\n F3: \"F3\",\n F4: \"F4\",\n F5: \"F5\",\n F6: \"F6\",\n F7: \"F7\",\n F8: \"F8\",\n F9: \"F9\",\n F10: \"F10\",\n F11: \"F11\",\n F12: \"F12\",\n};\n\n/** Convert a key name to a CDP code string (best effort). */\nfunction keyToCode(key: string): string {\n if (key.length === 1) {\n const upper = key.toUpperCase();\n return `Key${upper}`;\n }\n const codeMap: Record<string, string> = {\n Enter: \"Enter\",\n Tab: \"Tab\",\n Escape: \"Escape\",\n Backspace: \"Backspace\",\n Delete: \"Delete\",\n ArrowUp: \"ArrowUp\",\n ArrowDown: \"ArrowDown\",\n ArrowLeft: \"ArrowLeft\",\n ArrowRight: \"ArrowRight\",\n Home: \"Home\",\n End: \"End\",\n PageUp: \"PageUp\",\n PageDown: \"PageDown\",\n Space: \"Space\",\n };\n return codeMap[key] ?? key;\n}\n\n// ---------------------------------------------------------------------------\n// CDPBrowserBackend — abstract base for backends that use the Chrome DevTools\n// Protocol (CDP) for element interaction, accessibility, and DOM queries.\n// ---------------------------------------------------------------------------\n\nexport abstract class CDPBrowserBackend {\n protected _refMap = new Map<ElementRef, number | null>();\n protected _refCounter = { count: 0 };\n\n // ---------------------------------------------------------------------------\n // Abstract — subclasses provide these\n // ---------------------------------------------------------------------------\n\n /** Send a CDP command. Subclasses wire this to their transport. */\n protected abstract cdp(method: string, params?: Record<string, unknown>): Promise<unknown>;\n\n /** Human-readable backend name for error messages. */\n protected abstract readonly backendName: string;\n\n /** Evaluate a JavaScript expression in the page and return the result. */\n protected abstract evaluateInPage<T>(script: string): Promise<T>;\n\n // ---------------------------------------------------------------------------\n // Ref resolution\n // ---------------------------------------------------------------------------\n\n /**\n * Resolve an ElementRef to a backendDOMNodeId. Throws if unknown.\n */\n protected resolveRefToNodeId(ref: ElementRef): number {\n if (!this._refMap.has(ref)) {\n throw new Error(`${this.backendName}: unknown ref \"${ref}\"`);\n }\n const nodeId = this._refMap.get(ref);\n if (nodeId == null) {\n throw new Error(`${this.backendName}: ref \"${ref}\" has no associated DOM node`);\n }\n return nodeId;\n }\n\n /**\n * Get the bounding box of a DOM node by backendDOMNodeId via CDP.\n */\n protected async getBoundingBox(\n backendNodeId: number\n ): Promise<{ x: number; y: number; width: number; height: number }> {\n const result = (await this.cdp(\"DOM.getBoxModel\", { backendNodeId })) as {\n model: { content: number[] };\n };\n const content = result.model.content;\n // content is [x1,y1, x2,y2, x3,y3, x4,y4] (quad)\n const x = content[0];\n const y = content[1];\n const width = content[2] - content[0];\n const height = content[5] - content[1];\n return { x, y, width, height };\n }\n\n /**\n * Get the root nodeId of the DOM document.\n */\n protected async getDocumentRootNodeId(): Promise<number> {\n const doc = (await this.cdp(\"DOM.getDocument\", { depth: 0 })) as {\n root: { nodeId: number };\n };\n return doc.root.nodeId;\n }\n\n // ---------------------------------------------------------------------------\n // Accessibility\n // ---------------------------------------------------------------------------\n\n async snapshot(_options: SnapshotOptions = {}): Promise<AccessibilityTree> {\n // Clear old snapshot refs but keep the monotonic counter to avoid\n // collisions with refs created by querySelector between snapshots.\n this._refMap.clear();\n\n const result = (await this.cdp(\"Accessibility.getFullAXTree\")) as { nodes: CDPAXNode[] };\n const nodes = result.nodes ?? [];\n\n const root = parseCDPAXTree(nodes, this._refCounter, this._refMap);\n const yaml = serializeAXTree(root);\n\n return { root, yaml };\n }\n\n // ---------------------------------------------------------------------------\n // Element interaction (by ref)\n // ---------------------------------------------------------------------------\n\n async click(ref: ElementRef, options: ClickOptions = {}): Promise<void> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n const { x, y, width, height } = await this.getBoundingBox(backendNodeId);\n const cx = x + width / 2;\n const cy = y + height / 2;\n\n const button = options.button ?? \"left\";\n const clickCount = options.clickCount ?? 1;\n const modifiers = buildModifiersMask(options.modifiers);\n\n for (let i = 0; i < clickCount; i++) {\n await this.cdp(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: cx,\n y: cy,\n button,\n clickCount: 1,\n modifiers,\n });\n await this.cdp(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: cx,\n y: cy,\n button,\n clickCount: 1,\n modifiers,\n });\n }\n }\n\n async fill(ref: ElementRef, value: string, _options: WaitOptions = {}): Promise<void> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n\n // Focus the element\n await this.cdp(\"DOM.focus\", { backendNodeId });\n\n // Select all existing text and replace with new value\n await this.cdp(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: \"a\",\n code: \"KeyA\",\n modifiers: 2, // Control\n });\n await this.cdp(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: \"a\",\n code: \"KeyA\",\n modifiers: 2,\n });\n\n // Insert text via CDP\n await this.cdp(\"Input.insertText\", { text: value });\n }\n\n async selectOption(\n ref: ElementRef,\n values: string | readonly string[],\n _options: WaitOptions = {}\n ): Promise<void> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n const valuesArray = Array.isArray(values) ? values : [values];\n\n // Use JavaScript to set the value on the select element\n const result = (await this.cdp(\"DOM.resolveNode\", { backendNodeId })) as {\n object: { objectId: string };\n };\n const objectId = result.object.objectId;\n\n await this.cdp(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: `function(vals) {\n const opts = Array.from(this.options);\n for (const opt of opts) {\n opt.selected = vals.includes(opt.value);\n }\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }`,\n arguments: [{ value: valuesArray }],\n });\n }\n\n async hover(ref: ElementRef, _options: WaitOptions = {}): Promise<void> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n const { x, y, width, height } = await this.getBoundingBox(backendNodeId);\n const cx = x + width / 2;\n const cy = y + height / 2;\n\n await this.cdp(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Semantic interaction\n // ---------------------------------------------------------------------------\n\n async clickByRole(role: AriaRole, name: string, options: ClickOptions = {}): Promise<void> {\n const result = (await this.cdp(\"Accessibility.queryAXTree\", {\n role,\n name,\n })) as { nodes: CDPAXNode[] };\n\n const axNode = result.nodes?.[0];\n if (!axNode) {\n throw new Error(`${this.backendName}: no element with role \"${role}\" and name \"${name}\"`);\n }\n\n if (axNode.backendDOMNodeId == null) {\n throw new Error(\n `${this.backendName}: element with role \"${role}\" and name \"${name}\" has no DOM node`\n );\n }\n\n const { x, y, width, height } = await this.getBoundingBox(axNode.backendDOMNodeId);\n const cx = x + width / 2;\n const cy = y + height / 2;\n\n const button = options.button ?? \"left\";\n const clickCount = options.clickCount ?? 1;\n const modifiers = buildModifiersMask(options.modifiers);\n\n for (let i = 0; i < clickCount; i++) {\n await this.cdp(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: cx,\n y: cy,\n button,\n clickCount: 1,\n modifiers,\n });\n await this.cdp(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: cx,\n y: cy,\n button,\n clickCount: 1,\n modifiers,\n });\n }\n }\n\n async fillByLabel(label: string, value: string, _options: WaitOptions = {}): Promise<void> {\n // Try CDP path first: find the label via AX tree, resolve its associated input,\n // then use CDP DOM.focus + Input.insertText (no JS injection needed).\n const labelResult = (await this.cdp(\"Accessibility.queryAXTree\", {\n role: \"label\",\n name: label,\n })) as { nodes: CDPAXNode[] };\n\n if (labelResult.nodes?.[0]?.backendDOMNodeId != null) {\n const labelNodeId = labelResult.nodes[0].backendDOMNodeId;\n const resolveResult = (await this.cdp(\"DOM.resolveNode\", {\n backendNodeId: labelNodeId,\n })) as {\n object: { objectId: string };\n };\n\n // Find the associated input element via the label's for/htmlFor or as a child\n const inputResult = (await this.cdp(\"Runtime.callFunctionOn\", {\n objectId: resolveResult.object.objectId,\n functionDeclaration: `function() {\n const forAttr = this.htmlFor || this.getAttribute('for');\n if (forAttr) {\n return document.getElementById(forAttr);\n }\n return this.querySelector('input, textarea, select');\n }`,\n returnByValue: false,\n })) as { result: { objectId?: string; subtype?: string } };\n\n if (inputResult.result.objectId && inputResult.result.subtype !== \"null\") {\n // Get the backendNodeId for the input element\n const inputNodeResult = (await this.cdp(\"DOM.requestNode\", {\n objectId: inputResult.result.objectId,\n })) as { nodeId: number };\n\n const describeResult = (await this.cdp(\"DOM.describeNode\", {\n nodeId: inputNodeResult.nodeId,\n })) as { node: { backendNodeId: number } };\n\n // Focus and fill via CDP — clean, no JS injection\n await this.cdp(\"DOM.focus\", { backendNodeId: describeResult.node.backendNodeId });\n await this.cdp(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: \"a\",\n code: \"KeyA\",\n modifiers: 2,\n });\n await this.cdp(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: \"a\",\n code: \"KeyA\",\n modifiers: 2,\n });\n await this.cdp(\"Input.insertText\", { text: value });\n return;\n }\n }\n\n // JS fallback: find label by text content, resolve its input, set value with events\n const script = `(function() {\n const labels = Array.from(document.querySelectorAll('label'));\n const label = labels.find(l => l.textContent.trim() === ${JSON.stringify(label)});\n if (!label) return false;\n const forAttr = label.htmlFor;\n let input = forAttr ? document.getElementById(forAttr) : label.querySelector('input, textarea, select');\n if (!input) return false;\n input.focus();\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(input), 'value'\n )?.set;\n if (nativeInputValueSetter) {\n nativeInputValueSetter.call(input, ${JSON.stringify(value)});\n } else {\n input.value = ${JSON.stringify(value)};\n }\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n return true;\n })()`;\n const filled = await this.evaluateInPage<boolean>(script);\n if (!filled) {\n throw new Error(`${this.backendName}: no input found for label \"${label}\"`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Content extraction\n // ---------------------------------------------------------------------------\n\n async innerHTML(ref: ElementRef): Promise<string> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n const result = (await this.cdp(\"DOM.getOuterHTML\", { backendNodeId })) as {\n outerHTML: string;\n };\n // Strip outer tag to get innerHTML\n const outer = result.outerHTML;\n const startTagEnd = outer.indexOf(\">\");\n const endTagStart = outer.lastIndexOf(\"<\");\n if (startTagEnd === -1 || endTagStart <= startTagEnd) {\n return outer;\n }\n return outer.slice(startTagEnd + 1, endTagStart);\n }\n\n async textContent(ref: ElementRef): Promise<string | null> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n const resolveResult = (await this.cdp(\"DOM.resolveNode\", { backendNodeId })) as {\n object: { objectId: string };\n };\n const objectId = resolveResult.object.objectId;\n const result = (await this.cdp(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: \"function() { return this.textContent; }\",\n returnByValue: true,\n })) as { result: { value: string | null } };\n return result.result.value;\n }\n\n async attribute(ref: ElementRef, name: string): Promise<string | null> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n const resolveResult = (await this.cdp(\"DOM.resolveNode\", { backendNodeId })) as {\n object: { objectId: string };\n };\n const objectId = resolveResult.object.objectId;\n const result = (await this.cdp(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: \"function(attrName) { return this.getAttribute(attrName); }\",\n arguments: [{ value: name }],\n returnByValue: true,\n })) as { result: { value: string | null } };\n return result.result.value;\n }\n\n // ---------------------------------------------------------------------------\n // CSS selectors\n // ---------------------------------------------------------------------------\n\n async querySelector(selector: string): Promise<ElementRef | null> {\n const rootNodeId = await this.getDocumentRootNodeId();\n const result = (await this.cdp(\"DOM.querySelector\", {\n nodeId: rootNodeId,\n selector,\n })) as { nodeId: number };\n\n if (!result.nodeId || result.nodeId === 0) return null;\n\n // Convert nodeId to backendNodeId\n const describeResult = (await this.cdp(\"DOM.describeNode\", { nodeId: result.nodeId })) as {\n node: { backendNodeId: number };\n };\n\n const ref = `e${++this._refCounter.count}`;\n this._refMap.set(ref, describeResult.node.backendNodeId);\n return ref;\n }\n\n async querySelectorAll(selector: string): Promise<readonly ElementRef[]> {\n const rootNodeId = await this.getDocumentRootNodeId();\n const result = (await this.cdp(\"DOM.querySelectorAll\", {\n nodeId: rootNodeId,\n selector,\n })) as { nodeIds: number[] };\n\n const nodeIds = result.nodeIds ?? [];\n const refs: ElementRef[] = [];\n\n for (const nodeId of nodeIds) {\n const describeResult = (await this.cdp(\"DOM.describeNode\", { nodeId })) as {\n node: { backendNodeId: number };\n };\n const ref = `e${++this._refCounter.count}`;\n this._refMap.set(ref, describeResult.node.backendNodeId);\n refs.push(ref);\n }\n\n return refs;\n }\n\n // ---------------------------------------------------------------------------\n // Input\n // ---------------------------------------------------------------------------\n\n async pressKey(key: string, _options: WaitOptions = {}): Promise<void> {\n // Map common key names to CDP key event fields\n const keyCode = KEY_CODE_MAP[key] ?? key;\n await this.cdp(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: keyCode,\n code: keyToCode(key),\n });\n await this.cdp(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: keyCode,\n code: keyToCode(key),\n });\n }\n\n async type(text: string, _options: WaitOptions = {}): Promise<void> {\n await this.cdp(\"Input.insertText\", { text });\n }\n\n async scroll(x: number, y: number, ref?: ElementRef): Promise<void> {\n if (ref) {\n // Scroll within element via JS\n const backendNodeId = this.resolveRefToNodeId(ref);\n const resolveResult = (await this.cdp(\"DOM.resolveNode\", { backendNodeId })) as {\n object: { objectId: string };\n };\n const objectId = resolveResult.object.objectId;\n await this.cdp(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: `function(dx, dy) { this.scrollBy(dx, dy); }`,\n arguments: [{ value: x }, { value: y }],\n });\n } else {\n await this.cdp(\"Input.dispatchMouseEvent\", {\n type: \"mouseWheel\",\n x: 0,\n y: 0,\n deltaX: x,\n deltaY: y,\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // File operations\n // ---------------------------------------------------------------------------\n\n async uploadFile(ref: ElementRef, paths: string | readonly string[]): Promise<void> {\n const backendNodeId = this.resolveRefToNodeId(ref);\n const files = Array.isArray(paths) ? paths : [paths];\n\n await this.cdp(\"DOM.setFileInputFiles\", {\n backendNodeId,\n files,\n });\n }\n}\n",
11
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Entitlements,\n IExecuteContext,\n mergeEntitlements,\n Task,\n TaskConfig,\n TaskConfigSchema,\n TaskEntitlements,\n} from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { getBrowserDeps } from \"../BrowserTaskDeps\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserSessionTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n backend: {\n type: \"string\",\n enum: [\"local\", \"cloud\", \"electron-native\"],\n title: \"Backend\",\n description: \"The browser backend to use\",\n },\n projectId: {\n type: \"string\",\n title: \"Project ID\",\n description: \"Project identifier for profile storage\",\n },\n profileName: {\n type: \"string\",\n title: \"Profile Name\",\n description: \"Named browser profile to use\",\n },\n headless: {\n type: \"boolean\",\n title: \"Headless\",\n description: \"Run the browser in headless mode\",\n default: true,\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserSessionTaskConfig = TaskConfig & {\n backend?: \"local\" | \"cloud\" | \"electron-native\";\n projectId?: string;\n profileName?: string;\n headless?: boolean;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The unique identifier for the created browser session\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserSessionTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserSessionTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserSessionTask extends Task<\n BrowserSessionTaskInput,\n BrowserSessionTaskOutput,\n BrowserSessionTaskConfig\n> {\n static override readonly type = \"BrowserSessionTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Session\";\n public static override description = \"Creates a new browser session and returns its session ID\";\n static override readonly cacheable = false;\n\n public static override hasDynamicEntitlements = true;\n\n public static override configSchema(): DataPortSchema {\n return browserSessionTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n public static override entitlements(): TaskEntitlements {\n return {\n entitlements: [\n { id: Entitlements.BROWSER_CONTROL, reason: \"Creates and manages a browser session\" },\n ],\n };\n }\n\n public override entitlements(): TaskEntitlements {\n const base = BrowserSessionTask.entitlements();\n const backend = this.config.backend;\n if (backend === \"local\" || backend === \"electron-native\") {\n return mergeEntitlements(base, {\n entitlements: [\n { id: Entitlements.BROWSER_CONTROL_LOCAL, reason: \"Launches a local browser process\" },\n ],\n });\n }\n if (backend === \"cloud\") {\n return mergeEntitlements(base, {\n entitlements: [\n {\n id: Entitlements.BROWSER_CONTROL_CLOUD,\n reason: \"Connects to a remote cloud browser service\",\n },\n ],\n });\n }\n // Backend not yet determined — require both to be safe\n return mergeEntitlements(\n base,\n mergeEntitlements(\n {\n entitlements: [\n { id: Entitlements.BROWSER_CONTROL_LOCAL, reason: \"Launches a local browser process\" },\n ],\n },\n {\n entitlements: [\n {\n id: Entitlements.BROWSER_CONTROL_CLOUD,\n reason: \"Connects to a remote cloud browser service\",\n },\n ],\n }\n )\n );\n }\n\n override async execute(\n _input: BrowserSessionTaskInput,\n executeContext: IExecuteContext\n ): Promise<BrowserSessionTaskOutput> {\n const deps = getBrowserDeps();\n\n const backend = this.config.backend ?? deps.defaultBackend;\n\n if (!deps.availableBackends.includes(backend)) {\n throw new Error(\n `BrowserSessionTask: backend \"${backend}\" is not available. Available backends: ${deps.availableBackends.join(\", \")}`\n );\n }\n\n const options = {\n backend,\n projectId: this.config.projectId,\n profileName: this.config.profileName,\n headless: this.config.headless ?? true,\n };\n\n const ctx = deps.createContext(options);\n await ctx.connect(options);\n\n const sessionId = BrowserSessionRegistry.register(ctx);\n\n executeContext.resourceScope?.register(`browser:${sessionId}`, async () => {\n await ctx.disconnect();\n BrowserSessionRegistry.unregister(sessionId);\n });\n\n return { sessionId };\n }\n}\n",
12
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The session ID of the browser session to close\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserCloseTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserCloseTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserCloseTask extends Task<\n BrowserCloseTaskInput,\n BrowserCloseTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserCloseTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Close\";\n public static override description = \"Disconnects and closes an existing browser session\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserCloseTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserCloseTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.disconnect();\n BrowserSessionRegistry.unregister(input.sessionId);\n return {};\n }\n}\n",
13
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Entitlements,\n IExecuteContext,\n Task,\n TaskConfig,\n TaskConfigSchema,\n TaskEntitlements,\n} from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserNavigateTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n waitUntil: {\n type: \"string\",\n enum: [\"load\", \"domcontentloaded\", \"networkidle\"],\n title: \"Wait Until\",\n description: \"When to consider navigation complete\",\n default: \"load\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserNavigateTaskConfig = TaskConfig & {\n waitUntil?: \"load\" | \"domcontentloaded\" | \"networkidle\";\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n url: {\n type: \"string\",\n format: \"uri\",\n title: \"URL\",\n description: \"The URL to navigate to\",\n },\n },\n required: [\"sessionId\", \"url\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n title: {\n type: \"string\",\n title: \"Page Title\",\n description: \"The title of the navigated page\",\n },\n url: {\n type: \"string\",\n title: \"URL\",\n description: \"The current URL after navigation\",\n },\n },\n required: [\"sessionId\", \"title\", \"url\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserNavigateTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserNavigateTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserNavigateTask extends Task<\n BrowserNavigateTaskInput,\n BrowserNavigateTaskOutput,\n BrowserNavigateTaskConfig\n> {\n static override readonly type = \"BrowserNavigateTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Navigate\";\n public static override description =\n \"Navigates the browser to a URL and returns the page title and URL\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserNavigateTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n public static override entitlements(): TaskEntitlements {\n return {\n entitlements: [\n { id: Entitlements.BROWSER_CONTROL_NAVIGATE, reason: \"Navigates to a URL in the browser\" },\n ],\n };\n }\n\n override async execute(\n input: BrowserNavigateTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserNavigateTaskOutput> {\n const parsed = new URL(input.url, \"https://placeholder\");\n if (parsed.protocol === \"javascript:\") {\n throw new Error(\"BrowserNavigateTask: javascript: URLs are not allowed\");\n }\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const waitUntil = this.config.waitUntil ?? \"load\";\n await ctx.navigate(input.url, { waitUntil });\n const title = await ctx.title();\n const url = await ctx.currentUrl();\n return { sessionId: input.sessionId, title, url };\n }\n}\n",
14
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n url: {\n type: \"string\",\n title: \"URL\",\n description: \"The current URL after navigating back\",\n },\n },\n required: [\"sessionId\", \"url\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserBackTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserBackTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserBackTask extends Task<BrowserBackTaskInput, BrowserBackTaskOutput, TaskConfig> {\n static override readonly type = \"BrowserBackTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Back\";\n public static override description =\n \"Navigates back in the browser history and returns the current URL\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserBackTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserBackTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.goBack();\n const url = await ctx.currentUrl();\n return { sessionId: input.sessionId, url };\n }\n}\n",
15
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n url: {\n type: \"string\",\n title: \"URL\",\n description: \"The current URL after navigating forward\",\n },\n },\n required: [\"sessionId\", \"url\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserForwardTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserForwardTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserForwardTask extends Task<\n BrowserForwardTaskInput,\n BrowserForwardTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserForwardTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Forward\";\n public static override description =\n \"Navigates forward in the browser history and returns the current URL\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserForwardTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserForwardTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.goForward();\n const url = await ctx.currentUrl();\n return { sessionId: input.sessionId, url };\n }\n}\n",
16
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserReloadTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserReloadTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserReloadTask extends Task<\n BrowserReloadTaskInput,\n BrowserReloadTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserReloadTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Reload\";\n public static override description = \"Reloads the current page in the browser\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserReloadTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserReloadTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.reload();\n return { sessionId: input.sessionId };\n }\n}\n",
17
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport type { AccessibilityTree } from \"../IBrowserContext\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n tree: {\n type: \"object\",\n title: \"Accessibility Tree\",\n description: \"The accessibility tree of the current page\",\n additionalProperties: true,\n },\n },\n required: [\"sessionId\", \"tree\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserSnapshotTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserSnapshotTaskOutput = { sessionId: string; tree: AccessibilityTree };\n\nexport class BrowserSnapshotTask extends Task<\n BrowserSnapshotTaskInput,\n BrowserSnapshotTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserSnapshotTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Snapshot\";\n public static override description = \"Returns the accessibility tree of the current browser page\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserSnapshotTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserSnapshotTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const tree = await ctx.snapshot();\n return { sessionId: input.sessionId, tree };\n }\n}\n",
18
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserScreenshotTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n format: {\n type: \"string\",\n enum: [\"png\", \"jpeg\"],\n title: \"Format\",\n description: \"The image format for the screenshot\",\n default: \"png\",\n },\n fullPage: {\n type: \"boolean\",\n title: \"Full Page\",\n description: \"Whether to capture the full scrollable page\",\n default: false,\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserScreenshotTaskConfig = TaskConfig & {\n format?: \"png\" | \"jpeg\";\n fullPage?: boolean;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n image: {\n type: \"string\",\n format: \"binary\",\n title: \"Image\",\n description: \"The screenshot image data\",\n },\n },\n required: [\"sessionId\", \"image\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserScreenshotTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserScreenshotTaskOutput = { sessionId: string; image: Uint8Array };\n\nexport class BrowserScreenshotTask extends Task<\n BrowserScreenshotTaskInput,\n BrowserScreenshotTaskOutput,\n BrowserScreenshotTaskConfig\n> {\n static override readonly type = \"BrowserScreenshotTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Screenshot\";\n public static override description = \"Takes a screenshot of the current browser page\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserScreenshotTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserScreenshotTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserScreenshotTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const format = this.config.format ?? \"png\";\n const fullPage = this.config.fullPage ?? false;\n const image = await ctx.screenshot({ format, fullPage });\n return { sessionId: input.sessionId, image };\n }\n}\n",
19
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserClickTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n modifiers: {\n type: \"array\",\n items: {\n type: \"string\",\n enum: [\"Alt\", \"Control\", \"Meta\", \"Shift\"],\n },\n title: \"Modifiers\",\n description: \"Keyboard modifiers to hold during the click\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserClickTaskConfig = TaskConfig & {\n modifiers?: Array<\"Alt\" | \"Control\" | \"Meta\" | \"Shift\">;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The element reference to click\",\n },\n role: {\n type: \"string\",\n title: \"ARIA Role\",\n description: \"The ARIA role of the element to click\",\n },\n name: {\n type: \"string\",\n title: \"Accessible Name\",\n description: \"The accessible name of the element to click\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserClickTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserClickTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserClickTask extends Task<\n BrowserClickTaskInput,\n BrowserClickTaskOutput,\n BrowserClickTaskConfig\n> {\n static override readonly type = \"BrowserClickTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Click\";\n public static override description =\n \"Clicks an element in the browser by ref or by ARIA role and name\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserClickTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserClickTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserClickTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const opts = this.config.modifiers ? { modifiers: this.config.modifiers } : undefined;\n if (input.ref) {\n await ctx.click(input.ref, opts);\n } else if (input.role && input.name) {\n await ctx.clickByRole(input.role, input.name, opts);\n } else {\n throw new Error(\"BrowserClickTask: either ref or role+name must be provided\");\n }\n return { sessionId: input.sessionId };\n }\n}\n",
20
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserFillTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n clearFirst: {\n type: \"boolean\",\n title: \"Clear First\",\n description: \"Whether to clear the field before filling\",\n default: true,\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserFillTaskConfig = TaskConfig & {\n clearFirst?: boolean;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The element reference to fill\",\n },\n label: {\n type: \"string\",\n title: \"Label\",\n description: \"The label text of the input to fill\",\n },\n value: {\n type: \"string\",\n title: \"Value\",\n description: \"The value to fill into the input\",\n },\n },\n required: [\"sessionId\", \"value\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserFillTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserFillTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserFillTask extends Task<\n BrowserFillTaskInput,\n BrowserFillTaskOutput,\n BrowserFillTaskConfig\n> {\n static override readonly type = \"BrowserFillTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Fill\";\n public static override description = \"Fills a text input in the browser by ref or by label\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserFillTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserFillTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserFillTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n if (input.ref) {\n await ctx.fill(input.ref, input.value);\n } else if (input.label) {\n await ctx.fillByLabel(input.label, input.value);\n } else {\n throw new Error(\"BrowserFillTask: either ref or label must be provided\");\n }\n return { sessionId: input.sessionId };\n }\n}\n",
21
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The element reference of the select element\",\n },\n label: {\n type: \"string\",\n title: \"Label\",\n description: \"The label text of the select element (not yet supported, use ref)\",\n },\n value: {\n type: \"string\",\n title: \"Value\",\n description: \"The option value to select\",\n },\n },\n required: [\"sessionId\", \"value\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserSelectTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserSelectTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserSelectTask extends Task<\n BrowserSelectTaskInput,\n BrowserSelectTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserSelectTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Select\";\n public static override description = \"Selects an option in a select element identified by ref\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserSelectTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserSelectTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n if (input.ref) {\n await ctx.selectOption(input.ref, input.value);\n } else {\n throw new Error(\"BrowserSelectTask: ref must be provided\");\n }\n return { sessionId: input.sessionId };\n }\n}\n",
22
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The element reference to hover over\",\n },\n role: {\n type: \"string\",\n title: \"ARIA Role\",\n description: \"The ARIA role of the element to hover (not yet supported, use ref)\",\n },\n name: {\n type: \"string\",\n title: \"Accessible Name\",\n description: \"The accessible name of the element to hover (not yet supported, use ref)\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserHoverTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserHoverTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserHoverTask extends Task<\n BrowserHoverTaskInput,\n BrowserHoverTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserHoverTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Hover\";\n public static override description = \"Hovers over an element in the browser identified by ref\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserHoverTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserHoverTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n if (input.ref) {\n await ctx.hover(input.ref);\n } else {\n throw new Error(\"BrowserHoverTask: ref must be provided\");\n }\n return { sessionId: input.sessionId };\n }\n}\n",
23
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserExtractTextTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description:\n \"The element reference to extract text from (extracts from full page if not provided)\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserExtractTextTaskConfig = TaskConfig & {\n ref?: string;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n text: {\n type: \"string\",\n title: \"Text\",\n description: \"The extracted text content\",\n },\n },\n required: [\"sessionId\", \"text\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserExtractTextTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserExtractTextTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserExtractTextTask extends Task<\n BrowserExtractTextTaskInput,\n BrowserExtractTextTaskOutput,\n BrowserExtractTextTaskConfig\n> {\n static override readonly type = \"BrowserExtractTextTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Extract Text\";\n public static override description =\n \"Extracts text content from a specific element or the full page\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserExtractTextTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserExtractTextTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserExtractTextTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n let ref = this.config.ref;\n if (!ref) {\n const bodyRef = await ctx.querySelector(\"body\");\n if (!bodyRef) {\n throw new Error(\"BrowserExtractTextTask: could not find body element\");\n }\n ref = bodyRef;\n }\n const text = await ctx.textContent(ref);\n return { sessionId: input.sessionId, text: text ?? \"\" };\n }\n}\n",
24
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserExtractHtmlTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The element reference to extract HTML from\",\n },\n selector: {\n type: \"string\",\n title: \"CSS Selector\",\n description: \"CSS selector to find element when no ref is provided\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserExtractHtmlTaskConfig = TaskConfig & {\n ref?: string;\n selector?: string;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n html: {\n type: \"string\",\n title: \"HTML\",\n description: \"The extracted HTML content\",\n },\n },\n required: [\"sessionId\", \"html\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserExtractHtmlTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserExtractHtmlTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserExtractHtmlTask extends Task<\n BrowserExtractHtmlTaskInput,\n BrowserExtractHtmlTaskOutput,\n BrowserExtractHtmlTaskConfig\n> {\n static override readonly type = \"BrowserExtractHtmlTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Extract HTML\";\n public static override description =\n \"Extracts HTML content from a specific element by ref or CSS selector\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserExtractHtmlTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserExtractHtmlTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserExtractHtmlTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n let ref = this.config.ref;\n if (!ref) {\n if (!this.config.selector) {\n throw new Error(\"BrowserExtractHtmlTask requires either config.ref or config.selector\");\n }\n const found = await ctx.querySelector(this.config.selector);\n if (!found) {\n throw new Error(\n `BrowserExtractHtmlTask could not find an element matching selector: ${this.config.selector}`\n );\n }\n ref = found;\n }\n const html = await ctx.innerHTML(ref);\n return { sessionId: input.sessionId, html };\n }\n}\n",
25
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The element reference to get the attribute from\",\n },\n attribute: {\n type: \"string\",\n title: \"Attribute Name\",\n description: \"The name of the attribute to retrieve\",\n },\n },\n required: [\"sessionId\", \"ref\", \"attribute\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n value: {\n type: [\"string\", \"null\"],\n title: \"Value\",\n description: \"The attribute value, or null if not present\",\n },\n },\n required: [\"sessionId\", \"value\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserAttributeTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserAttributeTaskOutput = { sessionId: string; value: string | null };\n\nexport class BrowserAttributeTask extends Task<\n BrowserAttributeTaskInput,\n BrowserAttributeTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserAttributeTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Attribute\";\n public static override description = \"Retrieves the value of an attribute from a browser element\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserAttributeTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserAttributeTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const value = await ctx.attribute(input.ref, input.attribute);\n return { sessionId: input.sessionId, value };\n }\n}\n",
26
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n selector: {\n type: \"string\",\n title: \"CSS Selector\",\n description: \"The CSS selector to query for\",\n },\n },\n required: [\"sessionId\", \"selector\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n refs: {\n type: \"array\",\n items: { type: \"string\" },\n title: \"Element Refs\",\n description: \"The element references matching the selector\",\n },\n },\n required: [\"sessionId\", \"refs\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserQuerySelectorTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserQuerySelectorTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserQuerySelectorTask extends Task<\n BrowserQuerySelectorTaskInput,\n BrowserQuerySelectorTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserQuerySelectorTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Query Selector\";\n public static override description =\n \"Queries all elements matching a CSS selector and returns their refs\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserQuerySelectorTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserQuerySelectorTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const refs = await ctx.querySelectorAll(input.selector);\n return { sessionId: input.sessionId, refs: refs as string[] };\n }\n}\n",
27
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Entitlements,\n IExecuteContext,\n Task,\n TaskConfig,\n TaskConfigSchema,\n TaskEntitlements,\n} from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n expression: {\n type: \"string\",\n title: \"Expression\",\n description: \"The JavaScript expression to evaluate in the page context\",\n },\n },\n required: [\"sessionId\", \"expression\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n result: {\n title: \"Result\",\n description: \"The result of the evaluated expression\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserEvaluateTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserEvaluateTaskOutput = { sessionId: string; result: unknown };\n\nexport class BrowserEvaluateTask extends Task<\n BrowserEvaluateTaskInput,\n BrowserEvaluateTaskOutput,\n TaskConfig\n> {\n static override readonly type = \"BrowserEvaluateTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Evaluate\";\n public static override description =\n \"Evaluates a JavaScript expression in the browser page context\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n public static override entitlements(): TaskEntitlements {\n return {\n entitlements: [\n {\n id: Entitlements.BROWSER_CONTROL_EVALUATE,\n reason: \"Evaluates arbitrary JavaScript in the browser context\",\n },\n ],\n };\n }\n\n override async execute(\n input: BrowserEvaluateTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserEvaluateTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const result = await ctx.evaluate(input.expression);\n return { sessionId: input.sessionId, result };\n }\n}\n",
28
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserPressKeyTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n modifiers: {\n type: \"array\",\n items: {\n type: \"string\",\n enum: [\"Alt\", \"Control\", \"Meta\", \"Shift\"],\n },\n title: \"Modifiers\",\n description: \"Keyboard modifiers to hold during the key press\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserPressKeyTaskConfig = TaskConfig & {\n modifiers?: Array<\"Alt\" | \"Control\" | \"Meta\" | \"Shift\">;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n key: {\n type: \"string\",\n title: \"Key\",\n description: \"The key to press (e.g. Enter, Tab, ArrowDown)\",\n },\n },\n required: [\"sessionId\", \"key\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserPressKeyTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserPressKeyTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserPressKeyTask extends Task<\n BrowserPressKeyTaskInput,\n BrowserPressKeyTaskOutput,\n BrowserPressKeyTaskConfig\n> {\n static override readonly type = \"BrowserPressKeyTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Press Key\";\n public static override description =\n \"Presses a keyboard key in the browser, optionally with modifiers\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserPressKeyTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n private buildKeyChord(key: string): string {\n const modifiers = this.config.modifiers?.filter(Boolean) ?? [];\n return modifiers.length > 0 ? `${modifiers.join(\"+\")}+${key}` : key;\n }\n\n override async execute(\n input: BrowserPressKeyTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserPressKeyTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.pressKey(this.buildKeyChord(input.key));\n return { sessionId: input.sessionId };\n }\n}\n",
29
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserTypeTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserTypeTaskConfig = TaskConfig;\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n text: {\n type: \"string\",\n title: \"Text\",\n description: \"The text to type into the currently focused element\",\n },\n },\n required: [\"sessionId\", \"text\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserTypeTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserTypeTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserTypeTask extends Task<\n BrowserTypeTaskInput,\n BrowserTypeTaskOutput,\n BrowserTypeTaskConfig\n> {\n static override readonly type = \"BrowserTypeTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Type\";\n public static override description =\n \"Types text into the currently focused element in the browser\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserTypeTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserTypeTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserTypeTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.type(input.text);\n return { sessionId: input.sessionId };\n }\n}\n",
30
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserScrollTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n x: {\n type: \"number\",\n title: \"X\",\n description: \"Horizontal scroll amount in pixels\",\n default: 0,\n },\n y: {\n type: \"number\",\n title: \"Y\",\n description: \"Vertical scroll amount in pixels\",\n default: 0,\n },\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The element reference to scroll within (scrolls page if not provided)\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserScrollTaskConfig = TaskConfig & {\n x?: number;\n y?: number;\n ref?: string;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserScrollTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserScrollTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserScrollTask extends Task<\n BrowserScrollTaskInput,\n BrowserScrollTaskOutput,\n BrowserScrollTaskConfig\n> {\n static override readonly type = \"BrowserScrollTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Scroll\";\n public static override description =\n \"Scrolls the page or a specific element by the given pixel deltas\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserScrollTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserScrollTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserScrollTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.scroll(this.config.x ?? 0, this.config.y ?? 0, this.config.ref);\n return { sessionId: input.sessionId };\n }\n}\n",
31
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Entitlements,\n IExecuteContext,\n Task,\n TaskConfig,\n TaskConfigSchema,\n TaskEntitlements,\n} from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserUploadTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserUploadTaskConfig = TaskConfig;\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n ref: {\n type: \"string\",\n title: \"Element Ref\",\n description: \"The file input element reference to upload to\",\n },\n filePaths: {\n type: \"array\",\n items: {\n type: \"string\",\n },\n title: \"File Paths\",\n description: \"The local file paths to upload\",\n },\n },\n required: [\"sessionId\", \"ref\", \"filePaths\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserUploadTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserUploadTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserUploadTask extends Task<\n BrowserUploadTaskInput,\n BrowserUploadTaskOutput,\n BrowserUploadTaskConfig\n> {\n static override readonly type = \"BrowserUploadTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Upload\";\n public static override description =\n \"Uploads one or more files to a file input element in the browser\";\n static override readonly cacheable = false;\n\n public static override entitlements(): TaskEntitlements {\n return {\n entitlements: [\n { id: Entitlements.FILESYSTEM_READ, reason: \"Reads local files for upload to browser\" },\n ],\n };\n }\n\n public static override configSchema(): DataPortSchema {\n return browserUploadTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserUploadTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserUploadTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.uploadFile(input.ref, input.filePaths);\n return { sessionId: input.sessionId };\n }\n}\n",
32
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserWaitTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n waitFor: {\n type: \"string\",\n enum: [\"navigation\", \"selector\", \"idle\"],\n title: \"Wait For\",\n description: \"The condition to wait for\",\n default: \"idle\",\n },\n selector: {\n type: \"string\",\n title: \"Selector\",\n description: \"CSS selector to wait for (required when waitFor is 'selector')\",\n },\n timeout: {\n type: \"number\",\n title: \"Timeout\",\n description: \"Maximum time to wait in milliseconds\",\n default: 30000,\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserWaitTaskConfig = TaskConfig & {\n waitFor?: \"navigation\" | \"selector\" | \"idle\";\n selector?: string;\n timeout?: number;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserWaitTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserWaitTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserWaitTask extends Task<\n BrowserWaitTaskInput,\n BrowserWaitTaskOutput,\n BrowserWaitTaskConfig\n> {\n static override readonly type = \"BrowserWaitTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Wait\";\n public static override description =\n \"Waits for a navigation, selector, or network idle state in the browser\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserWaitTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserWaitTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserWaitTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const waitFor = this.config.waitFor ?? \"idle\";\n const timeout = this.config.timeout ?? 30000;\n\n switch (waitFor) {\n case \"navigation\":\n await ctx.waitForNavigation({ timeout });\n break;\n case \"selector\": {\n const selector = this.config.selector;\n if (!selector) {\n throw new Error(\"BrowserWaitTask: selector is required when waitFor is 'selector'\");\n }\n await ctx.waitForSelector(selector, { timeout });\n break;\n }\n case \"idle\":\n await ctx.waitForIdle({ timeout });\n break;\n }\n\n return { sessionId: input.sessionId };\n }\n}\n",
33
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserNewTabTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserNewTabTaskConfig = TaskConfig;\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n url: {\n type: \"string\",\n title: \"URL\",\n description: \"Optional URL to open in the new tab\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n tabId: {\n type: \"string\",\n title: \"Tab ID\",\n description: \"The unique identifier for the new tab\",\n },\n },\n required: [\"sessionId\", \"tabId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserNewTabTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserNewTabTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserNewTabTask extends Task<\n BrowserNewTabTaskInput,\n BrowserNewTabTaskOutput,\n BrowserNewTabTaskConfig\n> {\n static override readonly type = \"BrowserNewTabTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser New Tab\";\n public static override description = \"Opens a new browser tab and returns its tab ID\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserNewTabTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserNewTabTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserNewTabTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const tabInfo = await ctx.newTab(input.url);\n return { sessionId: input.sessionId, tabId: tabInfo.tabId };\n }\n}\n",
34
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserSwitchTabTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserSwitchTabTaskConfig = TaskConfig;\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n tabId: {\n type: \"string\",\n title: \"Tab ID\",\n description: \"The tab ID to switch to\",\n },\n },\n required: [\"sessionId\", \"tabId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserSwitchTabTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserSwitchTabTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserSwitchTabTask extends Task<\n BrowserSwitchTabTaskInput,\n BrowserSwitchTabTaskOutput,\n BrowserSwitchTabTaskConfig\n> {\n static override readonly type = \"BrowserSwitchTabTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Switch Tab\";\n public static override description = \"Switches the active browser tab to the specified tab ID\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserSwitchTabTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserSwitchTabTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserSwitchTabTaskOutput> {\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.switchTab(input.tabId);\n return { sessionId: input.sessionId };\n }\n}\n",
35
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IExecuteContext, Task, TaskConfig, TaskConfigSchema } from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserCloseTabTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n tabId: {\n type: \"string\",\n title: \"Tab ID\",\n description: \"The tab ID to close (closes current tab if not provided)\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserCloseTabTaskConfig = TaskConfig & {\n tabId?: string;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserCloseTabTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserCloseTabTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserCloseTabTask extends Task<\n BrowserCloseTabTaskInput,\n BrowserCloseTabTaskOutput,\n BrowserCloseTabTaskConfig\n> {\n static override readonly type = \"BrowserCloseTabTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Close Tab\";\n public static override description = \"Closes a browser tab by tab ID\";\n static override readonly cacheable = false;\n\n public static override configSchema(): DataPortSchema {\n return browserCloseTabTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n override async execute(\n input: BrowserCloseTabTaskInput,\n _executeContext: IExecuteContext\n ): Promise<BrowserCloseTabTaskOutput> {\n if (!this.config.tabId) {\n throw new Error(\"BrowserCloseTabTask requires config.tabId\");\n }\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n await ctx.closeTab(this.config.tabId);\n return { sessionId: input.sessionId };\n }\n}\n",
36
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Entitlements,\n IExecuteContext,\n mergeEntitlements,\n Task,\n TaskConfig,\n TaskConfigSchema,\n TaskEntitlements,\n} from \"@workglow/task-graph\";\nimport { DataPortSchema, FromSchema } from \"@workglow/util/schema\";\nimport { BrowserSessionRegistry } from \"../BrowserSessionRegistry\";\n\nconst browserLoginTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n mode: {\n type: \"string\",\n enum: [\"manual\", \"credential\", \"ai\"],\n title: \"Login Mode\",\n description: \"The login strategy to use\",\n default: \"manual\",\n },\n credentialName: {\n type: \"string\",\n title: \"Credential Name\",\n description: \"Name of the stored credential to use (required when mode is 'credential')\",\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserLoginTaskConfig = TaskConfig & {\n mode?: \"manual\" | \"credential\" | \"ai\";\n credentialName?: string;\n};\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session to use\",\n },\n url: {\n type: \"string\",\n format: \"uri\",\n title: \"URL\",\n description: \"The login page URL to navigate to\",\n },\n },\n required: [\"sessionId\", \"url\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nconst outputSchema = {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n title: \"Session ID\",\n description: \"The browser session ID\",\n },\n },\n required: [\"sessionId\"],\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type BrowserLoginTaskInput = FromSchema<typeof inputSchema>;\nexport type BrowserLoginTaskOutput = FromSchema<typeof outputSchema>;\n\nexport class BrowserLoginTask extends Task<\n BrowserLoginTaskInput,\n BrowserLoginTaskOutput,\n BrowserLoginTaskConfig\n> {\n static override readonly type = \"BrowserLoginTask\";\n static override readonly category = \"Browser\";\n public static override title = \"Browser Login\";\n public static override description =\n \"Logs into a website using manual, credential, or AI-driven login strategies\";\n static override readonly cacheable = false;\n\n public static override hasDynamicEntitlements = true;\n\n public static override configSchema(): DataPortSchema {\n return browserLoginTaskConfigSchema;\n }\n\n static override inputSchema() {\n return inputSchema;\n }\n\n static override outputSchema() {\n return outputSchema;\n }\n\n public static override entitlements(): TaskEntitlements {\n return {\n entitlements: [\n { id: Entitlements.BROWSER_CONTROL_NAVIGATE, reason: \"Navigates to the login page URL\" },\n ],\n };\n }\n\n public override entitlements(): TaskEntitlements {\n const base = BrowserLoginTask.entitlements();\n if (this.config.mode === \"credential\") {\n return mergeEntitlements(base, {\n entitlements: [\n {\n id: Entitlements.BROWSER_CONTROL_CREDENTIAL,\n reason: \"Accesses stored credentials for login\",\n },\n ],\n });\n }\n return base;\n }\n\n override async execute(\n input: BrowserLoginTaskInput,\n executeContext: IExecuteContext\n ): Promise<BrowserLoginTaskOutput> {\n const parsed = new URL(input.url, \"https://placeholder\");\n if (parsed.protocol === \"javascript:\") {\n throw new Error(\"BrowserLoginTask: javascript: URLs are not allowed\");\n }\n const ctx = BrowserSessionRegistry.get(input.sessionId);\n const mode = this.config.mode ?? \"manual\";\n\n await ctx.navigate(input.url);\n await executeContext.updateProgress(20, \"Navigated to login page\");\n\n switch (mode) {\n case \"manual\":\n await executeContext.updateProgress(50, \"Waiting for manual login...\");\n // Placeholder for future HumanInputTask integration\n break;\n case \"credential\":\n throw new Error(\"Credential-based login mode is not yet implemented\");\n case \"ai\":\n throw new Error(\"AI-driven login mode is not yet implemented\");\n }\n\n return { sessionId: input.sessionId };\n }\n}\n",
37
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { sleep } from \"@workglow/util\";\nimport { CDPBrowserBackend } from \"./CDPBrowserBackend\";\nimport type {\n BrowserConnectOptions,\n ConsoleMessage,\n DialogAction,\n DialogInfo,\n DownloadOptions,\n DownloadResult,\n ElementRef,\n IBrowserContext,\n NavigateOptions,\n NetworkFilter,\n NetworkRequest,\n ScreenshotOptions,\n TabInfo,\n WaitOptions,\n} from \"./IBrowserContext\";\n\n// ---------------------------------------------------------------------------\n// Electron types (not imported at module level — lazy optional dependency)\n// ---------------------------------------------------------------------------\n\n/** @type {import(\"electron\").BrowserWindow} */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyBrowserWindow = any;\n\n/** @type {import(\"electron\").WebContents} */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyWebContents = any;\n\n// ---------------------------------------------------------------------------\n// Lazy Electron loader\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet electronModule: Record<string, any> | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function getElectron(): Promise<Record<string, any>> {\n if (!electronModule) {\n // Dynamic import keeps electron as a true optional dependency.\n // The `Function` cast avoids a static \"cannot find module\" TS error\n // when electron types are not installed in the current environment.\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n electronModule = (await new Function(\"m\", \"return import(m)\")(\"electron\")) as Record<\n string,\n any\n >;\n }\n return electronModule;\n}\n\n// ---------------------------------------------------------------------------\n// ElectronBackend\n// ---------------------------------------------------------------------------\n\n/**\n * IBrowserContext implementation using Electron's native webContents + CDP.\n *\n * This file is only imported from the Electron main process. It must NOT be\n * included in browser/bun/node entry points.\n *\n * Session isolation is achieved via `session.fromPartition(partitionString)`\n * scoped to projectId + profileName.\n */\nexport class ElectronBackend extends CDPBrowserBackend implements IBrowserContext {\n /** @type {AnyBrowserWindow} Electron BrowserWindow instance */\n private _window: AnyBrowserWindow | null = null;\n\n /** @type {AnyWebContents} Electron webContents instance */\n private _webContents: AnyWebContents | null = null;\n\n private _connected = false;\n\n // Dialog handler\n private _dialogHandler: ((info: DialogInfo) => DialogAction | Promise<DialogAction>) | null =\n null;\n\n protected readonly backendName = \"ElectronBackend\";\n\n // ---------------------------------------------------------------------------\n // CDP helper\n // ---------------------------------------------------------------------------\n\n /**\n * Send a Chrome DevTools Protocol command via the Electron debugger.\n * @param method CDP method name (e.g. \"DOM.getBoxModel\")\n * @param params CDP parameters\n */\n protected async cdp(method: string, params: Record<string, unknown> = {}): Promise<unknown> {\n if (!this._webContents) {\n throw new Error(\"ElectronBackend: not connected — call connect() first\");\n }\n return this._webContents.debugger.sendCommand(method, params);\n }\n\n // ---------------------------------------------------------------------------\n // evaluateInPage (abstract from CDPBrowserBackend)\n // ---------------------------------------------------------------------------\n\n protected async evaluateInPage<T>(script: string): Promise<T> {\n return this.wc.executeJavaScript(script);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async connect(options: BrowserConnectOptions = {}): Promise<void> {\n const electron = await getElectron();\n const { BrowserWindow, session: electronSession } = electron;\n\n const { projectId = \"default\", profileName = \"default\", headless = false } = options;\n\n const partitionString = `persist:${projectId}:${profileName}`;\n const sess = electronSession.fromPartition(partitionString);\n\n this._window = new BrowserWindow({\n width: 1280,\n height: 800,\n show: !headless,\n webPreferences: {\n session: sess,\n nodeIntegration: false,\n contextIsolation: true,\n },\n }) as AnyBrowserWindow;\n\n this._webContents = this._window.webContents as AnyWebContents;\n\n // Attach CDP debugger\n try {\n this._webContents.debugger.attach(\"1.3\");\n } catch {\n // Already attached or version not supported — continue\n }\n\n // Enable Accessibility domain\n await this.cdp(\"Accessibility.enable\");\n\n // Wire dialog handler\n this._webContents.on(\n \"select-client-certificate\",\n (_event: unknown, _url: unknown, _list: unknown, callback: (cert: unknown) => void) => {\n callback(undefined);\n }\n );\n\n this._webContents.on(\"will-prevent-unload\", (event: { preventDefault: () => void }) => {\n event.preventDefault();\n });\n\n this._connected = true;\n }\n\n async disconnect(): Promise<void> {\n this._connected = false;\n try {\n if (this._webContents) {\n try {\n this._webContents.debugger.detach();\n } catch {\n // Ignore detach errors\n }\n }\n if (this._window && !this._window.isDestroyed()) {\n this._window.close();\n }\n } finally {\n this._window = null;\n this._webContents = null;\n this._refMap.clear();\n this._refCounter.count = 0;\n }\n }\n\n isConnected(): boolean {\n return this._connected && this._window !== null && !this._window.isDestroyed();\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private get wc(): AnyWebContents {\n if (!this._webContents || !this._connected) {\n throw new Error(\"ElectronBackend: not connected — call connect() first\");\n }\n return this._webContents;\n }\n\n // ---------------------------------------------------------------------------\n // Navigation\n // ---------------------------------------------------------------------------\n\n async navigate(url: string, _options: NavigateOptions = {}): Promise<void> {\n await this.wc.loadURL(url);\n }\n\n async goBack(_options: NavigateOptions = {}): Promise<void> {\n this.wc.navigationHistory.goBack();\n await this.waitForNavigation();\n }\n\n async goForward(_options: NavigateOptions = {}): Promise<void> {\n this.wc.navigationHistory.goForward();\n await this.waitForNavigation();\n }\n\n async reload(_options: NavigateOptions = {}): Promise<void> {\n this.wc.reload();\n await this.waitForNavigation();\n }\n\n async currentUrl(): Promise<string> {\n return this.wc.getURL();\n }\n\n async title(): Promise<string> {\n return this.wc.getTitle();\n }\n\n // ---------------------------------------------------------------------------\n // Content extraction\n // ---------------------------------------------------------------------------\n\n async content(): Promise<string> {\n return this.wc.executeJavaScript(\"document.documentElement.outerHTML\") as Promise<string>;\n }\n\n // ---------------------------------------------------------------------------\n // JS evaluation\n // ---------------------------------------------------------------------------\n\n async evaluate<T>(expression: string): Promise<T> {\n return this.wc.executeJavaScript(expression) as Promise<T>;\n }\n\n // ---------------------------------------------------------------------------\n // Capture\n // ---------------------------------------------------------------------------\n\n async screenshot(options: ScreenshotOptions = {}): Promise<Buffer> {\n const { format = \"png\", quality } = options;\n\n const image = await this.wc.capturePage();\n\n if (format === \"jpeg\") {\n return image.toJPEG(quality ?? 90) as Buffer;\n }\n return image.toPNG() as Buffer;\n }\n\n // ---------------------------------------------------------------------------\n // File operations\n // ---------------------------------------------------------------------------\n\n async download(\n trigger: () => Promise<void>,\n options: DownloadOptions = {}\n ): Promise<DownloadResult> {\n const os = await import(\"node:os\");\n const downloadDir = os.tmpdir();\n const timeout = options.timeout ?? 30_000;\n\n // Set up download behavior via CDP\n await this.cdp(\"Browser.setDownloadBehavior\", {\n behavior: \"allow\",\n downloadPath: downloadDir,\n });\n\n let downloadPath = \"\";\n let suggestedFilename = \"\";\n\n // Listen for download completion.\n // Electron's will-download signature: (event, item, webContents)\n const downloadPromise = new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"ElectronBackend: download timed out\"));\n }, timeout);\n\n const handler = (_event: unknown, item: AnyWebContents, _webContents: unknown) => {\n // item is a DownloadItem\n suggestedFilename = item.getFilename ? item.getFilename() : \"download\";\n item.once?.(\"done\", (_e: unknown, state: string) => {\n clearTimeout(timer);\n if (state === \"completed\") {\n downloadPath = item.getSavePath\n ? item.getSavePath()\n : downloadDir + \"/\" + suggestedFilename;\n }\n resolve();\n });\n };\n this.wc.session.once(\"will-download\", handler);\n });\n\n await trigger();\n await downloadPromise;\n\n if (!downloadPath) {\n throw new Error(\"ElectronBackend: download failed — no path received\");\n }\n\n return { path: downloadPath, suggestedFilename };\n }\n\n // ---------------------------------------------------------------------------\n // Dialogs\n // ---------------------------------------------------------------------------\n\n onDialog(handler: (info: DialogInfo) => DialogAction | Promise<DialogAction>): void {\n this._dialogHandler = handler;\n\n // Use CDP Page.javascriptDialogOpening to intercept alert/confirm/prompt dialogs.\n // This requires Page domain to be enabled.\n void this.cdp(\"Page.enable\").then(() => {\n this.wc.debugger.on(\n \"message\",\n async (_event: unknown, method: string, params: Record<string, unknown>) => {\n if (method !== \"Page.javascriptDialogOpening\") return;\n\n const info: DialogInfo = {\n type: params.type as DialogInfo[\"type\"],\n message: params.message as string,\n defaultValue: (params.defaultPrompt as string) || undefined,\n };\n\n if (this._dialogHandler) {\n const action = await this._dialogHandler(info);\n const accept = action.accept;\n const promptText =\n accept && \"promptText\" in action\n ? (action as { accept: true; promptText?: string }).promptText\n : undefined;\n await this.cdp(\"Page.handleJavaScriptDialog\", {\n accept,\n ...(promptText !== undefined && { promptText }),\n });\n } else {\n await this.cdp(\"Page.handleJavaScriptDialog\", { accept: false });\n }\n }\n );\n });\n }\n\n // ---------------------------------------------------------------------------\n // Tabs (simplified single-window model)\n // ---------------------------------------------------------------------------\n\n async tabs(): Promise<readonly TabInfo[]> {\n const url = this.wc.getURL();\n const title = this.wc.getTitle();\n return [{ tabId: \"0\", url, title }];\n }\n\n async switchTab(_tabId: string): Promise<void> {\n // Single-window model: no-op\n }\n\n async newTab(url?: string): Promise<TabInfo> {\n if (url) {\n await this.navigate(url);\n }\n return {\n tabId: \"0\",\n url: this.wc.getURL(),\n title: this.wc.getTitle(),\n };\n }\n\n async closeTab(_tabId: string): Promise<void> {\n // Single-window model: closing the tab means closing the window\n await this.disconnect();\n }\n\n // ---------------------------------------------------------------------------\n // Wait\n // ---------------------------------------------------------------------------\n\n async waitForNavigation(options: NavigateOptions = {}): Promise<void> {\n const timeout = options.timeout ?? 30_000;\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"ElectronBackend: waitForNavigation timed out\"));\n }, timeout);\n\n this.wc.once(\"did-finish-load\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n async waitForSelector(selector: string, options: WaitOptions = {}): Promise<ElementRef> {\n const timeout = options.timeout ?? 30_000;\n const interval = 100;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const found = await this.wc.executeJavaScript(\n `!!document.querySelector(${JSON.stringify(selector)})`\n );\n if (found) {\n const ref = await this.querySelector(selector);\n if (ref) return ref;\n }\n await sleep(interval);\n }\n\n throw new Error(`ElectronBackend: waitForSelector timed out for \"${selector}\"`);\n }\n\n async waitForIdle(options: WaitOptions = {}): Promise<void> {\n const timeout = options.timeout ?? 30_000;\n const interval = 100;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const ready = await this.wc.executeJavaScript(`document.readyState === \"complete\"`);\n if (ready) return;\n await sleep(interval);\n }\n\n throw new Error(\"ElectronBackend: waitForIdle timed out\");\n }\n\n // ---------------------------------------------------------------------------\n // Optional capabilities\n // ---------------------------------------------------------------------------\n\n readonly networkRequests = (_filter?: NetworkFilter): Promise<readonly NetworkRequest[]> => {\n return Promise.resolve([]);\n };\n\n readonly consoleMessages = (): Promise<readonly ConsoleMessage[]> => {\n return Promise.resolve([]);\n };\n}\n"
38
- ],
39
- "mappings": "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",
40
- "debugId": "F0E5F00740A84F2364756E2164756E21",
41
- "names": []
42
- }