/compact para reduzir o tamanho e /rewind para voltar a pontos anteriores.Comandos de Sessão
Todos os comandos de gerenciamento de sessão começam com/session.
/session save <nome>
/session load <nome>
/session attach <nome>
/session detach
/session status
/session list
/session delete <nome>
/session new (ou /newsession)
/newsession: também remove qualquer vínculo de sessão e rotaciona a thread compartilhada do hub, para que nenhum backlog da conversa antiga vaze para a nova./session fork <novo-nome>
/rewind e undo ficam por sessão) e mantém os anexos, a referência de custo e as chaves do arquivo CCR. Um arquivo de sessão gravado por um ChatCLI mais novo (schema de versão maior) é recusado no load em vez de ser reescrito silenciosamente sem os campos que este build não conhece.Ideal para experimentar abordagens diferentes sem perder o progresso atual, ou para ramificar uma conversa em direções distintas./session export <md|jsonl> [caminho]
@trajectory). Cai para o histórico vivo quando o journal está desligado.chatcli-<sessão>-<timestamp>.<ext>, modo 0600./session transcript <search|show|export|stats>
search <consulta>ranqueia toda mensagem do journal com BM25 e imprime os melhores resultados com a posição —#17 assistant …o freeze de deploy termina sexta….show <de> [qtd]reproduz mensagens a partir de uma posição (10 por padrão), para ler um resultado em contexto.export <md|jsonl> [caminho]é o mesmo que/session export.statsimprime contagem de mensagens, tamanho, fonte (journal ou histórico vivo) e id do journal.
Salvamento automático no exit
Você não precisa lembrar do/session save: quando o REPL interativo encerra, a conversa é salva automaticamente sob o nome reservado autosave-YYYYMMDD-HHMMSS. Sessões triviais (menos de 2 mensagens não-system) são puladas, e execuções one-shot -p nunca salvam. Um REPL vinculado a uma sessão nomeada (carregada ou salva via /session, ou a sessão web-<data> que o /web cria) já é gravado após cada turno: na saída ele é gravado uma última vez e nenhuma cópia autosave- é feita, então o catálogo não carrega a mesma conversa duas vezes. Gate CHATCLI_SESSION_AUTOSAVE (on por padrão, visível em /config session). Conversas auto-salvas ficam totalmente pesquisáveis e legíveis via @session.
Sessões MCP também têm autosave: o servidor MCP/ACP espelha cada conversa viva num arquivo rolling mcp-<session> após cada turno (nos caminhos full-pipeline e plain), e o manage_session clear salva uma última vez antes de descartar. Um CHATCLI_MCP_SESSION_AUTOSAVE explícito sempre vence; sem ele, segue o gate global CHATCLI_SESSION_AUTOSAVE — on por padrão. A retenção das duas superfícies está em Limpeza Automática abaixo.
Continuidade cross-surface
Uma sessão nomeada é a camada durável de continuidade entre superfícies do ChatCLI: o REPL interativo, o servidor MCP (chatcli mcp-server), o servidor ACP (chatcli acp) e o Chat Gateway leem e escrevem o mesmo arquivo de sessão. Comece no terminal, continue na IDE, termine no WhatsApp — a mesma conversa.
Enquanto uma sessão nomeada está ativa (após /session save, /session load ou /session attach), o vínculo (binding) funciona nas duas direções a cada turno:
- Write-through — cada turno concluído é gravado imediatamente no arquivo da sessão (escrita atômica: arquivo temporário + rename, nunca há arquivos corrompidos pela metade).
- Adoção — antes de cada turno, escritas feitas por outras superfícies (servidor MCP/ACP, daemon do gateway, outro terminal) desde a última sincronização são adotadas: quando o arquivo está mais novo, ele substitui o histórico em memória por inteiro (last-writer-wins).
autosave-, mcp-) são espelhos rolling dos caminhos de autosave — elas nunca viram bindings vivos.Journal de transcript
Uma sessão salva persiste a conversa como está em memória — depois de uma compactação a janela guarda um resumo, e as mensagens originais sobrevivem só como chaves@recall no CCR (TTL de 7 dias, limite de tamanho). O journal de transcript é o registro completo e durável por baixo dessa janela:
~/.chatcli/transcripts/<id>.jsonl, um arquivo por sessão, append-only, cada linha com fsync.- Cada mensagem é anexada uma vez, na primeira vez em que aparece na cauda do histórico vivo — no fim de cada turno do chat, no início de cada turno do agent/coder (assim os tool results do turno anterior estão em disco antes de qualquer reescrita virar stub) e quando uma execução do agente termina, seja como for. Um kill duro no meio da execução perde no máximo o lote de tools em voo.
- Uma reescrita do histórico (auto-compact,
/compact, microcompact, envelhecimento de skills, dedup de leituras) vira um eventorewritecarregando os hashes ordenados do histórico que substituiu; só mensagens genuinamente novas (o resumo) são anexadas, nada é duplicado. São esses hashes que/rewind compacte os checkpoints persistidos de/rewindresolvem depois de uma retomada. - O journal é legível, não só de escrita:
/session exporte/session transcript search|show|statsoperam direto nele. - Cada sync compara o histórico inteiro com os últimos hashes registrados, então uma mensagem alterada no lugar (microcompact, dedup de leituras, reparo de pareamento de tool results, trim de Nível 1) também vira reescrita —
/rewind compacte checkpoints persistidos continuam resolvendo em sessões de agente. Os hashes cobrem tool calls nativas (id, nome, argumentos) e imagens, e mensagens repetidas no fim (“ok”) são registradas como as mensagens distintas que são. - O leitor tolera dano: uma última linha parcial de um crash e qualquer linha estranha são puladas e contadas, nunca fatais; o próximo append começa em linha nova. Uma linha selada que este processo não consegue abrir continua sendo erro, porque isso é problema de chave, não corrupção.
- Sessões salvas carregam seu
transcript_id, então/session loade/session attachcontinuam escrevendo no mesmo journal entre retomadas. - Sessões salvas também carregam seus registros de
/context attach(attachments: id do contexto, prioridade, chunks selecionados, modo de retrieval). O estado de anexo era só do processo — um restart ou um load em outra superfície perdia todos os contextos anexados; carregar uma sessão agora reanexa os mesmos contextos, pulando os que não existem mais. - Com
CHATCLI_ENCRYPTION_KEYdefinida, cada linha é selada (mesmo formato AES-256-GCM das sessões) e o journal não é legível sem a chave. - Os journals seguem o TTL das sessões de máquina (
CHATCLI_SESSION_TTL, 90 dias por padrão).CHATCLI_SESSION_TRANSCRIPT=falsedesliga o journal;/config sessionmostra o id ativo.
Onde as Sessões são Armazenadas
As sessões são salvas como arquivos JSON em um store por usuário — o mesmo store que todas as superfícies (REPL, servidor MCP/ACP, daemon do gateway) leem e escrevem:/session save debug-api, o arquivo criado será:
SessionManager é o componente interno responsável por toda a E/S de arquivos de sessão. Ele trata erros de leitura/escrita (permissões, disco cheio, JSON malformado) e exibe mensagens claras caso algo falhe./compact.
/session list para vê-las todas.Formato de Dados (v2)
Os arquivos de sessão utilizam o formato v2, definido pela structSessionData no pacote models. A estrutura JSON é:
Campos de cada mensagem
Evolução do formato
- v1 (versões antigas): Mantinha históricos separados por modo —
chat_history,agent_historyecoder_historycada um com suas próprias mensagens. - v2 (versão atual): Usa um histórico unificado. O campo
chat_historycontém todas as mensagens de todos os modos. Os camposagent_historyecoder_historyexistem por compatibilidade, mas ficam vazios em sessões novas.
Histórico Unificado e Sessões
O ChatCLI usa um único array de mensagens para todos os modos de interação. Isso significa que:- Ao salvar uma sessão, o histórico inteiro e unificado é serializado — incluindo mensagens de chat, agent e coder mode.
- Mensagens do sistema, resultados de tool calls e resumos compactados são todos preservados no arquivo.
- Ao carregar uma sessão, o histórico atual é completamente substituído pelo da sessão carregada.
Interação com Outros Sistemas
As sessões interagem com vários outros subsistemas do ChatCLI. Veja como cada um se comporta:Compactação (/compact)
O comando /compact reduz o tamanho do histórico criando resumos das mensagens mais antigas. Ao salvar uma sessão após compactar, o arquivo resultante será significativamente menor, pois contém os resumos em vez das mensagens originais.
Rewind (/rewind)
Os checkpoints usados pelo /rewind são salvos com a sessão como listas ordenadas de hash de mensagens (checkpoints) e reconstruídos do journal de transcript no /session load; um checkpoint cujas mensagens o journal não tem mais é descartado. /rewind compact (desfazer a última compactação) também é apoiado pelo journal depois de retomar. Com o journal desligado, os checkpoints ficam locais ao processo como antes.
Bootstrap (SOUL.md, etc.)
Arquivos de bootstrap não fazem parte da sessão. Eles são carregados automaticamente a cada inicialização do ChatCLI, independente de qual sessão esteja ativa. Isso garante que o comportamento base da IA seja sempre consistente.Memória (/memory)
A memória é global — não está vinculada a nenhuma sessão específica. Dados salvos com /memory save ficam disponíveis em todas as sessões e sobrevivem ao encerramento do ChatCLI.
Contexto (/context attach)
Contextos anexados via /context attach não são salvos no arquivo de sessão. Ao carregar uma sessão, você precisa re-anexar os contextos necessários manualmente.
Auto-Save e Persistência
Além do/session save explícito, a persistência tem duas camadas automáticas:
- Sessão nomeada vinculada — após
/session save,/session loadou/session attach, cada turno é gravado (write-through) no arquivo da sessão (veja Continuidade cross-surface; gateCHATCLI_SESSION_WRITETHROUGH, on por padrão). - Autosave no exit — uma conversa sem vínculo ainda é salva como
autosave-YYYYMMDD-HHMMSSquando o REPL interativo encerra (veja Salvamento automático no exit acima; gateCHATCLI_SESSION_AUTOSAVE, on por padrão).
Arquivo .chatcli_history (não confundir)
O ChatCLI mantém um arquivo separado chamado .chatcli_history que armazena o histórico de comandos digitados (similar ao ~/.bash_history). Esse arquivo:
- Contém apenas os textos que você digitou no prompt, não as respostas da IA
- É controlado pelas variáveis de ambiente
HISTORY_FILEeHISTORY_MAX_SIZE - Não tem relação com os arquivos de sessão (
~/.chatcli/sessions/*.json)
Workflow Recomendado
Para tirar o máximo proveito do sistema de sessões, siga estas práticas:Nomeie sessões pela tarefa
fix-auth-bug, refactor-api, docs-v2, debug-memory-leak.Compacte antes de salvar
/compact antes de /session save para reduzir o tamanho do arquivo e manter apenas as informações essenciais.Inicie limpo antes de trocar de sessão
/session new antes de carregar outra sessão. Isso garante que o contexto anterior não interfira.Alterne entre tarefas livremente
Criptografia de Sessões
Os arquivos de sessão podem ser criptografados em repouso usando AES-256-GCM para proteger dados sensíveis de conversas:Limpeza Automática
O ChatCLI aplica um ciclo de vida limitado às sessões criadas por máquina na inicialização (REPL e servidor MCP/ACP). A regra central: sessões que você nomeou nunca são apagadas automaticamente — só os arquivos com prefixoautosave- e mcp- que o ChatCLI cria sozinho ficam sujeitos à retenção.
Curadoria do armazenamento sob demanda
A passada de inicialização é silenciosa. O/storage torna as mesmas políticas visíveis: uma linha por store local com contagem de arquivos, tamanho, a regra que o governa e o que seria removido agora, mais os stores que nunca são podados (memória destilada, skills, plugins, contextos, agentes, comandos, scheduler, tokenizers, logs). /storage prune lista o que as regras removeriam, agrupado por motivo — além da TTL, órfão, rajada de teste, temporário perdido — e só /storage prune --apply remove; /storage prune costs --apply restringe a um store. Duas regras existem só sob demanda porque uma passada de boot não deve chutar: snapshots de custo criados em rajada (quatro ou mais sessões no mesmo minuto com no máximo duas requisições cada) e as varreduras do CCR e do hub, que abrem os próprios stores. Os checkpoints do coder entraram na passada de inicialização: um repositório sombra cujo workspace é um diretório temporário ou não existe mais é removido no boot, os demais seguem a TTL de sessão. chatcli storage prune --apply é a mesma coisa sem REPL, para cron — ou agende de dentro com /schedule, que roda comandos slash.
Validação de Nomes
Nomes de sessão são validados com uma regex estrita para evitar path traversal e caracteres problemáticos:- Caracteres permitidos: letras (a-z, A-Z), números (0-9), hífens (
-), underscores (_) e pontos (.) - Comprimento: 1 a 128 caracteres
- Proibido: espaços, barras, caracteres especiais, sequências
..
Perguntas Frequentes
As sessões são compartilhadas entre máquinas?
As sessões são compartilhadas entre máquinas?
~/.chatcli/sessions. Para transferir uma sessão entre máquinas, copie o arquivo ~/.chatcli/sessions/<nome>.json para o mesmo local na outra máquina.Existe limite de tamanho para as sessões?
Existe limite de tamanho para as sessões?
HISTORY_MAX_SIZE (padrão: 100MB), mas na prática as sessões raramente passam de alguns megabytes. Se o histórico estiver muito grande, use /compact antes de salvar para reduzir significativamente o tamanho.Posso editar o arquivo JSON da sessão manualmente?
Posso editar o arquivo JSON da sessão manualmente?
version).O que acontece se eu carregar uma sessão de uma versão antiga?
O que acontece se eu carregar uma sessão de uma versão antiga?
Posso ter sessões com o mesmo nome em diretórios diferentes?
Posso ter sessões com o mesmo nome em diretórios diferentes?
~/.chatcli/sessions, então os mesmos nomes ficam visíveis de qualquer diretório e de qualquer superfície (REPL, servidor MCP/ACP, gateway). Esse namespace compartilhado é exatamente o que faz a continuidade cross-surface funcionar; use nomes específicos da tarefa (projeto-a-debug, projeto-b-debug) para separar projetos.