◤ voltolini.space / browser
NOMOS · Browser 0.6.1 MIT

BROWSER

O navegador do seu agente, com você na sala.

Dar um navegador a um agente de IA é dar a ele o poder de comprar, enviar e apagar no seu nome. O NOMOS Browser separa o que você já autorizou do que precisa do seu consentimento agora, e mostra a diferença numa tela onde você pode interromper a qualquer momento.

A Gi vive ao lado da sua navegação. Clique no ícone NOMOS e o painel lateral abre já conectado, sem colar token e sem terminal. É só conversar: pergunte e ela responde ali mesmo, peça uma tarefa e ela navega, executa e volta com a resposta. Você vê o agente trabalhar com o alvo destacado na própria página, aprova ao lado do que está acontecendo, alterna ASK/AUTO, pausa, assume o volante e audita. Quando quiser assumir de vez, o modo controle total deixa a Gi agir sem pedir permissão, com aviso claro na tela.

Código aberto sob MIT, em github.com/Voltolini-SPACE/nomos-browser.

O problema

Confiança cega ou paralisia. As duas saídas são ruins.

Confiança cega significa descobrir depois. Perguntar tudo significa treinar o dono a clicar "sim" sem ler, e uma aprovação que virou reflexo não protege ninguém.

Política

O que o agente pode, decidido por você. Fail closed: o que não foi permitido não roda.

Autonomia

Dentro do permitido, o que passa direto e o que para para perguntar.

Trilha

Toda ação gravada, encadeada por hash e selada no fim da sessão.

Dois modos

Perguntar, ou agir sem perguntar

ASK

O agente lê a página à vontade. Antes de cada ação que muda alguma coisa, ele para e pergunta, dizendo o que vai fazer, onde, e qual a consequência.

Ler nunca pergunta. Perguntar para ler é ruído, e ruído ensina você a aprovar sem prestar atenção.

AUTO

O agente executa sozinho o que sua política já permite. "Agir sem perguntar" quer dizer isso, e só isso.

Continuam pedindo aprovação: o que envia dado para fora, o que mexe em dinheiro, o que não tem volta.

AUTO não é bypass

Essa é a garantia que sustenta o resto, e ela não é uma promessa de documentação. É a ordem dos portões no código: quando a autonomia decide, tudo que sua política nega já foi recusado. Não existe caminho que transforme um "não" em "sim".

  • Ações irreversíveis pedem aprovação nos dois modos, sempre.
  • Rota sem perfil de risco declarado cai em "sempre aprovar".
  • Aprovar um objetivo não é cheque em branco: em ASK, cada passo do plano volta a pedir permissão.
  • Se a conexão cair, a tela nunca volta dizendo "automático" sem poder provar. Ela mostra estado desconhecido e trata como perguntar.

Rebaixando essa regra de propósito no código, o teste cai. Um teste que não sabe falhar não sabe nada.

Live Agent Console

Você vê o agente trabalhar

A página espelhada, o cursor do agente com o que ele está fazendo agora, o estado da sessão e o histórico de cada ação com nível e duração.

Live Agent Console: a faixa de estado mostra agente gi, sessão #464B, status AGUARDANDO APROVAÇÃO, autonomia PERGUNTAR e ação atual browser.click nível A2. No centro, o pedido de aprovação com ação, onde, nível, consequência, motivo e parâmetros, e os botões NEGAR e APROVAR. Ao fundo, a página espelhada de um portal de pagamento.
Captura do produto rodando, não uma maquete: o console no instante em que o agente para e pergunta. Gerada por scripts/capturar-console.mjs, que sobe o runtime, cria a sessão e fotografa a tela.

# faixa de estado, lida do runtime a cada 700 ms
Agente gi   Sessão #4A2F   Status AGUARDANDO APROVAÇÃO
Autonomia AGIR AUTOMATICAMENTE   Ação atual browser.upload · A2

# mesmo em automático, ainda pergunto:
  browser.task, browser.upload

# o pedido que aparece na tela
  Ação          browser.type
  Onde          página atual
  Consequência  digita num campo da página
  Parâmetros    text: [oculto: 24 caractere(s), C…Z]
  • Quatro controles que funcionam no servidor, não na tela: pausar, cancelar, assumir o controle, parar.
  • Se a tela cair no meio de uma parada de emergência, o servidor termina a interrupção sozinho.
  • Pausado, o agente não age. Mas você continua vendo a página, porque é olhando que se decide se vale retomar.
  • Assumir o volante congela o agente. Devolvê-lo obriga o agente a reobservar antes de agir: a página pode ter mudado enquanto você estava lá.

Segurança

Quem age não autoriza

  • Escopos declarados em toda rota. O perfil de agente não alcança aprovar, delegar autonomia nem retomar depois de uma pausa.
  • Parar, sim. Interromper nunca pode ser mais difícil do que agir, senão o freio fica atrás de uma porta que o acelerador não tem.
  • Aprovação de uso único, amarrada à ação, à sessão e aos argumentos exatos. Aprovar um clique em "Cancelar" não autoriza um clique em "Confirmar compra".
  • Segredos não aparecem na tela de aprovação, na trilha nem no replay.
  • Conteúdo de página é dado, não instrução. Uma página que manda o agente ignorar suas ordens é conteúdo classificado.
  • Replay somente leitura, garantido pela tabela de rotas e não por um botão escondido.

O produto não diz "100% seguro". Nenhuma medida sustenta isso. O modelo de ameaça é publicado com os resíduos declarados, incluindo que o selo do replay é hash sem chave.

Prova, não promessa

O que foi medido

824
testes automatizados, 42 arquivos
106
casos ponta a ponta, Chromium real
6
demos reproduzíveis a cada validação
14/14
sala limpa, a partir de clone novo

Nenhum p99 aparece aqui. Trinta amostras não sustentam um p99, então o instrumento devolve nulo e explica por quê. Publicar o número redondo seria mais bonito e menos verdadeiro.

Seis defeitos que os próprios testes acharam

O mais assustador: a amarra que liga uma aprovação aos argumentos usava JSON.stringify(args, chaves.sort()). O segundo parâmetro do JSON.stringify não ordena, ele filtra, e descarta tudo que está aninhado. Clicar em "Cancelar" e clicar em "Confirmar compra" produziam a mesma assinatura.

Encontrado por um teste escrito para desconfiar da própria implementação, e corrigido antes de qualquer uso real.

Integrações

Um contrato, várias portas

MCP

16 ferramentas, sem acoplamento a modelo. No NOMOS, entra como capacidade governada pela política do dono.

REST e WebSocket

API v1 e eventos ao vivo. A interface é servida pelo próprio runtime, na mesma origem.

CLI e SDK

nomos-web com oito comandos. Sessão criada por ele nasce sem capacidade sensível.

Integrado também à Gi, o assistente de voz do ecossistema, com cancelamento por interrupção de fala.

Começar

Instalar como usuário

Único requisito: Node 22.18 ou mais novo. O instalador cuida do resto: Chromium, detecção do Ollama, CLI nomos-browser e início no login. Depois, clique no ícone NOMOS: o painel abre ao lado da página já conectado. É só conversar com a Gi. Sem colar token, sem terminal.

# baixe o release em github.com/Voltolini-SPACE/nomos-browser/releases
tar -xzf nomos-browser-v*.tar.gz && cd nomos-browser-v*/
bash packaging/release/install.sh

# dia a dia
nomos-browser start · stop · status · logs

Ou clonar, instalar, rodar (desenvolvimento)

Não há passo de build: o runtime executa TypeScript nativamente.

# o produto
git clone https://github.com/Voltolini-SPACE/nomos-browser
cd nomos-browser
npm ci
npx playwright install chromium

# a suíte inteira, do jeito que a CI roda
npm test

# o runtime. ele imprime a porta (padrão 127.0.0.1:7777)
# e o caminho do token de controle
npm run daemon

O console fica na raiz do runtime e exige o token: http://127.0.0.1:7777/?token=<TOKEN>. O token vive em ~/.nomos-browser/control-token com permissão 0600; se estiver legível por outros, o runtime recusa usá-lo.

Estado

Estável, e com os limites ditos assim mesmo

  • Validado em macOS com Apple Silicon. Outras plataformas ainda não foram medidas, e por isso não são anunciadas. Marcar uma versão como estável não mede nenhuma delas.
  • Não há rota HTTP para emitir token com escopo. Existe na API interna.
  • Nenhum percentil p99 é reportado, em nenhum caminho.
  • Código aberto sob MIT. A licença cobre o código, não as marcas nem os tokens de identidade visual.

Um produto que esconde o que não faz gasta a confiança de quem descobre sozinho depois.