Commit Graph

90 Commits

Author SHA1 Message Date
VPS 4 Deploy Agent 1efc0ab1d1 chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-12 03:33:56 +02:00
VPS 4 Deploy Agent 4efa6fb2f2 fix(media): aplica estado 'não disponível' a imagem, vídeo, documento e sticker
continuous-integration/webhook Deploy concluido com sucesso (VPS 4)
Estende o tratamento de erro 400/404 do redownload para todos os tipos
de mídia. Quando mediaUnavailable=true (payload ausente no backend),
cada tipo exibe sua mensagem específica e desabilita o clique:
- Imagem: 'Imagem não disponível'
- Vídeo: 'Vídeo não disponível'
- Documento: 'Arquivo não disponível' + cursor-default
- Sticker: 'Figurinha não disponível'
DocumentBubble recebe nova prop mediaUnavailable para controle interno.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 03:32:02 +02:00
VPS 4 Deploy Agent a3c78aed8c chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-12 03:28:29 +02:00
VPS 4 Deploy Agent 5fb9a8f34a fix(audio): trata erro 400/404 no redownload com estado 'Áudio não disponível'
continuous-integration/webhook Deploy concluido com sucesso (VPS 4)
Mensagens antigas sem mediaPayload retornam 400 do backend (sem como
re-solicitar ao WhatsApp). O erro agora é capturado em handleRedownload,
que seta mediaUnavailable=true — o botão fica desabilitado e exibe
'Áudio não disponível' em vez de explodir com Uncaught (in promise).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 03:26:29 +02:00
VPS 4 Deploy Agent 0af0eba663 chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-12 03:22:07 +02:00
VPS 4 Deploy Agent 634426ed15 fix(audio): corrige redownload de áudio + move botão de velocidade antes do waveform
continuous-integration/webhook Deploy concluido com sucesso (VPS 4)
1. MessageArea: handleRedownloadMedia usava selectedChat?.instanceId (undefined
   no formato legado) — substituído por instance_name ?? instanceId. O clique
   em 'Toque para baixar áudio' agora chama o backend corretamente.

2. MessageBubble/AudioBubble: botão de velocidade (1×/1.5×/2×) movido para
   entre o botão play e as barras do waveform, conforme layout do WhatsApp.
   A linha inferior agora exibe apenas o tempo decorrido.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 03:19:48 +02:00
VPS 4 Deploy Agent 5b3259d705 chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-12 03:13:00 +02:00
VPS 4 Deploy Agent 9d082a17e4 fix(whatsapp): mensagens do celular perdidas para contatos @lid + crash P2002
continuous-integration/webhook Deploy concluido com sucesso (VPS 4)
Três correções independentes para mensagens enviadas/recebidas via celular:

1. WhatsAppConnectionManager: o listener CB:message agora captura também
   recipient_pn (InfiniteAPI v7+) além de peer_recipient_pn (Baileys oficial),
   garantindo que o PN correto do destinatário seja gravado no peerRecipientHints
   antes do messages.upsert ser emitido.

2. MessageHandler.processMessage: adicionado fast path fromMe=false via
   remoteJidAlt para contatos @lid (InfiniteAPI já resolve o PN do remetente).
   Para fromMe=true onde InfiniteAPI resolveu @lid→nosso próprio JID incorretamente,
   recupera o JID correto via peerRecipientHints antes de descartar como self-chat.

3. MessageHandler.processHistoryBatch: corrigido guard senderPn que não testava
   !msg.key.fromMe; para mensagens enviadas, senderPn é o nosso próprio JID,
   não o destinatário — o que criava self-chats corrompidos no DB.

4. whatsapp.send.routes: adicionado .catch P2002 no upsert da rota POST /send;
   race condition com eco Baileys causava unhandled rejection → exit(1) no Node 20.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 03:10:56 +02:00
VPS 4 Deploy Agent ab688b7ef8 chore(deploy): bump version
continuous-integration/webhook Ignorado: bump version
2026-05-11 23:31:54 +02:00
ruicesar 3f6b646658 feat(self-healing): adiciona o bridge server do Grafana para Gitea e guia de arquitetura
continuous-integration/webhook Deploy concluido com sucesso (VPS 4)
2026-05-11 23:28:15 +02:00
VPS 4 Deploy Agent c06043b6ac chore(deploy): bump version 2026-05-11 22:52:53 +02:00
ruicesar bd6801a563 feat(webhook): integra listener com a API de Status do Gitea 2026-05-11 22:50:00 +02:00
VPS 4 Deploy Agent f570a2f208 chore(deploy): bump version 2026-05-11 21:58:27 +02:00
Rui 5e69fe4eb9 Atualiza vpn-setup.md, adiciona arquitetura_vlan_proposta.md e system_resources_monitor.py 2026-05-11 21:56:04 +02:00
VPS 4 Deploy Agent cdacfcd3a6 feat(preloader): replace WhatsApp icon with smooth circle SVG 2026-05-11 21:55:20 +02:00
VPS 4 Deploy Agent 6f415cac9f chore(deploy): bump version 2026-05-11 21:44:26 +02:00
VPS 4 Deploy Agent 2233060ffb fix(plugins): adiciona backend/src ao include do tsconfig para resolver erros de editor
Resolve erros "Cannot find module" no language server do VS Code ao abrir
arquivos de plugins que importam tipos via caminho relativo do backend.
O build de produção não era afetado (tsc seguia os imports normalmente),
mas o extHost2 do editor não resolvia os arquivos fora do include.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 21:41:16 +02:00
VPS 4 Deploy Agent 5fb3a687da chore(deploy): bump version 2026-05-11 19:02:22 +02:00
VPS 4 Deploy Agent 539b922ce3 feat(media): re-download de mídia não baixada ao clicar
- Armazena payload WAMessage (serializado com _b64 para Uint8Array) em
  messages.mediaPayload no momento da recepção da mensagem
- Nova rota POST /instances/:id/redownload-media/:msgId que usa
  sock.updateMediaMessage para renovar URL expirada + re-upload Wasabi
- Frontend: placeholders clicáveis (spinner + texto) para imagem, vídeo,
  áudio, documento e figurinha sem media_url; atualização automática via
  socket message:media_ready existente

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 18:58:01 +02:00
VPS 4 Deploy Agent 3a50f73cb4 chore(deploy): bump version 2026-05-11 18:03:01 +02:00
VPS 4 Deploy Agent fc8036750d fix(storage): remove auth de /api/storage/view e try-catch nos sticker routes
- /api/storage/view/* não usa mais authMiddleware: <img>/<audio>/<video> do
  browser não enviam JWT header, causando 401 em todas as mídias do Wasabi
- sticker.routes.ts: wrap try-catch em todos os handlers — sem isso, erro
  Prisma P2021 (tabela não existe) vira unhandled rejection e derruba Node 22

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 18:00:08 +02:00
VPS 4 Deploy Agent 2e40c95874 chore(deploy): bump version 2026-05-11 17:52:37 +02:00
VPS 4 Deploy Agent b97f7f94e4 feat: sistema de figurinhas, emoji PT-BR e preloader inteligente
- Stickers: captura automática por fileSha256 (Baileys) no MessageHandler,
  tabela Prisma 'stickers' com deduplicação por [tenantId, sha256],
  API REST /api/stickers (list + favorite toggle), cache IndexedDB permanente
  (sem TTL — conteúdo imutável), StickerPanel.tsx com abas Recentes/Favoritos
- Emoji picker: migrado de emoji-picker-react para @emoji-mart/react com
  locale="pt" (tradução completa: categorias, busca, mensagem de sem resultado)
- Preloader: aparece apenas em hard reload (F5/URL direta) via
  performance.getEntriesByType('navigation').type + sessionStorage flag,
  navegação client-side Next.js pula o overlay instantaneamente
- Avatar cache: Wasabi como storage persistente + IndexedDB client-side,
  avatar_version via MD5(avatarUrl) sem coluna extra no banco,
  rota /api/storage/view/* para servir arquivos Wasabi ao frontend

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 17:48:36 +02:00
VPS 4 Deploy Agent 2b9b855fc9 perf(inbox): cache de avatares no Wasabi e IndexedDB
Solução 3 — Wasabi:
- Após download do CDN do WhatsApp, faz upload fire-and-forget para
  Wasabi com path determinístico (avatars/{tenant}/{instance}/{jid}.jpg)
- Armazena o path relativo em contact.avatarUrl no banco
- Na próxima requisição, serve bytes direto do Wasabi sem tocar no CDN do WA
- Adiciona customPath em StorageUploadPayload e getBuffer() na interface
  StorageProviderInterface/StorageProviderRegistry e plugin

Solução 4 — IndexedDB:
- Backend expõe avatarVersion (MD5 curto do avatarUrl) no response /api/chats
- Campo propagado por chatStore → chatToLegacy → NewWhatsChat
- Hook useAvatarCache (IndexedDB nativo, sem deps) armazena dataUrl do avatar
  com chave jid:version — invalida automaticamente quando o avatar muda no banco
- Avatar.tsx serve do IndexedDB antes de disparar qualquer request HTTP;
  converte via canvas e persiste no IndexedDB na primeira carga bem-sucedida

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 16:02:08 +02:00
VPS 4 Deploy Agent cdc32aa9b3 chore(deploy): bump version 2026-05-11 09:44:35 +02:00
VPS 4 Deploy Agent 22891e1274 fix(listener): skip version-bump commits to prevent deploy loop
Parse Gitea webhook payload and skip the deploy when all commits
match 'chore(deploy): bump version'. This breaks the infinite cycle
where the deploy script's own version-bump push re-triggered a deploy,
causing repeated container restarts and 502 errors for users.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 09:42:40 +02:00
VPS 4 Deploy Agent a54b3f2b19 chore(deploy): bump version 2026-05-11 09:41:46 +02:00
VPS 4 Deploy Agent a7f4d6bc1e feat(preview): fix button layout and add mouse-following zoom
- Move close (X) button to far right, zoom button left of X
- File info (name + size) occupies the left of the top bar
- Zoom now follows the mouse cursor: transform-origin updates in
  real-time as the mouse moves, so 2.5× scale always magnifies
  the area under the pointer
- overflow-hidden on preview area keeps the scaled image contained

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 09:39:27 +02:00
VPS 4 Deploy Agent 310ba1aff6 chore(deploy): bump version 2026-05-11 09:24:14 +02:00
VPS 4 Deploy Agent 7b55354653 fix(send-media): use upsert to prevent P2002 duplicate messageId error
MessageHandler can insert the echo of a sent message before the HTTP
handler does — replace prisma.message.create() with upsert() so both
paths converge safely instead of crashing with a unique constraint error.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 09:21:50 +02:00
VPS 4 Deploy Agent d7acd75bd5 chore(deploy): bump version 2026-05-11 09:15:45 +02:00
VPS 4 Deploy Agent 4d0b895c7e chore(deploy): bump version 2026-05-11 09:13:51 +02:00
VPS 4 Deploy Agent 949274e79b chore(deploy): bump version 2026-05-11 09:12:14 +02:00
VPS 4 Deploy Agent 7ec3d78be2 chore(deploy): bump version 2026-05-11 09:10:27 +02:00
VPS 4 Deploy Agent b0ac06e065 chore(deploy): bump version 2026-05-11 09:08:40 +02:00
VPS 4 Deploy Agent bbbc010945 chore(deploy): bump version 2026-05-11 09:06:59 +02:00
VPS 4 Deploy Agent 706fceabaf chore(deploy): bump version 2026-05-11 09:05:06 +02:00
VPS 4 Deploy Agent 875f31419e chore(deploy): bump version 2026-05-11 09:03:16 +02:00
VPS 4 Deploy Agent 918bce648c chore(deploy): bump version 2026-05-11 09:01:24 +02:00
VPS 4 Deploy Agent f83f1d9263 chore(deploy): bump version 2026-05-11 08:59:18 +02:00
VPS 4 Deploy Agent 80f8585a1f chore(deploy): bump version 2026-05-11 08:57:44 +02:00
VPS 4 Deploy Agent 16dbc40c8a chore(deploy): bump version 2026-05-11 08:56:09 +02:00
VPS 4 Deploy Agent 6f28d3da80 chore(deploy): bump version 2026-05-11 08:54:25 +02:00
VPS 4 Deploy Agent 2a9744762f chore(deploy): bump version 2026-05-11 08:52:45 +02:00
VPS 4 Deploy Agent bed15dd589 chore(deploy): bump version 2026-05-11 08:50:58 +02:00
VPS 4 Deploy Agent 4287b8c1d7 chore(deploy): bump version 2026-05-11 08:49:12 +02:00
VPS 4 Deploy Agent 811a9b9c65 chore(deploy): bump version 2026-05-11 08:47:38 +02:00
VPS 4 Deploy Agent b54c9fb066 chore(deploy): bump version 2026-05-11 08:45:58 +02:00
VPS 4 Deploy Agent 8253a038c6 chore(deploy): bump version 2026-05-11 08:44:13 +02:00
VPS 4 Deploy Agent c7d3701ea3 chore(deploy): bump version 2026-05-11 08:42:33 +02:00