@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/docs/instructions.md +14 -1
- package/dist/docs/prompts/create_flow_brainstorm.json +1 -1
- package/dist/docs/prompts/customer_health.json +1 -1
- package/dist/docs/prompts/productivity_report.json +1 -1
- package/dist/docs/prompts/quality_audit.json +1 -1
- package/dist/docs/prompts/stuck_leads.json +1 -1
- package/dist/docs/prompts/team_load_balance.json +1 -1
- package/dist/docs/prompts/weekly_recap.json +1 -1
- package/dist/docs/prompts/whatsapp_template_usage.json +1 -1
- package/dist/docs/resources/api-conventions.md +19 -0
- package/dist/docs/resources/best-practices.md +9 -3
- package/dist/docs/resources/conversation-flows.md +23 -0
- package/dist/docs/resources/data-model.md +107 -23
- package/dist/docs/resources/filtros-e-relatorios.md +49 -1
- package/dist/docs/resources/flowbuilder-design-guide.md +181 -38
- package/dist/docs/resources/flowbuilder-patterns.md +35 -20
- package/dist/docs/resources/formularios-publicos.md +110 -28
- package/dist/docs/resources/glossary.md +26 -1
- package/dist/docs/resources/kanban-deep-dive.md +19 -1
- package/dist/docs/resources/reports-guide.md +186 -0
- package/dist/docs/resources/troubleshooting.md +54 -1
- package/dist/sanitize.d.ts +2 -0
- package/dist/sanitize.js +6 -0
- package/dist/sanitize.js.map +1 -1
- package/dist/tools.js +224 -45
- package/dist/tools.js.map +1 -1
- package/endpoints.json +3281 -103
- package/package.json +1 -1
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-
|
|
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,
|
|
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
|
-
{
|
|
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
|
-
—
|
|
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
|
-
|
|
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 {
|
|
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",
|
|
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"
|
|
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 (
|
|
458
|
-
recurso
|
|
459
|
-
|
|
460
|
-
|
|
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"
|
|
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
|
|
594
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
637
|
-
|
|
638
|
-
|
|
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 —
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
671
|
-
|
|
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 —
|
|
717
|
-
trigger.type
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
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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"}
|