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>
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>
- 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>
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
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