AgenticAI — UI de agente com WebView2
Fonte: samples/AgenticAI/agenticai.prg (+ agenticai.hbp, build.bat)
AgenticAI é um front-end GUI do FiveWin para o motor agêntico ccharbour.
Executa o mesmo laço de chat em streaming + chamadas de ferramentas que move o console
cc.exe (CC_Client / CC_AgentRun), mas renderiza-o
como um painel de chat web moderno hospedado num Edge
WebView2 (TWebView2) embutido
que preenche um diálogo redimensionável — sem RichEdit, sem .rc.
O que o painel mostra
- Bolhas em streaming — a resposta chega ao vivo como texto
simples; no fim do turno o markdown é re-renderizado (tabelas, blocos de código, listas)
com
marked.js. - Painel recolhível "N ações" — linhas por ferramenta com ícones (ficheiro / terminal / pesquisa / globo / memória), um indicador pendente que vira check verde, ou X vermelho em caso de erro.
- Cartão permitir / rejeitar — com "Auto-aprovar" desligado, cada
ferramenta mutante (
shell/write/edit) mostra um cartão de confirmação e o turno bloqueia até decidir. - Cartão ask_user — uma pergunta de escolha múltipla ligada ao webview (substitui o seletor de console do ccharbour, inutilizável sem console).
- Barra "Código gerado" com um botão Ver Alterações (Diff) que renderiza o diff do ccharbour com linhas vermelhas/verdes.
- Comandos slash —
/key <api-key>define a chave do LLM em tempo de execução, além de/tools,/clear,/help.
Ponte PRG ↔ página
O PRG conduz a página com oWeb:Eval( jsFunc(...) ); a página responde com
SendToFWH( action, text ), entregue a TWebView2:bOnBind.
Regista-se todo o conjunto local de ferramentas (read / write / edit / glob / grep /
shell / web_search / web_fetch / memory) envolto numa porta de permissões.
Três armadilhas a lembrar
| Problema | Causa e solução |
|---|---|
| O clique permitir / ask / stop bloqueia a meio do turno | O WebView2 não entrega uma segunda chamada de função vinculada enquanto o primeiro
bOnBind ainda está na pilha. Por isso send apenas enfileira
o prompt; um TTimer inicia o turno a partir de WM_TIMER, fora de
qualquer bOnBind, onde os cliques aninhados permitir/ask/stop são
entregues. |
| Acentos / emoji com mojibake | WebView2_Eval converte o seu argumento a partir da codepage ANSI. Passe
cada codepoint não-ASCII como literal JS escapado \uXXXX em ASCII puro (pares
substitutos para emoji) para ser independente de codepage. |
| O <script> inteiro falhou em silêncio | Um bloco TEXT INTO do Harbour processa escapes C: '\n' dentro
do JS tornou-se uma quebra de linha real e partiu a string. Mantenha o JS embutido sem
backslash — use String.fromCharCode(10) e regex com classes de
caracteres ([0-9], [ ]) em vez de \n,
\d, \s. |
Compilar e executar
É multi-módulo (prg GUI + núcleo ccharbour), portanto compila com o seu próprio
build.bat (hbmk2 + agenticai.hbp), não com
samples/build_new.bat. Requer o runtime do WebView2 instalado e uma chave do
LLM (env DEEPSEEK_API_KEY … ou /key em tempo de execução).
cd /d C:\fwteam\samples\AgenticAI
build.bat