@lionchat/mcp-server 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -120,7 +120,11 @@ marcar supervisor num lugar protege no outro.
120
120
 
121
121
  ### Datas
122
122
  - **Formato:** ISO 8601 com timezone, ex: `"2026-05-18T14:32:00-03:00"`
123
- - **Timezone padrão:** `America/Sao_Paulo` (BRT, UTC-3)
123
+ - **Timezone:** a CONTA tem fuso próprio — leia `timezone` em `lionchat_account_show` (IANA, ex.
124
+ `America/Sao_Paulo`, `America/Campo_Grande`) e use ELE em filtros de data, `timezone_offset` de
125
+ relatórios e ao escrever horários. O padrão da plataforma é `America/Sao_Paulo` (UTC-3), mas
126
+ Mato Grosso, Mato Grosso do Sul, Amazonas e Acre são outro fuso e há cliente fora do Brasil.
127
+ Nunca chute -3.
124
128
  - **Timestamps Unix** aparecem em alguns campos (ex: `last_activity_at`) — sempre em segundos, não milissegundos
125
129
 
126
130
  ### Paginação
@@ -269,6 +273,8 @@ teams, conversations_summary) exigem as DUAS pontas; nos demais, `since` ou `unt
269
273
  2. lionchat_campaigns_estimate_audience (MESMO audience+mode) → mostrar contagem ao usuário
270
274
  3. CONFIRMAR com o usuário (é envio em massa — seção 7b)
271
275
  4. lionchat_campaigns_create (inbox_id define o tipo: WhatsApp oficial, QR Code/WAHA, SMS, Website)
276
+ Modelo oficial com variáveis: `template_params.processed_params.body` precisa ter TODAS as
277
+ posições (`"1"`, `"2"`...) preenchidas — posição vazia NÃO falha, sai como "." pra todo mundo.
272
278
  5. Acompanhar com lionchat_campaigns_statistics (sent/delivered/read/failed)
273
279
  ```
274
280
  Estrutura do audience: `[{type:'Label', id}, {type:'Funnel', id, stages:[], include_won, include_lost}, {type:'ConversationAttribute', key, value}]`.
@@ -347,9 +353,14 @@ Antes de QUALQUER ação que escreve, modifica, apaga ou envia, pare e avalie se
347
353
 
348
354
  **Como confirmar:** descreva o efeito em linguagem do usuário e aguarde o "sim". Ex.: *"Vou apagar o contato #312 — isso remove as 4 conversas dele também. Confirma?"*. Se faltar dado, peça só o que falta (1-2 perguntas), nunca um questionário.
349
355
 
356
+ **Ferramentas com trava dura de confirmação.** Algumas ferramentas **recusam a chamada** sem `confirm: true` — a recusa vem do conector, antes de tocar no sistema. Não é erro: é o pedido de OK. O caminho é sempre o mesmo — descreva ao usuário exatamente o que será criado/alterado/apagado, aguarde o "sim", e só então reenvie a MESMA chamada com `confirm: true`. Nunca mande `confirm: true` na primeira tentativa "pra economizar uma volta": a trava existe justamente porque a descrição sozinha não segurava. Hoje: `lionchat_custom_dashboards_create`, `_update` e `_destroy` (relatório personalizado aparece na tela do cliente; alterar substitui a lista de blocos e apagar não tem desfazer).
357
+
350
358
  **Aja sem perguntar apenas em operações idempotentes:** leitura, busca, resumo, classificação.
351
359
 
352
360
  **Excluir agente/usuário (`lionchat_agents_destroy`) — SEMPRE pergunte o destino primeiro.** Se o agente tem recursos vinculados (conversas, tarefas — inclusive as que ele **criou** —, cards do Kanban, campanhas, agendamentos), o sistema EXIGE um destino de reatribuição. Antes de excluir: consulte `lionchat_agents_assigned_resources` (o retorno inclui `tasks_created`, tarefas criadas por ele); se houver QUALQUER recurso, **pergunte pra qual agente transferir tudo** e passe `reassign_to_agent_id` no destroy. Nunca tente excluir sem o destino — o sistema recusa e o trabalho do agente ficaria órfão. Ao excluir, tudo passa pro agente escolhido; o excluído fica só no histórico.
361
+ Quando o pedido for "fulano saiu e ciclano entrou no lugar", prefira `lionchat_agents_replace` a
362
+ `destroy` + `create`: a troca é uma só, a carteira vai inteira pro novo e a vaga do plano não
363
+ trava a criação.
353
364
 
354
365
  **NUNCA sobrescreva por inferência dados já preenchidos.** Em especial, **NUNCA sobrescreva telefone ou e-mail existente de um contato** — se já há valor preenchido, pergunte antes de alterar.
355
366
 
@@ -370,6 +381,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
370
381
  | Criar/editar **formulário público de captação** (página de captura própria) | `lionchat_lead_forms_create` / `_update` | Leia `lionchat://docs/formularios-publicos` ANTES — o desenho vai em `form_data` e só entra no ar depois do `publish` (que valida o desenho e pode voltar 422 com a lista de pendências). Caixa de WhatsApp vinculada (`inbox_id`) é obrigatória pra publicar. Escrita é só de administrador |
371
382
  | **Testar um formulário** antes de publicar | `lionchat_lead_forms_test_run` | Roda o RASCUNHO no motor real e desfaz tudo no fim — zero rastro. Mande `answers: [{node_id, value}]` (até 60) pra reproduzir um caminho; a resposta traz o bloco atual + o log do percurso |
372
383
  | Conferir se um site **aceita ser exibido dentro do formulário** (bloco Página externa) | `lionchat_lead_forms_check_embed` | Body `{url}`; devolve `{status: allowed\|blocked\|unknown, reason}`. Grave o veredito em `embed_allowed` do bloco. Admin-only |
384
+ | Ver **tudo que uma pessoa preencheu** (nosso formulário, anúncio do Meta, Webhook Universal, fluxo) | `lionchat_contacts_form_entries_list` / `_show` | Por CONTATO, sem paginação (teto 250 por origem, `meta.truncated`). O detalhe de Meta/webhook mostra SÓ os campos vinculados e gravados — nunca o payload cru. `show` exige `source` + `id` da mesma linha |
373
385
  | Anexar arquivo a uma mensagem | `lionchat_upload_create` primeiro, depois usar o retorno em `lionchat_conversations_messages_create` | Confira `lionchat_upload_limits` se o arquivo for grande |
374
386
  | Marcar conversa como **lida** | `lionchat_conversations_update_last_seen` | NÃO use `unread` (esse marca como NÃO-lida) |
375
387
  | Criar/gerenciar **campanha** (disparo WhatsApp/SMS) | `lionchat_campaigns_*` (criar, estatísticas) | SEMPRE rode `campaigns_estimate_audience` antes de criar e mostre a contagem. Disparo em massa = confirmação obrigatória (seção 7b) |
@@ -390,6 +402,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
390
402
  | **Mudar o modo de distribuição do time** (Rodízio × Equilibrado) | `lionchat_teams_update` (`assignment_order`: `round_robin` \| `balanced`) | **`null` é valor válido e significa "o time não escolheu"** — a decisão herda da política da caixa, depois do `auto_assignment_config` da caixa, e por fim rodízio. NUNCA gravar `round_robin` só para "preencher": isso rebaixa em silêncio uma caixa que roda Equilibrado por política. `balanced` exige o recurso `advanced_assignment` na conta |
391
403
  | **Mudar o modo de distribuição da caixa** (Rodízio × Equilibrado) | `lionchat_inboxes_update` (`auto_assignment_config.assignment_order`) | Só vale quando a caixa NÃO tem política vinculada (com política, a política manda). O jsonb é SUBSTITUÍDO, não mesclado: releia o `auto_assignment_config` atual e reenvie as outras chaves junto, senão apaga o `assign_offline_agents` e o freio |
392
404
  | **Criar/atualizar time** | `lionchat_teams_create` / `_update` | **Preencha `description`**: desde 03/08 é ela que o AI Agente lê pra decidir o roteamento por time. Descreva QUANDO mandar pra lá, não o que o time é |
405
+ | **Trocar um atendente por outro** ("fulano saiu, entrou ciclano") | `lionchat_agents_replace` (`POST /agents/{id}/replace`, body `agent: {email, name, role}`; `inherit_memberships` default `true`) | Faz os dois passos de uma vez: cria o novo (passa pelo limite de vagas do plano por 30 min), manda a carteira inteira (conversas, cards, tarefas, agendamentos) e exclui o antigo em segundo plano. Responde **202** com `new_agent` — o antigo some da lista quando a transferência termina (`replacing: true` em `agents_list` enquanto roda). **Confirme antes** (seção 7a: é exclusão). Recusas 422: substituir a si mesmo, agente de suporte, e-mail já membro, e o **único administrador confirmado só troca por usuário já confirmado** (convide e espere aceitar). `agents_destroy` recusa quem está ENTRANDO numa substituição viva. Admin-only |
393
406
  | **Pausar a automação no meio** (esperar atribuição/card antes da próxima ação) | ação `wait` em `lionchat_automation_rules_create` / `_update` | Segundos, teto 300. Acima disso é caso de FlowBuilder. Ver `lionchat://docs/conversation-flows` |
394
407
  | **Buscar contato/conversa/card** | `lionchat_search_*`, `lionchat_contacts_search` | **Termo com letra exige 3+ caracteres** (dígito é isento). Menos que isso volta VAZIO sem erro — não conclua que o registro não existe. Ver `lionchat://docs/api-conventions` |
395
408
  | **Migrar conversas** de uma caixa WhatsApp pra outra (ex.: QR Code → Oficial) | `lionchat_inboxes_inbox_migration_list` (prévia) → `_execute` → acompanhar status | Admin-only e IRREVERSÍVEL: sempre mostre os números da prévia e confirme (seção 7a). Grupos não vão pro canal oficial — ficam na caixa de origem |
@@ -5,5 +5,5 @@
5
5
  "arguments": [
6
6
  { "name": "goal_hint", "description": "O que o cliente ja disse que quer (ex: 'fluxo de captura de lead')", "required": false }
7
7
  ],
8
- "template": "Cliente quer criar um fluxo no FlowBuilder do LionChat.\n\nObjetivo declarado: {{goal_hint|Nao informado}}\n\nINSTRUCAO: avalie o que o cliente JA disse e o que ainda falta saber. Pergunte SO o que falta. Nao force checklist. Em fluxo simples, 2-3 perguntas bastam. Em fluxo complexo, aprofunde.\n\nABAIXO esta o BANCO de perguntas sugeridas por categoria. ESCOLHA SO AS RELEVANTES.\n\n## Categoria A — Proposito e gatilho (quase sempre necessario)\n- Qual o objetivo do fluxo? (saudacao, qualificacao, captura, suporte, pos-venda, CSAT, agendamento, re-engajamento, outro)\n- Quando dispara? (mensagem recebida com palavra-chave, conversa criada, conversa resolvida, label aplicada, cron, webhook externo)\n- Se palavra-chave: quais palavras? Match exact ou contains?\n\n## Categoria B — Canal e escopo\n- Em qual canal vai rodar? (WAHA, WhatsApp Cloud, Webwidget, Telegram, Email, Twitter, Facebook, Instagram, Line, SMS, API, Voz, WhatsApp Business)\n- Em qual(is) inbox(es) especifica(s)? (peca o ID via inboxes_list se nao soube)\n- Tem filtro de quem entra? (so leads novos, so clientes existentes, so quem tem label X)\n\n## Categoria C — Conteudo da conversa\n- Vai mandar quais mensagens? Texto livre, templates WhatsApp aprovados, midia (imagem/audio/video), lista de botoes interativos?\n- Vai fazer perguntas pro cliente? Quantas? Quais?\n- Para cada pergunta: aceita qualquer resposta livre, opcoes fixas (ex: 1/2/3), ou regex (ex: CPF, email, telefone)?\n- Quanto tempo espera por cada resposta? (default sensato: 30-60 min)\n- O que mandar se nao responder no tempo? (mensagem de timeout, encerrar, escalar pra humano)\n\n## Categoria D — Captura, ramificacao e logica\n- Onde salva as respostas? Em variavel temporaria do flow, atributo da conversa, atributo do contato, custom_attributes\n- Tem ramificacao por condicao? Quais criterios? (ex: 'se valor > 1000 vai pra time premium')\n- Vai chamar API externa? (URL, metodo, headers, body, autenticacao)\n- Vai usar IA (Captain Assistant)? Em que momento? Pra que?\n * generate = gerar resposta natural\n * intent = classificar intencao da mensagem\n * sentiment = analisar sentimento\n * extract = extrair info estruturada (CPF, valor, etc)\n- Tem teste A/B? (randomizer)\n\n## Categoria E — Acoes finais\n- No fim do fluxo: criar card no Kanban? (em qual funil/etapa?) Atribuir agente/time? (ID) Adicionar/remover label? Mudar status/prioridade? Disparar webhook externo?\n- Tem criterio pra encerrar antes? (exit_conditions: ex: 'conversa marcada como resolvida' ou 'label X aplicada')\n\n## Antes de chamar flows_create\n1. Se faltou info CRITICA (ex: canal, gatilho, conteudo basico): pergunte agora\n2. Se a info que falta e mero detalhe: assuma defaults sensatos\n - maxRetries: 3\n - waitTime: 60min para resposta, 30min para timeouts\n - sem ramificacao se cliente nao mencionou\n3. Apresente um RESUMO em linguagem natural do fluxo. Exemplo: 'Beleza, vou criar um fluxo assim: quando alguem mandar oi no WhatsApp, manda saudacao, pergunta se quer vendas/suporte, se vendas atribui ao time 1, se suporte ao time 2. Confirma?'\n4. Espere o cliente confirmar OU pedir ajustes\n5. So depois da confirmacao, chame flows_create\n6. ANTES de gerar o JSON: consulte lionchat://docs/flowbuilder-design-guide pra schema/handles/layout e lionchat://docs/flowbuilder-patterns pra ver se algum template ja resolve\n7. Apos gerar JSON, valide pelo checklist da secao 6 do design guide\n8. NUNCA crie node sem position. NUNCA invente sourceHandle.\n\nDEFAULTS SENSATOS quando cliente nao especificar:\n- channel_type: pergunte sempre, nao chute\n- inbox_ids: pergunte sempre\n- waitTime: 60 minutes\n- maxRetries: 3\n- waitUnit: minutes\n- saveTo: 'conversation_attr' (atributo da conversa) na duvida — NUNCA use 'attribute' (valor inexistente, nao salva nada)\n- match_mode: 'contains' pra keywords"
8
+ "template": "Cliente quer criar um fluxo no FlowBuilder do LionChat.\n\nObjetivo declarado: {{goal_hint|Nao informado}}\n\nINSTRUCAO: avalie o que o cliente JA disse e o que ainda falta saber. Pergunte SO o que falta. Nao force checklist. Em fluxo simples, 2-3 perguntas bastam. Em fluxo complexo, aprofunde.\n\nABAIXO esta o BANCO de perguntas sugeridas por categoria. ESCOLHA SO AS RELEVANTES.\n\n## Categoria A — Proposito e gatilho (quase sempre necessario)\n- Qual o objetivo do fluxo? (saudacao, qualificacao, captura, suporte, pos-venda, CSAT, agendamento, re-engajamento, outro)\n- Quando dispara? (mensagem recebida com palavra-chave, conversa criada, conversa resolvida, label aplicada, data na ficha do contato, webhook externo)\n- O gatilho e um agendamento (criado / cancelado / remarcado / concluido)? Se sim, sao os gatilhos booking_* do Booking nativo (nao e e-Clinica)\n- Se palavra-chave: quais palavras? Match exact ou contains?\n\n## Categoria B — Canal e escopo\n- Em qual canal vai rodar? (WAHA, WhatsApp Cloud, Webwidget, Telegram, Email, Twitter, Facebook, Instagram, Line, SMS, API, Voz, WhatsApp Business)\n- Em qual(is) inbox(es) especifica(s)? (peca o ID via inboxes_list se nao soube)\n- Tem filtro de quem entra? (so leads novos, so clientes existentes, so quem tem label X)\n\n## Categoria C — Conteudo da conversa\n- Vai mandar quais mensagens? Texto livre, templates WhatsApp aprovados, midia (imagem/audio/video), lista de botoes interativos?\n- Vai fazer perguntas pro cliente? Quantas? Quais?\n- Para cada pergunta: aceita qualquer resposta livre, opcoes fixas (ex: 1/2/3), ou regex (ex: CPF, email, telefone)?\n- Quanto tempo espera por cada resposta? (default sensato: 30-60 min)\n- O que mandar se nao responder no tempo? (mensagem de timeout, encerrar, escalar pra humano) — a espera tem tempo? Sem fio no timeout, o fluxo TERMINA quando o tempo estoura\n\n## Categoria D — Captura, ramificacao e logica\n- Onde salva as respostas? Em variavel temporaria do flow, atributo da conversa, atributo do contato, custom_attributes\n- Tem ramificacao por condicao? Quais criterios? (ex: 'se valor > 1000 vai pra time premium')\n- Vai chamar API externa? (URL, metodo, headers, body, autenticacao)\n- Vai usar IA (Captain Assistant)? Em que momento? Pra que?\n * generate = gerar resposta natural\n * intent = classificar intencao da mensagem\n * sentiment = analisar sentimento\n * extract = extrair info estruturada (CPF, valor, etc)\n- Tem teste A/B? (randomizer — divide na proporcao configurada, 50/50 alterna; nao e sorteio)\n- Toda saida de bloco vai ter fio? Saida sem fio ENCERRA o fluxo (nao \"cai no proximo\")\n- Se for fluxo de grupo: quer convite no privado pra quem nao entrar no grupo? (groupInviteOnFailure + groupInviteMessage)\n\n## Categoria E — Acoes finais\n- No fim do fluxo: criar card no Kanban? (em qual funil/etapa?) Atribuir agente/time? (ID) Adicionar/remover label? Mudar status/prioridade? Disparar webhook externo?\n- Tem criterio pra encerrar antes? (exit_conditions: ex: 'conversa marcada como resolvida' ou 'label X aplicada')\n\n## Antes de chamar flows_create\n1. Se faltou info CRITICA (ex: canal, gatilho, conteudo basico): pergunte agora\n2. Se a info que falta e mero detalhe: assuma defaults sensatos\n - maxRetries: 3\n - waitTime: 60min para resposta, 30min para timeouts\n - sem ramificacao se cliente nao mencionou\n3. Apresente um RESUMO em linguagem natural do fluxo. Exemplo: 'Beleza, vou criar um fluxo assim: quando alguem mandar oi no WhatsApp, manda saudacao, pergunta se quer vendas/suporte, se vendas atribui ao time 1, se suporte ao time 2. Confirma?'\n4. Espere o cliente confirmar OU pedir ajustes\n5. So depois da confirmacao, chame flows_create\n6. ANTES de gerar o JSON: consulte lionchat://docs/flowbuilder-design-guide pra schema/handles/layout e lionchat://docs/flowbuilder-patterns pra ver se algum template ja resolve\n7. Apos gerar JSON, valide pelo checklist da secao 6 do design guide\n8. NUNCA crie node sem position. NUNCA invente sourceHandle.\n\nDEFAULTS SENSATOS quando cliente nao especificar:\n- channel_type: pergunte sempre, nao chute\n- inbox_ids: pergunte sempre\n- waitTime: 60 minutes\n- maxRetries: 3\n- waitUnit: minutes\n- saveTo: 'conversation_attr' (atributo da conversa) na duvida — NUNCA use 'attribute' (valor inexistente, nao salva nada)\n- match_mode: 'contains' pra keywords"
9
9
  }
@@ -9,5 +9,5 @@
9
9
  "required": true
10
10
  }
11
11
  ],
12
- "template": "Gere visão **360° do cliente** identificado por: **{{contact_identifier}}**\n\n## Passos\n\n1. **Localize o contato** (use `lionchat_contacts_search` com `q={{contact_identifier}}`):\n - Se múltiplos resultados, mostre os top 3 e peça confirmação\n - Se nenhum, reporte e pare\n\n2. **Detalhes do contato** (use `lionchat_contacts_show`):\n - Nome, email, telefone, identifier\n - custom_attributes (importante! pode ter dados de negócio)\n - Empresa vinculada (se houver)\n - Data de criação no LionChat\n\n3. **Histórico de conversas** (use `lionchat_contacts_list_1` — GET /contacts/{id}/conversations — passando o `id` do contato):\n - Total de conversas com esse cliente\n - Status atual: quantas abertas, resolvidas, pendentes\n - Últimas 5 conversas (com data e display_id)\n\n4. **Conversa mais recente** (use `lionchat_conversations_messages_list` da última conversa):\n - Pegue as últimas 10 mensagens pra contexto\n - Identifique tom (cordial, irritado, satisfeito)\n - Status atual e último agente atribuído\n\n5. **Cards Kanban vinculados** (use `lionchat_kanban_items_filter` por conversation_display_ids):\n - Em quais funis está\n - Etapas atuais\n - Valor total no pipeline\n\n6. **CSAT histórico** (use `lionchat_csat_list` filtrando por contact_id se possível, senão por conversas dele):\n - Notas recebidas, feedbacks\n - Tendência (melhorando/piorando)\n\n7. **Engajamento** (calcule a partir dos dados):\n - Frequência de interação (conversas/mês)\n - Tempo desde última conversa (sinal de churn?)\n - Taxa de resposta dele (incoming vs outgoing)\n\n## Apresentação\n\n```markdown\n# 👤 Cliente: [Nome] — Visão 360°\n\n## 📇 Identificação\n- **Email:** ...\n- **Telefone:** ...\n- **Empresa:** ...\n- **Cadastrado em:** DD/MM/YYYY (X meses atrás)\n- **Custom:** [campos relevantes do custom_attributes]\n\n## 📊 Status\n- **Health Score:** 🟢 Saudável / 🟡 Atenção / 🔴 Risco\n- **Última interação:** DD/MM/YYYY (X dias atrás)\n- **Conversas totais:** N | Abertas: M | Resolvidas: K\n- **CSAT médio:** X⭐ (baseado em N respostas)\n\n## 💰 Pipeline (Kanban)\n- **Funil [X]:** Etapa Y — R$ Z (parado há W dias)\n- **Funil [X2]:** Etapa Y2 — R$ Z2\n\n## 💬 Última Conversa (#display_id)\n- **Data:** DD/MM HH:MM\n- **Status:** Aberta/Resolvida\n- **Agente:** Nome\n- **Resumo (2-3 linhas):** O que aconteceu na última interação\n- **Tom percebido:** Cordial / Frustrado / Satisfeito\n\n## ⚠️ Sinais de Alerta\n[Lista sinais detectados:]\n- Sem interação há >30 dias\n- Última CSAT foi 2⭐\n- Card parado em \"Negociação\" há 21 dias\n- Cliente comentou \"vou avaliar concorrentes\"\n\n## 💡 Próximos Passos Sugeridos\n[2-3 ações concretas:]\n1. Ligar pra entender por que parou de responder\n2. Mover card pra etapa \"Em risco\"\n3. Enviar pesquisa de feedback\n```\n\n## Health Score (como calcular)\n\n- 🟢 **Saudável:** última interação <30d + CSAT ≥4 + sem sinais negativos\n- 🟡 **Atenção:** última interação 30-90d OU CSAT 3-3.9 OU card parado >14d\n- 🔴 **Risco:** última interação >90d OU CSAT <3 OU múltiplos cards parados OU mensagens frustradas recentes\n\n## Importante\n\n- Seja honesto no Health Score. Não infle: 🟢 só se realmente saudável.\n- **Não invente sinais.** Só liste o que viu nos dados.\n- Se cliente é novo (<30 dias), avise: \"Pouco histórico, score preliminar\".\n- Se múltiplos contatos com o mesmo nome, peça pra desambiguar antes de continuar.\n- Datas em PT-BR (DD/MM/YYYY)."
12
+ "template": "Gere visão **360° do cliente** identificado por: **{{contact_identifier}}**\n\n## Passos\n\n1. **Localize o contato** (use `lionchat_contacts_search` com `q={{contact_identifier}}`):\n - Se múltiplos resultados, mostre os top 3 e peça confirmação\n - Se nenhum, reporte e pare\n\n2. **Detalhes do contato** (use `lionchat_contacts_show`):\n - Nome, email, telefone, identifier\n - custom_attributes (importante! pode ter dados de negócio)\n - Empresa vinculada (se houver)\n - Data de criação no LionChat\n\n3. **Histórico de conversas** (use `lionchat_contacts_list_1` — GET /contacts/{id}/conversations — passando o `id` do contato):\n - Total de conversas com esse cliente\n - Status atual: quantas abertas, resolvidas, pendentes\n - Últimas 5 conversas (com data e display_id)\n\n4. **Conversa mais recente** (use `lionchat_conversations_messages_list` da última conversa):\n - Pegue as últimas 10 mensagens pra contexto\n - Mensagem com `content_attributes.deleted: true` foi APAGADA pelo cliente (não cite o texto como se estivesse de pé); `edited: true` = o `content` já é a versão editada\n - Identifique tom (cordial, irritado, satisfeito)\n - Status atual e último agente atribuído\n\n5. **Cards Kanban vinculados** (use `lionchat_kanban_items_filter` por conversation_display_ids):\n - Em quais funis está\n - Etapas atuais\n - Valor total no pipeline\n\n6. **CSAT histórico** (use `lionchat_csat_list` filtrando por contact_id se possível, senão por conversas dele):\n - Notas recebidas, feedbacks\n - Tendência (melhorando/piorando)\n\n7. **Preenchimentos e agendamentos**:\n - Histórico de formulários (use `lionchat_contacts_form_entries_list` — nosso formulário, anúncio do Meta, Webhook Universal e fluxo, numa lista só; `_show` abre o detalhe)\n - Agendamentos: leia pela TAREFA da Agenda (`lionchat_tasks_list` filtrando tarefas com booking) — `bookings.status` NÃO diz se o agendamento aconteceu (fica `confirmed` mesmo depois de concluído/cancelado pela Agenda)\n\n8. **Engajamento** (calcule a partir dos dados):\n - Frequência de interação (conversas/mês)\n - Tempo desde última conversa (sinal de churn?)\n - Taxa de resposta dele (incoming vs outgoing)\n\n## Apresentação\n\n```markdown\n# 👤 Cliente: [Nome] — Visão 360°\n\n## 📇 Identificação\n- **Email:** ...\n- **Telefone:** ...\n- **Empresa:** ...\n- **Cadastrado em:** DD/MM/YYYY (X meses atrás)\n- **Custom:** [campos relevantes do custom_attributes]\n\n## 📊 Status\n- **Health Score:** 🟢 Saudável / 🟡 Atenção / 🔴 Risco\n- **Última interação:** DD/MM/YYYY (X dias atrás)\n- **Conversas totais:** N | Abertas: M | Resolvidas: K\n- **CSAT médio:** X⭐ (baseado em N respostas)\n\n## 💰 Pipeline (Kanban)\n- **Funil [X]:** Etapa Y — R$ Z (parado há W dias)\n- **Funil [X2]:** Etapa Y2 — R$ Z2\n\n## 💬 Última Conversa (#display_id)\n- **Data:** DD/MM HH:MM\n- **Status:** Aberta/Resolvida\n- **Agente:** Nome\n- **Resumo (2-3 linhas):** O que aconteceu na última interação\n- **Tom percebido:** Cordial / Frustrado / Satisfeito\n\n## ⚠️ Sinais de Alerta\n[Lista sinais detectados:]\n- Sem interação há >30 dias\n- Última CSAT foi 2⭐\n- Card parado em \"Negociação\" há 21 dias\n- Cliente comentou \"vou avaliar concorrentes\"\n\n## 💡 Próximos Passos Sugeridos\n[2-3 ações concretas:]\n1. Ligar pra entender por que parou de responder\n2. Mover card pra etapa \"Em risco\"\n3. Enviar pesquisa de feedback\n```\n\n## Health Score (como calcular)\n\n- 🟢 **Saudável:** última interação <30d + CSAT ≥4 + sem sinais negativos\n- 🟡 **Atenção:** última interação 30-90d OU CSAT 3-3.9 OU card parado >14d\n- 🔴 **Risco:** última interação >90d OU CSAT <3 OU múltiplos cards parados OU mensagens frustradas recentes\n\n## Importante\n\n- Seja honesto no Health Score. Não infle: 🟢 só se realmente saudável.\n- **Não invente sinais.** Só liste o que viu nos dados.\n- Se cliente é novo (<30 dias), avise: \"Pouco histórico, score preliminar\".\n- Se múltiplos contatos com o mesmo nome, peça pra desambiguar antes de continuar.\n- Datas em PT-BR (DD/MM/YYYY)."
13
13
  }
@@ -9,5 +9,5 @@
9
9
  "required": false
10
10
  }
11
11
  ],
12
- "template": "Gere um **Relatório de Produtividade da Equipe** dos últimos {{period_days|7}} dias.\n\n## Passos a executar\n\n1. **Calcule o período:** since = {{period_days|7}} dias atrás (Unix timestamp em segundos), until = agora\n\n2. **Resumo geral da conta** (use `lionchat_reports_summary` com type='account', business_hours=true):\n - Total de conversas, taxa de resolução, tempo médio de primeira resposta e resolução\n - Compare com período anterior (campo `previous` da resposta)\n\n3. **Performance por agente** (use `lionchat_reports_list` com type='agent', mesmo since/until):\n - Liste cada agente com: conversas atendidas, avg_first_response_time, avg_resolution_time\n - ATENÇÃO: o relatório por agente NÃO traz CSAT médio nem status online. Pegue o CSAT por agente separadamente: `lionchat_csat_list` filtrando por `user_ids` (id do agente) no mesmo período e calcule a média das notas dele.\n - Identifique TOP 3 (por volume + qualidade combinados)\n - Identifique 3 com maior tempo de resposta (potenciais gargalos)\n\n4. **CSAT** (use `lionchat_csat_metrics` com mesmo período):\n - Média geral, distribuição (5⭐, 4⭐, ...)\n - Taxa de resposta CSAT\n\n5. **SLA** (use `lionchat_sla_metrics` se disponível):\n - Hit rate, breach count\n\n## Como apresentar\n\nFormate em **markdown** com:\n\n```markdown\n# 📊 Relatório de Produtividade — Últimos {{period_days|7}} dias\n\n## Visão Geral\n| Métrica | Esta semana | Semana anterior | Variação |\n|---|---|---|---|\n| Conversas | X | Y | +/-Z% |\n| Tempo médio 1ª resposta | X min | Y min | +/-Z% |\n| Tempo médio resolução | X h | Y h | +/-Z% |\n| Taxa de resolução | X% | Y% | +/-Z% |\n\n## Top 3 Agentes\n1. **Nome** — X conversas, Y min 1ª resposta, CSAT Z⭐\n2. ...\n3. ...\n\n## Pontos de Atenção\n- Agente XYZ com tempo de resposta 3x acima da média\n- Inbox WhatsApp com volume crescendo\n\n## CSAT\n- Média: X⭐ (anterior: Y⭐)\n- Taxa de resposta: Z%\n\n## SLA\n- Hits: X% (meta 95%)\n- Breaches: Y conversas\n```\n\n## Conversões importantes\n\n- TODOS os tempos retornados estão em **segundos**. Converta:\n - < 60s → mostre em segundos\n - 60-3600s → mostre em minutos (`X min`)\n - 3600-86400s → mostre em horas (`X h Y min`)\n - \\> 86400s → mostre em dias\n- Datas: use formato brasileiro (DD/MM ou DD/MM HH:MM)\n- Taxas (CSAT, SLA hit rate): mostre como %\n\n## Importante\n\n- Se não tiver dados suficientes (período sem atividade), diga claramente em vez de inventar números\n- Se algum agente tem 0 conversas, OMITA da listagem em vez de mostrar zerado (não inflar lista)\n- Use emojis com moderação (📊 ⭐ 🚨) — máximo 1 por seção"
12
+ "template": "Gere um **Relatório de Produtividade da Equipe** dos últimos {{period_days|7}} dias.\n\n## Passos a executar\n\n1. **Calcule o período:** since = {{period_days|7}} dias atrás (Unix timestamp em segundos), until = agora. Leia `timezone` em `lionchat_account_show` e mande `timezone_offset` (em horas, derivado desse fuso) nas chamadas de relatório — não assuma -3 (MS/MT/AM são -4 e há cliente fora do Brasil).\n\n2. **Resumo geral da conta** (use `lionchat_reports_summary` com type='account', business_hours=true):\n - Total de conversas, taxa de resolução, tempo médio de primeira resposta e resolução\n - Compare com período anterior (campo `previous` da resposta)\n\n3. **Performance por agente** (use `lionchat_reports_list` com type='agent', mesmo since/until):\n - Liste cada agente com: conversas atendidas, avg_first_response_time, avg_resolution_time\n - ATENÇÃO: o relatório por agente NÃO traz CSAT médio nem status online. Pegue o CSAT por agente separadamente: `lionchat_csat_list` filtrando por `user_ids` (id do agente) no mesmo período e calcule a média das notas dele.\n - Identifique TOP 3 (por volume + qualidade combinados)\n - Identifique 3 com maior tempo de resposta (potenciais gargalos)\n\n4. **CSAT** (use `lionchat_csat_metrics` com mesmo período):\n - Média geral, distribuição (5⭐, 4⭐, ...)\n - Taxa de resposta CSAT\n\n5. **SLA** (use `lionchat_sla_metrics` se disponível):\n - Hit rate, breach count\n - Nota: o prazo é conferido a cada 5 min, espalhado em até 2 min — um estouro pode aparecer até ~7 min depois do horário-limite. Não conclua que o SLA não está rodando por isso.\n\n## Como apresentar\n\nFormate em **markdown** com:\n\n```markdown\n# 📊 Relatório de Produtividade — Últimos {{period_days|7}} dias\n\n## Visão Geral\n| Métrica | Esta semana | Semana anterior | Variação |\n|---|---|---|---|\n| Conversas | X | Y | +/-Z% |\n| Tempo médio 1ª resposta | X min | Y min | +/-Z% |\n| Tempo médio resolução | X h | Y h | +/-Z% |\n| Taxa de resolução | X% | Y% | +/-Z% |\n\n## Top 3 Agentes\n1. **Nome** — X conversas, Y min 1ª resposta, CSAT Z⭐\n2. ...\n3. ...\n\n## Pontos de Atenção\n- Agente XYZ com tempo de resposta 3x acima da média\n- Inbox WhatsApp com volume crescendo\n\n## CSAT\n- Média: X⭐ (anterior: Y⭐)\n- Taxa de resposta: Z%\n\n## SLA\n- Hits: X% (meta 95%)\n- Breaches: Y conversas\n```\n\n## Conversões importantes\n\n- TODOS os tempos retornados estão em **segundos**. Converta:\n - < 60s → mostre em segundos\n - 60-3600s → mostre em minutos (`X min`)\n - 3600-86400s → mostre em horas (`X h Y min`)\n - \\> 86400s → mostre em dias\n- Datas: use formato brasileiro (DD/MM ou DD/MM HH:MM)\n- Taxas (CSAT, SLA hit rate): mostre como %\n\n## Importante\n\n- Se não tiver dados suficientes (período sem atividade), diga claramente em vez de inventar números\n- Se algum agente tem 0 conversas, OMITA da listagem em vez de mostrar zerado (não inflar lista)\n- Use emojis com moderação (📊 ⭐ 🚨) — máximo 1 por seção"
13
13
  }
@@ -24,5 +24,5 @@
24
24
  "required": false
25
25
  }
26
26
  ],
27
- "template": "Faça uma auditoria de qualidade do atendimento nos últimos {{period_days|7}} dias.\n\nFiltros opcionais:\n- Agente: {{agent_id|todos}}\n- Inbox: {{inbox_id|todas}}\n\nAmostrar {{sample_size|20}} conversas RESOLVIDAS aleatoriamente desse período.\n\nPra cada conversa analisar:\n\n### Métricas Quantitativas\n- Tempo da primeira resposta (em minutos)\n- Tempo total de resolução\n- Número de mensagens trocadas\n- CSAT (se houver)\n- Foi reaberta depois? (indicador de problema mal resolvido)\n\n### Análise Qualitativa\n- Tom adequado? (formal/informal alinhado ao canal)\n- Cliente foi cumprimentado adequadamente?\n- Problema foi entendido na primeira interação?\n- Resposta foi clara e resolveu o problema?\n- Houve follow-up ou despedida adequada?\n- Erros gramaticais ou de português?\n\n### Red Flags a destacar\n- Tempo de primeira resposta > 30 min em horário comercial\n- Mais de 10 mensagens pra resolver questão simples\n- Resolução sem confirmação do cliente\n- Mensagens automáticas/copy-paste óbvios sem personalização\n- Tom inadequado (rude, robótico, condescendente)\n\n### Output\n\n## Sumário\n- Conversas auditadas: X\n- Qualidade Geral (1-10): Y\n- Tempo médio de primeira resposta\n- Taxa de reabertura\n\n## Top Problemas Encontrados\n(3-5 padrões recorrentes, com exemplos)\n\n## Top Boas Práticas Identificadas\n(2-3 exemplos pra replicar)\n\n## Recomendações\n- Treinamento focado em: ...\n- Templates de resposta padronizados pra: ...\n- Automações sugeridas: ...\n\nNão expor nomes de agentes em críticas públicas — apenas IDs em report interno."
27
+ "template": "Faça uma auditoria de qualidade do atendimento nos últimos {{period_days|7}} dias.\n\nFiltros opcionais:\n- Agente: {{agent_id|todos}}\n- Inbox: {{inbox_id|todas}}\n\nAmostrar {{sample_size|20}} conversas RESOLVIDAS aleatoriamente desse período.\n\nPra cada conversa analisar (pule mensagens com `content_attributes.deleted: true` — texto apagado pelo cliente — e sinalize conversas cujo último envio está com `status: failed`):\n\n### Métricas Quantitativas\n- Tempo da primeira resposta (em minutos)\n- Tempo total de resolução\n- Número de mensagens trocadas\n- CSAT (se houver)\n- Foi reaberta depois? (indicador de problema mal resolvido)\n\n### Análise Qualitativa\n- Tom adequado? (formal/informal alinhado ao canal)\n- Cliente foi cumprimentado adequadamente?\n- Problema foi entendido na primeira interação?\n- Resposta foi clara e resolveu o problema?\n- Houve follow-up ou despedida adequada?\n- Erros gramaticais ou de português?\n\n### Red Flags a destacar\n- Tempo de primeira resposta > 30 min em horário comercial\n- Mais de 10 mensagens pra resolver questão simples\n- Resolução sem confirmação do cliente\n- Mensagens automáticas/copy-paste óbvios sem personalização\n- Tom inadequado (rude, robótico, condescendente)\n\n### Output\n\n## Sumário\n- Conversas auditadas: X\n- Qualidade Geral (1-10): Y\n- Tempo médio de primeira resposta\n- Taxa de reabertura\n\n## Top Problemas Encontrados\n(3-5 padrões recorrentes, com exemplos)\n\n## Top Boas Práticas Identificadas\n(2-3 exemplos pra replicar)\n\n## Recomendações\n- Treinamento focado em: ...\n- Templates de resposta padronizados pra: ...\n- Automações sugeridas: ...\n\nNão expor nomes de agentes em críticas públicas — apenas IDs em report interno."
28
28
  }
@@ -14,5 +14,5 @@
14
14
  "required": false
15
15
  }
16
16
  ],
17
- "template": "Encontre **leads parados no Kanban há mais de {{days_stuck|7}} dias** e gere um plano de ação.\n\n## Passos\n\n1. **Lista funis ativos** (use `lionchat_funnels_list`):\n - Se {{funnel_id}} foi passado, filtra só ele\n - Senão, lista todos não-arquivados\n\n2. **Para cada funil, lista cards** (use `lionchat_kanban_items_list` ou `lionchat_kanban_items_filter`):\n - Filtre por `stage_entered_at` < {{days_stuck|7}} dias atrás\n - Ordene por `item_details.value` desc (maiores valores primeiro)\n - Pegue top 20 (não inunde o usuário)\n\n3. **Para cada card relevante, busque contexto** (se houver `conversation_display_id`):\n - Use `lionchat_conversations_show` pra pegar última atividade\n - Verifique se conversa ainda está ativa\n\n4. **Categorize por gravidade**:\n - 🔴 CRÍTICO: parado >14 dias E valor > R$ 5.000\n - 🟡 ATENÇÃO: parado >7 dias E valor > R$ 1.000\n - 🟢 MONITORAR: parado >7 dias E valor < R$ 1.000\n\n## Apresentação\n\n```markdown\n# 🚨 Leads Parados — Kanban\n\n**Critério:** parados há mais de {{days_stuck|7}} dias.\n**Encontrados:** N cards.\n\n## 🔴 Críticos (urgente)\n\n### Lead: [Nome do contato] — R$ X.XXX\n- **Funil:** Nome do funil\n- **Etapa:** Nome da etapa (parado há X dias)\n- **Última conversa:** Y dias atrás\n- **Ação sugerida:** Reabrir conversa / Ligar / Mover pra Perdido\n\n## 🟡 Atenção\n...\n\n## 🟢 Monitorar\n...\n\n## Resumo\n- Total parado: N cards (R$ X em valor combinado)\n- Tempo médio parado: Y dias\n- Etapa com mais parados: [nome]\n```\n\n## Ações sugeridas (escolha com base no contexto)\n\n- **Última conversa <7 dias:** Reabra a conversa e dê follow-up\n- **Última conversa 7-30 dias:** Envie mensagem de reengajamento\n- **Última conversa >30 dias:** Considere mover pra etapa \"Perdido\" (não vale manter no funil)\n- **Sem conversa nenhuma:** Crie conversa de outreach\n- **Valor alto + parado >14 dias:** Sinalize pra você (o usuário) ligar pessoalmente\n\n## Importante\n\n- Não execute ações automaticamente — apenas SUGIRA. O usuário decide.\n- Se a quantidade for grande (>50 cards), peça permissão antes de listar todos.\n- Use valores reais (não invente). Se um card não tem `value`, mostre \"sem valor\".\n- Datas em formato brasileiro (DD/MM/YYYY)."
17
+ "template": "Encontre **leads parados no Kanban há mais de {{days_stuck|7}} dias** e gere um plano de ação.\n\n## Passos\n\n1. **Lista funis ativos** (use `lionchat_funnels_list`):\n - Se {{funnel_id}} foi passado, filtra só ele\n - Senão, lista todos não-arquivados\n\n2. **Para cada funil, lista cards** (use `lionchat_kanban_items_list` ou `lionchat_kanban_items_filter`):\n - Filtre por `stage_entered_at` < {{days_stuck|7}} dias atrás\n - Ordene por `item_details.value` desc (maiores valores primeiro)\n - Pegue top 20 (não inunde o usuário)\n\n3. **Para cada card relevante, busque contexto** (se houver `conversation_display_id`):\n - Use `lionchat_conversations_show` pra pegar última atividade\n - Verifique se conversa ainda está ativa\n\n4. **Categorize por gravidade**:\n - 🔴 CRÍTICO: parado >14 dias E valor > R$ 5.000\n - 🟡 ATENÇÃO: parado >7 dias E valor > R$ 1.000\n - 🟢 MONITORAR: parado >7 dias E valor < R$ 1.000\n\n## Apresentação\n\n```markdown\n# 🚨 Leads Parados — Kanban\n\n**Critério:** parados há mais de {{days_stuck|7}} dias.\n**Encontrados:** N cards.\n\n## 🔴 Críticos (urgente)\n\n### Lead: [Nome do contato] — R$ X.XXX\n- **Funil:** Nome do funil\n- **Etapa:** Nome da etapa (parado há X dias)\n- **Última conversa:** Y dias atrás\n- **Ação sugerida:** Reabrir conversa / Ligar / Mover pra Perdido\n\n## 🟡 Atenção\n...\n\n## 🟢 Monitorar\n...\n\n## Resumo\n- Total parado: N cards (R$ X em valor combinado)\n- Tempo médio parado: Y dias\n- Etapa com mais parados: [nome]\n```\n\n## Ações sugeridas (escolha com base no contexto)\n\n- **Última conversa <7 dias:** Reabra a conversa e dê follow-up\n- **Última conversa 7-30 dias:** Envie mensagem de reengajamento\n- **Última conversa >30 dias:** Considere mover pra etapa \"Perdido\" (não vale manter no funil) — cite o slug REAL da etapa lido em `lionchat_funnels_show`, nunca um nome chutado\n- **Sem conversa nenhuma:** Crie conversa de outreach\n- **Valor alto + parado >14 dias:** Sinalize pra você (o usuário) ligar pessoalmente\n\n## Importante\n\n- Não execute ações automaticamente — apenas SUGIRA. O usuário decide.\n- Card \"invisível\" por estar numa etapa que o funil não tem NÃO existe mais (desde 19/08/2026 o card é redirecionado na gravação). Se o cliente reclamar de lead sumido, a causa é outra: arquivado ou em outro funil.\n- Se a quantidade for grande (>50 cards), peça permissão antes de listar todos.\n- Use valores reais (não invente). Se um card não tem `value`, mostre \"sem valor\".\n- Datas em formato brasileiro (DD/MM/YYYY)."
18
18
  }
@@ -14,5 +14,5 @@
14
14
  "required": false
15
15
  }
16
16
  ],
17
- "template": "Analise a carga de trabalho da equipe no período: {{period|week}}.\n\n{{team_id|Para todos os times.}}\nFiltrar por team_id={{team_id}} se especificado.\n\nDados a coletar pra cada agente:\n1. Conversas atribuídas (open + pending)\n2. Conversas resolvidas no período\n3. Tempo médio de primeira resposta\n4. Tempo médio de resolução\n5. % de conversas com CSAT (se houver) — NÃO vem do relatório por agente; pegue via `lionchat_csat_list` filtrando por `user_ids` (id do agente) no período\n6. Status atual: online / offline / busy — NÃO vem do relatório por agente; pegue via `lionchat_agent_availability_list`\n\nApresentar:\n\n## Visão Geral\n- Total de conversas ativas\n- Agentes online vs offline\n- Conversas sem atribuição (backlog)\n\n## Distribuição por Agente (tabela)\n| Agente | Ativas | Resolvidas | T. Resposta | T. Resolução | Status |\n\n## Identificar:\n- **Sobrecarregados**: > 1.5x média de conversas ativas → risco de queda na qualidade\n- **Subutilizados**: < 0.5x média → podem absorver mais\n- **Agentes offline com conversas pendentes**: redistribuir urgente\n- **Conversas órfãs**: sem assignee há > 1h → atribuir agora\n\n## Recomendações de ação\n- Lista de conversas pra reatribuir (com de → para)\n- Sugestão de revisão de assignment policy se houver desbalanceamento crônico\n- Conversas que talvez devam ser fechadas (sem resposta do cliente há > 7 dias)\n\nFinalizar perguntando se o usuário quer aplicar as redistribuições sugeridas."
17
+ "template": "Analise a carga de trabalho da equipe no período: {{period|week}}.\n\n{{team_id|Para todos os times.}}\nFiltrar por team_id={{team_id}} se especificado.\n\nDados a coletar pra cada agente:\n1. Conversas atribuídas (open + pending)\n2. Conversas resolvidas no período\n3. Tempo médio de primeira resposta\n4. Tempo médio de resolução\n5. % de conversas com CSAT (se houver) — NÃO vem do relatório por agente; pegue via `lionchat_csat_list` filtrando por `user_ids` (id do agente) no período\n6. Status atual: online / offline / busy — NÃO vem do relatório por agente; pegue via `lionchat_agent_availability_list`\n\nIgnore agentes com `replacing: true` em `lionchat_agents_list` (estão saindo — uma substituição está transferindo a carteira deles). A lista já exclui o agente de suporte da plataforma: ele não conta como membro da equipe.\n\nApresentar:\n\n## Visão Geral\n- Total de conversas ativas\n- Agentes online vs offline\n- Conversas sem atribuição (backlog)\n\n## Distribuição por Agente (tabela)\n| Agente | Ativas | Resolvidas | T. Resposta | T. Resolução | Status |\n\n## Identificar:\n- **Sobrecarregados**: > 1.5x média de conversas ativas → risco de queda na qualidade\n- **Subutilizados**: < 0.5x média → podem absorver mais\n- **Agentes offline com conversas pendentes**: redistribuir urgente\n- **Conversas órfãs**: sem assignee há > 1h → atribuir agora\n\n## Recomendações de ação\n- Lista de conversas pra reatribuir (com de → para)\n- Sugestão de revisão de assignment policy se houver desbalanceamento crônico\n- Se a causa do desbalanceamento for \"fulano saiu da empresa\", ofereça `lionchat_agents_replace` (troca o agente por outro e leva a carteira inteira) em vez de excluir + criar\n- Conversas que talvez devam ser fechadas (sem resposta do cliente há > 7 dias)\n\nFinalizar perguntando se o usuário quer aplicar as redistribuições sugeridas."
18
18
  }
@@ -3,5 +3,5 @@
3
3
  "title": "Resumo Semanal Executivo",
4
4
  "description": "Resumo executivo de tudo que aconteceu na semana: atendimento, vendas (Kanban), IA, gargalos. Pensado pra quem precisa de visão rápida pra decidir.",
5
5
  "arguments": [],
6
- "template": "Gere um **Resumo Executivo da Semana** — visão rápida pra tomar decisões.\n\n## Passos\n\n1. **Calcule período:** since = 7 dias atrás, until = agora\n\n2. **Atendimento** (use `lionchat_reports_summary`, business_hours=true):\n - Total de conversas, resolvidas, abertas, pendentes\n - Comparativo com semana anterior\n - Tempo médio de resposta e resolução\n\n3. **Pipeline Kanban** (use `lionchat_funnels_list` + `lionchat_kanban_items_counts` por funil):\n - Para cada funil: total de cards, valor total no funil, cards entrados na semana, cards movidos pra \"Fechado\"\n - Calcular taxa de conversão (fechados / total entrados)\n\n4. **IA** (use `lionchat_captain_assistants_list`):\n - Quantos assistentes ativos\n - Conversas atendidas pela IA (campo `active_conversations_count`)\n\n5. **CSAT** (use `lionchat_csat_metrics`):\n - Média da semana, comparativo com anterior\n\n6. **SLA** (use `lionchat_sla_metrics`):\n - Hits e breaches\n\n7. **Top 3 Inboxes** (use `lionchat_reports_list_2`):\n - Quais canais mais movimentaram\n\n## Apresentação\n\n```markdown\n# 📅 Resumo da Semana — DD/MM a DD/MM\n\n## 🎯 Destaque da Semana\n[Uma frase com o ponto mais importante: \"Crescemos 20% em conversas mas CSAT caiu 0.3⭐\" ou \"Funil Vendas com R$ 50K parados na etapa Proposta\"]\n\n## 📞 Atendimento\n- **N conversas** (vs N anterior, +/- X%)\n- **N resolvidas** (taxa: X%)\n- **Tempo médio 1ª resposta:** X min\n- **CSAT:** X⭐ (anterior: Y⭐)\n\n## 💰 Vendas (Pipeline)\n- **Funil [Nome]:** N cards (R$ XK total)\n - Entraram: N | Fechados: M | Conversão: Z%\n - Em risco (parados >7d): K cards\n\n## 🤖 IA\n- **N agentes ativos**\n- **N conversas atendidas** pela IA esta semana\n- Conversas resolvidas pela IA sem handoff: M (estimativa)\n\n## ⚠️ Pontos de Atenção\n- [3 alertas concretos, ex:]\n - SLA: X conversas estouraram\n - Funil Y com gargalo na etapa Z\n - Agente W com tempo médio 2x acima da equipe\n\n## 💡 Recomendações\n[2-3 ações concretas pra próxima semana]\n```\n\n## Importante\n\n- **Seja conciso.** Resumo executivo = 1 página, não 5. Cortar > inflar.\n- **Compare sempre com semana anterior** (campo `previous` dos endpoints).\n- **Destaque tendências, não números crus.** \"Crescemos 20%\" > \"De 100 pra 120\".\n- **3 atenções, 3 recomendações.** Se quiser mais, peça permissão.\n- Use emojis (📅 📞 💰 🤖 ⚠️ 💡) — 1 por seção pra escaneabilidade rápida.\n- Datas em PT-BR (DD/MM/YYYY).\n- Valores em R$ (formato brasileiro: R$ 1.234,56)."
6
+ "template": "Gere um **Resumo Executivo da Semana** — visão rápida pra tomar decisões.\n\n## Passos\n\n1. **Calcule período:** since = 7 dias atrás, until = agora. Leia `timezone` em `lionchat_account_show` e mande `timezone_offset` (em horas, derivado desse fuso) em toda chamada de relatório — não assuma -3.\n\n2. **Relatório personalizado salvo?** (use `lionchat_custom_dashboards_list`): se a conta tem um relatório montado, leia os blocos dele com `lionchat_custom_dashboards_widget_data` passando `time_range: last_7_days` (e o `timezone_offset` da conta) em vez de remontar os números a partir de dez ferramentas.\n\n3. **Atendimento** (use `lionchat_reports_summary`, business_hours=true):\n - Total de conversas, resolvidas, abertas, pendentes\n - Comparativo com semana anterior\n - Tempo médio de resposta e resolução\n\n4. **Pipeline Kanban** (use `lionchat_funnels_list` + `lionchat_kanban_items_counts` por funil):\n - Para cada funil: total de cards e valor total no funil — `kanban_items_counts` é a FOTO atual, não \"da semana\"\n - \"Cards entrados na semana\": `lionchat_custom_dashboards_preview_widget` com `widget_type: stage_entries` (conta card DISTINTO que ENTROU na etapa; `funnel_stages` subconta ~25%)\n - \"Movidos pra Fechado\" e faturamento: `preview_widget` com `widget_type: funnel_stages` + `status: won` + `date_basis: closed` (+ `measure: value` pra somar o valor)\n - Calcular taxa de conversão (fechados / total entrados)\n\n5. **IA** (use `lionchat_captain_assistants_list`):\n - Quantos assistentes ativos\n - Conversas atendidas pela IA (campo `active_conversations_count`)\n\n6. **CSAT** (use `lionchat_csat_metrics`):\n - Média da semana, comparativo com anterior\n\n7. **SLA** (use `lionchat_sla_metrics`):\n - Hits e breaches\n\n8. **Top 3 Inboxes** (use `lionchat_reports_list_2`):\n - Quais canais mais movimentaram\n\n## Apresentação\n\n```markdown\n# 📅 Resumo da Semana — DD/MM a DD/MM\n\n## 🎯 Destaque da Semana\n[Uma frase com o ponto mais importante: \"Crescemos 20% em conversas mas CSAT caiu 0.3⭐\" ou \"Funil Vendas com R$ 50K parados na etapa Proposta\"]\n\n## 📞 Atendimento\n- **N conversas** (vs N anterior, +/- X%)\n- **N resolvidas** (taxa: X%)\n- **Tempo médio 1ª resposta:** X min\n- **CSAT:** X⭐ (anterior: Y⭐)\n\n## 💰 Vendas (Pipeline)\n- **Funil [Nome]:** N cards (R$ XK total)\n - Entraram: N | Fechados: M | Conversão: Z%\n - Em risco (parados >7d): K cards\n\n## 🤖 IA\n- **N agentes ativos**\n- **N conversas atendidas** pela IA esta semana\n- Conversas resolvidas pela IA sem handoff: M (estimativa)\n\n## ⚠️ Pontos de Atenção\n- [3 alertas concretos, ex:]\n - SLA: X conversas estouraram\n - Funil Y com gargalo na etapa Z\n - Agente W com tempo médio 2x acima da equipe\n\n## 💡 Recomendações\n[2-3 ações concretas pra próxima semana]\n```\n\n## Importante\n\n- **Seja conciso.** Resumo executivo = 1 página, não 5. Cortar > inflar.\n- **Compare sempre com semana anterior** (campo `previous` dos endpoints).\n- **Destaque tendências, não números crus.** \"Crescemos 20%\" > \"De 100 pra 120\".\n- **3 atenções, 3 recomendações.** Se quiser mais, peça permissão.\n- Use emojis (📅 📞 💰 🤖 ⚠️ 💡) — 1 por seção pra escaneabilidade rápida.\n- Datas em PT-BR (DD/MM/YYYY).\n- Valores em R$ (formato brasileiro: R$ 1.234,56)."
7
7
  }
@@ -14,5 +14,5 @@
14
14
  "required": false
15
15
  }
16
16
  ],
17
- "template": "Analise o uso de templates WhatsApp Business nos últimos {{period_days|30}} dias.\n\nInbox: {{inbox_id|todas as inboxes WhatsApp Cloud}}\n\nDados a levantar:\n\n## 1. Inventário de Templates\n- Total de templates aprovados (status: APPROVED)\n- Pendentes de aprovação (PENDING)\n- Rejeitados (REJECTED) — listar motivos\n- Templates por categoria (UTILITY, MARKETING, AUTHENTICATION)\n- Templates por idioma\n\n## 2. Uso no Período\nPra cada template usado:\n- Nome do template\n- Quantas vezes foi enviado\n- Quantas conversas geraram resposta dentro de 24h\n- Taxa de resposta (% que responderam)\n- Taxa de conversão (se for marketing — virou venda/lead qualificado?)\n\n## 3. Templates Inativos\nListar templates aprovados HÁ MAIS DE 30 DIAS que NÃO foram usados no período.\n- Por quê? Esquecidos? Substituídos por novo?\n- Sugestão: arquivar / atualizar / promover uso\n\n## 4. Performance dos Top Templates\nTop 5 mais enviados — analisar:\n- Texto do template\n- Taxa de resposta\n- Tempo médio até resposta\n- Tem variáveis personalizadas? ({{nome}}, etc)\n- Categoria correta? (errar categoria = risco de banimento)\n\n## 5. Red Flags\n- Templates marketing sendo usados em janela 24h (deveriam ser utility)\n- Templates rejeitados não removidos\n- Templates aprovados há > 90 dias e nunca usados\n- Templates duplicados (mesma intenção, várias versões)\n\n## Recomendações\n- Templates a criar (gap identificado)\n- Templates a remover (desuso ou redundância)\n- Templates a otimizar (baixa conversão)\n- Sugestão de A/B test entre 2 versões de um mesmo template\n\nFinalizar com sugestão de criar nova campanha usando o template com melhor performance."
17
+ "template": "Analise o uso de templates WhatsApp Business nos últimos {{period_days|30}} dias.\n\nInbox: {{inbox_id|todas as inboxes WhatsApp Cloud}}\n\nDados a levantar:\n\n## 1. Inventário de Templates\n- Total de templates aprovados (status: APPROVED)\n- Pendentes de aprovação (PENDING)\n- Rejeitados (REJECTED) — listar motivos\n- Templates por categoria (UTILITY, MARKETING, AUTHENTICATION)\n- Templates por idioma\n\n## 2. Uso no Período\nPra cada template usado:\n- Nome do template\n- Quantas vezes foi enviado\n- Quantas conversas geraram resposta dentro de 24h\n- Taxa de resposta (% que responderam)\n- Taxa de conversão (se for marketing — virou venda/lead qualificado?)\n\n## 3. Templates Inativos\nListar templates aprovados HÁ MAIS DE 30 DIAS que NÃO foram usados no período.\n- Por quê? Esquecidos? Substituídos por novo?\n- Sugestão: arquivar / atualizar / promover uso\n\n## 4. Performance dos Top Templates\nTop 5 mais enviados — analisar:\n- Texto do template\n- Taxa de resposta\n- Tempo médio até resposta\n- Tem variáveis personalizadas? ({{nome}}, etc)\n- Categoria correta? (errar categoria = risco de banimento)\n\n## 5. Red Flags\n- Templates marketing sendo usados em janela 24h (deveriam ser utility)\n- Templates rejeitados não removidos\n- Templates aprovados há > 90 dias e nunca usados\n- Templates duplicados (mesma intenção, várias versões)\n- Mensagens com `additional_attributes.template_param_fallback` preenchido = clientes que receberam \".\" no lugar da variável (posição vazia não falha mais — sai como ponto)\n- Falhas classificadas como `account_locked` (erro 131031) NÃO são do template — é a conta comercial trancada na Meta\n\n## Recomendações\n- Templates a criar (gap identificado)\n- Templates a remover (desuso ou redundância)\n- Templates a otimizar (baixa conversão)\n- Sugestão de A/B test entre 2 versões de um mesmo template\n\nFinalizar com sugestão de criar nova campanha usando o template com melhor performance."
18
18
  }
@@ -462,6 +462,25 @@ O `field_mapping` do webhook personalizado aceita caminhos com índice de array:
462
462
  mesmo caminho captura valores diferentes. Campo `flow_id` na criação liga o webhook a um flow
463
463
  (webhook embutido — ver resource de fluxos).
464
464
 
465
+ **Destino "atributo da CONVERSA" no `field_mapping` (2026-08-21 — entra com o próximo deploy do
466
+ app depois de 21/08/2026):** além de `contact_attr_<chave>`, o valor de um campo pode ser
467
+ `conversation_attr_<chave>` — vale no Webhook Universal, no webhook embutido de flow E no formulário
468
+ do Meta Lead Ads (mesmo mapeador). O atributo é gravado na conversa que a automação/fluxo mapeado
469
+ ABRIR para aquele lead (sem automação/fluxo não nasce conversa e o valor é descartado). Serve pro
470
+ que muda a cada atendimento (produto comprado agora, valor, formulário de hoje); no contato a 2ª
471
+ compra apaga a 1ª.
472
+
473
+ Regras do gravador (valem pra Webhook Universal, Meta Lead e os 9 gateways de pagamento):
474
+ - **Chave reservada é recusada**: as `captain_*` (caderno da IA) e as de sistema `imported_from`,
475
+ `import_digits`, `mail_subject`, `type`, `in_reply_to`, `initiated_by`, `auto_reply`,
476
+ `original_channel_type`, `conversation_language`, `agent_reply_time_window`, `conference_sid`,
477
+ `call_status`, `tiktok_capabilities`, `captain_media_asset_id`. Nunca mapeie pra elas —
478
+ `imported_from` sobrescrita fazia a conversa SUMIR das telas.
479
+ - **Converte pelo TIPO do atributo** (data em formato brasileiro, decimal com vírgula ou ponto,
480
+ sim/não) e **descarta** o que não entende — texto num atributo de Número não é gravado (e não dá
481
+ erro: aparece só no log do servidor). Confira o tipo em `custom_attributes_list` antes de mapear.
482
+ - **Silencioso**: atributo gravado por integração NÃO dispara automação, flow nem webhook de saída.
483
+
465
484
  ### Import de histórico do WhatsApp Cloud (2026-06)
466
485
 
467
486
  Caixas WhatsApp Cloud API podem importar o histórico de conversas via QR Code. Tools sob
@@ -559,12 +559,18 @@ opcional `variable_mapping` junto.
559
559
 
560
560
  1. **Tira o modelo do alcance do AI Agente.** Basta UMA variável sem mapping para o modelo inteiro
561
561
  deixar de ser oferecido no follow-up automático fora da janela de 24h.
562
- 2. **Faz o envio manual falhar** com o erro `#132000` da Meta (número de parâmetros não bate).
562
+ 2. **Faz a mensagem sair com um PONTO no lugar da variável.** Desde 04/08/2026 posição sem valor
563
+ não derruba mais o envio (antes era `#132000`): o sistema preenche `.` e entrega — "Olá ., sua
564
+ consulta é dia ." chega assim pro cliente, marcado como sucesso. Rastro:
565
+ `additional_attributes.template_param_fallback` na mensagem (lista das posições preenchidas com
566
+ o piso). Numa campanha isso vira dezenas de clientes recebendo ponto (caso real 21/08: 65
567
+ pessoas).
563
568
 
564
569
  Vale para os dois formatos de marcador: posicional (`{{1}}`) e nomeado (`{{nome_cliente}}`).
565
570
 
566
- > Ao registrar modelo por API, **mapeie todas as variáveis do corpo** — ou preencha na hora do envio
567
- > via `processed_params`. Modelo com variável órfã é modelo que a IA não usa e que o disparo derruba.
571
+ > Ao registrar modelo por API, **mapeie todas as variáveis do corpo** — ou preencha TODAS as
572
+ > posições em `processed_params` na hora do envio/campanha, e confira antes de criar a campanha que
573
+ > nenhuma está vazia. Modelo com variável órfã é modelo que a IA não usa e que entrega ponto.
568
574
 
569
575
  Confira o que ficou de fora lendo o modelo com `lionchat_inboxes_whatsapp_templates_list` e
570
576
  comparando os `{{...}}` do texto do BODY com as chaves do `variable_mapping`.
@@ -282,6 +282,18 @@ valor**. A conversa mantém a origem com que nasceu e só ganha o que ainda não
282
282
  notificação e a Agenda não rodam. Se o seu fluxo depende de um desses, ele não vai acontecer
283
283
  quando houver reuso.
284
284
 
285
+ **Caixa de rede social só é "contactável" se a pessoa já falou por ela (desde 19/08/2026).**
286
+ `lionchat_contacts_list_3` (`/contacts/{id}/contactable_inboxes`) lista Facebook, Instagram,
287
+ Telegram, Line, TikTok e X **apenas quando o contato já tem crachá naquela caixa** — nesses canais
288
+ não existe "começar conversa pelo telefone" (a Meta recusa). Se a caixa social não aparece na lista,
289
+ não tente `conversations_create` nela: a conversa nasceria e nunca entregaria. WhatsApp (oficial e
290
+ QR Code), SMS e e-mail continuam contactáveis pelo telefone/e-mail da ficha.
291
+
292
+ **Telefone com ou sem o 9º dígito na caixa OFICIAL (desde 19/08/2026):** criar conversa pra um
293
+ contato cuja ficha está sem o 9 (ou com) REUSA o endereço que a caixa já tem pra essa pessoa, em vez
294
+ de abrir um segundo — era isso que partia a conversa em duas (lembrete numa, resposta do paciente
295
+ em outra). O `source_id` devolvido pode vir no outro formato do que você mandou; é o mesmo cliente.
296
+
285
297
  ## Estado relacional
286
298
 
287
299
  ```
@@ -523,6 +535,17 @@ ficar muda (2026-06-05).
523
535
  | `message_created` | Nova mensagem (incoming ou outgoing) |
524
536
  | `first_reply_created` | Primeira resposta humana |
525
537
 
538
+ ### Gatilhos de Agendamento (Booking nativo) — 2026-08-20
539
+
540
+ O Booking do LionChat (Agenda → aba Booking, link público, IA) também dispara flow pelo node
541
+ `start`: `booking_created`, `booking_cancelled`, `booking_rescheduled`, `booking_completed`.
542
+ Config opcional `{ booking_event_type_ids: ["44"], agent_ids: [], create_conversation: false }`
543
+ (vazio = todos; `create_conversation: true` cria a conversa na 1ª caixa do flow para quem nunca
544
+ conversou). Variáveis `{{booking.*}}` (data, hora, tipo, agente, links de remarcar/cancelar,
545
+ horário anterior no remarcado). Detalhe completo e regras no `lionchat://docs/flowbuilder-design-guide`
546
+ (seção "Gatilhos de AGENDAMENTO"). **Não confundir com os lembretes da e-Clínica** (integração
547
+ separada). Também NÃO são eventos de `automation_rule`.
548
+
526
549
  **Os gatilhos de Formulário público (`lead_form_completed`, `lead_form_milestone`,
527
550
  `lead_form_abandoned`) NÃO entram nessa tabela** — são gatilhos de **flow**, não eventos de
528
551
  automação. Não adianta criar `automation_rule` com esses nomes em `event_name`; o caminho é o node
@@ -364,24 +364,44 @@ AccountTask (agenda interna)
364
364
  ├── conversation_id / contact_id / linked_kanban_item_id (FK opcionais)
365
365
  └── assignees (has_many → User, via account_task_assignments)
366
366
 
367
- BookingEventType (template de agendamento)
367
+ BookingEventType (template de agendamento — tools `booking_event_types_*`; colunas de
368
+ db/schema.rb, tabela booking_event_types)
369
+ ├── id (PK) / account_id (FK) / user_id (FK → agente padrão)
370
+ ├── title (ex: "Demo 30min") / description / slug (endereço público próprio)
371
+ ├── duration_minutes / slot_granularity_minutes / buffer_minutes
372
+ ├── min_notice_hours / max_advance_days / max_per_day / available_from / available_until
373
+ ├── task_type (meeting/video_call — `video_call` gera Meet)
374
+ ├── timezone (IANA — o fuso dos horários é SEMPRE o do tipo, nunca o do navegador)
375
+ ├── color (hex `#RRGGBB`, opcional — cor dos compromissos desse tipo no calendário; vazio = cor do
376
+ │ agente; 2026-08-19)
377
+ ├── active / ask_email / ask_description
378
+ ├── confirmation_* (mensagem de confirmação própria: enabled, inbox_id, channel_type,
379
+ │ template_name, blocks)
380
+ └── booking_availabilities (has_many — dias/horários; `booking_availabilities_attributes` no create)
381
+
382
+ Booking (agendamento confirmado — tabela bookings)
368
383
  ├── id (PK)
369
- ├── account_id (FK)
370
- ├── name (ex: "Demo 30min")
371
- ├── duration_minutes
372
- ├── availability_rules (jsonb)
373
- └── description
374
-
375
- Booking (agendamento confirmado)
376
- ├── id (PK)
377
- ├── account_id (FK)
378
- ├── booking_event_type_id (FK)
379
- ├── user_id (FK, agente que vai atender)
380
- ├── attendee_name / attendee_email / attendee_phone
381
- ├── start_time / end_time (ISO 8601)
382
- ├── status (scheduled/cancelled/completed)
383
- └── meeting_url (Google Calendar / Zoom / etc)
384
- ```
384
+ ├── account_id (FK) / booking_event_type_id (FK) / account_task_id (FK 1:1 → AccountTask)
385
+ ├── contact_id (FK) / guest_name / guest_email / guest_phone / guest_description
386
+ ├── scheduled_at / duration_minutes
387
+ ├── status (confirmed/cancelled/completed) — **NÃO acompanha a Agenda**: concluir ou cancelar pela
388
+ │ tela da Agenda (o caminho normal da equipe) deixa o booking em `confirmed`. A situação real é
389
+ │ `account_tasks.status` (pending/completed/cancelled/snoozed) da tarefa vinculada — é ela que o
390
+ │ relatório de Agendamentos e os gatilhos `booking_*` do FlowBuilder leem
391
+ ├── cancelled_at / cancellation_reason / confirmation_sent_at / utm_params
392
+ └── (o agente responsável e o `meeting_url` moram na TAREFA: `account_tasks.user_id` e
393
+ `account_tasks.meeting_url`)
394
+ ```
395
+
396
+ **Duração sob medida (2026-08-19):** ao marcar pelo painel/API (`lionchat_tasks_create` com
397
+ `booking_event_type_id`) pode-se mandar `duration_minutes` diferente do tipo (5 a 1440; fora da
398
+ faixa o sistema usa a do tipo). A lista de horários livres aceita o mesmo parâmetro
399
+ (`lionchat_booking_event_types_slots?date=AAAA-MM-DD&duration_minutes=60`) e **os horários mudam**
400
+ — 60 min num tipo de 30 some com os encaixes que não cabem. Sempre peça os slots com a MESMA duração
401
+ que vai gravar. A página pública e a IA não têm essa opção (duração do tipo, sempre).
402
+
403
+ **Cor por tipo (2026-08-19):** `booking_event_types.color` (hex `#RRGGBB`) pinta os compromissos
404
+ daquele tipo no calendário; vazio = cor do agente. A tarefa devolve `booking_color` já resolvido.
385
405
 
386
406
  **Atributos de sistema do Booking no CONTATO (novo 2026-07-06):** ao confirmar um agendamento,
387
407
  8 custom attributes protegidos são gravados no contato — usáveis como variável
@@ -400,13 +420,19 @@ Booking (agendamento confirmado)
400
420
 
401
421
  ## e-Clínicas (Efficient) — integração de clínicas
402
422
 
403
- 13 eventos de webhook, cada um mapeável a automação OU flow na tela Integrações > e-Clínica:
423
+ 15 eventos de webhook, cada um mapeável a automação OU flow na tela Integrações > e-Clínica
424
+ (o mapeamento é SÓ pela tela — não há ferramenta MCP que escreva `event_mapping`):
404
425
  `cliente_novo`, `agendamento_novo`, `falta`, `pagamento` (os 4 da doc oficial) +
405
426
  `agendamento_atendido`, `agendamento_alterado`, `agendamento_desmarcado`,
406
427
  `agendamento_transferido`, `cliente_baixa_pagamento`, `cliente_alteracao`,
407
- `cliente_inclusao_pagamento`, `controle_laboratorio_novo`, `controle_laboratorio_alterado`
428
+ `cliente_inclusao_pagamento`, `controle_laboratorio_novo`, `controle_laboratorio_alterado`,
429
+ `agendamento_aguardando`, `odontograma_aprovado`
408
430
  (capturados ao vivo, não documentados pelo e-Clínica).
409
431
 
432
+ Os 2 últimos são do perfil ODONTOLÓGICO (2026-08-20): `agendamento_aguardando` = a recepção marcou a
433
+ chegada do paciente na clínica (grava a hora da chegada e `eclinica_status_agendamento = aguardando`);
434
+ `odontograma_aprovado` = plano de tratamento aprovado (grava o cabeçalho do odontograma).
435
+
410
436
  Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como variável):
411
437
 
412
438
  | Chave | Tipo | Conteúdo |
@@ -417,8 +443,8 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
417
443
  | `eclinica_data_consulta` | date | Data da consulta, ISO |
418
444
  | `eclinica_hora_consulta` | **time** | Hora da consulta 24h `"HH:MM"` (novo 2026-07-06) |
419
445
  | `eclinica_hora_final` | **time** | Hora final da consulta (novo 2026-07-27) |
420
- | `eclinica_status_agendamento` | text | agendado / no_show / atendido / desmarcado |
421
- | `eclinica_situacao` | text | Situação crua da agenda (age_situacao do webhook) |
446
+ | `eclinica_status_agendamento` | text | `agendado` / `aguardando` (paciente chegou) / `no_show` / `atendido` / `desmarcado`. Vem do TIPO do evento, nunca da letra da situação. **Estado terminal do MESMO agendamento não volta pra `agendado`** (2026-08-20): a e-Clínica manda `agendamento_alterado` a cada edição da consulta, inclusive depois da chegada/atendimento, e isso NÃO reabre o status. Consulta com `eclinica_idagenda` DIFERENTE nasce `agendado` |
447
+ | `eclinica_situacao` | text | Situação do agendamento no painel, **POR EXTENSO** (2026-08-21, legenda oficial da e-Clínica): AGUARDANDO, NA CADEIRA, PASSAR FINANCEIRO, AGENDAR RETORNO, ATENDIDO, CONFIRMADO, CONFIRMADO PELO LINK, CONFIRMADO PELA API, FALTA, DESMARCADO, CANCELADO PELO LINK, CANCELADO PELA API. Antes guardava a letra crua (`A`, `C`…). Código nunca visto aparece como veio |
422
448
  | `eclinica_compromisso` | text | Tipo da consulta — TEXTO LIVRE da recepção (ex: Consulta, Retorno) |
423
449
  | `eclinica_agendatipo` | text | Tipo de Agendamento — NOME da lista fixa do painel, resolvido por unidade (novo 2026-07-28). **Filtrar sempre pelo NOME, nunca pelo número: os números colidem entre filiais** |
424
450
  | `eclinica_agendatipo_id` | text | Tipo de Agendamento — número cru (não comparável entre filiais) |
@@ -430,6 +456,17 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
430
456
  | `eclinica_ultimo_pagamento` | text | Valor do último pagamento |
431
457
  | `eclinica_ultimo_pagamento_data` | date | Data do último pagamento/baixa (novo 2026-07-06) |
432
458
  | `eclinica_ultimo_pagamento_descricao` | text | Descrição da baixa (ex: CONSULTA INICIAL) |
459
+ | `eclinica_ultima_chegada_idagenda` | text | Agendamento em que o paciente chegou pela última vez (2026-08-20) |
460
+ | `eclinica_ultima_chegada_data` | date | Data da última chegada do paciente na clínica |
461
+ | `eclinica_ultima_chegada_hora` | **time** | Hora em que a recepção marcou a chegada (`age_horaguardando`, ex `15:06`) |
462
+ | `eclinica_odontograma_id` | text | ID do último odontograma/plano de tratamento aprovado (2026-08-20) |
463
+ | `eclinica_odontograma_aprovado_em` | date | Dia da aprovação, já no fuso da conta (o webhook manda em UTC) |
464
+ | `eclinica_odontograma_inicio` | date | Data de início do tratamento (`odo_datainicio`) |
465
+ | `eclinica_odontograma_situacao` | text | Código de situação como vem da e-Clínica (ex: `T`) |
466
+ | `eclinica_odontograma_valor` | text | Valor do plano — **pode vir `0.00`** quando a clínica não preenche |
467
+ | `eclinica_odontograma_profissional` | text | NOME do profissional do odontograma |
468
+ | `eclinica_odontograma_convenio_id` | text | Convênio do odontograma (número) |
469
+ | `eclinica_marcador_nome` | text | Marca que a clínica digita no fim do nome do paciente no e-Clínica (ex: `*`, `***`) — retirada do nome e guardada aqui (2026-08-20). Significado é da clínica |
433
470
  | `eclinica_laboratorio_data_prevista` | date | Previsão de entrega da medicação (novo 2026-07-23) |
434
471
  | `eclinica_laboratorio_data_moldagem` | date | Data do pedido da medicação |
435
472
  | `eclinica_laboratorio_data_entrega` | date | Data em que a medicação CHEGOU na unidade — é a data que dispara o aviso de retirada do flow |
@@ -441,6 +478,23 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
441
478
  | `eclinica_ultima_cobranca_vencimento` | date | Vencimento da última cobrança |
442
479
  | `eclinica_ultima_cobranca_descricao` | text | Descrição da última cobrança |
443
480
 
481
+ **Regras de atualização que enganam na leitura (2026-08-20/21):**
482
+
483
+ - `eclinica_situacao` e `eclinica_cor` são **esparsas**: evento de agenda que vem SEM o campo
484
+ **apaga a chave** (vazio = "a recepção ainda não marcou", não "sem dado"). `agendamento_novo`
485
+ nunca traz situação — logo depois de marcar, a situação fica vazia de propósito.
486
+ `agendamento_atendido` e `agendamento_desmarcado` **atualizam** a situação (ATENDIDO, DESMARCADO);
487
+ antes de 21/08 a ficha ficava "NA CADEIRA" depois do atendimento (conserto de 21/08/2026 — entra
488
+ com o próximo deploy do app depois de 21/08/2026).
489
+ - Códigos com mais de uma letra pro mesmo estado: `O`/`OK` = CONFIRMADO, `D`/`W` = DESMARCADO.
490
+ Código fora da legenda fica gravado como veio (nunca vazio, nunca palpite).
491
+ - `agendamento_aguardando` (paciente chegou) grava a chegada por cima do agendamento, mas **não
492
+ agenda nem cancela lembrete** (chegada não é consulta nova) e **não apaga** cor/situação quando
493
+ vem sem elas.
494
+ - `eclinica_ultima_chegada_*`, `eclinica_ultimo_pagamento*` e `eclinica_odontograma_*` guardam o
495
+ ÚLTIMO evento; paciente com 3 consultas tem sempre a última na ficha (não há histórico no contato —
496
+ use `lionchat_eclinica_reminder_history_list` e o log de eventos da tela).
497
+
444
498
  **Lembretes automáticos (Integrações > e-Clínica > Lembretes).** Cada linha tem um **tipo de
445
499
  evento** que decide de qual data a contagem parte: `agendamento` (data da consulta, padrão),
446
500
  `controle_laboratorio_novo` (previsão de entrega da medicação) e `cliente_inclusao_pagamento`
@@ -507,7 +561,8 @@ LeadForm (Formulário público de captação — feature flag lead_forms, por co
507
561
  ├── account_id (FK)
508
562
  ├── name / slug (8 chars, gerado na criação e imutável) / display_mode (cards|chat) / active
509
563
  ├── form_data (jsonb: o desenho do construtor) — published_data (a FOTO publicada, que a página usa)
510
- ├── settings (jsonb: primary_color, theme, abandon_minutes, button_label) / published_at
564
+ ├── settings (jsonb: primary_color, theme, abandon_minutes, button_label, resume, chat_avatar,
565
+ │ public_title — título que o LEAD vê, 2026-08-21) / published_at
511
566
  └── counts: views / responses / completed (contadores) + lead_form_responses (has_many)
512
567
 
513
568
  LeadFormResponse (um preenchimento do formulário)
@@ -520,10 +575,28 @@ LeadFormResponse (um preenchimento do formulário)
520
575
  CustomWebhookIntegration (Webhook Universal — entrada)
521
576
  ├── account_id (FK)
522
577
  ├── name / token (URL única) / active
523
- ├── field_mapping (jsonb — suporta caminhos com índice de array: messages.0.content)
578
+ ├── field_mapping (jsonb — caminho do payload → destino: campo nativo, `contact_attr_<k>`,
579
+ │ `conversation_attr_<k>` (2026-08-21 — entra com o próximo deploy do app depois de 21/08/2026),
580
+ │ `cadastral_<k>`, `social_<k>`; aceita índice de array: messages.0.content)
524
581
  ├── event_automation_mapping (jsonb)
525
582
  └── flow_id (FK opcional → Flow; presente = webhook EMBUTIDO de flow, oculto da listagem standalone)
526
583
 
584
+ Gateways de pagamento (GuruWebhook, HotmartWebhook, KiwifyWebhook, EduzzWebhook, TictoWebhook,
585
+ MonetizzeWebhook, GreennWebhook, ContaAzulIntegration, OmieIntegration — tools
586
+ `lionchat_ecommerce_webhooks_*`, `conta_azul_integrations_*`, `omie_integrations_*`)
587
+ ├── event_automation_mapping (jsonb) — uma entrada por evento do gateway:
588
+ │ { "<evento>": { automation_id, flow_id, first_purchase_only,
589
+ │ conversation_attribute_keys: ["purchase_price", "product_name", ...] } }
590
+ │ (Conta Azul/Omie usam `event_mapping`, por categoria). `conversation_attribute_keys`
591
+ │ (2026-08-21 — entra com o próximo deploy do app depois de 21/08/2026) = quais campos da compra
592
+ │ gravar TAMBÉM na conversa que a automação/fluxo abrir; chaves válidas = catálogo dos atributos
593
+ │ de pagamento: product_name, offer_name, invoice_url, purchase_price, payment_method,
594
+ │ purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name,
595
+ │ event_date, charged_times, subscription_cycle, subscription_status, customer_document,
596
+ │ transaction_id, payment_installments, payment_source. Chave fora do catálogo é ignorada.
597
+ └── Leia o mapeamento atual antes de gravar: o `update` SUBSTITUI o jsonb INTEIRO (não mescla) —
598
+ mande todos os eventos de volta, senão os outros somem.
599
+
527
600
  LiontrackJourneyStage (regras de fase da Jornada do Lead — feature flag liontrack)
528
601
  ├── account_id (FK)
529
602
  ├── stage (nome da fase, ex: Topo/Meio/Fundo/Compra)
@@ -548,6 +621,17 @@ ContactDocument (aba Documentos do contato, 2026-06-11)
548
621
  └── ações: preview, download, renomear, favoritar, excluir (conversas são só-leitura)
549
622
  ```
550
623
 
624
+ **Histórico de preenchimentos por CONTATO (2026-08-21 — entra com o próximo deploy do app depois
625
+ de 21/08/2026):** `GET /contacts/{id}/form_entries` (aba "Preenchimentos" da ficha; tools
626
+ `lionchat_contacts_form_entries_list` / `_show`) junta, em ordem de data, o que a pessoa preencheu
627
+ em nosso formulário, no formulário nativo do Meta, no Webhook Universal e no webhook de flow (origem
628
+ `flow`, com o nome do fluxo) — cada item `{source, id, title, status, at, count, conversation}` e
629
+ `/form_entries/{source}/{id}` abre o detalhe. Como cada preenchimento SOBRESCREVE os atributos do
630
+ contato, a ficha só mostra o último — esta lista guarda todos. Origens de fora exibem SÓ os campos
631
+ vinculados a atributos daqui e realmente gravados (nada do payload cru). Ao mesclar contatos, as
632
+ origens vão pro contato vencedor. Os eventos do Meta Lead **não são mais expurgados após 90 dias**
633
+ (decisão do dono, 21/08).
634
+
551
635
  ### Google Contatos (integração nativa)
552
636
 
553
637
  Salva contatos do LionChat no **Google Contatos** da conta Google conectada pelo admin (etiqueta "LionChat"), fazendo o celular/WhatsApp exibirem o nome do cliente. Conexão é **uma por conta**, feita **somente pela interface** (Configurações → Integrações → Google Contatos → "Conectar conta Google" — é OAuth no navegador, **não há tool MCP** para conectar). Comportamento: contato novo com telefone sobe automático (~1 min); botão "Enviar contatos existentes" manda a base antiga (vira "Ressincronizar contatos" depois — idempotente, nunca duplica); rename aqui propaga pro Google só em contatos criados pelo sistema; nunca apaga nem altera a agenda pessoal do cliente. Quando o usuário perguntar "dá pra salvar os contatos no celular/Google?", oriente esse caminho de tela.
@@ -36,6 +36,10 @@ E/OU é encadeado condição a condição (sem parênteses).
36
36
  Atributo personalizado: informe `custom_attribute_type` na condição — `'conversation_attribute'`
37
37
  (atributo da conversa) ou `'contact_attribute'`. Sem ele o escopo pode sair errado.
38
38
 
39
+ - `chat_type` em `conversations_filter` funciona desde 19/08/2026 (antes respondia 500). `group` =
40
+ conversa de grupo de WhatsApp; `individual` cobre também canal, transmissão e status. Com
41
+ `not_equal_to`, conversa sem contato vinculado NÃO some do resultado.
42
+
39
43
  ### Data relativa — "Hoje", "Ontem", "últimos X dias" (novo 2026-08-01)
40
44
 
41
45
  Não calcule data no seu lado pra perguntar "quantas conversas entraram hoje". Existem operadores
@@ -245,7 +249,51 @@ payload=[
245
249
  **R6 — Cards parados (sem tarefa) com atributo do contato:**
246
250
  `kanban_items_filter funnel_id=37 task_filter=no_task contact_custom_attribute_filters="[{\"attribute_key\":\"ja_investe\",\"filter_operator\":\"equal_to\",\"values\":[\"ja_invisto\"]}]"`
247
251
 
252
+ **R7 — Pergunta de relatório que NENHUMA ferramenta responde pronta** (relatório personalizado
253
+ montado na hora, sem salvar nada). Ex.: *"quantos cards foram ganhos em cada etapa do funil 37 nos
254
+ últimos 30 dias?"*
255
+
256
+ ```json
257
+ custom_dashboards_preview_widget
258
+ widget_type=funnel_stages chart_type=bar funnel_id=37
259
+ date_basis=closed status=won time_range=last_30_days timezone_offset=-3
260
+ ```
261
+ Resposta: `{shape:"categories", categories:[{label:"Negociação", value:12}, ...]}` — **na ordem das
262
+ etapas do funil**, não por valor. Trocar `date_basis` muda a pergunta: `created` = "entraram no
263
+ funil", `moved` = "entraram na etapa", `closed` = "foram fechados".
264
+
265
+ **R8 — Tabela de produtividade por operador, com etiqueta e taxa de conversão:**
266
+
267
+ ```json
268
+ custom_dashboards_preview_widget
269
+ widget_type=agent_report chart_type=table dimension=agent
270
+ time_range=custom from=2026-08-01 to=2026-08-15 timezone_offset=-3
271
+ columns=[
272
+ {"metric":"leads"},
273
+ {"metric":"atendidos"},
274
+ {"metric":"label_count","label_id":5,"as":"Agendados"},
275
+ {"metric":"conversao","numerator":[5],"denominator":"leads","as":"% agendamento"}
276
+ ]
277
+ ```
278
+ > ⚠️ `numerator` é **lista de IDs de etiqueta** (`[5]`), nunca nome de métrica. Mandar
279
+ > `["label_count"]` faz a coluna de conversão **sumir em silêncio**.
280
+ > ⚠️ `time_range=custom` aceita no máximo **92 dias** e vale em qualquer tipo de bloco (desde
281
+ > 19/08/2026). Pedir "esse ano" volta 422 com a explicação. Para relatório diário use
282
+ > `today`/`yesterday` em vez de datas fixas, que envelhecem.
283
+ > ⚠️ O `total` da tabela **não é a soma das linhas** — cada métrica tem contagem própria.
284
+
285
+ **R9 — Salvar isso como relatório na tela do cliente:** teste com o R8, mostre o número, confirme
286
+ com o usuário e só então:
287
+ ```json
288
+ custom_dashboards_create confirm=true
289
+ name="Produtividade da equipe"
290
+ widgets=[{"id":"prod-1", ...mesmo desenho do R8...}]
291
+ ```
292
+ Para **alterar** depois: leia com `custom_dashboards_list`, mexa no array e devolva-o **completo** —
293
+ `widgets` substitui a lista inteira, e preservar o `id` de cada bloco é o que mantém o vínculo.
294
+
248
295
  **Erros clássicos a evitar:** `includes` em labels (não existe — use equal_to); operador de
249
296
  número/data em texto; array-de-objetos em query (padrão B exige JSON-string); esquecer
250
297
  `custom_attribute_type` quando contato e conversa têm atributo de mesmo nome; esperar paginação
251
- no kanban_items_filter (não tem — estreite o filtro).
298
+ no kanban_items_filter (não tem — estreite o filtro); montar um `custom_dashboards_update` em cima
299
+ de uma listagem que veio cortada (apaga os blocos que não chegaram).