@lionchat/mcp-server 1.1.0 → 1.3.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.
@@ -353,6 +353,7 @@ Quando o cliente pedir pra criar um fluxo:
353
353
  6. **NUNCA crie** nodes sem `position: {x, y}` — eles ficam empilhados no canvas
354
354
  7. **NUNCA invente** `sourceHandle` — use só os listados no design guide por tipo de node (ex: condition usa `cond_0`/`cond_1`/`default`, não IDs livres)
355
355
  8. Antes de chamar `flows_create`, apresente um resumo em **linguagem natural** do que vai criar e confirme com o cliente
356
+ 9. **Organize com tags (novo 22/07):** ao criar um flow, preencha o campo `tags` pra manter a lista organizada (ex.: `["vendas"]`, `["pos-venda", "cobranca"]`). **Reutilize as tags que já existem** nos flows da conta (veja o campo `tags` no retorno de `flows_list`) em vez de inventar variações — "venda"/"Vendas"/"VENDA" viram bagunça. Sem tag óbvia pelo contexto, pergunte ao cliente em qual grupo o flow se encaixa. Máx 20 tags por flow, 50 caracteres cada
356
357
 
357
358
  ## 12. Idioma das respostas
358
359
 
@@ -198,6 +198,20 @@ Ou para listas grandes (cursors):
198
198
  - `includes` / `excludes` (relacionamentos)
199
199
  - `before` / `after` (datas)
200
200
 
201
+ ### Atributos personalizados — operadores por TIPO (2026-07-21)
202
+
203
+ Vale pra automações, filtro avançado de conversas/contatos e busca "+ Filtro" (motor compartilhado):
204
+
205
+ | Tipo do atributo | Operadores aceitos |
206
+ |---|---|
207
+ | texto / link | equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present |
208
+ | lista | equal_to, not_equal_to, is_present, is_not_present |
209
+ | número / data | equal_to, not_equal_to, is_present, is_not_present, is_greater_than, is_less_than |
210
+ | sim/não (checkbox) | equal_to, not_equal_to, is_present, is_not_present |
211
+
212
+ - Em atributo de LISTA, `equal_to` com vários `values[]` casa QUALQUER um deles (multi-seleção).
213
+ - NUNCA use `contains` em número/data/checkbox — o backend rejeita (cast inválido).
214
+
201
215
  > **Contatos — busca parcial por nome/ID externo:** no `POST /contacts/filter`, os campos `name` e
202
216
  > `identifier` aceitam `contains` / `does_not_contain` (match parcial, case-insensitive). Use isso
203
217
  > pra "contatos cujo nome contém X" sem precisar do valor exato.
@@ -219,7 +233,10 @@ Ou para listas grandes (cursors):
219
233
  ### Timezone
220
234
 
221
235
  - Default: `America/Sao_Paulo` (UTC-3, sem DST atualmente)
222
- - Conta pode ter `locale` próprio mas timezone segue config do servidor
236
+ - A CONTA tem fuso próprio (2026-07-21): Configurações > Conta, gravado em
237
+ `custom_attributes.timezone` (IANA, ex. `America/Manaus`) via atualização da conta —
238
+ vem no topo do payload da conta (`timezone`). Caixas novas e o FlowBuilder herdam.
239
+ Valor inválido é DESCARTADO em silêncio — confirme com um GET depois de gravar.
223
240
  - Pra evitar bugs, sempre passe timezone explícito
224
241
 
225
242
  ### Custom attributes de data/hora — formato canônico (2026-07-06)
@@ -211,8 +211,9 @@ As instruções aceitam variáveis Liquid `{{ }}` que chegam JÁ PREENCHIDAS com
211
211
 
212
212
  - Contato: `{{contact.name}}`, `{{contact.first_name}}`, `{{contact.last_name}}`, `{{contact.email}}`, `{{contact.phone}}`, `{{contact.cpf}}`, `{{contact.cnpj}}`, `{{contact.rg}}`, `{{contact.date_of_birth}}`, `{{contact.profession}}`, `{{contact.address.city}}` (e `.cep`/`.street`/`.number`/`.neighborhood`/`.state`...), `{{contact.custom_attribute.<chave>}}`.
213
213
  - Conversa: `{{conversation.display_id}}`, `{{conversation.custom_attribute.<chave>}}`.
214
- - Variável sem valor sai vazia (não quebra). Texto SEM `{{` sai idêntico (preserva o cache do prompt) — só use variável quando agregar.
215
- - ATENÇÃO: variável de CONTA NÃO funciona aqui — `{{account.custom_attribute.<chave>}}` (slogan, endereço...) sai VAZIA dentro das instruções do AI Agente (o contexto só tem `contact` e `conversation`, proteção contra vazar secret). Pra um valor fixo da empresa no prompt, escreva o valor literal no texto.
214
+ - Variável sem valor sai vazia (não quebra). Texto SEM `{{` sai idêntico (preserva o cache do prompt) — só use variável quando agregar. Erro de digitação (filtro inválido, `{{` sem fechar) degrada suave: o pedaço com erro sai vazio e o resto das variáveis continua resolvendo (exceção: bloco `{% %}` sem fechar ainda cai pra texto cru).
215
+ - Conta (2026-07): `{{account.custom_attribute.<chave>}}` (slogan, endereço...) AGORA resolve nas instruções e cenários — MAS só os atributos de conta que você DEFINIU (via `account_variables_create`); campos internos de faturamento e secrets NUNCA aparecem no autocomplete nem resolvem. O editor de Instruções/Cenários já sugere essas variáveis de conta ao digitar `{{`.
216
+ - Simulador/Playground: agora também substitui as variáveis (com os dados do painel de teste). Obs.: CPF/CNPJ/endereço não são coletados no painel, então saem vazios só no teste (na conversa real funcionam).
216
217
 
217
218
  ## Conhecimento passivo da IA: FAQ + artigos (RAG) (2026-06)
218
219
 
@@ -130,10 +130,16 @@ Se `captain_assistant_id` foi setado (manual ou via automação):
130
130
 
131
131
  ### 6. Estado "pending" (status 2)
132
132
 
133
- Conversa em "pending" significa "aguardando algo":
134
- - Cliente respondeu mas agente ainda não viu
135
- - OU agente respondeu e tá aguardando cliente
136
- - Geralmente movida automaticamente por automação ("se 24h sem resposta → pending")
133
+ Conversa em "pending" significa "aguardando algo" — status HUMANO reativado (2026-07-20,
134
+ handoff consultor→gestor). Pendente só acontece por ação explícita:
135
+ - Botão "Deixar pendente" no painel
136
+ - Ação de automação `pending_conversation`
137
+ - Node `change_status` do FlowBuilder com `status: pending`
138
+ - Ferramenta nativa da IA (deixar conversa pendente)
139
+
140
+ Comportamentos importantes:
141
+ - Mensagem nova do cliente NÃO reabre conversa pendente (segue pendente na lista)
142
+ - Pendente ATRIBUÍDA notifica o responsável (o gestor recebe o aviso)
137
143
 
138
144
  ### 7. Resolução (status 1)
139
145
 
@@ -60,7 +60,7 @@ Todo node tem essa estrutura base:
60
60
  }
61
61
  ```
62
62
 
63
- **Triggers válidos:** `message_received`, `message_sent`, `conversation_created`, `conversation_resolved`, `conversation_reopened`, `label_added`, `label_removed`, `card_created`, `card_moved`, `conversation_attribute_changed`, `card_attribute_changed`, `date_trigger`, `cron`, `webhook`.
63
+ **Triggers válidos:** `message_received`, `message_sent`, `conversation_created`, `conversation_resolved`, `conversation_reopened`, `label_added`, `label_removed`, `card_created`, `card_moved`, `conversation_attribute_changed`, `card_attribute_changed`, `contact_attribute_changed`, `date_trigger`, `cron`, `webhook`.
64
64
 
65
65
  **Trigger `message_sent` (novo 2026-06-11):** par do message_received, mas pra mensagens de SAÍDA — dispara quando atendente, celular (eco do WhatsApp) ou a própria IA/flow envia mensagem (nota privada NÃO dispara). Config: `keywords` (opcional) + `match_type` (`contains`|`exact`). Caso de uso clássico: "quando eu responder do celular, desligar a IA". ATENÇÃO: mensagem da IA também dispara — se a ação for desativar a IA, use keywords que só humanos digitam ou aceite que a primeira resposta da IA aciona o flow. Protegido por anti-loop (profundidade 5) e sessão única por conversa+flow; nunca alimenta `waiting_input`.
66
66
 
@@ -70,6 +70,7 @@ Todo node tem essa estrutura base:
70
70
  - `label_added` / `label_removed`: `label_names` (array de slugs). NÃO use `label` (singular) — é ignorado.
71
71
  - `card_created` / `card_moved`: `funnel_ids` (array de STRINGS, ex.: `["37"]` — número puro `[37]` NÃO casa) + `funnel_stages` (array de `"funnel_id:chave_da_etapa"`, ex.: `"37:agendamento_pendente"`). A `chave_da_etapa` é a CHAVE INTERNA da etapa no funil (slug legível em funis de template; pode ser um UUID/`stage_<n>` em etapa criada à mão ou funil duplicado) — NÃO o nome exibido na tela. Sem `funnel_ids` → dispara em qualquer funil; com `funnel_ids` mas sem `funnel_stages` → qualquer etapa daquele(s) funil(is). O card precisa estar num funil listado em `funnel_ids` pra o filtro de etapa valer. ATENÇÃO: dois flows ATIVOS na mesma inbox com `card_created`/`card_moved` de funil/etapa sobrepostos são bloqueados na criação/ativação (ver `flow_trigger_conflict` no fim deste guia).
72
72
  - `conversation_attribute_changed` / `card_attribute_changed` (novo 2026-07-08): disparam na VIRADA de um atributo (da CONVERSA ou do CARD do kanban) pro valor que casa — RE-ENTRAM toda vez que o atributo muda pro valor alvo. Config: `{ "logic": "and"|"or", "rules": [ { "attr_key": "...", "operator": "...", "value": "..." } ] }` (uma rule pode usar `values: [...]` no lugar de `value` pra multi-valor). O `attrSource` é IMPLÍCITO pela chave do gatilho (conversa vs card) — NÃO informe. Operadores (contexto REATIVO — desde 09/07 `is_empty`/`is_not_empty` NÃO valem aqui, pois "está vazio AGORA" dispararia a cada evento; use-os só no nó Condição): `equal`/`not_equal`/`contains`/`not_contains`/`starts_with`/`ends_with`/`greater_than`/`less_than`/`number_range`. Só `card_attribute_changed` aceita `funnel_id`/`card_source` opcionais dentro da rule (pra achar o card). Rule sem `attr_key` é ignorada.
73
+ - `contact_attribute_changed` (novo 2026-07-22 — "Atributo do contato muda"): dispara quando um atributo personalizado do **CONTATO** muda e a condição casa — mesmo com o contato fora de flow. Item: `{ "key": "contact_attribute_changed", "config": { "logic": "and"|"or", "rules": [ { "attrSource": "contact", "attr_key": "...", "operator": "...", "value": "..." } ] } }` (1 a 10 rules; `values: [...]` pra multi-valor). **DIFERENTE dos irmãos de 08/07: aqui o `attrSource` VAI na rule e é SEMPRE `"contact"`.** Operadores iguais aos do nó Condição. **VERSÃO SEGURA por decisão de produto:** dispara SÓ na conversa mais recente que JÁ EXISTE numa caixa do flow (reabre se resolvida); contato sem conversa NÃO dispara e NUNCA cria conversa. Dedup de 30s por contato + anti-loop por profundidade de cadeia (flow que muda atributo que dispara flow…). Só flows de conversa.
73
74
 
74
75
  - `date_trigger` — **Gatilho de Data (novo 2026-07-10):** dispara quando uma DATA guardada na ficha do CONTATO chega (aniversário, data de exame, vencimento de plano). Modelo "agendamento de mensagem": a escrita da data já marca o disparo — NÃO existe varredura periódica. Só em flow `conversation` **individual** (a data é de um contato; grupo não tem). Config (item usa `config` ANINHADO, igual `webhook_received`/`attribute_changed`):
75
76
  ```json
@@ -152,6 +153,11 @@ Webhooks embutidos NÃO aparecem na listagem de integrações standalone; exclui
152
153
  - `buttons_reminder_text` (string) → texto do lembrete (só no modo `remind`; vazio = reenvia o conteúdo original).
153
154
  - **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.
154
155
 
156
+ **Botões em TEMPLATE (novo 2026-07-22):** item de template com botões quick-reply também PAUSA e roteia pelo clique — mesmo motor do texto-com-botões. O item DEVE ter `type: "template"` (**NÃO** `whatsapp_template` — o canvas só expõe os handles com `"template"`) + `template_id` + `template_buttons: [ { "title": "...", "value": "..." } ]`:
157
+ - `title` = texto **EXATO** do botão quick-reply aprovado na Meta (o WhatsApp devolve o TÍTULO no clique; o match é por ele). `value` = slug do título (deduplicado se dois títulos colidem).
158
+ - Handles: `button_<value>` por botão + `no_response` (sempre — texto livre em vez de clique) + `no_reply_timeout` (só com `buttons_timeout > 0`; `buttons_timeout_unit` `minutes|hours|days`; `0` = sem timeout).
159
+ - Modo síncrono (`ai_tool`) e `dry_run` NÃO pausam/roteiam — o template só é enviado (botões decorativos). Só faz sentido em caixa WhatsApp com template de botões aprovado.
160
+
155
161
  > ⚠️ **SAÍDAS CONDICIONAIS — NUNCA ligue edge nelas sem ativar a condição.** Estas saídas SÓ existem
156
162
  > quando a config abaixo está presente. Ligar edge nelas sem isso cria uma **aresta fantasma** (linha
157
163
  > que sai do nada no canvas, não roteia nada):
@@ -282,7 +288,7 @@ No editor visual esses destinos só aparecem quando a validação bate (computed
282
288
  | `contains` / `not_contains` | substring |
283
289
  | `starts_with` / `ends_with` | prefixo/sufixo |
284
290
  | `is_empty` / `is_not_empty` | vazio/preenchido (NÃO existe `is_present`/`is_blank`) |
285
- | `greater_than` / `less_than` | comparação numérica |
291
+ | `greater_than` / `less_than` | comparação numérica (atributo número) OU de DATA (atributo `date`, `value` ISO `YYYY-MM-DD`). O backend detecta data ISO no valor do atributo e compara como data; senão numérico |
286
292
  | `number_range` | faixa; `value` no formato `"min-max"` (ex `"10-50"`) |
287
293
  | `has_length` | comprimento exato (`value` = número) |
288
294
  | `is_number` / `is_letter` / `is_email` / `is_phone` | validação de formato |
@@ -300,10 +306,12 @@ No editor visual esses destinos só aparecem quando a validação bate (computed
300
306
  **Restrição por TIPO de atributo (a UI só oferece um subconjunto, e é o que faz sentido):**
301
307
  - **Texto/string:** `equal`, `not_equal`, `contains`, `not_contains`, `starts_with`, `ends_with`, `is_empty`, `is_not_empty`
302
308
  - **Número:** `equal`, `not_equal`, `greater_than`, `less_than`, `number_range`, `is_empty`, `is_not_empty`
303
- - **Lista/Data:** `equal`, `not_equal`, `contains`, `not_contains`
304
- - **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"`).
309
+ - **Lista:** `equal`, `not_equal`, `contains`, `not_contains`
310
+ - **Data (`date`):** `equal`, `not_equal`, **`greater_than`, `less_than`** (novo 2026-07-21). Em `greater_than`/`less_than` o `value` é data ISO `YYYY-MM-DD` (UI = calendário). Backend compara como DATA (dia).
311
+ - **Hora (`time`):** `equal`, `not_equal`, **`greater_than`, `less_than`** (novo 2026-07-21), `is_empty`, `is_not_empty`. `value` canônico `"HH:MM"` 24h (UI = seletor de hora). Backend compara por minutos-do-dia. (Também alimenta o campo Horário do node `wait`.)
312
+ - **Data e Hora (`datetime`):** `equal`, `not_equal`, **`greater_than`, `less_than`** (novo 2026-07-21). Em `greater_than`/`less_than` o `value` é ISO `YYYY-MM-DDTHH:MM` (UI = calendário + hora). Backend compara HORÁRIO DE PAREDE (dia+hora até o minuto, IGNORA o fuso — o valor gravado tem offset `-03:00` mas a comparação é feita no relógio local, não no instante UTC).
305
313
 
306
- Use operador numérico (`greater_than`, `less_than`, `number_range`) SÓ em atributo de tipo número.
314
+ `greater_than`/`less_than` valem em atributo número (valor numérico) E temporais `date`/`time`/`datetime` (o backend detecta o formato do valor: instante > dia > minutos > número). `number_range` SÓ em número. Nunca use maior/menor em texto/lista.
307
315
 
308
316
  **SLA — operador `sla_check` (2026-06):** verifica se a conversa está dentro/fora do prazo de SLA. A regra NÃO usa `field`, só `value` (código fixo):
309
317
 
@@ -887,7 +895,7 @@ Nodes nunca devem ficar com a mesma coordenada `(x, y)`. Se dois nodes têm posi
887
895
  | `aiIntentOptions` (array de strings) no node ai | Ignorado | `aiIntents: [{name}]` |
888
896
  | `match_mode` no `message_received` | Ignorado | `match_type` (`exact`/`contains`) |
889
897
  | `label` (singular) em `label_added`/`label_removed` | Ignorado | `label_names: [...]` |
890
- | operador numérico (`greater_than` etc) em atributo texto | UI não oferece; semântica errada | usar só em atributo número |
898
+ | `greater_than`/`less_than` em atributo texto/lista | UI não oferece; semântica errada | usar só em atributo número ou `date` (data ISO) |
891
899
  | inboxes em flow `ai_tool` | Validação rejeita | ai_tool não tem inboxes |
892
900
  | `waitTime: "60"` (string) | Espera Integer | `waitTime: 60` |
893
901
  | `inbox_ids` aninhado em `{flow:{...}}` | No MCP, achata-se sozinho | Passa `inbox_ids: [1, 2]` no nível raiz |
@@ -294,7 +294,7 @@ Funis agora têm visibilidade por usuário. Um funil é visível pra alguém qua
294
294
  - é admin da conta, OU
295
295
  - tem permissão `kanban_view`/`kanban_manage` (custom role), OU
296
296
  - o funil está aberto a todos, OU
297
- - a pessoa participa do funil (está em `settings.agents` ou tem card atribuído)
297
+ - a pessoa participa do funil (está em `settings.agents`, OU é membro de um TIME em `settings.teams` — novo 2026-07-21, membros resolvidos ao vivo — ou tem card atribuído)
298
298
 
299
299
  **Efeitos práticos nas tools:**
300
300
  - `funnels_list` retorna SÓ os funis visíveis pro usuário do token
@@ -235,6 +235,23 @@ telefone extraídos). Em versões antigas a mensagem era descartada.
235
235
  em vez de responder sem saber o que o cliente disse.
236
236
  - Sem AI Agente ativo na conversa = nenhuma resposta de IA (motor antigo V1 foi aposentado).
237
237
  - IA travada pelo anti-loop avisa um humano via notificação (não fica muda).
238
+ - Desde 22/07: quando a IA falha, a nota privada de erro traz o **erro literal da OpenAI** (429 TPM,
239
+ sem saldo, chave inválida) e sai em TODA tentativa falhada — se o cliente pergunta "por que a IA
240
+ parou", leia a última nota privada da conversa que a causa está escrita nela.
241
+ - Desde 22/07: desligar a IA no meio de uma resposta **interrompe na hora** — os blocos restantes
242
+ daquela resposta são abortados antes de ir ao cliente (a despedida do próprio handoff continua saindo).
243
+
244
+ ### "Agente sumiu / não sumiu da lista após excluir" (22/07)
245
+ Exclusão de agente COM reatribuição roda em **segundo plano** (minutos em conta grande): a resposta
246
+ é 202 `{status:'processing'}`, o index de agentes traz `deleting: true` enquanto processa e a linha
247
+ some quando termina. Segunda tentativa durante o processamento = **409 agent_already_being_deleted**
248
+ — é sinal de que JÁ está rodando; não repita a chamada.
249
+
250
+ ### "Participante não recebeu notificação de mensagem nova" (22/07)
251
+ Comportamento novo, não é bug: notificação de nova mensagem vai SÓ pro **responsável** da conversa.
252
+ Participantes continuam vendo a conversa, mas não recebem sino/push a cada mensagem — pra acionar
253
+ alguém específico, use @menção em nota interna (que notifica pelo caminho próprio; a lista de quem
254
+ pode ser mencionado vem de `lionchat_conversations_mentionable_users`).
238
255
 
239
256
  ### "Editei o evento no Google Calendar e não sincronizou"
240
257
  Auto-cura desde 2026-06-09: o vigia horário re-arma o "watch" morto de conexões saudáveis
package/dist/tools.js CHANGED
@@ -283,7 +283,7 @@ function registerListCategoriesTool(server, allEndpoints) {
283
283
  // Helps LLMs build correct flow_data without hitting trial-and-error on
284
284
  // node types, action keys, source handles, etc.
285
285
  function registerFlowsSchemaReferenceTool(server) {
286
- const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-07-10)
286
+ const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-07-22)
287
287
 
288
288
  flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
289
289
 
@@ -320,6 +320,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
320
320
  NAO informe; operadores da condition EXCETO is_empty/is_not_empty (removidos do contexto reativo
321
321
  09/07 — use so no node condition); card_attribute_changed aceita funnel_id/card_source
322
322
  opcionais na rule),
323
+ contact_attribute_changed (NOVO 2026-07-22 — 'Atributo do contato muda': dispara quando um
324
+ custom_attribute do CONTATO muda e a condicao casa, mesmo com o contato fora de flow. Item:
325
+ {key:'contact_attribute_changed', config:{logic:'and'|'or', rules:[{attrSource:'contact',
326
+ attr_key, operator, value | values:[...]}]}} — 1 a 10 regras; DIFERENTE dos irmaos de 08/07,
327
+ aqui o attrSource VAI na rule e e SEMPRE 'contact'; operadores iguais aos do node condition.
328
+ VERSAO SEGURA por decisao de produto: dispara SO na conversa mais recente que JA EXISTE numa
329
+ caixa do flow (reabre se resolvida); contato sem conversa NAO dispara e NUNCA cria conversa.
330
+ Dedup 30s por contato, anti-loop por profundidade de cadeia; so flows de conversa),
323
331
  date_trigger (NOVO 2026-07-10 — Gatilho de Data: dispara quando uma DATA do CONTATO chega,
324
332
  aniversario/exame; modelo agenda, sem varredura; SO flow individual). Item usa config ANINHADO:
325
333
  {type:'date_trigger', config:{ attr_key ('_date_of_birth'=aniversario nativo, OU chave de
@@ -359,6 +367,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
359
367
  buttons_timeout_action: "advance" (padrao, segue no_reply_timeout ao esgotar) | "remind" (manda 1
360
368
  lembrete buttons_reminder_text e CONTINUA esperando; depois segue no_reply_timeout). No modo remind
361
369
  a unidade NAO pode ser days e horas <= 23 (janela 24h do WhatsApp).
370
+ Botoes em TEMPLATE (NOVO 2026-07-22): item de template com botoes quick-reply tambem PAUSA e
371
+ roteia pelo clique. Item DEVE ter type:"template" (NAO whatsapp_template — o canvas so expoe os
372
+ handles com "template") + template_id + template_buttons:[{title,value}] (title = texto EXATO do
373
+ botao aprovado na Meta — o WhatsApp devolve o TITULO no clique e o match e por ele; value = slug
374
+ do titulo, deduplicado). Handles: "button_{value}" por botao + "no_response" (sempre — texto livre)
375
+ + "no_reply_timeout" (so com buttons_timeout > 0; buttons_timeout_unit minutes|hours|days, 0 = sem
376
+ timeout). Modo sincrono (ai_tool) e dry_run NAO pausam — o template so e enviado. So faz sentido
377
+ em caixa WhatsApp com template de botoes quick-reply aprovado.
362
378
  Handles sem botoes: "success", "error".
363
379
 
364
380
  ▸ wait_response
@@ -423,7 +439,11 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
423
439
  NAO no formato "37:etapa"), pagetrack_visited/pagetrack_event,
424
440
  sla_check (SO value, codigo fixo: frt_breached/frt_ok/nrt_breached/nrt_ok/rt_breached/rt_ok/has_sla/no_sla;
425
441
  frt=primeira resp, nrt=proxima, rt=resolucao; _ok exige politica de SLA aplicada).
426
- Operador numerico SO em atributo numero.
442
+ greater_than/less_than: atributo numero (valor numerico) OU temporais (novo 2026-07-21) —
443
+ date (value ISO YYYY-MM-DD, compara por DIA), time (value "HH:MM", compara minutos-do-dia),
444
+ datetime (value "YYYY-MM-DDTHH:MM", compara HORARIO DE PAREDE — ignora fuso/offset).
445
+ Backend detecta o FORMATO do value: instante > dia > minutos > numero.
446
+ number_range SO em numero. NUNCA maior/menor em texto/lista.
427
447
 
428
448
  ▸ action
429
449
  data: { label, items: [ { key, config: {...} } ] }
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
@@ -7,7 +7,7 @@
7
7
  "description": "Retorna detalhes da conta atualmente autenticada. Inclui plano, usage limits, custom_attributes, configurações gerais. Use pra entender contexto antes de outras ações.",
8
8
  "category": "Conta",
9
9
  "params": [],
10
- "returns": "{ id, name, plan, usage_limits, custom_attributes, domain, locale, ... }",
10
+ "returns": "{ id, name, plan, usage_limits, custom_attributes, domain, locale, ... } Inclui timezone (fuso próprio da conta, 2026-07-21, default America/Sao_Paulo) no topo do payload.",
11
11
  "common_use_cases": [
12
12
  "Verificar plano e limites antes de criar recursos",
13
13
  "Pegar locale/timezone pra formatar saída",
@@ -36,7 +36,7 @@
36
36
  "method": "PUT",
37
37
  "path": "/api/v1/profile",
38
38
  "title": "Atualizar Perfil",
39
- "description": "Atualiza o perfil do usuário atual. Campos (nested em profile): name, email, display_name, avatar, message_signature, timezone, ui_settings, current_password, password. NÃO altera availability aqui.",
39
+ "description": "Atualiza o perfil do usuário atual. Campos (nested em profile): name, email, display_name, avatar, message_signature, timezone, ui_settings, current_password, password. NÃO altera availability aqui. NOVO 22/07: aceita working_hours_enabled + working_hours (horário comercial único da conta; SLA com only_during_business_hours passa a contar só o expediente).",
40
40
  "category": "Conta",
41
41
  "params": [
42
42
  {
@@ -94,6 +94,20 @@
94
94
  "location": "body",
95
95
  "required": false,
96
96
  "description": "Nova senha"
97
+ },
98
+ {
99
+ "name": "working_hours_enabled",
100
+ "type": "boolean",
101
+ "location": "body",
102
+ "required": false,
103
+ "description": "Liga/desliga o horário comercial NO NÍVEL DA CONTA (novo 22/07). Quando ligado, vale para todas as caixas EXCETO Chat do Site (que mantém o horário individual da caixa)."
104
+ },
105
+ {
106
+ "name": "working_hours",
107
+ "type": "array",
108
+ "location": "body",
109
+ "required": false,
110
+ "description": "Grade de horário comercial da conta: array com os 7 dias, cada um {day_of_week: 0-6 (0=domingo), closed_all_day: bool, open_all_day: bool, open_hour, open_minutes, close_hour, close_minutes}. Mesmo formato do horário de caixa. Ex.: {\"day_of_week\":1,\"closed_all_day\":false,\"open_all_day\":false,\"open_hour\":9,\"open_minutes\":0,\"close_hour\":18,\"close_minutes\":0}. O show da conta retorna working_hours (somente leitura, [] se nunca configurado) e working_hours_enabled."
97
111
  }
98
112
  ],
99
113
  "returns": "perfil do usuário atualizado",
@@ -1073,6 +1087,32 @@
1073
1087
  ],
1074
1088
  "related_tools": []
1075
1089
  },
1090
+ {
1091
+ "id": "lionchat_conversations_mentionable_users",
1092
+ "method": "GET",
1093
+ "path": "/api/v1/accounts/{account_id}/conversations/{conversation_id}/mentionable_users",
1094
+ "title": "Agentes Mencionáveis da Conversa",
1095
+ "description": "Lista os agentes que podem ser @mencionados em nota interna DESTA conversa (novo 22/07) — só quem tem acesso a ela: administradores, membros da caixa, membros do time da conversa e o responsável pelo card. Use antes de criar nota privada com menção: mencionar quem não está na lista não notifica. Regra irmã (comportamento, sem endpoint): notificação de nova mensagem agora vai SÓ para o responsável da conversa; participantes não recebem mais sino/push a cada mensagem (menção notifica pelo caminho próprio).",
1096
+ "category": "Conversas",
1097
+ "params": [
1098
+ {
1099
+ "name": "conversation_id",
1100
+ "type": "integer",
1101
+ "location": "path",
1102
+ "required": true,
1103
+ "description": "display_id da conversa"
1104
+ }
1105
+ ],
1106
+ "returns": "200 {payload: [agentes]} — id, name, email, role, availability_status, thumbnail",
1107
+ "common_use_cases": [
1108
+ "Descobrir quem pode ser mencionado numa nota interna",
1109
+ "Escolher o agente certo para acionar numa conversa"
1110
+ ],
1111
+ "related_tools": [
1112
+ "lionchat_conversations_messages_create",
1113
+ "lionchat_agents_list"
1114
+ ]
1115
+ },
1076
1116
  {
1077
1117
  "id": "lionchat_conversations_list",
1078
1118
  "method": "GET",
@@ -2018,7 +2058,7 @@
2018
2058
  "method": "DELETE",
2019
2059
  "path": "/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages/{id}",
2020
2060
  "title": "Deletar Mensagem",
2021
- "description": "Remove uma mensagem (soft delete). Remove mensagem permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes.",
2061
+ "description": "Remove uma mensagem (soft delete no LionChat). ATENÇÃO por canal (esclarecido 22/07): exclusão que também some do WhatsApp do cliente SÓ existe em caixa WAHA (QR). Em caixa OFICIAL/coex (whatsapp_cloud) a Meta NÃO expõe API de apagar — a mensagem some só do painel e o cliente CONTINUA vendo no WhatsApp dele (o painel nem oferece mais essa opção nesses canais). Confirme o canal antes; ação irreversível.",
2022
2062
  "category": "Mensagens",
2023
2063
  "params": [
2024
2064
  {
@@ -2293,7 +2333,7 @@
2293
2333
  "description": "FUNIL = KANBAN (pipeline/board) — no LionChat sao a mesma coisa. Lista todos os funis com contagem de itens por etapa (cache 5min). NAO e paginado. ACESSO (2026-06): retorna SO os funis visiveis pro usuario do token (admin, permissao kanban, funil aberto ou participante). Funil nao-visivel da 404 no show.",
2294
2334
  "category": "Funis",
2295
2335
  "params": [],
2296
- "returns": "array de funis (cada um com stage_items_count); sem meta/paginacao",
2336
+ "returns": "array de funis (cada um com stage_items_count); sem meta/paginacao Inclui resolved_agents: [{id, name, avatar_url, via: 'agent'|'team'}] — quem efetivamente participa do funil (2026-07-21).",
2297
2337
  "common_use_cases": [
2298
2338
  "Dashboard: contar/exibir funis",
2299
2339
  "Buscar com filtros antes de outra operação",
@@ -2344,7 +2384,7 @@
2344
2384
  "type": "object",
2345
2385
  "location": "body",
2346
2386
  "required": false,
2347
- "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). Cada automacao: {id, enabled, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value (id da etapa p/ stage_moved; status p/ status_change; vazio p/ card_created), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (ex.: move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations)."
2387
+ "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). Cada automacao: {id, enabled, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value (id da etapa p/ stage_moved; status p/ status_change; vazio p/ card_created), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (ex.: move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2348
2388
  },
2349
2389
  {
2350
2390
  "name": "funnel.global_custom_attributes",
@@ -2383,7 +2423,7 @@
2383
2423
  "description": "ID do funil"
2384
2424
  }
2385
2425
  ],
2386
- "returns": "funil (objeto completo com associações)",
2426
+ "returns": "funil (objeto completo com associações) Inclui resolved_agents: [{id, name, avatar_url, via: 'agent'|'team'}] — quem efetivamente participa do funil (2026-07-21).",
2387
2427
  "common_use_cases": [
2388
2428
  "Ver dados completos antes de editar",
2389
2429
  "Verificar estado atual antes de uma ação",
@@ -2425,10 +2465,10 @@
2425
2465
  "type": "object",
2426
2466
  "location": "body",
2427
2467
  "required": false,
2428
- "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). Cada automacao: {id (formato 'automation_<timestamp_ms>'), enabled: true, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value SEMPRE preenchido ('card_created' literal p/ card_created; chave da etapa de destino no hash funnel.stages p/ stage_moved; 'won'|'lost' p/ status_change), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; update_checklist->{checklist_updates:[{checklist_item_id,completed,text}]}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. Regras: trigger_value vazio ou enabled=false fazem a UI descartar a automacao no proximo salvar do usuario; stage_moved + move_to_stage nunca executa (anti-loop); notify_team hoje so registra em log (nao notifica ninguem); update_checklist nao aparece na UI (so via API). ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations)."
2468
+ "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). Cada automacao: {id (formato 'automation_<timestamp_ms>'), enabled: true, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value SEMPRE preenchido ('card_created' literal p/ card_created; chave da etapa de destino no hash funnel.stages p/ stage_moved; 'won'|'lost' p/ status_change), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; update_checklist->{checklist_updates:[{checklist_item_id,completed,text}]}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. Regras: trigger_value vazio ou enabled=false fazem a UI descartar a automacao no proximo salvar do usuario; stage_moved + move_to_stage nunca executa (anti-loop); notify_team hoje so registra em log (nao notifica ninguem); update_checklist nao aparece na UI (so via API). ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2429
2469
  }
2430
2470
  ],
2431
- "returns": "funil atualizado",
2471
+ "returns": "funil atualizado Inclui resolved_agents: [{id, name, avatar_url, via: 'agent'|'team'}] — quem efetivamente participa do funil (2026-07-21).",
2432
2472
  "common_use_cases": [
2433
2473
  "Edição parcial de funil",
2434
2474
  "Alteração de status/estado",
@@ -3826,7 +3866,14 @@
3826
3866
  "type": "string",
3827
3867
  "location": "body",
3828
3868
  "required": true,
3829
- "description": "JSON mapeando coluna do CSV -> campo do contato. Campos aceitos: name, email, phone_number, company, city, labels, instagram, facebook, linkedin, twitter (demais chaves sao ignoradas)"
3869
+ "description": "JSON mapeando coluna do CSV -> campo do contato. Campos aceitos: name, email, phone_number, company, city, labels, instagram, facebook, linkedin, twitter (demais chaves sao ignoradas) Chaves de destino também aceitam prefixo 'custom_attribute:<chave>' (atributo personalizado) e 'cadastral:<campo>' (dados cadastrais)."
3870
+ },
3871
+ {
3872
+ "name": "value_mappings",
3873
+ "type": "object",
3874
+ "location": "body",
3875
+ "required": false,
3876
+ "description": "De-para de VALORES por coluna (2026-07-21), p/ atributos de LISTA e campos cadastrais: {\"<mapping_key>\": {\"<valor da planilha>\": \"<opção do sistema>\" | \"\"}}. mapping_key é PREFIXADO ('custom_attribute:<chave>' ou 'cadastral:<campo>'). Chave ausente = valor cru; opção vazia (\"\") = IGNORAR o valor (campo fica em branco, sem aviso). Match ignora espaços e maiúsculas. Malformado = 422."
3830
3877
  }
3831
3878
  ],
3832
3879
  "returns": "{ import_id } — use import_status para acompanhar o progresso",
@@ -7486,7 +7533,7 @@
7486
7533
  "method": "POST",
7487
7534
  "path": "/api/v1/accounts/{account_id}/macros",
7488
7535
  "title": "Criar Macro",
7489
- "description": "Cria uma nova macro com ações. Cria novo macro. Obrigatórios: name, actions. Valida unicidade quando aplicável. Retorna o macro criado com ID atribuído.",
7536
+ "description": "Cria uma nova macro com ações. Cria novo macro. Obrigatórios: name, actions. Valida unicidade quando aplicável. Retorna o macro criado com ID atribuído. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500).",
7490
7537
  "category": "Macros",
7491
7538
  "params": [
7492
7539
  {
@@ -7548,7 +7595,7 @@
7548
7595
  "method": "PATCH",
7549
7596
  "path": "/api/v1/accounts/{account_id}/macros/{id}",
7550
7597
  "title": "Atualizar Macro",
7551
- "description": "Atualiza macro. Atualiza campos do macro existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: name, actions.",
7598
+ "description": "Atualiza macro. Atualiza campos do macro existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: name, actions. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500).",
7552
7599
  "category": "Macros",
7553
7600
  "params": [
7554
7601
  {
@@ -8679,7 +8726,7 @@
8679
8726
  "type": "string",
8680
8727
  "location": "body",
8681
8728
  "required": false,
8682
- "description": "daily, weekly, monthly, yearly"
8729
+ "description": "Frequência da recorrência. Valores REAIS (corrigido 2026-07-21; 'daily/weekly/monthly/yearly' NUNCA existiram): every_day, every_day_at_time, every_week, every_biweekly, every_month, every_year, every_weekday (dias úteis), every_weekend. Aceita a string direta ou {type: '<valor>'}."
8683
8730
  }
8684
8731
  ],
8685
8732
  "returns": "mensagem agendada criado (com novo ID)",
@@ -8699,7 +8746,7 @@
8699
8746
  "method": "PATCH",
8700
8747
  "path": "/api/v1/accounts/{account_id}/conversations/{conversation_id}/scheduled_messages/{id}",
8701
8748
  "title": "Atualizar Agendada",
8702
- "description": "Atualiza mensagem agendada (wrapper scheduled_message). Campos: content, scheduled_at, title, inbox_id, is_recurrent, period, recurrence_count.",
8749
+ "description": "Atualiza mensagem agendada (wrapper scheduled_message). Campos: content, scheduled_at, title, inbox_id, is_recurrent, period, recurrence_count. (2026-07-21) Trocar o period agora PERSISTE; editar scheduled_at REARMA o envio; mensagem sent/failed editada com data futura VOLTA a pending (reativação — só fluxo manual).",
8703
8750
  "category": "Mensagens Agendadas",
8704
8751
  "params": [
8705
8752
  {
@@ -9150,7 +9197,7 @@
9150
9197
  "method": "GET",
9151
9198
  "path": "/api/v1/accounts/{account_id}/flows",
9152
9199
  "title": "Listar Flows",
9153
- "description": "Lista todos os flows da conta com estatísticas de execução. Lista flows paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de flow).",
9200
+ "description": "Lista todos os flows da conta com estatísticas de execução. Lista flows paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de flow). Cada flow retorna também o campo tags (array de strings, novo 22/07) — use para organizar/agrupar flows.",
9154
9201
  "category": "Flows",
9155
9202
  "params": [],
9156
9203
  "returns": "meta (contadores globais) + payload (array de flows)",
@@ -9166,7 +9213,7 @@
9166
9213
  "method": "POST",
9167
9214
  "path": "/api/v1/accounts/{account_id}/flows",
9168
9215
  "title": "Criar Flow",
9169
- "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'.",
9216
+ "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'. ORGANIZAÇÃO: preencha tags ao criar (reutilizando as tags já existentes nos flows da conta — veja flows_list) pra manter a lista organizada.",
9170
9217
  "category": "Flows",
9171
9218
  "params": [
9172
9219
  {
@@ -9210,6 +9257,13 @@
9210
9257
  "location": "body",
9211
9258
  "required": false,
9212
9259
  "description": "Estrutura {nodes:[], edges:[]} em formato Vue Flow. CONSULTE A DESCRICAO DO TOOL para schema completo dos nodes (start, send_message, wait_response, condition, action, api, set_variable, wait). Cada node tem campo 'data' com formato especifico por tipo. Edges precisam ter sourceHandle correto (ex: 'option_1', 'success', 'timeout', 'no_response')."
9260
+ },
9261
+ {
9262
+ "name": "tags",
9263
+ "type": "array",
9264
+ "location": "body",
9265
+ "required": false,
9266
+ "description": "Tags livres do flow para organização (array de strings; máx 20 tags, cada uma até 50 caracteres; duplicadas por maiúscula/minúscula são unificadas). A lista de flows na tela filtra por Status/Tipo/Caixa/Tags no navegador — não há filtro por query param no index."
9213
9267
  }
9214
9268
  ],
9215
9269
  "returns": "flow criado (com novo ID)",
@@ -9291,6 +9345,13 @@
9291
9345
  "location": "body",
9292
9346
  "required": false,
9293
9347
  "description": "Estrutura {nodes:[], edges:[]} em formato Vue Flow. Ver descricao do tool lionchat_flows_create para schema dos nodes."
9348
+ },
9349
+ {
9350
+ "name": "tags",
9351
+ "type": "array",
9352
+ "location": "body",
9353
+ "required": false,
9354
+ "description": "Tags livres do flow para organização (array de strings; máx 20 tags, cada uma até 50 caracteres; duplicadas por maiúscula/minúscula são unificadas). A lista de flows na tela filtra por Status/Tipo/Caixa/Tags no navegador — não há filtro por query param no index."
9294
9355
  }
9295
9356
  ],
9296
9357
  "returns": "flow atualizado",
@@ -9725,7 +9786,7 @@
9725
9786
  "method": "POST",
9726
9787
  "path": "/api/v1/accounts/{account_id}/automation_rules",
9727
9788
  "title": "Criar Regra de Automacao",
9728
- "description": "Cria uma regra de automacao. event_name validos: conversation_created, conversation_updated, conversation_resolved, message_created, conversation_opened, webhook, kanban_item_created, kanban_item_stage_changed. conditions: [{attribute_key, filter_operator, query_operator, values[]}]. actions: [{action_name, action_params[]}]. Aceita active, inbox_id.",
9789
+ "description": "Cria uma regra de automacao. event_name validos: conversation_created, conversation_updated, conversation_resolved, message_created, conversation_opened, webhook, kanban_item_created, kanban_item_stage_changed. conditions: [{attribute_key, filter_operator, query_operator, values[]}]. actions: [{action_name, action_params[]}]. Aceita active, inbox_id. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500).",
9729
9790
  "category": "Regras de Automacao",
9730
9791
  "params": [
9731
9792
  {
@@ -9761,7 +9822,7 @@
9761
9822
  "type": "array",
9762
9823
  "location": "body",
9763
9824
  "required": true,
9764
- "description": "[{action_name, action_params[]}]"
9825
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre)."
9765
9826
  },
9766
9827
  {
9767
9828
  "name": "active",
@@ -9823,7 +9884,7 @@
9823
9884
  "method": "PUT",
9824
9885
  "path": "/api/v1/accounts/{account_id}/automation_rules/{id}",
9825
9886
  "title": "Atualizar Regra",
9826
- "description": "Atualiza uma regra de automacao (PUT, substituicao completa). Campos: name, event_name, conditions, actions, active, inbox_id.",
9887
+ "description": "Atualiza uma regra de automacao (PUT, substituicao completa). Campos: name, event_name, conditions, actions, active, inbox_id. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500).",
9827
9888
  "category": "Regras de Automacao",
9828
9889
  "params": [
9829
9890
  {
@@ -9859,7 +9920,7 @@
9859
9920
  "type": "array",
9860
9921
  "location": "body",
9861
9922
  "required": false,
9862
- "description": "Acoes"
9923
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre)."
9863
9924
  }
9864
9925
  ],
9865
9926
  "returns": "regra de automação atualizado",
@@ -13533,7 +13594,7 @@
13533
13594
  "method": "POST",
13534
13595
  "path": "/api/v1/accounts/{account_id}/sla_policies",
13535
13596
  "title": "Criar Politica SLA",
13536
- "description": "Cria uma politica de SLA. ENTERPRISE-only. Body exige wrapper sla_policy. Thresholds em segundos (float).",
13597
+ "description": "Cria uma politica de SLA. ENTERPRISE-only. Body exige wrapper sla_policy. Thresholds em segundos (float). NOVO 22/07: only_during_business_hours agora é EFETIVO — o relógio do SLA conta só os segundos dentro do horário comercial (Chat do Site usa o horário da própria caixa; demais canais usam o horário comercial da CONTA, se ligado; tudo fechado = volta a contar 24/7).",
13537
13598
  "category": "SLA",
13538
13599
  "params": [
13539
13600
  {
@@ -13617,7 +13678,7 @@
13617
13678
  "method": "PUT",
13618
13679
  "path": "/api/v1/accounts/{account_id}/sla_policies/{id}",
13619
13680
  "title": "Atualizar SLA",
13620
- "description": "Atualiza uma politica de SLA. ENTERPRISE-only. Wrapper sla_policy.",
13681
+ "description": "Atualiza uma politica de SLA. ENTERPRISE-only. Wrapper sla_policy. NOVO 22/07: only_during_business_hours agora é EFETIVO — o relógio do SLA conta só os segundos dentro do horário comercial (Chat do Site usa o horário da própria caixa; demais canais usam o horário comercial da CONTA, se ligado; tudo fechado = volta a contar 24/7).",
13621
13682
  "category": "SLA",
13622
13683
  "params": [
13623
13684
  {
@@ -13785,7 +13846,7 @@
13785
13846
  "method": "POST",
13786
13847
  "path": "/api/v1/accounts/{account_id}/support_access",
13787
13848
  "title": "Solicitar Acesso de Suporte",
13788
- "description": "Concede acesso de suporte (SuperAdmin) à conta. Obrigatório: support_agent_email.",
13849
+ "description": "Concede acesso de suporte (SuperAdmin) à conta. Obrigatório: support_agent_email. Grantee pode ser SuperAdmin OU usuário marcado como 'usuário de suporte' no Super Admin (isenção de vaga). 422 se o e-mail já for agente pago regular da conta (sem grant prévio).",
13789
13850
  "category": "Acesso de Suporte",
13790
13851
  "params": [
13791
13852
  {
@@ -13808,6 +13869,20 @@
13808
13869
  "location": "body",
13809
13870
  "required": false,
13810
13871
  "description": "Texto de consentimento LGPD"
13872
+ },
13873
+ {
13874
+ "name": "duration_hours",
13875
+ "type": "integer",
13876
+ "location": "body",
13877
+ "required": false,
13878
+ "description": "Duração do acesso em horas (respeita o teto do servidor). Ignorado quando lifetime=true."
13879
+ },
13880
+ {
13881
+ "name": "lifetime",
13882
+ "type": "boolean",
13883
+ "location": "body",
13884
+ "required": false,
13885
+ "description": "true = acesso VITALÍCIO (2026-07-21): não expira e não agenda revogação automática."
13811
13886
  }
13812
13887
  ],
13813
13888
  "returns": "acesso de suporte criado (com novo ID)",
@@ -20214,6 +20289,13 @@
20214
20289
  "location": "body",
20215
20290
  "required": false,
20216
20291
  "description": "Lista COMPLETA das caixas desejadas para o agente, com o cargo (reconcilia: adiciona, remove e ajusta o cargo). Array de objetos { inbox_id, supervisor }, ex: [{\"inbox_id\": 82, \"supervisor\": false}, {\"inbox_id\": 91, \"supervisor\": true}]. supervisor=false => Agente; supervisor=true => Supervisor. Omitir o campo mantem as caixas atuais intactas. Use lionchat_inboxes_list para obter os IDs."
20292
+ },
20293
+ {
20294
+ "name": "email",
20295
+ "type": "string",
20296
+ "location": "body",
20297
+ "required": false,
20298
+ "description": "Novo e-mail do agente (2026-07-21). A troca exige confirmação: o link vai pro e-mail NOVO e o antigo continua valendo até confirmar (sem lockout). Agente ainda não confirmado troca direto."
20217
20299
  }
20218
20300
  ],
20219
20301
  "returns": "agente atualizado",
@@ -20234,7 +20316,7 @@
20234
20316
  "method": "DELETE",
20235
20317
  "path": "/api/v1/accounts/{account_id}/agents/{id}",
20236
20318
  "title": "Excluir Agente",
20237
- "description": "Remove um agente da conta. ATENÇÃO: se o agente tiver recursos vinculados (conversas, times, inboxes etc.), o parâmetro reassign_to_agent_id é OBRIGATÓRIO para reatribuir esses recursos a outro agente — sem ele a exclusão é recusada. Use lionchat_agents_assigned_resources antes para checar dependências.",
20319
+ "description": "Remove um agente da conta. Se o agente tiver recursos vinculados (conversas, times, inboxes etc.), reassign_to_agent_id é OBRIGATÓRIO (sem ele: 422). NOVO 22/07: a exclusão COM reatribuição roda em SEGUNDO PLANO (pode levar minutos em conta grande) — a resposta é 202 {status:'processing'} e o agente some da lista só quando o job termina; enquanto isso o index de agentes traz a flag deleting=true no agente. Tentar excluir de novo durante o processamento retorna 409 {error:'agent_already_being_deleted'} — NÃO repita a chamada, aguarde. Use lionchat_agents_assigned_resources antes para checar dependências.",
20238
20320
  "category": "Agentes",
20239
20321
  "params": [
20240
20322
  {
@@ -20252,7 +20334,7 @@
20252
20334
  "description": "ID do agente que receberá os recursos. Obrigatório quando o agente possui recursos vinculados."
20253
20335
  }
20254
20336
  ],
20255
- "returns": "200 OK",
20337
+ "returns": "200 OK (sem recursos, síncrono) | 202 Accepted {status:'processing'} (com reatribuição, roda em 2º plano) | 409 agent_already_being_deleted (exclusão já em andamento) | 422 (reassign_to_agent_id faltando ou igual ao próprio agente) | 404 (agente de destino inexistente)",
20256
20338
  "common_use_cases": [
20257
20339
  "Desligar um agente reatribuindo suas conversas",
20258
20340
  "Limpeza de agentes inativos",
@@ -25009,5 +25091,170 @@
25009
25091
  "related_tools": [
25010
25092
  "lionchat_flows_scheduled_firings_list"
25011
25093
  ]
25094
+ },
25095
+ {
25096
+ "id": "lionchat_contacts_import_validate",
25097
+ "method": "POST",
25098
+ "path": "/api/v1/accounts/{account_id}/contacts/import_validate",
25099
+ "title": "Validar Import de Contatos (pré-check)",
25100
+ "description": "Valida o CSV de import ANTES de importar: confere tipos dos valores contra os atributos de destino (data, número, lista...) e devolve os problemas por linha/coluna. Aceita os mesmos file + mappings + value_mappings do import_csv. Use pra conferir antes de rodar o import de verdade.",
25101
+ "category": "Contatos",
25102
+ "params": [
25103
+ {
25104
+ "name": "file",
25105
+ "type": "string",
25106
+ "location": "body",
25107
+ "required": true,
25108
+ "description": "Arquivo CSV (mesmo formato do import_csv)"
25109
+ },
25110
+ {
25111
+ "name": "mappings",
25112
+ "type": "object",
25113
+ "location": "body",
25114
+ "required": false,
25115
+ "description": "Mapeamento coluna→campo (mesmo formato do import_csv, com prefixos custom_attribute:/cadastral:)"
25116
+ },
25117
+ {
25118
+ "name": "value_mappings",
25119
+ "type": "object",
25120
+ "location": "body",
25121
+ "required": false,
25122
+ "description": "De-para de valores (mesmo formato do import_csv)"
25123
+ }
25124
+ ],
25125
+ "returns": "Resultado da validação com problemas por linha/coluna (tipos incompatíveis, valores fora da lista)",
25126
+ "common_use_cases": [
25127
+ "Conferir a planilha antes do import definitivo"
25128
+ ],
25129
+ "related_tools": [
25130
+ "lionchat_contacts_create_8",
25131
+ "lionchat_contacts_create_7",
25132
+ "lionchat_contacts_show_1"
25133
+ ]
25134
+ },
25135
+ {
25136
+ "id": "lionchat_account_settings_update",
25137
+ "method": "PUT",
25138
+ "path": "/api/v1/accounts/{account_id}",
25139
+ "title": "Atualizar Configurações da Conta",
25140
+ "description": "Atualiza as configurações GERAIS da conta (Configurações > Conta). Inclui o FUSO HORÁRIO próprio da conta (novo 2026-07-21): timezone IANA, default America/Sao_Paulo — caixas novas e o Gatilho de Data do FlowBuilder herdam. ATENÇÃO: timezone inválido é DESCARTADO em silêncio (não dá erro) — confirme com account_show depois. Não confundir com account_update (que é o PERFIL do usuário logado).",
25141
+ "category": "Conta",
25142
+ "params": [
25143
+ {
25144
+ "name": "name",
25145
+ "type": "string",
25146
+ "location": "body",
25147
+ "required": false,
25148
+ "description": "Nome da conta"
25149
+ },
25150
+ {
25151
+ "name": "locale",
25152
+ "type": "string",
25153
+ "location": "body",
25154
+ "required": false,
25155
+ "description": "Idioma da conta (ex. pt_BR)"
25156
+ },
25157
+ {
25158
+ "name": "support_email",
25159
+ "type": "string",
25160
+ "location": "body",
25161
+ "required": false,
25162
+ "description": "E-mail de suporte da conta"
25163
+ },
25164
+ {
25165
+ "name": "domain",
25166
+ "type": "string",
25167
+ "location": "body",
25168
+ "required": false,
25169
+ "description": "Domínio da conta"
25170
+ },
25171
+ {
25172
+ "name": "timezone",
25173
+ "type": "string",
25174
+ "location": "body",
25175
+ "required": false,
25176
+ "description": "Fuso horário IANA da conta (ex. America/Sao_Paulo, America/Manaus). Gravado em custom_attributes.timezone; vem no topo do payload da conta. Inválido = ignorado em silêncio."
25177
+ }
25178
+ ],
25179
+ "returns": "Conta atualizada (payload completo, com timezone no topo)",
25180
+ "common_use_cases": [
25181
+ "Mudar o fuso horário da conta",
25182
+ "Atualizar nome/idioma/e-mail de suporte"
25183
+ ],
25184
+ "related_tools": [
25185
+ "lionchat_account_show",
25186
+ "lionchat_current_account"
25187
+ ]
25188
+ },
25189
+ {
25190
+ "id": "lionchat_team_members_kanban_reassignment_preview",
25191
+ "method": "POST",
25192
+ "path": "/api/v1/accounts/{account_id}/teams/{team_id}/team_members/kanban_reassignment_preview",
25193
+ "title": "Prévia de reatribuição de cards (remover agente do time)",
25194
+ "description": "Antes de remover agentes de um time VINCULADO a funil Kanban (settings.teams), mostra quais cards ficariam órfãos por agente que perde acesso. Envie user_ids = a lista COMPLETA desejada de membros (quem ficar de fora é tratado como removido).",
25195
+ "category": "Times",
25196
+ "params": [
25197
+ {
25198
+ "name": "team_id",
25199
+ "type": "integer",
25200
+ "location": "path",
25201
+ "required": true,
25202
+ "description": "ID do time"
25203
+ },
25204
+ {
25205
+ "name": "user_ids",
25206
+ "type": "array",
25207
+ "location": "body",
25208
+ "required": true,
25209
+ "description": "Lista COMPLETA de membros desejada após a mudança (não a lista de removidos)"
25210
+ }
25211
+ ],
25212
+ "returns": "{ reassignments: [...] } — por agente removido, os funis/cards afetados que precisarão de novo dono",
25213
+ "common_use_cases": [
25214
+ "Ver o impacto antes de tirar alguém de um time ligado a funil"
25215
+ ],
25216
+ "related_tools": [
25217
+ "lionchat_team_members_remove_agents_with_reassignment",
25218
+ "lionchat_funnels_show"
25219
+ ]
25220
+ },
25221
+ {
25222
+ "id": "lionchat_team_members_remove_agents_with_reassignment",
25223
+ "method": "POST",
25224
+ "path": "/api/v1/accounts/{account_id}/teams/{team_id}/team_members/remove_agents_with_reassignment",
25225
+ "title": "Remover agentes do time reatribuindo os cards",
25226
+ "description": "Remove agentes de um time vinculado a funil Kanban REATRIBUINDO os cards deles em uma operação atômica (2026-07-21). Use a prévia (kanban_reassignment_preview) antes pra montar o destino por funil. 422 {error: 'reassignment_failed'} se algum destino for inválido — nada é aplicado.",
25227
+ "category": "Times",
25228
+ "params": [
25229
+ {
25230
+ "name": "team_id",
25231
+ "type": "integer",
25232
+ "location": "path",
25233
+ "required": true,
25234
+ "description": "ID do time"
25235
+ },
25236
+ {
25237
+ "name": "user_ids",
25238
+ "type": "array",
25239
+ "location": "body",
25240
+ "required": true,
25241
+ "description": "Lista COMPLETA de membros desejada após a mudança"
25242
+ },
25243
+ {
25244
+ "name": "reassignments",
25245
+ "type": "object",
25246
+ "location": "body",
25247
+ "required": false,
25248
+ "description": "Destino dos cards por funil pra cada agente removido (shape da prévia)"
25249
+ }
25250
+ ],
25251
+ "returns": "200 com o time atualizado | 422 { error: 'reassignment_failed', reason } (atômico — nada muda)",
25252
+ "common_use_cases": [
25253
+ "Tirar um agente do time sem deixar cards órfãos no funil"
25254
+ ],
25255
+ "related_tools": [
25256
+ "lionchat_team_members_kanban_reassignment_preview",
25257
+ "lionchat_team_members_destroy"
25258
+ ]
25012
25259
  }
25013
25260
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionchat/mcp-server",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "MCP server for LionChat API — 547 tools + 10 resources + 9 prompts. Audit-log aware, completion API, progress notifications.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",