diff --git a/functions/browser/cdp_type_ref.md b/functions/browser/cdp_type_ref.md index f9d85760..d8cf0707 100644 --- a/functions/browser/cdp_type_ref.md +++ b/functions/browser/cdp_type_ref.md @@ -3,10 +3,10 @@ name: cdp_type_ref kind: function lang: go domain: browser -version: "1.0.0" +version: "1.1.0" purity: impure signature: "func CdpTypeRef(c *CDPConn, backendNodeID int, text string) error" -description: "Enfoca el elemento identificado por su #ref del AX outline vía DOM.focus y escribe el texto dado usando CdpTypeText. El #ref es el backendDOMNodeId estable del nodo DOM. El elemento debe aceptar input de texto (input, textarea, contenteditable)." +description: "Enfoca el elemento identificado por su #ref del AX outline vía DOM.focus y escribe el texto dado usando CdpTypeText (carácter a carácter, camino human). El #ref es el backendDOMNodeId estable del nodo DOM. Para el camino rápido (un solo round-trip Input.insertText) hay CdpTypeRefFast. El elemento debe aceptar input de texto (input, textarea, contenteditable)." tags: [cdp, browser, action, ref, humanized, navegator] uses_functions: [cdp_type_text_go_browser] uses_types: [] @@ -49,3 +49,7 @@ Tras `page_perceive` / `render_ax_outline`, cuando el agente quiere escribir en - `DOM.focus` falla si el elemento no es focusable (no es `input`, `textarea`, `contenteditable`, o similar). El error indica el ref y la causa. - Si el elemento necesita un click previo para activarse (algunos inputs con JS custom), combinar con `CdpClickRef` antes de `CdpTypeRef`. - No hace scroll previo — si el elemento no está visible en el viewport el focus CDP puede fallar en algunos navegadores. Combinar con `CdpClickRef` (que sí hace scroll) si hay dudas. + +## Capability growth log + +- v1.1.0 (2026-06-13) — Nueva función hermana `CdpTypeRefFast`: enfoca el #ref e inserta el texto en un solo round-trip (`Input.insertText`) en vez de teclear carácter a carácter. Es el camino rápido del modo automático del MCP (`dom_type_ref` con `mode=auto`); `CdpTypeRef` queda como el camino human (carácter a carácter con pausas aleatorias) para sitios con detección por pulsación. diff --git a/functions/browser/cdp_type_text.md b/functions/browser/cdp_type_text.md index 9413b0e9..ec7ea5d4 100644 --- a/functions/browser/cdp_type_text.md +++ b/functions/browser/cdp_type_text.md @@ -3,11 +3,11 @@ name: cdp_type_text kind: function lang: go domain: browser -version: "1.0.0" +version: "1.1.0" purity: impure signature: "func CdpTypeText(c *CDPConn, text string) error" -description: "Escribe texto en el elemento activo de la pagina caracter por caracter via Input.dispatchKeyEvent. Envia eventos keyDown, char y keyUp por cada caracter con 10ms de pausa entre ellos. Usar CdpClick primero para enfocar el elemento." -tags: [chrome, cdp, browser, automation, keyboard, input, devtools] +description: "Escribe texto en el elemento activo de la pagina caracter por caracter via Input.dispatchKeyEvent (camino human). Envia keyDown+keyUp por cada caracter con una pausa ALEATORIA (15-65ms) que imita el ritmo irregular humano. Para el camino rapido (un solo round-trip, sin teclear) usa CdpInsertText. Usar CdpClick primero para enfocar el elemento." +tags: [chrome, cdp, browser, automation, keyboard, input, devtools, navegator] uses_functions: [cdp_connect_go_browser] uses_types: [] returns: [] @@ -39,4 +39,10 @@ CdpTypeText(conn, "golang websocket") ## Notas -Envia tres eventos por caracter: `keyDown`, `char` (dispara el evento `input` del DOM) y `keyUp`. La pausa de 10ms entre caracteres simula escritura humana y ayuda con inputs que tienen debounce. Para texto largo, considerar inyectar directamente via `CdpEvaluate` con `element.value = "..."` + evento `input`. +Envia dos eventos por caracter: `keyDown` (con `text`, que ya inserta el caracter en Chrome) y `keyUp`. No envia un evento `char` extra: lo duplicaba en sitios que reaccionan a eventos `input` (DuckDuckGo, Google). La pausa ALEATORIA de 15-65ms entre caracteres imita el ritmo irregular humano (reduce deteccion) y ayuda con inputs que tienen debounce. + +Para el camino rapido del modo automatico hay `CdpInsertText` (todo el texto en un solo `Input.insertText`, sin keyDown/keyUp por tecla) — mucho mas rapido, pero sitios que validan pulsacion a pulsacion pueden no reaccionar. Para texto largo donde no importa el sigilo, `CdpInsertText` es preferible. + +## Capability growth log + +- v1.1.0 (2026-06-13) — La pausa entre caracteres pasa de 10ms fija a aleatoria 15-65ms (ritmo no-máquina). Nueva función hermana `CdpInsertText`: inserta todo el texto en un solo round-trip (`Input.insertText`) para el modo automático rápido. Se extrajo el chequeo de foco a `assertEditableFocus` (compartido). diff --git a/functions/browser/cdp_wait_load.md b/functions/browser/cdp_wait_load.md index cbbaae96..f225cbc0 100644 --- a/functions/browser/cdp_wait_load.md +++ b/functions/browser/cdp_wait_load.md @@ -3,11 +3,11 @@ name: cdp_wait_load kind: function lang: go domain: browser -version: "1.0.0" +version: "1.1.0" purity: impure signature: "func CdpWaitLoad(c *CDPConn, timeout time.Duration) error" -description: "Espera a que la pagina actual termine de cargar completamente. Hace polling de document.readyState via Runtime.evaluate cada 200ms hasta que sea \"complete\", o hasta que se agote el timeout. Retorna error inmediato si CdpEvaluate falla (la conexion puede estar rota)." -tags: [chrome, cdp, browser, automation, wait, polling, devtools, readystate, load] +description: "Espera a que la pagina actual termine de cargar completamente. Bloquea hasta recibir el evento CDP Page.loadEventFired (sin polling), con un fast path inicial de document.readyState: si ya esta complete, retorna de inmediato. Retorna error si se agota el timeout o si no logra habilitar el dominio Page." +tags: [chrome, cdp, browser, automation, wait, event, devtools, readystate, load, loadeventfired, navegator] uses_functions: [cdp_evaluate_go_browser] uses_types: [] returns: [] @@ -42,6 +42,10 @@ html, _ := CdpGetHTML(conn) ## Notas -A diferencia de `CdpWaitElement`, que ignora errores de `CdpEvaluate` durante el polling (la pagina puede aun no estar lista), `CdpWaitLoad` retorna el error inmediatamente porque un fallo en `document.readyState` indica una conexion rota, no una condicion transitoria. +Bloquea esperando el evento CDP `Page.loadEventFired` (sin polling). Antes de esperar hace un fast path con `document.readyState`: si la página ya está `complete`, retorna de inmediato sin armar el handler. Tras suscribir el evento re-chequea `readyState` una vez más para no perder la carga por una carrera entre el fast path y el registro del handler. Habilita el dominio `Page` vía `ensurePage` (cacheado por conexión, idempotente). Si `timeout <= 0` usa 30s por defecto (mas largo que `CdpWaitElement` porque la carga completa de red puede tardar mas que la aparicion de un elemento DOM). + +## Capability growth log + +- v1.1.0 (2026-06-13) — De polling de `document.readyState` cada 200ms a esperar el evento `Page.loadEventFired` (vía `OnEvent` + canal con timeout), con fast path inicial de `readyState`. Elimina los round-trips de polling y la cuantización de ±200ms: si la página ya está cargada retorna en microsegundos.