# browser

Статус: отключен по умолчанию. Предыдущий `MockBrowserDriver` удален: extension больше не имитирует browser automation и fail-closed до порта настоящего OMP `BrowserTool`.

## Назначение

`browser` должен задавать OMP-compatible browser-поверхность для агента: `open`, `close`, `run`, named tabs, headless/spawned/connected browser kinds, JS execution, observations, screenshots and cleanup. Сейчас локальный extension хранит только disabled contract shape и не выполняет browser actions.

## Почему он есть в проекте

Проекту нужен browser tool, потому что многие реальные QA и documentation workflows требуют открыть страницу, снять snapshot или проверить UI. OMP уже имеет рабочий Puppeteer-based `BrowserTool`, поэтому `miloc-pi` должен забрать этот runtime, а не держать mock driver.

## Пользовательская поверхность

- Пользователь вызывает команду `/browser` без аргументов или `/browser doctor`, чтобы увидеть disabled status wrapper в виджете `browser`.
- Агент может вызвать tool `browser` с OMP-style action `open`, `close` или `run`, но любой action возвращает `isError=true`, пока OMP backend не портирован.
- Для будущего `open` предусмотрены `name`, `url`, `app`, `viewport`, `wait_until` и `dialogs`. Для будущего `run` предусмотрен `code`. Для будущего `close` предусмотрены `name`, `all` и `kill`.

## Как работает по коду

Entrypoint регистрирует команду `browser` и tool `browser`. Module-level browser state больше нет: mock driver удален, auto-start отключен, filesystem/network/browser permissions в manifest сведены к none/false.

Command `/browser` возвращает status text. Tool `browser` валидирует OMP-style schema и возвращает fail-closed error with details: `defaultEnabled=false`, `ownershipStatus=omp-owned-to-import`, target OMP actions and source evidence path.

- Entrypoint: `./extensions/browser/index.ts`
- Manifest: `extensions/browser/manifest.json`
- Commands: `browser`
- Tools: `browser`
- Hooks: none
- Permissions: fs.read=none, fs.write=none, subprocess=none, network=none, browser=false, models=false, ui=`setWidget`
- State: no browser state until OMP backend is ported.
- Review: status=reviewed, source=copy-after-audit, reviewedBy=miloc-pi, reviewedAt=2026-06-01, risk=high

## OMP source evidence

- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/browser.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/prompts/tools/browser.md`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/browser/tab-supervisor.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/browser/tab-worker.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/browser/registry.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/browser/launch.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/browser/attach.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/browser/render.ts`
- `/tmp/oh-my-pi-review/docs/tools/browser.md`
- `/tmp/oh-my-pi-review/LICENSE`

## Ограничения и риски

Критичный gap в том, что настоящий Puppeteer/CDP runtime не портирован. Локальный extension не умеет запускать Chromium, attach к CDP, хранить tabs, выполнять `run` JS, делать screenshots, обрабатывать abort/timeouts или cleanup. Это сознательный fail-closed state, чтобы mock не выглядел product-ready.

## Решение

Решение: `disable-now`. Browser surface нужен, но default load вернется только после порта OMP `BrowserTool`, runtime smoke с `open`/`run`/`close`, screenshot artifact proof, abort/timeout behavior and cleanup proof.
