@lionchat/mcp-server 1.10.3 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -198,7 +198,7 @@ Ou para listas grandes (cursors):
198
198
  - `includes` / `excludes` (relacionamentos)
199
199
  - `before` / `after` (datas)
200
200
 
201
- ### Atributos personalizados — operadores por TIPO (2026-07-21)
201
+ ### Atributos personalizados — operadores por TIPO (2026-08-07)
202
202
 
203
203
  Vale pra automações, filtro avançado de conversas/contatos e busca "+ Filtro" (motor compartilhado):
204
204
 
@@ -207,10 +207,17 @@ Vale pra automações, filtro avançado de conversas/contatos e busca "+ Filtro"
207
207
  | texto / link | equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present |
208
208
  | lista | equal_to, not_equal_to, is_present, is_not_present |
209
209
  | número / data | equal_to, not_equal_to, is_present, is_not_present, is_greater_than, is_less_than |
210
+ | moeda / porcentagem / hora / data+hora | equal_to, not_equal_to, is_present, is_not_present, is_greater_than, is_less_than |
210
211
  | sim/não (checkbox) | equal_to, not_equal_to, is_present, is_not_present |
211
212
 
212
213
  - Em atributo de LISTA, `equal_to` com vários `values[]` casa QUALQUER um deles (multi-seleção).
213
214
  - NUNCA use `contains` em número/data/checkbox — o backend rejeita (cast inválido).
215
+ - Moeda e porcentagem são castados como número, hora como hora e data+hora como data —
216
+ por isso desde 30/07 (filtros) e 07/08 (automações) esses quatro tipos também aceitam
217
+ `is_greater_than` / `is_less_than`. Base técnica: `FilterService::ATTRIBUTE_TYPES` casta
218
+ currency/percent como `numeric`, time como `time` e datetime como `date`; `coerce_lt_gt_value`
219
+ aceita numeric/date/time. Tipo NOVO de atributo sem entrada em `ATTRIBUTE_TYPES` quebra o
220
+ filtro com erro de sintaxe SQL (não "não acha nada") — a entrada é obrigatória no mesmo commit.
214
221
 
215
222
  > **Contatos — busca parcial por nome/ID externo:** no `POST /contacts/filter`, os campos `name` e
216
223
  > `identifier` aceitam `contains` / `does_not_contain` (match parcial, case-insensitive). Use isso
@@ -332,6 +332,7 @@ Como a coleta de dados/cenários funciona hoje (importante pra diagnosticar "IA
332
332
  - Quando UM cenário fixa a tool, a execução vira determinística (a IA não escolhe): mídia e kanban são aplicados pós-turno pelo BindingResolver (ordem texto→ação, sem duplicar, idempotente); o agendamento força/restringe a agenda mas a IA ainda define data/hora.
333
333
  - Via MCP: scenarios_create/update persiste binding de send_media_asset e create_kanban_item/move_kanban_item (re-escopados por conta). O binding de create_booking NÃO é aceito pela API — pra limitar agendas via MCP, use config.booking_event_type_ids no assistente (captain_assistants_update).
334
334
  - Receita pra criar/editar cenário com binding via MCP (scenarios_create / scenarios_update): (1) o corpo vai SEMPRE embrulhado em `scenario`; (2) a instrução PRECISA mencionar a ferramenta como link markdown `[Rótulo](tool://slug)` — menção crua `(tool://slug)` NÃO conta e o binding é descartado no salvamento; (3) envie `tool_bindings` com o shape: `send_media_asset` → `{ "asset_ids": [Int] }`, `create_kanban_item`/`move_kanban_item` → `{ "funnel_id": Int, "stage": "<chave da etapa>" }`. Não precisa mandar `tools` (é auto-extraído da instrução e sobrescrito). `create_booking` NÃO entra em tool_bindings pela API.
335
+ - Pra APONTAR uma página da base de conhecimento num cenário via MCP, escreva `[@Nome](document://ID)` (o ID numérico do documento) DENTRO do texto da `instruction` — igual ao link de tool, o motor deriva daí o campo `document_ids`. NÃO existe param `document_ids` na API/MCP (mandar seria descartado em silêncio). Teto de 3 documentos; a página apontada ganha PRIORIDADE na busca RAG, NÃO exclusividade (o resto da base continua pesquisável).
335
336
 
336
337
  ## Variáveis {{ }} nas instruções do AI Agente (2026-06)
337
338
 
@@ -573,6 +574,29 @@ Fontes/campos disponíveis (`source` / `field`):
573
574
  Lembrete: todo template recém-criado pelo MCP só mostra o texto na tela depois de **sincronizar**
574
575
  (o MCP cria na Meta, mas o "puxar de volta" o conteúdo é o que a tela faz com o botão Sincronizar).
575
576
 
577
+ ### Apontar variáveis SEM reenviar pra Meta (2026-08-07)
578
+
579
+ Antes, mudar o `variable_mapping` de um template JÁ APROVADO exigia o endpoint de update
580
+ (`POST .../whatsapp_templates/{id}`) — que reenvia o modelo pra Meta e o status volta pra
581
+ **Pendente** à toa. Agora existe um endpoint SÓ pro apontamento local:
582
+
583
+ ```
584
+ PATCH /api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_templates/{template_id}/variable_mapping
585
+ Body: { "variable_mapping": { "1": { "source": "contact", "field": "name", "label": "Nome do contato" } } }
586
+ ```
587
+
588
+ - **ZERO chamada à Meta**: o template continua Aprovado, sem nova revisão. Use SEMPRE este quando a
589
+ mudança for só o apontamento; o update de verdade fica pra quando o TEXTO/estrutura mudar.
590
+ - `{template_id}` é o **id numérico da Meta** (o campo `id` do template na listagem), não o nome.
591
+ - O conjunto enviado **substitui** todos os apontamentos de corpo: mande TODAS as variáveis que
592
+ devem ficar apontadas, não só a que mudou (a ausente é removida). Vazio `{}` limpa tudo.
593
+ - Chaves `_` (`_button_url`, `_header_media`, `_header_location`) são preservadas sozinhas e
594
+ **recusadas** como entrada — pra mexer nelas, use o update normal.
595
+ - Recusas (422): categoria AUTHENTICATION, chave que não existe no corpo aprovado, valor sem
596
+ `{source, field}`, `source` fora de contact/conversation/account/custom, caixa que não seja
597
+ WhatsApp Cloud oficial.
598
+ - Papel: administrador.
599
+
576
600
  ### Botão de link do template com variável — link rastreável por cliente (2026-07-25)
577
601
 
578
602
  O botão de URL do template pode terminar com uma variável, pra montar um link diferente por contato
@@ -286,12 +286,16 @@ Captain::Scenario (cenários do assistente — instruções inline, sem handoff)
286
286
  │ ⚠️ trigger_type NAO é editável via API hoje — todo cenário criado por API fica em
287
287
  │ llm_interpreted (a IA decide aplicar lendo a conversa). Os modos programáticos só
288
288
  │ via banco/console por enquanto.
289
- └── tool_bindings (jsonb — parâmetro FIXADO pelo admin por tool; "IA decide" = ausente/vazio)
290
- send_media_asset → { asset_ids: [Int] } | create_kanban_item / move_kanban_item →
291
- { funnel_id: Int, stage: "<key>" } | create_booking → { event_type_ids: [Int] }
292
- Obs: via API/MCP, scenarios_update SÓ persiste send_media_asset/create_kanban_item/
293
- move_kanban_item. O binding create_booking é só de UI/runtime — NÃO round-trippa pela API.
294
- Use config.booking_event_type_ids no assistente pra restringir agendas via MCP.
289
+ ├── tool_bindings (jsonb — parâmetro FIXADO pelo admin por tool; "IA decide" = ausente/vazio)
290
+ │ send_media_asset → { asset_ids: [Int] } | create_kanban_item / move_kanban_item →
291
+ │ { funnel_id: Int, stage: "<key>" } | create_booking → { event_type_ids: [Int] }
292
+ │ Obs: via API/MCP, scenarios_update SÓ persiste send_media_asset/create_kanban_item/
293
+ │ move_kanban_item. O binding create_booking é só de UI/runtime — NÃO round-trippa pela API.
294
+ │ Use config.booking_event_type_ids no assistente pra restringir agendas via MCP.
295
+ └── document_ids (jsonb, default [] — DERIVADO das menções [@Nome](document://ID) escritas na
296
+ instruction; NUNCA aceito como param na API/MCP (é ignorado se enviado); re-escopado por
297
+ assistente+conta; teto de 3 documentos. Serve pra IA PRIORIZAR a busca RAG naquelas páginas —
298
+ NÃO é exclusividade: o resto da base continua pesquisável)
295
299
 
296
300
  Captain::AssistantResponse (FAQ)
297
301
  ├── assistant_id (FK)
@@ -108,6 +108,12 @@ stage_id/inbox_id/sort_by/sort_direction/page foram REMOVIDOS, eram ignorados pe
108
108
  - `funnel_id` (obrigatório), `stages[]` (chaves internas das etapas), `priorities[]`,
109
109
  `statuses[]` (open/won/lost), `agent_id`, `value_min`/`value_max`
110
110
  - `date_start`/`date_end` (criação do card, YYYY-MM-DD)
111
+ - `stage_date_start`/`stage_date_end` (2026-08-07) — **quando o card ENTROU na etapa em que ele está
112
+ agora** (`stage_entered_at`, caindo em `created_at` para card que nunca se moveu). NÃO confundir com
113
+ `date_start`/`date_end`: um card criado em janeiro e arrastado ontem casa AQUI e não casa lá. É o que
114
+ responde "o que se mexeu essa semana". Pontas independentes, e os dois períodos podem ser combinados.
115
+ Nuance ao explicar pro usuário: card criado ontem que nunca se moveu TAMBÉM entra (ele entrou na
116
+ etapa ao nascer) — o que o filtro separa de verdade é o card VELHO que se moveu.
111
117
  - `scheduled_date_start`/`scheduled_date_end` (agendamento: scheduled_at/deadline_at do card E
112
118
  tarefas da agenda vinculadas)
113
119
  - `task_filter`: has_task | no_task | today | tomorrow | this_week | overdue
@@ -125,9 +131,47 @@ NÃO há filtro por time aqui (por time: use o relatório agregado abaixo, ou fi
125
131
 
126
132
  `GET /kanban_items/reports` — a resposta é um OBJETO de métricas (não lista): valores GANHOS,
127
133
  contagem/valor por etapa, forecast ponderado, top negócios, cards parados, metas do funil.
128
- Params: `funnel_id` (obrigatório), `from`, `to`, `user_ids[]` (agentes), `team_id`.
134
+ Params: `funnel_id` (obrigatório), `from`, `to`, `user_ids[]` (agentes), `team_id`, `date_basis`.
129
135
  É a ferramenta certa pra "relatório de vendas/ganhos do mês por agente ou time".
130
136
 
137
+ **`date_basis` (2026-08-07) — qual data o período considera.** A resposta devolve a régua aplicada em
138
+ `dateBasis`; valor inválido cai no padrão sem erro.
139
+
140
+ | Valor | O que o período recorta | Quando usar |
141
+ |---|---|---|
142
+ | `any` (PADRÃO) | criado no período **OU** fechado no período | É a régua histórica e a mais larga. **Omitir mantém exatamente os números de sempre.** É a certa pra RECEITA: com qualquer outra, venda fechada no período de um lead antigo some (medido 07/08: 17% dos ganhos da frota) |
143
+ | `created` | só quando o card nasceu | "quantos leads entraram" |
144
+ | `moved` | só quando entrou na etapa atual (mesma expressão do `stage_date_*` da seção 3) | "o que se mexeu no período" |
145
+ | `closed` | só ganhos/perdidos no período | **a pergunta de receita** — é a régua certa pra "quanto vendemos em julho" |
146
+
147
+ O relatório de UMA etapa — tool `lionchat_funnels_stage_report` (`GET /funnels/:id/stage_report`, o
148
+ painel que abre dentro do quadro) — tem as MESMAS 4 opções de régua, mesmo parâmetro `date_basis` e as
149
+ MESMAS expressões da seção 3, mas o **padrão dele é `moved`**, não `any`. Não é inconsistência: ele
150
+ responde uma pergunta só ("quantos cards entraram nesta etapa no período"), enquanto o
151
+ `/kanban_items/reports` é uma rede larga que alimenta várias métricas de uma vez. Se o usuário disser
152
+ que as duas telas não batem, a resposta é: escolha a MESMA régua nas duas.
153
+
154
+ Ela devolve números calculados no SERVIDOR (total de cards da etapa, faixa de valores, ganhos/perdidos,
155
+ distribuição por prioridade, ranking de vendedores da etapa) — antes a tela só somava os cards já
156
+ carregados na coluna.
157
+
158
+ **Parâmetros de `lionchat_funnels_stage_report`:**
159
+
160
+ | Param | Obrigatório | O que faz |
161
+ |---|---|---|
162
+ | `id` (path) | sim | id do funil |
163
+ | `stage` | sim | chave interna da etapa |
164
+ | `date_basis` | não | `any` / `created` / `moved` / `closed` — **PADRÃO `moved`** (entrada na etapa). ATENÇÃO: no relatório agregado do funil o padrão é `any`; aqui é `moved` de propósito |
165
+ | `report_from` / `report_to` | não | janela (YYYY-MM-DD) da régua de data do relatório |
166
+ | `priorities[]` | não | array de prioridades |
167
+ | `agent_id` | não | responsável; `-1` = sem responsável |
168
+ | `value_min` / `value_max` | não | faixa de valor do card (número) |
169
+ | `date_start` / `date_end` | não | filtro por data de CRIAÇÃO do card |
170
+ | `scheduled_date_start` / `scheduled_date_end` | não | filtro por agendamento |
171
+
172
+ Ao apresentar número pro usuário, DIGA qual régua usou. Duas réguas diferentes respondem a mesma
173
+ pergunta com números diferentes, e o usuário conclui que o relatório está errado.
174
+
131
175
  ## 5. Busca com filtro estruturado
132
176
 
133
177
  `search_search` (tudo), `conversations_search`, `contacts_search`, `kanban_items_search` aceitam
@@ -24,7 +24,7 @@ Como criar fluxos do LionChat (FlowBuilder) que abrem certinhos no canvas, sem n
24
24
  | Analisar sentimento | `ai` mode `sentiment` | - |
25
25
  | Encerrar fluxo no meio | `action` com `key: 'deactivate_flow'` OU `exit_conditions` no nível do flow | - |
26
26
  | Distribuir aleatório entre branches | `randomizer` | - |
27
- | Atualizar info de grupo WhatsApp (WAHA) | `update_group` | - |
27
+ | Gerir grupo WhatsApp: criar/buscar, nome/foto/descrição, participantes, admins, convite (WAHA) | `update_group` (uma operação por bloco via `groupOperation`) | - |
28
28
  | Iniciar outro fluxo | `action` com `key: 'start_flow'` OU node `activate_flow` | - |
29
29
  | Encerrar ramo / definir retorno de ai_tool | `end` | - |
30
30
  | Anotação visual no canvas (não executa) | `note` | - |
@@ -337,6 +337,7 @@ só pra destravar, ela pode sair.
337
337
  | `is_number` / `is_letter` / `is_email` / `is_phone` | validação de formato |
338
338
  | `regex` | padrão regex em `value` |
339
339
  | `equal_any` / `not_equal_any` / `contains_any` / `not_contains_any` | multi-valor (usa `values` array). `contains_any` = contém ALGUMA; `not_contains_any` = não contém NENHUMA (útil pra "seguir só quando a msg não tem nenhuma das palavras-chave de outros flows") |
340
+ | `starts_with_any` / `ends_with_any` (novo 2026-08-07) | multi-valor (usa `values` array), caixa-insensível. `starts_with_any` = o texto COMEÇA com ALGUMA das palavras da lista; `ends_with_any` = o texto TERMINA com alguma |
340
341
  | `business_hours` / `outside_business_hours` | horário comercial (par: dentro/fora). `business_hours` aceita `start_hour`/`end_hour` (0-23), `days` (array 0=Dom..6=Sab, ausente=todos) e **`timezone`** (IANA, ex.: `America/Sao_Paulo` — default se ausente). **REGRA:** a saída `outside_business_hours` HERDA `start_hour`/`end_hour`/`days`/`timezone` da `business_hours` ANTERIOR no array — pode deixá-los ausentes na "fora" (o backend preenche). O horário é avaliado no `timezone` (não em UTC) |
341
342
  | `can_reply` / `can_reply_closed` | janela 24h aberta/fechada |
342
343
  | `conversation_has_agent` / `conversation_no_agent` / `conversation_not_agent` | agente atribuído (HUMANO) |
@@ -433,6 +434,7 @@ o botão "Usar variável" ao lado do campo alterna lista fixa ↔ variável.
433
434
  | `add_conversation_label` | `{ labels: ['slug'] }` | Adiciona labels à CONVERSA (não ao contato) |
434
435
  | `remove_conversation_label` | `{ labels: ['slug'] }` | Remove labels da CONVERSA |
435
436
  | `mute_conversation` | `{}` | Silencia notificações |
437
+ | `mark_unread` | `{}` | Marca a conversa como NÃO LIDA pro time (espelho do `mute_conversation`; típico logo após `assign_agent`/`assign_team` numa transferência) |
436
438
  | `add_private_note` | `{ content: 'texto' }` | Adiciona nota interna |
437
439
  | `create_kanban_item` | `{ funnel_id, funnel_stage, title?, description? }` | Cria card no Kanban — `funnel_id` e `funnel_stage` OBRIGATÓRIOS; `title`/`description` aceitam variáveis `{{ }}` |
438
440
  | `move_kanban_item_to_stage` | `{ funnel_stage }` | Move card (precisa ter card vinculado) |
@@ -696,9 +698,29 @@ tela do cliente (a tela lê só `percent`).
696
698
 
697
699
  **Handles que SAEM:** o `id` de cada branch (`A`, `B`, ...). Em `mode: 'distribute_agents'` é `success`.
698
700
 
699
- ### 2.11 `update_group` (WAHA apenas)
701
+ ### 2.11 `update_group` — Gestão de Grupos (WAHA apenas)
700
702
 
701
- Atualiza nome/descrição/foto de grupo WhatsApp. Use só quando flow roda em inbox WAHA e a conversa for de grupo.
703
+ Bloco "Gestão de Grupos". Faz **UMA operação por bloco** (não mais um formulário-só com nome/foto/descrição
704
+ juntos) — a operação vai em `data.groupOperation`. São **17 operações**, agrupadas por tema:
705
+
706
+ - **Grupo:** `create` (criar), `find_by_id` (buscar por id), `find_by_name` (buscar por nome), `update_subject`
707
+ (mudar nome), `update_description` (mudar descrição), `update_picture` (mudar foto), `settings` (3
708
+ permissões: quem edita infos, quem manda mensagem, quem adiciona membro), `leave` (sair do grupo).
709
+ - **Participantes:** `list_participants` (listar), `add_participants` (adicionar), `remove_participants` (remover).
710
+ - **Admins:** `promote_admin` (promover a admin), `demote_admin` (rebaixar).
711
+ - **Convite:** `get_invite` (pegar link/código de convite), `revoke_invite` (revogar), `send_invite` (mandar
712
+ o convite por mensagem a um telefone).
713
+
714
+ **Disponível em fluxo de QUALQUER canal**, desde que a conta tenha uma caixa **WhatsApp QR Code
715
+ (`Channel::Waha`)** — informe a caixa em `data.groupInboxId`. Esse campo é **OBRIGATÓRIO em fluxo não-grupo**
716
+ (individual/qualquer canal) e **opcional em fluxo de grupo** (ali o padrão é o grupo da própria conversa).
717
+
718
+ Cada operação guarda o resultado na variável `data.groupResponseVar` (padrão `"grupo"`) — leia depois com
719
+ `{{grupo.CAMPO}}` (ex.: `{{grupo.id}}`, `{{grupo.participants_count}}`, `{{grupo.invite_link}}`).
720
+
721
+ Teto de **20 participantes por execução** (trava anti-banimento — adicionar em lote é o que mais rápido
722
+ derruba número no WhatsApp não-oficial). Detalhe das chaves de `data` por operação: ver o pattern
723
+ "Gestão de Grupos WhatsApp por fluxo" no `flowbuilder-patterns`.
702
724
 
703
725
  **Handles que SAEM:** `success`, `error`.
704
726
 
@@ -803,14 +825,15 @@ Na tela o usuário vê isso como TRÊS opções ao criar: "Mensagem" (= `convers
803
825
 
804
826
  | | individual (Mensagem) | group (Grupo) |
805
827
  |---|---|---|
806
- | Node `update_group` (Configurar Grupo: nome, foto, permissões — WAHA) | NÃO existe | **SÓ aqui** |
828
+ | Node `update_group` (Gestão de Grupos — WAHA) | disponível se a conta tem caixa QR Code — exige `groupInboxId` | disponível; `groupInboxId` opcional (padrão = grupo da conversa) |
807
829
  | Gatilhos e condições de **LionTrack** (visita de página / evento do site) | disponíveis | **NÃO** (grupo não tem um contato único navegando) |
808
830
  | Gatilho `date_trigger` (data do contato) | disponível | **NÃO** (grupo não tem um contato único) |
809
831
  | Todos os outros nodes (`send_message`, `wait_response`, `condition`, `action`, `api`, `ai`, `set_variable`, `wait`, `randomizer`, `note`, `end`) | iguais | iguais |
810
832
 
811
833
  Regras práticas ao montar via API:
812
- - Só use o node `update_group` se o flow foi criado com `conversation_mode: "group"`. Colocá-lo num flow
813
- individual é rejeitado pela validação.
834
+ - O node `update_group` (Gestão de Grupos) funciona em fluxo de QUALQUER canal, desde que a conta tenha
835
+ caixa WhatsApp QR Code (`Channel::Waha`): informe a caixa em `data.groupInboxId` (OBRIGATÓRIO em fluxo
836
+ não-grupo; opcional em fluxo de grupo, onde o padrão é o grupo da própria conversa).
814
837
  - Não use gatilho/condição de LionTrack (pagetrack) em flow de grupo.
815
838
  - Na dúvida entre os dois, é `individual` (o default).
816
839
  Não tente contornar criando flows intermediários.
@@ -866,6 +889,14 @@ Presentes conforme o evento (ausente = resolve vazio, sem erro):
866
889
  | `{{trigger.contact.*}}` | `id`, `name`, `phone` |
867
890
  | `{{trigger.ad.*}}` (anúncio/CTWA) | `id`, `name`, `creative_id`, `creative_name`, `adset_id`, `adset_name`, `campaign_id`, `campaign_name`, `source`, `headline`, `description`, `cta`, `url` |
868
891
  | `{{trigger.attribute.*}}` | `name`, `previous_value`, `current_value`, `changed_at` — o valor ANTES e DEPOIS do atributo que disparou (só nos gatilhos de mudança de atributo) |
892
+ | `{{trigger.user_name}}` | nome do usuário/atendente que disparou (gatilho manual ou ativação manual) |
893
+ | `{{trigger.campaign_title}}` | título da campanha (quando disparado por Campanha de Fluxo) |
894
+ | `{{trigger.event_name}}` | nome do evento do site que disparou (LionTrack / visita de página) |
895
+ | `{{trigger.page_url}}` | URL da página (LionTrack / visita de página) |
896
+ | `{{trigger.source_flow_name}}` | nome do flow de origem (quando outro flow iniciou este, ex.: action `start_flow`) |
897
+
898
+ Os cinco últimos são **novos 2026-08-07** e passam a aparecer no autocomplete de TODO bloco (ausente para
899
+ o gatilho que não os fornece = resolve vazio, sem erro).
869
900
 
870
901
  Dois atalhos: `{{trigger}}` devolve o contexto INTEIRO em JSON e `{{trigger.data}}` devolve o mesmo
871
902
  sem os metadados — úteis pra jogar tudo dentro de um node `ai` ou `api`. Bloco (Hash/Array) inteiro
@@ -551,6 +551,78 @@
551
551
 
552
552
  ---
553
553
 
554
+ ## 17. Gestão de Grupos WhatsApp por fluxo (`update_group`)
555
+
556
+ **Caso:** ao marcar um lead como GANHO no Kanban, criar automaticamente um grupo de onboarding com ele e
557
+ confirmar pela conversa. Usa o node `update_group` (bloco "Gestão de Grupos") na operação `create`. Só
558
+ funciona em conta com caixa **WhatsApp QR Code (`Channel::Waha`)** — a caixa vai em `groupInboxId`
559
+ (OBRIGATÓRIO neste fluxo, que não é de grupo).
560
+
561
+ ```json
562
+ {
563
+ "nodes": [
564
+ { "id": "n1", "type": "start", "position": { "x": 50, "y": 300 }, "data": { "label": "Início", "triggers": [{ "type": "card_won", "funnel_ids": ["1"] }] } },
565
+ { "id": "n2", "type": "update_group", "position": { "x": 370, "y": 300 }, "data": {
566
+ "label": "Cria grupo de onboarding",
567
+ "groupOperation": "create",
568
+ "groupInboxId": 5,
569
+ "groupName": "Onboarding — {{contact.name}}",
570
+ "groupParticipants": ["5511999999999@c.us"],
571
+ "groupResponseVar": "grupo"
572
+ } },
573
+ { "id": "n3", "type": "send_message", "position": { "x": 690, "y": 300 }, "data": { "label": "Confirma", "messageItems": [
574
+ { "id": "m1", "type": "text", "content": "Prontinho, {{contact.name}}! Criei seu grupo de onboarding (id {{grupo.id}}) com {{grupo.participants_count}} participante(s). Já te chamo por lá." }
575
+ ] } }
576
+ ],
577
+ "edges": [
578
+ { "id": "e1", "source": "n1", "target": "n2", "sourceHandle": "success", "type": "deletable", "animated": true },
579
+ { "id": "e2", "source": "n2", "target": "n3", "sourceHandle": "success", "type": "deletable", "animated": true }
580
+ ]
581
+ }
582
+ ```
583
+
584
+ **Chaves de `data` por operação (`groupOperation`):**
585
+
586
+ Comuns a (quase) todas:
587
+ - `groupOperation` — a operação (uma por bloco).
588
+ - `groupTargetId` — o grupo alvo. Vazio = grupo da conversa (só faz sentido em fluxo de grupo); aceita
589
+ `"1203...@g.us"`, só dígitos ou uma variável `{{var}}`. **Ignorado** em `create` e `find_by_name` (não têm alvo).
590
+ - `groupInboxId` — id da caixa QR Code que fala com o WhatsApp. **OBRIGATÓRIO em fluxo não-grupo**; opcional em
591
+ fluxo de grupo (padrão = grupo da conversa).
592
+ - `groupResponseVar` — nome da variável de saída (padrão `"grupo"`); leia com `{{grupo.CAMPO}}`.
593
+
594
+ | Operação | Chaves específicas | Retorno (`{{grupo.*}}`) |
595
+ |---|---|---|
596
+ | `create` | `groupName` (obrig), `groupDescription`, `groupPicture` (url), `groupInitialAdmins`, `groupParticipants` | `id`, `name`, `participants_count` |
597
+ | `add_participants` | `groupParticipants` (obrig — ex.: `["5511999999999@c.us"]` ou lista) | `added`, `not_added`, `added_count` |
598
+ | `send_invite` | `groupInviteTo` (obrig — telefone de destino), `groupInviteMessage` (opc) | `invite_link` |
599
+ | `settings` | pelo menos uma de `infoAdminOnly` / `messagesAdminOnly` / `membersCanAddNewMember` (booleans) | — |
600
+
601
+ **ATENÇÃO na `settings` — semântica INVERTIDA de `membersCanAddNewMember`:** `true` = **TODOS** podem adicionar
602
+ membros. Já `infoAdminOnly: true` e `messagesAdminOnly: true` = **SÓ admin** edita infos / manda mensagem.
603
+ Confundir os dois LIBERA o grupo achando que está trancando.
604
+
605
+ **Gatilho novo `group_participant_joined` (entrou no grupo → manda boas-vindas):** em um flow de grupo
606
+ (`conversation_mode: "group"`), o start pode ter o item `{ "key": "group_participant_joined", "config": {
607
+ "group_match": "any", "group_name": "", "group_ids": [] } }`. Filtro OPCIONAL de quais grupos disparam:
608
+ `group_match` (`any` padrão, ou os mesmos operadores do "Buscar por nome": `contains`, `equal_to`, `starts_with`,
609
+ `ends_with`, `does_not_contain`, `not_equal_to`) + `group_name`, e/ou `group_ids` (mira exata por id — casa por
610
+ dígitos, aceita `1203...@g.us` ou só o número). Quando alguém entra, o `send_message` seguinte cai **no próprio
611
+ grupo** (o grupo é a conversa do flow).
612
+
613
+ **Lembretes:**
614
+ - **Teto de 20 participantes por execução** (`add_participants`/`create`) — trava ANTI-BANIMENTO, não performance.
615
+ Adicionar em lote é o que mais rápido derruba número no WhatsApp não-oficial.
616
+ - O fluxo só dispara/roda em caixa `Channel::Waha` (QR Code). WhatsApp oficial/Instagram/Facebook/e-mail não
617
+ têm grupo.
618
+ - No fluxo de card ganho acima, o `send_message` vai para a conversa do CONTATO (o lead), não para o grupo
619
+ criado. Para postar DENTRO do grupo, use um flow de grupo (`conversation_mode: "group"`) — normalmente com o
620
+ gatilho `group_participant_joined`.
621
+ - Em `add_participants`, quem tem privacidade de grupo ligada pode não entrar mesmo com resposta de sucesso do
622
+ WhatsApp: confira `{{grupo.not_added}}` / `{{grupo.not_added_count}}`.
623
+
624
+ ---
625
+
554
626
  ## Como usar este catálogo
555
627
 
556
628
  1. **Identifique o pattern mais próximo** do que o cliente pediu
@@ -254,7 +254,10 @@ comportamento intencional.
254
254
  - `config.instructions`: prompt sistema (Liquid template, até 20.000 chars)
255
255
  - `config.activation_label`: etiqueta que ativa o agente na conversa (única por conta)
256
256
  - **Cenário (Captain::Scenario)**: instrução situacional inline do assistente; o raciocínio de
257
- aplicação fica no "caderninho do cenário" da conversa (scenario_checklist, card Raciocínio)
257
+ aplicação fica no "caderninho do cenário" da conversa (scenario_checklist, card Raciocínio).
258
+ Pode apontar páginas da base de conhecimento escrevendo `[@Nome](document://ID)` na instrução
259
+ (campo derivado `document_ids`, teto de 3) para a IA PRIORIZAR a busca RAG naquelas páginas —
260
+ prioridade, não exclusividade
258
261
  - **Regra DITO ≠ SALVO**: a IA só considera coletado o dado que foi PERSISTIDO — salva cada dado
259
262
  na hora e não repergunta o que já salvou
260
263
  - **Cenário com parâmetro fixo (tool_bindings)**: o admin pode fixar o parâmetro de uma ferramenta do cenário — quais mídias enviar, qual funil+etapa criar/mover o card, quais agendas usar no agendamento. Com 1 cenário fixando a tool, a execução é DETERMINÍSTICA (a IA não escolhe): mídia/kanban rodam pós-turno (BindingResolver); o agendamento força/restringe a agenda mas a IA ainda escolhe a data/hora.
@@ -90,10 +90,12 @@ um número errado com confiança.
90
90
  | Cumprimento de prazo (SLA) | "100%" para conta com ZERO prazo aplicado — escondia "o SLA não está rodando" | Vazio = sem dados |
91
91
  | Por CANAL — conversa de caixa EXCLUÍDA (29/07) | Sumia do relatório: excluir a caixa deixa a conversa sem caixa, e o join descartava essas linhas em silêncio. 512 conversas órfãs de 10 contas em 30 dias; a **conta 60 perdia 76%** do total, a 40 perdia 38%, a 38 perdia 24% | Entram sob a chave **`Channel::None`** ("Caixa excluída"). Some essa chave também — se ignorar, você subconta de novo |
92
92
  | Horário de PICO do mapa de calor (29/07) | Dias e horas saíam em **UTC** mesmo mandando `timezone_offset`: no Brasil, o pico aparecia **3 horas adiantado** (o movimento das 11:00 de Brasília era rotulado como 14:00). O cabeçalho do CSV escrevia "(GMT-03:00) Brasília", o que dava aparência de certo | Balde de dia/hora sai do fuso pedido |
93
+ | "Nº de Conversas" por ETIQUETA (07/08) | Contava conversas **CRIADAS** no período que têm a etiqueta — etiquetar hoje uma conversa antiga não mexia no relatório de hoje (caso real: dono etiquetou 2 e o número ficou em 1) | Conta conversas que **RECEBERAM a etiqueta** no período (`taggings.created_at`), no resumo E no detalhe (cartão + gráfico). Renomear etiqueta preserva as datas. Consequência: mês fechado passa a MUDAR se etiquetas forem adicionadas/removidas retroativamente |
93
94
 
94
95
  **Como reconhecer instalação antiga:** soma dos canais menor que o total do resumo; tempo médio por
95
96
  etiqueta absurdamente baixo perto do tempo por atendente; "pendentes" zerado no ao vivo tendo
96
- conversa pendente na lista; "100%" de prazo com nenhum prazo aplicado.
97
+ conversa pendente na lista; "100%" de prazo com nenhum prazo aplicado; etiqueta aplicada hoje em
98
+ conversa antiga que NÃO aparece no relatório de hoje (régua antiga por criação da conversa).
97
99
 
98
100
  ## Mapeamento dos endpoints `lionchat_reports_*`
99
101
 
package/dist/tools.js CHANGED
@@ -307,15 +307,17 @@ function registerListCategoriesTool(server, allEndpoints) {
307
307
  // Helps LLMs build correct flow_data without hitting trial-and-error on
308
308
  // node types, action keys, source handles, etc.
309
309
  function registerFlowsSchemaReferenceTool(server) {
310
- const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-07-30)
310
+ const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-08-07)
311
311
 
312
312
  flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
313
313
 
314
314
  ═══ DOIS TIPOS DE FLOW (e o modo do conversation) ═══
315
315
  - conversation (default): dispara por evento de inbox. Criar via lionchat_flows_create.
316
316
  conversation_mode: 'individual' (1-a-1, default) ou 'group' (grupo WhatsApp). IMUTAVEL apos criar.
317
- So 'group' aceita o node update_group (Configurar Grupo: nome/foto/permissoes). 'group' NAO tem
318
- gatilhos/condicoes de LionTrack (pagetrack). Na UI aparecem como 3 opcoes: Mensagem / Grupo / IA Agente.
317
+ O node update_group (Gestao de Grupos, 17 operacoes) roda em fluxo de QUALQUER modo/canal desde que a
318
+ conta tenha caixa WhatsApp QR Code (Channel::Waha) — em fluxo nao-grupo informe data.groupInboxId
319
+ (ver o node update_group). 'group' NAO tem gatilhos/condicoes de LionTrack (pagetrack). Na UI aparecem
320
+ como 3 opcoes: Mensagem / Grupo / IA Agente.
319
321
  - ai_tool: ferramenta que o AI Agente invoca. Criar via lionchat_flow_tools_create (NAO flows_create!),
320
322
  com tool_name (snake_case, max 50) + tool_description (max 500). SEM inbox_ids. No 'end' OBRIGATORIO.
321
323
  Nodes permitidos em ai_tool: start, end, api, condition, set_variable, ai, randomizer, action,
@@ -380,6 +382,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
380
382
  cron, webhook. NOVO message_sent (2026-06-11): par do message_received pra mensagens de
381
383
  SAIDA (atendente, celular/eco, IA — nota privada NAO) com keywords+match_type; cuidado: acao
382
384
  'desativar IA' com esse trigger sem keywords = a propria resposta da IA dispara o flow.
385
+ group_participant_joined / group_participant_left (NOVO 07/08 — 'Entrou no grupo' / 'Saiu do
386
+ grupo', evento de grupo WhatsApp QR Code). Item {key:'group_participant_joined'|
387
+ 'group_participant_left', config:{group_match:'any'|'contains'|'does_not_contain'|'equal_to'|
388
+ 'not_equal_to'|'starts_with'|'ends_with', group_name:'<termo>', group_ids:['<id ou 1203..@g.us>']}}
389
+ — os dois filtros se SOMAM (E logico), cada um vazio deixa passar: group_match/group_name filtra
390
+ pelo NOME do grupo; group_ids (so via API/MCP, compara por digitos) mira grupos exatos. Vale nos 2
391
+ tipos de flow: em flow de grupo roda na conversa do grupo; em flow individual roda na conversa da
392
+ PESSOA que entrou/saiu ('entrou no grupo -> manda no privado').
383
393
  WEBHOOK EMBUTIDO (Webhook Universal): 1) criar flow; 2) POST /custom_webhook_integrations com
384
394
  {custom_webhook_integration:{flow_id}} (idempotente, retorna URL unica); 3) flows_update com
385
395
  item {type:'webhook_received', config:{integration_id}} no data.items do start. Remover o item
@@ -467,7 +477,10 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
467
477
  First-match-wins: avalia em ordem e PARA na primeira que bate.
468
478
  Operadores: equal/not_equal, contains/not_contains, starts_with/ends_with,
469
479
  is_empty/is_not_empty (NAO existe is_present/is_blank), greater_than/less_than,
470
- number_range ("min-max"), regex, equal_any/contains_any (values[]),
480
+ number_range ("min-max"), regex,
481
+ equal_any/not_equal_any/contains_any/not_contains_any/starts_with_any/ends_with_any (multi-valor
482
+ via values[], case-insensitive; starts_with_any/ends_with_any NOVOS 07/08 — o texto COMECA/TERMINA
483
+ com alguma das palavras da lista),
471
484
  business_hours/outside_business_hours (campos opcionais days[0=dom..6=sab]/start_hour/end_hour/timezone
472
485
  IANA ex. America/Sao_Paulo; outside_business_hours HERDA days/start_hour/end_hour/timezone da
473
486
  business_hours ANTERIOR no array — pode deixar ausentes que o backend preenche),
@@ -483,6 +496,13 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
483
496
  datetime (value "YYYY-MM-DDTHH:MM", compara HORARIO DE PAREDE — ignora fuso/offset).
484
497
  Backend detecta o FORMATO do value: instante > dia > minutos > numero.
485
498
  number_range SO em numero. NUNCA maior/menor em texto/lista.
499
+ RESPOSTA DO CLIENTE (valueType 'response_multi', tipicamente field '{{last_response}}'): campo
500
+ especial cuja "resposta" e uma LISTA de palavras — oferece EXATAMENTE 8 operadores: equal_any,
501
+ contains_any, not_equal_any, not_contains_any, starts_with_any, ends_with_any (todos multi-valor
502
+ via values[]) + is_empty / is_not_empty (SEM values[]).
503
+ EQUIPE (condicao "Esta na equipe", field '{{conversation.team_id}}'): aceita VARIAS equipes de uma
504
+ vez — passe values:['24','25'] (array de ids) em vez de value unico; casa se bater qualquer uma.
505
+ Array de values vazio cai no value unico legado.
486
506
 
487
507
  ▸ action
488
508
  data: { label, items: [ { key, config: {...} } ] }
@@ -499,9 +519,11 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
499
519
  Redis; gere um unico por acao, ex 'd_ab12cd'). Ordem da lista = ordem do rodizio, sem porcentagem.
500
520
  DIFERENTE do randomizer mode distribute_agents (sorteio ponderado),
501
521
  change_status({status: open|resolved|pending|snoozed}), change_priority({priority}),
502
- mute_conversation({}), add_private_note({content}), send_email_transcript({email}),
522
+ mute_conversation({}), mark_unread({}), add_private_note({content}), send_email_transcript({email}),
503
523
  add_conversation_label({labels:[...]}), remove_conversation_label({labels:[...]}), // etiqueta NA CONVERSA
504
524
  assign_captain({assistant_id}), deactivate_captain({}),
525
+ // mark_unread({}) — NOVO 07/08: deixa a conversa NAO LIDA pro time (badge acende). Tipico logo
526
+ // apos assign_agent/assign_team numa transferencia. Conversa ja nao-lida nao e mexida.
505
527
  add_sla({sla_policy_id}) — NOVO 24/07: aplica politica de SLA na conversa (id de sla_list;
506
528
  aceita variavel Liquid). NO-OP se a conversa JA tem SLA (nunca troca/reinicia); politica
507
529
  inexistente nao quebra o fluxo
@@ -594,7 +616,36 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
594
616
  (pode cair no mesmo agente varias vezes seguidas). Pra RODIZIO exato use a ACAO distribute_agents.
595
617
  Handles: o id de cada branch (mode branches); "success" (mode distribute_agents).
596
618
 
597
- ▸ update_group (WAHA, conversa de grupo apenas)
619
+ ▸ update_group (Gestao de Grupos WhatsApp — REESCRITO 07/08: UMA operacao por bloco, 17 no total)
620
+ Roda em fluxo de QUALQUER canal desde que a conta tenha caixa WhatsApp QR Code (Channel::Waha).
621
+ Em flow de GRUPO o campo de caixa e opcional (vazio = caixa da conversa); em flow NAO-grupo
622
+ data.groupInboxId e OBRIGATORIO (id de inbox Channel::Waha da conta).
623
+ data comum:
624
+ groupOperation: <uma das 17 abaixo> // ausente/vazio = 'legacy' (comportamento antigo — NAO usar em node novo)
625
+ groupTargetId: "<id do grupo>" // vazio = grupo da conversa; aceita '1203..@g.us', so digitos ou {{var}}. Ignorado nas TARGETLESS (create, find_by_name)
626
+ groupInboxId: <id inbox QR Code> // OBRIGATORIO em flow nao-grupo
627
+ groupResponseVar: "grupo" // nome da variavel de resposta (default 'grupo'); leia depois {{grupo.CAMPO}}
628
+ Teto de 20 participantes por execucao (add/remove/promote/demote) — trava ANTI-BANIMENTO.
629
+ Operacoes -> chaves de data (+ campos que a resposta devolve em {{grupo.*}}):
630
+ create -> groupName(obrig), groupDescription, groupPicture(url), groupInitialAdmins, groupParticipants -> id,name,description,picture,participants_count [risco de banimento]
631
+ find_by_id -> (groupTargetId) -> id,name,description,picture,participants,participants_count
632
+ find_by_name -> groupSearchName(obrig), groupSearchMode(contains[padrao]|does_not_contain|equal_to|not_equal_to|starts_with|ends_with) -> results,results_count [TARGETLESS]
633
+ update_subject -> updateSubject(obrig) -> id,name
634
+ update_description -> updateDescription -> id,description
635
+ update_picture -> updatePicture(obrig, url) -> id
636
+ leave -> (groupTargetId) -> id [IRREVERSIVEL]
637
+ list_participants -> (groupTargetId) -> id,participants(ate 100),participants_count
638
+ add_participants -> groupParticipants(obrig; array de telefones/JIDs ex ['5511999999999@c.us'] ou lista por virgula; aceita {{var}}) -> id,added,not_added,added_count,not_added_count [risco de banimento]
639
+ remove_participants -> groupParticipants(obrig) -> id,removed,not_removed,removed_count,not_removed_count
640
+ promote_admin -> groupParticipants(obrig) -> id,participants
641
+ demote_admin -> groupParticipants(obrig) -> id,participants
642
+ get_invite -> (groupTargetId) -> id,invite_link
643
+ revoke_invite -> (groupTargetId) -> id,invite_link [IRREVERSIVEL — invalida o link antigo]
644
+ send_invite -> groupInviteTo(obrig, telefone), groupInviteMessage(opcional) -> id,invite_link,invite_sent_to
645
+ settings -> pelo menos UMA de: infoAdminOnly(bool), messagesAdminOnly(bool), membersCanAddNewMember(bool) -> id,settings_updated
646
+ ATENCAO settings: membersCanAddNewMember tem semantica INVERTIDA (true = TODOS podem adicionar);
647
+ infoAdminOnly/messagesAdminOnly seguem o padrao (true = SO admin).
648
+ Toda operacao tambem devolve {{grupo.ok}} (bool) e {{grupo.error.message}}.
598
649
  Handles: "success", "error"
599
650
 
600
651
  ▸ end
@@ -640,6 +691,14 @@ agent.* = o RESPONSAVEL da conversa: agent.name, agent.first_name, agent.last_na
640
691
  inbox.id, inbox.name (antes resolviam vazio fora do Enviar Mensagem — corrigido 23/07)
641
692
  account.name, account.id (id NOVO 23/07), account.custom_attribute.X (inclui variaveis de conta e
642
693
  segredos — NAO existe env.X), {{var_criada_no_set_variable}}, {{ai_intent}}, {{api_response_var}}
694
+ trigger.* (variaveis do GATILHO que iniciou o flow — NOVO 07/08 no autocomplete de TODO bloco):
695
+ trigger.type (codigo do gatilho), trigger.name, trigger.activated_at (hora do disparo),
696
+ trigger.message.content (msg que iniciou), trigger.conversation.channel (canal de origem),
697
+ trigger.conversation.status, trigger.kanban_item_id (numero do card), trigger.funnel_id,
698
+ trigger.user_name (quem acionou manual), trigger.campaign_title (campanha que disparou),
699
+ trigger.event_name (evento no site), trigger.page_url (pagina visitada),
700
+ trigger.source_flow_name (fluxo que chamou). Cada uma so tem valor quando o gatilho fornece (ex:
701
+ page_url so em gatilho de site) — fora disso resolve vazio.
643
702
  DESDE 23/07 essas variaveis padrao funcionam em TODOS os nodes (Chamada API, Condicoes, IA, Definir
644
703
  Variavel) — antes so no Enviar Mensagem. Campo vazio resolve pra string vazia (nunca trava o flow).
645
704
  REGRA-MAE: variavel FORA da lista acima SOME do texto, sem erro em lugar nenhum — nao quebra o save,
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
@@ -2515,6 +2515,117 @@
2515
2515
  ],
2516
2516
  "related_tools": []
2517
2517
  },
2518
+ {
2519
+ "id": "lionchat_funnels_stage_report",
2520
+ "method": "GET",
2521
+ "path": "/api/v1/accounts/{account_id}/funnels/{id}/stage_report",
2522
+ "title": "Relatorio de UMA Etapa do Funil (Kanban)",
2523
+ "description": "Numeros de UMA etapa do funil calculados no SERVIDOR (antes a tela so somava os cards carregados na tela, mostrando '100' numa etapa de 432): total de cards, faixa de valores, ganhos/perdidos, distribuicao por prioridade e ranking de vendedores da etapa. Aceita escolher a REGUA de data e recortar por periodo. FUNIL = KANBAN (mesma coisa no LionChat).",
2524
+ "category": "Funis",
2525
+ "params": [
2526
+ {
2527
+ "name": "id",
2528
+ "type": "integer",
2529
+ "location": "path",
2530
+ "required": true,
2531
+ "description": "ID do funil"
2532
+ },
2533
+ {
2534
+ "name": "stage",
2535
+ "type": "string",
2536
+ "location": "query",
2537
+ "required": true,
2538
+ "description": "Chave interna da etapa (slug/uuid da etapa no funil, NAO o nome exibido). Pegue de funnels_show (funnel.stages)"
2539
+ },
2540
+ {
2541
+ "name": "date_basis",
2542
+ "type": "string",
2543
+ "location": "query",
2544
+ "required": false,
2545
+ "description": "Regua de data: any | created (criacao do card) | moved (entrada na etapa) | closed (fechamento). PADRAO 'moved' — DIFERENTE do relatorio agregado do funil, que usa 'any'; as duas telas so batem se usar a mesma regua"
2546
+ },
2547
+ {
2548
+ "name": "report_from",
2549
+ "type": "string",
2550
+ "location": "query",
2551
+ "required": false,
2552
+ "description": "Inicio da janela do relatorio (YYYY-MM-DD), aplicado conforme date_basis"
2553
+ },
2554
+ {
2555
+ "name": "report_to",
2556
+ "type": "string",
2557
+ "location": "query",
2558
+ "required": false,
2559
+ "description": "Fim da janela do relatorio (YYYY-MM-DD)"
2560
+ },
2561
+ {
2562
+ "name": "priorities",
2563
+ "type": "array",
2564
+ "location": "query",
2565
+ "required": false,
2566
+ "description": "Filtra por prioridade dos cards (ex: ['high','urgent'])"
2567
+ },
2568
+ {
2569
+ "name": "agent_id",
2570
+ "type": "integer",
2571
+ "location": "query",
2572
+ "required": false,
2573
+ "description": "Filtra por responsavel do card; -1 = cards SEM responsavel"
2574
+ },
2575
+ {
2576
+ "name": "value_min",
2577
+ "type": "number",
2578
+ "location": "query",
2579
+ "required": false,
2580
+ "description": "Valor minimo do card"
2581
+ },
2582
+ {
2583
+ "name": "value_max",
2584
+ "type": "number",
2585
+ "location": "query",
2586
+ "required": false,
2587
+ "description": "Valor maximo do card"
2588
+ },
2589
+ {
2590
+ "name": "date_start",
2591
+ "type": "string",
2592
+ "location": "query",
2593
+ "required": false,
2594
+ "description": "Filtro por data de CRIACAO do card (YYYY-MM-DD), independente do date_basis"
2595
+ },
2596
+ {
2597
+ "name": "date_end",
2598
+ "type": "string",
2599
+ "location": "query",
2600
+ "required": false,
2601
+ "description": "Fim do filtro por data de criacao (YYYY-MM-DD)"
2602
+ },
2603
+ {
2604
+ "name": "scheduled_date_start",
2605
+ "type": "string",
2606
+ "location": "query",
2607
+ "required": false,
2608
+ "description": "Filtro por data de agendamento do card (YYYY-MM-DD)"
2609
+ },
2610
+ {
2611
+ "name": "scheduled_date_end",
2612
+ "type": "string",
2613
+ "location": "query",
2614
+ "required": false,
2615
+ "description": "Fim do filtro por agendamento (YYYY-MM-DD)"
2616
+ }
2617
+ ],
2618
+ "returns": "objeto com os numeros da etapa: total de cards, faixa/soma de valores, ganhos vs perdidos, distribuicao por prioridade e ranking de vendedores da etapa",
2619
+ "common_use_cases": [
2620
+ "Ver os numeros REAIS de uma etapa do funil num periodo",
2621
+ "Comparar desempenho de vendedores numa etapa especifica"
2622
+ ],
2623
+ "related_tools": [
2624
+ "lionchat_funnels_show",
2625
+ "lionchat_kanban_items_list_3",
2626
+ "lionchat_funnels_open_counts"
2627
+ ]
2628
+ },
2518
2629
  {
2519
2630
  "id": "lionchat_funnels_update",
2520
2631
  "method": "PATCH",
@@ -3547,7 +3658,7 @@
3547
3658
  "method": "GET",
3548
3659
  "path": "/api/v1/accounts/{account_id}/kanban_items/filter",
3549
3660
  "title": "Filtrar Items",
3550
- "description": "Filtra cards do Kanban com o filtro RICO da plataforma (mesmo motor da tela '+ Filtro'). Filtros REAIS aplicados: etapas (stages), prioridades, status do card (open/won/lost), agente, faixa de valor, periodo de criacao (date_start/end), periodo de agendamento (scheduled_date_*), tarefas (task_filter), canal, etiqueta da conversa, oferta e atributos personalizados de card/contato/conversa (JSON-string + custom_attribute_match all/any). ATENCAO: SEM paginacao — retorna ate 5000 cards em ordem created_at DESC, shape {items:[], total, filters}. NAO existe filtro por time aqui (use lionchat_kanban_items_list_3 pra relatorio por time, ou filtre por agent_id); ordenacao e fixa. (2026-07-24: removidos os parametros stage_id/inbox_id/sort_by/sort_direction/page — eram aceitos mas IGNORADOS pelo backend; use stages[] no lugar de stage_id.)",
3661
+ "description": "Filtra cards do Kanban com o filtro RICO da plataforma (mesmo motor da tela '+ Filtro'). Filtros REAIS aplicados: etapas (stages), prioridades, status do card (open/won/lost), agente, faixa de valor, periodo de criacao (date_start/end), periodo de MOVIMENTACAO PARA A ETAPA atual (stage_date_start/end), periodo de agendamento (scheduled_date_*), tarefas (task_filter), canal, etiqueta da conversa, oferta e atributos personalizados de card/contato/conversa (JSON-string + custom_attribute_match all/any). ATENCAO: SEM paginacao — retorna ate 5000 cards em ordem created_at DESC, shape {items:[], total, filters}. NAO existe filtro por time aqui (use lionchat_kanban_items_list_3 pra relatorio por time, ou filtre por agent_id); ordenacao e fixa. (2026-07-24: removidos os parametros stage_id/inbox_id/sort_by/sort_direction/page — eram aceitos mas IGNORADOS pelo backend; use stages[] no lugar de stage_id.)",
3551
3662
  "category": "Itens",
3552
3663
  "params": [
3553
3664
  {
@@ -3616,6 +3727,20 @@
3616
3727
  "required": false,
3617
3728
  "description": "Criado ate (YYYY-MM-DD)"
3618
3729
  },
3730
+ {
3731
+ "name": "stage_date_start",
3732
+ "type": "string",
3733
+ "location": "query",
3734
+ "required": false,
3735
+ "description": "Movido para a etapa a partir de (YYYY-MM-DD) — recorta por QUANDO O CARD ENTROU na etapa em que ele esta agora (stage_entered_at, caindo em created_at quando o card nunca se moveu). E DIFERENTE de date_start, que e a data de CRIACAO: card criado em janeiro e arrastado ontem casa aqui e NAO casa em date_start. Pontas independentes (pode mandar so uma)."
3736
+ },
3737
+ {
3738
+ "name": "stage_date_end",
3739
+ "type": "string",
3740
+ "location": "query",
3741
+ "required": false,
3742
+ "description": "Movido para a etapa ate (YYYY-MM-DD) — cobre o dia inteiro."
3743
+ },
3619
3744
  {
3620
3745
  "name": "scheduled_date_start",
3621
3746
  "type": "string",
@@ -3742,9 +3867,51 @@
3742
3867
  "location": "query",
3743
3868
  "required": false,
3744
3869
  "description": "Valor máx"
3870
+ },
3871
+ {
3872
+ "name": "date_start",
3873
+ "type": "string",
3874
+ "location": "query",
3875
+ "required": false,
3876
+ "description": "Criado a partir de (YYYY-MM-DD) — filtra created_at do card"
3877
+ },
3878
+ {
3879
+ "name": "date_end",
3880
+ "type": "string",
3881
+ "location": "query",
3882
+ "required": false,
3883
+ "description": "Criado ate (YYYY-MM-DD)"
3884
+ },
3885
+ {
3886
+ "name": "stage_date_start",
3887
+ "type": "string",
3888
+ "location": "query",
3889
+ "required": false,
3890
+ "description": "Movido para a etapa a partir de (YYYY-MM-DD) — recorta por QUANDO O CARD ENTROU na etapa em que ele esta agora (stage_entered_at, caindo em created_at quando o card nunca se moveu). E DIFERENTE de date_start, que e a data de CRIACAO: card criado em janeiro e arrastado ontem casa aqui e NAO casa em date_start. Pontas independentes (pode mandar so uma)."
3891
+ },
3892
+ {
3893
+ "name": "stage_date_end",
3894
+ "type": "string",
3895
+ "location": "query",
3896
+ "required": false,
3897
+ "description": "Movido para a etapa ate (YYYY-MM-DD) — cobre o dia inteiro."
3898
+ },
3899
+ {
3900
+ "name": "scheduled_date_start",
3901
+ "type": "string",
3902
+ "location": "query",
3903
+ "required": false,
3904
+ "description": "Agendamento a partir de (YYYY-MM-DD) — considera scheduled_at/deadline_at do card"
3905
+ },
3906
+ {
3907
+ "name": "scheduled_date_end",
3908
+ "type": "string",
3909
+ "location": "query",
3910
+ "required": false,
3911
+ "description": "Agendamento ate (YYYY-MM-DD)"
3745
3912
  }
3746
3913
  ],
3747
- "returns": "NAO devolve JSON. Devolve um ARQUIVO CSV pra download (text/csv, anexo `kanban_items_<funil>_<data>.csv`), com cabecalho e uma linha por card: id, titulo, descricao, status, prioridade, valor, etapa (nome amigavel), funil, agentes, cliente, email, telefone, criado em, atualizado em, prazo, id da conversa, conversas vinculadas e ofertas. Nao ha `meta` nem `payload` — o corpo e o CSV cru. `funnel_id` e OBRIGATORIO (sem ele volta 400 `{error}`). Filtros opcionais: priorities, value_min, value_max, agent_id, date_start/date_end, scheduled_date_start/scheduled_date_end. So exporta cards das caixas que o usuario pode ver.",
3914
+ "returns": "NAO devolve JSON. Devolve um ARQUIVO CSV pra download (text/csv, anexo `kanban_items_<funil>_<data>.csv`), com cabecalho e uma linha por card: id, titulo, descricao, status, prioridade, valor, etapa (nome amigavel), funil, agentes, cliente, email, telefone, criado em, atualizado em, prazo, id da conversa, conversas vinculadas e ofertas. Nao ha `meta` nem `payload` — o corpo e o CSV cru. `funnel_id` e OBRIGATORIO (sem ele volta 400 `{error}`). Filtros opcionais: priorities, value_min, value_max, agent_id, date_start/date_end (CRIACAO), stage_date_start/stage_date_end (quando o card ENTROU na etapa atual) e scheduled_date_start/scheduled_date_end. So exporta cards das caixas que o usuario pode ver.",
3748
3915
  "common_use_cases": [
3749
3916
  "Dashboard: contar/exibir itens Kanban",
3750
3917
  "Buscar com filtros antes de outra operação",
@@ -3869,6 +4036,13 @@
3869
4036
  "location": "query",
3870
4037
  "required": false,
3871
4038
  "description": "ID do time — restringe aos cards dos agentes do time"
4039
+ },
4040
+ {
4041
+ "name": "date_basis",
4042
+ "type": "string",
4043
+ "location": "query",
4044
+ "required": false,
4045
+ "description": "Qual data o periodo (from/to) considera. 'any' = PADRAO e regua historica (card CRIADO no periodo OU FECHADO no periodo) — omitir mantem exatamente os numeros de sempre. 'created' = so criados. 'moved' = so os que entraram na etapa atual no periodo. 'closed' = so ganhos/perdidos no periodo (a pergunta de receita). Valor invalido cai no padrao sem erro, e a regua aplicada volta em dateBasis."
3872
4046
  }
3873
4047
  ],
3874
4048
  "returns": "objeto de metricas agregadas do funil (valores ganhos, por etapa, forecast, top deals, stale) — NAO e array de itens",
@@ -5068,168 +5242,6 @@
5068
5242
  "lionchat_kanban_v2_show"
5069
5243
  ]
5070
5244
  },
5071
- {
5072
- "id": "lionchat_kanban_v2_list_4",
5073
- "method": "GET",
5074
- "path": "/api/v1/accounts/{account_id}/kanban/automations",
5075
- "title": "Listar Automacoes Kanban",
5076
- "description": "Lista automacoes configuradas no Kanban. Lista cards Kanban paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de card Kanban).",
5077
- "category": "Kanban V2",
5078
- "params": [],
5079
- "returns": "LISTA PURA (array no topo, SEM embrulho meta/payload) — a resposta JA E a lista. E a lista de AUTOMACOES do Kanban (nao de cards). Cada item: id, name, description, active, trigger (objeto), conditions (array), actions (array), account_id, created_at, updated_at. Lista vazia = [].",
5080
- "common_use_cases": [
5081
- "Dashboard: contar/exibir cards Kanban",
5082
- "Buscar com filtros antes de outra operação",
5083
- "Auditoria/relatório de cards Kanban ativas"
5084
- ],
5085
- "related_tools": [
5086
- "lionchat_kanban_v2_list",
5087
- "lionchat_kanban_v2_create",
5088
- "lionchat_kanban_v2_show"
5089
- ]
5090
- },
5091
- {
5092
- "id": "lionchat_kanban_v2_create_4",
5093
- "method": "POST",
5094
- "path": "/api/v1/accounts/{account_id}/kanban/automations",
5095
- "title": "Criar Automacao Kanban",
5096
- "description": "Cria uma nova automacao no Kanban. Cria novo card Kanban. Obrigatórios: name, trigger, actions. Valida unicidade quando aplicável. Retorna o card Kanban criado com ID atribuído.",
5097
- "category": "Kanban V2",
5098
- "params": [
5099
- {
5100
- "name": "name",
5101
- "type": "string",
5102
- "location": "body",
5103
- "required": true,
5104
- "description": "Nome da automacao"
5105
- },
5106
- {
5107
- "name": "trigger",
5108
- "type": "string",
5109
- "location": "body",
5110
- "required": true,
5111
- "description": "Gatilho"
5112
- },
5113
- {
5114
- "name": "actions",
5115
- "type": "array",
5116
- "location": "body",
5117
- "required": true,
5118
- "description": "Acoes"
5119
- }
5120
- ],
5121
- "returns": "card Kanban criado (com novo ID)",
5122
- "common_use_cases": [
5123
- "Cadastro inicial de card Kanban",
5124
- "Automação a partir de evento externo",
5125
- "Importação manual via API"
5126
- ],
5127
- "related_tools": [
5128
- "lionchat_kanban_v2_list",
5129
- "lionchat_kanban_v2_create",
5130
- "lionchat_kanban_v2_show"
5131
- ],
5132
- "body_wrapper": "kanban_automation"
5133
- },
5134
- {
5135
- "id": "lionchat_kanban_v2_show_3",
5136
- "method": "GET",
5137
- "path": "/api/v1/accounts/{account_id}/kanban/automations/{id}",
5138
- "title": "Detalhes Automacao Kanban",
5139
- "description": "Retorna detalhes de uma automacao do Kanban. Retorna detalhes completos de UM card Kanban específico pelo ID. Inclui campos relacionais quando aplicável.",
5140
- "category": "Kanban V2",
5141
- "params": [
5142
- {
5143
- "name": "id",
5144
- "type": "integer",
5145
- "location": "path",
5146
- "required": true,
5147
- "description": "ID da automacao"
5148
- }
5149
- ],
5150
- "returns": "card Kanban (objeto completo com associações)",
5151
- "common_use_cases": [
5152
- "Ver dados completos antes de editar",
5153
- "Verificar estado atual antes de uma ação",
5154
- "Mostrar perfil ou ficha de card Kanban"
5155
- ],
5156
- "related_tools": [
5157
- "lionchat_kanban_v2_list",
5158
- "lionchat_kanban_v2_create",
5159
- "lionchat_kanban_v2_show"
5160
- ]
5161
- },
5162
- {
5163
- "id": "lionchat_kanban_v2_update_3",
5164
- "method": "PUT",
5165
- "path": "/api/v1/accounts/{account_id}/kanban/automations/{id}",
5166
- "title": "Atualizar Automacao Kanban",
5167
- "description": "Atualiza uma automacao do Kanban. Atualiza campos do card Kanban existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: name, active.",
5168
- "category": "Kanban V2",
5169
- "params": [
5170
- {
5171
- "name": "id",
5172
- "type": "integer",
5173
- "location": "path",
5174
- "required": true,
5175
- "description": "ID da automacao"
5176
- },
5177
- {
5178
- "name": "name",
5179
- "type": "string",
5180
- "location": "body",
5181
- "required": false,
5182
- "description": "Nome"
5183
- },
5184
- {
5185
- "name": "active",
5186
- "type": "boolean",
5187
- "location": "body",
5188
- "required": false,
5189
- "description": "Ativo"
5190
- }
5191
- ],
5192
- "returns": "card Kanban atualizado",
5193
- "common_use_cases": [
5194
- "Edição parcial de card Kanban",
5195
- "Alteração de status/estado",
5196
- "Atualização em massa via automação"
5197
- ],
5198
- "related_tools": [
5199
- "lionchat_kanban_v2_list",
5200
- "lionchat_kanban_v2_create",
5201
- "lionchat_kanban_v2_show"
5202
- ],
5203
- "body_wrapper": "kanban_automation"
5204
- },
5205
- {
5206
- "id": "lionchat_kanban_v2_destroy_5",
5207
- "method": "DELETE",
5208
- "path": "/api/v1/accounts/{account_id}/kanban/automations/{id}",
5209
- "title": "Excluir Automacao Kanban",
5210
- "description": "Remove uma automacao do Kanban. Remove card Kanban permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes.",
5211
- "category": "Kanban V2",
5212
- "params": [
5213
- {
5214
- "name": "id",
5215
- "type": "integer",
5216
- "location": "path",
5217
- "required": true,
5218
- "description": "ID da automacao"
5219
- }
5220
- ],
5221
- "returns": "204 No Content",
5222
- "common_use_cases": [
5223
- "Limpeza de dados obsoletos",
5224
- "Deduplicação manual",
5225
- "Remoção após confirmação do cliente"
5226
- ],
5227
- "related_tools": [
5228
- "lionchat_kanban_v2_list",
5229
- "lionchat_kanban_v2_create",
5230
- "lionchat_kanban_v2_show"
5231
- ]
5232
- },
5233
5245
  {
5234
5246
  "id": "lionchat_reports_list",
5235
5247
  "method": "GET",
@@ -6068,7 +6080,7 @@
6068
6080
  "description": "Filtra cenarios ativos/inativos (true/false)"
6069
6081
  }
6070
6082
  ],
6071
- "returns": "Objeto com `payload` + `meta`. `payload` = array de CENARIOS do assistente (id, title, description, instruction, tools, tool_bindings, enabled, assistant_id, account_id, datas e um resumo do assistente) — NAO e lista de assistentes. `meta` traz `total_count` e `page`, sendo que `page` vem sempre 1 (esta lista nao pagina). Por padrao devolve so os cenarios ativos; use `enabled=all` para incluir os desativados, ou `enabled=false` so os desativados.",
6083
+ "returns": "Objeto com `payload` + `meta`. `payload` = array de CENARIOS do assistente (id, title, description, instruction, tools, tool_bindings, document_ids, enabled, assistant_id, account_id, datas e um resumo do assistente) — NAO e lista de assistentes. `meta` traz `total_count` e `page`, sendo que `page` vem sempre 1 (esta lista nao pagina). Por padrao devolve so os cenarios ativos; use `enabled=all` para incluir os desativados, ou `enabled=false` so os desativados.",
6072
6084
  "common_use_cases": [
6073
6085
  "Dashboard: contar/exibir assistentes AI",
6074
6086
  "Buscar com filtros antes de outra operação",
@@ -6114,7 +6126,7 @@
6114
6126
  "type": "string",
6115
6127
  "location": "body",
6116
6128
  "required": true,
6117
- "description": "Instrucao do cenario (markdown). Pode conter referencias de tools com sintaxe `[Label](tool://tool_id)`"
6129
+ "description": "Instrucao do cenario (markdown). Pode conter referencias de tools com sintaxe `[Label](tool://tool_id)` [07/08] Para APONTAR uma pagina da base pra IA priorizar a busca, escreva a mencao [@Nome](document://ID) (ID numerico do documento) DENTRO deste texto. NAO existe param document_ids (seria descartado em silencio); teto de 3 documentos por cenario."
6118
6130
  },
6119
6131
  {
6120
6132
  "name": "enabled",
@@ -6174,7 +6186,7 @@
6174
6186
  "description": "ID do cenario"
6175
6187
  }
6176
6188
  ],
6177
- "returns": "assistente AI (objeto completo com associações)",
6189
+ "returns": "assistente AI (objeto completo com associações). Inclui document_ids (array de ids das paginas da base apontadas pela instruction via [@Nome](document://ID); so-leitura, derivado).",
6178
6190
  "common_use_cases": [
6179
6191
  "Ver dados completos antes de editar",
6180
6192
  "Verificar estado atual antes de uma ação",
@@ -6227,7 +6239,7 @@
6227
6239
  "type": "string",
6228
6240
  "location": "body",
6229
6241
  "required": false,
6230
- "description": "Instrucao do cenario (markdown). Pode conter referencias de tools com sintaxe `[Label](tool://tool_id)`"
6242
+ "description": "Instrucao do cenario (markdown). Pode conter referencias de tools com sintaxe `[Label](tool://tool_id)` [07/08] Para APONTAR uma pagina da base pra IA priorizar a busca, escreva a mencao [@Nome](document://ID) (ID numerico do documento) DENTRO deste texto. NAO existe param document_ids (seria descartado em silencio); teto de 3 documentos por cenario."
6231
6243
  },
6232
6244
  {
6233
6245
  "name": "enabled",
@@ -13172,7 +13184,7 @@
13172
13184
  "method": "POST",
13173
13185
  "path": "/api/v1/accounts/{account_id}/captain/documents",
13174
13186
  "title": "Adicionar Documento",
13175
- "description": "Adiciona URL ou arquivo à base de conhecimento. Cria novo documento KB. Valida unicidade quando aplicável. Retorna o documento KB criado com ID atribuído.",
13187
+ "description": "Adiciona URL ou arquivo à base de conhecimento. Cria novo documento KB. Valida unicidade quando aplicável. Retorna o documento KB criado com ID atribuído. [07/08] Ao salvar com `content`, o texto e reorganizado automaticamente (titulos/blocos) pela IA da conta pra IA conseguir ler o documento inteiro — com rede de seguranca: mantem o texto ORIGINAL se o resultado ficar vazio, sem titulo, encolher mais de 15%, deixar bloco acima de 400 caracteres ou alterar qualquer numero/CEP/telefone/valor.",
13176
13188
  "category": "Base de Conhecimento",
13177
13189
  "params": [
13178
13190
  {
@@ -15280,6 +15292,46 @@
15280
15292
  "lionchat_inboxes_whatsapp_templates_destroy"
15281
15293
  ]
15282
15294
  },
15295
+ {
15296
+ "id": "lionchat_inboxes_whatsapp_templates_update",
15297
+ "method": "PATCH",
15298
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_templates/{id}/variable_mapping",
15299
+ "title": "Apontar Variaveis do Template (sem reenviar a Meta)",
15300
+ "description": "Salva SO o apontamento LOCAL das variaveis de um template JA APROVADO — ZERO chamada a Meta, o status/review do modelo fica intacto (continua 'Aprovado'). SOMENTE Channel::Whatsapp Cloud e SOMENTE administrador. Use pra dizer de onde vem o valor de cada variavel {{N}} do CORPO no envio. O mapa e AUTORITATIVO: substitui todos os apontamentos de corpo (chave ausente e removida; {} limpa tudo). Recusa 422 se: template de categoria AUTHENTICATION (OTP); chave que nao existe no corpo aprovado; valor sem source/field; source fora de contact/conversation/account/custom. 404 se o id nao existir na caixa. Cabecalho/botao (chaves com _) NAO entram aqui — use o create/update normal.",
15301
+ "category": "Templates WhatsApp",
15302
+ "params": [
15303
+ {
15304
+ "name": "inbox_id",
15305
+ "type": "integer",
15306
+ "location": "path",
15307
+ "required": true,
15308
+ "description": "ID da inbox (caixa WhatsApp Cloud)"
15309
+ },
15310
+ {
15311
+ "name": "id",
15312
+ "type": "string",
15313
+ "location": "path",
15314
+ "required": true,
15315
+ "description": "ID NUMERICO da Meta do template (campo 'id' da listagem de templates, NAO o nome)"
15316
+ },
15317
+ {
15318
+ "name": "variable_mapping",
15319
+ "type": "object",
15320
+ "location": "body",
15321
+ "required": true,
15322
+ "description": "Mapa das variaveis do CORPO. Chave = texto interno de {{...}} do corpo aprovado ('1','2'... ou nomeada). Valor = {source: contact|conversation|account|custom, field: <campo>, label: <opcional>}. Fontes/campos validos: contact/name, contact/name.split.first, contact/phone_number, contact/email, contact/id, conversation/display_id, conversation/assignee.name, conversation/team.name, account/name, {contact|conversation|account}/custom_attribute.<chave>, custom/<texto fixo>. Ex: {\"1\": {\"source\": \"contact\", \"field\": \"name.split.first\", \"label\": \"Primeiro nome\"}}. AUTORITATIVO: substitui TODO o apontamento de corpo; {} limpa tudo. NAO aceita chaves com _ (cabecalho/botao)."
15323
+ }
15324
+ ],
15325
+ "returns": "template atualizado com o variable_mapping local salvo; status/review na Meta inalterados",
15326
+ "common_use_cases": [
15327
+ "Apontar {{1}} = primeiro nome do contato sem reenviar o modelo pra Meta",
15328
+ "Corrigir de onde vem o valor de uma variavel de um template ja aprovado"
15329
+ ],
15330
+ "related_tools": [
15331
+ "lionchat_inboxes_whatsapp_templates_list",
15332
+ "lionchat_inboxes_whatsapp_templates_create_2"
15333
+ ]
15334
+ },
15283
15335
  {
15284
15336
  "id": "lionchat_inboxes_sync_templates",
15285
15337
  "method": "POST",
@@ -15500,7 +15552,7 @@
15500
15552
  "method": "GET",
15501
15553
  "path": "/api/v1/accounts/{account_id}/google_calendar/connect",
15502
15554
  "title": "Conectar Google Calendar",
15503
- "description": "Inicia o fluxo de conexao com Google Calendar. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar).",
15555
+ "description": "Inicia o fluxo de conexao com Google Calendar. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar). [07/08] SO ADMINISTRADOR conecta (usuario nao-admin recebe 403) e SO UMA conta Google por conta LionChat — se ja houver uma conectada por outro admin, a nova e recusada; desconecte a atual antes.",
15504
15556
  "category": "Google Calendar",
15505
15557
  "params": [
15506
15558
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionchat/mcp-server",
3
- "version": "1.10.3",
3
+ "version": "1.11.0",
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",