Saltar al contenido
Agoraby Olimpia
Esc
↑↓navegar↵abrir⌘Jvista previa
En esta página

Flujos de trabajo

Secuencias de herramientas de punta a punta para tareas comunes de agentes en Agora, desde probar una app web hasta correr subagentes en paralelo y pasar un CAPTCHA.

Cada receta muestra las llamadas a herramientas en orden. Los argumentos están abreviados; mirá la referencia de herramientas MCP para ver la lista completa. Con un token de cursor, no hace falta el argumento workspace.

Probar una app web

browser_open(url: "http://127.0.0.1:3000")        → target, and what is visible
browser_fill(target, ref: "e4", text: "test@example.com")
browser_fill(target, ref: "e5", text: "...", submit: true)
browser_audit(target)                              → overflow, contrast, labels, SEO, LCP/CLS, broken links
browser_emulate(target, width: 390, height: 844, mobile: true)
browser_audit(target)                              → the same checks on mobile
browser_emulate(target, width: 0, height: 0)       → reset
cursor_complete(result: {issues: [...]})           → if you are a subagent

Cada fill y cada click devuelven lo que cambió en pantalla, así que no necesitás un snapshot entre pasos. Sacá un browser_screenshot solo para un problema visual que la auditoría no pueda describir.

Extraer datos de una página

browser_open(url: "https://example.com/pricing")
browser_eval(target, expression: "[...document.querySelectorAll('.plan')].map(p => ({name: p.querySelector('h3').textContent, price: p.querySelector('.price').textContent}))")

browser_eval devuelve el valor JSON en una sola llamada. Si la página carga los datos tarde, llamá primero a browser_wait(target, selector: ".plan").

Repartir el trabajo entre subagentes en paralelo

cursor_spawn(name: "acme",   goal: "Open https://acme.com/pricing and return the plans as JSON",
             permissions: ["browser"], launch: {adapter: "claude", model: "claude-haiku-5-5", effort: "low"})
cursor_spawn(name: "globex", goal: "Open https://globex.com/pricing and return the plans as JSON", ...)
cursor_spawn(name: "initech", goal: "...", ...)
cursor_wait(ids: ["cur_a", "cur_b", "cur_c"], timeout_ms: 600000)
                                                   → status, result and usage of each child

Lanzá todos los hijos antes de esperar. Dale a cada uno un goal autosuficiente: los hijos no ven tu conversación. Cada hijo abre su propia ventana, y los hijos que lanza Agora usan el tablero compartido para no duplicar trabajo. Para frenar uno antes de tiempo, cursor_control(id, op: "cancel").

Dividir una lista de tareas

Cuando los hijos comparten una lista (páginas para revisar, filas para chequear), dejá que se coordinen a través del tablero en vez de asignarles los ítems vos:

board_read()                                       → current claims and posts
board_post(kind: "claim", topic: "audit /settings")
                                                   → fails if another cursor holds or finished it: pick another item
... do the work ...
board_post(kind: "finding", topic: "audit /settings", text: "Save button has no label")
board_post(kind: "done", topic: "audit /settings")

Iniciar sesión con ayuda de una persona

browser_open(url: "https://app.example.com/login")
browser_fill(target, ref: "e3", text: "<email the user gave you>", submit: true)
                                                   → CHALLENGE DETECTED, or an MFA prompt
human_request(reason: "Solve the CAPTCHA and enter the MFA code on app.example.com, then return control")
events_wait(types: "control.returned", wait_ms: 30000)
                                                   → repeat on timeout
browser_snapshot(target)                           → continue in the same tab, now logged in

Decile al usuario dónde tomar el control: el dashboard, la URL del visor que da agora open <workspace> o el panel de Paseo. La sesión queda guardada en el perfil del navegador del workspace, así que las sesiones siguientes arrancan ya logueadas.

Manejar una app de escritorio

desktop_launch(command: "gimp", args: ["/var/lib/agora-apps/input.png"])
desktop_windows()                                  → window id and geometry
desktop_screenshot(window: <id>, max_width: 1024)  → orient once
desktop_key(keys: "ctrl+shift+e")
desktop_type(text: "output.png")
desktop_key(keys: "Return")
desktop_screenshot(window: <id>)                   → check the result

Las coordenadas de una captura coinciden con las de desktop_click, salvo que max_width haya escalado la imagen. Usá control_surface(op: "acquire", surface: "win:<id>", ttl_ms: 60000) si otros cursores podrían escribir en la misma ventana. El programa tiene que estar instalado en el host de Agora.

Bifurcar una sesión logueada

Requiere el permiso workspace.

workspace_op(op: "checkpoint", snapshot: true)     → tabs, layout, cursors and a copy of the profile
workspace_op(op: "fork", name: "experiment")       → a new workspace with a copy of the profile and home

Trabajá en el fork sin tocar la sesión original. suspend y resume mantienen un workspace en disco y vuelven a abrir sus pestañas.

Desarrollo en paralelo con worktrees

cursor_spawn(name: "fix-header", goal: "Fix the header overflow on mobile and run the tests",
             permissions: ["browser", "process"],
             worktree: {repo: "/srv/app", branch: "fix-header", base: "main"},
             launch: {adapter: "claude"})

El hijo recibe su propio worktree de git y un rango de puertos (PORT, AGORA_PORT_BASE, AGORA_PORTS), así varios hijos pueden correr servidores de desarrollo en paralelo y probarlos cada uno en sus propias pestañas.

Última actualización el

¿Te ha resultado útil esta página?