@lionchat/mcp-server 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,8 +332,9 @@ 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
+ validation: "any"|"number"|"email"|"phone"|"options"|"varied_options"|"regex",
336
336
  acceptedOptions: ["1","2"], // se validation='options'
337
+ optionGroups: [{ id, terms:["sim","claro"], matchType:"contains"|"equals" }], // se validation='varied_options'
337
338
  regexPattern, // se validation='regex'
338
339
  invalidMessage, maxRetries,
339
340
  saveTo: "variable"|"contact_name"|"contact_email"|"contact_phone"|"contact_attr"|"conversation_attr"|"",
@@ -342,9 +343,15 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
342
343
  saveTo "attribute"/"contact_attribute" NAO EXISTEM — nao salvam nada.
343
344
  TIMEOUT DISPARA DE VERDADE (corrigido 2026-06-09): waitTime estourou -> handle "timeout"
344
345
  (ou "option_{val}_timeout" no modo options). Sempre ligue um edge no timeout.
346
+ Respostas invalidas alem de maxRetries -> handle "retries_exhausted" (distinto do timeout de silencio;
347
+ se nao houver edge nele, cai no "timeout").
345
348
  Handles validation='options': "option_{val}" por opcao + "timeout"
349
+ Handles validation='varied_options': "option_{group_id}" por grupo (optionGroups) + "timeout"
346
350
  Handles outros: "success" + "timeout"
347
- IMPORTANTE: validation='options' ja roteia por opcao — NAO precisa condition depois.
351
+ options/varied_options normalizam a resposta (sem acento/maiuscula); varied_options usa matchType por
352
+ grupo ('contains' padrao ou 'equals'). saveTo contact_email/contact_phone exige validation 'email'/'phone'
353
+ (valor invalido NAO grava; telefone vira E.164) — pra texto livre use saveTo "variable".
354
+ IMPORTANTE: validation='options'/'varied_options' ja roteia por opcao/grupo — NAO precisa condition depois.
348
355
 
349
356
  ▸ condition
350
357
  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":"AAAA,+DAA+D;AAC/D,mFAAmF;AAEnF,OAAO,EAAE,CAAC,EAAc,MAAM,KAAK,CAAC;AAIpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAkCpC,yEAAyE;AACzE,SAAS,kBAAkB,CAAC,MAAc;IACxC,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,KAAK;YACR,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC9E,KAAK,MAAM;YACT,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAChF,KAAK,OAAO,CAAC;QACb,KAAK,KAAK;YACR,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC/E,KAAK,QAAQ;YACX,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC9E;YACE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IAClF,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,iBAAiB,GAA2B;IAChD,OAAO,EAAE,SAAS;IAClB,mBAAmB,EAAE,kBAAkB;IACvC,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,eAAe;IAC5B,mBAAmB,EAAE,SAAS;IAC9B,WAAW,EAAE,UAAU;IACvB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;IAClB,wBAAwB,EAAE,gBAAgB;IAC1C,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,QAAQ;IACjB,cAAc,EAAE,eAAe;IAC/B,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,QAAQ;IAClB,kBAAkB,EAAE,OAAO;IAC3B,oBAAoB,EAAE,mBAAmB;IACzC,qBAAqB,EAAE,oBAAoB;IAC3C,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,cAAc;IACvB,oBAAoB,EAAE,aAAa;IACnC,kBAAkB,EAAE,eAAe;IACnC,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,cAAc;IACvB,oBAAoB,EAAE,iBAAiB;IACvC,qBAAqB,EAAE,sBAAsB;IAC7C,qBAAqB,EAAE,iBAAiB;IACxC,eAAe,EAAE,aAAa;IAC9B,SAAS,EAAE,eAAe;IAC1B,iBAAiB,EAAE,qBAAqB;IACxC,SAAS,EAAE,gBAAgB;IAC3B,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,OAAO;IAChB,aAAa,EAAE,oBAAoB;IACnC,sBAAsB,EAAE,mBAAmB;IAC3C,qBAAqB,EAAE,kBAAkB;IACzC,sBAAsB,EAAE,cAAc;IACtC,yBAAyB,EAAE,mBAAmB;IAC9C,KAAK,EAAE,KAAK;IACZ,mBAAmB,EAAE,gBAAgB;IACrC,gBAAgB,EAAE,gBAAgB;IAClC,iBAAiB,EAAE,aAAa;IAChC,oBAAoB,EAAE,oBAAoB;IAC1C,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,iBAAiB;IACtC,iBAAiB,EAAE,iBAAiB;IACpC,yBAAyB,EAAE,qBAAqB;IAChD,UAAU,EAAE,UAAU;IACtB,wBAAwB,EAAE,oBAAoB;IAC9C,eAAe,EAAE,WAAW;IAC5B,eAAe,EAAE,eAAe;IAChC,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,SAAS;IACpB,uBAAuB,EAAE,uBAAuB;IAChD,YAAY,EAAE,SAAS;IACvB,gBAAgB,EAAE,iBAAiB;IACnC,kBAAkB,EAAE,eAAe;IACnC,iBAAiB,EAAE,oBAAoB;IACvC,MAAM,EAAE,MAAM;IACd,0BAA0B,EAAE,mBAAmB;IAC/C,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,UAAU,GAAG,IAAI;SACpB,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,IAAI,EAAE,CAAC;IACV,OAAO,iBAAiB,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,kEAAkE;AAClE,SAAS,cAAc,CAAC,KAAoB;IAC1C,IAAI,MAAkB,CAAC;IAEvB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,MAAM;YACT,MAAM,GAAG,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CACP,wDAAwD,CACzD,CAAC;YACJ,MAAM;QACR,KAAK,QAAQ,CAAC;QACd;YACE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM;IACV,CAAC;IAED,gFAAgF;IAChF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4DAA4D;AAC5D,wFAAwF;AACxF,kFAAkF;AAClF,SAAS,cAAc,CACrB,MAAuB;IAEvB,MAAM,KAAK,GAA+B,EAAE,CAAC;IAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,kBAAkB,GAAG,IAAI,CAAC;YAC1B,oFAAoF;YACpF,yEAAyE;YACzE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,2HAA2H,CAC5H,CAAC;YACJ,SAAS;QACX,CAAC;QACD,uFAAuF;QACvF,uFAAuF;QACvF,yFAAyF;QACzF,sFAAsF;QACtF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,8FAA8F;IAC9F,6EAA6E;IAC7E,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;aACpB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,2HAA2H,CAC5H,CAAC;IACN,CAAC;IAED,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,iFAAiF;AACjF,SAAS,YAAY,CAAC,MAAuB;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,4DAA4D;AAC5D,SAAS,kBAAkB,CACzB,MAAiB,EACjB,MAAc,EACd,MAAsB,EACtB,QAAqB;IAErB,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9C,yFAAyF;IACzF,IAAI,WAAW,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/E,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW;YACT,+EAA+E;gBAC/E,WAAW,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,EAAE,EACX,WAAW,EACX,MAAM,CAAC,KAAK,EACZ,WAAW,EACX,KAAK,EAAE,MAA+B,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,kEAAkE;YAClE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACpE,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;oBAC5B,gFAAgF;oBAChF,wEAAwE;oBACxE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBACxF,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,2FAA2F;iCAClG;6BACF;4BACD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,+FAA+F;YAC/F,oFAAoF;YACpF,wDAAwD;YACxD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;YAC1C,MAAM,kBAAkB,GACtB,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC;gBACpF,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;gBACtB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACvB,MAAM,oBAAoB,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;YACpE,OAAO,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAE1C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,cAAc,CAC5D,oBAAoB,EACpB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,YAAY,CACtB,CAAC;YAEF,MAAM,IAAI,GAAG,cAAc,CACzB,QAAQ,CAAC,IAAI,EACb,kBAAkB,EAClB,UAAU,CACX,CAAC;YACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAExD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gFAAgF;YAChF,uEAAuE;YACvE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,gBAAgB,CACvB,MAAiB,EACjB,MAAc,EACd,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,yFAAyF,EACzF,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,0BAA0B,CACjC,MAAiB,EACjB,YAA2B;IAE3B,6EAA6E;IAC7E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAClC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,QAAQ,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,sIAAsI,EACtI,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SACzD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,wEAAwE;AACxE,gDAAgD;AAChD,SAAS,gCAAgC,CAAC,MAAiB;IACzD,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyMlB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,2PAA2P,EAC3P,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SACtD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,MAAc,EACd,MAAsB;IAEtB,yFAAyF;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACjE,IAAI,SAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sCAAsC,aAAa,IAAI;YACvD,oDAAoD;YACpD,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,SAAS,CAAC;IAEzB,iFAAiF;IACjF,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,6DAA6D;IAC7D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,wEAAwE;IACxE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,0BAA0B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,gCAAgC,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,uDAAuD;AACrF,CAAC"}
package/endpoints.json CHANGED
@@ -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
  {
@@ -7694,7 +7694,7 @@
7694
7694
  "method": "GET",
7695
7695
  "path": "/api/v1/accounts/{account_id}/search/messages",
7696
7696
  "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).",
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). 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
7698
  "category": "Busca",
7699
7699
  "params": [
7700
7700
  {
@@ -12325,7 +12325,7 @@
12325
12325
  "method": "POST",
12326
12326
  "path": "/api/v1/accounts/{account_id}/account_variables",
12327
12327
  "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.",
12328
+ "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
12329
  "category": "Variaveis da Conta",
12330
12330
  "params": [
12331
12331
  {
@@ -12354,7 +12354,7 @@
12354
12354
  "type": "string",
12355
12355
  "location": "body",
12356
12356
  "required": false,
12357
- "description": "Tipo do valor: text (padrao), encrypted_text (secret), number, checkbox, list, link, date"
12357
+ "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
12358
  },
12359
12359
  {
12360
12360
  "name": "value",
@@ -19211,7 +19211,7 @@
19211
19211
  "method": "POST",
19212
19212
  "path": "/api/v1/accounts/{account_id}/inbox_members",
19213
19213
  "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.",
19214
+ "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
19215
  "category": "Membros de Inbox",
19216
19216
  "params": [
19217
19217
  {
@@ -19227,6 +19227,13 @@
19227
19227
  "location": "body",
19228
19228
  "required": true,
19229
19229
  "description": "Array de IDs dos agentes"
19230
+ },
19231
+ {
19232
+ "name": "supervisor_ids",
19233
+ "type": "array",
19234
+ "location": "body",
19235
+ "required": false,
19236
+ "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
19237
  }
19231
19238
  ],
19232
19239
  "returns": "lista de agentes atualizada",
@@ -19274,7 +19281,7 @@
19274
19281
  "method": "PATCH",
19275
19282
  "path": "/api/v1/accounts/{account_id}/inbox_members",
19276
19283
  "title": "Atualizar Membros da Inbox",
19277
- "description": "Atualiza os agentes membros da inbox (substitui a lista).",
19284
+ "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
19285
  "category": "Membros de Inbox",
19279
19286
  "params": [
19280
19287
  {
@@ -19290,6 +19297,13 @@
19290
19297
  "location": "body",
19291
19298
  "required": true,
19292
19299
  "description": "Nova lista de IDs"
19300
+ },
19301
+ {
19302
+ "name": "supervisor_ids",
19303
+ "type": "array",
19304
+ "location": "body",
19305
+ "required": false,
19306
+ "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
19307
  }
19294
19308
  ],
19295
19309
  "returns": "lista de agentes atualizada",
@@ -23870,5 +23884,252 @@
23870
23884
  "related_tools": [
23871
23885
  "lionchat_inboxes_show"
23872
23886
  ]
23887
+ },
23888
+ {
23889
+ "id": "lionchat_lead_origin_reports",
23890
+ "method": "GET",
23891
+ "path": "/api/v2/accounts/{account_id}/lead_origin_reports",
23892
+ "title": "Relatório de Origem dos Leads",
23893
+ "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).",
23894
+ "category": "Relatorios",
23895
+ "params": [
23896
+ {
23897
+ "name": "since",
23898
+ "type": "string",
23899
+ "location": "query",
23900
+ "required": false,
23901
+ "description": "Início ISO 8601 (padrão: 30 dias atrás)"
23902
+ },
23903
+ {
23904
+ "name": "until",
23905
+ "type": "string",
23906
+ "location": "query",
23907
+ "required": false,
23908
+ "description": "Fim ISO 8601 (padrão: agora)"
23909
+ },
23910
+ {
23911
+ "name": "funnel_id",
23912
+ "type": "integer",
23913
+ "location": "query",
23914
+ "required": false,
23915
+ "description": "Filtra por funil do Kanban"
23916
+ },
23917
+ {
23918
+ "name": "platform",
23919
+ "type": "string",
23920
+ "location": "query",
23921
+ "required": false,
23922
+ "description": "Filtra por plataforma de origem"
23923
+ },
23924
+ {
23925
+ "name": "kind",
23926
+ "type": "string",
23927
+ "location": "query",
23928
+ "required": false,
23929
+ "description": "Filtra por tipo de origem"
23930
+ },
23931
+ {
23932
+ "name": "campaign",
23933
+ "type": "string",
23934
+ "location": "query",
23935
+ "required": false,
23936
+ "description": "Filtra por campanha"
23937
+ },
23938
+ {
23939
+ "name": "adset",
23940
+ "type": "string",
23941
+ "location": "query",
23942
+ "required": false,
23943
+ "description": "Filtra por conjunto de anúncios"
23944
+ },
23945
+ {
23946
+ "name": "group_by",
23947
+ "type": "string",
23948
+ "location": "query",
23949
+ "required": false,
23950
+ "description": "Agrupamento do resultado: platform, kind, campaign, adset ou creative"
23951
+ }
23952
+ ],
23953
+ "returns": "{ period, totals: { conversations, classified, unclassified, orphan_leads, unique_leads, won_leads, conversion_rate }, by_platform, by_kind, by_campaign, by_adset, by_creative }",
23954
+ "common_use_cases": [
23955
+ "Ver de onde vêm os leads (campanha, anúncio, plataforma)",
23956
+ "Medir taxa de conversão por origem",
23957
+ "Comparar desempenho de campanhas/criativos"
23958
+ ],
23959
+ "related_tools": [
23960
+ "lionchat_journey_funnel_reports"
23961
+ ]
23962
+ },
23963
+ {
23964
+ "id": "lionchat_inboxes_whatsapp_history_start",
23965
+ "method": "POST",
23966
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/start",
23967
+ "title": "Importar Histórico WhatsApp Cloud (Iniciar)",
23968
+ "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.",
23969
+ "category": "Caixas de Entrada",
23970
+ "params": [
23971
+ {
23972
+ "name": "inbox_id",
23973
+ "type": "integer",
23974
+ "location": "path",
23975
+ "required": true,
23976
+ "description": "ID da caixa WhatsApp Cloud"
23977
+ },
23978
+ {
23979
+ "name": "days",
23980
+ "type": "integer",
23981
+ "location": "body",
23982
+ "required": false,
23983
+ "description": "Quantidade de dias de histórico a importar (valor inválido cai para 30)"
23984
+ }
23985
+ ],
23986
+ "returns": "{ state, qr, days }",
23987
+ "common_use_cases": [
23988
+ "Trazer o histórico antigo ao migrar para WhatsApp oficial"
23989
+ ],
23990
+ "related_tools": [
23991
+ "lionchat_inboxes_whatsapp_history_status",
23992
+ "lionchat_inboxes_whatsapp_history_cancel"
23993
+ ]
23994
+ },
23995
+ {
23996
+ "id": "lionchat_inboxes_whatsapp_history_status",
23997
+ "method": "GET",
23998
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/status",
23999
+ "title": "Importar Histórico WhatsApp Cloud (Status)",
24000
+ "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.",
24001
+ "category": "Caixas de Entrada",
24002
+ "params": [
24003
+ {
24004
+ "name": "inbox_id",
24005
+ "type": "integer",
24006
+ "location": "path",
24007
+ "required": true,
24008
+ "description": "ID da caixa WhatsApp Cloud"
24009
+ }
24010
+ ],
24011
+ "returns": "{ state, qr, days, progress, stats, error }",
24012
+ "common_use_cases": [
24013
+ "Acompanhar o andamento da importação",
24014
+ "Pegar o QR Code para parear"
24015
+ ],
24016
+ "related_tools": [
24017
+ "lionchat_inboxes_whatsapp_history_start",
24018
+ "lionchat_inboxes_whatsapp_history_cancel"
24019
+ ]
24020
+ },
24021
+ {
24022
+ "id": "lionchat_inboxes_whatsapp_history_cancel",
24023
+ "method": "POST",
24024
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/cancel",
24025
+ "title": "Importar Histórico WhatsApp Cloud (Cancelar)",
24026
+ "description": "AÇÃO DE ESCRITA. Cancela uma importação de histórico em andamento na caixa WhatsApp Cloud.",
24027
+ "category": "Caixas de Entrada",
24028
+ "params": [
24029
+ {
24030
+ "name": "inbox_id",
24031
+ "type": "integer",
24032
+ "location": "path",
24033
+ "required": true,
24034
+ "description": "ID da caixa WhatsApp Cloud"
24035
+ }
24036
+ ],
24037
+ "returns": "{ state }",
24038
+ "common_use_cases": [
24039
+ "Interromper uma importação demorada ou iniciada por engano"
24040
+ ],
24041
+ "related_tools": [
24042
+ "lionchat_inboxes_whatsapp_history_start",
24043
+ "lionchat_inboxes_whatsapp_history_status"
24044
+ ]
24045
+ },
24046
+ {
24047
+ "id": "lionchat_conversations_toggle_block",
24048
+ "method": "POST",
24049
+ "path": "/api/v1/accounts/{account_id}/conversations/{id}/toggle_block",
24050
+ "title": "Bloquear / Desbloquear Contato",
24051
+ "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.)",
24052
+ "category": "Conversas",
24053
+ "params": [
24054
+ {
24055
+ "name": "id",
24056
+ "type": "integer",
24057
+ "location": "path",
24058
+ "required": true,
24059
+ "description": "Display ID (ID de exibição) da conversa"
24060
+ },
24061
+ {
24062
+ "name": "blocked",
24063
+ "type": "boolean",
24064
+ "location": "body",
24065
+ "required": true,
24066
+ "description": "true = bloquear o contato; false = desbloquear"
24067
+ }
24068
+ ],
24069
+ "returns": "A conversa atualizada (contato com blocked = true/false)",
24070
+ "common_use_cases": [
24071
+ "Bloquear um contato abusivo/spam",
24072
+ "Desbloquear um contato bloqueado por engano"
24073
+ ],
24074
+ "related_tools": [
24075
+ "lionchat_contacts_update"
24076
+ ]
24077
+ },
24078
+ {
24079
+ "id": "lionchat_wavoip_should_ring",
24080
+ "method": "GET",
24081
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/wavoip/should_ring",
24082
+ "title": "Deve Tocar? (Wavoip)",
24083
+ "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.",
24084
+ "category": "Ligacao WP (Wavoip)",
24085
+ "params": [
24086
+ {
24087
+ "name": "inbox_id",
24088
+ "type": "integer",
24089
+ "location": "path",
24090
+ "required": true,
24091
+ "description": "ID da caixa de entrada (WhatsApp QR Code)"
24092
+ }
24093
+ ],
24094
+ "returns": "{ ring: boolean }",
24095
+ "common_use_cases": [
24096
+ "Decidir se toca o telefone do agente numa ligação recebida"
24097
+ ],
24098
+ "related_tools": [
24099
+ "lionchat_wavoip_status",
24100
+ "lionchat_wavoip_flag_rejected"
24101
+ ]
24102
+ },
24103
+ {
24104
+ "id": "lionchat_wavoip_flag_rejected",
24105
+ "method": "POST",
24106
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/wavoip/flag_rejected",
24107
+ "title": "Sinalizar Recusa (Wavoip)",
24108
+ "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.",
24109
+ "category": "Ligacao WP (Wavoip)",
24110
+ "params": [
24111
+ {
24112
+ "name": "inbox_id",
24113
+ "type": "integer",
24114
+ "location": "path",
24115
+ "required": true,
24116
+ "description": "ID da caixa de entrada (WhatsApp QR Code)"
24117
+ },
24118
+ {
24119
+ "name": "phone",
24120
+ "type": "string",
24121
+ "location": "body",
24122
+ "required": true,
24123
+ "description": "Telefone do número da ligação recusada"
24124
+ }
24125
+ ],
24126
+ "returns": "200 OK",
24127
+ "common_use_cases": [
24128
+ "Registrar que a ligação foi recusada pelo agente"
24129
+ ],
24130
+ "related_tools": [
24131
+ "lionchat_wavoip_should_ring",
24132
+ "lionchat_wavoip_calls"
24133
+ ]
23873
24134
  }
23874
24135
  ]
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.2",
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",