/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>
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. 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.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 existem apenas em memória durante a execução atual. Eles não são salvos no arquivo de sessão. Ao carregar uma sessão, você não terá pontos de rewind disponíveis até criar novos durante a conversa.
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.
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.