@lionchat/mcp-server 1.9.0 → 1.10.1

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.
@@ -214,7 +214,10 @@ os de `user_ids` viram membros comuns. A resposta traz `is_supervisor` (boolean)
214
214
  - `config.feature_memory`: gera notas no contato ao resolver conversas
215
215
  - `config.feature_faq`: gera FAQs sugeridas ao resolver conversas
216
216
  - `config.feature_follow_up` + `config.follow_up_steps`: follow-up automático em cadência de até
217
- 3 etapas (cada ≥5 min, soma ≤24h) quando o cliente some — motor dedicado só-leitura
217
+ 3 etapas (cada ≥5 min, **soma ≤1380 min = 23h**, não 24h) quando o cliente some — motor dedicado
218
+ só-leitura. O teto é 1380 porque a janela de 24h do WhatsApp conta da **mensagem do cliente**, não do
219
+ primeiro follow-up; somar 1440 é recusado com 422 (e no campo legado `follow_up_time` a mensagem de
220
+ erro ainda diz "1440" por engano — o teto aplicado é 1380)
218
221
  - `config.follow_up_skip_conditions`: array (até 3, lógica OU) de condições pra NÃO fazer follow-up.
219
222
  Tipos: `label`, `contact_attr`/`conversation_attr`, e `time_window` (horário de silêncio: `start`/`end`
220
223
  horas 0-23, janela circular — no período não envia follow-up, mas a IA segue respondendo o cliente)
@@ -223,8 +226,12 @@ os de `user_ids` viram membros comuns. A resposta traz `is_supervisor` (boolean)
223
226
  com 422 "step 1 must be at least 5 minutes"). `feature_pause_on_human_reply`,
224
227
  `feature_follow_up` e demais booleans de config aceitam update direto via
225
228
  `captain_assistants_update` (merge parcial de config).
226
- - `config.feature_pause_on_human_reply`: bool — a IA se desliga sozinha na conversa quando um humano
227
- assume (atendente responde pelo painel OU mensagem do celular); nota privada/automação/campanha não contam
229
+ - `config.feature_pause_on_human_reply`: bool (nasce desligado) — a IA se desliga sozinha na conversa
230
+ quando um humano assume (atendente responde pelo painel OU mensagem do celular); nota
231
+ privada/automação/campanha não contam. **Mensagem agendada depende de quem agendou (2026-07-29):**
232
+ agendada **pela IA** não desliga (o disparo assina como o assistente); agendada **por um atendente**
233
+ conta como atendente ao vivo e **DESLIGA** a IA da conversa — na prática, programar uma mensagem em
234
+ nome do atendente numa conversa com IA ativa tira a IA dali quando ela for enviada
228
235
  - `config.model`: modelo OpenAI usado (gpt-4o, gpt-4o-mini)
229
236
  - `config.temperature`: 0.0-1.0
230
237
  - `config.instructions`: prompt sistema (Liquid template, até 20.000 chars)
@@ -373,16 +380,23 @@ Campos MUTÁVEIS (atualizáveis livremente por IA/integração): `marital_status
373
380
 
374
381
  `custom_attribute_definitions` (model=`contact_attribute`) fica reservado a dado de NEGÓCIO genérico que não tem modelo dedicado (ex: "plano contratado", "nicho do cliente").
375
382
 
376
- ## Ligações — TRÊS sistemas distintos (não confundir!)
383
+ ## Ligações — CINCO sistemas distintos (não confundir!)
377
384
 
378
385
  | Sistema | O que é | Tools | Canal |
379
386
  |---|---|---|---|
380
- | **Ligação WP (Wavoip)** | Voz pelo WhatsApp em caixa **QR Code/WAHA** — QR conecta um "device" Wavoip; widget de discagem, gravação e transcrição automática | **NENHUMA — sem tool no MCP** (ver nota abaixo) | WhatsApp QR Code |
387
+ | **Ligação WP (Wavoip)** | Voz pelo WhatsApp em caixa **QR Code/WAHA** — QR conecta um "device" Wavoip (pago, por caixa); widget de discagem, gravação e transcrição automática | **NENHUMA — sem tool no MCP** (ver nota abaixo) | WhatsApp QR Code |
388
+ | **LionCalls** | Voz pelo WhatsApp em caixa **QR Code**, mas pelo **motor próprio do LionChat** (credencial global, 1 sessão por caixa; flag `lioncalls_calling`, nasce desligada e é ligada conta a conta) | **NENHUMA — sem tool no MCP** | WhatsApp QR Code |
381
389
  | **WhatsApp Calling (Cloud)** | Voz pelo WhatsApp na **API oficial** (enterprise) | `whatsapp_calls_*` + enable/disable_whatsapp_calling | WhatsApp oficial |
382
- | **VoIP (Zenvia)** | Telefonia COMUM (ramais, saldo, recarga) | `voip_*` | Telefone |
390
+ | **VoIP (Zenvia)** | Telefonia COMUM com softphone no navegador (ramais, saldo, recarga) | `voip_*` | Telefone |
391
+ | **VTCall** | Telefonia por **PABX click-to-call**, config por conta + ramal por atendente; **sem softphone no navegador** — o atendente fala pelo app/ramal do VTCall | `vtcall_settings_*` (show/update/test_connection), `vtcall_ramals_*` (list/create/destroy) | Telefone (PABX do cliente) |
383
392
 
384
- Quando o usuário falar "ligação", descubra o canal: caixa QR Code → Wavoip; caixa oficial →
385
- whatsapp_calls; telefone fixo/ramal → VoIP Zenvia.
393
+ Quando o usuário falar "ligação", descubra o canal ANTES de responder: caixa QR Code → Wavoip **ou**
394
+ LionCalls (dois motores diferentes para o MESMO tipo de caixa — veja qual está conectado nela); caixa
395
+ oficial → `whatsapp_calls`; telefone/ramal → Zenvia (softphone) ou VTCall (PABX).
396
+
397
+ **Histórico é compartilhado.** Wavoip, LionCalls, Zenvia e VTCall gravam na MESMA tabela de ligações,
398
+ então `voip_calls_list` (`/voip/calls`) devolve as quatro juntas — mesmo as que não têm tool própria.
399
+ Só o WhatsApp Calling (Cloud) fica fora, em `whatsapp_calls_*`.
386
400
 
387
401
  **Wavoip — SEM TOOL NO MCP (decisão do dono, 2026-07-16).** As 8 tools `wavoip_*` (status, token,
388
402
  calls, connect, disconnect, settings, should_ring, flag_rejected) foram REMOVIDAS dos dois conectores.
@@ -121,9 +121,31 @@ Um card individual dentro de uma etapa.
121
121
  | `custom_attributes` | jsonb — campos custom (igual contatos) |
122
122
  | `assigned_agents` | jsonb array de agentes responsáveis |
123
123
  | `activities` | jsonb array — log de atividades |
124
- | `checklist` | jsonb array de tarefas dentro do card (item: `text`/`completed`/`position` + `group_id`/`group_name` opcionais para agrupar) |
124
+ | `checklist` | **O que fica guardado:** jsonb array de tarefas do card (item: `text`/`completed`/`position` + `group_id`/`group_name` opcionais para agrupar). **O que a API devolve é OUTRA coisa** — ver o aviso logo abaixo |
125
125
  | `timer_started_at`, `timer_duration` | Timer interno do card |
126
126
 
127
+ > **ATENÇÃO — na maioria das respostas o `checklist` NÃO é a lista de tarefas, e sim um resumo com
128
+ > os números:** `{ total_count, completed_count, groups: [{ group_id, group_name, total_count,
129
+ > completed_count }] }`. Não existe nenhum `text` ali. Procurar a tarefa nesse campo faz a IA
130
+ > concluir "esse card não tem checklist" num card que tem 12 tarefas.
131
+ >
132
+ > O formato **muda por ferramenta** — não é o mesmo em todas:
133
+ >
134
+ > | Ferramenta | `checklist` | `attachments` | `item_details.notes` / `offers` / `custom_attributes` | `activities` / `funnel` |
135
+ > |---|---|---|---|---|
136
+ > | `kanban_items_list` | **array completo** | `{ total_count }` | completos | ausentes |
137
+ > | `kanban_items_show` | **resumo** | `{ total_count }` | completos | presentes |
138
+ > | `kanban_items_filter` / `_search` | **resumo** | `{ total_count }` | `notes` vira `{ total_count }`; `offers`/`custom_attributes` **removidos** | ausentes |
139
+ > | card embutido em `conversations_show` | **resumo** | — | — | — |
140
+ >
141
+ > - Para ler as tarefas de verdade em QUALQUER caso: **`lionchat_kanban_items_kanban_checklist_list`**
142
+ > (`GET .../kanban_items/{id}/get_checklist`) → `{ item_id, checklist: [ ...itens completos... ],
143
+ > checklist_count }`.
144
+ > - No resumo, `groups` só conta o que está agrupado: tarefa **avulsa** (sem `group_id`) entra no
145
+ > `total_count`/`completed_count` gerais mas **não aparece** em `groups`. Somar os grupos ≠ total.
146
+ > - O card embutido em `conversations_list`/`conversations_filter` **não traz `checklist` nenhum** —
147
+ > nem resumo. Só `conversations_show` traz o resumo.
148
+
127
149
  ### item_details (detalhes do card)
128
150
 
129
151
  ```json
@@ -326,8 +348,18 @@ qualquer agente no card (`assigned_agents`), não só ao responsável da convers
326
348
  - `conversations_list` / `conversations_search` retornam SÓ conversas de caixas acessíveis (mais as
327
349
  liberadas pela ponte de card atribuído).
328
350
  - `conversations_show` / `conversations_messages_*` de conversa inacessível → **404**.
329
- - Buscar card por ID ou rodar ação em massa (`kanban_bulk_bulk_actions`, export) numa caixa
330
- inacessível → **404** (a ação não vaza cards de caixa que o agente não pode ver).
351
+ - Buscar card por ID de caixa inacessível → **404** (não revela sequer que o card existe).
352
+ - Ação em massa de CARD (`kanban_bulk_create` = mover, `kanban_bulk_create_1` = atribuir agente,
353
+ `kanban_bulk_create_2` = definir prioridade) em que NENHUM dos `item_ids` é acessível → **404**
354
+ `{ "error": "Nenhum item valido encontrado" }`. Se só PARTE for inacessível, a ação roda nos
355
+ acessíveis e ignora o resto em silêncio.
356
+ - `kanban_items_export` **não dá 404** — ele filtra: exporta só os cards das caixas que o agente vê
357
+ (pode voltar vazio). Em nenhum dos casos a resposta vaza card de caixa sem acesso.
358
+
359
+ > **Não confunda:** apesar do nome, **`kanban_bulk_bulk_actions` NÃO é ação em massa de card do
360
+ > Kanban** — ela bate em `POST /accounts/{id}/bulk_actions`, que é a ação em massa de **conversas e
361
+ > contatos** (`type: Conversation` ou `Contact`). Card do Kanban tem as **três** ferramentas
362
+ > listadas acima, todas com `item_ids: [...]`, e nenhuma delas aceita etiqueta.
331
363
 
332
364
  **Pro MCP:** se uma conversa/card "some" da listagem ou dá 404 pra um agente que jura que existe,
333
365
  provavelmente é acesso por caixa — explique que ele só vê as caixas das quais participa, e que o
@@ -21,17 +21,45 @@ Quando o usuário disser "o relatório está errado / não bate", quase sempre
21
21
  CRIADAS no período; resolutions_count = eventos de resolução OCORRIDOS no período (a conversa pode
22
22
  ter sido criada antes). Um atendente pode "resolver mais do que recebeu" — correto, não é bug.
23
23
  2. **"Resolvidas" conta EVENTOS, não conversas.** Resolver → reabrir → resolver = 2. Pode passar do
24
- total de conversas.
24
+ total de conversas. **NUNCA divida `resolutions_count` por `conversations_count` para apresentar
25
+ "taxa de resolução".** São universos diferentes (evento ocorrido na janela ÷ conversa nascida na
26
+ janela) e o resultado passa de 100%: medido em 7 dias, 678%, 325%, 207%, 140% em quatro contas
27
+ reais. Esse cartão foi REMOVIDO do produto em 29/07/2026 justamente por isso — o painel hoje
28
+ mostra "Resoluções no período" em contagem. Se o usuário pedir taxa, explique que não existe e
29
+ entregue os dois números separados.
25
30
  3. **Recorte por ATENDENTE só enxerga conversas ATRIBUÍDAS.** Conversa sem responsável (auto-atribuição
26
31
  desligada, disparo em massa) não aparece em NENHUM atendente — a soma dos atendentes pode ser uma
27
32
  fração minúscula do total da conta (caso real: 202 de 4001). Sempre diga quantas estão sem atendente.
33
+ **Desde 29/07/2026 esse balde é visível:** o resumo por agente (`lionchat_reports_list`) devolve
34
+ também uma linha com `id: null` = "Sem atendente", e a planilha de agentes (`lionchat_reports_list_7`,
35
+ CSV) traz a linha **"Sem atendente"** no FIM da lista. Ela **não é um atendente** — nunca inclua no
36
+ ranking nem cruze o `id: null` com `lionchat_agents_list`. Antes disso o balde era descartado do CSV:
37
+ na conta 19 ficavam de fora 4.222 conversas e 580 resoluções.
28
38
  4. **A contagem de conversas por atendente usa o responsável ATUAL** — reatribuir conversa antiga move
29
39
  o histórico de um atendente pro outro. Já resoluções/tempos usam quem era o dono NA HORA do evento.
30
40
  Os dois cards podem divergir legitimamente em conta que reatribui.
31
41
  5. **timezone_offset NÃO altera totais** de summary — só o agrupamento dos pontos da série temporal.
32
42
  Diferenças de ~1% entre relatório e lista filtrada são borda de janela/fuso, não defeito.
33
- 6. **since/until são unix SEGUNDOS** em TODOS os endpoints de relatório. ISO 8601 quebra a janela em
34
- silêncio (relatório vazio/errado).
43
+ 6. **since/until são unix SEGUNDOS** na família `reports_*`, no CSAT e no SLA. Data por extenso
44
+ (`"2026-07-01"`) é lida como epoch: o `"2026"` vira 01/01/1970 e a janela some. Na conta 19 havia
45
+ 4.396 conversas no período e a resposta veio ZERO, com HTTP 200.
46
+ **Desde 29/07/2026 a maioria dos relatórios RECUSA o formato errado** com HTTP **400** e a mensagem
47
+ "since e until devem ser timestamp Unix em segundos (ex.: 1751328000), não data por extenso".
48
+ Se receber esse 400, converta a data e repita — não é permissão, não é instabilidade, não é plano.
49
+ - **Recusa com 400 (erro visível):** `reports_summary`, `reports_list` (agente), `_1` (time),
50
+ `_2` (caixa), `_3` (etiqueta), `_4` (canal), `_5` (série temporal), `_6` (bot), `_7`–`_10`
51
+ (CSVs), `_11` (lista de conversas), `_12`, `_13` (tráfego), `_14` (bot detalhado) — mais as
52
+ rotas de matriz caixa×etiqueta, distribuição de primeira resposta e contagem de mensagens
53
+ enviadas. A guarda é um `before_action` sem restrição de ação nos dois controladores, então
54
+ vale para toda a família. Nos CSVs (`_7`–`_10` e `_12`) as DUAS pontas são obrigatórias, em
55
+ segundos — faltando uma, também é 400.
56
+ - **AINDA quebra em SILÊNCIO (HTTP 200 com número errado):** `csat_metrics`, `csat_list`,
57
+ `csat_download`, `sla_metrics`, `sla_list`, `sla_download`. Nesses seis, confira você mesmo
58
+ que está mandando segundos — não existe erro para te avisar.
59
+ - **Funil de jornada e Origem dos Leads usam OUTRO formato:** ali o período é **ISO 8601**
60
+ (`2026-07-01T00:00:00-03:00`), não Unix. Também não têm guarda: mandar segundos ali é o erro
61
+ equivalente, e volta o padrão (30 dias) rotulado como o período pedido.
62
+ - Tempo real (`_16`/`_17`) fica de fora da conversa: não aceita período nenhum.
35
63
  7. **Mande SEMPRE as DUAS pontas do período.** Mandar só `since` (ou só `until`) fazia o filtro de
36
64
  data ser ignorado por inteiro, em silêncio: vinham os números da vida toda rotulados como do
37
65
  período pedido. Corrigido em 2026-07-25 (meia janela virou período aberto de um lado), mas a
@@ -45,7 +73,7 @@ Quando o usuário disser "o relatório está errado / não bate", quase sempre
45
73
  conta, inclusive conversa de caixa apagada, e não checa permissão; o `meta` exclui caixa apagada,
46
74
  exige contato vivo e respeita as caixas que o usuário enxerga. Podem divergir com razão.
47
75
 
48
- ### Cinco números que estavam ERRADOS — corrigidos na atualização de 26/07/2026
76
+ ### Números que estavam ERRADOS — corrigidos nas atualizações de 26/07 e 29/07/2026
49
77
 
50
78
  Achados numa validação de cada resposta contra o banco de produção. **A correção é do sistema, não
51
79
  do conector: se a instalação do cliente ainda não recebeu essa atualização, o comportamento ANTIGO
@@ -60,6 +88,8 @@ um número errado com confiança.
60
88
  | Receita/ganhos do KANBAN | Venda fechada no período de card criado ANTES dele não contava (numa conta: metade dos ganhos e R$ 3.750 fora) | Conta tudo |
61
89
  | "Pendentes" do relatório ao vivo | **Sempre 0**, por condição impossível | Número real |
62
90
  | Cumprimento de prazo (SLA) | "100%" para conta com ZERO prazo aplicado — escondia "o SLA não está rodando" | Vazio = sem dados |
91
+ | Por CANAL — conversa de caixa EXCLUÍDA (29/07) | Sumia do relatório: excluir a caixa deixa a conversa sem caixa, e o join descartava essas linhas em silêncio. 512 conversas órfãs de 10 contas em 30 dias; a **conta 60 perdia 76%** do total, a 40 perdia 38%, a 38 perdia 24% | Entram sob a chave **`Channel::None`** ("Caixa excluída"). Some essa chave também — se ignorar, você subconta de novo |
92
+ | Horário de PICO do mapa de calor (29/07) | Dias e horas saíam em **UTC** mesmo mandando `timezone_offset`: no Brasil, o pico aparecia **3 horas adiantado** (o movimento das 11:00 de Brasília era rotulado como 14:00). O cabeçalho do CSV escrevia "(GMT-03:00) Brasília", o que dava aparência de certo | Balde de dia/hora sai do fuso pedido |
63
93
 
64
94
  **Como reconhecer instalação antiga:** soma dos canais menor que o total do resumo; tempo médio por
65
95
  etiqueta absurdamente baixo perto do tempo por atendente; "pendentes" zerado no ao vivo tendo
@@ -135,14 +165,24 @@ conversa pendente na lista; "100%" de prazo com nenhum prazo aplicado.
135
165
  "conversations_count": 142,
136
166
  "incoming_messages_count": 1250,
137
167
  "outgoing_messages_count": 980,
138
- "avg_first_response_time": 245, // segundos
139
- "avg_resolution_time": 7200, // segundos
168
+ "avg_first_response_time": 245, // segundos — MÉDIA
169
+ "avg_resolution_time": 7200, // segundos — MÉDIA
170
+ "median_first_response_time": 180, // segundos — MEDIANA (novo em 29/07/2026)
171
+ "median_resolution_time": 5400, // segundos — MEDIANA (novo em 29/07/2026)
140
172
  "resolutions_count": 98,
141
173
  "reply_time": 320, // segundos
142
174
  "previous": { ...mesma estrutura para comparativo... }
143
175
  }
144
176
  ```
145
177
 
178
+ > ⚠️ **Use a MEDIANA para os dois tempos — é o que o painel mostra.** A média é distorcida pela IDADE
179
+ > da conversa: responder hoje uma conversa de 40 dias entra no cálculo com 40 dias. Medido na conta 38
180
+ > em 28-29/07: 78 eventos de primeira resposta deram média de **164,6 horas** contra mediana de
181
+ > **1,1 hora**. Se você reportar a média, o usuário compara com a tela e diz que o relatório está errado.
182
+ > As duas vêm no mesmo payload; a média continua publicada e não foi removida.
183
+ > **Só o resumo geral tem mediana.** Os resumos por agente/time/caixa/etiqueta/canal e a série temporal
184
+ > (`_5`) devolvem SOMENTE média — ali, reporte com a ressalva de outlier.
185
+
146
186
  **Parâmetros principais:**
147
187
  - `type`: `account` (padrão), `agent`, `inbox`, `label`, `team`
148
188
  - `since` / `until`: Unix timestamp (segundos) — período
@@ -152,7 +192,8 @@ conversa pendente na lista; "100%" de prazo com nenhum prazo aplicado.
152
192
  ### `lionchat_reports_list` — Por agente
153
193
  **Use quando:** "produtividade por atendente", "ranking de agentes"
154
194
 
155
- Retorna array de métricas, **uma por usuário da conta**. Campos confirmados (e SÓ esses):
195
+ Retorna array de métricas, **uma por usuário da conta** — mais, desde 29/07/2026, **uma linha extra
196
+ com `id: null`** quando existem conversas sem responsável no período. Campos confirmados (e SÓ esses):
156
197
  ```json
157
198
  {
158
199
  "id": 6,
@@ -166,6 +207,8 @@ Retorna array de métricas, **uma por usuário da conta**. Campos confirmados (e
166
207
 
167
208
  > ⚠️ **Não existe `name`, `csat_score_average` nem `online_at_total` neste retorno.**
168
209
  > - O campo é só `id` (id do agente). Para o nome, cruze com `lionchat_agents_list`.
210
+ > - **`id: null` NÃO é um agente** — é o balde "Sem atendente". Não cruze com `agents_list` (não vai
211
+ > achar), não coloque no ranking, e cite o número dele separado ao apresentar o total.
169
212
  > - **CSAT por agente:** use `lionchat_csat_list` com filtro `user_ids=<id>` e calcule a média.
170
213
  > - **Tempo online / status:** use `lionchat_agent_availability` ou os live_reports (`_16`/`_17`).
171
214
 
@@ -205,12 +248,32 @@ Retorna SOMENTE estes dois campos (não existe taxa pronta):
205
248
 
206
249
  Heatmap de volume por hora. Aceita SÓ `timezone_offset` (sem ele o pico sai em UTC). ATENÇÃO: janela FIXA a partir de hoje — NÃO aceita `since`/`until`.
207
250
 
251
+ > ⚠️ **Instalação anterior a 29/07/2026: o pico sai em UTC MESMO mandando `timezone_offset`.** O fuso
252
+ > era resolvido por nome (`"-3"` não é nome de zona), caía em UTC e o horário vinha **3 horas adiantado**
253
+ > no Brasil — o movimento das 11:00 aparecia como 14:00. O cabeçalho do CSV mostrava "(GMT-03:00)
254
+ > Brasília" mesmo assim, então o erro não se anunciava. Como reconhecer: pico deslocado exatamente 3h
255
+ > para frente do que o cliente sabe da operação dele. Corrigido — hoje o balde de dia/hora usa o fuso
256
+ > pedido.
257
+
208
258
  ### `lionchat_reports_list_16` / `_17` — Tempo real (live)
209
259
  **Use quando:** "quem tá online agora", "carga atual", "conversas abertas no momento"
210
260
 
211
261
  São os live_reports (`conversation_metrics` e a versão agrupada). Use estes — e não os resumos
212
262
  históricos — quando o usuário quiser o agora.
213
263
 
264
+ `_16` retorna (campo `snoozed` novo em 29/07/2026):
265
+ ```json
266
+ { "open": 105, "unattended": 12, "unassigned": 4, "pending": 3777, "snoozed": 1 }
267
+ ```
268
+
269
+ > ⚠️ **A FILA REAL é `open + pending + snoozed`.** Só `open` esconde quem está esperando: na conta 19
270
+ > davam 105 abertas havendo **3.883 conversas sem resolução** (3.777 pendentes + 1 adiada) — o gestor
271
+ > lê que está tranquilo com a fila cheia. Ao responder "quantas estão esperando agora?", some os três
272
+ > e diga a quebra. `unattended` e `unassigned` são recortes de `open`, **não some com os outros**.
273
+ >
274
+ > `_17` (agrupado por time/atendente) NÃO tem `snoozed` nem `pending` — só `open`, `unattended` e
275
+ > `unassigned`. Para a fila real por atendente não há campo pronto; avise em vez de somar o que não veio.
276
+
214
277
  **Filtros aceitos (expostos na tool desde 2026-07-24):** `inbox_id`, `assignee_id` e `team_id`,
215
278
  todos opcionais e combináveis — é o mesmo recorte da tela Visão Geral. Em `_17` o `group_by`
216
279
  (`team_id` ou `assignee_id`) continua obrigatório e os filtros recortam a base ANTES de agrupar.
@@ -218,7 +281,7 @@ todos opcionais e combináveis — é o mesmo recorte da tela Visão Geral. Em `
218
281
  ### `lionchat_csat_metrics` — CSAT agregado
219
282
  **Use quando:** "satisfação", "nota média dos clientes", "CSAT"
220
283
 
221
- Retorna SOMENTE estes campos (nem média, nem taxa de resposta vêm prontas):
284
+ Retorna SOMENTE estes campos (nem satisfação, nem média, nem taxa de resposta vêm prontas):
222
285
  ```json
223
286
  {
224
287
  "total_count": 80, // total de respostas respondidas
@@ -226,9 +289,21 @@ Retorna SOMENTE estes campos (nem média, nem taxa de resposta vêm prontas):
226
289
  "total_sent_messages_count": 210 // pesquisas CSAT enviadas no período
227
290
  }
228
291
  ```
292
+ > ⚠️ **"Satisfação (CSAT)" no LionChat é o PERCENTUAL de notas 4 e 5 — não é a nota média.**
293
+ > Sempre foi assim (`store/modules/csat.js`, cartão da tela e cálculo do painel).
294
+ >
295
+ > **Satisfação** = `(ratings_count[4] + ratings_count[5]) / total_count`.
296
+ > No exemplo: (18 + 50) / 80 = **85%**.
297
+ >
229
298
  > **Nota média** = `Σ(nota × ratings_count[nota]) / total_count`.
230
299
  > No exemplo: (5×50 + 4×18 + 3×8 + 2×2 + 1×2) / 80 = 352/80 = **4,4**.
231
300
  >
301
+ > Os dois números são legítimos, mas **têm nomes diferentes e não podem ser trocados**: 85% e 4,4
302
+ > descrevem a mesma conta. Se o usuário pediu "satisfação"/"CSAT", entregue o percentual e diga
303
+ > "percentual de notas 4 e 5". Se você apresentar a média, rotule **"nota média"** — nunca
304
+ > "satisfação", nunca "CSAT de 4,4". Apresentar a média como satisfação faz o número não bater com o
305
+ > painel e o usuário conclui que o relatório está quebrado.
306
+ >
232
307
  > **Taxa de resposta** = `total_count / total_sent_messages_count`.
233
308
  > No exemplo: 80/210 = **38%**.
234
309
 
@@ -270,15 +345,34 @@ Semana anterior: 120 conversas
270
345
 
271
346
  ### Business hours
272
347
  - Sem `business_hours: true`: tempos médios incluem madrugada/feriado (puxa pra cima)
273
- - Com `business_hours: true`: só conta período de atendimento configurado (mais preciso pra SLA)
274
-
275
- **Use business_hours: true** quando o usuário perguntar de "produtividade real" ou comparar com SLA.
348
+ - Com `business_hours: true`: conta SÓ o tempo dentro do expediente **das caixas que têm expediente
349
+ configurado** (`working_hours_enabled`)
350
+
351
+ > ⚠️ **NÃO ligue `business_hours: true` por padrão.** O tempo em horário comercial só é gravado para
352
+ > caixa com expediente configurado — e a maioria das contas não configura nenhuma (medido em produção:
353
+ > **nenhuma das 105 caixas** tinha expediente ligado). Três estados possíveis, e você precisa saber
354
+ > reconhecer qual está vendo:
355
+ > 1. **Registros antigos (anteriores a 29/07/2026):** foram gravados com **0** quando não havia
356
+ > expediente. Ligar o filtro devolve "tempo médio de primeira resposta: 0 segundos" — número
357
+ > FABRICADO, lido como atendimento instantâneo. Esse histórico não foi migrado, então continua
358
+ > puxando a média para baixo mesmo hoje.
359
+ > 2. **Registros novos, sem expediente configurado:** vêm vazios/nulos e o cálculo os ignora. O
360
+ > relatório volta **sem dado** (traço), que é honesto — não é bug, não é falta de conversa.
361
+ > 3. **Janela que atravessa 29/07/2026:** mistura os dois. Número não confiável — não use.
362
+ >
363
+ > **Regra prática:** só use `business_hours: true` se o usuário confirmar que as caixas dele têm
364
+ > horário de atendimento configurado. Recebeu 0 ou vazio com o filtro ligado? Refaça SEM o filtro e
365
+ > explique o motivo, em vez de reportar "0 segundos" ou "sem atendimento no período".
276
366
 
277
367
  ### CSAT
278
368
  - Score: 1-5 estrelas
279
- - Médias típicas: 4.0+ é bom, 3.5-4.0 é OK, abaixo de 3.5 é alerta
280
- - A média e a taxa de resposta NÃO vêm prontas — calcule a partir de `ratings_count`, `total_count`
281
- e `total_sent_messages_count` (fórmulas na seção do `lionchat_csat_metrics`)
369
+ - **"Satisfação"/"CSAT" da plataforma = percentual de notas 4 e 5** (`(4+5) / total`), NÃO a média.
370
+ Não há faixa de referência oficial no produto para esse percentual — para dar contexto, compare com
371
+ o período anterior da própria conta
372
+ - A **nota média** é outro número: 4.0+ é bom, 3.5-4.0 é OK, abaixo de 3.5 é alerta. Se apresentar,
373
+ rotule "nota média" — nunca "satisfação"
374
+ - Satisfação, média e taxa de resposta NÃO vêm prontas — calcule a partir de `ratings_count`,
375
+ `total_count` e `total_sent_messages_count` (fórmulas na seção do `lionchat_csat_metrics`)
282
376
  - Taxa de resposta = `total_count / total_sent_messages_count` (baixa = pouco feedback)
283
377
 
284
378
  ### SLA (Enterprise-only)
@@ -328,9 +422,16 @@ reports_list_5 com group_by=month, metric=conversations_count, since=12 meses at
328
422
  - Para **status/tempo online**: `lionchat_agent_availability` ou live_reports (`_16`/`_17`).
329
423
  - Para o **nome** do agente: cruze o `id` com `lionchat_agents_list`.
330
424
 
331
- ### ⚠️ Avg time pode ser enganador
425
+ ### ⚠️ Avg time pode ser enganador — e há mediana no resumo geral
332
426
  Mediana é mais representativa que média (1 conversa que durou 5 dias puxa tudo).
333
- **Mas o LionChat hoje só retorna média.** Reporte com ressalva: "Tempo MÉDIO de X — pode ter outliers."
427
+
428
+ **Desde 29/07/2026 o `lionchat_reports_summary` devolve `median_first_response_time` e
429
+ `median_resolution_time`** (segundos), ao lado das médias. **É a mediana que o painel mostra nos dois
430
+ cartões de tempo** — use ela. Conta 38, 28-29/07: média de 164,6 horas contra mediana de 1,1 hora,
431
+ porque 6 conversas antigas respondidas no dia entram com a idade inteira.
432
+
433
+ Nos demais (por agente/time/caixa/etiqueta/canal e série temporal `_5`) **só há média** — aí sim
434
+ reporte com ressalva: "Tempo MÉDIO de X — pode ter outliers."
334
435
 
335
436
  ### ⚠️ Reports não pegam conversas em tempo real
336
437
  A maioria dos endpoints é eventually consistent (cache 5min). Pra info real-time use `conversations_meta`.
package/dist/tools.js CHANGED
@@ -307,7 +307,7 @@ function registerListCategoriesTool(server, allEndpoints) {
307
307
  // Helps LLMs build correct flow_data without hitting trial-and-error on
308
308
  // node types, action keys, source handles, etc.
309
309
  function registerFlowsSchemaReferenceTool(server) {
310
- const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-07-28)
310
+ const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-07-30)
311
311
 
312
312
  flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
313
313
 
@@ -571,12 +571,24 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
571
571
  + waitDateMode/waitTimeMode ("fixed"|"variable"). Em "variable" o campo contem {{contact.custom_attribute.X}}
572
572
  (Data SO aceita atributo tipo date; Horario SO tipo time). Resolve UMA vez na entrada do node.
573
573
  Variavel invalida -> saida "error" (invalid_variable_datetime). Data no passado -> segue por "success".
574
- weekday: waitWeekday (0=dom..6=sab) + waitWeekdayTime ("HH:MM", SEMPRE fixo, sem variavel) + waitTimezone
574
+ weekday: waitWeekday (0=dom..6=sab) + waitWeekdayTime ("HH:MM" 24h) + waitWeekdayTimeMode
575
+ ("fixed" default | "variable") + waitTimezone. O Horario ACEITA VARIAVEL desde 29/07
576
+ (antes era sempre fixo por decisao de produto — o dono reverteu). Mesmo contrato do modo
577
+ date: em "variable" o waitWeekdayTime contem {{...}} (atributo tipo time), resolve UMA vez
578
+ na entrada do node, aceita "14:30"/"9:30"/"14h30", variavel invalida -> saida "error".
579
+ waitWeekdayTimeMode e OBRIGATORIO ao usar variavel: sem ele (ou em "fixed") o motor trata o
580
+ campo como TEXTO FIXO e o calculo recebe a chave literal {{...}} — como o MCP grava o JSON
581
+ do flow direto, sem passar pela tela, nada preenche esse campo por voce.
575
582
  (NAO existem waitUnit:"weekday", targetWeekday nem targetHour — erro de doc antiga)
576
- Handles: "success" (+ "error" so com variavel invalida no modo date)
583
+ Handles: "success" (+ "error" quando a variavel de data/hora nao resolve — vale nos DOIS modos
584
+ com variavel, date e weekday, erro invalid_variable_datetime; no modo fixo nunca ha "error")
577
585
 
578
586
  ▸ randomizer
579
- data: { label, mode:"branches", branches:[{id,label,weight}] }
587
+ data: { label, mode:"branches", branches:[{id,label,percent}] }
588
+ O campo e "percent", NAO "weight" (30/07): a tela sempre gravou percent e o motor lia so weight —
589
+ todo node configurado pela tela quebrava. Hoje o motor le percent e aceita weight so como dado
590
+ antigo. Escreva SEMPRE percent: com weight o node roda, mas abre com as porcentagens EM BRANCO
591
+ na tela do cliente.
580
592
  mode "distribute_agents" (SORTEIO ponderado): data.agents:[{agent_id, percent}] (percentuais somando
581
593
  100) — sorteia 1 agente por probabilidade e atribui; handle unico "success". E SORTEIO, nao rodizio
582
594
  (pode cair no mesmo agente varias vezes seguidas). Pra RODIZIO exato use a ACAO distribute_agents.
@@ -615,15 +627,27 @@ condicao bater, o lead sai do flow NA HORA. Cada item tem "type":
615
627
  contact.name, contact.email, contact.phone, contact.custom_attribute.X (SINGULAR — plural resolve vazio)
616
628
  CADASTRAL forma curta (canonica): contact.cpf, contact.cnpj, contact.rg, contact.address.street,
617
629
  contact.address.number, ... (NAO e custom_attribute!)
618
- conversation.id (id INTERNO do banco), conversation.display_id (numero do app — use ESTE pra montar
619
- link de conversa), conversation.status, conversation.team_id, conversation.agent_id,
620
- conversation.labels, conversation.custom_attribute.X
621
- agent.name, agent.first_name, agent.last_name, agent.id, agent.email (email NOVO 23/07)
630
+ conversation.id — JA E o numero que aparece no app (o motor devolve o display_id). Use ESTE pra
631
+ montar link de conversa. NAO existe um "id interno do banco" separado nas variaveis.
632
+ conversation.display_id e so um APELIDO, aceito desde 29/07, que devolve o mesmo numero — antes
633
+ disso resolvia VAZIO, e todo link de conversa montado por flow saiu quebrado.
634
+ conversation.status, conversation.team_id, conversation.custom_attribute.X
635
+ conversation.label (SINGULAR — etiquetas da conversa em texto separado por virgula).
636
+ {{conversation.labels}} NAO EXISTE: some do texto sem erro nenhum.
637
+ agent.* = o RESPONSAVEL da conversa: agent.name, agent.first_name, agent.last_name,
638
+ agent.id (USE ESTE pro id do responsavel — conversation.agent_id resolvia VAZIO ate 29/07, quando
639
+ virou apelido de agent.id; escreva a forma canonica), agent.email (email NOVO 23/07)
622
640
  inbox.id, inbox.name (antes resolviam vazio fora do Enviar Mensagem — corrigido 23/07)
623
641
  account.name, account.id (id NOVO 23/07), account.custom_attribute.X (inclui variaveis de conta e
624
642
  segredos — NAO existe env.X), {{var_criada_no_set_variable}}, {{ai_intent}}, {{api_response_var}}
625
643
  DESDE 23/07 essas variaveis padrao funcionam em TODOS os nodes (Chamada API, Condicoes, IA, Definir
626
644
  Variavel) — antes so no Enviar Mensagem. Campo vazio resolve pra string vazia (nunca trava o flow).
645
+ REGRA-MAE: variavel FORA da lista acima SOME do texto, sem erro em lugar nenhum — nao quebra o save,
646
+ nao quebra a execucao, nao aparece no historico do node. So o buraco no texto denuncia. Por isso
647
+ escreva exatamente as chaves desta lista e nunca invente plural/sinonimo. Em caixa WhatsApp
648
+ OFICIAL o preco e maior: parametro de template que chega vazio faz a META RECUSAR o envio
649
+ (#132000) e o cliente NAO RECEBE NADA — foi assim que um aviso de medicacao deixou de ser
650
+ entregue (conta 56, 29/07, {{conversation.assignee.name}} resolvendo vazio).
627
651
 
628
652
  ═══ ANTI-LOOP ═══
629
653
  Cadeias automacao<->flow tem profundidade maxima 5 hand-offs (MAX_CHAIN_DEPTH). No 5o a cadeia e
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}