@wondai/n8n-nodes-nucleo 0.5.5 → 0.5.6

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
@@ -56,6 +56,11 @@ Exemplo de item configurável:
56
56
  O node não interpreta essas regras: ele encaminha o JSON sem alteração. A validação e o snapshot
57
57
  imutável do contrato aplicado pertencem à API do Núcleo (ADR-035).
58
58
 
59
+ A partir da v0.5.6, `Pedido Criar` falha antes da requisição quando `itens` está vazio ou quando
60
+ alguma linha não traz `produto_id`/`alias` e `quantidade` positiva. É uma proteção de integração:
61
+ o Núcleo continua sendo a autoridade final das regras, mas o workflow não envia pedido vazio por
62
+ erro de tool schema.
63
+
59
64
  **Disponibilidade na Rede** ("tem na outra loja?") é exposta como **tool** do AI Agent, mas com regra
60
65
  estrita no prompt: **usar SÓ quando o cliente pedir explicitamente outra unidade**. Passe o `produto_id`
61
66
  já resolvido (ou uma `consulta` curta). A loja que pergunta vem do **vínculo do token** (a IA não
@@ -86,6 +86,29 @@ function asArray(value) {
86
86
  }
87
87
  return [];
88
88
  }
89
+ function hasPedidoItemIdentifier(item) {
90
+ const produtoId = String(item.produto_id ?? "").trim();
91
+ const alias = String(item.alias ?? "").trim();
92
+ return Boolean(produtoId || alias);
93
+ }
94
+ function hasPositiveQuantidade(item) {
95
+ const quantidade = Number(item.quantidade);
96
+ return Number.isFinite(quantidade) && quantidade > 0;
97
+ }
98
+ function assertPedidoCriarItens(itens) {
99
+ if (!Array.isArray(itens) || itens.length === 0) {
100
+ throw new Error("Pedido Criar bloqueado: o campo itens precisa ser um array JSON não vazio com produto_id ou alias e quantidade. Resolva o catálogo e envie os itens estruturados antes de criar o pedido.");
101
+ }
102
+ const invalidIndex = itens.findIndex((item) => {
103
+ if (!item || typeof item !== "object" || Array.isArray(item))
104
+ return true;
105
+ const itemObject = item;
106
+ return !hasPedidoItemIdentifier(itemObject) || !hasPositiveQuantidade(itemObject);
107
+ });
108
+ if (invalidIndex >= 0) {
109
+ throw new Error(`Pedido Criar bloqueado: itens[${invalidIndex}] precisa ter produto_id ou alias e quantidade positiva.`);
110
+ }
111
+ }
89
112
  /** Lê um parâmetro JSON (string ou objeto) como objeto simples. Vazio → null. */
90
113
  function asObject(value) {
91
114
  if (value && typeof value === "object" && !Array.isArray(value))
@@ -884,6 +907,7 @@ class Nucleo {
884
907
  const telefone = this.getNodeParameter("telefone", i).trim();
885
908
  const nomeCliente = this.getNodeParameter("nomeCliente", i, "").trim();
886
909
  const itens = asArray(this.getNodeParameter("itens", i));
910
+ assertPedidoCriarItens(itens);
887
911
  const tipoEntrega = this.getNodeParameter("tipoEntrega", i);
888
912
  const observacoes = this.getNodeParameter("observacoes", i, "").trim();
889
913
  const agendadoPara = this.getNodeParameter("agendadoPara", i, "").trim();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wondai/n8n-nodes-nucleo",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "description": "Node n8n para o Núcleo Wondai — atendimento de IA (gate liga/desliga, cliente, catálogo fuzzy, disponibilidade em rede, pedidos, contexto operacional, telemetria) com assinatura HMAC v1. Tenant vem do token (a parede, ADR-013).",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",