@lionchat/mcp-server 1.22.0 → 1.23.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/resources/agenda-multiplas-unidades.md +25 -0
- package/dist/docs/resources/best-practices.md +19 -0
- package/dist/docs/resources/data-model.md +23 -1
- package/dist/docs/resources/flowbuilder-design-guide.md +58 -12
- package/dist/docs/resources/troubleshooting.md +78 -0
- package/dist/tools.js +34 -4
- package/dist/tools.js.map +1 -1
- package/endpoints.json +175 -36
- package/package.json +1 -1
|
@@ -97,6 +97,31 @@ Variável desconhecida **sai crua** para o cliente ("Olá {{name}}, ...").
|
|
|
97
97
|
horário** para a agenda — decisão do dono. Não use `attendance` para deduzir se o compromisso está
|
|
98
98
|
ativo; para isso existe `status`.
|
|
99
99
|
|
|
100
|
+
Marcar Compareceu/Faltou também **não conclui a tarefa**: ela segue `pending` (e contando nas
|
|
101
|
+
pendências) até alguém concluir. É de propósito — concluir um compromisso de Booking encerra os lembretes
|
|
102
|
+
e as mensagens pós-atendimento dele e dispara o gatilho de fluxo "agendamento concluído". **Nunca conclua
|
|
103
|
+
a tarefa só porque a presença foi marcada.**
|
|
104
|
+
|
|
105
|
+
Para responder "o que aconteceu com este compromisso?" use o campo **`selo`** da tarefa (17/09), que já
|
|
106
|
+
junta os dois eixos e a remarcação: `cancelled` > `no_show` / `attended` > `completed` > `snoozed` >
|
|
107
|
+
`rescheduled` > `pending`. É o mesmo rótulo que o painel mostra ao lado da tarefa (Faltou, Compareceu,
|
|
108
|
+
Remarcada...). É só de leitura.
|
|
109
|
+
|
|
110
|
+
### Responsável de compromisso de Booking é FIXO
|
|
111
|
+
|
|
112
|
+
O compromisso marcado por um tipo de evento (Booking) cai SEMPRE na agenda do profissional configurado
|
|
113
|
+
nele. Na criação, `assignee_ids` nunca valeu; desde 17/09 também é **ignorado na edição**
|
|
114
|
+
(`lionchat_tasks_update` / `_update_1`): a resposta é 200, o resto da edição vale e o responsável continua
|
|
115
|
+
o mesmo. Para mudar quem atende, altere o profissional do tipo de evento (`booking_event_types_update`).
|
|
116
|
+
|
|
117
|
+
### Ver como está o dia antes de marcar
|
|
118
|
+
|
|
119
|
+
`lionchat_agent_availability_day` (17/09) devolve UM dia de até 6 pessoas: o expediente de cada uma e os
|
|
120
|
+
intervalos já ocupados, em "HH:MM" do fuso pedido. O intervalo ocupado de qualquer pessoa da conta vem
|
|
121
|
+
sempre (é o que permite marcar com um colega); o título do compromisso só vem para quem já o veria no
|
|
122
|
+
calendário, e compromisso privado de outra pessoa nunca vem com título. Para Booking, os horários válidos
|
|
123
|
+
continuam sendo os de `booking_event_types_slots` — essa ferramenta é para compromisso COMUM.
|
|
124
|
+
|
|
100
125
|
---
|
|
101
126
|
|
|
102
127
|
## 5. Google Calendar é UMA CONEXÃO POR AGENDA
|
|
@@ -932,3 +932,22 @@ Em `custom_roles_create` / `custom_roles_update`, a `description` é **uma frase
|
|
|
932
932
|
na descrição** — a tela já as mostra na coluna "Permissões". Uma descrição de 180 caracteres
|
|
933
933
|
escondeu o cargo recém-criado na lista de Funções personalizadas da conta 1 (a tela foi corrigida
|
|
934
934
|
para cortar o texto com reticências, mas a descrição longa continua ilegível ali).
|
|
935
|
+
|
|
936
|
+
## Entrar num grupo por convite (17/09/2026)
|
|
937
|
+
|
|
938
|
+
Só em caixa de WhatsApp QR Code (`Channel::Waha`). São DUAS tools e a ordem importa.
|
|
939
|
+
|
|
940
|
+
1. `lionchat_inboxes_waha_groups_list_3` (join_info) — SÓ LEITURA: diz qual é o grupo (`Name`,
|
|
941
|
+
`ParticipantCount`, `IsJoinApprovalRequired`). **Chame sempre primeiro** e confirme com a pessoa
|
|
942
|
+
em qual grupo ela vai entrar. Entrar é ação que muda o WhatsApp do cliente.
|
|
943
|
+
2. `lionchat_inboxes_waha_groups_create_6` (join) — entra, como participante comum.
|
|
944
|
+
|
|
945
|
+
As duas aceitam o código cru, o link inteiro (`https://chat.whatsapp.com/CODIGO`) ou um texto com o
|
|
946
|
+
link no meio — não precisa extrair o código antes.
|
|
947
|
+
|
|
948
|
+
**Recusa esperada:** 422 com `reason: groups_disabled` quando a caixa está com "Aceitar grupos"
|
|
949
|
+
desligado. Não insista nem tente contornar: sem essa chave o WhatsApp nem entrega as mensagens do
|
|
950
|
+
grupo, então o número entraria num grupo que nunca apareceria no painel. O caminho é o cliente ligar
|
|
951
|
+
a opção nas configurações da caixa e tentar de novo.
|
|
952
|
+
|
|
953
|
+
A resposta do join_info vem no formato cru do motor, em PascalCase (`Name`, não `name`).
|
|
@@ -408,9 +408,16 @@ AccountTask (agenda interna)
|
|
|
408
408
|
│ (painel|link|ia|sistema|fluxo) — QUEM agendou e por onde (14/09)
|
|
409
409
|
├── attendance (enum attended=0 / no_show=1, NULO = nada registrado — CARIMBO, não muda status)
|
|
410
410
|
│ / attendance_by (polimórfico) / attendance_source — quem marcou Compareceu/Faltou (14/09)
|
|
411
|
+
├── selo (SÓ LEITURA, calculado — 17/09): o rótulo ÚNICO que a tela mostra ao lado da tarefa, juntando
|
|
412
|
+
│ `status` + `attendance` + remarcação: cancelled > no_show / attended > completed > snoozed >
|
|
413
|
+
│ rescheduled > pending. `rescheduled` = data trocada pelo painel/fluxo/IA (`reschedule_source`) OU pelo
|
|
414
|
+
│ cliente no link do agendamento. Para dizer "o que aconteceu com este compromisso", LEIA `selo` —
|
|
415
|
+
│ `status: pending` sozinho NÃO significa "nada aconteceu" (a pessoa pode ter faltado)
|
|
411
416
|
├── agenda_treatment_id (FK → AgendaTreatment, nullify) / treatment_session_number (1..N) — a sessão
|
|
412
417
|
│ que este compromisso é; índice único parcial por tratamento+número entre os NÃO cancelados (15/09)
|
|
413
|
-
└── assignees (has_many → User, via account_task_assignments)
|
|
418
|
+
└── assignees (has_many → User, via account_task_assignments). Compromisso NASCIDO DE BOOKING
|
|
419
|
+
(`booking_id` presente) tem responsável FIXO = o agente configurado no tipo de evento:
|
|
420
|
+
`assignee_ids` enviado no update é IGNORADO (200, o resto da edição vale — 17/09)
|
|
414
421
|
|
|
415
422
|
AgendaTreatment (tratamento em sessões — tools `agenda_treatments_*`; tabela agenda_treatments; 15/09)
|
|
416
423
|
├── id (PK) / account_id (FK) / contact_id (FK) / booking_event_type_id (FK, nullify)
|
|
@@ -606,6 +613,21 @@ da consulta) — em vez de herdar sempre o horário da consulta. Há ainda um fi
|
|
|
606
613
|
("Só quando") por atributo `eclinica_*` do contato. Nada disso é editável pelo MCP: só pelo painel.
|
|
607
614
|
Pra auditar o que foi/será disparado, use `lionchat_eclinica_reminder_history_list`.
|
|
608
615
|
|
|
616
|
+
**Um aviso por CONSULTA (desde 2026-09-17).** A regra antiga "um lembrete por dia" saiu: paciente com duas
|
|
617
|
+
consultas no mesmo dia — ou duas pessoas no mesmo celular (mãe e filho) — recebe um lembrete para CADA
|
|
618
|
+
consulta, cada um com o seu nome, horário, profissional e link. Eles não saem juntos: sai o da consulta
|
|
619
|
+
mais cedo e, ~10 minutos depois (na rodada seguinte), o da próxima. No histórico
|
|
620
|
+
(`lionchat_eclinica_reminder_history_list`) isso aparece assim: o que espera a vez fica `pending` com
|
|
621
|
+
`fire_at` no passado por alguns minutos (normal); `skip_reason = outra_consulta_no_mesmo_dia` só existe em
|
|
622
|
+
linhas ANTIGAS (até 17/09); e `fail_reason = fluxo_ainda_em_andamento_com_este_contato` significa que o
|
|
623
|
+
fluxo do aviso anterior ainda estava em andamento com aquele contato (típico de fluxo que aguarda o
|
|
624
|
+
paciente clicar num botão) — pode ser reenviado com `lionchat_eclinica_reminder_history_reprocess`.
|
|
625
|
+
O fluxo do lembrete recebe também `{{cliente_id}}` (código do paciente DAQUELA consulta na e-Clínica) e
|
|
626
|
+
`{{agendatipo}}`; na automação, `{{agendamento.cliente_id}}` e `{{agendamento.agendatipo}}`. Ao consultar a
|
|
627
|
+
agenda do paciente dentro do fluxo, use `{{cliente_id}}` do lembrete — a ficha do contato é uma por
|
|
628
|
+
TELEFONE e guarda só o último paciente. Quem quiser "só um lembrete por dia" monta no próprio fluxo
|
|
629
|
+
(condição num atributo da conversa com `{{data_consulta}}` + ação que grava o dia depois de enviar).
|
|
630
|
+
|
|
609
631
|
## Relatórios e Métricas
|
|
610
632
|
|
|
611
633
|
```
|
|
@@ -288,7 +288,7 @@ No editor visual esses destinos só aparecem quando a validação bate (computed
|
|
|
288
288
|
- `validation: 'options'` → `option_<valor>` para cada valor em `acceptedOptions` (ex: `option_1`, `option_2`, `option_sim`) + `timeout` + `retries_exhausted`
|
|
289
289
|
- `validation: 'varied_options'` → `option_<group_id>` para cada grupo em `optionGroups` (ex: `option_sim`, `option_nao`) + `timeout` + `retries_exhausted`
|
|
290
290
|
|
|
291
|
-
**`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.
|
|
291
|
+
**`timeout` vs `retries_exhausted` (DISTINTOS):** `timeout` = cliente ficou em silencio (estourou `waitTime`). `retries_exhausted` = cliente respondeu, mas errou a validacao mais que `maxRetries` vezes (`maxRetries` = quantas vezes a `invalidMessage` e enviada; a resposta errada seguinte esgota — com `maxRetries: 1` o cliente recebe o erro uma vez e sai no 2o erro). 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.
|
|
292
292
|
|
|
293
293
|
**Timeout dispara de verdade — e SEM fio ENCERRA (desde 20/08/2026):** `waitTime` + `waitUnit`
|
|
294
294
|
agendam o estouro. Com fio no handle `timeout`, o flow segue por ele. **Sem fio, a sessão é
|
|
@@ -385,6 +385,25 @@ só pra destravar, ela pode sair.
|
|
|
385
385
|
| `pagetrack_visited` / `pagetrack_event` | LionTrack |
|
|
386
386
|
| `sla_check` | status do SLA da conversa (usa `value` = código fixo; ver abaixo) |
|
|
387
387
|
|
|
388
|
+
**CAIXA DA CONVERSA e TIPO DE CAIXA (novo 17/09/2026):** duas condições da aba Conversas que perguntam
|
|
389
|
+
ONDE a conversa está. Nasceram para o **Fluxo de Ações** (que roda em qualquer caixa), mas valem em
|
|
390
|
+
qualquer tipo de flow. Não têm operador novo: só `equal` e `not_equal`, e o valor vai numa **LISTA**
|
|
391
|
+
(`values`) — com lista, `equal` significa "é ALGUMA destas" e `not_equal` "não é NENHUMA destas".
|
|
392
|
+
|
|
393
|
+
- **Caixa da conversa:** `{ "id": 1, "field": "{{inbox.id}}", "operator": "equal", "value": "", "values": ["342", "204"], "valueType": "inbox" }`
|
|
394
|
+
— cada item de `values` é o **id da caixa como STRING**.
|
|
395
|
+
- **Tipo de caixa:** `{ "id": 1, "field": "{{inbox.channel_type}}", "operator": "equal", "value": "", "values": ["Channel::Waha"], "valueType": "channel_type" }`
|
|
396
|
+
— cada item é o **nome técnico do canal**: `Channel::Waha` (WhatsApp QR Code), `Channel::Whatsapp`
|
|
397
|
+
(WhatsApp API Oficial), `Channel::WebWidget`, `Channel::Api`, `Channel::Email`,
|
|
398
|
+
`Channel::FacebookPage` (Facebook/Instagram), `Channel::TwilioSms`, `Channel::Sms`,
|
|
399
|
+
`Channel::Telegram`, `Channel::Line`.
|
|
400
|
+
|
|
401
|
+
O `valueType` é OBRIGATÓRIO nas duas: é ele que faz a tela abrir o seletor certo (lista de caixas /
|
|
402
|
+
lista de tipos). Sem ele a regra roda no motor e a tela não desenha campo nenhum para ela. Gravar o
|
|
403
|
+
valor em `value` em vez de `values` é a mesma família do defeito de 02/09 descrito abaixo: o motor
|
|
404
|
+
compara certo e a tela abre o seletor VAZIO. `{{inbox.name}}` existe como variável mas **não** é
|
|
405
|
+
condição: comparar por nome quebra quando o cliente renomeia a caixa.
|
|
406
|
+
|
|
388
407
|
> **ATENÇÃO — onde o VALOR vai (defeito real de 02/09/2026, conta 137):** no nó **Condição**, uma regra de atributo
|
|
389
408
|
> (`valueType: "attr_config"`) com operador `equal`, `not_equal`, `contains` ou `not_contains` guarda o valor em
|
|
390
409
|
> **`values: ["..."]` (lista)** e deixa `value: ""`. A TELA lê SÓ a lista: regra gravada com `value: "paid_ad"` e
|
|
@@ -1025,17 +1044,43 @@ de conexão e viram bola de neve visual. Ao gerar `position`:
|
|
|
1025
1044
|
|
|
1026
1045
|
---
|
|
1027
1046
|
|
|
1028
|
-
## 2-B.
|
|
1047
|
+
## 2-B. Três tipos de flow: `conversation`, `ai_tool` e `action`
|
|
1029
1048
|
|
|
1030
1049
|
O campo `flow_type` (definido na criação, IMUTÁVEL depois) decide a natureza do flow:
|
|
1031
1050
|
|
|
1032
|
-
| | `conversation` (default) | `ai_tool` |
|
|
1033
|
-
|
|
1034
|
-
| Como dispara | Por evento de inbox (trigger no node `start`) | Invocado pelo AI Agente (Captain) como ferramenta |
|
|
1035
|
-
| Inboxes | usa `inbox_ids` | **PROIBIDO** ter inboxes (validação barra) |
|
|
1036
|
-
| Campos extra | — | `tool_name` (snake_case, `[a-z][a-z0-9_]`, max 50) + `tool_description` (max 500) OBRIGATÓRIOS |
|
|
1037
|
-
| Retorno | manda mensagens | retorna dado estruturado ao LLM via node `end` |
|
|
1038
|
-
| Nodes permitidos | todos | `start`, `end`, `api`, `condition`, `set_variable`, `ai`, `note`, `randomizer`, `action`, `send_message` |
|
|
1051
|
+
| | `conversation` (default) | `ai_tool` | `action` (17/09/2026) |
|
|
1052
|
+
|---|---|---|---|
|
|
1053
|
+
| Como dispara | Por evento de inbox (trigger no node `start`) | Invocado pelo AI Agente (Captain) como ferramenta | Pelo MESMO trigger do `conversation`, mas em QUALQUER inbox |
|
|
1054
|
+
| Inboxes | usa `inbox_ids` | **PROIBIDO** ter inboxes (validação barra) | **PROIBIDO** ter inboxes (roda em todas) |
|
|
1055
|
+
| Campos extra | — | `tool_name` (snake_case, `[a-z][a-z0-9_]`, max 50) + `tool_description` (max 500) OBRIGATÓRIOS | — |
|
|
1056
|
+
| Retorno | manda mensagens | retorna dado estruturado ao LLM via node `end` | **não manda mensagem nenhuma** |
|
|
1057
|
+
| Nodes permitidos | todos | `start`, `end`, `api`, `condition`, `set_variable`, `ai`, `note`, `randomizer`, `action`, `send_message` | todos MENOS `send_message`, `wait_response`, `update_group` e `end` |
|
|
1058
|
+
|
|
1059
|
+
**`action` (na tela: "Fluxo de Ações")** é para regra que vale na empresa inteira e não depende da
|
|
1060
|
+
caixa: "conversa que receber a etiqueta urgente vai pra equipe de suporte", "card que entrar na
|
|
1061
|
+
etapa Fechado grava a data no contato". Antes exigia repetir o mesmo flow em cada inbox.
|
|
1062
|
+
|
|
1063
|
+
Criar: `flows_create` com `flow_type: 'action'`, SEM `inbox_ids` e SEM `conversation_mode`
|
|
1064
|
+
(o backend fixa `individual`; mandar `group` é ignorado). Aceita os MESMOS gatilhos do
|
|
1065
|
+
`conversation` no node `start` e usa o mesmo `flow_data`. Roda LADO A LADO com os flows de mensagem
|
|
1066
|
+
(não entra no aviso de conflito de gatilho) e vale também em conversa de grupo.
|
|
1067
|
+
|
|
1068
|
+
**NUNCA** pôr `send_message` / `wait_response` / `update_group` num flow `action` — a validação
|
|
1069
|
+
recusa o save inteiro com `contains node types not allowed in action flow`. Se o cliente precisa
|
|
1070
|
+
falar com a pessoa, o flow é `conversation`.
|
|
1071
|
+
|
|
1072
|
+
Três regras que andam com o tipo `action` (17/09/2026):
|
|
1073
|
+
- **`start_flow` (bloco Ações > Sistema)**: o flow de ações pode ser alvo a partir de QUALQUER flow,
|
|
1074
|
+
sem casar caixa. Já um flow `conversation` alvo que NÃO atenda a caixa da conversa é RECUSADO em
|
|
1075
|
+
runtime (passo com erro `inbox_mismatch` no histórico) — antes rodava no lugar errado em silêncio.
|
|
1076
|
+
- **Macro**: a ação `start_flow` da macro (`macros_*`) aceita **só** `flow_type: 'action'`.
|
|
1077
|
+
- **Condições**: `{{inbox.id}}` e `{{inbox.channel_type}}` (novo) dão "Caixa da conversa" e "Tipo de
|
|
1078
|
+
caixa" na aba Conversas — como o flow de ações roda em todas as caixas, é assim que ele pergunta
|
|
1079
|
+
onde está antes de agir. `channel_type` grava o valor técnico (`Channel::Waha` etc.).
|
|
1080
|
+
- **AINDA NÃO FUNCIONA**: disparar flow `action` por webhook de integração (gateways de pagamento,
|
|
1081
|
+
Webhook Universal, Meta Lead, e-Clínica) ou por gatilho de formulário. Esses caminhos criam a
|
|
1082
|
+
conversa usando a CAIXA do flow, e o flow de ações não tem caixa — ele é selecionado e descartado
|
|
1083
|
+
(`no_inbox_linked` no log). Não prometa isso ao cliente até a decisão de produto.
|
|
1039
1084
|
| Aviso de espera (10/09/2026) | — | enquanto a ferramenta roda, o cliente recebe "Só um momento, estou verificando isso pra você...". Cada ferramenta escolhe o seu no node `start`: `data.toolWaitMessageEnabled` (`false` desliga; AUSENTE = ligado — só um `false` de verdade desliga, `""` ou lixo mantém ligado) e `data.toolWaitMessageText` (texto próprio, até 1000 caracteres; vazio = frase padrão). Vive no `flow_data` e viaja no snapshot de versão; ferramenta já existente não muda de comportamento |
|
|
1040
1085
|
|
|
1041
1086
|
Se o cliente pediu "uma ferramenta que a IA usa pra consultar X / calcular Y", é `ai_tool`. Se pediu "quando chega mensagem, faça Z", é `conversation`. Na dúvida, `conversation`.
|
|
@@ -1055,10 +1100,11 @@ no fim de uma cadeia automação→flow→automação, suspeite desse limite —
|
|
|
1055
1100
|
|
|
1056
1101
|
Todo flow `conversation` tem um `conversation_mode`: `individual` (default — conversa 1-a-1) ou `group`
|
|
1057
1102
|
(grupo de WhatsApp). Definido na CRIAÇÃO e **IMUTÁVEL depois** (não dá pra converter um no outro; pra trocar,
|
|
1058
|
-
crie outro flow). Não confundir com `flow_type` — um flow `ai_tool` não tem `conversation_mode
|
|
1103
|
+
crie outro flow). Não confundir com `flow_type` — um flow `ai_tool` não tem `conversation_mode`, e no
|
|
1104
|
+
`action` ele é fixado em `individual` (o campo não se aplica: o flow de ações roda nos dois).
|
|
1059
1105
|
|
|
1060
|
-
Na tela o usuário
|
|
1061
|
-
|
|
1106
|
+
Na tela o usuário escolhe o TIPO (Conversa / IA Agente / Ações) e, só no tipo Conversa, o modo
|
|
1107
|
+
(Mensagens individuais / Grupos WhatsApp).
|
|
1062
1108
|
|
|
1063
1109
|
**A diferença entre individual e grupo é quais nodes/abas ficam disponíveis:**
|
|
1064
1110
|
|
|
@@ -722,3 +722,81 @@ sai. Confira `last_incoming_message_at` na conversa: vazio ou antigo = janela fe
|
|
|
722
722
|
Desde 02/09 a mensagem que chega ADOTA essa conversa (não abre outra). Se um fluxo/automação/IA
|
|
723
723
|
dependia do gatilho **"conversa criada"** para acordar nesse caso, ele não roda mais na adoção —
|
|
724
724
|
troque para **"Conversa reaberta"**.
|
|
725
|
+
|
|
726
|
+
## "A mensagem aparece como 'Mensagem de tipo não suportado'" — 17/09/2026
|
|
727
|
+
|
|
728
|
+
O que significa depende do canal.
|
|
729
|
+
|
|
730
|
+
**WhatsApp oficial (Cloud API).** A Meta entrega a mensagem com `type: unsupported` e o erro 131051,
|
|
731
|
+
e **não manda o conteúdo em caso nenhum** — nem texto, nem o vínculo com a mensagem original. O que
|
|
732
|
+
ela manda é o SUBTIPO (`unsupported.type`), e desde 17/09 o aviso na conversa diz o que era: "Convite
|
|
733
|
+
para entrar em um grupo", "Mensagem com botões", "Menu de opções", "Enquete", "Foto ou vídeo de
|
|
734
|
+
visualização única", "O contato apagou uma mensagem", "O contato editou uma mensagem". Quando a
|
|
735
|
+
própria Meta não sabe (`unknown`, a maioria dos casos) o texto continua sendo
|
|
736
|
+
"Mensagem de tipo não suportado.".
|
|
737
|
+
|
|
738
|
+
Consequência prática: nessa caixa **não existe API que recupere o conteúdo**. Se o cliente perguntar
|
|
739
|
+
o que a pessoa mandou, a resposta honesta é o tipo, não o conteúdo. Não prometa recuperar.
|
|
740
|
+
|
|
741
|
+
**WhatsApp QR Code.** Aqui o conteúdo chega inteiro e desde 17/09 aparece como mensagem normal:
|
|
742
|
+
convite de grupo (com nome do grupo e link), disparo de marketing de outra empresa (texto + botões,
|
|
743
|
+
cada um como `[Botão: X]`), menu em lista, enquete, pergunta de canal, cartão de cobrança, e a
|
|
744
|
+
RESPOSTA do cliente a um menu de botões — que antes sumia inteira. Se ainda aparecer o aviso curto
|
|
745
|
+
("Enquete", "Convite para entrar em um grupo") é porque aquele formato específico não tem leitor
|
|
746
|
+
ainda; o texto diz o tipo.
|
|
747
|
+
|
|
748
|
+
**Mensagens que continuam invisíveis, de propósito:** avisos internos do WhatsApp (chave de
|
|
749
|
+
criptografia de grupo, aviso de protocolo, cabeçalho de álbum). Não são mensagem de ninguém. O
|
|
750
|
+
cabeçalho de álbum some porque as fotos chegam logo em seguida como mensagens próprias — se o
|
|
751
|
+
cliente reclamar que "faltou uma mensagem antes das fotos", era isso.
|
|
752
|
+
|
|
753
|
+
## "O paciente tem duas consultas no dia e recebeu um lembrete só" (e-Clínica) — 17/09/2026
|
|
754
|
+
|
|
755
|
+
**Como é desde 17/09:** um lembrete por CONSULTA. Duas consultas no mesmo dia, ou duas pessoas no mesmo
|
|
756
|
+
celular (mãe e filho), recebem um lembrete para cada consulta — cada um com o nome do paciente, o
|
|
757
|
+
horário, o profissional e o link daquela consulta. A regra antiga ("um lembrete por dia", de 09/09)
|
|
758
|
+
saiu do sistema; linhas antigas do histórico com `skip_reason = outra_consulta_no_mesmo_dia` são dela.
|
|
759
|
+
|
|
760
|
+
**Eles não saem juntos.** Sai o da consulta mais cedo e, ~10 minutos depois, o da seguinte (três
|
|
761
|
+
consultas = três rodadas). Ao consultar `lionchat_eclinica_reminder_history_list`:
|
|
762
|
+
- `pending` com `fire_at` já no passado, há poucos minutos, e um irmão do mesmo contato/dia `fired` =
|
|
763
|
+
está esperando a vez. **Normal — não reprocessar, não reportar como erro.**
|
|
764
|
+
- `failed` com `fail_reason = fluxo_ainda_em_andamento_com_este_contato` = o fluxo do aviso anterior
|
|
765
|
+
ainda estava rodando com aquele contato. É o esperado quando o fluxo do lembrete **aguarda o paciente
|
|
766
|
+
clicar num botão**: o segundo aviso só consegue sair depois que ele responder o primeiro. Pode ser
|
|
767
|
+
reenviado com `lionchat_eclinica_reminder_history_reprocess` (se o paciente ainda não respondeu, falha
|
|
768
|
+
de novo — sem mensagem e sem custo).
|
|
769
|
+
- `failed` com `fail_reason = nao_disparou` continua sendo outra coisa; a causa mais comum é o contato
|
|
770
|
+
**sem telefone** (o cadastro do paciente na e-Clínica está sem celular, ou com número incompleto).
|
|
771
|
+
|
|
772
|
+
**O cliente quer só um lembrete por dia?** Não é mais regra do sistema: monta-se no próprio fluxo do
|
|
773
|
+
lembrete — condição comparando um atributo da conversa com `{{data_consulta}}` (se igual, encerra) e,
|
|
774
|
+
depois do envio, ação que grava `{{data_consulta}}` nesse atributo.
|
|
775
|
+
|
|
776
|
+
**Fluxo de lembrete que consulta a agenda do paciente:** use `{{cliente_id}}` (vem no próprio lembrete,
|
|
777
|
+
é o paciente DAQUELA consulta) e não `contact.custom_attribute.eclinica_cliente_id` — a ficha do
|
|
778
|
+
contato é uma por TELEFONE e guarda só o último paciente; com mãe e filho no mesmo celular o fluxo
|
|
779
|
+
olharia a agenda da pessoa errada e poderia concluir que a consulta foi desmarcada. Lembretes criados
|
|
780
|
+
antes de 17/09 podem não ter `{{cliente_id}}`: use a ficha só como reserva
|
|
781
|
+
(`{{ cliente_id | default: contact.custom_attribute.eclinica_cliente_id }}`).
|
|
782
|
+
|
|
783
|
+
---
|
|
784
|
+
|
|
785
|
+
## "Marquei Faltou (ou Compareceu) e a tarefa continua pendente" — 17/09/2026
|
|
786
|
+
|
|
787
|
+
**Não é defeito.** Presença (`attendance`) e situação (`status`) são campos separados de propósito: marcar
|
|
788
|
+
Faltou/Compareceu não conclui a tarefa. Concluir um compromisso de Booking encerra os lembretes e o
|
|
789
|
+
pós-atendimento dele e dispara o gatilho de fluxo "agendamento concluído" — inclusive para quem faltou.
|
|
790
|
+
|
|
791
|
+
- O que o painel mostra ao lado da tarefa é o campo **`selo`** (só leitura): `no_show`, `attended`,
|
|
792
|
+
`rescheduled`, `completed`, `snoozed`, `cancelled` ou `pending`. Use ele para descrever o compromisso.
|
|
793
|
+
- A tarefa marcada com presença continua nas pendências até alguém clicar em Concluir (ou a API mandar
|
|
794
|
+
concluir). Só conclua se o usuário pedir.
|
|
795
|
+
- Antes de 17/09 o painel mostrava "Pendente" (e "Atrasada" na ficha do contato) mesmo com Faltou marcado —
|
|
796
|
+
era só a etiqueta; o dado sempre esteve gravado certo.
|
|
797
|
+
|
|
798
|
+
## "Troquei o responsável de um agendamento e ele não mudou" — 17/09/2026
|
|
799
|
+
|
|
800
|
+
Compromisso nascido de Booking (`booking_id` presente) tem responsável fixo: o profissional do tipo de
|
|
801
|
+
evento. `assignee_ids` no update é ignorado (a resposta é 200 e o resto da edição vale). Para mudar quem
|
|
802
|
+
atende, edite o tipo de evento — ou cancele e marque de novo em outro Booking.
|
package/dist/tools.js
CHANGED
|
@@ -346,11 +346,11 @@ function registerListCategoriesTool(server, allEndpoints) {
|
|
|
346
346
|
// Helps LLMs build correct flow_data without hitting trial-and-error on
|
|
347
347
|
// node types, action keys, source handles, etc.
|
|
348
348
|
function registerFlowsSchemaReferenceTool(server) {
|
|
349
|
-
const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-09-
|
|
349
|
+
const reference = `LIONCHAT FLOW BUILDER — SCHEMA REFERENCE (atualizado 2026-09-17)
|
|
350
350
|
|
|
351
351
|
flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
352
352
|
|
|
353
|
-
═══
|
|
353
|
+
═══ TRES TIPOS DE FLOW (e o modo do conversation) ═══
|
|
354
354
|
- conversation (default): dispara por evento de inbox. Criar via lionchat_flows_create.
|
|
355
355
|
conversation_mode: 'individual' (1-a-1, default) ou 'group' (grupo WhatsApp). IMUTAVEL apos criar.
|
|
356
356
|
O node update_group (Gestao de Grupos, 17 operacoes) roda em fluxo de QUALQUER modo/canal desde que a
|
|
@@ -363,6 +363,19 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
|
363
363
|
send_message, note (SEM wait, wait_response, update_group). No action de ai_tool NAO use keys da
|
|
364
364
|
aba Sistema (send_webhook/start_flow/send_conversion). Vincular ao assistente: POST /flow_tools/{id}/assistants.
|
|
365
365
|
Testar: POST /flow_tools/{id}/run.
|
|
366
|
+
- action (Fluxo de Acoes, 17/09/2026): NAO pertence a caixa nenhuma e roda em QUALQUER conversa de
|
|
367
|
+
QUALQUER caixa — inclusive grupo. So executa acoes: NAO pode ter send_message, wait_response,
|
|
368
|
+
update_group nem end (a validacao recusa o save inteiro com "contains node types not allowed in
|
|
369
|
+
action flow"). Nodes permitidos: start, action, condition, wait, randomizer, api, ai,
|
|
370
|
+
set_variable, note. Criar via lionchat_flows_create com flow_type:'action', SEM inbox_ids e SEM
|
|
371
|
+
conversation_mode (o backend fixa 'individual'). Aceita os MESMOS gatilhos do conversation e roda
|
|
372
|
+
LADO A LADO com ele (nao entra no aviso de conflito de gatilho). Use quando a regra vale pra
|
|
373
|
+
empresa toda e nao depende da caixa (ex.: etiqueta 'urgente' -> atribui equipe de suporte).
|
|
374
|
+
Se precisa FALAR com a pessoa, o tipo e conversation.
|
|
375
|
+
AINDA NAO FUNCIONA: disparar flow 'action' por webhook de integracao (gateways de pagamento,
|
|
376
|
+
Webhook Universal, Meta Lead, e-Clinica) nem por gatilho de FORMULARIO — esses caminhos criam a
|
|
377
|
+
conversa usando a CAIXA do flow, que este tipo nao tem, e ele e descartado (no_inbox_linked).
|
|
378
|
+
Nao prometa isso ao cliente.
|
|
366
379
|
Aviso de espera (10/09/2026): enquanto a ferramenta roda, o cliente recebe "So um momento, estou
|
|
367
380
|
verificando isso pra voce...". Cada ferramenta escolhe o SEU no node start: data.toolWaitMessageEnabled
|
|
368
381
|
(false desliga; AUSENTE = ligado — so um false de verdade desliga, "" ou lixo mantem ligado) e
|
|
@@ -629,6 +642,8 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
|
629
642
|
vazio ('') = 60 (o que a tela exibe).
|
|
630
643
|
Respostas invalidas alem de maxRetries -> handle "retries_exhausted" (distinto do timeout de silencio;
|
|
631
644
|
se nao houver edge nele, cai no "timeout"; sem nenhum dos dois, encerra). maxRetries vazio/0 = 3.
|
|
645
|
+
maxRetries = QUANTAS VEZES o invalidMessage e enviado (desde 16/09/2026): com 1, a 1a resposta errada
|
|
646
|
+
recebe a mensagem e a 2a segue "retries_exhausted"; com 3, recebe 3 vezes e a 4a esgota.
|
|
632
647
|
Handles validation='options': "option_{val}" por opcao + "timeout"
|
|
633
648
|
Handles validation='varied_options': "option_{group_id}" por grupo (optionGroups) + "timeout"
|
|
634
649
|
Handles outros: "success" + "timeout"
|
|
@@ -696,6 +711,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
|
696
711
|
IANA ex. America/Sao_Paulo; outside_business_hours HERDA days/start_hour/end_hour/timezone da
|
|
697
712
|
business_hours ANTERIOR no array — pode deixar ausentes que o backend preenche),
|
|
698
713
|
can_reply/can_reply_closed, conversation_has_agent/no_agent,
|
|
714
|
+
CAIXA DA CONVERSA [17/09/2026]: field '{{inbox.id}}' com operator equal/not_equal e values
|
|
715
|
+
[id da caixa] — a condicao "Caixa da conversa" da tela. TIPO DE CAIXA: field
|
|
716
|
+
'{{inbox.channel_type}}' com values ['Channel::Waha'|'Channel::Whatsapp'|'Channel::Api'|
|
|
717
|
+
'Channel::Telegram'|'Channel::Email'|'Channel::WebWidget'|...] (valor TECNICO; a tela mostra
|
|
718
|
+
o rotulo). As duas nasceram pro Fluxo de Acoes, que roda em todas as caixas e precisa
|
|
719
|
+
perguntar onde esta antes de agir — mas valem em qualquer tipo de flow. valueType e
|
|
720
|
+
OBRIGATORIO: 'inbox' na primeira e 'channel_type' na segunda — e ele que faz a tela abrir o
|
|
721
|
+
seletor certo; sem ele a regra roda no motor e a tela nao desenha campo nenhum pra ela.
|
|
699
722
|
conversation_no_team (NOVO 2026-08-15: conversa SEM equipe atribuida — e o preset "Sem equipe"
|
|
700
723
|
da tela; operador dedicado, sem value), conversation_has_ai_agent/conversation_no_ai_agent
|
|
701
724
|
(IA ativa/inativa na conversa; not_ai_agent = sinonimo de no_ai_agent),
|
|
@@ -797,9 +820,14 @@ flow_data tem o formato Vue Flow: { nodes: [...], edges: [...] }.
|
|
|
797
820
|
evento, sem laco). 'cancelled' cancela o AGENDAMENTO (desarma lembrete, mata o link de gerenciar).
|
|
798
821
|
Origem gravada = 'fluxo', ator = o proprio flow. Sem 'remarcado'/'adiado'/'nao confirmado': o bloco NAO
|
|
799
822
|
mexe em data.
|
|
800
|
-
Sistema (SO flow conversation): send_webhook({url,headers?,body?}), start_flow({flow_id}
|
|
823
|
+
Sistema (SO flow conversation e flow action): send_webhook({url,headers?,body?}), start_flow({flow_id}
|
|
801
824
|
— flow_id tem que ser de OUTRO flow: apontar pro proprio flow e aceito no save mas IGNORADO
|
|
802
|
-
EM SILENCIO na execucao, e o fluxo para ali [2026-08-18]
|
|
825
|
+
EM SILENCIO na execucao, e o fluxo para ali [2026-08-18].
|
|
826
|
+
CAIXA TEM QUE BATER [17/09/2026]: se o flow-alvo e do tipo conversation e NAO esta ligado a
|
|
827
|
+
caixa da conversa, a execucao e RECUSADA e o passo fica com ERRO no historico
|
|
828
|
+
(inbox_mismatch) — antes rodava no lugar errado em silencio. Flow-alvo do tipo 'action' e
|
|
829
|
+
SEMPRE aceito, de qualquer origem, porque nao pertence a caixa nenhuma.
|
|
830
|
+
Flow de IA (ai_tool) nunca pode ser alvo), deactivate_flow({}),
|
|
803
831
|
send_conversion({destinations:['meta'|'ga4'|'google_ads'], event_names:{meta?,google_ads?,ga4?},
|
|
804
832
|
messaging_event_names:{meta?}, event_name, value?}) — NOVO 01/09, evento POR DESTINO desde 02/09,
|
|
805
833
|
evento de ANUNCIO DE WHATSAPP desde 10/09: manda o evento de conversao pro
|
|
@@ -1005,6 +1033,8 @@ conversation.id — JA E o numero que aparece no app (o motor devolve o display_
|
|
|
1005
1033
|
conversation.display_id e so um APELIDO, aceito desde 29/07, que devolve o mesmo numero — antes
|
|
1006
1034
|
disso resolvia VAZIO, e todo link de conversa montado por flow saiu quebrado.
|
|
1007
1035
|
conversation.status, conversation.team_id, conversation.custom_attribute.X
|
|
1036
|
+
inbox.id, inbox.name, inbox.channel_type (o TIPO do canal: Channel::Waha, Channel::Whatsapp,
|
|
1037
|
+
Channel::Api...; NOVO 17/09/2026 — usado pela condicao "Tipo de caixa")
|
|
1008
1038
|
conversation.label (SINGULAR — etiquetas da conversa em texto separado por virgula).
|
|
1009
1039
|
{{conversation.labels}} NAO EXISTE: some do texto sem erro nenhum.
|
|
1010
1040
|
agent.* = o RESPONSAVEL da conversa: agent.name, agent.first_name, agent.last_name,
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/endpoints.json
CHANGED
|
@@ -7862,7 +7862,7 @@
|
|
|
7862
7862
|
"method": "POST",
|
|
7863
7863
|
"path": "/api/v1/accounts/{account_id}/macros",
|
|
7864
7864
|
"title": "Criar Macro",
|
|
7865
|
-
"description": "Cria uma nova macro com ações. Obrigatórios: name, actions (visibility: personal ou global). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422. CARDÁPIO (
|
|
7865
|
+
"description": "Cria uma nova macro com ações. Obrigatórios: name, actions (visibility: personal ou global). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422. CARDÁPIO (17/09/2026, 41 ações — os action_params seguem os MESMOS formatos das automações, ver conversation-flows.md 'Acoes de automacao'): send_message, add_private_note, send_canned_response ([id] — na MACRO a mensagem sai assinada pelo EXECUTOR; na automação sai como robô), send_attachment, send_email_transcript, send_email_to_team, send_webhook_event, add_label/remove_label (etiqueta da CONVERSA), add_contact_label/remove_contact_label ([titulos] — etiqueta do CONTATO), assign_agent, assign_team, remove_assigned_team, distribute_agents ([agent_ids] — rodízio de verdade, nunca sorteio), change_status, change_priority, open_conversation/pending_conversation/resolve_conversation, snooze_conversation ([] = até a próxima resposta, ou ['until_tomorrow'] etc.), mute_conversation, mark_unread ([]), add_sla ([sla_policy_id]), assign_captain_assistant ([id] ou [{assistant_id, proactive}]), deactivate_captain ([]), send_signature_document, update_contact_attribute/update_conversation_attribute ([{attribute_key, value}] — chave PROTEGIDA é recusada na execução e fica só no log: prefixos waha_whatsapp_/whatsapp_/origin_/ctwa_/meta_lead_/lt_ e atributos de sistema como utm_*/gclid), update_card_attribute ([{funnel_id, attribute_key, value}]), add_card_checklist ([{funnel_id, checklist_template_ids}]), add_card_offer ([{funnel_id, offer_ids}]), e as 7 de Kanban: create_kanban_item, move_kanban_item_to_stage, assign_agent_to_kanban_item, add_note_to_kanban_item, start_kanban_item_timer, stop_kanban_item_timer, set_kanban_item_status (todas exigem card já existente no funil informado, exceto create). send_conversion ([{destinations, event_names, value}] — Meta CAPI/GA4/Google Ads com trigger_type 'macro') só pode ser SALVO por administrador ou cargo com marketing_integrations_manage: para os demais, 422 com o motivo; EXECUTAR segue liberado; teto de 50 conversões por execução (o excedente é pulado com log e as outras ações rodam). Fora do cardápio: send_whatsapp_template. start_flow ([flow_id] — dispara um FLOW DE ACOES (flow_type 'action') na conversa; 17/09/2026). SO flow de acoes entra aqui: a macro roda em qualquer conversa e nao filtra caixa, entao um flow de MENSAGEM apontado aqui rodaria numa caixa que nao e dele. Flow inexistente, desligado ou de outro tipo e ignorado em silencio.",
|
|
7866
7866
|
"category": "Macros",
|
|
7867
7867
|
"params": [
|
|
7868
7868
|
{
|
|
@@ -7884,7 +7884,7 @@
|
|
|
7884
7884
|
"type": "array",
|
|
7885
7885
|
"location": "body",
|
|
7886
7886
|
"required": true,
|
|
7887
|
-
"description": "Array de {action_name, action_params[]} —
|
|
7887
|
+
"description": "Array de {action_name, action_params[]} — 41 nomes aceitos, listados na descrição da tool; formatos iguais aos das automações"
|
|
7888
7888
|
}
|
|
7889
7889
|
],
|
|
7890
7890
|
"returns": "macro criado (com novo ID)",
|
|
@@ -7924,7 +7924,7 @@
|
|
|
7924
7924
|
"method": "PATCH",
|
|
7925
7925
|
"path": "/api/v1/accounts/{account_id}/macros/{id}",
|
|
7926
7926
|
"title": "Atualizar Macro",
|
|
7927
|
-
"description": "Atualiza macro. PATCH parcial: só campos enviados são alterados (name, actions, visibility). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado retorna 422. CARDÁPIO (
|
|
7927
|
+
"description": "Atualiza macro. PATCH parcial: só campos enviados são alterados (name, actions, visibility). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado retorna 422. CARDÁPIO (17/09/2026, 41 ações — os action_params seguem os MESMOS formatos das automações, ver conversation-flows.md 'Acoes de automacao'): send_message, add_private_note, send_canned_response ([id] — na MACRO a mensagem sai assinada pelo EXECUTOR; na automação sai como robô), send_attachment, send_email_transcript, send_email_to_team, send_webhook_event, add_label/remove_label (etiqueta da CONVERSA), add_contact_label/remove_contact_label ([titulos] — etiqueta do CONTATO), assign_agent, assign_team, remove_assigned_team, distribute_agents ([agent_ids] — rodízio de verdade, nunca sorteio), change_status, change_priority, open_conversation/pending_conversation/resolve_conversation, snooze_conversation ([] = até a próxima resposta, ou ['until_tomorrow'] etc.), mute_conversation, mark_unread ([]), add_sla ([sla_policy_id]), assign_captain_assistant ([id] ou [{assistant_id, proactive}]), deactivate_captain ([]), send_signature_document, update_contact_attribute/update_conversation_attribute ([{attribute_key, value}] — chave PROTEGIDA é recusada na execução e fica só no log: prefixos waha_whatsapp_/whatsapp_/origin_/ctwa_/meta_lead_/lt_ e atributos de sistema como utm_*/gclid), update_card_attribute ([{funnel_id, attribute_key, value}]), add_card_checklist ([{funnel_id, checklist_template_ids}]), add_card_offer ([{funnel_id, offer_ids}]), e as 7 de Kanban: create_kanban_item, move_kanban_item_to_stage, assign_agent_to_kanban_item, add_note_to_kanban_item, start_kanban_item_timer, stop_kanban_item_timer, set_kanban_item_status (todas exigem card já existente no funil informado, exceto create). send_conversion ([{destinations, event_names, value}] — Meta CAPI/GA4/Google Ads com trigger_type 'macro') só pode ser SALVO por administrador ou cargo com marketing_integrations_manage: para os demais, 422 com o motivo; EXECUTAR segue liberado; teto de 50 conversões por execução (o excedente é pulado com log e as outras ações rodam). Fora do cardápio: send_whatsapp_template. start_flow ([flow_id] — dispara um FLOW DE ACOES (flow_type 'action') na conversa; 17/09/2026). SO flow de acoes entra aqui: a macro roda em qualquer conversa e nao filtra caixa, entao um flow de MENSAGEM apontado aqui rodaria numa caixa que nao e dele. Flow inexistente, desligado ou de outro tipo e ignorado em silencio.",
|
|
7928
7928
|
"category": "Macros",
|
|
7929
7929
|
"params": [
|
|
7930
7930
|
{
|
|
@@ -7946,7 +7946,7 @@
|
|
|
7946
7946
|
"type": "array",
|
|
7947
7947
|
"location": "body",
|
|
7948
7948
|
"required": false,
|
|
7949
|
-
"description": "Array de {action_name, action_params[]} —
|
|
7949
|
+
"description": "Array de {action_name, action_params[]} — 41 nomes aceitos, listados na descrição da tool; formatos iguais aos das automações"
|
|
7950
7950
|
},
|
|
7951
7951
|
{
|
|
7952
7952
|
"name": "visibility",
|
|
@@ -8289,7 +8289,7 @@
|
|
|
8289
8289
|
"method": "GET",
|
|
8290
8290
|
"path": "/api/v1/accounts/{account_id}/account_tasks",
|
|
8291
8291
|
"title": "Listar Tarefas",
|
|
8292
|
-
"description": "Lista tarefas com filtros avançados. Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Filtros disponíveis: page, per_page, task_type, status, user_id. Retorna meta (contadores) + payload (array de tarefa/agenda). Cada tarefa traz `tratamento` {id, sessao, total, titulo} quando e sessao de um tratamento em sessoes (15/09); nulo em compromisso comum.",
|
|
8292
|
+
"description": "Lista tarefas com filtros avançados. Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Filtros disponíveis: page, per_page, task_type, status, user_id. Retorna meta (contadores) + payload (array de tarefa/agenda). Cada tarefa traz `tratamento` {id, sessao, total, titulo} quando e sessao de um tratamento em sessoes (15/09); nulo em compromisso comum. **`selo` (17/09):** cada tarefa traz o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Junta `status`, `attendance` e remarcacao (pelo painel ou pelo cliente no link). Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
|
|
8293
8293
|
"category": "Agenda / Tarefas",
|
|
8294
8294
|
"params": [
|
|
8295
8295
|
{
|
|
@@ -8560,7 +8560,7 @@
|
|
|
8560
8560
|
"method": "GET",
|
|
8561
8561
|
"path": "/api/v1/accounts/{account_id}/account_tasks/{id}",
|
|
8562
8562
|
"title": "Detalhe da Tarefa",
|
|
8563
|
-
"description": "Retorna detalhes de uma tarefa. Retorna detalhes completos de UM tarefa/agenda específico pelo ID. Inclui campos relacionais quando aplicável. Cada tarefa traz `tratamento` {id, sessao, total, titulo} quando e sessao de um tratamento em sessoes (15/09); nulo em compromisso comum.",
|
|
8563
|
+
"description": "Retorna detalhes de uma tarefa. Retorna detalhes completos de UM tarefa/agenda específico pelo ID. Inclui campos relacionais quando aplicável. Cada tarefa traz `tratamento` {id, sessao, total, titulo} quando e sessao de um tratamento em sessoes (15/09); nulo em compromisso comum. **`selo` (17/09):** cada tarefa traz o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Junta `status`, `attendance` e remarcacao (pelo painel ou pelo cliente no link). Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
|
|
8564
8564
|
"category": "Agenda / Tarefas",
|
|
8565
8565
|
"params": [
|
|
8566
8566
|
{
|
|
@@ -8584,7 +8584,7 @@
|
|
|
8584
8584
|
"method": "PATCH",
|
|
8585
8585
|
"path": "/api/v1/accounts/{account_id}/account_tasks/{id}",
|
|
8586
8586
|
"title": "Atualizar Tarefa",
|
|
8587
|
-
"description": "Atualiza uma tarefa. Campos alterados em video_call/meeting disparam sync com Google Calendar. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, description, task_type, priority, scheduled_at, duration_minutes. **Tratamento em sessoes (15/09):** com tipo `sessions_enabled`, o agendamento pelo painel/API nasce como sessao do tratamento do contato (proxima a marcar; cheio = sessao extra ate 60; concluido = ciclo novo) e a tarefa devolve `tratamento` {id, sessao, total, titulo} (nulo em compromisso comum). `treatment.*` cria o plano; `agenda_treatment_id` + `treatment_session_number` marcam uma sessao pedida.",
|
|
8587
|
+
"description": "Atualiza uma tarefa. Campos alterados em video_call/meeting disparam sync com Google Calendar. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, description, task_type, priority, scheduled_at, duration_minutes. **Tratamento em sessoes (15/09):** com tipo `sessions_enabled`, o agendamento pelo painel/API nasce como sessao do tratamento do contato (proxima a marcar; cheio = sessao extra ate 60; concluido = ciclo novo) e a tarefa devolve `tratamento` {id, sessao, total, titulo} (nulo em compromisso comum). `treatment.*` cria o plano; `agenda_treatment_id` + `treatment_session_number` marcam uma sessao pedida. **Compromisso de Booking (17/09):** tarefa com `booking_id` tem responsavel FIXO (o profissional do tipo de evento) — `assignee_ids` e IGNORADO (200, o resto da edicao vale). Para mudar quem atende, edite o tipo de evento. **Presenca nao conclui:** mandar `attendance` NAO muda `status`; nao conclua a tarefa so porque a presenca foi marcada (concluir compromisso de Booking encerra lembretes/pos-atendimento e dispara o gatilho de fluxo 'agendamento concluido'). A resposta traz `selo` com o rotulo resultante.",
|
|
8588
8588
|
"category": "Agenda / Tarefas",
|
|
8589
8589
|
"params": [
|
|
8590
8590
|
{
|
|
@@ -8690,7 +8690,7 @@
|
|
|
8690
8690
|
"type": "array",
|
|
8691
8691
|
"location": "body",
|
|
8692
8692
|
"required": false,
|
|
8693
|
-
"description": "IDs dos responsáveis"
|
|
8693
|
+
"description": "IDs dos responsáveis. IGNORADO em compromisso nascido de Booking (`booking_id` presente): o responsavel e o profissional do tipo de evento"
|
|
8694
8694
|
},
|
|
8695
8695
|
{
|
|
8696
8696
|
"name": "guest_emails",
|
|
@@ -8886,7 +8886,7 @@
|
|
|
8886
8886
|
"method": "PATCH",
|
|
8887
8887
|
"path": "/api/v1/accounts/{account_id}/account_tasks/{id}/update_future",
|
|
8888
8888
|
"title": "Atualizar Futuras",
|
|
8889
|
-
"description": "Atualiza esta e todas as futuras instâncias de tarefa recorrente. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, scheduled_at.",
|
|
8889
|
+
"description": "Atualiza esta e todas as futuras instâncias de tarefa recorrente. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, scheduled_at. **Compromisso de Booking (17/09):** tarefa com `booking_id` tem responsavel FIXO (o profissional do tipo de evento) — `assignee_ids` e IGNORADO (200, o resto da edicao vale). Para mudar quem atende, edite o tipo de evento. **Presenca nao conclui:** mandar `attendance` NAO muda `status`; nao conclua a tarefa so porque a presenca foi marcada (concluir compromisso de Booking encerra lembretes/pos-atendimento e dispara o gatilho de fluxo 'agendamento concluido'). A resposta traz `selo` com o rotulo resultante.",
|
|
8890
8890
|
"category": "Agenda / Tarefas",
|
|
8891
8891
|
"params": [
|
|
8892
8892
|
{
|
|
@@ -8966,7 +8966,7 @@
|
|
|
8966
8966
|
"method": "GET",
|
|
8967
8967
|
"path": "/api/v1/accounts/{account_id}/account_tasks/my_day",
|
|
8968
8968
|
"title": "Meu Dia",
|
|
8969
|
-
"description": "Retorna tarefas agrupadas: atrasadas, hoje, amanhã, próximos 7 dias. Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de tarefa/agenda).",
|
|
8969
|
+
"description": "Retorna tarefas agrupadas: atrasadas, hoje, amanhã, próximos 7 dias. Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de tarefa/agenda). **`selo` (17/09):** cada tarefa traz o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Junta `status`, `attendance` e remarcacao (pelo painel ou pelo cliente no link). Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
|
|
8970
8970
|
"category": "Agenda / Tarefas",
|
|
8971
8971
|
"params": [
|
|
8972
8972
|
{
|
|
@@ -9020,7 +9020,7 @@
|
|
|
9020
9020
|
"method": "GET",
|
|
9021
9021
|
"path": "/api/v1/accounts/{account_id}/kanban_items/{id}/tasks",
|
|
9022
9022
|
"title": "Tarefas do Card",
|
|
9023
|
-
"description": "Lista tarefas de todas as conversas vinculadas ao card (primária + linked). Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Filtros disponíveis: scope, page. Retorna meta (contadores) + payload (array de tarefa/agenda).",
|
|
9023
|
+
"description": "Lista tarefas de todas as conversas vinculadas ao card (primária + linked). Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Filtros disponíveis: scope, page. Retorna meta (contadores) + payload (array de tarefa/agenda). **`selo` (17/09):** cada tarefa traz o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Junta `status`, `attendance` e remarcacao (pelo painel ou pelo cliente no link). Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
|
|
9024
9024
|
"category": "Agenda / Tarefas",
|
|
9025
9025
|
"params": [
|
|
9026
9026
|
{
|
|
@@ -9062,7 +9062,7 @@
|
|
|
9062
9062
|
"method": "GET",
|
|
9063
9063
|
"path": "/api/v1/accounts/{account_id}/kanban_items/{id}/next_task",
|
|
9064
9064
|
"title": "Próxima Tarefa do Card",
|
|
9065
|
-
"description": "Retorna a PROXIMA tarefa pendente ou adiada do card (a de menor scheduled_at), considerando a conversa principal e as vinculadas. Devolve UM OBJETO de tarefa — nao ha meta/payload nem paginacao — e `{}` (objeto vazio) quando nao ha nenhuma. Nao procure um array: procurar array aqui faz voce responder \"esse card nao tem proxima tarefa\" quando tem. ATENCAO: esta rota NAO filtra por privacidade de tarefa — pode devolver tarefa de OUTRO atendente, ao contrario do campo `next_task` que vem dentro do proprio card (esse so mostra tarefa de quem esta consultando).",
|
|
9065
|
+
"description": "Retorna a PROXIMA tarefa pendente ou adiada do card (a de menor scheduled_at), considerando a conversa principal e as vinculadas. Devolve UM OBJETO de tarefa — nao ha meta/payload nem paginacao — e `{}` (objeto vazio) quando nao ha nenhuma. Nao procure um array: procurar array aqui faz voce responder \"esse card nao tem proxima tarefa\" quando tem. ATENCAO: esta rota NAO filtra por privacidade de tarefa — pode devolver tarefa de OUTRO atendente, ao contrario do campo `next_task` que vem dentro do proprio card (esse so mostra tarefa de quem esta consultando). **`selo` (17/09):** cada tarefa traz o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Junta `status`, `attendance` e remarcacao (pelo painel ou pelo cliente no link). Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
|
|
9066
9066
|
"category": "Agenda / Tarefas",
|
|
9067
9067
|
"params": [
|
|
9068
9068
|
{
|
|
@@ -9730,7 +9730,7 @@
|
|
|
9730
9730
|
"method": "POST",
|
|
9731
9731
|
"path": "/api/v1/accounts/{account_id}/flows",
|
|
9732
9732
|
"title": "Criar Flow",
|
|
9733
|
-
"description": "Cria um flow (FlowBuilder) na conta. Requer Admin. flow_data segue formato Vue Flow {nodes:[], edges:[]}. NODE SCHEMA — start: {label}. send_message: {label, messageItems:[{id, type:'text', content}]} handles: success/no_response/error. wait_response: {label, waitTime, waitUnit:'minutes'|'seconds', validation:'any'|'options'|'regex', acceptedOptions:['1','2'] (se options), regexPattern (se regex), invalidMessage, maxRetries:3, saveTo:'variable'|'contact_name'|'contact_email'|'contact_phone'|'contact_attr'|'conversation_attr'|'', saveVariable, saveAttrKey} — quando validation='options' os handles ficam 'option_{val}' + 'timeout'; senão 'success' + 'timeout' — NUNCA precisa de condition node depois. condition: {label, conditions:[{id, label, field, operator, value}]} handles = 'cond_0','cond_1',... (INDICE no array, NAO o id) + 'default'. action: {label, items:[{key, config:{...}}]} keys comuns assign_team({team_id}), assign_agent({agent_id}), add_label({labels:['slug',...]}), remove_label({labels}), change_status({status}), change_priority({priority}), mute_conversation({}), add_private_note({content}), create_kanban_item({funnel_id, funnel_stage,...}), move_kanban_stage({funnel_id, funnel_stage}), deactivate_flow({}), assign_captain({assistant_id}). api: {label, method, url, headers:[{key,value}], body, apiResponseVar}. set_variable: {label, variables:[{name, value}]}. wait: {label, waitTime, waitUnit}. EDGE SCHEMA: {id, source, target, sourceHandle (opcional, OBRIGATORIO casar com handle exposto pelo node source), type:'deletable', animated:true}. ERROS COMUNS QUE DEVEM SER EVITADOS: (1) action usa items[].config NAO items[].params; (2) send_message usa messageItems NAO items; (3) wait_response com validation='options' NAO precisa de condition node — use sourceHandle='option_X' diretamente; (4) sourceHandle inventado tipo 'c1','c2' nao funciona — sempre usar o handle real; (5) inbox_ids precisa vir aninhado em {flow:{inbox_ids:[]}} no PUT bruto, mas no MCP basta inbox_ids no nivel raiz. Cria novo flow. Obrigatórios: name, channel_type. Valida unicidade quando aplicável. Retorna o flow criado com ID atribuído. POSITIONING (CRITICO): cada node DEVE ter position:{x,y}. Sem isso, todos empilham no canvas no (0,0). Regra basica de layout: start em {x:50,y:300}, espaco horizontal +320 entre nodes sequenciais, ramificacoes em +/-150 vertical. ANTES DE GERAR JSON consulte o resource lionchat://docs/flowbuilder-design-guide (schema completo de cada tipo de node, handles expostos, erros comuns, checklist) e lionchat://docs/flowbuilder-patterns (10 templates prontos pra adaptar). BRAINSTORMING: se faltou info critica (canal, gatilho, conteudo), use o prompt create_flow_brainstorm como banco de perguntas sugeridas — pergunte SO o que falta, sem checklist forcado. APOS GERAR: rode o checklist da secao 6 do design guide antes de submeter (1 node start, todo node com id unico + position + data, todo edge com sourceHandle valido). NUNCA invente sourceHandle (no condition use cond_0/cond_1/default, no wait_response options use option_X, no AI intent use intent_<opcao>). IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create. conversation_mode: 'individual' (default) | 'group'. Sticky note (type 'note'): data usa title+body+color(yellow|teal|blue|violet|pink|orange|slate)+width+height — NUNCA 'content'. ORGANIZAÇÃO: preencha tags ao criar (reutilizando as tags já existentes nos flows da conta — veja flows_list) pra manter a lista organizada. STICKY NOTE: o texto da nota (type note) vai em data.title + data.body — content/label/text deixam a nota EM BRANCO na tela; nunca crie nota sem body. LAYOUT: espace os nodes (colunas a >=320px no x, ramos a >=180px no y; notas AO LADO/ACIMA do trecho, nunca sobre nodes ou linhas). REGRAS 18/08: acao start_flow com flow_id do PROPRIO flow e aceita no save mas IGNORADA EM SILENCIO na execucao (o fluxo para ali) — aponte sempre pra OUTRO flow. Condicoes: preencha operator E field juntos (tabela dos pares no resource flowbuilder-patterns), senao a regra roda certa e aparece errada na tela do cliente. NOVIDADES 01/09/2026 no schema (lionchat_flows_schema_reference): acao send_conversion (Meta/Google Ads/GA4 de dentro do fluxo) e condicao por origem/campanha (attr_config de conversa com origin_kind=paid_ad etc.). NOVIDADES 02/09/2026: (1) send_conversion ganhou event_names — UM evento por destino ({meta, google_ads, ga4}); event_name virou reserva (grave os dois); Google Ads so aceita nome do conversion_action_map. (2) preset 'Origem do lead' (attrScope 'lead_origin', attr_key origin_platform; valores: plataforma ou 'custom:<slug>'). (3) REGRA DE VALOR na condicao de atributo: equal/not_equal/contains/not_contains gravam em values:[...] (LISTA) com value:'' — value solo abre VAZIO na tela do cliente. Ver lionchat_flows_schema_reference.",
|
|
9733
|
+
"description": "Cria um flow (FlowBuilder) na conta. Requer Admin. flow_data segue formato Vue Flow {nodes:[], edges:[]}. NODE SCHEMA — start: {label}. send_message: {label, messageItems:[{id, type:'text', content}]} handles: success/no_response/error. wait_response: {label, waitTime, waitUnit:'minutes'|'seconds', validation:'any'|'options'|'regex', acceptedOptions:['1','2'] (se options), regexPattern (se regex), invalidMessage, maxRetries:3, saveTo:'variable'|'contact_name'|'contact_email'|'contact_phone'|'contact_attr'|'conversation_attr'|'', saveVariable, saveAttrKey} — quando validation='options' os handles ficam 'option_{val}' + 'timeout'; senão 'success' + 'timeout' — NUNCA precisa de condition node depois. condition: {label, conditions:[{id, label, field, operator, value}]} handles = 'cond_0','cond_1',... (INDICE no array, NAO o id) + 'default'. action: {label, items:[{key, config:{...}}]} keys comuns assign_team({team_id}), assign_agent({agent_id}), add_label({labels:['slug',...]}), remove_label({labels}), change_status({status}), change_priority({priority}), mute_conversation({}), add_private_note({content}), create_kanban_item({funnel_id, funnel_stage,...}), move_kanban_stage({funnel_id, funnel_stage}), deactivate_flow({}), assign_captain({assistant_id}). api: {label, method, url, headers:[{key,value}], body, apiResponseVar}. set_variable: {label, variables:[{name, value}]}. wait: {label, waitTime, waitUnit}. EDGE SCHEMA: {id, source, target, sourceHandle (opcional, OBRIGATORIO casar com handle exposto pelo node source), type:'deletable', animated:true}. ERROS COMUNS QUE DEVEM SER EVITADOS: (1) action usa items[].config NAO items[].params; (2) send_message usa messageItems NAO items; (3) wait_response com validation='options' NAO precisa de condition node — use sourceHandle='option_X' diretamente; (4) sourceHandle inventado tipo 'c1','c2' nao funciona — sempre usar o handle real; (5) inbox_ids precisa vir aninhado em {flow:{inbox_ids:[]}} no PUT bruto, mas no MCP basta inbox_ids no nivel raiz. Cria novo flow. Obrigatórios: name, channel_type. Valida unicidade quando aplicável. Retorna o flow criado com ID atribuído. POSITIONING (CRITICO): cada node DEVE ter position:{x,y}. Sem isso, todos empilham no canvas no (0,0). Regra basica de layout: start em {x:50,y:300}, espaco horizontal +320 entre nodes sequenciais, ramificacoes em +/-150 vertical. ANTES DE GERAR JSON consulte o resource lionchat://docs/flowbuilder-design-guide (schema completo de cada tipo de node, handles expostos, erros comuns, checklist) e lionchat://docs/flowbuilder-patterns (10 templates prontos pra adaptar). BRAINSTORMING: se faltou info critica (canal, gatilho, conteudo), use o prompt create_flow_brainstorm como banco de perguntas sugeridas — pergunte SO o que falta, sem checklist forcado. APOS GERAR: rode o checklist da secao 6 do design guide antes de submeter (1 node start, todo node com id unico + position + data, todo edge com sourceHandle valido). NUNCA invente sourceHandle (no condition use cond_0/cond_1/default, no wait_response options use option_X, no AI intent use intent_<opcao>). IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create. conversation_mode: 'individual' (default) | 'group'. Sticky note (type 'note'): data usa title+body+color(yellow|teal|blue|violet|pink|orange|slate)+width+height — NUNCA 'content'. ORGANIZAÇÃO: preencha tags ao criar (reutilizando as tags já existentes nos flows da conta — veja flows_list) pra manter a lista organizada. STICKY NOTE: o texto da nota (type note) vai em data.title + data.body — content/label/text deixam a nota EM BRANCO na tela; nunca crie nota sem body. LAYOUT: espace os nodes (colunas a >=320px no x, ramos a >=180px no y; notas AO LADO/ACIMA do trecho, nunca sobre nodes ou linhas). REGRAS 18/08: acao start_flow com flow_id do PROPRIO flow e aceita no save mas IGNORADA EM SILENCIO na execucao (o fluxo para ali) — aponte sempre pra OUTRO flow. Condicoes: preencha operator E field juntos (tabela dos pares no resource flowbuilder-patterns), senao a regra roda certa e aparece errada na tela do cliente. NOVIDADES 01/09/2026 no schema (lionchat_flows_schema_reference): acao send_conversion (Meta/Google Ads/GA4 de dentro do fluxo) e condicao por origem/campanha (attr_config de conversa com origin_kind=paid_ad etc.). NOVIDADES 02/09/2026: (1) send_conversion ganhou event_names — UM evento por destino ({meta, google_ads, ga4}); event_name virou reserva (grave os dois); Google Ads so aceita nome do conversion_action_map. (2) preset 'Origem do lead' (attrScope 'lead_origin', attr_key origin_platform; valores: plataforma ou 'custom:<slug>'). (3) REGRA DE VALOR na condicao de atributo: equal/not_equal/contains/not_contains gravam em values:[...] (LISTA) com value:'' — value solo abre VAZIO na tela do cliente. Ver lionchat_flows_schema_reference. TIPO DE FLUXO (17/09/2026): o parametro flow_type aceita 'conversation' (padrao) ou 'action' (Fluxo de Acoes). O de ACOES nao fica ligado a caixa nenhuma, roda em QUALQUER conversa de QUALQUER caixa e SO executa acoes — NAO pode ter os blocos send_message, wait_response nem update_group (a validacao recusa o save inteiro), nao aceita inbox_ids e ignora conversation_mode. Use pra regra que vale na empresa toda e nao depende da caixa (ex.: etiqueta 'urgente' -> atribui equipe de suporte). Se precisa FALAR com a pessoa, o tipo e 'conversation'. Pra ferramenta da IA continue usando lionchat_flow_tools_create.",
|
|
9734
9734
|
"category": "Flows",
|
|
9735
9735
|
"params": [
|
|
9736
9736
|
{
|
|
@@ -9751,8 +9751,8 @@
|
|
|
9751
9751
|
"name": "channel_type",
|
|
9752
9752
|
"type": "string",
|
|
9753
9753
|
"location": "body",
|
|
9754
|
-
"required":
|
|
9755
|
-
"description": "Tipo de canal (ex: Channel::Waha, Channel::WebWidget, Channel::Whatsapp)"
|
|
9754
|
+
"required": false,
|
|
9755
|
+
"description": "Tipo de canal (ex: Channel::Waha, Channel::WebWidget, Channel::Whatsapp). Obrigatorio no fluxo de conversa; NAO se aplica ao flow_type 'action', que roda em todas as caixas."
|
|
9756
9756
|
},
|
|
9757
9757
|
{
|
|
9758
9758
|
"name": "conversation_mode",
|
|
@@ -9766,7 +9766,7 @@
|
|
|
9766
9766
|
"type": "array",
|
|
9767
9767
|
"location": "body",
|
|
9768
9768
|
"required": false,
|
|
9769
|
-
"description": "IDs das caixas de entrada a vincular"
|
|
9769
|
+
"description": "IDs das caixas de entrada a vincular. NAO use com flow_type 'action' — a validacao recusa caixa nesse tipo (ele roda em todas)."
|
|
9770
9770
|
},
|
|
9771
9771
|
{
|
|
9772
9772
|
"name": "flow_data",
|
|
@@ -9781,6 +9781,13 @@
|
|
|
9781
9781
|
"location": "body",
|
|
9782
9782
|
"required": false,
|
|
9783
9783
|
"description": "Tags livres do flow para organização (array de strings; máx 20 tags, cada uma até 50 caracteres; duplicadas por maiúscula/minúscula são unificadas). A lista de flows na tela filtra por Status/Tipo/Caixa/Tags no navegador — não há filtro por query param no index."
|
|
9784
|
+
},
|
|
9785
|
+
{
|
|
9786
|
+
"name": "flow_type",
|
|
9787
|
+
"type": "string",
|
|
9788
|
+
"location": "body",
|
|
9789
|
+
"required": false,
|
|
9790
|
+
"description": "'conversation' (padrao) ou 'action' (Fluxo de Acoes). IMUTAVEL apos criar. No 'action' NAO mande inbox_ids nem channel_type (ele roda em todas as caixas) e nem conversation_mode (o backend fixa 'individual'); e o flow_data NAO pode conter send_message, wait_response, update_group ou end. Ferramenta da IA ('ai_tool') tem tool propria: lionchat_flow_tools_create."
|
|
9784
9791
|
}
|
|
9785
9792
|
],
|
|
9786
9793
|
"returns": "flow criado (com novo ID)",
|
|
@@ -15591,6 +15598,75 @@
|
|
|
15591
15598
|
"lionchat_inboxes_waha_groups_update"
|
|
15592
15599
|
]
|
|
15593
15600
|
},
|
|
15601
|
+
{
|
|
15602
|
+
"id": "lionchat_inboxes_waha_groups_list_3",
|
|
15603
|
+
"method": "GET",
|
|
15604
|
+
"path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/join_info",
|
|
15605
|
+
"title": "Ver Grupo de um Convite (antes de entrar)",
|
|
15606
|
+
"description": "SO LEITURA: pergunta ao WhatsApp que grupo e um codigo de convite, sem entrar. Use SEMPRE antes de lionchat_inboxes_waha_groups_create_6 para confirmar com a pessoa em qual grupo ela vai entrar. Aceita o codigo cru, o link inteiro (https://chat.whatsapp.com/CODIGO) ou o link no meio de um texto. So funciona em caixa de WhatsApp QR Code (Channel::Waha).",
|
|
15607
|
+
"category": "Grupos WhatsApp",
|
|
15608
|
+
"params": [
|
|
15609
|
+
{
|
|
15610
|
+
"name": "inbox_id",
|
|
15611
|
+
"type": "integer",
|
|
15612
|
+
"location": "path",
|
|
15613
|
+
"required": true,
|
|
15614
|
+
"description": "ID da inbox (precisa ser WhatsApp QR Code)"
|
|
15615
|
+
},
|
|
15616
|
+
{
|
|
15617
|
+
"name": "code",
|
|
15618
|
+
"type": "string",
|
|
15619
|
+
"location": "query",
|
|
15620
|
+
"required": true,
|
|
15621
|
+
"description": "Codigo do convite, o link completo, ou um texto que contenha o link"
|
|
15622
|
+
}
|
|
15623
|
+
],
|
|
15624
|
+
"returns": "{ data: { JID, Name, ParticipantCount, OwnerPN, IsJoinApprovalRequired, Suspended, GroupCreated } } — formato cru do motor, em PascalCase. 422 quando o link nao e de convite de grupo.",
|
|
15625
|
+
"common_use_cases": [
|
|
15626
|
+
"Confirmar o nome e o tamanho do grupo antes de entrar",
|
|
15627
|
+
"Saber se a entrada no grupo precisa de aprovacao de administrador",
|
|
15628
|
+
"Validar um link de convite recebido numa conversa"
|
|
15629
|
+
],
|
|
15630
|
+
"related_tools": [
|
|
15631
|
+
"lionchat_inboxes_waha_groups_list",
|
|
15632
|
+
"lionchat_inboxes_waha_groups_show",
|
|
15633
|
+
"lionchat_inboxes_waha_groups_create_5"
|
|
15634
|
+
]
|
|
15635
|
+
},
|
|
15636
|
+
{
|
|
15637
|
+
"id": "lionchat_inboxes_waha_groups_create_6",
|
|
15638
|
+
"method": "POST",
|
|
15639
|
+
"path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/join",
|
|
15640
|
+
"title": "Entrar no Grupo por Convite",
|
|
15641
|
+
"description": "Faz o numero conectado ENTRAR num grupo WhatsApp usando um codigo de convite, como participante comum. Acao que muda o WhatsApp do cliente: confirme antes com lionchat_inboxes_waha_groups_list_3. Recusa com 422 e reason 'groups_disabled' quando a caixa esta com 'Aceitar grupos' desligado — sem essa chave as mensagens do grupo nunca chegariam ao painel. So funciona em caixa de WhatsApp QR Code (Channel::Waha).",
|
|
15642
|
+
"category": "Grupos WhatsApp",
|
|
15643
|
+
"params": [
|
|
15644
|
+
{
|
|
15645
|
+
"name": "inbox_id",
|
|
15646
|
+
"type": "integer",
|
|
15647
|
+
"location": "path",
|
|
15648
|
+
"required": true,
|
|
15649
|
+
"description": "ID da inbox (precisa ser WhatsApp QR Code)"
|
|
15650
|
+
},
|
|
15651
|
+
{
|
|
15652
|
+
"name": "code",
|
|
15653
|
+
"type": "string",
|
|
15654
|
+
"location": "body",
|
|
15655
|
+
"required": true,
|
|
15656
|
+
"description": "Codigo do convite, o link completo, ou um texto que contenha o link"
|
|
15657
|
+
}
|
|
15658
|
+
],
|
|
15659
|
+
"returns": "{ success: true, data: { id: '...@g.us' } }. 422 com reason 'groups_disabled' se a caixa nao aceita grupos; 422 se o link nao e de convite.",
|
|
15660
|
+
"common_use_cases": [
|
|
15661
|
+
"Entrar num grupo a partir de um convite recebido na conversa",
|
|
15662
|
+
"Entrar num grupo usando um link colado pelo cliente"
|
|
15663
|
+
],
|
|
15664
|
+
"related_tools": [
|
|
15665
|
+
"lionchat_inboxes_waha_groups_list_3",
|
|
15666
|
+
"lionchat_inboxes_waha_groups_list",
|
|
15667
|
+
"lionchat_inboxes_waha_groups_show"
|
|
15668
|
+
]
|
|
15669
|
+
},
|
|
15594
15670
|
{
|
|
15595
15671
|
"id": "lionchat_inboxes_whatsapp_templates_list",
|
|
15596
15672
|
"method": "GET",
|
|
@@ -20900,7 +20976,8 @@
|
|
|
20900
20976
|
"related_tools": [
|
|
20901
20977
|
"lionchat_agent_availability_update",
|
|
20902
20978
|
"lionchat_agent_availability_list_1",
|
|
20903
|
-
"lionchat_agent_availability_list_2"
|
|
20979
|
+
"lionchat_agent_availability_list_2",
|
|
20980
|
+
"lionchat_agent_availability_day"
|
|
20904
20981
|
]
|
|
20905
20982
|
},
|
|
20906
20983
|
{
|
|
@@ -20963,7 +21040,8 @@
|
|
|
20963
21040
|
"related_tools": [
|
|
20964
21041
|
"lionchat_agent_availability_list",
|
|
20965
21042
|
"lionchat_agent_availability_update",
|
|
20966
|
-
"lionchat_agent_availability_list_2"
|
|
21043
|
+
"lionchat_agent_availability_list_2",
|
|
21044
|
+
"lionchat_agent_availability_day"
|
|
20967
21045
|
]
|
|
20968
21046
|
},
|
|
20969
21047
|
{
|
|
@@ -20991,7 +21069,67 @@
|
|
|
20991
21069
|
"related_tools": [
|
|
20992
21070
|
"lionchat_agent_availability_list",
|
|
20993
21071
|
"lionchat_agent_availability_update",
|
|
20994
|
-
"lionchat_agent_availability_list_1"
|
|
21072
|
+
"lionchat_agent_availability_list_1",
|
|
21073
|
+
"lionchat_agent_availability_day"
|
|
21074
|
+
]
|
|
21075
|
+
},
|
|
21076
|
+
{
|
|
21077
|
+
"id": "lionchat_agent_availability_day",
|
|
21078
|
+
"method": "GET",
|
|
21079
|
+
"path": "/api/v1/accounts/{account_id}/agent_availability/day",
|
|
21080
|
+
"title": "Ver Como Esta o Dia (expediente + horarios ocupados)",
|
|
21081
|
+
"description": "Resumo de UM dia de ate 6 pessoas da conta, para escolher horario de um compromisso COMUM sem marcar no escuro: expediente de cada pessoa e os intervalos ja ocupados, tudo em 'HH:MM' do fuso pedido. E o mesmo dado do quadro 'Escolha o dia e veja os horarios' da janela Nova tarefa. PRIVACIDADE: o INTERVALO ocupado de qualquer pessoa da conta vem sempre (e o que permite marcar algo com um colega); `title`/`task_id` so vem para quem ja veria o compromisso no calendario (proprio/responsavel, agenda publica do dono, administrador) — compromisso PRIVADO de outra pessoa nunca vem com titulo (`title_visible: false`). Sem `user_ids` = o proprio usuario do token. Feriados do dia vem em `holidays` (filtrados por `agenda_id` quando informado). Para agendamento por BOOKING nao use esta: os horarios validos sao os de `lionchat_booking_event_types_slots` (respeitam duracao, intervalo e antecedencia do tipo de evento). `date` ausente ou invalida = 400.",
|
|
21082
|
+
"category": "Disponibilidade",
|
|
21083
|
+
"params": [
|
|
21084
|
+
{
|
|
21085
|
+
"name": "date",
|
|
21086
|
+
"type": "string",
|
|
21087
|
+
"location": "query",
|
|
21088
|
+
"required": true,
|
|
21089
|
+
"description": "Dia no formato YYYY-MM-DD"
|
|
21090
|
+
},
|
|
21091
|
+
{
|
|
21092
|
+
"name": "user_ids",
|
|
21093
|
+
"type": "array",
|
|
21094
|
+
"location": "query",
|
|
21095
|
+
"required": false,
|
|
21096
|
+
"query_name": "user_ids[]",
|
|
21097
|
+
"description": "IDs das pessoas (ate 6, so gente DA CONTA). Vazio = o proprio usuario do token"
|
|
21098
|
+
},
|
|
21099
|
+
{
|
|
21100
|
+
"name": "timezone",
|
|
21101
|
+
"type": "string",
|
|
21102
|
+
"location": "query",
|
|
21103
|
+
"required": false,
|
|
21104
|
+
"description": "Fuso IANA em que os horarios devem voltar (ex.: America/Sao_Paulo). Invalido/ausente = fuso da conta"
|
|
21105
|
+
},
|
|
21106
|
+
{
|
|
21107
|
+
"name": "agenda_id",
|
|
21108
|
+
"type": "integer",
|
|
21109
|
+
"location": "query",
|
|
21110
|
+
"required": false,
|
|
21111
|
+
"description": "ID da agenda (unidade) — filtra os feriados por agenda"
|
|
21112
|
+
},
|
|
21113
|
+
{
|
|
21114
|
+
"name": "excluding_task_id",
|
|
21115
|
+
"type": "integer",
|
|
21116
|
+
"location": "query",
|
|
21117
|
+
"required": false,
|
|
21118
|
+
"description": "Ao REMARCAR: ID da propria tarefa, para ela nao contar como horario ocupado"
|
|
21119
|
+
}
|
|
21120
|
+
],
|
|
21121
|
+
"returns": "{ date, timezone, holidays: [{ name, all_day, start, end }], people: [{ user_id, name, color, working_hours: [{ start, end }], busy: [{ start, end, title_visible, title, task_id, readonly }] }] } — horarios em 'HH:MM' no fuso devolvido em `timezone`",
|
|
21122
|
+
"common_use_cases": [
|
|
21123
|
+
"Antes de criar uma tarefa/reuniao, ver se a pessoa esta livre naquele dia e em que horarios",
|
|
21124
|
+
"Achar um horario em que dois ou mais colegas estao livres ao mesmo tempo",
|
|
21125
|
+
"Ao remarcar, conferir o dia novo sem contar a propria tarefa como ocupada (excluding_task_id)"
|
|
21126
|
+
],
|
|
21127
|
+
"related_tools": [
|
|
21128
|
+
"lionchat_agent_availability_list",
|
|
21129
|
+
"lionchat_agent_availability_list_1",
|
|
21130
|
+
"lionchat_agent_availability_list_2",
|
|
21131
|
+
"lionchat_tasks_create",
|
|
21132
|
+
"lionchat_booking_event_types_slots"
|
|
20995
21133
|
]
|
|
20996
21134
|
},
|
|
20997
21135
|
{
|
|
@@ -25525,7 +25663,7 @@
|
|
|
25525
25663
|
"method": "GET",
|
|
25526
25664
|
"path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}/reminder_history",
|
|
25527
25665
|
"title": "Histórico dos Lembretes e-Clínica",
|
|
25528
|
-
"description": "Lista os disparos de lembrete agendados da integração e-Clínica (novo 23/07) — responde 'o lembrete do paciente X saiu?'. Cada item traz status (pending aguardando | fired enviado | cancelled | skipped pulado + skip_reason | failed falhou + fail_reason), datas (created_at recebido, fire_at agendado, fired_at disparado, data_consulta), flow_name, contact_name, compromisso e unidade. Somente administrador. [2026-07-25] O historico cobre os tres tipos de lembrete: consulta (conta a partir da data da consulta), laboratorio/medicacao (conta a partir da data prevista do laboratorio) e vencimento de cobranca (conta a partir do vencimento). O horario de cada disparo vem da 'Hora do disparo' configurada na linha do lembrete.",
|
|
25666
|
+
"description": "Lista os disparos de lembrete agendados da integração e-Clínica (novo 23/07) — responde 'o lembrete do paciente X saiu?'. Cada item traz status (pending aguardando | fired enviado | cancelled | skipped pulado + skip_reason | failed falhou + fail_reason), datas (created_at recebido, fire_at agendado, fired_at disparado, data_consulta), flow_name, contact_name, compromisso e unidade. Somente administrador. [2026-07-25] O historico cobre os tres tipos de lembrete: consulta (conta a partir da data da consulta), laboratorio/medicacao (conta a partir da data prevista do laboratorio) e vencimento de cobranca (conta a partir do vencimento). O horario de cada disparo vem da 'Hora do disparo' configurada na linha do lembrete. [2026-09-17] Um lembrete por CONSULTA: paciente com duas consultas no mesmo dia (ou duas pessoas no mesmo celular) recebe um lembrete para cada uma, com ~10 minutos entre eles — o que espera a vez aparece como pending com fire_at ja no passado por alguns minutos (normal, nao e erro). fail_reason = fluxo_ainda_em_andamento_com_este_contato: o fluxo do aviso anterior ainda rodava com o contato (tipico de fluxo que aguarda o paciente clicar num botao); pode ser reprocessado. fail_reason = nao_disparou: causa mais comum e contato sem telefone. skip_reason = outra_consulta_no_mesmo_dia so existe em linhas antigas (regra removida em 17/09).",
|
|
25529
25667
|
"category": "Integracoes",
|
|
25530
25668
|
"params": [
|
|
25531
25669
|
{
|
|
@@ -25603,7 +25741,8 @@
|
|
|
25603
25741
|
"common_use_cases": [
|
|
25604
25742
|
"Verificar se o lembrete de consulta de um paciente foi enviado",
|
|
25605
25743
|
"Listar lembretes que falharam para reprocessar",
|
|
25606
|
-
"Auditar os disparos agendados de um período"
|
|
25744
|
+
"Auditar os disparos agendados de um período",
|
|
25745
|
+
"Explicar por que um paciente com duas consultas no mesmo dia recebeu (ou ainda nao recebeu) o segundo lembrete"
|
|
25607
25746
|
],
|
|
25608
25747
|
"related_tools": [
|
|
25609
25748
|
"lionchat_eclinica_integrations_list",
|
|
@@ -25615,7 +25754,7 @@
|
|
|
25615
25754
|
"method": "POST",
|
|
25616
25755
|
"path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}/reminder_history/{firing_id}/reprocess",
|
|
25617
25756
|
"title": "Reprocessar Lembrete e-Clínica Falhado",
|
|
25618
|
-
"description": "Reprocessa UM lembrete com status failed (novo 23/07): volta para pending e dispara de novo. Só funciona em lembrete FALHADO — status diferente retorna 422; corrida (dois cliques) retorna 409. Somente administrador.",
|
|
25757
|
+
"description": "Reprocessa UM lembrete com status failed (novo 23/07): volta para pending e dispara de novo. Só funciona em lembrete FALHADO — status diferente retorna 422; corrida (dois cliques) retorna 409. Somente administrador. [2026-09-17] Serve tambem para o lembrete que falhou com fail_reason = fluxo_ainda_em_andamento_com_este_contato (o fluxo do aviso anterior ainda estava em andamento): se o paciente ja respondeu o primeiro aviso, o segundo sai; se ainda nao, falha de novo sem enviar mensagem. NAO usar em lembrete pending com horario passado ha poucos minutos — ele esta so esperando a vez e sai sozinho.",
|
|
25619
25758
|
"category": "Integracoes",
|
|
25620
25759
|
"params": [
|
|
25621
25760
|
{
|
|
@@ -26007,6 +26146,20 @@
|
|
|
26007
26146
|
"location": "body",
|
|
26008
26147
|
"required": false,
|
|
26009
26148
|
"description": "Atributos extras (ex: { mark_as_seen: false } no WhatsApp oficial)"
|
|
26149
|
+
},
|
|
26150
|
+
{
|
|
26151
|
+
"name": "out_of_office_enabled",
|
|
26152
|
+
"type": "boolean",
|
|
26153
|
+
"location": "body",
|
|
26154
|
+
"required": false,
|
|
26155
|
+
"description": "Liga/desliga a mensagem de ausencia da caixa (fora do horario de atendimento)"
|
|
26156
|
+
},
|
|
26157
|
+
{
|
|
26158
|
+
"name": "out_of_office_message",
|
|
26159
|
+
"type": "string",
|
|
26160
|
+
"location": "body",
|
|
26161
|
+
"required": false,
|
|
26162
|
+
"description": "Texto da mensagem de ausencia"
|
|
26010
26163
|
}
|
|
26011
26164
|
],
|
|
26012
26165
|
"returns": "{ inbox }",
|
|
@@ -31481,13 +31634,6 @@
|
|
|
31481
31634
|
"required": false,
|
|
31482
31635
|
"description": "Token do webhook da Greenn (valida a assinatura do que chega)"
|
|
31483
31636
|
},
|
|
31484
|
-
{
|
|
31485
|
-
"name": "inbox_id",
|
|
31486
|
-
"type": "integer",
|
|
31487
|
-
"location": "body",
|
|
31488
|
-
"required": false,
|
|
31489
|
-
"description": "Caixa onde a conversa do comprador é aberta"
|
|
31490
|
-
},
|
|
31491
31637
|
{
|
|
31492
31638
|
"name": "active",
|
|
31493
31639
|
"type": "boolean",
|
|
@@ -31575,13 +31721,6 @@
|
|
|
31575
31721
|
"required": false,
|
|
31576
31722
|
"description": "Token do webhook da Greenn (valida a assinatura do que chega)"
|
|
31577
31723
|
},
|
|
31578
|
-
{
|
|
31579
|
-
"name": "inbox_id",
|
|
31580
|
-
"type": "integer",
|
|
31581
|
-
"location": "body",
|
|
31582
|
-
"required": false,
|
|
31583
|
-
"description": "Caixa onde a conversa do comprador é aberta"
|
|
31584
|
-
},
|
|
31585
31724
|
{
|
|
31586
31725
|
"name": "active",
|
|
31587
31726
|
"type": "boolean",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lionchat/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0",
|
|
4
4
|
"description": "MCP server for LionChat API — 547 tools + 10 resources + 9 prompts. Audit-log aware, completion API, progress notifications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|