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 CHANGED
@@ -6,11 +6,35 @@ Dois nodes e duas credenciais:
6
6
 
7
7
  | Item | Para quê |
8
8
  | ------------------------ | ------------------------------------------------------------------- |
9
- | **ZarkChat** | 10 resources, 32 operações. Também usável como ferramenta de Agent. |
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 | Escopo | Campos |
149
- | ---------------- | -------------------- | ----------------------------------------------------------------------- |
150
- | **Get Many** | `conversations:read` | Filters: Status, Assigned, Number ID, Contact ID, Search, Cursor, Limit |
151
- | **Get** | `conversations:read` | Conversation ID. **Traz `botEnabled`.** |
152
- | **Get Counts** | `conversations:read` | Number ID |
153
- | **Get Insight** | `conversations:read` | Conversation ID. Temperatura, estágio e score prontos. |
154
- | **Get Messages** | `messages:read` | Conversation ID + Cursor, Limit |
155
- | **Send Message** | `messages:send` | Conversation ID + corpo (Text, Media, Template, Interactive) |
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":";;;AACA,yDAAgF;AAChF,uDAA0D;AAE1D,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;AAC5C,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAEhG;;;;;;;;;GASG;AACU,QAAA,sBAAsB,GAAsB;IACxD;QACC,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,EAAE,IAAI,EAAE;QACxB,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,oBAAoB;gBAC5B,WAAW,EAAE,0DAA0D;gBACvE,OAAO,EAAE;oBACR,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,kDAAkD,EAAE;iBACnF;aACD;YACD;gBACC,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,yBAAyB;gBACjC,WAAW,EAAE,8BAA8B;gBAC3C,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,0BAA0B,EAAE,EAAE;aACxE;YACD;gBACC,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,sCAAsC;gBAC9C,WAAW,EAAE,0DAA0D;gBACvE,OAAO,EAAE;oBACR,OAAO,EAAE;wBACR,MAAM,EAAE,KAAK;wBACb,GAAG,EAAE,0DAA0D;qBAC/D;iBACD;aACD;YACD;gBACC,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,wBAAwB;gBAChC,OAAO,EAAE;oBACR,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,mBAAmB,EAAE;oBACpD,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE;iBACrF;aACD;YACD;gBACC,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE,gCAAgC;gBACxC,OAAO,EAAE;oBACR,OAAO,EAAE;wBACR,MAAM,EAAE,KAAK;wBACb,GAAG,EAAE,2DAA2D;qBAChE;oBACD,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE;iBACrF;aACD;YACD;gBACC,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,qDAAqD;gBAC7D,WAAW,EACV,qPAAqP;gBACtP,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE;aAChE;YACD;gBACC,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE,kCAAkC;gBAC1C,OAAO,EAAE;oBACR,OAAO,EAAE;wBACR,MAAM,EAAE,MAAM;wBACd,GAAG,EAAE,2DAA2D;qBAChE;iBACD;aACD;YACD;gBACC,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,2CAA2C;gBACnD,WAAW,EACV,waAAwa;gBACza,OAAO,EAAE;oBACR,OAAO,EAAE;wBACR,MAAM,EAAE,OAAO;wBACf,GAAG,EAAE,sDAAsD;wBAC3D,IAAI,EAAE,EAAE,UAAU,EAAE,4BAA4B,EAAE;qBAClD;iBACD;aACD;YACD;gBACC,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE,oDAAoD;gBAC5D,WAAW,EACV,iOAAiO;gBAClO,OAAO,EAAE;oBACR,OAAO,EAAE;wBACR,MAAM,EAAE,MAAM;wBACd,GAAG,EAAE,2DAA2D;qBAChE;iBACD;aACD;SACD;QACD,OAAO,EAAE,QAAQ;KACjB;CACD,CAAC;AAEW,QAAA,kBAAkB,GAAsB;IACpD;QACC,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,kBAAkB;QAC/B,cAAc,EAAE;YACf,IAAI,EAAE;gBACL,QAAQ,EAAE,CAAC,cAAc,CAAC;gBAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,CAAC;aACpF;SACD;KACD;IAED;QACC,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;QACd,WAAW,EACV,8KAA8K;QAC/K,cAAc,EAAE;YACf,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;SAC3D;KACD;IAED,WAAW;IACX;QACC,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC3C,OAAO,EAAE;YACR;gBACC,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACR,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;oBAC/B,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;oBACvC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;oBACvC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;iBACrC;gBACD,OAAO,EAAE,MAAM;gBACf,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;aACxD;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,uCAAuC;gBACpD,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;aAC1D;YACD;gBACC,GAAG,4BAAa;gBAChB,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;aAC1D;YACD;gBACC,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE;aAC3D;YACD;gBACC,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,GAAG;gBACT,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,iCAAiC;gBAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE;aACnD;YACD;gBACC,GAAG,0BAAW;gBACd,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;aACxD;YACD;gBACC,GAAG,yBAAU;gBACb,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;aACvD;SACD;KACD;IAED,SAAS;IACT;QACC,GAAG,4BAAa;QAChB,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC3C,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;KAC1D;IAED,eAAe;IACf;QACC,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE;QAChD,OAAO,EAAE;YACR,EAAE,GAAG,0BAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC5E,EAAE,GAAG,yBAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;SAC1E;KACD;IAED,eAAe;IACf,GAAG,IAAA,+BAAiB,EAAC,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;IAEhF;;;;;;;;;;6CAUyC;IACzC;QACC,WAAW,EAAE,OAAO;QACpB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,IAAI;QACd,WAAW,EACV,uKAAuK;QACxK,OAAO,EAAE;YACR,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,WAAW,EAAE;YAClD;gBACC,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,WAAW;gBAClB,WAAW,EACV,qFAAqF;aACtF;YACD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;SAC1C;QACD,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE;QACpF,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;KACtD;IACD;QACC,WAAW,EAAE,eAAe;QAC5B,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC;QACV,WAAW,EACV,2LAA2L;QAC5L,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC9C,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE;QACpF,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;KAC3D;IAED,2CAA2C;IAC3C;QACC,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,WAAW,EACV,2HAA2H;QAC5H,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE;QACnF,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;KACvD;IACD;QACC,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,MAAM;QACf,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,gEAAgE;aAC7E;YACD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YACjC;gBACC,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,QAAQ;gBACf,WAAW,EACV,wHAAwH;aACzH;YACD,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE;SAC1C;QACD,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE;QACnF,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;KACrD;IACD;QACC,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC;QACV,WAAW,EACV,mOAAmO;QACpO,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC9C,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE;QACnF,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;KACzD;CACD,CAAC"}
@@ -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":";;;AAiEA,8CAMC;AAsED,gEAkCC;AAtKD,+CAAuE;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,kGAAkG;AACrF,QAAA,uBAAuB,GAAG,CAAC,CAAC;AAEzC,2FAA2F;AAC3F,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,mGAAmG;AACnG,MAAM,sBAAsB,GAAG,IAAK,CAAC;AAErC,sGAAsG;AACtG,MAAM,kBAAkB,GAAG,MAAO,CAAC;AAEnC,gHAAgH;AAChH,SAAgB,iBAAiB,CAAC,OAAoB;;IACrD,MAAM,KAAK,GAAG,MAAA,OAAO,CAAC,aAAa,CAAC,mCAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAC/E,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAC;AACtD,CAAC;AAED,uFAAuF;AACvF,SAAS,SAAS,CAAC,KAAc,EAAE,OAAe;IACjD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC1D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAK,KAAiC,EAAE,CAAC;YACvF,OAAQ,KAAiC,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,EAAE,KAAK,CAAC,CAAC;AACX,CAAC;AAUD;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAChC,GAAgC,EAChC,MAAyB,EACzB,QAA8B;;IAE9B,IAAI,KAAK,GAAyB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7D,CAAC,CAAE,QAAQ,CAAC,IAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,MAAA,QAAQ,CAAC,IAAI,mCAAI,EAAE,CAAgB,EAAE,CAAC,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChC,KAAK,GAAG,MAAO,IAAiC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC5E,SAAS;YACV,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAClC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC9B,IAAI,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAAE,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACpD,OAAQ,QAA0B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;gBACH,SAAS;YACV,CAAC;YACD,MAAM,IAAI,iCAAkB,CAC3B,GAAG,CAAC,OAAO,EAAE,EACb,oFAAoF,IAAI,CAAC,IAAI,sFAAsF,CACnL,CAAC;QACH,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,sGAAsG;AACtG,SAAS,gBAAgB,CAAC,QAA8B;IACvD,OAAO;QACN,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAmB,EAAE;KACpD,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,0BAA0B,CAE/C,cAAwD;IAExD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE;YAC9F,GAAG,cAAc,CAAC,OAAO;YACzB,kBAAkB,EAAE,IAAI;YACxB,sBAAsB,EAAE,IAAI;SACL,CAAC,CAAyB,CAAC;QAEnD,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,SAAS,GAAG,+BAAuB,EAAE,CAAC;YACxE,SAAS,IAAI,CAAC,CAAC;YACf,MAAM,IAAA,oBAAK,EAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,SAAS;QACV,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YACjC,MAAM,IAAI,2BAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAClE,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,yCAAyC,+BAAuB,wJAAwJ;aACjO,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;YAChC,MAAM,IAAI,2BAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;aACrC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,kBAAkB,CAAC,IAAI,EAAE,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;AACF,CAAC"}
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
- "name": "n8n-nodes-zarkchat",
3
- "version": "0.4.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
- }
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
  }