Commit Graph

14 Commits

Author SHA1 Message Date
VPS 4 Deploy Agent bfa320b280 feat(instances): POST /provision — trajeto inteligente e idempotente
Cria+configura a conta no motor em um passo: instância (engine 'baileys7' = API
estável por padrão), setor default (idempotente por [tenantId,name]), webhook
opcional e connect opcional (emite QR). Devolve o 'trajeto' com cada passo
visível (instancia/engine/setor/webhook/conexao/business/secretaria/conhecimento),
marcando como pendentes os passos de plugin/satélite. Re-rodar não duplica.

InstanceRepository: provision() (upsert por unique [tenantId,name]) e ensureSector().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:57:56 +02:00
VPS 4 Deploy Agent e47b64a5b5 feat(media): index e delete em lote de mídias (Wasabi, coordenado DB↔storage)
- StorageProvider.deleteObjects(paths): delete seletivo em lote (chunks de 1000),
  no provider concreto (Wasabi DeleteObjectsCommand + fallback local).
- GET /api/instances/:id/media-index: index/auditoria por chat/tipo/período
  (baseado no DB, com agregado byType, paginado).
- POST /api/instances/:id/media-batch-delete: delete coordenado DB↔Wasabi,
  dryRun por padrão (precisa dryRun:false p/ apagar); limpa mediaPath/mediaUrl.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:52:25 +02:00
VPS 4 Deploy Agent 7893a05f63 feat(media): transcrição de áudio + descrição de imagem no motor (via Gemini)
Move a transcrição para o motor (genérica p/ todos os tenants/satélites):
- media-transcribe.ts: Gemini 2.0 Flash (áudio→texto, imagem→descrição) a partir
  do buffer já baixado; limite inline 18MB; fallback silencioso.
- MessageHandler.processMedia: após salvar a mídia, transcreve fire-and-forget e
  grava em messages.transcription, emitindo 'message:transcription' p/ a UI.
- schema: campo Message.transcription (coluna aplicada nos bancos).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:33:42 +02:00
VPS 4 Deploy Agent 8d35fa1fdf fix(media): deriva extensão/content-type do mimetype (corrige arquivos .bin)
Documentos sem nome/extensão eram salvos como .bin mesmo tendo mimetype
conhecido. Agora a extensão vem de: nome original → mimetype (pdf/docx/xlsx/
mp3/...) → .bin só como último recurso. O serve do Wasabi (/api/storage/view)
também passa a mapear content-type para muitos tipos, não só octet-stream.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 06:11:00 +02:00
VPS 4 Deploy Agent 43f519e7aa feat(settings): selo Conta Business, aviso de re-scan ao trocar API, log de erro de botões
- Detecta WhatsApp Business (app) via getBusinessProfile no pós-conexão e
  persiste em instances.isBusiness; painel mostra "Conta Business: sim/não"
  (com nota Business App ≠ Business API).
- Painel avisa que trocar de API desconecta e exige escanear o QR novamente,
  com confirmação antes de aplicar a troca.
- sendRichMessage agora monitora e loga erros especificamente quando a mensagem
  tem botões/lista/carrossel (diagnóstico de rejeição de interativos por engine).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 05:45:34 +02:00
VPS 4 Deploy Agent 5170a31aac feat(engine): adiciona 3ª engine Baileys 7 oficial (baileys7) para teste
Instala baileys@7.0.0-rc13 sob alias 'baileys-official' (coexiste com a
'infinite' = baileys 7.0.0-rc.9 e a 'official' = @whiskeysockets/baileys 6.x).
Nova engine 'baileys7' (LID/username, app-state moderno) selecionável por
instância; validação do PATCH /engine e rich-message (botões nativos v7)
atualizados; opção adicionada ao seletor da ThinSidebar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 04:42:42 +02:00
VPS 4 Deploy Agent e980097fbe feat(chats): sincroniza chats fixados (pin/arquivo) via app-state
Pin/arquivo/mute não vêm no history sync nem em chats.upsert — vivem no
app-state do WhatsApp. Adiciona syncChatStates() que faz resyncAppState das
collections critical_unblock_low/regular_high/regular (isoladas: uma falha não
derruba as outras); os pins chegam como chats.update e já são aplicados em
isPinned, subindo os fixados ao topo (ordenação já existente). Roda no
pós-conexão e reexecuta (3s/15s/40s) pois as app-state keys chegam após parear.
Obs.: depende da engine 'official' (a InfiniteAPI não sincroniza app-state).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:53:57 +02:00
VPS 4 Deploy Agent 9d2412df21 feat(safety): kill switch de saída (DISABLE_OUTBOUND) p/ ambientes de teste
Quando DISABLE_OUTBOUND=true, envolve sock.sendMessage na criação da sessão e
bloqueia QUALQUER envio ao WhatsApp — backstop universal, pois todo envio
(rotas, IA/secretária, chatbot, scheduler, warmer, plugins) usa este sock.
Evita que automações disparem mensagens a contatos/grupos reais ao conectar uma
sessão real em dev. Em produção a flag fica ausente/false (envios normais).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:17:10 +02:00
VPS 4 Deploy Agent 58583db63d chore(backend): remove .js/.js.map artefatos versionados em src + gitignore
src/ continha 114 artefatos (.js + .js.map) de builds antigos mal-configurados,
commitados por engano. Não são usados em runtime (dev usa tsx sobre .ts; prod usa
dist/, gerado por tsc com rootDir=src/outDir=dist). Remove todos e adiciona
backend/.gitignore para impedir que voltem.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 23:49:56 +02:00
VPS 4 Deploy Agent 93be34d463 feat(avatar): sincroniza TODOS os avatares (remove caps de enfileiramento)
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>
2026-06-27 23:36:18 +02:00
VPS 4 Deploy Agent 7124ec790e perf(whatsapp): índices em FKs + delete de instância em lotes
- 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>
2026-06-27 18:58:06 +02:00
VPS 4 Deploy Agent 5876b783b0 feat(backend): add dynamic CORS origin validator supporting newwhats.clube67.com and subdomains
continuous-integration/webhook Deploy de clube67_newwhats.local concluido com sucesso (VPS 4)
2026-05-18 03:52:34 +02:00
VPS 4 Deploy Agent 2f8c04a0a7 chore(ops): restore all source files in newwhats.clube67.com
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
2026-05-18 03:28:29 +02:00
VPS 4 Deploy Agent 5ec6bd6354 chore(ops): migrate clube67 to newwhats.clube67.com directory
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
2026-05-18 03:26:41 +02:00