n8n-nodes-zarkchat 0.4.0 → 0.6.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/README.md +134 -9
- package/dist/nodes/ZarkChat/resources/conversation.js +127 -1
- package/dist/nodes/ZarkChat/resources/conversation.js.map +1 -1
- package/dist/nodes/ZarkChat/shared/rateLimit.d.ts +0 -40
- package/dist/nodes/ZarkChat/shared/rateLimit.js +25 -0
- package/dist/nodes/ZarkChat/shared/rateLimit.js.map +1 -1
- package/package.json +71 -71
package/README.md
CHANGED
|
@@ -6,11 +6,35 @@ Dois nodes e duas credenciais:
|
|
|
6
6
|
|
|
7
7
|
| Item | Para quê |
|
|
8
8
|
| ------------------------ | ------------------------------------------------------------------- |
|
|
9
|
-
| **ZarkChat** | 10 resources,
|
|
9
|
+
| **ZarkChat** | 10 resources, 35 operações. Também usável como ferramenta de Agent. |
|
|
10
10
|
| **ZarkChat Trigger** | Recebe os webhooks de saída, com validação de assinatura HMAC. |
|
|
11
11
|
| **ZarkChat API** | Credencial da api-key (`zk_live_...`) e da URL base. |
|
|
12
12
|
| **ZarkChat Webhook API** | Credencial do segredo HMAC de um webhook. |
|
|
13
13
|
|
|
14
|
+
## Versões
|
|
15
|
+
|
|
16
|
+
### 0.6.0 — 2026-08-31
|
|
17
|
+
|
|
18
|
+
Três entregas que estavam no código e **nunca tinham sido publicadas**. Quem
|
|
19
|
+
estava na `0.5.0` não tinha nenhuma delas, mesmo com a API já pronta dos dois
|
|
20
|
+
lados — foi o que motivou o job de publicação automática por tag (ver abaixo).
|
|
21
|
+
|
|
22
|
+
- **`conversation: setBot`** — liga/desliga o bot de uma conversa. É o outro
|
|
23
|
+
lado do `botEnabled` que o `get` já devolvia, e fecha o handoff para humano:
|
|
24
|
+
sem ele, quando o agente escala a conversa fica num limbo, com o bot ligado
|
|
25
|
+
no painel e ninguém avisado. Escopo `conversations:bot`, ESTREITO: não muda
|
|
26
|
+
status, atribuição nem equipe.
|
|
27
|
+
- **`conversation: setPresence`** e **`conversation: typingPlan`** — presença
|
|
28
|
+
simulada ("digitando..."/"gravando...") e o cálculo do tempo plausível de
|
|
29
|
+
digitação. Existiam desde o M14.15.6 e nunca chegaram ao npm.
|
|
30
|
+
- **`agent: getConfig` com as guardas** — `knowledgeBases` (todas as bases, não
|
|
31
|
+
só a principal), `somenteDaBase` e `acoesSensiveis`.
|
|
32
|
+
|
|
33
|
+
### 0.5.0
|
|
34
|
+
|
|
35
|
+
`Idempotency-Key` no envio de mensagem. Sem ele o envio por api-key estava
|
|
36
|
+
100% quebrado.
|
|
37
|
+
|
|
14
38
|
## Instalação
|
|
15
39
|
|
|
16
40
|
**No n8n auto-hospedado**, em Settings → Community Nodes → Install, informe:
|
|
@@ -145,14 +169,19 @@ Onde isso importa: o dado mora onde um restaurante novo encontra de graça (a co
|
|
|
145
169
|
|
|
146
170
|
### Conversation
|
|
147
171
|
|
|
148
|
-
| Operação
|
|
149
|
-
|
|
|
150
|
-
| **Get Many**
|
|
151
|
-
| **Get**
|
|
152
|
-
| **Get Counts**
|
|
153
|
-
| **Get Insight**
|
|
154
|
-
| **Get Messages**
|
|
155
|
-
| **Send Message**
|
|
172
|
+
| Operação | Escopo | Campos |
|
|
173
|
+
| ------------------- | -------------------- | ----------------------------------------------------------------------------------------- |
|
|
174
|
+
| **Get Many** | `conversations:read` | Filters: Status, Assigned, Number ID, Contact ID, Search, Cursor, Limit |
|
|
175
|
+
| **Get** | `conversations:read` | Conversation ID. **Traz `botEnabled`.** |
|
|
176
|
+
| **Get Counts** | `conversations:read` | Number ID |
|
|
177
|
+
| **Get Insight** | `conversations:read` | Conversation ID. Temperatura, estágio e score prontos. |
|
|
178
|
+
| **Get Messages** | `messages:read` | Conversation ID + Cursor, Limit |
|
|
179
|
+
| **Send Message** | `messages:send` | Conversation ID + corpo (Text, Media, Template, Interactive) |
|
|
180
|
+
| **Set Presence** | `presence:write` | Conversation ID + State (Composing, Recording, Paused) + Duration (Ms) |
|
|
181
|
+
| **Set Bot** | `conversations:bot` | Conversation ID + Bot Enabled. **Rota estreita:** não muda status, atribuição nem equipe. |
|
|
182
|
+
| **Get Typing Plan** | `presence:write` | Blocks (lista de textos) + Mode (Auto, Typed, Pasted, None) + Budget (Ms) |
|
|
183
|
+
|
|
184
|
+
> **Novo em 2026-08-31 — `Set Bot`:** é o outro lado do `botEnabled` que o `Get` já devolve, e fecha o handoff para humano. Sem ele, quando o agente escala a conversa fica num limbo: bot ligado no painel, ninguém avisado, cliente falando sozinho — e o silêncio, que é a resposta certa, vira indistinguível de sistema quebrado. O escopo é ESTREITO de propósito (`conversations:bot`, não `conversations:write`): o integrador não precisa poder mudar status, atribuição e equipe só para calar o robô. Pedido pelo integrador do Tantalo, com essas palavras.
|
|
156
185
|
|
|
157
186
|
> **Mudou em 2026-08-14:** cada item de **Get Messages** já traz `media` (URL assinada 15 min, `mime`, `sizeBytes`, `filename`, `expiresAt`) quando a mensagem tem anexo, sem precisar de um `Media: Get` por mensagem. `mediaAssetId` continua no item por retrocompat. **`Message: Get` (mensagem avulsa) não ganhou esse campo**: ainda devolve só `mediaAssetId`, use `Media: Get` nesse caso, ou quando a URL de uma mensagem já listada tiver expirado.
|
|
158
187
|
|
|
@@ -303,6 +332,102 @@ Em n8n com `EXECUTIONS_MODE=queue`, o pacote precisa estar no editor, no webhook
|
|
|
303
332
|
|
|
304
333
|
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.
|
|
305
334
|
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## MUDANÇA DE CONTRATO (M14.13) — leia antes de escrever `knowledgeBase`
|
|
338
|
+
|
|
339
|
+
`agent: getConfig` passou a devolver **todas** as bases do agente. O campo
|
|
340
|
+
antigo continua existindo, e a diferença importa:
|
|
341
|
+
|
|
342
|
+
```jsonc
|
|
343
|
+
{
|
|
344
|
+
"agentId": "...",
|
|
345
|
+
"knowledgeBase": { "id": "...", "name": "Cardápio" }, // PRINCIPAL, compat
|
|
346
|
+
"knowledgeBases": [
|
|
347
|
+
// TODAS (M14.13)
|
|
348
|
+
{ "id": "...", "name": "Cardápio" },
|
|
349
|
+
{ "id": "...", "name": "Política de troca" },
|
|
350
|
+
{ "id": "...", "name": "Perguntas frequentes" },
|
|
351
|
+
],
|
|
352
|
+
"somenteDaBase": false,
|
|
353
|
+
"acoesSensiveis": ["cancelar_pedido"],
|
|
354
|
+
"enabled": true,
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
**O sintoma de ler o campo errado:** o agente responde com um terço do
|
|
359
|
+
material e o cliente conclui que a base está incompleta. Um workflow que faz
|
|
360
|
+
`knowledgeBase?.id` continua funcionando, mas **só consulta a base principal** —
|
|
361
|
+
foi exatamente o que encontramos no workflow do Tantalo.
|
|
362
|
+
|
|
363
|
+
O correto é iterar `knowledgeBases` e buscar em cada uma:
|
|
364
|
+
|
|
365
|
+
```js
|
|
366
|
+
// RUIM (só a principal)
|
|
367
|
+
const kbId = $('Buscar - Config do Agente').first().json.knowledgeBase?.id ?? '';
|
|
368
|
+
|
|
369
|
+
// BOM (todas)
|
|
370
|
+
const bases = $('Buscar - Config do Agente').first().json.knowledgeBases ?? [];
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
`knowledgeBase` (singular) é sempre o **primeiro** item de `knowledgeBases`, e
|
|
374
|
+
é a mesma base de sempre: workflow antigo não passa a ler outra por acidente.
|
|
375
|
+
|
|
376
|
+
### As duas guardas novas
|
|
377
|
+
|
|
378
|
+
| Campo | Quem respeita | Se ignorar |
|
|
379
|
+
| ---------------- | -------------- | --------------------------------------------------------------- |
|
|
380
|
+
| `somenteDaBase` | **o workflow** | o agente improvisa onde o cliente pediu para ele não improvisar |
|
|
381
|
+
| `acoesSensiveis` | **o workflow** | o agente cancela pedido e dá desconto sem ninguém confirmar |
|
|
382
|
+
|
|
383
|
+
**Nenhuma das duas bloqueia nada sozinha.** A resposta não é gerada no
|
|
384
|
+
ZarkChat: cadastrar aqui só declara a intenção. Com `somenteDaBase: true`, o
|
|
385
|
+
prompt precisa mandar dizer "não sei" quando a busca não trouxer nada — em vez
|
|
386
|
+
de improvisar. Com `acoesSensiveis` preenchido, a tool correspondente precisa
|
|
387
|
+
**pedir confirmação humana** antes de executar.
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## Presença: "digitando..." de verdade (M14.15)
|
|
392
|
+
|
|
393
|
+
Escopo **`presence:write`**, separado de `messages:send`: quem só sinaliza não
|
|
394
|
+
deve poder enviar.
|
|
395
|
+
|
|
396
|
+
**Não implemente o cálculo de tempo no workflow.** `POST /v1/typing-plan`
|
|
397
|
+
recebe os blocos e devolve `typingMs` e `pausaMs` de cada um, já com piso, teto
|
|
398
|
+
e orçamento da resposta inteira. O `Wait` fixo de 2 segundos que a maioria dos
|
|
399
|
+
workflows usa faz um "ok" e um cardápio de 900 caracteres levarem o mesmo
|
|
400
|
+
tempo — e é isso que denuncia o robô.
|
|
401
|
+
|
|
402
|
+
Sequência por bloco:
|
|
403
|
+
|
|
404
|
+
```
|
|
405
|
+
typing-plan (uma vez, com todos os blocos)
|
|
406
|
+
→ por bloco: presence(composing, durationMs) → wait(typingMs)
|
|
407
|
+
→ checar botEnabled → sendMessage → wait(pausaMs)
|
|
408
|
+
→ ao cair no silêncio/handoff: presence(paused)
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
O último passo não é enfeite: cliente olhando "digitando..." esperando resposta
|
|
412
|
+
que nunca vem é **pior** que silêncio limpo, porque promete resposta imediata.
|
|
413
|
+
|
|
414
|
+
`presence` **nunca** devolve erro por falta de capacidade: a resposta é sempre
|
|
415
|
+
`ok: true` com `applied` dizendo se o sinal saiu. No número oficial da Meta,
|
|
416
|
+
`applied` vem `false` — o indicador de lá é preso ao recibo de leitura.
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
## Papel `gestor` e o que api-key NÃO alcança
|
|
421
|
+
|
|
422
|
+
Existe um papel novo entre admin e atendente: **`gestor`**. Ele faz tudo que o
|
|
423
|
+
atendente faz e enxerga compliance **só das equipes dele**.
|
|
424
|
+
|
|
425
|
+
**Todas as rotas de compliance recusam api-key** (`403`). O `ApiScopeGuard` é
|
|
426
|
+
allowlist: rota sem escopo declarado não aceita `zk_live_*`. Automação de
|
|
427
|
+
terceiro não define o que a empresa monitora nem lê trecho de conversa. Se o
|
|
428
|
+
seu workflow precisa de algo de lá, peça ao time — não contorne com JWT de
|
|
429
|
+
usuário.
|
|
430
|
+
|
|
306
431
|
## Licença
|
|
307
432
|
|
|
308
433
|
MIT
|
|
@@ -72,6 +72,13 @@ exports.conversationOperations = [
|
|
|
72
72
|
output: { postReceive: [{ type: 'rootProperty', properties: { property: 'data' } }] },
|
|
73
73
|
},
|
|
74
74
|
},
|
|
75
|
+
{
|
|
76
|
+
name: 'Get Typing Plan',
|
|
77
|
+
value: 'typingPlan',
|
|
78
|
+
action: 'Calculate a plausible typing time for a whole reply',
|
|
79
|
+
description: 'Devolve quanto tempo cada bloco levaria para ser digitado, respeitando piso, teto e orçamento. A conta mora na API de propósito: refeita no workflow, o erro mais comum (esquecer o teto) deixa o atendimento mais LENTO que sem simulação nenhuma.',
|
|
80
|
+
routing: { request: { method: 'POST', url: '/v1/typing-plan' } },
|
|
81
|
+
},
|
|
75
82
|
{
|
|
76
83
|
name: 'Send Message',
|
|
77
84
|
value: 'sendMessage',
|
|
@@ -83,6 +90,31 @@ exports.conversationOperations = [
|
|
|
83
90
|
},
|
|
84
91
|
},
|
|
85
92
|
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Set Bot',
|
|
95
|
+
value: 'setBot',
|
|
96
|
+
action: 'Turn the bot on or off for a conversation',
|
|
97
|
+
description: 'Liga ou desliga o bot DESTA conversa. É o outro lado do botEnabled que o Get já devolve. Pedido pelo integrador do Tantalo: quando o agente escala para humano, ele precisa se desligar sozinho — sem isso a escalada é invisível dos dois lados, o cliente não sabe que foi para uma pessoa e a pessoa não sabe que precisa agir. Rota ESTREITA: não altera status, atribuição nem equipe. Exige o escopo conversations:bot na chave.',
|
|
98
|
+
routing: {
|
|
99
|
+
request: {
|
|
100
|
+
method: 'PATCH',
|
|
101
|
+
url: '=/v1/conversations/{{$parameter.conversationId}}/bot',
|
|
102
|
+
body: { botEnabled: '={{$parameter.botEnabled}}' },
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'Set Presence',
|
|
108
|
+
value: 'setPresence',
|
|
109
|
+
action: 'Set typing or recording presence in a conversation',
|
|
110
|
+
description: 'Mostra "digitando..." ou "gravando..." no WhatsApp do cliente. Cobre o tempo em que o agente PENSA, que é quando ainda não existe texto para enviar. Nunca falha o envio: responde applied:false quando o provedor não suporta.',
|
|
111
|
+
routing: {
|
|
112
|
+
request: {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
url: '=/v1/conversations/{{$parameter.conversationId}}/presence',
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
86
118
|
],
|
|
87
119
|
default: 'getAll',
|
|
88
120
|
},
|
|
@@ -98,10 +130,21 @@ exports.conversationFields = [
|
|
|
98
130
|
displayOptions: {
|
|
99
131
|
show: {
|
|
100
132
|
resource: ['conversation'],
|
|
101
|
-
operation: ['get', 'insight', 'getMessages', 'sendMessage'],
|
|
133
|
+
operation: ['get', 'insight', 'getMessages', 'sendMessage', 'setPresence', 'setBot'],
|
|
102
134
|
},
|
|
103
135
|
},
|
|
104
136
|
},
|
|
137
|
+
{
|
|
138
|
+
displayName: 'Bot Enabled',
|
|
139
|
+
name: 'botEnabled',
|
|
140
|
+
type: 'boolean',
|
|
141
|
+
default: false,
|
|
142
|
+
required: true,
|
|
143
|
+
description: 'Whether the bot should answer in this conversation. Desligar é o passo que falta na escalada para humano: o agente cala E se desliga, e quem atendeu religa quando resolveu.',
|
|
144
|
+
displayOptions: {
|
|
145
|
+
show: { resource: ['conversation'], operation: ['setBot'] },
|
|
146
|
+
},
|
|
147
|
+
},
|
|
105
148
|
// Get Many
|
|
106
149
|
{
|
|
107
150
|
displayName: 'Filters',
|
|
@@ -182,5 +225,88 @@ exports.conversationFields = [
|
|
|
182
225
|
},
|
|
183
226
|
// Send Message
|
|
184
227
|
...(0, messageBody_1.messageBodyFields)({ resource: ['conversation'], operation: ['sendMessage'] }),
|
|
228
|
+
/* ---------- Set Presence (M14.15.6, doc 12 §7) ----------
|
|
229
|
+
Operação AVULSA e não um campo dentro do `sendMessage`: são dois momentos
|
|
230
|
+
diferentes. PENSAR não tem texto ainda (por isso precisa de chamada
|
|
231
|
+
própria); DIGITAR tem o texto na mão. O `delayMs` no envio, que juntaria
|
|
232
|
+
os dois, foi avaliado no M14.15.2 e considerado dispensável, então não
|
|
233
|
+
existe campo de simulação dentro do envio para espelhar aqui.
|
|
234
|
+
|
|
235
|
+
Nada muda para quem já usa o nó: as duas operações são novas e ninguém
|
|
236
|
+
passa a simular digitação sem escolher. Era essa a exigência de "nascer
|
|
237
|
+
desligado" — um workflow em produção não pode ficar mais lento de uma
|
|
238
|
+
versão para a outra sem ter pedido. */
|
|
239
|
+
{
|
|
240
|
+
displayName: 'State',
|
|
241
|
+
name: 'presenceState',
|
|
242
|
+
type: 'options',
|
|
243
|
+
default: 'composing',
|
|
244
|
+
required: true,
|
|
245
|
+
description: 'O que mostrar no WhatsApp do cliente. Use "Paused" ao passar para um humano: cliente olhando "digitando..." esperando resposta que não vem é pior que silêncio limpo.',
|
|
246
|
+
options: [
|
|
247
|
+
{ name: 'Composing (Typing)', value: 'composing' },
|
|
248
|
+
{
|
|
249
|
+
name: 'Recording (Voice)',
|
|
250
|
+
value: 'recording',
|
|
251
|
+
description: 'Para resposta em áudio. Mandar nota de voz sem passar por "gravando" fica estranho.',
|
|
252
|
+
},
|
|
253
|
+
{ name: 'Paused (Stop)', value: 'paused' },
|
|
254
|
+
],
|
|
255
|
+
displayOptions: { show: { resource: ['conversation'], operation: ['setPresence'] } },
|
|
256
|
+
routing: { send: { type: 'body', property: 'state' } },
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
displayName: 'Duration (Ms)',
|
|
260
|
+
name: 'presenceDurationMs',
|
|
261
|
+
type: 'number',
|
|
262
|
+
default: 0,
|
|
263
|
+
description: 'Por quanto tempo manter o sinal, até 300000 (teto do provedor). Deixe 0 para o padrão do provedor. Acima de 300000 é quase sempre engano de unidade (segundos no lugar de milissegundos).',
|
|
264
|
+
typeOptions: { minValue: 0, maxValue: 300000 },
|
|
265
|
+
displayOptions: { show: { resource: ['conversation'], operation: ['setPresence'] } },
|
|
266
|
+
routing: { send: { type: 'body', property: 'durationMs' } },
|
|
267
|
+
},
|
|
268
|
+
/* ---------- Get Typing Plan ---------- */
|
|
269
|
+
{
|
|
270
|
+
displayName: 'Blocks',
|
|
271
|
+
name: 'planBlocos',
|
|
272
|
+
type: 'json',
|
|
273
|
+
default: '[]',
|
|
274
|
+
required: true,
|
|
275
|
+
description: 'Os blocos da resposta, na ordem, como lista de textos (1 a 20). Ex.: ["Oi, João!", "A marmita grande sai por R$ 24,00."].',
|
|
276
|
+
displayOptions: { show: { resource: ['conversation'], operation: ['typingPlan'] } },
|
|
277
|
+
routing: { send: { type: 'body', property: 'blocos' } },
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
displayName: 'Mode',
|
|
281
|
+
name: 'planMode',
|
|
282
|
+
type: 'options',
|
|
283
|
+
default: 'auto',
|
|
284
|
+
options: [
|
|
285
|
+
{
|
|
286
|
+
name: 'Auto',
|
|
287
|
+
value: 'auto',
|
|
288
|
+
description: 'Decide entre digitado e colado pelo tamanho e formato do texto',
|
|
289
|
+
},
|
|
290
|
+
{ name: 'Typed', value: 'typed' },
|
|
291
|
+
{
|
|
292
|
+
name: 'Pasted',
|
|
293
|
+
value: 'pasted',
|
|
294
|
+
description: 'Texto longo ou lista: tempo curto e fixo, como quem cola. Não é zero: zero denuncia o robô tanto quanto seis segundos.',
|
|
295
|
+
},
|
|
296
|
+
{ name: 'None (No Delay)', value: 'none' },
|
|
297
|
+
],
|
|
298
|
+
displayOptions: { show: { resource: ['conversation'], operation: ['typingPlan'] } },
|
|
299
|
+
routing: { send: { type: 'body', property: 'mode' } },
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
displayName: 'Budget (Ms)',
|
|
303
|
+
name: 'planBudgetMs',
|
|
304
|
+
type: 'number',
|
|
305
|
+
default: 0,
|
|
306
|
+
description: 'Teto para a resposta INTEIRA, não por bloco. Deixe 0 para não limitar. Quando o orçamento não cobre nem o piso de cada bloco, o piso vence: bloco espremido volta a denunciar o robô, que é o que a simulação existe para evitar.',
|
|
307
|
+
typeOptions: { minValue: 0, maxValue: 120000 },
|
|
308
|
+
displayOptions: { show: { resource: ['conversation'], operation: ['typingPlan'] } },
|
|
309
|
+
routing: { send: { type: 'body', property: 'budgetMs' } },
|
|
310
|
+
},
|
|
185
311
|
];
|
|
186
312
|
//# sourceMappingURL=conversation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../../nodes/ZarkChat/resources/conversation.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../../nodes/ZarkChat/resources/conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +1,4 @@
|
|
|
1
1
|
import type { DeclarativeRestApiSettings, IDataObject, IExecutePaginationFunctions, INodeExecutionData } from 'n8n-workflow';
|
|
2
|
-
/**
|
|
3
|
-
* Trata 429 dentro de um node declarativo (`routing`, sem `execute()`), sem
|
|
4
|
-
* reescrever as 32 operações.
|
|
5
|
-
*
|
|
6
|
-
* ONDE ISTO PODE VIVER: o formato declarativo só dá UM ponto de extensão com
|
|
7
|
-
* acesso à requisição HTTP inteira (método, URL, corpo, headers) ANTES dela
|
|
8
|
-
* sair: o hook de paginação
|
|
9
|
-
* (`INodeTypeDescription.requestOperations.pagination`, quando é uma
|
|
10
|
-
* função). Ele roda mesmo sem paginação de verdade acontecer; só precisa que
|
|
11
|
-
* `routing.send.paginate` esteja ligado em algum campo visível na chamada.
|
|
12
|
-
* Ligamos isso UMA vez no campo `resource` (o único sempre presente, em
|
|
13
|
-
* toda operação), então nenhuma das 32 operações muda.
|
|
14
|
-
*
|
|
15
|
-
* Os outros pontos do routing NÃO servem pra isto:
|
|
16
|
-
* - `postReceive` (função ou declarativo) só roda em cima de uma resposta
|
|
17
|
-
* já processada e não recebe de volta a requisição que a gerou, só a
|
|
18
|
-
* resposta. Não dá pra reemitir a chamada a partir dele.
|
|
19
|
-
* - Sem `ignoreHttpStatusErrors`, um 429 já sai como `NodeApiError` antes de
|
|
20
|
-
* qualquer hook rodar, e nessa conversão os headers da resposta (onde mora
|
|
21
|
-
* o `Retry-After`) não sobrevivem no objeto de erro.
|
|
22
|
-
*
|
|
23
|
-
* Por isso a chamada HTTP em si é feita AQUI, com
|
|
24
|
-
* `helpers.httpRequestWithAuthentication` (o mesmo helper que o RoutingNode
|
|
25
|
-
* usa por baixo) e `ignoreHttpStatusErrors: true`, pra poder ler o
|
|
26
|
-
* `Retry-After` num 429 sem que ele vire exceção primeiro. A consequência é
|
|
27
|
-
* que este arquivo também reimplementa, à mão, os dois pedaços que o n8n
|
|
28
|
-
* faria sozinho num node declarativo comum:
|
|
29
|
-
*
|
|
30
|
-
* 1. O pós-processamento declarativo (`postReceive`) — hoje só o tipo
|
|
31
|
-
* `rootProperty`, usado por Contact/Conversation: Get Many e
|
|
32
|
-
* Conversation: Get Messages pra desembrulhar `{data:[...], nextCursor}`.
|
|
33
|
-
* 2. O `NodeApiError` pros status que não são 429, pra manter a mesma
|
|
34
|
-
* mensagem de erro que as operações já davam antes desta mudança.
|
|
35
|
-
*
|
|
36
|
-
* Se uma operação nova um dia precisar de um tipo de `postReceive` diferente
|
|
37
|
-
* de `rootProperty` (`filter`, `limit`, `set`, `sort`, `setKeyValue`,
|
|
38
|
-
* `binaryData` ou uma função customizada), `aplicarPostReceive` abaixo
|
|
39
|
-
* lança um erro claro em vez de ignorar silenciosamente: é o sinal de que
|
|
40
|
-
* este arquivo precisa ganhar suporte a esse tipo.
|
|
41
|
-
*/
|
|
42
2
|
/** Teto de tentativas pro 429: 1 chamada original + até 3 reenvios. Não fica preso pra sempre. */
|
|
43
3
|
export declare const RATE_LIMIT_MAX_ATTEMPTS = 4;
|
|
44
4
|
/** Lê o `Retry-After` (sempre em segundos inteiros, ver `rate-limit.service.ts`) em ms, com teto e fallback. */
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.RATE_LIMIT_MAX_ATTEMPTS = void 0;
|
|
4
4
|
exports.parseRetryAfterMs = parseRetryAfterMs;
|
|
5
5
|
exports.zarkChatRateLimitedRequest = zarkChatRateLimitedRequest;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
7
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
7
8
|
/**
|
|
8
9
|
* Trata 429 dentro de um node declarativo (`routing`, sem `execute()`), sem
|
|
@@ -44,6 +45,8 @@ const n8n_workflow_1 = require("n8n-workflow");
|
|
|
44
45
|
* lança um erro claro em vez de ignorar silenciosamente: é o sinal de que
|
|
45
46
|
* este arquivo precisa ganhar suporte a esse tipo.
|
|
46
47
|
*/
|
|
48
|
+
/** Cabeçalho que a API exige em envio via api-key (`IdempotencyInterceptor`). */
|
|
49
|
+
const HEADER_IDEMPOTENCIA = 'Idempotency-Key';
|
|
47
50
|
/** Teto de tentativas pro 429: 1 chamada original + até 3 reenvios. Não fica preso pra sempre. */
|
|
48
51
|
exports.RATE_LIMIT_MAX_ATTEMPTS = 4;
|
|
49
52
|
/** Nome da credencial usada por todas as 32 operações (ver ZarkChatApi.credentials.ts). */
|
|
@@ -114,6 +117,28 @@ function respostaComoErro(response) {
|
|
|
114
117
|
* liga `routing.send.paginate`.
|
|
115
118
|
*/
|
|
116
119
|
async function zarkChatRateLimitedRequest(requestOptions) {
|
|
120
|
+
var _a, _b;
|
|
121
|
+
// BLOQUEADOR RESOLVIDO (relatado pelo integrador do Tantalo em 2026-08-15):
|
|
122
|
+
// a API exige `Idempotency-Key` em envio via api-key, e o nó não mandava
|
|
123
|
+
// nenhum. Resultado medido: TODA tentativa de responder cliente voltava
|
|
124
|
+
// 400 e o agente nunca entregou uma mensagem.
|
|
125
|
+
//
|
|
126
|
+
// A CHAVE NASCE AQUI, FORA DO LAÇO, e é isso que faz a coisa prestar. Ela
|
|
127
|
+
// precisa ser estável por MENSAGEM LÓGICA, não por tentativa HTTP: gerada
|
|
128
|
+
// dentro do laço, um 429 seguido de reenvio entregaria DUAS mensagens ao
|
|
129
|
+
// cliente, que é exatamente o que a idempotência existe pra impedir.
|
|
130
|
+
//
|
|
131
|
+
// Só em envio (POST). Em GET o cabeçalho seria ruído, e a API nem olha.
|
|
132
|
+
// Chave que o workflow já definiu é respeitada: quem monta o próprio
|
|
133
|
+
// reenvio no n8n precisa poder controlar a idempotência dele.
|
|
134
|
+
const opcoes = requestOptions.options;
|
|
135
|
+
if (String((_a = opcoes.method) !== null && _a !== void 0 ? _a : 'GET').toUpperCase() === 'POST') {
|
|
136
|
+
const headers = (_b = opcoes.headers) !== null && _b !== void 0 ? _b : {};
|
|
137
|
+
if (!headers[HEADER_IDEMPOTENCIA]) {
|
|
138
|
+
headers[HEADER_IDEMPOTENCIA] = (0, node_crypto_1.randomUUID)();
|
|
139
|
+
}
|
|
140
|
+
opcoes.headers = headers;
|
|
141
|
+
}
|
|
117
142
|
let tentativa = 1;
|
|
118
143
|
while (true) {
|
|
119
144
|
const response = (await this.helpers.httpRequestWithAuthentication.call(this, CREDENTIAL_TYPE, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../../../nodes/ZarkChat/shared/rateLimit.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../../../nodes/ZarkChat/shared/rateLimit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
2
|
+
"name": "n8n-nodes-zarkchat",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "Nodes do ZarkChat para o n8n: CRM, contatos, conversas, envio de mensagem no WhatsApp, base de conhecimento e gatilho por webhook assinado.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/mayconjordanr/zark-chat/tree/main/packages/n8n-nodes-zarkchat#readme",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"n8n-community-node-package",
|
|
9
|
+
"n8n",
|
|
10
|
+
"n8n-nodes",
|
|
11
|
+
"zarkchat",
|
|
12
|
+
"whatsapp",
|
|
13
|
+
"crm",
|
|
14
|
+
"chatbot",
|
|
15
|
+
"atendimento",
|
|
16
|
+
"leads",
|
|
17
|
+
"pipeline"
|
|
18
|
+
],
|
|
19
|
+
"author": {
|
|
20
|
+
"name": "ZARK"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/mayconjordanr/zark-chat.git",
|
|
25
|
+
"directory": "packages/n8n-nodes-zarkchat"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "rimraf dist && tsc && node scripts/copy-assets.mjs",
|
|
29
|
+
"type-check": "tsc --noEmit",
|
|
30
|
+
"lint": "eslint credentials nodes --ext .ts",
|
|
31
|
+
"test": "jest --passWithNoTests"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"LICENSE.md",
|
|
36
|
+
"README.md"
|
|
37
|
+
],
|
|
38
|
+
"n8n": {
|
|
39
|
+
"n8nNodesApiVersion": 1,
|
|
40
|
+
"credentials": [
|
|
41
|
+
"dist/credentials/ZarkChatApi.credentials.js",
|
|
42
|
+
"dist/credentials/ZarkChatWebhookApi.credentials.js"
|
|
43
|
+
],
|
|
44
|
+
"nodes": [
|
|
45
|
+
"dist/nodes/ZarkChat/ZarkChat.node.js",
|
|
46
|
+
"dist/nodes/ZarkChatTrigger/ZarkChatTrigger.node.js"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/jest": "^30.0.0",
|
|
51
|
+
"@types/node": "^22.10.2",
|
|
52
|
+
"@typescript-eslint/parser": "^7.18.0",
|
|
53
|
+
"eslint": "^8.57.0",
|
|
54
|
+
"eslint-plugin-n8n-nodes-base": "^1.16.3",
|
|
55
|
+
"jest": "^30.0.0",
|
|
56
|
+
"n8n-workflow": "^1.82.0",
|
|
57
|
+
"rimraf": "^6.0.1",
|
|
58
|
+
"ts-jest": "^29.2.5",
|
|
59
|
+
"typescript": "^5.7.2"
|
|
60
|
+
},
|
|
61
|
+
"peerDependencies": {
|
|
62
|
+
"n8n-workflow": "*"
|
|
63
|
+
},
|
|
64
|
+
"bugs": {
|
|
65
|
+
"url": "https://github.com/mayconjordanr/zark-chat/issues"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": ">=20.15"
|
|
69
|
+
},
|
|
70
|
+
"publishConfig": {
|
|
71
|
+
"access": "public"
|
|
72
|
+
}
|
|
73
73
|
}
|