pub fn validation(msg: &str) -> String {
format!("erro de validação: {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("memory not found:", "memória não encontrada:")
.replace("not found in namespace", "não encontrada no namespace")
.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("name='", "nome='")
.replace("memory", "memória")
.replace("entity", "entidade")
.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 preflight_failed(detail: &str) -> String {
format!(
"validação pré-execução falhou (exit 16): {detail}; corrija a condição e tente novamente (config set spawn.skip_preflight=1 desabilita em emergências)"
)
}
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}")
}