@lionchat/mcp-server 0.5.11 → 0.5.13

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.
@@ -277,7 +277,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
277
277
  | Anexar arquivo a uma mensagem | `lionchat_upload_create` primeiro, depois usar o retorno em `lionchat_conversations_messages_create` | Confira `lionchat_upload_limits` se o arquivo for grande |
278
278
  | Marcar conversa como **lida** | `lionchat_conversations_update_last_seen` | NÃO use `unread` (esse marca como NÃO-lida) |
279
279
  | Criar/gerenciar **campanha** (disparo WhatsApp/SMS) | `lionchat_campaigns_*` (criar, estatísticas) | SEMPRE rode `campaigns_estimate_audience` antes de criar e mostre a contagem. Disparo em massa = confirmação obrigatória (seção 7b) |
280
- | Criar **flow normal** (responde mensagens na caixa) | `lionchat_flows_create` | Ler design-guide antes (seção 11) |
280
+ | Criar **flow normal** (responde mensagens na caixa) | `lionchat_flows_create` | Ler design-guide antes (seção 11). Escolha `conversation_mode`: `individual` (1-a-1, default) ou `group` (grupo WhatsApp — só aqui existe o node `update_group`; sem LionTrack). Imutável após criar |
281
281
  | Criar **ferramenta da IA** (flow que o AI Agente invoca) | `lionchat_flow_tools_create` + vincular com `flow_tools` → assistants | NÃO use `flows_create` pra ai_tool. Nó `end` obrigatório. Teste com `flow_tools_run` antes de vincular |
282
282
  | Ver **ligações de voz do WhatsApp** (histórico, transcrição) | `lionchat_whatsapp_calls_*` | NÃO confundir com `voip_*` (telefonia Zenvia — ramais/saldo). "Ligação no WhatsApp" = whatsapp_calls |
283
283
  | **Jornada do Lead** (por onde o lead navegou no site) | `lionchat_journey_funnel_reports` + fases em `lionchat_liontrack_journey_stages_*` | Janela máx 30 dias; exige feature liontrack |
@@ -291,6 +291,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
291
291
  | Saber se a IA deve TOCAR a ligação WP (Wavoip) / marcar recusada | `lionchat_wavoip_should_ring` / `lionchat_wavoip_flag_rejected` | Controle fino do toque de chamada na caixa QR Code |
292
292
  | Restringir agendas que a IA oferece | `lionchat_captain_assistants_update` (`config.booking_event_type_ids: [Int]`) | binding de agenda por cenário NÃO é settable via API |
293
293
  | Configurar o Copiloto (modelo/temperatura/prompt base) | `lionchat_copilot_settings_update` | admin-only; copiloto tem motor próprio (padrão temp 0.3) |
294
+ | **Resetar/testar do zero a IA** numa conversa | `lionchat_conversations_captain_history_reset` (POST, sem body) | Cria pílula de marco na conversa; a partir dali TODA leitura autônoma da IA (respostas, resumo, follow-up) considera só mensagens pós-marco. Não apaga nada; o atendente segue vendo tudo. Enterprise-only |
294
295
 
295
296
  ## 9. Quando NÃO chamar nenhuma ferramenta
296
297
 
@@ -5,5 +5,5 @@
5
5
  "arguments": [
6
6
  { "name": "goal_hint", "description": "O que o cliente ja disse que quer (ex: 'fluxo de captura de lead')", "required": false }
7
7
  ],
8
- "template": "Cliente quer criar um fluxo no FlowBuilder do LionChat.\n\nObjetivo declarado: {{goal_hint|Nao informado}}\n\nINSTRUCAO: avalie o que o cliente JA disse e o que ainda falta saber. Pergunte SO o que falta. Nao force checklist. Em fluxo simples, 2-3 perguntas bastam. Em fluxo complexo, aprofunde.\n\nABAIXO esta o BANCO de perguntas sugeridas por categoria. ESCOLHA SO AS RELEVANTES.\n\n## Categoria A — Proposito e gatilho (quase sempre necessario)\n- Qual o objetivo do fluxo? (saudacao, qualificacao, captura, suporte, pos-venda, CSAT, agendamento, re-engajamento, outro)\n- Quando dispara? (mensagem recebida com palavra-chave, conversa criada, conversa resolvida, label aplicada, cron, webhook externo)\n- Se palavra-chave: quais palavras? Match exact ou contains?\n\n## Categoria B — Canal e escopo\n- Em qual canal vai rodar? (WAHA, WhatsApp Cloud, Webwidget, Telegram, Email, Twitter, Facebook, Instagram, Line, SMS, API, Voz, WhatsApp Business)\n- Em qual(is) inbox(es) especifica(s)? (peca o ID via inboxes_list se nao soube)\n- Tem filtro de quem entra? (so leads novos, so clientes existentes, so quem tem label X)\n\n## Categoria C — Conteudo da conversa\n- Vai mandar quais mensagens? Texto livre, templates WhatsApp aprovados, midia (imagem/audio/video), lista de botoes interativos?\n- Vai fazer perguntas pro cliente? Quantas? Quais?\n- Para cada pergunta: aceita qualquer resposta livre, opcoes fixas (ex: 1/2/3), ou regex (ex: CPF, email, telefone)?\n- Quanto tempo espera por cada resposta? (default sensato: 30-60 min)\n- O que mandar se nao responder no tempo? (mensagem de timeout, encerrar, escalar pra humano)\n\n## Categoria D — Captura, ramificacao e logica\n- Onde salva as respostas? Em variavel temporaria do flow, atributo da conversa, atributo do contato, custom_attributes\n- Tem ramificacao por condicao? Quais criterios? (ex: 'se valor > 1000 vai pra time premium')\n- Vai chamar API externa? (URL, metodo, headers, body, autenticacao)\n- Vai usar IA (Captain Assistant)? Em que momento? Pra que?\n * generate = gerar resposta natural\n * intent = classificar intencao da mensagem\n * sentiment = analisar sentimento\n * extract = extrair info estruturada (CPF, valor, etc)\n- Tem teste A/B? (randomizer)\n\n## Categoria E — Acoes finais\n- No fim do fluxo: criar card no Kanban? (em qual funil/etapa?) Atribuir agente/time? (ID) Adicionar/remover label? Mudar status/prioridade? Disparar webhook externo?\n- Tem criterio pra encerrar antes? (exit_conditions: ex: 'conversa marcada como resolvida' ou 'label X aplicada')\n\n## Antes de chamar flows_create\n1. Se faltou info CRITICA (ex: canal, gatilho, conteudo basico): pergunte agora\n2. Se a info que falta e mero detalhe: assuma defaults sensatos\n - maxRetries: 3\n - waitTime: 60min para resposta, 30min para timeouts\n - sem ramificacao se cliente nao mencionou\n3. Apresente um RESUMO em linguagem natural do fluxo. Exemplo: 'Beleza, vou criar um fluxo assim: quando alguem mandar oi no WhatsApp, manda saudacao, pergunta se quer vendas/suporte, se vendas atribui ao time 1, se suporte ao time 2. Confirma?'\n4. Espere o cliente confirmar OU pedir ajustes\n5. So depois da confirmacao, chame flows_create\n6. ANTES de gerar o JSON: consulte lionchat://docs/flowbuilder-design-guide pra schema/handles/layout e lionchat://docs/flowbuilder-patterns pra ver se algum template ja resolve\n7. Apos gerar JSON, valide pelo checklist da secao 6 do design guide\n8. NUNCA crie node sem position. NUNCA invente sourceHandle.\n\nDEFAULTS SENSATOS quando cliente nao especificar:\n- channel_type: pergunte sempre, nao chute\n- inbox_ids: pergunte sempre\n- waitTime: 60 minutes\n- maxRetries: 3\n- waitUnit: minutes\n- saveTo: 'attribute' (conversa) na duvida\n- match_mode: 'contains' pra keywords"
8
+ "template": "Cliente quer criar um fluxo no FlowBuilder do LionChat.\n\nObjetivo declarado: {{goal_hint|Nao informado}}\n\nINSTRUCAO: avalie o que o cliente JA disse e o que ainda falta saber. Pergunte SO o que falta. Nao force checklist. Em fluxo simples, 2-3 perguntas bastam. Em fluxo complexo, aprofunde.\n\nABAIXO esta o BANCO de perguntas sugeridas por categoria. ESCOLHA SO AS RELEVANTES.\n\n## Categoria A — Proposito e gatilho (quase sempre necessario)\n- Qual o objetivo do fluxo? (saudacao, qualificacao, captura, suporte, pos-venda, CSAT, agendamento, re-engajamento, outro)\n- Quando dispara? (mensagem recebida com palavra-chave, conversa criada, conversa resolvida, label aplicada, cron, webhook externo)\n- Se palavra-chave: quais palavras? Match exact ou contains?\n\n## Categoria B — Canal e escopo\n- Em qual canal vai rodar? (WAHA, WhatsApp Cloud, Webwidget, Telegram, Email, Twitter, Facebook, Instagram, Line, SMS, API, Voz, WhatsApp Business)\n- Em qual(is) inbox(es) especifica(s)? (peca o ID via inboxes_list se nao soube)\n- Tem filtro de quem entra? (so leads novos, so clientes existentes, so quem tem label X)\n\n## Categoria C — Conteudo da conversa\n- Vai mandar quais mensagens? Texto livre, templates WhatsApp aprovados, midia (imagem/audio/video), lista de botoes interativos?\n- Vai fazer perguntas pro cliente? Quantas? Quais?\n- Para cada pergunta: aceita qualquer resposta livre, opcoes fixas (ex: 1/2/3), ou regex (ex: CPF, email, telefone)?\n- Quanto tempo espera por cada resposta? (default sensato: 30-60 min)\n- O que mandar se nao responder no tempo? (mensagem de timeout, encerrar, escalar pra humano)\n\n## Categoria D — Captura, ramificacao e logica\n- Onde salva as respostas? Em variavel temporaria do flow, atributo da conversa, atributo do contato, custom_attributes\n- Tem ramificacao por condicao? Quais criterios? (ex: 'se valor > 1000 vai pra time premium')\n- Vai chamar API externa? (URL, metodo, headers, body, autenticacao)\n- Vai usar IA (Captain Assistant)? Em que momento? Pra que?\n * generate = gerar resposta natural\n * intent = classificar intencao da mensagem\n * sentiment = analisar sentimento\n * extract = extrair info estruturada (CPF, valor, etc)\n- Tem teste A/B? (randomizer)\n\n## Categoria E — Acoes finais\n- No fim do fluxo: criar card no Kanban? (em qual funil/etapa?) Atribuir agente/time? (ID) Adicionar/remover label? Mudar status/prioridade? Disparar webhook externo?\n- Tem criterio pra encerrar antes? (exit_conditions: ex: 'conversa marcada como resolvida' ou 'label X aplicada')\n\n## Antes de chamar flows_create\n1. Se faltou info CRITICA (ex: canal, gatilho, conteudo basico): pergunte agora\n2. Se a info que falta e mero detalhe: assuma defaults sensatos\n - maxRetries: 3\n - waitTime: 60min para resposta, 30min para timeouts\n - sem ramificacao se cliente nao mencionou\n3. Apresente um RESUMO em linguagem natural do fluxo. Exemplo: 'Beleza, vou criar um fluxo assim: quando alguem mandar oi no WhatsApp, manda saudacao, pergunta se quer vendas/suporte, se vendas atribui ao time 1, se suporte ao time 2. Confirma?'\n4. Espere o cliente confirmar OU pedir ajustes\n5. So depois da confirmacao, chame flows_create\n6. ANTES de gerar o JSON: consulte lionchat://docs/flowbuilder-design-guide pra schema/handles/layout e lionchat://docs/flowbuilder-patterns pra ver se algum template ja resolve\n7. Apos gerar JSON, valide pelo checklist da secao 6 do design guide\n8. NUNCA crie node sem position. NUNCA invente sourceHandle.\n\nDEFAULTS SENSATOS quando cliente nao especificar:\n- channel_type: pergunte sempre, nao chute\n- inbox_ids: pergunte sempre\n- waitTime: 60 minutes\n- maxRetries: 3\n- waitUnit: minutes\n- saveTo: 'conversation_attr' (atributo da conversa) na duvida — NUNCA use 'attribute' (valor inexistente, nao salva nada)\n- match_mode: 'contains' pra keywords"
9
9
  }
@@ -222,6 +222,18 @@ Ou para listas grandes (cursors):
222
222
  - Conta pode ter `locale` próprio mas timezone segue config do servidor
223
223
  - Pra evitar bugs, sempre passe timezone explícito
224
224
 
225
+ ### Custom attributes de data/hora — formato canônico (2026-07-06)
226
+
227
+ - Atributo tipo `date`: valor canônico é **data pura ISO** `"YYYY-MM-DD"` (sem hora/fuso).
228
+ Os atributos de integrações (`lt_first_visit_at`/`lt_last_visit_at`, `ca_invoice_created_at`/
229
+ `ca_invoice_updated_at`, os 6 `omie_*` de data, `booking_date`, `eclinica_*_data`) passaram a
230
+ gravar nesse formato — comparações `greater_than`/`less_than` em filtro/condição funcionam.
231
+ Registros gravados ANTES de 06/07/2026 podem estar no formato antigo (timestamp completo ou
232
+ `DD/MM/AAAA`) até os rakes de backfill rodarem.
233
+ - Atributo tipo `time` (**Hora, novo**): valor canônico é `"HH:MM"` **24h** (ex: `"14:30"`),
234
+ SEM data e SEM fuso embutido — o fuso mora na definição do atributo (`attribute_timezone`,
235
+ escolhido na criação, default `America/Sao_Paulo`).
236
+
225
237
  ## Códigos HTTP
226
238
 
227
239
  ### Sucesso
@@ -354,6 +354,12 @@ Fontes/campos disponíveis (`source` / `field`):
354
354
  Lembrete: todo template recém-criado pelo MCP só mostra o texto na tela depois de **sincronizar**
355
355
  (o MCP cria na Meta, mas o "puxar de volta" o conteúdo é o que a tela faz com o botão Sincronizar).
356
356
 
357
+ ## FlowBuilder — notas de editor (2026-07)
358
+
359
+ - **Tipo de atributo `time` (Hora 24h):** ao criar custom attribute com `attribute_display_type: "time"`, o valor canônico é `"HH:MM"` 24h e o fuso mora na definição (`attribute_timezone`, IANA, default `America/Sao_Paulo`). Uso principal: alimentar o campo Horário do node `wait` (modo date, `waitTimeMode: "variable"`).
360
+ - **Timeout de flow `ai_tool` com node `api`:** sobe sozinho de 20s pro teto de 45s quando ainda está no padrão — não precisa configurar nada; só evite setar `execution_timeout_ms` custom se quiser manter o auto-ajuste.
361
+ - **Teste do node `api`:** o resultado do último teste fica salvo no servidor (pin, TTL 30 dias) — sobrevive a trocar de navegador/máquina. Isso é recurso do editor humano; não há tool MCP pra isso.
362
+
357
363
  ## Status codes a respeitar
358
364
 
359
365
  | Code | O que fazer |
@@ -214,16 +214,18 @@ KanbanItem
214
214
  ├── custom_attributes (jsonb)
215
215
  ├── assigned_agents (jsonb array)
216
216
  ├── linked_conversations (jsonb array de { display_id })
217
- ├── checklist (jsonb)
217
+ ├── checklist (jsonb array de itens — NAO e tabela separada; ver abaixo)
218
218
  ├── activities (jsonb)
219
219
  ├── timer_started_at / timer_duration
220
220
  └── created_at
221
221
 
222
- KanbanChecklist
223
- ├── kanban_item_id (FK)
224
- ├── title
222
+ Item do checklist (elemento do array jsonb `checklist`)
223
+ ├── id (uuid string)
224
+ ├── text
225
225
  ├── completed (bool)
226
- └── position
226
+ ├── position
227
+ ├── group_id (opcional — itens com o mesmo group_id formam um grupo; ausente = avulso)
228
+ └── group_name (opcional — nome do grupo, snapshot do modelo aplicado)
227
229
 
228
230
  KanbanNote
229
231
  ├── kanban_item_id (FK)
@@ -361,6 +363,44 @@ Booking (agendamento confirmado)
361
363
  └── meeting_url (Google Calendar / Zoom / etc)
362
364
  ```
363
365
 
366
+ **Atributos de sistema do Booking no CONTATO (novo 2026-07-06):** ao confirmar um agendamento,
367
+ 8 custom attributes protegidos são gravados no contato — usáveis como variável
368
+ (`{{contact.custom_attribute.booking_date}}` etc.) em mensagem/flow/automação:
369
+
370
+ | Chave | Tipo | Conteúdo |
371
+ |---|---|---|
372
+ | `booking_title` | text | Título do tipo de evento (ex: "Consultoria 45min") |
373
+ | `booking_date` | date | Data do agendamento, ISO `YYYY-MM-DD` |
374
+ | `booking_time` | **time** | Hora 24h `"HH:MM"` (tipo novo — encaixa direto no campo Horário do node `wait`) |
375
+ | `booking_datetime` | text | ISO 8601 completo com fuso (referência; prefira date/time como variável) |
376
+ | `booking_duration` | text | Ex: "45 min" |
377
+ | `booking_type` | text | "Call / Meet" ou "Agendamento" |
378
+ | `booking_agent` | text | Nome do agente responsável |
379
+ | `booking_description` | text | Observação do cliente ao agendar |
380
+
381
+ ## e-Clínicas (Efficient) — integração de clínicas
382
+
383
+ 9 eventos de webhook, cada um mapeável a automação OU flow na tela Integrações > e-Clínica:
384
+ `cliente_novo`, `agendamento_novo`, `falta`, `pagamento` (os 4 da doc oficial) +
385
+ `agendamento_atendido`, `agendamento_alterado`, `agendamento_desmarcado`,
386
+ `agendamento_transferido`, `cliente_baixa_pagamento` (capturados ao vivo, não documentados
387
+ pelo e-Clínica).
388
+
389
+ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como variável):
390
+
391
+ | Chave | Tipo | Conteúdo |
392
+ |---|---|---|
393
+ | `eclinica_cliente_id` | text | ID do paciente no e-Clínica (chave de matching) |
394
+ | `eclinica_unit_id` / `eclinica_unit_name` | text | Unidade/filial que originou o evento |
395
+ | `eclinica_idagenda` | text | ID do último agendamento |
396
+ | `eclinica_data_consulta` | date | Data da consulta, ISO |
397
+ | `eclinica_hora_consulta` | **time** | Hora da consulta 24h `"HH:MM"` (novo 2026-07-06) |
398
+ | `eclinica_status_agendamento` | text | agendado / no_show / atendido / desmarcado |
399
+ | `eclinica_compromisso` | text | Tipo da consulta (ex: Consulta, Retorno, Exame) |
400
+ | `eclinica_ultimo_pagamento` | text | Valor do último pagamento |
401
+ | `eclinica_ultimo_pagamento_data` | date | Data do último pagamento/baixa (novo 2026-07-06) |
402
+ | `eclinica_ultimo_pagamento_descricao` | text | Descrição da baixa (ex: CONSULTA INICIAL) |
403
+
364
404
  ## Relatórios e Métricas
365
405
 
366
406
  ```
@@ -118,7 +118,23 @@ Webhooks embutidos NÃO aparecem na listagem de integrações standalone; exclui
118
118
  ```
119
119
  → edges: `sourceHandle: "button_sim"`, `sourceHandle: "button_nao"`, e opcionalmente `"no_response"`.
120
120
 
121
- **Handles que SAEM:** `success` (sem botões); com botões → `button_<value>` (um por botão) + `no_response` (+ `no_reply_timeout` se tiver timeout). Também `error`.
121
+ **Handles que SAEM:** `success` (sem botões); com botões → `button_<value>` (um por botão) + `no_response` + `error`.
122
+
123
+ **Timeout dos botões (opcional, no MESMO item de botões):**
124
+ - `buttons_timeout` (número) + `buttons_timeout_unit` (`"minutes"` | `"hours"` | `"days"`) → tempo de espera sem resposta. Só com `buttons_timeout > 0` existe o handle `no_reply_timeout`.
125
+ - `buttons_timeout_action`: `"advance"` (padrão) | `"remind"`.
126
+ - `"advance"`: ao esgotar o tempo, segue o handle `no_reply_timeout` (ex: manda pro atendimento humano).
127
+ - `"remind"`: manda UM lembrete (`buttons_reminder_text`) e CONTINUA aguardando o clique no MESMO menu; se ainda não responder, segue o `no_reply_timeout`. O clique (no menu original OU no lembrete) continua o flow normalmente.
128
+ - `buttons_reminder_text` (string) → texto do lembrete (só no modo `remind`; vazio = reenvia o conteúdo original).
129
+ - **REGRA do modo `remind`:** `buttons_timeout_unit` NÃO pode ser `"days"` e horas ≤ 23 — o lembrete precisa caber na janela de 24h do WhatsApp oficial. No modo `"advance"`, qualquer unidade/valor é permitido.
130
+
131
+ > ⚠️ **SAÍDAS CONDICIONAIS — NUNCA ligue edge nelas sem ativar a condição.** Estas saídas SÓ existem
132
+ > quando a config abaixo está presente. Ligar edge nelas sem isso cria uma **aresta fantasma** (linha
133
+ > que sai do nada no canvas, não roteia nada):
134
+ > - **`no_reply_timeout`** → só existe se o item de botões tiver **`buttons_timeout` > 0** (tempo de espera configurado).
135
+ > - **`window_closed`** → só existe em **flow de WhatsApp API oficial** com item sujeito à janela de 24h (texto/áudio/anexo/resposta pronta).
136
+ >
137
+ > Regra: se você NÃO configurou o timeout, **NÃO** crie edge `no_reply_timeout`. Se não é API oficial, **NÃO** crie edge `window_closed`.
122
138
 
123
139
  ### 2.3 `wait_response`
124
140
 
@@ -256,6 +272,7 @@ No editor visual esses destinos só aparecem quando a validação bate (computed
256
272
  - **Texto/string:** `equal`, `not_equal`, `contains`, `not_contains`, `starts_with`, `ends_with`, `is_empty`, `is_not_empty`
257
273
  - **Número:** `equal`, `not_equal`, `greater_than`, `less_than`, `number_range`, `is_empty`, `is_not_empty`
258
274
  - **Lista/Data:** `equal`, `not_equal`, `contains`, `not_contains`
275
+ - **Hora (`time`, novo 2026-07-06):** tratado como texto nas condições (`equal`, `not_equal`, `is_empty`, `is_not_empty`); valor canônico `"HH:MM"` 24h. Comparação maior/menor NÃO é suportada pra Hora — o uso principal desse tipo é alimentar o campo Horário do node `wait` (modo date, `waitTimeMode: "variable"`).
259
276
 
260
277
  Use operador numérico (`greater_than`, `less_than`, `number_range`) SÓ em atributo de tipo número.
261
278
 
@@ -318,6 +335,7 @@ Ex.: `{ "operator": "sla_check", "value": "frt_breached" }`. "Estourado" = o mon
318
335
  | `set_lost` | `{ reason? }` | Atalho pra perdido |
319
336
  | `assign_agent_card` | `{ agent_id }` | Atribui agente ao card |
320
337
  | `add_card_note` | `{ content }` | Nota no card |
338
+ | `add_card_checklist` | `{ template_id, funnel_id?, card_source? }` | Aplica um MODELO de checklist ao card (vira um grupo). `template_id` de `kanban_config.checklist_templates`. Um modelo por bloco (repita o bloco pra mais de um) |
321
339
  | `send_webhook` | `{ url, headers?, body? }` | Dispara webhook externo |
322
340
  | `start_flow` | `{ flow_id }` | Inicia outro fluxo |
323
341
  | `deactivate_flow` ou `disable_flow` | `{}` | Encerra fluxo atual |
@@ -327,7 +345,7 @@ Ex.: `{ "operator": "sla_check", "value": "frt_breached" }`. "Estourado" = o mon
327
345
 
328
346
  **Handles que SAEM:** `success`. Não tem handle `error` — falhas viram warning silencioso e o flow continua.
329
347
 
330
- **`card_source` (blocos de card) — opcional:** as ações de card aceitam `card_source`: `'funnel'` (default — procura o card pelo `funnel_id`) ou `'trigger'` (usa o card que DISPAROU o flow, em flows iniciados por `card_created`/`card_moved`/`card_won`/`card_lost`). Com `'trigger'`, `funnel_id` deixa de ser obrigatório — EXCETO em `move_kanban_stage`/`create_kanban_item`, cujo funil/etapa são o DESTINO. Sem card-gatilho disponível, a ação é pulada (não cai no fallback de funil). Aplica-se a `move_kanban_stage`, `set_won`/`set_lost`/`set_open`, `assign_agent_card`, `add_card_note`, `update_attribute` (com `attr_source: 'card'`) e às condições `card_attr_equals`/`card_attr_contains` (gravando `card_source` na própria regra).
348
+ **`card_source` (blocos de card) — opcional:** as ações de card aceitam `card_source`: `'funnel'` (default — procura o card pelo `funnel_id`) ou `'trigger'` (usa o card que DISPAROU o flow, em flows iniciados por `card_created`/`card_moved`/`card_won`/`card_lost`). Com `'trigger'`, `funnel_id` deixa de ser obrigatório — EXCETO em `move_kanban_stage`/`create_kanban_item`, cujo funil/etapa são o DESTINO. Sem card-gatilho disponível, a ação é pulada (não cai no fallback de funil). Aplica-se a `move_kanban_stage`, `set_won`/`set_lost`/`set_open`, `assign_agent_card`, `add_card_note`, `add_card_checklist`, `update_attribute` (com `attr_source: 'card'`) e às condições `card_attr_equals`/`card_attr_contains` (gravando `card_source` na própria regra).
331
349
 
332
350
  **`update_attribute` — campos EXATOS:** `attr_source` (`'contact'`, `'conversation'` ou `'card'`), `attr_key` (nome do atributo), `attr_value` (valor). NÃO existem `entity`/`key`/`value` — esses são ignorados e não salvam nada.
333
351
 
@@ -403,6 +421,10 @@ Lembre: o atributo lido é SINGULAR (`custom_attribute`).
403
421
 
404
422
  ### 2.8 `wait`
405
423
 
424
+ O campo raiz é **`waitMode`**: `"duration"` (default), `"date"` ou `"weekday"`.
425
+
426
+ **Modo `duration` (esperar um tempo):**
427
+
406
428
  ```json
407
429
  {
408
430
  "id": "node-wait-time-1",
@@ -410,17 +432,58 @@ Lembre: o atributo lido é SINGULAR (`custom_attribute`).
410
432
  "position": { "x": 690, "y": 300 },
411
433
  "data": {
412
434
  "label": "Espera 10 min",
413
- "waitTime": 10,
435
+ "waitMode": "duration",
436
+ "waitDuration": 10,
414
437
  "waitUnit": "minutes"
415
438
  }
416
439
  }
417
440
  ```
418
441
 
419
- **`waitUnit` válidos:** `seconds`, `minutes`, `hours`, `days`, `weekday` (espera próximo dia da semana).
442
+ `waitUnit` válidos: `seconds`, `minutes`, `hours`, `days`. (NÃO existe `waitUnit: "weekday"` — dia da semana é um `waitMode` próprio, ver abaixo.)
420
443
 
421
- Pra `weekday`, use também `targetWeekday` (0=domingo, 1=segunda... 6=sábado) e `targetHour` (0-23).
444
+ **Modo `date` (esperar até uma data e hora):**
422
445
 
423
- **Handles que SAEM:** `success`.
446
+ ```json
447
+ {
448
+ "id": "node-wait-date-1",
449
+ "type": "wait",
450
+ "position": { "x": 690, "y": 300 },
451
+ "data": {
452
+ "label": "Espera ate a consulta",
453
+ "waitMode": "date",
454
+ "waitDate": "2026-12-31",
455
+ "waitTime": "09:00",
456
+ "waitTimezone": "America/Sao_Paulo",
457
+ "waitDateMode": "fixed",
458
+ "waitTimeMode": "fixed"
459
+ }
460
+ }
461
+ ```
462
+
463
+ - `waitDate` = `"YYYY-MM-DD"` · `waitTime` = `"HH:MM"` 24h · `waitTimezone` = fuso IANA (default `America/Sao_Paulo` se ausente).
464
+ - **Variável nos campos (novo 2026-07-06):** `waitDateMode`/`waitTimeMode` aceitam `"fixed"` (default) ou `"variable"`. Em `"variable"`, o campo correspondente contém uma variável `{{ }}` em vez do valor fixo — ex.: `"waitDate": "{{contact.custom_attribute.data_consulta}}"`. O campo Data SÓ aceita variável de atributo tipo `date`; o campo Horário SÓ tipo `time` (Hora 24h). A variável é resolvida UMA única vez, na entrada do node (quem já está esperando mantém o valor capturado). Variável que não resolve pra data/hora válida → o flow sai pela saída `error` (payload `invalid_variable_datetime`). Data válida no PASSADO → espera 0 e segue por `success` (não é erro).
465
+
466
+ **Modo `weekday` (esperar até um dia da semana):**
467
+
468
+ ```json
469
+ {
470
+ "id": "node-wait-weekday-1",
471
+ "type": "wait",
472
+ "position": { "x": 690, "y": 300 },
473
+ "data": {
474
+ "label": "Espera ate segunda 09h",
475
+ "waitMode": "weekday",
476
+ "waitWeekday": 1,
477
+ "waitWeekdayTime": "09:00",
478
+ "waitTimezone": "America/Sao_Paulo"
479
+ }
480
+ }
481
+ ```
482
+
483
+ - `waitWeekday`: 0=domingo, 1=segunda... 6=sábado. `waitWeekdayTime` = `"HH:MM"` 24h, **SEMPRE fixo** (este campo NÃO aceita variável — decisão de produto). `waitTimezone` = mesmo campo do modo date.
484
+ - (Os nomes `targetWeekday`/`targetHour` NÃO existem — eram um erro de documentação antiga.)
485
+
486
+ **Handles que SAEM:** `success` (+ `error`, emitido apenas quando um campo em modo `variable` resolve pra valor inválido no modo `date`).
424
487
 
425
488
  ### 2.9 `set_variable`
426
489
 
@@ -490,12 +553,30 @@ Node terminal, sem handles de saída. Em flow `conversation` apenas encerra aque
490
553
  { "id": "node-end", "type": "end", "position": { "x": 1330, "y": 300 }, "data": { "label": "Retorno", "mode": "structured" } }
491
554
  ```
492
555
 
493
- ### 2.14 `note` (anotação visual)
556
+ ### 2.14 `note` (anotação visual / sticky note colorido)
557
+
558
+ Sticky note no canvas (aquele bloco colorido riscado na tela pra rotular/agrupar). Puramente visual: sem handles, NUNCA executado (não ligue edges nele). Disponível nos DOIS tipos de flow (`conversation` e `ai_tool`).
559
+
560
+ Campos do `data`:
561
+
562
+ | Campo | Valores | Default |
563
+ |---|---|---|
564
+ | `title` | texto do cabeçalho da nota | vazio |
565
+ | `body` | texto do corpo | vazio |
566
+ | `color` | `yellow`, `teal`, `blue`, `violet`, `pink`, `orange`, `slate` | `yellow` |
567
+ | `width` | largura em px (mín. 200) | 320 |
568
+ | `height` | altura em px (mín. 80) | 200 |
569
+
570
+ **ATENÇÃO:** o texto vai em `title` + `body`, NÃO em `content`. Usar `content` num node `note` grava
571
+ uma nota VAZIA na tela (a interface ignora a chave). `content` só é chave de OUTRAS coisas (item `text`
572
+ do `send_message`, ação `add_private_note`, ação `add_card_note`) — nunca do sticky note.
494
573
 
495
- Sticky note no canvas, puramente visual. Sem handles, nunca executado (não ligue edges nele). Serve só pra documentar o flow.
574
+ `position` é o canto superior esquerdo da nota; como ela é maior que um node comum, posicione-a ATRÁS
575
+ do grupo de nodes que ela rotula (ex.: um pouco acima e à esquerda do primeiro node do trecho).
496
576
 
497
577
  ```json
498
- { "id": "note-1", "type": "note", "position": { "x": 50, "y": 50 }, "data": { "content": "Fluxo de qualificação — revisar mensagens" } }
578
+ { "id": "note-1", "type": "note", "position": { "x": 40, "y": 40 },
579
+ "data": { "title": "Qualificação", "body": "Revisar mensagens antes de publicar", "color": "violet", "width": 360, "height": 180 } }
499
580
  ```
500
581
 
501
582
  ---
@@ -524,6 +605,29 @@ das abas Conversas / Contatos / Kanban (ex: `add_label`, `change_status`, `updat
524
605
  outro flow (cadeia entre motores), cada hand-off incrementa um contador interno (`_activation_depth`).
525
606
  No 5º hand-off (`MAX_CHAIN_DEPTH = 5`) a cadeia é cortada silenciosamente. Se um flow "não disparou"
526
607
  no fim de uma cadeia automação→flow→automação, suspeite desse limite — é proteção, não bug.
608
+
609
+ ## 2-C. Flow `conversation`: individual vs grupo (`conversation_mode`)
610
+
611
+ Todo flow `conversation` tem um `conversation_mode`: `individual` (default — conversa 1-a-1) ou `group`
612
+ (grupo de WhatsApp). Definido na CRIAÇÃO e **IMUTÁVEL depois** (não dá pra converter um no outro; pra trocar,
613
+ crie outro flow). Não confundir com `flow_type` — um flow `ai_tool` não tem `conversation_mode`.
614
+
615
+ Na tela o usuário vê isso como TRÊS opções ao criar: "Mensagem" (= `conversation` + `individual`),
616
+ "Grupo" (= `conversation` + `group`) e "IA Agente" (= `ai_tool`).
617
+
618
+ **A diferença entre individual e grupo é quais nodes/abas ficam disponíveis:**
619
+
620
+ | | individual (Mensagem) | group (Grupo) |
621
+ |---|---|---|
622
+ | Node `update_group` (Configurar Grupo: nome, foto, permissões — WAHA) | NÃO existe | **SÓ aqui** |
623
+ | Gatilhos e condições de **LionTrack** (visita de página / evento do site) | disponíveis | **NÃO** (grupo não tem um contato único navegando) |
624
+ | Todos os outros nodes (`send_message`, `wait_response`, `condition`, `action`, `api`, `ai`, `set_variable`, `wait`, `randomizer`, `note`, `end`) | iguais | iguais |
625
+
626
+ Regras práticas ao montar via API:
627
+ - Só use o node `update_group` se o flow foi criado com `conversation_mode: "group"`. Colocá-lo num flow
628
+ individual é rejeitado pela validação.
629
+ - Não use gatilho/condição de LionTrack (pagetrack) em flow de grupo.
630
+ - Na dúvida entre os dois, é `individual` (o default).
527
631
  Não tente contornar criando flows intermediários.
528
632
 
529
633
  ---
@@ -573,6 +677,15 @@ Variáveis salvas em atributo (`saveTo: 'contact_attr'`/`'conversation_attr'`, o
573
677
  - `out`, `output`, `next` (use o nome real do handle)
574
678
  - `option1` sem underscore (use `option_1`)
575
679
 
680
+ **Handles CONDICIONAIS — só existem sob a config certa. Não ligue edge sem ativar a condição:**
681
+ - `no_reply_timeout` → só com `buttons_timeout > 0` no item de botões.
682
+ - `window_closed` → só em flow WhatsApp API oficial com item de janela.
683
+ - `button_<value>` → um por botão que EXISTE; se remover o botão, remova o edge.
684
+ - `option_<x>` → um por opção em `acceptedOptions`; idem.
685
+ - `cond_0..N` → um por condição no array; se tirar uma condição, o `cond_N` do fim some.
686
+ - `intent_<name>` → um por intent no `ai` mode intent.
687
+ Ligar edge num handle condicional inexistente = **aresta fantasma** (sai do nada no canvas, não roteia).
688
+
576
689
  ---
577
690
 
578
691
  ## 4. Layout e positioning
@@ -627,6 +740,8 @@ Nodes nunca devem ficar com a mesma coordenada `(x, y)`. Se dois nodes têm posi
627
740
  | Node `condition` depois de `wait_response` com options | Redundante e atrapalha | Ligue `option_X` direto no próximo node |
628
741
  | Edge sem `sourceHandle` | Frontend não consegue rotear | Sempre informe |
629
742
  | Edge com `target` apontando pra ID que não existe | Quebra o grafo | Confira que `target` está em `nodes[]` |
743
+ | Edge `sourceHandle: "no_reply_timeout"` sem `buttons_timeout > 0` | Handle não existe sem timeout → aresta fantasma (linha saindo do nada no canvas) | Só crie esse edge se configurar o timeout no item de botões |
744
+ | Edge `sourceHandle: "window_closed"` fora de flow WhatsApp API oficial | Handle só existe na API oficial → aresta fantasma | Só crie em flow oficial com item de janela |
630
745
  | `channel_type: "WhatsApp"` | Precisa do nome de classe Rails | `"Channel::Whatsapp"`, `"Channel::Waha"`, `"Channel::WebWidget"` |
631
746
  | `validation: "option"` (singular) | Não existe | `"options"` (plural) |
632
747
  | `varied_options` com `acceptedOptions` | Modo errado de config | `optionGroups: [{ id, terms, matchType }]` |
@@ -660,6 +775,7 @@ Antes de chamar `flows_create` ou `flows_update`, valide mentalmente:
660
775
  - [ ] Nenhum par de nodes tem a mesma posição `(x, y)`
661
776
  - [ ] Todo node tem `data` com campos do schema do tipo
662
777
  - [ ] Todo node não-start tem pelo menos 1 edge chegando (`edge.target = node.id`)
778
+ - [ ] Todo `edge.sourceHandle` é um handle que o node source EXPÕE NAQUELA config (sem handle condicional inexistente: `no_reply_timeout` só com timeout, `window_closed` só API oficial, `button_<value>`/`option_<x>`/`cond_N`/`intent_<name>` só se o botão/opção/condição/intent existir)
663
779
  - [ ] Todo edge tem `source`, `target` e `sourceHandle`
664
780
  - [ ] Todo `sourceHandle` é um handle real exposto pelo node source (seção 2)
665
781
  - [ ] `channel_type` é classe Rails (`Channel::Waha` etc)
@@ -121,7 +121,7 @@ Um card individual dentro de uma etapa.
121
121
  | `custom_attributes` | jsonb — campos custom (igual contatos) |
122
122
  | `assigned_agents` | jsonb array de agentes responsáveis |
123
123
  | `activities` | jsonb array — log de atividades |
124
- | `checklist` | jsonb array de tarefas dentro do card |
124
+ | `checklist` | jsonb array de tarefas dentro do card (item: `text`/`completed`/`position` + `group_id`/`group_name` opcionais para agrupar) |
125
125
  | `timer_started_at`, `timer_duration` | Timer interno do card |
126
126
 
127
127
  ### item_details (detalhes do card)
@@ -224,23 +224,52 @@ Tipos comuns: `created`, `stage_changed`, `agent_assigned`, `agent_removed`, `no
224
224
 
225
225
  ## Checklist (tarefas dentro do card)
226
226
 
227
+ Array plano de itens. Cada item pode (opcionalmente) pertencer a um grupo via `group_id` +
228
+ `group_name`. Item SEM `group_id` = avulso (solto, fora de qualquer grupo).
229
+
227
230
  ```json
228
231
  [
229
232
  {
230
233
  "id": "abc-123",
231
- "title": "Enviar proposta por email",
232
- "checked": true,
233
- "completed_at": "2026-05-15T10:00:00Z",
234
- "completed_by": 5
234
+ "text": "Enviar proposta por email",
235
+ "completed": true,
236
+ "position": 0,
237
+ "group_id": "grp-uuid-1",
238
+ "group_name": "Modelo Comercial"
235
239
  },
236
240
  {
237
241
  "id": "abc-124",
238
- "title": "Agendar follow-up",
239
- "checked": false
242
+ "text": "Agendar follow-up",
243
+ "completed": false,
244
+ "position": 1,
245
+ "group_id": "grp-uuid-1",
246
+ "group_name": "Modelo Comercial"
247
+ },
248
+ {
249
+ "id": "abc-125",
250
+ "text": "Ligar amanhã",
251
+ "completed": false,
252
+ "position": 2
240
253
  }
241
254
  ]
242
255
  ```
243
256
 
257
+ Campos: `text` (não `title`), `completed` (não `checked`), `position` (ordem), e o par opcional
258
+ `group_id`/`group_name`. `group_name` é um snapshot (não muda se o modelo for renomeado depois).
259
+
260
+ ### Checklist por grupo (importante pro MCP)
261
+
262
+ - Cada **modelo de checklist aplicado** vira um **grupo independente**: todos os itens do modelo
263
+ recebem o mesmo `group_id` + `group_name`. Aplicar o mesmo modelo duas vezes = dois grupos.
264
+ - **Aplicar um modelo como grupo via MCP:** gere um `group_id` único (ex.: um UUID) e chame
265
+ `lionchat_kanban_items_kanban_checklist_create` uma vez por item, passando o MESMO `group_id`
266
+ e `group_name` em todos. (Não existe uma tool de "aplicar modelo inteiro de uma vez" — é o loop.)
267
+ - **Marcar/desmarcar** item: `lionchat_kanban_items_kanban_checklist_create_1` (toggle).
268
+ - **Remover um grupo inteiro** de uma vez: `lionchat_kanban_items_kanban_checklist_group_destroy`
269
+ (body `group_id`). Remover um item só: `..._checklist_destroy`.
270
+ - No card do quadro, cada grupo mostra sua própria barra de progresso (com 3+ grupos, o card fica
271
+ enxuto por padrão e expande sob demanda).
272
+
244
273
  Útil pra workflows internos. Não confundir com `tasks` (que é módulo separado de tarefas globais).
245
274
 
246
275
  ## Pipeline (visão por valor)
@@ -403,7 +432,7 @@ PUT /api/v1/accounts/43/funnels/43
403
432
  | `notify_team` | `{message}` | HOJE só registra em log interno — não notifica ninguém de verdade |
404
433
  | `duplicate_item` | `{funnel_id, stage}` | Cria cópia noutro funil/etapa; título ganha sufixo "(cópia)" |
405
434
  | `send_webhook` | `{webhook_url}` | POST com payload completo do card (fire-and-forget) |
406
- | `apply_checklist_template` | `{template_id}` | Template de `kanban_config.checklist_templates`; aditivo (appenda) |
435
+ | `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) |
407
436
  | `update_checklist` | `{checklist_updates: [{checklist_item_id, completed, text}]}` | Não aparece na UI — só via API |
408
437
 
409
438
  **Regras críticas (gravar diferente disso = automação perdida ou morta):**
package/dist/tools.js CHANGED
@@ -287,8 +287,11 @@ function registerFlowsSchemaReferenceTool(server) {
287
287
 
288
288
  flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
289
289
 
290
- ═══ DOIS TIPOS DE FLOW ═══
290
+ ═══ DOIS TIPOS DE FLOW (e o modo do conversation) ═══
291
291
  - conversation (default): dispara por evento de inbox. Criar via lionchat_flows_create.
292
+ conversation_mode: 'individual' (1-a-1, default) ou 'group' (grupo WhatsApp). IMUTAVEL apos criar.
293
+ So 'group' aceita o node update_group (Configurar Grupo: nome/foto/permissoes). 'group' NAO tem
294
+ gatilhos/condicoes de LionTrack (pagetrack). Na UI aparecem como 3 opcoes: Mensagem / Grupo / IA Agente.
292
295
  - ai_tool: ferramenta que o AI Agente invoca. Criar via lionchat_flow_tools_create (NAO flows_create!),
293
296
  com tool_name (snake_case, max 50) + tool_description (max 500). SEM inbox_ids. No 'end' OBRIGATORIO.
294
297
  Nodes permitidos em ai_tool: start, end, api, condition, set_variable, ai, randomizer, action,
@@ -327,6 +330,10 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
327
330
  ATENCAO: messageItems (NAO items).
328
331
  Botoes: item text com buttons_enabled=true + buttons:[{title,value}] gera handle "button_{value}"
329
332
  por botao + "no_response" (texto livre em vez de clique) + "no_reply_timeout" (se timeout).
333
+ Timeout (opcional, mesmo item): buttons_timeout + buttons_timeout_unit (minutes|hours|days).
334
+ buttons_timeout_action: "advance" (padrao, segue no_reply_timeout ao esgotar) | "remind" (manda 1
335
+ lembrete buttons_reminder_text e CONTINUA esperando; depois segue no_reply_timeout). No modo remind
336
+ a unidade NAO pode ser days e horas <= 23 (janela 24h do WhatsApp).
330
337
  Handles sem botoes: "success", "error".
331
338
 
332
339
  ▸ wait_response
@@ -399,7 +406,8 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
399
406
  Kanban: create_kanban_item({funnel_id, funnel_stage, title?, description?})
400
407
  — funnel_id e funnel_stage OBRIGATORIOS; title/description aceitam {{ }},
401
408
  move_kanban_stage({funnel_id,funnel_stage}), set_kanban_item_status({status:won|lost|active}),
402
- set_won({}), set_lost({reason?}), assign_agent_card({agent_id}), add_card_note({content})
409
+ set_won({}), set_lost({reason?}), assign_agent_card({agent_id}), add_card_note({content}),
410
+ add_card_checklist({template_id}) — aplica um modelo de checklist ao card (vira grupo)
403
411
  Sistema (SO flow conversation): send_webhook({url,headers?,body?}), start_flow({flow_id}),
404
412
  deactivate_flow({})
405
413
  Handles: "success" (sem handle error — falha vira warning e o flow continua).
@@ -422,9 +430,15 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
422
430
  Handle: "success"
423
431
 
424
432
  ▸ wait
425
- data: { label, waitTime, waitUnit: seconds|minutes|hours|days|weekday }
426
- weekday: + targetWeekday (0=dom..6=sab) + targetHour (0-23)
427
- Handle: "success"
433
+ data.waitMode: "duration" (default) | "date" | "weekday"
434
+ duration: waitDuration + waitUnit (seconds|minutes|hours|days)
435
+ date: waitDate ("YYYY-MM-DD") + waitTime ("HH:MM" 24h) + waitTimezone (IANA, default America/Sao_Paulo)
436
+ + waitDateMode/waitTimeMode ("fixed"|"variable"). Em "variable" o campo contem {{contact.custom_attribute.X}}
437
+ (Data SO aceita atributo tipo date; Horario SO tipo time). Resolve UMA vez na entrada do node.
438
+ Variavel invalida -> saida "error" (invalid_variable_datetime). Data no passado -> segue por "success".
439
+ weekday: waitWeekday (0=dom..6=sab) + waitWeekdayTime ("HH:MM", SEMPRE fixo, sem variavel) + waitTimezone
440
+ (NAO existem waitUnit:"weekday", targetWeekday nem targetHour — erro de doc antiga)
441
+ Handles: "success" (+ "error" so com variavel invalida no modo date)
428
442
 
429
443
  ▸ randomizer
430
444
  data: { label, mode:"branches", branches:[{id,label,weight}] }
@@ -438,7 +452,10 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
438
452
  data define o retorno estruturado pro LLM (suporta saida Liquid com {{ }}).
439
453
 
440
454
  ▸ note
441
- Sticky note visual. Sem handles, nunca executa, nao ligue edges.
455
+ Sticky note visual (bloco colorido de anotacao). Sem handles, nunca executa, nao ligue edges.
456
+ data: title (cabecalho), body (corpo), color (yellow|teal|blue|violet|pink|orange|slate, default yellow),
457
+ width (px, default 320, min 200), height (px, default 200, min 80). ATENCAO: texto vai em title+body,
458
+ NUNCA em 'content' (usar content grava nota vazia). Disponivel nos 2 tipos de flow.
442
459
 
443
460
  ═══ VARIAVEIS {{ }} ═══
444
461
  contact.name, contact.email, contact.phone, contact.custom_attribute.X (SINGULAR — plural resolve vazio)
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/endpoints.json CHANGED
@@ -4853,7 +4853,8 @@
4853
4853
  "lionchat_kanban_v2_list",
4854
4854
  "lionchat_kanban_v2_create",
4855
4855
  "lionchat_kanban_v2_show"
4856
- ]
4856
+ ],
4857
+ "body_wrapper": "kanban_automation"
4857
4858
  },
4858
4859
  {
4859
4860
  "id": "lionchat_kanban_v2_show_3",
@@ -4923,7 +4924,8 @@
4923
4924
  "lionchat_kanban_v2_list",
4924
4925
  "lionchat_kanban_v2_create",
4925
4926
  "lionchat_kanban_v2_show"
4926
- ]
4927
+ ],
4928
+ "body_wrapper": "kanban_automation"
4927
4929
  },
4928
4930
  {
4929
4931
  "id": "lionchat_kanban_v2_destroy_5",
@@ -9120,7 +9122,7 @@
9120
9122
  "method": "POST",
9121
9123
  "path": "/api/v1/accounts/{account_id}/flows",
9122
9124
  "title": "Criar Flow",
9123
- "description": "Cria um flow (FlowBuilder) na conta. Requer Admin. flow_data segue formato Vue Flow {nodes:[], edges:[]}. NODE SCHEMA — start: {label}. send_message: {label, messageItems:[{id, type:'text', content}]} handles: success/no_response/error. wait_response: {label, waitTime, waitUnit:'minutes'|'seconds', validation:'any'|'options'|'regex', acceptedOptions:['1','2'] (se options), regexPattern (se regex), invalidMessage, maxRetries:3, saveTo:'variable'|'contact_name'|'contact_email'|'contact_phone'|'contact_attr'|'conversation_attr'|'', saveVariable, saveAttrKey} — quando validation='options' os handles ficam 'option_{val}' + 'timeout'; senão 'success' + 'timeout' — NUNCA precisa de condition node depois. condition: {label, conditions:[{id, label, field, operator, value}]} handles = 'cond_0','cond_1',... (INDICE no array, NAO o id) + 'default'. action: {label, items:[{key, config:{...}}]} keys comuns assign_team({team_id}), assign_agent({agent_id}), add_label({labels:['slug',...]}), remove_label({labels}), change_status({status}), change_priority({priority}), mute_conversation({}), add_private_note({content}), create_kanban_item({funnel_id, funnel_stage,...}), move_kanban_stage({funnel_id, funnel_stage}), deactivate_flow({}), assign_captain({assistant_id}). api: {label, method, url, headers:[{key,value}], body, apiResponseVar}. set_variable: {label, variables:[{name, value}]}. wait: {label, waitTime, waitUnit}. EDGE SCHEMA: {id, source, target, sourceHandle (opcional, OBRIGATORIO casar com handle exposto pelo node source), type:'deletable', animated:true}. ERROS COMUNS QUE DEVEM SER EVITADOS: (1) action usa items[].config NAO items[].params; (2) send_message usa messageItems NAO items; (3) wait_response com validation='options' NAO precisa de condition node — use sourceHandle='option_X' diretamente; (4) sourceHandle inventado tipo 'c1','c2' nao funciona — sempre usar o handle real; (5) inbox_ids precisa vir aninhado em {flow:{inbox_ids:[]}} no PUT bruto, mas no MCP basta inbox_ids no nivel raiz. Cria novo flow. Obrigatórios: name, channel_type. Valida unicidade quando aplicável. Retorna o flow criado com ID atribuído. POSITIONING (CRITICO): cada node DEVE ter position:{x,y}. Sem isso, todos empilham no canvas no (0,0). Regra basica de layout: start em {x:50,y:300}, espaco horizontal +320 entre nodes sequenciais, ramificacoes em +/-150 vertical. ANTES DE GERAR JSON consulte o resource lionchat://docs/flowbuilder-design-guide (schema completo de cada tipo de node, handles expostos, erros comuns, checklist) e lionchat://docs/flowbuilder-patterns (10 templates prontos pra adaptar). BRAINSTORMING: se faltou info critica (canal, gatilho, conteudo), use o prompt create_flow_brainstorm como banco de perguntas sugeridas — pergunte SO o que falta, sem checklist forcado. APOS GERAR: rode o checklist da secao 6 do design guide antes de submeter (1 node start, todo node com id unico + position + data, todo edge com sourceHandle valido). NUNCA invente sourceHandle (no condition use cond_0/cond_1/default, no wait_response options use option_X, no AI intent use intent_<opcao>). IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create.",
9125
+ "description": "Cria um flow (FlowBuilder) na conta. Requer Admin. flow_data segue formato Vue Flow {nodes:[], edges:[]}. NODE SCHEMA — start: {label}. send_message: {label, messageItems:[{id, type:'text', content}]} handles: success/no_response/error. wait_response: {label, waitTime, waitUnit:'minutes'|'seconds', validation:'any'|'options'|'regex', acceptedOptions:['1','2'] (se options), regexPattern (se regex), invalidMessage, maxRetries:3, saveTo:'variable'|'contact_name'|'contact_email'|'contact_phone'|'contact_attr'|'conversation_attr'|'', saveVariable, saveAttrKey} — quando validation='options' os handles ficam 'option_{val}' + 'timeout'; senão 'success' + 'timeout' — NUNCA precisa de condition node depois. condition: {label, conditions:[{id, label, field, operator, value}]} handles = 'cond_0','cond_1',... (INDICE no array, NAO o id) + 'default'. action: {label, items:[{key, config:{...}}]} keys comuns assign_team({team_id}), assign_agent({agent_id}), add_label({labels:['slug',...]}), remove_label({labels}), change_status({status}), change_priority({priority}), mute_conversation({}), add_private_note({content}), create_kanban_item({funnel_id, funnel_stage,...}), move_kanban_stage({funnel_id, funnel_stage}), deactivate_flow({}), assign_captain({assistant_id}). api: {label, method, url, headers:[{key,value}], body, apiResponseVar}. set_variable: {label, variables:[{name, value}]}. wait: {label, waitTime, waitUnit}. EDGE SCHEMA: {id, source, target, sourceHandle (opcional, OBRIGATORIO casar com handle exposto pelo node source), type:'deletable', animated:true}. ERROS COMUNS QUE DEVEM SER EVITADOS: (1) action usa items[].config NAO items[].params; (2) send_message usa messageItems NAO items; (3) wait_response com validation='options' NAO precisa de condition node — use sourceHandle='option_X' diretamente; (4) sourceHandle inventado tipo 'c1','c2' nao funciona — sempre usar o handle real; (5) inbox_ids precisa vir aninhado em {flow:{inbox_ids:[]}} no PUT bruto, mas no MCP basta inbox_ids no nivel raiz. Cria novo flow. Obrigatórios: name, channel_type. Valida unicidade quando aplicável. Retorna o flow criado com ID atribuído. POSITIONING (CRITICO): cada node DEVE ter position:{x,y}. Sem isso, todos empilham no canvas no (0,0). Regra basica de layout: start em {x:50,y:300}, espaco horizontal +320 entre nodes sequenciais, ramificacoes em +/-150 vertical. ANTES DE GERAR JSON consulte o resource lionchat://docs/flowbuilder-design-guide (schema completo de cada tipo de node, handles expostos, erros comuns, checklist) e lionchat://docs/flowbuilder-patterns (10 templates prontos pra adaptar). BRAINSTORMING: se faltou info critica (canal, gatilho, conteudo), use o prompt create_flow_brainstorm como banco de perguntas sugeridas — pergunte SO o que falta, sem checklist forcado. APOS GERAR: rode o checklist da secao 6 do design guide antes de submeter (1 node start, todo node com id unico + position + data, todo edge com sourceHandle valido). NUNCA invente sourceHandle (no condition use cond_0/cond_1/default, no wait_response options use option_X, no AI intent use intent_<opcao>). IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create. conversation_mode: 'individual' (default) | 'group'. Sticky note (type 'note'): data usa title+body+color(yellow|teal|blue|violet|pink|orange|slate)+width+height — NUNCA 'content'.",
9124
9126
  "category": "Flows",
9125
9127
  "params": [
9126
9128
  {
@@ -9144,6 +9146,13 @@
9144
9146
  "required": true,
9145
9147
  "description": "Tipo de canal (ex: Channel::Waha, Channel::WebWidget, Channel::Whatsapp)"
9146
9148
  },
9149
+ {
9150
+ "name": "conversation_mode",
9151
+ "type": "string",
9152
+ "location": "body",
9153
+ "required": false,
9154
+ "description": "Modo do flow conversation: 'individual' (1-a-1, default) ou 'group' (grupo de WhatsApp). IMUTAVEL apos criar. So flow 'group' aceita o node 'update_group' (Configurar Grupo: nome/foto/permissoes, WAHA); flow 'group' NAO tem gatilhos/condicoes de LionTrack (pagetrack). Nao aplica a ai_tool."
9155
+ },
9147
9156
  {
9148
9157
  "name": "inbox_ids",
9149
9158
  "type": "array",
@@ -11761,7 +11770,7 @@
11761
11770
  "method": "POST",
11762
11771
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/create_checklist_item",
11763
11772
  "title": "Criar Checklist",
11764
- "description": "Adiciona item ao checklist. Cria novo item de checklist. Obrigatórios: id, text. Valida unicidade quando aplicável. Retorna o item de checklist criado com ID atribuído.",
11773
+ "description": "Adiciona um item ao checklist do card. Obrigatórios: id (card), text. Opcionais: group_id + group_name para colocar o item dentro de um grupo (ex.: um modelo de checklist). Sem group_id o item entra como AVULSO. Para montar/aplicar um grupo, envie o MESMO group_id (e group_name) em todos os itens daquele grupo. Retorna o card completo.",
11765
11774
  "category": "Checklist",
11766
11775
  "params": [
11767
11776
  {
@@ -11777,10 +11786,25 @@
11777
11786
  "location": "body",
11778
11787
  "required": true,
11779
11788
  "description": "Texto"
11789
+ },
11790
+ {
11791
+ "name": "group_id",
11792
+ "type": "string",
11793
+ "location": "body",
11794
+ "required": false,
11795
+ "description": "Opcional. ID do grupo (string única por grupo, ex.: um UUID). Itens com o mesmo group_id formam um grupo. Ausente = item avulso."
11796
+ },
11797
+ {
11798
+ "name": "group_name",
11799
+ "type": "string",
11800
+ "location": "body",
11801
+ "required": false,
11802
+ "description": "Opcional. Nome do grupo exibido no card (ex.: nome do modelo de checklist). Enviar junto com group_id."
11780
11803
  }
11781
11804
  ],
11782
11805
  "returns": "card completo (com o item de checklist)",
11783
11806
  "common_use_cases": [
11807
+ "Aplicar um modelo de checklist como grupo (mesmo group_id/group_name em todos os itens)",
11784
11808
  "Cadastro inicial de item de checklist",
11785
11809
  "Automação a partir de evento externo",
11786
11810
  "Importação manual via API"
@@ -11823,8 +11847,8 @@
11823
11847
  "id": "lionchat_kanban_items_kanban_checklist_create_1",
11824
11848
  "method": "POST",
11825
11849
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/toggle_checklist_item",
11826
- "title": "Toggle Item",
11827
- "description": "Marca/desmarca item do checklist. Cria novo item de checklist. Obrigatórios: id, checklist_item_id. Valida unicidade quando aplicável. Retorna o item de checklist criado com ID atribuído.",
11850
+ "title": "Marcar/Desmarcar Item",
11851
+ "description": "Marca ou desmarca (alterna) um item do checklist como concluído. Obrigatórios: id (card), checklist_item_id. Retorna o card com o item alternado.",
11828
11852
  "category": "Checklist",
11829
11853
  "params": [
11830
11854
  {
@@ -11844,9 +11868,9 @@
11844
11868
  ],
11845
11869
  "returns": "card completo (item de checklist alternado)",
11846
11870
  "common_use_cases": [
11847
- "Cadastro inicial de item de checklist",
11848
- "Automação a partir de evento externo",
11849
- "Importação manual via API"
11871
+ "Marcar uma tarefa do checklist como concluída",
11872
+ "Desmarcar uma tarefa concluída por engano",
11873
+ "Automação a partir de evento externo"
11850
11874
  ],
11851
11875
  "related_tools": [
11852
11876
  "lionchat_kanban_items_list",
@@ -11931,6 +11955,41 @@
11931
11955
  "lionchat_kanban_items_show"
11932
11956
  ]
11933
11957
  },
11958
+ {
11959
+ "id": "lionchat_kanban_items_kanban_checklist_group_destroy",
11960
+ "method": "DELETE",
11961
+ "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/delete_checklist_group",
11962
+ "title": "Remover Grupo de Checklist",
11963
+ "description": "Remove de uma vez TODOS os itens de um grupo de checklist do card. Obrigatórios: id (card), group_id. Os itens avulsos e os demais grupos permanecem intactos. CUIDADO: irreversível.",
11964
+ "category": "Checklist",
11965
+ "params": [
11966
+ {
11967
+ "name": "id",
11968
+ "type": "integer",
11969
+ "location": "path",
11970
+ "required": true,
11971
+ "description": "ID do card (kanban_item)"
11972
+ },
11973
+ {
11974
+ "name": "group_id",
11975
+ "type": "string",
11976
+ "location": "body",
11977
+ "required": true,
11978
+ "description": "ID do grupo (o group_id compartilhado pelos itens) a remover"
11979
+ }
11980
+ ],
11981
+ "returns": "card completo (sem o grupo)",
11982
+ "common_use_cases": [
11983
+ "Remover um modelo de checklist aplicado por engano",
11984
+ "Limpar um grupo de tarefas inteiro de uma vez",
11985
+ "Trocar um grupo por outro"
11986
+ ],
11987
+ "related_tools": [
11988
+ "lionchat_kanban_items_kanban_checklist_create",
11989
+ "lionchat_kanban_items_kanban_checklist_list",
11990
+ "lionchat_kanban_items_show"
11991
+ ]
11992
+ },
11934
11993
  {
11935
11994
  "id": "lionchat_conversations_flow_sessions_list",
11936
11995
  "method": "GET",
@@ -18069,7 +18128,8 @@
18069
18128
  "lionchat_meta_lead_list",
18070
18129
  "lionchat_meta_lead_create",
18071
18130
  "lionchat_meta_lead_destroy"
18072
- ]
18131
+ ],
18132
+ "body_wrapper": "form"
18073
18133
  },
18074
18134
  {
18075
18135
  "id": "lionchat_meta_lead_create_2",
@@ -19125,18 +19185,18 @@
19125
19185
  "category": "Config de Notificacao",
19126
19186
  "params": [
19127
19187
  {
19128
- "name": "email_enabled",
19129
- "type": "boolean",
19188
+ "name": "selected_email_flags",
19189
+ "type": "array",
19130
19190
  "location": "body",
19131
19191
  "required": false,
19132
- "description": "Notificacoes por email"
19192
+ "description": "Flags de notificacao por EMAIL (substitui a lista). Ex: ['email_conversation_assignment','email_assigned_conversation_new_message']"
19133
19193
  },
19134
19194
  {
19135
- "name": "push_enabled",
19136
- "type": "boolean",
19195
+ "name": "selected_push_flags",
19196
+ "type": "array",
19137
19197
  "location": "body",
19138
19198
  "required": false,
19139
- "description": "Notificacoes push"
19199
+ "description": "Flags de notificacao PUSH (substitui a lista). Ex: ['push_conversation_assignment']"
19140
19200
  }
19141
19201
  ],
19142
19202
  "returns": "config de notificação atualizado",
@@ -19147,7 +19207,8 @@
19147
19207
  ],
19148
19208
  "related_tools": [
19149
19209
  "lionchat_notification_settings_list"
19150
- ]
19210
+ ],
19211
+ "body_wrapper": "notification_settings"
19151
19212
  },
19152
19213
  {
19153
19214
  "id": "lionchat_captain_documents_create_1",
@@ -20169,7 +20230,14 @@
20169
20230
  "type": "string",
20170
20231
  "location": "body",
20171
20232
  "required": true,
20172
- "description": "Tipo de exibicao: text, number, link, date, list, checkbox, currency, percent ou secret"
20233
+ "description": "Tipo de exibicao: text, number, link, date, time (Hora 24h — valor canonico HH:MM; fuso mora em attribute_timezone), list, checkbox, currency, percent ou secret"
20234
+ },
20235
+ {
20236
+ "name": "attribute_timezone",
20237
+ "type": "string",
20238
+ "location": "body",
20239
+ "required": false,
20240
+ "description": "Fuso horario IANA da definicao (so faz sentido pro tipo time/Hora; default America/Sao_Paulo). O VALOR do atributo time e sempre HH:MM 24h sem fuso embutido — o fuso mora aqui."
20173
20241
  },
20174
20242
  {
20175
20243
  "name": "attribute_key",
@@ -20282,7 +20350,14 @@
20282
20350
  "type": "string",
20283
20351
  "location": "body",
20284
20352
  "required": false,
20285
- "description": "Tipo de exibicao: text, number, link, date, list, checkbox, currency, percent ou secret"
20353
+ "description": "Tipo de exibicao: text, number, link, date, time (Hora 24h — valor canonico HH:MM; fuso mora em attribute_timezone), list, checkbox, currency, percent ou secret"
20354
+ },
20355
+ {
20356
+ "name": "attribute_timezone",
20357
+ "type": "string",
20358
+ "location": "body",
20359
+ "required": false,
20360
+ "description": "Fuso horario IANA da definicao (so faz sentido pro tipo time/Hora; default America/Sao_Paulo). O VALOR do atributo time e sempre HH:MM 24h sem fuso embutido — o fuso mora aqui."
20286
20361
  },
20287
20362
  {
20288
20363
  "name": "attribute_key",
@@ -21073,7 +21148,8 @@
21073
21148
  "lionchat_flow_tools_run",
21074
21149
  "lionchat_flow_tools_assistants_update",
21075
21150
  "lionchat_flows_schema_reference"
21076
- ]
21151
+ ],
21152
+ "body_wrapper": "flow"
21077
21153
  },
21078
21154
  {
21079
21155
  "id": "lionchat_flow_tools_update",
@@ -21133,7 +21209,8 @@
21133
21209
  ],
21134
21210
  "related_tools": [
21135
21211
  "lionchat_flow_tools_run"
21136
- ]
21212
+ ],
21213
+ "body_wrapper": "flow"
21137
21214
  },
21138
21215
  {
21139
21216
  "id": "lionchat_flow_tools_destroy",
@@ -21202,6 +21279,13 @@
21202
21279
  "location": "body",
21203
21280
  "required": false,
21204
21281
  "description": "Parâmetros de entrada do flow, ex: { \"numero_pedido\": \"123\" }"
21282
+ },
21283
+ {
21284
+ "name": "conversation_display_id",
21285
+ "type": "integer",
21286
+ "location": "body",
21287
+ "required": false,
21288
+ "description": "Modo Simulacao (dry-run): usa uma conversa REAL como contexto (contato/atributos) sem enviar nem alterar nada. Essencial pra testar tools que dependem de atributos do contato. ADMIN-ONLY."
21205
21289
  }
21206
21290
  ],
21207
21291
  "returns": "{ execution_id, status, output_result, variables, execution_log, error_message, duration_ms }",
@@ -24701,6 +24785,32 @@
24701
24785
  "lionchat_contacts_update"
24702
24786
  ]
24703
24787
  },
24788
+ {
24789
+ "id": "lionchat_conversations_captain_history_reset",
24790
+ "method": "POST",
24791
+ "path": "/api/v1/accounts/{account_id}/conversations/{conversation_id}/captain_history_reset",
24792
+ "title": "Resetar Historico da IA na Conversa",
24793
+ "description": "Cria um marco de reset na conversa: a partir dele, TODA leitura autonoma da IA (respostas do AI Agente, resumos automaticos, follow-up, nos de IA do FlowBuilder) considera apenas mensagens posteriores ao marco. Nao apaga nada — o atendente continua vendo a conversa inteira. Uso tipico: testar um prompt/cenario novo do zero na mesma conversa. Enterprise-only. Sem body.",
24794
+ "category": "IA / Captain",
24795
+ "params": [
24796
+ {
24797
+ "name": "conversation_id",
24798
+ "type": "integer",
24799
+ "location": "path",
24800
+ "required": true,
24801
+ "description": "ID de exibicao da conversa (display_id)"
24802
+ }
24803
+ ],
24804
+ "returns": "{ message_id } da pilula de marco criada",
24805
+ "common_use_cases": [
24806
+ "Testar como a IA responde do zero apos mudar prompt/cenario, sem criar outra conversa",
24807
+ "Fazer a IA esquecer contexto antigo ja superado numa conversa longa"
24808
+ ],
24809
+ "related_tools": [
24810
+ "lionchat_captain_assistants_update",
24811
+ "lionchat_conversations_show"
24812
+ ]
24813
+ },
24704
24814
  {
24705
24815
  "id": "lionchat_wavoip_should_ring",
24706
24816
  "method": "GET",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionchat/mcp-server",
3
- "version": "0.5.11",
3
+ "version": "0.5.13",
4
4
  "description": "MCP server for LionChat API — 547 tools + 10 resources + 9 prompts. Audit-log aware, completion API, progress notifications.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",