/dash abre no navegador um grafo ao vivo do runtime. Cada agent, cada requisição de LLM, cada chamada de tool, cada skill que ativa, cada servidor MCP, cada padrão do harness que dispara, cada job em background e cada conexão de saída é um nó; uma aresta pulsa toda vez que algo acontece nela.
É telemetria de ponta a ponta sem configuração: sem collector, sem agente, sem conta. Vem desligada por padrão e não custa nada enquanto está desligada.

Ao vivo: as arestas pulsam e o feed acompanha conforme as coisas acontecem; / busca no grafo (aqui a tool shell), e restringe o feed a erros. (Dados sintéticos.)
Como abrir
/dash funciona com um turno rodando (digite no meio da execução) e via ACP, onde o endereço volta para o chat da IDE.
O navegador só abre a partir de um terminal interativo. De um daemon, de um pipe ou de uma IDE, o endereço é impresso.
Ela enxerga todos os processos, não só este
Abrir a dash faz todo processo chatcli da máquina começar a reportar: o REPL onde você digitou/dash, um segundo terminal, o daemon do gateway, o agent ACP dentro da sua IDE, o servidor MCP que outro cliente está dirigindo, o daemon do scheduler. Cada um é uma faixa na página.
É para isso que existe o chatcli dash: o agent ACP, o servidor MCP e os daemons não têm prompt onde digitar /dash, e o stdout deles é um stream de protocolo. Uma dash em outro terminal é a única janela para dentro deles.
Como a gravação liga e desliga
- Quem serve uma dash mantém renovado um pequeno arquivo de lease em
~/.chatcli/pulse/. - Todo processo chatcli confere esse lease a cada dois segundos. Enquanto ele não expira, o processo grava no próprio spool.
- O lease só é renovado enquanto um navegador está de fato consultando. Feche a aba e, cerca de 30 segundos depois, todos os processos voltam ao silêncio sozinhos. Nada fica ligado por acidente.
.env passa a valer no /reload.
O que você vê
Sessões e agents são um nó cada, ligados pelo pai real, então um dispatch multi-agent aparece como árvore. Todo o resto é um hub agregado por nome (a tool@coder, o servidor MCP github, o padrão self-refine) mostrando chamadas, quantas estão ativas agora, erros e latência média. O grafo fica estável e dispara, em vez de explodir em um nó por chamada.
Os sete padrões, com desfecho
Self-Refine, CoVe e Reflexion rodam em silêncio: reescrevem a saída de um worker, marcam uma discrepância ou enfileiram uma lição sem imprimir uma linha. A dash mostra não só que o padrão disparou, mas o que ele concluiu.
Um padrão desligado, ou cujos guards rejeitam o resultado, não fez nada e fica apagado.
Os rótulos de desfecho são fixos e em inglês: são escolhidos pelo código, nunca são saída do modelo.
Coisas fáceis de não perceber sem ela
- Uma compaction parece um travamento. A compaction do histórico resume a conversa com uma chamada de LLM própria e segura o turno pelo tempo que isso levar. Na dash ela é um span
compactionque termina comappliedouskipped. - Um diálogo de permissão que ninguém respondeu. Via ACP/MCP ele aparece como uma chamada
client:session/request_permissionque não termina. - O dev server que você subiu há uma hora. Os processos do
@procsão reapresentados quando a dash abre, então aparecem mesmo tendo começado muito antes. - Qual worker gastou as requisições. Cada requisição de LLM fica pendurada no agent que a fez.
Usando a página
Cada processo é uma janela própria. Arraste-a pela barra de título para pô-la onde quiser: ela fica onde você soltar, então três processos que você quer acompanhar juntos podem ficar lado a lado, e as janelas que você não tocou se empilham pelo tamanho real e contornam as que você posicionou. Janelas podem se sobrepor; a tocada por último fica por cima e é dona dos cliques. Duplo clique na barra de título devolve a janela à pilha. Arraste qualquer nó para posicioná-lo onde quiser: ele fica ali, as arestas acompanham, o resto da coluna se fecha e a janela do processo se estica para continuar abraçando o nó, empurrando a janela seguinte para baixo em vez de cobri-la. Para mover um tipo inteiro de uma vez (todas as skills, todas as tools), arraste o cabeçalho dele, o rótulo⠿ SKILL acima do primeiro card, ou use Shift+arrastar em qualquer card do tipo; os cards que aparecerem depois entram no grupo onde você o deixou. Os cards nunca se sobrepõem: o que você moveu por último fica no lugar e o que estiver no caminho desce. Dê duplo clique num card posicionado ou num cabeçalho movido para devolvê-lo ao layout automático, ou use Reorganizar para fazer isso com tudo. Arraste o fundo para mover a vista, role para dar zoom, 0 ou Ajustar para enquadrar, Espaço ou Pausar para congelar, clique num nó para ver detalhes. Funciona com mouse, toque e caneta. Os chips no topo mostram e escondem processos; a legenda embaixo mostra e esconde tipos de nó.
O visual é uma escolha deliberada: um terminal escuro, a paleta da apresentação do ChatCLI (âmbar, ciano, violeta e verde sobre um fundo quase preto, mono do início ao fim). O cabeçalho é a barra de título de um terminal do macOS com uma linha fina de atividade; cada processo é uma janela de terminal própria; o feed é um $ tail -f do log. Só um tema de terminal claro reveste o chrome de outro jeito, porque um terminal claro precisa de uma página clara; um tema escuro mantém a paleta da apresentação. O idioma segue o do seu terminal.
De relance. Seis tiles somam o que os processos exibidos reportam: custo da sessão, requisições, nós ativos, a janela de contexto mais cheia, erros (com o último minuto ao lado) e eventos por segundo com sparkline. A barra de título de cada janela carrega o próprio custo, requisições, ocupação do contexto e contagem de erros.
Achando as coisas. / foca a busca: todo nó que não casa esmaece, os que casam brilham (um agent casa pelo nome ou pela ação atual). e, o tile de erros ou Só erros restringe o feed a erros; o seletor de kind restringe a um tipo. Kinds escondidos e filtros do feed ficam lembrados por navegador. Todo hub de modelo mostra o acerto do prompt cache da última requisição (cache 84%), no card e no popover. As marcações de fase que um agent deixa com @dash mark aparecem como linhas ◆. Exportar baixa os eventos dos processos exibidos como NDJSON, o que um relato de bug precisa.
Uma dash aberta no meio de uma execução começa pelo que está vivo agora (agents rodando, servidores MCP conectados, processos em background), e não do vazio.
Dirigindo pelo agent
O agent tem o mesmo controle da dash que o/dash, e mais um jeito de ler o que ela vê, pela tool @dash, registrada nos modos agent e coder como @model e @agents:
summary e events leem o mesmo spool que a página consulta, então dizem quando nada está gravando e como ligar. Tudo o que devolvem é metadado, como a própria telemetria. status, url, summary e events são somente leitura para a política de segurança; open, off e mark rodam em série. A tool funciona em toda superfície, chatcli tool @dash status incluído; CHATCLI_AGENT_DASH_TOOL=false a desregistra.
Privacidade e segurança
Os eventos levam só metadados: nomes, tamanhos, durações, status, contagens de tokens. O que segue nunca sai do processo, e há teste garantindo cada item:- texto de prompt, a task dada a um agent, saída do modelo, texto de erro
- argumentos e saída de tool, argumentos e resultados de chamada MCP
- caminhos de arquivo tocados por uma tool
- caminho e query string de URL (onde viajam chaves de API e tokens de bot): só o hostname é mostrado
- a linha de comando de um processo: só o nome do programa, e só quando a primeira palavra é um programa e não uma atribuição
VAR=valor - a URL do browser ou qualquer coisa de uma página; o payload, a mensagem ou a saída de um job agendado
127.0.0.1 numa porta efêmera e, além disso:
- toda chamada de API exige um token aleatório gerado no start. Ele chega à página pelo endereço uma única vez, vai para a memória e some da barra de endereço;
- toda requisição precisa trazer o
Hostexato em que o servidor subiu, o que fecha DNS rebinding a partir de uma página web; - só
GET, Content-Security-Policy estrita, sem CDN, sem chamadas de rede.
Custo
Com a dash desligada, cada ponto instrumentado custa um load atômico, e o processo faz umstat a cada dois segundos para conferir o lease. Nenhum span é montado, nenhum corpo é embrulhado.
Gravando, emitir nunca bloqueia: fila cheia descarta o evento e conta o descarte, e um consumidor lento perde eventos em vez de atrasar os outros. /dash status e /config dash mostram publicados e descartados.
Armazenamento
Cada processo grava em~/.chatcli/pulse/<instância>/ em segmentos rotacionados por tamanho, limitados a cerca de 16 MB por processo, com um heartbeat que separa processos vivos de mortos. A varredura automática do boot remove os spools de processos mortos há mais de 24 horas. Sob demanda, /storage prune pulse remove na hora o spool de todo processo que já não está rodando:
/storage na referência de comandos.
Configuração
/config dash mostra as duas variáveis, se este processo está gravando, o diretório do spool e os contadores de eventos.