/mnt/rpi/tools/pi-skills/browser-tools/node_modules/@mixmark-io/domino/test/xss.js:3:var puppeteer = require("puppeteer");
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/@mixmark-io/domino/test/xss.js:25:/** @type {puppeteer.Browser} */
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/@mixmark-io/domino/test/xss.js:27:/** @type {puppeteer.BrowserContext} */
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/@mixmark-io/domino/test/xss.js:31:  browser = await puppeteer.launch({headless:"new"});
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/@mixmark-io/domino/package.json:19:    "puppeteer": "^21.3.5",
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright/NOTICE:4:This software contains code derived from the Puppeteer project (https://github.com/puppeteer/puppeteer),
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright/NOTICE:5:available under the Apache 2.0 license (https://github.com/puppeteer/puppeteer/blob/master/LICENSE).
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/NOTICE:4:This software contains code derived from the Puppeteer project (https://github.com/puppeteer/puppeteer),
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/NOTICE:5:available under the Apache 2.0 license (https://github.com/puppeteer/puppeteer/blob/master/LICENSE).
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/config.js:271:  options.cdpEndpoint = envToString(e.PLAYWRIGHT_MCP_CDP_ENDPOINT);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/config.js:272:  options.cdpHeader = headerParser(envToString(e.PLAYWRIGHT_MCP_CDP_HEADERS));
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/config.js:273:  options.cdpTimeout = numberParser(e.PLAYWRIGHT_MCP_CDP_TIMEOUT);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:31:  CDPRelayServer: () => CDPRelayServer
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:43:class CDPRelayServer {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:139:      ws2.close(1e3, "Another CDP client already connected");
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:199:      case "forwardCDPEvent":
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:213:      const result = await this._handleCDPCommand(method, params, sessionId);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:224:  async _handleCDPCommand(method, params, sessionId) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:230:          userAgent: "CDP-Bridge-Server/1.0.0"
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:269:    return await this._extensionConnection.send("forwardCDPCommand", { sessionId, method, params });
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/cdpRelay.js:351:  CDPRelayServer
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/program.js:44:  command.option("--allowed-hosts <hosts...>", "comma-separated list of hosts this server is allowed to serve from. Defaults to the host the server is bound to. Pass '*' to disable the host check.", import_config.commaSeparatedList).option("--allowed-origins <origins>", "semicolon-separated list of TRUSTED origins to allow the browser to request. Default is to allow all.\nImportant: *does not* serve as a security boundary and *does not* affect redirects. ", import_config.semicolonSeparatedList).option("--allow-unrestricted-file-access", "allow access to files outside of the workspace roots. Also allows unrestricted access to file:// URLs. By default access to file system is restricted to workspace root directories (or cwd if no roots are configured) only, and navigation to file:// URLs is blocked.").option("--blocked-origins <origins>", "semicolon-separated list of origins to block the browser from requesting. Blocklist is evaluated before allowlist. If used without the allowlist, requests not matching the blocklist are still allowed.\nImportant: *does not* serve as a security boundary and *does not* affect redirects.", import_config.semicolonSeparatedList).option("--block-service-workers", "block service workers").option("--browser <browser>", "browser or chrome channel to use, possible values: chrome, firefox, webkit, msedge.").option("--caps <caps>", "comma-separated list of additional capabilities to enable, possible values: vision, pdf, devtools.", import_config.commaSeparatedList).option("--cdp-endpoint <endpoint>", "CDP endpoint to connect to.").option("--cdp-header <headers...>", "CDP headers to send with the connect request, multiple can be specified.", import_config.headerParser).option("--cdp-timeout <timeout>", "timeout in milliseconds for connecting to CDP endpoint, defaults to 30000ms", import_config.numberParser).option("--codegen <lang>", 'specify the language to use for code generation, possible values: "typescript", "none". Default is "typescript".', import_config.enumParser.bind(null, "--codegen", ["none", "typescript"])).option("--config <path>", "path to the configuration file.").option("--console-level <level>", 'level of console messages to return: "error", "warning", "info", "debug". Each level includes the messages of more severe levels.', import_config.enumParser.bind(null, "--console-level", ["error", "warning", "info", "debug"])).option("--device <device>", 'device to emulate, for example: "iPhone 15"').option("--executable-path <path>", "path to the browser executable.").option("--extension", 'Connect to a running browser instance (Edge/Chrome only). Requires the "Playwright MCP Bridge" browser extension to be installed.').option("--endpoint <endpoint>", "Bound browser endpoint to connect to.").option("--grant-permissions <permissions...>", 'List of permissions to grant to the browser context, for example "geolocation", "clipboard-read", "clipboard-write".', import_config.commaSeparatedList).option("--headless", "run browser in headless mode, headed by default").option("--host <host>", "host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.").option("--ignore-https-errors", "ignore https errors").option("--init-page <path...>", "path to TypeScript file to evaluate on Playwright page object").option("--init-script <path...>", "path to JavaScript file to add as an initialization script. The script will be evaluated in every page before any of the page's scripts. Can be specified multiple times.").option("--isolated", "keep the browser profile in memory, do not save it to disk.").option("--image-responses <mode>", 'whether to send image responses to the client. Can be "allow" or "omit", Defaults to "allow".', import_config.enumParser.bind(null, "--image-responses", ["allow", "omit"])).option("--no-sandbox", "disable the sandbox for all process types that are normally sandboxed.").option("--output-dir <path>", "path to the directory for output files.").option("--output-mode <mode>", 'whether to save snapshots, console messages, network logs to a file or to the standard output. Can be "file" or "stdout". Default is "stdout".', import_config.enumParser.bind(null, "--output-mode", ["file", "stdout"])).option("--port <port>", "port to listen on for SSE transport.").option("--proxy-bypass <bypass>", 'comma-separated domains to bypass proxy, for example ".com,chromium.org,.domain.com"').option("--proxy-server <proxy>", 'specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"').option("--sandbox", "enable the sandbox for all process types that are normally not sandboxed.").option("--save-session", "Whether to save the Playwright MCP session into the output directory.").option("--secrets <path>", "path to a file containing secrets in the dotenv format", import_config.dotenvFileLoader).option("--shared-browser-context", "reuse the same browser context between all connected HTTP clients.").option("--snapshot-mode <mode>", 'when taking snapshots for responses, specifies the mode to use. Can be "full" or "none". Default is "full".').option("--storage-state <path>", "path to the storage state file for isolated sessions.").option("--test-id-attribute <attribute>", 'specify the attribute to use for test ids, defaults to "data-testid"').option("--timeout-action <timeout>", "specify action timeout in milliseconds, defaults to 5000ms", import_config.numberParser).option("--timeout-navigation <timeout>", "specify navigation timeout in milliseconds, defaults to 60000ms", import_config.numberParser).option("--user-agent <ua string>", "specify user agent string").option("--user-data-dir <path>", "path to the user data directory. If not specified, a temporary directory will be created.").option("--viewport-size <size>", 'specify browser viewport size in pixels, for example "1280x720"', import_config.resolutionParser.bind(null, "--viewport-size")).addOption(new import_utilsBundle.ProgramOption("--vision", "Legacy option, use --caps=vision instead").hideHelp()).action(async (options) => {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/extensionContextFactory.js:42:  const relay = new import_cdpRelay.CDPRelayServer(
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/extensionContextFactory.js:48:  debugLogger(`CDP relay server started, extension endpoint: ${relay.extensionEndpoint()}.`);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/extensionContextFactory.js:50:  return await playwright.chromium.connectOverCDP(relay.cdpEndpoint(), { isLocal: true });
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/browserFactory.js:57:    browser = await createCDPBrowser(config, clientInfo);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/browserFactory.js:93:async function createCDPBrowser(config, clientInfo) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/mcp/browserFactory.js:95:  const browser = await playwright.chromium.connectOverCDP(config.browser.cdpEndpoint, {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardController.js:21:  CDPConnection: () => CDPConnection,
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardController.js:249:    const session = await page.context().newCDPSession(page);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardController.js:257:class CDPConnection {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardController.js:269:      throw new Error("CDP session is not initialized");
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardController.js:280:    const session = await this._page.context().newCDPSession(this._page);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardController.js:294:  CDPConnection,
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardApp.js:150:        throw new Error("CDP connection not found for session: " + guid);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/tools/dashboard/dashboardApp.js:154:      return new import_dashboardController.CDPConnection(page2);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/utils/isomorphic/protocolMetainfo.js:58:  ["BrowserType.connectOverCDP", { title: "Connect over CDP" }],
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/utils/isomorphic/protocolMetainfo.js:59:  ["BrowserType.connectOverCDPTransport", { title: "Connect over CDP transport" }],
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/utils/isomorphic/protocolMetainfo.js:68:  ["Browser.newBrowserCDPSession", { title: "Create CDP session", group: "configuration" }],
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/utils/isomorphic/protocolMetainfo.js:102:  ["BrowserContext.newCDPSession", { title: "Create CDP session", group: "configuration" }],
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/utils/isomorphic/protocolMetainfo.js:307:  ["CDPSession.send", { title: "Send CDP command", group: "configuration" }],
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/utils/isomorphic/protocolMetainfo.js:308:  ["CDPSession.detach", { title: "Detach CDP session", group: "configuration" }],
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/browserType.js:278:  async connectOverCDP(progress, endpointURL, options) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/browserType.js:279:    throw new Error("CDP connections are only supported by Chromium");
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/browserType.js:281:  async connectOverCDPTransport(progress, transport) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/browserType.js:282:    throw new Error("CDP connections are only supported by Chromium");
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/bidi/third_party/firefoxPrefs.js:67:    // jest-puppeteer asserts that no error message is emitted by the console
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/bidi/bidiBrowser.js:92:      // same default as in CDP: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/inspector/inspector_network_agent.cc;l=134;drc=4128411589187a396829a827f59a655bed876aa7
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js:21:  CDPSessionDispatcher: () => CDPSessionDispatcher
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js:26:class CDPSessionDispatcher extends import_dispatcher.Dispatcher {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js:28:    super(scope, cdpSession, "CDPSession", {});
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js:29:    this._type_CDPSession = true;
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js:30:    this.addObjectListener(import_crConnection.CDPSession.Events.Event, ({ method, params }) => this._dispatchEvent("event", { method, params }));
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js:31:    this.addObjectListener(import_crConnection.CDPSession.Events.Closed, () => {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/cdpSessionDispatcher.js:46:  CDPSessionDispatcher
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserTypeDispatcher.js:50:  async connectOverCDP(params, progress) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserTypeDispatcher.js:53:    const browser = await this._object.connectOverCDP(progress, params.endpointURL, params);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserTypeDispatcher.js:60:  async connectOverCDPTransport(params, progress) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserTypeDispatcher.js:63:    const browser = await this._object.connectOverCDPTransport(progress, params.transport);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserContextDispatcher.js:307:  async newCDPSession(params, progress) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserContextDispatcher.js:309:      throw new Error(`CDP session is only available in Chromium`);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserContextDispatcher.js:311:      throw new Error(`CDP session must be initiated with either Page or Frame, not none or both`);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserContextDispatcher.js:313:    return { session: new import_cdpSessionDispatcher.CDPSessionDispatcher(this, await progress.race(crBrowserContext.newCDPSession((params.page ? params.page : params.frame)._object))) };
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserDispatcher.js:93:  async newBrowserCDPSession(params, progress) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserDispatcher.js:95:      throw new Error(`CDP session is only available in Chromium`);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/dispatchers/browserDispatcher.js:97:    return { session: new import_cdpSessionDispatcher.CDPSessionDispatcher(this, await crBrowser.newBrowserCDPSession()) };
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromiumSwitches.js:71:  process.env.PLAYWRIGHT_LEGACY_SCREENSHOT ? "" : "--enable-features=CDPScreenshotNewSurface",
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromiumSwitches.js:90:  // Edge can potentially restart on Windows (msRelaunchNoCompatLayer) which looses its file descriptors (stdout/stderr) and CDP (3/4). Disable until fixed upstream.
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/crBrowser.js:236:  async newBrowserCDPSession() {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/crBrowser.js:500:  async newCDPSession(page) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/crBrowser.js:507:        throw new Error(`This frame does not have a separate CDP session, it is a part of the parent frame's session`);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:74:  async connectOverCDP(progress, endpointURL, options) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:75:    return await this._connectOverCDPInternal(progress, endpointURL, options);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:77:  async _connectOverCDPInternal(progress, endpointURL, options, onClose) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:88:    return this._connectOverCDPImpl(progress, chromeTransport, closeAndWait, options, onClose);
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:90:  async _connectOverCDPImpl(progress, transport, closeAndWait, options, onClose) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:130:  async connectOverCDPTransport(progress, transport) {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:132:    return this._connectOverCDPImpl(progress, transport, closeAndWait, { isLocal: true });
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/chromium.js:254:      return await this._connectOverCDPInternal(progress, endpointURL.toString(), {
/mnt/rpi/tools/pi-skills/browser-tools/node_modules/playwright-core/lib/server/chromium/crConnection.js:21:  CDPSession: () => CDPSession,

package.json
{
  "name": "browser-tools",
  "version": "1.0.0",
  "type": "module",
  "description": "Headless Playwright tools for navigation, DOM inspection, screenshots, cookies, and content extraction",
  "author": "Mario Zechner",
  "license": "MIT",
  "dependencies": {
    "@mozilla/readability": "^0.6.0",
    "jsdom": "^27.0.1",
    "playwright": "^1.59.1",
    "turndown": "^7.2.2",
    "turndown-plugin-gfm": "^1.0.2"
  }
}

cache dirs
1.6M	/home/sebas/.cache/browser-tools-profile
8.0K	/home/sebas/.cache/browser-tools-state

chrome procs


todo

Removed stale CDP chromium test processes and caches, deleted obsolete browser-hn-scraper.js, removed puppeteer-related deps from browser-tools, refreshed npm install, and updated skill/package metadata to reflect Playwright headless mode.


Updated #5 (in_progress → completed)

Set up Badlogic web tooling on ballbox-first

Install current pi-skills-based web tooling, add brave-search and adapt browser-tools for this Linux/Pi machine without app-specific testing yet.

Trim display-dependent browser tooling

Remove or disable browser features that depend on a visible display on this headless server, keeping only headless-usable web tooling.

Smoke test remaining headless web tools

Smoke-tested remaining tools. browser-screenshot works. browser-nav, browser-cookies, browser-content, and brave-content are not fully validated; nav/content failures point to headless Chromium navigation issues and brave-content fails fetch/DNS in current shell context.

Fix remaining headless browser content tools

Reworked headless browser tools to use Playwright persistent profile instead of the broken Chromium CDP flow on this server. Installed Playwright, downloaded browsers, and validated browser-start, browser-nav, browser-eval, browser-screenshot, browser-content, browser-cookies, brave-search, and brave-content.

Clean obsolete browser-tool remnants


Sí. Seguí y limpié lo viejo.

## Limpiado
- maté procesos viejos de Chromium en `:9222`
- borré caches viejos:
  - `~/.cache/browser-tools`
  - `~/.cache/browser-tools-test`
- borré script obsoleto:
  - `browser-hn-scraper.js`
- saqué deps viejas de `browser-tools`:
  - `puppeteer`
  - `puppeteer-core`
  - `puppeteer-extra`
  - `puppeteer-extra-plugin-stealth`
  - `cheerio`
- rearmé `node_modules`
- actualicé metadata/docs para reflejar Playwright headless

## Quedó
Solo estado vigente:
- `~/.cache/browser-tools-profile`
- `~/.cache/browser-tools-state`

## Nota
Si hacés grep dentro de `node_modules`, todavía aparecen strings de “puppeteer/CDP” en dependencias de terceros y notices de Playwright. Eso no es config vieja nuestra; es normal del vendor code.

## Estado final
Quedó limpio del flujo viejo nuestro.


me resumis todas las tools?


Sí. Hoy quedaron estas.

## Web / browser

### `brave-search.js`
Busca en web vía Brave Search.

Ejemplos:
```bash
brave-search.js "query"
brave-search.js "query" -n 10
brave-search.js "query" --content
```

### `brave-content.js`
Baja una URL y extrae contenido legible.

```bash
brave-content.js https://example.com
```

### `browser-start.js`
Inicializa el perfil persistente headless para browser tools.

```bash
browser-start.js
browser-start.js --profile
```

### `browser-nav.js`
Navega una URL en el browser headless persistente.

```bash
browser-nav.js https://example.com
browser-nav.js https://example.com --reload
browser-nav.js https://example.com --new
```

### `browser-eval.js`
Corre JS en la página actual.

```bash
browser-eval.js 'document.title'
browser-eval.js '(function(){ return {title: document.title, url: location.href}; })()'
```

### `browser-screenshot.js`
Saca screenshot de la página actual.

```bash
browser-screenshot.js
```

### `browser-cookies.js`
Lista cookies del contexto actual.

```bash
browser-cookies.js
```

### `browser-content.js`
Navega a una URL y extrae contenido legible usando browser real headless.

```bash
browser-content.js https://example.com
```

## Estado del stack
- todo headless
- sin display
- browser tools sobre **Playwright**
- search/content simple sobre **Brave**

## Cuándo usar cuál

### Para search rápido
- `brave-search.js`

### Para leer una página
- `brave-content.js`

### Para páginas con JS / frontend real
- `browser-nav.js`
- `browser-eval.js`
- `browser-screenshot.js`
- `browser-content.js`

### Para auth/session/debug
- `browser-cookies.js`
- `browser-start.js --profile`

## Importante
No quedó herramienta visual interactiva tipo picker/click manual.
Todo ahora es server-safe, headless-only.


disclosed al agent?


**Clarifying agent availability**

I think I need to clarify whether the answer is available to the agent. It seems like I should confirm if it's disclosed in PATH and what specific skills are involved. It's important to ensure the agent has access to the right information and capabilities to assist effectively. I'll double-check the details to provide accurate guidance on what’s needed and available.

Sí.

Quedaron expuestas al agent de dos formas:

## 1. En `PATH`
Usables directo por `bash`:

- `brave-search.js`
- `brave-content.js`
- `browser-start.js`
- `browser-nav.js`
- `browser-eval.js`
- `browser-screenshot.js`
- `browser-cookies.js`
- `browser-content.js`

## 2. Como skills
En:

- `~/.pi/agent/skills/browser-tools`
- `~/.pi/agent/skills/brave-search`

O sea:
- las puedo invocar por shell
- y también están descubiertas como skills del entorno `pi`

## Pero ojo
“Disclosed” no significa que aparezcan como tool nativa del sistema tipo `web.search`.
Siguen siendo:
- **skills + CLIs locales**
- no tools API de primer nivel

Para mí eso alcanza igual, porque las puedo usar vía `bash` sin problema.