@lionchat/mcp-server 0.3.2 → 0.4.1

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
@@ -142,9 +142,12 @@ export class LionChatClient {
142
142
  const { method, path, body } = options;
143
143
  // AIDEV-NOTE: Build full URL (query params already embedded in path by tools.ts)
144
144
  const url = this.buildUrl(path);
145
- // AIDEV-NOTE: Build headers — api_access_token on all requests
145
+ // AIDEV-NOTE: Build headers — api_access_token + User-Agent on all requests.
146
+ // User-Agent permite o Rails detectar a origem em AccessTokenAuthHelper#detect_mcp_audit_source
147
+ // e anotar o audit log via Current.audit_source.
146
148
  const headers = {
147
149
  api_access_token: this.config.apiToken,
150
+ 'User-Agent': `@lionchat/mcp-server/${this.config.version}`,
148
151
  };
149
152
  const hasBody = body && ['POST', 'PATCH', 'PUT', 'DELETE'].includes(method.toUpperCase());
150
153
  if (hasBody) {
@@ -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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"}
package/dist/config.d.ts CHANGED
@@ -4,5 +4,6 @@ export interface Config {
4
4
  baseUrl: string;
5
5
  categories: string[] | null;
6
6
  includePublicApi: boolean;
7
+ version: string;
7
8
  }
8
9
  export declare function loadConfig(): Config;
package/dist/config.js CHANGED
@@ -52,6 +52,7 @@ export function loadConfig() {
52
52
  baseUrl,
53
53
  categories: parseCategories(categoriesRaw),
54
54
  includePublicApi: includePublicApiRaw === 'true' || includePublicApiRaw === '1',
55
+ version: getCliArg('version-override') ?? process.env.LIONCHAT_MCP_VERSION ?? 'unknown',
55
56
  };
56
57
  }
57
58
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,mFAAmF;AAUnF,2FAA2F;AAC3F,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,2DAA2D;QAC3D,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GACZ,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC;IAEpE,MAAM,SAAS,GACb,SAAS,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAEvE,MAAM,OAAO,GACX,SAAS,CAAC,UAAU,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,6BAA6B,CAAC;IAEhC,MAAM,aAAa,GACjB,SAAS,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAE1E,MAAM,mBAAmB,GACvB,SAAS,CAAC,oBAAoB,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,SAAS,CAAC;IAEZ,sEAAsE;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,0CAA0C;YACxC,gEAAgE;YAChE,6CAA6C,CAChD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,2CAA2C;YACzC,uEAAuE;YACvE,qDAAqD,CACxD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS;QACT,OAAO;QACP,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC;QAC1C,gBAAgB,EACd,mBAAmB,KAAK,MAAM,IAAI,mBAAmB,KAAK,GAAG;KAChE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,mFAAmF;AAanF,2FAA2F;AAC3F,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,2DAA2D;QAC3D,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GACZ,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC;IAEpE,MAAM,SAAS,GACb,SAAS,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAEvE,MAAM,OAAO,GACX,SAAS,CAAC,UAAU,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,6BAA6B,CAAC;IAEhC,MAAM,aAAa,GACjB,SAAS,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAE1E,MAAM,mBAAmB,GACvB,SAAS,CAAC,oBAAoB,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,SAAS,CAAC;IAEZ,sEAAsE;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,0CAA0C;YACxC,gEAAgE;YAChE,6CAA6C,CAChD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,2CAA2C;YACzC,uEAAuE;YACvE,qDAAqD,CACxD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS;QACT,OAAO;QACP,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC;QAC1C,gBAAgB,EACd,mBAAmB,KAAK,MAAM,IAAI,mBAAmB,KAAK,GAAG;QAC/D,OAAO,EAAE,SAAS,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,SAAS;KACxF,CAAC;AACJ,CAAC"}
@@ -78,6 +78,42 @@ Account (conta/empresa)
78
78
  - `display_id`: número visível na UI da conversa (use este pra falar com humanos)
79
79
  - `source_id`: ID externo da plataforma origem (ex: `wamid.xxx` do WhatsApp)
80
80
 
81
+ ### Body wrapper — CRÍTICO
82
+
83
+ A maioria dos POST/PUT/PATCH exige o body **wrapped no nome do recurso** (padrão Rails strong params). Sem o wrapper retorna HTTP 500 silencioso.
84
+
85
+ ```json
86
+ PUT /api/v1/accounts/43/kanban_config
87
+ { "kanban_config": { "win_reasons": [...] } } ✅
88
+
89
+ { "win_reasons": [...] } ❌ 500
90
+ ```
91
+
92
+ Como saber: se o param da tool no MCP tem ponto no nome (`kanban_config.win_reasons`, `funnel.name`), o body precisa do wrapper. Sem ponto (`message`, `phone`), vai raiz.
93
+
94
+ Detalhes completos em `lionchat://docs/api-conventions` → "Wrapper de body".
95
+
96
+ ### Regras de formato silenciosas
97
+
98
+ - **Label.title**: kebab-case ou snake_case, **SEM espaço**. `"Lead Emive"` ❌ → `"lead-emive"` ✅
99
+ - **win_reasons / loss_reasons**: array de `{id, title}`, NÃO strings
100
+ - **linked_conversations**: array de `{display_id: N}`, NÃO inteiros direto
101
+ - **phone**: E.164 (`+5511...`), sem espaços/parênteses
102
+ - **funnel.stages** keys: snake_case slug
103
+
104
+ ### Native first
105
+
106
+ Antes de criar um `custom_attribute`, cheque se a feature já tem campo NATIVO:
107
+
108
+ | Quero | Use o nativo | NÃO crie custom_attribute |
109
+ |---|---|---|
110
+ | Motivos de Ganho/Perda | `kanban_config.win_reasons` / `loss_reasons` | ❌ |
111
+ | Checklist reusável | `kanban_config.checklist_templates` | ❌ |
112
+ | Automação ganho→outro funil | `funnel.settings.automations` action `duplicate_to_funnel` | ❌ |
113
+ | Tag transversal | `Label` | ❌ |
114
+
115
+ Mais em `lionchat://docs/glossary` → "Quando usar campo nativo vs custom_attribute".
116
+
81
117
  ## 4. Workflows típicos
82
118
 
83
119
  ### Listar conversas abertas
@@ -19,6 +19,108 @@ Pra você via MCP: tudo já tá resolvido. O servidor MCP injeta o token correto
19
19
 
20
20
  Tokens são **por usuário**, não por conta. O mesmo token funciona em qualquer conta que o usuário tem acesso. O scoping por conta acontece via `account_id` no path.
21
21
 
22
+ ## Wrapper de body — REGRA CRÍTICA
23
+
24
+ A maioria dos endpoints `POST/PUT/PATCH` espera o body **wrapped no nome do recurso**, herdando o padrão `params.require(:recurso).permit(...)` do Rails strong params.
25
+
26
+ ### Padrão geral
27
+
28
+ ```http
29
+ PUT /api/v1/accounts/43/kanban_config
30
+ Content-Type: application/json
31
+
32
+ {
33
+ "kanban_config": {
34
+ "win_reasons": [...],
35
+ "enabled": true
36
+ }
37
+ }
38
+ ```
39
+
40
+ **Se você manda `{"win_reasons": [...]}` direto (sem o wrapper) → HTTP 500 silencioso.** Rails levanta `ActionController::ParameterMissing` que vira 500 sem mensagem útil.
41
+
42
+ ### Recursos que exigem wrapper
43
+
44
+ | Endpoint | Wrapper |
45
+ |---|---|
46
+ | `POST/PUT /kanban_config` | `kanban_config: {...}` |
47
+ | `POST/PATCH /funnels` | `funnel: {...}` |
48
+ | `POST/PUT /kanban_items` | `kanban_item: {...}` |
49
+ | `POST/PATCH /contacts` | `contact: {...}` |
50
+ | `POST/PATCH /conversations` | `conversation: {...}` ou direto (varia) |
51
+ | `POST/PATCH /custom_attribute_definitions` | sem wrapper (params raiz) |
52
+ | `POST/PATCH /labels` | sem wrapper |
53
+ | `POST /captain/copilot_threads` | sem wrapper (params raiz: `message`, `assistant_id`) |
54
+ | `POST /voip/settings/create_child_account` | sem wrapper (raiz: `nome`, `login`, `senha`) |
55
+
56
+ ### Como saber se precisa wrapper?
57
+
58
+ 1. **Olha o nome do tool no MCP** — params nomeados `recurso.campo` (com ponto) significa que precisa wrapper.
59
+ 2. Params nomeados sem ponto (`message`, `phone`, `title`) ficam direto no body raiz.
60
+ 3. Em caso de dúvida: tentar **com wrapper primeiro** (mais comum). Se 500, tentar sem.
61
+
62
+ ### Exemplo de listas dentro de wrapper
63
+
64
+ `kanban_config.win_reasons` espera array de **objetos** `{id, title}`, NÃO strings:
65
+
66
+ ```json
67
+ {
68
+ "kanban_config": {
69
+ "win_reasons": [
70
+ {"id": "wr-1", "title": "Preço competitivo"},
71
+ {"id": "wr-2", "title": "Indicação forte"}
72
+ ]
73
+ }
74
+ }
75
+ ```
76
+
77
+ Quando você envia uma lista, ela **substitui** a anterior por inteiro (não faz merge). Pra preservar, leia primeiro com GET.
78
+
79
+ ## Restrições de formato em campos comuns
80
+
81
+ Antes de criar/atualizar recurso, lembre dessas regras silenciosas:
82
+
83
+ ### `Label.title` — kebab-case, SEM espaço
84
+
85
+ Validação: regex `\A[\p{L}\p{N}\-_]+\z` (letras Unicode, números, hífen, underscore). **Espaço quebra**.
86
+
87
+ ```
88
+ ✅ "lead-emive"
89
+ ✅ "cliente_premium"
90
+ ✅ "vip"
91
+ ❌ "Lead Emive" → 422 "Title nao e valido"
92
+ ❌ "Lead/Indicação" → 422
93
+ ```
94
+
95
+ Recomendação: usar kebab-case (`lead-emive`). Na UI o usuário vê o título como digitado.
96
+
97
+ ### `CustomAttributeDefinition.attribute_key` — snake_case (slug)
98
+
99
+ Aceita: letras, números, underscore, hífen e ponto. Sem espaço. Convenção: snake_case (`motivo_de_ganho`, `data_de_nascimento`).
100
+
101
+ ### Phone numbers — formato E.164
102
+
103
+ `+<código país><DDD><número>`. Brasil: `+5511999999999` (13 dígitos com 9). Sem espaços, sem parênteses, sem hífen.
104
+
105
+ WAHA tem endpoint `/integrations/waha/check_phone?phone=+55...` que retorna o número CORRIGIDO (especialmente útil pra fixar o 9º dígito BR).
106
+
107
+ ### `funnel.stages` — keys snake_case
108
+
109
+ ```json
110
+ {
111
+ "novo_lead": {"name": "Novo Lead", "color": "#3b82f6", "position": 1}
112
+ }
113
+ ```
114
+
115
+ A KEY é o slug interno (`novo_lead`). O `name` é o que aparece na UI ("Novo Lead"). Slug não pode ter espaço — use underscore.
116
+
117
+ ### `KanbanItem.linked_conversations` — array de objetos
118
+
119
+ ```
120
+ ✅ [{"display_id": 123}, {"display_id": 456}]
121
+ ❌ [123, 456] → TypeError no as_json (já causou bug em produção)
122
+ ```
123
+
22
124
  ## Paginação
23
125
 
24
126
  ### Query params padrão
@@ -164,3 +164,72 @@ Pergunte primeiro:
164
164
  - Enviar mensagem pra cliente
165
165
  - Mudar status de várias conversas em massa
166
166
  - Alterar configuração de conta/inbox
167
+
168
+ ## Como achar a tool certa quando o nome colide
169
+
170
+ Os IDs das tools são gerados automaticamente a partir do path e da categoria. Quando dois paths mapeiam pro mesmo nome base, o segundo ganha sufixo `_1`, terceiro `_2`, etc. Isso gera muita colisão — exemplos reais:
171
+
172
+ - `lionchat_ecommerce_webhooks_list` tem **19 variantes** (Eduzz, Kiwify, Ticto, Custom, etc. + sub-recursos events/retry_preflight)
173
+ - `lionchat_captain_assistants_create` tem **10 variantes** (assistants, scenarios, assistant_responses, tasks/follow_up, copilot_threads...)
174
+ - `lionchat_contacts_create` tem 9 variantes (contato, notas, contact_inboxes, labels...)
175
+
176
+ ### Como decidir qual usar
177
+
178
+ 1. **Leia a `description`** de cada tool — ela explica o que faz, não importa o nome
179
+ 2. **Olhe o `path`** — diferencia o que o nome não diferencia (ex: `/contacts/{id}/notes` vs `/contacts`)
180
+ 3. **Olhe `category` / `sub`** — agrupa por funcionalidade
181
+ 4. Se não souber o path, faça uma busca: liste todas as tools que começam com `lionchat_<base>_` e leia as descriptions
182
+ 5. Em caso de dúvida REAL: pergunte ao usuário em vez de chutar
183
+
184
+ ### Padrão de naming convention
185
+
186
+ | Sufixo | O que sinaliza |
187
+ |---|---|
188
+ | `_list` | Lista paginada do recurso |
189
+ | `_show` | Detalhe de UM recurso por ID |
190
+ | `_create` | Cria recurso (geralmente POST) |
191
+ | `_update` | Atualiza (PUT/PATCH) |
192
+ | `_destroy` | Deleta |
193
+ | `_search` | Busca textual |
194
+ | `_filter` | Filtro complexo via POST body |
195
+ | `<recurso>_<sub>_<acao>` | Acao em sub-recurso (ex: `contacts_labels_create`) |
196
+ | `_1`, `_2`, `_3`... | Colisão — leia descriptions pra desambiguar |
197
+
198
+ ## Native first — antes de criar custom_attribute, cheque se existe campo nativo
199
+
200
+ LionChat tem vários conceitos com modelos próprios na plataforma. Custom attribute é **último recurso** — útil quando não tem modelo dedicado. Antes de criar um custom_attribute, pergunte:
201
+
202
+ 1. **Esse conceito tem UI dedicada?** Se sim, provavelmente tem campo nativo.
203
+ 2. **Outros funis/contas usam isso de forma similar?** Se sim, provavelmente é uma feature nativa.
204
+ 3. **A doc menciona o nome desse conceito?** (Ver `glossary.md` → tabela "Quando usar campo nativo vs custom_attribute")
205
+
206
+ ### Tabela rápida de decisão
207
+
208
+ | Quero | NÃO faça | Faça |
209
+ |---|---|---|
210
+ | Motivo de Ganho/Perda do card | criar custom_attribute "Motivo de Ganho" | popular `kanban_config.win_reasons` |
211
+ | Checklist reusável em vários cards | criar custom_attribute lista | popular `kanban_config.checklist_templates` + automação `apply_checklist_template` |
212
+ | Automação "ao Ganhar → criar card noutro funil" | regra AutomationRule complexa | popular `funnel.settings.automations` com `action: duplicate_to_funnel` |
213
+ | Atributo em todo card | criar 1 custom_attribute pra cada funil | popular `kanban_config.global_custom_attributes` (vale pra todos) |
214
+ | Cadastrar CPF do contato | usar campo do funil | criar `custom_attribute_definitions` model=contact_attribute |
215
+ | Tag "cliente residencial" | criar custom_attribute | criar `Label` |
216
+ | Etapa do funil | criar custom_attribute "Status" | usar `funnel.stages` |
217
+
218
+ ### Por que isso importa
219
+
220
+ Quando você usa o campo nativo:
221
+ - A UI já tem suporte (dropdown, filtros, relatórios automáticos)
222
+ - Métricas oficiais aparecem nos relatórios
223
+ - Webhooks emitem eventos específicos (`status_changed`, `stage_changed`)
224
+ - Permissões e validações funcionam fora da caixa
225
+
226
+ Custom attribute em lugar errado vira:
227
+ - Campo perdido na lateral da conversa que ninguém preenche
228
+ - Dado solto que não conecta com automação nem relatório
229
+ - Duplicação com a feature nativa (vendedor confuso entre 2 lugares pra mesma coisa)
230
+
231
+ ### Como descobrir se existe campo nativo
232
+
233
+ 1. Procure no `kanban-deep-dive.md` (Kanban) ou na doc da feature relevante
234
+ 2. Liste o config global do recurso (`kanban_config_list`, `voip_settings_list`, etc) — campos `nil`/vazios mas presentes na response = espera input
235
+ 3. Olhe `data-model.md` pra colunas jsonb no model — costumam guardar feature nativa
@@ -154,12 +154,29 @@ Company
154
154
  ## Kanban / CRM
155
155
 
156
156
  ```
157
+ KanbanConfig (1:1 com Account — config global do Kanban)
158
+ ├── id (PK)
159
+ ├── account_id (FK, unique)
160
+ ├── enabled (bool, default true)
161
+ ├── webhook_url / webhook_secret / webhook_events (jsonb array)
162
+ ├── win_reasons (jsonb array de {id, title}) ← Motivos de Ganho — NATIVO
163
+ ├── loss_reasons (jsonb array de {id, title}) ← Motivos de Perda — NATIVO
164
+ ├── global_custom_attributes (jsonb array de {name, type, is_list, list_values})
165
+ ├── checklist_templates (jsonb array de {id, name, items: [{id, text}]})
166
+ ├── config (jsonb: title, default_view, auto_assignment, support_email, dragbar_enabled, ...)
167
+ └── created_at
168
+
157
169
  Funnel
158
170
  ├── id (PK)
159
171
  ├── account_id (FK)
160
172
  ├── name
161
- ├── stages (jsonb: array de { name, color, position })
173
+ ├── stages (jsonb: hash com slug_etapa => { name, color, position, description, checklist_templates })
174
+ ├── settings (jsonb: { agents: [], goals: [], automations: [{trigger_type, action, action_config, enabled}] })
175
+ ├── global_custom_attributes (jsonb array)
176
+ ├── meta_events_config (jsonb: won/lost/stages → Meta Pixel/CAPI events)
162
177
  ├── archived (bool)
178
+ ├── active (bool)
179
+ ├── position (int, ordem entre funis)
163
180
  └── created_at
164
181
 
165
182
  KanbanItem
@@ -240,3 +240,45 @@ Glossário completo de termos, status codes, enums e conceitos da plataforma. Us
240
240
  - `display_id`: **sempre use** ao falar com humanos ("conversa #245", "card #12")
241
241
  - Pra Conversation: `id` global, `display_id` por conta (mais amigável)
242
242
  - Pra Contact, Inbox, etc: só `id` (não tem display_id separado)
243
+
244
+ ## Kanban — Motivos de Ganho e Perda
245
+
246
+ **Termo:** "Motivo de Ganho" / "Motivo de Perda" / "Win Reason" / "Loss Reason".
247
+
248
+ **O que é:** lista de razões pré-definidas que o vendedor seleciona ao marcar um card como Ganho ou Descartado/Perdido. Aparece como dropdown na UI no momento da transição. **Compartilhado entre TODOS os funis da conta.**
249
+
250
+ **Onde fica armazenado:** `kanban_config.win_reasons` e `kanban_config.loss_reasons` (jsonb arrays na tabela `kanban_configs`).
251
+
252
+ **Formato:** array de objetos `{id, title}`:
253
+ ```json
254
+ "win_reasons": [
255
+ {"id": "wr-1", "title": "Preço competitivo"},
256
+ {"id": "wr-2", "title": "Indicação forte"}
257
+ ]
258
+ ```
259
+
260
+ **Endpoint:** `PUT /api/v1/accounts/{id}/kanban_config` com body wrapped:
261
+ ```json
262
+ {"kanban_config": {"win_reasons": [...]}}
263
+ ```
264
+
265
+ **⚠️ NÃO confundir com:**
266
+ - `custom_attribute_definitions` (não use pra motivo — vira campo lateral da conversa, fora do fluxo nativo)
267
+ - Labels (não use — labels são tags transversais, não motivos)
268
+ - `funnel.stages` (não use — etapas são posições no funil, não razões de saída)
269
+
270
+ ## Quando usar campo nativo vs custom_attribute
271
+
272
+ **Regra geral:** se a feature TEM um campo nativo na plataforma, use o nativo. Custom attribute é último recurso pra coisas que não têm modelo dedicado.
273
+
274
+ | Caso | Campo nativo | Custom attribute? |
275
+ |---|---|---|
276
+ | Motivo de Ganho/Perda do card | `kanban_config.win_reasons` / `loss_reasons` | ❌ NÃO |
277
+ | Atributo em TODO card | `kanban_config.global_custom_attributes` | só se não couber acima |
278
+ | Atributo de UM card específico | `kanban_item.custom_attributes` (jsonb direto) | já é nativo, não precisa definition |
279
+ | CPF, CNPJ, endereço do cliente | `custom_attribute_definitions` model=contact_attribute | ✅ SIM (não tem nativo) |
280
+ | Tag pro contato (residencial, empresarial) | `labels` | ✅ SIM via Label |
281
+ | Etapa do funil | `funnel.stages` | ❌ NÃO |
282
+ | Tarefa interna do card | `kanban_item.checklist` ou `kanban_config.checklist_templates` | ❌ NÃO |
283
+ | Telefone validado WhatsApp do contato | atributos nativos WhatsApp Chat ID/JID/LID | já criados pelo WAHA automaticamente |
284
+ | Origem do lead (Google Ads, Meta) | `kanban_config.global_custom_attributes` (tipo list) | bom uso de custom_attribute |
@@ -48,6 +48,63 @@ Stages NÃO são tabela separada. São armazenadas como jsonb dentro do Funnel:
48
48
  }
49
49
  ```
50
50
 
51
+ ### KanbanConfig (Configuração Global do Kanban) — CRÍTICO
52
+
53
+ **Tabela separada do Funnel.** 1:1 com a conta. Guarda configurações que valem pra TODOS os funis. Tem 5 campos jsonb importantes:
54
+
55
+ | Campo | Tipo | O que guarda |
56
+ |---|---|---|
57
+ | `win_reasons` | jsonb array | **Motivos de Ganho** — `[{id, title}]`. Aparecem como dropdown quando o vendedor marca "Ganho" num card. NATIVO. NÃO usar custom_attribute. |
58
+ | `loss_reasons` | jsonb array | **Motivos de Perda** — mesma estrutura. Aparece ao marcar "Descartado". |
59
+ | `checklist_templates` | jsonb array | Templates de checklist reusáveis — `[{id, name, items: [{id, text}]}]`. Aplicados manualmente ou via automação `apply_checklist_template`. |
60
+ | `global_custom_attributes` | jsonb array | Atributos globais que aparecem em TODOS os cards de TODOS os funis — `[{name, type, is_list, list_values}]`. |
61
+ | `config` | jsonb hash | Configurações gerais (title, default_view, auto_assignment, support_email, dragbar_enabled, etc) |
62
+ | `webhook_url`, `webhook_secret`, `webhook_events` | string/array | Webhook externo do Kanban (recebe eventos `kanban.item.created`, `kanban.item.stage_changed`, etc) |
63
+
64
+ #### Endpoints
65
+
66
+ | Método | Path | O que faz |
67
+ |---|---|---|
68
+ | GET | `/api/v1/accounts/{id}/kanban_config` | Lê (cria automaticamente se não existir) |
69
+ | POST | `/api/v1/accounts/{id}/kanban_config` | Cria explícito |
70
+ | PUT | `/api/v1/accounts/{id}/kanban_config` | Atualiza parcial |
71
+ | DELETE | `/api/v1/accounts/{id}/kanban_config` | Remove (não afeta cards/funis) |
72
+ | POST | `/api/v1/accounts/{id}/kanban_config/test_webhook` | Dispara payload de teste |
73
+
74
+ **GOTCHA — body precisa estar wrapped:**
75
+
76
+ ```json
77
+ PUT /api/v1/accounts/43/kanban_config
78
+ {
79
+ "kanban_config": {
80
+ "win_reasons": [
81
+ {"id": "wr-1", "title": "Preço competitivo"},
82
+ {"id": "wr-2", "title": "Indicação forte"}
83
+ ],
84
+ "loss_reasons": [
85
+ {"id": "lr-1", "title": "Preço alto"},
86
+ {"id": "lr-2", "title": "Sem retorno"}
87
+ ]
88
+ }
89
+ }
90
+ ```
91
+
92
+ Se mandar `{"win_reasons": [...]}` direto (sem o wrapper `kanban_config`) → **HTTP 500 silencioso**. Strong params do Rails exige `params.require(:kanban_config)`.
93
+
94
+ **`win_reasons` e `loss_reasons` aceitam array de OBJETOS `{id, title}`, NÃO strings simples.** Strings causam 500. O `id` é qualquer string única (UUID ou slug curto tipo `wr-1`).
95
+
96
+ **Substituição vs merge:** quando você envia `win_reasons`, a lista inteira é substituída. Pra preservar, leia primeiro com GET e mande a lista completa.
97
+
98
+ #### ⚠️ Quando NÃO criar como custom_attribute
99
+
100
+ | Quero | Use | NÃO use |
101
+ |---|---|---|
102
+ | Motivo de Ganho/Perda no card | `kanban_config.win_reasons` / `loss_reasons` | ❌ custom_attribute em conversation/contact |
103
+ | Atributo que aparece em TODO card | `kanban_config.global_custom_attributes` | ❌ custom_attribute de conversation |
104
+ | Atributo só de um contato (CPF, endereço) | `custom_attribute_definitions` model=contact_attribute | ❌ kanban_config |
105
+ | Atributo só de uma conversa (motivo, tag interna) | `custom_attribute_definitions` model=conversation_attribute | ❌ kanban_config |
106
+ | Atributo só de um card | `kanban_item.custom_attributes` (jsonb direto no card) | — |
107
+
51
108
  ### KanbanItem (Card)
52
109
  Um card individual dentro de uma etapa.
53
110
 
@@ -236,9 +293,56 @@ NÃO existe `contact_id` direto no KanbanItem. Sempre via conversation_display_i
236
293
 
237
294
  A `conversation_display_id` (singular) ainda é a "principal" — mas todas as `linked_conversations` aparecem na sidebar do card.
238
295
 
239
- ## Automações relacionadas a Kanban
296
+ ## Automações relacionadas a Kanban — 2 SISTEMAS DIFERENTES
240
297
 
241
- AutomationRule com evento `kanban_item_created`, `kanban_item_moved`, `kanban_item_stage_changed`:
298
+ Existem **dois sistemas paralelos** de automação. Não confundir.
299
+
300
+ ### Sistema 1: `funnel.settings.automations` — DENTRO de um funil específico
301
+
302
+ Automações que rodam ao mudar o STATUS de um card (Ganho/Perdido) ou criar card. Atuam sobre o card e podem mover/duplicar entre funis. **Configurado por funil**, dentro de `funnel.settings.automations`.
303
+
304
+ ```json
305
+ PUT /api/v1/accounts/43/funnels/43
306
+ {
307
+ "funnel": {
308
+ "settings": {
309
+ "automations": [
310
+ {
311
+ "id": "automation_1776517249424",
312
+ "enabled": true,
313
+ "trigger_type": "status_changed",
314
+ "trigger_value": "won",
315
+ "action": "duplicate_to_funnel",
316
+ "action_config": {
317
+ "target_funnel_id": 44,
318
+ "target_stage": "agendar_instalacao"
319
+ }
320
+ },
321
+ {
322
+ "trigger_type": "card_created",
323
+ "trigger_value": "card_created",
324
+ "action": "apply_checklist_template",
325
+ "action_config": {
326
+ "template_id": "ct-onboarding-001"
327
+ },
328
+ "enabled": true
329
+ }
330
+ ]
331
+ }
332
+ }
333
+ }
334
+ ```
335
+
336
+ **Triggers:** `card_created`, `status_changed` (com `trigger_value: "won" | "lost"`), `stage_changed`.
337
+ **Ações:** `duplicate_to_funnel` (criar card noutro funil), `apply_checklist_template`, `assign_agent`, `send_message`, `set_priority`.
338
+
339
+ Use para: "ao ganhar um card de Vendas → criar automaticamente em Pós-Venda na etapa Agendar Instalação".
340
+
341
+ ### Sistema 2: AutomationRule global — eventos da conta
342
+
343
+ `AutomationRule` é o motor geral da conta (mensagens, contatos, conversas, e também eventos Kanban). Bem mais genérico, com sistema completo de condições/ações.
344
+
345
+ Eventos Kanban: `kanban_item_created`, `kanban_item_moved`, `kanban_item_stage_changed`.
242
346
 
243
347
  ```json
244
348
  {
@@ -253,26 +357,79 @@ AutomationRule com evento `kanban_item_created`, `kanban_item_moved`, `kanban_it
253
357
  }
254
358
  ```
255
359
 
360
+ Use para: ações cross-cutting que envolvem conversa/contato/label, ou regras complexas com múltiplas condições.
361
+
362
+ ### Qual usar?
363
+
364
+ | Cenário | Sistema |
365
+ |---|---|
366
+ | Mover/duplicar card entre funis | **Sistema 1** (`funnel.settings.automations`) |
367
+ | Aplicar template de checklist em card novo | **Sistema 1** |
368
+ | Enviar mensagem ao mover pra etapa | Qualquer um — Sistema 2 é mais flexível |
369
+ | Aplicar label no contato baseado em mudança no card | **Sistema 2** |
370
+ | Ação envolvendo conversa | **Sistema 2** |
371
+
256
372
  ## Bulk operations
257
373
 
258
374
  - `POST /api/v2/kanban/items/bulk_actions` — operações em massa (mover, atribuir, arquivar)
259
375
  - `POST /api/v2/kanban/items/import` — importar CSV de cards
260
376
  - `GET /api/v2/kanban/items/export` — exportar funil completo
261
377
 
262
- ## Custom attributes em cards
378
+ ## Custom attributes em cards — TRÊS LUGARES POSSÍVEIS
379
+
380
+ Cada card pode receber atributos custom de 3 origens diferentes. **A escolha do lugar muda completamente o resultado:**
263
381
 
264
- Igual contatos, cards têm `custom_attributes` (jsonb):
382
+ ### 1. `kanban_item.custom_attributes` (jsonb direto no card)
265
383
 
266
384
  ```json
267
385
  {
268
386
  "origem_lead": "Google Ads",
269
387
  "campanha": "Black Friday 2026",
270
- "score": 85,
271
- "produto_interesse": "Plano Pro"
388
+ "score": 85
272
389
  }
273
390
  ```
274
391
 
275
- Configurar atributos no Super Admin ou via API `/api/v1/custom_attribute_definitions`.
392
+ - Vai direto no card via `kanban_items_update`
393
+ - Só aparece NESSE card específico
394
+ - Sem typing/validação — qualquer chave/valor
395
+ - Use para: campos específicos de um card, importação rápida sem cadastro prévio
396
+
397
+ ### 2. `kanban_config.global_custom_attributes` (atributos globais do Kanban)
398
+
399
+ ```json
400
+ [
401
+ {"name": "Origem do Lead", "type": "list", "is_list": true, "list_values": ["Google", "Meta", "Indicação"]},
402
+ {"name": "Score", "type": "number", "is_list": false}
403
+ ]
404
+ ```
405
+
406
+ - Definido no `kanban_config` da conta
407
+ - Aparece em TODOS os cards de TODOS os funis (na sidebar do card)
408
+ - Com tipo (`text`, `number`, `date`, `list`, `boolean`)
409
+ - Use para: atributos que TODO card precisa ter
410
+
411
+ ### 3. `custom_attribute_definitions` (atributos globais de contato/conversa)
412
+
413
+ ```json
414
+ {
415
+ "attribute_display_name": "CPF",
416
+ "attribute_display_type": "text",
417
+ "attribute_model": "contact_attribute"
418
+ }
419
+ ```
420
+
421
+ - Definido via `POST /api/v1/accounts/{id}/custom_attribute_definitions`
422
+ - `attribute_model` = `contact_attribute` (na ficha do contato) ou `conversation_attribute` (na conversa)
423
+ - Aparece na sidebar de TODA conversa (independente de Kanban)
424
+ - Use para: cadastro do contato (CPF, CNPJ, endereço) ou atributos por conversa que NÃO são específicos de card
425
+
426
+ ### Não confunda com Motivos / Templates / Funnel Settings
427
+
428
+ | Quero | NÃO use isso | Use isso |
429
+ |---|---|---|
430
+ | Motivos de Ganho/Perda | custom_attribute em qualquer lugar | **`kanban_config.win_reasons` / `loss_reasons`** (NATIVO) |
431
+ | Checklist reusável de card | custom_attribute em jsonb | **`kanban_config.checklist_templates`** |
432
+ | Automação ao ganhar | custom_attribute | **`funnel.settings.automations`** (Sistema 1) |
276
433
 
277
434
  ## Métricas úteis (via GET /api/v2/kanban/items)
278
435
 
@@ -75,9 +75,36 @@ NÃO retry imediato — só piora.
75
75
  ### 500 Internal Server Error
76
76
  Erro do servidor LionChat.
77
77
 
78
+ **Causa mais comum (90% dos casos):** body sem o wrapper do recurso.
79
+
80
+ ```http
81
+ PUT /api/v1/accounts/43/kanban_config
82
+ {"win_reasons": [...]} // ❌ 500 silencioso
83
+ ```
84
+
85
+ Rails levanta `ActionController::ParameterMissing` que vira 500 sem mensagem útil. A request precisa ser:
86
+
87
+ ```http
88
+ PUT /api/v1/accounts/43/kanban_config
89
+ {"kanban_config": {"win_reasons": [...]}} // ✅
90
+ ```
91
+
92
+ Veja `api-conventions.md → Wrapper de body` pra tabela completa de quais endpoints exigem wrapper.
93
+
94
+ **Outras causas:**
95
+ - Estrutura do array errada (ex: `win_reasons: ["str"]` em vez de `[{id, title}]`)
96
+ - Validação de modelo falha (cheque se o controller tem `validate :*` que rejeita o input)
97
+ - Bug genuíno do servidor
98
+
78
99
  **Ação:**
79
- - Retry 1x após 2-5 segundos
80
- - Se persiste, reportar pro usuário com timestamp/request ID
100
+ - Primeiro: revisar wrapper e estrutura do payload
101
+ - Se OK: retry 1x após 2-5 segundos
102
+ - Se persiste: reportar pro usuário com timestamp/request ID
103
+
104
+ ### "param is missing or the value is empty: <recurso>"
105
+ Status: 400 (às vezes)
106
+
107
+ Exatamente o erro do wrapper faltando. Mesma solução: wrapar o body em `{<recurso>: {...}}`.
81
108
 
82
109
  ### 502 Bad Gateway / 503 Service Unavailable
83
110
  Indisponibilidade temporária (deploy, manutenção, sobrecarga).
package/dist/index.js CHANGED
@@ -18,6 +18,9 @@ async function main() {
18
18
  try {
19
19
  // AIDEV-NOTE: Load configuration from env vars (LIONCHAT_BASE_URL, LIONCHAT_API_TOKEN, etc.)
20
20
  const config = loadConfig();
21
+ // Sobrescreve version do config com a version lida do package.json. AIDEV-NOTE:
22
+ // usado pelo client HTTP no User-Agent pra Rails detectar origem MCP no audit log.
23
+ config.version = VERSION;
21
24
  // AIDEV-NOTE: Warn if base URL is not HTTPS (token would be sent in cleartext)
22
25
  if (!config.baseUrl.startsWith('https://') &&
23
26
  !config.baseUrl.includes('localhost') &&
@@ -35,6 +38,9 @@ async function main() {
35
38
  tools: {},
36
39
  resources: { subscribe: false, listChanged: false },
37
40
  prompts: { listChanged: false },
41
+ // AIDEV-NOTE: Autocomplete de argumentos de prompts via completion/complete.
42
+ // Handler em prompts.ts retorna sugestoes hardcoded pra args enum-like.
43
+ completions: {},
38
44
  },
39
45
  });
40
46
  // AIDEV-NOTE: Create HTTP client that wraps fetch calls to LionChat API