chore: auto-commit (13 archivos)
- CAPABILITIES_TODO.md - demo_e2e/RESUMEN.md - demo_e2e/results/prueba_1_quotes.json - demo_e2e/results/prueba_2_perceive.json - demo_e2e/results/prueba_3_search.json - demo_e2e/results/prueba_4_login_session.json - demo_e2e/results/prueba_5_books.json - demo_e2e/results/prueba_6_session_storage.json - demo_e2e/results/prueba_7_find_honesto.json - demo_e2e/results/prueba_8_verificacion.json - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+122
-1
@@ -2,7 +2,7 @@
|
||||
title: Capacidades de navegador (CDP) + construcción del MCP full-CDP
|
||||
artefacto: project · projects/web_scraping
|
||||
created: 06/06/2026 00:00
|
||||
updated: 06/06/2026 07:00
|
||||
updated: 06/06/2026 09:00
|
||||
status: in_progress
|
||||
related_issues: []
|
||||
related_flows: []
|
||||
@@ -244,6 +244,18 @@ Prioridad BAJA (formularios compuestos, emulación device, performance, drag):
|
||||
|
||||
## Hecho (lo que YA tenemos)
|
||||
|
||||
- [x] **Gap #1 — bucle percibir→actuar por `#ref` + auto-observe** (06/06/2026, 9/9 e2e)
|
||||
- `#ref` = `backendDOMNodeId` (estable, no el efímero del AX) → ref→acción + refs estables resueltos
|
||||
juntos y **stateless** (sin mapa en el MCP). Validado con dump de AXNode real antes de codear.
|
||||
- Funciones nuevas: `cdp_click_xy_human` (primitivo de click humanizado por coords, compartido por
|
||||
selector/#ref/visión), `cdp_click_ref`, `cdp_type_ref`, `cdp_hover_ref`. `cdp_click_human`
|
||||
refactorizado para usar el primitivo (un solo camino de click).
|
||||
- MCP: tools `dom_click_ref`/`dom_type_ref`/`dom_hover_ref` con **auto-observe** (devuelven el outline
|
||||
tras la acción). browser_mcp v0.3.0, **39 tools**.
|
||||
- `render_ax_outline` mejorado (defectos F1): guard de ciclo + profundidad, sin `ljust`, renderiza `value`.
|
||||
- Validado prueba e2e 9: login en the-internet **solo por `#ref`**, sin un selector CSS.
|
||||
- Pendiente de la familia: política de humanización por sesión (`human`/`fast`/`instant`).
|
||||
- enlace: functions/browser/cdp_{click_xy_human,click_ref,type_ref,hover_ref}.go + render_ax_outline.py
|
||||
- [x] **Tanda de deuda A+D+E+B — 4 fixes + 8/8 e2e** (06/06/2026)
|
||||
- **A** aislamiento robusto: `chrome_launch` usa el binario real (salta el wrapper que pisaba flags).
|
||||
- **D** `sessionStorage` añadido a `storage_state` (save+load). Validado por prueba e2e 6.
|
||||
@@ -433,6 +445,115 @@ funcionó**. Evaluado contra el bucle PERCIBIR → DECIDIR → ACTUAR → VERIFI
|
||||
|
||||
---
|
||||
|
||||
## Roadmap MCP de clase — benchmark Playwright + Visión (apuntado 06/06/2026)
|
||||
|
||||
Objetivo: pasar de "wrapper con ~36 tools" a un MCP de clase. La métrica NO es el número de tools
|
||||
(Playwright MCP ~60, Chrome DevTools MCP 26) — gran parte de los 60 de Playwright son inflado (storage
|
||||
desglosado, video/tracing). Lo que sube el nivel real es **cerrar los 4 gaps de clase + dar al agente
|
||||
tres sentidos de percepción→acción**.
|
||||
|
||||
### Los tres sentidos del agente (percepción → acción)
|
||||
|
||||
El agente tendrá tres vías para "ver" una página y actuar sobre ella. Cada una necesita su puente a la acción:
|
||||
|
||||
1. **DOM / AX tree** (hoy parcial) — `page_perceive` → outline con `#ref`. **Falta el puente `#ref` → acción.**
|
||||
2. **Texto** (hoy) — `cdp_get_text` (compacto, selector opcional).
|
||||
3. **Visión** (futuro, el usuario aportará los modelos) — screenshot → **OCR** (texto + bbox) + **YOLO**
|
||||
(objetos + bbox) → el agente ve la página como imagen. **Puente a la acción = coordinate mouse**
|
||||
(`click_xy` sobre el bounding box detectado). Por esto coordinate mouse NO es inflado: es el sentido
|
||||
de la mano para el ojo visual.
|
||||
|
||||
### Transversal — humanización SIEMPRE en las acciones (anti-detección)
|
||||
|
||||
REGLA DE DISEÑO: todas las acciones de ratón/teclado del agente usan por defecto la variante humanizada
|
||||
(curva de Bézier + jitter + micro-pausas variables), no el evento sintético directo. Ya existen
|
||||
`cdp_click_human` y `cdp_move_mouse_human`; el `cdp_type_text` ya escribe char a char con pausa. Aplicar:
|
||||
|
||||
- El puente `#ref` → acción (A1) y `click_xy` (C1) deben ir **por defecto** por el camino humanizado
|
||||
(mover el ratón con Bézier hasta el destino + click con micro-pausa press/release), no por
|
||||
`Input.dispatchMouseEvent` seco. Exponer un flag `instant=true` solo para tests/velocidad.
|
||||
- Donde falte versión humanizada (scroll, drag_xy), crear la variante con jitter/easing.
|
||||
- Objetivo: que el tráfico de input sea indistinguible de un humano — es ventaja nuestra frente a
|
||||
Playwright/CDP-MCP, que no humanizan. No perderla al añadir tools nuevas.
|
||||
|
||||
### A. Gaps de clase (los 4 que de verdad suben el nivel)
|
||||
|
||||
- [x] **A1 — Puente `#ref` → acción** ✅ (06/06). `cdp_click_ref`/`cdp_type_ref`/`cdp_hover_ref` + primitivo
|
||||
`cdp_click_xy_human`. Tools MCP `dom_click_ref`/`type_ref`/`hover_ref`. Validado prueba e2e 9.
|
||||
Hoy el outline da `#ref=44` pero el LLM no puede usarlo: tiene que volver a selector CSS. Cierra el loop
|
||||
percibir↔actuar. **Gap #1 ahora.**
|
||||
- [x] **A2 — Refs estables** ✅ (06/06). Resuelto stateless: el `#ref` ES el `backendDOMNodeId` (estable
|
||||
mientras el nodo viva), no el `nodeId` efímero del AX. Sin mapa de estado en el MCP. `render_ax_outline` actualizado.
|
||||
- [x] **A3 — Auto-observe tras acción** ✅ (06/06). Las tools `_ref` del MCP devuelven el outline AX
|
||||
actualizado tras la acción (settle 400ms + perceiveOutline). Verificación implícita. Validado prueba 9.
|
||||
- [ ] **A4 — Política de target segura en el MCP** (P0 seguridad). `cdp_connect_target` da la herramienta;
|
||||
falta la regla: el MCP lanza Chrome propio (perfil + puerto dedicados, ya en 9333) o exige target
|
||||
explícito; nunca engancha a la tab del 9222 por `match=""`.
|
||||
- [ ] **A5 — Intercept / mock de red** (`Fetch.enable`) (P0 programático). Mockear APIs, bloquear recursos,
|
||||
inyectar headers. La tool más valiosa de Playwright (`route`). Hoy 0.
|
||||
|
||||
### B. Tools valiosas del benchmark Playwright (delta real, ~12)
|
||||
|
||||
- [ ] **B1 verbos de formulario**: `hover`, `select_option` (`<select>`), `file_upload` (`DOM.setFileInputFiles`),
|
||||
`drag`/`drop`.
|
||||
- [ ] **B2 network observability**: `network_requests` (lista en vivo) + `network_request` (inspeccionar uno).
|
||||
Complementa el HAR post-mortem.
|
||||
- [ ] **B3 `console_messages`**: capturar consola + excepciones JS (`Runtime.consoleAPICalled`). Debug + detección.
|
||||
- [ ] **B4 assertions (modo programático)**: `verify_element_visible` / `verify_text_visible` / `verify_value`.
|
||||
Es el EJE VERIFICAR aplicado a recetas YAML (assert por paso).
|
||||
|
||||
### C. Coordinate mouse — IMPORTANTE (base del modo visión)
|
||||
|
||||
Reclasificado de "inflado" a importante por el usuario: es el puente entre visión (bbox de OCR/YOLO) y acción.
|
||||
|
||||
- [ ] **C1** `cdp_click_xy(x, y)` — click por coordenadas (sobre lo que la visión detecta).
|
||||
- [ ] **C2** `cdp_move_xy` / `cdp_mouse_down` / `cdp_mouse_up` — control fino del ratón por píxeles.
|
||||
- [ ] **C3** `cdp_drag_xy(x1,y1,x2,y2)` — drag por coordenadas.
|
||||
- [ ] **C4** `cdp_scroll` ya existe; añadir target por coordenadas/elemento (P1.5).
|
||||
|
||||
### D. Misc — IMPORTANTE
|
||||
|
||||
- [ ] **D1** `cdp_save_pdf` (`Page.printToPDF`) — exportar página a PDF.
|
||||
- [ ] **D2** `cdp_get_console` (= B3) — consola + excepciones.
|
||||
- [ ] **D3** `cdp_resize` / `cdp_emulate_device` (`Emulation.setDeviceMetricsOverride`) — viewport conocido
|
||||
(clave para visión: coordenadas estables) + mobile/touch.
|
||||
- [ ] **D4** `cdp_nav_back`/`forward` ya existen; `wait_for` cubierto por wait_load/idle/element.
|
||||
- [ ] Screenshot como **MCP image content** (hoy `page_screenshot` va a archivo → el LLM no lo ve). Prerequisito
|
||||
del modo visión.
|
||||
|
||||
### E. VISIÓN (OCR + YOLO) — tarea futura, el usuario aporta los modelos
|
||||
|
||||
- [ ] **E1** Pipeline de percepción visual: `page_screenshot` (a buffer) → **OCR** (texto + bbox) + **YOLO**
|
||||
(objetos UI + bbox) → estructura `{label, text, bbox}` que el agente consume como "outline visual".
|
||||
- [ ] **E2** Función `ocr_page` y `detect_ui_elements` (los modelos los aportará el usuario). Dominio nuevo
|
||||
(¿`vision`?) o `browser`. Probable Python (modelos ML).
|
||||
- [ ] **E3** Puente visión → acción vía coordinate mouse (sección C): el agente clica el centro del bbox.
|
||||
- [ ] **E4** Screenshot como image content en el MCP (D) para que el LLM también vea el píxel directamente.
|
||||
- Nota: la visión es el tercer sentido — complementa, no sustituye, al AX outline (que es más barato en
|
||||
tokens). Útil cuando el DOM miente (canvas, iframes cross-origin, apps que pintan en `<canvas>`).
|
||||
|
||||
### F. Defectos de calidad a corregir en lo ya construido (del coach)
|
||||
|
||||
- [x] **F1** ✅ (06/06) `render_ax_outline`: guard de ciclo (`visited`) + límite de profundidad (`_MAX_DEPTH=60`);
|
||||
`ljust(60)` eliminado; renderiza el `value` de inputs (`= 'texto'`). Hecho en la misma edición del `#ref`.
|
||||
- [ ] **F2** `cdp_get_html` sin límite: **documentar** que es "crudo a propósito" (la vía compacta es
|
||||
get_text + outline).
|
||||
- [ ] **F3** `cdp_connect_target` con `match=""`: documentar que es inseguro fuera del MCP; la política
|
||||
segura vive en A4.
|
||||
- [ ] **F4** Limpieza de recursos: isolated worlds que crea `cdp_eval_in_frame`, conexiones del pool del MCP.
|
||||
|
||||
### G. Inflado de Playwright — NO construir salvo necesidad concreta
|
||||
|
||||
Storage granular desglosado (cookie/localStorage/sessionStorage × get/set/delete/list/clear = 17 tools;
|
||||
nosotros lo hacemos con 6), video/tracing/highlight (9 tools de debug visual de testing), `generate_locator`,
|
||||
`run_code_unsafe` (= nuestro `page_eval_js`). Replicar esto sube el contador a ~45 sin añadir poder.
|
||||
|
||||
### Telemetría
|
||||
|
||||
`call_monitor` ya existe — cada tool del MCP encaja sin trabajo extra.
|
||||
|
||||
---
|
||||
|
||||
## Enlaces
|
||||
|
||||
- App orquestadora — projects/web_scraping/apps/script_navegador (CLI rápido: open/click/type/eval/html/shot/wait/tabs/launch/close/profiles + runner YAML)
|
||||
|
||||
Reference in New Issue
Block a user