@wondai/n8n-nodes-nucleo 0.6.1 → 0.6.3
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 +18 -2
- package/dist/nodes/Nucleo/Nucleo.node.js +103 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ parede. Isso mantém o segredo fora do workflow, a lógica num lugar só e o tok
|
|
|
26
26
|
| Pedido | Alterar | `PATCH /api/v1/agent/pedido/:id` | `pedido:escrever` |
|
|
27
27
|
| Pedido | Cancelar | `POST /api/v1/agent/pedido/:id/cancelar` | `pedido:escrever` |
|
|
28
28
|
| Conversa | Preparar | `POST /api/v1/agent/conversa/preparar` | `contexto:ler` |
|
|
29
|
-
| Contexto | Consultar
|
|
29
|
+
| Contexto | Consultar por Escopo | `POST /api/v1/agent/contexto/consultar` | `contexto:ler` |
|
|
30
30
|
| Conversa | Registrar | `POST /api/v1/agent/conversa/fechar` | `conversa:escrever` |
|
|
31
31
|
|
|
32
32
|
**Resolver Produtos** é a operação inteligente: manda várias consultas numa chamada (máx 10),
|
|
@@ -38,6 +38,11 @@ incompleto, opção inventada, quantidade inválida, prazo impossível ou person
|
|
|
38
38
|
|
|
39
39
|
Exemplo de item configurável:
|
|
40
40
|
|
|
41
|
+
Para pedidos de festa/orcamento, use `Modo Saida = Compacto Orcamento`, `Incluir Imagens = false`
|
|
42
|
+
e, quando existir, envie `Orcamento Contexto (JSON)` com estado pequeno do atendimento
|
|
43
|
+
(`pessoas`, `perfil`, `familias`, `preferencias`). O servidor monta `orcamento_sugerido` e omite
|
|
44
|
+
listas largas quando possivel; o node nao calcula preco nem escolhe produto.
|
|
45
|
+
|
|
41
46
|
```json
|
|
42
47
|
{
|
|
43
48
|
"produto_id": "uuid-do-produto",
|
|
@@ -70,6 +75,16 @@ telefone/endereço (allowlist) e distância opcional. **Disponibilidade NÃO é
|
|
|
70
75
|
declarou e oferece o contato para o cliente confirmar. Este endpoint **não** entra no contexto fixo do
|
|
71
76
|
gate; é chamado sob demanda. Tenant/unidade vêm do token — nunca do prompt.
|
|
72
77
|
|
|
78
|
+
**Contexto -> Consultar por Escopo** deve ser usado como **AI Tool** dentro do agente, sob demanda.
|
|
79
|
+
Passe `escopos` para buscar apenas o necessario:
|
|
80
|
+
|
|
81
|
+
- `hours` exige `data` (`YYYY-MM-DD`) e devolve horario/status da data, sem despejar semana inteira.
|
|
82
|
+
- `identity`, `delivery`, `payment` e `commercial_rules` devolvem somente o recorte pedido.
|
|
83
|
+
- `menus` e `promotions` continuam opcionais e so entram quando a pergunta pedir cardapio/promocao.
|
|
84
|
+
|
|
85
|
+
Chamadas antigas com apenas `data` seguem funcionando como `escopos=["hours"]`, mas o workflow novo nao
|
|
86
|
+
deve injetar horario/endereco/entrega/pagamento/regras comerciais em todo prompt.
|
|
87
|
+
|
|
73
88
|
## Gate da IA — Preparar como PRIMEIRO passo (ADR-021, Plano 004)
|
|
74
89
|
|
|
75
90
|
**Conversa → Preparar** é o **gate determinístico** da IA. Use-o como **node normal** no primeiro
|
|
@@ -81,7 +96,8 @@ A resposta vem sempre em **HTTP 200** e o node a entrega **intacta** (não vira
|
|
|
81
96
|
- `{ "allowed": false, "state": "disabled", "reason": "tenant_disabled" | "unit_disabled" | "configuration_error" | "unavailable" }`
|
|
82
97
|
→ **PARE o fluxo sem responder** ao cliente (a empresa/unidade desligou a IA; falha de consulta também para).
|
|
83
98
|
- `{ "allowed": true, "state": "enabled", "runtime_version": N, "session_id": "...", "primeiro_contato": true, "contexto": { ... } }`
|
|
84
|
-
→ **siga** para memória/router/LLM. O `contexto`
|
|
99
|
+
→ **siga** para memória/router/LLM. O `contexto` inicial e compacto; detalhes de horario,
|
|
100
|
+
endereco, entrega, pagamento, regras comerciais, cardapio e promocoes devem vir da tool Contexto sob demanda.
|
|
85
101
|
|
|
86
102
|
O Núcleo é a fonte da verdade do liga/desliga; o estado `active` do workflow no n8n **não** é usado
|
|
87
103
|
como controle por padaria. Quem desliga é o dono/gerente em `/configuracoes` (ou o super-admin).
|
|
@@ -303,8 +303,8 @@ class Nucleo {
|
|
|
303
303
|
{
|
|
304
304
|
name: "Consultar Data",
|
|
305
305
|
value: "consultar",
|
|
306
|
-
action: "Consultar contexto
|
|
307
|
-
description: "
|
|
306
|
+
action: "Consultar contexto por escopo",
|
|
307
|
+
description: "Busca somente os escopos necessarios (horario, identidade, entrega, pagamento, regras comerciais, cardapios ou promocoes). Use como AI Tool sob demanda, nao como contexto fixo do prompt.",
|
|
308
308
|
},
|
|
309
309
|
],
|
|
310
310
|
default: "consultar",
|
|
@@ -435,6 +435,35 @@ class Nucleo {
|
|
|
435
435
|
description: "Cursor opaco retornado por resultados[].continuacao.cursor. Use somente quando o cliente pedir a proxima pagina da mesma lista ('mostrar os outros', 'mais sabores'). Se informado, vence Consultas.",
|
|
436
436
|
displayOptions: { show: { resource: ["catalogo"], operation: ["resolver"] } },
|
|
437
437
|
},
|
|
438
|
+
{
|
|
439
|
+
displayName: "Modo Saida",
|
|
440
|
+
name: "modoSaidaCatalogo",
|
|
441
|
+
type: "options",
|
|
442
|
+
default: "normal",
|
|
443
|
+
options: [
|
|
444
|
+
{ name: "Normal", value: "normal" },
|
|
445
|
+
{ name: "Compacto Orcamento", value: "compacto_orcamento" },
|
|
446
|
+
],
|
|
447
|
+
description: "Use Compacto Orcamento quando a consulta for de festa/kit/orcamento. O servidor prioriza orcamento_sugerido e reduz payload da tool.",
|
|
448
|
+
displayOptions: { show: { resource: ["catalogo"], operation: ["resolver"] } },
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
displayName: "Incluir Imagens",
|
|
452
|
+
name: "incluirImagensCatalogo",
|
|
453
|
+
type: "boolean",
|
|
454
|
+
default: true,
|
|
455
|
+
description: "Quando falso, o resolver omite image_url. Desligue em orcamentos; ligue apenas quando o cliente pedir foto/imagem.",
|
|
456
|
+
displayOptions: { show: { resource: ["catalogo"], operation: ["resolver"] } },
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
displayName: "Orcamento Contexto (JSON)",
|
|
460
|
+
name: "orcamentoContexto",
|
|
461
|
+
type: "json",
|
|
462
|
+
default: "",
|
|
463
|
+
required: false,
|
|
464
|
+
description: "Estado compacto opcional do orcamento em andamento: pessoas, perfil, familias e preferencias. Nao envie catalogo, preco nem produto_id aqui.",
|
|
465
|
+
displayOptions: { show: { resource: ["catalogo"], operation: ["resolver"] } },
|
|
466
|
+
},
|
|
438
467
|
// ----------------------------------------------------------------- catalogo:disponibilidadeRede
|
|
439
468
|
{
|
|
440
469
|
displayName: "Produto (ID)",
|
|
@@ -849,9 +878,52 @@ class Nucleo {
|
|
|
849
878
|
name: "data",
|
|
850
879
|
type: "string",
|
|
851
880
|
default: "",
|
|
852
|
-
required:
|
|
881
|
+
required: false,
|
|
853
882
|
placeholder: "2026-12-25",
|
|
854
|
-
description: "
|
|
883
|
+
description: "Obrigatoria apenas quando o escopo incluir Horarios. Use YYYY-MM-DD (janela ±366 dias).",
|
|
884
|
+
displayOptions: { show: { resource: ["contexto"], operation: ["consultar"] } },
|
|
885
|
+
},
|
|
886
|
+
{
|
|
887
|
+
displayName: "Escopos",
|
|
888
|
+
name: "contextoEscopos",
|
|
889
|
+
type: "multiOptions",
|
|
890
|
+
default: ["hours"],
|
|
891
|
+
description: "Recortes de contexto que a IA precisa para a pergunta atual.",
|
|
892
|
+
options: [
|
|
893
|
+
{ name: "Identidade/Endereco", value: "identity" },
|
|
894
|
+
{ name: "Operacao", value: "operation" },
|
|
895
|
+
{ name: "Horarios", value: "hours" },
|
|
896
|
+
{ name: "Entrega", value: "delivery" },
|
|
897
|
+
{ name: "Pagamento", value: "payment" },
|
|
898
|
+
{ name: "Regras Comerciais", value: "commercial_rules" },
|
|
899
|
+
{ name: "Cardapios", value: "menus" },
|
|
900
|
+
{ name: "Promocoes", value: "promotions" },
|
|
901
|
+
],
|
|
902
|
+
displayOptions: { show: { resource: ["contexto"], operation: ["consultar"] } },
|
|
903
|
+
},
|
|
904
|
+
{
|
|
905
|
+
displayName: "Cidade",
|
|
906
|
+
name: "contextoCidade",
|
|
907
|
+
type: "string",
|
|
908
|
+
default: "",
|
|
909
|
+
description: "Opcional para validar se a cidade/bairro esta em area de entrega.",
|
|
910
|
+
displayOptions: { show: { resource: ["contexto"], operation: ["consultar"] } },
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
displayName: "Assuntos",
|
|
914
|
+
name: "contextoAssuntos",
|
|
915
|
+
type: "string",
|
|
916
|
+
default: "",
|
|
917
|
+
placeholder: "frete, pagamento",
|
|
918
|
+
description: "Opcional; texto livre separado por linhas ou virgulas para telemetria/contexto da pergunta.",
|
|
919
|
+
displayOptions: { show: { resource: ["contexto"], operation: ["consultar"] } },
|
|
920
|
+
},
|
|
921
|
+
{
|
|
922
|
+
displayName: "Unidade ID",
|
|
923
|
+
name: "contextoUnitId",
|
|
924
|
+
type: "string",
|
|
925
|
+
default: "",
|
|
926
|
+
description: "Opcional e somente compatibilidade: o servidor valida contra o vinculo do token.",
|
|
855
927
|
displayOptions: { show: { resource: ["contexto"], operation: ["consultar"] } },
|
|
856
928
|
},
|
|
857
929
|
// ----------------------------------------------------------------- telemetria:enviar
|
|
@@ -1175,9 +1247,19 @@ class Nucleo {
|
|
|
1175
1247
|
else if (resource === "catalogo" && operation === "resolver") {
|
|
1176
1248
|
const consultas = parseConsultas(this.getNodeParameter("consultas", i));
|
|
1177
1249
|
const continuacaoCursor = this.getNodeParameter("continuacaoCursor", i, "").trim();
|
|
1250
|
+
const modoSaida = this.getNodeParameter("modoSaidaCatalogo", i, "normal");
|
|
1251
|
+
const incluirImagens = this.getNodeParameter("incluirImagensCatalogo", i, true);
|
|
1252
|
+
const orcamentoContexto = asObject(this.getNodeParameter("orcamentoContexto", i, ""));
|
|
1178
1253
|
method = "POST";
|
|
1179
1254
|
path = "/api/v1/agent/catalogo/resolver";
|
|
1180
|
-
|
|
1255
|
+
const b = continuacaoCursor ? { continuacao_cursor: continuacaoCursor } : { consultas };
|
|
1256
|
+
if (modoSaida === "compacto_orcamento")
|
|
1257
|
+
b.modo_saida = "compacto_orcamento";
|
|
1258
|
+
if (!incluirImagens)
|
|
1259
|
+
b.incluir_imagens = false;
|
|
1260
|
+
if (orcamentoContexto)
|
|
1261
|
+
b.orcamento_contexto = orcamentoContexto;
|
|
1262
|
+
bodyObj = b;
|
|
1181
1263
|
}
|
|
1182
1264
|
else if (resource === "catalogo" && operation === "disponibilidadeRede") {
|
|
1183
1265
|
const produtoId = this.getNodeParameter("produtoIdRede", i, "").trim();
|
|
@@ -1363,9 +1445,24 @@ class Nucleo {
|
|
|
1363
1445
|
}
|
|
1364
1446
|
else if (resource === "contexto" && operation === "consultar") {
|
|
1365
1447
|
const data = this.getNodeParameter("data", i).trim();
|
|
1448
|
+
const escopos = this.getNodeParameter("contextoEscopos", i, ["hours"]);
|
|
1449
|
+
const cidade = this.getNodeParameter("contextoCidade", i, "").trim();
|
|
1450
|
+
const assuntos = parseIds(this.getNodeParameter("contextoAssuntos", i, ""));
|
|
1451
|
+
const unitId = this.getNodeParameter("contextoUnitId", i, "").trim();
|
|
1452
|
+
const b = {};
|
|
1453
|
+
if (data)
|
|
1454
|
+
b.data = data;
|
|
1455
|
+
if (Array.isArray(escopos) && escopos.length > 0)
|
|
1456
|
+
b.escopos = escopos;
|
|
1457
|
+
if (cidade)
|
|
1458
|
+
b.cidade = cidade;
|
|
1459
|
+
if (assuntos.length > 0)
|
|
1460
|
+
b.assuntos = assuntos;
|
|
1461
|
+
if (unitId)
|
|
1462
|
+
b.unit_id = unitId;
|
|
1366
1463
|
method = "POST";
|
|
1367
1464
|
path = "/api/v1/agent/contexto/consultar";
|
|
1368
|
-
bodyObj =
|
|
1465
|
+
bodyObj = b;
|
|
1369
1466
|
}
|
|
1370
1467
|
else if (resource === "telemetria" && operation === "enviar") {
|
|
1371
1468
|
const eventKey = this.getNodeParameter("telEventKey", i).trim();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wondai/n8n-nodes-nucleo",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "Node n8n para o Núcleo Wondai — atendimento de IA multi-vertical (gate liga/desliga, cliente/paciente, catálogo fuzzy, pedidos [padaria], procedimento/agenda/agendamento [odonto], contexto operacional, telemetria) com assinatura HMAC v1. Tenant e vertical vêm do token (a parede, ADR-013/038).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"n8n-community-node-package",
|