- Início
- Documentation
- Sessões
- Compactação e Resumos de Branch
Compactação e Resumos de Branch
Compactação e resumos de branch são os dois mecanismos que mantêm sessões longas utilizáveis sem perder o contexto de trabalho anterior.
- Compactação reescreve o histórico antigo em um resumo na branch atual.
- Resumo de branch captura o contexto de branches abandonadas durante a navegação com
/tree.
Ambos são persistidos como entradas de sessão e convertidos de volta em mensagens de contexto do usuário ao reconstruir a entrada do LLM.
Arquivos de implementação principais
Seção intitulada “Arquivos de implementação principais”src/session/compaction/compaction.tssrc/session/compaction/branch-summarization.tssrc/session/compaction/pruning.tssrc/session/compaction/utils.tssrc/session/session-manager.tssrc/session/agent-session.tssrc/session/messages.tssrc/extensibility/hooks/types.tssrc/config/settings-schema.ts
Modelo de entrada de sessão
Seção intitulada “Modelo de entrada de sessão”Compactação e resumos de branch são entradas de sessão de primeira classe, não simples mensagens de assistente/usuário.
CompactionEntrytype: "compaction"summary, opcionalshortSummaryfirstKeptEntryId(fronteira da compactação)tokensBefore- opcional
details,preserveData,fromExtension
BranchSummaryEntrytype: "branch_summary"fromId,summary- opcional
details,fromExtension
Quando o contexto é reconstruído (buildSessionContext):
- A compactação mais recente no caminho ativo é convertida em uma mensagem
compactionSummary. - As entradas mantidas de
firstKeptEntryIdaté o ponto de compactação são reincluídas. - As entradas posteriores no caminho são adicionadas.
- As entradas
branch_summarysão convertidas em mensagensbranchSummary. - As entradas
custom_messagesão convertidas em mensagenscustom.
Esses papéis personalizados são então transformados em mensagens de usuário voltadas ao LLM em convertToLlm() usando os templates estáticos:
prompts/compaction/compaction-summary-context.mdprompts/compaction/branch-summary-context.md
Pipeline de compactação
Seção intitulada “Pipeline de compactação”Gatilhos
Seção intitulada “Gatilhos”A compactação pode ser executada de três formas:
- Manual:
/compact [instruções]chamaAgentSession.compact(...). - Recuperação automática de overflow: após um erro do assistente que corresponde a overflow de contexto.
- Compactação automática por limiar: após um turno bem-sucedido quando o contexto excede o limiar.
Forma da compactação (visual)
Seção intitulada “Forma da compactação (visual)”Antes da compactação:
entry: 0 1 2 3 4 5 6 7 8 9 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┘ └────────┬───────┘ └──────────────┬──────────────┘ messagesToSummarize kept messages ↑ firstKeptEntryId (entry 4)
Após a compactação (nova entrada adicionada):
entry: 0 1 2 3 4 5 6 7 8 9 10 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┬─────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ cmp │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┴─────┘ └──────────┬──────┘ └──────────────────────┬───────────────────┘ não enviado ao LLM enviado ao LLM ↑ começa em firstKeptEntryId
O que o LLM vê:
┌────────┬─────────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ system │ summary │ usr │ ass │ tool │ tool │ ass │ tool │ └────────┴─────────┴─────┴─────┴──────┴──────┴─────┴──────┘ ↑ ↑ └─────────────────┬────────────────┘ prompt de cmp mensagens a partir de firstKeptEntryIdCompactação por overflow-retry vs por limiar
Seção intitulada “Compactação por overflow-retry vs por limiar”Os dois caminhos automáticos são intencionalmente diferentes:
-
Compactação por overflow-retry
- Gatilho: erro do assistente no modelo atual é detectado como overflow de contexto.
- A mensagem de erro do assistente que falhou é removida do estado ativo do agente antes da retentativa.
- A compactação automática é executada com
reason: "overflow"ewillRetry: true. - Em caso de sucesso, o agente continua automaticamente (
agent.continue()) após a compactação.
-
Compactação por limiar
- Gatilho:
contextTokens > contextWindow - compaction.reserveTokens. - Executada com
reason: "threshold"ewillRetry: false. - Em caso de sucesso, se
compaction.autoContinue !== false, injeta um prompt sintético:"Continue if you have next steps."
- Gatilho:
Poda pré-compactação
Seção intitulada “Poda pré-compactação”Antes das verificações de compactação, a poda de resultados de ferramentas pode ser executada (pruneToolOutputs).
Política de poda padrão:
- Proteger os
40_000tokens mais recentes de saída de ferramentas. - Exigir pelo menos
20_000de economia total estimada. - Nunca podar resultados de ferramentas de
skillouread.
Resultados de ferramentas podados são substituídos por:
[Output truncated - N tokens]
Se a poda alterar entradas, o armazenamento da sessão é reescrito e o estado de mensagens do agente é atualizado antes das decisões de compactação.
Lógica de fronteira e ponto de corte
Seção intitulada “Lógica de fronteira e ponto de corte”prepareCompaction() considera apenas entradas desde a última entrada de compactação (se existir).
- Encontrar o índice da compactação anterior.
- Calcular
boundaryStart = prevCompactionIndex + 1. - Adaptar
keepRecentTokensusando a razão de uso medida quando disponível. - Executar
findCutPoint()sobre a janela de fronteira.
Pontos de corte válidos incluem:
- entradas de mensagem com papéis:
user,assistant,bashExecution,hookMessage,branchSummary,compactionSummary - entradas
custom_message - entradas
branch_summary
Regra rígida: nunca cortar em toolResult.
Se houver entradas de metadados não-mensagem imediatamente antes do ponto de corte (model_change, thinking_level_change, labels, etc.), elas são puxadas para a região mantida movendo o índice de corte para trás até que uma mensagem ou fronteira de compactação seja encontrada.
Tratamento de turno dividido
Seção intitulada “Tratamento de turno dividido”Se o ponto de corte não estiver no início de um turno do usuário, a compactação o trata como um turno dividido.
A detecção de início de turno trata estes como fronteiras de turno do usuário:
message.role === "user"message.role === "bashExecution"- entrada
custom_message - entrada
branch_summary
A compactação de turno dividido gera dois resumos:
- Resumo do histórico (
messagesToSummarize) - Resumo do prefixo do turno (
turnPrefixMessages)
O resumo final armazenado é mesclado como:
<history summary>
---
**Turn Context (split turn):**
<turn prefix summary>Geração de resumo
Seção intitulada “Geração de resumo”compact(...) constrói resumos a partir de texto de conversa serializado:
- Converte mensagens via
convertToLlm(). - Serializa com
serializeConversation(). - Envolve em
<conversation>...</conversation>. - Opcionalmente inclui
<previous-summary>...</previous-summary>. - Opcionalmente injeta contexto de hook como lista
<additional-context>. - Executa o prompt de sumarização com
SUMMARIZATION_SYSTEM_PROMPT.
Seleção de prompt:
- primeira compactação:
compaction-summary.md - compactação iterativa com resumo anterior:
compaction-update-summary.md - segunda passagem de turno dividido:
compaction-turn-prefix.md - resumo curto para UI:
compaction-short-summary.md
Modo de sumarização remota:
- Se
compaction.remoteEndpointestiver definido, a compactação faz POST com:{ systemPrompt, prompt }
- Espera JSON contendo pelo menos
{ summary }.
Contexto de operações de arquivo nos resumos
Seção intitulada “Contexto de operações de arquivo nos resumos”A compactação rastreia a atividade cumulativa de arquivos usando chamadas de ferramenta do assistente:
read(path)→ conjunto de leiturawrite(path)→ conjunto de modificaçãoedit(path)→ conjunto de modificação
Comportamento cumulativo:
- Inclui detalhes da compactação anterior somente quando a entrada anterior é gerada internamente (
fromExtension !== true). - Em turnos divididos, inclui também as operações de arquivo do prefixo do turno.
readFilesexclui arquivos que também foram modificados.
O texto do resumo recebe tags de arquivo anexadas via template de prompt:
<read-files>...</read-files><modified-files>...</modified-files>Persistência e recarga
Seção intitulada “Persistência e recarga”Após a geração do resumo (ou resumo fornecido por hook), a sessão do agente:
- Adiciona
CompactionEntrycomappendCompaction(...). - Reconstrói o contexto via
buildSessionContext(). - Substitui as mensagens ativas do agente pelo contexto reconstruído.
- Emite o evento de hook
session_compact.
Pipeline de sumarização de branch
Seção intitulada “Pipeline de sumarização de branch”A sumarização de branch está vinculada à navegação em árvore, não ao overflow de tokens.
Gatilho
Seção intitulada “Gatilho”Durante navigateTree(...):
- Calcula as entradas abandonadas da folha antiga até o ancestral comum usando
collectEntriesForBranchSummary(...). - Se o chamador solicitou resumo (
options.summarize), gera o resumo antes de trocar a folha. - Se o resumo existir, anexa-o no alvo de navegação usando
branchWithSummary(...).
Operacionalmente, isso é comumente acionado pelo fluxo /tree quando branchSummary.enabled está habilitado.
Forma da troca de branch (visual)
Seção intitulada “Forma da troca de branch (visual)”Árvore antes da navegação:
┌─ B ─ C ─ D (folha antiga, sendo abandonada) A ───┤ └─ E ─ F (alvo)
Ancestral comum: AEntradas a resumir: B, C, D
Após navegação com resumo:
┌─ B ─ C ─ D ─ [resumo de B,C,D] A ───┤ └─ E ─ F (nova folha)Preparação e orçamento de tokens
Seção intitulada “Preparação e orçamento de tokens”generateBranchSummary(...) calcula o orçamento como:
tokenBudget = model.contextWindow - branchSummary.reserveTokens
prepareBranchEntries(...) então:
- Primeira passagem: coleta operações de arquivo cumulativas de todas as entradas resumidas, incluindo detalhes anteriores de
branch_summarygerados internamente. - Segunda passagem: percorre do mais recente ao mais antigo, adicionando mensagens até que o orçamento de tokens seja atingido.
- Prefere preservar contexto recente.
- Pode ainda incluir entradas de resumo grandes perto do limite do orçamento para continuidade.
Entradas de compactação são incluídas como mensagens (compactionSummary) durante a entrada da sumarização de branch.
Geração e persistência do resumo
Seção intitulada “Geração e persistência do resumo”Sumarização de branch:
- Converte e serializa as mensagens selecionadas.
- Envolve em
<conversation>. - Usa instruções personalizadas se fornecidas, caso contrário
branch-summary.md. - Chama o modelo de sumarização com
SUMMARIZATION_SYSTEM_PROMPT. - Prepende
branch-summary-preamble.md. - Anexa tags de operação de arquivo.
O resultado é armazenado como BranchSummaryEntry com detalhes opcionais (readFiles, modifiedFiles).
Pontos de extensão e hooks
Seção intitulada “Pontos de extensão e hooks”session_before_compact
Seção intitulada “session_before_compact”Hook pré-compactação.
Pode:
- cancelar a compactação (
{ cancel: true }) - fornecer payload de compactação personalizado completo (
{ compaction: CompactionResult })
session.compacting
Seção intitulada “session.compacting”Hook de personalização de prompt/contexto para compactação padrão.
Pode retornar:
prompt(substituir o prompt base do resumo)context(linhas de contexto extra injetadas em<additional-context>)preserveData(armazenado na entrada de compactação)
session_compact
Seção intitulada “session_compact”Notificação pós-compactação com compactionEntry salva e flag fromExtension.
session_before_tree
Seção intitulada “session_before_tree”Executado na navegação em árvore antes da geração padrão de resumo de branch.
Pode:
- cancelar a navegação
- fornecer
{ summary: { summary, details } }personalizado usado quando o usuário solicitou sumarização
session_tree
Seção intitulada “session_tree”Evento pós-navegação expondo nova/antiga folha e entrada de resumo opcional.
Comportamento em tempo de execução e semântica de falha
Seção intitulada “Comportamento em tempo de execução e semântica de falha”- A compactação manual aborta a operação atual do agente primeiro.
abortCompaction()cancela tanto os controladores de compactação manual quanto automática.- A compactação automática emite eventos de sessão de início/fim para atualizações de UI/estado.
- A compactação automática pode tentar múltiplos modelos candidatos e retentar falhas transitórias.
- Erros de overflow são excluídos do caminho genérico de retentativa porque são tratados pela compactação.
- Se a compactação automática falhar:
- o caminho de overflow emite
Context overflow recovery failed: ... - o caminho de limiar emite
Auto-compaction failed: ...
- o caminho de overflow emite
- A sumarização de branch pode ser cancelada via sinal de aborto (ex.: Escape), retornando resultado de navegação cancelado/abortado.
Configurações e padrões
Seção intitulada “Configurações e padrões”De settings-schema.ts:
compaction.enabled=truecompaction.reserveTokens=16384compaction.keepRecentTokens=20000compaction.autoContinue=truecompaction.remoteEndpoint=undefinedbranchSummary.enabled=falsebranchSummary.reserveTokens=16384
Esses valores são consumidos em tempo de execução por AgentSession e pelos módulos de compactação/sumarização de branch.