Como ver o que o seu agente de código executa nos seus servidores
Seu agente está em um servidor de produção e o terminal só diz que ele está chamando uma ferramenta. Qual comando ele rodou, e o que a máquina respondeu? A transcrição conta depois. Veja como tornamos isso visível enquanto acontece, o que tentamos primeiro e como conseguir o mesmo sem o nosso app.
Você pergunta a um agente DevOps por que a API de produção está lenta. Ele começa a trabalhar. No terminal dele aparece uma linha dizendo que está chamando uma ferramenta, depois outra, depois outra. Seis chamadas depois, ele avisa que o disco está 97 % cheio e oferece limpar a pasta de logs.
O que ele realmente rodou naquela máquina? Qual du, qual find, ele já apagou alguma coisa? A resposta existe, mas está na transcrição da sessão, escrita em JSON, e você a lê depois do fato. Em um notebook, tudo bem. Em um servidor de produção, depois do fato é tarde demais para dizer "espera, essa pasta não".
Nós desenvolvemos o AgentsRoom, um app desktop que roda agentes de código e dá a eles ferramentas para chegar aos seus servidores, bancos de dados e clusters. Esta é a história de como tornamos essas chamadas visíveis enquanto acontecem, a versão que não funcionou, os números por trás da que funciona e como conseguir o mesmo se você não usa o nosso app.
A resposta curta
- O CLI mostra que uma ferramenta rodou, não a sessão do outro lado. O comando completo e a saída dele vão para a transcrição no seu disco.
- Para acompanhar ao vivo, algo precisa registrar cada chamada no momento em que ela começa, não quando a sessão termina.
- Um registro por conexão funciona. Uma aba de terminal por comando, não. Medimos 166 comandos remotos em uma única sessão.
- Mantenha esse registro na sua máquina. Uma linha de comando em um servidor de produção carrega segredos e dados de clientes.
- Sem o nosso app: um hook do Claude Code que acrescenta cada comando de shell a um arquivo resolve a maior parte, e a transcrição dá o resto.
Por que a transcrição não basta em um servidor
O Claude Code, o Codex e os outros CLIs registram tudo, sim. O Claude Code grava um arquivo JSONL por sessão em ~/.claude/projects/, o Codex um em ~/.codex/sessions/. Cada chamada de ferramenta está lá, com a entrada e o resultado.
O problema não é a completude, é o momento e a forma. A transcrição é escrita para o CLI, para ele poder retomar uma sessão. Você a lê quando o agente já parou, garimpando linhas de JSON. Quando três agentes trabalham ao mesmo tempo, você lê três arquivos. E o terminal do agente, o lugar para onde você está olhando de verdade, só mostra um resumo recolhido de cada chamada.
Para código no seu notebook, revisar depois é o ciclo normal: você olha o diff antes de fazer commit. Um servidor não tem diff. Um systemctl restart ou um DELETE tem efeito no instante em que roda.
O que tentamos primeiro, e os 166 comandos
Nossa primeira ferramenta remota para agentes abria uma conexão em uma aba de terminal. Parecia certo: o usuário via a sessão. Falhou de um jeito que não esperávamos.
A ferramenta não dava ao agente nenhuma forma de ler o que acontecia na aba que ele tinha acabado de abrir. Então, no projeto de um usuário, o agente parou de usá-la. A contagem daquela sessão: 16 chamadas à nossa ferramenta de conexão e 166 comandos sshpass executados pela própria ferramenta de shell do agente, com o agente pedindo a senha ao usuário e o usuário colando no chat. Credenciais de produção foram parar em texto puro nas transcrições, no ps aux enquanto cada comando rodava e em um arquivo dentro de /tmp.
A lição não foi "agentes são imprudentes". O agente fez a única coisa que funcionava. Uma ferramenta segura que não deixa o agente fazer o trabalho dele acaba sendo contornada, e o contorno é pior do que não ter ferramenta nenhuma.
Então escrevemos o ssh_exec: o agente envia um comando, o AgentsRoom o executa na conexão salva com a senha guardada no app e devolve a saída e o código de saída. O agente nunca vê a credencial e não tem motivo nenhum para montar uma linha sshpass.
Isso resolveu o problema de segurança e criou um de visibilidade. Se cada ssh_exec abrisse uma aba, aquela sessão teria gerado 166 abas. Por isso o ssh_exec não abria nenhuma, e durante dois meses o único lugar para ver esses comandos foi, de novo, a conversa do agente.
Um registro por conexão
A versão que lançamos em 29 de outubro de 2026 (AgentsRoom 1.242.0) mantém uma regra: nenhuma aba por comando. Em vez disso, cada chamada cai em um registro, um por conexão.
- A aba Atividade do painel direito, ao lado de Ficheiros, Alterações e Testes, lista em cards as conexões que os agentes tocaram (último comando, agente, horário, estado) e as 40 chamadas mais recentes em uma linha do tempo. Ela filtra por agente e pesquisa nos comandos, nos nomes das conexões e na saída.
- O registro de uma conexão se lê como um terminal:
agente · horário, depois$ comando, depois a saída, depoisConcluído · código 0 · 1,2 s. A saída SSH rola ao vivo e a visão acompanha o final até você rolar para cima. Um botão copia o registro inteiro como texto. - Pastilhas no cabeçalho do agente, uma por servidor, banco de dados ou cluster que aquele agente tocou, com um ponto verde durante uma chamada. Um clique abre aquele registro.
- Um selo Agente trabalhando na linha da conexão nas janelas Servidores, Bancos de dados e Kubernetes, só enquanto uma chamada roda.
O registro é somente leitura. Para você mesmo digitar na máquina, a aba SSH da janela Servidores continua sendo a porta de entrada. A página completa da funcionalidade é a do gerenciador de conexões SSH, e a parte de bancos de dados está em conexões de banco de dados.
O que é registrado, e o que não é
| Chamada | No registro | Por quê |
|---|---|---|
ssh_exec (SSH, AWS SSM, WinRM) | Sim | O caso principal: um comando em uma máquina remota, sem aba própria |
ssh_transfer | Sim | Um arquivo copiado para um servidor ou de um servidor é uma ação nesse servidor |
db_query, db_schema | Sim | O SQL do jeito que o agente escreveu, e as primeiras linhas do resultado |
kube_kubectl | Sim | Aparece como a linha kubectl com os argumentos |
commands_run, ssh_connect | Não | Eles já abrem uma aba de terminal que você pode acompanhar |
A própria ferramenta de shell do agente (ssh, psql, kubectl digitados direto) | Não | Não passa pelo AgentsRoom: está no terminal e na transcrição do agente |
A última linha é o limite honesto. O registro vê o que passa pelas nossas ferramentas. Se você quer que cada ação remota apareça ali, as ferramentas precisam ser o caminho mais fácil para o agente, que é a lição dos 166 comandos.
Mais um detalhe: só o SSH transmite a saída enquanto o comando roda, porque passa por um terminal real na sua máquina. Os resultados de WinRM, SQL e kubectl aparecem quando a chamada termina.
Quanto custa manter o registro
Nossos usuários rodam muitos agentes ao mesmo tempo: 45 agentes em 18 projetos em uma máquina, 48 consoles em outra. Tudo o que é contado por agente ou por pedaço de saída é multiplicado por esses números, então o registro tem limites fixos:
- 120 chamadas por projeto, as mais antigas saem primeiro.
- 32.000 caracteres de saída por chamada, mantendo o final, que é onde ficam os erros e os códigos de saída.
- 2.000 caracteres de comando ou de SQL por chamada.
- Uma mensagem de atualização por chamada a cada 120 ms para a saída ao vivo, nunca uma por pedaço de saída do terminal.
- Nenhum timer em repouso. Enquanto nenhum agente chama uma ferramenta remota, o registro não custa nada.
A gravação acontece em um único ponto: a ponte por onde passam as chamadas de ferramenta de todos os CLIs. É por isso que funciona do mesmo jeito para Claude Code, Codex, Antigravity CLI ou qualquer outro CLI que o app roda, sem código por provedor.
O limite que escolhemos: nada sai da máquina
O registro fica na memória do app desktop e desaparece quando você o fecha. Ele não é sincronizado com os nossos servidores, o que é incomum para nós: quase todo o resto do AgentsRoom acompanha a sua conta de um computador para outro.
Este não, de propósito. A saída de um env em um servidor contém segredos. Um SELECT em uma tabela de clientes contém dados de clientes. Uma ferramenta feita para tornar essas coisas visíveis não deveria, além disso, copiá-las para outro lugar.
O celular pode acompanhar o mesmo registro pelo perfil do agente (app mobile 2.47 ou superior). O fluxo vai do seu computador para o seu celular pela conexão criptografada de ponta a ponta, os segredos são mascarados antes de sair (chaves de API, pares CHAVE=valor, senhas em URLs, tokens) e nada é armazenado em servidor. A mesma chamada também continua legível na conversa do agente, como antes.
Os audit logs do Claude Code são outra coisa
Se você pesquisou "Claude Code audit log", provavelmente encontrou a Compliance API da Anthropic para o Claude Enterprise: um feed de atividade, eventos de audit log e, para sessões locais conectadas à conta Enterprise, as transcrições das sessões. Ela é feita para administradores e equipes de compliance, cobre a organização e é lida depois do fato.
Isso responde a "quem na empresa fez o quê com o Claude". Não responde a "qual comando o meu agente está rodando agora no servidor de banco de dados". As duas coisas podem coexistir, e se você trabalha em uma empresa com exigência de compliance, provavelmente precisa da primeira, seja lá o que você use para a segunda.
Se você não usa o AgentsRoom
Dá para conseguir boa parte disso com o que os CLIs já oferecem.
Registre cada comando de shell no momento em que ele começa. Os hooks do Claude Code podem rodar um comando antes de cada chamada de ferramenta. O guia de hooks mostra o padrão: um hook PreToolUse na ferramenta Bash que envia jq -r .tool_input.command para um arquivo de log. Rode tail -f nesse arquivo em um segundo terminal e você vê cada comando no instante em que o agente o envia, incluindo as linhas ssh.
Leia a transcrição quando precisar da saída. O hook dá o comando, não o que o servidor respondeu. Para isso, o arquivo de sessão em ~/.claude/projects/ (ou ~/.codex/sessions/ no Codex) tem o resultado completo de cada chamada.
Dê ao agente uma conta própria no servidor. Um usuário dedicado torna cada conexão atribuível no log de autenticação do servidor, e se os seus servidores rodam auditd, uma regra em execve para esse usuário registra cada processo que ele inicia, do lado do servidor, onde o agente não consegue pular.
Mantenha as credenciais fora do alcance do agente. Se a única forma de conectar é uma senha que o agente precisa pedir a você, você vai ver linhas sshpass no chat. Use uma chave que o agente nunca lê, ou uma ferramenta que guarda o segredo por ele. Escrevemos um guia separado sobre como dar um segredo a um agente sem colocá-lo no prompt.
O que essa montagem não dá é a ligação entre as três coisas: qual agente, em qual conexão, com qual saída ao vivo, em um só lugar. Essa é a parte que construímos.
As perguntas que realmente nos fazem
Dá para ver o que o Claude Code está fazendo em um servidor remoto enquanto ele trabalha?
No terminal você vê a chamada de ferramenta e, quando ela termina, um resultado resumido. O comando completo e a saída dele são gravados na transcrição da sessão no seu disco, que você lê depois. Para acompanhar ao vivo, é preciso algo que registre cada chamada no momento em que ela começa: um hook do Claude Code que grava cada comando Bash em um arquivo de log, ou um app que executa as chamadas remotas pelo agente e as mostra ao vivo, que é o que a aba Atividade do AgentsRoom faz.
Onde o Claude Code guarda o registro dos comandos que executou?
Na transcrição da sessão, um arquivo JSONL em ~/.claude/projects/, uma pasta por projeto e um arquivo por sessão. Cada chamada de ferramenta é uma linha com a entrada e o resultado. O Codex mantém um arquivo parecido por sessão em ~/.codex/sessions/. Os dois são completos, e os dois são escritos para o CLI retomar uma sessão, não para uma pessoa ler por cima.
Isso é a mesma coisa que os audit logs do Claude Code?
Não. Os audit logs que as pessoas procuram com esse nome são os registros no nível da organização que a Anthropic oferece no plano Enterprise pela Compliance API: um feed de atividade, eventos de auditoria e, para sessões conectadas à conta, as transcrições, lidas mais tarde por um administrador. Eles respondem a quem fez o quê na organização. Uma visão ao vivo dos comandos em um servidor é outra ferramenta, para outra pessoa.
Por que não abrir uma aba de terminal para cada comando que o agente executa?
Seguimos esse caminho e medimos: um agente trabalhando em um incidente de produção disparou 166 comandos remotos em uma única sessão. Uma aba por comando deixa a barra de abas inútil em dez minutos. O que funciona é um registro por conexão, em que cada chamada é uma entrada com o comando, a saída ao vivo, o código de saída e a duração.
O AgentsRoom envia os comandos e a saída deles para um servidor?
Não. O registro fica na memória do app desktop, limitado a 120 chamadas por projeto, e some quando você fecha o app. O celular pode acompanhá-lo pelo perfil do agente (app mobile 2.47 ou superior): o fluxo vai do seu computador para o seu celular pela conexão criptografada de ponta a ponta, com os segredos mascarados, e nada é armazenado em servidor.
Quais comandos do agente a aba Atividade não mostra?
Só são registradas as chamadas que passam pelas ferramentas do AgentsRoom: ssh_exec, ssh_transfer, db_query, db_schema e kube_kubectl. Um comando que o agente roda com a própria ferramenta de shell, como uma linha ssh ou psql digitada direto, está no terminal e na transcrição dele, mas não no registro. commands_run e ssh_connect ficam de fora de propósito, porque já abrem uma aba de terminal que você pode acompanhar.
A versão curta
Um agente em um servidor precisa de duas coisas de você: uma forma de trabalhar que não passe pela sua senha, e uma forma de você ver o que ele faz enquanto faz. A primeira sem a segunda deixa você lendo JSON depois do fato. A segunda sem a primeira acaba contornada por um agente que cola linhas sshpass.
Chegamos a um registro por conexão, com limites, mantido na sua máquina. Se quiser experimentar, o AgentsRoom é grátis para baixar, e a página de conexões SSH mostra a configuração passo a passo. Se preferir ficar só com o seu CLI, comece pelo hook PreToolUse e um tail -f: leva cinco minutos e você nunca mais vai se perguntar quais foram as seis últimas chamadas de ferramenta.
Baixar AgentsRoom
Rode todos os seus agentes de IA, em todos os seus projetos, de uma única janela.
App complementar: acompanhe seus agentes em qualquer lugar
Use Claude, Codex, Antigravity CLI ou outro provedor de IA.
Envie bugs e pedidos direto para o seu backlog público.
Continue lendo
Manter o Claude Code rodando após uma queda do SSH: a receita com tmux
Mantenha o Claude Code ativo após uma queda do SSH com tmux. Volte ao mesmo processo, confira a persistência e use a opção opcional do AgentsRoom.
Leia o artigoVocê Ainda Deve Revisar o Código do Seu Agente de IA?
Seus agentes escrevem um código melhor do que metade dos pull requests que você costumava mesclar. Então, você ainda lê cada linha? O caso honesto para ambos os lados, os 10 sinais que indicam que um agente cometeu um erro e quanto cada mudança realmente merece revisão.
Leia o artigoComo dar um segredo a um agente de código sem nunca colocá-lo no prompt
Um agente precisa de uma chave da Stripe ou de uma senha de banco de dados para rodar o comando dele. Você cola no chat e ela vai parar na transcrição no seu disco, no provedor do modelo e às vezes em um commit. A regra a que chegamos depois de três erros nossos: um segredo chega a um agente por uma variável de ambiente e por mais nada.
Leia o artigo