[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-anomaly-browser-control":3,"mdc-y03lbc-key":37,"related-repo-anomaly-browser-control":3308,"related-org-anomaly-browser-control":3317},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"browser-control","automate browser interactions with Playwright","Drive the user's existing Chromium-family browser with deterministic Playwright. Use when asked to inspect, automate, test, or interact with a visible browser tab; continue an authenticated browser workflow; handle 2FA, passkeys, CAPTCHAs, or payment confirmation; record browser behavior; or capture an authenticated network flow.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"anomaly","Anomaly (SST \u002F OpenCode)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fanomaly.png","anomalyco",[13,17,20,23],{"name":14,"slug":15,"type":16},"Automation","automation","tag",{"name":18,"slug":19,"type":16},"Playwright","playwright",{"name":21,"slug":22,"type":16},"Testing","testing",{"name":24,"slug":25,"type":16},"Browser Automation","browser-automation",205,"https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fbrowser-control","2026-07-23T05:40:34.252936",null,9,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Local browser driver for trusted agents: control your existing Chromium browser through a small extension and local relay","https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fbrowser-control\u002Ftree\u002FHEAD\u002Fskills\u002Fbrowser-control","---\nname: browser-control\ndescription: Drive the user's existing Chromium-family browser with deterministic Playwright. Use when asked to inspect, automate, test, or interact with a visible browser tab; continue an authenticated browser workflow; handle 2FA, passkeys, CAPTCHAs, or payment confirmation; record browser behavior; or capture an authenticated network flow.\n---\n\n# Browser Control\n\nBrowser Control is a **driver**, not an agent. The calling agent decides what to\ndo; Browser Control runs deterministic Playwright code in the user's visible\nbrowser.\n\nUse one loop throughout: **inspect, act, verify**. Inspect the real page before\nchoosing locators, act through the narrowest stable control, then verify the\nresult through a URL or fresh page read. Never treat a successful click or human\nacknowledgment as proof that the task succeeded.\n\n## Core Workflow\n\n### 1. Run The Task Directly\n\nStart with the requested browser work. Relay-backed commands start the detached\nrelay and wait for the extension; do not start `browser-control serve` first.\n\n```bash\nbrowser-control execute 'return { url: page.url(), title: await page.title() }'\n```\n\nUse `browser-control doctor` only when setup or runtime behavior is unclear.\n`status` and `doctor` are observational and never start the relay.\n\n```bash\nbrowser-control doctor\nbrowser-control status --json\n```\n\nCompletion: one execute returns a page result and a readable session id, or\n`doctor` identifies the concrete setup failure.\n\n### 2. Choose The Page Deliberately\n\nA bare CLI execute creates a fresh session-owned page and prints the exact\n`--session \u003Cid>` continuation command. Every later CLI call must pass that id or\nset `BROWSER_CONTROL_SESSION`; bare execute never guesses from human-shell\ncurrent state.\n\n```bash\nbrowser-control execute 'return page.url()'\nbrowser-control execute --session cosmic-otter-866 'return page.url()'\n```\n\nMCP keeps one implicit process session. Omit `session` for that normal path, or\ncall `session_new` and pass an explicit id when one MCP process needs multiple\nsessions.\n\nTo control a tab already open in the user's browser, ask the user to click the\nBrowser Control toolbar button on that tab. Select it for one execute or adopt\nit for sticky reuse:\n\n```bash\nbrowser-control execute --target-url github.com 'return page.url()'\nbrowser-control session adopt --target-url github.com --session github\n```\n\n`targetUrl` and `targetIndex` select existing attached pages; they never\nnavigate. A URL selector must match exactly one page, and URL and index selectors\ncannot be combined. Adoption makes that tab the session default, closes the\nsession's previous relay-created page, and is exclusive to one Browser Control\nsession. Reset or delete releases an adopted user tab without closing it.\n\nPrefer adoption for authenticated browser state rather than reproducing login\nin a fresh page.\n\nCompletion: the selected page URL is the intended page, and later work either\nretains the returned session id or intentionally uses the MCP process session.\n\n### 3. Inspect, Act, Verify\n\nInspect before guessing roles or selectors:\n\n```js\nreturn await snapshot()\n```\n\nThen act from the returned structure and verify the destination:\n\n```js\nawait ref(\"e12\").click()\nawait page.getByRole(\"heading\", { name: \"Settings\" }).waitFor()\nif (!page.url().includes(\"\u002Fsettings\")) {\n  throw new Error(`Unexpected destination: ${page.url()}`)\n}\nreturn { url: page.url(), heading: await page.getByRole(\"heading\").first().innerText() }\n```\n\nUse normal Playwright first. Keep dependent interactions in one execute when\nthey rely on transient UI such as an open menu, selected rows, hover state, or\nan in-progress form.\n\nIf native `locator.fill()` hangs because a browser extension interferes with\nfocus, use the explicit `input`\u002F`textarea` fallback:\n\n```js\nawait fillInput(page.getByPlaceholder(\"Username\"), \"standard_user\")\n```\n\nCompletion: the final return value contains evidence of the requested outcome,\nnot merely evidence that an action was attempted.\n\n### 4. Continue Or Finish Cleanly\n\nNamed sessions preserve their default page across short-lived CLI and MCP\nprocesses. They also survive relay restarts: Browser Control restores the id,\nread-only mode, and exact default target. JavaScript `state` and snapshot refs\nare process-local and reset after a relay restart with an explicit warning.\n\n```bash\nbrowser-control session list\nbrowser-control session reset github\nbrowser-control session delete github\n```\n\nEvery execute is journaled under\n`~\u002F.browser-control\u002Fsessions\u002F\u003Cid>\u002Fjournal.jsonl`. The journal records code,\nstatus, duration, URL movement, warnings, handoffs, and bounded diagnostics.\nNever place credentials directly in execute source.\n\n```bash\nbrowser-control journal --session github --limit 50\n```\n\nCompletion: retain the session only when follow-up work is expected; otherwise\nreset or delete session-owned pages and report any warnings that affect later\nwork.\n\n## Canonical Authenticated Flow\n\nThe distinguishing Browser Control workflow is an authenticated tab plus a\nhuman-only prompt:\n\nAttach and adopt the existing tab, inspect its real UI, fill ordinary fields,\nthen register `handoff` before triggering WebAuthn, 2FA, CAPTCHA, or payment UI.\nAfter the user completes it, verify the authenticated destination. The same\nsession can continue after an MCP process or relay restart.\n\nWhen the prompt-triggering action may itself block, put only that action in\n`start`. Browser Control presents and acknowledges WAIT before invoking it:\n\n```js\nawait handoff(\"Complete the security-key prompt, then continue\", {\n  timeoutMs: 600_000,\n  start: () => page\n    .getByRole(\"button\", { name: \u002Fpasskey|security key|sign in\u002Fi })\n    .click({ timeout: 600_000 }),\n})\n\nawait page.waitForURL((url) => !url.pathname.startsWith(\"\u002Flogin\"))\nawait page.getByRole(\"heading\", { name: \u002Faccount|dashboard\u002Fi }).waitFor()\nreturn { authenticatedUrl: page.url(), title: await page.title() }\n```\n\nTell the user what action is waiting. Human acknowledgment is not verification:\nalways assert the expected URL or stable element after `handoff`. If the action\nwas already completed and only the human step remains, call `handoff(message)`\nwithout `start`. The default timeout is ten minutes.\n\nCompletion: the prompt was presented only after WAIT was registered, the action\nsettled, and the authenticated result was independently verified.\n\n## Inspection Tools\n\nUse the least expensive view that answers the question:\n\n- `snapshot()` is the compact read-before-act default. It prioritizes semantic\n  groups, alerts, lists, tables, headings, links, and controls. Text input and\n  textarea values are omitted.\n- `ref(\"e12\")` resolves a control from the latest snapshot. Refs fail closed\n  after navigation or incompatible DOM drift.\n- `snapshot({ diff: true })` reports semantic changes from the compatible prior\n  baseline. A diff invalidates earlier refs and exposes refs only for added or\n  changed current lines.\n- `ariaSnapshot(target?, { timeout })` returns Playwright's detailed YAML aria\n  tree when the compact snapshot omits needed structure.\n- `screenshotWithLabels({ page, path? })` adds visual labels and metadata when\n  layout matters.\n\n```js\nreturn await snapshot({ within: \"main\", maxItems: 200 })\n\u002F\u002F When layout matters, return the image through MCP so it can be inspected.\nreturn await screenshotWithLabels({ page })\n```\n\nSaving an image and returning only `\"ok\"` proves file creation, not visual\ncorrectness. Return screenshot buffers through MCP when visual evidence matters.\n\n## Execute Interface\n\nExecute code can use `page`, `context`, `browser`, persistent `state`, selected\nNode modules through `modules` and aliases such as `fs` and `path`, plus the\nBrowser Control helpers documented here. Single expressions auto-return;\nmulti-statement scripts need `return`. Use `--file` for longer scripts:\n\n```bash\nbrowser-control execute --session github --file .\u002Fperform-flow.js\n```\n\nHuman CLI output includes logs, warnings, and a concise aftermath. Use `--json`\nwhen another command needs to branch on `ok`, `value`, `error`, `warnings`, or\n`aftermath`:\n\n```bash\nbrowser-control execute --json --session github '({ url: page.url() })' | jq .value.url\n```\n\nPlaywright downloads are unavailable through extension-backed tabs because\nChromium blocks download artifact control through `chrome.debugger`. If the\npage exposes the payload through fetch or an API response, read the bytes in the\npage and write them with `fs`. Do not retry `page.waitForEvent(\"download\")`.\n\n## Safety\n\nBrowser Control blocks CDP commands that would destroy shared browser state,\nincluding browser close and cookie\u002Fcache clearing. Never work around those\nguardrails.\n\nFor inspect-only work, use a read-only session:\n\n```bash\nbrowser-control session new inspect-prod --read-only\nbrowser-control execute --session inspect-prod 'await page.goto(\"https:\u002F\u002Fexample.com\"); return page.title()'\n```\n\nRead-only sessions reject `Input.*`, so they cannot click or type through\nPlaywright. `page.evaluate` can still mutate the DOM; read-only prevents trusted\nmistakes, not malicious code.\n\nFor destructive UI work, use a two-phase **read, confirm, verify** flow:\n\n1. Read candidates and return exact stable identifiers or row text.\n2. Obtain user approval for those exact items.\n3. Re-select only approved items and assert the selected count.\n4. Read the confirmation dialog and throw unless it matches the approved action.\n5. Confirm, then verify through a fresh page read or independent CLI\u002FAPI path.\n\nDo not discover and confirm destructive candidates in one script unless the\nuser already approved exact stable identifiers. Never globally auto-accept\nnative dialogs; wait for the expected dialog and assert its type and message\nbefore accepting it.\n\n## TypeScript Client\n\nApplications can import `BrowserControlClient` for schema-decoded,\nsame-origin requests authenticated by a session page. Use `sensitive: true`\nfor token-bearing responses and reveal them through Browser Control's API, not\nthe application's own Effect `Redacted` import; package-manager layouts may\nresolve separate Effect runtimes.\n\n```ts\nimport { BrowserControlClient } from \"@opencode-ai\u002Fbrowser-control\"\n\nconst sensitive = yield* origin.json({\n  path: \"\u002Fapi\u002Fsession\",\n  method: \"POST\",\n  body: {},\n  response: SessionResponse,\n  sensitive: true,\n})\nconst session = BrowserControlClient.reveal(sensitive)\n```\n\n## Authenticated Network Capture\n\nUse network capture when the browser is needed to authenticate or discover a\nworkflow, but repeated direct HTTP calls would be faster and more reliable.\nCapture each flow at least twice with different inputs so constants and\nparameters can be distinguished.\n\n```bash\nbrowser-control network start --session github --url \u002Fapi\u002F \\\n  --resource-type fetch --resource-type xhr\nbrowser-control execute --session github --file .\u002Fperform-flow.js\nbrowser-control network status --session github\nbrowser-control network stop --session github \\\n  --output .\u002Fgithub.har --secrets github\n```\n\nWritten artifacts replace credential-bearing headers, cookies, query fields,\nand structured body fields with stable references such as `${BC_SECRET_1}`.\n`--secrets github` stores lossless values separately in a mode-`0600` Secret\nProfile. Never copy profile values into source, output, diagnostics, or journals,\nand never deliberately return or log credentials.\n\nInspect the redacted artifact offline, generate one typed function per observed\nflow, then verify each function with a harmless live request. Run generated\nclients without exposing values:\n\n```bash\nbrowser-control secrets status github\nbrowser-control secrets run github -- .\u002Fgithub-cli repositories\n```\n\nRefresh credentials normally renewed by a page reload with:\n\n```bash\nbrowser-control secrets refresh github --session github --url \u002Fapi\u002F\n```\n\nIf refresh requires login or a human prompt, reauthenticate in the adopted tab\nand repeat capture with the same profile. MCP exposes equivalent `network_*`\nand `secrets_*` tools.\n\nCompletion: the artifact contains references rather than credential values, the\ngenerated operation passes a harmless live check, and no secret value appears\nin source or output.\n\n## Recording\n\nRecord an attached or session-owned tab with:\n\n```bash\nbrowser-control recording start .\u002Ftmp\u002Fdemo.mp4 --session github --mode cdp\nbrowser-control recording status --session github\nbrowser-control recording stop --session github\n```\n\n`--mode auto` uses tab capture for user-owned tabs and CDP for relay-owned tabs.\nTab capture can include audio; CDP requires `ffmpeg` and has no audio. Use the\ncommand's `--help` for format and cursor options.\n\nCompletion: stop the recorder, inspect the resulting media rather than only its\nexistence, and report the viewport, state, and interaction path actually tested.\n\n## Troubleshooting\n\n1. Run `browser-control doctor`; it checks package metadata, CLI\u002Frelay build\n   identity, extension protocol compatibility, sessions, targets, and artifacts.\n2. Use `status --json` to inspect exact sessions and target ownership.\n3. Reproduce once with the smallest execute before changing code.\n\nCommon diagnoses:\n\n- `connected:false`: run a relay-backed command, then reload the unpacked\n  extension only if its reconnect loop does not recover.\n- Incompatible extension protocol: update either the extension or npm package;\n  exact extension and relay release versions do not need to match.\n- Stale relay build: operational commands reject it with restart guidance;\n  rebuild the CLI and restart the relay.\n- `Target not found`: attach the intended tab, then select or adopt it using a\n  unique URL substring or explicit index.\n- All targets disappeared: dismissing Chromium's debugging banner detaches every\n  tab. Reattach through the toolbar.\n- Relay restarted: named sessions reclaim exact targets, but JavaScript `state`\n  and snapshot refs reset. Continue after the warning.\n- Reset\u002Fdelete after an extension update may wait briefly for target\n  re-announcement; if the old relay-owned target is absent from the completed\n  inventory, Browser Control forgets the dead identity without closing a\n  guessed tab.\n- Repeated execution-context errors: run one short follow-up so Browser Control\n  can health-check the page. It may recreate a relay-owned page, but it never\n  replaces an unhealthy adopted user tab; reset or re-adopt that tab.\n- Fill timeout on login fields: inspect first, then try `fillInput` after\n  confirming the selector or locator resolves. String selectors search open\n  shadow roots recursively; closed shadow roots remain unavailable.\n- Download wait fails: use fetch plus `fs`; extension-backed Playwright cannot\n  retain a native download artifact.\n\nFor deeper relay diagnosis, restart with `BROWSER_CONTROL_DEBUG=1`. Debug traces\nmust never include expressions, arguments, results, headers, cookies, or form\nvalues.\n\nWhenever Browser Control fails, wedges, replaces a page\u002Fsession, or behaves\nunexpectedly, create or update a `browser-control` project todo with the Browser\nControl version, safe session\u002Fpage context, exact error, deterministic\nreproduction, expected versus actual behavior, and recovery attempted. Never\ninclude credentials, form values, or private account data.\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,64,76,83,90,104,148,177,214,226,232,253,317,338,343,417,435,440,445,451,456,491,496,913,918,947,1022,1027,1033,1046,1109,1122,1161,1166,1172,1177,1190,1203,1719,1746,1751,1757,1762,1822,1946,1959,1965,2037,2073,2122,2182,2209,2215,2220,2225,2289,2310,2322,2351,2356,2362,2391,2660,2666,2671,2841,2870,2875,2937,2942,2986,3007,3012,3018,3023,3115,3142,3147,3153,3185,3190,3277,3290,3302],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Browser Control",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54,56,62],{"type":48,"value":55},"Browser Control is a ",{"type":43,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":48,"value":61},"driver",{"type":48,"value":63},", not an agent. The calling agent decides what to\ndo; Browser Control runs deterministic Playwright code in the user's visible\nbrowser.",{"type":43,"tag":51,"props":65,"children":66},{},[67,69,74],{"type":48,"value":68},"Use one loop throughout: ",{"type":43,"tag":57,"props":70,"children":71},{},[72],{"type":48,"value":73},"inspect, act, verify",{"type":48,"value":75},". Inspect the real page before\nchoosing locators, act through the narrowest stable control, then verify the\nresult through a URL or fresh page read. Never treat a successful click or human\nacknowledgment as proof that the task succeeded.",{"type":43,"tag":77,"props":78,"children":80},"h2",{"id":79},"core-workflow",[81],{"type":48,"value":82},"Core Workflow",{"type":43,"tag":84,"props":85,"children":87},"h3",{"id":86},"_1-run-the-task-directly",[88],{"type":48,"value":89},"1. Run The Task Directly",{"type":43,"tag":51,"props":91,"children":92},{},[93,95,102],{"type":48,"value":94},"Start with the requested browser work. Relay-backed commands start the detached\nrelay and wait for the extension; do not start ",{"type":43,"tag":96,"props":97,"children":99},"code",{"className":98},[],[100],{"type":48,"value":101},"browser-control serve",{"type":48,"value":103}," first.",{"type":43,"tag":105,"props":106,"children":111},"pre",{"className":107,"code":108,"language":109,"meta":110,"style":110},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","browser-control execute 'return { url: page.url(), title: await page.title() }'\n","bash","",[112],{"type":43,"tag":96,"props":113,"children":114},{"__ignoreMap":110},[115],{"type":43,"tag":116,"props":117,"children":120},"span",{"class":118,"line":119},"line",1,[121,126,132,138,143],{"type":43,"tag":116,"props":122,"children":124},{"style":123},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[125],{"type":48,"value":4},{"type":43,"tag":116,"props":127,"children":129},{"style":128},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[130],{"type":48,"value":131}," execute",{"type":43,"tag":116,"props":133,"children":135},{"style":134},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[136],{"type":48,"value":137}," '",{"type":43,"tag":116,"props":139,"children":140},{"style":128},[141],{"type":48,"value":142},"return { url: page.url(), title: await page.title() }",{"type":43,"tag":116,"props":144,"children":145},{"style":134},[146],{"type":48,"value":147},"'\n",{"type":43,"tag":51,"props":149,"children":150},{},[151,153,159,161,167,169,175],{"type":48,"value":152},"Use ",{"type":43,"tag":96,"props":154,"children":156},{"className":155},[],[157],{"type":48,"value":158},"browser-control doctor",{"type":48,"value":160}," only when setup or runtime behavior is unclear.\n",{"type":43,"tag":96,"props":162,"children":164},{"className":163},[],[165],{"type":48,"value":166},"status",{"type":48,"value":168}," and ",{"type":43,"tag":96,"props":170,"children":172},{"className":171},[],[173],{"type":48,"value":174},"doctor",{"type":48,"value":176}," are observational and never start the relay.",{"type":43,"tag":105,"props":178,"children":180},{"className":107,"code":179,"language":109,"meta":110,"style":110},"browser-control doctor\nbrowser-control status --json\n",[181],{"type":43,"tag":96,"props":182,"children":183},{"__ignoreMap":110},[184,196],{"type":43,"tag":116,"props":185,"children":186},{"class":118,"line":119},[187,191],{"type":43,"tag":116,"props":188,"children":189},{"style":123},[190],{"type":48,"value":4},{"type":43,"tag":116,"props":192,"children":193},{"style":128},[194],{"type":48,"value":195}," doctor\n",{"type":43,"tag":116,"props":197,"children":199},{"class":118,"line":198},2,[200,204,209],{"type":43,"tag":116,"props":201,"children":202},{"style":123},[203],{"type":48,"value":4},{"type":43,"tag":116,"props":205,"children":206},{"style":128},[207],{"type":48,"value":208}," status",{"type":43,"tag":116,"props":210,"children":211},{"style":128},[212],{"type":48,"value":213}," --json\n",{"type":43,"tag":51,"props":215,"children":216},{},[217,219,224],{"type":48,"value":218},"Completion: one execute returns a page result and a readable session id, or\n",{"type":43,"tag":96,"props":220,"children":222},{"className":221},[],[223],{"type":48,"value":174},{"type":48,"value":225}," identifies the concrete setup failure.",{"type":43,"tag":84,"props":227,"children":229},{"id":228},"_2-choose-the-page-deliberately",[230],{"type":48,"value":231},"2. Choose The Page Deliberately",{"type":43,"tag":51,"props":233,"children":234},{},[235,237,243,245,251],{"type":48,"value":236},"A bare CLI execute creates a fresh session-owned page and prints the exact\n",{"type":43,"tag":96,"props":238,"children":240},{"className":239},[],[241],{"type":48,"value":242},"--session \u003Cid>",{"type":48,"value":244}," continuation command. Every later CLI call must pass that id or\nset ",{"type":43,"tag":96,"props":246,"children":248},{"className":247},[],[249],{"type":48,"value":250},"BROWSER_CONTROL_SESSION",{"type":48,"value":252},"; bare execute never guesses from human-shell\ncurrent state.",{"type":43,"tag":105,"props":254,"children":256},{"className":107,"code":255,"language":109,"meta":110,"style":110},"browser-control execute 'return page.url()'\nbrowser-control execute --session cosmic-otter-866 'return page.url()'\n",[257],{"type":43,"tag":96,"props":258,"children":259},{"__ignoreMap":110},[260,284],{"type":43,"tag":116,"props":261,"children":262},{"class":118,"line":119},[263,267,271,275,280],{"type":43,"tag":116,"props":264,"children":265},{"style":123},[266],{"type":48,"value":4},{"type":43,"tag":116,"props":268,"children":269},{"style":128},[270],{"type":48,"value":131},{"type":43,"tag":116,"props":272,"children":273},{"style":134},[274],{"type":48,"value":137},{"type":43,"tag":116,"props":276,"children":277},{"style":128},[278],{"type":48,"value":279},"return page.url()",{"type":43,"tag":116,"props":281,"children":282},{"style":134},[283],{"type":48,"value":147},{"type":43,"tag":116,"props":285,"children":286},{"class":118,"line":198},[287,291,295,300,305,309,313],{"type":43,"tag":116,"props":288,"children":289},{"style":123},[290],{"type":48,"value":4},{"type":43,"tag":116,"props":292,"children":293},{"style":128},[294],{"type":48,"value":131},{"type":43,"tag":116,"props":296,"children":297},{"style":128},[298],{"type":48,"value":299}," --session",{"type":43,"tag":116,"props":301,"children":302},{"style":128},[303],{"type":48,"value":304}," cosmic-otter-866",{"type":43,"tag":116,"props":306,"children":307},{"style":134},[308],{"type":48,"value":137},{"type":43,"tag":116,"props":310,"children":311},{"style":128},[312],{"type":48,"value":279},{"type":43,"tag":116,"props":314,"children":315},{"style":134},[316],{"type":48,"value":147},{"type":43,"tag":51,"props":318,"children":319},{},[320,322,328,330,336],{"type":48,"value":321},"MCP keeps one implicit process session. Omit ",{"type":43,"tag":96,"props":323,"children":325},{"className":324},[],[326],{"type":48,"value":327},"session",{"type":48,"value":329}," for that normal path, or\ncall ",{"type":43,"tag":96,"props":331,"children":333},{"className":332},[],[334],{"type":48,"value":335},"session_new",{"type":48,"value":337}," and pass an explicit id when one MCP process needs multiple\nsessions.",{"type":43,"tag":51,"props":339,"children":340},{},[341],{"type":48,"value":342},"To control a tab already open in the user's browser, ask the user to click the\nBrowser Control toolbar button on that tab. Select it for one execute or adopt\nit for sticky reuse:",{"type":43,"tag":105,"props":344,"children":346},{"className":107,"code":345,"language":109,"meta":110,"style":110},"browser-control execute --target-url github.com 'return page.url()'\nbrowser-control session adopt --target-url github.com --session github\n",[347],{"type":43,"tag":96,"props":348,"children":349},{"__ignoreMap":110},[350,383],{"type":43,"tag":116,"props":351,"children":352},{"class":118,"line":119},[353,357,361,366,371,375,379],{"type":43,"tag":116,"props":354,"children":355},{"style":123},[356],{"type":48,"value":4},{"type":43,"tag":116,"props":358,"children":359},{"style":128},[360],{"type":48,"value":131},{"type":43,"tag":116,"props":362,"children":363},{"style":128},[364],{"type":48,"value":365}," --target-url",{"type":43,"tag":116,"props":367,"children":368},{"style":128},[369],{"type":48,"value":370}," github.com",{"type":43,"tag":116,"props":372,"children":373},{"style":134},[374],{"type":48,"value":137},{"type":43,"tag":116,"props":376,"children":377},{"style":128},[378],{"type":48,"value":279},{"type":43,"tag":116,"props":380,"children":381},{"style":134},[382],{"type":48,"value":147},{"type":43,"tag":116,"props":384,"children":385},{"class":118,"line":198},[386,390,395,400,404,408,412],{"type":43,"tag":116,"props":387,"children":388},{"style":123},[389],{"type":48,"value":4},{"type":43,"tag":116,"props":391,"children":392},{"style":128},[393],{"type":48,"value":394}," session",{"type":43,"tag":116,"props":396,"children":397},{"style":128},[398],{"type":48,"value":399}," adopt",{"type":43,"tag":116,"props":401,"children":402},{"style":128},[403],{"type":48,"value":365},{"type":43,"tag":116,"props":405,"children":406},{"style":128},[407],{"type":48,"value":370},{"type":43,"tag":116,"props":409,"children":410},{"style":128},[411],{"type":48,"value":299},{"type":43,"tag":116,"props":413,"children":414},{"style":128},[415],{"type":48,"value":416}," github\n",{"type":43,"tag":51,"props":418,"children":419},{},[420,426,427,433],{"type":43,"tag":96,"props":421,"children":423},{"className":422},[],[424],{"type":48,"value":425},"targetUrl",{"type":48,"value":168},{"type":43,"tag":96,"props":428,"children":430},{"className":429},[],[431],{"type":48,"value":432},"targetIndex",{"type":48,"value":434}," select existing attached pages; they never\nnavigate. A URL selector must match exactly one page, and URL and index selectors\ncannot be combined. Adoption makes that tab the session default, closes the\nsession's previous relay-created page, and is exclusive to one Browser Control\nsession. Reset or delete releases an adopted user tab without closing it.",{"type":43,"tag":51,"props":436,"children":437},{},[438],{"type":48,"value":439},"Prefer adoption for authenticated browser state rather than reproducing login\nin a fresh page.",{"type":43,"tag":51,"props":441,"children":442},{},[443],{"type":48,"value":444},"Completion: the selected page URL is the intended page, and later work either\nretains the returned session id or intentionally uses the MCP process session.",{"type":43,"tag":84,"props":446,"children":448},{"id":447},"_3-inspect-act-verify",[449],{"type":48,"value":450},"3. Inspect, Act, Verify",{"type":43,"tag":51,"props":452,"children":453},{},[454],{"type":48,"value":455},"Inspect before guessing roles or selectors:",{"type":43,"tag":105,"props":457,"children":461},{"className":458,"code":459,"language":460,"meta":110,"style":110},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","return await snapshot()\n","js",[462],{"type":43,"tag":96,"props":463,"children":464},{"__ignoreMap":110},[465],{"type":43,"tag":116,"props":466,"children":467},{"class":118,"line":119},[468,474,479,485],{"type":43,"tag":116,"props":469,"children":471},{"style":470},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[472],{"type":48,"value":473},"return",{"type":43,"tag":116,"props":475,"children":476},{"style":470},[477],{"type":48,"value":478}," await",{"type":43,"tag":116,"props":480,"children":482},{"style":481},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[483],{"type":48,"value":484}," snapshot",{"type":43,"tag":116,"props":486,"children":488},{"style":487},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[489],{"type":48,"value":490},"()\n",{"type":43,"tag":51,"props":492,"children":493},{},[494],{"type":48,"value":495},"Then act from the returned structure and verify the destination:",{"type":43,"tag":105,"props":497,"children":499},{"className":458,"code":498,"language":460,"meta":110,"style":110},"await ref(\"e12\").click()\nawait page.getByRole(\"heading\", { name: \"Settings\" }).waitFor()\nif (!page.url().includes(\"\u002Fsettings\")) {\n  throw new Error(`Unexpected destination: ${page.url()}`)\n}\nreturn { url: page.url(), heading: await page.getByRole(\"heading\").first().innerText() }\n",[500],{"type":43,"tag":96,"props":501,"children":502},{"__ignoreMap":110},[503,554,649,723,787,796],{"type":43,"tag":116,"props":504,"children":505},{"class":118,"line":119},[506,511,516,521,526,531,535,540,545,550],{"type":43,"tag":116,"props":507,"children":508},{"style":470},[509],{"type":48,"value":510},"await",{"type":43,"tag":116,"props":512,"children":513},{"style":481},[514],{"type":48,"value":515}," ref",{"type":43,"tag":116,"props":517,"children":518},{"style":487},[519],{"type":48,"value":520},"(",{"type":43,"tag":116,"props":522,"children":523},{"style":134},[524],{"type":48,"value":525},"\"",{"type":43,"tag":116,"props":527,"children":528},{"style":128},[529],{"type":48,"value":530},"e12",{"type":43,"tag":116,"props":532,"children":533},{"style":134},[534],{"type":48,"value":525},{"type":43,"tag":116,"props":536,"children":537},{"style":487},[538],{"type":48,"value":539},")",{"type":43,"tag":116,"props":541,"children":542},{"style":134},[543],{"type":48,"value":544},".",{"type":43,"tag":116,"props":546,"children":547},{"style":481},[548],{"type":48,"value":549},"click",{"type":43,"tag":116,"props":551,"children":552},{"style":487},[553],{"type":48,"value":490},{"type":43,"tag":116,"props":555,"children":556},{"class":118,"line":198},[557,561,566,570,575,579,583,588,592,597,602,608,613,618,623,627,632,636,640,645],{"type":43,"tag":116,"props":558,"children":559},{"style":470},[560],{"type":48,"value":510},{"type":43,"tag":116,"props":562,"children":563},{"style":487},[564],{"type":48,"value":565}," page",{"type":43,"tag":116,"props":567,"children":568},{"style":134},[569],{"type":48,"value":544},{"type":43,"tag":116,"props":571,"children":572},{"style":481},[573],{"type":48,"value":574},"getByRole",{"type":43,"tag":116,"props":576,"children":577},{"style":487},[578],{"type":48,"value":520},{"type":43,"tag":116,"props":580,"children":581},{"style":134},[582],{"type":48,"value":525},{"type":43,"tag":116,"props":584,"children":585},{"style":128},[586],{"type":48,"value":587},"heading",{"type":43,"tag":116,"props":589,"children":590},{"style":134},[591],{"type":48,"value":525},{"type":43,"tag":116,"props":593,"children":594},{"style":134},[595],{"type":48,"value":596},",",{"type":43,"tag":116,"props":598,"children":599},{"style":134},[600],{"type":48,"value":601}," {",{"type":43,"tag":116,"props":603,"children":605},{"style":604},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[606],{"type":48,"value":607}," name",{"type":43,"tag":116,"props":609,"children":610},{"style":134},[611],{"type":48,"value":612},":",{"type":43,"tag":116,"props":614,"children":615},{"style":134},[616],{"type":48,"value":617}," \"",{"type":43,"tag":116,"props":619,"children":620},{"style":128},[621],{"type":48,"value":622},"Settings",{"type":43,"tag":116,"props":624,"children":625},{"style":134},[626],{"type":48,"value":525},{"type":43,"tag":116,"props":628,"children":629},{"style":134},[630],{"type":48,"value":631}," }",{"type":43,"tag":116,"props":633,"children":634},{"style":487},[635],{"type":48,"value":539},{"type":43,"tag":116,"props":637,"children":638},{"style":134},[639],{"type":48,"value":544},{"type":43,"tag":116,"props":641,"children":642},{"style":481},[643],{"type":48,"value":644},"waitFor",{"type":43,"tag":116,"props":646,"children":647},{"style":487},[648],{"type":48,"value":490},{"type":43,"tag":116,"props":650,"children":652},{"class":118,"line":651},3,[653,658,663,668,673,677,682,687,691,696,700,704,709,713,718],{"type":43,"tag":116,"props":654,"children":655},{"style":470},[656],{"type":48,"value":657},"if",{"type":43,"tag":116,"props":659,"children":660},{"style":487},[661],{"type":48,"value":662}," (",{"type":43,"tag":116,"props":664,"children":665},{"style":134},[666],{"type":48,"value":667},"!",{"type":43,"tag":116,"props":669,"children":670},{"style":487},[671],{"type":48,"value":672},"page",{"type":43,"tag":116,"props":674,"children":675},{"style":134},[676],{"type":48,"value":544},{"type":43,"tag":116,"props":678,"children":679},{"style":481},[680],{"type":48,"value":681},"url",{"type":43,"tag":116,"props":683,"children":684},{"style":487},[685],{"type":48,"value":686},"()",{"type":43,"tag":116,"props":688,"children":689},{"style":134},[690],{"type":48,"value":544},{"type":43,"tag":116,"props":692,"children":693},{"style":481},[694],{"type":48,"value":695},"includes",{"type":43,"tag":116,"props":697,"children":698},{"style":487},[699],{"type":48,"value":520},{"type":43,"tag":116,"props":701,"children":702},{"style":134},[703],{"type":48,"value":525},{"type":43,"tag":116,"props":705,"children":706},{"style":128},[707],{"type":48,"value":708},"\u002Fsettings",{"type":43,"tag":116,"props":710,"children":711},{"style":134},[712],{"type":48,"value":525},{"type":43,"tag":116,"props":714,"children":715},{"style":487},[716],{"type":48,"value":717},")) ",{"type":43,"tag":116,"props":719,"children":720},{"style":134},[721],{"type":48,"value":722},"{\n",{"type":43,"tag":116,"props":724,"children":726},{"class":118,"line":725},4,[727,732,737,742,746,751,756,761,765,769,773,777,782],{"type":43,"tag":116,"props":728,"children":729},{"style":470},[730],{"type":48,"value":731},"  throw",{"type":43,"tag":116,"props":733,"children":734},{"style":134},[735],{"type":48,"value":736}," new",{"type":43,"tag":116,"props":738,"children":739},{"style":481},[740],{"type":48,"value":741}," Error",{"type":43,"tag":116,"props":743,"children":744},{"style":604},[745],{"type":48,"value":520},{"type":43,"tag":116,"props":747,"children":748},{"style":134},[749],{"type":48,"value":750},"`",{"type":43,"tag":116,"props":752,"children":753},{"style":128},[754],{"type":48,"value":755},"Unexpected destination: ",{"type":43,"tag":116,"props":757,"children":758},{"style":134},[759],{"type":48,"value":760},"${",{"type":43,"tag":116,"props":762,"children":763},{"style":487},[764],{"type":48,"value":672},{"type":43,"tag":116,"props":766,"children":767},{"style":134},[768],{"type":48,"value":544},{"type":43,"tag":116,"props":770,"children":771},{"style":481},[772],{"type":48,"value":681},{"type":43,"tag":116,"props":774,"children":775},{"style":487},[776],{"type":48,"value":686},{"type":43,"tag":116,"props":778,"children":779},{"style":134},[780],{"type":48,"value":781},"}`",{"type":43,"tag":116,"props":783,"children":784},{"style":604},[785],{"type":48,"value":786},")\n",{"type":43,"tag":116,"props":788,"children":790},{"class":118,"line":789},5,[791],{"type":43,"tag":116,"props":792,"children":793},{"style":134},[794],{"type":48,"value":795},"}\n",{"type":43,"tag":116,"props":797,"children":799},{"class":118,"line":798},6,[800,804,808,813,817,821,825,829,833,837,842,846,850,854,858,862,866,870,874,878,882,886,891,895,899,904,909],{"type":43,"tag":116,"props":801,"children":802},{"style":470},[803],{"type":48,"value":473},{"type":43,"tag":116,"props":805,"children":806},{"style":134},[807],{"type":48,"value":601},{"type":43,"tag":116,"props":809,"children":810},{"style":604},[811],{"type":48,"value":812}," url",{"type":43,"tag":116,"props":814,"children":815},{"style":134},[816],{"type":48,"value":612},{"type":43,"tag":116,"props":818,"children":819},{"style":487},[820],{"type":48,"value":565},{"type":43,"tag":116,"props":822,"children":823},{"style":134},[824],{"type":48,"value":544},{"type":43,"tag":116,"props":826,"children":827},{"style":481},[828],{"type":48,"value":681},{"type":43,"tag":116,"props":830,"children":831},{"style":487},[832],{"type":48,"value":686},{"type":43,"tag":116,"props":834,"children":835},{"style":134},[836],{"type":48,"value":596},{"type":43,"tag":116,"props":838,"children":839},{"style":604},[840],{"type":48,"value":841}," heading",{"type":43,"tag":116,"props":843,"children":844},{"style":134},[845],{"type":48,"value":612},{"type":43,"tag":116,"props":847,"children":848},{"style":470},[849],{"type":48,"value":478},{"type":43,"tag":116,"props":851,"children":852},{"style":487},[853],{"type":48,"value":565},{"type":43,"tag":116,"props":855,"children":856},{"style":134},[857],{"type":48,"value":544},{"type":43,"tag":116,"props":859,"children":860},{"style":481},[861],{"type":48,"value":574},{"type":43,"tag":116,"props":863,"children":864},{"style":487},[865],{"type":48,"value":520},{"type":43,"tag":116,"props":867,"children":868},{"style":134},[869],{"type":48,"value":525},{"type":43,"tag":116,"props":871,"children":872},{"style":128},[873],{"type":48,"value":587},{"type":43,"tag":116,"props":875,"children":876},{"style":134},[877],{"type":48,"value":525},{"type":43,"tag":116,"props":879,"children":880},{"style":487},[881],{"type":48,"value":539},{"type":43,"tag":116,"props":883,"children":884},{"style":134},[885],{"type":48,"value":544},{"type":43,"tag":116,"props":887,"children":888},{"style":481},[889],{"type":48,"value":890},"first",{"type":43,"tag":116,"props":892,"children":893},{"style":487},[894],{"type":48,"value":686},{"type":43,"tag":116,"props":896,"children":897},{"style":134},[898],{"type":48,"value":544},{"type":43,"tag":116,"props":900,"children":901},{"style":481},[902],{"type":48,"value":903},"innerText",{"type":43,"tag":116,"props":905,"children":906},{"style":487},[907],{"type":48,"value":908},"() ",{"type":43,"tag":116,"props":910,"children":911},{"style":134},[912],{"type":48,"value":795},{"type":43,"tag":51,"props":914,"children":915},{},[916],{"type":48,"value":917},"Use normal Playwright first. Keep dependent interactions in one execute when\nthey rely on transient UI such as an open menu, selected rows, hover state, or\nan in-progress form.",{"type":43,"tag":51,"props":919,"children":920},{},[921,923,929,931,937,939,945],{"type":48,"value":922},"If native ",{"type":43,"tag":96,"props":924,"children":926},{"className":925},[],[927],{"type":48,"value":928},"locator.fill()",{"type":48,"value":930}," hangs because a browser extension interferes with\nfocus, use the explicit ",{"type":43,"tag":96,"props":932,"children":934},{"className":933},[],[935],{"type":48,"value":936},"input",{"type":48,"value":938},"\u002F",{"type":43,"tag":96,"props":940,"children":942},{"className":941},[],[943],{"type":48,"value":944},"textarea",{"type":48,"value":946}," fallback:",{"type":43,"tag":105,"props":948,"children":950},{"className":458,"code":949,"language":460,"meta":110,"style":110},"await fillInput(page.getByPlaceholder(\"Username\"), \"standard_user\")\n",[951],{"type":43,"tag":96,"props":952,"children":953},{"__ignoreMap":110},[954],{"type":43,"tag":116,"props":955,"children":956},{"class":118,"line":119},[957,961,966,971,975,980,984,988,993,997,1001,1005,1009,1014,1018],{"type":43,"tag":116,"props":958,"children":959},{"style":470},[960],{"type":48,"value":510},{"type":43,"tag":116,"props":962,"children":963},{"style":481},[964],{"type":48,"value":965}," fillInput",{"type":43,"tag":116,"props":967,"children":968},{"style":487},[969],{"type":48,"value":970},"(page",{"type":43,"tag":116,"props":972,"children":973},{"style":134},[974],{"type":48,"value":544},{"type":43,"tag":116,"props":976,"children":977},{"style":481},[978],{"type":48,"value":979},"getByPlaceholder",{"type":43,"tag":116,"props":981,"children":982},{"style":487},[983],{"type":48,"value":520},{"type":43,"tag":116,"props":985,"children":986},{"style":134},[987],{"type":48,"value":525},{"type":43,"tag":116,"props":989,"children":990},{"style":128},[991],{"type":48,"value":992},"Username",{"type":43,"tag":116,"props":994,"children":995},{"style":134},[996],{"type":48,"value":525},{"type":43,"tag":116,"props":998,"children":999},{"style":487},[1000],{"type":48,"value":539},{"type":43,"tag":116,"props":1002,"children":1003},{"style":134},[1004],{"type":48,"value":596},{"type":43,"tag":116,"props":1006,"children":1007},{"style":134},[1008],{"type":48,"value":617},{"type":43,"tag":116,"props":1010,"children":1011},{"style":128},[1012],{"type":48,"value":1013},"standard_user",{"type":43,"tag":116,"props":1015,"children":1016},{"style":134},[1017],{"type":48,"value":525},{"type":43,"tag":116,"props":1019,"children":1020},{"style":487},[1021],{"type":48,"value":786},{"type":43,"tag":51,"props":1023,"children":1024},{},[1025],{"type":48,"value":1026},"Completion: the final return value contains evidence of the requested outcome,\nnot merely evidence that an action was attempted.",{"type":43,"tag":84,"props":1028,"children":1030},{"id":1029},"_4-continue-or-finish-cleanly",[1031],{"type":48,"value":1032},"4. Continue Or Finish Cleanly",{"type":43,"tag":51,"props":1034,"children":1035},{},[1036,1038,1044],{"type":48,"value":1037},"Named sessions preserve their default page across short-lived CLI and MCP\nprocesses. They also survive relay restarts: Browser Control restores the id,\nread-only mode, and exact default target. JavaScript ",{"type":43,"tag":96,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":48,"value":1043},"state",{"type":48,"value":1045}," and snapshot refs\nare process-local and reset after a relay restart with an explicit warning.",{"type":43,"tag":105,"props":1047,"children":1049},{"className":107,"code":1048,"language":109,"meta":110,"style":110},"browser-control session list\nbrowser-control session reset github\nbrowser-control session delete github\n",[1050],{"type":43,"tag":96,"props":1051,"children":1052},{"__ignoreMap":110},[1053,1069,1089],{"type":43,"tag":116,"props":1054,"children":1055},{"class":118,"line":119},[1056,1060,1064],{"type":43,"tag":116,"props":1057,"children":1058},{"style":123},[1059],{"type":48,"value":4},{"type":43,"tag":116,"props":1061,"children":1062},{"style":128},[1063],{"type":48,"value":394},{"type":43,"tag":116,"props":1065,"children":1066},{"style":128},[1067],{"type":48,"value":1068}," list\n",{"type":43,"tag":116,"props":1070,"children":1071},{"class":118,"line":198},[1072,1076,1080,1085],{"type":43,"tag":116,"props":1073,"children":1074},{"style":123},[1075],{"type":48,"value":4},{"type":43,"tag":116,"props":1077,"children":1078},{"style":128},[1079],{"type":48,"value":394},{"type":43,"tag":116,"props":1081,"children":1082},{"style":128},[1083],{"type":48,"value":1084}," reset",{"type":43,"tag":116,"props":1086,"children":1087},{"style":128},[1088],{"type":48,"value":416},{"type":43,"tag":116,"props":1090,"children":1091},{"class":118,"line":651},[1092,1096,1100,1105],{"type":43,"tag":116,"props":1093,"children":1094},{"style":123},[1095],{"type":48,"value":4},{"type":43,"tag":116,"props":1097,"children":1098},{"style":128},[1099],{"type":48,"value":394},{"type":43,"tag":116,"props":1101,"children":1102},{"style":128},[1103],{"type":48,"value":1104}," delete",{"type":43,"tag":116,"props":1106,"children":1107},{"style":128},[1108],{"type":48,"value":416},{"type":43,"tag":51,"props":1110,"children":1111},{},[1112,1114,1120],{"type":48,"value":1113},"Every execute is journaled under\n",{"type":43,"tag":96,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":48,"value":1119},"~\u002F.browser-control\u002Fsessions\u002F\u003Cid>\u002Fjournal.jsonl",{"type":48,"value":1121},". The journal records code,\nstatus, duration, URL movement, warnings, handoffs, and bounded diagnostics.\nNever place credentials directly in execute source.",{"type":43,"tag":105,"props":1123,"children":1125},{"className":107,"code":1124,"language":109,"meta":110,"style":110},"browser-control journal --session github --limit 50\n",[1126],{"type":43,"tag":96,"props":1127,"children":1128},{"__ignoreMap":110},[1129],{"type":43,"tag":116,"props":1130,"children":1131},{"class":118,"line":119},[1132,1136,1141,1145,1150,1155],{"type":43,"tag":116,"props":1133,"children":1134},{"style":123},[1135],{"type":48,"value":4},{"type":43,"tag":116,"props":1137,"children":1138},{"style":128},[1139],{"type":48,"value":1140}," journal",{"type":43,"tag":116,"props":1142,"children":1143},{"style":128},[1144],{"type":48,"value":299},{"type":43,"tag":116,"props":1146,"children":1147},{"style":128},[1148],{"type":48,"value":1149}," github",{"type":43,"tag":116,"props":1151,"children":1152},{"style":128},[1153],{"type":48,"value":1154}," --limit",{"type":43,"tag":116,"props":1156,"children":1158},{"style":1157},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1159],{"type":48,"value":1160}," 50\n",{"type":43,"tag":51,"props":1162,"children":1163},{},[1164],{"type":48,"value":1165},"Completion: retain the session only when follow-up work is expected; otherwise\nreset or delete session-owned pages and report any warnings that affect later\nwork.",{"type":43,"tag":77,"props":1167,"children":1169},{"id":1168},"canonical-authenticated-flow",[1170],{"type":48,"value":1171},"Canonical Authenticated Flow",{"type":43,"tag":51,"props":1173,"children":1174},{},[1175],{"type":48,"value":1176},"The distinguishing Browser Control workflow is an authenticated tab plus a\nhuman-only prompt:",{"type":43,"tag":51,"props":1178,"children":1179},{},[1180,1182,1188],{"type":48,"value":1181},"Attach and adopt the existing tab, inspect its real UI, fill ordinary fields,\nthen register ",{"type":43,"tag":96,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":48,"value":1187},"handoff",{"type":48,"value":1189}," before triggering WebAuthn, 2FA, CAPTCHA, or payment UI.\nAfter the user completes it, verify the authenticated destination. The same\nsession can continue after an MCP process or relay restart.",{"type":43,"tag":51,"props":1191,"children":1192},{},[1193,1195,1201],{"type":48,"value":1194},"When the prompt-triggering action may itself block, put only that action in\n",{"type":43,"tag":96,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":48,"value":1200},"start",{"type":48,"value":1202},". Browser Control presents and acknowledges WAIT before invoking it:",{"type":43,"tag":105,"props":1204,"children":1206},{"className":458,"code":1205,"language":460,"meta":110,"style":110},"await handoff(\"Complete the security-key prompt, then continue\", {\n  timeoutMs: 600_000,\n  start: () => page\n    .getByRole(\"button\", { name: \u002Fpasskey|security key|sign in\u002Fi })\n    .click({ timeout: 600_000 }),\n})\n\nawait page.waitForURL((url) => !url.pathname.startsWith(\"\u002Flogin\"))\nawait page.getByRole(\"heading\", { name: \u002Faccount|dashboard\u002Fi }).waitFor()\nreturn { authenticatedUrl: page.url(), title: await page.title() }\n",[1207],{"type":43,"tag":96,"props":1208,"children":1209},{"__ignoreMap":110},[1210,1248,1270,1298,1389,1434,1446,1456,1547,1644],{"type":43,"tag":116,"props":1211,"children":1212},{"class":118,"line":119},[1213,1217,1222,1226,1230,1235,1239,1243],{"type":43,"tag":116,"props":1214,"children":1215},{"style":470},[1216],{"type":48,"value":510},{"type":43,"tag":116,"props":1218,"children":1219},{"style":481},[1220],{"type":48,"value":1221}," handoff",{"type":43,"tag":116,"props":1223,"children":1224},{"style":487},[1225],{"type":48,"value":520},{"type":43,"tag":116,"props":1227,"children":1228},{"style":134},[1229],{"type":48,"value":525},{"type":43,"tag":116,"props":1231,"children":1232},{"style":128},[1233],{"type":48,"value":1234},"Complete the security-key prompt, then continue",{"type":43,"tag":116,"props":1236,"children":1237},{"style":134},[1238],{"type":48,"value":525},{"type":43,"tag":116,"props":1240,"children":1241},{"style":134},[1242],{"type":48,"value":596},{"type":43,"tag":116,"props":1244,"children":1245},{"style":134},[1246],{"type":48,"value":1247}," {\n",{"type":43,"tag":116,"props":1249,"children":1250},{"class":118,"line":198},[1251,1256,1260,1265],{"type":43,"tag":116,"props":1252,"children":1253},{"style":604},[1254],{"type":48,"value":1255},"  timeoutMs",{"type":43,"tag":116,"props":1257,"children":1258},{"style":134},[1259],{"type":48,"value":612},{"type":43,"tag":116,"props":1261,"children":1262},{"style":1157},[1263],{"type":48,"value":1264}," 600_000",{"type":43,"tag":116,"props":1266,"children":1267},{"style":134},[1268],{"type":48,"value":1269},",\n",{"type":43,"tag":116,"props":1271,"children":1272},{"class":118,"line":651},[1273,1278,1282,1287,1293],{"type":43,"tag":116,"props":1274,"children":1275},{"style":481},[1276],{"type":48,"value":1277},"  start",{"type":43,"tag":116,"props":1279,"children":1280},{"style":134},[1281],{"type":48,"value":612},{"type":43,"tag":116,"props":1283,"children":1284},{"style":134},[1285],{"type":48,"value":1286}," ()",{"type":43,"tag":116,"props":1288,"children":1290},{"style":1289},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1291],{"type":48,"value":1292}," =>",{"type":43,"tag":116,"props":1294,"children":1295},{"style":487},[1296],{"type":48,"value":1297}," page\n",{"type":43,"tag":116,"props":1299,"children":1300},{"class":118,"line":725},[1301,1306,1310,1314,1318,1323,1327,1331,1335,1339,1343,1348,1353,1358,1363,1367,1372,1376,1381,1385],{"type":43,"tag":116,"props":1302,"children":1303},{"style":134},[1304],{"type":48,"value":1305},"    .",{"type":43,"tag":116,"props":1307,"children":1308},{"style":481},[1309],{"type":48,"value":574},{"type":43,"tag":116,"props":1311,"children":1312},{"style":487},[1313],{"type":48,"value":520},{"type":43,"tag":116,"props":1315,"children":1316},{"style":134},[1317],{"type":48,"value":525},{"type":43,"tag":116,"props":1319,"children":1320},{"style":128},[1321],{"type":48,"value":1322},"button",{"type":43,"tag":116,"props":1324,"children":1325},{"style":134},[1326],{"type":48,"value":525},{"type":43,"tag":116,"props":1328,"children":1329},{"style":134},[1330],{"type":48,"value":596},{"type":43,"tag":116,"props":1332,"children":1333},{"style":134},[1334],{"type":48,"value":601},{"type":43,"tag":116,"props":1336,"children":1337},{"style":604},[1338],{"type":48,"value":607},{"type":43,"tag":116,"props":1340,"children":1341},{"style":134},[1342],{"type":48,"value":612},{"type":43,"tag":116,"props":1344,"children":1345},{"style":134},[1346],{"type":48,"value":1347}," \u002F",{"type":43,"tag":116,"props":1349,"children":1350},{"style":128},[1351],{"type":48,"value":1352},"passkey",{"type":43,"tag":116,"props":1354,"children":1355},{"style":134},[1356],{"type":48,"value":1357},"|",{"type":43,"tag":116,"props":1359,"children":1360},{"style":128},[1361],{"type":48,"value":1362},"security key",{"type":43,"tag":116,"props":1364,"children":1365},{"style":134},[1366],{"type":48,"value":1357},{"type":43,"tag":116,"props":1368,"children":1369},{"style":128},[1370],{"type":48,"value":1371},"sign in",{"type":43,"tag":116,"props":1373,"children":1374},{"style":134},[1375],{"type":48,"value":938},{"type":43,"tag":116,"props":1377,"children":1378},{"style":1157},[1379],{"type":48,"value":1380},"i",{"type":43,"tag":116,"props":1382,"children":1383},{"style":134},[1384],{"type":48,"value":631},{"type":43,"tag":116,"props":1386,"children":1387},{"style":487},[1388],{"type":48,"value":786},{"type":43,"tag":116,"props":1390,"children":1391},{"class":118,"line":789},[1392,1396,1400,1404,1409,1414,1418,1422,1426,1430],{"type":43,"tag":116,"props":1393,"children":1394},{"style":134},[1395],{"type":48,"value":1305},{"type":43,"tag":116,"props":1397,"children":1398},{"style":481},[1399],{"type":48,"value":549},{"type":43,"tag":116,"props":1401,"children":1402},{"style":487},[1403],{"type":48,"value":520},{"type":43,"tag":116,"props":1405,"children":1406},{"style":134},[1407],{"type":48,"value":1408},"{",{"type":43,"tag":116,"props":1410,"children":1411},{"style":604},[1412],{"type":48,"value":1413}," timeout",{"type":43,"tag":116,"props":1415,"children":1416},{"style":134},[1417],{"type":48,"value":612},{"type":43,"tag":116,"props":1419,"children":1420},{"style":1157},[1421],{"type":48,"value":1264},{"type":43,"tag":116,"props":1423,"children":1424},{"style":134},[1425],{"type":48,"value":631},{"type":43,"tag":116,"props":1427,"children":1428},{"style":487},[1429],{"type":48,"value":539},{"type":43,"tag":116,"props":1431,"children":1432},{"style":134},[1433],{"type":48,"value":1269},{"type":43,"tag":116,"props":1435,"children":1436},{"class":118,"line":798},[1437,1442],{"type":43,"tag":116,"props":1438,"children":1439},{"style":134},[1440],{"type":48,"value":1441},"}",{"type":43,"tag":116,"props":1443,"children":1444},{"style":487},[1445],{"type":48,"value":786},{"type":43,"tag":116,"props":1447,"children":1449},{"class":118,"line":1448},7,[1450],{"type":43,"tag":116,"props":1451,"children":1453},{"emptyLinePlaceholder":1452},true,[1454],{"type":48,"value":1455},"\n",{"type":43,"tag":116,"props":1457,"children":1459},{"class":118,"line":1458},8,[1460,1464,1468,1472,1477,1481,1485,1490,1494,1498,1503,1507,1511,1516,1520,1525,1529,1533,1538,1542],{"type":43,"tag":116,"props":1461,"children":1462},{"style":470},[1463],{"type":48,"value":510},{"type":43,"tag":116,"props":1465,"children":1466},{"style":487},[1467],{"type":48,"value":565},{"type":43,"tag":116,"props":1469,"children":1470},{"style":134},[1471],{"type":48,"value":544},{"type":43,"tag":116,"props":1473,"children":1474},{"style":481},[1475],{"type":48,"value":1476},"waitForURL",{"type":43,"tag":116,"props":1478,"children":1479},{"style":487},[1480],{"type":48,"value":520},{"type":43,"tag":116,"props":1482,"children":1483},{"style":134},[1484],{"type":48,"value":520},{"type":43,"tag":116,"props":1486,"children":1488},{"style":1487},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[1489],{"type":48,"value":681},{"type":43,"tag":116,"props":1491,"children":1492},{"style":134},[1493],{"type":48,"value":539},{"type":43,"tag":116,"props":1495,"children":1496},{"style":1289},[1497],{"type":48,"value":1292},{"type":43,"tag":116,"props":1499,"children":1500},{"style":134},[1501],{"type":48,"value":1502}," !",{"type":43,"tag":116,"props":1504,"children":1505},{"style":487},[1506],{"type":48,"value":681},{"type":43,"tag":116,"props":1508,"children":1509},{"style":134},[1510],{"type":48,"value":544},{"type":43,"tag":116,"props":1512,"children":1513},{"style":487},[1514],{"type":48,"value":1515},"pathname",{"type":43,"tag":116,"props":1517,"children":1518},{"style":134},[1519],{"type":48,"value":544},{"type":43,"tag":116,"props":1521,"children":1522},{"style":481},[1523],{"type":48,"value":1524},"startsWith",{"type":43,"tag":116,"props":1526,"children":1527},{"style":487},[1528],{"type":48,"value":520},{"type":43,"tag":116,"props":1530,"children":1531},{"style":134},[1532],{"type":48,"value":525},{"type":43,"tag":116,"props":1534,"children":1535},{"style":128},[1536],{"type":48,"value":1537},"\u002Flogin",{"type":43,"tag":116,"props":1539,"children":1540},{"style":134},[1541],{"type":48,"value":525},{"type":43,"tag":116,"props":1543,"children":1544},{"style":487},[1545],{"type":48,"value":1546},"))\n",{"type":43,"tag":116,"props":1548,"children":1549},{"class":118,"line":30},[1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1607,1611,1616,1620,1624,1628,1632,1636,1640],{"type":43,"tag":116,"props":1551,"children":1552},{"style":470},[1553],{"type":48,"value":510},{"type":43,"tag":116,"props":1555,"children":1556},{"style":487},[1557],{"type":48,"value":565},{"type":43,"tag":116,"props":1559,"children":1560},{"style":134},[1561],{"type":48,"value":544},{"type":43,"tag":116,"props":1563,"children":1564},{"style":481},[1565],{"type":48,"value":574},{"type":43,"tag":116,"props":1567,"children":1568},{"style":487},[1569],{"type":48,"value":520},{"type":43,"tag":116,"props":1571,"children":1572},{"style":134},[1573],{"type":48,"value":525},{"type":43,"tag":116,"props":1575,"children":1576},{"style":128},[1577],{"type":48,"value":587},{"type":43,"tag":116,"props":1579,"children":1580},{"style":134},[1581],{"type":48,"value":525},{"type":43,"tag":116,"props":1583,"children":1584},{"style":134},[1585],{"type":48,"value":596},{"type":43,"tag":116,"props":1587,"children":1588},{"style":134},[1589],{"type":48,"value":601},{"type":43,"tag":116,"props":1591,"children":1592},{"style":604},[1593],{"type":48,"value":607},{"type":43,"tag":116,"props":1595,"children":1596},{"style":134},[1597],{"type":48,"value":612},{"type":43,"tag":116,"props":1599,"children":1600},{"style":134},[1601],{"type":48,"value":1347},{"type":43,"tag":116,"props":1603,"children":1604},{"style":128},[1605],{"type":48,"value":1606},"account",{"type":43,"tag":116,"props":1608,"children":1609},{"style":134},[1610],{"type":48,"value":1357},{"type":43,"tag":116,"props":1612,"children":1613},{"style":128},[1614],{"type":48,"value":1615},"dashboard",{"type":43,"tag":116,"props":1617,"children":1618},{"style":134},[1619],{"type":48,"value":938},{"type":43,"tag":116,"props":1621,"children":1622},{"style":1157},[1623],{"type":48,"value":1380},{"type":43,"tag":116,"props":1625,"children":1626},{"style":134},[1627],{"type":48,"value":631},{"type":43,"tag":116,"props":1629,"children":1630},{"style":487},[1631],{"type":48,"value":539},{"type":43,"tag":116,"props":1633,"children":1634},{"style":134},[1635],{"type":48,"value":544},{"type":43,"tag":116,"props":1637,"children":1638},{"style":481},[1639],{"type":48,"value":644},{"type":43,"tag":116,"props":1641,"children":1642},{"style":487},[1643],{"type":48,"value":490},{"type":43,"tag":116,"props":1645,"children":1647},{"class":118,"line":1646},10,[1648,1652,1656,1661,1665,1669,1673,1677,1681,1685,1690,1694,1698,1702,1706,1711,1715],{"type":43,"tag":116,"props":1649,"children":1650},{"style":470},[1651],{"type":48,"value":473},{"type":43,"tag":116,"props":1653,"children":1654},{"style":134},[1655],{"type":48,"value":601},{"type":43,"tag":116,"props":1657,"children":1658},{"style":604},[1659],{"type":48,"value":1660}," authenticatedUrl",{"type":43,"tag":116,"props":1662,"children":1663},{"style":134},[1664],{"type":48,"value":612},{"type":43,"tag":116,"props":1666,"children":1667},{"style":487},[1668],{"type":48,"value":565},{"type":43,"tag":116,"props":1670,"children":1671},{"style":134},[1672],{"type":48,"value":544},{"type":43,"tag":116,"props":1674,"children":1675},{"style":481},[1676],{"type":48,"value":681},{"type":43,"tag":116,"props":1678,"children":1679},{"style":487},[1680],{"type":48,"value":686},{"type":43,"tag":116,"props":1682,"children":1683},{"style":134},[1684],{"type":48,"value":596},{"type":43,"tag":116,"props":1686,"children":1687},{"style":604},[1688],{"type":48,"value":1689}," title",{"type":43,"tag":116,"props":1691,"children":1692},{"style":134},[1693],{"type":48,"value":612},{"type":43,"tag":116,"props":1695,"children":1696},{"style":470},[1697],{"type":48,"value":478},{"type":43,"tag":116,"props":1699,"children":1700},{"style":487},[1701],{"type":48,"value":565},{"type":43,"tag":116,"props":1703,"children":1704},{"style":134},[1705],{"type":48,"value":544},{"type":43,"tag":116,"props":1707,"children":1708},{"style":481},[1709],{"type":48,"value":1710},"title",{"type":43,"tag":116,"props":1712,"children":1713},{"style":487},[1714],{"type":48,"value":908},{"type":43,"tag":116,"props":1716,"children":1717},{"style":134},[1718],{"type":48,"value":795},{"type":43,"tag":51,"props":1720,"children":1721},{},[1722,1724,1729,1731,1737,1739,1744],{"type":48,"value":1723},"Tell the user what action is waiting. Human acknowledgment is not verification:\nalways assert the expected URL or stable element after ",{"type":43,"tag":96,"props":1725,"children":1727},{"className":1726},[],[1728],{"type":48,"value":1187},{"type":48,"value":1730},". If the action\nwas already completed and only the human step remains, call ",{"type":43,"tag":96,"props":1732,"children":1734},{"className":1733},[],[1735],{"type":48,"value":1736},"handoff(message)",{"type":48,"value":1738},"\nwithout ",{"type":43,"tag":96,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":48,"value":1200},{"type":48,"value":1745},". The default timeout is ten minutes.",{"type":43,"tag":51,"props":1747,"children":1748},{},[1749],{"type":48,"value":1750},"Completion: the prompt was presented only after WAIT was registered, the action\nsettled, and the authenticated result was independently verified.",{"type":43,"tag":77,"props":1752,"children":1754},{"id":1753},"inspection-tools",[1755],{"type":48,"value":1756},"Inspection Tools",{"type":43,"tag":51,"props":1758,"children":1759},{},[1760],{"type":48,"value":1761},"Use the least expensive view that answers the question:",{"type":43,"tag":1763,"props":1764,"children":1765},"ul",{},[1766,1778,1789,1800,1811],{"type":43,"tag":1767,"props":1768,"children":1769},"li",{},[1770,1776],{"type":43,"tag":96,"props":1771,"children":1773},{"className":1772},[],[1774],{"type":48,"value":1775},"snapshot()",{"type":48,"value":1777}," is the compact read-before-act default. It prioritizes semantic\ngroups, alerts, lists, tables, headings, links, and controls. Text input and\ntextarea values are omitted.",{"type":43,"tag":1767,"props":1779,"children":1780},{},[1781,1787],{"type":43,"tag":96,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":48,"value":1786},"ref(\"e12\")",{"type":48,"value":1788}," resolves a control from the latest snapshot. Refs fail closed\nafter navigation or incompatible DOM drift.",{"type":43,"tag":1767,"props":1790,"children":1791},{},[1792,1798],{"type":43,"tag":96,"props":1793,"children":1795},{"className":1794},[],[1796],{"type":48,"value":1797},"snapshot({ diff: true })",{"type":48,"value":1799}," reports semantic changes from the compatible prior\nbaseline. A diff invalidates earlier refs and exposes refs only for added or\nchanged current lines.",{"type":43,"tag":1767,"props":1801,"children":1802},{},[1803,1809],{"type":43,"tag":96,"props":1804,"children":1806},{"className":1805},[],[1807],{"type":48,"value":1808},"ariaSnapshot(target?, { timeout })",{"type":48,"value":1810}," returns Playwright's detailed YAML aria\ntree when the compact snapshot omits needed structure.",{"type":43,"tag":1767,"props":1812,"children":1813},{},[1814,1820],{"type":43,"tag":96,"props":1815,"children":1817},{"className":1816},[],[1818],{"type":48,"value":1819},"screenshotWithLabels({ page, path? })",{"type":48,"value":1821}," adds visual labels and metadata when\nlayout matters.",{"type":43,"tag":105,"props":1823,"children":1825},{"className":458,"code":1824,"language":460,"meta":110,"style":110},"return await snapshot({ within: \"main\", maxItems: 200 })\n\u002F\u002F When layout matters, return the image through MCP so it can be inspected.\nreturn await screenshotWithLabels({ page })\n",[1826],{"type":43,"tag":96,"props":1827,"children":1828},{"__ignoreMap":110},[1829,1900,1909],{"type":43,"tag":116,"props":1830,"children":1831},{"class":118,"line":119},[1832,1836,1840,1844,1848,1852,1857,1861,1865,1870,1874,1878,1883,1887,1892,1896],{"type":43,"tag":116,"props":1833,"children":1834},{"style":470},[1835],{"type":48,"value":473},{"type":43,"tag":116,"props":1837,"children":1838},{"style":470},[1839],{"type":48,"value":478},{"type":43,"tag":116,"props":1841,"children":1842},{"style":481},[1843],{"type":48,"value":484},{"type":43,"tag":116,"props":1845,"children":1846},{"style":487},[1847],{"type":48,"value":520},{"type":43,"tag":116,"props":1849,"children":1850},{"style":134},[1851],{"type":48,"value":1408},{"type":43,"tag":116,"props":1853,"children":1854},{"style":604},[1855],{"type":48,"value":1856}," within",{"type":43,"tag":116,"props":1858,"children":1859},{"style":134},[1860],{"type":48,"value":612},{"type":43,"tag":116,"props":1862,"children":1863},{"style":134},[1864],{"type":48,"value":617},{"type":43,"tag":116,"props":1866,"children":1867},{"style":128},[1868],{"type":48,"value":1869},"main",{"type":43,"tag":116,"props":1871,"children":1872},{"style":134},[1873],{"type":48,"value":525},{"type":43,"tag":116,"props":1875,"children":1876},{"style":134},[1877],{"type":48,"value":596},{"type":43,"tag":116,"props":1879,"children":1880},{"style":604},[1881],{"type":48,"value":1882}," maxItems",{"type":43,"tag":116,"props":1884,"children":1885},{"style":134},[1886],{"type":48,"value":612},{"type":43,"tag":116,"props":1888,"children":1889},{"style":1157},[1890],{"type":48,"value":1891}," 200",{"type":43,"tag":116,"props":1893,"children":1894},{"style":134},[1895],{"type":48,"value":631},{"type":43,"tag":116,"props":1897,"children":1898},{"style":487},[1899],{"type":48,"value":786},{"type":43,"tag":116,"props":1901,"children":1902},{"class":118,"line":198},[1903],{"type":43,"tag":116,"props":1904,"children":1906},{"style":1905},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1907],{"type":48,"value":1908},"\u002F\u002F When layout matters, return the image through MCP so it can be inspected.\n",{"type":43,"tag":116,"props":1910,"children":1911},{"class":118,"line":651},[1912,1916,1920,1925,1929,1933,1938,1942],{"type":43,"tag":116,"props":1913,"children":1914},{"style":470},[1915],{"type":48,"value":473},{"type":43,"tag":116,"props":1917,"children":1918},{"style":470},[1919],{"type":48,"value":478},{"type":43,"tag":116,"props":1921,"children":1922},{"style":481},[1923],{"type":48,"value":1924}," screenshotWithLabels",{"type":43,"tag":116,"props":1926,"children":1927},{"style":487},[1928],{"type":48,"value":520},{"type":43,"tag":116,"props":1930,"children":1931},{"style":134},[1932],{"type":48,"value":1408},{"type":43,"tag":116,"props":1934,"children":1935},{"style":487},[1936],{"type":48,"value":1937}," page ",{"type":43,"tag":116,"props":1939,"children":1940},{"style":134},[1941],{"type":48,"value":1441},{"type":43,"tag":116,"props":1943,"children":1944},{"style":487},[1945],{"type":48,"value":786},{"type":43,"tag":51,"props":1947,"children":1948},{},[1949,1951,1957],{"type":48,"value":1950},"Saving an image and returning only ",{"type":43,"tag":96,"props":1952,"children":1954},{"className":1953},[],[1955],{"type":48,"value":1956},"\"ok\"",{"type":48,"value":1958}," proves file creation, not visual\ncorrectness. Return screenshot buffers through MCP when visual evidence matters.",{"type":43,"tag":77,"props":1960,"children":1962},{"id":1961},"execute-interface",[1963],{"type":48,"value":1964},"Execute Interface",{"type":43,"tag":51,"props":1966,"children":1967},{},[1968,1970,1975,1977,1983,1984,1990,1992,1997,1999,2005,2007,2013,2014,2020,2022,2027,2029,2035],{"type":48,"value":1969},"Execute code can use ",{"type":43,"tag":96,"props":1971,"children":1973},{"className":1972},[],[1974],{"type":48,"value":672},{"type":48,"value":1976},", ",{"type":43,"tag":96,"props":1978,"children":1980},{"className":1979},[],[1981],{"type":48,"value":1982},"context",{"type":48,"value":1976},{"type":43,"tag":96,"props":1985,"children":1987},{"className":1986},[],[1988],{"type":48,"value":1989},"browser",{"type":48,"value":1991},", persistent ",{"type":43,"tag":96,"props":1993,"children":1995},{"className":1994},[],[1996],{"type":48,"value":1043},{"type":48,"value":1998},", selected\nNode modules through ",{"type":43,"tag":96,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":48,"value":2004},"modules",{"type":48,"value":2006}," and aliases such as ",{"type":43,"tag":96,"props":2008,"children":2010},{"className":2009},[],[2011],{"type":48,"value":2012},"fs",{"type":48,"value":168},{"type":43,"tag":96,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":48,"value":2019},"path",{"type":48,"value":2021},", plus the\nBrowser Control helpers documented here. Single expressions auto-return;\nmulti-statement scripts need ",{"type":43,"tag":96,"props":2023,"children":2025},{"className":2024},[],[2026],{"type":48,"value":473},{"type":48,"value":2028},". Use ",{"type":43,"tag":96,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":48,"value":2034},"--file",{"type":48,"value":2036}," for longer scripts:",{"type":43,"tag":105,"props":2038,"children":2040},{"className":107,"code":2039,"language":109,"meta":110,"style":110},"browser-control execute --session github --file .\u002Fperform-flow.js\n",[2041],{"type":43,"tag":96,"props":2042,"children":2043},{"__ignoreMap":110},[2044],{"type":43,"tag":116,"props":2045,"children":2046},{"class":118,"line":119},[2047,2051,2055,2059,2063,2068],{"type":43,"tag":116,"props":2048,"children":2049},{"style":123},[2050],{"type":48,"value":4},{"type":43,"tag":116,"props":2052,"children":2053},{"style":128},[2054],{"type":48,"value":131},{"type":43,"tag":116,"props":2056,"children":2057},{"style":128},[2058],{"type":48,"value":299},{"type":43,"tag":116,"props":2060,"children":2061},{"style":128},[2062],{"type":48,"value":1149},{"type":43,"tag":116,"props":2064,"children":2065},{"style":128},[2066],{"type":48,"value":2067}," --file",{"type":43,"tag":116,"props":2069,"children":2070},{"style":128},[2071],{"type":48,"value":2072}," .\u002Fperform-flow.js\n",{"type":43,"tag":51,"props":2074,"children":2075},{},[2076,2078,2084,2086,2092,2093,2099,2100,2106,2107,2113,2115,2121],{"type":48,"value":2077},"Human CLI output includes logs, warnings, and a concise aftermath. Use ",{"type":43,"tag":96,"props":2079,"children":2081},{"className":2080},[],[2082],{"type":48,"value":2083},"--json",{"type":48,"value":2085},"\nwhen another command needs to branch on ",{"type":43,"tag":96,"props":2087,"children":2089},{"className":2088},[],[2090],{"type":48,"value":2091},"ok",{"type":48,"value":1976},{"type":43,"tag":96,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":48,"value":2098},"value",{"type":48,"value":1976},{"type":43,"tag":96,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":48,"value":2105},"error",{"type":48,"value":1976},{"type":43,"tag":96,"props":2108,"children":2110},{"className":2109},[],[2111],{"type":48,"value":2112},"warnings",{"type":48,"value":2114},", or\n",{"type":43,"tag":96,"props":2116,"children":2118},{"className":2117},[],[2119],{"type":48,"value":2120},"aftermath",{"type":48,"value":612},{"type":43,"tag":105,"props":2123,"children":2125},{"className":107,"code":2124,"language":109,"meta":110,"style":110},"browser-control execute --json --session github '({ url: page.url() })' | jq .value.url\n",[2126],{"type":43,"tag":96,"props":2127,"children":2128},{"__ignoreMap":110},[2129],{"type":43,"tag":116,"props":2130,"children":2131},{"class":118,"line":119},[2132,2136,2140,2145,2149,2153,2157,2162,2167,2172,2177],{"type":43,"tag":116,"props":2133,"children":2134},{"style":123},[2135],{"type":48,"value":4},{"type":43,"tag":116,"props":2137,"children":2138},{"style":128},[2139],{"type":48,"value":131},{"type":43,"tag":116,"props":2141,"children":2142},{"style":128},[2143],{"type":48,"value":2144}," --json",{"type":43,"tag":116,"props":2146,"children":2147},{"style":128},[2148],{"type":48,"value":299},{"type":43,"tag":116,"props":2150,"children":2151},{"style":128},[2152],{"type":48,"value":1149},{"type":43,"tag":116,"props":2154,"children":2155},{"style":134},[2156],{"type":48,"value":137},{"type":43,"tag":116,"props":2158,"children":2159},{"style":128},[2160],{"type":48,"value":2161},"({ url: page.url() })",{"type":43,"tag":116,"props":2163,"children":2164},{"style":134},[2165],{"type":48,"value":2166},"'",{"type":43,"tag":116,"props":2168,"children":2169},{"style":134},[2170],{"type":48,"value":2171}," |",{"type":43,"tag":116,"props":2173,"children":2174},{"style":123},[2175],{"type":48,"value":2176}," jq",{"type":43,"tag":116,"props":2178,"children":2179},{"style":128},[2180],{"type":48,"value":2181}," .value.url\n",{"type":43,"tag":51,"props":2183,"children":2184},{},[2185,2187,2193,2195,2200,2202,2208],{"type":48,"value":2186},"Playwright downloads are unavailable through extension-backed tabs because\nChromium blocks download artifact control through ",{"type":43,"tag":96,"props":2188,"children":2190},{"className":2189},[],[2191],{"type":48,"value":2192},"chrome.debugger",{"type":48,"value":2194},". If the\npage exposes the payload through fetch or an API response, read the bytes in the\npage and write them with ",{"type":43,"tag":96,"props":2196,"children":2198},{"className":2197},[],[2199],{"type":48,"value":2012},{"type":48,"value":2201},". Do not retry ",{"type":43,"tag":96,"props":2203,"children":2205},{"className":2204},[],[2206],{"type":48,"value":2207},"page.waitForEvent(\"download\")",{"type":48,"value":544},{"type":43,"tag":77,"props":2210,"children":2212},{"id":2211},"safety",[2213],{"type":48,"value":2214},"Safety",{"type":43,"tag":51,"props":2216,"children":2217},{},[2218],{"type":48,"value":2219},"Browser Control blocks CDP commands that would destroy shared browser state,\nincluding browser close and cookie\u002Fcache clearing. Never work around those\nguardrails.",{"type":43,"tag":51,"props":2221,"children":2222},{},[2223],{"type":48,"value":2224},"For inspect-only work, use a read-only session:",{"type":43,"tag":105,"props":2226,"children":2228},{"className":107,"code":2227,"language":109,"meta":110,"style":110},"browser-control session new inspect-prod --read-only\nbrowser-control execute --session inspect-prod 'await page.goto(\"https:\u002F\u002Fexample.com\"); return page.title()'\n",[2229],{"type":43,"tag":96,"props":2230,"children":2231},{"__ignoreMap":110},[2232,2257],{"type":43,"tag":116,"props":2233,"children":2234},{"class":118,"line":119},[2235,2239,2243,2247,2252],{"type":43,"tag":116,"props":2236,"children":2237},{"style":123},[2238],{"type":48,"value":4},{"type":43,"tag":116,"props":2240,"children":2241},{"style":128},[2242],{"type":48,"value":394},{"type":43,"tag":116,"props":2244,"children":2245},{"style":128},[2246],{"type":48,"value":736},{"type":43,"tag":116,"props":2248,"children":2249},{"style":128},[2250],{"type":48,"value":2251}," inspect-prod",{"type":43,"tag":116,"props":2253,"children":2254},{"style":128},[2255],{"type":48,"value":2256}," --read-only\n",{"type":43,"tag":116,"props":2258,"children":2259},{"class":118,"line":198},[2260,2264,2268,2272,2276,2280,2285],{"type":43,"tag":116,"props":2261,"children":2262},{"style":123},[2263],{"type":48,"value":4},{"type":43,"tag":116,"props":2265,"children":2266},{"style":128},[2267],{"type":48,"value":131},{"type":43,"tag":116,"props":2269,"children":2270},{"style":128},[2271],{"type":48,"value":299},{"type":43,"tag":116,"props":2273,"children":2274},{"style":128},[2275],{"type":48,"value":2251},{"type":43,"tag":116,"props":2277,"children":2278},{"style":134},[2279],{"type":48,"value":137},{"type":43,"tag":116,"props":2281,"children":2282},{"style":128},[2283],{"type":48,"value":2284},"await page.goto(\"https:\u002F\u002Fexample.com\"); return page.title()",{"type":43,"tag":116,"props":2286,"children":2287},{"style":134},[2288],{"type":48,"value":147},{"type":43,"tag":51,"props":2290,"children":2291},{},[2292,2294,2300,2302,2308],{"type":48,"value":2293},"Read-only sessions reject ",{"type":43,"tag":96,"props":2295,"children":2297},{"className":2296},[],[2298],{"type":48,"value":2299},"Input.*",{"type":48,"value":2301},", so they cannot click or type through\nPlaywright. ",{"type":43,"tag":96,"props":2303,"children":2305},{"className":2304},[],[2306],{"type":48,"value":2307},"page.evaluate",{"type":48,"value":2309}," can still mutate the DOM; read-only prevents trusted\nmistakes, not malicious code.",{"type":43,"tag":51,"props":2311,"children":2312},{},[2313,2315,2320],{"type":48,"value":2314},"For destructive UI work, use a two-phase ",{"type":43,"tag":57,"props":2316,"children":2317},{},[2318],{"type":48,"value":2319},"read, confirm, verify",{"type":48,"value":2321}," flow:",{"type":43,"tag":2323,"props":2324,"children":2325},"ol",{},[2326,2331,2336,2341,2346],{"type":43,"tag":1767,"props":2327,"children":2328},{},[2329],{"type":48,"value":2330},"Read candidates and return exact stable identifiers or row text.",{"type":43,"tag":1767,"props":2332,"children":2333},{},[2334],{"type":48,"value":2335},"Obtain user approval for those exact items.",{"type":43,"tag":1767,"props":2337,"children":2338},{},[2339],{"type":48,"value":2340},"Re-select only approved items and assert the selected count.",{"type":43,"tag":1767,"props":2342,"children":2343},{},[2344],{"type":48,"value":2345},"Read the confirmation dialog and throw unless it matches the approved action.",{"type":43,"tag":1767,"props":2347,"children":2348},{},[2349],{"type":48,"value":2350},"Confirm, then verify through a fresh page read or independent CLI\u002FAPI path.",{"type":43,"tag":51,"props":2352,"children":2353},{},[2354],{"type":48,"value":2355},"Do not discover and confirm destructive candidates in one script unless the\nuser already approved exact stable identifiers. Never globally auto-accept\nnative dialogs; wait for the expected dialog and assert its type and message\nbefore accepting it.",{"type":43,"tag":77,"props":2357,"children":2359},{"id":2358},"typescript-client",[2360],{"type":48,"value":2361},"TypeScript Client",{"type":43,"tag":51,"props":2363,"children":2364},{},[2365,2367,2373,2375,2381,2383,2389],{"type":48,"value":2366},"Applications can import ",{"type":43,"tag":96,"props":2368,"children":2370},{"className":2369},[],[2371],{"type":48,"value":2372},"BrowserControlClient",{"type":48,"value":2374}," for schema-decoded,\nsame-origin requests authenticated by a session page. Use ",{"type":43,"tag":96,"props":2376,"children":2378},{"className":2377},[],[2379],{"type":48,"value":2380},"sensitive: true",{"type":48,"value":2382},"\nfor token-bearing responses and reveal them through Browser Control's API, not\nthe application's own Effect ",{"type":43,"tag":96,"props":2384,"children":2386},{"className":2385},[],[2387],{"type":48,"value":2388},"Redacted",{"type":48,"value":2390}," import; package-manager layouts may\nresolve separate Effect runtimes.",{"type":43,"tag":105,"props":2392,"children":2396},{"className":2393,"code":2394,"language":2395,"meta":110,"style":110},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { BrowserControlClient } from \"@opencode-ai\u002Fbrowser-control\"\n\nconst sensitive = yield* origin.json({\n  path: \"\u002Fapi\u002Fsession\",\n  method: \"POST\",\n  body: {},\n  response: SessionResponse,\n  sensitive: true,\n})\nconst session = BrowserControlClient.reveal(sensitive)\n","ts",[2397],{"type":43,"tag":96,"props":2398,"children":2399},{"__ignoreMap":110},[2400,2440,2447,2497,2526,2555,2572,2593,2615,2626],{"type":43,"tag":116,"props":2401,"children":2402},{"class":118,"line":119},[2403,2408,2412,2417,2421,2426,2430,2435],{"type":43,"tag":116,"props":2404,"children":2405},{"style":470},[2406],{"type":48,"value":2407},"import",{"type":43,"tag":116,"props":2409,"children":2410},{"style":134},[2411],{"type":48,"value":601},{"type":43,"tag":116,"props":2413,"children":2414},{"style":487},[2415],{"type":48,"value":2416}," BrowserControlClient",{"type":43,"tag":116,"props":2418,"children":2419},{"style":134},[2420],{"type":48,"value":631},{"type":43,"tag":116,"props":2422,"children":2423},{"style":470},[2424],{"type":48,"value":2425}," from",{"type":43,"tag":116,"props":2427,"children":2428},{"style":134},[2429],{"type":48,"value":617},{"type":43,"tag":116,"props":2431,"children":2432},{"style":128},[2433],{"type":48,"value":2434},"@opencode-ai\u002Fbrowser-control",{"type":43,"tag":116,"props":2436,"children":2437},{"style":134},[2438],{"type":48,"value":2439},"\"\n",{"type":43,"tag":116,"props":2441,"children":2442},{"class":118,"line":198},[2443],{"type":43,"tag":116,"props":2444,"children":2445},{"emptyLinePlaceholder":1452},[2446],{"type":48,"value":1455},{"type":43,"tag":116,"props":2448,"children":2449},{"class":118,"line":651},[2450,2455,2460,2465,2470,2475,2480,2484,2489,2493],{"type":43,"tag":116,"props":2451,"children":2452},{"style":1289},[2453],{"type":48,"value":2454},"const",{"type":43,"tag":116,"props":2456,"children":2457},{"style":487},[2458],{"type":48,"value":2459}," sensitive ",{"type":43,"tag":116,"props":2461,"children":2462},{"style":134},[2463],{"type":48,"value":2464},"=",{"type":43,"tag":116,"props":2466,"children":2467},{"style":470},[2468],{"type":48,"value":2469}," yield",{"type":43,"tag":116,"props":2471,"children":2472},{"style":134},[2473],{"type":48,"value":2474},"*",{"type":43,"tag":116,"props":2476,"children":2477},{"style":487},[2478],{"type":48,"value":2479}," origin",{"type":43,"tag":116,"props":2481,"children":2482},{"style":134},[2483],{"type":48,"value":544},{"type":43,"tag":116,"props":2485,"children":2486},{"style":481},[2487],{"type":48,"value":2488},"json",{"type":43,"tag":116,"props":2490,"children":2491},{"style":487},[2492],{"type":48,"value":520},{"type":43,"tag":116,"props":2494,"children":2495},{"style":134},[2496],{"type":48,"value":722},{"type":43,"tag":116,"props":2498,"children":2499},{"class":118,"line":725},[2500,2505,2509,2513,2518,2522],{"type":43,"tag":116,"props":2501,"children":2502},{"style":604},[2503],{"type":48,"value":2504},"  path",{"type":43,"tag":116,"props":2506,"children":2507},{"style":134},[2508],{"type":48,"value":612},{"type":43,"tag":116,"props":2510,"children":2511},{"style":134},[2512],{"type":48,"value":617},{"type":43,"tag":116,"props":2514,"children":2515},{"style":128},[2516],{"type":48,"value":2517},"\u002Fapi\u002Fsession",{"type":43,"tag":116,"props":2519,"children":2520},{"style":134},[2521],{"type":48,"value":525},{"type":43,"tag":116,"props":2523,"children":2524},{"style":134},[2525],{"type":48,"value":1269},{"type":43,"tag":116,"props":2527,"children":2528},{"class":118,"line":789},[2529,2534,2538,2542,2547,2551],{"type":43,"tag":116,"props":2530,"children":2531},{"style":604},[2532],{"type":48,"value":2533},"  method",{"type":43,"tag":116,"props":2535,"children":2536},{"style":134},[2537],{"type":48,"value":612},{"type":43,"tag":116,"props":2539,"children":2540},{"style":134},[2541],{"type":48,"value":617},{"type":43,"tag":116,"props":2543,"children":2544},{"style":128},[2545],{"type":48,"value":2546},"POST",{"type":43,"tag":116,"props":2548,"children":2549},{"style":134},[2550],{"type":48,"value":525},{"type":43,"tag":116,"props":2552,"children":2553},{"style":134},[2554],{"type":48,"value":1269},{"type":43,"tag":116,"props":2556,"children":2557},{"class":118,"line":798},[2558,2563,2567],{"type":43,"tag":116,"props":2559,"children":2560},{"style":604},[2561],{"type":48,"value":2562},"  body",{"type":43,"tag":116,"props":2564,"children":2565},{"style":134},[2566],{"type":48,"value":612},{"type":43,"tag":116,"props":2568,"children":2569},{"style":134},[2570],{"type":48,"value":2571}," {},\n",{"type":43,"tag":116,"props":2573,"children":2574},{"class":118,"line":1448},[2575,2580,2584,2589],{"type":43,"tag":116,"props":2576,"children":2577},{"style":604},[2578],{"type":48,"value":2579},"  response",{"type":43,"tag":116,"props":2581,"children":2582},{"style":134},[2583],{"type":48,"value":612},{"type":43,"tag":116,"props":2585,"children":2586},{"style":487},[2587],{"type":48,"value":2588}," SessionResponse",{"type":43,"tag":116,"props":2590,"children":2591},{"style":134},[2592],{"type":48,"value":1269},{"type":43,"tag":116,"props":2594,"children":2595},{"class":118,"line":1458},[2596,2601,2605,2611],{"type":43,"tag":116,"props":2597,"children":2598},{"style":604},[2599],{"type":48,"value":2600},"  sensitive",{"type":43,"tag":116,"props":2602,"children":2603},{"style":134},[2604],{"type":48,"value":612},{"type":43,"tag":116,"props":2606,"children":2608},{"style":2607},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[2609],{"type":48,"value":2610}," true",{"type":43,"tag":116,"props":2612,"children":2613},{"style":134},[2614],{"type":48,"value":1269},{"type":43,"tag":116,"props":2616,"children":2617},{"class":118,"line":30},[2618,2622],{"type":43,"tag":116,"props":2619,"children":2620},{"style":134},[2621],{"type":48,"value":1441},{"type":43,"tag":116,"props":2623,"children":2624},{"style":487},[2625],{"type":48,"value":786},{"type":43,"tag":116,"props":2627,"children":2628},{"class":118,"line":1646},[2629,2633,2638,2642,2646,2650,2655],{"type":43,"tag":116,"props":2630,"children":2631},{"style":1289},[2632],{"type":48,"value":2454},{"type":43,"tag":116,"props":2634,"children":2635},{"style":487},[2636],{"type":48,"value":2637}," session ",{"type":43,"tag":116,"props":2639,"children":2640},{"style":134},[2641],{"type":48,"value":2464},{"type":43,"tag":116,"props":2643,"children":2644},{"style":487},[2645],{"type":48,"value":2416},{"type":43,"tag":116,"props":2647,"children":2648},{"style":134},[2649],{"type":48,"value":544},{"type":43,"tag":116,"props":2651,"children":2652},{"style":481},[2653],{"type":48,"value":2654},"reveal",{"type":43,"tag":116,"props":2656,"children":2657},{"style":487},[2658],{"type":48,"value":2659},"(sensitive)\n",{"type":43,"tag":77,"props":2661,"children":2663},{"id":2662},"authenticated-network-capture",[2664],{"type":48,"value":2665},"Authenticated Network Capture",{"type":43,"tag":51,"props":2667,"children":2668},{},[2669],{"type":48,"value":2670},"Use network capture when the browser is needed to authenticate or discover a\nworkflow, but repeated direct HTTP calls would be faster and more reliable.\nCapture each flow at least twice with different inputs so constants and\nparameters can be distinguished.",{"type":43,"tag":105,"props":2672,"children":2674},{"className":107,"code":2673,"language":109,"meta":110,"style":110},"browser-control network start --session github --url \u002Fapi\u002F \\\n  --resource-type fetch --resource-type xhr\nbrowser-control execute --session github --file .\u002Fperform-flow.js\nbrowser-control network status --session github\nbrowser-control network stop --session github \\\n  --output .\u002Fgithub.har --secrets github\n",[2675],{"type":43,"tag":96,"props":2676,"children":2677},{"__ignoreMap":110},[2678,2718,2741,2768,2791,2819],{"type":43,"tag":116,"props":2679,"children":2680},{"class":118,"line":119},[2681,2685,2690,2695,2699,2703,2708,2713],{"type":43,"tag":116,"props":2682,"children":2683},{"style":123},[2684],{"type":48,"value":4},{"type":43,"tag":116,"props":2686,"children":2687},{"style":128},[2688],{"type":48,"value":2689}," network",{"type":43,"tag":116,"props":2691,"children":2692},{"style":128},[2693],{"type":48,"value":2694}," start",{"type":43,"tag":116,"props":2696,"children":2697},{"style":128},[2698],{"type":48,"value":299},{"type":43,"tag":116,"props":2700,"children":2701},{"style":128},[2702],{"type":48,"value":1149},{"type":43,"tag":116,"props":2704,"children":2705},{"style":128},[2706],{"type":48,"value":2707}," --url",{"type":43,"tag":116,"props":2709,"children":2710},{"style":128},[2711],{"type":48,"value":2712}," \u002Fapi\u002F",{"type":43,"tag":116,"props":2714,"children":2715},{"style":487},[2716],{"type":48,"value":2717}," \\\n",{"type":43,"tag":116,"props":2719,"children":2720},{"class":118,"line":198},[2721,2726,2731,2736],{"type":43,"tag":116,"props":2722,"children":2723},{"style":128},[2724],{"type":48,"value":2725},"  --resource-type",{"type":43,"tag":116,"props":2727,"children":2728},{"style":128},[2729],{"type":48,"value":2730}," fetch",{"type":43,"tag":116,"props":2732,"children":2733},{"style":128},[2734],{"type":48,"value":2735}," --resource-type",{"type":43,"tag":116,"props":2737,"children":2738},{"style":128},[2739],{"type":48,"value":2740}," xhr\n",{"type":43,"tag":116,"props":2742,"children":2743},{"class":118,"line":651},[2744,2748,2752,2756,2760,2764],{"type":43,"tag":116,"props":2745,"children":2746},{"style":123},[2747],{"type":48,"value":4},{"type":43,"tag":116,"props":2749,"children":2750},{"style":128},[2751],{"type":48,"value":131},{"type":43,"tag":116,"props":2753,"children":2754},{"style":128},[2755],{"type":48,"value":299},{"type":43,"tag":116,"props":2757,"children":2758},{"style":128},[2759],{"type":48,"value":1149},{"type":43,"tag":116,"props":2761,"children":2762},{"style":128},[2763],{"type":48,"value":2067},{"type":43,"tag":116,"props":2765,"children":2766},{"style":128},[2767],{"type":48,"value":2072},{"type":43,"tag":116,"props":2769,"children":2770},{"class":118,"line":725},[2771,2775,2779,2783,2787],{"type":43,"tag":116,"props":2772,"children":2773},{"style":123},[2774],{"type":48,"value":4},{"type":43,"tag":116,"props":2776,"children":2777},{"style":128},[2778],{"type":48,"value":2689},{"type":43,"tag":116,"props":2780,"children":2781},{"style":128},[2782],{"type":48,"value":208},{"type":43,"tag":116,"props":2784,"children":2785},{"style":128},[2786],{"type":48,"value":299},{"type":43,"tag":116,"props":2788,"children":2789},{"style":128},[2790],{"type":48,"value":416},{"type":43,"tag":116,"props":2792,"children":2793},{"class":118,"line":789},[2794,2798,2802,2807,2811,2815],{"type":43,"tag":116,"props":2795,"children":2796},{"style":123},[2797],{"type":48,"value":4},{"type":43,"tag":116,"props":2799,"children":2800},{"style":128},[2801],{"type":48,"value":2689},{"type":43,"tag":116,"props":2803,"children":2804},{"style":128},[2805],{"type":48,"value":2806}," stop",{"type":43,"tag":116,"props":2808,"children":2809},{"style":128},[2810],{"type":48,"value":299},{"type":43,"tag":116,"props":2812,"children":2813},{"style":128},[2814],{"type":48,"value":1149},{"type":43,"tag":116,"props":2816,"children":2817},{"style":487},[2818],{"type":48,"value":2717},{"type":43,"tag":116,"props":2820,"children":2821},{"class":118,"line":798},[2822,2827,2832,2837],{"type":43,"tag":116,"props":2823,"children":2824},{"style":128},[2825],{"type":48,"value":2826},"  --output",{"type":43,"tag":116,"props":2828,"children":2829},{"style":128},[2830],{"type":48,"value":2831}," .\u002Fgithub.har",{"type":43,"tag":116,"props":2833,"children":2834},{"style":128},[2835],{"type":48,"value":2836}," --secrets",{"type":43,"tag":116,"props":2838,"children":2839},{"style":128},[2840],{"type":48,"value":416},{"type":43,"tag":51,"props":2842,"children":2843},{},[2844,2846,2852,2854,2860,2862,2868],{"type":48,"value":2845},"Written artifacts replace credential-bearing headers, cookies, query fields,\nand structured body fields with stable references such as ",{"type":43,"tag":96,"props":2847,"children":2849},{"className":2848},[],[2850],{"type":48,"value":2851},"${BC_SECRET_1}",{"type":48,"value":2853},".\n",{"type":43,"tag":96,"props":2855,"children":2857},{"className":2856},[],[2858],{"type":48,"value":2859},"--secrets github",{"type":48,"value":2861}," stores lossless values separately in a mode-",{"type":43,"tag":96,"props":2863,"children":2865},{"className":2864},[],[2866],{"type":48,"value":2867},"0600",{"type":48,"value":2869}," Secret\nProfile. Never copy profile values into source, output, diagnostics, or journals,\nand never deliberately return or log credentials.",{"type":43,"tag":51,"props":2871,"children":2872},{},[2873],{"type":48,"value":2874},"Inspect the redacted artifact offline, generate one typed function per observed\nflow, then verify each function with a harmless live request. Run generated\nclients without exposing values:",{"type":43,"tag":105,"props":2876,"children":2878},{"className":107,"code":2877,"language":109,"meta":110,"style":110},"browser-control secrets status github\nbrowser-control secrets run github -- .\u002Fgithub-cli repositories\n",[2879],{"type":43,"tag":96,"props":2880,"children":2881},{"__ignoreMap":110},[2882,2902],{"type":43,"tag":116,"props":2883,"children":2884},{"class":118,"line":119},[2885,2889,2894,2898],{"type":43,"tag":116,"props":2886,"children":2887},{"style":123},[2888],{"type":48,"value":4},{"type":43,"tag":116,"props":2890,"children":2891},{"style":128},[2892],{"type":48,"value":2893}," secrets",{"type":43,"tag":116,"props":2895,"children":2896},{"style":128},[2897],{"type":48,"value":208},{"type":43,"tag":116,"props":2899,"children":2900},{"style":128},[2901],{"type":48,"value":416},{"type":43,"tag":116,"props":2903,"children":2904},{"class":118,"line":198},[2905,2909,2913,2918,2922,2927,2932],{"type":43,"tag":116,"props":2906,"children":2907},{"style":123},[2908],{"type":48,"value":4},{"type":43,"tag":116,"props":2910,"children":2911},{"style":128},[2912],{"type":48,"value":2893},{"type":43,"tag":116,"props":2914,"children":2915},{"style":128},[2916],{"type":48,"value":2917}," run",{"type":43,"tag":116,"props":2919,"children":2920},{"style":128},[2921],{"type":48,"value":1149},{"type":43,"tag":116,"props":2923,"children":2924},{"style":128},[2925],{"type":48,"value":2926}," --",{"type":43,"tag":116,"props":2928,"children":2929},{"style":128},[2930],{"type":48,"value":2931}," .\u002Fgithub-cli",{"type":43,"tag":116,"props":2933,"children":2934},{"style":128},[2935],{"type":48,"value":2936}," repositories\n",{"type":43,"tag":51,"props":2938,"children":2939},{},[2940],{"type":48,"value":2941},"Refresh credentials normally renewed by a page reload with:",{"type":43,"tag":105,"props":2943,"children":2945},{"className":107,"code":2944,"language":109,"meta":110,"style":110},"browser-control secrets refresh github --session github --url \u002Fapi\u002F\n",[2946],{"type":43,"tag":96,"props":2947,"children":2948},{"__ignoreMap":110},[2949],{"type":43,"tag":116,"props":2950,"children":2951},{"class":118,"line":119},[2952,2956,2960,2965,2969,2973,2977,2981],{"type":43,"tag":116,"props":2953,"children":2954},{"style":123},[2955],{"type":48,"value":4},{"type":43,"tag":116,"props":2957,"children":2958},{"style":128},[2959],{"type":48,"value":2893},{"type":43,"tag":116,"props":2961,"children":2962},{"style":128},[2963],{"type":48,"value":2964}," refresh",{"type":43,"tag":116,"props":2966,"children":2967},{"style":128},[2968],{"type":48,"value":1149},{"type":43,"tag":116,"props":2970,"children":2971},{"style":128},[2972],{"type":48,"value":299},{"type":43,"tag":116,"props":2974,"children":2975},{"style":128},[2976],{"type":48,"value":1149},{"type":43,"tag":116,"props":2978,"children":2979},{"style":128},[2980],{"type":48,"value":2707},{"type":43,"tag":116,"props":2982,"children":2983},{"style":128},[2984],{"type":48,"value":2985}," \u002Fapi\u002F\n",{"type":43,"tag":51,"props":2987,"children":2988},{},[2989,2991,2997,2999,3005],{"type":48,"value":2990},"If refresh requires login or a human prompt, reauthenticate in the adopted tab\nand repeat capture with the same profile. MCP exposes equivalent ",{"type":43,"tag":96,"props":2992,"children":2994},{"className":2993},[],[2995],{"type":48,"value":2996},"network_*",{"type":48,"value":2998},"\nand ",{"type":43,"tag":96,"props":3000,"children":3002},{"className":3001},[],[3003],{"type":48,"value":3004},"secrets_*",{"type":48,"value":3006}," tools.",{"type":43,"tag":51,"props":3008,"children":3009},{},[3010],{"type":48,"value":3011},"Completion: the artifact contains references rather than credential values, the\ngenerated operation passes a harmless live check, and no secret value appears\nin source or output.",{"type":43,"tag":77,"props":3013,"children":3015},{"id":3014},"recording",[3016],{"type":48,"value":3017},"Recording",{"type":43,"tag":51,"props":3019,"children":3020},{},[3021],{"type":48,"value":3022},"Record an attached or session-owned tab with:",{"type":43,"tag":105,"props":3024,"children":3026},{"className":107,"code":3025,"language":109,"meta":110,"style":110},"browser-control recording start .\u002Ftmp\u002Fdemo.mp4 --session github --mode cdp\nbrowser-control recording status --session github\nbrowser-control recording stop --session github\n",[3027],{"type":43,"tag":96,"props":3028,"children":3029},{"__ignoreMap":110},[3030,3069,3092],{"type":43,"tag":116,"props":3031,"children":3032},{"class":118,"line":119},[3033,3037,3042,3046,3051,3055,3059,3064],{"type":43,"tag":116,"props":3034,"children":3035},{"style":123},[3036],{"type":48,"value":4},{"type":43,"tag":116,"props":3038,"children":3039},{"style":128},[3040],{"type":48,"value":3041}," recording",{"type":43,"tag":116,"props":3043,"children":3044},{"style":128},[3045],{"type":48,"value":2694},{"type":43,"tag":116,"props":3047,"children":3048},{"style":128},[3049],{"type":48,"value":3050}," .\u002Ftmp\u002Fdemo.mp4",{"type":43,"tag":116,"props":3052,"children":3053},{"style":128},[3054],{"type":48,"value":299},{"type":43,"tag":116,"props":3056,"children":3057},{"style":128},[3058],{"type":48,"value":1149},{"type":43,"tag":116,"props":3060,"children":3061},{"style":128},[3062],{"type":48,"value":3063}," --mode",{"type":43,"tag":116,"props":3065,"children":3066},{"style":128},[3067],{"type":48,"value":3068}," cdp\n",{"type":43,"tag":116,"props":3070,"children":3071},{"class":118,"line":198},[3072,3076,3080,3084,3088],{"type":43,"tag":116,"props":3073,"children":3074},{"style":123},[3075],{"type":48,"value":4},{"type":43,"tag":116,"props":3077,"children":3078},{"style":128},[3079],{"type":48,"value":3041},{"type":43,"tag":116,"props":3081,"children":3082},{"style":128},[3083],{"type":48,"value":208},{"type":43,"tag":116,"props":3085,"children":3086},{"style":128},[3087],{"type":48,"value":299},{"type":43,"tag":116,"props":3089,"children":3090},{"style":128},[3091],{"type":48,"value":416},{"type":43,"tag":116,"props":3093,"children":3094},{"class":118,"line":651},[3095,3099,3103,3107,3111],{"type":43,"tag":116,"props":3096,"children":3097},{"style":123},[3098],{"type":48,"value":4},{"type":43,"tag":116,"props":3100,"children":3101},{"style":128},[3102],{"type":48,"value":3041},{"type":43,"tag":116,"props":3104,"children":3105},{"style":128},[3106],{"type":48,"value":2806},{"type":43,"tag":116,"props":3108,"children":3109},{"style":128},[3110],{"type":48,"value":299},{"type":43,"tag":116,"props":3112,"children":3113},{"style":128},[3114],{"type":48,"value":416},{"type":43,"tag":51,"props":3116,"children":3117},{},[3118,3124,3126,3132,3134,3140],{"type":43,"tag":96,"props":3119,"children":3121},{"className":3120},[],[3122],{"type":48,"value":3123},"--mode auto",{"type":48,"value":3125}," uses tab capture for user-owned tabs and CDP for relay-owned tabs.\nTab capture can include audio; CDP requires ",{"type":43,"tag":96,"props":3127,"children":3129},{"className":3128},[],[3130],{"type":48,"value":3131},"ffmpeg",{"type":48,"value":3133}," and has no audio. Use the\ncommand's ",{"type":43,"tag":96,"props":3135,"children":3137},{"className":3136},[],[3138],{"type":48,"value":3139},"--help",{"type":48,"value":3141}," for format and cursor options.",{"type":43,"tag":51,"props":3143,"children":3144},{},[3145],{"type":48,"value":3146},"Completion: stop the recorder, inspect the resulting media rather than only its\nexistence, and report the viewport, state, and interaction path actually tested.",{"type":43,"tag":77,"props":3148,"children":3150},{"id":3149},"troubleshooting",[3151],{"type":48,"value":3152},"Troubleshooting",{"type":43,"tag":2323,"props":3154,"children":3155},{},[3156,3168,3180],{"type":43,"tag":1767,"props":3157,"children":3158},{},[3159,3161,3166],{"type":48,"value":3160},"Run ",{"type":43,"tag":96,"props":3162,"children":3164},{"className":3163},[],[3165],{"type":48,"value":158},{"type":48,"value":3167},"; it checks package metadata, CLI\u002Frelay build\nidentity, extension protocol compatibility, sessions, targets, and artifacts.",{"type":43,"tag":1767,"props":3169,"children":3170},{},[3171,3172,3178],{"type":48,"value":152},{"type":43,"tag":96,"props":3173,"children":3175},{"className":3174},[],[3176],{"type":48,"value":3177},"status --json",{"type":48,"value":3179}," to inspect exact sessions and target ownership.",{"type":43,"tag":1767,"props":3181,"children":3182},{},[3183],{"type":48,"value":3184},"Reproduce once with the smallest execute before changing code.",{"type":43,"tag":51,"props":3186,"children":3187},{},[3188],{"type":48,"value":3189},"Common diagnoses:",{"type":43,"tag":1763,"props":3191,"children":3192},{},[3193,3204,3209,3214,3225,3230,3242,3247,3252,3265],{"type":43,"tag":1767,"props":3194,"children":3195},{},[3196,3202],{"type":43,"tag":96,"props":3197,"children":3199},{"className":3198},[],[3200],{"type":48,"value":3201},"connected:false",{"type":48,"value":3203},": run a relay-backed command, then reload the unpacked\nextension only if its reconnect loop does not recover.",{"type":43,"tag":1767,"props":3205,"children":3206},{},[3207],{"type":48,"value":3208},"Incompatible extension protocol: update either the extension or npm package;\nexact extension and relay release versions do not need to match.",{"type":43,"tag":1767,"props":3210,"children":3211},{},[3212],{"type":48,"value":3213},"Stale relay build: operational commands reject it with restart guidance;\nrebuild the CLI and restart the relay.",{"type":43,"tag":1767,"props":3215,"children":3216},{},[3217,3223],{"type":43,"tag":96,"props":3218,"children":3220},{"className":3219},[],[3221],{"type":48,"value":3222},"Target not found",{"type":48,"value":3224},": attach the intended tab, then select or adopt it using a\nunique URL substring or explicit index.",{"type":43,"tag":1767,"props":3226,"children":3227},{},[3228],{"type":48,"value":3229},"All targets disappeared: dismissing Chromium's debugging banner detaches every\ntab. Reattach through the toolbar.",{"type":43,"tag":1767,"props":3231,"children":3232},{},[3233,3235,3240],{"type":48,"value":3234},"Relay restarted: named sessions reclaim exact targets, but JavaScript ",{"type":43,"tag":96,"props":3236,"children":3238},{"className":3237},[],[3239],{"type":48,"value":1043},{"type":48,"value":3241},"\nand snapshot refs reset. Continue after the warning.",{"type":43,"tag":1767,"props":3243,"children":3244},{},[3245],{"type":48,"value":3246},"Reset\u002Fdelete after an extension update may wait briefly for target\nre-announcement; if the old relay-owned target is absent from the completed\ninventory, Browser Control forgets the dead identity without closing a\nguessed tab.",{"type":43,"tag":1767,"props":3248,"children":3249},{},[3250],{"type":48,"value":3251},"Repeated execution-context errors: run one short follow-up so Browser Control\ncan health-check the page. It may recreate a relay-owned page, but it never\nreplaces an unhealthy adopted user tab; reset or re-adopt that tab.",{"type":43,"tag":1767,"props":3253,"children":3254},{},[3255,3257,3263],{"type":48,"value":3256},"Fill timeout on login fields: inspect first, then try ",{"type":43,"tag":96,"props":3258,"children":3260},{"className":3259},[],[3261],{"type":48,"value":3262},"fillInput",{"type":48,"value":3264}," after\nconfirming the selector or locator resolves. String selectors search open\nshadow roots recursively; closed shadow roots remain unavailable.",{"type":43,"tag":1767,"props":3266,"children":3267},{},[3268,3270,3275],{"type":48,"value":3269},"Download wait fails: use fetch plus ",{"type":43,"tag":96,"props":3271,"children":3273},{"className":3272},[],[3274],{"type":48,"value":2012},{"type":48,"value":3276},"; extension-backed Playwright cannot\nretain a native download artifact.",{"type":43,"tag":51,"props":3278,"children":3279},{},[3280,3282,3288],{"type":48,"value":3281},"For deeper relay diagnosis, restart with ",{"type":43,"tag":96,"props":3283,"children":3285},{"className":3284},[],[3286],{"type":48,"value":3287},"BROWSER_CONTROL_DEBUG=1",{"type":48,"value":3289},". Debug traces\nmust never include expressions, arguments, results, headers, cookies, or form\nvalues.",{"type":43,"tag":51,"props":3291,"children":3292},{},[3293,3295,3300],{"type":48,"value":3294},"Whenever Browser Control fails, wedges, replaces a page\u002Fsession, or behaves\nunexpectedly, create or update a ",{"type":43,"tag":96,"props":3296,"children":3298},{"className":3297},[],[3299],{"type":48,"value":4},{"type":48,"value":3301}," project todo with the Browser\nControl version, safe session\u002Fpage context, exact error, deterministic\nreproduction, expected versus actual behavior, and recovery attempted. Never\ninclude credentials, form values, or private account data.",{"type":43,"tag":3303,"props":3304,"children":3305},"style",{},[3306],{"type":48,"value":3307},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3309,"total":119},[3310],{"slug":4,"name":4,"fn":5,"description":6,"org":3311,"tags":3312,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3313,3314,3315,3316],{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"items":3318,"total":725},[3319,3337,3351,3358],{"slug":3320,"name":3320,"fn":3321,"description":3322,"org":3323,"tags":3324,"stars":3334,"repoUrl":3335,"updatedAt":3336},"opentui","build terminal UIs with OpenTUI","Build terminal UIs with OpenTUI. Covers core, components, audio, keymaps, React, Solid, plugins, testing, standalone executables, QR encoding, SSH, and Three.js WebGPU.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3325,3328,3331],{"name":3326,"slug":3327,"type":16},"Desktop","desktop",{"name":3329,"slug":3330,"type":16},"React","react",{"name":3332,"slug":3333,"type":16},"UI Components","ui-components",12436,"https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fopentui","2026-07-29T05:41:33.249647",{"slug":3338,"name":3338,"fn":3339,"description":3340,"org":3341,"tags":3342,"stars":3348,"repoUrl":3349,"updatedAt":3350},"terminal-control","control and test terminal applications","Drive and verify terminal applications with the termctrl CLI in a real PTY - read visible screens, run named live sessions, send typed keyboard input, wait for text, save evidence, record timelines, and export edited videos. Use when an agent must operate or test a TUI, REPL, interactive CLI, shell process, or OpenTUI application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3343,3344,3347],{"name":14,"slug":15,"type":16},{"name":3345,"slug":3346,"type":16},"CLI","cli",{"name":21,"slug":22,"type":16},293,"https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fterminal-control","2026-07-23T05:44:15.921174",{"slug":4,"name":4,"fn":5,"description":6,"org":3352,"tags":3353,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3354,3355,3356,3357],{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"slug":3359,"name":3359,"fn":3360,"description":3361,"org":3362,"tags":3363,"stars":3371,"repoUrl":3372,"updatedAt":3373},"opencode-drive","interact with OpenCode instances","Use when an agent needs to drive OpenCode with an Effect program or interact with an isolated instance",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3364,3365,3368],{"name":14,"slug":15,"type":16},{"name":3366,"slug":3367,"type":16},"Code Execution","code-execution",{"name":3369,"slug":3370,"type":16},"Engineering","engineering",15,"https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fopencode-drive","2026-07-20T05:57:40.691365"]