forked from clairton/unoapi-cloud
-
Notifications
You must be signed in to change notification settings - Fork 3
CHANGELOG
wiki-bot edited this page Oct 16, 2025
·
9 revisions
Todas as mudanças notáveis neste projeto serão documentadas aqui.
O formato segue o Keep a Changelog e adota SemVer quando aplicável.
- Correção: evita estouro de pilha (recursão) ao tratar
editedMessagee updates device-sent emfromBaileysMessageContent(desembrulha e removeupdateantes de recursão). - Recurso: envios em grupo usam LID por padrão; pré-assert de sessões priorizando LIDs; fallback robusto para "No sessions" do libsignal e ack 421 com atrasos adaptativos e alternância de addressingMode.
- Recurso: em 1:1 o serviço aprende ativamente PN→LID (assertSessions + exists) e usa LID internamente quando disponível; logs detalhados do aprendizado.
- Recurso: cache PN↔LID nos stores de Arquivo e Redis com TTL; derivação de PN a partir de LID via normalização da Baileys quando ausente; persistência do mapeamento nos dois sentidos.
- Recurso: imagens de perfil usam PN canônico para nomes/chaves (FS e S3); gets/sets consideram as variantes PN e LID e registram logs de fallback.
- Docs: README e documentos de ambiente/arquitetura (PT-BR e EN) atualizados com o comportamento LID/PN, endereçamento em grupos, política PN-first nos webhooks e canonicidade das imagens.
- Recurso(grupos): redução do fan-out de recibos/status no webhook/socket
- Novas envs (padrão true):
GROUP_IGNORE_INDIVIDUAL_RECEIPTS,GROUP_ONLY_DELIVERED_STATUS - Ignora
message-receipt.updatepor participante em grupos; encaminha apenasDELIVERY_ACKviamessages.updatequando habilitado - Docs: seções adicionadas em EN/PT-BR e .env.example atualizado
- Novas envs (padrão true):
- Correção(chamadas): webhook de rejeição agora retorna PN em vez de LID
- Envia
key.senderPnno evento notify sintético; o transformer prioriza PN paracontacts[0].wa_idemessages[0].from
- Envia
- Correção(decrypt): envia payload estruturado ao webhook em falhas de descriptografia (DecryptError)
- Evita perdas silenciosas e ajuda o cliente a orientar o usuário (ex.: abrir WhatsApp no telefone)
- Correção(webhook): deduplicação leve de mensagens de entrada para evitar duplicatas em reconexão/importação de histórico
- Nova
INBOUND_DEDUP_WINDOW_MS(padrão 7000ms); ignora mesma combinaçãoremoteJid|idvista na janela
- Nova
- Tarefa: bump de versão para 3.0.0-beta-57
- Correção(status 1:1): mapeia id do provedor para id UNO em
message-receipt.updatepara correlacionar delivered/read corretamente- Garante que os updates de status no webhook usem o mesmo id retornado no envio; evita ficar “preso” em entregue ou perder o “lido” em 1:1
- Normalização do id aplicada antes de emitir o webhook (ListenerBaileys)
- Tarefa: bump de versão para 3.0.0-beta-58
- Correção(logging): evitar JSON.stringify em objetos WAProto (WAMessage) para prevenir erro
long.isZero- Sanitiza logs no sender/listener para exibir jid/id/type em vez do objeto completo
- Evita falsos negativos que causavam retry do job e envios duplicados
- Recurso(saída): idempotência para retries do job
- Nova
OUTGOING_IDEMPOTENCY_ENABLED(padrão true). Job consulta o store (key/status) pelo id UNO e ignora reenvio se já estiver processado
- Nova
- Tarefa: bump de versão para 3.0.0-beta-59
- Recurso(foto de perfil): padroniza nome de arquivo como número (PN) e suporta atualização do cache
- Sempre salva como
<pn>.jpg(ex.:5566996269251.jpg), mapeando LID→PN quando necessário -
PROFILE_PICTURE_FORCE_REFRESH(padrão true) para atualizar o cache buscando no WhatsApp antes de retornar a URL -
getProfilePictureUrl(S3/FS) resolve LID→PN e retorna URL nomeada pelo PN
- Sempre salva como
- Correção(webhook): inclui foto de perfil também em updates/receipts usando cache local quando
sendProfilePictureestiver ativo
- Recurso(foto de perfil): prefetch ao enviar e logs detalhados
- A cada envio (1:1/grupo) faz prefetch da foto para atualizar o cache do storage proativamente
- Logs: início/fim do prefetch, lookup, cache hit, fetch no WA, URL local persistida, gravação FS/S3
- Correção(build): imports e acesso à config no listener
- data_store_file: importa
ensurePnePROFILE_PICTURE_FORCE_REFRESH - listener_baileys: usa
configem vez dethis.config
- data_store_file: importa
- Correção(foto 1:1): busca robusta de fotos de perfil
- Tenta JID PN primeiro e depois LID mapeado (image → preview), sempre salvando como
<pn>.jpg - Logs de prefetch/lookup/fetch/persist; valida existência no S3 antes de gerar URL
- Tenta JID PN primeiro e depois LID mapeado (image → preview), sempre salvando como
- Correção(logging): evita JSON.stringify de estruturas WAProto no envio (previne erro
long.isZero) - Miscelânea: pequenos ajustes de build e estabilidade
- Recurso: adiciona provedor de transcrição de áudio Groq (endpoint compatível com OpenAI em
/audio/transcriptions) com prioridade Groq → OpenAI → Whisper local (audio2textjs). - Recurso: configuração por sessão para Groq, persistida no Redis e com prioridade sobre env:
-
groqApiKey,groqApiTranscribeModel(padrãowhisper-large-v3),groqApiBaseUrl(padrãohttps://api.groq.com/openai/v1).
-
- Config: novas variáveis de ambiente integradas ao carregamento de config:
-
GROQ_API_KEY,GROQ_API_TRANSCRIBE_MODEL,GROQ_API_BASE_URL.
-
- UI: adicionados campos Groq no modal de configuração em
public/index.html(Groq API Key,Groq Transcribe Model,Groq API Base URL) com i18n (EN/PT-BR). - Docs: adicionados guias de transcrição
docs/TRANSCRIPTION_AUDIO.md(EN) edocs/pt-BR/TRANSCRICAO_AUDIO.md(PT-BR); nova seção “Transcrição de Áudio” vinculada empublic/docs/index.html.
- Versão base mencionada pelos usuários; as correções e recursos acima entram como "Não lançado" até a próxima tag.