@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.
- package/dist/docs/instructions.md +12 -2
- package/dist/docs/resources/agenda-multiplas-unidades.md +62 -2
- package/dist/docs/resources/assinatura-eletronica.md +19 -2
- package/dist/docs/resources/best-practices.md +7 -1
- package/dist/docs/resources/conversation-flows.md +12 -4
- package/dist/docs/resources/data-model.md +143 -2
- package/dist/docs/resources/filtros-e-relatorios.md +31 -2
- package/dist/docs/resources/flowbuilder-design-guide.md +99 -9
- package/dist/docs/resources/flowbuilder-patterns.md +33 -0
- package/dist/docs/resources/formularios-publicos.md +159 -2
- package/dist/docs/resources/glossary.md +23 -0
- package/dist/docs/resources/kanban-deep-dive.md +162 -8
- package/dist/docs/resources/reports-guide.md +11 -2
- package/dist/docs/resources/troubleshooting.md +20 -2
- package/dist/tools.js +88 -18
- package/dist/tools.js.map +1 -1
- package/endpoints.json +1006 -99
- package/package.json +1 -1
|
@@ -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>}`.
|
|
59
|
-
(`POST /funnels/{id}/
|
|
60
|
-
|
|
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,
|
|
202
|
-
custom_attributes, offers, closed_offers, closed_offer, deadline_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 `"
|
|
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.
|
|
195
|
-
|
|
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-
|
|
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).
|
|
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:'
|
|
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
|
-
|
|
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
|
|
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);
|
|
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)
|
|
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.
|