opendevbrowser 0.0.11 → 0.0.12
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.
- package/README.md +74 -1
- package/dist/chunk-WTFSMBVH.js +2815 -0
- package/dist/chunk-WTFSMBVH.js.map +1 -0
- package/dist/cli/index.js +1589 -71
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +164 -2804
- package/dist/index.js.map +1 -1
- package/dist/opendevbrowser.js +164 -2804
- package/dist/opendevbrowser.js.map +1 -1
- package/extension/dist/background.js +121 -0
- package/extension/dist/popup.js +37 -5
- package/extension/dist/relay-settings.js +2 -1
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/manifest.json +1 -1
- package/extension/popup.html +326 -66
- package/package.json +1 -1
- package/skills/AGENTS.md +1 -0
- package/dist/chunk-R5VUZEUU.js +0 -128
- package/dist/chunk-R5VUZEUU.js.map +0 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/args.ts","../../src/cli/installers/global.ts","../../src/cli/utils/config.ts","../../src/utils/fs.ts","../../src/cli/templates/config.ts","../../src/cli/installers/local.ts","../../src/cli/installers/skills.ts","../../src/cli/utils/skills.ts","../../src/cli/commands/update.ts","../../src/cli/commands/uninstall.ts","../../src/cli/index.ts"],"sourcesContent":["export type CliCommand = \"install\" | \"update\" | \"uninstall\" | \"help\" | \"version\";\nexport type InstallMode = \"global\" | \"local\";\nexport type SkillsMode = \"global\" | \"local\" | \"none\";\n\nexport interface ParsedArgs {\n command: CliCommand;\n mode?: InstallMode;\n withConfig: boolean;\n noPrompt: boolean;\n skillsMode: SkillsMode;\n fullInstall: boolean;\n}\n\nconst SHORT_FLAGS: Record<string, string> = {\n \"-g\": \"--global\",\n \"-l\": \"--local\",\n \"-u\": \"--update\",\n \"-h\": \"--help\",\n \"-v\": \"--version\",\n \"-f\": \"--full\"\n};\n\nfunction expandShortFlags(args: string[]): string[] {\n return args.map((arg) => SHORT_FLAGS[arg] ?? arg);\n}\n\nfunction parseSkillsMode(args: string[]): SkillsMode {\n if (args.includes(\"--no-skills\")) {\n return \"none\";\n }\n if (args.includes(\"--skills-local\")) {\n return \"local\";\n }\n if (args.includes(\"--skills-global\")) {\n return \"global\";\n }\n return \"global\";\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = expandShortFlags(argv.slice(2));\n const skillsMode = parseSkillsMode(args);\n const fullInstall = args.includes(\"--full\");\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n return { command: \"help\", withConfig: false, noPrompt: false, skillsMode, fullInstall };\n }\n\n if (args.includes(\"--version\") || args.includes(\"-v\")) {\n return { command: \"version\", withConfig: false, noPrompt: false, skillsMode, fullInstall };\n }\n\n if (args.includes(\"--update\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n return { command: \"update\", mode, withConfig: false, noPrompt: false, skillsMode, fullInstall };\n }\n\n if (args.includes(\"--uninstall\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n const noPrompt = args.includes(\"--no-prompt\");\n return { command: \"uninstall\", mode, withConfig: false, noPrompt, skillsMode, fullInstall };\n }\n\n const withConfig = args.includes(\"--with-config\") || fullInstall;\n const noPrompt = args.includes(\"--no-prompt\");\n\n let mode: InstallMode | undefined;\n if (args.includes(\"--global\")) {\n mode = \"global\";\n } else if (args.includes(\"--local\")) {\n mode = \"local\";\n } else if (noPrompt) {\n mode = \"global\";\n }\n\n const validFlags = new Set([\n \"--global\", \"--local\", \"--update\", \"--uninstall\",\n \"--help\", \"--version\", \"--with-config\", \"--no-prompt\",\n \"--full\",\n \"--skills-global\", \"--skills-local\", \"--no-skills\"\n ]);\n \n for (const arg of args) {\n if (arg.startsWith(\"--\") && !validFlags.has(arg)) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n if (arg.startsWith(\"-\") && !arg.startsWith(\"--\") && !SHORT_FLAGS[arg]) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n }\n\n return { command: \"install\", mode, withConfig, noPrompt, skillsMode, fullInstall };\n}\n\nexport function getHelpText(): string {\n return `\nOpenDevBrowser CLI - Install and manage the OpenDevBrowser plugin\n\nUSAGE:\n npx opendevbrowser [options]\n\nCOMMANDS:\n (default) Install the plugin (interactive if no mode specified)\n --update, -u Clear cached plugin to trigger reinstall\n --uninstall Remove plugin from config\n --help, -h Show this help message\n --version, -v Show version\n\nINSTALL OPTIONS:\n --global, -g Install to ~/.config/opencode/opencode.json\n --local, -l Install to ./opencode.json (project-local)\n --with-config Also create opendevbrowser.jsonc with defaults\n --full, -f Create config and pre-extract extension assets\n --no-prompt Skip prompts, use defaults (global install)\n --skills-global Install bundled skills to ~/.config/opencode/skill (default)\n --skills-local Install bundled skills to ./.opencode/skill\n --no-skills Skip installing bundled skills\n\nEXAMPLES:\n npx opendevbrowser # Interactive install\n npx opendevbrowser --global # Global install\n npx opendevbrowser --local # Project install\n npx opendevbrowser --full # Install + config + extension assets\n npx opendevbrowser -g --with-config # Global + config file\n npx opendevbrowser --skills-local # Install skills locally\n npx opendevbrowser --no-skills # Skip skill installation\n npx opendevbrowser --update # Update plugin\n npx opendevbrowser --uninstall --global # Remove from global config\n`.trim();\n}\n","import * as fs from \"fs\";\nimport {\n getGlobalConfigPath,\n readConfig,\n hasPlugin,\n ensureDir,\n updateConfigContent\n} from \"../utils/config\";\nimport { createPluginConfig } from \"../templates/config\";\n\nexport interface InstallResult {\n success: boolean;\n message: string;\n configPath: string;\n created: boolean;\n alreadyInstalled: boolean;\n}\n\nexport function installGlobal(withConfig: boolean = false): InstallResult {\n const configPath = getGlobalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is already installed in ${configPath}`,\n configPath,\n created: false,\n alreadyInstalled: true\n };\n }\n\n const newContent = updateConfigContent(content, \"opendevbrowser\");\n\n ensureDir(configPath.replace(/[/\\\\][^/\\\\]+$/, \"\"));\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n if (withConfig) {\n createPluginConfig(\"global\");\n }\n\n return {\n success: true,\n message: `Added opendevbrowser to ${configPath}`,\n configPath,\n created: content.trim() === \"\",\n alreadyInstalled: false\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install globally: ${message}`,\n configPath,\n created: false,\n alreadyInstalled: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { parse as parseJsonc, modify, applyEdits } from \"jsonc-parser\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\nconst SCHEMA_URL = \"https://opencode.ai/config.json\";\n\nexport interface OpenCodeConfig {\n $schema?: string;\n plugin?: string[];\n [key: string]: unknown;\n}\n\nexport function getGlobalConfigPath(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opencode.json\");\n}\n\nexport function getLocalConfigPath(): string {\n return path.join(process.cwd(), \"opencode.json\");\n}\n\nexport function ensureDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n}\n\nexport function readConfig(configPath: string): { content: string; config: OpenCodeConfig } {\n if (!fs.existsSync(configPath)) {\n return { content: \"\", config: {} };\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const errors: Array<{ error: number; offset: number; length: number }> = [];\n const parsed = parseJsonc(content, errors, { allowTrailingComma: true });\n\n if (errors.length > 0) {\n const firstError = errors[0];\n throw new Error(`Invalid JSONC at ${configPath}: parse error at offset ${firstError?.offset ?? 0}`);\n }\n\n return { content, config: (parsed ?? {}) as OpenCodeConfig };\n}\n\nexport function writeConfig(configPath: string, config: OpenCodeConfig): void {\n ensureDir(path.dirname(configPath));\n const content = JSON.stringify(config, null, 2) + \"\\n\";\n writeFileAtomic(configPath, content);\n}\n\nexport function addPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (!result.$schema) {\n result.$schema = SCHEMA_URL;\n }\n\n if (!result.plugin) {\n result.plugin = [pluginName];\n } else if (!result.plugin.includes(pluginName)) {\n result.plugin = [...result.plugin, pluginName];\n }\n\n return result;\n}\n\nexport function removePlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (result.plugin) {\n result.plugin = result.plugin.filter((p) => p !== pluginName);\n if (result.plugin.length === 0) {\n delete result.plugin;\n }\n }\n\n return result;\n}\n\nexport function hasPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): boolean {\n return config.plugin?.includes(pluginName) ?? false;\n}\n\nexport function createConfigWithPlugin(pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n return {\n $schema: SCHEMA_URL,\n plugin: [pluginName]\n };\n}\n\nexport function updateConfigContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return JSON.stringify(createConfigWithPlugin(pluginName), null, 2) + \"\\n\";\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n let result = content;\n\n if (!parsed.$schema) {\n const edits = modify(result, [\"$schema\"], SCHEMA_URL, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n }\n\n const newPlugins = parsed.plugin ? [...parsed.plugin, pluginName] : [pluginName];\n const edits = modify(result, [\"plugin\"], newPlugins, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n\n return result;\n}\n\nexport function removePluginFromContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return content;\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (!parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n const newPlugins = parsed.plugin.filter((p) => p !== pluginName);\n const edits = modify(content, [\"plugin\"], newPlugins.length > 0 ? newPlugins : undefined, {\n formattingOptions: { tabSize: 2, insertSpaces: true }\n });\n\n return applyEdits(content, edits);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as crypto from \"crypto\";\n\nexport function writeFileAtomic(\n filePath: string,\n content: string,\n options: { encoding?: BufferEncoding; mode?: number } = {}\n): void {\n const { encoding = \"utf-8\", mode } = options;\n const dir = path.dirname(filePath);\n const hash = crypto.randomBytes(8).toString(\"hex\");\n const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${hash}.tmp`);\n\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const writeOptions: fs.WriteFileOptions = { encoding };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n fs.writeFileSync(tempPath, content, writeOptions);\n fs.renameSync(tempPath, filePath);\n } catch (error) {\n try {\n if (fs.existsSync(tempPath)) {\n fs.unlinkSync(tempPath);\n }\n } catch {\n /* best-effort cleanup */\n }\n throw error;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { generateSecureToken } from \"../../utils/crypto\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nfunction buildConfigTemplate(token: string): string {\n return `{\n // OpenDevBrowser Plugin Configuration\n // See: https://github.com/anthropics/opendevbrowser#configuration\n\n \"headless\": false,\n \"profile\": \"default\",\n \"persistProfile\": true,\n\n \"snapshot\": {\n \"maxChars\": 16000,\n \"maxNodes\": 1000\n },\n\n \"export\": {\n \"maxNodes\": 1000,\n \"inlineStyles\": true\n },\n\n \"devtools\": {\n \"showFullUrls\": false,\n \"showFullConsole\": false\n },\n\n \"security\": {\n \"allowRawCDP\": false,\n \"allowNonLocalCdp\": false,\n \"allowUnsafeExport\": false\n },\n\n \"skillPaths\": [],\n \"skills\": {\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\"login\", \"form\", \"extract\"],\n \"maxAgeMs\": 60000\n }\n },\n\n \"continuity\": {\n \"enabled\": true,\n \"filePath\": \"opendevbrowser_continuity.md\",\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\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\": 60000\n }\n },\n\n \"relayPort\": 8787,\n \"relayToken\": \"${token}\",\n\n \"flags\": [],\n\n \"checkForUpdates\": false\n}\n`;\n}\n\nexport function getPluginConfigPath(mode: \"global\" | \"local\"): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nexport function createPluginConfig(mode: \"global\" | \"local\"): { created: boolean; path: string } {\n const configPath = getPluginConfigPath(mode);\n\n if (fs.existsSync(configPath)) {\n return { created: false, path: configPath };\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const token = generateSecureToken();\n writeFileAtomic(configPath, buildConfigTemplate(token));\n return { created: true, path: configPath };\n}\n\nexport function getConfigTemplate(): string {\n return buildConfigTemplate(generateSecureToken());\n}\n","import * as fs from \"fs\";\nimport {\n getLocalConfigPath,\n readConfig,\n hasPlugin,\n updateConfigContent\n} from \"../utils/config\";\nimport { createPluginConfig } from \"../templates/config\";\n\nexport interface InstallResult {\n success: boolean;\n message: string;\n configPath: string;\n created: boolean;\n alreadyInstalled: boolean;\n}\n\nexport function installLocal(withConfig: boolean = false): InstallResult {\n const configPath = getLocalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is already installed in ${configPath}`,\n configPath,\n created: false,\n alreadyInstalled: true\n };\n }\n\n const newContent = updateConfigContent(content, \"opendevbrowser\");\n\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n if (withConfig) {\n createPluginConfig(\"local\");\n }\n\n return {\n success: true,\n message: `Added opendevbrowser to ${configPath}`,\n configPath,\n created: content.trim() === \"\",\n alreadyInstalled: false\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install locally: ${message}`,\n configPath,\n created: false,\n alreadyInstalled: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { ensureDir } from \"../utils/config\";\nimport { getBundledSkillsDir, getGlobalSkillDir, getLocalSkillDir } from \"../utils/skills\";\n\nexport type SkillInstallMode = \"global\" | \"local\";\n\nexport interface SkillInstallResult {\n success: boolean;\n message: string;\n targetDir: string;\n installed: string[];\n skipped: string[];\n}\n\nexport function installSkills(mode: SkillInstallMode): SkillInstallResult {\n const targetDir = mode === \"global\" ? getGlobalSkillDir() : getLocalSkillDir();\n const installed: string[] = [];\n const skipped: string[] = [];\n\n try {\n const sourceDir = getBundledSkillsDir();\n const entries = fs.readdirSync(sourceDir, { withFileTypes: true });\n\n ensureDir(targetDir);\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillName = entry.name;\n const sourcePath = path.join(sourceDir, skillName);\n const targetPath = path.join(targetDir, skillName);\n\n if (fs.existsSync(targetPath)) {\n skipped.push(skillName);\n continue;\n }\n\n fs.cpSync(sourcePath, targetPath, { recursive: true });\n installed.push(skillName);\n }\n\n const summary = `Skills ${mode} install: ${installed.length} installed${skipped.length ? `, ${skipped.length} skipped` : \"\"} (${targetDir})`;\n return {\n success: true,\n message: summary,\n targetDir,\n installed,\n skipped\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install skills (${mode}): ${message}`,\n targetDir,\n installed,\n skipped\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst PACKAGE_NAME = \"opendevbrowser\";\nconst SKILL_DIR_NAME = \"skill\";\n\nlet cachedPackageRoot: string | null = null;\n\nfunction findPackageRoot(startDir: string): string {\n let current = startDir;\n\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")) as { name?: string };\n if (parsed.name === PACKAGE_NAME) {\n return current;\n }\n } catch {\n void 0;\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n throw new Error(\"Unable to locate opendevbrowser package root for skill installation.\");\n}\n\nexport function getPackageRoot(): string {\n if (cachedPackageRoot) return cachedPackageRoot;\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n cachedPackageRoot = findPackageRoot(moduleDir);\n return cachedPackageRoot;\n}\n\nexport function getBundledSkillsDir(): string {\n const skillsDir = path.join(getPackageRoot(), \"skills\");\n if (!fs.existsSync(skillsDir)) {\n throw new Error(`Bundled skills directory not found at ${skillsDir}`);\n }\n return skillsDir;\n}\n\nexport function getGlobalSkillDir(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, SKILL_DIR_NAME);\n}\n\nexport function getLocalSkillDir(): string {\n return path.join(process.cwd(), \".opencode\", SKILL_DIR_NAME);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\n\nexport interface UpdateResult {\n success: boolean;\n message: string;\n cleared: boolean;\n}\n\nfunction getCacheDir(): string {\n return process.env.OPENCODE_CACHE_DIR\n || path.join(os.homedir(), \".cache\", \"opencode\");\n}\n\nfunction rmdir(dirPath: string): void {\n const cacheDir = getCacheDir();\n const resolvedCache = path.resolve(cacheDir);\n const resolvedPath = path.resolve(dirPath);\n\n if (!resolvedPath.startsWith(resolvedCache + path.sep) || resolvedPath === resolvedCache) {\n throw new Error(`Security: refusing to delete path outside cache directory: ${dirPath}`);\n }\n\n if (fs.existsSync(dirPath)) {\n fs.rmSync(dirPath, { recursive: true, force: true });\n }\n}\n\nexport function runUpdate(): UpdateResult {\n const cacheDir = getCacheDir();\n const nodeModulesDir = path.join(cacheDir, \"node_modules\");\n const pluginCacheDir = path.join(nodeModulesDir, PLUGIN_NAME);\n\n try {\n if (!fs.existsSync(pluginCacheDir)) {\n if (fs.existsSync(nodeModulesDir)) {\n rmdir(nodeModulesDir);\n return {\n success: true,\n message: \"Cleared OpenCode plugin cache. The latest version will be installed on next run.\",\n cleared: true\n };\n }\n\n return {\n success: true,\n message: \"No cached plugin found. OpenCode will install the latest version on next run.\",\n cleared: false\n };\n }\n\n rmdir(pluginCacheDir);\n\n return {\n success: true,\n message: \"Cache cleared. OpenCode will install the latest version on next run.\",\n cleared: true\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to clear cache: ${message}`,\n cleared: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport {\n getGlobalConfigPath,\n getLocalConfigPath,\n readConfig,\n hasPlugin,\n removePluginFromContent\n} from \"../utils/config\";\nimport type { InstallMode } from \"../args\";\n\nexport interface UninstallResult {\n success: boolean;\n message: string;\n configPath?: string;\n removed: boolean;\n configFileDeleted: boolean;\n}\n\nfunction getPluginConfigPath(mode: InstallMode): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nfunction removePluginConfigFile(mode: InstallMode): boolean {\n const configPath = getPluginConfigPath(mode);\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\nexport function runUninstall(\n mode: InstallMode,\n deleteConfigFile: boolean = false\n): UninstallResult {\n const configPath = mode === \"global\" ? getGlobalConfigPath() : getLocalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (!hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is not installed in ${configPath}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n\n const newContent = removePluginFromContent(content, \"opendevbrowser\");\n\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n let configFileDeleted = false;\n if (deleteConfigFile) {\n configFileDeleted = removePluginConfigFile(mode);\n }\n\n return {\n success: true,\n message: `Removed opendevbrowser from ${configPath}`,\n configPath,\n removed: true,\n configFileDeleted\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to uninstall: ${message}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n}\n\nexport function findInstalledConfigs(): { global: boolean; local: boolean } {\n let global = false;\n let local = false;\n\n try {\n const { config: globalConfig } = readConfig(getGlobalConfigPath());\n global = hasPlugin(globalConfig);\n } catch {\n void 0;\n }\n\n try {\n const { config: localConfig } = readConfig(getLocalConfigPath());\n local = hasPlugin(localConfig);\n } catch {\n void 0;\n }\n\n return { global, local };\n}\n","#!/usr/bin/env node\n\nimport { parseArgs, getHelpText } from \"./args\";\nimport { installGlobal } from \"./installers/global\";\nimport { installLocal } from \"./installers/local\";\nimport { installSkills } from \"./installers/skills\";\nimport { runUpdate } from \"./commands/update\";\nimport { runUninstall, findInstalledConfigs } from \"./commands/uninstall\";\nimport { extractExtension } from \"../extension-extractor\";\nimport type { InstallMode } from \"./args\";\n\nconst VERSION = \"0.1.0\";\n\nasync function promptInstallMode(): Promise<InstallMode> {\n if (!process.stdin.isTTY) {\n console.log(\"Non-interactive mode detected. Using global install.\");\n return \"global\";\n }\n\n return new Promise((resolve) => {\n console.log(\"\\nWhere would you like to install opendevbrowser?\\n\");\n console.log(\" 1. Global (~/.config/opencode/opencode.json)\");\n console.log(\" 2. Local (./opencode.json in this project)\\n\");\n\n process.stdout.write(\"Enter choice [1]: \");\n\n process.stdin.setEncoding(\"utf8\");\n let resolved = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n process.stdin.once(\"data\", (data) => {\n cleanup();\n if (resolved) return;\n resolved = true;\n const input = data.toString().trim();\n if (input === \"2\") {\n resolve(\"local\");\n } else {\n resolve(\"global\");\n }\n });\n\n process.stdin.once(\"close\", () => {\n cleanup();\n if (resolved) return;\n resolved = true;\n resolve(\"global\");\n });\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n if (resolved) return;\n resolved = true;\n console.log(\"\\nTimeout - using global install.\");\n resolve(\"global\");\n }, 30000);\n });\n}\n\nasync function promptUninstallMode(): Promise<InstallMode | null> {\n const installed = findInstalledConfigs();\n\n if (!installed.global && !installed.local) {\n console.log(\"opendevbrowser is not installed in any config.\");\n return null;\n }\n\n if (installed.global && !installed.local) {\n return \"global\";\n }\n\n if (!installed.global && installed.local) {\n return \"local\";\n }\n\n if (!process.stdin.isTTY) {\n console.log(\"Plugin found in both global and local configs. Use --global or --local flag.\");\n return null;\n }\n\n return new Promise((resolve) => {\n console.log(\"\\nopendevbrowser is installed in multiple locations:\\n\");\n console.log(\" 1. Global (~/.config/opencode/opencode.json)\");\n console.log(\" 2. Local (./opencode.json)\");\n console.log(\" 3. Cancel\\n\");\n\n process.stdout.write(\"Which to uninstall? [3]: \");\n\n process.stdin.setEncoding(\"utf8\");\n process.stdin.once(\"data\", (data) => {\n const input = data.toString().trim();\n if (input === \"1\") {\n resolve(\"global\");\n } else if (input === \"2\") {\n resolve(\"local\");\n } else {\n resolve(null);\n }\n });\n\n process.stdin.once(\"close\", () => {\n resolve(null);\n });\n });\n}\n\nasync function main(): Promise<void> {\n try {\n const args = parseArgs(process.argv);\n\n switch (args.command) {\n case \"help\":\n console.log(getHelpText());\n process.exit(0);\n break;\n\n case \"version\":\n console.log(`opendevbrowser v${VERSION}`);\n process.exit(0);\n break;\n\n case \"update\": {\n const result = runUpdate();\n console.log(result.message);\n process.exit(result.success ? 0 : 1);\n break;\n }\n\n case \"uninstall\": {\n let mode = args.mode;\n if (!mode && !args.noPrompt) {\n mode = await promptUninstallMode() ?? undefined;\n if (!mode) {\n console.log(\"Uninstall cancelled.\");\n process.exit(0);\n }\n }\n if (!mode) {\n console.error(\"Error: Please specify --global or --local for uninstall.\");\n process.exit(1);\n }\n const result = runUninstall(mode);\n console.log(result.message);\n process.exit(result.success ? 0 : 1);\n break;\n }\n\n case \"install\":\n default: {\n let mode = args.mode;\n if (!mode) {\n mode = await promptInstallMode();\n }\n\n const result = mode === \"global\"\n ? installGlobal(args.withConfig)\n : installLocal(args.withConfig);\n\n console.log(result.message);\n\n if (args.skillsMode === \"none\") {\n console.log(\"Skill installation skipped (--no-skills).\");\n } else if (result.success) {\n const skillsResult = installSkills(args.skillsMode);\n if (skillsResult.success) {\n console.log(skillsResult.message);\n } else {\n console.warn(skillsResult.message);\n }\n } else {\n console.warn(\"Skill installation skipped because plugin install failed.\");\n }\n\n if (args.fullInstall && result.success) {\n try {\n const extensionPath = extractExtension();\n if (extensionPath) {\n console.log(`Extension assets extracted to ${extensionPath}`);\n } else {\n console.warn(\"Extension assets not found; skipping extraction.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Extension pre-extraction failed: ${message}`);\n }\n }\n\n if (result.success && !result.alreadyInstalled) {\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Start or restart OpenCode\");\n console.log(\" 2. Use opendevbrowser_status to verify the plugin is loaded\");\n console.log(\"\\nFor help: npx opendevbrowser --help\");\n }\n\n process.exit(result.success ? 0 : 1);\n break;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n console.error(\"\\nFor help: npx opendevbrowser --help\");\n process.exit(1);\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(\"Unexpected error:\", error);\n process.exit(1);\n});\n"],"mappings":"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","names":["mode","noPrompt","fs","fs","path","edits","fs","path","os","fs","fs","path","fs","path","os","fs","path","os","PLUGIN_NAME","fs","path","os","getPluginConfigPath","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/errors.ts","../../src/cli/args.ts","../../src/cli/commands/registry.ts","../../src/cli/installers/global.ts","../../src/cli/utils/config.ts","../../src/utils/fs.ts","../../src/cli/templates/config.ts","../../src/cli/installers/local.ts","../../src/cli/installers/skills.ts","../../src/cli/utils/skills.ts","../../src/cli/commands/update.ts","../../src/cli/commands/uninstall.ts","../../src/cli/daemon.ts","../../src/cli/daemon-commands.ts","../../src/cli/commands/serve.ts","../../src/cli/commands/run.ts","../../src/cli/output.ts","../../src/cli/client.ts","../../src/cli/commands/session/launch.ts","../../src/cli/commands/session/connect.ts","../../src/cli/commands/session/disconnect.ts","../../src/cli/commands/session/status.ts","../../src/cli/commands/nav/goto.ts","../../src/cli/commands/nav/wait.ts","../../src/cli/commands/nav/snapshot.ts","../../src/cli/commands/interact/click.ts","../../src/cli/commands/interact/type.ts","../../src/cli/commands/interact/select.ts","../../src/cli/commands/interact/scroll.ts","../../src/cli/index.ts"],"sourcesContent":["import type { CommandResult } from \"./commands/types\";\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_USAGE = 1;\nexport const EXIT_EXECUTION = 2;\nexport const EXIT_DISCONNECTED = 10;\n\nexport class CliError extends Error {\n exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.exitCode = exitCode;\n }\n}\n\nexport function createUsageError(message: string): CliError {\n return new CliError(message, EXIT_USAGE);\n}\n\nexport function createDisconnectedError(message: string): CliError {\n return new CliError(message, EXIT_DISCONNECTED);\n}\n\nexport function toCliError(error: unknown, fallbackExitCode = EXIT_EXECUTION): CliError {\n if (error instanceof CliError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n return new CliError(message, fallbackExitCode);\n}\n\nexport type ErrorPayload = {\n success: false;\n error: string;\n exitCode: number;\n};\n\nexport function formatErrorPayload(error: CliError): ErrorPayload {\n return {\n success: false,\n error: error.message,\n exitCode: error.exitCode\n };\n}\n\nexport function resolveExitCode(result: CommandResult): number | null {\n if (result.exitCode === null) {\n return null;\n }\n if (typeof result.exitCode === \"number\") {\n return result.exitCode;\n }\n return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;\n}\n","import { createUsageError } from \"./errors\";\n\nexport type CliCommand = \"install\" | \"update\" | \"uninstall\" | \"help\" | \"version\" | \"serve\" | \"run\"\n | \"launch\" | \"connect\" | \"disconnect\" | \"status\"\n | \"goto\" | \"wait\" | \"snapshot\"\n | \"click\" | \"type\" | \"select\" | \"scroll\";\nexport type InstallMode = \"global\" | \"local\";\nexport type SkillsMode = \"global\" | \"local\" | \"none\";\nexport type OutputFormat = \"text\" | \"json\" | \"stream-json\";\n\nexport interface ParsedArgs {\n command: CliCommand;\n mode?: InstallMode;\n withConfig: boolean;\n noPrompt: boolean;\n noInteractive: boolean;\n quiet: boolean;\n outputFormat: OutputFormat;\n skillsMode: SkillsMode;\n fullInstall: boolean;\n rawArgs: string[];\n}\n\nconst SHORT_FLAGS: Record<string, string> = {\n \"-g\": \"--global\",\n \"-l\": \"--local\",\n \"-u\": \"--update\",\n \"-h\": \"--help\",\n \"-v\": \"--version\",\n \"-f\": \"--full\"\n};\n\nfunction expandShortFlags(args: string[]): string[] {\n return args.map((arg) => SHORT_FLAGS[arg] ?? arg);\n}\n\nfunction parseSkillsMode(args: string[]): SkillsMode {\n if (args.includes(\"--no-skills\")) {\n return \"none\";\n }\n if (args.includes(\"--skills-local\")) {\n return \"local\";\n }\n if (args.includes(\"--skills-global\")) {\n return \"global\";\n }\n return \"global\";\n}\n\nfunction parseOutputFormat(args: string[]): OutputFormat {\n const outputFlag = args.find((arg) => arg.startsWith(\"--output-format\"));\n if (!outputFlag) {\n return \"text\";\n }\n\n let value: string | undefined;\n if (outputFlag.includes(\"=\")) {\n value = outputFlag.split(\"=\", 2)[1];\n } else {\n const index = args.indexOf(outputFlag);\n value = index >= 0 ? args[index + 1] : undefined;\n }\n\n if (value === \"text\" || value === \"json\" || value === \"stream-json\") {\n return value;\n }\n\n throw createUsageError(`Invalid --output-format: ${value ?? \"missing\"}`);\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n let args = expandShortFlags(argv.slice(2));\n let commandOverride: CliCommand | null = null;\n\n if (args[0] && !args[0].startsWith(\"-\")) {\n const candidate = args[0];\n if (candidate === \"install\" || candidate === \"update\" || candidate === \"uninstall\" || candidate === \"help\" || candidate === \"version\" || candidate === \"serve\" || candidate === \"run\"\n || candidate === \"launch\" || candidate === \"connect\" || candidate === \"disconnect\" || candidate === \"status\"\n || candidate === \"goto\" || candidate === \"wait\" || candidate === \"snapshot\"\n || candidate === \"click\" || candidate === \"type\" || candidate === \"select\" || candidate === \"scroll\") {\n commandOverride = candidate;\n args = args.slice(1);\n } else {\n throw createUsageError(`Unknown command: ${candidate}`);\n }\n }\n const skillsMode = parseSkillsMode(args);\n const fullInstall = args.includes(\"--full\");\n const outputFormat = parseOutputFormat(args);\n\n if (commandOverride === \"help\" || args.includes(\"--help\") || args.includes(\"-h\")) {\n return {\n command: \"help\",\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"version\" || args.includes(\"--version\") || args.includes(\"-v\")) {\n return {\n command: \"version\",\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"update\" || args.includes(\"--update\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n return {\n command: \"update\",\n mode,\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"uninstall\" || args.includes(\"--uninstall\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n const noPrompt = args.includes(\"--no-prompt\") || args.includes(\"--no-interactive\");\n return {\n command: \"uninstall\",\n mode,\n withConfig: false,\n noPrompt,\n noInteractive: noPrompt,\n quiet: args.includes(\"--quiet\"),\n outputFormat,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n const withConfig = args.includes(\"--with-config\") || fullInstall;\n const noPrompt = args.includes(\"--no-prompt\") || args.includes(\"--no-interactive\");\n const noInteractive = args.includes(\"--no-interactive\") || noPrompt;\n const quiet = args.includes(\"--quiet\");\n\n let mode: InstallMode | undefined;\n if (args.includes(\"--global\")) {\n mode = \"global\";\n } else if (args.includes(\"--local\")) {\n mode = \"local\";\n } else if (noPrompt) {\n mode = \"global\";\n }\n\n const validFlags = new Set([\n \"--global\", \"--local\", \"--update\", \"--uninstall\",\n \"--help\", \"--version\", \"--with-config\", \"--no-prompt\",\n \"--no-interactive\", \"--quiet\", \"--output-format\",\n \"--full\",\n \"--port\", \"--token\", \"--stop\",\n \"--script\", \"--headless\", \"--profile\", \"--persist-profile\", \"--chrome-path\", \"--start-url\", \"--flag\",\n \"--session-id\", \"--close-browser\", \"--ws-endpoint\", \"--host\", \"--cdp-port\",\n \"--url\", \"--wait-until\", \"--timeout-ms\", \"--ref\", \"--state\", \"--until\", \"--mode\", \"--max-chars\", \"--cursor\",\n \"--text\", \"--clear\", \"--submit\", \"--values\", \"--dy\",\n \"--no-extension\", \"--extension-only\", \"--wait-for-extension\", \"--wait-timeout-ms\",\n \"--skills-global\", \"--skills-local\", \"--no-skills\"\n ]);\n \n for (const arg of args) {\n if (arg.startsWith(\"--\") && !validFlags.has(arg)) {\n throw createUsageError(`Unknown flag: ${arg}`);\n }\n if (arg.startsWith(\"-\") && !arg.startsWith(\"--\") && !SHORT_FLAGS[arg]) {\n throw createUsageError(`Unknown flag: ${arg}`);\n }\n }\n\n return {\n command: commandOverride ?? \"install\",\n mode,\n withConfig,\n noPrompt,\n noInteractive,\n quiet,\n outputFormat,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n}\n\nexport function getHelpText(): string {\n return `\nOpenDevBrowser CLI - Install and manage the OpenDevBrowser plugin\n\nUSAGE:\n npx opendevbrowser [command] [options]\n\nCOMMANDS:\n install Install the plugin (default if no command specified)\n update Clear cached plugin to trigger reinstall\n uninstall Remove plugin from config\n serve Start or stop the local daemon\n run Execute a JSON script in a single process\n launch Launch a managed browser session via daemon\n connect Connect to an existing browser via daemon\n disconnect Disconnect a daemon session\n status Get daemon session status\n goto Navigate current session to a URL\n wait Wait for load or a ref to appear\n snapshot Capture a snapshot of the active page\n click Click an element by ref\n type Type into an element by ref\n select Select values in a select by ref\n scroll Scroll the page or element by ref\n help Show this help message\n version Show version\n\nALIASES:\n --update, -u Same as update\n --uninstall Same as uninstall\n --help, -h Same as help\n --version, -v Same as version\n\nINSTALL OPTIONS:\n --global, -g Install to ~/.config/opencode/opencode.json\n --local, -l Install to ./opencode.json (project-local)\n --with-config Also create opendevbrowser.jsonc with defaults\n --full, -f Create config and pre-extract extension assets\n --no-prompt Skip prompts, use defaults (global install)\n --no-interactive Alias of --no-prompt\n --quiet Suppress non-error output\n --output-format Output format: text (default), json, stream-json\n --skills-global Install bundled skills to ~/.config/opencode/skill (default)\n --skills-local Install bundled skills to ./.opencode/skill\n --no-skills Skip installing bundled skills\n\nEXAMPLES:\n npx opendevbrowser # Interactive install\n npx opendevbrowser --global # Global install\n npx opendevbrowser --local # Project install\n npx opendevbrowser --full # Install + config + extension assets\n npx opendevbrowser -g --with-config # Global + config file\n npx opendevbrowser --skills-local # Install skills locally\n npx opendevbrowser --no-skills # Skip skill installation\n npx opendevbrowser --update # Update plugin\n npx opendevbrowser --uninstall --global # Remove from global config\n`.trim();\n}\n\nexport function detectOutputFormat(argv: string[]): OutputFormat {\n const args = expandShortFlags(argv.slice(2));\n try {\n return parseOutputFormat(args);\n } catch {\n return \"text\";\n }\n}\n\nexport function detectQuiet(argv: string[]): boolean {\n const args = expandShortFlags(argv.slice(2));\n return args.includes(\"--quiet\");\n}\n","import type { CommandDefinition } from \"./types\";\n\nconst registry = new Map<string, CommandDefinition>();\n\nexport function registerCommand(definition: CommandDefinition): void {\n registry.set(definition.name, definition);\n}\n\nexport function getCommand(name: string): CommandDefinition | undefined {\n return registry.get(name);\n}\n\nexport function listCommands(): CommandDefinition[] {\n return Array.from(registry.values());\n}\n","import * as fs from \"fs\";\nimport {\n getGlobalConfigPath,\n readConfig,\n hasPlugin,\n ensureDir,\n updateConfigContent\n} from \"../utils/config\";\nimport { createPluginConfig } from \"../templates/config\";\n\nexport interface InstallResult {\n success: boolean;\n message: string;\n configPath: string;\n created: boolean;\n alreadyInstalled: boolean;\n}\n\nexport function installGlobal(withConfig: boolean = false): InstallResult {\n const configPath = getGlobalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is already installed in ${configPath}`,\n configPath,\n created: false,\n alreadyInstalled: true\n };\n }\n\n const newContent = updateConfigContent(content, \"opendevbrowser\");\n\n ensureDir(configPath.replace(/[/\\\\][^/\\\\]+$/, \"\"));\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n if (withConfig) {\n createPluginConfig(\"global\");\n }\n\n return {\n success: true,\n message: `Added opendevbrowser to ${configPath}`,\n configPath,\n created: content.trim() === \"\",\n alreadyInstalled: false\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install globally: ${message}`,\n configPath,\n created: false,\n alreadyInstalled: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { parse as parseJsonc, modify, applyEdits } from \"jsonc-parser\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\nconst SCHEMA_URL = \"https://opencode.ai/config.json\";\n\nexport interface OpenCodeConfig {\n $schema?: string;\n plugin?: string[];\n [key: string]: unknown;\n}\n\nexport function getGlobalConfigPath(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opencode.json\");\n}\n\nexport function getLocalConfigPath(): string {\n return path.join(process.cwd(), \"opencode.json\");\n}\n\nexport function ensureDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n}\n\nexport function readConfig(configPath: string): { content: string; config: OpenCodeConfig } {\n if (!fs.existsSync(configPath)) {\n return { content: \"\", config: {} };\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const errors: Array<{ error: number; offset: number; length: number }> = [];\n const parsed = parseJsonc(content, errors, { allowTrailingComma: true });\n\n if (errors.length > 0) {\n const firstError = errors[0];\n throw new Error(`Invalid JSONC at ${configPath}: parse error at offset ${firstError?.offset ?? 0}`);\n }\n\n return { content, config: (parsed ?? {}) as OpenCodeConfig };\n}\n\nexport function writeConfig(configPath: string, config: OpenCodeConfig): void {\n ensureDir(path.dirname(configPath));\n const content = JSON.stringify(config, null, 2) + \"\\n\";\n writeFileAtomic(configPath, content);\n}\n\nexport function addPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (!result.$schema) {\n result.$schema = SCHEMA_URL;\n }\n\n if (!result.plugin) {\n result.plugin = [pluginName];\n } else if (!result.plugin.includes(pluginName)) {\n result.plugin = [...result.plugin, pluginName];\n }\n\n return result;\n}\n\nexport function removePlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (result.plugin) {\n result.plugin = result.plugin.filter((p) => p !== pluginName);\n if (result.plugin.length === 0) {\n delete result.plugin;\n }\n }\n\n return result;\n}\n\nexport function hasPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): boolean {\n return config.plugin?.includes(pluginName) ?? false;\n}\n\nexport function createConfigWithPlugin(pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n return {\n $schema: SCHEMA_URL,\n plugin: [pluginName]\n };\n}\n\nexport function updateConfigContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return JSON.stringify(createConfigWithPlugin(pluginName), null, 2) + \"\\n\";\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n let result = content;\n\n if (!parsed.$schema) {\n const edits = modify(result, [\"$schema\"], SCHEMA_URL, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n }\n\n const newPlugins = parsed.plugin ? [...parsed.plugin, pluginName] : [pluginName];\n const edits = modify(result, [\"plugin\"], newPlugins, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n\n return result;\n}\n\nexport function removePluginFromContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return content;\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (!parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n const newPlugins = parsed.plugin.filter((p) => p !== pluginName);\n const edits = modify(content, [\"plugin\"], newPlugins.length > 0 ? newPlugins : undefined, {\n formattingOptions: { tabSize: 2, insertSpaces: true }\n });\n\n return applyEdits(content, edits);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as crypto from \"crypto\";\n\nexport function writeFileAtomic(\n filePath: string,\n content: string,\n options: { encoding?: BufferEncoding; mode?: number } = {}\n): void {\n const { encoding = \"utf-8\", mode } = options;\n const dir = path.dirname(filePath);\n const hash = crypto.randomBytes(8).toString(\"hex\");\n const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${hash}.tmp`);\n\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const writeOptions: fs.WriteFileOptions = { encoding };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n fs.writeFileSync(tempPath, content, writeOptions);\n fs.renameSync(tempPath, filePath);\n } catch (error) {\n try {\n if (fs.existsSync(tempPath)) {\n fs.unlinkSync(tempPath);\n }\n } catch {\n /* best-effort cleanup */\n }\n throw error;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { generateSecureToken } from \"../../utils/crypto\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nfunction buildConfigTemplate(token: string): string {\n return `{\n // OpenDevBrowser Plugin Configuration\n // See: https://github.com/anthropics/opendevbrowser#configuration\n\n \"headless\": false,\n \"profile\": \"default\",\n \"persistProfile\": true,\n\n \"snapshot\": {\n \"maxChars\": 16000,\n \"maxNodes\": 1000\n },\n\n \"export\": {\n \"maxNodes\": 1000,\n \"inlineStyles\": true\n },\n\n \"devtools\": {\n \"showFullUrls\": false,\n \"showFullConsole\": false\n },\n\n \"security\": {\n \"allowRawCDP\": false,\n \"allowNonLocalCdp\": false,\n \"allowUnsafeExport\": false\n },\n\n \"skillPaths\": [],\n \"skills\": {\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\"login\", \"form\", \"extract\"],\n \"maxAgeMs\": 60000\n }\n },\n\n \"continuity\": {\n \"enabled\": true,\n \"filePath\": \"opendevbrowser_continuity.md\",\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\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\": 60000\n }\n },\n\n \"relayPort\": 8787,\n \"relayToken\": \"${token}\",\n\n \"flags\": [],\n\n \"checkForUpdates\": false\n}\n`;\n}\n\nexport function getPluginConfigPath(mode: \"global\" | \"local\"): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nexport function createPluginConfig(mode: \"global\" | \"local\"): { created: boolean; path: string } {\n const configPath = getPluginConfigPath(mode);\n\n if (fs.existsSync(configPath)) {\n return { created: false, path: configPath };\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const token = generateSecureToken();\n writeFileAtomic(configPath, buildConfigTemplate(token));\n return { created: true, path: configPath };\n}\n\nexport function getConfigTemplate(): string {\n return buildConfigTemplate(generateSecureToken());\n}\n","import * as fs from \"fs\";\nimport {\n getLocalConfigPath,\n readConfig,\n hasPlugin,\n updateConfigContent\n} from \"../utils/config\";\nimport { createPluginConfig } from \"../templates/config\";\n\nexport interface InstallResult {\n success: boolean;\n message: string;\n configPath: string;\n created: boolean;\n alreadyInstalled: boolean;\n}\n\nexport function installLocal(withConfig: boolean = false): InstallResult {\n const configPath = getLocalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is already installed in ${configPath}`,\n configPath,\n created: false,\n alreadyInstalled: true\n };\n }\n\n const newContent = updateConfigContent(content, \"opendevbrowser\");\n\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n if (withConfig) {\n createPluginConfig(\"local\");\n }\n\n return {\n success: true,\n message: `Added opendevbrowser to ${configPath}`,\n configPath,\n created: content.trim() === \"\",\n alreadyInstalled: false\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install locally: ${message}`,\n configPath,\n created: false,\n alreadyInstalled: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { ensureDir } from \"../utils/config\";\nimport { getBundledSkillsDir, getGlobalSkillDir, getLocalSkillDir } from \"../utils/skills\";\n\nexport type SkillInstallMode = \"global\" | \"local\";\n\nexport interface SkillInstallResult {\n success: boolean;\n message: string;\n targetDir: string;\n installed: string[];\n skipped: string[];\n}\n\nexport function installSkills(mode: SkillInstallMode): SkillInstallResult {\n const targetDir = mode === \"global\" ? getGlobalSkillDir() : getLocalSkillDir();\n const installed: string[] = [];\n const skipped: string[] = [];\n\n try {\n const sourceDir = getBundledSkillsDir();\n const entries = fs.readdirSync(sourceDir, { withFileTypes: true });\n\n ensureDir(targetDir);\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillName = entry.name;\n const sourcePath = path.join(sourceDir, skillName);\n const targetPath = path.join(targetDir, skillName);\n\n if (fs.existsSync(targetPath)) {\n skipped.push(skillName);\n continue;\n }\n\n fs.cpSync(sourcePath, targetPath, { recursive: true });\n installed.push(skillName);\n }\n\n const summary = `Skills ${mode} install: ${installed.length} installed${skipped.length ? `, ${skipped.length} skipped` : \"\"} (${targetDir})`;\n return {\n success: true,\n message: summary,\n targetDir,\n installed,\n skipped\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install skills (${mode}): ${message}`,\n targetDir,\n installed,\n skipped\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst PACKAGE_NAME = \"opendevbrowser\";\nconst SKILL_DIR_NAME = \"skill\";\n\nlet cachedPackageRoot: string | null = null;\n\nfunction findPackageRoot(startDir: string): string {\n let current = startDir;\n\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")) as { name?: string };\n if (parsed.name === PACKAGE_NAME) {\n return current;\n }\n } catch {\n void 0;\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n throw new Error(\"Unable to locate opendevbrowser package root for skill installation.\");\n}\n\nexport function getPackageRoot(): string {\n if (cachedPackageRoot) return cachedPackageRoot;\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n cachedPackageRoot = findPackageRoot(moduleDir);\n return cachedPackageRoot;\n}\n\nexport function getBundledSkillsDir(): string {\n const skillsDir = path.join(getPackageRoot(), \"skills\");\n if (!fs.existsSync(skillsDir)) {\n throw new Error(`Bundled skills directory not found at ${skillsDir}`);\n }\n return skillsDir;\n}\n\nexport function getGlobalSkillDir(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, SKILL_DIR_NAME);\n}\n\nexport function getLocalSkillDir(): string {\n return path.join(process.cwd(), \".opencode\", SKILL_DIR_NAME);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\n\nexport interface UpdateResult {\n success: boolean;\n message: string;\n cleared: boolean;\n}\n\nfunction getCacheDir(): string {\n return process.env.OPENCODE_CACHE_DIR\n || path.join(os.homedir(), \".cache\", \"opencode\");\n}\n\nfunction rmdir(dirPath: string): void {\n const cacheDir = getCacheDir();\n const resolvedCache = path.resolve(cacheDir);\n const resolvedPath = path.resolve(dirPath);\n\n if (!resolvedPath.startsWith(resolvedCache + path.sep) || resolvedPath === resolvedCache) {\n throw new Error(`Security: refusing to delete path outside cache directory: ${dirPath}`);\n }\n\n if (fs.existsSync(dirPath)) {\n fs.rmSync(dirPath, { recursive: true, force: true });\n }\n}\n\nexport function runUpdate(): UpdateResult {\n const cacheDir = getCacheDir();\n const nodeModulesDir = path.join(cacheDir, \"node_modules\");\n const pluginCacheDir = path.join(nodeModulesDir, PLUGIN_NAME);\n\n try {\n if (!fs.existsSync(pluginCacheDir)) {\n if (fs.existsSync(nodeModulesDir)) {\n rmdir(nodeModulesDir);\n return {\n success: true,\n message: \"Cleared OpenCode plugin cache. The latest version will be installed on next run.\",\n cleared: true\n };\n }\n\n return {\n success: true,\n message: \"No cached plugin found. OpenCode will install the latest version on next run.\",\n cleared: false\n };\n }\n\n rmdir(pluginCacheDir);\n\n return {\n success: true,\n message: \"Cache cleared. OpenCode will install the latest version on next run.\",\n cleared: true\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to clear cache: ${message}`,\n cleared: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport {\n getGlobalConfigPath,\n getLocalConfigPath,\n readConfig,\n hasPlugin,\n removePluginFromContent\n} from \"../utils/config\";\nimport type { InstallMode } from \"../args\";\n\nexport interface UninstallResult {\n success: boolean;\n message: string;\n configPath?: string;\n removed: boolean;\n configFileDeleted: boolean;\n}\n\nfunction getPluginConfigPath(mode: InstallMode): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nfunction removePluginConfigFile(mode: InstallMode): boolean {\n const configPath = getPluginConfigPath(mode);\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\nexport function runUninstall(\n mode: InstallMode,\n deleteConfigFile: boolean = false\n): UninstallResult {\n const configPath = mode === \"global\" ? getGlobalConfigPath() : getLocalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (!hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is not installed in ${configPath}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n\n const newContent = removePluginFromContent(content, \"opendevbrowser\");\n\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n let configFileDeleted = false;\n if (deleteConfigFile) {\n configFileDeleted = removePluginConfigFile(mode);\n }\n\n return {\n success: true,\n message: `Removed opendevbrowser from ${configPath}`,\n configPath,\n removed: true,\n configFileDeleted\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to uninstall: ${message}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n}\n\nexport function findInstalledConfigs(): { global: boolean; local: boolean } {\n let global = false;\n let local = false;\n\n try {\n const { config: globalConfig } = readConfig(getGlobalConfigPath());\n global = hasPlugin(globalConfig);\n } catch {\n void 0;\n }\n\n try {\n const { config: localConfig } = readConfig(getLocalConfigPath());\n local = hasPlugin(localConfig);\n } catch {\n void 0;\n }\n\n return { global, local };\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport { timingSafeEqual } from \"crypto\";\nimport { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { generateSecureToken } from \"../utils/crypto\";\nimport { createOpenDevBrowserCore } from \"../core\";\nimport { loadGlobalConfig, type OpenDevBrowserConfig } from \"../config\";\nimport { handleDaemonCommand } from \"./daemon-commands\";\n\nconst DEFAULT_DAEMON_PORT = 8788;\n\nexport type DaemonState = {\n port: number;\n token: string;\n pid: number;\n relayPort: number;\n startedAt: string;\n};\n\ntype DaemonOptions = {\n port?: number;\n token?: string;\n config?: OpenDevBrowserConfig;\n directory?: string;\n worktree?: string | null;\n};\n\nfunction getCacheRoot(): string {\n const base = process.env.OPENCODE_CACHE_DIR\n ?? process.env.XDG_CACHE_HOME\n ?? join(homedir(), \".cache\");\n return join(base, \"opendevbrowser\");\n}\n\nexport function getDaemonMetadataPath(): string {\n return join(getCacheRoot(), \"daemon.json\");\n}\n\nexport function readDaemonMetadata(): DaemonState | null {\n const metadataPath = getDaemonMetadataPath();\n if (!existsSync(metadataPath)) {\n return null;\n }\n try {\n const content = readFileSync(metadataPath, \"utf-8\");\n return JSON.parse(content) as DaemonState;\n } catch {\n return null;\n }\n}\n\nexport function writeDaemonMetadata(state: DaemonState): void {\n const metadataPath = getDaemonMetadataPath();\n mkdirSync(join(getCacheRoot()), { recursive: true });\n writeFileSync(metadataPath, JSON.stringify(state, null, 2), { encoding: \"utf-8\", mode: 0o600 });\n}\n\nexport function clearDaemonMetadata(): void {\n const metadataPath = getDaemonMetadataPath();\n try {\n unlinkSync(metadataPath);\n } catch {\n void 0;\n }\n}\n\nfunction isAuthorized(request: IncomingMessage, token: string): boolean {\n const header = request.headers.authorization ?? \"\";\n if (!header.startsWith(\"Bearer \")) {\n return false;\n }\n const received = header.slice(\"Bearer \".length).trim();\n const expectedBuf = Buffer.from(token, \"utf-8\");\n const receivedBuf = Buffer.from(received, \"utf-8\");\n\n if (expectedBuf.length !== receivedBuf.length) {\n timingSafeEqual(expectedBuf, expectedBuf);\n return false;\n }\n return timingSafeEqual(expectedBuf, receivedBuf);\n}\n\nfunction sendJson(response: ServerResponse, status: number, payload: unknown): void {\n response.writeHead(status, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\"\n });\n response.end(JSON.stringify(payload));\n}\n\nexport async function startDaemon(options: DaemonOptions = {}): Promise<{ state: DaemonState; stop: () => Promise<void> }> {\n const config = options.config ?? loadGlobalConfig();\n const port = options.port ?? DEFAULT_DAEMON_PORT;\n const token = options.token ?? generateSecureToken();\n const core = createOpenDevBrowserCore({\n directory: options.directory ?? process.cwd(),\n worktree: options.worktree ?? null,\n config\n });\n\n await core.ensureRelay(config.relayPort);\n\n const server = createServer(async (request, response) => {\n if (!isAuthorized(request, token)) {\n sendJson(response, 401, { error: \"Unauthorized\" });\n return;\n }\n\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n\n if (request.method === \"GET\" && url.pathname === \"/status\") {\n sendJson(response, 200, {\n ok: true,\n pid: process.pid,\n relay: core.relay.status()\n });\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/stop\") {\n sendJson(response, 200, { ok: true });\n await stop();\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/command\") {\n try {\n const body = await readJson(request);\n const data = await handleDaemonCommand(core, body);\n sendJson(response, 200, { ok: true, data });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(response, 400, { ok: false, error: message });\n }\n return;\n }\n\n sendJson(response, 404, { error: \"Not found\" });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => resolve());\n });\n\n const state: DaemonState = {\n port,\n token,\n pid: process.pid,\n relayPort: config.relayPort,\n startedAt: new Date().toISOString()\n };\n writeDaemonMetadata(state);\n\n const stop = async () => {\n clearDaemonMetadata();\n core.cleanup();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n };\n\n process.on(\"SIGINT\", () => {\n stop().catch(() => {});\n });\n process.on(\"SIGTERM\", () => {\n stop().catch(() => {});\n });\n\n return { state, stop };\n}\n\nfunction readJson(request: IncomingMessage): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n request.setEncoding(\"utf8\");\n request.on(\"data\", (chunk) => {\n data += chunk;\n });\n request.on(\"end\", () => {\n try {\n const parsed = JSON.parse(data || \"{}\");\n if (!parsed || typeof parsed !== \"object\") {\n reject(new Error(\"Invalid JSON body\"));\n return;\n }\n resolve(parsed as Record<string, unknown>);\n } catch (error) {\n reject(error);\n }\n });\n request.on(\"error\", reject);\n });\n}\n","import type { OpenDevBrowserCore } from \"../core\";\n\nexport type DaemonCommandRequest = {\n name: string;\n params?: Record<string, unknown>;\n};\n\nexport async function handleDaemonCommand(core: OpenDevBrowserCore, request: DaemonCommandRequest): Promise<unknown> {\n const params = request.params ?? {};\n\n switch (request.name) {\n case \"session.launch\":\n return launchWithRelay(core, params);\n case \"session.connect\":\n return core.manager.connect({\n wsEndpoint: optionalString(params.wsEndpoint),\n host: optionalString(params.host),\n port: optionalNumber(params.port)\n });\n case \"session.disconnect\":\n await core.manager.disconnect(requireString(params.sessionId, \"sessionId\"), optionalBoolean(params.closeBrowser) ?? false);\n return { ok: true };\n case \"session.status\":\n return core.manager.status(requireString(params.sessionId, \"sessionId\"));\n case \"nav.goto\":\n return core.manager.goto(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.url, \"url\"),\n requireWaitUntil(params.waitUntil),\n optionalNumber(params.timeoutMs) ?? 30000\n );\n case \"nav.wait\":\n if (typeof params.ref === \"string\") {\n return core.manager.waitForRef(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireState(params.state),\n optionalNumber(params.timeoutMs) ?? 30000\n );\n }\n return core.manager.waitForLoad(\n requireString(params.sessionId, \"sessionId\"),\n requireWaitUntil(params.until),\n optionalNumber(params.timeoutMs) ?? 30000\n );\n case \"nav.snapshot\":\n return core.manager.snapshot(\n requireString(params.sessionId, \"sessionId\"),\n requireSnapshotMode(params.mode),\n optionalNumber(params.maxChars) ?? 16000,\n optionalString(params.cursor)\n );\n case \"interact.click\":\n return core.manager.click(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"interact.type\":\n return core.manager.type(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireString(params.text, \"text\"),\n optionalBoolean(params.clear) ?? false,\n optionalBoolean(params.submit) ?? false\n );\n case \"interact.select\":\n return core.manager.select(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireStringArray(params.values, \"values\")\n );\n case \"interact.scroll\":\n return core.manager.scroll(\n requireString(params.sessionId, \"sessionId\"),\n optionalNumber(params.dy) ?? 0,\n optionalString(params.ref)\n );\n default:\n throw new Error(`Unknown daemon command: ${request.name}`);\n }\n}\n\nasync function launchWithRelay(core: OpenDevBrowserCore, params: Record<string, unknown>) {\n let relayStatus = core.relay.status();\n const relayUrl = core.relay.getCdpUrl();\n const noExtension = optionalBoolean(params.noExtension) ?? false;\n const extensionOnly = optionalBoolean(params.extensionOnly) ?? false;\n const waitForExtension = optionalBoolean(params.waitForExtension) ?? false;\n const waitTimeoutMs = optionalNumber(params.waitTimeoutMs) ?? 30000;\n\n if (waitForExtension) {\n const connected = await waitForRelay(core.relay, waitTimeoutMs);\n if (connected) {\n relayStatus = core.relay.status();\n }\n }\n\n const useRelay = Boolean(!noExtension && relayStatus.extensionConnected && relayUrl);\n let relayWarning: string | null = null;\n\n if (extensionOnly && !useRelay) {\n throw new Error(\"Extension not connected; use --no-extension to launch a new browser.\");\n }\n\n if (useRelay && relayUrl) {\n try {\n const result = await core.manager.connectRelay(relayUrl);\n return { ...result, warnings: result.warnings ?? [] };\n } catch (error) {\n if (extensionOnly) {\n throw error instanceof Error ? error : new Error(\"Extension relay connection failed.\");\n }\n relayWarning = \"Relay connection failed; falling back to managed Chrome.\";\n }\n }\n\n if (relayUrl && !noExtension) {\n relayWarning ??= \"Extension not connected; launching managed Chrome instead.\";\n }\n\n const result = await core.manager.launch({\n profile: optionalString(params.profile),\n headless: optionalBoolean(params.headless),\n startUrl: optionalString(params.startUrl),\n chromePath: optionalString(params.chromePath),\n flags: optionalStringArray(params.flags),\n persistProfile: optionalBoolean(params.persistProfile)\n });\n\n const warnings = [\n ...(result.warnings ?? []),\n ...(relayWarning ? [relayWarning] : [])\n ];\n return { ...result, warnings };\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 optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction optionalStringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? value as string[]\n : undefined;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\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\nasync function waitForRelay(relay: { status: () => { extensionConnected: boolean } }, timeoutMs: number): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (relay.status().extensionConnected) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n return false;\n}\n","import type { ParsedArgs } from \"../args\";\nimport { startDaemon, readDaemonMetadata } from \"../daemon\";\nimport { createUsageError, EXIT_DISCONNECTED, EXIT_EXECUTION } from \"../errors\";\n\ntype ServeArgs = {\n port?: number;\n token?: string;\n stop: boolean;\n};\n\nfunction parseServeArgs(rawArgs: string[]): ServeArgs {\n const parsed: ServeArgs = { stop: false };\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--stop\") {\n parsed.stop = true;\n continue;\n }\n if (arg === \"--port\") {\n const value = rawArgs[i + 1];\n if (!value) {\n throw createUsageError(\"Missing value for --port\");\n }\n parsed.port = Number(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--port=\")) {\n parsed.port = Number(arg.split(\"=\", 2)[1]);\n continue;\n }\n if (arg === \"--token\") {\n const value = rawArgs[i + 1];\n if (!value) {\n throw createUsageError(\"Missing value for --token\");\n }\n parsed.token = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--token=\")) {\n parsed.token = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runServe(args: ParsedArgs) {\n const serveArgs = parseServeArgs(args.rawArgs);\n\n if (serveArgs.stop) {\n const metadata = readDaemonMetadata();\n if (!metadata) {\n return { success: false, message: \"Daemon not running.\", exitCode: EXIT_DISCONNECTED };\n }\n\n try {\n const response = await fetch(`http://127.0.0.1:${metadata.port}/stop`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${metadata.token}` }\n });\n if (!response.ok) {\n throw new Error(`Stop failed (${response.status})`);\n }\n return { success: true, message: \"Daemon stopped.\" };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed to stop daemon: ${message}`, exitCode: EXIT_EXECUTION };\n }\n }\n\n const { state } = await startDaemon({\n port: serveArgs.port,\n token: serveArgs.token\n });\n\n return {\n success: true,\n message: `Daemon running on 127.0.0.1:${state.port}`,\n data: { port: state.port, pid: state.pid, relayPort: state.relayPort },\n exitCode: null\n };\n}\n","import { readFileSync } from \"fs\";\nimport { createOpenDevBrowserCore } from \"../../core\";\nimport type { ParsedArgs } from \"../args\";\nimport { writeOutput } from \"../output\";\nimport { createUsageError, EXIT_USAGE } from \"../errors\";\n\ntype RunArgs = {\n scriptPath?: string;\n headless?: boolean;\n profile?: string;\n persistProfile?: boolean;\n chromePath?: string;\n startUrl?: string;\n flags: string[];\n};\n\nfunction parseRunArgs(rawArgs: string[]): RunArgs {\n const parsed: RunArgs = { flags: [] };\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--script\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --script\");\n parsed.scriptPath = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--script=\")) {\n parsed.scriptPath = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--headless\") {\n parsed.headless = true;\n continue;\n }\n if (arg === \"--profile\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --profile\");\n parsed.profile = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--profile=\")) {\n parsed.profile = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--persist-profile\") {\n parsed.persistProfile = true;\n continue;\n }\n if (arg === \"--chrome-path\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --chrome-path\");\n parsed.chromePath = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--chrome-path=\")) {\n parsed.chromePath = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--start-url\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --start-url\");\n parsed.startUrl = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--start-url=\")) {\n parsed.startUrl = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--flag\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --flag\");\n parsed.flags.push(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--flag=\")) {\n parsed.flags.push(arg.split(\"=\", 2)[1]);\n continue;\n }\n }\n return parsed;\n}\n\nfunction readScriptFromStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk) => {\n data += chunk;\n });\n process.stdin.on(\"end\", () => resolve(data));\n process.stdin.on(\"error\", reject);\n });\n}\n\nexport async function runScriptCommand(args: ParsedArgs) {\n const runArgs = parseRunArgs(args.rawArgs);\n const outputOptions = { format: args.outputFormat, quiet: args.quiet };\n\n let scriptRaw = \"\";\n if (runArgs.scriptPath) {\n scriptRaw = readFileSync(runArgs.scriptPath, \"utf-8\");\n } else if (!process.stdin.isTTY) {\n scriptRaw = await readScriptFromStdin();\n } else {\n throw createUsageError(\"Provide --script <path> or pipe JSON to stdin.\");\n }\n\n let steps: Array<{ action: string; args?: Record<string, unknown> }> = [];\n try {\n const parsed = JSON.parse(scriptRaw);\n if (Array.isArray(parsed)) {\n steps = parsed;\n } else if (parsed && typeof parsed === \"object\" && Array.isArray(parsed.steps)) {\n steps = parsed.steps;\n } else {\n throw new Error(\"Script must be a JSON array or an object with steps.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON script.\";\n writeOutput({ success: false, error: message, exitCode: EXIT_USAGE }, outputOptions);\n return { success: false, message, exitCode: EXIT_USAGE, data: { suppressOutput: true } };\n }\n\n const core = createOpenDevBrowserCore({ directory: process.cwd() });\n const launchResult = await core.manager.launch({\n profile: runArgs.profile,\n headless: runArgs.headless,\n startUrl: runArgs.startUrl,\n chromePath: runArgs.chromePath,\n flags: runArgs.flags.length ? runArgs.flags : undefined,\n persistProfile: runArgs.persistProfile\n });\n\n try {\n const result = await core.runner.run(launchResult.sessionId, steps, true);\n writeOutput({\n success: true,\n sessionId: launchResult.sessionId,\n warnings: launchResult.warnings.length ? launchResult.warnings : undefined,\n ...result\n }, outputOptions);\n return { success: true, data: { suppressOutput: true } };\n } finally {\n await core.manager.disconnect(launchResult.sessionId, true);\n core.cleanup();\n }\n}\n","import type { OutputFormat } from \"./args\";\n\nexport type OutputOptions = {\n format: OutputFormat;\n quiet?: boolean;\n};\n\nexport function writeOutput(payload: unknown, options: OutputOptions): void {\n if (options.quiet) {\n return;\n }\n\n if (options.format === \"text\") {\n if (typeof payload === \"string\") {\n console.log(payload);\n } else {\n console.log(JSON.stringify(payload, null, 2));\n }\n return;\n }\n\n if (options.format === \"stream-json\") {\n if (Array.isArray(payload)) {\n for (const entry of payload) {\n console.log(JSON.stringify(entry));\n }\n return;\n }\n }\n\n console.log(JSON.stringify(payload));\n}\n","import { readDaemonMetadata } from \"./daemon\";\nimport { CliError, createDisconnectedError, EXIT_EXECUTION } from \"./errors\";\n\nexport async function callDaemon(command: string, params?: Record<string, unknown>): Promise<unknown> {\n const metadata = readDaemonMetadata();\n if (!metadata) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n\n let response: Response;\n try {\n response = await fetch(`http://127.0.0.1:${metadata.port}/command`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${metadata.token}`\n },\n body: JSON.stringify({ name: command, params: params ?? {} })\n });\n } catch {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n\n if (!response.ok) {\n const message = await response.text();\n throw new CliError(`Daemon error: ${message || response.status}`, EXIT_EXECUTION);\n }\n\n const payload = await response.json() as { ok?: boolean; data?: unknown; error?: string };\n if (!payload.ok) {\n throw new CliError(payload.error || \"Daemon command failed.\", EXIT_EXECUTION);\n }\n return payload.data;\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\ntype LaunchArgs = {\n profile?: string;\n headless?: boolean;\n startUrl?: string;\n chromePath?: string;\n flags: string[];\n persistProfile?: boolean;\n noExtension?: boolean;\n extensionOnly?: boolean;\n waitForExtension?: boolean;\n waitTimeoutMs?: number;\n};\n\nfunction parseLaunchArgs(rawArgs: string[]): LaunchArgs {\n const parsed: LaunchArgs = { flags: [] };\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--headless\") {\n parsed.headless = true;\n continue;\n }\n if (arg === \"--profile\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --profile\");\n parsed.profile = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--profile=\")) {\n parsed.profile = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--start-url\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --start-url\");\n parsed.startUrl = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--start-url=\")) {\n parsed.startUrl = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--chrome-path\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --chrome-path\");\n parsed.chromePath = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--chrome-path=\")) {\n parsed.chromePath = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--persist-profile\") {\n parsed.persistProfile = true;\n continue;\n }\n if (arg === \"--no-extension\") {\n parsed.noExtension = true;\n continue;\n }\n if (arg === \"--extension-only\") {\n parsed.extensionOnly = true;\n continue;\n }\n if (arg === \"--wait-for-extension\") {\n parsed.waitForExtension = true;\n continue;\n }\n if (arg === \"--wait-timeout-ms\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --wait-timeout-ms\");\n parsed.waitTimeoutMs = Number(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--wait-timeout-ms=\")) {\n parsed.waitTimeoutMs = Number(arg.split(\"=\", 2)[1]);\n continue;\n }\n if (arg === \"--flag\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --flag\");\n parsed.flags.push(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--flag=\")) {\n parsed.flags.push(arg.split(\"=\", 2)[1]);\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runSessionLaunch(args: ParsedArgs) {\n const launchArgs = parseLaunchArgs(args.rawArgs);\n const result = await callDaemon(\"session.launch\", launchArgs) as { sessionId: string };\n return {\n success: true,\n message: `Session launched: ${result.sessionId}`,\n data: result\n };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\ntype ConnectArgs = {\n wsEndpoint?: string;\n host?: string;\n port?: number;\n};\n\nfunction parseConnectArgs(rawArgs: string[]): ConnectArgs {\n const parsed: ConnectArgs = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--ws-endpoint\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --ws-endpoint\");\n parsed.wsEndpoint = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--ws-endpoint=\")) {\n parsed.wsEndpoint = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--host\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --host\");\n parsed.host = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--host=\")) {\n parsed.host = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--cdp-port\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --cdp-port\");\n parsed.port = Number(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--cdp-port=\")) {\n parsed.port = Number(arg.split(\"=\", 2)[1]);\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runSessionConnect(args: ParsedArgs) {\n const connectArgs = parseConnectArgs(args.rawArgs);\n const result = await callDaemon(\"session.connect\", connectArgs) as { sessionId: string };\n return {\n success: true,\n message: `Session connected: ${result.sessionId}`,\n data: result\n };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseDisconnectArgs(rawArgs: string[]): { sessionId?: string; closeBrowser?: boolean } {\n const parsed: { sessionId?: string; closeBrowser?: boolean } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--close-browser\") {\n parsed.closeBrowser = true;\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runSessionDisconnect(args: ParsedArgs) {\n const { sessionId, closeBrowser } = parseDisconnectArgs(args.rawArgs);\n if (!sessionId) {\n throw createUsageError(\"Missing --session-id\");\n }\n await callDaemon(\"session.disconnect\", { sessionId, closeBrowser });\n return { success: true, message: `Session disconnected: ${sessionId}` };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseStatusArgs(rawArgs: string[]): { sessionId?: string } {\n const parsed: { sessionId?: string } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runSessionStatus(args: ParsedArgs) {\n const { sessionId } = parseStatusArgs(args.rawArgs);\n if (!sessionId) {\n throw createUsageError(\"Missing --session-id\");\n }\n const result = await callDaemon(\"session.status\", { sessionId });\n return { success: true, message: `Session status: ${sessionId}`, data: result };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseGotoArgs(rawArgs: string[]): { sessionId?: string; url?: string; waitUntil?: string; timeoutMs?: number } {\n const parsed: { sessionId?: string; url?: string; waitUntil?: string; timeoutMs?: number } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--url\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --url\");\n parsed.url = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--url=\")) {\n parsed.url = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--wait-until\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --wait-until\");\n parsed.waitUntil = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--wait-until=\")) {\n parsed.waitUntil = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--timeout-ms\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --timeout-ms\");\n parsed.timeoutMs = Number(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--timeout-ms=\")) {\n parsed.timeoutMs = Number(arg.split(\"=\", 2)[1]);\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runGoto(args: ParsedArgs) {\n const { sessionId, url, waitUntil, timeoutMs } = parseGotoArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (!url) throw createUsageError(\"Missing --url\");\n const result = await callDaemon(\"nav.goto\", { sessionId, url, waitUntil, timeoutMs });\n return { success: true, message: `Navigated: ${url}`, data: result };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseWaitArgs(rawArgs: string[]): { sessionId?: string; ref?: string; state?: string; until?: string; timeoutMs?: number } {\n const parsed: { sessionId?: string; ref?: string; state?: string; until?: string; timeoutMs?: number } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--ref\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --ref\");\n parsed.ref = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--ref=\")) {\n parsed.ref = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--state\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --state\");\n parsed.state = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--state=\")) {\n parsed.state = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--until\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --until\");\n parsed.until = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--until=\")) {\n parsed.until = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--timeout-ms\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --timeout-ms\");\n parsed.timeoutMs = Number(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--timeout-ms=\")) {\n parsed.timeoutMs = Number(arg.split(\"=\", 2)[1]);\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runWait(args: ParsedArgs) {\n const { sessionId, ref, state, until, timeoutMs } = parseWaitArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n const result = await callDaemon(\"nav.wait\", { sessionId, ref, state, until, timeoutMs });\n return { success: true, message: \"Wait complete.\", data: result };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseSnapshotArgs(rawArgs: string[]): { sessionId?: string; mode?: string; maxChars?: number; cursor?: string } {\n const parsed: { sessionId?: string; mode?: string; maxChars?: number; cursor?: string } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--mode\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --mode\");\n parsed.mode = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--mode=\")) {\n parsed.mode = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--max-chars\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --max-chars\");\n parsed.maxChars = Number(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--max-chars=\")) {\n parsed.maxChars = Number(arg.split(\"=\", 2)[1]);\n continue;\n }\n if (arg === \"--cursor\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --cursor\");\n parsed.cursor = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--cursor=\")) {\n parsed.cursor = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runSnapshot(args: ParsedArgs) {\n const { sessionId, mode, maxChars, cursor } = parseSnapshotArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n const result = await callDaemon(\"nav.snapshot\", { sessionId, mode, maxChars, cursor });\n return { success: true, message: \"Snapshot captured.\", data: result };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseClickArgs(rawArgs: string[]): { sessionId?: string; ref?: string } {\n const parsed: { sessionId?: string; ref?: string } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--ref\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --ref\");\n parsed.ref = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--ref=\")) {\n parsed.ref = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runClick(args: ParsedArgs) {\n const { sessionId, ref } = parseClickArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (!ref) throw createUsageError(\"Missing --ref\");\n const result = await callDaemon(\"interact.click\", { sessionId, ref });\n return { success: true, message: \"Click complete.\", data: result };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseTypeArgs(rawArgs: string[]): { sessionId?: string; ref?: string; text?: string; clear?: boolean; submit?: boolean } {\n const parsed: { sessionId?: string; ref?: string; text?: string; clear?: boolean; submit?: boolean } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--ref\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --ref\");\n parsed.ref = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--ref=\")) {\n parsed.ref = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--text\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --text\");\n parsed.text = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--text=\")) {\n parsed.text = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--clear\") {\n parsed.clear = true;\n continue;\n }\n if (arg === \"--submit\") {\n parsed.submit = true;\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runType(args: ParsedArgs) {\n const { sessionId, ref, text, clear, submit } = parseTypeArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (!ref) throw createUsageError(\"Missing --ref\");\n if (!text) throw createUsageError(\"Missing --text\");\n const result = await callDaemon(\"interact.type\", { sessionId, ref, text, clear, submit });\n return { success: true, message: \"Type complete.\", data: result };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseSelectArgs(rawArgs: string[]): { sessionId?: string; ref?: string; values?: string[] } {\n const parsed: { sessionId?: string; ref?: string; values?: string[] } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--ref\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --ref\");\n parsed.ref = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--ref=\")) {\n parsed.ref = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--values\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --values\");\n parsed.values = value.split(\",\").map((entry) => entry.trim()).filter(Boolean);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--values=\")) {\n parsed.values = arg.split(\"=\", 2)[1].split(\",\").map((entry) => entry.trim()).filter(Boolean);\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runSelect(args: ParsedArgs) {\n const { sessionId, ref, values } = parseSelectArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (!ref) throw createUsageError(\"Missing --ref\");\n if (!values || values.length === 0) throw createUsageError(\"Missing --values\");\n const result = await callDaemon(\"interact.select\", { sessionId, ref, values });\n return { success: true, message: \"Select complete.\", data: result };\n}\n","import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseScrollArgs(rawArgs: string[]): { sessionId?: string; ref?: string; dy?: number } {\n const parsed: { sessionId?: string; ref?: string; dy?: number } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--ref\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --ref\");\n parsed.ref = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--ref=\")) {\n parsed.ref = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--dy\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --dy\");\n parsed.dy = Number(value);\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--dy=\")) {\n parsed.dy = Number(arg.split(\"=\", 2)[1]);\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runScroll(args: ParsedArgs) {\n const { sessionId, ref, dy } = parseScrollArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (typeof dy !== \"number\" || Number.isNaN(dy)) throw createUsageError(\"Missing --dy\");\n const result = await callDaemon(\"interact.scroll\", { sessionId, ref, dy });\n return { success: true, message: \"Scroll complete.\", data: result };\n}\n","#!/usr/bin/env node\n\nimport { parseArgs, getHelpText, detectOutputFormat } from \"./args\";\nimport type { OutputFormat } from \"./args\";\nimport { registerCommand, getCommand } from \"./commands/registry\";\nimport type { CommandResult } from \"./commands/types\";\nimport { installGlobal } from \"./installers/global\";\nimport { installLocal } from \"./installers/local\";\nimport { installSkills } from \"./installers/skills\";\nimport { runUpdate } from \"./commands/update\";\nimport { runUninstall, findInstalledConfigs } from \"./commands/uninstall\";\nimport { runServe } from \"./commands/serve\";\nimport { runScriptCommand } from \"./commands/run\";\nimport { runSessionLaunch } from \"./commands/session/launch\";\nimport { runSessionConnect } from \"./commands/session/connect\";\nimport { runSessionDisconnect } from \"./commands/session/disconnect\";\nimport { runSessionStatus } from \"./commands/session/status\";\nimport { runGoto } from \"./commands/nav/goto\";\nimport { runWait } from \"./commands/nav/wait\";\nimport { runSnapshot } from \"./commands/nav/snapshot\";\nimport { runClick } from \"./commands/interact/click\";\nimport { runType } from \"./commands/interact/type\";\nimport { runSelect } from \"./commands/interact/select\";\nimport { runScroll } from \"./commands/interact/scroll\";\nimport { extractExtension } from \"../extension-extractor\";\nimport { writeOutput } from \"./output\";\nimport type { InstallMode } from \"./args\";\nimport { formatErrorPayload, resolveExitCode, toCliError, EXIT_EXECUTION, EXIT_USAGE } from \"./errors\";\nimport type { CliError } from \"./errors\";\n\nconst VERSION = \"0.1.0\";\n\nasync function promptInstallMode(): Promise<InstallMode> {\n if (!process.stdin.isTTY) {\n console.log(\"Non-interactive mode detected. Using global install.\");\n return \"global\";\n }\n\n return new Promise((resolve) => {\n console.log(\"\\nWhere would you like to install opendevbrowser?\\n\");\n console.log(\" 1. Global (~/.config/opencode/opencode.json)\");\n console.log(\" 2. Local (./opencode.json in this project)\\n\");\n\n process.stdout.write(\"Enter choice [1]: \");\n\n process.stdin.setEncoding(\"utf8\");\n let resolved = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n process.stdin.once(\"data\", (data) => {\n cleanup();\n if (resolved) return;\n resolved = true;\n const input = data.toString().trim();\n if (input === \"2\") {\n resolve(\"local\");\n } else {\n resolve(\"global\");\n }\n });\n\n process.stdin.once(\"close\", () => {\n cleanup();\n if (resolved) return;\n resolved = true;\n resolve(\"global\");\n });\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n if (resolved) return;\n resolved = true;\n console.log(\"\\nTimeout - using global install.\");\n resolve(\"global\");\n }, 30000);\n });\n}\n\nasync function promptUninstallMode(): Promise<InstallMode | null> {\n const installed = findInstalledConfigs();\n\n if (!installed.global && !installed.local) {\n console.log(\"opendevbrowser is not installed in any config.\");\n return null;\n }\n\n if (installed.global && !installed.local) {\n return \"global\";\n }\n\n if (!installed.global && installed.local) {\n return \"local\";\n }\n\n if (!process.stdin.isTTY) {\n console.log(\"Plugin found in both global and local configs. Use --global or --local flag.\");\n return null;\n }\n\n return new Promise((resolve) => {\n console.log(\"\\nopendevbrowser is installed in multiple locations:\\n\");\n console.log(\" 1. Global (~/.config/opencode/opencode.json)\");\n console.log(\" 2. Local (./opencode.json)\");\n console.log(\" 3. Cancel\\n\");\n\n process.stdout.write(\"Which to uninstall? [3]: \");\n\n process.stdin.setEncoding(\"utf8\");\n process.stdin.once(\"data\", (data) => {\n const input = data.toString().trim();\n if (input === \"1\") {\n resolve(\"global\");\n } else if (input === \"2\") {\n resolve(\"local\");\n } else {\n resolve(null);\n }\n });\n\n process.stdin.once(\"close\", () => {\n resolve(null);\n });\n });\n}\n\nfunction emitFatalError(error: CliError, outputFormat: OutputFormat): void {\n if (outputFormat === \"text\") {\n console.error(`Error: ${error.message}`);\n if (error.exitCode === EXIT_USAGE) {\n console.error(\"\\nFor help: npx opendevbrowser --help\");\n }\n return;\n }\n\n writeOutput(formatErrorPayload(error), { format: outputFormat });\n}\n\nasync function main(): Promise<void> {\n let outputFormat: OutputFormat | null = null;\n let parseSucceeded = false;\n try {\n const args = parseArgs(process.argv);\n parseSucceeded = true;\n outputFormat = args.outputFormat;\n const outputOptions = { format: args.outputFormat, quiet: args.quiet };\n\n const emitResult = (result: CommandResult, payload?: Record<string, unknown>) => {\n const suppressOutput = Boolean(\n result.data\n && typeof result.data === \"object\"\n && \"suppressOutput\" in result.data\n && (result.data as { suppressOutput?: boolean }).suppressOutput\n );\n if (suppressOutput) {\n return;\n }\n if (args.outputFormat === \"text\") {\n if (result.message) {\n writeOutput(result.message, outputOptions);\n }\n } else {\n const exitCode = resolveExitCode(result);\n writeOutput({\n success: result.success,\n message: result.message,\n ...(result.success || !result.message ? {} : { error: result.message }),\n ...(result.success || exitCode === null ? {} : { exitCode }),\n ...payload\n }, outputOptions);\n }\n };\n\n registerCommand({\n name: \"help\",\n description: \"Show help\",\n run: () => ({ success: true, message: getHelpText() })\n });\n\n registerCommand({\n name: \"version\",\n description: \"Show version\",\n run: () => ({ success: true, message: `opendevbrowser v${VERSION}` })\n });\n\n registerCommand({\n name: \"update\",\n description: \"Clear cached plugin to trigger reinstall\",\n run: () => {\n const result = runUpdate();\n return { success: result.success, message: result.message };\n }\n });\n\n registerCommand({\n name: \"uninstall\",\n description: \"Remove plugin from config\",\n run: async () => {\n let mode = args.mode;\n if (!mode && !args.noPrompt) {\n mode = await promptUninstallMode() ?? undefined;\n if (!mode) {\n return { success: true, message: \"Uninstall cancelled.\" };\n }\n }\n if (!mode) {\n return { success: false, message: \"Error: Please specify --global or --local for uninstall.\", exitCode: EXIT_USAGE };\n }\n const result = runUninstall(mode);\n return { success: result.success, message: result.message };\n }\n });\n\n registerCommand({\n name: \"install\",\n description: \"Install the plugin\",\n run: async () => {\n const log = (...values: unknown[]) => {\n if (args.quiet) return;\n console.log(...values);\n };\n const warn = (...values: unknown[]) => {\n if (args.quiet) return;\n console.warn(...values);\n };\n\n let mode = args.mode;\n if (!mode) {\n mode = await promptInstallMode();\n }\n\n const result = mode === \"global\"\n ? installGlobal(args.withConfig)\n : installLocal(args.withConfig);\n\n if (args.outputFormat !== \"text\") {\n const payload: Record<string, unknown> = {\n alreadyInstalled: result.alreadyInstalled\n };\n\n if (result.success && args.skillsMode !== \"none\") {\n const skillsResult = installSkills(args.skillsMode);\n payload.skills = skillsResult;\n }\n\n if (args.fullInstall && result.success) {\n try {\n const extensionPath = extractExtension();\n payload.extensionPath = extensionPath;\n } catch (error) {\n payload.extensionError = error instanceof Error ? error.message : String(error);\n }\n }\n\n return { success: result.success, message: result.message, data: payload };\n }\n\n log(result.message);\n\n if (args.skillsMode === \"none\") {\n log(\"Skill installation skipped (--no-skills).\");\n } else if (result.success) {\n const skillsResult = installSkills(args.skillsMode);\n if (skillsResult.success) {\n log(skillsResult.message);\n } else {\n warn(skillsResult.message);\n }\n } else {\n warn(\"Skill installation skipped because plugin install failed.\");\n }\n\n if (args.fullInstall && result.success) {\n try {\n const extensionPath = extractExtension();\n if (extensionPath) {\n log(`Extension assets extracted to ${extensionPath}`);\n } else {\n warn(\"Extension assets not found; skipping extraction.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warn(`Extension pre-extraction failed: ${message}`);\n }\n }\n\n if (result.success && !result.alreadyInstalled) {\n log(\"\\nNext steps:\");\n log(\" 1. Start or restart OpenCode\");\n log(\" 2. Use opendevbrowser_status to verify the plugin is loaded\");\n log(\"\\nFor help: npx opendevbrowser --help\");\n }\n\n return { success: result.success, message: result.message };\n }\n });\n\n registerCommand({\n name: \"serve\",\n description: \"Start or stop the local daemon\",\n run: async () => runServe(args)\n });\n\n registerCommand({\n name: \"run\",\n description: \"Execute a JSON script in a single process\",\n run: async () => runScriptCommand(args)\n });\n\n registerCommand({\n name: \"launch\",\n description: \"Launch a managed browser session via daemon\",\n run: async () => runSessionLaunch(args)\n });\n\n registerCommand({\n name: \"connect\",\n description: \"Connect to an existing browser via daemon\",\n run: async () => runSessionConnect(args)\n });\n\n registerCommand({\n name: \"disconnect\",\n description: \"Disconnect a daemon session\",\n run: async () => runSessionDisconnect(args)\n });\n\n registerCommand({\n name: \"status\",\n description: \"Get daemon session status\",\n run: async () => runSessionStatus(args)\n });\n\n registerCommand({\n name: \"goto\",\n description: \"Navigate current session to a URL\",\n run: async () => runGoto(args)\n });\n\n registerCommand({\n name: \"wait\",\n description: \"Wait for load or a ref to appear\",\n run: async () => runWait(args)\n });\n\n registerCommand({\n name: \"snapshot\",\n description: \"Capture a snapshot of the active page\",\n run: async () => runSnapshot(args)\n });\n\n registerCommand({\n name: \"click\",\n description: \"Click an element by ref\",\n run: async () => runClick(args)\n });\n\n registerCommand({\n name: \"type\",\n description: \"Type into an element by ref\",\n run: async () => runType(args)\n });\n\n registerCommand({\n name: \"select\",\n description: \"Select values in a select by ref\",\n run: async () => runSelect(args)\n });\n\n registerCommand({\n name: \"scroll\",\n description: \"Scroll the page or element by ref\",\n run: async () => runScroll(args)\n });\n const command = getCommand(args.command);\n if (!command) {\n throw new Error(`Unknown command: ${args.command}`);\n }\n\n const result = await command.run(args);\n emitResult(result, result.data ? { data: result.data } : undefined);\n const exitCode = resolveExitCode(result);\n if (exitCode === null) {\n return;\n }\n process.exit(exitCode);\n } catch (error) {\n const format = outputFormat ?? detectOutputFormat(process.argv);\n const cliError = toCliError(error, parseSucceeded ? EXIT_EXECUTION : EXIT_USAGE);\n emitFatalError(cliError, format);\n process.exit(cliError.exitCode);\n }\n}\n\nmain().catch((error: unknown) => {\n const cliError = toCliError(error, EXIT_EXECUTION);\n emitFatalError(cliError, detectOutputFormat(process.argv));\n process.exit(cliError.exitCode);\n});\n"],"mappings":"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","names":["mode","noPrompt","fs","fs","path","edits","fs","path","os","fs","fs","path","fs","path","os","fs","path","os","PLUGIN_NAME","fs","path","os","getPluginConfigPath","mkdirSync","readFileSync","writeFileSync","unlinkSync","existsSync","homedir","join","result","resolve","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","unlinkSync","resolve","readFileSync","resolve","readFileSync","resolve","result","exitCode"]}
|