@lionchat/mcp-server 0.5.1 → 0.5.3

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.
@@ -57,6 +57,16 @@ Account (conta/empresa)
57
57
  - `agent` (atendente comum)
58
58
  - `administrator` (admin/dono)
59
59
 
60
+ ### Supervisor de caixa (InboxMember.auto_assignable)
61
+
62
+ Independente do `role`, um membro de caixa pode ser **supervisor**: vê TODAS as conversas e cards
63
+ daquela caixa, mas fica FORA da distribuição automática (round-robin nunca atribui a ele). É o flag
64
+ `inbox_members.auto_assignable` (false = supervisor, true = membro comum). As tools
65
+ `lionchat_inbox_members_create/update` separam `user_ids[]` (comuns) de `supervisor_ids[]`
66
+ (supervisores); a resposta traz `is_supervisor` por agente. Lembre: agente não-admin só enxerga as
67
+ caixas das quais participa — exceção é estar atribuído a um card, que libera só aquela conversa (ver
68
+ `lionchat://docs/kanban-deep-dive`).
69
+
60
70
  ## 3. Convenções da API
61
71
 
62
72
  ### Datas
@@ -273,6 +283,11 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
273
283
  | **Exportar contatos** (CSV completo por e-mail) | `lionchat_contacts_export` | Respeita filtros/segmento aplicados |
274
284
  | Mensagem pra OUTRO AGENTE (não cliente) | `lionchat_internal_chat_*` (salas e mensagens do time) | NÃO confundir com nota privada (dentro da conversa do cliente) |
275
285
  | Achar contato pelo que aconteceu com ele (conversa/card) | `lionchat_contacts_filter` com `linked_records` | Ver api-conventions → registros vinculados |
286
+ | **Origem dos leads** (de onde vieram, por plataforma/campanha/conjunto) | `lionchat_lead_origin_reports` | Relatório de leitura; filtros `platform`/`campaign`/`adset`; `won` = cards em Ganho; leads únicos por telefone |
287
+ | **Bloquear/desbloquear** contato | `lionchat_conversations_toggle_block` (`blocked: true|false`) | Gera pílula de atividade e descarta mensagens futuras do contato; NÃO resolve a conversa |
288
+ | **Importar histórico** de caixa WhatsApp Cloud (QR) | `lionchat_inboxes_whatsapp_history_start` / `_status` / `_cancel` | Admin-only + flag `qr_history_import`; só caixa oficial. Acompanhe `state` no `_status` |
289
+ | **Definir supervisor** de caixa | `lionchat_inbox_members_create` / `_update` com `supervisor_ids[]` | Supervisor vê TUDO da caixa mas fica fora do rodízio (ver abaixo) |
290
+ | Saber se a IA deve TOCAR a ligação WP (Wavoip) / marcar recusada | `lionchat_wavoip_should_ring` / `lionchat_wavoip_flag_rejected` | Controle fino do toque de chamada na caixa QR Code |
276
291
 
277
292
  ## 9. Quando NÃO chamar nenhuma ferramenta
278
293
 
@@ -198,6 +198,10 @@ Ou para listas grandes (cursors):
198
198
  - `includes` / `excludes` (relacionamentos)
199
199
  - `before` / `after` (datas)
200
200
 
201
+ > **Contatos — busca parcial por nome/ID externo:** no `POST /contacts/filter`, os campos `name` e
202
+ > `identifier` aceitam `contains` / `does_not_contain` (match parcial, case-insensitive). Use isso
203
+ > pra "contatos cujo nome contém X" sem precisar do valor exato.
204
+
201
205
  ## Formatos de Data
202
206
 
203
207
  ### Quando enviar (input)
@@ -374,6 +378,28 @@ O `field_mapping` do webhook personalizado aceita caminhos com índice de array:
374
378
  mesmo caminho captura valores diferentes. Campo `flow_id` na criação liga o webhook a um flow
375
379
  (webhook embutido — ver resource de fluxos).
376
380
 
381
+ ### Import de histórico do WhatsApp Cloud (2026-06)
382
+
383
+ Caixas WhatsApp Cloud API podem importar o histórico de conversas via QR Code. Tools sob
384
+ `/inboxes/:inbox_id/whatsapp_history`:
385
+
386
+ - `lionchat_inboxes_whatsapp_history_start` — `POST` com param `days` (quantos dias de histórico
387
+ puxar). Inicia o processo.
388
+ - `lionchat_inboxes_whatsapp_history_status` — `GET`, retorna `{state, qr, days, progress, stats,
389
+ error}`. Estados na ordem: `idle` → `scan_qr` → `importing` → `migrating` → `cleaning` →
390
+ `done` (ou `failed`). Quando `state = scan_qr`, o campo `qr` traz o código pra escanear.
391
+ - `lionchat_inboxes_whatsapp_history_cancel` — `POST`, aborta o import em andamento.
392
+
393
+ **Gates:** admin-only + feature flag `qr_history_import`. SÓ funciona em caixa WhatsApp Cloud API
394
+ (`Channel::Whatsapp`) — não confundir com a importação de histórico do WAHA (QR Code não-oficial),
395
+ que é outro mecanismo.
396
+
397
+ ### Ver histórico anterior do contato (2026-06)
398
+
399
+ Dentro de uma conversa há um botão que mostra as CONVERSAS ANTERIORES do mesmo contato NA MESMA
400
+ caixa. Não há endpoint novo pra isso — pra reproduzir via API, liste as conversas do contato
401
+ filtrando pelo `inbox_id` (`conversations_list` / `conversations_filter` por contato + caixa).
402
+
377
403
  ## Headers úteis pra mandar
378
404
 
379
405
  - `Accept: application/json` (sempre)
@@ -180,6 +180,28 @@ Sem o tipo, o filtro pode bater no escopo errado. A UI mostra sufixo "(Conversa)
180
180
  pendência de permissão).
181
181
  - Meta CAPI: o evento `InitiateCheckout` foi RENOMEADO para `begin_checkout`.
182
182
 
183
+ ### Meta CAPI — moeda do valor (2026-06)
184
+
185
+ O disparo da conversão aceita `currency` (código ISO, ex: `BRL`, `USD`); default `BRL`. Dá pra
186
+ escolher a moeda no próprio disparo e também na config do funil (valor padrão herdado pelos cards
187
+ daquele funil). Sempre confirme a moeda com o usuário se o valor não for em reais.
188
+
189
+ ### Meta Lead — resiliência da ativação e backfill (2026-06)
190
+
191
+ A ativação ficou tolerante a falhas — não trava mais por causa de um lead de exemplo (sample) com
192
+ formato estranho: o erro de sample é tolerado e a ativação segue. Outros ganhos de robustez:
193
+
194
+ - **Auto-retry de limite:** quando bate o rate limit da Meta, tenta de novo sozinho com espera, em
195
+ vez de falhar de cara.
196
+ - **Botão "7 dias" (backfill):** puxa leads recentes que ficaram pra trás. Parâmetro `days` (default
197
+ 7, máximo 30). A resposta traz `mode`: `bulk` (puxa em lote pela API) ou `replay` (reprocessa
198
+ eventos já recebidos). Recupera inclusive leads que tinham sido ignorados antes.
199
+ - **Sem `pages_manage_ads`:** funciona mesmo sem essa permissão específica da Meta.
200
+ - **Log legível** dos eventos (em vez de dump cru) e suporte a **múltiplas BMs**.
201
+
202
+ **Pro MCP:** ao acionar o backfill, informe ao usuário o `mode` retornado e quantos dias foram
203
+ puxados. Se a ativação reclamar de sample, NÃO é bloqueio — a integração ainda fica ativa.
204
+
183
205
  ## Campanhas: audiência acumulativa (2026-06)
184
206
 
185
207
  `audience` aceita 3 tipos de seção combináveis: `Label`, `Funnel` (com stages/include_won/include_lost)
@@ -58,9 +58,16 @@ Channel::Waha / Channel::Whatsapp / Channel::WebWidget / ...
58
58
 
59
59
  InboxMember (junction Inbox ↔ User)
60
60
  ├── inbox_id
61
- └── user_id
61
+ ├── user_id
62
+ └── auto_assignable (bool) — true = membro comum (entra na distribuição automática);
63
+ false = supervisor (vê TUDO da caixa, fora do rodízio)
62
64
  ```
63
65
 
66
+ > **Supervisor de caixa:** o flag `inbox_members.auto_assignable = false` marca o membro como
67
+ > supervisor. Ele enxerga todas as conversas/cards da caixa, mas o round-robin nunca atribui
68
+ > conversas a ele. As tools `lionchat_inbox_members_create/update` separam `user_ids[]` (membros
69
+ > comuns) de `supervisor_ids[]` (supervisores); a resposta expõe `is_supervisor` por agente.
70
+
64
71
  ## Conversação e Mensagens
65
72
 
66
73
  ```
@@ -77,6 +77,14 @@ Todo node tem essa estrutura base:
77
77
  4. Salvar o flow (`flows_update`) — o save sincroniza a ativação do webhook embutido (remover o item desativa a integração automaticamente).
78
78
  Webhooks embutidos NÃO aparecem na listagem de integrações standalone; excluir o flow destrói o webhook; duplicar o flow NÃO copia o gatilho embutido. Rate limit do endpoint público: 60/min por token.
79
79
 
80
+ **TRAVA DE GATILHO DUPLICADO (2026-06-16) — leia ANTES de ativar/criar flow ativo:** o sistema BLOQUEIA ter dois flows ATIVOS com o MESMO gatilho na MESMA inbox e mesmo `conversation_mode` (evita o evento disparar dois flows). Colisão = mesmo tipo de gatilho + config cruzando (mesmas keywords/funil/labels/url/etc) + inbox compartilhada + mesmo modo. EXCEÇÕES que podem coexistir: `webhook_received` e `manual_trigger`.
81
+ - Ao **ativar** (`flows_toggle` inativo→ativo) ou **criar já ativo**: qualquer conflito é barrado.
82
+ - Ao **editar** um flow já ativo: só conflito NOVO é barrado (duplicados que já existiam são preservados).
83
+ - A API responde **422** com `{ "error_code": "flow_trigger_conflict", "conflicts": [{ flow_id, flow_name, trigger_type, inbox_id, inbox_name }] }`.
84
+ - Existe `POST /flows/check_conflicts` (mesma assinatura, NÃO salva) pra checar antes.
85
+
86
+ **Como a IA deve agir:** antes de ativar um flow, confira via `flows_list` se já não há outro flow ativo no mesmo gatilho+inbox. Se receber 422 `flow_trigger_conflict`, NÃO fique reativando — EXPLIQUE o conflito ao usuário (nome do flow conflitante + caixa) e ofereça desativar o outro flow ou ajustar o gatilho/keywords.
87
+
80
88
  **Handles que SAEM:** `success`.
81
89
 
82
90
  ### 2.2 `send_message`
@@ -133,7 +141,20 @@ Webhooks embutidos NÃO aparecem na listagem de integrações standalone; exclui
133
141
  }
134
142
  ```
135
143
 
136
- **`validation` válidos:** `any`, `options`, `regex`.
144
+ **`validation` válidos:** `any`, `options`, `varied_options`, `regex`, `email`, `phone`, `number`.
145
+
146
+ **`options` normaliza a resposta (2026-06-16):** a comparação com `acceptedOptions` é feita sem acento e sem maiúscula (`I18n.transliterate` + downcase + strip nos dois lados). "São Paulo", "sao paulo" e "SAO PAULO" casam todos.
147
+
148
+ **`varied_options` — uma opção, vários jeitos de escrever (2026-06-16):** use quando a MESMA opção pode vir em sinônimos/variações (ex: "sim", "claro", "quero" → tudo é "sim"). Em vez de `acceptedOptions`, configure `optionGroups`: cada grupo tem uma lista de termos e um `matchType` PRÓPRIO (`contains` padrão, ou `equals`). Use `equals` quando o termo curto colidiria — ex: o termo "1" com `contains` casaria "12"; com `equals` não. Roteia por uma saída dedicada por grupo: `option_<group_id>` (uma por grupo, não por termo). Mesma normalização do `options` (sem acento/maiúscula). Fallback de matchType: se um grupo não tiver `matchType`, usa o `optionsMatchType` do node (modo global antigo); sem isso, `contains`.
149
+
150
+ ```json
151
+ { "validation": "varied_options",
152
+ "optionGroups": [
153
+ { "id": "sim", "terms": ["sim", "claro", "quero", "pode ser"], "matchType": "contains" },
154
+ { "id": "nao", "terms": ["nao", "não", "agora nao"], "matchType": "contains" }
155
+ ] }
156
+ ```
157
+ → edges: `sourceHandle: "option_sim"`, `sourceHandle: "option_nao"` (+ `timeout` + `retries_exhausted`).
137
158
 
138
159
  **`saveTo` válidos (nomes EXATOS — qualquer outro valor NÃO salva nada):**
139
160
  - `variable` — variável temporária do flow (use `saveVariable` pra nomear; senão usa o próprio `saveTo`)
@@ -146,14 +167,22 @@ Webhooks embutidos NÃO aparecem na listagem de integrações standalone; exclui
146
167
 
147
168
  **NÃO existem** `attribute` nem `contact_attribute` — use `conversation_attr` / `contact_attr`.
148
169
 
170
+ **Salvar e-mail/telefone/nome do contato com segurança (2026-06-16):** o valor é normalizado antes de gravar (telefone → E.164 via `+55`; e-mail → strip). O cadastro do contato REVERTE silenciosamente um e-mail/telefone inválido (não dá erro, mas não muda). Por isso os destinos `contact_email`/`contact_phone`/`contact_name` SÓ devem ser usados com a validação que combina:
171
+ - `saveTo: "contact_email"` → use `validation: "email"`
172
+ - `saveTo: "contact_phone"` → use `validation: "phone"`
173
+ - `saveTo: "contact_name"` → `any` serve
174
+ No editor visual esses destinos só aparecem quando a validação bate (computed `allowedSaveTargets`). Os destinos `variable`/`contact_attr`/`conversation_attr` aceitam QUALQUER valor (sem essa restrição).
175
+
149
176
  **Handles que SAEM dependem da validation:**
150
- - `validation: 'any'` → `success`, `timeout`
151
- - `validation: 'options'` → `option_<valor>` para cada valor em `acceptedOptions` (ex: `option_1`, `option_2`, `option_sim`) + `timeout`
152
- - `validation: 'regex'` → `success`, `timeout`
177
+ - `validation: 'any'` (e `regex`/`email`/`phone`/`number`) → `success`, `timeout`, `retries_exhausted`
178
+ - `validation: 'options'` → `option_<valor>` para cada valor em `acceptedOptions` (ex: `option_1`, `option_2`, `option_sim`) + `timeout` + `retries_exhausted`
179
+ - `validation: 'varied_options'` → `option_<group_id>` para cada grupo em `optionGroups` (ex: `option_sim`, `option_nao`) + `timeout` + `retries_exhausted`
180
+
181
+ **`timeout` vs `retries_exhausted` (DISTINTOS):** `timeout` = cliente ficou em silencio (estourou `waitTime`). `retries_exhausted` = cliente respondeu, mas errou a validacao mais que `maxRetries` vezes. Ligue cada um ao caminho desejado. Se `retries_exhausted` nao tiver edge, ha fallback p/ o edge de `timeout`; sem nenhum dos dois, o flow encerra ao esgotar as tentativas.
153
182
 
154
183
  **Timeout AGORA dispara de verdade (corrigido 2026-06-09):** `waitTime` + `waitUnit` agendam o estouro — se o cliente não responder no prazo, o flow segue pelo handle `timeout`. Antes dessa data o backend ignorava o waitTime (flows antigos que dependiam do timeout passaram a funcionar). Sempre ligue um edge no handle `timeout` quando definir waitTime; sem edge, o flow simplesmente para ali no estouro.
155
184
 
156
- **REGRA:** depois de wait_response com options, NUNCA coloque node `condition` pra ramificar — ligue os edges direto nos handles `option_X`.
185
+ **REGRA:** depois de wait_response com `options` OU `varied_options`, NUNCA coloque node `condition` pra ramificar — ligue os edges direto nos handles `option_X` (em `varied_options`, `X` é o `id` do grupo).
157
186
 
158
187
  ### 2.4 `condition`
159
188
 
@@ -459,6 +488,26 @@ Não tente contornar criando flows intermediários.
459
488
 
460
489
  ---
461
490
 
491
+ ## 2-C. Variáveis — de onde vêm e onde aparecem
492
+
493
+ Variáveis de sessão (`{{nome}}`) são CRIADAS por alguns nodes e ficam disponíveis pros nodes seguintes. O autocomplete `{{` no editor é **ciente do grafo (graph-aware)**: num node, ele só lista variáveis definidas por nodes UPSTREAM (no caminho de execução até ali) — não sugere variável que ainda não existe no ponto da execução. Use isso como regra: só referencie `{{var}}` se algum node ANTES dele (no caminho) a tiver criado.
494
+
495
+ Fontes de variável (quem cria o quê):
496
+
497
+ | Node | Variável(is) criada(s) |
498
+ |---|---|
499
+ | `set_variable` | cada item de `data.variables[].name` |
500
+ | `wait_response` com `saveTo: 'variable'` | o nome em `data.saveVariable` |
501
+ | `ai` mode `generate` / `custom` | `aiResponseVar` (default `ai_response`) |
502
+ | `ai` mode `intent` | `ai_intent` |
503
+ | `ai` mode `sentiment` | `ai_sentiment` |
504
+ | `ai` mode `extract` | cada `aiExtractParams[].name` (uma variável por parâmetro) |
505
+ | `api` | `apiResponseVar` (+ `apiResponseVar`_status) e campos do JSON de resposta |
506
+
507
+ Variáveis salvas em atributo (`saveTo: 'contact_attr'`/`'conversation_attr'`, ou node `action` `update_attribute`) NÃO viram variável de sessão `{{var}}` — leia-as via `{{contact.custom_attribute.X}}` / `{{conversation.custom_attribute.X}}` (singular).
508
+
509
+ ---
510
+
462
511
  ## 3. Edges
463
512
 
464
513
  ```json
@@ -540,6 +589,9 @@ Nodes nunca devem ficar com a mesma coordenada `(x, y)`. Se dois nodes têm posi
540
589
  | Edge com `target` apontando pra ID que não existe | Quebra o grafo | Confira que `target` está em `nodes[]` |
541
590
  | `channel_type: "WhatsApp"` | Precisa do nome de classe Rails | `"Channel::Whatsapp"`, `"Channel::Waha"`, `"Channel::WebWidget"` |
542
591
  | `validation: "option"` (singular) | Não existe | `"options"` (plural) |
592
+ | `varied_options` com `acceptedOptions` | Modo errado de config | `optionGroups: [{ id, terms, matchType }]` |
593
+ | `saveTo: "contact_phone"`/`"contact_email"` com `validation: "any"` | Cadastro reverte valor inválido em silêncio | Combine com `validation: "phone"`/`"email"` |
594
+ | Ativar 2 flows no mesmo gatilho+inbox+modo | 422 `flow_trigger_conflict` (exceto webhook/manual) | Desative o outro flow ou mude o gatilho |
543
595
  | `custom_attributes` (plural) em `{{...}}` ou `field` | Resolve vazio | `custom_attribute` (singular) |
544
596
  | `update_attribute` com `{entity, key, value}` | Campos errados, não salva | `{attr_source, attr_key, attr_value}` |
545
597
  | `saveTo: "attribute"` ou `"contact_attribute"` | Não existem, não salva | `"conversation_attr"` / `"contact_attr"` |
@@ -572,5 +624,7 @@ Antes de chamar `flows_create` ou `flows_update`, valide mentalmente:
572
624
  - [ ] Todo `sourceHandle` é um handle real exposto pelo node source (seção 2)
573
625
  - [ ] `channel_type` é classe Rails (`Channel::Waha` etc)
574
626
  - [ ] `inbox_ids` (se enviado) tem inboxes do mesmo `channel_type`
575
- - [ ] Não tem `condition` redundante depois de `wait_response` com options
627
+ - [ ] Não tem `condition` redundante depois de `wait_response` com `options`/`varied_options`
628
+ - [ ] `wait_response` que salva e-mail/telefone do contato usa a validação correspondente (`email`/`phone`)
629
+ - [ ] Antes de ATIVAR: nenhum outro flow ativo no mesmo gatilho+inbox+modo (senão vem 422 `flow_trigger_conflict`)
576
630
  - [ ] Layout: nodes em ordem visual da esquerda pra direita, sem sobreposição
@@ -433,6 +433,55 @@
433
433
 
434
434
  ---
435
435
 
436
+ ## 14. Sim/Não com sinônimos (varied_options) + salvar e-mail com segurança
437
+
438
+ **Caso:** cliente pode responder "sim" de vários jeitos ("claro", "quero", "pode ser") — `varied_options` agrupa tudo numa só saída. Depois pede o e-mail e salva no cadastro com a validação certa (`email`), pra não ser revertido em silêncio.
439
+
440
+ ```json
441
+ {
442
+ "nodes": [
443
+ { "id": "n1", "type": "start", "position": { "x": 50, "y": 300 }, "data": { "label": "Início", "triggers": [{ "type": "conversation_created" }] } },
444
+ { "id": "n2", "type": "send_message", "position": { "x": 370, "y": 300 }, "data": { "label": "Oferece", "messageItems": [
445
+ { "id": "m1", "type": "text", "content": "Quer receber nossas novidades por e-mail?" }
446
+ ] } },
447
+ { "id": "n3", "type": "wait_response", "position": { "x": 690, "y": 300 }, "data": {
448
+ "label": "Quer?", "waitTime": 30, "waitUnit": "minutes", "validation": "varied_options",
449
+ "optionGroups": [
450
+ { "id": "sim", "terms": ["sim", "claro", "quero", "pode ser", "aceito"], "matchType": "contains" },
451
+ { "id": "nao", "terms": ["nao", "não", "agora nao", "passo"], "matchType": "contains" }
452
+ ],
453
+ "invalidMessage": "Responda com sim ou não, por favor.", "maxRetries": 2, "saveTo": ""
454
+ } },
455
+ { "id": "n4", "type": "send_message", "position": { "x": 1010, "y": 180 }, "data": { "label": "Pede e-mail", "messageItems": [
456
+ { "id": "m2", "type": "text", "content": "Show! Qual seu melhor e-mail?" }
457
+ ] } },
458
+ { "id": "n5", "type": "wait_response", "position": { "x": 1330, "y": 180 }, "data": {
459
+ "label": "Captura e-mail", "waitTime": 15, "waitUnit": "minutes", "validation": "email",
460
+ "invalidMessage": "Esse e-mail não parece válido, pode conferir?", "maxRetries": 2,
461
+ "saveTo": "contact_email"
462
+ } },
463
+ { "id": "n6", "type": "send_message", "position": { "x": 1650, "y": 180 }, "data": { "label": "Confirma", "messageItems": [
464
+ { "id": "m3", "type": "text", "content": "Pronto, anotei aqui. Obrigado!" }
465
+ ] } },
466
+ { "id": "n7", "type": "send_message", "position": { "x": 1010, "y": 420 }, "data": { "label": "Tudo bem", "messageItems": [
467
+ { "id": "m4", "type": "text", "content": "Sem problema! Qualquer coisa é só chamar." }
468
+ ] } }
469
+ ],
470
+ "edges": [
471
+ { "id": "e1", "source": "n1", "target": "n2", "sourceHandle": "success", "type": "deletable", "animated": true },
472
+ { "id": "e2", "source": "n2", "target": "n3", "sourceHandle": "success", "type": "deletable", "animated": true },
473
+ { "id": "e3", "source": "n3", "target": "n4", "sourceHandle": "option_sim", "type": "deletable", "animated": true },
474
+ { "id": "e4", "source": "n3", "target": "n7", "sourceHandle": "option_nao", "type": "deletable", "animated": true },
475
+ { "id": "e5", "source": "n4", "target": "n5", "sourceHandle": "success", "type": "deletable", "animated": true },
476
+ { "id": "e6", "source": "n5", "target": "n6", "sourceHandle": "success", "type": "deletable", "animated": true }
477
+ ]
478
+ }
479
+ ```
480
+
481
+ **Lembretes:** em `varied_options` o handle é `option_<id do grupo>` (não por termo); use `matchType: "equals"` quando um termo curto colidiria (ex: "1" casando "12" com `contains`). Pra salvar telefone use `validation: "phone"` + `saveTo: "contact_phone"`.
482
+
483
+ ---
484
+
436
485
  ## Como usar este catálogo
437
486
 
438
487
  1. **Identifique o pattern mais próximo** do que o cliente pediu
@@ -440,6 +489,6 @@
440
489
  3. **Substitua os IDs e valores reais** (team_id, funnel_id, assistant_id, templateId, URLs, etc) — confira antes via `teams_list`, `funnels_list`, `captain_assistants_list`, `inboxes_whatsapp_templates_list`
441
490
  4. **Adicione campos do flow**: `name`, `description`, `channel_type` (`Channel::Waha` etc), `inbox_ids`
442
491
  5. **Chame `flows_create`** com o payload completo
443
- 6. Após criar, **ative** com `flows_toggle` se o cliente quiser que rode já
492
+ 6. Após criar, **ative** com `flows_toggle` se o cliente quiser que rode já. ATENÇÃO (2026-06-16): se já existir outro flow ATIVO com o mesmo gatilho na mesma inbox (e mesmo modo), a ativação retorna **422 `flow_trigger_conflict`** — exceto `webhook_received`/`manual_trigger`, que podem coexistir. Não fique reativando: explique o conflito ao usuário (qual flow + qual caixa) e ofereça desativar o outro ou mudar o gatilho. Dá pra checar antes com `POST /flows/check_conflicts` (não salva). Detalhes no `flowbuilder-design-guide` (seção 2.1, "Trava de gatilho duplicado").
444
493
 
445
494
  Se a necessidade não bate com nenhum pattern, monte do zero seguindo o **`flowbuilder-design-guide`** — mas use estes templates como referência de layout/handle/schema válidos.
@@ -108,6 +108,21 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
108
108
  - `source_id`: ID do contato no canal (ex: `5511999999999@c.us` no WhatsApp WAHA)
109
109
  - Um contato pode ter vários ContactInboxes (um por canal)
110
110
 
111
+ ### Bloqueio de contato (`blocked`)
112
+
113
+ **Termo:** "bloquear contato" / "contato bloqueado".
114
+
115
+ **O que é:** marca o contato como bloqueado. Quando bloqueado, mensagens recebidas dele são
116
+ DESCARTADAS na entrada (não criam conversa nem notificam). Bloquear NÃO resolve a conversa atual.
117
+
118
+ **Como aplicar via tools:**
119
+ - Forma dedicada: `lionchat_conversations_toggle_block` — `POST .../conversations/:id/toggle_block`
120
+ com body `{blocked: true|false}`. Bloqueia/desbloqueia o contato DAQUELA conversa e gera uma
121
+ pílula de atividade ("contato bloqueado") na timeline.
122
+ - Forma alternativa: o atributo `blocked` no update de contato (`lionchat_contacts_update`) também
123
+ liga/desliga o bloqueio — mas SEM a pílula de atividade. Prefira `toggle_block` quando estiver
124
+ no contexto de uma conversa.
125
+
111
126
  ## Inbox (Caixa de Entrada / Canal)
112
127
 
113
128
  ### `channel_type`
@@ -136,6 +151,23 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
136
151
  - `working_hours_enabled`: se respeita horário de atendimento
137
152
  - `greeting_enabled` / `greeting_message`: mensagem de boas-vindas
138
153
 
154
+ ### Supervisor de caixa (InboxMember.auto_assignable = false)
155
+
156
+ **Termo:** "Supervisor de caixa" / "supervisor da caixa de entrada".
157
+
158
+ **O que é:** um membro da caixa marcado como supervisor. Ele VÊ TODAS as conversas e cards
159
+ daquela caixa (visão completa), mas fica FORA da distribuição automática (round-robin) — ou seja,
160
+ o sistema nunca atribui conversas novas a ele automaticamente. Serve pra gestor/líder que precisa
161
+ acompanhar tudo sem entrar na fila de atendimento.
162
+
163
+ **Onde fica armazenado:** flag `inbox_members.auto_assignable` (boolean). Membro comum =
164
+ `auto_assignable: true` (entra no rodízio); supervisor = `auto_assignable: false` (vê tudo, fora
165
+ do rodízio).
166
+
167
+ **Como definir/ler via tools:** `lionchat_inbox_members_create` e `lionchat_inbox_members_update`
168
+ aceitam `supervisor_ids[]` além de `user_ids[]` — os IDs em `supervisor_ids` viram supervisores;
169
+ os de `user_ids` viram membros comuns. A resposta traz `is_supervisor` (boolean) por agente.
170
+
139
171
  ## KanbanItem (Card do CRM)
140
172
 
141
173
  ### Estrutura
@@ -350,6 +382,13 @@ por FASES configuráveis (LiontrackJourneyStage: padrão de URL → fase, match
350
382
  Feature flag `liontrack` (404 sem ela). Relatório: `journey_funnel_reports` (v2), janela máx 30
351
383
  dias, URLs sem querystring (LGPD).
352
384
 
385
+ ## Meta CAPI — moeda do evento de conversão (2026-06)
386
+
387
+ Ao disparar uma conversão pro Meta (Conversions API), o valor agora carrega uma moeda. Parâmetro
388
+ `currency` (código ISO, ex: `BRL`, `USD`); default `BRL` quando omitido. A moeda pode ser escolhida
389
+ tanto no disparo individual da conversão quanto na configuração do funil (valor padrão herdado pelos
390
+ cards daquele funil).
391
+
353
392
  ## Idiomas da plataforma (2026-06)
354
393
 
355
394
  A plataforma opera com 6 idiomas: `en`, `es`, `fr`, `it`, `pt`, `pt_BR` (default das contas
@@ -272,6 +272,32 @@ Funis agora têm visibilidade por usuário. Um funil é visível pra alguém qua
272
272
  **Pro MCP:** antes de tentar mover/editar card, confira os campos `can_*` do show — se `can_move`
273
273
  é false, explique ao usuário que ele não tem acesso àquele funil em vez de tentar mesmo assim.
274
274
 
275
+ ## Controle de acesso por CAIXA (conversas + cards) e a "ponte" da conversa atribuída (2026-06)
276
+
277
+ Além da visibilidade por funil (acima), há um controle de acesso POR CAIXA que vale tanto pro
278
+ Kanban quanto pras CONVERSAS. Um agente NÃO-admin só vê as conversas e os cards das caixas das quais
279
+ ele é membro (membro comum OU supervisor — ver "Supervisor de caixa" no glossário). Admin vê tudo.
280
+
281
+ **A ponte (exceção pontual):** estar ATRIBUÍDO a um card dá acesso PONTUAL à conversa daquele card,
282
+ mesmo que o agente não seja membro da caixa. A ponte vale pra:
283
+ - a conversa PRINCIPAL do card (`conversation_display_id`), e
284
+ - as conversas em `linked_conversations`.
285
+
286
+ O que a ponte libera: ABRIR e RESPONDER aquela conversa específica. O que a ponte NÃO libera: a
287
+ caixa inteira (o agente continua sem ver as outras conversas/cards daquela caixa). A atribuição é a
288
+ qualquer agente no card (`assigned_agents`), não só ao responsável da conversa.
289
+
290
+ **Efeitos práticos nas tools (lado conversas):**
291
+ - `conversations_list` / `conversations_search` retornam SÓ conversas de caixas acessíveis (mais as
292
+ liberadas pela ponte de card atribuído).
293
+ - `conversations_show` / `conversations_messages_*` de conversa inacessível → **404**.
294
+ - Buscar card por ID ou rodar ação em massa (`kanban_bulk_bulk_actions`, export) numa caixa
295
+ inacessível → **404** (a ação não vaza cards de caixa que o agente não pode ver).
296
+
297
+ **Pro MCP:** se uma conversa/card "some" da listagem ou dá 404 pra um agente que jura que existe,
298
+ provavelmente é acesso por caixa — explique que ele só vê as caixas das quais participa, e que o
299
+ acesso a uma conversa solta vem de estar atribuído ao card dela.
300
+
275
301
  ## Funil arquivado vs ativo
276
302
 
277
303
  - `archived = true`: funil escondido da UI principal. Cards ainda existem mas não aparecem nas listas
@@ -300,6 +300,33 @@ fase, match literal de substring, sem regex).
300
300
  **Perguntas que esse relatório responde:** "por onde os leads entram?", "qual página perde mais
301
301
  gente?", "quem veio da campanha X navegou por onde antes de chamar?".
302
302
 
303
+ ## Origem dos Leads — relatório novo (2026-06)
304
+
305
+ `GET /api/v2/accounts/{id}/lead_origin_reports` (tool `lionchat_lead_origin_reports`) — agrega de
306
+ ONDE vieram os leads, cruzando os campos `origin_*` das conversas com os leads órfãos (que ainda não
307
+ viraram conversa). É um relatório de LEITURA puro — não cria nem altera nada.
308
+
309
+ **Filtros (query, todos opcionais):** `since` / `until` (ISO 8601; default = 30 dias atrás → agora),
310
+ `funnel_id`, `platform`, `kind`, `campaign`, `adset`, `group_by`.
311
+
312
+ **Retorno:**
313
+ - `period` — janela efetiva considerada.
314
+ - `totals` — `conversations`, `classified` (com origem identificada), `unclassified` (sem origem),
315
+ `orphan_leads` (leads sem conversa ainda), `unique_leads` (deduplicados por TELEFONE),
316
+ `won_leads` (leads em cards de estágio de Ganho) e `conversion_rate`.
317
+ - Arrays de quebra: `by_platform`, `by_kind`, `by_campaign`, `by_adset`, `by_creative`. Cada linha
318
+ tem `{value, conversations, won, conversion_rate}`.
319
+
320
+ **Conceitos importantes:**
321
+ - `won` = cards parados em etapas de GANHO do funil (fechados como sucesso).
322
+ - `unique_leads` deduplica por telefone (mesmo lead que falou várias vezes conta 1).
323
+ - "orphan lead" = lead capturado (ex: Meta Lead) que ainda não tem conversa associada.
324
+
325
+ **Gates:** permissão de relatórios (admin ou report_manage).
326
+
327
+ **Perguntas que esse relatório responde:** "qual plataforma trouxe mais leads?", "qual campanha/
328
+ conjunto converteu melhor?", "quantos leads únicos vieram esse mês e quantos fecharam?".
329
+
303
330
  ## Quando o usuário pede algo MUITO específico que não existe num endpoint
304
331
 
305
332
  Se a pergunta requer cálculos custom (ex: "conversas por agente que duraram mais de X minutos"):
package/dist/tools.js CHANGED
@@ -283,7 +283,7 @@ function registerListCategoriesTool(server, allEndpoints) {
283
283
  // Helps LLMs build correct flow_data without hitting trial-and-error on
284
284
  // node types, action keys, source handles, etc.
285
285
  function registerFlowsSchemaReferenceTool(server) {
286
- const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-06-11)
286
+ const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-06-16)
287
287
 
288
288
  flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
289
289
 
@@ -332,19 +332,32 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
332
332
  ▸ wait_response
333
333
  data: {
334
334
  label, waitTime, waitUnit: "minutes"|"seconds"|"hours",
335
- validation: "any"|"options"|"regex",
335
+ groupInputsSeconds: 0|10|15|20|25|30|40, // 0=off (padrao). Agrupa baloes picados do cliente antes de validar (debounce)
336
+ validation: "any"|"number"|"email"|"phone"|"options"|"varied_options"|"regex"|"cpf"|"cnpj"|"cpf_cnpj"|"date"|"rg"|"profession",
336
337
  acceptedOptions: ["1","2"], // se validation='options'
338
+ optionGroups: [{ id, terms:["sim","claro"], matchType:"contains"|"equals" }], // se validation='varied_options'
337
339
  regexPattern, // se validation='regex'
338
340
  invalidMessage, maxRetries,
339
- saveTo: "variable"|"contact_name"|"contact_email"|"contact_phone"|"contact_attr"|"conversation_attr"|"",
341
+ saveTo: "variable"|"contact_name"|"contact_email"|"contact_phone"|"contact_cpf"|"contact_cnpj"|"contact_document"|"contact_birthdate"|"contact_rg"|"contact_profession"|"contact_attr"|"conversation_attr"|"",
340
342
  saveVariable, saveAttrKey // saveAttrKey obrigatorio p/ contact_attr e conversation_attr
341
343
  }
344
+ CPF/CNPJ validam digito verificador (documento falso -> invalidMessage). Alvos cadastrais so com a validation
345
+ correspondente: cpf=>contact_cpf, cnpj=>contact_cnpj, cpf_cnpj=>contact_document (decide pelos digitos),
346
+ date=>contact_birthdate (dd/mm/aaaa->ISO), rg=>contact_rg, profession=>contact_profession. Campo cadastral
347
+ ja preenchido NAO e sobrescrito (imutavel). saveTo contact_attr/conversation_attr: se o atributo tiver tipo
348
+ (number/currency/percent/date/list ou text+regex), a resposta tambem e validada/formatada por esse tipo.
342
349
  saveTo "attribute"/"contact_attribute" NAO EXISTEM — nao salvam nada.
343
350
  TIMEOUT DISPARA DE VERDADE (corrigido 2026-06-09): waitTime estourou -> handle "timeout"
344
351
  (ou "option_{val}_timeout" no modo options). Sempre ligue um edge no timeout.
352
+ Respostas invalidas alem de maxRetries -> handle "retries_exhausted" (distinto do timeout de silencio;
353
+ se nao houver edge nele, cai no "timeout").
345
354
  Handles validation='options': "option_{val}" por opcao + "timeout"
355
+ Handles validation='varied_options': "option_{group_id}" por grupo (optionGroups) + "timeout"
346
356
  Handles outros: "success" + "timeout"
347
- IMPORTANTE: validation='options' ja roteia por opcao — NAO precisa condition depois.
357
+ options/varied_options normalizam a resposta (sem acento/maiuscula); varied_options usa matchType por
358
+ grupo ('contains' padrao ou 'equals'). saveTo contact_email/contact_phone exige validation 'email'/'phone'
359
+ (valor invalido NAO grava; telefone vira E.164) — pra texto livre use saveTo "variable".
360
+ IMPORTANTE: validation='options'/'varied_options' ja roteia por opcao/grupo — NAO precisa condition depois.
348
361
 
349
362
  ▸ condition
350
363
  data: { label, conditions: [
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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"}
package/endpoints.json CHANGED
@@ -1055,7 +1055,7 @@
1055
1055
  "location": "query",
1056
1056
  "required": false,
1057
1057
  "query_name": "labels[]",
1058
- "description": "Labels (tags) — array de títulos"
1058
+ "description": "Labels (tags) — array de titulos. Conta conversas marcadas com a etiqueta E conversas cujo CONTATO tem a etiqueta (uniao)."
1059
1059
  }
1060
1060
  ],
1061
1061
  "returns": "{ meta: { mine_count, assigned_count, unassigned_count, all_count } }",
@@ -1122,7 +1122,7 @@
1122
1122
  "location": "query",
1123
1123
  "required": false,
1124
1124
  "query_name": "labels[]",
1125
- "description": "Labels (tags) — array de títulos"
1125
+ "description": "Labels (tags) — array de titulos. Traz conversas marcadas com a etiqueta E conversas cujo CONTATO tem a etiqueta (uniao). Cada conversa retorna 'labels' (da conversa) e 'contact_labels' (do contato)."
1126
1126
  },
1127
1127
  {
1128
1128
  "name": "sort_by",
@@ -2004,7 +2004,7 @@
2004
2004
  "method": "GET",
2005
2005
  "path": "/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages/search",
2006
2006
  "title": "Buscar Mensagens",
2007
- "description": "Busca mensagens por texto dentro de uma conversa. Suporta private_only e file_type.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao).",
2007
+ "description": "Busca mensagens por texto dentro de uma conversa. Suporta private_only e file_type.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao). NOVO (2026-06-16): casa por TRECHO/substring (multi-termo AND — ex.: 'época d' acha 'época do'); e cada resultado de mensagem inclui previous_message e next_message (as mensagens anterior e seguinte da MESMA conversa, em ordem cronológica, ignorando eventos de sistema) como objeto {id, content, sender_name, message_type, private, created_at} ou null quando não há vizinha.",
2008
2008
  "category": "Mensagens",
2009
2009
  "params": [
2010
2010
  {
@@ -2063,6 +2063,13 @@
2063
2063
  "location": "query",
2064
2064
  "required": false,
2065
2065
  "description": "Filtros estruturados aplicados aos resultados de CARDS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
2066
+ },
2067
+ {
2068
+ "name": "favorited",
2069
+ "type": "boolean",
2070
+ "location": "query",
2071
+ "required": false,
2072
+ "description": "Apenas mensagens favoritadas (true). Favorito GLOBAL — vale para todos os atendentes."
2066
2073
  }
2067
2074
  ],
2068
2075
  "returns": "payload (array de mensagens, geralmente 25 resultados)",
@@ -2077,6 +2084,39 @@
2077
2084
  "lionchat_conversations_messages_update"
2078
2085
  ]
2079
2086
  },
2087
+ {
2088
+ "id": "lionchat_conversations_messages_toggle_favorite",
2089
+ "method": "POST",
2090
+ "path": "/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages/{id}/toggle_favorite",
2091
+ "title": "Favoritar/Desfavoritar Mensagem",
2092
+ "description": "Inverte o estado de favorita de uma mensagem (favorito GLOBAL — todos os atendentes veem a mesma estrela; atualiza em tempo real). Toggle puro: nao recebe corpo, so alterna. Use o filtro favorited=true na busca de mensagens para listar as favoritadas.",
2093
+ "category": "Mensagens",
2094
+ "params": [
2095
+ {
2096
+ "name": "conversation_id",
2097
+ "type": "integer",
2098
+ "location": "path",
2099
+ "required": true,
2100
+ "description": "Display ID da conversa"
2101
+ },
2102
+ {
2103
+ "name": "id",
2104
+ "type": "integer",
2105
+ "location": "path",
2106
+ "required": true,
2107
+ "description": "ID da mensagem"
2108
+ }
2109
+ ],
2110
+ "returns": "Mensagem serializada com o novo estado em 'favorited' (booleano)",
2111
+ "common_use_cases": [
2112
+ "Marcar uma mensagem importante para todos os atendentes",
2113
+ "Desfavoritar uma mensagem"
2114
+ ],
2115
+ "related_tools": [
2116
+ "lionchat_conversations_messages_search",
2117
+ "lionchat_conversations_messages_list"
2118
+ ]
2119
+ },
2080
2120
  {
2081
2121
  "id": "lionchat_conversations_messages_create_1",
2082
2122
  "method": "POST",
@@ -7504,7 +7544,7 @@
7504
7544
  "method": "GET",
7505
7545
  "path": "/api/v1/accounts/{account_id}/search",
7506
7546
  "title": "Busca Global",
7507
- "description": "Busca global por texto (conversas, contatos, mensagens, artigos) — sempre retorna todos os tipos. Para um tipo unico use /search/conversations|contacts|messages.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao).",
7547
+ "description": "Busca global por texto (conversas, contatos, mensagens, artigos) — sempre retorna todos os tipos. Para um tipo unico use /search/conversations|contacts|messages.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao). Sempre retorna todos os tipos: conversations, contacts, messages, articles e kanban_items. Mensagens trazem previous_message/next_message.",
7508
7548
  "category": "Busca",
7509
7549
  "params": [
7510
7550
  {
@@ -7571,7 +7611,7 @@
7571
7611
  "description": "Filtros estruturados aplicados aos resultados de CARDS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
7572
7612
  }
7573
7613
  ],
7574
- "returns": "payload (array de resultados de busca, geralmente 25 resultados)",
7614
+ "returns": "Resultado por tipo: conversations, contacts, messages, articles e kanban_items (cards do Kanban). Cada mensagem inclui previous_message/next_message (contexto vizinho).",
7575
7615
  "common_use_cases": [
7576
7616
  "Localizar resultado de busca pelo nome",
7577
7617
  "Buscar pelo email/telefone parcial",
@@ -7694,7 +7734,7 @@
7694
7734
  "method": "GET",
7695
7735
  "path": "/api/v1/accounts/{account_id}/search/messages",
7696
7736
  "title": "Buscar Mensagens",
7697
- "description": "Busca apenas em mensagens por texto.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao).",
7737
+ "description": "Busca apenas em mensagens por texto.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao). NOVO (2026-06-16): casa por TRECHO/substring (multi-termo AND — ex.: 'época d' acha 'época do'); e cada resultado de mensagem inclui previous_message e next_message (as mensagens anterior e seguinte da MESMA conversa, em ordem cronológica, ignorando eventos de sistema) como objeto {id, content, sender_name, message_type, private, created_at} ou null quando não há vizinha.",
7698
7738
  "category": "Busca",
7699
7739
  "params": [
7700
7740
  {
@@ -10755,11 +10795,60 @@
10755
10795
  "category": "Ofertas",
10756
10796
  "params": [
10757
10797
  {
10758
- "name": "offer",
10759
- "type": "object",
10798
+ "name": "title",
10799
+ "type": "string",
10760
10800
  "location": "body",
10761
10801
  "required": true,
10762
- "description": "Wrapper com { title, value, currency, type (product/service), description, prices: [{label, value, currency, description, checkout_url}], links: [{label, url}], image }. value auto-derivado do menor prices[].value quando prices presente."
10802
+ "description": "Titulo da oferta/produto"
10803
+ },
10804
+ {
10805
+ "name": "value",
10806
+ "type": "number",
10807
+ "location": "body",
10808
+ "required": false,
10809
+ "description": "Valor base"
10810
+ },
10811
+ {
10812
+ "name": "currency",
10813
+ "type": "string",
10814
+ "location": "body",
10815
+ "required": false,
10816
+ "description": "Moeda (ex: BRL)"
10817
+ },
10818
+ {
10819
+ "name": "image",
10820
+ "type": "string",
10821
+ "location": "body",
10822
+ "required": false,
10823
+ "description": "URL da imagem"
10824
+ },
10825
+ {
10826
+ "name": "type",
10827
+ "type": "string",
10828
+ "location": "body",
10829
+ "required": false,
10830
+ "description": "Tipo da oferta"
10831
+ },
10832
+ {
10833
+ "name": "description",
10834
+ "type": "string",
10835
+ "location": "body",
10836
+ "required": false,
10837
+ "description": "Descricao da oferta"
10838
+ },
10839
+ {
10840
+ "name": "prices",
10841
+ "type": "array",
10842
+ "location": "body",
10843
+ "required": false,
10844
+ "description": "Lista de precos/planos: [{label,value,currency,description,checkout_url}]"
10845
+ },
10846
+ {
10847
+ "name": "links",
10848
+ "type": "array",
10849
+ "location": "body",
10850
+ "required": false,
10851
+ "description": "Lista de links: [{label,url}]"
10763
10852
  }
10764
10853
  ],
10765
10854
  "returns": "oferta criado (com novo ID)",
@@ -10811,11 +10900,60 @@
10811
10900
  "description": "ID da oferta"
10812
10901
  },
10813
10902
  {
10814
- "name": "offer",
10815
- "type": "object",
10903
+ "name": "title",
10904
+ "type": "string",
10816
10905
  "location": "body",
10817
- "required": true,
10818
- "description": "Wrapper com { title, value, currency, type, description, prices, links, image, remove_image }. Todos os campos opcionais."
10906
+ "required": false,
10907
+ "description": "Titulo da oferta/produto"
10908
+ },
10909
+ {
10910
+ "name": "value",
10911
+ "type": "number",
10912
+ "location": "body",
10913
+ "required": false,
10914
+ "description": "Valor base"
10915
+ },
10916
+ {
10917
+ "name": "currency",
10918
+ "type": "string",
10919
+ "location": "body",
10920
+ "required": false,
10921
+ "description": "Moeda (ex: BRL)"
10922
+ },
10923
+ {
10924
+ "name": "image",
10925
+ "type": "string",
10926
+ "location": "body",
10927
+ "required": false,
10928
+ "description": "URL da imagem"
10929
+ },
10930
+ {
10931
+ "name": "type",
10932
+ "type": "string",
10933
+ "location": "body",
10934
+ "required": false,
10935
+ "description": "Tipo da oferta"
10936
+ },
10937
+ {
10938
+ "name": "description",
10939
+ "type": "string",
10940
+ "location": "body",
10941
+ "required": false,
10942
+ "description": "Descricao da oferta"
10943
+ },
10944
+ {
10945
+ "name": "prices",
10946
+ "type": "array",
10947
+ "location": "body",
10948
+ "required": false,
10949
+ "description": "Lista de precos/planos: [{label,value,currency,description,checkout_url}]"
10950
+ },
10951
+ {
10952
+ "name": "links",
10953
+ "type": "array",
10954
+ "location": "body",
10955
+ "required": false,
10956
+ "description": "Lista de links: [{label,url}]"
10819
10957
  }
10820
10958
  ],
10821
10959
  "returns": "oferta atualizado",
@@ -12325,7 +12463,7 @@
12325
12463
  "method": "POST",
12326
12464
  "path": "/api/v1/accounts/{account_id}/account_variables",
12327
12465
  "title": "Criar Variável",
12328
- "description": "Cria uma nova variável da conta. Se secret=true, valor é criptografado. Cria novo variável de conta. Obrigatórios: key. Valida unicidade quando aplicável. Retorna o variável de conta criado com ID atribuído.",
12466
+ "description": "Cria uma nova variável da conta. Para valor secreto/criptografado, use attribute_display_type=secret (o apelido legado encrypted_text também funciona). Cria novo variável de conta. Obrigatórios: key. Valida unicidade quando aplicável. Retorna o variável de conta criado com ID atribuído.",
12329
12467
  "category": "Variaveis da Conta",
12330
12468
  "params": [
12331
12469
  {
@@ -12354,7 +12492,7 @@
12354
12492
  "type": "string",
12355
12493
  "location": "body",
12356
12494
  "required": false,
12357
- "description": "Tipo do valor: text (padrao), encrypted_text (secret), number, checkbox, list, link, date"
12495
+ "description": "Tipo do valor: text (padrão), secret (valor secreto — guardado criptografado), number, checkbox, list, link, date. Apelido legado: encrypted_text é aceito e convertido para secret automaticamente. Tipo fora dessa lista retorna 422."
12358
12496
  },
12359
12497
  {
12360
12498
  "name": "value",
@@ -19211,7 +19349,7 @@
19211
19349
  "method": "POST",
19212
19350
  "path": "/api/v1/accounts/{account_id}/inbox_members",
19213
19351
  "title": "Definir Membros da Inbox",
19214
- "description": "Define os agentes membros da inbox (substitui a lista). Para adicionar incrementalmente, leia a lista atual e mescle.",
19352
+ "description": "Define os agentes membros da inbox (substitui a lista). Para adicionar incrementalmente, leia a lista atual e mescle. Use supervisor_ids[] para marcar supervisores (veem tudo, fora da distribuicao automatica); a resposta traz is_supervisor por agente.",
19215
19353
  "category": "Membros de Inbox",
19216
19354
  "params": [
19217
19355
  {
@@ -19227,6 +19365,13 @@
19227
19365
  "location": "body",
19228
19366
  "required": true,
19229
19367
  "description": "Array de IDs dos agentes"
19368
+ },
19369
+ {
19370
+ "name": "supervisor_ids",
19371
+ "type": "array",
19372
+ "location": "body",
19373
+ "required": false,
19374
+ "description": "IDs dos membros que entram como SUPERVISORES da caixa: veem TODAS as conversas/cards dela, mas ficam FORA da distribuicao automatica (round-robin). Quem nao estiver aqui (e estiver em user_ids) vira agente normal. A resposta traz is_supervisor por agente."
19230
19375
  }
19231
19376
  ],
19232
19377
  "returns": "lista de agentes atualizada",
@@ -19274,7 +19419,7 @@
19274
19419
  "method": "PATCH",
19275
19420
  "path": "/api/v1/accounts/{account_id}/inbox_members",
19276
19421
  "title": "Atualizar Membros da Inbox",
19277
- "description": "Atualiza os agentes membros da inbox (substitui a lista).",
19422
+ "description": "Atualiza os agentes membros da inbox (substitui a lista). Use supervisor_ids[] para marcar supervisores (veem tudo, fora da distribuicao automatica); a resposta traz is_supervisor por agente.",
19278
19423
  "category": "Membros de Inbox",
19279
19424
  "params": [
19280
19425
  {
@@ -19290,6 +19435,13 @@
19290
19435
  "location": "body",
19291
19436
  "required": true,
19292
19437
  "description": "Nova lista de IDs"
19438
+ },
19439
+ {
19440
+ "name": "supervisor_ids",
19441
+ "type": "array",
19442
+ "location": "body",
19443
+ "required": false,
19444
+ "description": "IDs dos membros que entram como SUPERVISORES da caixa: veem TODAS as conversas/cards dela, mas ficam FORA da distribuicao automatica (round-robin). Quem nao estiver aqui (e estiver em user_ids) vira agente normal. A resposta traz is_supervisor por agente."
19293
19445
  }
19294
19446
  ],
19295
19447
  "returns": "lista de agentes atualizada",
@@ -19694,11 +19846,60 @@
19694
19846
  "category": "Atributos Personalizados",
19695
19847
  "params": [
19696
19848
  {
19697
- "name": "custom_attribute_definition",
19698
- "type": "object",
19849
+ "name": "attribute_display_name",
19850
+ "type": "string",
19851
+ "location": "body",
19852
+ "required": true,
19853
+ "description": "Nome de exibicao do atributo (ex: 'Perfil')"
19854
+ },
19855
+ {
19856
+ "name": "attribute_display_type",
19857
+ "type": "string",
19858
+ "location": "body",
19859
+ "required": true,
19860
+ "description": "Tipo de exibicao: text, number, link, date, list, checkbox, currency, percent ou secret"
19861
+ },
19862
+ {
19863
+ "name": "attribute_key",
19864
+ "type": "string",
19699
19865
  "location": "body",
19700
19866
  "required": true,
19701
- "description": "Wrapper com { attribute_display_name, attribute_display_type (text/number/link/date/list/checkbox), attribute_model (contact_attribute/conversation_attribute, default conversation_attribute), attribute_key (slug snake_case), attribute_description, attribute_values (para tipo list), regex_pattern, regex_cue }"
19867
+ "description": "Slug unico em snake_case (ex: 'perfil')"
19868
+ },
19869
+ {
19870
+ "name": "attribute_model",
19871
+ "type": "string",
19872
+ "location": "body",
19873
+ "required": false,
19874
+ "description": "contact_attribute ou conversation_attribute (default conversation_attribute)"
19875
+ },
19876
+ {
19877
+ "name": "attribute_description",
19878
+ "type": "string",
19879
+ "location": "body",
19880
+ "required": false,
19881
+ "description": "Descricao do atributo"
19882
+ },
19883
+ {
19884
+ "name": "attribute_values",
19885
+ "type": "array",
19886
+ "location": "body",
19887
+ "required": false,
19888
+ "description": "Opcoes quando o tipo for list (ex: ['MCMV','SBPE','Investidor'])"
19889
+ },
19890
+ {
19891
+ "name": "regex_pattern",
19892
+ "type": "string",
19893
+ "location": "body",
19894
+ "required": false,
19895
+ "description": "Regex de validacao (opcional)"
19896
+ },
19897
+ {
19898
+ "name": "regex_cue",
19899
+ "type": "string",
19900
+ "location": "body",
19901
+ "required": false,
19902
+ "description": "Dica do formato esperado (opcional)"
19702
19903
  }
19703
19904
  ],
19704
19905
  "returns": "atributo personalizado criado (com novo ID)",
@@ -19758,11 +19959,60 @@
19758
19959
  "description": "ID da definicao"
19759
19960
  },
19760
19961
  {
19761
- "name": "custom_attribute_definition",
19762
- "type": "object",
19962
+ "name": "attribute_display_name",
19963
+ "type": "string",
19763
19964
  "location": "body",
19764
- "required": true,
19765
- "description": "Wrapper com os mesmos campos do create { attribute_display_name, attribute_display_type, attribute_model, attribute_key, attribute_description, attribute_values, regex_pattern, regex_cue }"
19965
+ "required": false,
19966
+ "description": "Nome de exibicao do atributo"
19967
+ },
19968
+ {
19969
+ "name": "attribute_display_type",
19970
+ "type": "string",
19971
+ "location": "body",
19972
+ "required": false,
19973
+ "description": "Tipo de exibicao: text, number, link, date, list, checkbox, currency, percent ou secret"
19974
+ },
19975
+ {
19976
+ "name": "attribute_key",
19977
+ "type": "string",
19978
+ "location": "body",
19979
+ "required": false,
19980
+ "description": "Slug unico em snake_case"
19981
+ },
19982
+ {
19983
+ "name": "attribute_model",
19984
+ "type": "string",
19985
+ "location": "body",
19986
+ "required": false,
19987
+ "description": "contact_attribute ou conversation_attribute"
19988
+ },
19989
+ {
19990
+ "name": "attribute_description",
19991
+ "type": "string",
19992
+ "location": "body",
19993
+ "required": false,
19994
+ "description": "Descricao do atributo"
19995
+ },
19996
+ {
19997
+ "name": "attribute_values",
19998
+ "type": "array",
19999
+ "location": "body",
20000
+ "required": false,
20001
+ "description": "Opcoes quando o tipo for list"
20002
+ },
20003
+ {
20004
+ "name": "regex_pattern",
20005
+ "type": "string",
20006
+ "location": "body",
20007
+ "required": false,
20008
+ "description": "Regex de validacao (opcional)"
20009
+ },
20010
+ {
20011
+ "name": "regex_cue",
20012
+ "type": "string",
20013
+ "location": "body",
20014
+ "required": false,
20015
+ "description": "Dica do formato esperado (opcional)"
19766
20016
  }
19767
20017
  ],
19768
20018
  "returns": "atributo personalizado atualizado",
@@ -23870,5 +24120,252 @@
23870
24120
  "related_tools": [
23871
24121
  "lionchat_inboxes_show"
23872
24122
  ]
24123
+ },
24124
+ {
24125
+ "id": "lionchat_lead_origin_reports",
24126
+ "method": "GET",
24127
+ "path": "/api/v2/accounts/{account_id}/lead_origin_reports",
24128
+ "title": "Relatório de Origem dos Leads",
24129
+ "description": "SÓ LEITURA. Agregado de origem dos leads/conversas: de qual plataforma, tipo, campanha, conjunto de anúncios e criativo vieram, com totais e taxa de conversão. Janela padrão: últimos 30 dias. Cruza os atributos origin_* das conversas + leads órfãos (contatos sem conversa); 'won' = cards em estágios de ganho do Kanban; leads únicos deduplicados por telefone. Permite drill-down por níveis (plataforma → tipo → campanha → conjunto → criativo).",
24130
+ "category": "Relatorios",
24131
+ "params": [
24132
+ {
24133
+ "name": "since",
24134
+ "type": "string",
24135
+ "location": "query",
24136
+ "required": false,
24137
+ "description": "Início ISO 8601 (padrão: 30 dias atrás)"
24138
+ },
24139
+ {
24140
+ "name": "until",
24141
+ "type": "string",
24142
+ "location": "query",
24143
+ "required": false,
24144
+ "description": "Fim ISO 8601 (padrão: agora)"
24145
+ },
24146
+ {
24147
+ "name": "funnel_id",
24148
+ "type": "integer",
24149
+ "location": "query",
24150
+ "required": false,
24151
+ "description": "Filtra por funil do Kanban"
24152
+ },
24153
+ {
24154
+ "name": "platform",
24155
+ "type": "string",
24156
+ "location": "query",
24157
+ "required": false,
24158
+ "description": "Filtra por plataforma de origem"
24159
+ },
24160
+ {
24161
+ "name": "kind",
24162
+ "type": "string",
24163
+ "location": "query",
24164
+ "required": false,
24165
+ "description": "Filtra por tipo de origem"
24166
+ },
24167
+ {
24168
+ "name": "campaign",
24169
+ "type": "string",
24170
+ "location": "query",
24171
+ "required": false,
24172
+ "description": "Filtra por campanha"
24173
+ },
24174
+ {
24175
+ "name": "adset",
24176
+ "type": "string",
24177
+ "location": "query",
24178
+ "required": false,
24179
+ "description": "Filtra por conjunto de anúncios"
24180
+ },
24181
+ {
24182
+ "name": "group_by",
24183
+ "type": "string",
24184
+ "location": "query",
24185
+ "required": false,
24186
+ "description": "Agrupamento do resultado: platform, kind, campaign, adset ou creative"
24187
+ }
24188
+ ],
24189
+ "returns": "{ period, totals: { conversations, classified, unclassified, orphan_leads, unique_leads, won_leads, conversion_rate }, by_platform, by_kind, by_campaign, by_adset, by_creative }",
24190
+ "common_use_cases": [
24191
+ "Ver de onde vêm os leads (campanha, anúncio, plataforma)",
24192
+ "Medir taxa de conversão por origem",
24193
+ "Comparar desempenho de campanhas/criativos"
24194
+ ],
24195
+ "related_tools": [
24196
+ "lionchat_journey_funnel_reports"
24197
+ ]
24198
+ },
24199
+ {
24200
+ "id": "lionchat_inboxes_whatsapp_history_start",
24201
+ "method": "POST",
24202
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/start",
24203
+ "title": "Importar Histórico WhatsApp Cloud (Iniciar)",
24204
+ "description": "AÇÃO DE ESCRITA. Inicia a importação do histórico de conversas antigas para uma caixa WhatsApp Cloud (API oficial), lendo um QR Code (coexistência — não desconecta o número oficial). Só admin + requer a feature qr_history_import. Acompanhe pelo status.",
24205
+ "category": "Caixas de Entrada",
24206
+ "params": [
24207
+ {
24208
+ "name": "inbox_id",
24209
+ "type": "integer",
24210
+ "location": "path",
24211
+ "required": true,
24212
+ "description": "ID da caixa WhatsApp Cloud"
24213
+ },
24214
+ {
24215
+ "name": "days",
24216
+ "type": "integer",
24217
+ "location": "body",
24218
+ "required": false,
24219
+ "description": "Quantidade de dias de histórico a importar (valor inválido cai para 30)"
24220
+ }
24221
+ ],
24222
+ "returns": "{ state, qr, days }",
24223
+ "common_use_cases": [
24224
+ "Trazer o histórico antigo ao migrar para WhatsApp oficial"
24225
+ ],
24226
+ "related_tools": [
24227
+ "lionchat_inboxes_whatsapp_history_status",
24228
+ "lionchat_inboxes_whatsapp_history_cancel"
24229
+ ]
24230
+ },
24231
+ {
24232
+ "id": "lionchat_inboxes_whatsapp_history_status",
24233
+ "method": "GET",
24234
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/status",
24235
+ "title": "Importar Histórico WhatsApp Cloud (Status)",
24236
+ "description": "SÓ LEITURA. Status da importação de histórico da caixa WhatsApp Cloud: estado, QR Code (quando precisa parear), progresso e estatísticas. Estados: idle → scan_qr → importing → migrating → cleaning → done/failed.",
24237
+ "category": "Caixas de Entrada",
24238
+ "params": [
24239
+ {
24240
+ "name": "inbox_id",
24241
+ "type": "integer",
24242
+ "location": "path",
24243
+ "required": true,
24244
+ "description": "ID da caixa WhatsApp Cloud"
24245
+ }
24246
+ ],
24247
+ "returns": "{ state, qr, days, progress, stats, error }",
24248
+ "common_use_cases": [
24249
+ "Acompanhar o andamento da importação",
24250
+ "Pegar o QR Code para parear"
24251
+ ],
24252
+ "related_tools": [
24253
+ "lionchat_inboxes_whatsapp_history_start",
24254
+ "lionchat_inboxes_whatsapp_history_cancel"
24255
+ ]
24256
+ },
24257
+ {
24258
+ "id": "lionchat_inboxes_whatsapp_history_cancel",
24259
+ "method": "POST",
24260
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/cancel",
24261
+ "title": "Importar Histórico WhatsApp Cloud (Cancelar)",
24262
+ "description": "AÇÃO DE ESCRITA. Cancela uma importação de histórico em andamento na caixa WhatsApp Cloud.",
24263
+ "category": "Caixas de Entrada",
24264
+ "params": [
24265
+ {
24266
+ "name": "inbox_id",
24267
+ "type": "integer",
24268
+ "location": "path",
24269
+ "required": true,
24270
+ "description": "ID da caixa WhatsApp Cloud"
24271
+ }
24272
+ ],
24273
+ "returns": "{ state }",
24274
+ "common_use_cases": [
24275
+ "Interromper uma importação demorada ou iniciada por engano"
24276
+ ],
24277
+ "related_tools": [
24278
+ "lionchat_inboxes_whatsapp_history_start",
24279
+ "lionchat_inboxes_whatsapp_history_status"
24280
+ ]
24281
+ },
24282
+ {
24283
+ "id": "lionchat_conversations_toggle_block",
24284
+ "method": "POST",
24285
+ "path": "/api/v1/accounts/{account_id}/conversations/{id}/toggle_block",
24286
+ "title": "Bloquear / Desbloquear Contato",
24287
+ "description": "AÇÃO DE ESCRITA. Bloqueia ou desbloqueia o CONTATO da conversa. Quando bloqueado, as mensagens RECEBIDAS desse contato passam a ser descartadas na entrada (não criam conversa/mensagem) e fica registrada uma pílula de atividade. NÃO resolve a conversa. Recebe o display_id da conversa. (Alternativa: setar o atributo blocked via lionchat_contacts_update.)",
24288
+ "category": "Conversas",
24289
+ "params": [
24290
+ {
24291
+ "name": "id",
24292
+ "type": "integer",
24293
+ "location": "path",
24294
+ "required": true,
24295
+ "description": "Display ID (ID de exibição) da conversa"
24296
+ },
24297
+ {
24298
+ "name": "blocked",
24299
+ "type": "boolean",
24300
+ "location": "body",
24301
+ "required": true,
24302
+ "description": "true = bloquear o contato; false = desbloquear"
24303
+ }
24304
+ ],
24305
+ "returns": "A conversa atualizada (contato com blocked = true/false)",
24306
+ "common_use_cases": [
24307
+ "Bloquear um contato abusivo/spam",
24308
+ "Desbloquear um contato bloqueado por engano"
24309
+ ],
24310
+ "related_tools": [
24311
+ "lionchat_contacts_update"
24312
+ ]
24313
+ },
24314
+ {
24315
+ "id": "lionchat_wavoip_should_ring",
24316
+ "method": "GET",
24317
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/wavoip/should_ring",
24318
+ "title": "Deve Tocar? (Wavoip)",
24319
+ "description": "SÓ LEITURA. Diz se a ligação WhatsApp (Wavoip) deve tocar para ESTE agente, segundo a regra de toque (responsável pela conversa + presença/disponibilidade do agente). Usado pela tela de atendimento para decidir o toque/ringback.",
24320
+ "category": "Ligacao WP (Wavoip)",
24321
+ "params": [
24322
+ {
24323
+ "name": "inbox_id",
24324
+ "type": "integer",
24325
+ "location": "path",
24326
+ "required": true,
24327
+ "description": "ID da caixa de entrada (WhatsApp QR Code)"
24328
+ }
24329
+ ],
24330
+ "returns": "{ ring: boolean }",
24331
+ "common_use_cases": [
24332
+ "Decidir se toca o telefone do agente numa ligação recebida"
24333
+ ],
24334
+ "related_tools": [
24335
+ "lionchat_wavoip_status",
24336
+ "lionchat_wavoip_flag_rejected"
24337
+ ]
24338
+ },
24339
+ {
24340
+ "id": "lionchat_wavoip_flag_rejected",
24341
+ "method": "POST",
24342
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/wavoip/flag_rejected",
24343
+ "title": "Sinalizar Recusa (Wavoip)",
24344
+ "description": "AÇÃO DE ESCRITA. Marca que o agente RECUSOU a ligação WhatsApp (Wavoip) de um número, para o webhook registrar o desfecho como recusada (flag de curta duração). Use ao recusar uma ligação recebida.",
24345
+ "category": "Ligacao WP (Wavoip)",
24346
+ "params": [
24347
+ {
24348
+ "name": "inbox_id",
24349
+ "type": "integer",
24350
+ "location": "path",
24351
+ "required": true,
24352
+ "description": "ID da caixa de entrada (WhatsApp QR Code)"
24353
+ },
24354
+ {
24355
+ "name": "phone",
24356
+ "type": "string",
24357
+ "location": "body",
24358
+ "required": true,
24359
+ "description": "Telefone do número da ligação recusada"
24360
+ }
24361
+ ],
24362
+ "returns": "200 OK",
24363
+ "common_use_cases": [
24364
+ "Registrar que a ligação foi recusada pelo agente"
24365
+ ],
24366
+ "related_tools": [
24367
+ "lionchat_wavoip_should_ring",
24368
+ "lionchat_wavoip_calls"
24369
+ ]
23873
24370
  }
23874
24371
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionchat/mcp-server",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "MCP server for LionChat API — 547 tools + 10 resources + 9 prompts. Audit-log aware, completion API, progress notifications.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",