Files
navegator_dashboard/app.md
T
egutierrez cc1b324ffb feat(navegator_dashboard): v1+v2 — CDP HTTP client, real Tabs panel, full Network panel
CDP HTTP client (cdp_http.h/cpp): WinSock raw + crude_json. GET /json/version,
/json (list tabs), PUT /json/new (Chrome 137+), GET /json/activate/{id},
/json/close/{id}.

CDP WebSocket client (cdp_ws.h/cpp): RFC 6455 handshake + framing manual,
masked client frames, async dispatcher con queue + wait_response. Soporta
fragmentacion (FIN=0 + continuation), ping/pong, close frame. Stats bytes
in/out + frames in.

Cross-panel session (session_state.h/cpp): selected_browser_port +
selected_tab_id. Cambiar tab cierra/abre NetworkSession.

Tabs panel: real. List + filtro titulo/URL + Refresh + New tab + Focus +
Close + Select (alimenta Network panel).

Network panel: DevTools-like.
  - Tabla: Name | Status (color) | Method | Type | Initiator | Size | Time | Waterfall
  - Filtros: text + invert + chips (Doc/CSS/JS/XHR/Img/Media/Font/WS/Other) + All toggle
  - Toggles: Preserve log, Disable cache, Hide data:, Only failed, Pause/Resume
  - Detalle por request: Headers (general + req + res) | Payload | Response (lazy
    Network.getResponseBody) | Cookies | Timing | WS Messages (frames in/out)
  - Right-click row: Copy URL / Copy as cURL / Copy as fetch
  - Status bar: N requests | bytes transferred | resources | Finish | DCL | Load
  - Export HAR 1.2 a archivo junto al exe

NetworkSession parsea Network.requestWillBeSent + ExtraInfo, responseReceived
+ ExtraInfo, dataReceived, loadingFinished, loadingFailed, webSocketCreated,
webSocketFrameSent/Received/Closed, Page.frameNavigated (autoclear si !preserve),
domContentEventFired, loadEventFired.

API local extendida (local_api.cpp):
  - GET  /browser/{port}/version
  - GET  /browser/{port}/tabs
  - POST /browser/{port}/tab/new?url=
  - POST /browser/{port}/tab/{id}/focus
  - POST /browser/{port}/tab/{id}/close
  - GET  /browser/{port}/har  (HAR 1.2 export de la sesion activa)

Build:
  - CMakeLists.txt linka imgui_node_editor solo para reusar crude_json (sin
    codigo de node-editor en runtime).
  - 15 MB exe Windows. Cross-compile mingw-w64 OK.

app.md: bump version 0.2.0 -> 0.3.0, panels matrix actualizado, e2e_checks
añade api_health + api_browsers (warning).

Issue 0002 (sub-issue del roadmap navegator_dashboard 0001).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 12:51:23 +02:00

105 lines
6.4 KiB
Markdown

---
name: navegator_dashboard
lang: cpp
domain: tools
description: "Cuadro de mandos para gestionar instancias Chrome con remote debugging. Lista navegadores corriendo (visibles + headless), permite lanzar/matar perfiles, inspeccionar pestañas, ejecutar JS, ver peticiones de red. Puente WSL→Windows que centraliza el control que hoy hacemos por scripts dispersos."
tags: [imgui, browser, cdp, dashboard, windows, navegator]
uses_functions: []
uses_types: []
framework: "imgui"
entry_point: "main.cpp"
dir_path: "projects/navegator/apps/navegator_dashboard"
repo_url: ""
e2e_checks:
- id: build_windows
cmd: "cd /home/lucas/fn_registry && ./fn run compile_cpp_app navegator_dashboard"
timeout_s: 600
- id: exe_present
cmd: "test -f /mnt/c/Users/lucas/Desktop/apps/navegator_dashboard/navegator_dashboard.exe"
- id: api_health
cmd: "curl -sf http://127.0.0.1:19333/health"
timeout_s: 5
severity: warning
- id: api_browsers
cmd: "curl -sf http://127.0.0.1:19333/browsers"
timeout_s: 5
severity: warning
---
## Proposito
Centralizar el control de **todas** las instancias de Chrome con `--remote-debugging-port` que se lancen en el equipo. Sustituye los scripts sueltos `start.sh`/`stop.sh`/`nav.sh` de `projects/navegator/scripts/` por una UI unificada + API HTTP local.
Casos de uso:
- Ver de un vistazo cuantos Chrome estan vivos, en que puerto, con que profile, headless o no.
- Lanzar/matar perfiles desde la UI sin tocar terminal.
- Listar pestañas de cada instancia, navegar, cerrar, capturar HTML/screenshot.
- Inspeccionar peticiones de red en vivo (CDP `Network.*` events).
- Exponer todo eso como API HTTP local para que scripts/agentes/cdp-cli/graph_explorer hablen con un solo endpoint en vez de cada uno re-implementar el control.
## Arquitectura
```
┌───────────── navegator_dashboard.exe (Windows) ─────────────┐
│ │
│ UI ImGui (panels) HTTP API (127.0.0.1:1923X) │
│ ├── Browsers GET /browsers │
│ ├── Tabs POST /browser/spawn │
│ ├── Tab Detail POST /browser/{port}/kill │
│ └── Network GET /browser/{port}/tabs │
│ POST /browser/{port}/navigate │
│ Worker threads: GET /browser/{port}/tab/{id}/html│
│ ├── ChromeScanner GET /browser/{port}/network/log │
│ ├── CdpHttpClient ... │
│ └── CdpWsStream │
└──────────────────────────────────────────────────────────────┘
↓ scan/spawn/kill ↓ /json + ws
┌─────────── chrome.exe N instancias (Windows) ───────────────┐
│ perfil=default port=19222 [visible] │
│ perfil=osint port=19223 [visible] │
│ perfil=headless_scrape port=19224 [headless] │
└──────────────────────────────────────────────────────────────┘
```
## Panels (v0 → v2)
| Panel | v0 | v1 (issue 0002) | v1.5 | v2 (issue 0002) | v3 |
|---|---|---|---|---|---|
| **Browsers** | scan + spawn + kill | + Select row → cross-panel context | grupos (perfiles favoritos) | grupos | drag&drop |
| **Tabs** | stub | list + Focus/Close/New + filter | — | — | drag&drop entre instancias |
| **Tab Detail** | stub | placeholder upgrade | HTML preview + screenshot + REPL | — | live mirror (CDP screencast) |
| **Network** | stub | — | — | DevTools-like: tabla + filtros (Doc/CSS/JS/XHR/Img/Media/Font/WS/Other) + waterfall + detalle (Headers/Payload/Response/Cookies/Timing/WS Messages) + Preserve log + Disable cache + Pause + Export HAR | extract endpoints |
## Stack
- `fn::run_app` (cpp/framework/app_base.h) — shell estandar (PATTERNS.md).
- ImGui + ImPlot.
- ChromeScanner: `Get-CimInstance Win32_Process` invocado con `_popen`. Itera ~1 Hz.
- ChromeLauncher: `CreateProcess` Windows. Argumentos derivados de `chrome_launch_go_browser` (registry).
- **CDP HTTP** (`cdp_http.{h,cpp}`): WinSock raw, GET `/json/version`, `/json`, PUT `/json/new`, GET `/json/activate/{id}`, `/json/close/{id}`. v1 ✓.
- **CDP WS** (`cdp_ws.{h,cpp}`): handshake RFC 6455 + framing manual. Async dispatcher con queue + wait_response. v2 ✓ (parser de mensajes Network.* en `network_state`).
- **NetworkSession** (`network_state.{h,cpp}`): consume `Network.requestWillBeSent`, `responseReceived`, `dataReceived`, `loadingFinished/Failed`, `webSocketCreated/FrameSent/FrameReceived/Closed`, `Page.frameNavigated`, `Page.domContentEventFired`, `Page.loadEventFired`. Mantiene log + stats + export HAR 1.2.
- **JSON parser**: crude_json del vendor `imgui-node-editor` (dual-license public domain). Linkado como dep estatica para reusar — sin codigo de node-editor en runtime.
- HTTP API local: WinSock raw bind 127.0.0.1. v0+v1+v2 endpoints en `local_api.cpp`.
## Decisiones consciente (cpp_apps.md §9)
- `viewports`: `true` (default) — la app puede arrastrar paneles fuera del main.
- `init_gl_loader`: `false` — solo ImGui, sin OpenGL custom.
- `local_files/`: la app guarda su `app_settings.ini` + `navegator_dashboard.db` con historial de instancias y perfiles favoritos.
- Modo CLI: `--api-only --port N` para correr sin UI (daemon puro). v1+.
## Plataforma
- **Windows-only**. La app vive en WSL como codigo pero solo se compila como binario Windows (mingw-w64). En Linux, `CMakeLists.txt` hace `return()` antes de `add_imgui_app` para que `cpp/build/` no falle.
- Razon: 90% de la logica usa Win32 (CreateProcess, WMI, taskkill). Linux Chrome es secundario y ya esta cubierto por `cdp-cli` directo.
## Roadmap
- v0 (este commit): skeleton + Browsers panel funcional + 3 stubs.
- v1: CDP HTTP/WS in-process + Tabs + Tab Detail + Network panel.
- v2: HTTP API local + integracion con `cdp-cli` (cdp-cli puede delegar al dashboard si esta vivo).
- v3: streaming live de pestañas (CDP `Page.startScreencast`) — arquitectura ya prevista en issue 0038.