@hostwebhook/node-types 1.90.0 → 1.92.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.
@@ -13,5 +13,29 @@ export declare function canReceiveFromNodes(nodeType: NodeType): boolean;
13
13
  export declare function canSendToNodes(nodeType: NodeType): boolean;
14
14
  export declare function isTerminal(nodeType: NodeType): boolean;
15
15
  export declare function isNodeType(type: string): type is NodeType;
16
+ /**
17
+ * Orígenes que SÓLO pueden conectarse a ciertos tipos, dicho a mano.
18
+ *
19
+ * ## Por qué (2026-09-24, Ariel)
20
+ *
21
+ * «Un chat trigger no tiene caso que tenga un flow control conectado
22
+ * directamente — bloquearlo, y en el “+” también.» Medido en el motor: el Chat
23
+ * Trigger ejecuta el PRIMER AI Node de sus salidas (`chat-triggers.service.ts`:
24
+ * «v1 requires the chat path to end at an AI node»); cualquier otra cosa colgada
25
+ * directamente de él —un router, un filter, pero también un Slack o un HTTP—
26
+ * no corre nunca. Ariel eligió «sólo AI Node».
27
+ *
28
+ * ## ⚠️ Por qué no sale de `canOutputTo`
29
+ *
30
+ * Esas listas no las lee ningún repo por PARES y están desfasadas: `webhook →
31
+ * ai` funciona sin que `ai` esté en `PROCESSING_OUTPUTS`. Convertirlas en
32
+ * regla bloquearía conexiones que hoy valen. Esto es una lista corta y
33
+ * deliberada, que el lienzo consulta en `canConnect` (el arrastre, los puntos
34
+ * que se iluminan, el reconectar por clic y el menú «+»).
35
+ */
36
+ export declare const DESTINOS_UNICOS: Readonly<Partial<Record<NodeType, readonly NodeType[]>>>;
37
+ /** ¿Puede salir una conexión de `origen` hacia `destino`, según
38
+ * `DESTINOS_UNICOS`? Los orígenes que no están en la lista, sí a todo. */
39
+ export declare function destinoPermitido(origen: string, destino: string): boolean;
16
40
  /** All valid node type strings */
17
41
  export declare const ALL_NODE_TYPES: NodeType[];
@@ -8,12 +8,13 @@
8
8
  * Adding a new node type = add 1 entry here. All repos import from this package.
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.ALL_NODE_TYPES = exports.NODE_CONNECTIONS = void 0;
11
+ exports.ALL_NODE_TYPES = exports.DESTINOS_UNICOS = exports.NODE_CONNECTIONS = void 0;
12
12
  exports.canReceiveFrom = canReceiveFrom;
13
13
  exports.canReceiveFromNodes = canReceiveFromNodes;
14
14
  exports.canSendToNodes = canSendToNodes;
15
15
  exports.isTerminal = isTerminal;
16
16
  exports.isNodeType = isNodeType;
17
+ exports.destinoPermitido = destinoPermitido;
17
18
  /** All node types that can appear as pipeline outputs */
18
19
  const PROCESSING_OUTPUTS = [
19
20
  'webhook', 'router', 'filter', 'transform', 'cache', 'code', 'rateLimiter',
@@ -33,7 +34,8 @@ exports.NODE_CONNECTIONS = {
33
34
  // ── Source nodes ──
34
35
  webhook: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
35
36
  scheduledWorkflow: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
36
- chatTrigger: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
37
+ /* Sólo a un AI Node: ver `DESTINOS_UNICOS`. */
38
+ chatTrigger: { acceptsInputFrom: [], canOutputTo: ['ai'] },
37
39
  trigger: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
38
40
  voiceAgent: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
39
41
  // ── Pipeline processing nodes ──
@@ -114,5 +116,34 @@ function isTerminal(nodeType) {
114
116
  function isNodeType(type) {
115
117
  return type in exports.NODE_CONNECTIONS;
116
118
  }
119
+ /**
120
+ * Orígenes que SÓLO pueden conectarse a ciertos tipos, dicho a mano.
121
+ *
122
+ * ## Por qué (2026-09-24, Ariel)
123
+ *
124
+ * «Un chat trigger no tiene caso que tenga un flow control conectado
125
+ * directamente — bloquearlo, y en el “+” también.» Medido en el motor: el Chat
126
+ * Trigger ejecuta el PRIMER AI Node de sus salidas (`chat-triggers.service.ts`:
127
+ * «v1 requires the chat path to end at an AI node»); cualquier otra cosa colgada
128
+ * directamente de él —un router, un filter, pero también un Slack o un HTTP—
129
+ * no corre nunca. Ariel eligió «sólo AI Node».
130
+ *
131
+ * ## ⚠️ Por qué no sale de `canOutputTo`
132
+ *
133
+ * Esas listas no las lee ningún repo por PARES y están desfasadas: `webhook →
134
+ * ai` funciona sin que `ai` esté en `PROCESSING_OUTPUTS`. Convertirlas en
135
+ * regla bloquearía conexiones que hoy valen. Esto es una lista corta y
136
+ * deliberada, que el lienzo consulta en `canConnect` (el arrastre, los puntos
137
+ * que se iluminan, el reconectar por clic y el menú «+»).
138
+ */
139
+ exports.DESTINOS_UNICOS = Object.freeze({
140
+ chatTrigger: ['ai'],
141
+ });
142
+ /** ¿Puede salir una conexión de `origen` hacia `destino`, según
143
+ * `DESTINOS_UNICOS`? Los orígenes que no están en la lista, sí a todo. */
144
+ function destinoPermitido(origen, destino) {
145
+ const lista = exports.DESTINOS_UNICOS[origen];
146
+ return !lista || lista.includes(destino);
147
+ }
117
148
  /** All valid node type strings */
118
149
  exports.ALL_NODE_TYPES = Object.keys(exports.NODE_CONNECTIONS);
@@ -13,5 +13,29 @@ export declare function canReceiveFromNodes(nodeType: NodeType): boolean;
13
13
  export declare function canSendToNodes(nodeType: NodeType): boolean;
14
14
  export declare function isTerminal(nodeType: NodeType): boolean;
15
15
  export declare function isNodeType(type: string): type is NodeType;
16
+ /**
17
+ * Orígenes que SÓLO pueden conectarse a ciertos tipos, dicho a mano.
18
+ *
19
+ * ## Por qué (2026-09-24, Ariel)
20
+ *
21
+ * «Un chat trigger no tiene caso que tenga un flow control conectado
22
+ * directamente — bloquearlo, y en el “+” también.» Medido en el motor: el Chat
23
+ * Trigger ejecuta el PRIMER AI Node de sus salidas (`chat-triggers.service.ts`:
24
+ * «v1 requires the chat path to end at an AI node»); cualquier otra cosa colgada
25
+ * directamente de él —un router, un filter, pero también un Slack o un HTTP—
26
+ * no corre nunca. Ariel eligió «sólo AI Node».
27
+ *
28
+ * ## ⚠️ Por qué no sale de `canOutputTo`
29
+ *
30
+ * Esas listas no las lee ningún repo por PARES y están desfasadas: `webhook →
31
+ * ai` funciona sin que `ai` esté en `PROCESSING_OUTPUTS`. Convertirlas en
32
+ * regla bloquearía conexiones que hoy valen. Esto es una lista corta y
33
+ * deliberada, que el lienzo consulta en `canConnect` (el arrastre, los puntos
34
+ * que se iluminan, el reconectar por clic y el menú «+»).
35
+ */
36
+ export declare const DESTINOS_UNICOS: Readonly<Partial<Record<NodeType, readonly NodeType[]>>>;
37
+ /** ¿Puede salir una conexión de `origen` hacia `destino`, según
38
+ * `DESTINOS_UNICOS`? Los orígenes que no están en la lista, sí a todo. */
39
+ export declare function destinoPermitido(origen: string, destino: string): boolean;
16
40
  /** All valid node type strings */
17
41
  export declare const ALL_NODE_TYPES: NodeType[];
@@ -25,7 +25,8 @@ export const NODE_CONNECTIONS = {
25
25
  // ── Source nodes ──
26
26
  webhook: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
27
27
  scheduledWorkflow: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
28
- chatTrigger: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
28
+ /* Sólo a un AI Node: ver `DESTINOS_UNICOS`. */
29
+ chatTrigger: { acceptsInputFrom: [], canOutputTo: ['ai'] },
29
30
  trigger: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
30
31
  voiceAgent: { acceptsInputFrom: [], canOutputTo: PROCESSING_OUTPUTS },
31
32
  // ── Pipeline processing nodes ──
@@ -106,5 +107,34 @@ export function isTerminal(nodeType) {
106
107
  export function isNodeType(type) {
107
108
  return type in NODE_CONNECTIONS;
108
109
  }
110
+ /**
111
+ * Orígenes que SÓLO pueden conectarse a ciertos tipos, dicho a mano.
112
+ *
113
+ * ## Por qué (2026-09-24, Ariel)
114
+ *
115
+ * «Un chat trigger no tiene caso que tenga un flow control conectado
116
+ * directamente — bloquearlo, y en el “+” también.» Medido en el motor: el Chat
117
+ * Trigger ejecuta el PRIMER AI Node de sus salidas (`chat-triggers.service.ts`:
118
+ * «v1 requires the chat path to end at an AI node»); cualquier otra cosa colgada
119
+ * directamente de él —un router, un filter, pero también un Slack o un HTTP—
120
+ * no corre nunca. Ariel eligió «sólo AI Node».
121
+ *
122
+ * ## ⚠️ Por qué no sale de `canOutputTo`
123
+ *
124
+ * Esas listas no las lee ningún repo por PARES y están desfasadas: `webhook →
125
+ * ai` funciona sin que `ai` esté en `PROCESSING_OUTPUTS`. Convertirlas en
126
+ * regla bloquearía conexiones que hoy valen. Esto es una lista corta y
127
+ * deliberada, que el lienzo consulta en `canConnect` (el arrastre, los puntos
128
+ * que se iluminan, el reconectar por clic y el menú «+»).
129
+ */
130
+ export const DESTINOS_UNICOS = Object.freeze({
131
+ chatTrigger: ['ai'],
132
+ });
133
+ /** ¿Puede salir una conexión de `origen` hacia `destino`, según
134
+ * `DESTINOS_UNICOS`? Los orígenes que no están en la lista, sí a todo. */
135
+ export function destinoPermitido(origen, destino) {
136
+ const lista = DESTINOS_UNICOS[origen];
137
+ return !lista || lista.includes(destino);
138
+ }
109
139
  /** All valid node type strings */
110
140
  export const ALL_NODE_TYPES = Object.keys(NODE_CONNECTIONS);
@@ -1,6 +1,6 @@
1
1
  export type { NodeType, NodeRole, HandlePosition, NodeConnectionConfig, NodeUIConfig, NodeDispatchConfig, DownstreamPayload, PrefixMapping, PayloadMeta, } from './types.js';
2
2
  export { singleMeta, iterableMeta } from './types.js';
3
- export { NODE_CONNECTIONS, canReceiveFrom, canReceiveFromNodes, canSendToNodes, isTerminal, isNodeType, ALL_NODE_TYPES, } from './connections.js';
3
+ export { NODE_CONNECTIONS, canReceiveFrom, canReceiveFromNodes, canSendToNodes, isTerminal, isNodeType, ALL_NODE_TYPES, DESTINOS_UNICOS, destinoPermitido, } from './connections.js';
4
4
  export { NODE_UI, PREFIX_TO_TYPE, resolveNodeId, } from './ui.js';
5
5
  export { SENTIMENT_LABELS, SENTIMENT_UNCLEAR, SENTIMENT_PORTS, SENTIMENT_PORT_LABEL, SENTIMENT_PORT_SUMMARY, esEtiquetaDeSentimiento, } from './sentiment.js';
6
6
  export type { SentimentLabel, SentimentPort } from './sentiment.js';
@@ -88,5 +88,5 @@ export type { ModeloDeOpenRouter, PrecioDeOpenRouter, RespuestaDeModelosDeOpenRo
88
88
  export { URL_DE_MODELOS_DE_OPENROUTER, opcionesDeModelosDeOpenRouter, ventanaDeContextoDeOpenRouter, } from './openrouter.js';
89
89
  export type { CredentialTypeRegistration, CredentialType } from './credentials.js';
90
90
  export { CREDENTIAL_TYPES, CREDENTIAL_TYPE_VALUES, credentialTypeValues, getCredentialType, isCredentialType, } from './credentials.js';
91
- export type { NodoQueContestaEnSync, ResultadoDelValidador, FalloDeValidacion, VeredictoDelValidador, NivelDeDetalle, ModoDePayload, SobreDeRespuesta, TopeDeNumero, RespuestaDelSync, RespuestaHttp, } from './respuesta-del-sync.js';
91
+ export type { NodoQueContestaEnSync, ResultadoDelValidador, FalloDeValidacion, VeredictoDelValidador, VeredictoDelAiNode, NivelDeDetalle, ModoDePayload, SobreDeRespuesta, TopeDeNumero, RespuestaDelSync, RespuestaHttp, } from './respuesta-del-sync.js';
92
92
  export { NODOS_QUE_CONTESTAN_EN_SYNC, contestaEnSync, RESULTADOS_DEL_VALIDADOR, NIVELES_DE_DETALLE, MODOS_DE_PAYLOAD, SOBRES_DE_RESPUESTA, TOPES_DE_ESTADO, TOPE_DE_ESPERA_DEL_SYNC, RESPUESTA_DEL_SYNC_POR_DEFECTO, armarRespuestaDelSync, } from './respuesta-del-sync.js';
package/dist/esm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { singleMeta, iterableMeta } from './types.js';
2
2
  // ── Connection rules (used by ALL repos) ──
3
- export { NODE_CONNECTIONS, canReceiveFrom, canReceiveFromNodes, canSendToNodes, isTerminal, isNodeType, ALL_NODE_TYPES, } from './connections.js';
3
+ export { NODE_CONNECTIONS, canReceiveFrom, canReceiveFromNodes, canSendToNodes, isTerminal, isNodeType, ALL_NODE_TYPES, DESTINOS_UNICOS, destinoPermitido, } from './connections.js';
4
4
  // ── UI config (Dashboard only) ──
5
5
  export { NODE_UI, PREFIX_TO_TYPE, resolveNodeId, } from './ui.js';
6
6
  export { SENTIMENT_LABELS, SENTIMENT_UNCLEAR, SENTIMENT_PORTS, SENTIMENT_PORT_LABEL, SENTIMENT_PORT_SUMMARY, esEtiquetaDeSentimiento, } from './sentiment.js';
@@ -77,7 +77,7 @@
77
77
  * eso el gate es de producto y no de corrección, y por eso `'no-verdict'`
78
78
  * existe ahí abajo — sin él, el flujo con el gate puesto se colgaría igual.
79
79
  */
80
- export declare const NODOS_QUE_CONTESTAN_EN_SYNC: readonly ["schemaValidator"];
80
+ export declare const NODOS_QUE_CONTESTAN_EN_SYNC: readonly ["schemaValidator", "ai"];
81
81
  /** Un tipo de nodo de los que saben contestar en `sync`. */
82
82
  export type NodoQueContestaEnSync = (typeof NODOS_QUE_CONTESTAN_EN_SYNC)[number];
83
83
  /**
@@ -162,6 +162,23 @@ export type VeredictoDelValidador = {
162
162
  webhookName?: string;
163
163
  nodeName?: string;
164
164
  };
165
+ /**
166
+ * Lo que dictamina el AI Node para quien espera en `sync` (2026-09-24).
167
+ *
168
+ * Mucho menos que un validador: el AI Node no aprueba ni rechaza, CONTESTA.
169
+ * `answer` es «tengo respuesta» —el cuerpo es su salida, que la api tiene y
170
+ * este tipo no necesita llevar—; `failed` es que la llamada al modelo (o una
171
+ * herramienta que no se recuperó) falló, y `message` dice por qué.
172
+ *
173
+ * Viaja por el cable como `_sincrono`, igual que el del validador: la
174
+ * respuesta la ARMA la api, que es quien tiene la puerta fresca y el waiter.
175
+ */
176
+ export type VeredictoDelAiNode = {
177
+ outcome: 'answer';
178
+ } | {
179
+ outcome: 'failed';
180
+ message: string;
181
+ };
165
182
  /**
166
183
  * Cuánto se le cuenta al cliente de POR QUÉ falló.
167
184
  *
@@ -80,6 +80,10 @@
80
80
  */
81
81
  export const NODOS_QUE_CONTESTAN_EN_SYNC = [
82
82
  'schemaValidator',
83
+ /* [2026-09-24, Ariel] «que también funcione con el AI Node: siempre regresa
84
+ una respuesta». Contesta con su salida y el flujo sigue detrás; ver
85
+ `VeredictoDelAiNode`. */
86
+ 'ai',
83
87
  ];
84
88
  /**
85
89
  * ¿Este tipo de nodo sabe contestar en `sync`?
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type { NodeType, NodeRole, HandlePosition, NodeConnectionConfig, NodeUIConfig, NodeDispatchConfig, DownstreamPayload, PrefixMapping, PayloadMeta, } from './types.js';
2
2
  export { singleMeta, iterableMeta } from './types.js';
3
- export { NODE_CONNECTIONS, canReceiveFrom, canReceiveFromNodes, canSendToNodes, isTerminal, isNodeType, ALL_NODE_TYPES, } from './connections.js';
3
+ export { NODE_CONNECTIONS, canReceiveFrom, canReceiveFromNodes, canSendToNodes, isTerminal, isNodeType, ALL_NODE_TYPES, DESTINOS_UNICOS, destinoPermitido, } from './connections.js';
4
4
  export { NODE_UI, PREFIX_TO_TYPE, resolveNodeId, } from './ui.js';
5
5
  export { SENTIMENT_LABELS, SENTIMENT_UNCLEAR, SENTIMENT_PORTS, SENTIMENT_PORT_LABEL, SENTIMENT_PORT_SUMMARY, esEtiquetaDeSentimiento, } from './sentiment.js';
6
6
  export type { SentimentLabel, SentimentPort } from './sentiment.js';
@@ -88,5 +88,5 @@ export type { ModeloDeOpenRouter, PrecioDeOpenRouter, RespuestaDeModelosDeOpenRo
88
88
  export { URL_DE_MODELOS_DE_OPENROUTER, opcionesDeModelosDeOpenRouter, ventanaDeContextoDeOpenRouter, } from './openrouter.js';
89
89
  export type { CredentialTypeRegistration, CredentialType } from './credentials.js';
90
90
  export { CREDENTIAL_TYPES, CREDENTIAL_TYPE_VALUES, credentialTypeValues, getCredentialType, isCredentialType, } from './credentials.js';
91
- export type { NodoQueContestaEnSync, ResultadoDelValidador, FalloDeValidacion, VeredictoDelValidador, NivelDeDetalle, ModoDePayload, SobreDeRespuesta, TopeDeNumero, RespuestaDelSync, RespuestaHttp, } from './respuesta-del-sync.js';
91
+ export type { NodoQueContestaEnSync, ResultadoDelValidador, FalloDeValidacion, VeredictoDelValidador, VeredictoDelAiNode, NivelDeDetalle, ModoDePayload, SobreDeRespuesta, TopeDeNumero, RespuestaDelSync, RespuestaHttp, } from './respuesta-del-sync.js';
92
92
  export { NODOS_QUE_CONTESTAN_EN_SYNC, contestaEnSync, RESULTADOS_DEL_VALIDADOR, NIVELES_DE_DETALLE, MODOS_DE_PAYLOAD, SOBRES_DE_RESPUESTA, TOPES_DE_ESTADO, TOPE_DE_ESPERA_DEL_SYNC, RESPUESTA_DEL_SYNC_POR_DEFECTO, armarRespuestaDelSync, } from './respuesta-del-sync.js';
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GMAIL_SEND_LEGACY_FIELDS = exports.NATIVE_EMAIL_TOOLKIT_BY_TOOL_NAME = exports.GMAIL_TOOLKIT_BY_TOOL_NAME = exports.NATIVE_EMAIL_TOOLKIT_SPECS = exports.GMAIL_SEND_AND_WAIT_TOOL_SPEC = exports.GMAIL_ALL_TOOLKIT_SPECS = exports.GMAIL_TOOLKIT_SPECS = exports.GMAIL_TOOLKIT_OPERATIONS = exports.GMAIL_DROPDOWN_OPERATIONS = exports.GMAIL_OPERATION_GROUPS = exports.GMAIL_OPERATION_SPECS = exports.GMAIL_OPERATIONS = exports.versionCatalogErrors = exports.fieldsLost = exports.fieldsLostBetween = exports.currentVersion = exports.versionSpec = exports.versionsOf = exports.isVersioned = exports.NODE_TYPE_TO_PREFIX = exports.PREFIX_TO_NODE_TYPE = exports.NODE_STATE_KEYS = exports.NODE_COLORS = exports.NODE_DETAIL_PATHS = exports.getNodeRegistryEntry = exports.NODE_REGISTRY = exports.pasaLoQueRecibe = exports.getNodeDispatchConfig = exports.getAllNodeCollections = exports.NODE_DISPATCH = exports.todosLosOutputGroups = exports.outputGroupsFor = exports.esEtiquetaDeSentimiento = exports.SENTIMENT_PORT_SUMMARY = exports.SENTIMENT_PORT_LABEL = exports.SENTIMENT_PORTS = exports.SENTIMENT_UNCLEAR = exports.SENTIMENT_LABELS = exports.resolveNodeId = exports.PREFIX_TO_TYPE = exports.NODE_UI = exports.ALL_NODE_TYPES = exports.isNodeType = exports.isTerminal = exports.canSendToNodes = exports.canReceiveFromNodes = exports.canReceiveFrom = exports.NODE_CONNECTIONS = exports.iterableMeta = exports.singleMeta = void 0;
4
- exports.isGithubOperation = exports.GITHUB_ITERABLE_OPERATIONS = exports.GITHUB_DROPDOWN_OPERATIONS = exports.GITHUB_OPERATION_SPECS = exports.GITHUB_OPERATIONS = exports.scopesQueFaltanEnShopify = exports.isShopifyOperation = exports.SHOPIFY_PRODUCT_STATUSES = exports.SHOPIFY_CANCEL_REASONS = exports.SHOPIFY_SEARCHABLE_RESOURCES = exports.SHOPIFY_TAGGABLE_RESOURCES = exports.SHOPIFY_OPERATION_SCOPES = exports.SHOPIFY_OPERATION_SPECS = exports.SHOPIFY_OPERATIONS = exports.isMailchimpOperation = exports.MAILCHIMP_CONTACT_STATUSES = exports.MAILCHIMP_OPERATION_SPECS = exports.MAILCHIMP_OPERATIONS = exports.herramientasDeDiscordPara = exports.DISCORD_TOOLKIT_BY_TOOL_NAME = exports.DISCORD_TOOLKIT_SPECS = exports.isDiscordOperation = exports.camposDeDiscordNoDisponibles = exports.discordPuedeEjecutar = exports.operacionesDeDiscordPara = exports.DISCORD_CAPACIDADES_POR_CREDENCIAL = exports.DISCORD_OPERATION_SPECS = exports.DISCORD_OPERATIONS = exports.camposNoDisponiblesPara = exports.puedeEjecutar = exports.operacionesPara = exports.isWhatsAppOperation = exports.WHATSAPP_OPERATIONS = exports.TELEGRAM_TOOLKIT_BY_TOOL_NAME = exports.TELEGRAM_TOOLKIT_SPECS = exports.isTelegramOperation = exports.TELEGRAM_OPERATION_SPECS = exports.TELEGRAM_OPERATIONS = exports.DRIVE_TOOLKIT_BY_TOOL_NAME = exports.DRIVE_TOOLKIT_SPECS = exports.isDriveOperation = exports.DRIVE_OPERATION_SPECS = exports.DRIVE_OPERATIONS = exports.GOOGLE_CALENDAR_TOOLKIT_BY_TOOL_NAME = exports.GOOGLE_CALENDAR_TOOLKIT_SPECS = exports.isGoogleCalendarOperation = exports.GOOGLE_CALENDAR_OPERATION_SPECS = exports.GOOGLE_CALENDAR_OPERATIONS = exports.isGmailOperation = exports.resolveGmailSendFields = void 0;
5
- exports.NOTION_OPERATION_SPECS = exports.NOTION_OPERATIONS = exports.isGoogleAnalyticsOperation = exports.GOOGLE_ANALYTICS_DROPDOWN_OPERATIONS = exports.GOOGLE_ANALYTICS_OPERATION_SPECS = exports.GOOGLE_ANALYTICS_OPERATIONS = exports.isGoogleContactsOperation = exports.GOOGLE_CONTACTS_DEFAULT_PERSON_FIELDS = exports.GOOGLE_CONTACTS_OPERATION_GROUPS = exports.GOOGLE_CONTACTS_OPERATION_SPECS = exports.GOOGLE_CONTACTS_OPERATIONS_V2 = exports.GOOGLE_CONTACTS_OPERATIONS_V1 = exports.GOOGLE_CONTACTS_OPERATIONS = exports.SHEETS_TOOLKIT_DEFAULTABLE = exports.SHEETS_TOOLKIT_BY_TOOL_NAME = exports.SHEETS_TOOLKIT_SPECS = exports.isSheetsOperation = exports.SHEETS_OPERATION_SPECS = exports.SHEETS_OPERATIONS = exports.herramientasDeSlackPara = exports.SLACK_TOOLKIT_BY_TOOL_NAME = exports.SLACK_TOOLKIT_SPECS = exports.isSlackOperation = exports.camposDeSlackNoDisponibles = exports.slackPuedeEjecutar = exports.operacionesDeSlackPara = exports.SLACK_CAPACIDADES_POR_CREDENCIAL = exports.SLACK_OPERATION_SPECS = exports.SLACK_OPERATIONS = exports.isAirtableOperation = exports.AIRTABLE_ITERABLE_OPERATIONS = exports.AIRTABLE_OPERATION_SPECS = exports.AIRTABLE_OPERATIONS = exports.isCalendlyOperation = exports.CALENDLY_ITERABLE_OPERATIONS = exports.CALENDLY_OPERATION_SPECS = exports.CALENDLY_OPERATIONS = exports.isApifyOperation = exports.APIFY_ITERABLE_OPERATIONS = exports.APIFY_OPERATION_SPECS = exports.APIFY_OPERATIONS = exports.isBucketOperation = exports.BUCKET_ITERABLE_OPERATIONS = exports.BUCKET_OPERATION_SPECS = exports.BUCKET_OPERATIONS = exports.isJiraOperation = exports.JIRA_ITERABLE_OPERATIONS = exports.JIRA_DROPDOWN_OPERATIONS = exports.JIRA_OPERATION_SPECS = exports.JIRA_OPERATIONS = void 0;
6
- exports.getDefaultModel = exports.getModelsFor = exports.MODEL_CONTEXT_WINDOWS = exports.LLM_MODELS = exports.LLM_PROVIDERS = exports.CASOS_DE_FICHEROS_POSTGRES = exports.ficherosEnCadenaPostgres = exports.parametrosDeCadenaPostgres = exports.FICHEROS_DE_POSTGRES = exports.CASOS_DE_SSL_POSTGRES = exports.conPistaDeSslPostgres = exports.pistaDeSslPostgres = exports.ponerSslPostgres = exports.leerSslPostgres = exports.GOOGLE_CONTACTS_TOOLKIT_BY_TOOL_NAME = exports.GOOGLE_CONTACTS_TOOLKIT_SPECS = exports.motivoParaNoCorrer = exports.mensajeDeHerramientaBloqueada = exports.MENSAJE_SIN_HERRAMIENTA = exports.herramientaBloqueadaEn = exports.bloqueadasDe = exports.nombresDeHerramientas = exports.admiteBloqueo = exports.tieneModoToolkit = exports.TIPOS_CON_TOOLKIT = exports.esOperacionDestructiva = exports.operacionDeToolkit = exports.TOOLKITS_POR_TIPO = exports.marcarDestructivas = exports.esHerramientaDestructiva = exports.claseDeHerramienta = exports.POSTGRES_TOOLKIT_BY_TOOL_NAME = exports.POSTGRES_TOOLKIT_SPECS = exports.MONGO_TOOLKIT_BY_TOOL_NAME = exports.MONGO_TOOLKIT_SPECS = exports.DOCS_TOOLKIT_DEFAULTABLE = exports.DOCS_TOOLKIT_BY_TOOL_NAME = exports.DOCS_TOOLKIT_SPECS = exports.isDocsOperation = exports.DOCS_OPERATION_SPECS = exports.DOCS_OPERATIONS = exports.isMongoOperation = exports.MONGO_OPERATION_SPECS = exports.MONGO_OPERATIONS = exports.isPostgresOperation = exports.POSTGRES_OPERATION_SPECS = exports.POSTGRES_MODES = exports.POSTGRES_OPERATIONS = exports.isNotionOperation = exports.NOTION_DROPDOWN_OPERATIONS = void 0;
7
- exports.armarRespuestaDelSync = exports.RESPUESTA_DEL_SYNC_POR_DEFECTO = exports.TOPE_DE_ESPERA_DEL_SYNC = exports.TOPES_DE_ESTADO = exports.SOBRES_DE_RESPUESTA = exports.MODOS_DE_PAYLOAD = exports.NIVELES_DE_DETALLE = exports.RESULTADOS_DEL_VALIDADOR = exports.contestaEnSync = exports.NODOS_QUE_CONTESTAN_EN_SYNC = exports.isCredentialType = exports.getCredentialType = exports.credentialTypeValues = exports.CREDENTIAL_TYPE_VALUES = exports.CREDENTIAL_TYPES = exports.ventanaDeContextoDeOpenRouter = exports.opcionesDeModelosDeOpenRouter = exports.URL_DE_MODELOS_DE_OPENROUTER = exports.getModelLabel = void 0;
3
+ exports.GMAIL_TOOLKIT_BY_TOOL_NAME = exports.NATIVE_EMAIL_TOOLKIT_SPECS = exports.GMAIL_SEND_AND_WAIT_TOOL_SPEC = exports.GMAIL_ALL_TOOLKIT_SPECS = exports.GMAIL_TOOLKIT_SPECS = exports.GMAIL_TOOLKIT_OPERATIONS = exports.GMAIL_DROPDOWN_OPERATIONS = exports.GMAIL_OPERATION_GROUPS = exports.GMAIL_OPERATION_SPECS = exports.GMAIL_OPERATIONS = exports.versionCatalogErrors = exports.fieldsLost = exports.fieldsLostBetween = exports.currentVersion = exports.versionSpec = exports.versionsOf = exports.isVersioned = exports.NODE_TYPE_TO_PREFIX = exports.PREFIX_TO_NODE_TYPE = exports.NODE_STATE_KEYS = exports.NODE_COLORS = exports.NODE_DETAIL_PATHS = exports.getNodeRegistryEntry = exports.NODE_REGISTRY = exports.pasaLoQueRecibe = exports.getNodeDispatchConfig = exports.getAllNodeCollections = exports.NODE_DISPATCH = exports.todosLosOutputGroups = exports.outputGroupsFor = exports.esEtiquetaDeSentimiento = exports.SENTIMENT_PORT_SUMMARY = exports.SENTIMENT_PORT_LABEL = exports.SENTIMENT_PORTS = exports.SENTIMENT_UNCLEAR = exports.SENTIMENT_LABELS = exports.resolveNodeId = exports.PREFIX_TO_TYPE = exports.NODE_UI = exports.destinoPermitido = exports.DESTINOS_UNICOS = exports.ALL_NODE_TYPES = exports.isNodeType = exports.isTerminal = exports.canSendToNodes = exports.canReceiveFromNodes = exports.canReceiveFrom = exports.NODE_CONNECTIONS = exports.iterableMeta = exports.singleMeta = void 0;
4
+ exports.GITHUB_DROPDOWN_OPERATIONS = exports.GITHUB_OPERATION_SPECS = exports.GITHUB_OPERATIONS = exports.scopesQueFaltanEnShopify = exports.isShopifyOperation = exports.SHOPIFY_PRODUCT_STATUSES = exports.SHOPIFY_CANCEL_REASONS = exports.SHOPIFY_SEARCHABLE_RESOURCES = exports.SHOPIFY_TAGGABLE_RESOURCES = exports.SHOPIFY_OPERATION_SCOPES = exports.SHOPIFY_OPERATION_SPECS = exports.SHOPIFY_OPERATIONS = exports.isMailchimpOperation = exports.MAILCHIMP_CONTACT_STATUSES = exports.MAILCHIMP_OPERATION_SPECS = exports.MAILCHIMP_OPERATIONS = exports.herramientasDeDiscordPara = exports.DISCORD_TOOLKIT_BY_TOOL_NAME = exports.DISCORD_TOOLKIT_SPECS = exports.isDiscordOperation = exports.camposDeDiscordNoDisponibles = exports.discordPuedeEjecutar = exports.operacionesDeDiscordPara = exports.DISCORD_CAPACIDADES_POR_CREDENCIAL = exports.DISCORD_OPERATION_SPECS = exports.DISCORD_OPERATIONS = exports.camposNoDisponiblesPara = exports.puedeEjecutar = exports.operacionesPara = exports.isWhatsAppOperation = exports.WHATSAPP_OPERATIONS = exports.TELEGRAM_TOOLKIT_BY_TOOL_NAME = exports.TELEGRAM_TOOLKIT_SPECS = exports.isTelegramOperation = exports.TELEGRAM_OPERATION_SPECS = exports.TELEGRAM_OPERATIONS = exports.DRIVE_TOOLKIT_BY_TOOL_NAME = exports.DRIVE_TOOLKIT_SPECS = exports.isDriveOperation = exports.DRIVE_OPERATION_SPECS = exports.DRIVE_OPERATIONS = exports.GOOGLE_CALENDAR_TOOLKIT_BY_TOOL_NAME = exports.GOOGLE_CALENDAR_TOOLKIT_SPECS = exports.isGoogleCalendarOperation = exports.GOOGLE_CALENDAR_OPERATION_SPECS = exports.GOOGLE_CALENDAR_OPERATIONS = exports.isGmailOperation = exports.resolveGmailSendFields = exports.GMAIL_SEND_LEGACY_FIELDS = exports.NATIVE_EMAIL_TOOLKIT_BY_TOOL_NAME = void 0;
5
+ exports.isGoogleAnalyticsOperation = exports.GOOGLE_ANALYTICS_DROPDOWN_OPERATIONS = exports.GOOGLE_ANALYTICS_OPERATION_SPECS = exports.GOOGLE_ANALYTICS_OPERATIONS = exports.isGoogleContactsOperation = exports.GOOGLE_CONTACTS_DEFAULT_PERSON_FIELDS = exports.GOOGLE_CONTACTS_OPERATION_GROUPS = exports.GOOGLE_CONTACTS_OPERATION_SPECS = exports.GOOGLE_CONTACTS_OPERATIONS_V2 = exports.GOOGLE_CONTACTS_OPERATIONS_V1 = exports.GOOGLE_CONTACTS_OPERATIONS = exports.SHEETS_TOOLKIT_DEFAULTABLE = exports.SHEETS_TOOLKIT_BY_TOOL_NAME = exports.SHEETS_TOOLKIT_SPECS = exports.isSheetsOperation = exports.SHEETS_OPERATION_SPECS = exports.SHEETS_OPERATIONS = exports.herramientasDeSlackPara = exports.SLACK_TOOLKIT_BY_TOOL_NAME = exports.SLACK_TOOLKIT_SPECS = exports.isSlackOperation = exports.camposDeSlackNoDisponibles = exports.slackPuedeEjecutar = exports.operacionesDeSlackPara = exports.SLACK_CAPACIDADES_POR_CREDENCIAL = exports.SLACK_OPERATION_SPECS = exports.SLACK_OPERATIONS = exports.isAirtableOperation = exports.AIRTABLE_ITERABLE_OPERATIONS = exports.AIRTABLE_OPERATION_SPECS = exports.AIRTABLE_OPERATIONS = exports.isCalendlyOperation = exports.CALENDLY_ITERABLE_OPERATIONS = exports.CALENDLY_OPERATION_SPECS = exports.CALENDLY_OPERATIONS = exports.isApifyOperation = exports.APIFY_ITERABLE_OPERATIONS = exports.APIFY_OPERATION_SPECS = exports.APIFY_OPERATIONS = exports.isBucketOperation = exports.BUCKET_ITERABLE_OPERATIONS = exports.BUCKET_OPERATION_SPECS = exports.BUCKET_OPERATIONS = exports.isJiraOperation = exports.JIRA_ITERABLE_OPERATIONS = exports.JIRA_DROPDOWN_OPERATIONS = exports.JIRA_OPERATION_SPECS = exports.JIRA_OPERATIONS = exports.isGithubOperation = exports.GITHUB_ITERABLE_OPERATIONS = void 0;
6
+ exports.MODEL_CONTEXT_WINDOWS = exports.LLM_MODELS = exports.LLM_PROVIDERS = exports.CASOS_DE_FICHEROS_POSTGRES = exports.ficherosEnCadenaPostgres = exports.parametrosDeCadenaPostgres = exports.FICHEROS_DE_POSTGRES = exports.CASOS_DE_SSL_POSTGRES = exports.conPistaDeSslPostgres = exports.pistaDeSslPostgres = exports.ponerSslPostgres = exports.leerSslPostgres = exports.GOOGLE_CONTACTS_TOOLKIT_BY_TOOL_NAME = exports.GOOGLE_CONTACTS_TOOLKIT_SPECS = exports.motivoParaNoCorrer = exports.mensajeDeHerramientaBloqueada = exports.MENSAJE_SIN_HERRAMIENTA = exports.herramientaBloqueadaEn = exports.bloqueadasDe = exports.nombresDeHerramientas = exports.admiteBloqueo = exports.tieneModoToolkit = exports.TIPOS_CON_TOOLKIT = exports.esOperacionDestructiva = exports.operacionDeToolkit = exports.TOOLKITS_POR_TIPO = exports.marcarDestructivas = exports.esHerramientaDestructiva = exports.claseDeHerramienta = exports.POSTGRES_TOOLKIT_BY_TOOL_NAME = exports.POSTGRES_TOOLKIT_SPECS = exports.MONGO_TOOLKIT_BY_TOOL_NAME = exports.MONGO_TOOLKIT_SPECS = exports.DOCS_TOOLKIT_DEFAULTABLE = exports.DOCS_TOOLKIT_BY_TOOL_NAME = exports.DOCS_TOOLKIT_SPECS = exports.isDocsOperation = exports.DOCS_OPERATION_SPECS = exports.DOCS_OPERATIONS = exports.isMongoOperation = exports.MONGO_OPERATION_SPECS = exports.MONGO_OPERATIONS = exports.isPostgresOperation = exports.POSTGRES_OPERATION_SPECS = exports.POSTGRES_MODES = exports.POSTGRES_OPERATIONS = exports.isNotionOperation = exports.NOTION_DROPDOWN_OPERATIONS = exports.NOTION_OPERATION_SPECS = exports.NOTION_OPERATIONS = void 0;
7
+ exports.armarRespuestaDelSync = exports.RESPUESTA_DEL_SYNC_POR_DEFECTO = exports.TOPE_DE_ESPERA_DEL_SYNC = exports.TOPES_DE_ESTADO = exports.SOBRES_DE_RESPUESTA = exports.MODOS_DE_PAYLOAD = exports.NIVELES_DE_DETALLE = exports.RESULTADOS_DEL_VALIDADOR = exports.contestaEnSync = exports.NODOS_QUE_CONTESTAN_EN_SYNC = exports.isCredentialType = exports.getCredentialType = exports.credentialTypeValues = exports.CREDENTIAL_TYPE_VALUES = exports.CREDENTIAL_TYPES = exports.ventanaDeContextoDeOpenRouter = exports.opcionesDeModelosDeOpenRouter = exports.URL_DE_MODELOS_DE_OPENROUTER = exports.getModelLabel = exports.getDefaultModel = exports.getModelsFor = void 0;
8
8
  var types_js_1 = require("./types.js");
9
9
  Object.defineProperty(exports, "singleMeta", { enumerable: true, get: function () { return types_js_1.singleMeta; } });
10
10
  Object.defineProperty(exports, "iterableMeta", { enumerable: true, get: function () { return types_js_1.iterableMeta; } });
@@ -17,6 +17,8 @@ Object.defineProperty(exports, "canSendToNodes", { enumerable: true, get: functi
17
17
  Object.defineProperty(exports, "isTerminal", { enumerable: true, get: function () { return connections_js_1.isTerminal; } });
18
18
  Object.defineProperty(exports, "isNodeType", { enumerable: true, get: function () { return connections_js_1.isNodeType; } });
19
19
  Object.defineProperty(exports, "ALL_NODE_TYPES", { enumerable: true, get: function () { return connections_js_1.ALL_NODE_TYPES; } });
20
+ Object.defineProperty(exports, "DESTINOS_UNICOS", { enumerable: true, get: function () { return connections_js_1.DESTINOS_UNICOS; } });
21
+ Object.defineProperty(exports, "destinoPermitido", { enumerable: true, get: function () { return connections_js_1.destinoPermitido; } });
20
22
  // ── UI config (Dashboard only) ──
21
23
  var ui_js_1 = require("./ui.js");
22
24
  Object.defineProperty(exports, "NODE_UI", { enumerable: true, get: function () { return ui_js_1.NODE_UI; } });
@@ -77,7 +77,7 @@
77
77
  * eso el gate es de producto y no de corrección, y por eso `'no-verdict'`
78
78
  * existe ahí abajo — sin él, el flujo con el gate puesto se colgaría igual.
79
79
  */
80
- export declare const NODOS_QUE_CONTESTAN_EN_SYNC: readonly ["schemaValidator"];
80
+ export declare const NODOS_QUE_CONTESTAN_EN_SYNC: readonly ["schemaValidator", "ai"];
81
81
  /** Un tipo de nodo de los que saben contestar en `sync`. */
82
82
  export type NodoQueContestaEnSync = (typeof NODOS_QUE_CONTESTAN_EN_SYNC)[number];
83
83
  /**
@@ -162,6 +162,23 @@ export type VeredictoDelValidador = {
162
162
  webhookName?: string;
163
163
  nodeName?: string;
164
164
  };
165
+ /**
166
+ * Lo que dictamina el AI Node para quien espera en `sync` (2026-09-24).
167
+ *
168
+ * Mucho menos que un validador: el AI Node no aprueba ni rechaza, CONTESTA.
169
+ * `answer` es «tengo respuesta» —el cuerpo es su salida, que la api tiene y
170
+ * este tipo no necesita llevar—; `failed` es que la llamada al modelo (o una
171
+ * herramienta que no se recuperó) falló, y `message` dice por qué.
172
+ *
173
+ * Viaja por el cable como `_sincrono`, igual que el del validador: la
174
+ * respuesta la ARMA la api, que es quien tiene la puerta fresca y el waiter.
175
+ */
176
+ export type VeredictoDelAiNode = {
177
+ outcome: 'answer';
178
+ } | {
179
+ outcome: 'failed';
180
+ message: string;
181
+ };
165
182
  /**
166
183
  * Cuánto se le cuenta al cliente de POR QUÉ falló.
167
184
  *
@@ -85,6 +85,10 @@ exports.armarRespuestaDelSync = armarRespuestaDelSync;
85
85
  */
86
86
  exports.NODOS_QUE_CONTESTAN_EN_SYNC = [
87
87
  'schemaValidator',
88
+ /* [2026-09-24, Ariel] «que también funcione con el AI Node: siempre regresa
89
+ una respuesta». Contesta con su salida y el flujo sigue detrás; ver
90
+ `VeredictoDelAiNode`. */
91
+ 'ai',
88
92
  ];
89
93
  /**
90
94
  * ¿Este tipo de nodo sabe contestar en `sync`?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostwebhook/node-types",
3
- "version": "1.90.0",
3
+ "version": "1.92.0",
4
4
  "description": "Shared node type definitions, connection rules, and dispatch config for HostWebhook",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",