opendevbrowser 0.0.10

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/browser/browser-manager.ts","../src/cache/paths.ts","../src/cache/chrome-locator.ts","../src/cache/downloader.ts","../src/devtools/console-tracker.ts","../src/devtools/network-tracker.ts","../src/export/css-extract.ts","../src/export/dom-capture.ts","../src/export/react-emitter.ts","../src/snapshot/refs.ts","../src/snapshot/snapshotter.ts","../src/browser/session-store.ts","../src/browser/target-manager.ts","../src/browser/script-runner.ts","../src/skills/skill-loader.ts","../src/skills/skill-nudge.ts","../src/skills/continuity-nudge.ts","../src/relay/relay-server.ts","../src/tools/launch.ts","../src/tools/response.ts","../src/tools/connect.ts","../src/tools/disconnect.ts","../src/tools/status.ts","../src/tools/targets_list.ts","../src/tools/target_use.ts","../src/tools/target_new.ts","../src/tools/target_close.ts","../src/tools/page.ts","../src/tools/list.ts","../src/tools/close.ts","../src/tools/goto.ts","../src/tools/wait.ts","../src/tools/snapshot.ts","../src/tools/click.ts","../src/tools/type.ts","../src/tools/select.ts","../src/tools/scroll.ts","../src/tools/dom_get_html.ts","../src/tools/dom_get_text.ts","../src/tools/run.ts","../src/tools/prompting_guide.ts","../src/tools/console_poll.ts","../src/tools/network_poll.ts","../src/tools/clone_page.ts","../src/tools/clone_component.ts","../src/tools/perf.ts","../src/tools/screenshot.ts","../src/tools/skill_list.ts","../src/tools/skill_load.ts","../src/tools/index.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { parse as parseJsonc } from \"jsonc-parser\";\nimport { generateSecureToken } from \"./utils/crypto\";\n\nfunction isExecutable(filePath: string): boolean {\n try {\n fs.accessSync(filePath, fs.constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport type SnapshotConfig = {\n maxChars: number;\n maxNodes: number;\n};\n\nexport type SecurityConfig = {\n allowRawCDP: boolean;\n allowNonLocalCdp: boolean;\n allowUnsafeExport: boolean;\n};\n\nexport type DevtoolsConfig = {\n showFullUrls: boolean;\n showFullConsole: boolean;\n};\n\nexport type ExportConfig = {\n maxNodes: number;\n inlineStyles: boolean;\n};\n\nexport type SkillsNudgeConfig = {\n enabled: boolean;\n keywords: string[];\n maxAgeMs: number;\n};\n\nexport type SkillsConfig = {\n nudge: SkillsNudgeConfig;\n};\n\nexport type ContinuityNudgeConfig = {\n enabled: boolean;\n keywords: string[];\n maxAgeMs: number;\n};\n\nexport type ContinuityConfig = {\n enabled: boolean;\n filePath: string;\n nudge: ContinuityNudgeConfig;\n};\n\nexport type OpenDevBrowserConfig = {\n headless: boolean;\n profile: string;\n snapshot: SnapshotConfig;\n security: SecurityConfig;\n devtools: DevtoolsConfig;\n export: ExportConfig;\n skills: SkillsConfig;\n continuity: ContinuityConfig;\n relayPort: number;\n relayToken: string | false;\n chromePath?: string;\n flags: string[];\n checkForUpdates: boolean;\n persistProfile: boolean;\n skillPaths: string[];\n};\n\nconst DEFAULT_RELAY_PORT = 8787;\n\nfunction buildDefaultConfigJsonc(token: string): string {\n return `{\n // Set relayToken to false to disable extension pairing.\n \"relayPort\": ${DEFAULT_RELAY_PORT},\n \"relayToken\": \"${token}\"\n}\n`;\n}\n\nconst snapshotSchema = z.object({\n maxChars: z.number().int().min(500).max(200000).default(16000),\n maxNodes: z.number().int().min(50).max(5000).default(1000)\n});\n\nconst securitySchema = z.object({\n allowRawCDP: z.boolean().default(false),\n allowNonLocalCdp: z.boolean().default(false),\n allowUnsafeExport: z.boolean().default(false)\n});\n\nconst devtoolsSchema = z.object({\n showFullUrls: z.boolean().default(false),\n showFullConsole: z.boolean().default(false)\n});\n\nconst exportSchema = z.object({\n maxNodes: z.number().int().min(1).max(5000).default(1000),\n inlineStyles: z.boolean().default(true)\n});\n\nconst skillsNudgeSchema = z.object({\n enabled: z.boolean().default(true),\n keywords: z.array(z.string()).default([\n \"login\",\n \"sign in\",\n \"sign-in\",\n \"auth\",\n \"authentication\",\n \"mfa\",\n \"form\",\n \"submit\",\n \"validation\",\n \"extract\",\n \"scrape\",\n \"scraping\",\n \"table\",\n \"pagination\",\n \"crawl\"\n ]),\n maxAgeMs: z.number().int().min(1000).max(600000).default(60000)\n});\n\nconst skillsSchema = z.object({\n nudge: skillsNudgeSchema.default({})\n}).default({});\n\nconst continuityNudgeSchema = z.object({\n enabled: z.boolean().default(true),\n keywords: z.array(z.string()).default([\n \"plan\",\n \"multi-step\",\n \"multi step\",\n \"long-running\",\n \"long running\",\n \"refactor\",\n \"migration\",\n \"rollout\",\n \"release\",\n \"upgrade\",\n \"investigate\",\n \"follow-up\",\n \"continue\"\n ]),\n maxAgeMs: z.number().int().min(1000).max(600000).default(60000)\n});\n\nconst continuitySchema = z.object({\n enabled: z.boolean().default(true),\n filePath: z.string().min(1).default(\"opendevbrowser_continuity.md\"),\n nudge: continuityNudgeSchema.default({})\n}).default({});\n\nconst configSchema = z.object({\n headless: z.boolean().default(false),\n profile: z.string().min(1).default(\"default\"),\n snapshot: snapshotSchema.default({}),\n security: securitySchema.default({}),\n devtools: devtoolsSchema.default({}),\n export: exportSchema.default({}),\n skills: skillsSchema.default({}),\n continuity: continuitySchema.default({}),\n relayPort: z.number().int().min(0).max(65535).default(DEFAULT_RELAY_PORT),\n relayToken: z.union([z.string(), z.literal(false)]).optional(),\n chromePath: z.string().min(1).optional().refine(\n (val) => val === undefined || isExecutable(val),\n { message: \"chromePath must point to an executable file\" }\n ),\n flags: z.array(z.string()).default([]),\n checkForUpdates: z.boolean().default(false),\n persistProfile: z.boolean().default(true),\n skillPaths: z.array(z.string()).default([])\n});\n\nconst CONFIG_FILE_NAME = \"opendevbrowser.jsonc\";\n\nfunction getGlobalConfigPath(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, CONFIG_FILE_NAME);\n}\n\nfunction ensureConfigFile(filePath: string): string {\n const token = generateSecureToken();\n if (fs.existsSync(filePath)) {\n return token;\n }\n try {\n fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });\n fs.writeFileSync(filePath, buildDefaultConfigJsonc(token), { encoding: \"utf-8\", mode: 0o600 });\n } catch (error) {\n console.warn(`[opendevbrowser] Warning: Could not create config file at ${filePath}:`, error);\n }\n return token;\n}\n\nfunction loadConfigFile(filePath: string): { raw: unknown; generatedToken: string | null } {\n if (!fs.existsSync(filePath)) {\n const token = ensureConfigFile(filePath);\n return { raw: {}, generatedToken: token };\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n const errors: Array<{ error: number; offset: number; length: number }> = [];\n const parsed = parseJsonc(content, errors, { allowTrailingComma: true });\n if (errors.length > 0) {\n const firstError = errors[0];\n throw new Error(`Invalid JSONC in opendevbrowser config at ${filePath}: parse error at offset ${firstError?.offset ?? 0}`);\n }\n return { raw: parsed ?? {}, generatedToken: null };\n}\n\nexport function loadGlobalConfig(): OpenDevBrowserConfig {\n const configPath = getGlobalConfigPath();\n const { raw, generatedToken } = loadConfigFile(configPath);\n const parsed = configSchema.safeParse(raw);\n\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => issue.message).join(\"; \");\n throw new Error(`Invalid opendevbrowser config at ${configPath}: ${issues}`);\n }\n\n const data = parsed.data;\n const relayToken = data.relayToken ?? generatedToken ?? generateSecureToken();\n\n return { ...data, relayToken };\n}\n\nexport function resolveConfig(_config: unknown): OpenDevBrowserConfig {\n return loadGlobalConfig();\n}\n\nexport class ConfigStore {\n private current: OpenDevBrowserConfig;\n\n constructor(initial: OpenDevBrowserConfig) {\n this.current = initial;\n }\n\n get(): OpenDevBrowserConfig {\n return this.current;\n }\n\n set(next: OpenDevBrowserConfig): void {\n this.current = next;\n }\n}\n","import { randomUUID } from \"crypto\";\nimport { mkdir, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { chromium, type Browser, type BrowserContext, type Page } from \"playwright-core\";\nimport { Mutex } from \"async-mutex\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { resolveCachePaths } from \"../cache/paths\";\nimport { findChromeExecutable } from \"../cache/chrome-locator\";\nimport { downloadChromeForTesting } from \"../cache/downloader\";\nimport { ConsoleTracker } from \"../devtools/console-tracker\";\nimport { NetworkTracker } from \"../devtools/network-tracker\";\nimport { captureDom } from \"../export/dom-capture\";\nimport { extractCss } from \"../export/css-extract\";\nimport { emitReactComponent, type ReactExport } from \"../export/react-emitter\";\nimport { RefStore } from \"../snapshot/refs\";\nimport { Snapshotter } from \"../snapshot/snapshotter\";\nimport { SessionStore, type BrowserMode } from \"./session-store\";\nimport { TargetManager, type TargetInfo } from \"./target-manager\";\n\nexport type LaunchOptions = {\n profile?: string;\n headless?: boolean;\n startUrl?: string;\n chromePath?: string;\n flags?: string[];\n persistProfile?: boolean;\n};\n\nexport type ConnectOptions = {\n wsEndpoint?: string;\n host?: string;\n port?: number;\n};\n\nexport type ManagedSession = {\n sessionId: string;\n mode: BrowserMode;\n browser: Browser;\n context: BrowserContext;\n profileDir: string;\n persistProfile: boolean;\n targets: TargetManager;\n refStore: RefStore;\n snapshotter: Snapshotter;\n consoleTracker: ConsoleTracker;\n networkTracker: NetworkTracker;\n};\n\nexport class BrowserManager {\n private store = new SessionStore();\n private sessions = new Map<string, ManagedSession>();\n private sessionMutexes = new Map<string, Mutex>();\n private worktree: string;\n private config: OpenDevBrowserConfig;\n private pageListeners = new WeakMap<Page, () => void>();\n\n constructor(worktree: string, config: OpenDevBrowserConfig) {\n this.worktree = worktree;\n this.config = config;\n }\n\n private getMutex(sessionId: string): Mutex {\n let mutex = this.sessionMutexes.get(sessionId);\n if (!mutex) {\n mutex = new Mutex();\n this.sessionMutexes.set(sessionId, mutex);\n }\n return mutex;\n }\n\n updateConfig(config: OpenDevBrowserConfig): void {\n this.config = config;\n for (const managed of this.sessions.values()) {\n managed.consoleTracker.setOptions({ showFullConsole: config.devtools.showFullConsole });\n managed.networkTracker.setOptions({ showFullUrls: config.devtools.showFullUrls });\n }\n }\n\n async launch(options: LaunchOptions): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n const resolvedProfile = options.profile ?? this.config.profile;\n const resolvedHeadless = options.headless ?? this.config.headless;\n const persistProfile = options.persistProfile ?? this.config.persistProfile;\n\n const cachePaths = await resolveCachePaths(this.worktree, resolvedProfile);\n const executable = await findChromeExecutable(options.chromePath ?? this.config.chromePath);\n const warnings: string[] = [];\n\n let executablePath = executable;\n if (!executablePath) {\n const download = await downloadChromeForTesting(cachePaths.chromeDir);\n warnings.push(\"System Chrome not found. Downloaded Chrome for Testing.\");\n executablePath = download.executablePath;\n }\n\n const profileDir = persistProfile\n ? cachePaths.profileDir\n : join(cachePaths.projectRoot, \"temp-profiles\", randomUUID());\n\n await mkdir(profileDir, { recursive: true });\n\n let context: BrowserContext | null = null;\n\n try {\n context = await chromium.launchPersistentContext(profileDir, {\n headless: resolvedHeadless,\n executablePath: executablePath ?? undefined,\n args: options.flags ?? this.config.flags,\n viewport: null\n });\n\n const browser = context.browser();\n if (!browser) {\n throw new Error(\"Browser instance unavailable\");\n }\n const sessionId = randomUUID();\n const targets = new TargetManager();\n const pages = context.pages();\n\n if (pages.length === 0) {\n const page = await context.newPage();\n targets.registerPage(page);\n } else {\n targets.registerExistingPages(pages);\n }\n\n const activeTargetId = targets.getActiveTargetId();\n\n if (options.startUrl && activeTargetId) {\n await this.goto(sessionId, options.startUrl, \"load\", 30000, { browser, context, targets });\n }\n\n const refStore = new RefStore();\n const snapshotter = new Snapshotter(refStore);\n const consoleTracker = new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole });\n const networkTracker = new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls });\n\n const managed: ManagedSession = {\n sessionId,\n mode: \"A\",\n browser,\n context,\n profileDir,\n persistProfile,\n targets,\n refStore,\n snapshotter,\n consoleTracker,\n networkTracker\n };\n\n this.store.add({ id: sessionId, mode: \"A\", browser, context });\n this.sessions.set(sessionId, managed);\n\n this.attachTrackers(managed);\n this.attachRefInvalidation(managed);\n\n const wsEndpointProvider = browser as unknown as { wsEndpoint?: () => string };\n const wsEndpoint = typeof wsEndpointProvider.wsEndpoint === \"function\"\n ? wsEndpointProvider.wsEndpoint()\n : undefined;\n\n return { sessionId, mode: \"A\", activeTargetId, warnings, wsEndpoint: wsEndpoint || undefined };\n } catch (error) {\n const launchMessage = error instanceof Error ? error.message : \"Unknown error\";\n const cleanupErrors: unknown[] = [];\n\n if (context) {\n try {\n await context.close();\n } catch (closeError) {\n cleanupErrors.push(closeError);\n }\n }\n\n if (!persistProfile) {\n try {\n await rm(profileDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n [error, ...cleanupErrors],\n `Failed to launch browser context: ${launchMessage}. Cleanup failed.`\n );\n }\n\n throw new Error(`Failed to launch browser context: ${launchMessage}`, { cause: error });\n }\n }\n\n async connect(options: ConnectOptions): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n const wsEndpoint = await this.resolveWsEndpoint(options);\n return this.connectWithEndpoint(wsEndpoint, \"B\");\n }\n\n async connectRelay(wsEndpoint: string): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n this.ensureLocalEndpoint(wsEndpoint);\n return this.connectWithEndpoint(wsEndpoint, \"C\");\n }\n\n async closeAll(): Promise<void> {\n const sessions = Array.from(this.sessions.keys());\n await Promise.allSettled(sessions.map(id => this.disconnect(id, true)));\n }\n\n async disconnect(sessionId: string, closeBrowser = false): Promise<void> {\n const managed = this.getManaged(sessionId);\n const cleanupErrors: unknown[] = [];\n\n try {\n for (const entry of managed.targets.listPageEntries()) {\n const cleanup = this.pageListeners.get(entry.page);\n if (cleanup) {\n try {\n cleanup();\n } catch (error) {\n cleanupErrors.push(error);\n }\n this.pageListeners.delete(entry.page);\n }\n }\n\n try {\n if (closeBrowser) {\n await managed.browser.close();\n } else {\n await managed.context.close();\n }\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n managed.consoleTracker.detach();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n managed.networkTracker.detach();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n if (!managed.persistProfile && managed.profileDir) {\n try {\n await rm(managed.profileDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });\n } catch (error) {\n cleanupErrors.push(error);\n }\n }\n } finally {\n this.sessions.delete(sessionId);\n this.sessionMutexes.delete(sessionId);\n this.store.delete(sessionId);\n }\n\n if (cleanupErrors.length === 1) {\n throw cleanupErrors[0];\n }\n if (cleanupErrors.length > 1) {\n throw new AggregateError(cleanupErrors, \"Failed to disconnect browser session.\");\n }\n }\n\n async status(sessionId: string): Promise<{ mode: BrowserMode; activeTargetId: string | null; url?: string; title?: string }> {\n const managed = this.getManaged(sessionId);\n const activeTargetId = managed.targets.getActiveTargetId();\n const page = activeTargetId ? managed.targets.getPage(activeTargetId) : null;\n const title = await this.safePageTitle(page, \"BrowserManager.status\");\n const url = this.safePageUrl(page, \"BrowserManager.status\");\n\n return {\n mode: managed.mode,\n activeTargetId,\n url,\n title\n };\n }\n\n async listTargets(sessionId: string, includeUrls = false): Promise<{ activeTargetId: string | null; targets: TargetInfo[] }> {\n const managed = this.getManaged(sessionId);\n const targets = await managed.targets.listTargets(includeUrls);\n return {\n activeTargetId: managed.targets.getActiveTargetId(),\n targets\n };\n }\n\n async page(sessionId: string, name: string, url?: string): Promise<{ targetId: string; created: boolean; url?: string; title?: string }> {\n const managed = this.getManaged(sessionId);\n const existingTargetId = managed.targets.getTargetIdByName(name);\n let targetId = existingTargetId;\n let created = false;\n\n if (targetId) {\n managed.targets.setActiveTarget(targetId);\n } else {\n const page = await managed.context.newPage();\n targetId = managed.targets.registerPage(page, name);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n created = true;\n }\n\n this.attachTrackers(managed);\n\n if (url) {\n await this.goto(sessionId, url, \"load\", 30000);\n }\n\n const page = managed.targets.getPage(targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.page\");\n const finalUrl = this.safePageUrl(page, \"BrowserManager.page\");\n\n return { targetId, created, url: finalUrl, title };\n }\n\n async listPages(sessionId: string): Promise<{ pages: Array<{ name: string; targetId: string; url?: string; title?: string }> }> {\n const managed = this.getManaged(sessionId);\n const named = managed.targets.listNamedTargets();\n const pages: Array<{ name: string; targetId: string; url?: string; title?: string }> = [];\n\n for (const entry of named) {\n const page = managed.targets.getPage(entry.targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.listPages\");\n const url = this.safePageUrl(page, \"BrowserManager.listPages\");\n pages.push({ name: entry.name, targetId: entry.targetId, url, title });\n }\n\n return { pages };\n }\n\n async closePage(sessionId: string, name: string): Promise<void> {\n const managed = this.getManaged(sessionId);\n const targetId = managed.targets.getTargetIdByName(name);\n if (!targetId) {\n throw new Error(`Unknown page name: ${name}`);\n }\n await managed.targets.closeTarget(targetId);\n managed.refStore.clearTarget(targetId);\n this.attachTrackers(managed);\n }\n\n async useTarget(sessionId: string, targetId: string): Promise<{ activeTargetId: string; url?: string; title?: string }> {\n const managed = this.getManaged(sessionId);\n managed.targets.setActiveTarget(targetId);\n this.attachTrackers(managed);\n\n const page = managed.targets.getPage(targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.useTarget\");\n\n return {\n activeTargetId: targetId,\n url: this.safePageUrl(page, \"BrowserManager.useTarget\"),\n title\n };\n }\n\n async newTarget(sessionId: string, url?: string): Promise<{ targetId: string }> {\n const managed = this.getManaged(sessionId);\n const page = await managed.context.newPage();\n const targetId = managed.targets.registerPage(page);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n if (url) {\n await page.goto(url, { waitUntil: \"load\" });\n }\n this.attachTrackers(managed);\n return { targetId };\n }\n\n async closeTarget(sessionId: string, targetId: string): Promise<void> {\n const managed = this.getManaged(sessionId);\n await managed.targets.closeTarget(targetId);\n managed.refStore.clearTarget(targetId);\n this.attachTrackers(managed);\n }\n\n async goto(sessionId: string, url: string, waitUntil: \"domcontentloaded\" | \"load\" | \"networkidle\" = \"load\", timeoutMs = 30000, sessionOverride?: { browser: Browser; context: BrowserContext; targets: TargetManager }): Promise<{ finalUrl?: string; status?: number; timingMs: number }> {\n const startTime = Date.now();\n const managed = sessionOverride ? this.buildOverrideSession(sessionOverride) : this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n const response = await page.goto(url, { waitUntil, timeout: timeoutMs });\n\n return {\n finalUrl: page.url(),\n status: response?.status(),\n timingMs: Date.now() - startTime\n };\n }\n\n async waitForLoad(sessionId: string, until: \"domcontentloaded\" | \"load\" | \"networkidle\", timeoutMs = 30000): Promise<{ timingMs: number }> {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n await page.waitForLoadState(until, { timeout: timeoutMs });\n return { timingMs: Date.now() - startTime };\n }\n\n async waitForRef(sessionId: string, ref: string, state: \"attached\" | \"visible\" | \"hidden\" = \"attached\", timeoutMs = 30000): Promise<{ timingMs: number }> {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const page = managed.targets.getActivePage();\n await page.locator(selector).waitFor({ state, timeout: timeoutMs });\n return { timingMs: Date.now() - startTime };\n }\n\n async snapshot(sessionId: string, mode: \"outline\" | \"actionables\", maxChars: number, cursor?: string): Promise<ReturnType<Snapshotter[\"snapshot\"]>> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const managed = this.getManaged(sessionId);\n const targetId = managed.targets.getActiveTargetId();\n if (!targetId) {\n throw new Error(\"No active target for snapshot\");\n }\n const page = managed.targets.getActivePage();\n return managed.snapshotter.snapshot(page, targetId, {\n mode,\n maxChars,\n cursor,\n maxNodes: this.config.snapshot.maxNodes\n });\n });\n }\n\n async click(sessionId: string, ref: string): Promise<{ timingMs: number; navigated: boolean }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const page = managed.targets.getActivePage();\n const previousUrl = page.url();\n await page.locator(selector).click();\n const navigated = page.url() !== previousUrl;\n return { timingMs: Date.now() - startTime, navigated };\n });\n }\n\n async type(sessionId: string, ref: string, text: string, clear = false, submit = false): Promise<{ timingMs: number }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const locator = managed.targets.getActivePage().locator(selector);\n if (clear) {\n await locator.fill(\"\");\n }\n await locator.fill(text);\n if (submit) {\n await locator.press(\"Enter\");\n }\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async select(sessionId: string, ref: string, values: string[]): Promise<void> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n await managed.targets.getActivePage().locator(selector).selectOption(values);\n }\n\n async scroll(sessionId: string, dy: number, ref?: string): Promise<void> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n if (ref) {\n const selector = this.resolveSelector(managed, ref);\n await page.locator(selector).evaluate((el, delta) => {\n (el as HTMLElement).scrollBy(0, delta as number);\n }, dy);\n } else {\n await page.mouse.wheel(0, dy);\n }\n }\n\n async domGetHtml(sessionId: string, ref: string, maxChars = 8000): Promise<{ outerHTML: string; truncated: boolean }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const html = await managed.targets.getActivePage().$eval(selector, (el) => (el as Element).outerHTML);\n return truncateHtml(html, maxChars);\n }\n\n async domGetText(sessionId: string, ref: string, maxChars = 8000): Promise<{ text: string; truncated: boolean }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const text = await managed.targets.getActivePage().$eval(selector, (el) => (el as HTMLElement).innerText || el.textContent || \"\");\n return truncateText(text, maxChars);\n }\n\n async clonePage(sessionId: string): Promise<ReactExport> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n const allowUnsafeExport = this.config.security.allowUnsafeExport;\n const exportConfig = this.config.export;\n const capture = await captureDom(page, \"body\", {\n sanitize: !allowUnsafeExport,\n maxNodes: exportConfig.maxNodes,\n inlineStyles: exportConfig.inlineStyles\n });\n const css = extractCss(capture);\n return emitReactComponent(capture, css, { allowUnsafeExport });\n }\n\n async cloneComponent(sessionId: string, ref: string): Promise<ReactExport> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const allowUnsafeExport = this.config.security.allowUnsafeExport;\n const exportConfig = this.config.export;\n const capture = await captureDom(managed.targets.getActivePage(), selector, {\n sanitize: !allowUnsafeExport,\n maxNodes: exportConfig.maxNodes,\n inlineStyles: exportConfig.inlineStyles\n });\n const css = extractCss(capture);\n return emitReactComponent(capture, css, { allowUnsafeExport });\n }\n\n async perfMetrics(sessionId: string): Promise<{ metrics: Array<{ name: string; value: number }> }> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n const session = await managed.context.newCDPSession(page);\n const result = await session.send(\"Performance.getMetrics\") as { metrics?: Array<{ name: string; value: number }> };\n await session.detach();\n const metrics = Array.isArray(result.metrics) ? result.metrics : [];\n return { metrics };\n }\n\n async screenshot(sessionId: string, path?: string): Promise<{ path?: string; base64?: string }> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n if (path) {\n await page.screenshot({ path, type: \"png\" });\n return { path };\n }\n const buffer = await page.screenshot({ type: \"png\" });\n return { base64: buffer.toString(\"base64\") };\n }\n\n consolePoll(sessionId: string, sinceSeq?: number, max = 50): { events: ReturnType<ConsoleTracker[\"poll\"]>[\"events\"]; nextSeq: number } {\n const managed = this.getManaged(sessionId);\n return managed.consoleTracker.poll(sinceSeq, max);\n }\n\n networkPoll(sessionId: string, sinceSeq?: number, max = 50): { events: ReturnType<NetworkTracker[\"poll\"]>[\"events\"]; nextSeq: number } {\n const managed = this.getManaged(sessionId);\n return managed.networkTracker.poll(sinceSeq, max);\n }\n\n private buildOverrideSession(input: { browser: Browser; context: BrowserContext; targets: TargetManager }): ManagedSession {\n const refStore = new RefStore();\n return {\n sessionId: \"override\",\n mode: \"A\",\n browser: input.browser,\n context: input.context,\n profileDir: \"\",\n persistProfile: true,\n targets: input.targets,\n refStore,\n snapshotter: new Snapshotter(refStore),\n consoleTracker: new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole }),\n networkTracker: new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls })\n };\n }\n\n private getManaged(sessionId: string): ManagedSession {\n const managed = this.sessions.get(sessionId);\n if (!managed) {\n throw new Error(`Unknown sessionId: ${sessionId}`);\n }\n return managed;\n }\n\n private resolveSelector(managed: ManagedSession, ref: string): string {\n const targetId = managed.targets.getActiveTargetId();\n if (!targetId) {\n throw new Error(\"No active target for ref resolution\");\n }\n const entry = managed.refStore.resolve(targetId, ref);\n if (!entry) {\n throw new Error(`Unknown ref: ${ref}. Take a new snapshot first.`);\n }\n return entry.selector;\n }\n\n private async safePageTitle(page: Page | null, context: string): Promise<string | undefined> {\n if (!page) return undefined;\n try {\n return await page.title();\n } catch {\n console.warn(`${context}: failed to read page title`);\n return undefined;\n }\n }\n\n private safePageUrl(page: Page | null, context: string): string | undefined {\n if (!page) return undefined;\n try {\n return page.url();\n } catch {\n console.warn(`${context}: failed to read page url`);\n return undefined;\n }\n }\n\n private attachTrackers(managed: ManagedSession): void {\n const activeTargetId = managed.targets.getActiveTargetId();\n if (!activeTargetId) return;\n const page = managed.targets.getActivePage();\n managed.consoleTracker.attach(page);\n managed.networkTracker.attach(page);\n }\n\n private attachRefInvalidation(managed: ManagedSession): void {\n const entries = managed.targets.listPageEntries();\n for (const entry of entries) {\n this.attachRefInvalidationForPage(managed, entry.targetId, entry.page);\n }\n }\n\n private attachRefInvalidationForPage(managed: ManagedSession, targetId: string, page: Page): void {\n if (this.pageListeners.has(page)) return;\n\n const onNavigate = (frame: { parentFrame: () => unknown }) => {\n if (frame.parentFrame() === null) {\n managed.refStore.clearTarget(targetId);\n }\n };\n\n const onClose = () => {\n managed.refStore.clearTarget(targetId);\n };\n\n page.on(\"framenavigated\", onNavigate);\n page.on(\"close\", onClose);\n\n this.pageListeners.set(page, () => {\n page.off(\"framenavigated\", onNavigate);\n page.off(\"close\", onClose);\n });\n }\n\n private async resolveWsEndpoint(options: ConnectOptions): Promise<string> {\n if (options.wsEndpoint) {\n this.ensureLocalEndpoint(options.wsEndpoint);\n return options.wsEndpoint;\n }\n\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 9222;\n const url = `http://${host}:${port}/json/version`;\n this.ensureLocalEndpoint(url);\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch CDP endpoint from ${url}`);\n }\n\n const data = await response.json() as { webSocketDebuggerUrl?: string };\n if (!data.webSocketDebuggerUrl) {\n throw new Error(\"webSocketDebuggerUrl missing from /json/version response\");\n }\n\n this.ensureLocalEndpoint(data.webSocketDebuggerUrl);\n\n return data.webSocketDebuggerUrl;\n }\n\n private ensureLocalEndpoint(endpoint: string): void {\n if (this.config.security.allowNonLocalCdp) return;\n \n const ALLOWED_PROTOCOLS = new Set([\"ws:\", \"wss:\", \"http:\", \"https:\"]);\n const LOCAL_HOSTNAMES = new Set([\"localhost\", \"127.0.0.1\", \"::1\", \"[::1]\"]);\n \n let parsed: URL;\n try {\n parsed = new URL(endpoint);\n } catch {\n throw new Error(\"Invalid CDP endpoint URL.\");\n }\n \n if (!ALLOWED_PROTOCOLS.has(parsed.protocol)) {\n throw new Error(`Disallowed protocol \"${parsed.protocol}\" for CDP endpoint. Allowed: ws, wss, http, https.`);\n }\n \n const hostname = parsed.hostname.toLowerCase();\n if (!LOCAL_HOSTNAMES.has(hostname) && !hostname.toLowerCase().startsWith(\"::ffff:127.\")) {\n throw new Error(\"Non-local CDP endpoints are disabled by default.\");\n }\n }\n\n private async connectWithEndpoint(wsEndpoint: string, mode: BrowserMode): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n const browser = await chromium.connectOverCDP(wsEndpoint);\n const contexts = browser.contexts();\n const context = contexts[0] ?? await browser.newContext();\n\n const sessionId = randomUUID();\n const targets = new TargetManager();\n const pages = context.pages();\n\n if (pages.length === 0) {\n const page = await context.newPage();\n targets.registerPage(page);\n } else {\n targets.registerExistingPages(pages);\n }\n\n const refStore = new RefStore();\n const snapshotter = new Snapshotter(refStore);\n const consoleTracker = new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole });\n const networkTracker = new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls });\n\n const managed: ManagedSession = {\n sessionId,\n mode,\n browser,\n context,\n profileDir: \"\",\n persistProfile: true,\n targets,\n refStore,\n snapshotter,\n consoleTracker,\n networkTracker\n };\n\n this.store.add({ id: sessionId, mode, browser, context });\n this.sessions.set(sessionId, managed);\n this.attachTrackers(managed);\n this.attachRefInvalidation(managed);\n\n return { sessionId, mode, activeTargetId: targets.getActiveTargetId(), warnings: [], wsEndpoint };\n }\n}\n\nfunction truncateHtml(value: string, maxChars: number): { outerHTML: string; truncated: boolean } {\n if (value.length <= maxChars) {\n return { outerHTML: value, truncated: false };\n }\n return { outerHTML: value.slice(0, maxChars), truncated: true };\n}\n\nfunction truncateText(value: string, maxChars: number): { text: string; truncated: boolean } {\n if (value.length <= maxChars) {\n return { text: value, truncated: false };\n }\n return { text: value.slice(0, maxChars), truncated: true };\n}\n","import { createHash } from \"crypto\";\nimport { mkdir, stat } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nexport type CachePaths = {\n root: string;\n projectRoot: string;\n profileDir: string;\n chromeDir: string;\n};\n\nfunction safeHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16);\n}\n\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveCachePaths(worktree: string, profile: string): Promise<CachePaths> {\n const base = process.env.OPENCODE_CACHE_DIR\n ?? process.env.XDG_CACHE_HOME\n ?? join(homedir(), \".cache\");\n const root = join(base, \"opendevbrowser\");\n const projectRoot = join(root, \"projects\", safeHash(worktree));\n const profileDir = join(projectRoot, \"profiles\", profile);\n const chromeDir = join(root, \"chrome\");\n\n await ensureDir(root);\n await ensureDir(projectRoot);\n await ensureDir(profileDir);\n await ensureDir(chromeDir);\n\n return { root, projectRoot, profileDir, chromeDir };\n}\n\nexport async function ensureFileAbsent(path: string): Promise<void> {\n if (await exists(path)) {\n throw new Error(`Path already exists: ${path}`);\n }\n}\n","import { access } from \"fs/promises\";\nimport { delimiter, join } from \"path\";\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathCandidatesByPlatform(): string[] {\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n return [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\"\n ];\n }\n\n if (platform === \"win32\") {\n const programFiles = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const programFilesX86 = process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const localAppData = process.env.LOCALAPPDATA || \"\";\n\n return [\n join(programFiles, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\")\n ];\n }\n\n return [];\n}\n\nfunction binaryCandidatesInPath(): string[] {\n return [\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium\",\n \"chromium-browser\"\n ];\n}\n\nasync function findInPath(binary: string): Promise<string | null> {\n const pathValue = process.env.PATH;\n if (!pathValue) return null;\n\n const candidates = process.platform === \"win32\" ? [binary, `${binary}.exe`] : [binary];\n for (const dir of pathValue.split(delimiter)) {\n for (const name of candidates) {\n const fullPath = join(dir, name);\n if (await pathExists(fullPath)) return fullPath;\n }\n }\n\n return null;\n}\n\nexport async function findChromeExecutable(overridePath?: string): Promise<string | null> {\n if (overridePath && await pathExists(overridePath)) {\n return overridePath;\n }\n\n for (const candidate of pathCandidatesByPlatform()) {\n if (await pathExists(candidate)) return candidate;\n }\n\n for (const binary of binaryCandidatesInPath()) {\n const found = await findInPath(binary);\n if (found) return found;\n }\n\n return null;\n}\n","import { Browser, detectBrowserPlatform, install, resolveBuildId } from \"@puppeteer/browsers\";\n\nexport type DownloadResult = {\n executablePath: string;\n buildId: string;\n};\n\nexport async function downloadChromeForTesting(cacheDir: string): Promise<DownloadResult> {\n const platform = detectBrowserPlatform();\n if (!platform) {\n throw new Error(\"Unsupported platform for Chrome download\");\n }\n\n const buildId = await resolveBuildId(Browser.CHROME, platform, \"latest\");\n const result = await install({\n browser: Browser.CHROME,\n buildId,\n cacheDir,\n downloadProgressCallback: () => undefined\n });\n\n return {\n executablePath: result.executablePath,\n buildId\n };\n}\n","import type { Page } from \"playwright-core\";\n\nconst JWT_PATTERN = /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g;\nconst TOKEN_LIKE_PATTERN = /\\b[A-Za-z0-9_-]{16,}\\b/g;\nconst API_KEY_PREFIX_PATTERN = /\\b(sk_|pk_|api_|key_|token_|secret_|bearer_)[A-Za-z0-9_-]+\\b/gi;\nconst SENSITIVE_KV_PATTERN = /\\b(token|key|secret|password|auth|bearer|credential)[=:]\\s*\\S+/gi;\n\nfunction shouldRedactToken(token: string): boolean {\n if (/^(sk_|pk_|api_|key_|token_|secret_|bearer_)/i.test(token)) {\n return true;\n }\n const categories = [\n /[a-z]/.test(token),\n /[A-Z]/.test(token),\n /\\d/.test(token),\n /[_-]/.test(token)\n ].filter(Boolean).length;\n return categories >= 2;\n}\n\nfunction redactText(text: string): string {\n let result = text.replace(SENSITIVE_KV_PATTERN, (match) => {\n const sepIndex = match.search(/[=:]/);\n return match.slice(0, sepIndex + 1) + \"[REDACTED]\";\n });\n result = result.replace(JWT_PATTERN, \"[REDACTED]\");\n result = result.replace(API_KEY_PREFIX_PATTERN, \"[REDACTED]\");\n result = result.replace(TOKEN_LIKE_PATTERN, (match) => (\n shouldRedactToken(match) ? \"[REDACTED]\" : match\n ));\n return result;\n}\n\nexport type ConsoleEvent = {\n seq: number;\n level: string;\n text: string;\n ts: number;\n};\n\nexport type ConsoleTrackerOptions = {\n showFullConsole?: boolean;\n};\n\nexport class ConsoleTracker {\n private events: ConsoleEvent[] = [];\n private maxEvents: number;\n private seq: number = 0;\n private page: Page | null = null;\n private handler?: (msg: { type(): string; text(): string }) => void;\n private showFullConsole: boolean;\n\n constructor(maxEvents = 200, options: ConsoleTrackerOptions = {}) {\n this.maxEvents = maxEvents;\n this.showFullConsole = options.showFullConsole ?? false;\n }\n\n setOptions(options: ConsoleTrackerOptions): void {\n if (typeof options.showFullConsole === \"boolean\") {\n this.showFullConsole = options.showFullConsole;\n }\n }\n\n attach(page: Page): void {\n if (this.page === page) return;\n this.detach();\n\n this.page = page;\n this.handler = (msg) => {\n const rawText = msg.text();\n const text = this.showFullConsole ? rawText : redactText(rawText);\n this.seq += 1;\n this.events.push({\n seq: this.seq,\n level: msg.type(),\n text,\n ts: Date.now()\n });\n if (this.events.length > this.maxEvents) {\n this.events.shift();\n }\n };\n\n page.on(\"console\", this.handler);\n }\n\n detach(): void {\n if (this.page && this.handler) {\n this.page.off(\"console\", this.handler);\n }\n this.page = null;\n this.handler = undefined;\n }\n\n poll(sinceSeq = 0, max = 50): { events: ConsoleEvent[]; nextSeq: number } {\n const events = this.events.filter((event) => event.seq > sinceSeq).slice(0, max);\n const last = events[events.length - 1];\n const nextSeq = last ? last.seq : sinceSeq;\n return { events, nextSeq };\n }\n}\n","import type { Page, Request, Response } from \"playwright-core\";\n\nfunction shouldRedactPathSegment(segment: string): boolean {\n if (segment.length < 16) return false;\n if (/^\\d+$/.test(segment)) return false;\n if (/^[a-f0-9-]{36}$/i.test(segment)) return false;\n if (/^(sk_|pk_|api_|key_|token_|secret_|bearer_)/i.test(segment)) return true;\n const categories = [/[a-z]/, /[A-Z]/, /\\d/, /[_-]/].filter(r => r.test(segment)).length;\n return categories >= 3 && segment.length >= 20;\n}\n\nfunction redactUrl(rawUrl: string): string {\n try {\n const parsed = new URL(rawUrl);\n parsed.search = \"\";\n parsed.hash = \"\";\n const segments = parsed.pathname.split(\"/\");\n const redactedSegments = segments.map(segment =>\n shouldRedactPathSegment(segment) ? \"[REDACTED]\" : segment\n );\n parsed.pathname = redactedSegments.join(\"/\");\n return parsed.toString();\n } catch {\n return rawUrl.split(/[?#]/)[0] ?? rawUrl;\n }\n}\n\nexport type NetworkEvent = {\n seq: number;\n method: string;\n url: string;\n status?: number;\n resourceType?: string;\n ts: number;\n};\n\nexport type NetworkTrackerOptions = {\n showFullUrls?: boolean;\n};\n\nexport class NetworkTracker {\n private events: NetworkEvent[] = [];\n private maxEvents: number;\n private seq: number = 0;\n private page: Page | null = null;\n private requestHandler?: (req: Request) => void;\n private responseHandler?: (res: Response) => void;\n private showFullUrls: boolean;\n\n constructor(maxEvents = 300, options: NetworkTrackerOptions = {}) {\n this.maxEvents = maxEvents;\n this.showFullUrls = options.showFullUrls ?? false;\n }\n\n setOptions(options: NetworkTrackerOptions): void {\n if (typeof options.showFullUrls === \"boolean\") {\n this.showFullUrls = options.showFullUrls;\n }\n }\n\n attach(page: Page): void {\n if (this.page === page) return;\n this.detach();\n\n this.page = page;\n this.requestHandler = (req) => {\n this.push({\n method: req.method(),\n url: this.showFullUrls ? req.url() : redactUrl(req.url()),\n resourceType: req.resourceType(),\n ts: Date.now()\n });\n };\n\n this.responseHandler = (res) => {\n const req = res.request();\n this.push({\n method: req.method(),\n url: this.showFullUrls ? res.url() : redactUrl(res.url()),\n status: res.status(),\n resourceType: req.resourceType(),\n ts: Date.now()\n });\n };\n\n page.on(\"request\", this.requestHandler);\n page.on(\"response\", this.responseHandler);\n }\n\n detach(): void {\n if (this.page && this.requestHandler) {\n this.page.off(\"request\", this.requestHandler);\n }\n if (this.page && this.responseHandler) {\n this.page.off(\"response\", this.responseHandler);\n }\n this.page = null;\n this.requestHandler = undefined;\n this.responseHandler = undefined;\n }\n\n poll(sinceSeq = 0, max = 50): { events: NetworkEvent[]; nextSeq: number } {\n const events = this.events.filter((event) => event.seq > sinceSeq).slice(0, max);\n const last = events[events.length - 1];\n const nextSeq = last ? last.seq : sinceSeq;\n return { events, nextSeq };\n }\n\n private push(event: Omit<NetworkEvent, \"seq\">): void {\n this.seq += 1;\n this.events.push({\n seq: this.seq,\n ...event\n });\n\n if (this.events.length > this.maxEvents) {\n this.events.shift();\n }\n }\n}\n","import type { DomCapture } from \"./dom-capture\";\n\nexport const STYLE_ALLOWLIST = new Set([\n \"align-content\",\n \"align-items\",\n \"align-self\",\n \"background\",\n \"background-attachment\",\n \"background-clip\",\n \"background-color\",\n \"background-image\",\n \"background-origin\",\n \"background-position\",\n \"background-position-x\",\n \"background-position-y\",\n \"background-repeat\",\n \"background-size\",\n \"border\",\n \"border-bottom\",\n \"border-bottom-color\",\n \"border-bottom-left-radius\",\n \"border-bottom-right-radius\",\n \"border-bottom-style\",\n \"border-bottom-width\",\n \"border-color\",\n \"border-left\",\n \"border-left-color\",\n \"border-left-style\",\n \"border-left-width\",\n \"border-radius\",\n \"border-right\",\n \"border-right-color\",\n \"border-right-style\",\n \"border-right-width\",\n \"border-style\",\n \"border-top\",\n \"border-top-color\",\n \"border-top-left-radius\",\n \"border-top-right-radius\",\n \"border-top-style\",\n \"border-top-width\",\n \"border-width\",\n \"box-shadow\",\n \"box-sizing\",\n \"color\",\n \"column-gap\",\n \"contain\",\n \"direction\",\n \"display\",\n \"filter\",\n \"flex\",\n \"flex-direction\",\n \"flex-flow\",\n \"flex-wrap\",\n \"font\",\n \"font-family\",\n \"font-feature-settings\",\n \"font-kerning\",\n \"font-size\",\n \"font-size-adjust\",\n \"font-stretch\",\n \"font-style\",\n \"font-variant\",\n \"font-variant-caps\",\n \"font-variant-east-asian\",\n \"font-variant-ligatures\",\n \"font-variant-numeric\",\n \"font-variation-settings\",\n \"font-weight\",\n \"gap\",\n \"grid\",\n \"grid-auto-columns\",\n \"grid-auto-flow\",\n \"grid-auto-rows\",\n \"grid-template-areas\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"height\",\n \"hyphens\",\n \"inset\",\n \"inset-block\",\n \"inset-inline\",\n \"isolation\",\n \"justify-content\",\n \"left\",\n \"letter-spacing\",\n \"line-height\",\n \"margin\",\n \"margin-bottom\",\n \"margin-left\",\n \"margin-right\",\n \"margin-top\",\n \"max-height\",\n \"max-width\",\n \"min-height\",\n \"min-width\",\n \"opacity\",\n \"outline\",\n \"outline-color\",\n \"outline-offset\",\n \"outline-style\",\n \"outline-width\",\n \"overflow\",\n \"overflow-wrap\",\n \"overflow-x\",\n \"overflow-y\",\n \"padding\",\n \"padding-bottom\",\n \"padding-left\",\n \"padding-right\",\n \"padding-top\",\n \"position\",\n \"right\",\n \"row-gap\",\n \"text-align\",\n \"text-align-last\",\n \"text-decoration\",\n \"text-decoration-color\",\n \"text-decoration-line\",\n \"text-decoration-style\",\n \"text-decoration-thickness\",\n \"text-indent\",\n \"text-rendering\",\n \"text-shadow\",\n \"text-transform\",\n \"top\",\n \"transform\",\n \"transform-origin\",\n \"visibility\",\n \"white-space\",\n \"width\",\n \"word-break\",\n \"word-spacing\",\n \"writing-mode\",\n \"z-index\"\n]);\n\nexport const SKIP_STYLE_VALUES = new Set([\n \"\",\n \"initial\",\n \"unset\",\n \"revert\",\n \"revert-layer\"\n]);\n\nexport function extractCss(capture: DomCapture): string {\n const shouldFilter = capture.inlineStyles !== false;\n const lines: string[] = [];\n lines.push(\".opendevbrowser-root {\");\n for (const [key, value] of Object.entries(capture.styles)) {\n const trimmed = value.trim();\n if (trimmed.length === 0) continue;\n if (shouldFilter) {\n if (!STYLE_ALLOWLIST.has(key)) continue;\n if (SKIP_STYLE_VALUES.has(trimmed)) continue;\n }\n lines.push(` ${key}: ${value};`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n","import type { Page } from \"playwright-core\";\nimport { STYLE_ALLOWLIST, SKIP_STYLE_VALUES } from \"./css-extract\";\n\nexport type DomCapture = {\n html: string;\n styles: Record<string, string>;\n warnings: string[];\n inlineStyles: boolean;\n};\n\ntype CaptureOptions = {\n sanitize?: boolean;\n maxNodes?: number;\n inlineStyles?: boolean;\n};\n\nconst DEFAULT_MAX_NODES = 1000;\n\nexport async function captureDom(\n page: Page,\n selector: string,\n options: CaptureOptions = {}\n): Promise<DomCapture> {\n const shouldSanitize = options.sanitize !== false;\n const maxNodes = options.maxNodes ?? DEFAULT_MAX_NODES;\n const inlineStyles = options.inlineStyles !== false;\n const styleAllowlist = Array.from(STYLE_ALLOWLIST);\n const skipStyleValues = Array.from(SKIP_STYLE_VALUES);\n\n return page.$eval(\n selector,\n (el, opts) => {\n const style = window.getComputedStyle(el as Element);\n const styles: Record<string, string> = {};\n for (const prop of Array.from(style)) {\n styles[prop] = style.getPropertyValue(prop);\n }\n\n const warnings: string[] = [];\n const root = el as Element;\n const clone = root.cloneNode(true) as Element;\n const originalElements = [root, ...Array.from(root.querySelectorAll(\"*\"))];\n const cloneElements = [clone, ...Array.from(clone.querySelectorAll(\"*\"))];\n const nodeLimit = Math.max(1, opts.maxNodes);\n\n if (originalElements.length > nodeLimit) {\n const omitted = originalElements.length - nodeLimit;\n warnings.push(`Export truncated at ${nodeLimit} nodes; ${omitted} nodes omitted.`);\n }\n\n const limit = Math.min(originalElements.length, nodeLimit);\n if (opts.inlineStyles) {\n const skipSet = new Set(opts.skipStyleValues);\n for (let index = 0; index < limit; index += 1) {\n const source = originalElements[index];\n const target = cloneElements[index];\n if (!source || !target) continue;\n const computed = window.getComputedStyle(source);\n const parts: string[] = [];\n for (const prop of opts.styleAllowlist) {\n const value = computed.getPropertyValue(prop).trim();\n if (value && !skipSet.has(value)) {\n parts.push(`${prop}: ${value};`);\n }\n }\n if (parts.length > 0) {\n target.setAttribute(\"style\", parts.join(\" \"));\n }\n }\n }\n\n if (originalElements.length > nodeLimit) {\n for (let index = nodeLimit; index < cloneElements.length; index += 1) {\n const target = cloneElements[index];\n if (target) {\n target.remove();\n }\n }\n }\n\n const container = document.createElement(\"template\");\n container.content.appendChild(clone);\n\n if (opts.shouldSanitize) {\n const blockedTags = new Set([\n \"script\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"frame\",\n \"frameset\",\n \"applet\",\n \"base\",\n \"link\",\n \"meta\",\n \"noscript\"\n ]);\n const urlAttrs = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\", \"srcset\"]);\n\n const isDangerousUrl = (value: string) => {\n const normalized = value.trim().toLowerCase();\n return normalized.startsWith(\"javascript:\")\n || normalized.startsWith(\"data:\")\n || normalized.startsWith(\"vbscript:\");\n };\n\n const isDangerousSrcset = (value: string) => {\n const entries = value.split(\",\");\n return entries.some((entry) => {\n const url = entry.trim().split(/\\s+/)[0] ?? \"\";\n return isDangerousUrl(url);\n });\n };\n\n const DANGEROUS_CSS_PATTERNS = [\n /url\\s*\\(/i,\n /expression\\s*\\(/i,\n /-moz-binding/i,\n /behavior\\s*:/i,\n /javascript\\s*:/i\n ];\n\n const sanitizeStyle = (styleValue: string): { sanitized: string; wasModified: boolean } => {\n let result = styleValue;\n let wasModified = false;\n for (const pattern of DANGEROUS_CSS_PATTERNS) {\n if (pattern.test(result)) {\n result = result.replace(new RegExp(pattern.source, \"gi\"), \"/* blocked */\");\n wasModified = true;\n }\n }\n return { sanitized: result, wasModified };\n };\n\n const sanitizeSvg = (svg: Element) => {\n const scripts = svg.querySelectorAll(\"script\");\n scripts.forEach(script => {\n script.remove();\n warnings.push(\"Removed script element from SVG\");\n });\n\n const foreignObjects = svg.querySelectorAll(\"foreignObject\");\n foreignObjects.forEach(fo => {\n fo.remove();\n warnings.push(\"Removed foreignObject from SVG\");\n });\n\n const allElements = svg.querySelectorAll(\"*\");\n allElements.forEach(el => {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.toLowerCase().startsWith(\"on\")) {\n el.removeAttribute(attr.name);\n }\n }\n });\n };\n\n const sanitizeElement = (element: Element) => {\n const tag = element.tagName.toLowerCase();\n if (blockedTags.has(tag)) {\n element.remove();\n return;\n }\n\n if (tag === \"svg\") {\n sanitizeSvg(element);\n }\n\n for (const attr of Array.from(element.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\")) {\n element.removeAttribute(attr.name);\n continue;\n }\n if (name === \"style\") {\n const { sanitized, wasModified } = sanitizeStyle(attr.value);\n if (wasModified) {\n element.setAttribute(\"style\", sanitized);\n warnings.push(\"Sanitized dangerous CSS in style attribute\");\n }\n continue;\n }\n if (urlAttrs.has(name)) {\n const value = attr.value || \"\";\n const dangerous = name === \"srcset\"\n ? isDangerousSrcset(value)\n : isDangerousUrl(value);\n if (dangerous) {\n element.removeAttribute(attr.name);\n }\n }\n }\n };\n\n for (const element of Array.from(container.content.querySelectorAll(\"*\"))) {\n sanitizeElement(element);\n }\n if (container.content.firstElementChild) {\n sanitizeElement(container.content.firstElementChild);\n }\n }\n\n return { html: container.innerHTML, styles, warnings, inlineStyles: opts.inlineStyles };\n },\n { shouldSanitize, maxNodes, inlineStyles, styleAllowlist, skipStyleValues }\n );\n}\n","import type { DomCapture } from \"./dom-capture\";\n\nexport type ReactExport = {\n component: string;\n css: string;\n warnings?: string[];\n};\n\nexport type ReactEmitterOptions = {\n allowUnsafeExport?: boolean;\n};\n\nexport function emitReactComponent(capture: DomCapture, css: string, options: ReactEmitterOptions = {}): ReactExport {\n const warnings = [...(capture.warnings ?? [])];\n if (options.allowUnsafeExport) {\n warnings.push(\"Unsafe export enabled: HTML sanitization disabled.\");\n }\n\n const warningComment = options.allowUnsafeExport\n ? \"// WARNING: Unsafe export enabled. HTML sanitization disabled.\\n\"\n : \"\";\n\n const component = `${warningComment}import \"./opendevbrowser.css\";\n\nexport default function OpenDevBrowserComponent() {\n return (\n <div className=\"opendevbrowser-root\" dangerouslySetInnerHTML={{ __html: ${JSON.stringify(capture.html)} }} />\n );\n}`;\n\n return { component, css, warnings: warnings.length > 0 ? warnings : undefined };\n}\n","import { randomUUID } from \"crypto\";\n\nexport type RefEntry = {\n ref: string;\n selector: string;\n backendNodeId: number;\n frameId?: string;\n role?: string;\n name?: string;\n};\n\nexport type RefSnapshot = {\n snapshotId: string;\n targetId: string;\n count: number;\n};\n\nexport class RefStore {\n private refsByTarget = new Map<string, Map<string, RefEntry>>();\n private snapshotByTarget = new Map<string, string>();\n\n setSnapshot(targetId: string, entries: RefEntry[]): RefSnapshot {\n const map = new Map<string, RefEntry>();\n for (const entry of entries) {\n map.set(entry.ref, entry);\n }\n\n const snapshotId = randomUUID();\n this.refsByTarget.set(targetId, map);\n this.snapshotByTarget.set(targetId, snapshotId);\n\n return { snapshotId, targetId, count: entries.length };\n }\n\n resolve(targetId: string, ref: string): RefEntry | null {\n const map = this.refsByTarget.get(targetId);\n if (!map) return null;\n return map.get(ref) ?? null;\n }\n\n getSnapshotId(targetId: string): string | null {\n return this.snapshotByTarget.get(targetId) ?? null;\n }\n\n getRefCount(targetId: string): number {\n const map = this.refsByTarget.get(targetId);\n return map ? map.size : 0;\n }\n\n clearTarget(targetId: string): void {\n this.refsByTarget.delete(targetId);\n this.snapshotByTarget.delete(targetId);\n }\n}\n","import type { CDPSession, Page } from \"playwright-core\";\nimport type { RefStore } from \"./refs\";\n\nexport type SnapshotResult = {\n snapshotId: string;\n url?: string;\n title?: string;\n content: string;\n truncated: boolean;\n nextCursor?: string;\n refCount: number;\n timingMs: number;\n warnings?: string[];\n};\n\nexport class Snapshotter {\n private refStore: RefStore;\n\n constructor(refStore: RefStore) {\n this.refStore = refStore;\n }\n\n async snapshot(page: Page, targetId: string, options: {\n mode: SnapshotMode;\n maxChars: number;\n cursor?: string;\n mainFrameOnly?: boolean;\n maxNodes?: number;\n }): Promise<SnapshotResult> {\n const startTime = Date.now();\n const session = await page.context().newCDPSession(page);\n let snapshotData: {\n entries: Array<{ ref: string; selector: string; backendNodeId: number; frameId?: string; role?: string; name?: string }>;\n lines: string[];\n warnings: string[];\n };\n try {\n snapshotData = await buildSnapshot(session, options.mode, options.mainFrameOnly ?? true, options.maxNodes);\n } finally {\n await session.detach();\n }\n\n const snapshot = this.refStore.setSnapshot(targetId, snapshotData.entries);\n const formatted = snapshotData.lines;\n\n const startIndex = parseCursor(options.cursor);\n const { content, truncated, nextCursor } = paginate(formatted, startIndex, options.maxChars);\n\n const timingMs = Date.now() - startTime;\n let url: string | undefined;\n let title: string | undefined;\n\n try {\n url = page.url();\n title = await page.title();\n } catch (_err) {\n // Page may be closed or navigating; safely ignore and return undefined\n void _err;\n url = undefined;\n title = undefined;\n }\n\n return {\n snapshotId: snapshot.snapshotId,\n url,\n title,\n content,\n truncated,\n nextCursor,\n refCount: snapshot.count,\n timingMs,\n warnings: snapshotData.warnings\n };\n }\n}\n\ntype SnapshotMode = \"outline\" | \"actionables\";\n\ntype AxValue = {\n type?: string;\n value?: unknown;\n};\n\ntype AxProperty = {\n name: string;\n value?: AxValue;\n};\n\ntype AxNode = {\n nodeId: string;\n ignored?: boolean;\n role?: AxValue;\n chromeRole?: AxValue;\n name?: AxValue;\n value?: AxValue;\n properties?: AxProperty[];\n backendDOMNodeId?: number;\n frameId?: string;\n};\n\nconst DEFAULT_MAX_AX_NODES = 1000;\nconst ACTIONABLE_ROLES = new Set([\n \"button\",\n \"link\",\n \"textbox\",\n \"searchbox\",\n \"textarea\",\n \"checkbox\",\n \"radio\",\n \"combobox\",\n \"listbox\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"switch\",\n \"tab\",\n \"slider\",\n \"spinbutton\",\n \"treeitem\"\n]);\nconst SEMANTIC_ROLES = new Set([\n \"heading\",\n \"article\",\n \"main\",\n \"navigation\",\n \"region\",\n \"section\",\n \"form\",\n \"list\",\n \"listitem\",\n \"paragraph\",\n \"img\",\n \"table\",\n \"row\",\n \"cell\",\n \"columnheader\",\n \"rowheader\",\n \"banner\",\n \"contentinfo\",\n \"complementary\"\n]);\n\nexport const selectorFunction = function(this: Element): string | null {\n if (!(this instanceof Element)) return null;\n const escape = (value: string): string => {\n if (typeof CSS !== \"undefined\" && CSS.escape) {\n return CSS.escape(value);\n }\n return String(value).replace(/([^\\w-])/g, \"\\\\$1\");\n };\n // Prefer stable attributes first\n const testId = this.getAttribute(\"data-testid\");\n if (testId) {\n return '[data-testid=\"' + escape(testId) + '\"]';\n }\n const ariaLabel = this.getAttribute(\"aria-label\");\n if (ariaLabel && ariaLabel.length < 50) {\n return '[aria-label=\"' + escape(ariaLabel) + '\"]';\n }\n const buildPathSelector = (start: Element): string => {\n const parts: string[] = [];\n let current: Element | null = start;\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n if (current.id) {\n selector += \"#\" + escape(current.id);\n parts.unshift(selector);\n break;\n }\n const parentEl: Element | null = current.parentElement;\n if (!parentEl) {\n parts.unshift(selector);\n break;\n }\n let index = 1;\n let sibling: Element | null = current;\n while (sibling && sibling.previousElementSibling) {\n sibling = sibling.previousElementSibling;\n index += 1;\n }\n selector += \":nth-child(\" + index + \")\";\n parts.unshift(selector);\n current = parentEl;\n }\n return parts.join(\" > \");\n };\n // Fallback to path-based selector\n return buildPathSelector(this);\n};\nconst SELECTOR_FUNCTION = selectorFunction.toString();\n\nasync function buildSnapshot(session: CDPSession, mode: SnapshotMode, mainFrameOnly: boolean = true, maxNodes?: number): Promise<{\n entries: Array<{\n ref: string;\n selector: string;\n backendNodeId: number;\n frameId?: string;\n role?: string;\n name?: string;\n }>;\n lines: string[];\n warnings: string[];\n}> {\n await session.send(\"Accessibility.enable\");\n await session.send(\"DOM.enable\");\n const result = await session.send(\"Accessibility.getFullAXTree\") as { nodes?: AxNode[] };\n const nodes = Array.isArray(result.nodes) ? result.nodes : [];\n const entries: Array<{\n ref: string;\n selector: string;\n backendNodeId: number;\n frameId?: string;\n role?: string;\n name?: string;\n }> = [];\n const lines: string[] = [];\n const warnings: string[] = [];\n const maxEntries = typeof maxNodes === \"number\" ? maxNodes : DEFAULT_MAX_AX_NODES;\n let skippedFrameCount = 0;\n\n for (const node of nodes) {\n if (entries.length >= maxEntries) break;\n if (node.ignored) continue;\n if (typeof node.backendDOMNodeId !== \"number\") continue;\n if (mainFrameOnly && node.frameId) {\n skippedFrameCount += 1;\n continue;\n }\n const role = extractValue(node.role) || extractValue(node.chromeRole);\n if (!role) continue;\n if (!shouldInclude(role, mode)) continue;\n\n const selector = await resolveSelector(session, node.backendDOMNodeId);\n if (!selector) continue;\n\n const ref = `r${entries.length + 1}`;\n const name = redactText(extractValue(node.name));\n const value = redactText(extractValue(node.value));\n const disabled = isTruthyProperty(node.properties, \"disabled\");\n const checked = isTruthyProperty(node.properties, \"checked\");\n\n entries.push({\n ref,\n selector,\n backendNodeId: node.backendDOMNodeId,\n frameId: node.frameId,\n role,\n name\n });\n\n lines.push(formatNode({\n ref,\n role,\n name,\n value,\n disabled,\n checked\n }));\n }\n\n if (mainFrameOnly && skippedFrameCount > 0) {\n warnings.push(`Skipped ${skippedFrameCount} iframe nodes; snapshot limited to main frame.`);\n }\n\n return { entries, lines, warnings };\n}\n\nasync function resolveSelector(session: CDPSession, backendNodeId: number): Promise<string | null> {\n const resolved = await session.send(\"DOM.resolveNode\", { backendNodeId }) as { object?: { objectId?: string } };\n const objectId = resolved.object?.objectId;\n if (!objectId) return null;\n const result = await session.send(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: SELECTOR_FUNCTION,\n returnByValue: true\n }) as { result?: { value?: unknown } };\n const selector = result.result?.value;\n if (typeof selector !== \"string\" || selector.trim().length === 0) {\n return null;\n }\n return selector;\n}\n\nfunction shouldInclude(role: string, mode: SnapshotMode): boolean {\n const normalized = role.toLowerCase();\n if (ACTIONABLE_ROLES.has(normalized)) return true;\n if (mode === \"actionables\") return false;\n return SEMANTIC_ROLES.has(normalized);\n}\n\nfunction parseCursor(cursor?: string): number {\n if (!cursor) return 0;\n const value = Number(cursor);\n if (!Number.isFinite(value) || value < 0) return 0;\n return Math.floor(value);\n}\n\nfunction paginate(lines: string[], startIndex: number, maxChars: number): {\n content: string;\n truncated: boolean;\n nextCursor?: string;\n} {\n let total = 0;\n const parts: string[] = [];\n let idx = startIndex;\n\n while (idx < lines.length) {\n const line = lines[idx];\n /* v8 ignore next -- @preserve */\n if (line === undefined) {\n break;\n }\n if (total + line.length + 1 > maxChars && parts.length > 0) {\n break;\n }\n parts.push(line);\n total += line.length + 1;\n idx += 1;\n }\n\n const truncated = idx < lines.length;\n const nextCursor = truncated ? String(idx) : undefined;\n return {\n content: parts.join(\"\\n\"),\n truncated,\n nextCursor\n };\n}\n\nfunction formatNode(node: {\n ref: string;\n role: string;\n name?: string;\n value?: string;\n disabled?: boolean;\n checked?: boolean;\n}): string {\n const name = redactText(node.name || \"\");\n const value = redactText(node.value || \"\");\n const parts: string[] = [];\n parts.push(`[${node.ref}]`);\n parts.push(node.role);\n\n if (node.disabled) {\n parts.push(\"disabled\");\n }\n\n if (node.checked) {\n parts.push(\"checked\");\n }\n\n if (name) {\n parts.push(`\\\"${name}\\\"`);\n }\n\n if (value) {\n parts.push(`value=\\\"${value}\\\"`);\n }\n\n return parts.join(\" \");\n}\n\nfunction redactText(text?: string): string {\n const trimmed = (text ?? \"\").trim();\n if (!trimmed) return \"\";\n\n return trimmed.replace(/[A-Za-z0-9+/_-]{24,}/g, \"[redacted]\");\n}\n\nfunction extractValue(value?: AxValue): string {\n if (!value || typeof value.value === \"undefined\" || value.value === null) return \"\";\n if (typeof value.value === \"string\") return value.value;\n if (typeof value.value === \"number\" || typeof value.value === \"boolean\") {\n return String(value.value);\n }\n return \"\";\n}\n\nfunction isTruthyProperty(properties: AxProperty[] | undefined, name: string): boolean {\n if (!properties) return false;\n const found = properties.find((prop) => prop.name === name);\n if (!found || !found.value) return false;\n const value = found.value.value;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.toLowerCase() === \"true\";\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n","import type { Browser, BrowserContext } from \"playwright-core\";\n\nexport type BrowserMode = \"A\" | \"B\" | \"C\";\n\nexport type BrowserSession = {\n id: string;\n mode: BrowserMode;\n browser: Browser;\n context: BrowserContext;\n};\n\nexport class SessionStore {\n private sessions = new Map<string, BrowserSession>();\n\n add(session: BrowserSession): void {\n this.sessions.set(session.id, session);\n }\n\n get(sessionId: string): BrowserSession {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Unknown sessionId: ${sessionId}`);\n }\n return session;\n }\n\n has(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n delete(sessionId: string): void {\n this.sessions.delete(sessionId);\n }\n\n list(): BrowserSession[] {\n return Array.from(this.sessions.values());\n }\n}\n","import { randomUUID } from \"crypto\";\nimport type { Page } from \"playwright-core\";\n\nexport type TargetInfo = {\n targetId: string;\n title?: string;\n url?: string;\n type: \"page\";\n};\n\nexport type NamedTargetInfo = {\n name: string;\n targetId: string;\n};\n\nexport class TargetManager {\n private targets = new Map<string, Page>();\n private activeTargetId: string | null = null;\n private nameToTarget = new Map<string, string>();\n private targetToName = new Map<string, string>();\n\n registerPage(page: Page, name?: string): string {\n const targetId = randomUUID();\n this.targets.set(targetId, page);\n if (!this.activeTargetId) {\n this.activeTargetId = targetId;\n }\n if (name) {\n this.setName(targetId, name);\n }\n return targetId;\n }\n\n registerExistingPages(pages: Page[]): void {\n for (const page of pages) {\n this.registerPage(page);\n }\n }\n\n setName(targetId: string, name: string): void {\n const trimmed = name.trim();\n if (!trimmed) {\n throw new Error(\"Name must be non-empty\");\n }\n if (!this.targets.has(targetId)) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n const existing = this.nameToTarget.get(trimmed);\n if (existing && existing !== targetId) {\n throw new Error(`Name already in use: ${trimmed}`);\n }\n const previousName = this.targetToName.get(targetId);\n if (previousName && previousName !== trimmed) {\n this.nameToTarget.delete(previousName);\n }\n this.nameToTarget.set(trimmed, targetId);\n this.targetToName.set(targetId, trimmed);\n }\n\n getTargetIdByName(name: string): string | null {\n return this.nameToTarget.get(name.trim()) ?? null;\n }\n\n getName(targetId: string): string | null {\n return this.targetToName.get(targetId) ?? null;\n }\n\n listNamedTargets(): NamedTargetInfo[] {\n return Array.from(this.nameToTarget.entries()).map(([name, targetId]) => ({\n name,\n targetId\n }));\n }\n\n removeName(name: string): void {\n const trimmed = name.trim();\n const targetId = this.nameToTarget.get(trimmed);\n if (targetId) {\n this.nameToTarget.delete(trimmed);\n this.targetToName.delete(targetId);\n }\n }\n\n setActiveTarget(targetId: string): void {\n if (!this.targets.has(targetId)) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n this.activeTargetId = targetId;\n }\n\n getActiveTargetId(): string | null {\n return this.activeTargetId;\n }\n\n getActivePage(): Page {\n if (!this.activeTargetId) {\n throw new Error(\"No active target\");\n }\n const page = this.targets.get(this.activeTargetId);\n if (!page) {\n throw new Error(`Missing active target: ${this.activeTargetId}`);\n }\n return page;\n }\n\n getPage(targetId: string): Page {\n const page = this.targets.get(targetId);\n if (!page) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n return page;\n }\n\n async listTargets(includeUrls = false): Promise<TargetInfo[]> {\n const entries = Array.from(this.targets.entries());\n return Promise.all(entries.map(async ([targetId, page]) => {\n const info: TargetInfo = {\n targetId,\n title: undefined,\n url: undefined,\n type: \"page\"\n };\n\n try {\n info.title = await page.title();\n } catch {\n info.title = undefined;\n }\n\n if (includeUrls) {\n try {\n info.url = page.url();\n } catch {\n info.url = undefined;\n }\n }\n\n return info;\n }));\n }\n\n async closeTarget(targetId: string): Promise<void> {\n const page = this.getPage(targetId);\n let closeError: unknown;\n try {\n await page.close();\n } catch (error) {\n closeError = error;\n } finally {\n this.targets.delete(targetId);\n const name = this.targetToName.get(targetId);\n if (name) {\n this.nameToTarget.delete(name);\n this.targetToName.delete(targetId);\n }\n\n if (this.activeTargetId === targetId) {\n const remaining = Array.from(this.targets.keys());\n this.activeTargetId = remaining[0] ?? null;\n }\n }\n\n if (closeError) {\n throw closeError;\n }\n }\n\n listPageEntries(): Array<{ targetId: string; page: Page }> {\n return Array.from(this.targets.entries()).map(([targetId, page]) => ({\n targetId,\n page\n }));\n }\n}\n","import type { BrowserManager } from \"./browser-manager\";\n\nexport type RunStep = {\n action: string;\n args?: Record<string, unknown>;\n};\n\nexport type RunResult = {\n i: number;\n ok: boolean;\n data?: unknown;\n error?: { message: string };\n};\n\nexport class ScriptRunner {\n private manager: BrowserManager;\n\n constructor(manager: BrowserManager) {\n this.manager = manager;\n }\n\n async run(sessionId: string, steps: RunStep[], stopOnError = true): Promise<{ results: RunResult[]; timingMs: number }> {\n const startTime = Date.now();\n const results: RunResult[] = [];\n\n for (let i = 0; i < steps.length; i += 1) {\n const step = steps[i];\n if (!step) {\n continue;\n }\n try {\n const data = await this.executeStep(sessionId, step);\n results.push({ i, ok: true, data });\n } catch (error) {\n results.push({\n i,\n ok: false,\n error: { message: error instanceof Error ? error.message : \"Unknown error\" }\n });\n if (stopOnError) {\n break;\n }\n }\n }\n\n return { results, timingMs: Date.now() - startTime };\n }\n\n private async executeStep(sessionId: string, step: RunStep): Promise<unknown> {\n const args = step.args ?? {};\n\n switch (step.action) {\n case \"goto\":\n return this.manager.goto(\n sessionId,\n requireString(args.url, \"url\"),\n requireWaitUntil(args.waitUntil),\n requireNumber(args.timeoutMs, 30000)\n );\n case \"wait\":\n if (typeof args.ref === \"string\") {\n const ref = args.ref;\n const state = requireState(args.state);\n const timeoutMs = requireNumber(args.timeoutMs, 30000);\n return withRetry(\"wait\", () => this.manager.waitForRef(\n sessionId,\n ref,\n state,\n timeoutMs\n ));\n }\n return withRetry(\"wait\", () => this.manager.waitForLoad(\n sessionId,\n requireWaitUntil(args.until),\n requireNumber(args.timeoutMs, 30000)\n ));\n case \"snapshot\":\n return this.manager.snapshot(\n sessionId,\n requireSnapshotMode(args.format ?? args.mode),\n requireNumber(args.maxChars, 16000),\n typeof args.cursor === \"string\" ? args.cursor : undefined\n );\n case \"click\":\n return withRetry(\"click\", () => this.manager.click(sessionId, requireString(args.ref, \"ref\")));\n case \"type\":\n return withRetry(\"type\", () => this.manager.type(\n sessionId,\n requireString(args.ref, \"ref\"),\n requireString(args.text, \"text\"),\n Boolean(args.clear),\n Boolean(args.submit)\n ));\n case \"select\":\n return withRetry(\"select\", () => this.manager.select(\n sessionId,\n requireString(args.ref, \"ref\"),\n requireStringArray(args.values, \"values\")\n ));\n case \"scroll\":\n return withRetry(\"scroll\", () => this.manager.scroll(\n sessionId,\n requireNumber(args.dy, 0),\n typeof args.ref === \"string\" ? args.ref : undefined\n ));\n case \"dom_get_html\":\n return this.manager.domGetHtml(sessionId, requireString(args.ref, \"ref\"), requireNumber(args.maxChars, 8000));\n case \"dom_get_text\":\n return this.manager.domGetText(sessionId, requireString(args.ref, \"ref\"), requireNumber(args.maxChars, 8000));\n default:\n throw new Error(`Unknown action: ${step.action}`);\n }\n }\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Missing ${label}`);\n }\n return value;\n}\n\nfunction requireStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`Invalid ${label}`);\n }\n return value as string[];\n}\n\nfunction requireNumber(value: unknown, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return fallback;\n}\n\nfunction requireWaitUntil(value: unknown): \"domcontentloaded\" | \"load\" | \"networkidle\" {\n if (value === \"domcontentloaded\" || value === \"load\" || value === \"networkidle\") {\n return value;\n }\n return \"load\";\n}\n\nfunction requireSnapshotMode(value: unknown): \"outline\" | \"actionables\" {\n if (value === \"actionables\") return \"actionables\";\n return \"outline\";\n}\n\nfunction requireState(value: unknown): \"attached\" | \"visible\" | \"hidden\" {\n if (value === \"visible\" || value === \"hidden\") return value;\n return \"attached\";\n}\n\nconst RETRY_ACTIONS = new Set([\"click\", \"type\", \"select\", \"scroll\", \"wait\"]);\nconst RETRY_MAX_ATTEMPTS = 2;\nconst RETRY_BASE_DELAY_MS = 150;\nconst RETRY_MAX_DELAY_MS = 1000;\n\nasync function withRetry<T>(action: string, fn: () => Promise<T>): Promise<T> {\n if (!RETRY_ACTIONS.has(action)) {\n return fn();\n }\n\n let attempt = 0;\n let delay = RETRY_BASE_DELAY_MS;\n while (true) {\n try {\n return await fn();\n } catch (error) {\n attempt += 1;\n if (attempt >= RETRY_MAX_ATTEMPTS || !shouldRetry(error)) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * 2, RETRY_MAX_DELAY_MS);\n }\n }\n}\n\nfunction shouldRetry(error: unknown): boolean {\n const message = error instanceof Error ? error.message : \"\";\n if (!message) return true;\n return !/missing|invalid|unknown ref|no active target/i.test(message);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { readFile, readdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport * as os from \"os\";\nimport type { SkillInfo, SkillMetadata } from \"./types\";\n\nexport class SkillLoader {\n private rootDir: string;\n private additionalPaths: string[];\n private skillCache: SkillInfo[] | null = null;\n\n constructor(rootDir: string, additionalPaths: string[] = []) {\n this.rootDir = rootDir;\n this.additionalPaths = additionalPaths.map((p) => this.expandPath(p));\n }\n\n private expandPath(p: string): string {\n if (p.startsWith(\"~\")) {\n return join(os.homedir(), p.slice(1));\n }\n return p;\n }\n\n async loadBestPractices(topic?: string): Promise<string> {\n return this.loadSkill(\"opendevbrowser-best-practices\", topic);\n }\n\n async loadSkill(name: string, topic?: string): Promise<string> {\n const skills = await this.listSkills();\n const skill = skills.find((s) => s.name === name);\n\n if (!skill) {\n const available = skills.map((s) => s.name).join(\", \") || \"none\";\n throw new Error(`Skill \"${name}\" not found. Available: ${available}`);\n }\n\n const content = await readFile(skill.path, \"utf8\");\n const trimmed = content.trim();\n\n if (!topic || !topic.trim()) {\n return trimmed;\n }\n\n const filtered = filterSections(trimmed, topic);\n return filtered || trimmed;\n }\n\n async listSkills(): Promise<SkillInfo[]> {\n if (this.skillCache) {\n return this.skillCache;\n }\n\n const skills: SkillInfo[] = [];\n const searchPaths = this.getSearchPaths();\n\n for (const searchPath of searchPaths) {\n const discovered = await this.discoverSkillsInPath(searchPath);\n for (const skill of discovered) {\n if (!skills.some((s) => s.name === skill.name)) {\n skills.push(skill);\n }\n }\n }\n\n this.skillCache = skills;\n return skills;\n }\n\n private getSearchPaths(): string[] {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || join(os.homedir(), \".config\", \"opencode\");\n\n const searchPaths = [\n join(this.rootDir, \".opencode\", \"skill\"),\n join(configDir, \"skill\"),\n join(this.rootDir, \".claude\", \"skills\"),\n join(os.homedir(), \".claude\", \"skills\"),\n ...this.additionalPaths\n ];\n\n return Array.from(new Set(searchPaths));\n }\n\n private async discoverSkillsInPath(searchPath: string): Promise<SkillInfo[]> {\n const skills: SkillInfo[] = [];\n\n try {\n const entries = await readdir(searchPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = join(searchPath, entry.name, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf8\");\n const metadata = this.parseSkillMetadata(content, entry.name);\n\n skills.push({\n name: metadata.name,\n description: metadata.description,\n version: metadata.version ?? \"1.0.0\",\n path: skillPath\n });\n } catch {\n void 0;\n }\n }\n } catch {\n void 0;\n }\n\n return skills;\n }\n\n parseSkillMetadata(content: string, dirName: string): SkillMetadata {\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\n if (!frontmatterMatch) {\n return {\n name: dirName,\n description: this.extractFirstParagraph(content) || `Skill: ${dirName}`\n };\n }\n\n const frontmatter = frontmatterMatch[1] ?? \"\";\n const metadata: SkillMetadata = {\n name: dirName,\n description: \"\"\n };\n\n const nameMatch = frontmatter.match(/^name:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (nameMatch?.[1]) {\n metadata.name = nameMatch[1].trim();\n }\n\n const descMatch = frontmatter.match(/^description:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (descMatch?.[1]) {\n metadata.description = descMatch[1].trim();\n }\n\n const versionMatch = frontmatter.match(/^version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (versionMatch?.[1]) {\n metadata.version = versionMatch[1].trim();\n }\n\n if (!metadata.description) {\n const afterFrontmatter = content.slice(frontmatterMatch[0].length);\n metadata.description = this.extractFirstParagraph(afterFrontmatter) || `Skill: ${metadata.name}`;\n }\n\n return metadata;\n }\n\n private extractFirstParagraph(content: string): string | null {\n const lines = content.trim().split(/\\n/);\n const paragraphLines: string[] = [];\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine.startsWith(\"#\")) continue;\n if (trimmedLine === \"\" && paragraphLines.length > 0) break;\n if (trimmedLine !== \"\") {\n paragraphLines.push(trimmedLine);\n }\n }\n\n const paragraph = paragraphLines.join(\" \").trim();\n return paragraph.length > 0 ? paragraph.slice(0, 200) : null;\n }\n\n clearCache(): void {\n this.skillCache = null;\n }\n}\n\nfunction filterSections(content: string, topic: string): string | null {\n const normalized = topic.trim().toLowerCase();\n const lines = content.split(/\\r?\\n/);\n const sections: Array<{ heading: string; body: string[] }> = [];\n let currentHeading = \"\";\n let currentBody: string[] = [];\n\n const flush = () => {\n if (currentHeading || currentBody.length > 0) {\n sections.push({ heading: currentHeading, body: [...currentBody] });\n }\n currentHeading = \"\";\n currentBody = [];\n };\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,3})\\s+(.*)$/);\n if (headingMatch) {\n flush();\n currentHeading = headingMatch[2]?.trim() ?? \"\";\n currentBody.push(line);\n continue;\n }\n currentBody.push(line);\n }\n flush();\n\n const matches = sections.filter((section) => section.heading.toLowerCase().includes(normalized));\n if (matches.length === 0) {\n return null;\n }\n return matches.map((section) => section.body.join(\"\\n\")).join(\"\\n\\n\");\n}\n","export type SkillNudgeState = {\n pending: boolean;\n requestedAtMs: number | null;\n};\n\nexport const SKILL_NUDGE_MARKER = \"[opendevbrowser:skill-nudge]\";\n\nconst SKILL_NUDGE_MESSAGE = `${SKILL_NUDGE_MARKER} If this task likely matches a skill, call the OpenCode skill tool early (skill(\"<skill-name>\", topic?)) and load only the most relevant skill before using browser tools. If unsure which skill applies, check the available skills first.`;\n\ntype TextPart = { type: \"text\"; text: string };\ntype UnknownPart = { type: string; text?: string };\n\nexport function createSkillNudgeState(): SkillNudgeState {\n return { pending: false, requestedAtMs: null };\n}\n\nexport function extractTextFromParts(parts: UnknownPart[]): string {\n return parts\n .filter((part): part is TextPart => part.type === \"text\" && typeof part.text === \"string\")\n .map((part) => part.text)\n .join(\"\\n\")\n .trim();\n}\n\nexport function shouldTriggerSkillNudge(text: string, keywords: string[]): boolean {\n const normalized = text.toLowerCase();\n return keywords.some((keyword) => normalized.includes(keyword.toLowerCase()));\n}\n\nexport function markSkillNudge(state: SkillNudgeState, nowMs: number): void {\n state.pending = true;\n state.requestedAtMs = nowMs;\n}\n\nexport function clearSkillNudge(state: SkillNudgeState): void {\n state.pending = false;\n state.requestedAtMs = null;\n}\n\nexport function consumeSkillNudge(state: SkillNudgeState, nowMs: number, maxAgeMs: number): boolean {\n if (!state.pending) return false;\n\n const requestedAt = state.requestedAtMs ?? 0;\n if (!state.requestedAtMs || nowMs - requestedAt > maxAgeMs) {\n clearSkillNudge(state);\n return false;\n }\n\n clearSkillNudge(state);\n return true;\n}\n\nexport function buildSkillNudgeMessage(): string {\n return SKILL_NUDGE_MESSAGE;\n}\n","export type ContinuityNudgeState = {\n pending: boolean;\n requestedAtMs: number | null;\n};\n\nexport const CONTINUITY_NUDGE_MARKER = \"[opendevbrowser:continuity-nudge]\";\n\nconst DEFAULT_FILE_PATH = \"opendevbrowser_continuity.md\";\n\nexport function createContinuityNudgeState(): ContinuityNudgeState {\n return { pending: false, requestedAtMs: null };\n}\n\nexport function shouldTriggerContinuityNudge(text: string, keywords: string[]): boolean {\n const normalized = text.toLowerCase();\n return keywords.some((keyword) => normalized.includes(keyword.toLowerCase()));\n}\n\nexport function markContinuityNudge(state: ContinuityNudgeState, nowMs: number): void {\n state.pending = true;\n state.requestedAtMs = nowMs;\n}\n\nexport function clearContinuityNudge(state: ContinuityNudgeState): void {\n state.pending = false;\n state.requestedAtMs = null;\n}\n\nexport function consumeContinuityNudge(\n state: ContinuityNudgeState,\n nowMs: number,\n maxAgeMs: number\n): boolean {\n if (!state.pending) return false;\n\n const requestedAt = state.requestedAtMs ?? 0;\n if (!state.requestedAtMs || nowMs - requestedAt > maxAgeMs) {\n clearContinuityNudge(state);\n return false;\n }\n\n clearContinuityNudge(state);\n return true;\n}\n\nexport function buildContinuityNudgeMessage(filePath?: string): string {\n const target = filePath?.trim() || DEFAULT_FILE_PATH;\n return `${CONTINUITY_NUDGE_MARKER} For long-running tasks, create or update ${target} at the repo root with Goal, Constraints/Assumptions, Key decisions, State (Done/Now/Next), Open questions, and Working set. Keep it brief.`;\n}\n","import { createServer, type IncomingMessage } from \"http\";\nimport type { AddressInfo } from \"net\";\nimport { timingSafeEqual } from \"crypto\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport type { RelayCommand, RelayEvent, RelayHandshake, RelayResponse } from \"./protocol\";\n\ntype ExtensionInfo = {\n tabId: number;\n url?: string;\n title?: string;\n groupId?: number;\n};\n\nexport class RelayServer {\n private running = false;\n private baseUrl: string | null = null;\n private port: number | null = null;\n private server: ReturnType<typeof createServer> | null = null;\n private extensionWss: WebSocketServer | null = null;\n private cdpWss: WebSocketServer | null = null;\n private extensionSocket: WebSocket | null = null;\n private cdpSocket: WebSocket | null = null;\n private extensionInfo: ExtensionInfo | null = null;\n private pairingToken: string | null = null;\n private handshakeAttempts = new Map<string, { count: number; resetAt: number }>();\n private cdpAllowlist: Set<string> | null = null;\n private static readonly MAX_HANDSHAKE_ATTEMPTS = 5;\n private static readonly RATE_LIMIT_WINDOW_MS = 60_000;\n\n async start(port = 8787): Promise<{ url: string; port: number }> {\n if (this.running && this.baseUrl && this.port !== null) {\n return { url: this.baseUrl, port: this.port };\n }\n\n this.server = createServer();\n this.extensionWss = new WebSocketServer({ noServer: true });\n this.cdpWss = new WebSocketServer({ noServer: true });\n\n this.extensionWss.on(\"connection\", (socket: WebSocket) => {\n if (this.extensionSocket) {\n this.extensionSocket.close(1000, \"Replaced by a new extension client\");\n }\n this.extensionSocket = socket;\n this.extensionInfo = null;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleExtensionMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.extensionSocket === socket) {\n this.extensionSocket = null;\n this.extensionInfo = null;\n }\n if (this.cdpSocket) {\n this.cdpSocket.close(1011, \"Extension disconnected\");\n }\n });\n });\n\n this.cdpWss.on(\"connection\", (socket: WebSocket) => {\n if (this.cdpSocket) {\n socket.close(1008, \"Only one CDP client supported\");\n return;\n }\n this.cdpSocket = socket;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleCdpMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.cdpSocket === socket) {\n this.cdpSocket = null;\n }\n });\n });\n\n this.server.on(\"request\", (request: IncomingMessage, response) => {\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n const origin = request.headers.origin;\n \n if (pathname === \"/pair\" && request.method === \"OPTIONS\") {\n if (origin && origin.startsWith(\"chrome-extension://\")) {\n response.setHeader(\"Access-Control-Allow-Origin\", origin);\n response.setHeader(\"Access-Control-Allow-Methods\", \"GET, OPTIONS\");\n response.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n }\n response.writeHead(204);\n response.end();\n return;\n }\n \n if (pathname === \"/pair\" && request.method === \"GET\") {\n const isLocalhost = !origin || origin.startsWith(\"chrome-extension://\");\n \n if (!isLocalhost) {\n response.writeHead(403, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Forbidden: only localhost/extension allowed\" }));\n return;\n }\n \n if (origin && origin.startsWith(\"chrome-extension://\")) {\n response.setHeader(\"Access-Control-Allow-Origin\", origin);\n }\n \n response.writeHead(200, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ token: this.pairingToken }));\n return;\n }\n \n response.writeHead(404);\n response.end();\n });\n\n this.server.on(\"upgrade\", (request: IncomingMessage, socket, head) => {\n const origin = request.headers.origin;\n const ip = request.socket.remoteAddress ?? \"unknown\";\n\n if (!this.isAllowedOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin, ip });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n if (pathname === \"/extension\") {\n this.extensionWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.extensionWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n if (pathname === \"/cdp\") {\n this.cdpWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.cdpWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n socket.destroy();\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server?.once(\"error\", reject);\n this.server?.listen(port, \"127.0.0.1\", () => {\n resolve();\n });\n });\n\n const address = this.server.address() as AddressInfo | null;\n if (!address) {\n throw new Error(\"Relay server did not expose a port\");\n }\n\n this.port = address.port;\n this.baseUrl = `ws://127.0.0.1:${address.port}`;\n this.running = true;\n\n return { url: this.baseUrl, port: address.port };\n }\n\n stop(): void {\n this.running = false;\n this.baseUrl = null;\n this.port = null;\n this.extensionInfo = null;\n\n if (this.extensionSocket) {\n this.extensionSocket.close(1000, \"Relay stopped\");\n this.extensionSocket = null;\n }\n\n if (this.cdpSocket) {\n this.cdpSocket.close(1000, \"Relay stopped\");\n this.cdpSocket = null;\n }\n\n this.extensionWss?.close();\n this.cdpWss?.close();\n this.server?.close();\n\n this.extensionWss = null;\n this.cdpWss = null;\n this.server = null;\n }\n\n status(): {\n running: boolean;\n url?: string;\n port?: number;\n extensionConnected: boolean;\n cdpConnected: boolean;\n extension?: ExtensionInfo;\n } {\n return {\n running: this.running,\n url: this.baseUrl || undefined,\n port: this.port ?? undefined,\n extensionConnected: Boolean(this.extensionSocket),\n cdpConnected: Boolean(this.cdpSocket),\n extension: this.extensionInfo ?? undefined\n };\n }\n\n getCdpUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/cdp` : null;\n }\n\n setToken(token?: string | false | null): void {\n const trimmed = typeof token === \"string\" ? token.trim() : \"\";\n this.pairingToken = trimmed.length ? trimmed : null;\n }\n\n setCdpAllowlist(methods: string[] | undefined): void {\n if (!methods || methods.length === 0) {\n this.cdpAllowlist = null;\n return;\n }\n this.cdpAllowlist = new Set(methods);\n }\n\n private isAllowedOrigin(origin: string | undefined): boolean {\n if (!origin) {\n return true;\n }\n if (origin.startsWith(\"chrome-extension://\")) {\n return true;\n }\n return false;\n }\n\n private isRateLimited(ip: string): boolean {\n const now = Date.now();\n const record = this.handshakeAttempts.get(ip);\n\n if (!record || now > record.resetAt) {\n this.handshakeAttempts.set(ip, { count: 1, resetAt: now + RelayServer.RATE_LIMIT_WINDOW_MS });\n return false;\n }\n\n record.count++;\n return record.count > RelayServer.MAX_HANDSHAKE_ATTEMPTS;\n }\n\n private isCommandAllowed(method: string): boolean {\n if (!this.cdpAllowlist) return true;\n return this.cdpAllowlist.has(method);\n }\n\n private logSecurityEvent(event: string, details: Record<string, unknown>): void {\n const safeDetails = { ...details };\n delete safeDetails.token;\n delete safeDetails.pairingToken;\n console.warn(`[security] ${event}`, JSON.stringify(safeDetails));\n }\n\n private handleCdpMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n const id = message.id;\n const method = message.method;\n if ((typeof id !== \"string\" && typeof id !== \"number\") || typeof method !== \"string\") {\n return;\n }\n\n if (!this.extensionSocket) {\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: \"Extension not connected to relay\" }\n } satisfies RelayResponse);\n return;\n }\n\n if (!this.isCommandAllowed(method)) {\n this.logSecurityEvent(\"command_blocked\", { method });\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: `CDP command '${method}' not in allowlist` }\n } satisfies RelayResponse);\n return;\n }\n\n const relayCommand: RelayCommand = {\n id,\n method: \"forwardCDPCommand\",\n params: {\n method,\n params: message.params,\n sessionId: typeof message.sessionId === \"string\" ? message.sessionId : undefined\n }\n };\n\n this.sendJson(this.extensionSocket, relayCommand);\n }\n\n private handleExtensionMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n if (isHandshake(message)) {\n if (!this.isPairingTokenValid(message)) {\n this.logSecurityEvent(\"handshake_failed\", { reason: \"invalid_token\", tabId: message.payload.tabId });\n this.extensionInfo = null;\n this.extensionSocket?.close(1008, \"Invalid pairing token\");\n return;\n }\n this.extensionInfo = {\n tabId: message.payload.tabId,\n url: message.payload.url,\n title: message.payload.title,\n groupId: message.payload.groupId\n };\n return;\n }\n\n if (message.method === \"forwardCDPEvent\" && isRecord(message.params)) {\n const params = message.params as RelayEvent[\"params\"];\n const event: Record<string, unknown> = {\n method: params.method,\n params: params.params ?? {}\n };\n if (params.sessionId) {\n event.sessionId = params.sessionId;\n }\n this.sendJson(this.cdpSocket, event);\n return;\n }\n\n if (typeof message.id === \"string\" || typeof message.id === \"number\") {\n const response: Record<string, unknown> = { id: message.id };\n if (typeof message.result !== \"undefined\") {\n response.result = message.result;\n }\n if (message.error) {\n response.error = message.error;\n }\n if (typeof message.sessionId === \"string\") {\n response.sessionId = message.sessionId;\n }\n this.sendJson(this.cdpSocket, response);\n }\n }\n\n private sendJson(socket: WebSocket | null, payload: unknown): void {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(JSON.stringify(payload));\n }\n\n private isPairingTokenValid(handshake: RelayHandshake): boolean {\n // No token configured = pairing disabled, allow all\n if (!this.pairingToken) {\n return true;\n }\n\n const expected = this.pairingToken;\n const received = handshake.payload.pairingToken ?? \"\";\n\n // Use timing-safe comparison to prevent timing attacks\n const expectedBuf = Buffer.from(expected, \"utf-8\");\n const receivedBuf = Buffer.from(received, \"utf-8\");\n\n if (expectedBuf.length !== receivedBuf.length) {\n // Perform dummy comparison to maintain constant time even on length mismatch\n timingSafeEqual(expectedBuf, expectedBuf);\n return false;\n }\n\n return timingSafeEqual(expectedBuf, receivedBuf);\n }\n}\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n const text = typeof data === \"string\" ? data : data.toString();\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n\nconst isHandshake = (value: Record<string, unknown>): value is RelayHandshake => {\n if (value.type !== \"handshake\" || !isRecord(value.payload)) {\n return false;\n }\n return typeof value.payload.tabId === \"number\";\n};\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createLaunchTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Launch a managed Chrome session and return a sessionId.\",\n args: {\n profile: z.string().optional().describe(\"Profile name for persistent browsing\"),\n headless: z.boolean().optional().describe(\"Run Chrome in headless mode\"),\n startUrl: z.string().optional().describe(\"Optional URL to open after launch\"),\n chromePath: z.string().optional().describe(\"Override Chrome executable path\"),\n flags: z.array(z.string()).optional().describe(\"Extra Chrome flags\"),\n persistProfile: z.boolean().optional().describe(\"Persist profile data between sessions\")\n },\n async execute(args) {\n try {\n const relayStatus = deps.relay?.status();\n const relayUrl = deps.relay?.getCdpUrl();\n const useRelay = Boolean(relayStatus?.extensionConnected && relayUrl);\n let usedRelay = false;\n let relayWarning: string | null = null;\n let result:\n | Awaited<ReturnType<typeof deps.manager.launch>>\n | Awaited<ReturnType<typeof deps.manager.connectRelay>>\n | null = null;\n\n if (useRelay && relayUrl) {\n try {\n result = await deps.manager.connectRelay(relayUrl);\n usedRelay = true;\n } catch {\n relayWarning = \"Relay connection failed; falling back to managed Chrome.\";\n }\n }\n\n if (!result) {\n result = await deps.manager.launch({\n profile: args.profile,\n headless: args.headless,\n startUrl: args.startUrl,\n chromePath: args.chromePath,\n flags: args.flags,\n persistProfile: args.persistProfile\n });\n }\n\n if (usedRelay && args.startUrl && result.activeTargetId) {\n await deps.manager.goto(result.sessionId, args.startUrl, \"load\", 30000);\n }\n\n const warnings = [\n ...(result.warnings ?? []),\n ...(relayWarning ? [relayWarning] : [])\n ];\n return ok({\n sessionId: result.sessionId,\n mode: result.mode,\n browserWsEndpoint: result.wsEndpoint,\n activeTargetId: result.activeTargetId,\n warnings: warnings.length ? warnings : undefined\n });\n } catch (error) {\n return failure(serializeError(error).message, \"launch_failed\");\n }\n }\n });\n}\n","export type ToolError = {\n ok: false;\n error: {\n message: string;\n code?: string;\n };\n};\n\nexport type ToolOk<T> = T & { ok: true };\n\nexport function ok<T extends Record<string, unknown>>(data: T): string {\n return JSON.stringify({ ok: true, ...data });\n}\n\nexport function failure(message: string, code?: string): string {\n return JSON.stringify({\n ok: false,\n error: {\n message,\n code\n }\n });\n}\n\nexport function serializeError(error: unknown): { message: string } {\n if (error instanceof Error) {\n return { message: error.message };\n }\n return { message: \"Unknown error\" };\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createConnectTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Connect to an existing Chrome CDP endpoint.\",\n args: {\n wsEndpoint: z.string().optional().describe(\"Full WebSocket endpoint to connect to\"),\n host: z.string().optional().describe(\"Host for /json/version lookup\"),\n port: z.number().int().optional().describe(\"Port for /json/version lookup\")\n },\n async execute(args) {\n try {\n const relayUrl = deps.relay?.getCdpUrl();\n const useRelay = Boolean(relayUrl && args.wsEndpoint === relayUrl);\n const result = useRelay && relayUrl\n ? await deps.manager.connectRelay(relayUrl)\n : await deps.manager.connect({\n wsEndpoint: args.wsEndpoint,\n host: args.host,\n port: args.port\n });\n return ok({\n sessionId: result.sessionId,\n mode: result.mode,\n browserWsEndpoint: result.wsEndpoint,\n activeTargetId: result.activeTargetId,\n warnings: result.warnings.length ? result.warnings : undefined\n });\n } catch (error) {\n return failure(serializeError(error).message, \"connect_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createDisconnectTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Disconnect a browser session.\",\n args: {\n sessionId: z.string().describe(\"Session id returned from launch/connect\"),\n closeBrowser: z.boolean().optional().describe(\"Close the underlying browser process\")\n },\n async execute(args) {\n try {\n await deps.manager.disconnect(args.sessionId, Boolean(args.closeBrowser));\n return ok({});\n } catch (error) {\n return failure(serializeError(error).message, \"disconnect_failed\");\n }\n }\n });\n}\n","import { readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nfunction getPackageVersion(): string | undefined {\n try {\n const baseDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(baseDir, \"..\", \"..\", \"package.json\"),\n join(baseDir, \"..\", \"package.json\")\n ];\n for (const pkgPath of candidates) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n if (typeof pkg.version === \"string\") {\n return pkg.version;\n }\n } catch (error) {\n void error;\n }\n }\n return undefined;\n } catch (error) {\n void error;\n return undefined;\n }\n}\n\nasync function fetchLatestVersion(packageName: string): Promise<string | undefined> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, { signal: controller.signal });\n if (!response.ok) return undefined;\n const payload = await response.json() as { version?: unknown };\n return typeof payload.version === \"string\" ? payload.version : undefined;\n } catch (error) {\n console.warn(\"[opendevbrowser] Update check failed:\", error);\n return undefined;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nexport function createStatusTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Get status of a browser session.\",\n args: {\n sessionId: z.string().describe(\"Session id\")\n },\n async execute(args) {\n try {\n const status = await deps.manager.status(args.sessionId);\n const extensionPath = deps.getExtensionPath?.() ?? null;\n const config = deps.config.get();\n const version = getPackageVersion();\n let updateHint: string | undefined;\n\n if (config.checkForUpdates && version) {\n const latest = await fetchLatestVersion(\"opendevbrowser\");\n if (latest && latest !== version) {\n updateHint = `Update available: ${version} -> ${latest}`;\n }\n }\n \n return ok({\n mode: status.mode,\n activeTargetId: status.activeTargetId,\n url: status.url,\n title: status.title,\n extensionPath: extensionPath ?? undefined,\n version,\n updateHint\n });\n } catch (error) {\n return failure(serializeError(error).message, \"status_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createTargetsListTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"List targets (tabs) in the current session.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n includeUrls: z.boolean().optional().describe(\"Include target URLs\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.listTargets(args.sessionId, Boolean(args.includeUrls));\n return ok({\n activeTargetId: result.activeTargetId,\n targets: result.targets\n });\n } catch (error) {\n return failure(serializeError(error).message, \"targets_list_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createTargetUseTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Set the active target (tab).\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n targetId: z.string().describe(\"Target id\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.useTarget(args.sessionId, args.targetId);\n return ok({\n activeTargetId: result.activeTargetId,\n url: result.url,\n title: result.title\n });\n } catch (error) {\n return failure(serializeError(error).message, \"target_use_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createTargetNewTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Open a new target (tab).\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n url: z.string().optional().describe(\"Optional URL to open\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.newTarget(args.sessionId, args.url);\n return ok({ targetId: result.targetId });\n } catch (error) {\n return failure(serializeError(error).message, \"target_new_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createTargetCloseTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Close a target (tab).\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n targetId: z.string().describe(\"Target id\")\n },\n async execute(args) {\n try {\n await deps.manager.closeTarget(args.sessionId, args.targetId);\n return ok({});\n } catch (error) {\n return failure(serializeError(error).message, \"target_close_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createPageTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Open or focus a named page, optionally navigating to a URL.\",\n args: {\n sessionId: z.string().describe(\"Active browser session id\"),\n name: z.string().describe(\"Stable page name\"),\n url: z.string().optional().describe(\"Optional URL to open\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.page(args.sessionId, args.name, args.url);\n return ok({\n targetId: result.targetId,\n created: result.created,\n url: result.url,\n title: result.title\n });\n } catch (error) {\n return failure(serializeError(error).message, \"page_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createListTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"List named pages in the current session.\",\n args: {\n sessionId: z.string().describe(\"Active browser session id\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.listPages(args.sessionId);\n return ok({ pages: result.pages });\n } catch (error) {\n return failure(serializeError(error).message, \"list_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createCloseTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Close a named page within the current session.\",\n args: {\n sessionId: z.string().describe(\"Active browser session id\"),\n name: z.string().describe(\"Named page to close\")\n },\n async execute(args) {\n try {\n await deps.manager.closePage(args.sessionId, args.name);\n return ok({});\n } catch (error) {\n return failure(serializeError(error).message, \"close_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nconst waitUntilSchema = z.enum([\"domcontentloaded\", \"load\", \"networkidle\"]);\n\nexport function createGotoTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Navigate the active target to a URL.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n url: z.string().describe(\"URL to navigate to\"),\n waitUntil: waitUntilSchema.optional().describe(\"Load state to wait for\"),\n timeoutMs: z.number().int().optional().describe(\"Timeout in milliseconds\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.goto(\n args.sessionId,\n args.url,\n args.waitUntil ?? \"load\",\n args.timeoutMs ?? 30000\n );\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"goto_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nconst waitUntilSchema = z.enum([\"domcontentloaded\", \"load\", \"networkidle\"]);\nconst waitStateSchema = z.enum([\"attached\", \"visible\", \"hidden\"]);\n\nexport function createWaitTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Wait for a load state or a ref state.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n until: waitUntilSchema.optional().describe(\"Load state to wait for\"),\n ref: z.string().optional().describe(\"Ref to wait for\"),\n state: waitStateSchema.optional().describe(\"Ref state to wait for\"),\n timeoutMs: z.number().int().optional().describe(\"Timeout in milliseconds\")\n },\n async execute(args) {\n try {\n if (args.ref) {\n const result = await deps.manager.waitForRef(\n args.sessionId,\n args.ref,\n args.state ?? \"attached\",\n args.timeoutMs ?? 30000\n );\n return ok(result);\n }\n\n if (!args.until) {\n return failure(\"Provide either ref or until\", \"wait_invalid\");\n }\n\n const result = await deps.manager.waitForLoad(\n args.sessionId,\n args.until,\n args.timeoutMs ?? 30000\n );\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"wait_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nconst formatSchema = z.enum([\"outline\", \"actionables\"]);\n\nexport function createSnapshotTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Capture a snapshot of the current page and return refs.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n format: formatSchema.optional().describe(\"Snapshot format\"),\n maxChars: z.number().int().optional().describe(\"Max characters for snapshot output\"),\n cursor: z.string().optional().describe(\"Cursor for paging\")\n },\n async execute(args) {\n try {\n const config = deps.config.get();\n const result = await deps.manager.snapshot(\n args.sessionId,\n args.format ?? \"outline\",\n args.maxChars ?? config.snapshot.maxChars,\n args.cursor\n );\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"snapshot_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createClickTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Click a referenced element.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n ref: z.string().describe(\"Element ref\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.click(args.sessionId, args.ref);\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"click_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createTypeTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Type text into a referenced input.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n ref: z.string().describe(\"Element ref\"),\n text: z.string().describe(\"Text to type\"),\n clear: z.boolean().optional().describe(\"Clear before typing\"),\n submit: z.boolean().optional().describe(\"Press Enter after typing\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.type(\n args.sessionId,\n args.ref,\n args.text,\n Boolean(args.clear),\n Boolean(args.submit)\n );\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"type_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createSelectTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Select options in a referenced select element.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n ref: z.string().describe(\"Element ref\"),\n values: z.array(z.string()).describe(\"Values to select\")\n },\n async execute(args) {\n try {\n await deps.manager.select(args.sessionId, args.ref, args.values);\n return ok({});\n } catch (error) {\n return failure(serializeError(error).message, \"select_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createScrollTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Scroll the page or a referenced element.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n dy: z.number().describe(\"Scroll delta in pixels\"),\n ref: z.string().optional().describe(\"Optional element ref to scroll\")\n },\n async execute(args) {\n try {\n await deps.manager.scroll(args.sessionId, args.dy, args.ref);\n return ok({});\n } catch (error) {\n return failure(serializeError(error).message, \"scroll_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createDomGetHtmlTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Get outerHTML for a referenced element.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n ref: z.string().describe(\"Element ref\"),\n maxChars: z.number().int().optional().describe(\"Max characters\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.domGetHtml(\n args.sessionId,\n args.ref,\n args.maxChars ?? 8000\n );\n return ok({\n ref: args.ref,\n outerHTML: result.outerHTML,\n truncated: result.truncated\n });\n } catch (error) {\n return failure(serializeError(error).message, \"dom_get_html_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createDomGetTextTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Get inner text for a referenced element.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n ref: z.string().describe(\"Element ref\"),\n maxChars: z.number().int().optional().describe(\"Max characters\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.domGetText(\n args.sessionId,\n args.ref,\n args.maxChars ?? 8000\n );\n return ok({\n ref: args.ref,\n text: result.text,\n truncated: result.truncated\n });\n } catch (error) {\n return failure(serializeError(error).message, \"dom_get_text_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nconst stepSchema = z.object({\n action: z.string().describe(\"Action name\"),\n args: z.record(z.string(), z.unknown()).optional().describe(\"Action arguments\")\n});\n\nexport function createRunTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Run multiple actions in a single tool call.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n steps: z.array(stepSchema).describe(\"Steps to execute\"),\n stopOnError: z.boolean().optional().describe(\"Stop when a step fails\"),\n maxSnapshotChars: z.number().int().optional().describe(\"Default maxChars for snapshot steps\")\n },\n async execute(args) {\n try {\n const steps = normalizeSteps(args.steps, args.maxSnapshotChars);\n const result = await deps.runner.run(\n args.sessionId,\n steps,\n args.stopOnError ?? true\n );\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"run_failed\");\n }\n }\n });\n}\n\nfunction normalizeSteps(\n steps: Array<{ action: string; args?: Record<string, unknown> }>,\n maxSnapshotChars?: number\n): Array<{ action: string; args?: Record<string, unknown> }> {\n if (!maxSnapshotChars) return steps;\n\n return steps.map((step) => {\n if (step.action !== \"snapshot\") return step;\n if (step.args && typeof step.args.maxChars === \"number\") return step;\n return {\n ...step,\n args: {\n ...step.args,\n maxChars: maxSnapshotChars\n }\n };\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createPromptingGuideTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Return best-practice prompting guidance for OpenDevBrowser.\",\n args: {\n topic: z.string().optional().describe(\"Optional topic for guidance\")\n },\n async execute(args) {\n try {\n const guide = await deps.skills.loadBestPractices(args.topic);\n return ok({ guide });\n } catch (error) {\n return failure(serializeError(error).message, \"prompting_guide_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createConsolePollTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Poll console events for the active target.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n sinceSeq: z.number().int().optional().describe(\"Sequence to resume from\"),\n max: z.number().int().optional().describe(\"Max events to return\")\n },\n async execute(args) {\n try {\n const result = deps.manager.consolePoll(\n args.sessionId,\n args.sinceSeq,\n args.max ?? 50\n );\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"console_poll_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createNetworkPollTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Poll network events for the active target.\",\n args: {\n sessionId: z.string().describe(\"Session id\"),\n sinceSeq: z.number().int().optional().describe(\"Sequence to resume from\"),\n max: z.number().int().optional().describe(\"Max events to return\")\n },\n async execute(args) {\n try {\n const result = deps.manager.networkPoll(\n args.sessionId,\n args.sinceSeq,\n args.max ?? 50\n );\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"network_poll_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createClonePageTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Export the active page as a React component and CSS bundle.\",\n args: {\n sessionId: z.string().describe(\"Active browser session id\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.clonePage(args.sessionId);\n return ok({ component: result.component, css: result.css, warnings: result.warnings });\n } catch (error) {\n return failure(serializeError(error).message, \"clone_page_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createCloneComponentTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Export a selected element subtree as a React component and CSS bundle.\",\n args: {\n sessionId: z.string().describe(\"Active browser session id\"),\n ref: z.string().describe(\"Element ref from snapshot\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.cloneComponent(args.sessionId, args.ref);\n return ok({ component: result.component, css: result.css, warnings: result.warnings });\n } catch (error) {\n return failure(serializeError(error).message, \"clone_component_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createPerfTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Fetch lightweight performance metrics from the active page.\",\n args: {\n sessionId: z.string().describe(\"Active browser session id\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.perfMetrics(args.sessionId);\n return ok({ metrics: result.metrics });\n } catch (error) {\n return failure(serializeError(error).message, \"perf_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { failure, ok, serializeError } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createScreenshotTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Capture a screenshot of the active page.\",\n args: {\n sessionId: z.string().describe(\"Active browser session id\"),\n path: z.string().optional().describe(\"Optional output file path\")\n },\n async execute(args) {\n try {\n const result = await deps.manager.screenshot(args.sessionId, args.path);\n return ok(result);\n } catch (error) {\n return failure(serializeError(error).message, \"screenshot_failed\");\n }\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { ok } from \"./response\";\n\nexport function createSkillListTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"List available skills from OpenCode skill directories (compatibility wrapper)\",\n args: {},\n async execute() {\n const skills = await deps.skills.listSkills();\n const skillList = skills.map((s) => ({\n name: s.name,\n description: s.description,\n version: s.version\n }));\n return ok({ skills: skillList, count: skillList.length });\n }\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { ok, failure } from \"./response\";\n\nconst z = tool.schema;\n\nexport function createSkillLoadTool(deps: ToolDeps): ToolDefinition {\n return tool({\n description: \"Load a specific skill by name from OpenCode skill directories (compatibility wrapper)\",\n args: {\n name: z.string().describe(\"Name of the skill to load (e.g., 'login-automation', 'form-testing')\"),\n topic: z.string().optional().describe(\"Optional topic to filter the skill content\")\n },\n async execute(args) {\n try {\n const content = await deps.skills.loadSkill(args.name, args.topic);\n return ok({ skill: args.name, topic: args.topic, content });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return failure(`Failed to load skill '${args.name}': ${message}`, \"SKILL_NOT_FOUND\");\n }\n }\n });\n}\n","import type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { ToolDeps } from \"./deps\";\nimport { createLaunchTool } from \"./launch\";\nimport { createConnectTool } from \"./connect\";\nimport { createDisconnectTool } from \"./disconnect\";\nimport { createStatusTool } from \"./status\";\nimport { createTargetsListTool } from \"./targets_list\";\nimport { createTargetUseTool } from \"./target_use\";\nimport { createTargetNewTool } from \"./target_new\";\nimport { createTargetCloseTool } from \"./target_close\";\nimport { createPageTool } from \"./page\";\nimport { createListTool } from \"./list\";\nimport { createCloseTool } from \"./close\";\nimport { createGotoTool } from \"./goto\";\nimport { createWaitTool } from \"./wait\";\nimport { createSnapshotTool } from \"./snapshot\";\nimport { createClickTool } from \"./click\";\nimport { createTypeTool } from \"./type\";\nimport { createSelectTool } from \"./select\";\nimport { createScrollTool } from \"./scroll\";\nimport { createDomGetHtmlTool } from \"./dom_get_html\";\nimport { createDomGetTextTool } from \"./dom_get_text\";\nimport { createRunTool } from \"./run\";\nimport { createPromptingGuideTool } from \"./prompting_guide\";\nimport { createConsolePollTool } from \"./console_poll\";\nimport { createNetworkPollTool } from \"./network_poll\";\nimport { createClonePageTool } from \"./clone_page\";\nimport { createCloneComponentTool } from \"./clone_component\";\nimport { createPerfTool } from \"./perf\";\nimport { createScreenshotTool } from \"./screenshot\";\nimport { createSkillListTool } from \"./skill_list\";\nimport { createSkillLoadTool } from \"./skill_load\";\n\nexport function createTools(deps: ToolDeps): Record<string, ToolDefinition> {\n return {\n opendevbrowser_launch: createLaunchTool(deps),\n opendevbrowser_connect: createConnectTool(deps),\n opendevbrowser_disconnect: createDisconnectTool(deps),\n opendevbrowser_status: createStatusTool(deps),\n opendevbrowser_targets_list: createTargetsListTool(deps),\n opendevbrowser_target_use: createTargetUseTool(deps),\n opendevbrowser_target_new: createTargetNewTool(deps),\n opendevbrowser_target_close: createTargetCloseTool(deps),\n opendevbrowser_page: createPageTool(deps),\n opendevbrowser_list: createListTool(deps),\n opendevbrowser_close: createCloseTool(deps),\n opendevbrowser_goto: createGotoTool(deps),\n opendevbrowser_wait: createWaitTool(deps),\n opendevbrowser_snapshot: createSnapshotTool(deps),\n opendevbrowser_click: createClickTool(deps),\n opendevbrowser_type: createTypeTool(deps),\n opendevbrowser_select: createSelectTool(deps),\n opendevbrowser_scroll: createScrollTool(deps),\n opendevbrowser_dom_get_html: createDomGetHtmlTool(deps),\n opendevbrowser_dom_get_text: createDomGetTextTool(deps),\n opendevbrowser_run: createRunTool(deps),\n opendevbrowser_prompting_guide: createPromptingGuideTool(deps),\n opendevbrowser_console_poll: createConsolePollTool(deps),\n opendevbrowser_network_poll: createNetworkPollTool(deps),\n opendevbrowser_clone_page: createClonePageTool(deps),\n opendevbrowser_clone_component: createCloneComponentTool(deps),\n opendevbrowser_perf: createPerfTool(deps),\n opendevbrowser_screenshot: createScreenshotTool(deps),\n opendevbrowser_skill_list: createSkillListTool(deps),\n opendevbrowser_skill_load: createSkillLoadTool(deps)\n };\n}\n","import type { Plugin } from \"@opencode-ai/plugin\";\nimport { loadGlobalConfig, ConfigStore } from \"./config\";\nimport { BrowserManager } from \"./browser/browser-manager\";\nimport { ScriptRunner } from \"./browser/script-runner\";\nimport { SkillLoader } from \"./skills/skill-loader\";\nimport {\n buildSkillNudgeMessage,\n clearSkillNudge,\n consumeSkillNudge,\n createSkillNudgeState,\n extractTextFromParts,\n markSkillNudge,\n shouldTriggerSkillNudge,\n SKILL_NUDGE_MARKER\n} from \"./skills/skill-nudge\";\nimport {\n buildContinuityNudgeMessage,\n clearContinuityNudge,\n consumeContinuityNudge,\n createContinuityNudgeState,\n markContinuityNudge,\n shouldTriggerContinuityNudge,\n CONTINUITY_NUDGE_MARKER\n} from \"./skills/continuity-nudge\";\nimport { RelayServer } from \"./relay/relay-server\";\nimport { createTools } from \"./tools\";\nimport { extractExtension, getExtensionPath } from \"./extension-extractor\";\n\nconst OpenDevBrowserPlugin: Plugin = async ({ directory, worktree }) => {\n const initialConfig = loadGlobalConfig();\n const configStore = new ConfigStore(initialConfig);\n const cacheRoot = worktree || directory;\n const manager = new BrowserManager(cacheRoot, initialConfig);\n const runner = new ScriptRunner(manager);\n const skills = new SkillLoader(cacheRoot, initialConfig.skillPaths);\n const relay = new RelayServer();\n const skillNudgeState = createSkillNudgeState();\n const continuityNudgeState = createContinuityNudgeState();\n relay.setToken(initialConfig.relayToken);\n\n // Minimal startup signal for local testing/debugging.\n // Avoid logging secrets (relayToken can be a string).\n console.info(\n `[opendevbrowser] loaded (cacheRoot=${cacheRoot}, relay=${initialConfig.relayToken === false ? \"disabled\" : \"enabled\"})`\n );\n\n try {\n extractExtension();\n } catch (error) {\n // Extension extraction is best-effort; keep plugin usable if it fails.\n console.warn(\"Extension extraction failed:\", error instanceof Error ? error.message : error);\n }\n\n const ensureRelay = async (port: number) => {\n if (port <= 0 || initialConfig.relayToken === false) {\n relay.stop();\n return;\n }\n const status = relay.status();\n if (status.running && status.port === port) {\n return;\n }\n relay.stop();\n try {\n await relay.start(port);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"EADDRINUSE\") || message.includes(\"in use\")) {\n console.warn(`[opendevbrowser] Relay server port ${port} is already in use. Extension pairing will be unavailable.`);\n console.warn(`[opendevbrowser] To fix: kill the process using port ${port} or change relayPort in config.`);\n } else {\n console.warn(`[opendevbrowser] Failed to start relay server: ${message}`);\n }\n // Security: we explicitly allow the plugin to continue without the relay server\n // to ensure core functionality remains available even if the port is blocked.\n }\n };\n\n // Necessary: clean up all browser sessions and the relay server on exit\n // to prevent zombie processes and locked ports.\n const cleanup = () => {\n relay.stop();\n manager.closeAll().catch(() => {});\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n process.on(\"beforeExit\", cleanup);\n\n await ensureRelay(initialConfig.relayPort);\n\n return {\n tool: createTools({ manager, runner, config: configStore, skills, relay, getExtensionPath }),\n \"chat.message\": async (_input, output) => {\n const config = configStore.get();\n if (output.message.role !== \"user\") return;\n\n const text = extractTextFromParts(output.parts);\n if (!text) return;\n\n if (config.skills.nudge.enabled && shouldTriggerSkillNudge(text, config.skills.nudge.keywords)) {\n markSkillNudge(skillNudgeState, Date.now());\n }\n\n if (config.continuity.enabled && config.continuity.nudge.enabled) {\n if (shouldTriggerContinuityNudge(text, config.continuity.nudge.keywords)) {\n markContinuityNudge(continuityNudgeState, Date.now());\n }\n }\n },\n \"experimental.chat.system.transform\": async (_input, output) => {\n const config = configStore.get();\n const systemEntries = output.system ?? [];\n let nextEntries = systemEntries;\n let changed = false;\n\n if (config.skills.nudge.enabled) {\n if (systemEntries.some((entry) => entry.includes(SKILL_NUDGE_MARKER))) {\n clearSkillNudge(skillNudgeState);\n } else if (consumeSkillNudge(skillNudgeState, Date.now(), config.skills.nudge.maxAgeMs)) {\n nextEntries = [...nextEntries, buildSkillNudgeMessage()];\n changed = true;\n }\n }\n\n if (config.continuity.enabled && config.continuity.nudge.enabled) {\n if (systemEntries.some((entry) => entry.includes(CONTINUITY_NUDGE_MARKER))) {\n clearContinuityNudge(continuityNudgeState);\n } else if (consumeContinuityNudge(\n continuityNudgeState,\n Date.now(),\n config.continuity.nudge.maxAgeMs\n )) {\n nextEntries = [...nextEntries, buildContinuityNudgeMessage(config.continuity.filePath)];\n changed = true;\n }\n }\n\n if (changed) {\n output.system = nextEntries;\n }\n }\n };\n};\n\nexport default OpenDevBrowserPlugin;\n"],"mappings":"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","names":["randomUUID","mkdir","join","homedir","join","path","join","homedir","join","path","el","redactText","randomUUID","join","randomUUID","mkdir","page","path","join","os","z","tool","z","tool","tool","z","tool","readFileSync","dirname","join","tool","z","tool","dirname","join","readFileSync","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","waitUntilSchema","result","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","z","tool","tool","tool","tool","z","tool"]}
@@ -0,0 +1,32 @@
1
+ import { ConnectionManager } from "./services/ConnectionManager.js";
2
+ const connection = new ConnectionManager();
3
+ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
4
+ const respond = (status) => {
5
+ sendResponse(status);
6
+ };
7
+ if (message.type === "status") {
8
+ respond({ type: "status", status: connection.getStatus() });
9
+ return true;
10
+ }
11
+ if (message.type === "connect") {
12
+ (async () => {
13
+ await connection.connect();
14
+ respond({ type: "status", status: connection.getStatus() });
15
+ })().catch(() => {
16
+ connection.disconnect();
17
+ respond({ type: "status", status: connection.getStatus() });
18
+ });
19
+ return true;
20
+ }
21
+ if (message.type === "disconnect") {
22
+ (async () => {
23
+ await connection.disconnect();
24
+ respond({ type: "status", status: connection.getStatus() });
25
+ })().catch(() => {
26
+ connection.disconnect();
27
+ respond({ type: "status", status: connection.getStatus() });
28
+ });
29
+ return true;
30
+ }
31
+ return false;
32
+ });