n8n-nodes-zarkchat 0.1.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/LICENSE.md +21 -0
- package/README.md +137 -0
- package/dist/credentials/ZarkChatApi.credentials.d.ts +23 -0
- package/dist/credentials/ZarkChatApi.credentials.js +61 -0
- package/dist/credentials/ZarkChatApi.credentials.js.map +1 -0
- package/dist/credentials/ZarkChatWebhookApi.credentials.d.ts +16 -0
- package/dist/credentials/ZarkChatWebhookApi.credentials.js +32 -0
- package/dist/credentials/ZarkChatWebhookApi.credentials.js.map +1 -0
- package/dist/icons/zarkchat.dark.svg +14 -0
- package/dist/icons/zarkchat.svg +13 -0
- package/dist/nodes/ZarkChat/ZarkChat.node.d.ts +16 -0
- package/dist/nodes/ZarkChat/ZarkChat.node.js +85 -0
- package/dist/nodes/ZarkChat/ZarkChat.node.js.map +1 -0
- package/dist/nodes/ZarkChat/ZarkChat.node.json +16 -0
- package/dist/nodes/ZarkChat/resources/contact.d.ts +12 -0
- package/dist/nodes/ZarkChat/resources/contact.js +390 -0
- package/dist/nodes/ZarkChat/resources/contact.js.map +1 -0
- package/dist/nodes/ZarkChat/resources/conversation.d.ts +13 -0
- package/dist/nodes/ZarkChat/resources/conversation.js +186 -0
- package/dist/nodes/ZarkChat/resources/conversation.js.map +1 -0
- package/dist/nodes/ZarkChat/resources/message.d.ts +11 -0
- package/dist/nodes/ZarkChat/resources/message.js +69 -0
- package/dist/nodes/ZarkChat/resources/message.js.map +1 -0
- package/dist/nodes/ZarkChat/resources/misc.d.ts +16 -0
- package/dist/nodes/ZarkChat/resources/misc.js +330 -0
- package/dist/nodes/ZarkChat/resources/misc.js.map +1 -0
- package/dist/nodes/ZarkChat/shared/descriptions.d.ts +19 -0
- package/dist/nodes/ZarkChat/shared/descriptions.js +63 -0
- package/dist/nodes/ZarkChat/shared/descriptions.js.map +1 -0
- package/dist/nodes/ZarkChat/shared/messageBody.d.ts +10 -0
- package/dist/nodes/ZarkChat/shared/messageBody.js +159 -0
- package/dist/nodes/ZarkChat/shared/messageBody.js.map +1 -0
- package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.d.ts +17 -0
- package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.js +132 -0
- package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.js.map +1 -0
- package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.json +18 -0
- package/package.json +73 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ZARK
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# n8n-nodes-zarkchat
|
|
2
|
+
|
|
3
|
+
Nodes do **ZarkChat** para o n8n: CRM, conversas, envio de mensagem no WhatsApp, base de conhecimento e gatilho por webhook assinado.
|
|
4
|
+
|
|
5
|
+
Dois nodes e duas credenciais:
|
|
6
|
+
|
|
7
|
+
| Item | Para quê |
|
|
8
|
+
| ------------------------ | ------------------------------------------------------------------ |
|
|
9
|
+
| **ZarkChat** | 9 resources, 30 operações. Também usável como ferramenta de Agent. |
|
|
10
|
+
| **ZarkChat Trigger** | Recebe os webhooks de saída, com validação de assinatura HMAC. |
|
|
11
|
+
| **ZarkChat API** | Credencial da api-key (`zk_live_...`) e da URL base. |
|
|
12
|
+
| **ZarkChat Webhook API** | Credencial do segredo HMAC de um webhook. |
|
|
13
|
+
|
|
14
|
+
## Instalação
|
|
15
|
+
|
|
16
|
+
**No n8n auto-hospedado**, em Settings → Community Nodes → Install, informe:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
n8n-nodes-zarkchat
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Para testar antes de publicar**, com o pacote local:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cd packages/n8n-nodes-zarkchat
|
|
26
|
+
npm run build
|
|
27
|
+
npm link
|
|
28
|
+
cd ~/.n8n/nodes && npm link n8n-nodes-zarkchat
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Reinicie o n8n. Os nodes aparecem buscando por "ZarkChat".
|
|
32
|
+
|
|
33
|
+
## Credenciais
|
|
34
|
+
|
|
35
|
+
### ZarkChat API
|
|
36
|
+
|
|
37
|
+
Crie a chave no painel em **Configurações → API**. Ela aparece uma única vez.
|
|
38
|
+
|
|
39
|
+
| Campo | Valor |
|
|
40
|
+
| -------- | ------------------------------------------ |
|
|
41
|
+
| API Key | `zk_live_...` |
|
|
42
|
+
| Base URL | `https://api.zark.chat` (sem barra no fim) |
|
|
43
|
+
|
|
44
|
+
> **Instalação própria do ZarkChat?** Troque a Base URL pela raiz da sua API, sem o `/v1` no fim (as rotas já o incluem). O padrão aponta para a instância hospedada pela ZARK.
|
|
45
|
+
|
|
46
|
+
> O botão **Test** chama `GET /v1/conversations/counts`, então a chave precisa do escopo `conversations:read` para o teste passar. Uma chave sem esse escopo pode estar perfeitamente válida e ainda assim falhar no teste.
|
|
47
|
+
|
|
48
|
+
Escopos por resource:
|
|
49
|
+
|
|
50
|
+
| Resource | Escopo necessário |
|
|
51
|
+
| ------------------------------------- | ------------------------------------------------------ |
|
|
52
|
+
| Agent | `agents:read` |
|
|
53
|
+
| Contact, Label, Lead Source, Pipeline | `contacts:read` / `contacts:write` / `contacts:export` |
|
|
54
|
+
| Conversation | `conversations:read`, `messages:read`, `messages:send` |
|
|
55
|
+
| Flow | `flows:trigger` |
|
|
56
|
+
| Knowledge Base | `kb:search` |
|
|
57
|
+
| Message | `messages:send` / `messages:read` |
|
|
58
|
+
|
|
59
|
+
Dê só o que o workflow usa: se a chave vazar, o estrago fica contido.
|
|
60
|
+
|
|
61
|
+
### ZarkChat Webhook API
|
|
62
|
+
|
|
63
|
+
O segredo aparece quando você cria o webhook no painel. Guarde na hora: ele não é exibido de novo.
|
|
64
|
+
|
|
65
|
+
## Gatilho: o cadastro é manual, e é de propósito
|
|
66
|
+
|
|
67
|
+
O `ZarkChat Trigger` **não se registra sozinho** no ZarkChat. A rota que cria webhook (`POST /v1/webhooks`) exige login de admin e não aceita api-key, então o node não teria como fazer isso com a credencial que possui. Em vez de falhar de forma confusa na ativação, ele mostra a URL para você colar.
|
|
68
|
+
|
|
69
|
+
Passo a passo:
|
|
70
|
+
|
|
71
|
+
1. Adicione o **ZarkChat Trigger** ao workflow e copie a **Production URL**.
|
|
72
|
+
2. No painel do ZarkChat, vá em **WhatsApp → Webhooks**, cole a URL e assine os eventos.
|
|
73
|
+
3. Copie o **secret** exibido na criação e guarde na credencial **ZarkChat Webhook API**.
|
|
74
|
+
4. Marque os mesmos eventos no node.
|
|
75
|
+
5. Use o botão **Testar** do painel para ver o primeiro evento chegando.
|
|
76
|
+
|
|
77
|
+
**Deixe `Validate Signature` ligado.** Sem isso, qualquer pessoa que descubra a URL do seu webhook injeta evento falso no seu agente. O node valida sobre o corpo cru, exatamente como a API assina.
|
|
78
|
+
|
|
79
|
+
Evento que chega e não está na lista selecionada é descartado com `200`, e não com erro: responder erro faria o ZarkChat repetir a entrega (30s, 2min, 10min, 30min, 2h) de algo que este fluxo ignora de propósito.
|
|
80
|
+
|
|
81
|
+
## Limites
|
|
82
|
+
|
|
83
|
+
**120 requisições por minuto por api-key.** Envios têm um teto extra de 10 por segundo. Toda resposta traz `X-RateLimit-Limit`, `X-RateLimit-Remaining` e `X-RateLimit-Reset`, então dá para se auto-regular sem bater no limite.
|
|
84
|
+
|
|
85
|
+
Um agente que gasta ~7 chamadas por mensagem sustenta cerca de 17 mensagens por minuto. Se precisar de mais, cachear `Agent: Get Config` corta boa parte das chamadas, porque essa configuração muda raramente.
|
|
86
|
+
|
|
87
|
+
## Por que só 30 operações, se a API tem 141 rotas
|
|
88
|
+
|
|
89
|
+
As outras 111 são do painel e exigem login de usuário com papel. Uma api-key receberia `403` em todas elas, sempre. Expor essas rotas aqui só produziria nodes que falham, então a fronteira do pacote é exatamente o que uma chave alcança. Há um teste que quebra o build se alguma operação sair dessa fronteira.
|
|
90
|
+
|
|
91
|
+
## Dois cuidados que evitam problema real
|
|
92
|
+
|
|
93
|
+
**Não responda por cima de um atendente.** O ZarkChat pausa o bot quando um humano assume, mas o seu workflow é externo e não sabe disso sozinho. Antes de enviar, use `Conversation: Get` e confira `botEnabled`.
|
|
94
|
+
|
|
95
|
+
**Silêncio é resposta válida.** Sem base para responder, não responda. Inventar resposta em nome do cliente custa mais caro que demorar.
|
|
96
|
+
|
|
97
|
+
## Desenvolvimento
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npm run build # tsc + copia ícones e .node.json para dist
|
|
101
|
+
npm run type-check
|
|
102
|
+
npm run lint # eslint-plugin-n8n-nodes-base, as convenções oficiais
|
|
103
|
+
npm test
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Testar num n8n de verdade antes de publicar
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm run build
|
|
110
|
+
mkdir -p /tmp/n8n-lab/.n8n/nodes/node_modules
|
|
111
|
+
cp -r . /tmp/n8n-lab/.n8n/nodes/node_modules/n8n-nodes-zarkchat
|
|
112
|
+
rm -rf /tmp/n8n-lab/.n8n/nodes/node_modules/n8n-nodes-zarkchat/node_modules
|
|
113
|
+
|
|
114
|
+
N8N_USER_FOLDER=/tmp/n8n-lab N8N_PORT=5679 \
|
|
115
|
+
N8N_COMMUNITY_PACKAGES_ENABLED=true npx n8n start
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Com `N8N_USER_FOLDER=X`, o n8n cria `X/.n8n/` e procura os nodes em **`X/.n8n/nodes/`**, não em `X/nodes/`. Errar esse caminho faz o n8n subir normalmente e simplesmente ignorar o pacote, sem erro nenhum no log.
|
|
119
|
+
|
|
120
|
+
### Publicar
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npm run build
|
|
124
|
+
npm pack --dry-run # confira que dist, icons, README e LICENSE estão no tarball
|
|
125
|
+
npm login
|
|
126
|
+
npm publish # publishConfig já força --access public
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Depois de publicado, quem usa n8n auto-hospedado instala em **Settings → Community Nodes → Install** digitando `n8n-nodes-zarkchat`.
|
|
130
|
+
|
|
131
|
+
Em n8n com `EXECUTIONS_MODE=queue`, o pacote precisa estar no editor, no webhook **e nos workers**: um node presente só no editor aparece na tela e falha na execução, porque quem executa é o worker.
|
|
132
|
+
|
|
133
|
+
Versão: semver. O npm só permite despublicar uma versão nas primeiras 72 horas, então prefira publicar um patch novo a tentar apagar.
|
|
134
|
+
|
|
135
|
+
## Licença
|
|
136
|
+
|
|
137
|
+
MIT
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IAuthenticateGeneric, Icon, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
/**
|
|
3
|
+
* Credencial do ZarkChat: api-key de tenant (`zk_live_...`), criada no painel
|
|
4
|
+
* em Configurações → API. A chave pertence a UM tenant e só enxerga dados
|
|
5
|
+
* dele, então uma credencial por cliente é o padrão.
|
|
6
|
+
*
|
|
7
|
+
* `baseUrl` é configurável porque a API pode viver em domínio próprio por
|
|
8
|
+
* instalação (produção da ZARK é https://api.zark.chat, sem prefixo /api).
|
|
9
|
+
*/
|
|
10
|
+
export declare class ZarkChatApi implements ICredentialType {
|
|
11
|
+
name: string;
|
|
12
|
+
displayName: string;
|
|
13
|
+
icon: Icon;
|
|
14
|
+
documentationUrl: string;
|
|
15
|
+
properties: INodeProperties[];
|
|
16
|
+
authenticate: IAuthenticateGeneric;
|
|
17
|
+
/**
|
|
18
|
+
* Testa contra uma rota de leitura barata que exige apenas
|
|
19
|
+
* `conversations:read`. Não usa /v1/me: api-key não representa usuário, e a
|
|
20
|
+
* rota devolveria 403 mesmo com a chave válida.
|
|
21
|
+
*/
|
|
22
|
+
test: ICredentialTestRequest;
|
|
23
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZarkChatApi = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Credencial do ZarkChat: api-key de tenant (`zk_live_...`), criada no painel
|
|
6
|
+
* em Configurações → API. A chave pertence a UM tenant e só enxerga dados
|
|
7
|
+
* dele, então uma credencial por cliente é o padrão.
|
|
8
|
+
*
|
|
9
|
+
* `baseUrl` é configurável porque a API pode viver em domínio próprio por
|
|
10
|
+
* instalação (produção da ZARK é https://api.zark.chat, sem prefixo /api).
|
|
11
|
+
*/
|
|
12
|
+
class ZarkChatApi {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.name = 'zarkChatApi';
|
|
15
|
+
this.displayName = 'ZarkChat API';
|
|
16
|
+
this.icon = { light: 'file:../icons/zarkchat.svg', dark: 'file:../icons/zarkchat.dark.svg' };
|
|
17
|
+
this.documentationUrl = 'https://github.com/mayconjordanr/zark-chat/blob/main/docs/api/agentes-n8n.md';
|
|
18
|
+
this.properties = [
|
|
19
|
+
{
|
|
20
|
+
displayName: 'API Key',
|
|
21
|
+
name: 'apiKey',
|
|
22
|
+
type: 'string',
|
|
23
|
+
typeOptions: { password: true },
|
|
24
|
+
default: '',
|
|
25
|
+
required: true,
|
|
26
|
+
placeholder: 'zk_live_...',
|
|
27
|
+
description: 'Chave criada no painel em Configurações, aba API. Aparece uma única vez. Dê apenas os escopos que o workflow usa.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
displayName: 'Base URL',
|
|
31
|
+
name: 'baseUrl',
|
|
32
|
+
type: 'string',
|
|
33
|
+
default: 'https://api.zark.chat',
|
|
34
|
+
required: true,
|
|
35
|
+
description: 'Raiz da API, sem barra no fim e sem o /v1 (ele é adicionado pelas rotas)',
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
this.authenticate = {
|
|
39
|
+
type: 'generic',
|
|
40
|
+
properties: {
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: '=Bearer {{$credentials.apiKey}}',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Testa contra uma rota de leitura barata que exige apenas
|
|
48
|
+
* `conversations:read`. Não usa /v1/me: api-key não representa usuário, e a
|
|
49
|
+
* rota devolveria 403 mesmo com a chave válida.
|
|
50
|
+
*/
|
|
51
|
+
this.test = {
|
|
52
|
+
request: {
|
|
53
|
+
baseURL: '={{$credentials.baseUrl}}',
|
|
54
|
+
url: '/v1/conversations/counts',
|
|
55
|
+
method: 'GET',
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.ZarkChatApi = ZarkChatApi;
|
|
61
|
+
//# sourceMappingURL=ZarkChatApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZarkChatApi.credentials.js","sourceRoot":"","sources":["../../credentials/ZarkChatApi.credentials.ts"],"names":[],"mappings":";;;AAQA;;;;;;;GAOG;AACH,MAAa,WAAW;IAAxB;QACC,SAAI,GAAG,aAAa,CAAC;QAErB,gBAAW,GAAG,cAAc,CAAC;QAE7B,SAAI,GAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;QAE9F,qBAAgB,GAAG,8EAA8E,CAAC;QAElG,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,aAAa;gBAC1B,WAAW,EACV,mHAAmH;aACpH;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,uBAAuB;gBAChC,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,0EAA0E;aACvF;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,iCAAiC;iBAChD;aACD;SACD,CAAC;QAEF;;;;WAIG;QACH,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,2BAA2B;gBACpC,GAAG,EAAE,0BAA0B;gBAC/B,MAAM,EAAE,KAAK;aACb;SACD,CAAC;IACH,CAAC;CAAA;AApDD,kCAoDC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Icon, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
/**
|
|
3
|
+
* Segredo HMAC de um webhook de saída do ZarkChat, mostrado UMA única vez
|
|
4
|
+
* quando o webhook é criado no painel (WhatsApp → Webhooks).
|
|
5
|
+
*
|
|
6
|
+
* É credencial, e não parâmetro do node, por dois motivos: fica cifrado no
|
|
7
|
+
* n8n em vez de viajar no JSON do workflow, e o mesmo segredo costuma ser
|
|
8
|
+
* reusado por vários workflows do mesmo cliente.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ZarkChatWebhookApi implements ICredentialType {
|
|
11
|
+
name: string;
|
|
12
|
+
displayName: string;
|
|
13
|
+
icon: Icon;
|
|
14
|
+
documentationUrl: string;
|
|
15
|
+
properties: INodeProperties[];
|
|
16
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZarkChatWebhookApi = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Segredo HMAC de um webhook de saída do ZarkChat, mostrado UMA única vez
|
|
6
|
+
* quando o webhook é criado no painel (WhatsApp → Webhooks).
|
|
7
|
+
*
|
|
8
|
+
* É credencial, e não parâmetro do node, por dois motivos: fica cifrado no
|
|
9
|
+
* n8n em vez de viajar no JSON do workflow, e o mesmo segredo costuma ser
|
|
10
|
+
* reusado por vários workflows do mesmo cliente.
|
|
11
|
+
*/
|
|
12
|
+
class ZarkChatWebhookApi {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.name = 'zarkChatWebhookApi';
|
|
15
|
+
this.displayName = 'ZarkChat Webhook API';
|
|
16
|
+
this.icon = { light: 'file:../icons/zarkchat.svg', dark: 'file:../icons/zarkchat.dark.svg' };
|
|
17
|
+
this.documentationUrl = 'https://github.com/mayconjordanr/zark-chat/blob/main/docs/api/agentes-n8n.md';
|
|
18
|
+
this.properties = [
|
|
19
|
+
{
|
|
20
|
+
displayName: 'Webhook Secret',
|
|
21
|
+
name: 'secret',
|
|
22
|
+
type: 'string',
|
|
23
|
+
typeOptions: { password: true },
|
|
24
|
+
default: '',
|
|
25
|
+
required: true,
|
|
26
|
+
description: 'Segredo exibido na criação do webhook no painel. Valida o cabeçalho X-Zark-Signature; sem ele qualquer um que descubra a URL injeta evento falso.',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.ZarkChatWebhookApi = ZarkChatWebhookApi;
|
|
32
|
+
//# sourceMappingURL=ZarkChatWebhookApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZarkChatWebhookApi.credentials.js","sourceRoot":"","sources":["../../credentials/ZarkChatWebhookApi.credentials.ts"],"names":[],"mappings":";;;AAEA;;;;;;;GAOG;AACH,MAAa,kBAAkB;IAA/B;QACC,SAAI,GAAG,oBAAoB,CAAC;QAE5B,gBAAW,GAAG,sBAAsB,CAAC;QAErC,SAAI,GAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;QAE9F,qBAAgB,GAAG,8EAA8E,CAAC;QAElG,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,gBAAgB;gBAC7B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EACV,mJAAmJ;aACpJ;SACD,CAAC;IACH,CAAC;CAAA;AArBD,gDAqBC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="ZarkChat">
|
|
2
|
+
<title>ZarkChat</title>
|
|
3
|
+
<!--
|
|
4
|
+
Marca quadrada derivada do wordmark ZARK (design-system/assets/logo-primary.png):
|
|
5
|
+
o "Z" angular é o único elemento que continua legível a 16px na barra de
|
|
6
|
+
nodes do n8n; o wordmark inteiro vira borrão. Cor = var(--brand-500) do
|
|
7
|
+
design system (#ff8a3d), literal porque SVG de ícone não enxerga token CSS. Variante DARK: brand-400
|
|
8
|
+
(#ff8a3d), um passo mais claro, para manter contraste no tema escuro do n8n.
|
|
9
|
+
-->
|
|
10
|
+
<path
|
|
11
|
+
fill="#ff8a3d"
|
|
12
|
+
d="M12 8 H52 V20 L30 44 H52 V56 H12 V44 L34 20 H12 Z"
|
|
13
|
+
/>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="ZarkChat">
|
|
2
|
+
<title>ZarkChat</title>
|
|
3
|
+
<!--
|
|
4
|
+
Marca quadrada derivada do wordmark ZARK (design-system/assets/logo-primary.png):
|
|
5
|
+
o "Z" angular é o único elemento que continua legível a 16px na barra de
|
|
6
|
+
nodes do n8n; o wordmark inteiro vira borrão. Cor = var(--brand-500) do
|
|
7
|
+
design system (#f56f10), literal porque SVG de ícone não enxerga token CSS.
|
|
8
|
+
-->
|
|
9
|
+
<path
|
|
10
|
+
fill="#f56f10"
|
|
11
|
+
d="M12 8 H52 V20 L30 44 H52 V56 H12 V44 L34 20 H12 Z"
|
|
12
|
+
/>
|
|
13
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
/**
|
|
3
|
+
* Node do ZarkChat (estilo declarativo: as chamadas vivem em `routing`, sem
|
|
4
|
+
* `execute`).
|
|
5
|
+
*
|
|
6
|
+
* ESCOPO: expõe exatamente as 30 rotas que uma api-key alcança. As outras 111
|
|
7
|
+
* da API são do painel (JWT com papel) e responderiam 403 para qualquer chave,
|
|
8
|
+
* então colocá-las aqui só produziria nodes que falham. A fronteira é o
|
|
9
|
+
* decorator `@RequiresScope` no backend.
|
|
10
|
+
*
|
|
11
|
+
* `usableAsTool` ligado: um Agent do n8n pode chamar estas operações
|
|
12
|
+
* diretamente como ferramenta.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ZarkChat implements INodeType {
|
|
15
|
+
description: INodeTypeDescription;
|
|
16
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZarkChat = void 0;
|
|
4
|
+
const contact_1 = require("./resources/contact");
|
|
5
|
+
const conversation_1 = require("./resources/conversation");
|
|
6
|
+
const message_1 = require("./resources/message");
|
|
7
|
+
const misc_1 = require("./resources/misc");
|
|
8
|
+
/**
|
|
9
|
+
* Node do ZarkChat (estilo declarativo: as chamadas vivem em `routing`, sem
|
|
10
|
+
* `execute`).
|
|
11
|
+
*
|
|
12
|
+
* ESCOPO: expõe exatamente as 30 rotas que uma api-key alcança. As outras 111
|
|
13
|
+
* da API são do painel (JWT com papel) e responderiam 403 para qualquer chave,
|
|
14
|
+
* então colocá-las aqui só produziria nodes que falham. A fronteira é o
|
|
15
|
+
* decorator `@RequiresScope` no backend.
|
|
16
|
+
*
|
|
17
|
+
* `usableAsTool` ligado: um Agent do n8n pode chamar estas operações
|
|
18
|
+
* diretamente como ferramenta.
|
|
19
|
+
*/
|
|
20
|
+
class ZarkChat {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.description = {
|
|
23
|
+
displayName: 'ZarkChat',
|
|
24
|
+
name: 'zarkChat',
|
|
25
|
+
icon: {
|
|
26
|
+
light: 'file:../../icons/zarkchat.svg',
|
|
27
|
+
dark: 'file:../../icons/zarkchat.dark.svg',
|
|
28
|
+
},
|
|
29
|
+
group: ['transform'],
|
|
30
|
+
version: 1,
|
|
31
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
32
|
+
description: 'CRM, conversas, envio de mensagem e base de conhecimento do ZarkChat',
|
|
33
|
+
defaults: { name: 'ZarkChat' },
|
|
34
|
+
usableAsTool: true,
|
|
35
|
+
inputs: ['main'],
|
|
36
|
+
outputs: ['main'],
|
|
37
|
+
credentials: [{ name: 'zarkChatApi', required: true }],
|
|
38
|
+
requestDefaults: {
|
|
39
|
+
baseURL: '={{$credentials.baseUrl}}',
|
|
40
|
+
headers: {
|
|
41
|
+
Accept: 'application/json',
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
properties: [
|
|
46
|
+
{
|
|
47
|
+
displayName: 'Resource',
|
|
48
|
+
name: 'resource',
|
|
49
|
+
type: 'options',
|
|
50
|
+
noDataExpression: true,
|
|
51
|
+
options: [
|
|
52
|
+
{ name: 'Agent', value: 'agent' },
|
|
53
|
+
{ name: 'Contact', value: 'contact' },
|
|
54
|
+
{ name: 'Conversation', value: 'conversation' },
|
|
55
|
+
{ name: 'Flow', value: 'flow' },
|
|
56
|
+
{ name: 'Knowledge Base', value: 'knowledgeBase' },
|
|
57
|
+
{ name: 'Label', value: 'label' },
|
|
58
|
+
{ name: 'Lead Source', value: 'leadSource' },
|
|
59
|
+
{ name: 'Message', value: 'message' },
|
|
60
|
+
{ name: 'Pipeline', value: 'pipeline' },
|
|
61
|
+
],
|
|
62
|
+
default: 'conversation',
|
|
63
|
+
},
|
|
64
|
+
...misc_1.agentOperations,
|
|
65
|
+
...misc_1.agentFields,
|
|
66
|
+
...contact_1.contactOperations,
|
|
67
|
+
...contact_1.contactFields,
|
|
68
|
+
...conversation_1.conversationOperations,
|
|
69
|
+
...conversation_1.conversationFields,
|
|
70
|
+
...misc_1.flowOperations,
|
|
71
|
+
...misc_1.flowFields,
|
|
72
|
+
...misc_1.knowledgeBaseOperations,
|
|
73
|
+
...misc_1.knowledgeBaseFields,
|
|
74
|
+
...misc_1.labelOperations,
|
|
75
|
+
...misc_1.leadSourceOperations,
|
|
76
|
+
...message_1.messageOperations,
|
|
77
|
+
...message_1.messageFields,
|
|
78
|
+
...misc_1.pipelineOperations,
|
|
79
|
+
...misc_1.pipelineFields,
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.ZarkChat = ZarkChat;
|
|
85
|
+
//# sourceMappingURL=ZarkChat.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZarkChat.node.js","sourceRoot":"","sources":["../../../nodes/ZarkChat/ZarkChat.node.ts"],"names":[],"mappings":";;;AACA,iDAAuE;AACvE,2DAAsF;AACtF,iDAAuE;AACvE,2CAW0B;AAE1B;;;;;;;;;;;GAWG;AACH,MAAa,QAAQ;IAArB;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE;gBACL,KAAK,EAAE,+BAA+B;gBACtC,IAAI,EAAE,oCAAoC;aAC1C;YACD,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,8DAA8D;YACxE,WAAW,EAAE,sEAAsE;YACnF,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;YAC9B,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACtD,eAAe,EAAE;gBAChB,OAAO,EAAE,2BAA2B;gBACpC,OAAO,EAAE;oBACR,MAAM,EAAE,kBAAkB;oBAC1B,cAAc,EAAE,kBAAkB;iBAClC;aACD;YACD,UAAU,EAAE;gBACX;oBACC,WAAW,EAAE,UAAU;oBACvB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;oBACf,gBAAgB,EAAE,IAAI;oBACtB,OAAO,EAAE;wBACR,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;wBACjC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;wBACrC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;wBAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC/B,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE;wBAClD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;wBACjC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE;wBAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;wBACrC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;qBACvC;oBACD,OAAO,EAAE,cAAc;iBACvB;gBAED,GAAG,sBAAe;gBAClB,GAAG,kBAAW;gBACd,GAAG,2BAAiB;gBACpB,GAAG,uBAAa;gBAChB,GAAG,qCAAsB;gBACzB,GAAG,iCAAkB;gBACrB,GAAG,qBAAc;gBACjB,GAAG,iBAAU;gBACb,GAAG,8BAAuB;gBAC1B,GAAG,0BAAmB;gBACtB,GAAG,sBAAe;gBAClB,GAAG,2BAAoB;gBACvB,GAAG,2BAAiB;gBACpB,GAAG,uBAAa;gBAChB,GAAG,yBAAkB;gBACrB,GAAG,qBAAc;aACjB;SACD,CAAC;IACH,CAAC;CAAA;AA9DD,4BA8DC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "n8n-nodes-zarkchat.zarkChat",
|
|
3
|
+
"nodeVersion": "1.0",
|
|
4
|
+
"codexVersion": "1.0",
|
|
5
|
+
"categories": ["Communication", "Sales"],
|
|
6
|
+
"resources": {
|
|
7
|
+
"credentialDocumentation": [
|
|
8
|
+
{
|
|
9
|
+
"url": "https://github.com/mayconjordanr/zark-chat/blob/main/docs/api/agentes-n8n.md#1-autenticacao"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"primaryDocumentation": [
|
|
13
|
+
{ "url": "https://github.com/mayconjordanr/zark-chat/blob/main/docs/api/agentes-n8n.md" }
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { INodeProperties } from 'n8n-workflow';
|
|
2
|
+
/**
|
|
3
|
+
* Contatos (escopos `contacts:read` / `contacts:write` / `contacts:export`).
|
|
4
|
+
* 13 operações, todas mapeadas 1:1 nas rotas reais de `contacts.controller.ts`.
|
|
5
|
+
*
|
|
6
|
+
* Duas regras da API que a UI aqui respeita, em vez de mascarar:
|
|
7
|
+
* - `stageId` NÃO entra no update: mudança de estágio é auditada e tem rota
|
|
8
|
+
* própria (`Move To Stage`). O PATCH rejeita com 422.
|
|
9
|
+
* - `Create` exige `numberId` + `waId`; o nome é opcional.
|
|
10
|
+
*/
|
|
11
|
+
export declare const contactOperations: INodeProperties[];
|
|
12
|
+
export declare const contactFields: INodeProperties[];
|