n8n-nodes-digisac 1.0.3 → 1.2.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.
Files changed (31) hide show
  1. package/README.md +269 -186
  2. package/dist/nodes/Digisac/Digisac.node.d.ts +15 -0
  3. package/dist/nodes/Digisac/Digisac.node.js +9 -4
  4. package/dist/nodes/Digisac/Digisac.node.js.map +1 -1
  5. package/dist/nodes/Digisac/actions/index.d.ts +2 -2
  6. package/dist/nodes/Digisac/actions/index.js +66 -27
  7. package/dist/nodes/Digisac/actions/index.js.map +1 -1
  8. package/dist/nodes/Digisac/generated/endpoints.js +350 -2
  9. package/dist/nodes/Digisac/generated/endpoints.js.map +1 -1
  10. package/dist/nodes/Digisac/helpers/kanban.d.ts +20 -0
  11. package/dist/nodes/Digisac/helpers/kanban.js +168 -0
  12. package/dist/nodes/Digisac/helpers/kanban.js.map +1 -0
  13. package/dist/nodes/Digisac/helpers/resourceLocator.d.ts +10 -0
  14. package/dist/nodes/Digisac/helpers/resourceLocator.js +157 -0
  15. package/dist/nodes/Digisac/helpers/resourceLocator.js.map +1 -0
  16. package/dist/nodes/Digisac/helpers/valoresGuiados.d.ts +6 -0
  17. package/dist/nodes/Digisac/helpers/valoresGuiados.js +100 -0
  18. package/dist/nodes/Digisac/helpers/valoresGuiados.js.map +1 -0
  19. package/dist/nodes/Digisac/helpers/versao.d.ts +4 -0
  20. package/dist/nodes/Digisac/helpers/versao.js +9 -0
  21. package/dist/nodes/Digisac/helpers/versao.js.map +1 -0
  22. package/dist/nodes/Digisac/methods/listSearch.d.ts +14 -0
  23. package/dist/nodes/Digisac/methods/listSearch.js +105 -0
  24. package/dist/nodes/Digisac/methods/listSearch.js.map +1 -0
  25. package/dist/nodes/Digisac/transport/index.d.ts +5 -2
  26. package/dist/nodes/Digisac/transport/index.js +3 -0
  27. package/dist/nodes/Digisac/transport/index.js.map +1 -1
  28. package/dist/package.json +78 -0
  29. package/dist/tsconfig.tsbuildinfo +1 -0
  30. package/docs/api-calls.md +26 -3
  31. package/package.json +76 -66
package/README.md CHANGED
@@ -1,24 +1,32 @@
1
1
  # n8n-nodes-digisac
2
2
 
3
- [![CI](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/actions/workflows/ci.yml)
3
+ Node community do [n8n](https://n8n.io/) para integrar seus fluxos com a **API do [Digisac](https://digisac.com.br)**, plataforma de atendimento multicanal (WhatsApp e outros canais).
4
4
 
5
- Node community do [n8n](https://n8n.io/) para integrar workflows com a **API da Digisac**. O pacote expõe em um único node todas as chamadas publicadas na documentação Postman da Digisac: contatos, chamados, mensagens, campanhas, conexões, departamentos, usuários, tags, templates, webhooks, relatórios, estatísticas, agendamentos e demais recursos operacionais.
5
+ [![CI](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/actions/workflows/ci.yml) [![Apoie no Buy Me a Coffee](https://img.shields.io/badge/Buy_Me_a_Coffee-Apoie_o_projeto-FFDD00?logo=buy-me-a-coffee&logoColor=000000)](https://buymeacoffee.com/qTny0AzFXS)
6
6
 
7
- O projeto segue o mesmo padrão usado no `n8n-nodes-clinicorp`: um node de ação, uma credencial, TypeScript, catálogo gerado a partir da documentação da API, build validado por CI, publicação no npm via GitHub Actions e suporte a uso como Tool de Agente de IA.
7
+ Um único node cobre **todas as chamadas da coleção Postman pública do Digisac**: contatos, chamados, mensagens, campanhas, conexões, departamentos, usuários, tags, templates, webhooks, relatórios, estatísticas, agendamentos e demais recursos.
8
8
 
9
- ## Funcionalidades
9
+ [n8n](https://n8n.io/) é uma plataforma de automação de fluxos com [licença fair-code](https://docs.n8n.io/reference/license/).
10
10
 
11
- - **Cobertura completa da documentação**: 298 chamadas da coleção pública Postman da Digisac, organizadas em 51 recursos no n8n.
12
- - **Node único e intuitivo**: selecione **Resource -> Operation**, preencha campos simples de path, query e body, e execute.
13
- - **Credencial centralizada**: Base URL e Bearer Token ficam salvos uma única vez na credencial `Digisac API`.
14
- - **Pronto para AI Agent**: o node tem `usableAsTool` com descrição específica de ferramenta e textos pensados para LLMs entenderem método, caminho, efeito da operação, parâmetros, regra de IDs, filtros, campos de body e quando usar JSON avançado.
15
- - **Sem dependências runtime**: usa `httpRequestWithAuthentication` do próprio n8n.
16
- - **Catálogo rastreável**: `nodes/Digisac/generated/endpoints.ts` é gerado da documentação Postman; `docs/api-calls.md` lista todas as chamadas em português.
17
- - **Publicação segura**: GitHub Actions publica no npm com provenance.
11
+ [Instalação](#-instalação) · [Credenciais](#-credenciais) · [Nós e Operações](#-nós-e-operações) · [Exemplos](#-exemplos-práticos) · [Tool de IA](#-usar-como-tool-de-agente-de-ia) · [Versão 1 ou 2](#-versão-1-ou-2-do-node) · [Desenvolvimento](#️-desenvolvimento) · [Versões](#-versões) · [Apoie](#-apoie-o-projeto)
18
12
 
19
- ## Instalação
13
+ ---
20
14
 
21
- No n8n, acesse **Settings -> Community Nodes -> Install** e instale:
15
+ ## 🚀 Funcionalidades
16
+
17
+ - **1 node unificado** — `Digisac` com seletor **Resource → Operation**. Cada operation é uma chamada real da API, com método, caminho e origem na documentação.
18
+ - **Cobertura completa** — 315 chamadas em 52 recursos, geradas da coleção pública Postman, incluindo o **Kanban** (quadros, colunas e cards).
19
+ - **Kanban com lista pesquisável** — na versão 2, quadro e coluna aparecem como lista da sua conta, e o card aparece depois de você escolher a coluna. Excluir quadro, coluna ou card só roda com **Confirm Delete** ligado.
20
+ - **IDs em lista pesquisável (versão 2 do node)** — contato, conexão, departamento, usuário, tag, cargo, robô e assunto de chamado aparecem como lista da sua conta, com busca, e aceitam colar o ID. Os outros IDs aceitam colar o ID no mesmo formato.
21
+ - **Datas e opções guiadas (versão 2 do node)** — período, `From` e `To` têm seletor de data; `Status`, `Period Type`, `Type`, participações e `Origin` são listas de opções.
22
+ - **Workflows salvos não mudam** — quem já usa a versão 1 continua enviando a mesma requisição.
23
+ - **Credencial centralizada** — Base URL e token ficam na credencial `Digisac API`.
24
+ - **Usável como Tool de IA** — o node tem `usableAsTool`, com descrições pensadas para o agente entender método, caminho, parâmetros e cuidados. Veja [Usar como Tool de Agente de IA](#-usar-como-tool-de-agente-de-ia).
25
+ - **Zero dependências de runtime** — usa o `httpRequestWithAuthentication` do próprio n8n, com timeout de 30 s em toda chamada. Passa no lint oficial `n8n-node lint` e é publicado no npm **com provenance**.
26
+
27
+ ## 📦 Instalação
28
+
29
+ No n8n, acesse **Settings → Community Nodes → Install** e instale:
22
30
 
23
31
  ```text
24
32
  n8n-nodes-digisac
@@ -30,54 +38,129 @@ Para usar community nodes como Tools de Agente de IA em n8n self-hosted, habilit
30
38
  N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
31
39
  ```
32
40
 
33
- Sem essa variável, o node pode funcionar como node normal, mas não aparecer como tool no AI Agent em instalações self-hosted.
41
+ Sem essa variável, o node funciona como node normal, mas não aparece como tool no AI Agent em instalações self-hosted.
34
42
 
35
- ## Credenciais
43
+ ## 🔑 Credenciais
36
44
 
37
- Crie uma credencial chamada **Digisac API**.
45
+ Crie uma credencial **Digisac API**.
38
46
 
39
47
  | Campo | O que preencher | Onde encontrar |
40
48
  | --- | --- | --- |
41
- | **Base URL** | URL base da sua conta Digisac, sem barra final. Exemplo: `https://suaempresa.digisac.app`. | Digisac -> Conta -> Informações |
42
- | **Access Token** | Token Bearer de acesso pessoal. | Digisac -> Conta -> API -> Tokens de acesso pessoal |
43
- | **PDF/Base URL** | Base opcional para endpoints documentados como `URLbase`, principalmente export de PDF. Se vazio, o node reutiliza a Base URL. | Use só se sua instância separar URL de API e URL de PDF |
49
+ | **Base URL** | URL base da sua conta, sem barra final. Exemplo: `https://suaempresa.digisac.app`. | Digisac → Conta → Informações |
50
+ | **Access Token** | Token Bearer de acesso pessoal. Tem as mesmas permissões do usuário que o criou. | Digisac → Conta → API → Tokens de acesso pessoal |
51
+ | **PDF/Base URL** | Base opcional para endpoints documentados como `URLbase`, principalmente export de PDF. Se vazio, usa a Base URL. | Use só se sua instância separar a URL de API e a de PDF |
44
52
 
45
- A credencial testa o acesso com:
53
+ A credencial testa o acesso com `GET /api/v1/me`.
46
54
 
47
- ```http
48
- GET /api/v1/me
49
- ```
55
+ ## 🧩 Nós e Operações
50
56
 
51
- ## Como usar o node
57
+ 1. Adicione o node **Digisac** ao workflow.
58
+ 2. Escolha o **Resource**. Ele corresponde a uma pasta da documentação, como `Contatos`, `Mensagens`, `Chamados`, `Campanhas`, `Tags`, `Usuários` ou `Webhooks`.
59
+ 3. Escolha a **Operation**. Cada uma é uma chamada real da API.
60
+ 4. Preencha os IDs de path. Na versão 2, escolha na lista ou cole o ID no modo **By ID**.
61
+ 5. Preencha os campos de query que aparecerem, como `Per Page`, `Start Period`, `End Period`, `Status`.
62
+ 6. Em chamadas `POST`, `PUT` e `PATCH`, use **Body Fields**: o node gera os campos a partir do body documentado.
63
+ 7. Use **Use Body JSON Avancado** só quando a operação exigir array, objeto livre ou algo que não coube nos campos.
64
+ 8. Use **Options → Query Avancada JSON** só para filtros sem campo dedicado.
65
+ 9. Em exportações CSV, TXT ou PDF, use **Options → Response Format → Text**.
52
66
 
53
- 1. Adicione o node **Digisac** no workflow.
54
- 2. Escolha o **Resource**. O resource corresponde a uma pasta da documentação, como `Contatos`, `Mensagens`, `Chamados`, `Campanhas`, `Tags`, `Usuários`, `Webhooks`.
55
- 3. Escolha a **Operation**. Cada operation corresponde a uma chamada real da API.
56
- 4. Preencha os campos obrigatórios de path, como `contactId`, `ticketId`, `serviceId`, `messageId`, `userId`, `campaignId`.
57
- 5. Preencha os campos de query que aparecerem, como `Per Page`, `Number`, `Service Id`, `Start Period`, `End Period`, `Status`.
58
- 6. Em chamadas `POST`, `PUT` e `PATCH`, use **Campos do Body**. O node gera esses campos a partir do body documentado pela Digisac.
59
- 7. Use **Body JSON Avançado** somente quando a operação exigir array, objeto livre ou uma estrutura que não coube nos campos gerados.
60
- 8. Use **Options -> Query Avançada JSON** somente para filtros muito específicos não representados por campos.
61
- 9. Em exports CSV/TXT/PDF, se a resposta não vier como JSON, use **Options -> Response Format -> Text**.
67
+ Resources **Popular** são atalhos herdados da coleção Postman para operações frequentes. Resources **General** têm o catálogo mais completo.
62
68
 
63
- Resources marcados como **Popular** são atalhos herdados da coleção Postman para operações frequentes. Resources **General** contêm o catálogo mais completo. Se a mesma chamada existir nos dois, use **Popular** para fluxos comuns e **General** quando precisar de uma operação que não aparece em Popular.
69
+ Regra para automações e Tools de IA: todo campo terminado em `Id` ou `Ids` deve vir de uma busca anterior, de uma entrada confirmada ou de um valor documentado, como `all`. Nunca copie placeholders como `{{contactId}}`.
64
70
 
65
- Regra para AI Tools e automações: qualquer campo terminado em `Id` ou `Ids` deve vir de busca/listagem anterior, entrada confirmada do usuário ou valor sentinela documentado, como `all`. Nunca copie placeholders como `{{contactId}}`, `{{serviceId}}` ou `{{all/open/close}}`.
71
+ | Campo | Uso |
72
+ | --- | --- |
73
+ | **Resource** | Área da API Digisac, gerada das pastas Postman. |
74
+ | **Operation** | Chamada exata da API. A descrição mostra método, endpoint e origem. |
75
+ | **IDs de path** | Obrigatórios, extraídos de placeholders como `{{contactId}}`. |
76
+ | **Campos de query** | Campos simples gerados da URL documentada. |
77
+ | **Body Fields** | Coleção gerada do body documentado para operações de escrita. |
78
+ | **Options → Response Format** | `Text` para respostas que não são JSON. |
66
79
 
67
- ## Campos principais do node
80
+ ### Kanban (quadros, colunas e cards)
68
81
 
69
- | Campo | Uso |
82
+ O resource **Kanban (General)** tem 17 operações, três por tipo mais as de ordem:
83
+
84
+ | Tipo | Operações |
70
85
  | --- | --- |
71
- | **Resource** | Área funcional da API Digisac, gerada a partir das pastas Postman. |
72
- | **Operation** | Chamada exata da API. A descrição mostra método, endpoint, origem na documentação e placeholders. |
73
- | **Path Parameters** | Campos obrigatórios extraídos de placeholders como `{{contactId}}`. |
74
- | **Campos de query** | Campos simples gerados a partir da URL documentada. Exemplos: `Per Page`, `Number`, `Service Id`, `From`, `To`, `Type`. |
75
- | **Campos do Body** | Coleção de campos gerada a partir do body documentado para operações de escrita. Use antes de qualquer JSON manual. |
76
- | **Use Body JSON Avançado** | Toggle para liberar um editor JSON quando a chamada precisa de array, objeto livre ou payload muito específico. |
77
- | **Options -> Query Avançada JSON** | Objeto JSON livre mesclado na query string. Chaves iguais substituem campos gerados; use apenas quando a chamada precisar de filtro não representado por campo. |
78
- | **Options -> Response Format** | Use `Text` para exportações CSV/TXT/PDF ou respostas que não retornam JSON. |
86
+ | Quadro | **Listar quadros**, **Buscar quadro**, **Criar quadro**, **Editar quadro**, **Excluir quadro** |
87
+ | Coluna | **Listar colunas**, **Buscar coluna**, **Criar coluna**, **Editar coluna**, **Excluir coluna**, **Reordenar coluna** |
88
+ | Card | **Listar cards**, **Buscar card**, **Criar card**, **Editar card**, **Excluir card**, **Reordenar card** |
89
+
90
+ - **Escolha em cascata (versão 2).** Em operações que pedem uma coluna, o campo **Filter by Board** estreita a lista de colunas a um quadro. Em operações que pedem um card, o campo **Filter by Column** mostra os cards daquela coluna. Esses dois campos só ajudam a escolher: o node não os envia ao Digisac. Sem a coluna escolhida, a lista de cards fica vazia; cole o ID no modo **By ID** se já o tem.
91
+ - **Excluir exige confirmação.** **Excluir quadro**, **Excluir coluna** e **Excluir card** têm o campo **Confirm Delete**, desligado por padrão. Sem ele ligado, o node para antes de chamar a API.
92
+ - **Body Fields começa vazio.** Em criar e editar, adicione só os campos que quer enviar. Assim, editar um card não sobrescreve a posição, e editar um quadro não troca os departamentos.
93
+ - **Duas suposições sem chamada real.** A coleção do Digisac traz **Editar coluna** e **Editar card** como `/v1/...`, sem `/api`. O node usa `/api/v1/kanban-columns/...` e `/api/v1/kanban-cards/...`, como as outras 15 rotas. Se essas duas operações responderem `404`, o caminho da coleção é o certo; abra uma issue. Também por suposição, `Position` (editar card) vai como número, e a coleção mostra `"1"` entre aspas.
94
+ - **Versão 1.** Quem usa a versão 1 vê as mesmas 17 operações com campos de texto, sem a lista pesquisável.
95
+
96
+ ### Todas as chamadas da API
97
+
98
+ O catálogo completo fica em [docs/api-calls.md](docs/api-calls.md). Resumo por método:
99
+
100
+ ```text
101
+ GET: 150 | POST: 96 | PUT: 37 | PATCH: 3 | DELETE: 29
102
+ ```
103
+
104
+ Resumo por recurso (gerado por `npm run generate:docs`):
105
+
106
+ <!-- digisac:recursos:start -->
107
+ | Recurso | Chamadas |
108
+ | --- | ---: |
109
+ | Acionamento flag no robo (General) | 1 |
110
+ | Agendamentos (General) | 5 |
111
+ | Agora (General) | 3 |
112
+ | Agora (Popular) | 3 |
113
+ | Assuntos de chamado (General) | 5 |
114
+ | Auditoria de autenticacao (General) | 2 |
115
+ | Autorizacao (General) | 1 |
116
+ | Autorizacao (Popular) | 1 |
117
+ | Avaliacoes (General) | 5 |
118
+ | Campanhas (General) | 7 |
119
+ | Campos personalizados (General) | 5 |
120
+ | Cargos (General) | 7 |
121
+ | Central de notificacoes (General) | 2 |
122
+ | Chamados (General) | 7 |
123
+ | Chamados (Popular) | 6 |
124
+ | Conexoes (General) | 11 |
125
+ | Contatos (General) | 22 |
126
+ | Contatos (Popular) | 22 |
127
+ | Controle de ausencia (General) | 1 |
128
+ | Creditos SMS (General) | 3 |
129
+ | Departamentos (General) | 6 |
130
+ | Distribuicao de chamados (General) | 6 |
131
+ | Estatisticas de atendimento (General) | 10 |
132
+ | Estatisticas de atendimento (Popular) | 7 |
133
+ | Estatisticas de avaliacoes (General) | 7 |
134
+ | Feriados (General) | 5 |
135
+ | Funil de vendas (General) | 10 |
136
+ | Grupos WhatsApp (General) | 4 |
137
+ | Historico de chamados (General) | 12 |
138
+ | Historico de chamados (Popular) | 9 |
139
+ | Idioma da plataforma (General) | 1 |
140
+ | Integracoes (General) | 2 |
141
+ | Kanban (General) | 17 |
142
+ | Mensagens (General) | 13 |
143
+ | Mensagens (Popular) | 8 |
144
+ | Mensagens interativas (General) | 7 |
145
+ | Meus dados (General) | 1 |
146
+ | Notificacao (General) | 3 |
147
+ | Organizacoes (General) | 5 |
148
+ | Pessoas (General) | 5 |
149
+ | Planos (General) | 2 |
150
+ | Redefinir senha (General) | 1 |
151
+ | Respostas rapidas (General) | 7 |
152
+ | Robos (General) | 6 |
153
+ | Tags (General) | 8 |
154
+ | Templates (General) | 11 |
155
+ | Termos de aceite (General) | 5 |
156
+ | Tokens (General) | 5 |
157
+ | Usuarios (General) | 6 |
158
+ | Versoes (General) | 1 |
159
+ | Webhooks (General) | 5 |
160
+ | WhatsApp (General) | 1 |
161
+ <!-- digisac:recursos:end -->
79
162
 
80
- ## Exemplos práticos
163
+ ## 💡 Exemplos práticos
81
164
 
82
165
  ### Listar contatos
83
166
 
@@ -103,7 +186,7 @@ Preencha:
103
186
  Resource: **Mensagens (General)**
104
187
  Operation: **Enviar mensagem**
105
188
 
106
- Em **Campos do Body**, preencha:
189
+ Em **Body Fields**, preencha:
107
190
 
108
191
  - `Text`: `Olá, tudo bem?`
109
192
  - `Type`: `chat`
@@ -116,7 +199,7 @@ Em **Campos do Body**, preencha:
116
199
  Resource: **Mensagens (General)**
117
200
  Operation: **Enviar imagem**, **Enviar PDF** ou **Enviar áudio**
118
201
 
119
- Use **Campos do Body** para `Text`, `Number` e `Service Id`. No campo `File`, informe somente o objeto do arquivo, não o body inteiro:
202
+ Use **Body Fields** para `Text`, `Number` e `Service Id`. No campo `File`, informe somente o objeto do arquivo, não o body inteiro:
120
203
 
121
204
  ```json
122
205
  {
@@ -155,7 +238,7 @@ Body:
155
238
  Resource: **Chamados (General)**
156
239
  Operation: **Fechar um chamado com assunto**
157
240
 
158
- Em **Campos do Body**, preencha `Ticket Topic Ids` com:
241
+ Em **Body Fields**, preencha `Ticket Topic Ids` com:
159
242
 
160
243
  ```json
161
244
  ["TICKET_TOPIC_ID"]
@@ -175,86 +258,68 @@ Preencha os campos de query:
175
258
  - `Period Type`: `open` ou `close`
176
259
  - `Status`: `all`, `open` ou `close`
177
260
 
261
+ ### Mover card entre colunas
262
+
263
+ Resource: **Kanban (General)**
264
+ Operation: **Editar card**
265
+
266
+ Escolha o card (versão 2: use **Filter by Column** para achar o card na lista, ou cole o ID no modo **By ID**). Em **Body Fields**, adicione:
267
+
268
+ - `Column Id`: a coluna de destino, escolhida na lista.
269
+ - `Position`: opcional, o número da posição na coluna.
270
+
271
+ ### Excluir card com confirmação
272
+
273
+ Resource: **Kanban (General)**
274
+ Operation: **Excluir card**
275
+
276
+ Escolha o card e ligue **Confirm Delete**. Sem isso o node recusa a chamada com a mensagem `Turn on 'Confirm Delete' to delete this kanban card`.
277
+
178
278
  ### Criar webhook
179
279
 
180
280
  Resource: **Webhooks (General)**
181
281
  Operation: **Criar webhook**
182
282
 
183
- Em **Campos do Body**, preencha `Active`, `Name`, `Url`, `Events` e `Type`. Para `Events`, use array JSON:
283
+ Em **Body Fields**, preencha `Active`, `Name`, `Url`, `Events` e `Type`. Para `Events`, use array JSON:
184
284
 
185
285
  ```json
186
286
  ["message.created", "ticket.closed"]
187
287
  ```
188
288
 
189
- ## Todas as chamadas da API
289
+ ## 🤖 Usar como Tool de Agente de IA
190
290
 
191
- O catálogo completo fica em [docs/api-calls.md](docs/api-calls.md).
291
+ O node `Digisac` é **usável como tool** por nós de **AI Agent** do n8n (Tools Agent). Isso deixa o modelo **executar ações no Digisac sozinho** — por exemplo: *"busque o contato do número 5511999998888 e envie a ele a mensagem de boas-vindas"*. A prática recomendada é criar uma tool por operação liberada para o agente. Isso limita o escopo do modelo e reduz risco de ações erradas.
192
292
 
193
- Resumo por método:
293
+ ### Como ligar (2 passos)
194
294
 
195
- ```text
196
- GET: 144 | POST: 93 | PUT: 34 | PATCH: 1 | DELETE: 26
197
- ```
295
+ 1. **No servidor n8n**, habilite o uso de community nodes como tools (por segurança, vem **desligado por padrão**). Defina a variável de ambiente:
198
296
 
199
- Resumo por recurso:
297
+ ```bash
298
+ N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
299
+ ```
200
300
 
201
- | Recurso | Chamadas |
202
- | --- | ---: |
203
- | Acionamento flag no robo (General) | 1 |
204
- | Agendamentos (General) | 5 |
205
- | Agora (General) | 3 |
206
- | Agora (Popular) | 3 |
207
- | Assuntos de chamado (General) | 5 |
208
- | Auditoria de autenticacao (General) | 2 |
209
- | Autorizacao (General) | 1 |
210
- | Autorizacao (Popular) | 1 |
211
- | Avaliacoes (General) | 5 |
212
- | Campanhas (General) | 7 |
213
- | Campos personalizados (General) | 5 |
214
- | Cargos (General) | 7 |
215
- | Central de notificacoes (General) | 2 |
216
- | Chamados (General) | 7 |
217
- | Chamados (Popular) | 6 |
218
- | Conexoes (General) | 11 |
219
- | Contatos (General) | 22 |
220
- | Contatos (Popular) | 22 |
221
- | Controle de ausencia (General) | 1 |
222
- | Creditos SMS (General) | 3 |
223
- | Departamentos (General) | 6 |
224
- | Distribuicao de chamados (General) | 6 |
225
- | Estatisticas de atendimento (General) | 10 |
226
- | Estatisticas de atendimento (Popular) | 7 |
227
- | Estatisticas de avaliacoes (General) | 7 |
228
- | Feriados (General) | 5 |
229
- | Funil de vendas (General) | 10 |
230
- | Grupos WhatsApp (General) | 4 |
231
- | Historico de chamados (General) | 12 |
232
- | Historico de chamados (Popular) | 9 |
233
- | Idioma da plataforma (General) | 1 |
234
- | Integracoes (General) | 2 |
235
- | Mensagens (General) | 13 |
236
- | Mensagens (Popular) | 8 |
237
- | Mensagens interativas (General) | 7 |
238
- | Meus dados (General) | 1 |
239
- | Notificacao (General) | 3 |
240
- | Organizacoes (General) | 5 |
241
- | Pessoas (General) | 5 |
242
- | Planos (General) | 2 |
243
- | Redefinir senha (General) | 1 |
244
- | Respostas rapidas (General) | 7 |
245
- | Robos (General) | 6 |
246
- | Tags (General) | 8 |
247
- | Templates (General) | 11 |
248
- | Termos de aceite (General) | 5 |
249
- | Tokens (General) | 5 |
250
- | Usuarios (General) | 6 |
251
- | Versoes (General) | 1 |
252
- | Webhooks (General) | 5 |
253
- | WhatsApp (General) | 1 |
301
+ | Instalação | Onde definir |
302
+ | --- | --- |
303
+ | **Docker / docker-compose** | Adicione em `environment:` do serviço n8n (ou no `.env`) e recrie o container (`docker compose up -d`). |
304
+ | **npm / npx** | Exporte antes de subir: `export N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true && n8n start`. |
305
+ | **n8n Cloud** | Já habilitado nos planos que suportam community nodes. |
306
+
307
+ Sem essa variável o node **não aparece** na lista de tools do AI Agent — é a causa nº 1 de "não acho o node como tool".
254
308
 
255
- ## Uso como Tool de Agente de IA
309
+ 2. **No workflow**, adicione um node **AI Agent**, conecte um **Chat Model** e, no conector **Tool**, adicione o **Digisac**. Escolha o **Resource** e a **Operation** que o agente pode usar (ex.: *Contatos (General)* → *Listar todos os contatos*). Crie uma tool por operação.
256
310
 
257
- O node pode ser conectado ao **AI Agent** do n8n como uma tool. A prática recomendada é criar uma tool por operação liberada para o agente. Isso limita o escopo do modelo e reduz risco de ações erradas.
311
+ ### Deixe o modelo preencher os campos (`$fromAI`)
312
+
313
+ Em cada campo do node em modo tool aparece o botão **"Let the model define this parameter"**, que usa a expressão:
314
+
315
+ ```javascript
316
+ {{ $fromAI('text', 'Texto exato que será enviado ao contato', 'string') }}
317
+ ```
318
+
319
+ - Assinatura: `$fromAI(key, description?, type?, defaultValue?)` — `key` de 1–64 caracteres (`[a-zA-Z0-9_-]`); `type` = `string` | `number` | `boolean` | `json`.
320
+ - Você pode **misturar**: fixar alguns campos (ex.: sempre `Origin` = `bot`) e deixar o modelo preencher outros (texto, contato, período).
321
+ - **Na versão 2 do node**, os campos de ID são Resource Locator. Para o modelo preencher um ID, mude o campo para o modo **By ID** e ponha a expressão `$fromAI` no valor. A lista **From List** serve para a pessoa que monta o workflow, não para o agente.
322
+ - As **descrições de cada operação e campo** foram escritas para o LLM entender o que cada uma faz e como preencher; quanto mais específico o System Message do agente, melhor o resultado.
258
323
 
259
324
  ### Prompt recomendado para o System Message
260
325
 
@@ -263,34 +328,42 @@ Você pode usar as tools Digisac somente quando o usuário pedir para consultar,
263
328
  Nunca invente IDs. Qualquer campo terminado em Id ou Ids deve vir de busca/listagem anterior, entrada confirmada do usuário ou valor sentinela documentado como all.
264
329
  Não copie placeholders da documentação, como {{contactId}}, {{serviceId}} ou {{all/open/close}}. Substitua por valor real ou escolha uma opção válida.
265
330
  Para operações POST, PUT e PATCH, envie um body JSON mínimo, somente com os campos necessários.
266
- Quando a tool expuser Campos do Body, preencha os campos dedicados em vez de gerar um JSON manual.
331
+ Quando a tool expuser Body Fields, preencha os campos dedicados em vez de gerar um JSON manual.
267
332
  Use Body JSON Avançado ou Query Avançada JSON apenas quando não existir campo dedicado suficiente para a chamada.
268
333
  Para filtros de data/hora, use ISO-8601 quando o endpoint esperar timestamp.
269
334
  Para exportações CSV, TXT ou PDF, use Response Format = Text se a resposta não for JSON.
270
335
  Antes de criar, editar, excluir, arquivar, bloquear, fechar chamado ou enviar mensagem, confirme que a intenção do usuário está clara.
271
336
  ```
272
337
 
273
- ### Exemplos de `$fromAI()`
338
+ ### Exemplos de `$fromAI()` com os campos do node
274
339
 
275
- Contato existente:
340
+ **Enviar mensagem** (*Mensagens (General)* → *Enviar mensagem*), em **Body Fields**:
276
341
 
277
- ```javascript
278
- {{ $fromAI('contactId', 'ID existente de contato Digisac. Deve vir de uma busca/listagem anterior, nunca inventado.', 'string') }}
279
- ```
342
+ - `Text`: o modelo escreve o texto.
280
343
 
281
- Texto de mensagem:
344
+ ```javascript
345
+ {{ $fromAI('text', 'Texto exato que será enviado ao contato no WhatsApp/Digisac.', 'string') }}
346
+ ```
282
347
 
283
- ```javascript
284
- {{ $fromAI('messageText', 'Texto exato que será enviado ao contato no WhatsApp/Digisac.', 'string') }}
285
- ```
348
+ - `Contact Id` (modo **By ID**): o ID vem de uma busca anterior, nunca inventado.
286
349
 
287
- Filtro de período:
350
+ ```javascript
351
+ {{ $fromAI('contactId', 'ID existente de contato Digisac. Deve vir de uma busca/listagem anterior.', 'string') }}
352
+ ```
288
353
 
289
- ```javascript
290
- {{ $fromAI('startPeriod', 'Início do período em ISO-8601, por exemplo 2026-07-01T00:00:00.000Z.', 'string') }}
291
- ```
354
+ - `Type` = `chat` e `Origin` = `bot`: fixe estes dois no próprio campo, sem `$fromAI`.
292
355
 
293
- Campo de body estruturado:
356
+ **Buscar estatísticas** (*Estatísticas de atendimento (General)*), nos campos de query:
357
+
358
+ - `Start Period` e `End Period`: o seletor de data da versão 2 aceita a expressão.
359
+
360
+ ```javascript
361
+ {{ $fromAI('startPeriod', 'Início do período em ISO-8601 com fuso, por exemplo 2026-07-01T00:00:00.000Z.', 'string') }}
362
+ ```
363
+
364
+ - `Department Id` e `User Id`: deixe `all` fixo quando o agente não precisa filtrar.
365
+
366
+ **Campo de body estruturado** (envio de arquivo, `File` em *Body Fields*):
294
367
 
295
368
  ```javascript
296
369
  {{ $fromAI('file', 'Objeto JSON do arquivo com base64, mimetype e name quando a operação Digisac enviar mídia.', 'json') }}
@@ -303,94 +376,104 @@ Campo de body estruturado:
303
376
  - Nunca deixe o modelo inventar IDs.
304
377
  - Use credenciais dedicadas por ambiente/cliente.
305
378
  - Para operações destrutivas (`DELETE`, arquivar, bloquear, fechar chamado), coloque etapa humana de confirmação quando o fluxo for sensível.
379
+ - **Kanban como tool.** As 17 operações do Kanban funcionam como tool. Para **Excluir quadro**, **Excluir coluna** e **Excluir card**, deixe **Confirm Delete** desligado na tool e ligue só num fluxo que você revisou: o agente não consegue apagar sem esse campo. O agente deve achar o quadro com **Listar quadros**, a coluna com **Listar colunas** e o card com **Listar cards** antes de mover ou excluir.
306
380
  - Em mensagens enviadas ao cliente, gere o texto em etapa anterior e passe o texto final para a tool.
307
381
  - Use campos dedicados sempre que existirem. Para bodies grandes ou arrays de múltiplos itens, use JSON explícito e valide campos obrigatórios no workflow antes da chamada.
308
382
 
309
- ## Desenvolvimento
383
+ ### Referências
384
+
385
+ - [Tools Agent — n8n Docs](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/tools-agent)
386
+ - [Let AI specify tool parameters (`$fromAI`) — n8n Docs](https://docs.n8n.io/advanced-ai/examples/using-the-fromai-function/)
387
+ - [Variáveis de ambiente de nodes — n8n Docs](https://docs.n8n.io/hosting/configuration/environment-variables/nodes/)
388
+
389
+ ## 🔀 Versão 1 ou 2 do node
390
+
391
+ | | **Versão 1** | **Versão 2 (padrão em node novo)** |
392
+ | --- | --- | --- |
393
+ | IDs | Texto digitado | Lista pesquisável (8 tipos, mais quadro, coluna e card do Kanban) ou **By ID** (os demais) |
394
+ | Datas | Texto | Seletor de data, enviada em ISO UTC |
395
+ | Valores fixos | Texto | Lista de opções |
396
+ | Workflows salvos | Continuam iguais | Não são alterados |
397
+
398
+ Se um workflow salvo usa a versão 1, ele continua enviando exatamente a mesma requisição. Para ganhar os campos guiados, adicione um node novo (versão 2) e escolha o valor de novo.
399
+
400
+ ## 🛠️ Desenvolvimento
310
401
 
311
402
  ```bash
403
+ # Instalar dependências
312
404
  npm install
313
- npm run generate:endpoints
314
- npm run generate:docs
315
- npm run lint
405
+
406
+ # Compilar (n8n-node build: tsc + cópia de ícones)
316
407
  npm run build
317
- npm run dev
318
- ```
319
408
 
320
- Estrutura:
409
+ # Testes (node --test sobre o dist)
410
+ npm test
321
411
 
322
- ```text
323
- n8n-nodes-digisac/
324
- ├── credentials/
325
- │ └── DigisacApi.credentials.ts
326
- ├── nodes/
327
- │ └── Digisac/
328
- │ ├── Digisac.node.ts
329
- │ ├── actions/
330
- │ ├── generated/
331
- │ ├── helpers/
332
- │ └── transport/
333
- ├── scripts/
334
- │ ├── generate-docs.mjs
335
- │ └── generate-endpoints.mjs
336
- └── docs/
337
- └── api-calls.md
412
+ # Lint oficial do n8n (n8n-node lint)
413
+ npm run lint
414
+ npm run lint:fix
338
415
  ```
339
416
 
340
- ## Como o catálogo é gerado
341
-
342
- O script `scripts/generate-endpoints.mjs` baixa a coleção pública:
417
+ Estrutura resumida:
343
418
 
344
419
  ```text
345
- https://documenter.getpostman.com/view/53282970/2sBXihpXmF
420
+ n8n-nodes-digisac/
421
+ ├── credentials/ # DigisacApi.credentials.ts
422
+ ├── nodes/Digisac/
423
+ │ ├── actions/ # monta propriedades e executa cada chamada
424
+ │ ├── generated/ # catálogo gerado da coleção Postman
425
+ │ ├── helpers/ # IDs guiados, datas e opções (versão 2)
426
+ │ ├── methods/ # listSearch das listas pesquisáveis
427
+ │ └── transport/ # requisição HTTP com timeout
428
+ ├── scripts/ # geradores do catálogo e dos documentos
429
+ ├── docs/ # api-calls.md (gerado)
430
+ └── test/ # node --test sobre o dist
346
431
  ```
347
432
 
348
- E gera:
433
+ Os geradores são manuais e **não** rodam no build (o primeiro baixa a coleção da rede):
349
434
 
350
- ```text
351
- nodes/Digisac/generated/endpoints.ts
435
+ ```bash
436
+ npm run generate:endpoints # baixa a coleção Postman e regrava o catálogo
437
+ npm run generate:docs # regrava docs/api-calls.md e a tabela de recursos deste README
352
438
  ```
353
439
 
354
- O script `scripts/generate-docs.mjs` lê esse catálogo e gera:
440
+ ## ✅ Compatibilidade
355
441
 
356
- ```text
357
- README.md
358
- docs/api-calls.md
359
- ```
442
+ - Requer n8n com `n8nNodesApiVersion` 1 e uma conta Digisac com token de acesso pessoal.
443
+ - A versão 2 do node é a padrão em node novo; a versão 1 continua disponível para workflows salvos.
360
444
 
361
- ## Publicação no npm
445
+ ## 📚 Recursos
362
446
 
363
- O projeto publica pelo mesmo padrão do node Clinicorp: GitHub Actions + npm provenance.
447
+ - [Documentação Postman da Digisac](https://documenter.getpostman.com/view/53282970/2sBXihpXmF)
448
+ - [Documentação de community nodes do n8n](https://docs.n8n.io/integrations/community-nodes/)
449
+ - [n8n: `$fromAI()`](https://docs.n8n.io/build/integrate-ai/ai-examples/use-ai-for-parameters/)
364
450
 
365
- Para publicar nova versão:
451
+ ## 🚀 Publicação
366
452
 
367
- ```bash
368
- npm version patch
369
- git push origin main --tags
370
- ```
453
+ A tag `vX.Y.Z` dispara o workflow `publish.yml`, que envia a versão com `npm stage publish` e provenance. A versão **fica em espera**: ela só vai ao ar depois que o dono a aprova, com 2FA, na aba **Staged Packages** do npmjs.com. Sem a aprovação, nada muda no registro.
371
454
 
372
- O workflow executa:
455
+ ## 📈 Versões
373
456
 
374
- ```bash
375
- npm ci --ignore-scripts
376
- npm run build
377
- npm publish --provenance --access public
378
- ```
457
+ - **1.2.0** — **Kanban.** 17 operações novas de quadros, colunas e cards, com lista pesquisável na versão 2 e **Confirm Delete** nas três de excluir. O catálogo passa a guardar o ID de cada operação: nenhum workflow salvo muda de operação. Veja o `CHANGELOG.md`.
458
+ - **1.1.0** — **IDs, datas e valores guiados.** Em node novo (versão 2 do node), contato, conexão, departamento, usuário, tag, cargo, robô e assunto aparecem em lista pesquisável; datas têm seletor; valores fixos viram opções. Workflows salvos continuam na versão 1. Migração para o `@n8n/node-cli` 0.55.5, lint oficial sem erros, testes, CI e timeout de 30 s. Veja o `CHANGELOG.md`.
459
+ - **1.0.3** — Descrições de AI Tool reforçadas: regra para campos `Id/Ids`, alertas para placeholders, orientação Popular vs General e avisos por tipo de campo.
460
+ - **1.0.2** — Interface simplificada: query e body com campos dedicados gerados da documentação. JSON fica em opções avançadas.
461
+ - **1.0.1** — Documentação em PT-BR, exemplos, instruções de AI Tool e catálogo em `docs/api-calls.md`.
462
+ - **1.0.0** — Primeira versão publicada: node único `Digisac`, credencial Bearer, 298 chamadas, suporte a AI Agent e publicação npm via GitHub Actions.
379
463
 
380
- ## Versões
464
+ ## 🆘 Suporte
381
465
 
382
- - **1.0.3** — Descrições de AI Tool reforçadas: regra genérica para campos `Id/Ids`, alertas para placeholders, orientação Popular vs General, avisos por tipo de campo de body/query e exemplo de arquivo corrigido.
383
- - **1.0.2** — Interface simplificada: query e body agora usam campos dedicados gerados da documentação. JSON fica escondido em opções avançadas ou aparece apenas nas chamadas em que não há forma segura de gerar campos. Ícone atualizado a partir de `icon.webp`.
384
- - **1.0.1** — Documentação reescrita em PT-BR, com exemplos práticos, instruções de AI Tool e catálogo completo de chamadas em `docs/api-calls.md`.
385
- - **1.0.0** — Primeira versão publicada. Node único `Digisac`, credencial Bearer, catálogo com 298 chamadas da documentação Postman, suporte a AI Agent e publicação npm via GitHub Actions.
466
+ Se algo não funcionar:
386
467
 
387
- ## Referências
468
+ 1. Confirme a **Base URL** e o **token** da credencial (o teste da credencial chama `GET /api/v1/me`).
469
+ 2. Verifique se a versão do n8n é compatível.
470
+ 3. Consulte os logs do n8n para o erro detalhado.
471
+ 4. Abra uma [issue no GitHub](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/issues).
388
472
 
389
- - [Documentação Postman da Digisac](https://documenter.getpostman.com/view/53282970/2sBXihpXmF)
390
- - [n8n: building community nodes](https://docs.n8n.io/integrations/community-nodes/building-community-nodes/)
391
- - [n8n: programmatic node tutorial](https://docs.n8n.io/connect/create-nodes/build-your-node/tutorial-build-a-programmatic-style-node/)
392
- - [n8n: `$fromAI()`](https://docs.n8n.io/build/integrate-ai/ai-examples/use-ai-for-parameters/)
473
+ ## ☕ Apoie o projeto
474
+
475
+ Este node é mantido de forma independente. Se ele ajuda suas automações, você pode apoiar o desenvolvimento, a manutenção e as novas integrações pelo [Buy Me a Coffee](https://buymeacoffee.com/qTny0AzFXS).
393
476
 
394
- ## Licença
477
+ ## 📄 Licença
395
478
 
396
479
  [MIT](LICENSE.md)
@@ -1,5 +1,20 @@
1
1
  import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
2
  export declare class Digisac implements INodeType {
3
3
  description: INodeTypeDescription;
4
+ methods: {
5
+ listSearch: {
6
+ searchKanbanBoards: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string) => Promise<import("n8n-workflow").INodeListSearchResult>;
7
+ searchKanbanColumns: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string) => Promise<import("n8n-workflow").INodeListSearchResult>;
8
+ searchKanbanCards: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string) => Promise<import("n8n-workflow").INodeListSearchResult>;
9
+ searchContacts: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
10
+ searchServices: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
11
+ searchDepartments: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
12
+ searchUsers: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
13
+ searchTags: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
14
+ searchRoles: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
15
+ searchBots: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
16
+ searchTicketTopics: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
17
+ };
18
+ };
4
19
  execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
20
  }