@lionchat/mcp-server 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tools.js CHANGED
@@ -5,7 +5,7 @@ import { substitutePath, buildQueryString, formatResponse, separateParams, } fro
5
5
  import { readFileSync } from 'fs';
6
6
  import { resolve, dirname } from 'path';
7
7
  import { fileURLToPath } from 'url';
8
- import { FULL_RESPONSE_PARAM, FULL_RESPONSE_DESCRIPTION, supportsFullResponse, } from './sanitize.js';
8
+ import { FULL_RESPONSE_PARAM, FULL_RESPONSE_DESCRIPTION, CONFIRM_PARAM, CONFIRM_DESCRIPTION, supportsFullResponse, } from './sanitize.js';
9
9
  // AIDEV-NOTE: Map HTTP method to tool annotations for MCP client hinting
10
10
  function getToolAnnotations(method) {
11
11
  switch (method.toUpperCase()) {
@@ -141,7 +141,7 @@ function paramTypeToZod(param) {
141
141
  // AIDEV-NOTE: [2026-07-24] toolId opcional — tools curadas (sanitize.FULL_RESPONSE_TOOLS)
142
142
  // ganham o param full_response no schema (escape do slim). NAO injetar nas 682 (inflaria
143
143
  // o tools/list em ~20-30k tokens).
144
- function buildZodSchema(params, toolId) {
144
+ function buildZodSchema(params, toolId, confirmRequired = false) {
145
145
  const shape = {};
146
146
  let hasAccountIdInPath = false;
147
147
  for (const param of params) {
@@ -179,6 +179,12 @@ function buildZodSchema(params, toolId) {
179
179
  .optional()
180
180
  .describe(FULL_RESPONSE_DESCRIPTION);
181
181
  }
182
+ // AIDEV-NOTE: [auditoria adversus A3] ferramenta marcada no catalogo ganha o campo `confirm` —
183
+ // OPCIONAL no schema de proposito: quem cobra e o handler, com mensagem que explica o que fazer.
184
+ // Marcar required aqui devolveria erro seco de validacao, sem ensinar nada ao modelo.
185
+ if (confirmRequired) {
186
+ shape[CONFIRM_PARAM] = z.boolean().optional().describe(CONFIRM_DESCRIPTION);
187
+ }
182
188
  return z.object(shape);
183
189
  }
184
190
  // AIDEV-NOTE: Check if endpoint has any file-type params (unsupported in MCP v1)
@@ -187,7 +193,7 @@ function hasFileParam(params) {
187
193
  }
188
194
  // AIDEV-NOTE: Register a single API endpoint as an MCP tool
189
195
  function registerSingleTool(server, config, client, endpoint) {
190
- const schema = buildZodSchema(endpoint.params, endpoint.id);
196
+ const schema = buildZodSchema(endpoint.params, endpoint.id, endpoint.confirm_required);
191
197
  const annotations = getToolAnnotations(endpoint.method);
192
198
  const hasFile = hasFileParam(endpoint.params);
193
199
  // AIDEV-NOTE: Prepend file upload warning to description when endpoint needs file params
@@ -218,6 +224,22 @@ function registerSingleTool(server, config, client, endpoint) {
218
224
  }
219
225
  }
220
226
  }
227
+ // AIDEV-NOTE: [auditoria adversus A3] trava de confirmacao, ANTES de qualquer trabalho —
228
+ // ferramenta que altera o que o cliente ve na tela nao roda sem o OK explicito. Espelha a
229
+ // trava do conector remoto (runner.ts). A anotacao de destrutivo derivada do metodo HTTP
230
+ // nunca cobriu criar (POST) nem alterar (PATCH).
231
+ if (endpoint.confirm_required && params[CONFIRM_PARAM] !== true) {
232
+ return {
233
+ content: [
234
+ {
235
+ type: 'text',
236
+ text: `"${endpoint.id}" altera o que o usuario ve na tela (${endpoint.title}). ` +
237
+ 'Confirme com ele exatamente o que sera criado/alterado/apagado e reenvie com confirm:true.',
238
+ },
239
+ ],
240
+ isError: true,
241
+ };
242
+ }
221
243
  // AIDEV-NOTE: Multi-tenant — input account_id (if provided) overrides env LIONCHAT_ACCOUNT_ID.
222
244
  // Resolve and strip account_id BEFORE bucketing so it never lands in body/query for
223
245
  // endpoints that don't declare it as an explicit param.
@@ -232,6 +254,9 @@ function registerSingleTool(server, config, client, endpoint) {
232
254
  // default->body do separateParams vazaria o campo pro corpo enviado ao Rails.
233
255
  const fullResponse = params[FULL_RESPONSE_PARAM] === true;
234
256
  delete paramsWithoutAccount[FULL_RESPONSE_PARAM];
257
+ // AIDEV-NOTE: `confirm` tambem e flag do CONECTOR — stripar antes do bucketing, senao o
258
+ // catch-all default->body do separateParams mandaria o campo pro Rails.
259
+ delete paramsWithoutAccount[CONFIRM_PARAM];
235
260
  const { pathParams, queryParams, bodyParams } = separateParams(paramsWithoutAccount, endpoint.params, endpoint.body_wrapper);
236
261
  const path = substitutePath(endpoint.path, effectiveAccountId, pathParams);
237
262
  const queryStr = buildQueryString(queryParams);
@@ -307,7 +332,7 @@ function registerListCategoriesTool(server, allEndpoints) {
307
332
  // Helps LLMs build correct flow_data without hitting trial-and-error on
308
333
  // node types, action keys, source handles, etc.
309
334
  function registerFlowsSchemaReferenceTool(server) {
310
- const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-08-18)
335
+ const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-08-21)
311
336
 
312
337
  flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
313
338
 
@@ -332,7 +357,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
332
357
  ═══ NODE TYPES + source handles ═══
333
358
 
334
359
  ▸ start
335
- data: { label, triggers: [...] }
360
+ data: { label, items: [ {key:'<gatilho>', config:{...filtros...}} ] }
361
+ ATENCAO — a chave e "items" e o item usa "key"+"config" (corrigido 19/08/2026). NAO use
362
+ "triggers" com "type" e filtros soltos no topo: o motor ainda aceita esse formato antigo, mas o
363
+ EDITOR do FlowBuilder le SO "items" — fluxo salvo assim dispara normalmente e abre com o bloco
364
+ Inicio EM BRANCO no painel do cliente (53 fluxos de 9 contas ficaram assim ate 19/08), e um
365
+ clique em "Concluir" naquele modal apagava o gatilho em silencio. Alem do editor, o disparo por
366
+ webhook, o filtro de Campanha de Fluxo, o gatilho LionTrack e o historico de execucao tambem so
367
+ entendem "items". O app normaliza o formato antigo na gravacao, mas nao conte com isso.
336
368
  Triggers: message_received (keywords[] min 3 chars + match_type 'contains'|'exact' — dispara em
337
369
  QUALQUER msg do cliente que case), conversation_created/conversation_reopened (match_mode +
338
370
  keywords opcionais), conversation_resolved, label_added/label_removed (label_names[] — NAO
@@ -361,7 +393,7 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
361
393
  ativa na conversa; flow antigo sem config = todos os SLAs/qualquer prazo),
362
394
  date_trigger (NOVO 2026-07-10 — Gatilho de Data: dispara quando uma DATA do CONTATO chega,
363
395
  aniversario/exame; modelo agenda, sem varredura; SO flow individual). Item usa config ANINHADO:
364
- {type:'date_trigger', config:{ attr_key ('_date_of_birth'=aniversario nativo, OU chave de
396
+ {key:'date_trigger', config:{ attr_key ('_date_of_birth'=aniversario nativo, OU chave de
365
397
  atributo do contato tipo Data ex 'data_exame' — OBRIGATORIO), offset_direction 'before'|'on'|
366
398
  'after', offset_days 0-365, repeat_yearly bool (true=ignora ano/aniversario), send_time_source
367
399
  'fixed'|'attribute'|'variable' (+ send_time 'HH:MM' | send_time_attr_key | send_time_template
@@ -381,13 +413,64 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
381
413
  inbox_id pra confirmar -> campaigns_create com flow_id.
382
414
  lead_form_completed / lead_form_milestone / lead_form_abandoned (NOVOS 2026-08-15 — gatilhos
383
415
  de FORMULARIO PUBLICO, feature Formularios): disparados pelo formulario de captacao, NAO por
384
- evento de conversa (inertes no matcher). Item: {key:'lead_form_completed', lead_form_id:<id>}
385
- — lead_form_id pode ir no topo do item (caminho API/MCP) ou dentro de config (tela);
416
+ evento de conversa (inertes no matcher). Item: {key:'lead_form_completed', config:{lead_form_id:<id>}}
417
+ — mande SEMPRE em config: o app so desce filtro solto pra "config" quando converte o formato legado
418
+ "data.triggers" em "data.items"; item ja gravado em "data.items" fica COMO ESTA (o motor tolera filtro
419
+ no topo, a tela nao — exceto lead_form_*/booking_*, que promovem ao abrir);
386
420
  lead_form_milestone aceita milestone_node_id (vazio = qualquer marco); lead_form_abandoned
387
421
  dispara pelo tempo de abandono configurado no formulario. SO flow individual (nunca grupo).
388
422
  O flow nasce com variaveis form_* + respostas planas (form_<slug_da_pergunta>). Ver tools
389
423
  lionchat_lead_forms_* e o resource formularios-publicos.
390
- cron, webhook. NOVO message_sent (2026-06-11): par do message_received pra mensagens de
424
+ booking_created / booking_cancelled / booking_rescheduled / booking_completed (NOVOS 2026-08-20 —
425
+ gatilhos de AGENDAMENTO do Booking NATIVO do LionChat: link publico, IA e Agenda do painel. NAO e
426
+ e-Clinica). created = alguem marcou (link, IA ou painel); cancelled = paciente cancelou pelo link, IA
427
+ cancelou ou a equipe cancelou na Agenda; rescheduled = a data/hora mudou (link, IA, editar/adiar na
428
+ Agenda — ADIAR conta como remarcado); completed = equipe concluiu na Agenda (exige a Agenda unificada
429
+ ligada na conta). Excluir a tarefa, reabrir cancelada e desfazer conclusao NAO disparam; cancelamento
430
+ vence remarcacao quando os dois mudam no mesmo save.
431
+ Item: {key:'booking_created', config:{booking_event_type_ids:['44'], agent_ids:[], create_conversation:false}}
432
+ — tudo opcional, vazio = todos: booking_event_type_ids = ids de tipo de agendamento (STRINGS — e o que
433
+ a tela grava; o disparo compara por texto, entao numero ate funciona, mas escreva string), agent_ids =
434
+ ids de usuario RESPONSAVEL pela tarefa (STRINGS),
435
+ create_conversation (bool, nasce false): false = dispara SO pra quem JA tem conversa numa caixa do flow
436
+ (a mais recente, reaberta se resolvida; sem conversa = pulo visivel no log); true = cria (ou reabre) a
437
+ conversa na 1a caixa do flow (ordem por id) — em caixa WhatsApp exige telefone no contato; criar
438
+ conversa acorda os ouvintes de conversation_created (automacao, outros flows, webhook, Kanban, SLA).
439
+ INERTES a evento de conversa (quem dispara e o Booking::FlowTriggerDispatcher, por CONTA — a caixa do
440
+ flow so define onde a conversa e reusada/criada). SO flow individual (a tela nem oferece em flow de
441
+ grupo). Nunca dispara flow ai_tool.
442
+ Variaveis {{booking.*}} (data/hora vem da TAREFA da Agenda, sempre atuais, no fuso do tipo):
443
+ booking.date (DD/MM/AAAA), booking.time (HH:MM), booking.weekday (domingo..sabado), booking.datetime
444
+ (ISO), booking.type (nome do tipo), booking.type_format (presencial|videochamada), booking.duration
445
+ (minutos), booking.agent (nome do responsavel), booking.status (confirmado|cancelado|remarcado|
446
+ concluido), booking.event (created|cancelled|rescheduled|completed — bom pra condicao; nao aparece no
447
+ seletor da tela, mas resolve), booking.description (observacao do paciente), booking.cancel_url,
448
+ booking.reschedule_url, booking.color, booking.id, booking.meeting_url (VAZIO no created — o link do
449
+ Google nasce segundos depois; vem nos outros 3). So no rescheduled: booking.previous_date,
450
+ booking.previous_time, booking.previous_datetime. trigger.type = a chave do gatilho (ex.
451
+ 'booking_created'); trigger.kind = created|cancelled|rescheduled|completed; trigger.booking_id.
452
+ REGRAS: o evento de agendamento mais novo SUBSTITUI a rodada ativa do MESMO flow na MESMA conversa
453
+ (2a consulta do mesmo paciente, ou "cancelado" chegando com o "criado" ainda esperando resposta) — a
454
+ antiga e encerrada com um passo visivel no historico. Idempotente por 24h (reenfileiro nao duplica).
455
+ Tipo de agendamento com confirmacao/lembrete proprios ligados + booking_created = o paciente pode
456
+ receber duas mensagens (a tela avisa). Caixa WhatsApp OFICIAL: conversa criada nova (ou parada ha
457
+ mais de 24h) esta FORA da janela — texto livre no 1o bloco cai em "window_closed"/erro; comece por
458
+ template.
459
+ CONFLITO (flow_trigger_conflict): e por CONTA, nao por caixa — dois flows ATIVOS com o mesmo
460
+ booking_* colidem quando os tipos se cruzam E os agentes se cruzam (lista vazia = todos, entao dois
461
+ flows "vazio + vazio" colidem). Resolva com filtros disjuntos ou um flow so com condition.
462
+ manual_trigger (ativacao manual pelo atendente na sidebar), webhook_received (ver WEBHOOK
463
+ EMBUTIDO abaixo), page_track (LionTrack). NAO EXISTEM os gatilhos "cron" nem "webhook" — esta
464
+ referencia listava os dois por engano ate 19/08/2026 e um flow com "webhook" ficou ATIVO 26 dias
465
+ sem disparar UMA vez, em silencio; o nome certo e "webhook_received". Para disparo por data use
466
+ date_trigger; para disparo em lote, campaign_trigger + Campanha de Fluxo.
467
+ team_changed ({team_ids:[] de STRINGS, vazio = qualquer equipe}), assignee_changed ({agent_ids:[]
468
+ STRINGS, vazio = qualquer atendente}), card_won/card_lost ({funnel_ids:[] STRINGS} — disparam SO quando
469
+ o STATUS do card vira ganho/perdido, nunca por etapa com esse nome). page_track (LionTrack, so flow
470
+ individual): {track_type:'visited_page'|'event_fired', urls:[...], operator:'contains'|'exact'|
471
+ 'starts_with', event_names:[...], event_operator:'equals'|'contains', cooldown_hours (default 24,
472
+ minimo 1 — nao re-dispara pro mesmo contato dentro da janela)}.
473
+ NOVO message_sent (2026-06-11): par do message_received pra mensagens de
391
474
  SAIDA (atendente, celular/eco, IA — nota privada NAO) com keywords+match_type; cuidado: acao
392
475
  'desativar IA' com esse trigger sem keywords = a propria resposta da IA dispara o flow.
393
476
  group_participant_joined / group_participant_left (NOVO 07/08 — 'Entrou no grupo' / 'Saiu do
@@ -400,7 +483,7 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
400
483
  PESSOA que entrou/saiu ('entrou no grupo -> manda no privado').
401
484
  WEBHOOK EMBUTIDO (Webhook Universal): 1) criar flow; 2) POST /custom_webhook_integrations com
402
485
  {custom_webhook_integration:{flow_id}} (idempotente, retorna URL unica); 3) flows_update com
403
- item {type:'webhook_received', config:{integration_id}} no data.items do start. Remover o item
486
+ item {key:'webhook_received', config:{integration_id}} no data.items do start. Remover o item
404
487
  desativa o webhook. Excluir flow destroi o webhook. Duplicar flow NAO copia o gatilho.
405
488
  VALIDACAO flow_trigger_conflict: criar/atualizar/ativar retorna HTTP 422
406
489
  {error_code:'flow_trigger_conflict', conflicts:[{flow_id, flow_name, trigger_type, inbox_id,
@@ -413,9 +496,16 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
413
496
  ▸ send_message
414
497
  data: { label, messageItems: [
415
498
  { id, type:"text", content },
416
- { id, type:"delay", seconds },
499
+ { id, type:"delay", duration_seconds }, // 0-30 s. A TELA le/grava duration_seconds — item com
500
+ // "seconds" roda (o motor aceita os dois) mas abre como
501
+ // "undefineds" no editor e o cliente nao consegue ajustar
417
502
  { id, type:"whatsapp_template", templateId, params },
418
- { id, type:"canned_response"|"user_input"|"attachment"|"audio", ... }
503
+ { id, type:"canned_response", canned_response_id },
504
+ { id, type:"url_media", url, caption }, // midia por URL (aceita {{var}} na url; o motor baixa
505
+ // SSRF-safe e detecta o tipo) — tambem aceitos:
506
+ // attachment|image|video|audio|file|document com
507
+ // attachment_url (+ blob_signed_id quando veio de upload)
508
+ { id, type:"user_input", variable } // legado: espera resposta dentro do proprio bloco
419
509
  ]}
420
510
  ATENCAO: messageItems (NAO items).
421
511
  Botoes: item text com buttons_enabled=true + buttons:[{title,value}] gera handle "button_{value}"
@@ -432,7 +522,10 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
432
522
  + "no_reply_timeout" (so com buttons_timeout > 0; buttons_timeout_unit minutes|hours|days, 0 = sem
433
523
  timeout). Modo sincrono (ai_tool) e dry_run NAO pausam — o template so e enviado. So faz sentido
434
524
  em caixa WhatsApp com template de botoes quick-reply aprovado.
435
- Handles sem botoes: "success", "error".
525
+ Handles sem botoes: "success", "error" e, SO em caixa WhatsApp OFICIAL com item sujeito a janela de
526
+ 24h (text/canned_response/attachment/audio/url_media), "window_closed": o motor segue por ele quando
527
+ a janela esta fechada (ligue ali um bloco com template); sem esse fio cai no caminho de erro. Fora de
528
+ caixa oficial o handle NAO existe (edge nele = aresta fantasma). Botoes: a janela fechada tambem vale.
436
529
 
437
530
  ▸ wait_response
438
531
  data: {
@@ -454,12 +547,21 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
454
547
  saveTo "attribute"/"contact_attribute" NAO EXISTEM — nao salvam nada.
455
548
  TIMEOUT DISPARA DE VERDADE (corrigido 2026-06-09): waitTime estourou -> handle "timeout"
456
549
  (ou "option_{val}_timeout" no modo options). Sempre ligue um edge no timeout.
457
- FALLBACK DE SAIDA (mudou 2026-08-15): quando o handle esperado nao tem fio, o avanco de ultimo
458
- recurso NUNCA segue fio negativo (timeout/no_reply_timeout/retries_exhausted/no_response/error).
459
- Antes ele podia "roubar" o fio do timeout e rotear resposta valida pro caminho de silencio;
460
- agora o ramo simplesmente PARA. Nao conte com o comportamento antigo: ligue o fio de sucesso.
550
+ FALLBACK DE SAIDA (regra de 20/08/2026, substitui a de 15/08): fio COM rotulo so e seguido por quem
551
+ CASA o rotulo. O "ultimo recurso" do avanco segue EXCLUSIVAMENTE a ligacao SEM sourceHandle (fluxo
552
+ legado de bloco simples) — nunca mais "pega o primeiro fio que existir": resposta A num menu com so a
553
+ saida B ligada NAO entrega no caminho do B, quem nao respondeu nao cai no botao ligado, envio
554
+ bem-sucedido nao desce pelo fio "window_closed". Sem fio elegivel o fluxo TERMINA. Duas pontes
555
+ explicitas que continuam valendo: (a) na RESPOSTA do cliente (wait_response/botoes), "option_X"/
556
+ "button_X"/"no_response" sem fio proprio cai no fio "success" SE ele existir (o bloco de botoes nao
557
+ expoe "success" na tela, entao na pratica isso so vale no wait_response); (b) a saida "partial" do
558
+ update_group sem fio cai no "success". Conclusao pratica: ligue TODA saida que pode acontecer.
559
+ TIMEOUT SEM FIO ENCERRA (20/08/2026): estourou waitTime (ou buttons_timeout) e o handle "timeout"/
560
+ "no_reply_timeout" nao tem fio -> a sessao e ENCERRADA (antes ficava esperando pra sempre e segurava
561
+ o re-disparo do flow naquela conversa). waitTime AUSENTE = sem timeout (espera indefinida); waitTime
562
+ vazio ('') = 60 (o que a tela exibe).
461
563
  Respostas invalidas alem de maxRetries -> handle "retries_exhausted" (distinto do timeout de silencio;
462
- se nao houver edge nele, cai no "timeout").
564
+ se nao houver edge nele, cai no "timeout"; sem nenhum dos dois, encerra). maxRetries vazio/0 = 3.
463
565
  Handles validation='options': "option_{val}" por opcao + "timeout"
464
566
  Handles validation='varied_options': "option_{group_id}" por grupo (optionGroups) + "timeout"
465
567
  Handles outros: "success" + "timeout"
@@ -489,7 +591,8 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
489
591
  First-match-wins: avalia em ordem e PARA na primeira que bate.
490
592
  Operadores: equal/not_equal, contains/not_contains, starts_with/ends_with,
491
593
  is_empty/is_not_empty (NAO existe is_present/is_blank), greater_than/less_than,
492
- number_range ("min-max"), regex,
594
+ number_range ("min-max"; aceita sinal desde 20/08: "-5-10" = -5..10, "-10--5" = -10..-5 — exatamente
595
+ dois numeros separados por "-", nada mais), regex,
493
596
  equal_any/not_equal_any/contains_any/not_contains_any/starts_with_any/ends_with_any (multi-valor
494
597
  via values[], case-insensitive; starts_with_any/ends_with_any NOVOS 07/08 — o texto COMECA/TERMINA
495
598
  com alguma das palavras da lista),
@@ -510,6 +613,8 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
510
613
  kanban_exists/kanban_in_stage/kanban_won/kanban_lost (funnel_id e CHAVE SEPARADA da condicao,
511
614
  numero ex funnel_id:37; a etapa vai em value=slug puro ex value:"avaliacao_aceita" ou em stage,
512
615
  NAO no formato "37:etapa"), pagetrack_visited/pagetrack_event,
616
+ Desde 20/08 as 4 condicoes kanban_* enxergam o card da conversa ATUAL ou o card cuja conversa de
617
+ ORIGEM e a atual (card religado pra conversa mais nova) — antes "nao tem card" na conversa velha.
513
618
  sla_check (SO value, codigo fixo: frt_breached/frt_ok/nrt_breached/nrt_ok/rt_breached/rt_ok/has_sla/no_sla;
514
619
  frt=primeira resp, nrt=proxima, rt=resolucao; _ok exige politica de SLA aplicada).
515
620
  greater_than/less_than: atributo numero (valor numerico) OU temporais (novo 2026-07-21) —
@@ -540,6 +645,8 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
540
645
  Redis; gere um unico por acao, ex 'd_ab12cd'). Ordem da lista = ordem do rodizio, sem porcentagem.
541
646
  DIFERENTE do randomizer mode distribute_agents (sorteio ponderado),
542
647
  change_status({status: open|resolved|pending|snoozed}), change_priority({priority}),
648
+ // change_status com 'snoozed' aceita snooze_option: an_hour_from_now|until_tomorrow|until_next_week|
649
+ // until_next_month|until_next_reply (ausente = adiada ate a proxima mensagem do cliente)
543
650
  mute_conversation({}), mark_unread({}), add_private_note({content}), send_email_transcript({email}),
544
651
  add_conversation_label({labels:[...]}), remove_conversation_label({labels:[...]}), // etiqueta NA CONVERSA
545
652
  assign_captain({assistant_id}), deactivate_captain({}),
@@ -556,6 +663,9 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
556
663
  — funnel_id e funnel_stage OBRIGATORIOS; title/description aceitam {{ }},
557
664
  move_kanban_stage({funnel_id,funnel_stage}), set_kanban_item_status({status:won|lost|active}),
558
665
  set_won({}), set_lost({reason?}), add_card_note({content}),
666
+ set_open({}) — reabre card ganho/perdido (status open; nao mexe nos responsaveis),
667
+ // title/description de create_kanban_item e content de add_card_note resolvem pelo resolvedor do
668
+ // FLUXO desde 20/08: {{conversation.id}} = numero da tela e variaveis da sessao valem ali
559
669
  assign_agent_card({agent_id, mode?}) — RESPONSAVEL DO CARD. mode (NOVO 2026-07-28):
560
670
  'add' (default, SOMA na lista — comportamento historico), 'replace' (so o escolhido
561
671
  fica; atribui ANTES de remover os outros, entao falha de atribuicao nunca deixa o card
@@ -590,8 +700,11 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
590
700
 
591
701
  ▸ ai
592
702
  data: { label, aiMode: "generate"|"custom"|"intent"|"sentiment"|"extract", aiPrompt,
593
- aiAssistantId, // OBRIGATORIO via API — sem ele o node sai cedo
594
- // (nao grava nada; {{ai_response}}/{{ai_intent}} ficam vazios)
703
+ aiAssistantId, // OBRIGATORIO em generate/intent/sentiment/extract — sem ele o node
704
+ // sai pela saida "error" desde 20/08 ('AI Assistant not configured';
705
+ // antes ficava VERDE e seguia como se a IA tivesse respondido).
706
+ // So roda sem assistente: aiMode 'custom' (motor cru com a chave da
707
+ // conta + aiModel) e flow ai_tool em generate/custom
595
708
  aiModel, // opcional: modelo LLM SO deste node (ex "gpt-4.1-mini");
596
709
  // vazio/ausente = modelo padrao da conta; vale em TODOS os
597
710
  // modos e tambem com assistente (sobrepoe o modelo dele)
@@ -599,13 +712,19 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
599
712
  // IGNORA o aiModel (protecao de nodes antigos)
600
713
  aiIntents: [{name}], // se intent — ARRAY DE OBJETOS (NAO array de strings)
601
714
  aiResponseVar, // saida (default ai_response); extract usa esta var
602
- contextMessages: 25|50|75|100 } // quantas msgs a IA enxerga
715
+ // nome iniciado por "_" e IGNORADO e cai no padrao (prefixo reservado
716
+ // das chaves internas da sessao) — vale pro apiResponseVar tambem
717
+ aiContextMessages: 5 } // quantas msgs da conversa a IA enxerga: 0|1|3|5|10|25|50|75|100
718
+ // (default 5; acima de 100 e cortado; ignorado em 'custom').
719
+ // A chave e aiContextMessages — "contextMessages" e DESCARTADA
720
+ // em silencio (fica 5)
603
721
  Handles intent: "intent_{name}" por intencao + "no_intent" + "error" (var {{ai_intent}} disponivel)
604
722
  Handles sentiment: "positive", "negative", "neutral" + "error"
605
723
  Handles generate/custom/extract: "success", "error"
606
724
 
607
725
  ▸ set_variable
608
- data: { label, variables: [{name,value}] }
726
+ data: { label, variables: [{name,value}] } // name vazio ou iniciado por "_" e IGNORADO (prefixo
727
+ // reservado das chaves internas da sessao); value aceita {{ }}
609
728
  Handle: "success"
610
729
 
611
730
  ▸ wait
@@ -633,42 +752,67 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
633
752
  todo node configurado pela tela quebrava. Hoje o motor le percent e aceita weight so como dado
634
753
  antigo. Escreva SEMPRE percent: com weight o node roda, mas abre com as porcentagens EM BRANCO
635
754
  na tela do cliente.
636
- mode "distribute_agents" (SORTEIO ponderado): data.agents:[{agent_id, percent}] (percentuais somando
637
- 100) — sorteia 1 agente por probabilidade e atribui; handle unico "success". E SORTEIO, nao rodizio
638
- (pode cair no mesmo agente varias vezes seguidas). Pra RODIZIO exato use a ACAO distribute_agents.
755
+ DIVISAO EXATA, NAO SORTEIO (desde 20/08/2026, nos 2 modos): o bloco divide o que passa por ele na
756
+ proporcao configurada — 50/50 alterna A,B,A,B; 70/30 da 7 de cada 10 intercalados. Contador por
757
+ fluxo+bloco+impressao digital da configuracao (ids + percentuais): mexer em ramo/agente/porcentagem
758
+ zera a contagem. Percentual <= 0 tira o item da fila; o total e a SOMA (30/20 funciona como 3:2, mas
759
+ escreva somando 100, que e a convencao da tela). Dry run so espia o contador. Ate 20/08 era rand():
760
+ 5 leads seguidos pra mesma pessoa num "50/50" era normal.
761
+ mode "distribute_agents": data.agents:[{agent_id, percent}] — escolhe o agente da vez na proporcao e
762
+ atribui (assign_agent); handle unico "success". Agentes sem agent_id ou percent <= 0 sao ignorados;
763
+ lista toda invalida = segue por "success" SEM atribuir. Diferenca pra ACAO distribute_agents do node
764
+ action: a acao e rodizio SIMPLES (1,2,3 sem porcentagem); este modo aceita pesos diferentes (70/30).
765
+ Com pesos iguais os dois dao o mesmo resultado.
639
766
  Handles: o id de cada branch (mode branches); "success" (mode distribute_agents).
640
767
 
641
- ▸ update_group (Gestao de Grupos WhatsApp — REESCRITO 07/08: UMA operacao por bloco, 17 no total)
768
+ ▸ update_group (Gestao de Grupos WhatsApp — UMA operacao por bloco, 17 operacoes)
642
769
  Roda em fluxo de QUALQUER canal desde que a conta tenha caixa WhatsApp QR Code (Channel::Waha).
643
770
  Em flow de GRUPO o campo de caixa e opcional (vazio = caixa da conversa); em flow NAO-grupo
644
- data.groupInboxId e OBRIGATORIO (id de inbox Channel::Waha da conta).
771
+ data.groupInboxId e OBRIGATORIO (id de inbox Channel::Waha da conta — o save recusa caixa de outro tipo).
645
772
  data comum:
646
773
  groupOperation: <uma das 17 abaixo> // ausente/vazio = 'legacy' (comportamento antigo — NAO usar em node novo)
647
774
  groupTargetId: "<id do grupo>" // vazio = grupo da conversa; aceita '1203..@g.us', so digitos ou {{var}}. Ignorado nas TARGETLESS (create, find_by_name)
648
775
  groupInboxId: <id inbox QR Code> // OBRIGATORIO em flow nao-grupo
649
776
  groupResponseVar: "grupo" // nome da variavel de resposta (default 'grupo'); leia depois {{grupo.CAMPO}}
650
- Teto de 20 participantes por execucao (add/remove/promote/demote) — trava ANTI-BANIMENTO.
777
+ groupInviteOnFailure: false // NOVO 21/08, so create/add_participants — ver CONVITE AUTOMATICO
778
+ groupInviteMessage: "<texto>" // usado por send_invite E pelo convite automatico
779
+ Teto de 20 participantes por execucao (create/add/remove/promote/demote) — trava ANTI-BANIMENTO.
651
780
  Operacoes -> chaves de data (+ campos que a resposta devolve em {{grupo.*}}):
652
- create -> groupName(obrig), groupDescription, groupPicture(url), groupInitialAdmins, groupParticipants, groupAttributes (opcional, NOVO 2026-08-08: linhas {attr_source,attr_key,attr_value} — grava atributos personalizados no contato-grupo recem-criado; {{grupo.id}}/{{grupo.conversation_id}} ja valem em attr_value; campos nativos name/email/card sao recusados) -> id,name,description,picture,participants_count [risco de banimento]
781
+ create -> groupName(obrig), groupDescription, groupPicture(url), groupInitialAdmins, groupParticipants, groupAttributes (opcional, NOVO 2026-08-08: linhas {attr_source,attr_key,attr_value} — grava atributos personalizados no contato-grupo recem-criado; {{grupo.id}}/{{grupo.conversation_id}} ja valem em attr_value; campos nativos name/email/card sao recusados) -> id,name,description,picture,participants,participants_count,conversation_id (numero da conversa do grupo aberta no painel, 08/08),added,added_count,not_added,not_added_count,no_whatsapp,invited,invite_status,extras_failed (so quando descricao/foto/admin/conversa falharam — o grupo JA existe e isso NUNCA vira erro) [risco de banimento]
782
+ DESDE 21/08 o create CONFERE quem foi colocado de verdade (duas leituras concordantes): faltou alguem -> handle "partial" com not_added preenchido. Numero BR ambiguo (com/sem o 9) e corrigido pelo WhatsApp ANTES de colocar (check-exists na sessao do canal, orcamento 8 s); numero que o WhatsApp diz nao existir segue no pedido e aparece em no_whatsapp (e aviso, nao erro)
653
783
  find_by_id -> (groupTargetId) -> id,name,description,picture,participants,participants_count
654
784
  find_by_name -> groupSearchName(obrig), groupSearchMode(contains[padrao]|does_not_contain|equal_to|not_equal_to|starts_with|ends_with) -> results,results_count [TARGETLESS]
655
785
  update_subject -> updateSubject(obrig) -> id,name
656
786
  update_description -> updateDescription -> id,description
657
787
  update_picture -> updatePicture(obrig, url) -> id
658
788
  leave -> (groupTargetId) -> id [IRREVERSIVEL]
659
- list_participants -> (groupTargetId) -> id,participants(ate 100),participants_count
660
- add_participants -> groupParticipants(obrig; array de telefones/JIDs ex ['5511999999999@c.us'] ou lista por virgula; aceita {{var}}) -> id,added,not_added,added_count,not_added_count [risco de banimento]
661
- remove_participants -> groupParticipants(obrig) -> id,removed,not_removed,removed_count,not_removed_count
789
+ list_participants -> (groupTargetId) -> id,participants(ate 100; participants_truncated=true se cortou),participants_count
790
+ add_participants -> groupParticipants(obrig; array de telefones/JIDs ex ['5511999999999@c.us'] ou lista por virgula; aceita {{var}}) -> id,added,not_added,added_count,not_added_count,no_whatsapp,invited,invite_status [risco de banimento]
791
+ mesma correcao do 9o digito do create (21/08). added = quem esta no grupo agora (inclui quem ja estava); ninguem entrou = saida "error" (nobody_changed); parte entrou = "partial"
792
+ remove_participants -> groupParticipants(obrig) -> id,removed,not_removed,removed_count,not_removed_count (ninguem saiu = "error"; parte = "partial")
662
793
  promote_admin -> groupParticipants(obrig) -> id,participants
663
794
  demote_admin -> groupParticipants(obrig) -> id,participants
664
795
  get_invite -> (groupTargetId) -> id,invite_link
665
796
  revoke_invite -> (groupTargetId) -> id,invite_link [IRREVERSIVEL — invalida o link antigo]
666
- send_invite -> groupInviteTo(obrig, telefone), groupInviteMessage(opcional) -> id,invite_link,invite_sent_to
667
- settings -> pelo menos UMA de: infoAdminOnly(bool), messagesAdminOnly(bool), membersCanAddNewMember(bool) -> id,settings_updated
797
+ send_invite -> groupInviteTo(obrig, telefone), groupInviteMessage(opcional; {{link}} marca onde o link entra, sem o marcador vai no fim) -> id,invite_link,invite_sent_to
798
+ settings -> pelo menos UMA de: infoAdminOnly(bool), messagesAdminOnly(bool), membersCanAddNewMember(bool) -> id,settings_updated,settings_failed,settings_unsupported
799
+ DESDE 20/08 cada permissao e aplicada SOZINHA: settings_updated[] sempre vem; settings_failed[{setting,reason}] = falhou de verdade; settings_unsupported[] = o servidor WAHA nao tem o recurso (ex.: quem-pode-adicionar em servidor antigo). Sucesso SO se aplicou ao menos uma E nenhuma falhou; senao sai por "error" (codigo settings_failed ou settings_unsupported) com o que aplicou visivel na variavel
800
+ send_message -> messageItems (MESMO contrato do node send_message: text/delay/attachment/audio/url_media...; botoes/template nao fazem sentido em grupo) + groupTargetId opcional -> manda os baloes NA CONVERSA DO GRUPO (vazio = grupo da conversa atual; grupo inexistente = "error"). NAO grava {{grupo.*}} (e a unica sem variavel de resposta). E a 17a operacao (08/08): serve pra "dei ganho no lead -> aviso o grupo da equipe" em fluxo de qualquer canal
668
801
  ATENCAO settings: membersCanAddNewMember tem semantica INVERTIDA (true = TODOS podem adicionar);
669
802
  infoAdminOnly/messagesAdminOnly seguem o padrao (true = SO admin).
670
- Toda operacao tambem devolve {{grupo.ok}} (bool) e {{grupo.error.message}}.
671
- Handles: "success", "error"
803
+ CONVITE AUTOMATICO (NOVO 21/08, so create/add_participants): groupInviteOnFailure:true manda
804
+ groupInviteMessage no PRIVADO de quem o WhatsApp NAO colocou (privacidade "quem pode me adicionar").
805
+ groupInviteMessage e OBRIGATORIA nesse modo (sem texto = invite_status 'sem_mensagem' e nada sai —
806
+ link nu de numero desconhecido e o formato que mais gera denuncia e derruba numero); {{link}} marca a
807
+ posicao do link (sem ele vai no fim). Tetos: 5 convites por execucao, 1 por telefone por caixa por
808
+ dia, 50 por caixa por dia, 20 s entre convites; quem esta em no_whatsapp nao recebe; antes de mandar o
809
+ job reconfere se a pessoa ja entrou. invite_status = 'convite_enviado' (invited = lista) ou
810
+ 'sem_mensagem'. EFEITO COLATERAL: cada convite entregue vira contato + conversa NOVOS no painel e
811
+ dispara os ouvintes de conversation_created (automacao, outros flows, webhook do cliente, Kanban).
812
+ Toda operacao (menos send_message) tambem devolve {{grupo.ok}} (bool) e {{grupo.error.message}}.
813
+ Handles: "success", "error" + "partial" em create/add_participants/remove_participants (a operacao
814
+ rodou mas nem todo mundo entrou/saiu — listas not_added/not_removed dizem quem). "partial" sem fio
815
+ segue pelo fio "success" (unica saida com esse fallback no motor).
672
816
 
673
817
  ▸ end
674
818
  EXCLUSIVO de flow ai_tool — NUNCA use em flow conversation (a paleta do editor nem oferece;
@@ -710,17 +854,40 @@ conversation.label (SINGULAR — etiquetas da conversa em texto separado por vir
710
854
  agent.* = o RESPONSAVEL da conversa: agent.name, agent.first_name, agent.last_name,
711
855
  agent.id (USE ESTE pro id do responsavel — conversation.agent_id resolvia VAZIO ate 29/07, quando
712
856
  virou apelido de agent.id; escreva a forma canonica), agent.email (email NOVO 23/07)
857
+ ai_agent.name, ai_agent.id = o AGENTE DE IA atribuido a conversa (reflete ATRIBUICAO, nao "vai responder
858
+ agora"; vazio sem IA). Prefixo proprio de proposito: agent.* e o atendente HUMANO.
859
+ contact.id, contact.identifier, contact.first_name, contact.last_name, contact.label (etiquetas do
860
+ contato, virgula), conversation.team.name (nome da equipe; conversation.team e apelido).
861
+ last_response = ultima resposta do cliente; last_agent_response = ultima mensagem PUBLICA nossa (nota
862
+ interna NAO conta desde 20/08).
863
+ Filtro Liquid: {{conversation.id}}, .status e .team_id respondem o MESMO com e sem filtro (|) desde
864
+ 20/08 — antes um filtro em qualquer variavel do texto trocava o protocolo pelo id interno do banco.
713
865
  inbox.id, inbox.name (antes resolviam vazio fora do Enviar Mensagem — corrigido 23/07)
714
866
  account.name, account.id (id NOVO 23/07), account.custom_attribute.X (inclui variaveis de conta e
715
867
  segredos — NAO existe env.X), {{var_criada_no_set_variable}}, {{ai_intent}}, {{api_response_var}}
716
- trigger.* (variaveis do GATILHO que iniciou o flow — NOVO 07/08 no autocomplete de TODO bloco):
717
- trigger.type (codigo do gatilho), trigger.name, trigger.activated_at (hora do disparo),
718
- trigger.message.content (msg que iniciou), trigger.conversation.channel (canal de origem),
719
- trigger.conversation.status, trigger.kanban_item_id (numero do card), trigger.funnel_id,
720
- trigger.user_name (quem acionou manual), trigger.campaign_title (campanha que disparou),
721
- trigger.event_name (evento no site), trigger.page_url (pagina visitada),
722
- trigger.source_flow_name (fluxo que chamou). Cada uma so tem valor quando o gatilho fornece (ex:
723
- page_url so em gatilho de site) — fora disso resolve vazio.
868
+ trigger.* (variaveis do GATILHO que iniciou o flow — no autocomplete de TODO bloco):
869
+ trigger.type = codigo do EVENTO que disparou, NAO a chave do item do Inicio. Valores reais:
870
+ message_created (gatilho message_received), message_sent, conversation_created, conversation_opened
871
+ (gatilho conversation_reopened), conversation_resolved, label_added, label_removed, team_changed,
872
+ assignee_changed, sla_missed, kanban_item_created/card_created, kanban_item_stage_changed/card_moved,
873
+ card_status_changed (card_won e card_lost — olhe trigger.kind ou o status do card), conversation_
874
+ attributes_changed, card_attributes_changed, contact_attribute_changed, group_participant_joined/left,
875
+ webhook_received, date_trigger, manual (sidebar), kanban_manual (botao do card), campaign (Campanha de
876
+ Fluxo), page_track, activated_by_flow (fluxo chamou fluxo), lead_form (os 3 gatilhos de formulario —
877
+ trigger.kind diz completed/milestone/abandoned), booking_created/booking_cancelled/booking_rescheduled/
878
+ booking_completed. Compare SEMPRE com esses codigos numa condicao.
879
+ trigger.name (rotulo legivel, pra escrever pro cliente), trigger.activated_at (ISO) — desde 20/08
880
+ preenchidas em TODOS os caminhos de disparo (antes so no de evento de conversa).
881
+ trigger.data = o contexto inteiro em JSON (menos type/name/activated_at) — util em node api/ai.
882
+ trigger.message.id/content/type/created_at (msg que iniciou), trigger.conversation.id/status/channel/
883
+ inbox_id/inbox_name/created_at, trigger.contact.id/name/phone, trigger.kanban_item_id, trigger.funnel_id,
884
+ trigger.attribute.name/previous_value/current_value/changed_at (gatilhos de atributo),
885
+ trigger.ad.id/name/creative_id/creative_name/adset_id/adset_name/campaign_id/campaign_name/source/
886
+ headline/description/cta/url (anuncio CTWA que abriu a conversa; so quando ha anuncio),
887
+ trigger.user_name (quem acionou manual/botao do card), trigger.campaign_id/campaign_title (campanha),
888
+ trigger.event_name/page_url (site), trigger.source_flow_id/source_flow_name (fluxo que chamou),
889
+ trigger.lead_form_id/response_id/kind (formulario), trigger.kind/booking_id/event_type_id (agendamento).
890
+ Cada uma so tem valor quando o gatilho fornece — fora disso resolve vazio.
724
891
  DESDE 23/07 essas variaveis padrao funcionam em TODOS os nodes (Chamada API, Condicoes, IA, Definir
725
892
  Variavel) — antes so no Enviar Mensagem. Campo vazio resolve pra string vazia (nunca trava o flow).
726
893
  REGRA-MAE: variavel FORA da lista acima SOME do texto, sem erro em lugar nenhum — nao quebra o save,
@@ -766,6 +933,18 @@ sourceHandle OBRIGATORIO casar com handle exposto pelo node source.
766
933
  13. Assistente de Formulas no editor (2026-07-10): quem edita pela tela tem preview ao vivo
767
934
  (inclusive com contato real), avisos ao digitar e 'Gerar com IA' nos campos de formula —
768
935
  ao entregar um flow com Liquid, sugira ao usuario validar as formulas la.
936
+ 14. ai: a chave de contexto e aiContextMessages (nao contextMessages); sem aiAssistantId o bloco sai por
937
+ "error" (nao fica verde). Nome de variavel iniciado por "_" e ignorado em set_variable/saveVariable e
938
+ cai no padrao em apiResponseVar/aiResponseVar.
939
+ 15. send_message: item delay usa duration_seconds (a tela nao le "seconds"). Em caixa oficial ligue
940
+ "window_closed" num bloco com template — sem o fio, janela fechada vira erro.
941
+ 16. Fio com rotulo so e seguido por quem casa o rotulo (20/08): ligue TODA saida possivel (button_X,
942
+ option_X, cond_N, timeout, partial). Espera com timeout sem fio ENCERRA o fluxo ao estourar.
943
+ 17. update_group: create/add_participants tem saida "partial" — ligue-a (ou aceite que cai no "success")
944
+ e leia {{grupo.not_added}}; convite automatico exige groupInviteMessage.
945
+ 18. Gatilhos de agendamento (booking_*): booking_event_type_ids e agent_ids sao arrays de STRING, vazio =
946
+ todos; create_conversation nasce false (so dispara pra quem JA tem conversa numa caixa do flow). Nao
947
+ e e-Clinica. Compare trigger.type com "booking_created" etc.
769
948
 
770
949
  ═══ EXEMPLO MINIMO — Menu 3 opcoes ═══
771
950
  {
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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"}