PTENES
MÓDULO 2.1

🌐 Controlar la app con agent-browser

agent-browser (con Playwright por debajo) abre la app real en un viewport fijo, navega a la URL, encuentra elementos, ejecuta acciones y captura cada pantalla — es el motor de captura de esta skill.

7
Temas
~30
Minutos
Práctico
Nivel
Captura
Tipo
agent-browser PLAYWRIGHT · VIEWPORT FIJO localhost:8000 1280 × 800 botón objetivo getBoundingClientRect acciones open · snapshot -i fill · click · screenshot shot.png pantalla real bbox x,y,w,h capturar primero · animar después · sin clave de API
1

🤖 Qué es el agent-browser

Una skill de navegación que controla un navegador real (con Playwright por debajo) mediante comandos de línea: es lo que abre la aplicación de verdad y captura las pantallas que se convierten en el video.

Concepto principal

agent-browser no simula la pantalla — usa la aplicación. Cada screenshot es una captura real del DOM en el estado de ese paso, en el viewport que fijaste.

Es por eso que esta skill muestra una app real, en lugar de explicar un concepto con motion graphics.

✓ Qué hace agent-browser
  • ✓ Abre una URL real en un navegador controlado
  • ✓ Lista elementos interactivos con snapshot -i
  • ✓ Completa, hace clic y toma capturas de pantalla de cada estado
  • ✓ Ejecuta JS mediante eval (p. ej., leer la bbox)
✗ Qué NO es
  • ✗ No renderiza el video (eso lo hace HyperFrames, en T3)
  • ✗ No graba video de la pantalla (ese sería el modo v3, roadmap)
  • ✗ No necesita clave de API ni nube
  • ✗ No anima nada — solo captura el estado real
📦 Requisitos previos para la captura
agent-browser en el PATH
La skill de navegación debe estar disponible en la línea de comandos.
App en línea
La app objetivo debe estar en ejecución, p. ej.: localhost:8000.
Node 22+
O capture.mjs se ejecuta en Node y llama a agent-browser.
2

🔗 Abrir la sesión y navegar a la URL

Fija el viewport, abre la URL y establece el estado. El orden importa: viewport antes de abrir.

Abrir la app (manualmente)
# viewport ANTES de abrir: se convierte en el espacio de las coordenadas
agent-browser establecer viewport 1280 800
agent-browser open http://localhost:8000/
agent-browser snapshot -i # descubre refs @e1, @e2...
💡
La sesión sigue activa entre comandos

Cada comando actúa en la misma pestaña abierta. Tú navegas, actúas, capturas y mides, paso a paso, sin volver a abrir la app en cada llamada.

Equivalente en actions.json (forma automatizada)
{
"url": "http://localhost:8000/",
"viewport": [1280, 800]
}
# capture.mjs establece el viewport y abre con esos valores
3

📑 Referencias @ref y snapshot

O snapshot -i mapea los elementos y asigna refs (@e1, @e2…) — pero se desplazan cuando cambia el DOM.

Flujo de descubrimiento de elementos
1
snapshot -i enumera los elementos interactivos

Cada botón, campo y enlace recibe una referencia (@e6 = textarea, por ejemplo).

2
Actúas según la referencia

agent-browser fill @e6 "texto" llena ese elemento específico.

3
¿Cambió el DOM? Vuelve a capturarlo

Después de «Generar», aparece un enlace de descarga y los refs se desplazan. Vuelve a capturar o cámbialos por un selector estable.

⚠️
Las refs son volátiles

No confíes en @eN cuando el estado cambia entre pasos. En pantallas que cambian mucho, prefiere CSS selectors o {tag,text} — tema del módulo 2.3.

4

🖱️ Acciones: click, fill, scroll, screenshot

El vocabulario básico de cada paso. Cada acción cambia el estado de la pantalla y cada estado se convierte en un screenshot.

Acción Qué hace Estado
fillCompleta input/textarea (CSS selector)funciona
clickHaz clic en un elemento (CSS selector)funciona
captura de pantallaGuarda la pantalla del estado actual en PNGfunciona
evalEjecuta JS en el browser (p. ej., leer la bbox)funciona
desplazamientoDesplázate hasta el objetivo antes de la captura de pantallamanual / roadmap
💡
El desplazamiento sigue siendo manual

O capture.mjs no desplaza la página por su cuenta. En páginas largas, hoy tú diriges agent-browser manualmente (scrollIntoView). Es el elemento n.º 1 del backlog — detallado en el módulo 2.4.

5

📸 Capturar el screenshot de la pantalla

Una captura de pantalla por estado, grabada en assets/shots/NN-id.png. Es la base de la regla de oro: capturar primero, animar después.

Capturar antes, animar después

El render de HyperFrames es determinista (sin red durante el render). Por eso nunca se carga el sitio en vivo en el video: primero capturamos screenshots reales y luego animamos encima.

Capturar un estado
agent-browser fill @e6 "un caballo galopando en la playa"
agent-browser captura de pantalla assets/shots/01-prompt.png
# 1 captura por estado → 02-size.png, 03-height.png, 04-resultado.png ...
🖼️
1 por estado
un shot/paso
📁
assets/shots/
NN-id.png
🎯
Determinístico
sin sitio en vivo
🪟
En el marco
aspecto del navegador
6

📐 Medir el bounding box de un elemento

Mediante eval, leer el getBoundingClientRect() del objetivo. Es el cuadro exacto al que apunta el cursor en el video.

Leer el bbox del objetivo
# bbox en el espacio de la captura de pantalla (relativo al viewport)
agent-browser eval "(()=>{const r=
document.querySelector('textarea').getBoundingClientRect();
return{x:Math.round(r.x),y:Math.round(r.y),
w:Math.round(r.width),h:Math.round(r.height)}})()" --json
# resultado: {"x":129,"y":252,"w":482,"h":96}
⚠️
eval --json viene anidado

El resultado queda en data.result (no en result). O capture.mjs ya se encarga de eso, pero conviene saber si hay que manejarlo manualmente.

💡
Es lo que le da un aspecto profesional

La bbox real (no "a ojo") es lo que hace que el cursor caiga exactamente sobre el botón/campo. El mapeo de la bbox al canvas del video es el tema del módulo 2.3.

7

🖼️ El viewport fijo y por qué importa

El viewport de captura es el espacio de coordenadas de todo. Mantenlo igual para los bboxes y los screenshots; de lo contrario, el cursor fallará el objetivo.

✓ Viewport bien configurado
  • ✓ El mismo viewport para el bbox y la captura de pantalla
  • ✓ Ancho ≤ ~1280 para caber en el canvas 16:9
  • ✓ Si vuelves a capturar, captura todo en el mismo viewport
  • ✓ set viewport antes de open
✗ Viewport desconfigurado
  • ✗ Capturar el bbox y el shot en viewports diferentes
  • ✗ Las pantallas demasiado anchas quedan comprimidas o se desbordan
  • ✗ Volver a capturar solo una pantalla y mezclarla con las antiguas
  • ✗ Abrir la app y fijar el viewport después
📊 Límites de la captura de pantalla en el canvas

Con viewport 1280×800 y la ventana centrada, la captura va de x320..1600 y y148..948 — dentro del canvas 1920×1080. Cambia el viewport y comprueba que no sobrepase los bordes.

🎯 Resumen del módulo

  • ✓ agent-browser = Playwright en la línea de comandos; usa la app real
  • ✓ viewport ANTES de open; snapshot -i da refs @eN volátiles
  • ✓ acciones: fill, click, screenshot, eval (scroll aún es manual/roadmap)
  • ✓ 1 toma por estado en assets/shots/NN-id.png
  • ✓ bbox vía getBoundingClientRect; viewport fijo = espacio de coordenadas
Próximo módulo
2.2
🗺️ El actions.json
Describe la URL, el viewport y los pasos en un solo archivo y deja que el capture.mjs generar los shots y el steps.json.
Ir al módulo 2.2 →