--- 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.