@lionchat/mcp-server 0.5.0 → 0.5.2
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 +15 -0
- package/dist/docs/resources/api-conventions.md +26 -0
- package/dist/docs/resources/best-practices.md +22 -0
- package/dist/docs/resources/data-model.md +18 -1
- package/dist/docs/resources/flowbuilder-design-guide.md +63 -7
- package/dist/docs/resources/flowbuilder-patterns.md +50 -1
- package/dist/docs/resources/glossary.md +53 -8
- package/dist/docs/resources/kanban-deep-dive.md +26 -0
- package/dist/docs/resources/reports-guide.md +27 -0
- package/dist/tools.js +13 -4
- package/dist/tools.js.map +1 -1
- package/endpoints.json +735 -6
- package/package.json +1 -1
|
@@ -57,6 +57,16 @@ Account (conta/empresa)
|
|
|
57
57
|
- `agent` (atendente comum)
|
|
58
58
|
- `administrator` (admin/dono)
|
|
59
59
|
|
|
60
|
+
### Supervisor de caixa (InboxMember.auto_assignable)
|
|
61
|
+
|
|
62
|
+
Independente do `role`, um membro de caixa pode ser **supervisor**: vê TODAS as conversas e cards
|
|
63
|
+
daquela caixa, mas fica FORA da distribuição automática (round-robin nunca atribui a ele). É o flag
|
|
64
|
+
`inbox_members.auto_assignable` (false = supervisor, true = membro comum). As tools
|
|
65
|
+
`lionchat_inbox_members_create/update` separam `user_ids[]` (comuns) de `supervisor_ids[]`
|
|
66
|
+
(supervisores); a resposta traz `is_supervisor` por agente. Lembre: agente não-admin só enxerga as
|
|
67
|
+
caixas das quais participa — exceção é estar atribuído a um card, que libera só aquela conversa (ver
|
|
68
|
+
`lionchat://docs/kanban-deep-dive`).
|
|
69
|
+
|
|
60
70
|
## 3. Convenções da API
|
|
61
71
|
|
|
62
72
|
### Datas
|
|
@@ -273,6 +283,11 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
|
|
|
273
283
|
| **Exportar contatos** (CSV completo por e-mail) | `lionchat_contacts_export` | Respeita filtros/segmento aplicados |
|
|
274
284
|
| Mensagem pra OUTRO AGENTE (não cliente) | `lionchat_internal_chat_*` (salas e mensagens do time) | NÃO confundir com nota privada (dentro da conversa do cliente) |
|
|
275
285
|
| Achar contato pelo que aconteceu com ele (conversa/card) | `lionchat_contacts_filter` com `linked_records` | Ver api-conventions → registros vinculados |
|
|
286
|
+
| **Origem dos leads** (de onde vieram, por plataforma/campanha/conjunto) | `lionchat_lead_origin_reports` | Relatório de leitura; filtros `platform`/`campaign`/`adset`; `won` = cards em Ganho; leads únicos por telefone |
|
|
287
|
+
| **Bloquear/desbloquear** contato | `lionchat_conversations_toggle_block` (`blocked: true|false`) | Gera pílula de atividade e descarta mensagens futuras do contato; NÃO resolve a conversa |
|
|
288
|
+
| **Importar histórico** de caixa WhatsApp Cloud (QR) | `lionchat_inboxes_whatsapp_history_start` / `_status` / `_cancel` | Admin-only + flag `qr_history_import`; só caixa oficial. Acompanhe `state` no `_status` |
|
|
289
|
+
| **Definir supervisor** de caixa | `lionchat_inbox_members_create` / `_update` com `supervisor_ids[]` | Supervisor vê TUDO da caixa mas fica fora do rodízio (ver abaixo) |
|
|
290
|
+
| Saber se a IA deve TOCAR a ligação WP (Wavoip) / marcar recusada | `lionchat_wavoip_should_ring` / `lionchat_wavoip_flag_rejected` | Controle fino do toque de chamada na caixa QR Code |
|
|
276
291
|
|
|
277
292
|
## 9. Quando NÃO chamar nenhuma ferramenta
|
|
278
293
|
|
|
@@ -198,6 +198,10 @@ Ou para listas grandes (cursors):
|
|
|
198
198
|
- `includes` / `excludes` (relacionamentos)
|
|
199
199
|
- `before` / `after` (datas)
|
|
200
200
|
|
|
201
|
+
> **Contatos — busca parcial por nome/ID externo:** no `POST /contacts/filter`, os campos `name` e
|
|
202
|
+
> `identifier` aceitam `contains` / `does_not_contain` (match parcial, case-insensitive). Use isso
|
|
203
|
+
> pra "contatos cujo nome contém X" sem precisar do valor exato.
|
|
204
|
+
|
|
201
205
|
## Formatos de Data
|
|
202
206
|
|
|
203
207
|
### Quando enviar (input)
|
|
@@ -374,6 +378,28 @@ O `field_mapping` do webhook personalizado aceita caminhos com índice de array:
|
|
|
374
378
|
mesmo caminho captura valores diferentes. Campo `flow_id` na criação liga o webhook a um flow
|
|
375
379
|
(webhook embutido — ver resource de fluxos).
|
|
376
380
|
|
|
381
|
+
### Import de histórico do WhatsApp Cloud (2026-06)
|
|
382
|
+
|
|
383
|
+
Caixas WhatsApp Cloud API podem importar o histórico de conversas via QR Code. Tools sob
|
|
384
|
+
`/inboxes/:inbox_id/whatsapp_history`:
|
|
385
|
+
|
|
386
|
+
- `lionchat_inboxes_whatsapp_history_start` — `POST` com param `days` (quantos dias de histórico
|
|
387
|
+
puxar). Inicia o processo.
|
|
388
|
+
- `lionchat_inboxes_whatsapp_history_status` — `GET`, retorna `{state, qr, days, progress, stats,
|
|
389
|
+
error}`. Estados na ordem: `idle` → `scan_qr` → `importing` → `migrating` → `cleaning` →
|
|
390
|
+
`done` (ou `failed`). Quando `state = scan_qr`, o campo `qr` traz o código pra escanear.
|
|
391
|
+
- `lionchat_inboxes_whatsapp_history_cancel` — `POST`, aborta o import em andamento.
|
|
392
|
+
|
|
393
|
+
**Gates:** admin-only + feature flag `qr_history_import`. SÓ funciona em caixa WhatsApp Cloud API
|
|
394
|
+
(`Channel::Whatsapp`) — não confundir com a importação de histórico do WAHA (QR Code não-oficial),
|
|
395
|
+
que é outro mecanismo.
|
|
396
|
+
|
|
397
|
+
### Ver histórico anterior do contato (2026-06)
|
|
398
|
+
|
|
399
|
+
Dentro de uma conversa há um botão que mostra as CONVERSAS ANTERIORES do mesmo contato NA MESMA
|
|
400
|
+
caixa. Não há endpoint novo pra isso — pra reproduzir via API, liste as conversas do contato
|
|
401
|
+
filtrando pelo `inbox_id` (`conversations_list` / `conversations_filter` por contato + caixa).
|
|
402
|
+
|
|
377
403
|
## Headers úteis pra mandar
|
|
378
404
|
|
|
379
405
|
- `Accept: application/json` (sempre)
|
|
@@ -180,6 +180,28 @@ Sem o tipo, o filtro pode bater no escopo errado. A UI mostra sufixo "(Conversa)
|
|
|
180
180
|
pendência de permissão).
|
|
181
181
|
- Meta CAPI: o evento `InitiateCheckout` foi RENOMEADO para `begin_checkout`.
|
|
182
182
|
|
|
183
|
+
### Meta CAPI — moeda do valor (2026-06)
|
|
184
|
+
|
|
185
|
+
O disparo da conversão aceita `currency` (código ISO, ex: `BRL`, `USD`); default `BRL`. Dá pra
|
|
186
|
+
escolher a moeda no próprio disparo e também na config do funil (valor padrão herdado pelos cards
|
|
187
|
+
daquele funil). Sempre confirme a moeda com o usuário se o valor não for em reais.
|
|
188
|
+
|
|
189
|
+
### Meta Lead — resiliência da ativação e backfill (2026-06)
|
|
190
|
+
|
|
191
|
+
A ativação ficou tolerante a falhas — não trava mais por causa de um lead de exemplo (sample) com
|
|
192
|
+
formato estranho: o erro de sample é tolerado e a ativação segue. Outros ganhos de robustez:
|
|
193
|
+
|
|
194
|
+
- **Auto-retry de limite:** quando bate o rate limit da Meta, tenta de novo sozinho com espera, em
|
|
195
|
+
vez de falhar de cara.
|
|
196
|
+
- **Botão "7 dias" (backfill):** puxa leads recentes que ficaram pra trás. Parâmetro `days` (default
|
|
197
|
+
7, máximo 30). A resposta traz `mode`: `bulk` (puxa em lote pela API) ou `replay` (reprocessa
|
|
198
|
+
eventos já recebidos). Recupera inclusive leads que tinham sido ignorados antes.
|
|
199
|
+
- **Sem `pages_manage_ads`:** funciona mesmo sem essa permissão específica da Meta.
|
|
200
|
+
- **Log legível** dos eventos (em vez de dump cru) e suporte a **múltiplas BMs**.
|
|
201
|
+
|
|
202
|
+
**Pro MCP:** ao acionar o backfill, informe ao usuário o `mode` retornado e quantos dias foram
|
|
203
|
+
puxados. Se a ativação reclamar de sample, NÃO é bloqueio — a integração ainda fica ativa.
|
|
204
|
+
|
|
183
205
|
## Campanhas: audiência acumulativa (2026-06)
|
|
184
206
|
|
|
185
207
|
`audience` aceita 3 tipos de seção combináveis: `Label`, `Funnel` (com stages/include_won/include_lost)
|
|
@@ -58,9 +58,16 @@ Channel::Waha / Channel::Whatsapp / Channel::WebWidget / ...
|
|
|
58
58
|
|
|
59
59
|
InboxMember (junction Inbox ↔ User)
|
|
60
60
|
├── inbox_id
|
|
61
|
-
|
|
61
|
+
├── user_id
|
|
62
|
+
└── auto_assignable (bool) — true = membro comum (entra na distribuição automática);
|
|
63
|
+
false = supervisor (vê TUDO da caixa, fora do rodízio)
|
|
62
64
|
```
|
|
63
65
|
|
|
66
|
+
> **Supervisor de caixa:** o flag `inbox_members.auto_assignable = false` marca o membro como
|
|
67
|
+
> supervisor. Ele enxerga todas as conversas/cards da caixa, mas o round-robin nunca atribui
|
|
68
|
+
> conversas a ele. As tools `lionchat_inbox_members_create/update` separam `user_ids[]` (membros
|
|
69
|
+
> comuns) de `supervisor_ids[]` (supervisores); a resposta expõe `is_supervisor` por agente.
|
|
70
|
+
|
|
64
71
|
## Conversação e Mensagens
|
|
65
72
|
|
|
66
73
|
```
|
|
@@ -413,6 +420,16 @@ WhatsappCall (Ligação WhatsApp — enterprise, voz via Cloud API)
|
|
|
413
420
|
├── duration_seconds / accepted_by_agent_id
|
|
414
421
|
├── custom_name (observação) / favorited (bool)
|
|
415
422
|
└── transcript / transcript_status (pending/processing/completed/failed — IA da conta)
|
|
423
|
+
|
|
424
|
+
WavoipSetting (Ligação WP em caixa QR Code — 1 por inbox, 2026-06-11)
|
|
425
|
+
├── inbox_id (FK) / device_id / device_token (cripto) / status / due_date
|
|
426
|
+
├── record_all_calls (bool) / auto_transcribe (bool) / transcription_provider (groq|openai)
|
|
427
|
+
└── feature flag wavoip_calling; limite de plano wavoip_voice_inboxes; R$70/device/mês
|
|
428
|
+
|
|
429
|
+
ContactDocument (aba Documentos do contato, 2026-06-11)
|
|
430
|
+
├── 3 fontes agregadas: upload direto + espelho dos cards Kanban + espelho das conversas (só image/file)
|
|
431
|
+
├── dedup por checksum (arquivo repetido conta 1x no storage)
|
|
432
|
+
└── ações: preview, download, renomear, favoritar, excluir (conversas são só-leitura)
|
|
416
433
|
```
|
|
417
434
|
|
|
418
435
|
## Cardinalidades importantes
|
|
@@ -60,7 +60,9 @@ Todo node tem essa estrutura base:
|
|
|
60
60
|
}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
**Triggers válidos:** `message_received`, `conversation_created`, `conversation_resolved`, `conversation_reopened`, `label_added`, `label_removed`, `card_created`, `card_moved`, `cron`, `webhook`.
|
|
63
|
+
**Triggers válidos:** `message_received`, `message_sent`, `conversation_created`, `conversation_resolved`, `conversation_reopened`, `label_added`, `label_removed`, `card_created`, `card_moved`, `cron`, `webhook`.
|
|
64
|
+
|
|
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`.
|
|
64
66
|
|
|
65
67
|
**Campos de filtro por trigger (IMPORTANTE — nomes exatos):**
|
|
66
68
|
- `message_received`: `keywords` (array, obrigatório, cada termo com mín 3 chars) + `match_type` (`'exact'` ou `'contains'`, default `contains`). NÃO use `match_mode` aqui. Dispara em QUALQUER mensagem do cliente que case (não só na primeira) — só mensagem de cliente dispara, nunca de agente.
|
|
@@ -75,6 +77,14 @@ Todo node tem essa estrutura base:
|
|
|
75
77
|
4. Salvar o flow (`flows_update`) — o save sincroniza a ativação do webhook embutido (remover o item desativa a integração automaticamente).
|
|
76
78
|
Webhooks embutidos NÃO aparecem na listagem de integrações standalone; excluir o flow destrói o webhook; duplicar o flow NÃO copia o gatilho embutido. Rate limit do endpoint público: 60/min por token.
|
|
77
79
|
|
|
80
|
+
**TRAVA DE GATILHO DUPLICADO (2026-06-16) — leia ANTES de ativar/criar flow ativo:** o sistema BLOQUEIA ter dois flows ATIVOS com o MESMO gatilho na MESMA inbox e mesmo `conversation_mode` (evita o evento disparar dois flows). Colisão = mesmo tipo de gatilho + config cruzando (mesmas keywords/funil/labels/url/etc) + inbox compartilhada + mesmo modo. EXCEÇÕES que podem coexistir: `webhook_received` e `manual_trigger`.
|
|
81
|
+
- Ao **ativar** (`flows_toggle` inativo→ativo) ou **criar já ativo**: qualquer conflito é barrado.
|
|
82
|
+
- Ao **editar** um flow já ativo: só conflito NOVO é barrado (duplicados que já existiam são preservados).
|
|
83
|
+
- A API responde **422** com `{ "error_code": "flow_trigger_conflict", "conflicts": [{ flow_id, flow_name, trigger_type, inbox_id, inbox_name }] }`.
|
|
84
|
+
- Existe `POST /flows/check_conflicts` (mesma assinatura, NÃO salva) pra checar antes.
|
|
85
|
+
|
|
86
|
+
**Como a IA deve agir:** antes de ativar um flow, confira via `flows_list` se já não há outro flow ativo no mesmo gatilho+inbox. Se receber 422 `flow_trigger_conflict`, NÃO fique reativando — EXPLIQUE o conflito ao usuário (nome do flow conflitante + caixa) e ofereça desativar o outro flow ou ajustar o gatilho/keywords.
|
|
87
|
+
|
|
78
88
|
**Handles que SAEM:** `success`.
|
|
79
89
|
|
|
80
90
|
### 2.2 `send_message`
|
|
@@ -131,7 +141,20 @@ Webhooks embutidos NÃO aparecem na listagem de integrações standalone; exclui
|
|
|
131
141
|
}
|
|
132
142
|
```
|
|
133
143
|
|
|
134
|
-
**`validation` válidos:** `any`, `options`, `regex`.
|
|
144
|
+
**`validation` válidos:** `any`, `options`, `varied_options`, `regex`, `email`, `phone`, `number`.
|
|
145
|
+
|
|
146
|
+
**`options` normaliza a resposta (2026-06-16):** a comparação com `acceptedOptions` é feita sem acento e sem maiúscula (`I18n.transliterate` + downcase + strip nos dois lados). "São Paulo", "sao paulo" e "SAO PAULO" casam todos.
|
|
147
|
+
|
|
148
|
+
**`varied_options` — uma opção, vários jeitos de escrever (2026-06-16):** use quando a MESMA opção pode vir em sinônimos/variações (ex: "sim", "claro", "quero" → tudo é "sim"). Em vez de `acceptedOptions`, configure `optionGroups`: cada grupo tem uma lista de termos e um `matchType` PRÓPRIO (`contains` padrão, ou `equals`). Use `equals` quando o termo curto colidiria — ex: o termo "1" com `contains` casaria "12"; com `equals` não. Roteia por uma saída dedicada por grupo: `option_<group_id>` (uma por grupo, não por termo). Mesma normalização do `options` (sem acento/maiúscula). Fallback de matchType: se um grupo não tiver `matchType`, usa o `optionsMatchType` do node (modo global antigo); sem isso, `contains`.
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{ "validation": "varied_options",
|
|
152
|
+
"optionGroups": [
|
|
153
|
+
{ "id": "sim", "terms": ["sim", "claro", "quero", "pode ser"], "matchType": "contains" },
|
|
154
|
+
{ "id": "nao", "terms": ["nao", "não", "agora nao"], "matchType": "contains" }
|
|
155
|
+
] }
|
|
156
|
+
```
|
|
157
|
+
→ edges: `sourceHandle: "option_sim"`, `sourceHandle: "option_nao"` (+ `timeout` + `retries_exhausted`).
|
|
135
158
|
|
|
136
159
|
**`saveTo` válidos (nomes EXATOS — qualquer outro valor NÃO salva nada):**
|
|
137
160
|
- `variable` — variável temporária do flow (use `saveVariable` pra nomear; senão usa o próprio `saveTo`)
|
|
@@ -144,14 +167,22 @@ Webhooks embutidos NÃO aparecem na listagem de integrações standalone; exclui
|
|
|
144
167
|
|
|
145
168
|
**NÃO existem** `attribute` nem `contact_attribute` — use `conversation_attr` / `contact_attr`.
|
|
146
169
|
|
|
170
|
+
**Salvar e-mail/telefone/nome do contato com segurança (2026-06-16):** o valor é normalizado antes de gravar (telefone → E.164 via `+55`; e-mail → strip). O cadastro do contato REVERTE silenciosamente um e-mail/telefone inválido (não dá erro, mas não muda). Por isso os destinos `contact_email`/`contact_phone`/`contact_name` SÓ devem ser usados com a validação que combina:
|
|
171
|
+
- `saveTo: "contact_email"` → use `validation: "email"`
|
|
172
|
+
- `saveTo: "contact_phone"` → use `validation: "phone"`
|
|
173
|
+
- `saveTo: "contact_name"` → `any` serve
|
|
174
|
+
No editor visual esses destinos só aparecem quando a validação bate (computed `allowedSaveTargets`). Os destinos `variable`/`contact_attr`/`conversation_attr` aceitam QUALQUER valor (sem essa restrição).
|
|
175
|
+
|
|
147
176
|
**Handles que SAEM dependem da validation:**
|
|
148
|
-
- `validation: 'any'` → `success`, `timeout`
|
|
149
|
-
- `validation: 'options'` → `option_<valor>` para cada valor em `acceptedOptions` (ex: `option_1`, `option_2`, `option_sim`) + `timeout`
|
|
150
|
-
- `validation: '
|
|
177
|
+
- `validation: 'any'` (e `regex`/`email`/`phone`/`number`) → `success`, `timeout`, `retries_exhausted`
|
|
178
|
+
- `validation: 'options'` → `option_<valor>` para cada valor em `acceptedOptions` (ex: `option_1`, `option_2`, `option_sim`) + `timeout` + `retries_exhausted`
|
|
179
|
+
- `validation: 'varied_options'` → `option_<group_id>` para cada grupo em `optionGroups` (ex: `option_sim`, `option_nao`) + `timeout` + `retries_exhausted`
|
|
180
|
+
|
|
181
|
+
**`timeout` vs `retries_exhausted` (DISTINTOS):** `timeout` = cliente ficou em silencio (estourou `waitTime`). `retries_exhausted` = cliente respondeu, mas errou a validacao mais que `maxRetries` vezes. Ligue cada um ao caminho desejado. Se `retries_exhausted` nao tiver edge, ha fallback p/ o edge de `timeout`; sem nenhum dos dois, o flow encerra ao esgotar as tentativas.
|
|
151
182
|
|
|
152
183
|
**Timeout AGORA dispara de verdade (corrigido 2026-06-09):** `waitTime` + `waitUnit` agendam o estouro — se o cliente não responder no prazo, o flow segue pelo handle `timeout`. Antes dessa data o backend ignorava o waitTime (flows antigos que dependiam do timeout passaram a funcionar). Sempre ligue um edge no handle `timeout` quando definir waitTime; sem edge, o flow simplesmente para ali no estouro.
|
|
153
184
|
|
|
154
|
-
**REGRA:** depois de wait_response com options
|
|
185
|
+
**REGRA:** depois de wait_response com `options` OU `varied_options`, NUNCA coloque node `condition` pra ramificar — ligue os edges direto nos handles `option_X` (em `varied_options`, `X` é o `id` do grupo).
|
|
155
186
|
|
|
156
187
|
### 2.4 `condition`
|
|
157
188
|
|
|
@@ -457,6 +488,26 @@ Não tente contornar criando flows intermediários.
|
|
|
457
488
|
|
|
458
489
|
---
|
|
459
490
|
|
|
491
|
+
## 2-C. Variáveis — de onde vêm e onde aparecem
|
|
492
|
+
|
|
493
|
+
Variáveis de sessão (`{{nome}}`) são CRIADAS por alguns nodes e ficam disponíveis pros nodes seguintes. O autocomplete `{{` no editor é **ciente do grafo (graph-aware)**: num node, ele só lista variáveis definidas por nodes UPSTREAM (no caminho de execução até ali) — não sugere variável que ainda não existe no ponto da execução. Use isso como regra: só referencie `{{var}}` se algum node ANTES dele (no caminho) a tiver criado.
|
|
494
|
+
|
|
495
|
+
Fontes de variável (quem cria o quê):
|
|
496
|
+
|
|
497
|
+
| Node | Variável(is) criada(s) |
|
|
498
|
+
|---|---|
|
|
499
|
+
| `set_variable` | cada item de `data.variables[].name` |
|
|
500
|
+
| `wait_response` com `saveTo: 'variable'` | o nome em `data.saveVariable` |
|
|
501
|
+
| `ai` mode `generate` / `custom` | `aiResponseVar` (default `ai_response`) |
|
|
502
|
+
| `ai` mode `intent` | `ai_intent` |
|
|
503
|
+
| `ai` mode `sentiment` | `ai_sentiment` |
|
|
504
|
+
| `ai` mode `extract` | cada `aiExtractParams[].name` (uma variável por parâmetro) |
|
|
505
|
+
| `api` | `apiResponseVar` (+ `apiResponseVar`_status) e campos do JSON de resposta |
|
|
506
|
+
|
|
507
|
+
Variáveis salvas em atributo (`saveTo: 'contact_attr'`/`'conversation_attr'`, ou node `action` `update_attribute`) NÃO viram variável de sessão `{{var}}` — leia-as via `{{contact.custom_attribute.X}}` / `{{conversation.custom_attribute.X}}` (singular).
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
460
511
|
## 3. Edges
|
|
461
512
|
|
|
462
513
|
```json
|
|
@@ -538,6 +589,9 @@ Nodes nunca devem ficar com a mesma coordenada `(x, y)`. Se dois nodes têm posi
|
|
|
538
589
|
| Edge com `target` apontando pra ID que não existe | Quebra o grafo | Confira que `target` está em `nodes[]` |
|
|
539
590
|
| `channel_type: "WhatsApp"` | Precisa do nome de classe Rails | `"Channel::Whatsapp"`, `"Channel::Waha"`, `"Channel::WebWidget"` |
|
|
540
591
|
| `validation: "option"` (singular) | Não existe | `"options"` (plural) |
|
|
592
|
+
| `varied_options` com `acceptedOptions` | Modo errado de config | `optionGroups: [{ id, terms, matchType }]` |
|
|
593
|
+
| `saveTo: "contact_phone"`/`"contact_email"` com `validation: "any"` | Cadastro reverte valor inválido em silêncio | Combine com `validation: "phone"`/`"email"` |
|
|
594
|
+
| Ativar 2 flows no mesmo gatilho+inbox+modo | 422 `flow_trigger_conflict` (exceto webhook/manual) | Desative o outro flow ou mude o gatilho |
|
|
541
595
|
| `custom_attributes` (plural) em `{{...}}` ou `field` | Resolve vazio | `custom_attribute` (singular) |
|
|
542
596
|
| `update_attribute` com `{entity, key, value}` | Campos errados, não salva | `{attr_source, attr_key, attr_value}` |
|
|
543
597
|
| `saveTo: "attribute"` ou `"contact_attribute"` | Não existem, não salva | `"conversation_attr"` / `"contact_attr"` |
|
|
@@ -570,5 +624,7 @@ Antes de chamar `flows_create` ou `flows_update`, valide mentalmente:
|
|
|
570
624
|
- [ ] Todo `sourceHandle` é um handle real exposto pelo node source (seção 2)
|
|
571
625
|
- [ ] `channel_type` é classe Rails (`Channel::Waha` etc)
|
|
572
626
|
- [ ] `inbox_ids` (se enviado) tem inboxes do mesmo `channel_type`
|
|
573
|
-
- [ ] Não tem `condition` redundante depois de `wait_response` com options
|
|
627
|
+
- [ ] Não tem `condition` redundante depois de `wait_response` com `options`/`varied_options`
|
|
628
|
+
- [ ] `wait_response` que salva e-mail/telefone do contato usa a validação correspondente (`email`/`phone`)
|
|
629
|
+
- [ ] Antes de ATIVAR: nenhum outro flow ativo no mesmo gatilho+inbox+modo (senão vem 422 `flow_trigger_conflict`)
|
|
574
630
|
- [ ] Layout: nodes em ordem visual da esquerda pra direita, sem sobreposição
|
|
@@ -433,6 +433,55 @@
|
|
|
433
433
|
|
|
434
434
|
---
|
|
435
435
|
|
|
436
|
+
## 14. Sim/Não com sinônimos (varied_options) + salvar e-mail com segurança
|
|
437
|
+
|
|
438
|
+
**Caso:** cliente pode responder "sim" de vários jeitos ("claro", "quero", "pode ser") — `varied_options` agrupa tudo numa só saída. Depois pede o e-mail e salva no cadastro com a validação certa (`email`), pra não ser revertido em silêncio.
|
|
439
|
+
|
|
440
|
+
```json
|
|
441
|
+
{
|
|
442
|
+
"nodes": [
|
|
443
|
+
{ "id": "n1", "type": "start", "position": { "x": 50, "y": 300 }, "data": { "label": "Início", "triggers": [{ "type": "conversation_created" }] } },
|
|
444
|
+
{ "id": "n2", "type": "send_message", "position": { "x": 370, "y": 300 }, "data": { "label": "Oferece", "messageItems": [
|
|
445
|
+
{ "id": "m1", "type": "text", "content": "Quer receber nossas novidades por e-mail?" }
|
|
446
|
+
] } },
|
|
447
|
+
{ "id": "n3", "type": "wait_response", "position": { "x": 690, "y": 300 }, "data": {
|
|
448
|
+
"label": "Quer?", "waitTime": 30, "waitUnit": "minutes", "validation": "varied_options",
|
|
449
|
+
"optionGroups": [
|
|
450
|
+
{ "id": "sim", "terms": ["sim", "claro", "quero", "pode ser", "aceito"], "matchType": "contains" },
|
|
451
|
+
{ "id": "nao", "terms": ["nao", "não", "agora nao", "passo"], "matchType": "contains" }
|
|
452
|
+
],
|
|
453
|
+
"invalidMessage": "Responda com sim ou não, por favor.", "maxRetries": 2, "saveTo": ""
|
|
454
|
+
} },
|
|
455
|
+
{ "id": "n4", "type": "send_message", "position": { "x": 1010, "y": 180 }, "data": { "label": "Pede e-mail", "messageItems": [
|
|
456
|
+
{ "id": "m2", "type": "text", "content": "Show! Qual seu melhor e-mail?" }
|
|
457
|
+
] } },
|
|
458
|
+
{ "id": "n5", "type": "wait_response", "position": { "x": 1330, "y": 180 }, "data": {
|
|
459
|
+
"label": "Captura e-mail", "waitTime": 15, "waitUnit": "minutes", "validation": "email",
|
|
460
|
+
"invalidMessage": "Esse e-mail não parece válido, pode conferir?", "maxRetries": 2,
|
|
461
|
+
"saveTo": "contact_email"
|
|
462
|
+
} },
|
|
463
|
+
{ "id": "n6", "type": "send_message", "position": { "x": 1650, "y": 180 }, "data": { "label": "Confirma", "messageItems": [
|
|
464
|
+
{ "id": "m3", "type": "text", "content": "Pronto, anotei aqui. Obrigado!" }
|
|
465
|
+
] } },
|
|
466
|
+
{ "id": "n7", "type": "send_message", "position": { "x": 1010, "y": 420 }, "data": { "label": "Tudo bem", "messageItems": [
|
|
467
|
+
{ "id": "m4", "type": "text", "content": "Sem problema! Qualquer coisa é só chamar." }
|
|
468
|
+
] } }
|
|
469
|
+
],
|
|
470
|
+
"edges": [
|
|
471
|
+
{ "id": "e1", "source": "n1", "target": "n2", "sourceHandle": "success", "type": "deletable", "animated": true },
|
|
472
|
+
{ "id": "e2", "source": "n2", "target": "n3", "sourceHandle": "success", "type": "deletable", "animated": true },
|
|
473
|
+
{ "id": "e3", "source": "n3", "target": "n4", "sourceHandle": "option_sim", "type": "deletable", "animated": true },
|
|
474
|
+
{ "id": "e4", "source": "n3", "target": "n7", "sourceHandle": "option_nao", "type": "deletable", "animated": true },
|
|
475
|
+
{ "id": "e5", "source": "n4", "target": "n5", "sourceHandle": "success", "type": "deletable", "animated": true },
|
|
476
|
+
{ "id": "e6", "source": "n5", "target": "n6", "sourceHandle": "success", "type": "deletable", "animated": true }
|
|
477
|
+
]
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
**Lembretes:** em `varied_options` o handle é `option_<id do grupo>` (não por termo); use `matchType: "equals"` quando um termo curto colidiria (ex: "1" casando "12" com `contains`). Pra salvar telefone use `validation: "phone"` + `saveTo: "contact_phone"`.
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
436
485
|
## Como usar este catálogo
|
|
437
486
|
|
|
438
487
|
1. **Identifique o pattern mais próximo** do que o cliente pediu
|
|
@@ -440,6 +489,6 @@
|
|
|
440
489
|
3. **Substitua os IDs e valores reais** (team_id, funnel_id, assistant_id, templateId, URLs, etc) — confira antes via `teams_list`, `funnels_list`, `captain_assistants_list`, `inboxes_whatsapp_templates_list`
|
|
441
490
|
4. **Adicione campos do flow**: `name`, `description`, `channel_type` (`Channel::Waha` etc), `inbox_ids`
|
|
442
491
|
5. **Chame `flows_create`** com o payload completo
|
|
443
|
-
6. Após criar, **ative** com `flows_toggle` se o cliente quiser que rode já
|
|
492
|
+
6. Após criar, **ative** com `flows_toggle` se o cliente quiser que rode já. ATENÇÃO (2026-06-16): se já existir outro flow ATIVO com o mesmo gatilho na mesma inbox (e mesmo modo), a ativação retorna **422 `flow_trigger_conflict`** — exceto `webhook_received`/`manual_trigger`, que podem coexistir. Não fique reativando: explique o conflito ao usuário (qual flow + qual caixa) e ofereça desativar o outro ou mudar o gatilho. Dá pra checar antes com `POST /flows/check_conflicts` (não salva). Detalhes no `flowbuilder-design-guide` (seção 2.1, "Trava de gatilho duplicado").
|
|
444
493
|
|
|
445
494
|
Se a necessidade não bate com nenhum pattern, monte do zero seguindo o **`flowbuilder-design-guide`** — mas use estes templates como referência de layout/handle/schema válidos.
|
|
@@ -108,6 +108,21 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
|
|
|
108
108
|
- `source_id`: ID do contato no canal (ex: `5511999999999@c.us` no WhatsApp WAHA)
|
|
109
109
|
- Um contato pode ter vários ContactInboxes (um por canal)
|
|
110
110
|
|
|
111
|
+
### Bloqueio de contato (`blocked`)
|
|
112
|
+
|
|
113
|
+
**Termo:** "bloquear contato" / "contato bloqueado".
|
|
114
|
+
|
|
115
|
+
**O que é:** marca o contato como bloqueado. Quando bloqueado, mensagens recebidas dele são
|
|
116
|
+
DESCARTADAS na entrada (não criam conversa nem notificam). Bloquear NÃO resolve a conversa atual.
|
|
117
|
+
|
|
118
|
+
**Como aplicar via tools:**
|
|
119
|
+
- Forma dedicada: `lionchat_conversations_toggle_block` — `POST .../conversations/:id/toggle_block`
|
|
120
|
+
com body `{blocked: true|false}`. Bloqueia/desbloqueia o contato DAQUELA conversa e gera uma
|
|
121
|
+
pílula de atividade ("contato bloqueado") na timeline.
|
|
122
|
+
- Forma alternativa: o atributo `blocked` no update de contato (`lionchat_contacts_update`) também
|
|
123
|
+
liga/desliga o bloqueio — mas SEM a pílula de atividade. Prefira `toggle_block` quando estiver
|
|
124
|
+
no contexto de uma conversa.
|
|
125
|
+
|
|
111
126
|
## Inbox (Caixa de Entrada / Canal)
|
|
112
127
|
|
|
113
128
|
### `channel_type`
|
|
@@ -136,6 +151,23 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
|
|
|
136
151
|
- `working_hours_enabled`: se respeita horário de atendimento
|
|
137
152
|
- `greeting_enabled` / `greeting_message`: mensagem de boas-vindas
|
|
138
153
|
|
|
154
|
+
### Supervisor de caixa (InboxMember.auto_assignable = false)
|
|
155
|
+
|
|
156
|
+
**Termo:** "Supervisor de caixa" / "supervisor da caixa de entrada".
|
|
157
|
+
|
|
158
|
+
**O que é:** um membro da caixa marcado como supervisor. Ele VÊ TODAS as conversas e cards
|
|
159
|
+
daquela caixa (visão completa), mas fica FORA da distribuição automática (round-robin) — ou seja,
|
|
160
|
+
o sistema nunca atribui conversas novas a ele automaticamente. Serve pra gestor/líder que precisa
|
|
161
|
+
acompanhar tudo sem entrar na fila de atendimento.
|
|
162
|
+
|
|
163
|
+
**Onde fica armazenado:** flag `inbox_members.auto_assignable` (boolean). Membro comum =
|
|
164
|
+
`auto_assignable: true` (entra no rodízio); supervisor = `auto_assignable: false` (vê tudo, fora
|
|
165
|
+
do rodízio).
|
|
166
|
+
|
|
167
|
+
**Como definir/ler via tools:** `lionchat_inbox_members_create` e `lionchat_inbox_members_update`
|
|
168
|
+
aceitam `supervisor_ids[]` além de `user_ids[]` — os IDs em `supervisor_ids` viram supervisores;
|
|
169
|
+
os de `user_ids` viram membros comuns. A resposta traz `is_supervisor` (boolean) por agente.
|
|
170
|
+
|
|
139
171
|
## KanbanItem (Card do CRM)
|
|
140
172
|
|
|
141
173
|
### Estrutura
|
|
@@ -320,15 +352,21 @@ Campos MUTÁVEIS (atualizáveis livremente por IA/integração): `marital_status
|
|
|
320
352
|
|
|
321
353
|
`custom_attribute_definitions` (model=`contact_attribute`) fica reservado a dado de NEGÓCIO genérico que não tem modelo dedicado (ex: "plano contratado", "nicho do cliente").
|
|
322
354
|
|
|
323
|
-
##
|
|
355
|
+
## Ligações — TRÊS sistemas distintos (não confundir!)
|
|
356
|
+
|
|
357
|
+
| Sistema | O que é | Tools | Canal |
|
|
358
|
+
|---|---|---|---|
|
|
359
|
+
| **Ligação WP (Wavoip)** | Voz pelo WhatsApp em caixa **QR Code/WAHA** — QR conecta um "device" Wavoip; widget de discagem, gravação e transcrição automática | `wavoip_*` (por inbox: status/token/calls/connect/disconnect/settings) | WhatsApp QR Code |
|
|
360
|
+
| **WhatsApp Calling (Cloud)** | Voz pelo WhatsApp na **API oficial** (enterprise) | `whatsapp_calls_*` + enable/disable_whatsapp_calling | WhatsApp oficial |
|
|
361
|
+
| **VoIP (Zenvia)** | Telefonia COMUM (ramais, saldo, recarga) | `voip_*` | Telefone |
|
|
324
362
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
363
|
+
Quando o usuário falar "ligação", descubra o canal: caixa QR Code → Wavoip; caixa oficial →
|
|
364
|
+
whatsapp_calls; telefone fixo/ramal → VoIP Zenvia.
|
|
365
|
+
|
|
366
|
+
**Wavoip (2026-06-11):** config por inbox (`record_all_calls`, `auto_transcribe`,
|
|
367
|
+
`transcription_provider` groq|openai), feature flag `wavoip_calling`, limite por plano
|
|
368
|
+
`wavoip_voice_inboxes`, R$70/device/mês. Conectar/configurar = admin; discar/histórico = membro
|
|
369
|
+
da caixa. WhatsappCall (Cloud): `status`, `custom_name`, `favorited`, `transcript`/`transcript_status`.
|
|
332
370
|
|
|
333
371
|
## Chat interno da equipe (InternalChat)
|
|
334
372
|
|
|
@@ -344,6 +382,13 @@ por FASES configuráveis (LiontrackJourneyStage: padrão de URL → fase, match
|
|
|
344
382
|
Feature flag `liontrack` (404 sem ela). Relatório: `journey_funnel_reports` (v2), janela máx 30
|
|
345
383
|
dias, URLs sem querystring (LGPD).
|
|
346
384
|
|
|
385
|
+
## Meta CAPI — moeda do evento de conversão (2026-06)
|
|
386
|
+
|
|
387
|
+
Ao disparar uma conversão pro Meta (Conversions API), o valor agora carrega uma moeda. Parâmetro
|
|
388
|
+
`currency` (código ISO, ex: `BRL`, `USD`); default `BRL` quando omitido. A moeda pode ser escolhida
|
|
389
|
+
tanto no disparo individual da conversão quanto na configuração do funil (valor padrão herdado pelos
|
|
390
|
+
cards daquele funil).
|
|
391
|
+
|
|
347
392
|
## Idiomas da plataforma (2026-06)
|
|
348
393
|
|
|
349
394
|
A plataforma opera com 6 idiomas: `en`, `es`, `fr`, `it`, `pt`, `pt_BR` (default das contas
|
|
@@ -272,6 +272,32 @@ Funis agora têm visibilidade por usuário. Um funil é visível pra alguém qua
|
|
|
272
272
|
**Pro MCP:** antes de tentar mover/editar card, confira os campos `can_*` do show — se `can_move`
|
|
273
273
|
é false, explique ao usuário que ele não tem acesso àquele funil em vez de tentar mesmo assim.
|
|
274
274
|
|
|
275
|
+
## Controle de acesso por CAIXA (conversas + cards) e a "ponte" da conversa atribuída (2026-06)
|
|
276
|
+
|
|
277
|
+
Além da visibilidade por funil (acima), há um controle de acesso POR CAIXA que vale tanto pro
|
|
278
|
+
Kanban quanto pras CONVERSAS. Um agente NÃO-admin só vê as conversas e os cards das caixas das quais
|
|
279
|
+
ele é membro (membro comum OU supervisor — ver "Supervisor de caixa" no glossário). Admin vê tudo.
|
|
280
|
+
|
|
281
|
+
**A ponte (exceção pontual):** estar ATRIBUÍDO a um card dá acesso PONTUAL à conversa daquele card,
|
|
282
|
+
mesmo que o agente não seja membro da caixa. A ponte vale pra:
|
|
283
|
+
- a conversa PRINCIPAL do card (`conversation_display_id`), e
|
|
284
|
+
- as conversas em `linked_conversations`.
|
|
285
|
+
|
|
286
|
+
O que a ponte libera: ABRIR e RESPONDER aquela conversa específica. O que a ponte NÃO libera: a
|
|
287
|
+
caixa inteira (o agente continua sem ver as outras conversas/cards daquela caixa). A atribuição é a
|
|
288
|
+
qualquer agente no card (`assigned_agents`), não só ao responsável da conversa.
|
|
289
|
+
|
|
290
|
+
**Efeitos práticos nas tools (lado conversas):**
|
|
291
|
+
- `conversations_list` / `conversations_search` retornam SÓ conversas de caixas acessíveis (mais as
|
|
292
|
+
liberadas pela ponte de card atribuído).
|
|
293
|
+
- `conversations_show` / `conversations_messages_*` de conversa inacessível → **404**.
|
|
294
|
+
- Buscar card por ID ou rodar ação em massa (`kanban_bulk_bulk_actions`, export) numa caixa
|
|
295
|
+
inacessível → **404** (a ação não vaza cards de caixa que o agente não pode ver).
|
|
296
|
+
|
|
297
|
+
**Pro MCP:** se uma conversa/card "some" da listagem ou dá 404 pra um agente que jura que existe,
|
|
298
|
+
provavelmente é acesso por caixa — explique que ele só vê as caixas das quais participa, e que o
|
|
299
|
+
acesso a uma conversa solta vem de estar atribuído ao card dela.
|
|
300
|
+
|
|
275
301
|
## Funil arquivado vs ativo
|
|
276
302
|
|
|
277
303
|
- `archived = true`: funil escondido da UI principal. Cards ainda existem mas não aparecem nas listas
|
|
@@ -300,6 +300,33 @@ fase, match literal de substring, sem regex).
|
|
|
300
300
|
**Perguntas que esse relatório responde:** "por onde os leads entram?", "qual página perde mais
|
|
301
301
|
gente?", "quem veio da campanha X navegou por onde antes de chamar?".
|
|
302
302
|
|
|
303
|
+
## Origem dos Leads — relatório novo (2026-06)
|
|
304
|
+
|
|
305
|
+
`GET /api/v2/accounts/{id}/lead_origin_reports` (tool `lionchat_lead_origin_reports`) — agrega de
|
|
306
|
+
ONDE vieram os leads, cruzando os campos `origin_*` das conversas com os leads órfãos (que ainda não
|
|
307
|
+
viraram conversa). É um relatório de LEITURA puro — não cria nem altera nada.
|
|
308
|
+
|
|
309
|
+
**Filtros (query, todos opcionais):** `since` / `until` (ISO 8601; default = 30 dias atrás → agora),
|
|
310
|
+
`funnel_id`, `platform`, `kind`, `campaign`, `adset`, `group_by`.
|
|
311
|
+
|
|
312
|
+
**Retorno:**
|
|
313
|
+
- `period` — janela efetiva considerada.
|
|
314
|
+
- `totals` — `conversations`, `classified` (com origem identificada), `unclassified` (sem origem),
|
|
315
|
+
`orphan_leads` (leads sem conversa ainda), `unique_leads` (deduplicados por TELEFONE),
|
|
316
|
+
`won_leads` (leads em cards de estágio de Ganho) e `conversion_rate`.
|
|
317
|
+
- Arrays de quebra: `by_platform`, `by_kind`, `by_campaign`, `by_adset`, `by_creative`. Cada linha
|
|
318
|
+
tem `{value, conversations, won, conversion_rate}`.
|
|
319
|
+
|
|
320
|
+
**Conceitos importantes:**
|
|
321
|
+
- `won` = cards parados em etapas de GANHO do funil (fechados como sucesso).
|
|
322
|
+
- `unique_leads` deduplica por telefone (mesmo lead que falou várias vezes conta 1).
|
|
323
|
+
- "orphan lead" = lead capturado (ex: Meta Lead) que ainda não tem conversa associada.
|
|
324
|
+
|
|
325
|
+
**Gates:** permissão de relatórios (admin ou report_manage).
|
|
326
|
+
|
|
327
|
+
**Perguntas que esse relatório responde:** "qual plataforma trouxe mais leads?", "qual campanha/
|
|
328
|
+
conjunto converteu melhor?", "quantos leads únicos vieram esse mês e quantos fecharam?".
|
|
329
|
+
|
|
303
330
|
## Quando o usuário pede algo MUITO específico que não existe num endpoint
|
|
304
331
|
|
|
305
332
|
Se a pergunta requer cálculos custom (ex: "conversas por agente que duraram mais de X minutos"):
|
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-06-
|
|
286
|
+
const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-06-16)
|
|
287
287
|
|
|
288
288
|
flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
289
289
|
|
|
@@ -308,7 +308,9 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
|
308
308
|
QUALQUER msg do cliente que case), conversation_created/conversation_reopened (match_mode +
|
|
309
309
|
keywords opcionais), conversation_resolved, label_added/label_removed (label_names[] — NAO
|
|
310
310
|
'label' singular), card_created/card_moved (funnel_ids[] + funnel_stages[] 'funnel_id:stage'),
|
|
311
|
-
cron, webhook.
|
|
311
|
+
cron, webhook. NOVO message_sent (2026-06-11): par do message_received pra mensagens de
|
|
312
|
+
SAIDA (atendente, celular/eco, IA — nota privada NAO) com keywords+match_type; cuidado: acao
|
|
313
|
+
'desativar IA' com esse trigger sem keywords = a propria resposta da IA dispara o flow.
|
|
312
314
|
WEBHOOK EMBUTIDO (Webhook Universal): 1) criar flow; 2) POST /custom_webhook_integrations com
|
|
313
315
|
{custom_webhook_integration:{flow_id}} (idempotente, retorna URL unica); 3) flows_update com
|
|
314
316
|
item {type:'webhook_received', config:{integration_id}} no data.items do start. Remover o item
|
|
@@ -330,8 +332,9 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
|
330
332
|
▸ wait_response
|
|
331
333
|
data: {
|
|
332
334
|
label, waitTime, waitUnit: "minutes"|"seconds"|"hours",
|
|
333
|
-
validation: "any"|"options"|"regex",
|
|
335
|
+
validation: "any"|"number"|"email"|"phone"|"options"|"varied_options"|"regex",
|
|
334
336
|
acceptedOptions: ["1","2"], // se validation='options'
|
|
337
|
+
optionGroups: [{ id, terms:["sim","claro"], matchType:"contains"|"equals" }], // se validation='varied_options'
|
|
335
338
|
regexPattern, // se validation='regex'
|
|
336
339
|
invalidMessage, maxRetries,
|
|
337
340
|
saveTo: "variable"|"contact_name"|"contact_email"|"contact_phone"|"contact_attr"|"conversation_attr"|"",
|
|
@@ -340,9 +343,15 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
|
340
343
|
saveTo "attribute"/"contact_attribute" NAO EXISTEM — nao salvam nada.
|
|
341
344
|
TIMEOUT DISPARA DE VERDADE (corrigido 2026-06-09): waitTime estourou -> handle "timeout"
|
|
342
345
|
(ou "option_{val}_timeout" no modo options). Sempre ligue um edge no timeout.
|
|
346
|
+
Respostas invalidas alem de maxRetries -> handle "retries_exhausted" (distinto do timeout de silencio;
|
|
347
|
+
se nao houver edge nele, cai no "timeout").
|
|
343
348
|
Handles validation='options': "option_{val}" por opcao + "timeout"
|
|
349
|
+
Handles validation='varied_options': "option_{group_id}" por grupo (optionGroups) + "timeout"
|
|
344
350
|
Handles outros: "success" + "timeout"
|
|
345
|
-
|
|
351
|
+
options/varied_options normalizam a resposta (sem acento/maiuscula); varied_options usa matchType por
|
|
352
|
+
grupo ('contains' padrao ou 'equals'). saveTo contact_email/contact_phone exige validation 'email'/'phone'
|
|
353
|
+
(valor invalido NAO grava; telefone vira E.164) — pra texto livre use saveTo "variable".
|
|
354
|
+
IMPORTANTE: validation='options'/'varied_options' ja roteia por opcao/grupo — NAO precisa condition depois.
|
|
346
355
|
|
|
347
356
|
▸ condition
|
|
348
357
|
data: { label, conditions: [
|
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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"}
|