@lionchat/mcp-server 1.34.1 → 1.36.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/client.js CHANGED
@@ -27,6 +27,10 @@ function getErrorMessage(status, body) {
27
27
  return 'Permission denied: your role does not allow this action (an administrator may have hidden this menu ' +
28
28
  'in the custom role). The token is valid — do not ask the user to renew it.';
29
29
  }
30
+ if (isInvalidMemberIds(body)) {
31
+ return 'Invalid user id: at least one id in user_ids or supervisor_ids does not belong to this account, and ' +
32
+ 'nothing was changed. The token is valid — fix the list and do not ask the user to renew it.';
33
+ }
30
34
  return 'Authentication failed. Check your token at Login > Profile Settings';
31
35
  case 403:
32
36
  return 'Permission denied. Your token may not have access to this resource';
@@ -54,6 +58,14 @@ function isPermissionRefusal(body) {
54
58
  const obj = body;
55
59
  return obj.error === PERMISSION_REFUSAL_TEXT || obj.message === PERMISSION_REFUSAL_TEXT;
56
60
  }
61
+ // AIDEV-NOTE: [protecao-contra-excesso 04/11] as 4 rotas que gravam membro de time respondem 401 com este texto quando a
62
+ // lista traz id de fora da conta. O token esta certo: como "token invalido", a IA pedia credencial nova sem precisar.
63
+ const INVALID_MEMBER_IDS_TEXT = 'IDs de usuario invalidos';
64
+ function isInvalidMemberIds(body) {
65
+ if (!body || typeof body !== 'object')
66
+ return false;
67
+ return body.error === INVALID_MEMBER_IDS_TEXT;
68
+ }
57
69
  // AIDEV-NOTE: Extract validation details from 422 response body
58
70
  function extractValidationDetails(body) {
59
71
  if (body && typeof body === 'object') {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -80,7 +80,7 @@ Account (conta/empresa)
80
80
  - `image` — fotos/imagens
81
81
  - `audio` — áudios (geralmente vêm com `transcribed_text`)
82
82
  - `video`
83
- - `file` — PDF, DOCX, qualquer outro (pode ter `extracted_text`)
83
+ - `file` — PDF, DOCX, planilha, qualquer outro. O texto que a IA leu do documento NÃO vem na API (não existe `extracted_text` na resposta); o que ela leu aparece na pílula de atividade da conversa ("A IA leu o documento X (N de M páginas)")
84
84
  - `location`, `contact` — tipos especiais
85
85
 
86
86
  ### KanbanItem.item_details.priority (string)
@@ -209,7 +209,7 @@ Muitos campos objeto/lista são **trocados inteiros** no update: o que não vier
209
209
  | TROCA inteira (leia e reenvie tudo) | SOMA (só as chaves enviadas mudam) |
210
210
  |---|---|
211
211
  | `custom_attributes` da CONVERSA (`conversations_create_3` — troca os atributos DO CLIENTE; desde 06/10/2026 o dado do sistema fica FORA dessa troca: não é apagado e também não é gravado por aqui — ctwa/origin/UTM oficiais/cliques do Google/waha/captain e qualquer atributo marcado como do sistema. Atributo próprio do cliente segue normal, mesmo com nome parecido, ex.: `utm_loja_fisica`) | `custom_attributes` do CONTATO (`contacts_update`) |
212
- | card: cada chave de `item_details` (a lista `custom_attributes` do card, `offers`, `notes`), `assigned_agents`, coluna `custom_attributes` | `item_details` do card no 1º nível (chave não enviada fica) |
212
+ | card: cada chave de `item_details` (a lista `custom_attributes` do card, `offers`, `notes`), `assigned_agents` | `item_details` do card no 1º nível (chave não enviada fica); `kanban_item.custom_attributes` (objeto `{nome do campo: valor}`), campo a campo: os outros ficam |
213
213
  | `funnel.settings`, `funnel.stages` (etapa ausente = removida), `kanban_config.global_custom_attributes` | `channel.additional_attributes` da caixa WhatsApp/Instagram/Facebook/TikTok |
214
214
  | `flow_data` do fluxo, `actions` de macro/automação, `query` de filtro salvo, `audience` de campanha | `roles_layout` do modelo de contrato |
215
215
  | `settings` de integração (hooks), mapas de evento de gateway/Omie/Conta Azul/Meta Lead/Google Ads | |
@@ -336,6 +336,10 @@ CONTA). Vale para WhatsApp oficial, QR Code e Campanha de Fluxo; SMS e TopSend r
336
336
  lida na HORA do disparo: segmento apagado ou com regra quebrada = a campanha NÃO envia nada e o motivo fica em
337
337
  `trigger_rules.audience_error`; na estimativa vem `estimated_count: null` com `segment_unavailable`.
338
338
  QR Code aceita `template_params` com `delay_min/delay_max/variations` (anti-bloqueio) e `bulk_actions`.
339
+ QR Code desde 09/11/2026: sai UMA mensagem por vez por NUMERO, respeitando a espera (`delay_min/delay_max`, 1 a 3600 s;
340
+ vazio = 20/40). `daily_cap` = teto da campanha por dia, no maximo 1000 (vazio, zero ou acima = 1000; sem a chave = 500). O
341
+ NUMERO nunca passa de 1000 mensagens de campanha por dia somando todas as campanhas dele: o excedente sai no dia seguinte, na
342
+ hora em que a campanha comecou. Para mais de 1000 pessoas por dia, use a caixa oficial.
339
343
 
340
344
  ### Criar campanha de FLUXO (dispara um flow, não uma mensagem) — novo 28/07/2026
341
345
  ```
@@ -390,6 +394,7 @@ e pular evita que ela receba tudo em dobro. Quem está sendo atendido pela equip
390
394
  | Bulk actions (IDs) max | 300 por chamada (desde 18/05/2026; passou disso = HTTP 422 `bulk_ids_limit_exceeded`) |
391
395
  | Rate limit leitura | 1200/min por token |
392
396
  | Rate limit escrita | 600/min por token |
397
+ | Limites por rota | Contam por chave de API em cada conta (09/11/2026); totais da conta somam só pedidos autenticados da própria conta |
393
398
  | Loop detection | bloqueia chamada idêntica >10x em 10s |
394
399
  | Variável de Conta — tamanho do valor | 32 KB por variável (novo 01/08/2026; passou disso = HTTP 422 na conta). Vale só pra variável DECLARADA na tela; chave interna do sistema não é barrada. É por variável, não pela soma — conta com dezenas de tokens legítimos não é punida |
395
400
 
@@ -453,10 +458,12 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
453
458
  | Criar / preencher **campo personalizado da empresa** ("Segmento", "Data de fundacao") | `lionchat_custom_attributes_create` com `attribute_model: company_attribute` + `lionchat_companies_update` com `company.custom_attributes {chave: valor}` | So com o modulo Empresas ligado; tipo segredo recusado. Chave que nao existe como atributo de empresa = 422 e nada do pedido grava: crie a definicao ANTES. MESCLA; `null` limpa. Desde 2026-10-16 vira variavel `{{contact.company.custom_attribute.CHAVE}}`, condicao do fluxo (`attrSource: company`), condicao de automacao e filtro de contatos (`custom_attribute_type: company_attribute`) e a IA le — detalhe no resource data-model |
454
459
  | **Importar muitas empresas** de uma vez (planilha, lista de clientes, cadastro de outro sistema) | `lionchat_companies_bulk_create` (ate 1000 por chamada; `check_only: true` CONFERE sem gravar) e depois `lionchat_companies_import_status` com o `import_id` | Mesma importacao do botao "Importar empresas" da tela. Mesma empresa = CNPJ; sem CNPJ, o site; sem os dois, o NOME — mais de uma empresa com aquele nome = a linha NAO entra (mande CNPJ ou site). Empresa existente e ATUALIZADA; campo vazio nunca apaga. Valor invalido fica em branco com aviso e o resto entra. Campos PLANOS (`address_city`, `social_instagram`), nunca objeto; `custom_attributes` so com chave que ja existe como atributo de EMPRESA. Exige modulo Empresas + administrador ou cargo "Exportar e importar contatos". So no conector remoto (Claude.ai/ChatGPT); no conector local (NPM) importe com `lionchat_companies_create` uma a uma |
455
460
  | Organizar atributos em **categorias** (pastas que abrem e fecham: "Sobre a casa", "Financeiro") | `lionchat_custom_attribute_categories_create` (`name` + `attribute_model`) e depois `lionchat_custom_attribute_categories_assign` (`attribute_key` + `category_id`; `null` tira) | Categoria e OPCIONAL e de UMA aba so (`conversation_attribute`, `contact_attribute`, `company_attribute` ou `kanban_item_attribute` = Card). Criar categoria NAO aceita atributos junto. Card: `attribute_key` = NOME do campo exatamente como gravado. Excluir categoria nunca apaga atributo (voltam para "Sem categoria"). Ver resource data-model |
456
- | Achar a conversa **de uma pessoa/empresa** (nome, telefone, e-mail, CPF/CNPJ, nº da conversa) | `lionchat_search_list` (`/search/conversations`) ou `lionchat_contacts_search` | RÁPIDO. **NÃO use `lionchat_conversations_search`**: apesar do nome, ele é o legado que procura dentro das mensagens e leva **15 a 22 s** (medido em produção 11/08). O sufixo `_list` aqui é histórico — `lionchat_search_list*` **são buscas**, não listagens; a regra "não baixe tudo com `*_list`" vale para `lionchat_<recurso>_list` |
457
- | Achar **onde foi dito** algo (palavra dentro da conversa) | `lionchat_search_list_2` (`/search/messages`) | RÁPIDO: índice trigram próprio e teto de tempo em duas fases (2 s / 2 s desde 04/09 — antes a 2ª fase herdava 14 s e o pior caso da seção era 16 s). Estourou as duas, o payload volta com `message_search_interrupted: true` e a lista VAZIA — isso NÃO quer dizer que não existe, quer dizer que não deu tempo: tente de novo. É a substituta certa do `lionchat_conversations_search` |
461
+ | Achar a conversa **de uma pessoa/empresa** (nome, telefone, e-mail, CPF/CNPJ, nº da conversa) | `lionchat_search_list` (`/search/conversations`) ou `lionchat_contacts_search` | RÁPIDO e lê a FICHA. **`lionchat_conversations_search` não serve para isso**: apesar do nome, ele procura só no TEXTO das mensagens, nunca no nome, telefone ou CPF. O sufixo `_list` aqui é histórico — `lionchat_search_list*` **são buscas**, não listagens; a regra "não baixe tudo com `*_list`" vale para `lionchat_<recurso>_list` |
462
+ | **Em quais conversas** foi dito algo, e **quantas** (histórico inteiro) | `lionchat_conversations_search` (`/conversations/search`) | Refeito em 05/11/2026: antes levava 15 a 22 s e chegou a derrubar o servidor; resposta anterior sua que mandou EVITAR esta ferramenta ficou velha. Procura o TRECHO EXATO digitado (com os espaços; maiúscula não importa, acento importa) nas mensagens do cliente e da equipe, em todo o histórico; nota privada e evento do sistema ficam fora. `meta.all_count` conta CONVERSAS, não vezes, e já responde "quantas" na 1ª página: peça outras páginas só para ler mais. Cada conversa traz até 5 mensagens que casam, as mais novas, e `matched_messages_count` (quantas casam nela). `meta.truncated: true` = passou de 5.000 conversas e o número é "pelo menos". `meta.message_search_interrupted: true` = estourou o tempo: vazio NÃO quer dizer que não existe e os números vêm `null`; refine o termo. 25 conversas por página. Resposta cortada por tamanho: as conversas cortadas NÃO voltam na página seguinte; refine o termo |
463
+ | Mensagens **recentes** com o contexto em volta (o que veio antes e depois) | `lionchat_search_list_2` (`/search/messages`) | RÁPIDO, mas só os ÚLTIMOS 3 MESES, por palavras soltas (cada termo precisa bater) e sem agrupar por conversa: 15 mensagens por página, cada uma com a anterior e a seguinte. Teto de tempo em duas fases (2 s + 2 s desde 04/09): estourou, volta `message_search_interrupted: true` e a lista VAZIA — isso NÃO quer dizer que não existe, quer dizer que não deu tempo |
464
+ | Achar algo **dentro de uma conversa** que você já sabe qual é | `lionchat_conversations_messages_search` | Recorta por uma conversa só; aceita `private_only` (só notas privadas) e `file_type` |
458
465
  | Não sei se o termo é nome de alguém ou algo dito no papo | `lionchat_search_search` (`/search`) | Cobre os dois numa chamada. Opção mais segura quando a intenção é ambígua |
459
- | (qualquer busca) termo com menos de 3 caracteres | — | Volta **vazio de propósito** em todas as buscas. Vazio ≠ "não existe": quer dizer que a busca não rodou. Refaça com 3+ caracteres. Só-dígitos é isento nas rotas `/search/*`, mas **não** no `lionchat_conversations_search` legado |
466
+ | (qualquer busca) termo com menos de 3 caracteres | — | Volta **vazio de propósito** em todas as buscas. Vazio ≠ "não existe": quer dizer que a busca não rodou. Refaça com 3+ caracteres. Só-dígitos é isento nas rotas `/search/*`, mas **não** no `lionchat_conversations_search`, que também devolve vazio para termo sem nenhuma letra ou número |
460
467
  | Entregar o **link** de um card ou de uma conversa ("me manda o link desse card") | Sem ferramenta: monte o endereço. Card: `<painel>/app/accounts/<conta>/kanban?funnel=<funnel_id>&card_id=<id do card>`. Conversa: `<painel>/app/accounts/<conta>/conversations/<número da conversa>`. `<painel>` e `<conta>` vêm de `lionchat_current_account` (conector remoto) ou `lionchat_ping` (conector local) | Cada instalação tem o seu endereço: nunca chute. Só abre para quem tem login e acesso naquela conta: nunca mande ao cliente final. Aba do card, conversa por cima do card e uso em fluxo: `lionchat://docs/kanban-deep-dive`, seção "Link do card" |
461
468
  | Recebeu um **link do painel** e quer saber do que se trata | Leia o endereço: `card_id` vai em `lionchat_kanban_items_show`; `conversation_id` ou `conversations/<número>` vai em `lionchat_conversations_show` | `accounts/<conta>` pode não ser a conta ativa: confira e troque antes de concluir que não existe. `conversation_id` é o número da tela (`display_id`), não o id interno |
462
469
  | Só a contagem / números | `lionchat_conversations_meta` / `lionchat_reports_summary` | Não liste o conteúdo completo |
@@ -153,6 +153,7 @@ O compromisso marcado por um tipo de evento (Booking) cai SEMPRE na agenda do pr
153
153
  nele. Na criação, `assignee_ids` nunca valeu; desde 17/09 também é **ignorado na edição**
154
154
  (`lionchat_tasks_update` / `_update_1`): a resposta é 200, o resto da edição vale e o responsável continua
155
155
  o mesmo. Para mudar quem atende, altere o profissional do tipo de evento (`booking_event_types_update`).
156
+ Número de pessoa de outra conta é recusado com 422, em qualquer compromisso.
156
157
 
157
158
  ### Ver como está o dia antes de marcar
158
159
 
@@ -401,6 +401,12 @@ Ou com código:
401
401
  | Por token API (reads) | 1200 reqs | 1 min |
402
402
  | Loop detection | 10 reqs idênticas | 10 seg |
403
403
 
404
+ **Limites por rota contam por quem pede (desde 09/11/2026).** Busca de contatos (100/min), subir arquivo (60/h),
405
+ disponibilidade de atendentes (30/min), contadores das conversas (30/min) e relatórios por pessoa (100/min) contam por
406
+ CHAVE de API em cada conta, não pela conta inteira: outra integração ou um estranho não esgota a sua cota. Os totais da
407
+ conta (relatórios 1000/min, enviar conversa por e-mail 1000/h, `check_phone` 1000/dia, disparo de conversão 100/h, evento
408
+ de teste do pixel 10/min) somam todos os pedidos AUTENTICADOS da própria conta. A resposta continua 429 com `Retry-After`.
409
+
404
410
  Quando rate-limited:
405
411
  - Status `429 Too Many Requests`
406
412
  - Header `Retry-After` indica em quantos segundos voltar
@@ -415,6 +421,10 @@ Quando rate-limited:
415
421
  2026-05-15). Acima disso o servidor recusa com `422` + `code: "bulk_ids_limit_exceeded"` — quebre em
416
422
  chamadas de 300.
417
423
 
424
+ `fields.assignee_id`, `fields.team_id` e `fields.inbox_id` têm de ser da conta. Fora disso a resposta é
425
+ `422` `Invalid <campo>` e nada é aplicado. Para tirar o responsável ou o time, mande `null` ou `0`. A caixa
426
+ não aceita vazio: sem caixa, a conversa não envia nem recebe.
427
+
418
428
  **Exceção:** contato com `select_all: true` (agir sobre TODOS os contatos do filtro) **não tem teto** —
419
429
  o servidor resolve pelo próprio filtro (`query` / `labels_filter`), em lotes no fundo, e não usa `ids`.
420
430
 
@@ -19,7 +19,7 @@ A maioria dos endpoints aceita parâmetros pra filtrar antes de retornar:
19
19
 
20
20
  | Endpoint | Filtros úteis |
21
21
  |---|---|
22
- | `conversations_list` | `status` (open/resolved/pending/snoozed/all), `assignee_type`, `conversation_type` (unread/unattended/mention/participating), `inbox_id`, `team_id`, `labels`, `captain_assistant` (any=com IA / none=sem IA / id do assistente), `quick_q` (busca rápida na lista), `source_id`, `updated_within` (segundos) |
22
+ | `conversations_list` | `status` (open/resolved/pending/snoozed/all), `assignee_type`, `conversation_type` (unread/unattended/mention/participating), `inbox_id`, `team_id`, `labels`, `captain_assistant` (any=com IA / none=sem IA / id do assistente), `quick_q` (busca rápida na lista), `source_id`, `updated_within` (segundos; no maximo 3 h e as 1.000 conversas mais recentes, sem paginacao; `meta.truncated` diz se cortou) |
23
23
  | `contacts_list` | `q` (nome/email/telefone), `include_contact_inboxes` |
24
24
  | `messages_search` | `q`, `file_type[]`, `private_only`, `page` (busca dentro de UMA conversa) |
25
25
  | `kanban_items_list` | `funnel_id`, `funnel_stage`, `assigned_agent_id` |
@@ -301,6 +301,24 @@ Diagnóstico, nesta ordem, quando relatarem "a IA nunca faz o follow-up":
301
301
  2. A ativação veio por **lote**? Então nunca foi armado.
302
302
  3. Tem `follow_up_skip_conditions` batendo (etiqueta, atributo, janela de silêncio)?
303
303
  4. A soma das etapas passa de 1380 min? Nesse caso o assistente nem salvou a cadência.
304
+ 5. Tem pílula cinza "Follow-up não enviado: <motivo>" na conversa? Então o modelo de decisões leu a conversa e as
305
+ instruções daquele follow-up e decidiu não enviar (seção seguinte).
306
+
307
+ ## Faz ou não faz: o sistema decide antes de cada follow-up (novo 2026-11-05)
308
+
309
+ Na hora de cada Follow-up (1, 2, 3), antes de a IA escrever, o modelo de decisões lê a conversa, as instruções da IA
310
+ e, acima de tudo, as instruções daquele follow-up, e escolhe: enviar agora, ou um motivo para não enviar. Se escolhe
311
+ enviar, a IA só escreve (não desiste mais). Se não, nada sai e fica uma pílula cinza com o motivo, só para a equipe.
312
+
313
+ - **Encerram a sequência até o cliente escrever:** "o cliente já resolveu", "o cliente pediu para não receber mais",
314
+ "o assunto foi encerrado". Mensagem de fluxo, automação ou campanha no meio NÃO reabre.
315
+ - **Seguem para o próximo follow-up no tempo dele:** "aguardando retorno combinado com o cliente" e "a instrução deste
316
+ follow-up não se aplica agora".
317
+ - As condições acima (etiqueta, atributo) valem ANTES da pergunta e, desde 2026-11-05, também passam para o próximo
318
+ follow-up em vez de parar a sequência.
319
+ - Para mudar o comportamento, mude o TEXTO das instruções de cada follow-up (`follow_up_steps[].prompt`): é o que mais
320
+ pesa na decisão. Não existe chave para desligar a pergunta.
321
+ - Sem chave principal da OpenAI na conta, ou se o modelo de decisões falhar, o follow-up segue como antes (a IA decide).
304
322
 
305
323
  ## Condições para NÃO fazer follow-up + horário de silêncio (2026-07)
306
324
 
@@ -315,6 +333,8 @@ pula o follow-up). Tipos:
315
333
  ] } }
316
334
  ```
317
335
 
336
+ - `label`, `contact_attr`, `conversation_attr`: o follow-up daquele passo não sai e o seguinte é agendado no tempo dele
337
+ (desde 2026-11-05; antes a sequência parava).
318
338
  - `label`: pula se a conversa TEM (`present`) / NÃO tem (`absent`) alguma das etiquetas.
319
339
  - `contact_attr` / `conversation_attr`: pula quando o atributo do contato/conversa bate o operador
320
340
  (`equal`, `not_equal`, `contains`, `present`, `blank`, `gt`, `lt`) com `value`.
@@ -401,6 +421,55 @@ As instruções aceitam variáveis Liquid `{{ }}` que chegam JÁ PREENCHIDAS com
401
421
  - As ferramentas "Buscar FAQ" e "Buscar Artigos" são auto-gerenciadas: ligam sozinhas conforme o conteúdo e somem da tela de ferramentas (não são desligáveis por disabled_tools). Diagnóstico "IA não usa a base": confira se há FAQ APROVADA/documento, ou artigo PUBLICADO na Central de Ajuda.
402
422
  - A IA pode oferecer ao cliente o link do artigo (precisa de Portal com slug e domínio/FRONTEND_URL).
403
423
 
424
+ ## Documento que o cliente manda: PDF, Word, planilha (2026-11-06)
425
+
426
+ Como a IA de atendimento lê o arquivo que o CLIENTE manda na conversa. Nada a ligar: vale para toda conta com
427
+ Agente de IA, sem chave liga/desliga. Até 05/11/2026 o texto era cortado em 30 mil caracteres (a IA via 4 de 13
428
+ páginas de um extrato) e voltava inteiro em toda resposta; resposta anterior sua com essa explicação ficou velha.
429
+
430
+ - **Leitura:** página a página, até **50 páginas** e **8 mil caracteres por página** (arquivo até 25 MB; planilha até
431
+ 5 mil linhas por aba). O texto fica guardado no próprio anexo e NÃO vem na API.
432
+ - **Na resposta em que o documento chega**, a IA recebe o texto inteiro (até 40 mil caracteres somando os documentos
433
+ daquela vez). Documento pequeno (até 6 mil caracteres) segue inteiro no histórico.
434
+ - **Nas respostas seguintes**, o histórico mostra um cartão com o código do documento (`D-123`), as páginas lidas e
435
+ um índice. Para responder, a IA consulta a ferramenta interna `read_document` ("Ler Documento Recebido"): páginas
436
+ (`"5-9"`) ou palavra/número exato (`"RMC"`, `"1.234,56"`); até 12 mil caracteres por consulta e 40 mil por
437
+ resposta. Só documento DESTA conversa e que ainda está na memória da IA. `read_document` fica sempre ligada, não
438
+ aparece na tela de ferramentas e não se desliga por `disabled_tools` (como Buscar FAQ e Buscar Artigos).
439
+ - **PDF escaneado** (página sem texto): lido por IMAGEM por trás, até **20 páginas** por documento, com a chave OpenAI
440
+ da conta. Enquanto lê, a IA avisa o cliente que está lendo; quando termina, ela RESPONDE SOZINHA uma vez, se ainda
441
+ cuida da conversa, e essa resposta conta na cota de respostas da IA. PDF com texto e algumas páginas escaneadas:
442
+ responde na hora com as páginas de texto, e as escaneadas ficam disponíveis depois, sem resposta nova.
443
+ - **Mesmo arquivo de novo:** não lê de novo. Reenvio na mesma conversa aponta para a leitura anterior; o mesmo
444
+ arquivo em outra conversa da conta copia a leitura.
445
+ - **Teto por conversa:** 20 documentos novos por dia.
446
+ - **Pílulas para a equipe** (mensagem de atividade, `message_type` 2), uma por leitura:
447
+ - "A IA leu o documento X (N de M páginas)"
448
+ - "A IA leu o documento X (N de M páginas, acima do teto)" — passou de 50 páginas; o resto NÃO foi lido
449
+ - "A IA leu o documento X por imagem (escaneado, N de M páginas)"
450
+ - "A IA não conseguiu ler o documento X"
451
+ - "Documento X já lido antes nesta conversa"
452
+ - "Limite de documentos lidos nesta conversa hoje atingido"
453
+ - **Documento anterior ao recurso** (chegou antes de 07/11/2026 03:00 UTC): a IA ainda consulta, mas sem pílula, sem
454
+ texto de chegada e sem a resposta sozinha depois do escaneado.
455
+
456
+ Diagnóstico "a IA não achou o valor do documento": leia a pílula da conversa
457
+ (`lionchat_conversations_messages_list`). "acima do teto" = o valor pode estar depois da página 50; escaneado com
458
+ mais de 20 páginas idem; "não conseguiu ler" = arquivo protegido, corrompido ou sem chave OpenAI para o escaneado.
459
+ Para conferir o conteúdo você mesmo, baixe o arquivo pelo `data_url` do anexo: a API não traz o texto lido.
460
+
461
+ ## Transcrição de áudio (2026-11-04)
462
+
463
+ - **Onde:** Configurações > Conta > "Transcrever Mensagens de Áudio". Desde 04/11/2026 aparece para TODA conta, com
464
+ ou sem Agente de IA (antes só com a IA). Nasce DESLIGADA e usa a chave do próprio cliente, OpenAI ou Groq,
465
+ cadastrada em Integrações: o custo é do cliente, não há chave da plataforma.
466
+ - **Pela API:** `lionchat_account_settings_update` com `audio_transcriptions: true` e
467
+ `audio_transcription_provider: "openai"` ou `"groq"` (administrador). Só funciona se a conta tiver a chave daquele
468
+ provedor; sem escolher provedor, usa a OpenAI se houver chave e depois a Groq.
469
+ - **Conversa com Agente de IA:** o áudio do cliente é transcrito para a IA responder mesmo com a opção desligada, desde
470
+ que a conta tenha a função Agente de IA.
471
+ - O texto sai em `transcribed_text` do anexo de áudio (`file_type: audio`).
472
+
404
473
  ## Anti-loop de ferramentas (custo) (2026-06)
405
474
 
406
475
  - Ferramentas (webhooks/custom tools e flows) que falham agora param sozinhas: a IA recebe aviso escalonado (1ª falha = no máximo 1 retry; 2ª+ da mesma tool = pare e siga sem ela ou transfira). Tetos por turno: 5 chamadas por ferramenta e 25 no total; ao estourar, a IA dá halt e cria nota mencionando um humano (sem desligar a IA).
@@ -465,6 +534,8 @@ Meta só aceita isso num **dataset vinculado à WABA**, nunca no pixel do site (
465
534
  não existe evento de "perdido" em mensagens. O nome interno do cliente vai em `custom_data.internal_event`.
466
535
  - **Diagnóstico "por que a venda não contou como conversão de WhatsApp?":**
467
536
  `lionchat_funnels_meta_capi_events_list` com `degraded=true` e ler `fallback_reason` + `action_source`.
537
+ Desde 09/11/2026 cada linha das 4 listas do histórico (`meta_capi_events`, `ga4_events`, `google_ads_conversions`,
538
+ `ad_read_failures`) traz `inbox_name` — a caixa de entrada da conversa do card (`null` = card sem conversa).
468
539
  Motivos nossos: `lionchat:dataset_nao_configurado` (falta o vínculo), `lionchat:caixa_token_recusado`
469
540
  (a Meta recusou a chave da caixa — reconectar a caixa), `lionchat:caixa_nao_encontrada`,
470
541
  `lionchat:caixa_sem_token`, `lionchat:dataset_id_invalido`, `lionchat:desligado_pelo_cliente`,
@@ -569,7 +640,7 @@ criar a campanha e mostre a contagem ao usuário — estimativa e disparo usam o
569
640
 
570
641
  - Reservar o MESMO contato+evento+horário de novo retorna a reserva existente (não duplica) —
571
642
  retry de rede é seguro.
572
- - Rate limit da reserva pública: 10/5min por IP + 20/min por conta (429 ao estourar).
643
+ - Rate limit da reserva pública: 10/5min por rede + 60/min por conta (429 ao estourar; era 20/min até 09/11/2026).
573
644
  - Todo agendamento aparece vinculado a uma conversa (cria/reusa a conversa do contato).
574
645
 
575
646
  ### O que mudou no agendamento DA IA (2026-08-15)
@@ -706,12 +706,12 @@ Todos os formatos abaixo foram conferidos linha a linha em `app/services/action_
706
706
  | `send_message` | `["texto da mensagem"]` |
707
707
  | `add_private_note` | `["nota interna"]` |
708
708
  | `send_canned_response` | `[12]` — id da resposta pronta |
709
- | `add_label` / `remove_label` | `["etiqueta1", "etiqueta2"]` |
709
+ | `add_label` / `remove_label` | `["etiqueta1", "etiqueta2"]`. Em `remove_label` (e `remove_contact_label`), `["__all__"]` remove TODAS as etiquetas (09/11/2026) |
710
710
  | `assign_agent` | `[70]` — o agente precisa ser membro da caixa. `["nil"]` desatribui |
711
711
  | `assign_team` | `[3]`. `["nil"]` desatribui |
712
712
  | `assign_captain_assistant` | `[17]` ou `[{"assistant_id": 17, "proactive": true}]` — `proactive` false = a IA assume mas nao fala na hora |
713
713
  | `deactivate_captain` | `[]` — desliga o AI Agente da conversa (novo 10/09/2026; a macro também tem) |
714
- | `send_email_to_team` | `[{"team_ids": [1], "message": "texto"}]` |
714
+ | `send_email_to_team` | `[{"team_ids": [1], "message": "texto"}]` — so times desta conta; time de outra conta na lista e ignorado |
715
715
  | `send_webhook_event` | `["https://..."]` |
716
716
  | `send_attachment` | `[blob_ids]` — so funciona se a regra ja tiver arquivo anexado; nao da pra montar so por API |
717
717
  | `change_status` | `["resolved"]`, `["open"]`, `["pending"]` ou `["snoozed"]` |
@@ -115,8 +115,9 @@ Attachment
115
115
  ├── file_type (string ou int)
116
116
  ├── extension
117
117
  ├── file (ActiveStorage attached)
118
- ├── transcribed_text (string, áudio/PDF)
119
- ├── meta (jsonb, ex: image_description)
118
+ ├── transcribed_text (string, SÓ áudio na resposta da API)
119
+ ├── meta (jsonb, ex: image_description; a leitura de documento (PDF, Word, planilha) mora aqui por página e NÃO
120
+ │ vem na API — o que a IA leu aparece na pílula de atividade da conversa)
120
121
  ├── width / height (pixels)
121
122
  └── file_size (bytes)
122
123
  ```
@@ -330,7 +331,7 @@ KanbanItem
330
331
  ├── conversation_display_id (FK opcional → Conversation.display_id)
331
332
  ├── item_details (jsonb — os campos da aba Campos ficam em item_details.custom_attributes, LISTA de
332
333
  │ {name, type, value}; nunca objeto {chave: valor})
333
- ├── custom_attributes (jsonb — coluna que NENHUMA tela mostra; nao confundir com a lista acima)
334
+ ├── custom_attributes (nas respostas e no webhook: {nome do campo: valor}, lido da lista acima; ao gravar, objeto {nome do campo: valor} que muda so os campos enviados)
334
335
  ├── assigned_agents (jsonb array — para gravar: lista de NUMEROS [5, 12])
335
336
  ├── linked_conversations (jsonb array de { display_id })
336
337
  ├── checklist (jsonb array de itens — NAO e tabela separada; ver abaixo)
@@ -402,8 +403,10 @@ Captain::Assistant
402
403
  │ activation_label (etiqueta que ativa o agente — unica por conta),
403
404
  │ min_response_time / max_response_time (delay humanizado, 1-60s),
404
405
  │ disabled_tools (array de IDs de tools desativadas pro assistente),
405
- │ (faq_lookup/search_articles NÃO são desligáveis — auto-gerenciadas: carregam só quando há
406
- │ FAQ/documento ou artigo publicado, e são escondidas do endpoint captain_assistants_tools)
406
+ │ (faq_lookup/search_articles/read_document NÃO são desligáveis — auto-gerenciadas e escondidas do
407
+ │ endpoint captain_assistants_tools: faq_lookup/search_articles carregam só quando há FAQ/documento ou
408
+ │ artigo publicado; read_document ("Ler Documento Recebido", 06/11/2026) fica sempre ligada e lê páginas
409
+ │ ou busca uma palavra do documento que o cliente mandou NA conversa)
407
410
  │ offer_ids / media_asset_ids / booking_event_type_ids (arrays de IDs vinculados),
408
411
  │ products (array legado de produtos)
409
412
  ├── guardrails (jsonb array de strings — limites duros injetados no prompt, ex: anti-pitch)
@@ -489,6 +492,7 @@ e `send_conversion` (`[{destinations, event_names, value}]` — só administrado
489
492
  `marketing_integrations_manage` consegue SALVAR a macro; executar segue livre; teto de 50 conversões por
490
493
  execução). Atributo protegido em `update_*_attribute` é recusado na execução (só no log). Executar
491
494
  (`lionchat_macros_execute`): até 100 conversas por chamada, a mesma conversa em 5 s é pulada em silêncio,
495
+ conversa que a pessoa não consegue abrir também é pulada em silêncio, com resposta 200,
492
496
  30 execuções por minuto por usuário (429). A mensagem de `send_canned_response` sai assinada por quem executou.
493
497
  Cada execução deixa na conversa a pílula "Macro: X executada por Fulano" (uma por conversa, 26/09) — vale
494
498
  também pelo MCP, então quem executa aparece no histórico da conversa.
@@ -540,7 +544,8 @@ AccountTask (agenda interna)
540
544
  │ que este compromisso é; índice único parcial por tratamento+número entre os NÃO cancelados (15/09)
541
545
  └── assignees (has_many → User, via account_task_assignments). Compromisso NASCIDO DE BOOKING
542
546
  (`booking_id` presente) tem responsável FIXO = o agente configurado no tipo de evento:
543
- `assignee_ids` enviado no update é IGNORADO (200, o resto da edição vale — 17/09)
547
+ `assignee_ids` enviado no update é IGNORADO (200, o resto da edição vale — 17/09), exceto
548
+ número de pessoa de outra conta, que é recusado com 422 (04/11)
544
549
 
545
550
  AgendaTreatment (tratamento em sessões — tools `agenda_treatments_*`; tabela agenda_treatments; 15/09)
546
551
  ├── id (PK) / account_id (FK) / contact_id (FK) / booking_event_type_id (FK, nullify)
@@ -252,11 +252,16 @@ pergunta com números diferentes, e o usuário conclui que o relatório está er
252
252
 
253
253
  ## 5. Busca com filtro estruturado
254
254
 
255
- `search_search` (tudo), `conversations_search`, `contacts_search`, `kanban_items_search` aceitam
255
+ `search_search` (tudo), `contacts_search`, `kanban_items_search` aceitam
256
256
  `conversation_filters`/`contact_filters` (JSON-string no MESMO shape do payload dos /filter, mesmo
257
257
  motor, cap 10 condições) e `kanban_filters` (JSON-string do subset flat da seção 3). Paginação por
258
258
  categoria: 15/página (kanban: primeiros 15, sem paginação).
259
259
 
260
+ `conversations_search` (busca no texto das mensagens) NÃO lê nenhum desses três filtros, e nunca leu: quem
261
+ mandou filtro ali recebeu a lista sem filtro achando que estava filtrada. Cada conversa da resposta já traz a
262
+ caixa (`inbox`) e o contato; situação, responsável e time NÃO vêm (confira com `conversations_show`). Para
263
+ recortar, ela aceita `inbox_id` e `team_id` (lista e números) e `assignee_type` (só a lista); a situação é ignorada.
264
+
260
265
  ## 6. Respostas: enxutas por padrão + paginação
261
266
 
262
267
  - **Slim (2026-07-24, default LIGADO):** listas voltam SEM campos pesados/decorativos
@@ -404,7 +404,8 @@ só pra destravar, ela pode sair.
404
404
  | `conversation_has_agent` / `conversation_no_agent` / `conversation_not_agent` | agente atribuído (HUMANO) |
405
405
  | `conversation_has_ai_agent` / `conversation_no_ai_agent` / `conversation_not_ai_agent` | agente de IA atribuído (novo 2026-08-01) — ver abaixo |
406
406
  | `contact_has_label` / `contact_no_label` / `conversation_has_label` / `conversation_no_label` | labels |
407
- | `kanban_exists` / `kanban_in_stage` / `kanban_won` / `kanban_lost` | card no funil. `funnel_id` é CHAVE SEPARADA da condição (número, ex.: `"funnel_id": 37`). A etapa vai em `value` (slug puro da etapa, ex.: `"avaliacao_aceita"`) ou em `stage` — NÃO no formato `"37:etapa"`. Ex.: `{ "operator": "kanban_in_stage", "funnel_id": 37, "value": "avaliacao_aceita" }` |
407
+ | `kanban_exists` / `kanban_in_stage` / `kanban_won` / `kanban_lost` | card no funil. `funnel_id` é CHAVE SEPARADA da condição (número, ex.: `"funnel_id": 37`). A etapa vai em `value` (slug puro da etapa, ex.: `"avaliacao_aceita"`) ou em `stage` — NÃO no formato `"37:etapa"`. Ex.: `{ "operator": "kanban_in_stage", "funnel_id": 37, "value": "avaliacao_aceita" }`. **Várias etapas (09/11/2026):** `kanban_in_stage` aceita `stages: ["qualificado", "contrato_enviado"]` — casa se o card estiver em QUALQUER uma (o `stage` antigo é somado). |
408
+ | `conversation_has_team` / `conversation_not_team` / `conversation_no_team` | equipe da conversa (09/11/2026 — o que a tela grava em "Em equipe"). `field: "{{conversation.team_id}}"`, `valueType: "team"`, `values: ["24","25"]`. `values` VAZIO: `has_team` = tem QUALQUER equipe, `not_team` = sem equipe. `conversation_no_team` = preset "Sem equipe" (sem values). O `equal`/`not_equal` antigo segue funcionando |
408
409
  | `kanban_snoozed` (11/10/2026) | card ADIADO no funil — `field: '_kanban_status'`, `funnel_id` separado, igual às irmãs `kanban_won`/`kanban_lost` (mesma regra do card que iniciou o fluxo). Não existe condição "card aberto" |
409
410
  | `card_attr_equals` / `card_attr_contains` | atributo do card (`attrSource: 'card'` + `attr_key`; aceita `card_source: 'trigger'` p/ ler o card que iniciou o flow) |
410
411
  | `pagetrack_visited` / `pagetrack_event` | LionTrack |
@@ -581,9 +582,9 @@ o botão "Usar variável" ao lado do campo alterna lista fixa ↔ variável.
581
582
  | `change_status` | `{ status: 'open' \| 'resolved' \| 'pending' \| 'snoozed' }` | Muda status da conversa |
582
583
  | `change_priority` | `{ priority: 'urgent' \| 'high' \| 'medium' \| 'low' }` | Muda prioridade |
583
584
  | `add_label` | `{ labels: ['slug1', 'slug2'] }` | Adiciona labels ao CONTATO |
584
- | `remove_label` | `{ labels: ['slug'] }` | Remove labels do CONTATO |
585
+ | `remove_label` | `{ labels: ['slug'] }` | Remove labels do CONTATO. `labels: ['__all__']` = remove TODAS (09/11/2026) |
585
586
  | `add_conversation_label` | `{ labels: ['slug'] }` | Adiciona labels à CONVERSA (não ao contato) |
586
- | `remove_conversation_label` | `{ labels: ['slug'] }` | Remove labels da CONVERSA |
587
+ | `remove_conversation_label` | `{ labels: ['slug'] }` | Remove labels da CONVERSA. `labels: ['__all__']` = remove TODAS (09/11/2026) |
587
588
  | `mute_conversation` | `{}` | Silencia notificações |
588
589
  | `mark_unread` | `{}` | Marca a conversa como NÃO LIDA pro time (espelho do `mute_conversation`; típico logo após `assign_agent`/`assign_team` numa transferência) |
589
590
  | `add_private_note` | `{ text: 'texto' }` | Adiciona nota interna. **A chave é `text`** — é a que o formulário do bloco lê (`v-model="item.config.text"`). Até 04/09 esta linha dizia `content`, e por isso 56 blocos de 8 contas abriam VAZIOS na tela: a nota era gravada (o motor tem rede) mas ninguém conseguia ler nem editar o texto. `content` continua sendo aceito e normalizado para `text` na gravação |
@@ -693,7 +694,9 @@ o botão "Usar variável" ao lado do campo alterna lista fixa ↔ variável.
693
694
 
694
695
  **`update_attribute` — campos EXATOS:** `attr_source` (`'contact'`, `'conversation'` ou `'card'`), `attr_key` (nome do atributo), `attr_value` (valor). NÃO existem `entity`/`key`/`value` — esses são ignorados e não salvam nada.
695
696
 
696
- **Coerção por TIPO (2026-07-29):** em `attr_source: 'contact'|'conversation'`, o `attr_value` de atributo personalizado é coagido pelo tipo da definição antes de gravar: número/moeda/porcentagem viram numérico ("1.234,56" → 1234.56; inteiro fica inteiro), checkbox aceita sim/não/true/false e grava BOOLEANO, lista casa caixa-insensível e grava a opção canônica, data aceita DD/MM/AAAA ou ISO, hora aceita "14:30"/"14h30". Valor irreconhecível grava como veio e o passo mostra nota âmbar no histórico. Card NÃO coage (atributo de card não tem definição tipada no backend).
697
+ **Conferência por TIPO (2026-11-04):** `attr_value` de atributo personalizado, em contato, conversa e card, só é gravado se servir para o tipo do campo: número, moeda e porcentagem usam ponto no milhar e vírgula no decimal ("1.234,56" → 1234.56), caixa de seleção aceita sim/não/true/false, lista não diferencia maiúscula e grava a opção cadastrada, data aceita DD/MM/AAAA ou ISO, hora aceita "14:30" ou "14h30". Valor errado NÃO grava: o campo fica como estava, o passo fica vermelho com o motivo no histórico e o fluxo segue. Variável vazia: passo âmbar, nada gravado.
698
+
699
+ **Card (2026-11-04):** `attr_source: 'card'` grava em `item_details.custom_attributes`, a lista que a seção "Atributos do Card" mostra. `attr_key` aceita o nome do campo ou o apelido (`valor_total`). Campo que não existe em `kanban_config.global_custom_attributes` é CRIADO como Texto, para a conta inteira, com nota no histórico: confira o nome antes, porque chave errada cria um campo novo. Conversa sem card: passo âmbar, nada gravado. Conta (Somar, Subtrair) não é oferecida em campo do card.
697
700
 
698
701
  **Empresa e Cargo (2026-09-25):** `contact.company_name` e `contact.job_title` valem em CONDIÇÃO (`attr_source: 'contact'`, `attr_key` igual ao path), em filtro de regras e como variável (`{{contact.company_name}}`, `{{contact.job_title}}`). São SÓ LEITURA: a ação "Alterar atributo do contato" NÃO grava esses dois (o texto Empresa anda junto com a empresa vinculada — para ligar a empresa use `lionchat_contacts_update` com `company_id`).
699
702
 
@@ -634,7 +634,8 @@ as outras duas seguem aplicadas. Não prometa essa permissão ao cliente sem con
634
634
  (`conversation_mode: "group"`), o start pode ter o item `{ "key": "group_participant_joined", "config": {
635
635
  "group_match": "any", "group_name": "", "group_ids": [] } }`. Filtro OPCIONAL de quais grupos disparam:
636
636
  `group_match` (`any` padrão, ou os mesmos operadores do "Buscar por nome": `contains`, `equal_to`, `starts_with`,
637
- `ends_with`, `does_not_contain`, `not_equal_to`) + `group_name`, e/ou `group_ids` (mira exata por id — casa por
637
+ `ends_with`, `does_not_contain`, `not_equal_to`) + `group_names` (lista, 09/11/2026: nos operadores positivos basta UM
638
+ nome casar; em `does_not_contain`/`not_equal_to` NENHUM pode casar; o `group_name` antigo, texto, é somado), e/ou `group_ids` (mira exata por id — casa por
638
639
  dígitos, aceita `1203...@g.us` ou só o número). Quando alguém entra, o `send_message` seguinte cai **no próprio
639
640
  grupo** (o grupo é a conversa do flow).
640
641
 
@@ -92,7 +92,7 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
92
92
  | `image` | Foto / imagem (JPG, PNG, etc) |
93
93
  | `audio` | Áudio (geralmente vem com `transcribed_text` preenchido) |
94
94
  | `video` | Vídeo |
95
- | `file` | PDF, DOCX, qualquer outro (pode vir com `extracted_text` se for processado) |
95
+ | `file` | PDF, DOCX, planilha, qualquer outro. O texto lido pela IA NÃO vem na API (não existe `extracted_text` na resposta) |
96
96
  | `location` | Coordenadas GPS |
97
97
  | `contact` | vCard |
98
98
  | `share` | Link compartilhado |
@@ -101,7 +101,10 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
101
101
 
102
102
  ### Campos importantes
103
103
  - `data_url`: URL pra baixar o arquivo (válida por tempo limitado)
104
- - `transcribed_text`: transcrição (áudio) ou texto extraído (PDF/imagem com OCR)
104
+ - `transcribed_text`: transcrição do áudio (só `audio` traz este campo na API)
105
+ - Documento lido pela IA (PDF, Word, planilha, desde 06/11/2026): o texto fica guardado no próprio anexo e NÃO
106
+ vem na API. O que ela leu aparece na pílula de atividade da conversa (ver `lionchat://docs/best-practices`,
107
+ seção "Documento que o cliente manda")
105
108
  - `meta.image_description`: descrição gerada pela IA (cache, se disponível)
106
109
  - `file_size`: bytes
107
110
  - `width`/`height`: pixels (imagens/vídeos)
@@ -423,7 +426,7 @@ mandar). Detalhes em `lionchat://docs/best-practices`.
423
426
  |---|---|---|
424
427
  | Motivo de Ganho/Perda do card | `kanban_config.win_reasons` / `loss_reasons` | ❌ NÃO |
425
428
  | Atributo em TODO card | `kanban_config.global_custom_attributes` | só se não couber acima |
426
- | Valor de um campo em UM card | `item_details.custom_attributes` — LISTA `[{name, type, value}]` casando com o campo de `kanban_config.global_custom_attributes` | a coluna `kanban_item.custom_attributes` NÃO aparece em tela nenhuma — não use pra dado que o cliente precisa ver |
429
+ | Valor de um campo em UM card | Grave com `kanban_item.custom_attributes` — objeto `{nome do campo: valor}`, só os campos enviados mudam; o valor vai para a lista `item_details.custom_attributes` (`[{name, type, value}]`), a que a tela Atributos do Card mostra | objeto dentro de `item_details.custom_attributes` é ignorado: não grava |
427
430
  | CPF, RG, CNPJ, endereço, data nasc., gênero do cliente | mecanismo NATIVO cadastral: `PATCH /contacts/{id}/cadastral` (`update_cadastral`) | ❌ NÃO (tem nativo) |
428
431
  | Tag pro contato (residencial, empresarial) | `labels` | ✅ SIM via Label |
429
432
  | Etapa do funil | `funnel.stages` | ❌ NÃO |
@@ -672,3 +675,7 @@ Ramal sem cadastro não gera registro — se o cliente diz que "liguei e não ap
672
675
  ### Erros do envio (`signature_envelopes_create`): `variaveis_sem_valor` (+ `missing[]`), `escolher_caixa` (+ `inboxes[]`),
673
676
  `entrega_falhou`, `sem_caixa_whatsapp`, `telefone_invalido`, `limite_do_mes`, `cpf_invalido`, `funcionalidade_desligada`,
674
677
  `fila_cheia` (fila única de conversão do Word cheia — repetir em instantes), `conversor_indisponivel` (o serviço de conversão de Word não respondeu — repetir em instantes).
678
+
679
+ ### Juiz do Supervisor (novo 2026-11-04)
680
+
681
+ Não tem relação com "Supervisor de caixa" nem "Supervisor de time", que são papéis de pessoa. **Supervisor de IA** é a tela que compara as IAs, e **juiz** é a análise que um administrador inicia por botão ali: outra IA lê as conversas e responde sobre cada uma (nota, disse e não fez, não soube responder, o que travou, objeções, quanto seguiu o cenário). Ele só lê e não muda a conversa. Pelo conector dá para consultar o resultado (`lionchat_captain_judge_runs_*`), mas não iniciar. Detalhes em `reports-guide`.
@@ -164,7 +164,7 @@ dos cards já marcados); lista de textos soltos, motivo sem `id`/`title` ou `id`
164
164
  | Atributo que aparece em TODO card | `kanban_config.global_custom_attributes` | ❌ custom_attribute de conversation |
165
165
  | Atributo só de um contato (CPF, endereço) | `custom_attribute_definitions` model=contact_attribute | ❌ kanban_config |
166
166
  | Atributo só de uma conversa (motivo, tag interna) | `custom_attribute_definitions` model=conversation_attribute | ❌ kanban_config |
167
- | Valor de um campo num card (aparece na aba Campos) | `item_details.custom_attributes` — LISTA `[{name, type, value}]`, com o campo definido em `kanban_config.global_custom_attributes` | ❌ `kanban_item.custom_attributes` (coluna que nenhuma tela mostra) |
167
+ | Valor de um campo num card (aparece em Atributos do Card) | `kanban_item.custom_attributes` — objeto `{nome do campo: valor}`, só os campos enviados mudam | ❌ objeto dentro de `item_details.custom_attributes` (é ignorado, não grava) |
168
168
 
169
169
  ### KanbanItem (Card)
170
170
  Um card individual dentro de uma etapa.
@@ -180,7 +180,7 @@ Um card individual dentro de uma etapa.
180
180
  | `origin_conversation_display_id` | Conversa em que o card NASCEU (só preenchida se o vínculo já foi movido). É o que o relatório de origem de lead usa, pra uma venda não mudar de mês nem de anúncio quando o card anda. |
181
181
  | `linked_conversations` | jsonb array `[{display_id: 123}, {display_id: 456}]` — múltiplas conversas |
182
182
  | `item_details` | jsonb (ver abaixo) |
183
- | `custom_attributes` | jsonb (coluna própria) — **NÃO aparece na aba Campos, no filtro do quadro nem na busca**. Os campos visíveis do card moram em `item_details.custom_attributes` (ver abaixo) |
183
+ | `custom_attributes` | Ao LER (conversa, contato, webhook): `{nome do campo: valor}`, tirado da lista `item_details.custom_attributes`. Ao GRAVAR: objeto `{nome do campo: valor}`, só os campos enviados mudam, e campo que não existe é criado como Texto (ver abaixo). Um lugar só desde 04/11/2026: a lista, que a tela Atributos do Card mostra. |
184
184
  | `assigned_agents` | jsonb array de agentes responsáveis |
185
185
  | `activities` | jsonb array — log de atividades |
186
186
  | `checklist` | **O que fica guardado:** jsonb array de tarefas do card (item: `text`/`completed`/`position` + `group_id`/`group_name` opcionais para agrupar). **O que a API devolve é OUTRA coisa** — ver o aviso logo abaixo |
@@ -233,16 +233,13 @@ Um card individual dentro de uma etapa.
233
233
  **`value`** é onde fica o valor monetário do negócio (usado em pipelines). Sempre NÚMERO — texto quebra a
234
234
  soma das colunas.
235
235
 
236
- **`custom_attributes` é uma LISTA, nunca um objeto `{chave: valor}`** (conferido no código em 18/09/2026).
237
- Cada item é `{name, type, value}` e só aparece na aba Campos se `name` **e** `type` baterem exatamente com
238
- um campo de `kanban_config.global_custom_attributes` (leia com `lionchat_kanban_config_list`).
236
+ **Os campos do card moram em UM lugar: a lista `item_details.custom_attributes`, a que a tela Atributos do Card mostra** (04/11/2026). Cada item é `{name, type, value}`.
239
237
 
240
- Como gravar pelo `lionchat_kanban_items_update` (`kanban_item.item_details`):
241
- - O `item_details` é MESCLADO só no 1º nível: cada chave enviada **troca a chave inteira** no card. Por isso
242
- a lista `custom_attributes` enviada **substitui a lista toda** — leia o card com `lionchat_kanban_items_show`
243
- e reenvie TODOS os campos, com o alterado.
244
- - Mandar objeto (`{"origem_lead": "Facebook Ads"}`) no lugar da lista **APAGA todos os campos do card**: o
245
- servidor só aceita itens `{name, type, value}` e o objeto vira vazio.
238
+ Como gravar pelo `lionchat_kanban_items_update` ou `_create`:
239
+ - **O jeito simples: `kanban_item.custom_attributes`, objeto `{nome do campo: valor}`.** Só os campos enviados mudam; os outros ficam. Campo que não existe é criado como Texto, para a conta inteira (confira o nome com `lionchat_kanban_config_list` antes: erro de digitação vira campo novo). `null` ou `""` apaga aquele campo.
240
+ - **`kanban_item.item_details.custom_attributes`, LISTA `[{name, type, value}]`, substitui a lista toda**: o `item_details` é MESCLADO só no 1º nível, e cada chave enviada troca a chave inteira no card. Leia o card antes e reenvie todos os campos. Nome novo com valor vira campo Texto. `[]` limpa a lista.
241
+ - **Objeto dentro de `item_details.custom_attributes` é IGNORADO:** não grava, não apaga, não cria campo, e o resto do pedido é salvo. É o que o card guarda quando nasce de "Criar card" (cópia dos dados da conversa), e devolver o card lido não pode criar campo nenhum.
242
+ - Texto ou lista em `kanban_item.custom_attributes` e, em `item_details.custom_attributes`, texto ou número no lugar da lista, item que não seja objeto, objeto no `value` e valor sem `name` em texto recusam o pedido inteiro com 422, e a mensagem ensina o formato.
246
243
  - Lista fechada de chaves do `item_details` (outras são descartadas em silêncio): title, description, status,
247
244
  reason, win_reason, loss_reason, attributed_to, co_attributed_to (13/10/2026, ver "Co-participante da venda"),
248
245
  duplicated_from_id, priority, value, currency, custom_attributes, offers, closed_offers, closed_offer, deadline_at,
@@ -743,14 +740,12 @@ Cada card pode receber atributos custom de 3 origens diferentes. **A escolha do
743
740
  - É o que a aba **Campos** do card mostra e edita (e o que o filtro do quadro, a busca e o fluxo leem)
744
741
  - LISTA de `{name, type, value}`; `name` + `type` precisam bater com um campo do item 2 abaixo, senão o
745
742
  valor fica gravado e **não aparece**
746
- - Grava via `kanban_items_update` em `kanban_item.item_details.custom_attributes` — a lista enviada
747
- **substitui a inteira** (leia o card antes e reenvie tudo). Objeto `{chave: valor}` no lugar da lista
748
- **apaga** os campos do card
749
- - Um campo só, sem reenviar a lista: ação `update_card_attribute` da automação/macro
750
-
751
- > **NÃO confundir com a coluna `kanban_item.custom_attributes`** (objeto `{chave: valor}` direto no card):
752
- > nenhuma tela a mostra — nem a aba Campos, nem o filtro, nem a busca. Só a ação "Alterar atributo do card"
753
- > do FlowBuilder e a leitura do fluxo a usam. Para o cliente ver o dado, use a lista acima.
743
+ - Grava via `kanban_items_update`: `kanban_item.custom_attributes` (`{nome do campo: valor}`) muda só os campos
744
+ enviados; `kanban_item.item_details.custom_attributes` (lista) **substitui a inteira**. Objeto dentro de
745
+ `item_details.custom_attributes` é ignorado: não grava
746
+ - Um campo só também pela ação `update_card_attribute` da automação/macro
747
+
748
+ > **Um lugar só:** desde 04/11/2026 `kanban_item.custom_attributes` grava nessa mesma lista, campo a campo. Antes guardava numa coluna que nenhuma tela mostrava.
754
749
 
755
750
  ### 2. `kanban_config.global_custom_attributes` (atributos globais do Kanban)
756
751
 
@@ -1002,3 +1002,8 @@ Em `agent_report` e `calls_report`, `scope_type: 'inbox'` + `scope_id` recorta *
1002
1002
  caixa: membros da caixa contando SÓ o que fizeram nela (era o defeito dos relatórios por médico
1003
1003
  saírem iguais). `'agent'`/`'team'` seguem sendo recorte de PESSOAS (trabalho na conta inteira);
1004
1004
  `'inbox'` + `dimension: 'team'` é recusado. E `lead_origin` passou a respeitar `time_range`.
1005
+
1006
+ ## Juiz do Supervisor
1007
+
1008
+ `lionchat_captain_judge_runs_results` traz, por IA, o que o juiz respondeu nas conversas já analisadas: nota, disse e não fez, não soube responder, o que travou, objeções e a média de quanto a IA seguiu cada cenário. `lionchat_captain_judge_runs_conversations` abre as conversas por trás de um número, e `lionchat_captain_judge_runs_current` mostra o andamento. São só leitura. A análise é iniciada pelo botão do Supervisor no painel, por um administrador: não há ferramenta para iniciar. Sempre traga os avisos de `warnings`, e não trate a resposta do juiz como fato: ela é uma avaliação e pode errar.
1009
+