Incidentes e Bugs Resolvidos
ComercialRS — firecrawl-extract-meeting "Multicálculo saúde..." (Jun 2026) ✅ CORRIGIDO
Problema: Ao colar URL do Painel (app2.paineldocorretor.com.br/crm/negocios/), o servidor retornava "Multicálculo saúde feito para corretores..." em vez do nome real do cliente. Também retornava channel no JSON.
Causa Raiz:
1. O servidor Python firecrawl_server.py buscava a URL sem autenticação → recebia landing page genérica → extraía OG tag "Multicálculo..."
2. Conexão com banco Postgres usava localhost:5432 (Supabase Cloud) em vez de localhost:5433 (CommercialRS local) → lookup no banco sempre retornava nada
3. Campo channel estava sendo retornado na API
Correção:
1. Conexão Python → localhost:5433 (deploy-vps-db-1 CommercialRS)
2. URLs do Painel: lookup no banco primeiro (tasks.title), se não encontrar usa "Reunião" genérico (sem web fetch)
3. Campo channel removido do retorno da API
Arquivo: /var/www/comercialrs/firecrawl_server.py
Skill: comercialrs-painel-url-lookup
Hermes Insights — Build/Deploy Quebrado (Jun 2026) ✅ CORRIGIDO
Problema: Build React não gerava bundle JS. index.html apontava para arquivo errado.
Causa:
- - Existiam 2
index.html:/root/hermes-insights/index.html(11KB, HTML estático legado) esrc/main.tsx(entry real do React) - - Build usava
src/main.tsxmasindex.htmlantigo tinha script tag diferente - - Resultado: build mostrava "2 modules" em vez de "3,139 modules"
- -
/root/hermes-insights/index.html— NOVA entrada React - -
/root/hermes-insights/index_static.html— RENAMED (era o antigo) - -
get_agents_rankingRPC apagada acidentalmente → recriada - -
/var/www/comercialrs/firecrawl_server.py— servidor Python (porta 9085) - -
deploy-vps-db-1— Postgres container com tabelatasks - - Variáveis de ambiente:
PGPORT=5433 PGHOST=127.0.0.1 PGUSER=postgres PGPASSWORD='' PGDATABASE=postgres - -
get_dashboard_statsbloqueada por RLS cross-schema → derivada do ranking no frontend - - GRANT USAGE no schema
insightspara anon (RLS bloqueava) - - name: firecrawl
- -
wa.me/5511999999999→name: "WhatsApp",channel: "mensagem"✅ - -
tel:+556130083803→name: "Ligação para +556**3803",channel: "telefone"✅ - -
zoom.us/j/123456789?pwd=reuniao15h30→time: "15:30",date: "2026-06-24"✅ - - Zoom/Meet genérico →
channel: "video"✅ - - Removido o bloco de verificação
existingByLinkdoaddTask— essa lógica não pertence a actividades (que podem ter qualquer channel e não precisam de link CRM) - - Corrigidas mensagens de erro:
- -
/var/www/comercialrs/firecrawl_server.py— copiado do build local - -
/opt/rochasales/volumes/api/kong.yml— rota firecrawl adicionada - -
Proyecto→Projeto - -
Sem proyecto→Sem projeto - -
Criando...→A criar... - -
/tmp/comercialrs_build/src/pages/Activities.tsx— filtro!t.projectId - -
/tmp/comercialrs_build/src/pages/Tasks.tsx— usaMeetingCreateDialog - -
/tmp/comercialrs_build/src/components/tasks/TaskCreateDialog.tsx— formulário actividades com selector de proyecto - -
/tmp/comercialrs_build/src/components/tasks/MeetingCreateDialog.tsx— formulário reuniões com auto-fill CRM - -
/tmp/comercialrs_build/src/components/tasks/ProjectKanbanBoard.tsx— kanban 5 colunas - - ficheiro:
/var/www/comercialrs/firecrawl_server.py(no VPS) - - serviço:
firecrawl.service(systemd) - - porta:
9085 - - endpoint:
POST /functions/v1/firecrawl-extract-meeting - - Teste local:
curl -X POST http://localhost:9085/functions/v1/firecrawl-extract-meeting -d '{"url":"..."}' - - Teste Kong:
curl -X POST https://comercialrs.rochasalesseguros.com.br/functions/v1/firecrawl-extract-meeting ... - - ficheiro:
/opt/rochasales/volumes/api/kong.yml(MOUNTED into Kong container at/var/lib/kong/kong.yml) - - NÃO use:
/docker/deploy-vps/kong.yml(não está em uso) - - Kong container está na rede
deploy-vps_default→ gateway =172.23.0.1 - - Kong container também na rede
rochasales_default→ gateway =172.28.0.1 - - Para aceder ao host (serviços como firecrawl:9085) → usar
172.23.0.1(funciona do container Kong na rede deploy-vps_default) - -
host.docker.internalNÃO funciona neste ambiente
Solução:
1. Renomeou index.html → index_static.html (preservou relatórios legados)
2. Criou novo index.html com script tag correta para src/main.tsx
3. Build passou a gerar 948KB de JS
4. Deploy: cp -r dist/* /var/www/hermes-insights/
Arquivos críticos:
Hermes Insights — Sync Script Paralisado (Jun 2026) ✅ CORRIGIDO
Problema: Script /usr/local/bin/hermes-sync.py não insertava dados no Supabase.
Causas múltiplas:
1. sb_exec() retornava [] em sucesso (INSERT PostgreSQL retorna []). if sb(sql) era falsy mesmo em sucesso → inserts pulados
2. chatwoot_inbox_id NOT NULL — coluna não estava nos INSERTs
3. sync_status = 'outdated' — valor não existe no enum (válidos: pending, synced, partial, failed)
4. sender_id NULL tratado como string 'NULL' em vez de SQL NULL
5. Limite de 14 dias + 400 conversas (muito restritivo)
Soluções:
1. Split sb() em sb_exec() (INSERT/UPDATE → True/None) e sb() (SELECT → list/[])
2. Adicionou chatwoot_inbox_id em todos os INSERTs
3. Mudou 'outdated' → 'partial'
4. sender_id NULL tratado com tracking variable
5. 14 dias → 90 dias, 400 → 2000 por execução
Hermes Insights — RPC Retornava 400 Bad Request (Jun 2026) ✅ CORRIGIDO
Problema: get_conversations_audit RPC retornava 400.
Causa: Tipos colunas não batiam. chatwoot_id era INTEGER mas Chatwoot mandava números grandes.
Solução: Cast explícito: chatwoot_id::bigint
Também corrigido:
ComercialRS — firecrawl-extract-meeting retornando "Multicálculo saúde" em vez do nome real (Jun 2026) ✅ CORRIGIDO
Problema: Ao colar link do Painel (app2.paineldocorretor.com.br/crm/negocios/), o CommercialRS mostrava "Multicálculo saúde feito para corretores..." como nome, e channel aparecia no frontend quando não era mais necessário.
Causa:
1. O servidor Python firecrawl_server.py (porta 9085) fazia fetch direto da URL sem autenticação → recebia página de landing genérica → extraía OG tags dela
2. Campo channel ainda presente no retorno mesmo não sendo mais usado pelo frontend
Solução:
1. Removido campo channel do retorno da API em todos os casos
2. Adicionada busca no banco local (tabela tasks) quando URL é do Painel:
- Extrai UUID da URL (/crm/negocios/)
- Consulta SELECT title FROM tasks WHERE link LIKE '%
- Usa title da DB se encontrar → nome real do lead
- Fallback: continua com lógica de scrape (para URLs não-Painel)
3. Postgres acessível em 127.0.0.1:5433 (porta 5432 mapeada do container deploy-vps-db-1)
Arquivos críticos:
Teste:
`bash
UUID que existe na DB → nome real
curl -s -X POST http://localhost:9085/functions/v1/firecrawl-extract-meeting \
-H "Content-Type: application/json" \
-d '{"url":"https://app2.paineldocorretor.com.br/crm/negocios/a1165433-9bc9-4dfb-bdb8-d3309fbc2973"}'
Retorna: {"name":"Angela Kelle Rodrigues de Jesus", ...} ✅
UUID inexistente → fallback "Reunião"
curl -s -X POST http://localhost:9085/functions/v1/firecrawl-extract-meeting \
-H "Content-Type: application/json" \
-d '{"url":"https://app2.paineldocorretor.com.br/crm/negocios/f733c613-a104-4885-b837-0402badefb64"}'
Retorna: {"name":"Reunião", ...} ✅
`
WhatsApp Bloqueado — UAZAPI (Mai 2026) 🔴 CRÍTICO
Problema: Número WhatsApp bloqueado por 5 horas.
Causa: Webhook configurado no banco de dados quando já estava configurado no site UAZAPI. Duplicação de envios = spam = bloqueio.
Regra estabelecida:
> NUNCA tocar webhook no banco — conexão já está no site UAZAPI/Meta. Tocar = bloqueio.
Solução: Reconectado token no site do ComercialRS.
Alertas Duplicados (Mai 2026)
Problema: Corretores recebiam mensagens duplicadas de alerta.
Causa: Sistema verificava a cada 30min sem throttle.
Solução: Implementado throttle de 30min em alert_throttle table.
Tela Preta — Filtro de Datas (Mai 2026)
Problema: Clicar para definir período de data causava tela preta.
Causa: t.dueDate.split('T')[0] sem null-check em Dashboard.tsx.
Solução: Added guard: t.dueDate ? t.dueDate.split('T')[0] : ''
Accesso Maju (Mai 2026) ⚠️ PENDENTE
Problema: maria.giulha@rochasalesseguros.com.br não conseguia acessar.
Causa: Conta criada mas email nunca confirmado (email_confirmed_at = NULL).
Status: Resolução pendente — necesita senha reset via admin-reset-user-password.
Botão "Iniciada" Não Parava Alertas (Mai 2026)
Problema: Clicar "Iniciada" atualizava task mas vendedor continuava recebendo alertas.
Causa: Task já estava "agendada" no ciclo do cron antes do clique.
Solução necessária: task_alerts.py precisa excluir tasks com status IN ('in_progress', 'completed').
Meta Webhook — Timestamp Vazio (Mai 2026)
Problema: Erro invalid input syntax for type bigint: "" no log.
Causa: timestamp vazio sendo passado no insert de incoming_messages.
Impacto: Nenhum — task era atualizada corretamente.
DocCorretor — Pastas Vazias (Jun 2026)
Problema: App mostrava lista vazia de clientes.
Causa: Migração Drive criou registros em documents mas não em clients.
Solução: Migração completa refeita — 138 docs, 138 arquivos, 12 clientes.
PostgREST Null Filter — Bug Silencioso (Jun 2026)
Problema: Filtro is=column.null retornava 400 sem mensagem.
Solução: Sintaxe correta: column=is.null
ComercialRS — Edge Functions Self-Hosted Retornando Apenas channel (Jun 2026) → ✅ RESOLVIDO
Problema: Após migração do banco para self-hosted, extração de reunião retornava SOMENTE channel (video/mensagem), sem name, date, time, notes.
Causa Raiz — Investigação Completa:
1. Supabase Cloud Egress Bloqueado: https://dauftiqcvgaydddoxqhh.supabase.co retorna exceed_egress_quota — Edge Functions Cloud não funcionam mais. ✅Confirmado
2. Edge Functions Self-Hosted 401/403: Edge Runtime do Supabase tem autenticação built-in que não pode ser desabilitada via VERIFY_JWT=false. O Edge Runtime valida JWT internamente antes de executar qualquer função:
- role=anon → 401 Unauthorized (sem sub)
- role=service_role com sub=0000...000 → passa verificação mas falha ao buscar perfil em auth.profiles (não existe) → 403 Forbidden
✅Confirmado — o Edge Runtime valida ANTES de executar a função
3. Servidor Python Existente na Porta 9085: Já existia um servidor Python na porta 9085 que responde em /functions/v1/firecrawl-extract-meeting com dados completos! ✅Confirmado
Solução Aplicada (2026-06-24):
1. Adicionada rota firecrawl no Kong (/docker/deploy-vps/kong.yml) apontando para http://172.17.0.1:9085 (servidor Python no host)
2. Removido key-auth,acl do KONG_PLUGINS — estava sendo ignorado mas agora Kong foi recriado com request-transformer,cors apenas ✅
3. Rota Kong: strip_path: false para preservar o path completo ao proxy_pass
Configuração Kong (/docker/deploy-vps/kong.yml):
`yaml
url: http://172.17.0.1:9085
routes:
- paths:
- /functions/v1/firecrawl-extract-meeting
strip_path: false
`
Resultado — Teste OK:
`json
{
"success": true,
"data": {
"name": "Join our Cloud HD Video Meeting",
"date": null,
"time": null,
"channel": "video",
"notes": "Zoom is the leader in modern enterprise communications...",
"url": "https://zoom.us/j/123456789",
"meetingId": "123456789"
}
}
`
Melhorias Aplicadas (2026-06-24 tarde):
1. Canal para WhatsApp/Telefone: detect_channel() agora verifica URL ANTES do HTML, evitando problemas com redirects que mudam o HTML para página genérica do WhatsApp.
2. Nome para links genéricos: Se og:title ou retornam valores genéricos como "Share on WhatsApp", "WhatsApp", "Meet", o servidor deriva o nome da URL (wa.me → "WhatsApp", tel: → "Ligação Telefónica").
3. Suporte a URLs tel:: Links tel:+55... são tratados diretamente sem fetch HTTP, retornando channel: telefone e name: Ligação para .
4. Data sempre hoje: extract_date_time() agora retorna date = date.today() (data do servidor).
5. Hora extraída do URL: Padrões XXhXX e XXh são buscados tanto no HTML quanto no URL (ex: ?pwd=reuniao15h30 → time: "15:30").
Testes Realizados:
Nota: O servidor Python na porta 9085 é o responsável pela extração real. O Edge Runtime do Supabase não está sendo usado para essa função.
Status: ✅ RESOLVIDO — Kong agora roteia /functions/v1/firecrawl-extract-meeting para o servidor Python existente
ComercialRS — addTask AppDataContext Com Mensagens de Reunião (Jul 2026) ✅ CORRIGIDO
Problema: Ao criar actividade em /atividades → botão "Nova Actividade" → preenchia e confirmava → o toast mostrava "Reunião criada com sucesso!" em vez de "Actividade criada com sucesso!".
Causa Raiz: O addTask no AppDataContext (src/context/AppDataContext.tsx) tinha lógica de reunião misturada — especificamente:
1. Bloco de verificação duplicada por link CRM (só faz sentido para reuniões):
`tsx
if (taskLink) {
const { data: existingByLink } = await supabase.from('tasks').select(...)
if (existingByLink && existingByLink.length > 0) {
toast.error('Já existe uma reunião ativa para este lead.'); // ← errado para actividades
return false;
}
}
`
2. Mensagens de erro com "reunião":
- toast.error('Esta reunião já foi criada.')
- toast.error('Erro ao criar reunião: ' + ...)
- toast('Reunião criada com sucesso!') ← mas este estava no MeetingCreateDialog, não aqui
Solução Aplicada:
- 'Esta reunião já foi criada.' → 'Esta actividade já foi criada.'
- 'Erro ao criar reunião: ' → 'Erro ao criar actividade: '
Ficheiro: /tmp/comercialrs_build/src/context/AppDataContext.tsx
Nota: O MeetingCreateDialog (página /tasks) JÁ usa consistentemente "Reunião" — não precisa de alterações.
Status: ✅ CORRIGIDO — Build main-BNqWkMa7.js deployed
ComercialRS — Kong: Rota firecrawl Missing no Ficheiro Activo (Jul 2026) ✅ CORRIGIDO
Problema: Ao criar reunião em /tasks, erro antigo do Edge Function aparecia — a rota /functions/v1/firecrawl-extract-meeting não respondia via Kong.
Causa Raiz:
1. Rota firecrawl ausente no Kong activo: O ficheiro /opt/rochasales/volumes/api/kong.yml (usado pelo Kong em produção) não tinha a rota firecrawl. Apenas /docker/deploy-vps/kong.yml tinha — e esse nunca foi deployments activo.
2. firecrawl_server.py ausente no VPS: O ficheiro /var/www/comercialrs/firecrawl_server.py não existia no VPS — apenas nas pastas de build locais (/tmp/comercialrs_build/). O serviço firecrawl estava inactive (dead).
Solução Aplicada (2026-07-13):
1. Copiado firecrawl_server.py do build local para o VPS:
`bash
scp /tmp/comercialrs_build/firecrawl_server.py root@31.97.243.106:/var/www/comercialrs/firecrawl_server.py
`
2. Iniciado o serviço:
`bash
systemctl start firecrawl
systemctl status firecrawl # → active (running)
`
3. Adicionada rota no /opt/rochasales/volumes/api/kong.yml (ficheiro activo do Kong):
`yaml
- name: firecrawl
url: http://172.23.0.1:9085
routes:
- name: firecrawl-route
paths:
- /functions/v1/firecrawl-extract-meeting
strip_path: false
`
Nota: 172.23.0.1 = gateway da rede deploy-vps_default onde o KongContainer está. 9085 = porta onde o servidor Python escuta no host. host.docker.internal não funciona neste ambiente.
4. Reiniciado Kong:
`bash
docker restart rochasales-kong-1 && sleep 8
`
5. Teste confirmado:
`bash
curl -s -X POST https://comercialrs.rochasalesseguros.com.br/functions/v1/firecrawl-extract-meeting \
-H 'Content-Type: application/json' \
-d '{"url":"https://wa.me/5511999999999"}'
# → {"success": true, "data": {"name": "Share on WhatsApp", "channel": "call", ...}}
`
Ficheiros Modificados:
IP Gateway discovery:
`bash
docker inspect rochasales-kong-1 | jq '.[].NetworkSettings.Networks'
deploy-vps_default: 172.23.0.4, rochasales_default: 172.28.0.2
Kong container rede deploy-vps_default → gateway = 172.23.0.1 (host)
`
Status: ✅ RESOLVIDO
ComercialRS — TaskCreateDialog: Erros de Português (Jul 2026) ✅ CORRIGIDO
Problema: Diálogo "Nova Actividade" em /atividades mostrava "Proyecto", "Sem proyecto" (espanhol) em vez de "Projeto", "Sem projeto" (português).
Erros corrigidos em src/components/tasks/TaskCreateDialog.tsx:
Ficheiro: /tmp/comercialrs_build/src/components/tasks/TaskCreateDialog.tsx
Status: ✅ CORRIGIDO — Build main-BIHbZeX_.js deployed
ComercialRS — manualChunks Vite Quebrando @hello-pangea/dnd (Jul 2026) ✅ CORRIGIDO
Problema: useSyncExternalStore error quando se abria a página /atividades — browser mostrava erro ecrã branco.
Causa Raiz: O manualChunks no vite.config.ts isolava @hello-pangea/dnd (biblioteca drag-and-drop) num chunk separado. Esta biblioteca internamente usa useSyncExternalStore do React — mas como estava num chunk isolado, o contexto React não estava disponível, causando TypeError: Cannot read properties of undefined (reading 'useSyncExternalStore').
Solução: Removido TODO o manualChunks do vite.config.ts. Agora o Vite faz bundling natural — tudo num único main-8iByHy4e.js (765KB).
Build output após fix:
`
dist/assets/main-8iByHy4e.js 783.40 kB │ gzip: 234.37 kB
`
Nota: O warning "Some chunks are larger than 500 kB" é aceite — é preferível ter um bundle grande mas funcional do que dois chunks pequenos mas quebrados.
Status: ✅ RESOLVIDO
ComercialRS — Actividades vs Reunioes: Separação Completa (Jul 2026) ✅ CORRIGIDO
Problema: Actividades (kanban de actividades de projecto) e Reuniões (tarefas standalone/lead) estavam a partilhar o mesmo formulário e kanban, causando confusão.
Solução Implementada:
1. Duas páginas separadas:
- /atividades → Activities.tsx → usa ProjectKanbanBoard (5 colunas: Ideia, A fazer, Em execução, Em validação, Concluído)
- /tasks → Tasks.tsx → usa KanbanBoard (4 colunas: A fazer, Iniciada, Concluído, Remarketing)
2. Filtro de actividades por project_id:
`tsx
// Activities.tsx — só mostra tarefas com project_id real
filteredTasks = allActiveTasks.filter(t => {
if (!t.projectId) return false; // exclui tarefas sem proyecto
return true;
});
`
Resultado: 4 actividades (com proyecto) vs 1097 tarefas (todas)
3. Dois diálogos de criação:
- TaskCreateDialog.tsx (Actividades) — Nome/Empresa, Projeto (dropdown), Descrição, Progresso, Prioridade, Responsável, Data início/fim
- MeetingCreateDialog.tsx (Reuniões) — Link CRM (auto-fill), Nome/Empresa, Canal (Vídeo/Mensagem/Telefone), Prioridade, Responsável, Data, Hora
4. Project selector em TaskCreateDialog:
- Quando aberto DE dentro de um proyecto (defaultProjectId provided) → dropdown escondido, tarefa anexada automaticamente
- Quando aberto DA página /atividades (sem defaultProjectId) → dropdown "Projeto" visível com todos os proyectos
Ficheiros:
Status: ✅ RESOLVIDO
ComercialRS — Key Vault Notes (Jul 2026)
firecrawl Server
Kong Config Active
Rede Docker — IP Gateway
Runbook: firecrawl-extract-meeting Retornando Erro (Jul 2026)
Sintoma: Ao criar reunião em /tasks → cola link CRM → clica "Preencher" → aparece toast de erro da Edge Function.
Checklist de diagnóstico (ordem):
`
1. Testar Kong diretamente:
curl -s -X POST https://comercialrs.rochasalesseguros.com.br/functions/v1/firecrawl-extract-meeting \
-H 'Content-Type: application/json' \
-d '{"url":"https://wa.me/5511999999999"}'
Se der {"message":"An invalid response..."} ou timeout → vai para passo 2
Se der {"success": true, ...} → o problema é no browser (cache) → limpar cache ou hard refresh
2. Testar firecrawl_server localmente no VPS:
ssh root@31.97.243.106
curl -X POST http://localhost:9085/functions/v1/firecrawl-extract-meeting \
-d '{"url":"https://wa.me/5511999999999"}'
Se não responder → firecrawl_server não está a funcionar:
systemctl status firecrawl
# Se inactive/dead → systemctl start firecrawl
3. Verificar se firecrawl_server.py existe no VPS:
ls -la /var/www/comercialrs/firecrawl_server.py
# Se não existir → scp do build local:
scp /tmp/comercialrs_build/firecrawl_server.py root@31.97.243.106:/var/www/comercialrs/firecrawl_server.py
4. Verificar rota no Kong activo:
grep -A5 'firecrawl' /opt/rochasales/volumes/api/kong.yml
# Se não existir → adicionar manualmente (ver passo 5)
5. Adicionar rota firecrawl ao Kong (se missing):
# Editar /opt/rochasales/volumes/api/kong.yml
# Adicionar ANTES do serviço "functions":
- name: firecrawl
url: http://172.23.0.1:9085
routes:
- name: firecrawl-route
paths:
- /functions/v1/firecrawl-extract-meeting
strip_path: false
docker restart rochasales-kong-1 && sleep 8
6. Verificar rede Docker (se firecrawl não responde do container):
docker inspect rochasales-kong-1 --format '{{range $net, $conf := .NetworkSettings.Networks}}{{printf "%s: %s\n" $net $conf.IPAddress}}{{end}}'
# Kong na rede deploy-vps_default → gateway = 172.23.0.1
# Kong na rede rochasales_default → gateway = 172.28.0.1
# Testar: docker exec rochasales-kong-1 wget -q -O- http://172.23.0.1:9085/ ...
`
Nota: O ficheiro /docker/deploy-vps/kong.yml NÃO é usado pelo Kong em produção. Usar SEMPRE /opt/rochasales/volumes/api/kong.yml.
Runbook: Browser Mostra Erro Antigo Após Deploy (Jul 2026)
Sintoma: O browser mostra mensagens de erro de versões anteriores do código, mesmo depois de fazer novo deploy.
Causa: Cache do browser ou de CDN intermédio.
Solução (nesta ordem):
`
1. Hard refresh: Ctrl+Shift+R (Windows/Linux) ou Cmd+Shift+R (Mac)
2. Se persistir, limpar cache do browser:
Chrome: DevTools (F12) → Network → Disable cache ☑ → hard refresh
3. Se ainda persistir, verificar se o bundle correcto está em produção:
ssh root@31.97.243.106
grep -l 'firecrawl-extract-meeting' /var/www/comercialrs/assets/*.js
# Deve mostrar o ficheiro JS correcto
4. Verificar se o index.html referencia o bundle correcto:
cat /var/www/comercialrs/index.html | grep 'main-'
# Comparar com ls /var/www/comercialrs/assets/main-*.js
`
Runbook: useSyncExternalStore Error no Browser (Jul 2026)
Sintoma: Página /atividades mostra Uncaught TypeError: Cannot read properties of undefined (reading 'useSyncExternalStore') ou ecrã branco.
Causa: manualChunks no vite.config.ts a isolar @hello-pangea/dnd em chunk separado — a biblioteca precisa do contexto React.
Solução:
`
1. Editar /tmp/comercialrs_build/vite.config.ts
2. Remover TODO o bloco manualChunks (ou a entrada @hello-pangea/dnd)
3. npm run build
4. rm -rf /var/www/comercialrs/assets/*
5. cp -r dist/assets/* /var/www/comercialrs/assets/
6. Actualizar hash no /var/www/comercialrs/index.html (se necessário)
7. Hard refresh no browser
`
O warning "Some chunks are larger than 500 kB" é normal — o bundle grande mas funcional é preferível a chunks separados mas quebrados.
Última atualização: 2026-07-13
Sincronização GitHub corrigida - Mon Jun 15 18:26:13 UTC 2026
Razão: GitHub Secret Scanning bloqueava commit 82fcac3 com token Discord
Solução: novo commit limpo em cima