🏗️ Four Error Stack Layers
Vocabulario de excecoes nomeadas por dominio de falha -- ClaudeError, AbortError, ShellError, ConfigParseError
Backoff exponencial, fallback 529, refresh auth, overflow de contexto
Trecho de source inline com linha de crash destacada
Resume de sessoes interrompidas/mid-turn
📚 The Error Taxonomy
| Classe | Proposito | Campos-chave |
|---|---|---|
| AbortError | Cancelamento por usuario (Esc/Ctrl-C) | name = 'AbortError' |
| ShellError | Comando shell exit nao-zero | stdout, stderr, code, interrupted |
| ConfigParseError | Arquivo config corrupto/ilegivel | filePath, defaultConfig |
| TelemetrySafeError_I_VERIFIED... | Seguro para telemetria | telemetryMessage |
isAbortError -- Three-Way Check
Checa instanceof AbortError, instanceof APIUserAbortError (SDK) e e.name === 'AbortError' (DOMException). Necessario porque minificacao mangle nomes de construtor.
🔄 API Retry Engine
withRetry e um async generator que encapsula cada chamada API Anthropic. Implementa retry sofisticado:
// Backoff exponencial com jitter +-25%
baseDelay = min(500ms * 2^(attempt-1), 32s)
jitter = random() * 0.25 * baseDelay
delay = baseDelay + jitter
CLAUDE_CODE_UNATTENDED_RETRY=1 habilita retry indefinido em 429/529 com backoff max 5min e cap total de 6h.🛠️ Tool Error Formatting
Falhas de tools requerem formatacao para dois consumidores: terminal (usuario) e modelo (em blocos tool_result).
Cap de 10.000 caracteres com center-truncation: mantem 5K head + 5K tail. Protege budget de contexto de outputs grandes de compilador.
Zod errors -> LLM-friendly: Caminhos formatados como todos[0].activeForm e tipos expected/received especificados para habilitar auto-correcao do modelo.
💻 Terminal Error Overlay
Quando excecoes nao tratadas atingem o Ink render tree, ErrorOverview exibe overlay formatado com localizacao de crash e contexto de source inline:
- Parseia primeiro stack frame para file + line + column (StackUtils)
- Le source file sincronamente (readFileSync)
- Renderiza: linha de crash destacada em vermelho, linhas vizinhas dim
readFileSync justificado: Componente renderiza sincronamente dentro do Ink reconciler. Como e o path de erro (processo ja quebrado), sync I/O e aceitavel.
🔧 Conversation Recovery Pipeline
Pipeline de 4 estagios de deserializacao:
interrupted_turn converte para interrupted_prompt injetando mensagem sintetica "Continue from where you left off." com isMeta: true, unificando ambos os tipos de interrupcao.
🗺️ End-to-End Error Flows
Runtime Errors
Tool falha -> formatError() -> tool_result block ao modelo + display no terminal
API Errors
API retorna erro -> withRetry() -> backoff + SystemAPIErrorMessage -> (exauriu) CannotRetryError -> logError() + ErrorOverview
Session Recovery
Processo morto mid-turn -> --continue/--resume -> pipeline 4-stage -> detectTurnInterruption() -> auto-resume