@lionchat/mcp-server 1.30.0 → 1.32.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.
@@ -16,7 +16,7 @@ Container de etapas. Conta pode ter vários funis (ex: "Vendas", "Pós-venda", "
16
16
  | `archived` | Boolean — funis arquivados não aparecem na UI ativa |
17
17
  | `active` | Boolean — controla se aceita movimentação |
18
18
  | `settings` | jsonb — config customizada (ex: cores, automações) |
19
- | `settings.agents` | agentes do funil. Grave `[{"id": <id do agente>}]` — cada item é um OBJETO, nunca número solto (ids de `lionchat_agents_list`); o sistema completa nome, e-mail, cargo e foto — é o que o editor do funil, o card e a conversa mostram. Agente de outra conta fica sem nome e sem acesso. `settings` é substituído INTEIRO no update: leia o funil antes e reenvie goals+agents+teams+automations. |
19
+ | `settings.agents` | agentes do funil. Grave `[{"id": <id do agente>}]` — cada item é um OBJETO, nunca número solto (ids de `lionchat_agents_list`); o sistema completa nome, e-mail, cargo e foto — é o que o editor do funil, o card e a conversa mostram. Agente de outra conta fica sem nome e sem acesso. `settings` é substituído INTEIRO no update: leia o funil antes e reenvie goals+agents+teams+automations. `settings.removed_stages` (lista das etapas já excluídas, usada para redirecionar cards) é do SERVIDOR: se você mandar essa chave ela é ignorada, sem erro, e o servidor a mantém sozinho. |
20
20
 
21
21
  ### Stages (Etapas) — dentro de `funnel.stages`
22
22
 
@@ -55,11 +55,55 @@ Stages NÃO são tabela separada. São armazenadas como jsonb dentro do Funnel:
55
55
  da mesma posição, senão pra primeira. **Confira o `funnel_stage` da resposta**: pode ser diferente
56
56
  do que você mandou. Leia `funnels_show` antes e use o slug exato.
57
57
  - `funnels_update` que tira do `stages` uma etapa com card responde **422 `STAGE_HAS_ITEMS`** com
58
- `stages: {"<slug>": <quantos cards>}`. Primeiro mova os cards com `lionchat_funnels_create_2`
59
- (`POST /funnels/{id}/migrate_stage`, `from_stage`, `to_stage` ou `to_funnel_id`) e só então
60
- reenvie o funil sem a etapa. Não existe parâmetro de destino no `update` de propósito.
58
+ `stages: {"<slug>": <quantos cards>}`. **Para EXCLUIR uma etapa que tem cards, use
59
+ `lionchat_funnels_remove_stage`** (`POST /funnels/{id}/remove_stage`, ver "Excluir etapa" abaixo): ela move
60
+ os cards para o destino EM SILÊNCIO e apaga a etapa. **Não** use a receita antiga (mover com `migrate_stage` e depois reenviar
61
+ o funil sem aquela etapa) — o `migrate_stage` (`lionchat_funnels_create_2`) NÃO exclui a etapa: move os
62
+ cards DISPARANDO tudo o que está ligado ao destino (automações do funil, regras, fluxos, webhooks, conversões)
63
+ e a etapa de origem continua no funil, só vazia. Usar `migrate_stage` para "limpar antes de excluir" dispara
64
+ automação e aviso ao cliente por card movido.
61
65
  - Funil apagado continua sendo erro (o card não é criado).
62
66
 
67
+ ### Excluir etapa (20/10/2026) — `lionchat_funnels_remove_stage`
68
+
69
+ `POST /funnels/{id}/remove_stage` com `from_stage` (CHAVE da etapa a excluir), `to_funnel_id` (obrigatório; pode ser o
70
+ próprio funil) e `to_stage` (CHAVE do destino). Os cards **mudam de etapa e não são apagados**; nada dispara (nenhuma
71
+ automação do funil, regra, fluxo, webhook, conversão nem aviso ao cliente). Desde 20/10/2026 o card passa a contar o
72
+ tempo na etapa nova **a partir da exclusão** (`stage_entered_at` = o instante da exclusão; antes mantinha a data): é o
73
+ que mantém os relatórios de meses passados mostrando cada card onde ele estava ("etapa removida"). Exige
74
+ administrador ou a permissão "gerenciar funis" (sem ela: **401**; vale também para o `migrate_stage`).
75
+
76
+ **Como a IA deve usar:**
77
+
78
+ 1. `lionchat_funnels_show` para pegar as chaves; conte os cards com `lionchat_funnels_stage_report` (id do funil + a
79
+ chave em `stage`, com `show_won`, `show_lost` e `show_snoozed` = `true` — sem isso o relatório conta só os abertos
80
+ não adiados e a etapa parece ter menos cards do que vai mover).
81
+ 2. Diga ao usuário quantos cards vão para onde e que a etapa será excluída; **peça o OK uma vez**.
82
+ 3. Chame com `confirm: true` — **toda** chamada leva `confirm: true`, inclusive a primeira. A ferramenta trabalha em
83
+ pedidos curtos (cerca de 8 segundos de cards por pedido, lotes de 125): **repita a chamada, sem perguntar de novo,
84
+ até vir `done: true`**.
85
+
86
+ **Respostas:**
87
+
88
+ | Resposta | Significa |
89
+ |---|---|
90
+ | `200 {done: true, moved, stage_removed: true, funnel}` | Terminou. `moved` é o TOTAL da exclusão inteira |
91
+ | `200 {done: true, moved: 0}` (sem `stage_removed`) | A etapa já estava excluída para o mesmo destino (fim normal, por exemplo repetição do pedido) |
92
+ | `200 {done: false, moved, remaining, reason}` | Ainda falta. `moved` é só deste pedido. `remaining` = cards que faltam; **nulo** = a contagem não coube no tempo (não é erro, repita); **100001** = "mais de 100 mil" |
93
+
94
+ `reason` quando `done: false`: `tempo` = repita agora; `travado` ou `faxina` = o banco estava ocupado, espere ~30 s e
95
+ repita; `destino_excluido` = a etapa de destino deixou de existir, pergunte ao usuário outro destino; `assumido` =
96
+ OUTRA pessoa assumiu a exclusão desta etapa (vêm `holder_name` e `to_stage_name`, que podem ser nulos): avise quem está
97
+ excluindo e para onde (sem nome, diga só "outra pessoa está excluindo esta etapa") e **pare, não repita**. Duas
98
+ respostas seguidas com `moved: 0` e `done: false` = algo está preso: **pare e avise**.
99
+
100
+ **Erros:** `422 {error, code}` com `code` = `DESTINATION_NOT_FOUND`, `SAME_STAGE`, `LAST_STAGE` (o funil precisa ficar
101
+ com pelo menos uma etapa), `ORIGIN_NOT_FOUND`, `STAGE_ALREADY_REMOVED_BY_OTHER`, `FINAL_SAVE_FAILED` (os cards já
102
+ foram movidos mas o funil não pôde ser salvo) e `FUNNEL_INVALID` — o texto de `error` já vem no idioma da conta,
103
+ mostre-o ao usuário. `409 STAGE_REMOVAL_IN_PROGRESS` = outra pessoa está excluindo esta etapa agora (`holder_name` e
104
+ `to_stage_name` podem ser nulos): avise e pare. **Qualquer Salvar do funil (com ou sem `stages`) também pode dar `409 FUNNEL_BUSY`**
105
+ (o funil está sendo alterado agora, por outra pessoa ou por uma exclusão de etapa): espere alguns instantes e repita.
106
+
63
107
  ### KanbanConfig (Configuração Global do Kanban) — CRÍTICO
64
108
 
65
109
  **Tabela separada do Funnel.** 1:1 com a conta. Guarda configurações que valem pra TODOS os funis. Tem 5 campos jsonb importantes:
@@ -141,6 +185,8 @@ Um card individual dentro de uma etapa.
141
185
  | `activities` | jsonb array — log de atividades |
142
186
  | `checklist` | **O que fica guardado:** jsonb array de tarefas do card (item: `text`/`completed`/`position` + `group_id`/`group_name` opcionais para agrupar). **O que a API devolve é OUTRA coisa** — ver o aviso logo abaixo |
143
187
  | `timer_started_at`, `timer_duration` | Timer interno do card |
188
+ | `effective_status` | **Só na resposta, não é coluna (11/10/2026).** A situação EFETIVA do card: `open`, `snoozed` (adiado), `won` ou `lost`. `item_details.status` continua `open` num card adiado — quem quer saber se ele está adiado lê ESTE campo. Vem em `kanban_items_list`/`_show`/`_filter`/`_search`, na busca geral, na ficha do contato e no card embutido em `conversations_show`. Ver "Card adiado" no fim |
189
+ | `snoozed_until` | **Só na resposta (11/10/2026).** Até quando o card está adiado (ISO 8601); `null` quando não está adiado |
144
190
 
145
191
  > **ATENÇÃO — na maioria das respostas o `checklist` NÃO é a lista de tarefas, e sim um resumo com
146
192
  > os números:** `{ total_count, completed_count, groups: [{ group_id, group_name, total_count,
@@ -198,9 +244,9 @@ Como gravar pelo `lionchat_kanban_items_update` (`kanban_item.item_details`):
198
244
  - Mandar objeto (`{"origem_lead": "Facebook Ads"}`) no lugar da lista **APAGA todos os campos do card**: o
199
245
  servidor só aceita itens `{name, type, value}` e o objeto vira vazio.
200
246
  - Lista fechada de chaves do `item_details` (outras são descartadas em silêncio): title, description, status,
201
- reason, win_reason, loss_reason, attributed_to, duplicated_from_id, priority, value, currency,
202
- custom_attributes, offers, closed_offers, closed_offer, deadline_at, scheduling_type, scheduled_at,
203
- conversation_id, automations, notes.
247
+ reason, win_reason, loss_reason, attributed_to, co_attributed_to (13/10/2026, ver "Co-participante da venda"),
248
+ duplicated_from_id, priority, value, currency, custom_attributes, offers, closed_offers, closed_offer, deadline_at,
249
+ scheduling_type, scheduled_at, conversation_id, automations, notes.
204
250
  - Para mudar UM campo sem reenviar a lista, as ações de automação/macro `update_card_attribute`
205
251
  (`[{funnel_id, attribute_key: "<nome do campo>", value}]`) mexem só naquela entrada.
206
252
 
@@ -284,6 +330,10 @@ Log automático de eventos do card:
284
330
 
285
331
  Tipos comuns: `created`, `stage_changed`, `agent_assigned`, `agent_removed`, `note_added`, `value_changed`, `priority_changed`, `archived`.
286
332
 
333
+ Desde 11/10/2026 também `item_snoozed` (o card foi adiado — leva `snoozed_until`) e `item_unsnoozed` (o card adiado
334
+ abriu — leva `reason`: `person` = alguém abriu, `automation` = automação, macro ou fluxo, `due` = chegou a data; e a
335
+ data que estava marcada).
336
+
287
337
  Quem fez: `by_user_id`/`user` traz a pessoa; ação de automação ou flow vem com o nome da regra/fluxo;
288
338
  ação da IA (desde 21/08/2026 — entra com o próximo deploy do app depois de 21/08/2026) vem como
289
339
  `"IA: <nome do assistente>"` com `id` nulo — antes saía sem autor. Ao explicar um histórico de card,
@@ -503,7 +553,7 @@ PUT /api/v1/accounts/43/funnels/43
503
553
  | trigger_type | trigger_value |
504
554
  |---|---|
505
555
  | `card_created` | `"card_created"` (literal — NUNCA vazio) |
506
- | `status_change` | `"won"` ou `"lost"` |
556
+ | `status_change` | `"won"`, `"lost"` ou `"snoozed"` (desde 11/10/2026: roda quando o card é ADIADO; trocar a data de um card já adiado NÃO roda de novo). NÃO existe `"open"` aqui |
507
557
  | `stage_moved` | chave da etapa de DESTINO no hash `funnel.stages` (ex. `"agendar_instalacao"` — a chave, NÃO o campo `id` interno) |
508
558
 
509
559
  **Ações (`action` + `action_config`):**
@@ -518,6 +568,7 @@ PUT /api/v1/accounts/43/funnels/43
518
568
  | `send_webhook` | `{webhook_url}` | POST com payload completo do card (fire-and-forget) |
519
569
  | `apply_checklist_template` | `{template_id}` | Template de `kanban_config.checklist_templates`; aditivo (appenda) — cada aplicação vira um grupo (carimba `group_id`/`group_name` nos itens) |
520
570
  | `update_checklist` | `{checklist_updates: [{checklist_item_id, completed, text}]}` | Não aparece na UI — só via API |
571
+ | `create_task` (20/10/2026) | `{title, description?, task_type, agenda_id?, priority?, occupies_agenda?, due: {amount, unit: 'hours'\|'days', at?: 'HH:MM', business_days?: true}, responsible: {mode: 'card_owner'\|'fixed'\|'funnel_rotation'\|'team_rotation', fallback_user_id (card_owner), user_id (fixed), team_id (team_rotation)}}` | Cria uma tarefa COMUM da Agenda presa ao card (ver "Tarefa automática do card" abaixo). Exige a Agenda unificada ligada na conta |
521
572
 
522
573
  **Regras críticas (gravar diferente disso = automação perdida ou morta):**
523
574
 
@@ -528,6 +579,32 @@ PUT /api/v1/accounts/43/funnels/43
528
579
 
529
580
  Use para: "ao ganhar um card de Vendas → criar automaticamente em Pós-Venda na etapa Agendar Instalação" (`status_change`/`won` + `duplicate_item`).
530
581
 
582
+ #### Tarefa automática do card — ação `create_task` (20/10/2026)
583
+
584
+ - `title` é obrigatório (texto; aceita variáveis do card). `task_type`: um dos 7 de fábrica ou um tipo ativo da conta.
585
+ `agenda_id` nulo = a agenda padrão da conta. `priority`: `none|low|medium|high|urgent`.
586
+ - **Prazo (`due`)**: `unit: 'hours'` aceita `amount` de 1 a 720; `unit: 'days'` aceita 0 a 365, com `at` ("HH:MM") e
587
+ `business_days: true` (dias úteis) **só em dias**. Dia útil = segunda a sexta **sem feriado de dia inteiro** da agenda
588
+ da tarefa (feriado de meio período não conta). O fuso é o da agenda da tarefa. Prazo que já passou nasce atrasado,
589
+ nunca é empurrado.
590
+ - **Responsável (`responsible.mode`)**: `card_owner` (primeiro responsável do card; senão o da conversa; senão a reserva `fallback_user_id`,
591
+ obrigatória), `fixed` (exige `user_id`), `funnel_rotation` (rodízio de quem acessa o funil) e `team_rotation` (exige
592
+ `team_id`).
593
+ - **Formato conferido no Salvar**: regra `create_task` NOVA ou alterada é conferida uma a uma; regra torta recebe 422 que
594
+ diz a posição da regra e o campo a consertar, e as demais regras do funil não são afetadas.
595
+ - **Uma tarefa por acontecimento** (repetir o gatilho do mesmo acontecimento não duplica). Card importado por planilha
596
+ não cria; card importado e movido depois por uma pessoa cria.
597
+ - A tarefa nasce **presa ao card** (campo `kanban_item_id` da tarefa; `occupies_agenda` diz se ela bloqueia o horário).
598
+ Ao **excluir o card** (`lionchat_kanban_items_destroy`), só é apagada a tarefa presa a ESTE card que seja
599
+ SIMPLES: sem conversa, sem contato, sem agendamento, sem sessão de programa, sem anexo, que não veio do Google
600
+ Agenda e que não é somente leitura. Toda outra tarefa presa ao card apenas se SOLTA (continua na agenda, na
601
+ conversa e no contato), e a tarefa que só aponta para o card por `linked_kanban_item_id` também só se solta.
602
+ **A tarefa AUTOMÁTICA de um card que TEM conversa grava a conversa** (o servidor associa a conversa do card à
603
+ tarefa), portanto NÃO é "simples": ao excluir esse card ela sobrevive e fica na conversa. Só a tarefa automática
604
+ de card SEM conversa morre com o card. Conversa e contato nunca são apagados. Antes de excluir, avise o usuário
605
+ de que as tarefas simples presas ao card também somem.
606
+ - Excluir etapa com `remove_stage` **não** dispara esta ação (nem nenhuma outra); `migrate_stage` dispara.
607
+
531
608
  ### Sistema 2: AutomationRule global — eventos da conta
532
609
 
533
610
  `AutomationRule` é o motor geral da conta (mensagens, contatos, conversas, e também eventos Kanban). Bem mais genérico, com sistema completo de condições/ações.
@@ -647,6 +724,9 @@ Cada card pode receber atributos custom de 3 origens diferentes. **A escolha do
647
724
  `funnel_stage` com o slug que aparece em `kanban_items_show` e compare com `funnels_show`.
648
725
  3. `position` está faltando? (cards sem position vão pro fim)
649
726
  4. Está em outro funil? (mover entre funis muda `funnel_id`)
727
+ 5. Está **adiado**? (desde 11/10/2026) Card adiado sai da coluna e só aparece com o botão **Adiados** ligado no topo
728
+ do quadro. Confira `effective_status`/`snoozed_until` em `lionchat_kanban_items_show`: ele volta sozinho na data, ou
729
+ abra agora com `lionchat_kanban_items_unsnooze`. Ver "Card adiado" abaixo.
650
730
 
651
731
  ## Diagnóstico: "Valor do pipeline errado"
652
732
 
@@ -747,3 +827,77 @@ com o `retroativo_em` certo.
747
827
 
748
828
  A hora é montada em **UTC**, com o horário atual no dia escolhido. É o mesmo motivo do diagnóstico
749
829
  acima: o relatório compara o carimbo como texto, então a data escolhida tem que ser a data contada.
830
+
831
+ ## Card adiado — "Adiar até" (2026-10-11)
832
+
833
+ O card ganha uma situação a mais: **Adiado** — "este negócio só volta a importar no dia X". Ele sai da coluna e, na
834
+ data marcada, **abre sozinho** e volta para a coluna (disparando o fluxo "Card aberto", se houver).
835
+
836
+ | Regra | Detalhe |
837
+ |---|---|
838
+ | O que é | Situação **do card**, não da conversa. Mensagem do cliente NÃO abre o card; adiar o card não mexe na conversa. |
839
+ | Como fica gravado | `item_details.status` **continua `open`** — o adiamento mora numa tabela à parte (`kanban_item_snoozes`). Por isso o aplicativo de celular, os webhooks do cliente e a IA de atendimento continuam vendo `open`/`won`/`lost`. Para saber se está adiado, leia `effective_status` (`snoozed`) e `snoozed_until`. |
840
+ | Quem pode | Quem pode editar o card. Só card **aberto** pode ser adiado (ganho/perdido = 422). |
841
+ | Data | Pelo menos **1 hora** à frente (menos que isso = 422). Sem prazo máximo. Adiar um card já adiado **troca a data**. |
842
+ | O que NÃO encerra | Mover de etapa ou de funil, editar, nota, tarefa, responsável. |
843
+ | O que encerra | Marcar **ganho** ou **perdido** (por qualquer caminho); **abrir** de propósito (`lionchat_kanban_items_unsnooze`, `lionchat_kanban_items_create_2` com `status: "open"`, ação "Aberto" de automação/macro/fluxo); e a chegada da data. |
844
+ | `status: "open"` no `lionchat_kanban_items_update` | **NÃO abre** card adiado (é o mesmo salvar que o aplicativo faz o tempo todo). Para abrir, use `lionchat_kanban_items_unsnooze` ou o `change_status`. |
845
+ | Na data | O sistema abre o card numa rodada de até ~5 minutos depois da hora e dispara "Card aberto" **uma vez por card**. Esse fluxo entra na fila de disparos agendados: depois dos lembretes de consulta e, em caixa QR Code, no ritmo da caixa (um lote grande que vence junto sai aos poucos). |
846
+ | "Criar card" acha um adiado | Trata como card que **já existe**: não cria outro, move se a etapa for diferente e **não muda a situação** (continua adiado). Vale para automação, macro, fluxo e IA. |
847
+
848
+ **Ferramentas:**
849
+ - `lionchat_kanban_items_snooze` — `POST .../kanban_items/{id}/snooze` com `snoozed_until`.
850
+ - `lionchat_kanban_items_unsnooze` — `DELETE .../kanban_items/{id}/snooze` (abre agora e dispara "Card aberto").
851
+ - Automações de dentro do funil (`settings.automations`): gatilho `status_change` com `trigger_value: "snoozed"`
852
+ ("Adiado" na tela do funil) roda quando o card passa de aberto para adiado.
853
+ - Automação e macro: ação `snooze_kanban_item` — `[{"funnel_id": 31, "amount": 3, "unit": "days"}]` (`unit` `hours`
854
+ ou `days`; `amount` inteiro, 1 ou mais). Em regra de evento de CARD basta `[{"amount": 3, "unit": "days"}]` (o card
855
+ é o do evento). Diferente das outras ações de card, ela **falha visível** quando não dá para adiar (card fechado,
856
+ sem card no funil, tempo inválido) — nunca passa verde sem adiar.
857
+ - Fluxo: ação `snooze_kanban_item`, gatilhos `card_opened` ("Card aberto") e `card_snoozed` ("Card adiado") e
858
+ condição `kanban_snoozed`. Ver o resource do FlowBuilder.
859
+
860
+ **Onde o adiado aparece e como filtrar:**
861
+
862
+ | Lugar | Comportamento |
863
+ |---|---|
864
+ | Quadro (`lionchat_kanban_items_list`) | Sem nenhum `show_*`, a lista traz TODAS as situações (o adiado vem com `status: "open"` e `effective_status: "snoozed"`). Com qualquer `show_*`: `show_open` vale `true` salvo se vier `"false"` (= aberto e **não** adiado) e `show_snoozed=true` inclui os adiados. **Só os adiados:** `show_snoozed=true` **e** `show_open=false`. Esta lista **ignora** `statuses`. |
865
+ | Filtro rico (`lionchat_kanban_items_filter`), exportação e relatório da etapa | `statuses: ["open"]` = aberto e **não** adiado; `statuses: ["snoozed"]` = adiados. |
866
+ | Ficha do contato (`lionchat_contacts_kanban_items_list`) | `status=snoozed` = adiados; `status=open` deixa os adiados de fora. |
867
+ | Busca geral (`lionchat_search_kanban_items`) | `kanban_filters` com `statuses: ["snoozed"]`. |
868
+ | Números | `lionchat_funnels_open_counts` conta aberto e **não** adiado. `lionchat_funnels_stage_report` traz a linha `snoozed` — mas esse relatório SEMPRE aplica os botões de situação com o padrão da tela: sem `show_*` conta só os abertos não adiados e as linhas `won`/`lost`/`snoozed` voltam zeradas (mande `show_won`/`show_lost`/`show_snoozed=true`). No relatório agregado (`lionchat_kanban_items_list_3`), `statusDistribution.open` **continua incluindo** os adiados (é a soma que o aplicativo lê) e `statusDistribution.snoozed` vem ao lado: abertos de verdade = `open − snoozed`. Parados, maiores negócios, ranking e previsão já deixam o adiado de fora. |
869
+ | Histórico do card | `item_snoozed` (com a data) e `item_unsnoozed` (com o motivo). |
870
+
871
+ **Laço de cadência é permitido:** um fluxo "Card aberto" que manda mensagem e adia de novo roda até alguém parar (no
872
+ máximo uma volta por hora por card). Avise o cliente antes de montar. **Abrir à mão também dispara "Card aberto"**: se o
873
+ fluxo manda mensagem, o cliente recebe na hora.
874
+
875
+ ## Co-participante da venda (vendedor + SDR) — 2026-10-13
876
+
877
+ No ganho, além do vendedor (`attributed_to`, "Atribuir ganho a"), dá para marcar **UM co-participante** — ex.: o SDR
878
+ que trouxe a venda. A venda conta INTEIRA para o vendedor; o co-participante tem números próprios no relatório.
879
+ Marcar alguém como co-participante **não dá acesso ao card** nem o põe como responsável.
880
+
881
+ **Como gravar:**
882
+ - Junto com o ganho: `lionchat_kanban_items_create_2` (`change_status`) com `status: "won"` e `co_attributed_to: <id do
883
+ agente>`. Fora de `won` o parâmetro é ignorado.
884
+ - Depois, num card JÁ ganho: `lionchat_kanban_items_update` com `kanban_item.item_details.co_attributed_to`. Para tirar,
885
+ mande `null`.
886
+ - Mande SÓ o id (número). O nome (`co_attributed_name`) o próprio card preenche — nunca envie.
887
+ - Objeto ou lista no lugar do id = 422 antes de gravar.
888
+
889
+ **Recusas (422, com `error` legível):** id que não é número; pessoa que não é membro da conta; o próprio vendedor do
890
+ card; pessoa sem acesso ao funil (vale: funil sem lista de agentes, agente da lista do funil ou dos times dele,
891
+ administrador, ou quem já é responsável do card). A conferência só roda quando o valor MUDA — quem perdeu o acesso
892
+ depois não trava outro salvamento.
893
+
894
+ **O que mais saber:**
895
+ - Reabrir ou marcar como perdido **apaga** o co-participante (o campo só existe em card ganho).
896
+ - A ação "marcar como ganho" de fluxo, automação e macro NÃO marca co-participante (decisão do dono): ganho por ação
897
+ nasce sem ele, que entra depois pela tela, por `lionchat_kanban_items_update` ou pela planilha de "Importar vendas"
898
+ (coluna de co-participante, por nome ou e-mail).
899
+ - Duplicar o card não copia o co-participante.
900
+ - Histórico: marcado junto com o ganho vai dentro do registro da mudança de status; marcado depois gera
901
+ `co_participant_changed` (antes e depois, com nome e quem marcou).
902
+ - Números: `coParticipantRanking`, `sharedSalesSummary`/`sharedSalesBySeller` (com `include_shared_sales=true`) no
903
+ relatório agregado e a lista `lionchat_kanban_items_shared_sales` — ver `lionchat://docs/filtros-e-relatorios` §4.
@@ -155,7 +155,8 @@ conversa antiga que NÃO aparece no relatório de hoje (régua antiga por criaç
155
155
  | "retrospectiva do ano" | `lionchat_reports_list_15` |
156
156
  | "satisfação", "CSAT", "nota dos clientes" | `lionchat_csat_metrics` |
157
157
  | "SLA", "cumprimento de prazo" (se a conta tiver Enterprise) | `lionchat_sla_metrics` |
158
- | "quantos agendamentos", "taxa de comparecimento", "agendamentos por tipo/atendente" | `lionchat_booking_reports` (ver "Agendamentos" no fim deste guia) |
158
+ | "quantos agendamentos", "taxa de comparecimento", "agendamentos por tipo/atendente" | `lionchat_booking_reports` (ver "Agendamentos" no fim deste guia). Conta sem Booking (relatório zerado, compromissos marcados à mão na Agenda): `source=agenda` |
159
+ | "vendas com SDR", "comissão dividida", "quanto cada SDR trouxe", "vendas sozinho x compartilhadas" | `lionchat_kanban_items_list_3` (`coParticipantRanking`; `include_shared_sales=true` para o quadro) e a lista `lionchat_kanban_items_shared_sales` — ver `lionchat://docs/filtros-e-relatorios` §4 |
159
160
 
160
161
  ---
161
162
 
@@ -523,7 +524,9 @@ mesma conta misturar duas lojas e não bater com o relatório da Meta. Com qualq
523
524
  `orphan_leads` (leads sem conversa ainda), `unique_leads` (deduplicados por TELEFONE),
524
525
  `won_leads` (leads em cards de estágio de Ganho) e `conversion_rate`.
525
526
  - `unclassified` — `{conversations, won, conversion_rate}` das conversas SEM origem (entram em `totals` mas nao em `by_platform`;
526
- a venda de uma conversa iniciada pela propria empresa mora aqui).
527
+ a venda de uma conversa iniciada pela propria empresa mora aqui). Desde 16/10/2026 a conversa criada pelo nosso
528
+ lado (automação, fluxo, formulário) nasce com a origem que a ficha do contato já tinha; antes ela caía aqui
529
+ até o cliente responder. Vale só de hoje pra frente: as conversas antigas nesse caso continuam sem origem.
527
530
  - Arrays de quebra: `by_platform`, `by_kind`, `by_campaign`, `by_adset`, `by_creative`. Cada linha
528
531
  tem `{value, conversations, won, conversion_rate}`.
529
532
 
@@ -868,6 +871,12 @@ Resposta: `totals` (`total`, `pending`, `completed`, `cancelled`, `snoozed`, `at
868
871
  `attendance_rate`, `attendance_basis`), `timeline`, `by_event_type`, `by_agent`, `by_origin` e
869
872
  `treatments`.
870
873
 
874
+ - **`source=agenda`** (14/10): troca a fonte para os compromissos marcados À MÃO na Agenda, sem
875
+ Booking — ligação, reunião, videochamada e tipos da conta (tarefa comum e evento do Google ficam
876
+ fora). Use quando a conta não usa Booking e o relatório normal vem zerado. Nessa opção o tipo vai em
877
+ `task_type` (não `event_type_id`; a lista vem em `appointment_types`), `by_agent` conta pelos
878
+ responsáveis (quem tem dois aparece nas duas linhas, os totais contam uma vez), `by_origin` vem vazio
879
+ e `treatments` vem nulo.
871
880
  - **`attended` / `no_show`** (15/09) são as marcas Compareceu/Faltou do compromisso
872
881
  (`account_tasks.attendance`), um eixo próprio: **não mudam a situação** — compromisso "faltou"
873
882
  continua `pending` até alguém concluir ou cancelar, igual a Agenda mostra.
@@ -191,8 +191,26 @@ Feature flag específica (ex: `feature_kanban`, `feature_captain`) está OFF.
191
191
 
192
192
  ### KanbanItem
193
193
  - `"STAGE_HAS_ITEMS"` (no `funnels_update`) — você tentou remover uma etapa que ainda tem card;
194
- `stages` na resposta diz quantos. Mova com `migrate_stage` antes. (Card criado em etapa
195
- inexistente NÃO dá erro: é redirecionado — confira o `funnel_stage` devolvido.)
194
+ `stages` na resposta diz quantos. **Para excluir a etapa, use `lionchat_funnels_remove_stage`** (move os cards
195
+ em silêncio e apaga a etapa; repita a chamada com `confirm: true` até `done: true`; ver "Excluir etapa" no
196
+ `kanban-deep-dive.md`). Não use `migrate_stage` para isso: ele só move os cards (disparando automações) e não
197
+ exclui a etapa. (Card criado em etapa inexistente NÃO dá erro: é redirecionado — confira o `funnel_stage`
198
+ devolvido.)
199
+ - **`401` em `lionchat_funnels_create_2` (`migrate_stage`) ou `lionchat_funnels_remove_stage`** — o usuário não é
200
+ administrador e não tem a permissão "gerenciar funis". Não repita nem tente outro caminho: diga ao usuário
201
+ que precisa dessa permissão (ou de um administrador) para mover etapa inteira ou excluir etapa.
202
+ - **`409 STAGE_REMOVAL_IN_PROGRESS`** (`remove_stage`) — outra pessoa está excluindo a mesma etapa agora. Avise
203
+ "outra pessoa está excluindo esta etapa" (com `holder_name`, se vier) e pare; não repita. O mesmo vale para
204
+ `200 {done: false, reason: "assumido"}` no meio da exclusão.
205
+ - **`409 FUNNEL_BUSY`** (`funnels_update`) — o funil está sendo alterado agora (outra pessoa ou
206
+ uma exclusão de etapa). Espere alguns instantes e repita o Salvar.
207
+ - **`remove_stage` devolve `done: false`** — leia `reason`: `tempo` repita agora; `travado`/`faxina` espere
208
+ ~30 s e repita; `destino_excluido` pergunte outro destino ao usuário; `assumido` avise e pare. Duas respostas
209
+ seguidas com `moved: 0` e `done: false` = algo preso: pare e avise. `remaining` nulo não é erro;
210
+ 100001 significa "mais de 100 mil".
211
+ - **422 em `lionchat_tasks_update` (ou `_create`) com `kanban_item_id`** — a tarefa é um agendamento, uma sessão
212
+ de programa ou um evento do Google, que não podem ser presos a um card; ou o card não existe, é de outra
213
+ conta ou a pessoa não o enxerga. Só tarefa comum se prende a card.
196
214
  - `"conversation_display_id must exist"` — conversa não existe ou foi deletada
197
215
  - `"position must be a positive integer"` — não pode ser negativo
198
216
 
package/dist/tools.js CHANGED
@@ -359,7 +359,7 @@ function registerListCategoriesTool(server, allEndpoints) {
359
359
  // Helps LLMs build correct flow_data without hitting trial-and-error on
360
360
  // node types, action keys, source handles, etc.
361
361
  function registerFlowsSchemaReferenceTool(server) {
362
- const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-09-29)
362
+ const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-10-20)
363
363
 
364
364
  flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
365
365
 
@@ -373,12 +373,12 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
373
373
  - ai_tool: ferramenta que o AI Agente invoca. Criar via lionchat_flow_tools_create (NAO flows_create!),
374
374
  com tool_name (snake_case, max 50) + tool_description (max 500). SEM inbox_ids. No 'end' OBRIGATORIO.
375
375
  Nodes permitidos em ai_tool: start, end, api, condition, set_variable, ai, randomizer, action,
376
- send_message, note (SEM wait, wait_response, update_group). No action de ai_tool NAO use keys da
377
- aba Sistema (send_webhook/start_flow/send_conversion). Vincular ao assistente: POST /flow_tools/{id}/assistants.
376
+ send_message, note (SEM wait, wait_response, update_group, ai_call). No action de ai_tool NAO use keys da
377
+ aba Sistema (send_webhook/start_flow/send_conversion) nem create_account_task. Vincular ao assistente: POST /flow_tools/{id}/assistants.
378
378
  Testar: POST /flow_tools/{id}/run.
379
379
  - action (Fluxo de Acoes, 17/09/2026): NAO pertence a caixa nenhuma e roda em QUALQUER conversa de
380
380
  QUALQUER caixa — inclusive grupo. So executa acoes: NAO pode ter send_message, wait_response,
381
- update_group nem end (a validacao recusa o save inteiro com "contains node types not allowed in
381
+ update_group, ai_call nem end (a validacao recusa o save inteiro com "contains node types not allowed in
382
382
  action flow"). Nodes permitidos: start, action, condition, wait, randomizer, api, ai,
383
383
  set_variable, note. Criar via lionchat_flows_create com flow_type:'action', SEM inbox_ids e SEM
384
384
  conversation_mode (o backend fixa 'individual'). Aceita os MESMOS gatilhos do conversation e roda
@@ -396,7 +396,7 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
396
396
  e viaja no snapshot de versao; ferramenta que ja existe nao muda de comportamento.
397
397
 
398
398
  ═══ NODE GERAL ═══
399
- { "id": "string-unico", "type": "start|send_message|wait_response|condition|action|api|set_variable|wait|randomizer|update_group|ai|end|note", "position": {"x":0,"y":0}, "data": { ... } }
399
+ { "id": "string-unico", "type": "start|send_message|wait_response|condition|action|api|set_variable|wait|randomizer|update_group|ai_call|ai|end|note", "position": {"x":0,"y":0}, "data": { ... } }
400
400
  (activate_flow existe como node LEGADO — nao crie novos; use action start_flow)
401
401
 
402
402
  ═══ NODE TYPES + source handles ═══
@@ -555,10 +555,19 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
555
555
  date_trigger; para disparo em lote, campaign_trigger + Campanha de Fluxo.
556
556
  team_changed ({team_ids:[] de STRINGS, vazio = qualquer equipe}), assignee_changed ({agent_ids:[]
557
557
  STRINGS, vazio = qualquer atendente}), card_won/card_lost ({funnel_ids:[] STRINGS} — disparam SO quando
558
- o STATUS do card vira ganho/perdido, nunca por etapa com esse nome). page_track (LionTrack, so flow
558
+ o STATUS do card vira ganho/perdido, nunca por etapa com esse nome).
559
+ card_opened/card_snoozed (NOVOS 11/10/2026, mesma config {funnel_ids:[] STRINGS}): card_snoozed = o card
560
+ foi ADIADO; card_opened = um card adiado ABRIU (pela data, por alguem ou por automacao) ou um card
561
+ ganho/perdido foi REABERTO — card NOVO nao dispara (isso e card_created). Pela data o fluxo sai pela fila
562
+ de disparos agendados (depois dos lembretes; em caixa QR Code no ritmo da caixa), uma vez por card;
563
+ {{trigger.kanban.previous_status}} (snoozed/won/lost) separa os casos. page_track (LionTrack, so flow
559
564
  individual): {track_type:'visited_page'|'event_fired', urls:[...], operator:'contains'|'exact'|
560
565
  'starts_with', event_names:[...], event_operator:'equals'|'contains', cooldown_hours (default 24,
561
566
  minimo 1 — nao re-dispara pro mesmo contato dentro da janela)}.
567
+ whatsapp_form_answered (NOVO 17/10/2026): o cliente RESPONDEU um Formulario do WhatsApp (formulario nativo
568
+ da Meta, ferramenta whatsapp_forms_list). Config {whatsapp_form_id: '<id do NOSSO formulario, STRING>'} —
569
+ vazio/ausente = qualquer formulario. Dispara na conversa da resposta, DEPOIS do "Salvar em" do formulario
570
+ (o fluxo ja le o dado gravado); repetir o processamento nao abre o fluxo duas vezes.
562
571
  NOVO message_sent (2026-06-11): par do message_received pra mensagens de
563
572
  SAIDA (atendente, celular/eco, IA — nota privada NAO) com keywords+match_type; cuidado: acao
564
573
  'desativar IA' com esse trigger sem keywords = a propria resposta da IA dispara o flow.
@@ -682,6 +691,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
682
691
  salvar o flow pela tela nesse estado, a regra e PERDIDA. (Excecoes que nao usam field/valueType
683
692
  "variable": regras por attr_key/attrSource="attr_config", business_hours, can_reply, sla_check,
684
693
  kanban_*, conversation_has_agent/no_agent, pagetrack_*.)
694
+ EMPRESA DO CONTATO (NOVO 16/10 — card "Atributo da empresa", so com o modulo Empresas): regra
695
+ { id, valueType:'attr_config', attrSource:'company', attr_key, operator, value:'', values:[...] }.
696
+ attr_key = chave do campo PERSONALIZADO da empresa OU cadastro com prefixo: company.name,
697
+ company.legal_name, company.cnpj (comparado so por digitos), company.phone, company.email,
698
+ company.address.city, company.address.state. Empresa = a do contato da conversa (no maximo UMA).
699
+ Contato sem empresa = valor vazio (not_equal/is_empty casam). Modulo desligado = NUNCA casa, nem a
700
+ negativa. attrSource fora de contact/conversation/card/company NAO casa. Variaveis da empresa em
701
+ mensagem: {{contact.company.name}} ... {{contact.company.custom_attribute.<chave>}}.
685
702
  ORIGEM / CAMPANHA (NOVO 01/09 — preset "Atributo de campanha" da tela): regra de atributo da CONVERSA:
686
703
  { id, valueType:'attr_config', attrSource:'conversation', attrScope:'campaign', attr_key:'origin_kind',
687
704
  operator:'equal', value:'', values:['paid_ad'] }
@@ -703,7 +720,7 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
703
720
  Chaves de campanha: origin_kind, origin_platform, origin_first_kind/_platform, origin_last_kind/_platform,
704
721
  ctwa_* (anuncio click-to-WhatsApp: ctwa_ad_id, ctwa_ad_title, ctwa_campaign_name, ctwa_adset_name...),
705
722
  meta_lead_* (formulario Meta Lead Ads), lt_* (LionTrack: UTMs, pagina, dispositivo). Lista real:
706
- lionchat_custom_attributes_list {attribute_model:'conversation', include_system:true}.
723
+ lionchat_custom_attributes_list {attribute_model:'conversation_attribute', include_system:true} (com o sufixo: so 'conversation' devolve lista VAZIA).
707
724
  VALORES FECHADOS de origin_kind (e first/last): paid_ad (Anuncio), lead_form (Formulario), organic
708
725
  (Organico), direct (Direto), referral (Indicacao), manual (Origem cadastrada) — compara pelo VALOR, nunca
709
726
  pelo rotulo ("Anuncio" nunca casa). origin_platform: facebook, instagram, google, tiktok, linkedin, youtube,
@@ -745,13 +762,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
745
762
  field JUNTOS — conversa usa field '{{conversation.label}}', contato usa '{{contact.label}}';
746
763
  a tela reabre a regra casando o par, e condicao escrita so com operator roda certa mas
747
764
  APARECE errada pro cliente. Mesma regra vale pros pares kanban_exists/kanban_in_stage
748
- (fields '_kanban_check'/'_kanban_stage'), kanban_won/kanban_lost (field '_kanban_status') e
765
+ (fields '_kanban_check'/'_kanban_stage'), kanban_won/kanban_lost/kanban_snoozed (field '_kanban_status') e
749
766
  resposta do cliente/do atendente (fields '{{last_response}}'/'{{last_agent_response}}')),
750
- kanban_exists/kanban_in_stage/kanban_won/kanban_lost (funnel_id e CHAVE SEPARADA da condicao,
767
+ kanban_exists/kanban_in_stage/kanban_won/kanban_lost/kanban_snoozed (funnel_id e CHAVE SEPARADA da condicao,
751
768
  numero ex funnel_id:37; a etapa vai em value=slug puro ex value:"avaliacao_aceita" ou em stage,
752
769
  NAO no formato "37:etapa"), pagetrack_visited/pagetrack_event,
753
770
  Desde 20/08 as 4 condicoes kanban_* enxergam o card da conversa ATUAL ou o card cuja conversa de
754
771
  ORIGEM e a atual (card religado pra conversa mais nova) — antes "nao tem card" na conversa velha.
772
+ kanban_snoozed (NOVO 11/10/2026) = o card esta ADIADO naquele funil; nao existe condicao "card aberto".
755
773
  sla_check (SO value, codigo fixo: frt_breached/frt_ok/nrt_breached/nrt_ok/rt_breached/rt_ok/has_sla/no_sla;
756
774
  frt=primeira resp, nrt=proxima, rt=resolucao; _ok exige politica de SLA aplicada),
757
775
  signature_status (NOVO 2026-09-14 — aba "Contrato" da tela; SO value, codigo fixo:
@@ -817,7 +835,12 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
817
835
  — funnel_id e funnel_stage OBRIGATORIOS; title/description aceitam {{ }},
818
836
  move_kanban_stage({funnel_id,funnel_stage}), set_kanban_item_status({status:won|lost|active}),
819
837
  set_won({}), set_lost({reason?}), add_card_note({text}),
820
- set_open({}) — reabre card ganho/perdido (status open; nao mexe nos responsaveis),
838
+ set_open({}) — reabre card ganho/perdido (status open; nao mexe nos responsaveis); num card ADIADO
839
+ abre o card na hora e dispara "Card aberto" (desde 11/10/2026),
840
+ snooze_kanban_item({funnel_id, amount, unit:'hours'|'days', card_source?}) — NOVO 11/10/2026: ADIA o card
841
+ por N horas ou dias a partir da execucao (amount inteiro >= 1; minimo 1 hora); so card aberto; adiar de
842
+ novo troca a data. Card ganho/perdido, sem card no funil ou card_source 'trigger' em fluxo que nao veio
843
+ de card = ERRO visivel no passo (nunca pulado, ao contrario das irmas de card),
821
844
  // title/description de create_kanban_item e text de add_card_note resolvem pelo resolvedor do
822
845
  // FLUXO desde 20/08: {{conversation.id}} = numero da tela e variaveis da sessao valem ali
823
846
  assign_agent_card({agent_id, mode?}) — RESPONSAVEL DO CARD. mode (NOVO 2026-07-28):
@@ -838,6 +861,24 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
838
861
  evento, sem laco). 'cancelled' cancela o AGENDAMENTO (desarma lembrete, mata o link de gerenciar).
839
862
  Origem gravada = 'fluxo', ator = o proprio flow. Sem 'remarcado'/'adiado'/'nao confirmado': o bloco NAO
840
863
  mexe em data.
864
+ Tarefa (aba Agenda; exige a Agenda unificada ligada na conta; NAO roda em fluxo ai_tool nem em fluxo de grupo —
865
+ o save aceita, o motor recusa com ERRO visivel no passo e a tela esconde o item):
866
+ create_account_task({title, description?, task_type, agenda_id?, priority?, occupies_agenda?,
867
+ due:{amount, unit:'hours'|'days', at?:'HH:MM', business_days?:true},
868
+ responsible:{mode:'card_owner'|'fixed'|'funnel_rotation'|'team_rotation', user_id?, team_id?, fallback_user_id?},
869
+ card_source:'funnel'|'trigger', funnel_id?}) — NOVO 20/10/2026 ("Criar tarefa"): cria uma tarefa COMUM da
870
+ Agenda presa ao card do fluxo (ou so a conversa, se nao houver card). Os campos de title a occupies_agenda
871
+ sao os MESMOS da acao create_task do funil (settings.automations): title obrigatorio; due em horas (1 a 720)
872
+ ou dias (0 a 365; at e business_days SO em dias; dia util = segunda a sexta sem feriado de DIA INTEIRO da
873
+ agenda da tarefa); responsible.mode exige a chave do modo (card_owner -> fallback_user_id; fixed -> user_id;
874
+ team_rotation -> team_id; funnel_rotation nenhuma no save, mas SEM card cai em fallback_user_id,
875
+ e sem ele a tarefa nao nasce). card_source 'trigger' = o card que INICIOU o fluxo (fluxo
876
+ que nao veio de card = ERRO); 'funnel' (padrao da tela) = o card DESTA conversa no funil funnel_id
877
+ (OBRIGATORIO neste modo; funil ausente ou inexistente = erro; conversa sem card naquele funil = tarefa so na
878
+ conversa, passo verde "sem card"). Regra torta = passo VERMELHO com o campo a consertar. Uma tarefa por
879
+ PASSAGEM do bloco (repeticao do mesmo passo nao duplica). Freio de 1 tarefa por segundo por conta (passo com
880
+ vaga futura fica verde "nasce as HH:MM:SS"). Quem agendou = o Fluxo (booking_source 'fluxo'); o historico do
881
+ card diz "Fluxo X criou uma tarefa ..." / "Fluxo X nao criou a tarefa: motivo".
841
882
  Sistema (SO flow conversation e flow action): send_webhook({url,headers?,body?}), start_flow({flow_id}
842
883
  — flow_id tem que ser de OUTRO flow: apontar pro proprio flow e aceito no save mas IGNORADO
843
884
  EM SILENCIO na execucao, e o fluxo para ali [2026-08-18].
@@ -879,9 +920,9 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
879
920
  [x]" / "Meta: erro (...)" — o [evento] no fim diz qual nome foi pra cada destino.
880
921
  Falha de um destino nunca derruba o fluxo. Dry-run nao dispara.
881
922
  card_source (acoes de card): 'funnel' (default, acha o card pelo funnel_id) | 'trigger' (usa o card
882
- que DISPAROU o flow em card_created/card_moved/card_won/card_lost). Com 'trigger' o funnel_id e
923
+ que DISPAROU o flow em card_created/card_moved/card_won/card_lost/card_opened/card_snoozed). Com 'trigger' o funnel_id e
883
924
  ignorado — EXCETO create_kanban_item/move_kanban_stage (funil = DESTINO). Vale pra move_kanban_stage,
884
- set_won/set_lost/set_open, assign_agent_card, add_card_note, add_card_checklist, add_card_offer e
925
+ set_won/set_lost/set_open, snooze_kanban_item (sem card-gatilho = ERRO, nao pula), create_account_task (idem: ERRO), assign_agent_card, add_card_note, add_card_checklist, add_card_offer e
885
926
  update_attribute (attr_source:'card').
886
927
  Handles: "success" (sem handle error — falha vira warning e o flow continua).
887
928
 
@@ -967,6 +1008,24 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
967
1008
  Com pesos iguais os dois dao o mesmo resultado.
968
1009
  Handles: o id de cada branch (mode branches); "success" (mode distribute_agents).
969
1010
 
1011
+ ▸ ai_call ("Ligar com IA", 17/10/2026 — so em conta com ai_calling + lioncalls_calling)
1012
+ A IA liga para o TELEFONE DO CONTATO da conversa do fluxo pela linha de ligacao do WhatsApp (LionCalls).
1013
+ data: { aiCallAgentId: <id de lionchat_captain_call_agents_list>, aiCallInboxId: <id de meta.dial_inboxes> }
1014
+ (aiCallAgentName/aiCallInboxName sao opcionais, so pro resumo do card). O que a IA fala, a voz e o TEMPO
1015
+ MAXIMO da ligacao vem do agente de ligacao (max_duration_seconds, 30-600 s): no tempo o motor desliga sozinho.
1016
+ Handles: "answered" (a pessoa atendeu), "no_answer" (nao atendeu ou recusou), "error" (nao deu pra ligar:
1017
+ sem telefone, linha desconectada, agente apagado, linha ocupada por mais de 2 h — o motivo vai no historico).
1018
+ answered/no_answer SEM fio = o fluxo termina ali; error SEM fio = execucao "Falhou".
1019
+ Liga UMA vez (para insistir: outro ai_call depois de "no_answer", com um wait no meio). NUNCA ligue "error"
1020
+ direto em outro ai_call (em alguns erros nao da pra saber se a ligacao saiu). Nao confere horario: use um
1021
+ condition antes. A IA so liga se sobrar uma vaga na linha para uma pessoa; senao espera a vez (fila por
1022
+ ordem de chegada, ate 2 h). O card da ligacao vai para a conversa do lead na caixa da linha.
1023
+ PROIBIDO em flow 'action', em flow de GRUPO e em ai_tool (o save recusa); id de agente/caixa de OUTRA conta
1024
+ tambem e recusado. Agente apagado ou caixa excluida NAO travam o save — falham na execucao.
1025
+ Receita "a IA de atendimento pede a ligacao" (sem ferramenta nova): cenario manda por a etiqueta 'ligar';
1026
+ flow conversation com gatilho label_added 'ligar' -> action remove_conversation_label 'ligar' (LOGO depois
1027
+ do start) -> ai_call.
1028
+
970
1029
  ▸ update_group (Gestao de Grupos WhatsApp — UMA operacao por bloco, 18 operacoes)
971
1030
  Roda em fluxo de QUALQUER canal desde que a conta tenha caixa WhatsApp QR Code (Channel::Waha).
972
1031
  Em flow de GRUPO o campo de caixa e opcional (vazio = caixa da conversa); em flow NAO-grupo
@@ -991,7 +1050,8 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
991
1050
  list_participants -> (groupTargetId) -> id,participants(ate 100; participants_truncated=true se cortou),participants_count
992
1051
  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,no_whatsapp,invited,invite_status [risco de banimento]
993
1052
  mesma correcao do 9o digito do create (21/08). added = quem esta no grupo agora (inclui quem ja estava); ninguem entrou = saida "error" (nobody_changed); parte entrou = "partial"
994
- remove_participants -> groupParticipants(obrig) -> id,removed,not_removed,removed_count,not_removed_count (ninguem saiu = "error"; parte = "partial")
1053
+ DESDE 09/10/2026 reconhece quem o WhatsApp devolve SO com o codigo interno (@lid, sem telefone — o normal para quem ACABOU de ser colocado): antes acusava nobody_changed/not_added com a pessoa DENTRO do grupo (e o create dava "partial" falso). Sem resposta do motor = conta como NAO colocado
1054
+ remove_participants -> groupParticipants(obrig) -> id,removed,not_removed,removed_count,not_removed_count (ninguem saiu = "error"; parte = "partial"; desde 09/10/2026 tambem reconhece quem esta so com o codigo interno — antes dava SUCESSO falso)
995
1055
  promote_admin -> groupParticipants(obrig) -> id,participants
996
1056
  demote_admin -> groupParticipants(obrig) -> id,participants
997
1057
  get_invite -> (groupTargetId) -> id,invite_link
@@ -1013,6 +1073,11 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
1013
1073
  'sem_mensagem'. EFEITO COLATERAL: cada convite entregue vira contato + conversa NOVOS no painel e
1014
1074
  dispara os ouvintes de conversation_created (automacao, outros flows, webhook do cliente, Kanban).
1015
1075
  Toda operacao (menos send_message e send_private_message) tambem devolve {{grupo.ok}} (bool) e {{grupo.error.message}}.
1076
+ HISTORICO (09/10/2026): nas operacoes com groupParticipants o passo do historico (NAO a variavel {{grupo.*}})
1077
+ traz participant_sources: [{number, source (a LINHA do campo de onde o numero saiu), typed (true = digitado,
1078
+ sem variavel), informed? (o numero como foi escrito, quando o WhatsApp usa outra forma), filled_by?/filled_at?
1079
+ (linha que e UM atributo personalizado sozinho: quem gravou e quando)}]. So anotacao: nunca muda o pedido;
1080
+ origem e autor podem faltar, nunca saem errados.
1016
1081
  Handles: "success", "error" + "partial" em create/add_participants/remove_participants (a operacao
1017
1082
  rodou mas nem todo mundo entrou/saiu — listas not_added/not_removed dizem quem). "partial" sem fio
1018
1083
  segue pelo fio "success" (unica saida com esse fallback no motor).
@@ -1038,6 +1103,7 @@ condicao bater, o lead sai do flow NA HORA. Cada item tem "type":
1038
1103
  - Rico por atributo (novo 2026-07-08; REATIVO desde 2026-07-09):
1039
1104
  {type:'attribute_condition', logic:'and'|'or', rules:[{attr_key, attrSource:'contact'|'conversation'
1040
1105
  |'card', operator, value | values:[...], funnel_id?, card_source?}]}.
1106
+ attrSource 'company' NAO vale aqui (so no node condition): a regra de saida nao le a empresa.
1041
1107
  AQUI o attrSource VAI na rule (ao contrario do gatilho de entrada por atributo, onde e implicito).
1042
1108
  Operadores da condition EXCETO is_empty/is_not_empty (removidos do contexto reativo 09/07 — use so
1043
1109
  no node condition); reativa: so reavalia quando o atributo VIGIADO muda; cada rule exige value|values;
@@ -1075,12 +1141,13 @@ trigger.* (variaveis do GATILHO que iniciou o flow — no autocomplete de TODO b
1075
1141
  message_created (gatilho message_received), message_sent, conversation_created, conversation_opened
1076
1142
  (gatilho conversation_reopened), conversation_resolved, label_added, label_removed, team_changed,
1077
1143
  assignee_changed, sla_missed, kanban_item_created/card_created, kanban_item_stage_changed/card_moved,
1078
- card_status_changed (card_won e card_lost — olhe trigger.kind ou o status do card), conversation_
1144
+ card_status_changed (card_won/card_lost/card_opened/card_snoozed — olhe trigger.kanban.status:
1145
+ won/lost/open/snoozed; rotulo "Situacao do card mudou" desde 11/10/2026), conversation_
1079
1146
  attributes_changed, card_attributes_changed, contact_attribute_changed, group_participant_joined/left,
1080
1147
  webhook_received, date_trigger, manual (sidebar), kanban_manual (botao do card), campaign (Campanha de
1081
1148
  Fluxo), page_track, activated_by_flow (fluxo chamou fluxo), lead_form (os 3 gatilhos de formulario —
1082
1149
  trigger.kind diz completed/milestone/abandoned), booking_created/booking_cancelled/booking_rescheduled/
1083
- booking_completed. Compare SEMPRE com esses codigos numa condicao.
1150
+ booking_completed, whatsapp_form_answered. Compare SEMPRE com esses codigos numa condicao.
1084
1151
  trigger.name (rotulo legivel, pra escrever pro cliente), trigger.activated_at (ISO) — desde 20/08
1085
1152
  preenchidas em TODOS os caminhos de disparo (antes so no de evento de conversa).
1086
1153
  trigger.data = o contexto inteiro em JSON (menos type/name/activated_at) — util em node api/ai.
@@ -1095,13 +1162,16 @@ trigger.* (variaveis do GATILHO que iniciou o flow — no autocomplete de TODO b
1095
1162
  Cada uma so tem valor quando o gatilho fornece — fora disso resolve vazio.
1096
1163
  FATOS do gatilho viraram variaveis (08/09/2026, no ar desde 10/09): {{trigger.<bloco>.<campo>}}, so
1097
1164
  quando o Inicio tem o gatilho que os preenche — card_created/card_moved/card_won/card_lost/
1098
- card_attribute_changed: trigger.kanban.title, trigger.kanban.funnel_name, trigger.kanban.stage_name,
1165
+ card_opened/card_snoozed/card_attribute_changed: trigger.kanban.title, trigger.kanban.funnel_name, trigger.kanban.stage_name,
1099
1166
  trigger.kanban.stage (codigo da etapa); card_moved: trigger.kanban.previous_stage_name/previous_stage;
1100
- card_won/card_lost: trigger.kanban.status (won/lost); label_added/label_removed: trigger.label.name;
1167
+ card_won/card_lost/card_opened/card_snoozed: trigger.kanban.status (won/lost/open/snoozed);
1168
+ card_opened: trigger.kanban.previous_status (snoozed = voltou do adiamento; won/lost = reabriram); label_added/label_removed: trigger.label.name;
1101
1169
  assignee_changed: trigger.assignee.name (vazio = responsavel removido); team_changed: trigger.team.name;
1102
1170
  sla_missed: trigger.sla.policy_name/type (frt/nrt/rt); group_participant_joined/left:
1103
1171
  trigger.group.name/id, trigger.participant.phone/name (16/09 — QUEM entrou/saiu, telefone com +;
1104
- nome so se a pessoa ja e contato; evento com varias pessoas = a 1a). Resolvem mas ficam FORA do seletor (produtor unico): trigger.attribute.name/
1172
+ nome so se a pessoa ja e contato; evento com varias pessoas = a 1a); whatsapp_form_answered (17/10):
1173
+ trigger.form.name, trigger.form.id e trigger.form.f_<n> = a resposta de cada pergunta ja em texto (opcao pelo
1174
+ nome, data DD/MM/AAAA, Sim/Nao, "N arquivos: nomes"; codigos em whatsapp_forms_list com with_questions=true). Resolvem mas ficam FORA do seletor (produtor unico): trigger.attribute.name/
1105
1175
  current_value, trigger.form.name/milestone, trigger.payment.gateway/event/product/offer/method/status/
1106
1176
  amount, trigger.eclinica.event/unit/date/time/compromisso/idagenda, trigger.lead.form/page/ad/adset/
1107
1177
  campaign/platform, trigger.dtmf.key/campaign, trigger.reminder.date/time/compromisso/unit/days_before.