Os avatares "não vinham todos" porque o enfileiramento era capado em 3
pontos, embora a fila (processAvatarQueue) já seja rate-limited e processe
tudo que entra:
- upsert: cap de 50 por batch (randomizado) -> enfileira todos os pendentes
- syncMissingAvatars: take 80 -> cobre TODOS (chats recentes primeiro +
varredura paginada de todos os contatos sem avatar)
- syncExpiredAvatars: take 200 + slice 80 -> varre paginado e renova todos
os avatares com URL do CDN do WhatsApp expirando (<48h)
A cobertura total não dispara ban: a fila mantém ~1 req/s (lotes + delay);
apenas leva mais tempo, em background.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
BotOff não é exportado pelo lucide-react e gerava "Attempted import error"
no build. O indicador de "bot pausado" no ChatListItem agora usa Bot —
o title e a cor âmbar já comunicam o estado.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
O avatar da instância na ThinSidebar caía no fallback
activeInstance.avatar/profilePictureUrl — URL do CDN pps.whatsapp.net que
expira e responde 403 (hotlink) no navegador. Agora usa só o proxy do
backend (/proxy-avatar → /api/inbox/avatar, que baixa server-side); sem
proxy resolvível, mostra o ícone em vez da URL crua.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Adiciona @@index nas FKs que sofrem cascade/SET NULL ao deletar instância:
messages.replyToId (self-ref, evitava O(n²) no SET NULL), chats.instanceId,
chats.contactId, contacts.instanceId, broadcasts.instanceId.
- InstanceRepository.delete agora apaga 'messages' em lotes (5k) antes do
cascade, evitando transação/locks gigantes em instâncias com dezenas de
milhares de mensagens. O restante (chats/contacts/...) sai pelo cascade,
agora rápido com os índices.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
optimistic-chebyshev-8b2ae4 e suspicious-shockley-980a1e estavam
commitados na main indevidamente; limpa o git status.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Atualiza o ponteiro do submódulo: doc STATUS-SEGURANCA-E-PRODUCAO.md
(JWT sem commit + contagem) e novo dev-build.sh (carimba versão em DEV).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- pg-dev/: container PostGIS único multi-DB (ref+dev por template) p/ desgrudar dev da produção; scripts refresh/reset + manifesto (secrets fora do git)
- bump scoreodonto.com e subdominio.clube67.com (backends dev apontam p/ pgdev via .env)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Aponta scoreodonto.com, mercado.clube67.com, instrucoes_gerais e
newwhats.local.wiki para os commits de renomeação staging->dev.
Inclui os 2 docs locais restantes (arquitetura_vlan_proposta.md,
clube67/newwhats.local/arquitetura.md).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Aponta para o merge de reconciliação no scoreodonto.com (branch
reconcile-onboarding-plugins): linha local (onboarding/plugins/RX) já
contendo o trabalho do origin/main (multi-tenancy/score/imports).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>