5b10b419a2
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
80 lines
2.7 KiB
Python
80 lines
2.7 KiB
Python
"""Pipeline: obtiene el AX tree de un tab Chrome y lo convierte en outline legible."""
|
|
|
|
import argparse
|
|
import sys
|
|
import os
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
|
|
|
from pipelines.cdp_get_ax_tree import cdp_get_ax_tree
|
|
from core.trim_ax_tree import trim_ax_tree
|
|
from core.render_ax_outline import render_ax_outline
|
|
|
|
|
|
def cdp_perceive_outline(
|
|
debug_port: int,
|
|
tab_id: str,
|
|
max_chars: int = 20000,
|
|
) -> str:
|
|
"""Obtiene el AX tree de un tab Chrome y devuelve un outline indentado legible.
|
|
|
|
Compone tres pasos:
|
|
1. cdp_get_ax_tree — obtiene nodos crudos via CDP WebSocket.
|
|
2. trim_ax_tree — poda nodos irrelevantes (ignored, generic sin hijos, etc.).
|
|
3. render_ax_outline — convierte en outline indentado con #ref para accionables.
|
|
|
|
Args:
|
|
debug_port: Puerto de debug remoto de Chrome (ej. 9333).
|
|
Chrome debe estar corriendo con --remote-debugging-port=PORT.
|
|
tab_id: ID del tab CDP. Obtenerlo via GET http://127.0.0.1:{port}/json/list
|
|
o con cdp_list_tabs_go_browser.
|
|
max_chars: Límite de caracteres del outline resultante. 0 = sin límite.
|
|
Default 20000 (~5k tokens), apropiado para context window de Claude.
|
|
|
|
Returns:
|
|
String con el outline indentado. Cada nodo accionable tiene #ref=nodeId
|
|
para que el LLM pueda referenciarlo en acciones posteriores.
|
|
|
|
Raises:
|
|
RuntimeError: Si Chrome no responde, el tab no existe, o falla la conexión WS.
|
|
TimeoutError: Si Accessibility.getFullAXTree no responde en 15s.
|
|
"""
|
|
nodes = cdp_get_ax_tree(debug_port=debug_port, tab_id=tab_id)
|
|
trimmed = trim_ax_tree(nodes)
|
|
return render_ax_outline(trimmed, max_chars=max_chars)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(
|
|
description="Obtiene el outline del AX tree de un tab Chrome via CDP."
|
|
)
|
|
parser.add_argument(
|
|
"--debug-port",
|
|
type=int,
|
|
default=9222,
|
|
help="Puerto de debug remoto de Chrome (default: 9222).",
|
|
)
|
|
parser.add_argument(
|
|
"--tab-id",
|
|
required=True,
|
|
help="ID del tab CDP (campo 'id' de GET /json/list).",
|
|
)
|
|
parser.add_argument(
|
|
"--max-chars",
|
|
type=int,
|
|
default=20000,
|
|
help="Límite de caracteres del outline. 0 = sin límite (default: 20000).",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
try:
|
|
outline = cdp_perceive_outline(
|
|
debug_port=args.debug_port,
|
|
tab_id=args.tab_id,
|
|
max_chars=args.max_chars,
|
|
)
|
|
print(outline)
|
|
except (RuntimeError, TimeoutError) as e:
|
|
print(f"Error: {e}", file=sys.stderr)
|
|
sys.exit(1)
|