Versão: 3.0
Modelo padrão:gemini-2.5-flash-lite-preview-09-2025
Tecnologia: Extensão Chrome (Manifest V3) + Google Gemini API
Autor: Alexandre Junio Canuto Lopes
╔══════════════════════════════════════════════════════════╗
║ AI Browser Assistant — Criado por ║
║ ║
║ Nome: Alexandre Junio Canuto Lopes ║
║ Username: Junio243 ║
║ GitHub: https://github.com/Junio243 ║
║ Email: canutojunio72@gmail.com ║
║ ║
║ "Um agente autônomo que pensa, age e aprende ║
║ enquanto navega pelo seu lado." ║
╚══════════════════════════════════════════════════════════╝
O AI Browser Assistant é uma extensão do Chrome que transforma o Gemini em um agente autônomo capaz de operar o navegador em seu nome. Diferente de um simples chatbot, o sistema planeja, executa ações, se auto-recupera de erros, vê a tela via visão computacional, aprende com o uso e antecipa suas necessidades.
| Capacidade | Descrição |
|---|---|
| 🤖 Agente ReAct | Raciocina → Age → Observa → Corrige (até 10 iterações) |
| 👁 Visão Computacional | Captura screenshot e localiza elementos pela descrição visual |
| 🧠 Memória de Longo Prazo | Armazena dados entre sessões com busca TF-IDF (IndexedDB) |
| 📋 Planejador Hierárquico | Decompõe tarefas complexas em sub-passos com dependências |
| 🛡 Safety Interceptor | Classifica e bloqueia ações de risco antes da execução |
| 🔮 Detecção Proativa | Detecta o contexto da página e sugere ações relevantes |
| ⏰ Agendador Automático | Agenda e executa tarefas recorrentes sem intervenção do usuário |
| ⚡ Workflows Automáticos | Grava, salva e executa sequências automaticamente por URL |
| 🟠 Borda de Controle | Indicador visual laranja quando a IA está no controle |
| 🖱 Cursor Animado | Visualiza em tempo real onde o agente está clicando |
| 🗄 Cache Semântico | Reutiliza resumos de páginas já visitadas (24h) |
| ✂️ Truncamento Inteligente | Limita tokens enviados à API com base no tipo de objetivo |
| 🎯 Detecção de Objetivo | Para automaticamente quando a URL de destino é atingida |
| 🔌 Endpoint Customizável | Suporta qualquer API compatível com OpenAI (Colab, Groq, etc.) |
┌─────────────────────────────────────────────────────────────┐
│ SIDE PANEL (UI) │
│ sidepanel.html + sidepanel.css + sidepanel.js │
│ ┌──────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ │
│ │ Chat │ │Workflows │ │ Agenda │ │Memória │ │Config │ │
│ └──────┘ └──────────┘ └──────────┘ └────────┘ └────────┘ │
└──────────────────┬─────────────────────┬────────────────────┘
│ importa módulos AI │ chrome.runtime messages
▼ ▼
┌──────────────────────────┐ ┌──────────────────────────────┐
│ MÓDULOS AI │ │ BACKGROUND SERVICE │
│ ai/gemini.js │ │ background.js │
│ ai/agent_loop.js │ │ ► Tab management │
│ ai/planner.js │ │ ► Tool dispatcher │
│ ai/memory.js │ │ ► Vision orchestration │
│ ai/safety.js │ │ ► Auto-workflow triggers │
│ ai/vision.js │ │ ► Auto-memory capture │
└──────────────────────────┘ │ ► Alarms (auto-open side) │
└──────────────┬───────────────┘
│ chrome.scripting
▼
┌──────────────────────────────┐
│ CONTENT SCRIPT │
│ content/content.js │
│ ► read_page (DOM Trimmed) │
│ ► click_element + animação │
│ ► fill_input + animação │
│ ► scroll_page │
│ ► agent_start / agent_stop │
│ ► animate_cursor │
│ ► Workflow recorder │
└──────────────────────────────┘
ia claude/
├── manifest.json # Configuração da extensão (MV3)
├── background.js # Service Worker principal
├── DOCUMENTACAO.md # Este arquivo
│
├── ai/ # Módulos de inteligência
│ ├── gemini.js # GeminiChat + OpenAIChat + createChatClient()
│ ├── agent_loop.js # Loop ReAct + Token Truncation + Goal Detection
│ ├── planner.js # Planejador hierárquico de tarefas
│ ├── memory.js # Memória longa (IndexedDB + TF-IDF + Semantic Cache)
│ ├── safety.js # Interceptor de segurança por nível de risco
│ └── vision.js # Motor de visão computacional (Gemini Vision)
│
├── content/
│ └── content.js # Script injetado em todas as páginas (DOM Trim + Cursor + Border)
│
├── sidepanel/
│ ├── sidepanel.html # Interface principal (painel lateral)
│ ├── sidepanel.css # Estilos
│ └── sidepanel.js # Controlador da UI e orquestrador do agente
│
├── popup/
│ ├── popup.html
│ └── popup.js
│
└── icons/
├── icon16.png
├── icon48.png
└── icon128.png
Usuário digita mensagem
│
▼
[sidepanel.js] handleSend()
│
├─► START_RECORDING automático ← Inicia gravação de workflow imediatamente
│
├─► injectMemoryContext()
│ ├─ getCachedPage(url) → existe cache < 24h? → injeta resumo
│ └─ getContext() → memórias relevantes (TF-IDF)
│
├─► isComplexTask()?
│ └─ SIM → showPlanView() → Planner.createPlan() → aprovação
│
├─► agent_start → 🟠 Borda laranja aparece na página
│
└─► agentLoop.run(goal)
│
┌───────┘
│
▼ ── LOOP (máx. 10 iterações) ────────────────────────────────
│
├─[REASON] gemini.sendMessage()
│
├─[ACT] Para cada tool_call:
│ ├─ safety.intercept() → avalia risco
│ ├─ smartTruncateResult() → corta bodyText se > 4.000 chars
│ │ ou omite body em nav-only na 1ª iteração
│ ├─ checkGoalReached() → URL de destino atingida? → PARA LOOP
│ │
│ └─ chrome.runtime.sendMessage(EXECUTE_TOOL)
│ └─ background.js → dispatchTool()
│ ├─ click_element / fill_input → 🖱 Cursor animado
│ ├─ navigate → re-injeta borda laranja na nova página
│ ├─ vision_click → animate_cursor nas coords + debugger
│ └─ demais tools → Tab APIs do Chrome
│
├─[OBSERVE] Resultado retorna ao AgentLoop
│ └─ Erro → _executeWithHealing() → RECOVERY_PROMPT → retry
│
└─ gemini.submitToolResults() → Gemini raciocina novamente
└─ Sem tool_calls → DONE ──────────────────────────────►
agent_stop → 🟠 Borda some
STOP_RECORDING → passos gravados
saveWorkflow(steps) automático ⚡
memory.store(workflow_learning) 🧠
cachePageSummary(url) 🗄
memory.extractAndStore()
Exportações:
| Classe/Função | Descrição |
|---|---|
GeminiChat |
Cliente original da API Google Gemini |
OpenAIChat |
Cliente compatível com qualquer API OpenAI (/v1/chat/completions) |
createChatClient(key, model, opts) |
Factory que escolhe automaticamente o cliente correto |
GeminiChat — Configuração:
- Temperatura:
0.7· Max tokens:8.192· Tool mode:AUTO
OpenAIChat — Converte automaticamente as TOOL_DECLARATIONS do Gemini para o formato functions da OpenAI. Compatível com:
| Provedor | Como usar |
|---|---|
| Google Colab + ngrok | URL do ngrok como endpoint |
| LM Studio (local) | http://localhost:1234 |
| Groq | https://api.groq.com/openai |
| Together.ai | https://api.together.xyz |
| OpenAI | https://api.openai.com |
createChatClient(apiKey, model, {customEndpoint, customModel})
- Se
customEndpointpreenchido → retornaOpenAIChat - Caso contrário → retorna
GeminiChat
Constantes:
MAX_ITERATIONS = 10MAX_TOOL_RETRIES = 3MAX_PAGE_TOKENS = 4.000chars
Novas funções exportáveis:
Reduz tokens enviados à API:
| Situação | Comportamento |
|---|---|
| Objetivo de navegação simples na 1ª iteração | Omite bodyText completamente |
bodyText > 4.000 chars |
Trunca e adiciona nota [truncado: N chars omitidos] |
| Outros casos | Passa sem alteração |
Palavras-chave de navegação simples: abra, abrir, vá para, navegue, acesse, ir para, open, go to
Verifica se a URL atual contém o domínio pedido:
- Extrai domínio de URLs explícitas ou nomes de sites reconhecidos
- Retorna
truelogo apósnavigateouopen_tabse URL bater - Encerra o loop imediatamente ao retornar
true
Auto-recuperação (_executeWithHealing):
| Tipo de erro | Estratégia injetada no Gemini |
|---|---|
element_not_found |
Aguardar, tentar seletor alternativo, rolar |
navigation_error |
Verificar URL, identificar pop-up |
fill_error |
Clicar no campo, seletor alternativo |
generic |
Ler página e tentar diferente |
Detecção de complexidade: ≥2 palavras-chave (organizar, comparar, extrair, relatório, agenda, múltiplas, etc.) ou mensagem > 100 chars.
Formato do plano:
{
"goal": "objetivo resumido",
"estimated_duration": "~5 minutos",
"steps": [
{ "id": 1, "description": "Navegar para o Gmail", "tool_hint": "navigate", "depends_on": [], "reversible": true }
]
}Banco: AIBrowserMemory (IndexedDB) · Store: memories
Índices: type, url, created
Tipos de memória:
| Tipo | Quando criado |
|---|---|
preference |
Usuário expressa preferência |
extracted_data |
Dados extraídos de páginas |
page_summary |
Resumos de páginas visitadas |
workflow_learning |
Workflows gravados (automáticos e manuais) |
conversation |
Trechos importantes de conversas |
Novos métodos — Semantic Cache:
- Normaliza a URL (remove query string e hash)
- Busca
page_summarypara aquela URL com menos de 24h - Retorna o conteúdo em cache ou
null
- Remove entradas antigas para a mesma URL
- Salva novo resumo com
importance: 1
Injeção no contexto:
Se existe cache para a URL atual → injeta como [CACHE SEMÂNTICO] antes das memórias gerais, evitando processar a página novamente.
| Nível | Ferramentas | Comportamento |
|---|---|---|
SAFE ✅ |
read_page, take_screenshot, list_tabs, vision_read |
Executa direto |
LOW 🔵 |
switch_tab, open_tab |
Executa direto |
MEDIUM 🟡 |
navigate, click_element, fill_input, vision_click |
Notifica (manual) |
HIGH 🟠 |
close_tab, replay_workflow |
Pede aprovação (manual) |
CRITICAL 🔴 |
Detectado por padrões | Sempre pede aprovação |
Padrões CRITICAL: checkout, payment, senha, password, cvv, confirmar pagamento, deletar, excluir.
| Método | Descrição |
|---|---|
analyzeScreenshot(image, question) |
Análise em linguagem natural |
findElementCoordinates(image, desc, w, h) |
Retorna {x, y, confidence} |
getClickCoordinates(…) |
Rejeita se confidence < 40% |
Automações no tabs.onUpdated:
- Sugestão proativa — detecta intent por URL e notifica o painel lateral
- Auto-Workflow trigger — se workflow tem
autoTriggercompatível com a URL → enviaAUTO_RUN_WORKFLOW - Auto-Memory capture — após 2,5s: executa
read_page, enviaAUTO_STORE_MEMORY
alarms.onAlarm (Agenda automática):
- Quando o alarme dispara → tenta abrir o side panel (
chrome.sidePanel.open) - Aguarda 1,5s para inicialização → envia
RUN_SCHEDULED_TASK
navigateTab:
Após navegação completa, re-injeta agent_start na nova página → borda laranja persiste ao trocar de site.
DOM Trimming em readPage():
| Elemento removido (clone) | Razão |
|---|---|
<script>, <style> |
Não é conteúdo legível |
<svg>, <canvas>, <iframe> |
Desnecessário para o agente |
<video>, <audio>, <noscript> |
Ruído |
| Comentários HTML | TreeWalker SHOW_COMMENT |
Resultado: texto limpo, colapsado, máximo 6.000 chars (era 8.000).
Ferramentas disponíveis:
| Ferramenta | Funcionamento |
|---|---|
read_page |
DOM trimmed: sem ruído, max 6.000 chars, 60 elementos interativos (id + class + selector) |
click_element |
Cursor 🤖 animado → trilha de pontos → ripple duplo → clickElement() |
fill_input |
Cursor anima até o campo → foco → nativeInputValueSetter → React/Vue compatible |
scroll_page |
4 direções ou scroll até seletor |
get_console_logs |
Intercepta log/warn/error/info, retorna últimos 50 |
highlight_element |
Outline + box-shadow roxo por 3s |
animate_cursor |
Move cursor 🤖 para coordenadas (x, y) com trilha |
agent_start |
Liga borda laranja pulsante + badge "🤖 IA no controle" |
agent_stop |
Desliga borda com fade-out |
Ciclo automático de cada execução:
1. START_RECORDING → grava todas as ações do agente
2. agent_start → borda laranja acende
3. agentLoop.run()
4. agent_stop → borda some
5. STOP_RECORDING → retorna passos gravados
6. saveWorkflow() → salva com nome do objetivo + autoTrigger (hostname)
7. memory.store(WORKFLOW) → converte em memória automaticamente
Abas e funcionalidades:
| Aba | Automação |
|---|---|
| 💬 Chat | Semantic cache injeta contexto de páginas conhecidas |
| ⚡ Workflows | Auto-executados quando URL bate com autoTrigger |
| 🕐 Agenda | Painel abre sozinho quando alarme dispara |
| 🧠 Memória | Auto-captura ao visitar páginas reconhecidas |
| ⚙️ Config | Suporta endpoint customizado OpenAI-compatível |
Configurações de endpoint (⚙️ Config → Endpoint Customizado):
- URL do endpoint (ex:
https://xxxx.ngrok.io) - Nome do modelo (ex:
llama-3.1-8b-instruct) - API Key do endpoint (opcional)
| Estado | Significado |
|---|---|
| Borda laranja pulsante + badge "🤖 IA no controle" | A IA está executando ações na página |
| Borda some com fade | Tarefa concluída |
| Borda persiste ao navegar | Re-injetada automaticamente em cada nova página |
Por que existe? Transparência e segurança — você precisa saber quando a extensão age de forma autônoma com suas credenciais e permissões.
| Elemento | Descrição |
|---|---|
| Bolinha roxa 🤖 | Representação do cursor do agente, desliza suavemente |
| Trilha de pontos | 8 pontos roxos ao longo do caminho percorrido |
| Ripple duplo | Dois círculos se expandindo no ponto de clique |
Por que existe? Visualização em tempo real de onde a IA está clicando — como se outra pessoa estivesse usando o mouse.
| Ferramenta | Tipo | Risco | Descrição |
|---|---|---|---|
read_page |
DOM | SAFE | Lê conteúdo DOM trimmed — sem ruído, max 6k chars |
click_element |
DOM | MEDIUM | Clica por seletor/texto/índice com cursor animado |
fill_input |
DOM | MEDIUM | Preenche campos com cursor animado + eventos React/Vue |
scroll_page |
DOM | SAFE | Rola a página em 4 direções |
get_console_logs |
DOM | SAFE | Lê logs do console (últimos 50) |
highlight_element |
DOM | SAFE | Destaca elemento com brilho roxo |
navigate |
Tab | MEDIUM | Navega para URL (mantém borda laranja) |
open_tab |
Tab | LOW | Abre nova aba |
close_tab |
Tab | HIGH | Fecha aba |
switch_tab |
Tab | LOW | Muda foco de aba |
list_tabs |
Tab | SAFE | Lista abas abertas |
take_screenshot |
Tab | SAFE | Captura JPEG 70% |
wait |
— | SAFE | Aguarda N segundos |
replay_workflow |
— | HIGH | Executa sequência gravada |
vision_click |
Vision | MEDIUM | Localiza e clica por descrição visual com cursor animado |
vision_read |
Vision | SAFE | Analisa screenshot via Gemini Vision |
Agente: vision_click("botão azul Enviar")
│
▼
background.js: takeScreenshot() → JPEG 70%
│
▼
VisionEngine.getClickCoordinates()
└─► Gemini Vision: "Onde está o botão azul Enviar em 1280x800?"
└─► {found: true, x: 640, y: 420, confidence: 0.95}
│
├─ confidence < 0.4? → erro
│
▼
content.js: animate_cursor(640, 420) ← cursor anima até o ponto
│
▼ (aguarda 700ms)
clickViaDebugger(tabId, 640, 420)
├─ chrome.debugger.attach()
├─ mouseMoved → mousePressed → 80ms → mouseReleased
└─ chrome.debugger.detach()
Antes de cada tarefa:
│
▼
getCachedPage(url)
└─ Existe cache < 24h? ──► SIM → injeta [CACHE SEMÂNTICO] no Gemini
(evita processar a página de novo)
│
▼ NÃO (ou após cache)
getContext(url, sessionSummary)
├─ Score = (mesmo domínio × 3) + importância + (recente × 1)
├─ Top-6 memórias por score
├─ Busca TF-IDF com resumo da sessão
└─ Injeta [CONTEXTO DE MEMÓRIA] no histórico do Gemini
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ao final de cada tarefa:
│
├─► cachePageSummary(url, title, summary) → TTL 24h
├─► memory.store(workflow_learning, steps) → aprendizado permanente
└─► memory.extractAndStore(userGoal, ...) → preferências e dados
- Ao salvar um workflow →
autoTriggerarmazena o hostname da página atual - Ao navegar para aquela URL →
background.jsdetecta e enviaAUTO_RUN_WORKFLOW - O painel executa o workflow e notifica com toast
- Badge 🤖 na lista indica workflows com auto-execução ativa
- Ao navegar para página reconhecida (Gmail, Drive, GitHub, etc.)
background.jsaguarda 2,5s → executaread_page- Envia
AUTO_STORE_MEMORYao painel - Toast "🧠 Página memorizada automaticamente"
- Alarme dispara via
chrome.alarms background.jsabre o side panel (chrome.sidePanel.open)- Aguarda 1,5s → envia
RUN_SCHEDULED_TASK - Agente executa a tarefa normalmente
Ferramenta solicitada
│
▼
safety.intercept()
│
├─[SAFE/LOW]──────────────────► Executa
│
├─[MEDIUM] ──► Manual? ──────► Notifica
│ Auto: ────────► Executa
│
├─[HIGH] ────► Manual? ──────► Pede aprovação → Executa/Bloqueia
│ Auto: ────────► Executa
│
└─[CRITICAL]─────────────────► Sempre pede aprovação
└─ Aprovado? ──► Executa
└─ Negado? ──► {error: "BLOQUEADO"}
| Permissão | Finalidade |
|---|---|
activeTab |
Acessar a aba ativa |
tabs |
Gerenciar todas as abas |
storage |
API Key, configurações, workflows |
alarms |
Agendar tarefas recorrentes |
sidePanel |
Abrir o painel lateral |
scripting |
Injetar content script + cursor/borda nas páginas |
notifications |
Notificações do sistema |
debugger |
Injetar eventos de mouse reais via CDP (vision_click) |
<all_urls> (host) |
Operar em qualquer site |
- Google Chrome 114+ (ou Chromium)
- API Key do Google Gemini — obtida aqui
- Opcional: endpoint OpenAI-compatível (Colab, Groq, LM Studio, etc.)
- Abra
chrome://extensions/ - Ative o Modo desenvolvedor
- Clique em Carregar sem compactação
- Selecione a pasta
ia claude
- Clique no ícone → painel lateral abre
- Vá em ⚙️ Config
- Cole sua API Key do Gemini e salve
- Opcional: configure um endpoint customizado (seção "Endpoint Customizado")
- Escolha o modo: Manual ou Autônomo
| Modelo | Uso recomendado |
|---|---|
gemini-2.5-flash-lite-preview-09-2025 |
Padrão — rápido, econômico, ideal para maioria das tarefas |
gemini-2.0-flash |
Mais capaz para tarefas complexas |
gemini-2.0-flash-thinking-exp |
Raciocínio avançado |
gemini-1.5-pro |
Máxima capacidade |
| Modelo | Provedor |
|---|---|
llama-3.3-70b-versatile |
Groq (gratuito) |
llama-3.1-8b-instruct |
LM Studio (local) |
mixtral-8x7b-instruct |
Together.ai |
| Qualquer modelo no Colab | Google Colab + ngrok |
"Abra a Wikipedia"
→ navigate(wikipedia.org) → URL contém "wikipedia" → loop encerra imediatamente
→ Body da página não é enviado à API na 1ª iteração (nav-only)
"Qual o meu saldo no Gmail?" (segunda visita do dia)
→ Cache da sessão anterior é injetado automaticamente → agente não precisa reler a página toda
"Acesse meu Gmail, encontre os e-mails não lidos e faça um resumo dos 5 mais importantes"
→ Planner decompõe → usuário aprova → AgentLoop executa com visão se necessário
- Grave ações em
mail.google.com→ salve como "Checar emails importantes" - Da próxima visita ao Gmail → executa automaticamente com toast ⚡
- Configure endpoint:
https://xxxx-34-123.ngrok.io - Modelo:
llama-3.1-8b-instruct - O agente usará seu Colab em vez da API Gemini paga
AI Browser Assistant v3.0 — Documentação atualizada em 28/02/2026
Criado por Alexandre Junio Canuto Lopes (@Junio243)