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.
Files changed (37) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +137 -0
  3. package/dist/credentials/ZarkChatApi.credentials.d.ts +23 -0
  4. package/dist/credentials/ZarkChatApi.credentials.js +61 -0
  5. package/dist/credentials/ZarkChatApi.credentials.js.map +1 -0
  6. package/dist/credentials/ZarkChatWebhookApi.credentials.d.ts +16 -0
  7. package/dist/credentials/ZarkChatWebhookApi.credentials.js +32 -0
  8. package/dist/credentials/ZarkChatWebhookApi.credentials.js.map +1 -0
  9. package/dist/icons/zarkchat.dark.svg +14 -0
  10. package/dist/icons/zarkchat.svg +13 -0
  11. package/dist/nodes/ZarkChat/ZarkChat.node.d.ts +16 -0
  12. package/dist/nodes/ZarkChat/ZarkChat.node.js +85 -0
  13. package/dist/nodes/ZarkChat/ZarkChat.node.js.map +1 -0
  14. package/dist/nodes/ZarkChat/ZarkChat.node.json +16 -0
  15. package/dist/nodes/ZarkChat/resources/contact.d.ts +12 -0
  16. package/dist/nodes/ZarkChat/resources/contact.js +390 -0
  17. package/dist/nodes/ZarkChat/resources/contact.js.map +1 -0
  18. package/dist/nodes/ZarkChat/resources/conversation.d.ts +13 -0
  19. package/dist/nodes/ZarkChat/resources/conversation.js +186 -0
  20. package/dist/nodes/ZarkChat/resources/conversation.js.map +1 -0
  21. package/dist/nodes/ZarkChat/resources/message.d.ts +11 -0
  22. package/dist/nodes/ZarkChat/resources/message.js +69 -0
  23. package/dist/nodes/ZarkChat/resources/message.js.map +1 -0
  24. package/dist/nodes/ZarkChat/resources/misc.d.ts +16 -0
  25. package/dist/nodes/ZarkChat/resources/misc.js +330 -0
  26. package/dist/nodes/ZarkChat/resources/misc.js.map +1 -0
  27. package/dist/nodes/ZarkChat/shared/descriptions.d.ts +19 -0
  28. package/dist/nodes/ZarkChat/shared/descriptions.js +63 -0
  29. package/dist/nodes/ZarkChat/shared/descriptions.js.map +1 -0
  30. package/dist/nodes/ZarkChat/shared/messageBody.d.ts +10 -0
  31. package/dist/nodes/ZarkChat/shared/messageBody.js +159 -0
  32. package/dist/nodes/ZarkChat/shared/messageBody.js.map +1 -0
  33. package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.d.ts +17 -0
  34. package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.js +132 -0
  35. package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.js.map +1 -0
  36. package/dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.json +18 -0
  37. 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[];