AgenticAI — UI de agente con WebView2
Fuente: samples/AgenticAI/agenticai.prg (+ agenticai.hbp, build.bat)
AgenticAI es un front-end GUI de FiveWin para el motor agéntico ccharbour.
Ejecuta el mismo bucle de chat en streaming + llamadas a herramientas que mueve la
consola cc.exe (CC_Client / CC_AgentRun), pero lo
renderiza como un panel de chat web moderno alojado en un Edge
WebView2 (TWebView2) embebido
que llena un diálogo redimensionable — sin RichEdit, sin .rc.
Qué muestra el panel
- Burbujas en streaming — la respuesta llega en vivo como texto
plano; al terminar el turno el markdown se re-renderiza (tablas, bloques de código,
listas) con
marked.js. - Panel colapsable "N acciones" — filas por herramienta con iconos (archivo / terminal / búsqueda / globo / memoria), un indicador pendiente que pasa a check verde, o X roja si hay error.
- Tarjeta permitir / rechazar — con "Auto-aprobar" desactivado,
cada herramienta mutante (
shell/write/edit) muestra una tarjeta de confirmación y el turno se bloquea hasta que decides. - Tarjeta ask_user — una pregunta de opción múltiple conectada al webview (sustituye al selector de consola de ccharbour, inservible sin consola).
- Barra "Código generado" con un botón Ver Cambios (Diff) que renderiza el diff de ccharbour con líneas rojas/verdes.
- Comandos slash —
/key <api-key>fija la clave del LLM en caliente, además de/tools,/clear,/help.
Puente PRG ↔ página
PRG dirige la página con oWeb:Eval( jsFunc(...) ); la página responde con
SendToFWH( action, text ), entregado a TWebView2:bOnBind.
Se registra todo el conjunto local de herramientas (read / write / edit / glob / grep /
shell / web_search / web_fetch / memory) envuelto en una puerta de permisos.
Tres trampas que conviene recordar
| Problema | Causa y solución |
|---|---|
| El click permitir / ask / stop bloquea a mitad de turno | WebView2 no entrega una segunda llamada a función vinculada mientras el primer
bOnBind sigue en la pila. Por eso send solo encola el
prompt; un TTimer lanza el turno desde WM_TIMER, fuera de
cualquier bOnBind, donde los clicks anidados permitir/ask/stop sí
se entregan. |
| Acentos / emoji con mojibake | WebView2_Eval convierte su argumento desde la codepage ANSI. Pasa cada
codepoint no-ASCII como literal JS escapado \uXXXX en ASCII puro (pares
sustitutos para emoji) para que sea independiente de codepage. |
| El <script> entero falló en silencio | Un bloque TEXT INTO de Harbour procesa escapes C: '\n' dentro
del JS se volvió un salto de línea real y rompió el string. Mantén el JS embebido sin
backslash — usa String.fromCharCode(10) y regex con clases de
caracteres ([0-9], [ ]) en vez de \n,
\d, \s. |
Compilar y ejecutar
Es multi-módulo (prg GUI + núcleo ccharbour), así que se compila con su propio
build.bat (hbmk2 + agenticai.hbp), no con
samples/build_new.bat. Requiere el runtime de WebView2 instalado y una clave
del LLM (env DEEPSEEK_API_KEY … o /key en caliente).
cd /d C:\fwteam\samples\AgenticAI
build.bat