@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.
@@ -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
- └── user_id
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: 'regex'` → `success`, `timeout`
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, NUNCA coloque node `condition` pra ramificar — ligue os edges direto nos handles `option_X`.
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
- ## Ligação WhatsApp (WhatsappCall) — voz pela API oficial
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
- Chamada de VOZ feita/recebida pelo WhatsApp (Cloud API, enterprise). **Não confundir com VoIP
326
- (Zenvia)**, que é ligação TELEFÔNICA comum — são dois produtos distintos com tools distintas:
327
- - `whatsapp_calls_*` → ligação de voz pelo WhatsApp (histórico, favoritas, observação,
328
- transcrição por IA sob demanda)
329
- - `voip_*` → telefonia Zenvia (ramais, saldo, recarga)
330
- Campos: `status` (ringing/accepted/completed/failed), `custom_name` (observação), `favorited`,
331
- `transcript` + `transcript_status`. Ativação por caixa: `enable_whatsapp_calling`.
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-11)
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
- IMPORTANTE: validation='options' ja roteia por opcao — NAO precisa condition depois.
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":"AAAA,+DAA+D;AAC/D,mFAAmF;AAEnF,OAAO,EAAE,CAAC,EAAc,MAAM,KAAK,CAAC;AAIpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAkCpC,yEAAyE;AACzE,SAAS,kBAAkB,CAAC,MAAc;IACxC,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,KAAK;YACR,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC9E,KAAK,MAAM;YACT,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAChF,KAAK,OAAO,CAAC;QACb,KAAK,KAAK;YACR,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC/E,KAAK,QAAQ;YACX,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC9E;YACE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IAClF,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,iBAAiB,GAA2B;IAChD,OAAO,EAAE,SAAS;IAClB,mBAAmB,EAAE,kBAAkB;IACvC,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,eAAe;IAC5B,mBAAmB,EAAE,SAAS;IAC9B,WAAW,EAAE,UAAU;IACvB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;IAClB,wBAAwB,EAAE,gBAAgB;IAC1C,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,QAAQ;IACjB,cAAc,EAAE,eAAe;IAC/B,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,QAAQ;IAClB,kBAAkB,EAAE,OAAO;IAC3B,oBAAoB,EAAE,mBAAmB;IACzC,qBAAqB,EAAE,oBAAoB;IAC3C,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,cAAc;IACvB,oBAAoB,EAAE,aAAa;IACnC,kBAAkB,EAAE,eAAe;IACnC,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,cAAc;IACvB,oBAAoB,EAAE,iBAAiB;IACvC,qBAAqB,EAAE,sBAAsB;IAC7C,qBAAqB,EAAE,iBAAiB;IACxC,eAAe,EAAE,aAAa;IAC9B,SAAS,EAAE,eAAe;IAC1B,iBAAiB,EAAE,qBAAqB;IACxC,SAAS,EAAE,gBAAgB;IAC3B,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,OAAO;IAChB,aAAa,EAAE,oBAAoB;IACnC,sBAAsB,EAAE,mBAAmB;IAC3C,qBAAqB,EAAE,kBAAkB;IACzC,sBAAsB,EAAE,cAAc;IACtC,yBAAyB,EAAE,mBAAmB;IAC9C,KAAK,EAAE,KAAK;IACZ,mBAAmB,EAAE,gBAAgB;IACrC,gBAAgB,EAAE,gBAAgB;IAClC,iBAAiB,EAAE,aAAa;IAChC,oBAAoB,EAAE,oBAAoB;IAC1C,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,iBAAiB;IACtC,iBAAiB,EAAE,iBAAiB;IACpC,yBAAyB,EAAE,qBAAqB;IAChD,UAAU,EAAE,UAAU;IACtB,wBAAwB,EAAE,oBAAoB;IAC9C,eAAe,EAAE,WAAW;IAC5B,eAAe,EAAE,eAAe;IAChC,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,SAAS;IACpB,uBAAuB,EAAE,uBAAuB;IAChD,YAAY,EAAE,SAAS;IACvB,gBAAgB,EAAE,iBAAiB;IACnC,kBAAkB,EAAE,eAAe;IACnC,iBAAiB,EAAE,oBAAoB;IACvC,MAAM,EAAE,MAAM;IACd,0BAA0B,EAAE,mBAAmB;IAC/C,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,UAAU,GAAG,IAAI;SACpB,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,IAAI,EAAE,CAAC;IACV,OAAO,iBAAiB,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,kEAAkE;AAClE,SAAS,cAAc,CAAC,KAAoB;IAC1C,IAAI,MAAkB,CAAC;IAEvB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,MAAM;YACT,MAAM,GAAG,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CACP,wDAAwD,CACzD,CAAC;YACJ,MAAM;QACR,KAAK,QAAQ,CAAC;QACd;YACE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM;IACV,CAAC;IAED,gFAAgF;IAChF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4DAA4D;AAC5D,wFAAwF;AACxF,kFAAkF;AAClF,SAAS,cAAc,CACrB,MAAuB;IAEvB,MAAM,KAAK,GAA+B,EAAE,CAAC;IAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,kBAAkB,GAAG,IAAI,CAAC;YAC1B,oFAAoF;YACpF,yEAAyE;YACzE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,2HAA2H,CAC5H,CAAC;YACJ,SAAS;QACX,CAAC;QACD,uFAAuF;QACvF,uFAAuF;QACvF,yFAAyF;QACzF,sFAAsF;QACtF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,8FAA8F;IAC9F,6EAA6E;IAC7E,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;aACpB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,2HAA2H,CAC5H,CAAC;IACN,CAAC;IAED,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,iFAAiF;AACjF,SAAS,YAAY,CAAC,MAAuB;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,4DAA4D;AAC5D,SAAS,kBAAkB,CACzB,MAAiB,EACjB,MAAc,EACd,MAAsB,EACtB,QAAqB;IAErB,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9C,yFAAyF;IACzF,IAAI,WAAW,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/E,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW;YACT,+EAA+E;gBAC/E,WAAW,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,EAAE,EACX,WAAW,EACX,MAAM,CAAC,KAAK,EACZ,WAAW,EACX,KAAK,EAAE,MAA+B,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,kEAAkE;YAClE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACpE,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;oBAC5B,gFAAgF;oBAChF,wEAAwE;oBACxE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBACxF,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,2FAA2F;iCAClG;6BACF;4BACD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,+FAA+F;YAC/F,oFAAoF;YACpF,wDAAwD;YACxD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;YAC1C,MAAM,kBAAkB,GACtB,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC;gBACpF,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;gBACtB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACvB,MAAM,oBAAoB,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;YACpE,OAAO,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAE1C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,cAAc,CAC5D,oBAAoB,EACpB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,YAAY,CACtB,CAAC;YAEF,MAAM,IAAI,GAAG,cAAc,CACzB,QAAQ,CAAC,IAAI,EACb,kBAAkB,EAClB,UAAU,CACX,CAAC;YACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAExD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gFAAgF;YAChF,uEAAuE;YACvE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,gBAAgB,CACvB,MAAiB,EACjB,MAAc,EACd,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,yFAAyF,EACzF,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,0BAA0B,CACjC,MAAiB,EACjB,YAA2B;IAE3B,6EAA6E;IAC7E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAClC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,QAAQ,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,sIAAsI,EACtI,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SACzD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,wEAAwE;AACxE,gDAAgD;AAChD,SAAS,gCAAgC,CAAC,MAAiB;IACzD,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgMlB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,2PAA2P,EAC3P,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SACtD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,MAAc,EACd,MAAsB;IAEtB,yFAAyF;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACjE,IAAI,SAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sCAAsC,aAAa,IAAI;YACvD,oDAAoD;YACpD,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,SAAS,CAAC;IAEzB,iFAAiF;IACjF,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,6DAA6D;IAC7D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,wEAAwE;IACxE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,0BAA0B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,gCAAgC,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,uDAAuD;AACrF,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}