27 Commits
Author SHA1 Message Date
Gustavo RodriguesandClaude Opus 5.5 993188a772 feat(inbox): busca nas mensagens já carregadas da conversa
Extraído do PR #1793 (fechado por trocar a identidade visual): só a busca
dentro da conversa, sem a interface nova. O termo filtra as mensagens que
já estão na tela — não consulta o servidor —, marca as que batem e leva a
primeira ao campo de visão.

Refs: #1793
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 05:20:15 -03:00
gustavorodcruz96andClaude Opus 5.5 c14c54b8a3 perf(auth): requireRole lê papel e MFA em paralelo, mantendo a precedência
Extraído do #1793 (fechado por trocar a identidade visual). Só a mudança de
lógica em lib/auth/require-role.ts e os três testes que o acompanhavam; a
reformatação do resto do arquivo ficou de fora.

mfaEmDivida() começa junto com a consulta de papel; a rejeição é capturada
num .then de dois handlers, e só é propagada quando a checagem de MFA seria
necessária. Papel insuficiente continua 403 forbidden_role sem olhar MFA.

Refs: #1793

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 05:17:35 -03:00
gustavorodcruz96 c468bd2e5a fix(conversoes): registre provas de isolamento e use tokens do tema 2026-09-27 04:05:54 -03:00
gustavorodcruz96 9b404cfdc6 fix(rastreio): use gerador de ID compatível com self-host sem TLS 2026-09-27 03:55:19 -03:00
gustavorodcruz96 013550f403 fix(conversoes): trate índices opcionais na tela e nos testes 2026-09-27 03:51:19 -03:00
gustavorodcruz96 138dc1e6e4 feat(conversoes): conclua links rastreáveis e preserve regras legadas 2026-09-27 03:49:36 -03:00
gustavorodcruz96 69cb9427f5 feat(conversoes): conclua histórico e diagnóstico com falhas visíveis 2026-09-27 03:42:26 -03:00
gustavorodcruz96andClaude Opus 5.5 cb3f008e5f feat(conversoes): Google Ads por etapa do funil, venda sem valor e telefone criptografado
- google_ads_conversion_rules (0433): uma ação de conversão por etapa aberta,
  com categoria, filtro de canal e trava de retroatividade (configured_at).
  A qualificação da 0402 vira a primeira regra com o mesmo event_name.
- Consumidor de etapa lê as regras; reenvio usa o retrato gravado.
- google_purchase_value_mode: a compra pode sair sem valor (nunca zero);
  o padrão segue exigindo valor. Meta inalterada.
- google_send_hashed_phone: telefone em SHA-256/E.164 no Data Manager e no
  upload antigo, só com opt-in.
- Cliente REST do Google Ads para criar/listar ações de conversão, ler
  campanhas e recursos de mensagem; OAuth do Data Manager pede também o
  escopo adwords quando há developer token.
- Tela: editor "O que cada etapa do funil informa ao Google Ads", com
  "Usar o recomendado" e "Criar no Google".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 03:42:26 -03:00
gustavorodcruz96 9a84a38324 test(e2e): reserve a janela MFA ao validar credenciais 2026-09-24 23:53:26 -03:00
gustavorodcruz96 5f31da30ff Merge remote-tracking branch 'origin/main' into feat/conversoes-rastreio-confiavel 2026-09-24 23:49:38 -03:00
gustavorodcruz96 7240fdd384 fix(e2e): sirva o site de rastreio em uma origem HTTP real 2026-09-24 11:58:29 -03:00
gustavorodcruz96 713bd67a23 merge: preserve dominios de conversoes e mapas ao atualizar main 2026-09-24 03:05:39 -03:00
gustavorodcruz96 33b8467201 fix(conversoes): explicite tabelas para validar conflitos no banco 2026-09-24 02:55:44 -03:00
gustavorodcruz96 b761062f60 Merge remote-tracking branch 'origin/main' into feat/conversoes-rastreio-confiavel 2026-09-24 02:54:45 -03:00
gustavorodcruz96 f60e214322 fix(conversoes): renumere migrations e preserve marca da instalacao 2026-09-24 02:37:39 -03:00
gustavorodcruz96 8f92c934e0 Merge remote-tracking branch 'origin/main' into fix/conversoes-validacao-script 2026-09-24 02:36:50 -03:00
gustavorodcruz96 bb63692397 feat(conversoes): ofereca script de rastreio para o site 2026-09-24 02:26:44 -03:00
gustavorodcruz96 546f2dcc96 Merge remote-tracking branch 'origin/main' into feat/conversoes-rastreio-confiavel 2026-09-24 02:17:20 -03:00
gustavorodcruz96 614478f7d9 test(conversoes): reserve a janela TOTP do segundo login 2026-09-24 02:11:11 -03:00
gustavorodcruz96 3191f84290 test(conversoes): confirme braids da referencia ate a conversao 2026-09-24 02:01:51 -03:00
gustavorodcruz96 42c887b894 merge: integre main com permanencia do atendente e agenda 2026-09-24 02:00:06 -03:00
gustavorodcruz96 896240d35a feat(conversoes): configure captura Google e qualificacao por etapa 2026-09-24 01:55:41 -03:00
gustavorodcruz96 8bbf92fb88 merge: incorpore main e renumere migration de conversoes para 0398 2026-09-24 01:24:55 -03:00
gustavorodcruz96 d9919adf49 test(conversoes): semeie data de fechamento nas vendas ganhas 2026-09-23 23:21:36 -03:00
gustavorodcruz96 d33c4b330e feat(conversoes): acompanhe e reprocesse vendas no Meta e Google 2026-09-23 23:05:52 -03:00
gustavorodcruz96andClaude Opus 5.5 5d7b3e720c feat(inbox): responder assume a conversa livre e a reabertura volta ao último atendente
As duas mudanças de comportamento do PR #1527, portadas sem mudança de
lógica dos commits 7ab9387 (a parte de app/api/v1/messages/route.ts e o
teste) e d41b349/6dabc4b (fn_service_inbound, apêndice do baseline e
MANIFEST). O invariante dele entra no commit seguinte, já com os casos
do ajuste ligado e desligado:

- uma resposta humana pelo inbox numa conversa sem dono a assume
  (fn_conversation_assign com claim condicional), o que cala a IA sem
  prazo;
- uma mensagem nova numa conversa encerrada a reabre com o último
  atendente, se ele ainda é membro agent+, sem passar pelo roteamento.

Renumerada de 0393 para 0396 (a 0393 não se reaproveita). O commit
seguinte põe as duas atrás de um ajuste por empresa, desligado por
padrão.

Refs: #1527

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N9fyW7pXJCsyDPtu5PoQpN
2026-09-23 21:39:50 -03:00
gustavorodcruz96andClaude Opus 5.5 f82545d004 fix(inbox): resposta enviada não some e o rascunho seguinte não se perde
Três consertos no envio pelo inbox, recortados do PR #1527:

- a mensagem provisória entra na primeira página da consulta (a mais
  recente), não na última (a mais antiga); o sucesso troca o provisório
  pela mensagem real sem duplicar o que o Realtime já trouxe, e a falha
  remove só o provisório;
- o sucesso do envio não apaga mais o rascunho que a pessoa começou a
  digitar; a falha devolve o texto sem apagar o novo;
- a queryKey de mensagens e conversas fica estável entre renders, então
  o refetch de segurança deixa de reiniciar o intervalo a cada render.

Portado sem mudança de conteúdo do commit 7ab9387 do #1527. A parte do
mesmo commit que assume a conversa ao responder (app/api/v1/messages)
e a reabertura (migration 0393) ficaram de fora: esperam decisão de
produto.

Refs: #1527

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N9fyW7pXJCsyDPtu5PoQpN
2026-09-23 20:55:17 -03:00