pub fn validation(msg: &str) -> String {
format!("erro de validação: {msg}")
}
pub fn usage(msg: &str) -> String {
format!("erro de uso: {msg}")
}
pub fn duplicate(msg: &str) -> String {
let translated = msg
.replace("already exists in namespace", "já existe no namespace")
.replace(
"exists but is soft-deleted in namespace",
"existe mas está excluída temporariamente no namespace",
)
.replace(
"Use --force-merge to update.",
"Use --force-merge para atualizar.",
)
.replace(
"use --force-merge to restore and update, or `restore` to revive it",
"use --force-merge para restaurar e atualizar, ou `restore` para revivê-la",
)
.replace("memory", "memória");
format!("duplicata detectada: {translated}")
}
pub fn conflict(msg: &str) -> String {
let translated = msg
.replace("optimistic lock conflict", "conflito de lock otimista")
.replace("but current is", "mas atual é")
.replace(
"was modified by another process",
"foi modificada por outro processo",
);
format!("conflito: {translated}")
}
pub fn not_found(msg: &str) -> String {
let translated = msg
.replace("source entity '", "entidade de origem '")
.replace("target entity '", "entidade de destino '")
.replace("memory not found:", "memória não encontrada:")
.replace(
"exists but belongs to namespace",
"existe mas pertence ao namespace",
)
.replace("' not found in namespace", "' não encontrada no namespace")
.replace("not found in namespace", "não encontrado no namespace")
.replace(
"not found in pending_memories",
"não encontrado em pending_memories",
)
.replace("not found for memory", "não encontrada para memória")
.replace("does not exist in namespace", "não existe no namespace")
.replace("memory or entity", "memória ou entidade")
.replace("Did you mean:", "Você quis dizer:")
.replace(
"Re-run with --fuzzy to auto-resolve a clear match, or pass the canonical name.",
"Repita com --fuzzy para resolver automaticamente uma correspondência clara, \
ou informe o nome canônico.",
)
.replace(
"is not held (no file at",
"não está retido (nenhum arquivo em",
)
.replace("no key with fingerprint", "nenhuma chave com fingerprint")
.replace("name='", "nome='")
.replace("relationship", "relacionamento")
.replace("edge '", "aresta '")
.replace("memory", "memória")
.replace("entity", "entidade")
.replace("' not found", "' não encontrada")
.replace("not found", "não encontrado")
.replace(", not '", ", e não '")
.replace(" in namespace '", " no namespace '")
.replace("version", "versão")
.replace("soft-deleted", "excluída temporariamente");
format!("não encontrado: {translated}")
}
pub fn memory_not_found(name: &str, namespace: &str) -> String {
not_found(&format!(
"memory not found: name='{name}' in namespace '{namespace}'"
))
}
pub fn memory_not_found_by_id(id: i64) -> String {
not_found(&format!("memory not found: id={id}"))
}
pub fn entity_not_yet_materialized(name: &str, namespace: &str) -> String {
format!("entidade '{name}' ainda não materializada no namespace '{namespace}'")
}
pub fn namespace_error(msg: &str) -> String {
format!("namespace não resolvido: {msg}")
}
pub fn limit_exceeded(msg: &str) -> String {
let translated = msg
.replace("exceeds limit of", "excede limite de")
.replace("body exceeds", "corpo excede")
.replace("entities exceed limit", "entidades excedem limite")
.replace(
"relationships exceed limit",
"relacionamentos excedem limite",
);
format!("limite excedido: {translated}")
}
pub fn body_too_large(bytes: u64, limit: u64) -> String {
format!(
"limite excedido: corpo tem {bytes} bytes, acima do teto de {limit} bytes \
(MAX_MEMORY_BODY_LEN); divida o conteúdo em múltiplas memórias"
)
}
pub fn too_many_chunks(chunks: usize, limit: usize) -> String {
format!(
"limite excedido: documento produz {chunks} chunks, acima do teto de {limit} \
chunks (REMEMBER_MAX_SAFE_MULTI_CHUNKS); divida o documento antes da escrita"
)
}
pub fn too_many_tokens(tokens: u64, limit: u64) -> String {
format!(
"limite excedido: corpo tem {tokens} tokens (estimado), acima do teto de \
{limit} tokens (EMBEDDING_REQUEST_MAX_TOKENS); divida o conteúdo em \
múltiplas memórias"
)
}
pub fn database(err: &str) -> String {
format!("erro de banco de dados: {err}")
}
pub fn embedding(msg: &str) -> String {
format!("erro de embedding: {msg}")
}
pub fn vec_extension(msg: &str) -> String {
format!("extensão sqlite-vec falhou: {msg}")
}
pub fn provider_error(code: &str, message: &str) -> String {
format!("erro do provedor (código {code}): {message}")
}
pub fn db_busy(msg: &str) -> String {
format!("banco ocupado: {msg}")
}
pub fn batch_partial_failure(total: usize, failed: usize) -> String {
format!("falha parcial em batch: {failed} de {total} itens falharam")
}
pub fn io(err: &str) -> String {
format!("erro de I/O: {err}")
}
pub fn internal(err: &str) -> String {
format!("erro interno: {err}")
}
pub fn json(err: &str) -> String {
format!("erro de JSON: {err}")
}
pub fn lock_busy(msg: &str) -> String {
format!("lock ocupado: {msg}")
}
pub fn all_slots_full(max: usize, waited_secs: u64) -> String {
format!(
"todos os {max} slots de concorrência ocupados após aguardar {waited_secs}s \
(exit 75); use --max-concurrency ou aguarde outras invocações terminarem"
)
}
pub fn job_singleton_locked(job_type: &str, namespace: &str) -> String {
format!(
"job {job_type} para o namespace '{namespace}' já está em execução (exit 75); \
aguarde a conclusão ou passe --wait-job-singleton <SEGUNDOS>"
)
}
pub fn embedding_singleton_locked(namespace: &str) -> String {
format!(
"singleton de embedding para o namespace '{namespace}' já está retido (exit 75); \
outra CLI está chamando o LLM neste banco; passe --wait-embed-singleton <SEGUNDOS> para aguardar"
)
}
pub fn low_memory(available_mb: u64, required_mb: u64) -> String {
format!(
"memória disponível ({available_mb}MB) abaixo do mínimo requerido ({required_mb}MB) \
para carregar o modelo; aborte outras cargas ou use --skip-memory-guard (exit 77)"
)
}
pub fn shutdown(signal: &str) -> String {
format!("sinal de desligamento recebido: {signal}; operação cancelada pelo usuário (exit 19)")
}
pub fn binary_not_found(name: &str) -> String {
format!("binário não encontrado: {name} — instale e adicione ao PATH")
}
pub fn rate_limited(detail: &str) -> String {
format!("taxa de requisição excedida: {detail}")
}
pub fn timeout(operation: &str, secs: u64) -> String {
format!("timeout após {secs}s: {operation}")
}