@lionchat/mcp-server 0.3.0 → 0.3.2

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.
@@ -153,6 +153,12 @@ Quando precisar de detalhes profundos, leia um destes documents via `resources/r
153
153
  - `lionchat://docs/data-model` — Modelo de dados detalhado, FKs, índices
154
154
  - `lionchat://docs/reports-guide` — Como interpretar cada um dos 19 endpoints de relatório
155
155
  - `lionchat://docs/api-conventions` — Auth, paginação, filtros, errors, rate limits
156
+ - `lionchat://docs/conversation-flows` — Ciclo de vida de uma conversa (criação, auto-assignment, IA, resolução)
157
+ - `lionchat://docs/kanban-deep-dive` — Estrutura completa do Kanban (Funnel/Stage/Item/pipeline)
158
+ - `lionchat://docs/best-practices` — Como economizar tokens, evitar rate limit, ordem de operações
159
+ - `lionchat://docs/troubleshooting` — Códigos HTTP, erros comuns, debugging
160
+ - `lionchat://docs/flowbuilder-design-guide` — **OBRIGATÓRIO** antes de criar/editar fluxo: schema de nodes, handles expostos por tipo, layout/positioning, erros comuns, checklist
161
+ - `lionchat://docs/flowbuilder-patterns` — 10 templates de fluxos prontos pra adaptar (saudação, captura, qualificação, CSAT, IA, etc)
156
162
 
157
163
  ## 9. Prompts pré-prontos (workflows automatizados)
158
164
 
@@ -162,6 +168,24 @@ O usuário pode invocar via slash command (`/nome_do_prompt`):
162
168
  - `stuck_leads` — Leads parados há N dias no Kanban
163
169
  - `weekly_recap` — Resumo da semana
164
170
  - `customer_health` — Saúde completa de 1 cliente (conversas + Kanban + CSAT)
171
+ - `inactive_contacts` — Contatos sem interação pra reativação
172
+ - `team_load_balance` — Carga e distribuição da equipe
173
+ - `quality_audit` — Auditoria de qualidade de conversas resolvidas
174
+ - `whatsapp_template_usage` — Uso e performance de templates WhatsApp
175
+ - `create_flow_brainstorm` — Banco de perguntas pra descobrir o que o cliente quer ANTES de criar um fluxo
176
+
177
+ ### Regras específicas para criação de FlowBuilder
178
+
179
+ Quando o cliente pedir pra criar um fluxo:
180
+
181
+ 1. **Antes de gerar JSON**, avalie se você tem informação suficiente. Se faltar (canal, gatilho, conteúdo, ramificações), use o prompt `create_flow_brainstorm` como **guia de perguntas sugeridas** — escolha só as relevantes pro caso, não force checklist
182
+ 2. Fluxo simples (1-3 nodes, sem ramificação) → 2-3 perguntas bastam
183
+ 3. Fluxo complexo (5+ nodes, IA, API externa, várias ramificações) → vale aprofundar
184
+ 4. **SEMPRE consulte** `lionchat://docs/flowbuilder-design-guide` antes de chamar `flows_create` (schema, handles, layout)
185
+ 5. **SEMPRE verifique** se algum template em `lionchat://docs/flowbuilder-patterns` já resolve o caso — adaptar é mais seguro do que criar do zero
186
+ 6. **NUNCA crie** nodes sem `position: {x, y}` — eles ficam empilhados no canvas
187
+ 7. **NUNCA invente** `sourceHandle` — use só os listados no design guide por tipo de node (ex: condition usa `cond_0`/`cond_1`/`default`, não IDs livres)
188
+ 8. Antes de chamar `flows_create`, apresente um resumo em **linguagem natural** do que vai criar e confirme com o cliente
165
189
 
166
190
  ## 10. Idioma das respostas
167
191
 
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "create_flow_brainstorm",
3
+ "title": "Perguntas sugeridas para criar um FlowBuilder",
4
+ "description": "Banco de perguntas para descobrir o que o cliente quer ANTES de gerar o flow_data. Use APENAS as perguntas relevantes pro caso — nao force checklist. Fluxo simples (1-3 nodes) precisa de 2-3 perguntas no maximo; fluxo complexo (5+ nodes, ramificacoes, IA, API) vale aprofundar. Sempre consulte o resource lionchat://docs/flowbuilder-design-guide e lionchat://docs/flowbuilder-patterns antes de gerar o JSON.",
5
+ "arguments": [
6
+ { "name": "goal_hint", "description": "O que o cliente ja disse que quer (ex: 'fluxo de captura de lead')", "required": false }
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: 'attribute' (conversa) na duvida\n- match_mode: 'contains' pra keywords"
9
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "inactive_contacts",
3
+ "title": "Contatos Inativos pra Reativação",
4
+ "description": "Identifica contatos sem interação há um tempo determinado, com sugestões de abordagem pra reativação.",
5
+ "arguments": [
6
+ {
7
+ "name": "days_inactive",
8
+ "description": "Dias sem interação (padrão: 30)",
9
+ "required": false
10
+ },
11
+ {
12
+ "name": "min_past_conversations",
13
+ "description": "Mínimo de conversas anteriores pra considerar (padrão: 1)",
14
+ "required": false
15
+ },
16
+ {
17
+ "name": "exclude_labels",
18
+ "description": "Labels pra excluir, separadas por vírgula (ex: 'spam,bot')",
19
+ "required": false
20
+ }
21
+ ],
22
+ "template": "Identifique contatos da conta que estão inativos há {{days_inactive|30}} dias ou mais.\n\nCritérios:\n- Tiveram pelo menos {{min_past_conversations|1}} conversa(s) anteriormente (mostra que já são leads ativos, não desconhecidos)\n- Última conversa marcada como `resolved` ou sem mensagens novas há {{days_inactive|30}}+ dias\n- Excluir contatos com labels: {{exclude_labels|none}}\n\nPra cada contato encontrado:\n1. Nome, telefone/email\n2. Última conversa (data, motivo do contato anterior se possível inferir)\n3. Canal favorito de contato (WhatsApp, Email, etc)\n4. Sugestão de abordagem personalizada:\n - Se foi cliente: \"como pode ter ido com X que você comprou?\"\n - Se foi lead frio: \"vimos seu interesse em Y, ainda faz sentido?\"\n - Se foi pós-venda: \"vamos renovar?\" / \"feedback?\"\n\nApresentar no formato:\n- Resumo: X contatos identificados\n- Top 10 mais relevantes (priorizar valor histórico, segmento alto, label 'cliente')\n- Sugestão de mensagem template pra reativação em massa (se o usuário quiser, podemos criar campanha)"
23
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "quality_audit",
3
+ "title": "Auditoria de Qualidade do Atendimento",
4
+ "description": "Audita aleatoriamente conversas resolvidas pra checar qualidade: tempo de resposta, tom, resolução, follow-up.",
5
+ "arguments": [
6
+ {
7
+ "name": "period_days",
8
+ "description": "Quantos dias atrás analisar (padrão: 7)",
9
+ "required": false
10
+ },
11
+ {
12
+ "name": "sample_size",
13
+ "description": "Quantidade de conversas pra amostrar (padrão: 20)",
14
+ "required": false
15
+ },
16
+ {
17
+ "name": "agent_id",
18
+ "description": "Auditar agente específico (opcional)",
19
+ "required": false
20
+ },
21
+ {
22
+ "name": "inbox_id",
23
+ "description": "Auditar inbox específica (opcional)",
24
+ "required": false
25
+ }
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."
28
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "team_load_balance",
3
+ "title": "Carga e Balanceamento da Equipe",
4
+ "description": "Analisa distribuição de conversas entre agentes, identifica sobrecarregados e subutilizados.",
5
+ "arguments": [
6
+ {
7
+ "name": "period",
8
+ "description": "Período de análise: today, week, month (padrão: week)",
9
+ "required": false
10
+ },
11
+ {
12
+ "name": "team_id",
13
+ "description": "ID do time específico (opcional, se omitir analisa todos)",
14
+ "required": false
15
+ }
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)\n6. Status atual: online / offline / busy\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."
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "whatsapp_template_usage",
3
+ "title": "Uso e Performance de Templates WhatsApp",
4
+ "description": "Analisa quais templates WhatsApp estão sendo mais usados, eficácia, e templates aprovados mas sem uso.",
5
+ "arguments": [
6
+ {
7
+ "name": "inbox_id",
8
+ "description": "ID da inbox WhatsApp pra analisar (opcional, padrão: todas)",
9
+ "required": false
10
+ },
11
+ {
12
+ "name": "period_days",
13
+ "description": "Período em dias (padrão: 30)",
14
+ "required": false
15
+ }
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."
18
+ }
@@ -0,0 +1,166 @@
1
+ # Boas Práticas — Uso Eficiente do MCP
2
+
3
+ Como usar o MCP do LionChat sem desperdiçar tokens, sem cair em rate limits, e com respostas precisas.
4
+
5
+ ## Princípio geral: liste resumido, leia detalhado quando precisar
6
+
7
+ Errado: pegar TODAS conversas + TODAS mensagens de cada uma logo de cara.
8
+
9
+ Certo:
10
+ 1. `conversations_list` com filtros e `page=1` (paginado) → vê IDs + última mensagem
11
+ 2. Identifica candidatas (5-10 conversas)
12
+ 3. `conversations_messages_list` SÓ para as relevantes
13
+
14
+ Resultado: 10x menos tokens.
15
+
16
+ ## Use filtros sempre que possível
17
+
18
+ A maioria dos endpoints aceita parâmetros pra filtrar antes de retornar:
19
+
20
+ | Endpoint | Filtros úteis |
21
+ |---|---|
22
+ | `conversations_list` | `status` (open/resolved), `assignee_type`, `inbox_id`, `team_id`, `labels`, `q` (busca) |
23
+ | `contacts_list` | `q` (nome/email/telefone), `include_contact_inboxes` |
24
+ | `messages_search` | `q`, `conversation_id`, `before`, `after` |
25
+ | `kanban_items_list` | `funnel_id`, `funnel_stage`, `assigned_agent_id` |
26
+ | `reports_list_*` | `since`, `until`, `metric`, `type` |
27
+
28
+ **Dica:** sempre filtre por período (`since`/`until`) em relatórios — sem isso pode trazer anos de histórico.
29
+
30
+ ## Paginação
31
+
32
+ Endpoints listáveis paginam em geral 25 itens. Use `page` parameter:
33
+
34
+ ```
35
+ page=1 → primeiros 25
36
+ page=2 → próximos 25
37
+ ```
38
+
39
+ Pra contar total, use `meta.total_count` (vem no response). Não tente "paginar até zerar" se já tem o total — pode ser milhões.
40
+
41
+ ## Cache local mental
42
+
43
+ Quando ler dados que provavelmente não mudam na sessão:
44
+ - Lista de inboxes
45
+ - Lista de agentes
46
+ - Lista de times
47
+ - Custom attribute definitions
48
+ - Funnels
49
+
50
+ Faça UMA chamada e use a info por toda a conversa. NÃO refaça `agents_list` 10x.
51
+
52
+ ## Use endpoints específicos > endpoints genéricos
53
+
54
+ Quando existir endpoint específico, prefira:
55
+
56
+ | Errado | Certo |
57
+ |---|---|
58
+ | `reports_list` filtrando manualmente | `reports_list_2` (já é "conversations_metrics") |
59
+ | `conversations_list` + filtro de unread no cliente | `conversations_list` com `assignee_type=me&status=open` |
60
+ | `messages_list` percorrendo conversas | `conversations_messages_search` com `q=...` |
61
+
62
+ ## Economia em conversas com muitas mensagens
63
+
64
+ Conversa com 200 mensagens? **Não baixe tudo**:
65
+
66
+ 1. `conversations_show` (1 chamada) → metadata + última mensagem
67
+ 2. Se precisa contexto: pegue só as últimas 20-30 mensagens com `before` ou `page`
68
+ 3. Pra análise completa, use `conversations_transcript` (formato condensado)
69
+
70
+ ## Operações em massa
71
+
72
+ Pra atribuir labels, mover cards, etc em vários itens:
73
+ - `kanban_bulk_bulk_actions` (cards Kanban)
74
+ - `kanban_items_kanban_agents_create` em massa (passar array)
75
+ - `automation_rules_*` (criar regras em vez de fazer manualmente)
76
+
77
+ NÃO faça 50 PATCH requests individuais — bate rate limit.
78
+
79
+ ## Rate limiting
80
+
81
+ LionChat tem rate limit por API token. Limites típicos:
82
+ - ~500 req/min para read
83
+ - ~100 req/min para write
84
+
85
+ Se receber `429 Too Many Requests`:
86
+ - Espere o `Retry-After` header
87
+ - Reduza concorrência
88
+ - Reavalie estratégia (provavelmente está fazendo loop ineficiente)
89
+
90
+ ## Quando NÃO usar IA pra escrever mensagens
91
+
92
+ - Mensagens de cobrança / financeiras → use templates aprovados
93
+ - Confirmação de venda → template + variáveis
94
+ - Comunicação legal → revisão humana obrigatória
95
+
96
+ IA é boa pra: triagem, classificação, resumo, sugestão de resposta, análise.
97
+
98
+ ## Variáveis de conta (account_variables)
99
+
100
+ Pra dados que se repetem (slogans, endereços, horários):
101
+ - `account_variables_create` UMA vez
102
+ - Use em templates com `{{slogan}}`, `{{endereco}}`
103
+ - Atualiza UMA vez, propaga pra todo lugar
104
+
105
+ Nunca hard-code esses dados em respostas geradas.
106
+
107
+ ## Status codes a respeitar
108
+
109
+ | Code | O que fazer |
110
+ |---|---|
111
+ | 200/201 | OK, processar resposta |
112
+ | 204 | OK, sem corpo (típico de DELETE) |
113
+ | 400 | Erro de input — leia mensagem e ajuste |
114
+ | 401 | Token inválido/expirado — NÃO retry |
115
+ | 403 | Sem permissão — não tente bypass |
116
+ | 404 | Recurso não existe — talvez foi deletado |
117
+ | 422 | Validação falhou — leia errors[] |
118
+ | 429 | Rate limited — espere e retry |
119
+ | 500/502/503 | Servidor — retry 1-2x com backoff |
120
+
121
+ ## Ordem de operações típicas
122
+
123
+ ### "Buscar todas conversas de um cliente específico"
124
+ 1. `contacts_search` com `q=email` → pega contact_id
125
+ 2. `contacts_show` com `include=conversations` OU
126
+ 3. Filter conversations: `conversations_list` com `q=email`
127
+
128
+ ### "Criar um card Kanban a partir de uma conversa"
129
+ 1. `funnels_list` → pegar funnel_id certo
130
+ 2. `kanban_items_create` com `funnel_id`, `funnel_stage` (geralmente primeira etapa), `conversation_display_id`
131
+ 3. Opcional: `item_details.value`, `assigned_agents`
132
+
133
+ ### "Resumir performance da equipe na semana"
134
+ 1. `agents_list` → IDs dos agentes
135
+ 2. `reports_list_*` (agent_overview) com `since=7d_ago`, `until=now`
136
+ 3. Sintetize: agente X com Y resoluções, tempo médio Z
137
+
138
+ ## Cuidados com tools de criação
139
+
140
+ Endpoints `create_*` modificam dados reais. Antes de chamar:
141
+ - Confirme com usuário (se inicialmente pediu "ver", não "fazer")
142
+ - Verifique se o recurso já existe (evite duplicatas)
143
+ - Use `dry_run` quando disponível
144
+
145
+ ## Erros comuns a evitar
146
+
147
+ | Erro | Como evitar |
148
+ |---|---|
149
+ | Loop infinito de `page+1` | Sempre cheque `meta.total_count` e pare |
150
+ | Re-listar inboxes 20x | Cache mental |
151
+ | Mandar `conversations_messages_create` sem `message_type` | Sempre setar `incoming`/`outgoing` |
152
+ | Listar TODAS contas de um agente direto | Use filter `q=nome` primeiro |
153
+ | Esquecer de filtrar por `account_id` | Multi-tenant — sempre escopar |
154
+
155
+ ## Quando agir vs quando perguntar
156
+
157
+ Aja sem perguntar:
158
+ - Listagem, filtro, busca, leitura
159
+ - Sumarização, classificação
160
+ - Sugestão de próximos passos
161
+
162
+ Pergunte primeiro:
163
+ - Criar / atualizar / deletar dados
164
+ - Enviar mensagem pra cliente
165
+ - Mudar status de várias conversas em massa
166
+ - Alterar configuração de conta/inbox
@@ -0,0 +1,208 @@
1
+ # Fluxos de Conversação
2
+
3
+ Como conversas atravessam o LionChat: criação, auto-assignment, IA, automações, resolução. Use quando precisar entender ou diagnosticar comportamento de conversações.
4
+
5
+ ## Ciclo de vida de uma conversa
6
+
7
+ ```
8
+ [Cliente envia 1ª msg]
9
+ │
10
+ ▼
11
+ ┌──────────────────────────┐
12
+ │ ContactInbox criado/ │
13
+ │ encontrado por source_id │
14
+ └─────────┬────────────────┘
15
+ ▼
16
+ ┌──────────────────────────┐
17
+ │ Conversation.create │
18
+ │ status: 0 (open) │
19
+ └─────────┬────────────────┘
20
+ ▼
21
+ ┌───────────────────────────┐
22
+ │ Greeting (se ativo) │ → Message outgoing
23
+ └─────────┬─────────────────┘
24
+ ▼
25
+ ┌───────────────────────────┐
26
+ │ AutomationRule: │
27
+ │ "conversation_created" │
28
+ └─────────┬─────────────────┘
29
+ ▼
30
+ ┌───────────────────────────┐
31
+ │ Auto-assignment: │
32
+ │ - team OU agent │
33
+ │ - via policy ou simples │
34
+ └─────────┬─────────────────┘
35
+ ▼
36
+ ┌───────────────────────────┐
37
+ │ Captain (IA) Agent: │
38
+ │ se atribuído │
39
+ │ → debounce → LLM response │
40
+ └─────────┬─────────────────┘
41
+ ▼
42
+ ┌───────────────────────────┐
43
+ │ Conversa ativa │
44
+ │ (status: open) │
45
+ └─────────┬─────────────────┘
46
+ ▼
47
+ [Agente humano ou IA atende ↔ cliente]
48
+ │
49
+ ┌───────┴────────┐
50
+ ▼ ▼
51
+ [resolvida] [adiada]
52
+ status: 1 status: 3
53
+ │ │
54
+ │ └──→ desnooze automático
55
+ ▼
56
+ ┌───────────────────────────┐
57
+ │ Pós-resolução: │
58
+ │ - Captain memory + FAQ │
59
+ │ - Reporting events │
60
+ │ - Automation rules │
61
+ │ - CSAT survey send │
62
+ └────────────────────────────┘
63
+ ```
64
+
65
+ ## Etapas detalhadas
66
+
67
+ ### 1. Criação da conversa
68
+
69
+ Mensagem chega via webhook do canal (WAHA, WhatsApp Cloud, Email, etc) → `Webhook::IncomingMessageJob` ou similar → `IncomingMessageService` → cria/encontra `Contact`, `ContactInbox`, `Conversation`, `Message`.
70
+
71
+ **Pontos importantes:**
72
+ - `Conversation` sempre criada com `status = 0` (open)
73
+ - `inbox_id` setado direto
74
+ - `assignee_id` começa `null` (pendente atribuição)
75
+ - `captain_assistant_id` começa `null` (a menos que automação atribua)
76
+
77
+ ### 2. Greeting (mensagem de boas-vindas)
78
+
79
+ Se `inbox.greeting_enabled = true`:
80
+ - Após criar a conversa, envia `inbox.greeting_message`
81
+ - Vira `Message` outgoing automática
82
+ - NÃO substitui resposta humana — só inicia a conversa
83
+
84
+ ### 3. AutomationRule: "conversation_created"
85
+
86
+ Cada inbox/conta pode ter regras com `event_name: 'conversation_created'`. Elas rodam **antes** do auto-assignment.
87
+
88
+ Ações comuns:
89
+ - Atribuir agente/time específico
90
+ - Adicionar labels
91
+ - Marcar prioridade
92
+ - Atribuir Captain Assistant (`captain_assistant_id`)
93
+
94
+ Avaliação:
95
+ - Condições combinadas com AND
96
+ - Operadores: `equal_to`, `contains`, `includes`, `is_present`
97
+ - Pode usar `inbox`, `content`, `country_code`, `email`, custom_attributes
98
+
99
+ ### 4. Auto-assignment
100
+
101
+ Roda após automation rules. Lógica simplificada:
102
+
103
+ ```
104
+ SE inbox.enable_auto_assignment_v2:
105
+ SE inbox.assignment_policy associada:
106
+ → Política decide (round-robin, balanced, etc)
107
+ SENAO:
108
+ → assignee_id fica null (manual)
109
+ ```
110
+
111
+ V2 (Assignment Policy) é o motor moderno. V1 (campo `auto_assignment` simples) é legado.
112
+
113
+ ### 5. Captain (IA Agente)
114
+
115
+ Se `captain_assistant_id` foi setado (manual ou via automação):
116
+ - Mensagem incoming dispara `Captain::ResponseBuilderJob`
117
+ - Job tem **debounce** (~10s) — agrupa mensagens em rajada
118
+ - Chama LLM com prompt do assistant + histórico
119
+ - LLM pode invocar tools (FAQ, update_contact, create_booking, etc)
120
+ - Resposta vira `Message` outgoing com `sender_type: Captain::Assistant`
121
+
122
+ **Quando IA é desativada manualmente:**
123
+ - Agente clica em "Desativar AI" → `captain_assistant_id` vira null
124
+ - `custom_attributes.captain_manually_disabled = true`
125
+ - IA não responde mais nessa conversa (mesmo se nova msg)
126
+
127
+ ### 6. Estado "pending" (status 2)
128
+
129
+ Conversa em "pending" significa "aguardando algo":
130
+ - Cliente respondeu mas agente ainda não viu
131
+ - OU agente respondeu e tá aguardando cliente
132
+ - Geralmente movida automaticamente por automação ("se 24h sem resposta → pending")
133
+
134
+ ### 7. Resolução (status 1)
135
+
136
+ Agente clica em "Resolver":
137
+ - `status` → 1 (resolved)
138
+ - `resolved_at` setado
139
+ - Dispara `conversation_resolved` event
140
+ - Listeners agem:
141
+ - `CaptainListener`: gera memory + FAQ se IA atendeu
142
+ - `HookListener`: dispara webhooks
143
+ - `AutomationRuleListener`: regras de `conversation_resolved`
144
+ - `ReportingEventListener`: salva métricas
145
+ - `CsatSurveyJob` (se config ativa): envia pesquisa CSAT
146
+
147
+ ### 8. Snoozed (status 3)
148
+
149
+ Adia conversa:
150
+ - `status` → 3 (snoozed)
151
+ - `snoozed_until` setado (datetime futuro)
152
+ - Job periódico `ReopenSnoozedConversationsJob` roda e reabre quando passa do `snoozed_until`
153
+
154
+ ### 9. Reopen
155
+
156
+ Conversa resolvida que recebe nova mensagem do cliente:
157
+ - Comportamento depende de config `inbox.lock_to_single_conversation`
158
+ - Default: cria NOVA conversa (mantém histórico)
159
+ - Se locked: reabre a mesma conversa (`status` volta a 0)
160
+
161
+ ## Estado relacional
162
+
163
+ ```
164
+ Conversation
165
+ ├─ messages: array em ordem cronológica
166
+ ├─ contact: quem é o cliente
167
+ ├─ inbox: canal de origem
168
+ ├─ assignee: agente humano atual (null OK)
169
+ ├─ team: time atribuído (null OK)
170
+ ├─ captain_assistant: IA atribuída (null OK)
171
+ ├─ kanban_item: card vinculado (null OK)
172
+ └─ labels: tags aplicadas
173
+ ```
174
+
175
+ ## Como diagnosticar problemas
176
+
177
+ ### "Conversa não atribuiu ninguém"
178
+
179
+ 1. `inbox.enable_auto_assignment_v2` está true?
180
+ 2. `inbox.assignment_policy` está setado?
181
+ 3. Tem `InboxMember` ativos pra essa inbox?
182
+ 4. Tem `automation_rule` que poderia ter atribuído antes?
183
+
184
+ ### "IA não respondeu"
185
+
186
+ 1. `conversation.captain_assistant_id` está setado?
187
+ 2. Account tem OpenAI hook configurado?
188
+ 3. Captain feature ativa na conta? (`feature_captain_integration`)
189
+ 4. Custom attr `captain_manually_disabled = true`?
190
+ 5. Sidekiq job `Captain::ResponseBuilderJob` rodou? Tem erro no log?
191
+
192
+ ### "Conversa marcada como pending sem motivo"
193
+
194
+ 1. Tem automation rule com `event_name: conversation_updated` ou similar?
195
+ 2. Tem SLA policy ativando state change?
196
+ 3. Veio de external API call?
197
+
198
+ ## Eventos importantes (pra automation)
199
+
200
+ | Evento | Quando dispara |
201
+ |---|---|
202
+ | `conversation_created` | Nova conversa |
203
+ | `conversation_opened` | Status volta pra open (reabertura) |
204
+ | `conversation_resolved` | Agente resolve |
205
+ | `conversation_pending` | Status muda pra pending |
206
+ | `conversation_updated` | Qualquer update |
207
+ | `message_created` | Nova mensagem (incoming ou outgoing) |
208
+ | `first_reply_created` | Primeira resposta humana |