@hostwebhook/node-types 1.85.0 → 1.87.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.
Files changed (65) hide show
  1. package/dist/calendar-toolkit.d.ts +3 -0
  2. package/dist/calendar-toolkit.js +3 -2
  3. package/dist/clase-de-herramienta.d.ts +61 -0
  4. package/dist/clase-de-herramienta.js +153 -0
  5. package/dist/discord-toolkit.d.ts +2 -3
  6. package/dist/discord-toolkit.js +3 -6
  7. package/dist/docs-toolkit.d.ts +2 -1
  8. package/dist/docs-toolkit.js +3 -6
  9. package/dist/drive-toolkit.d.ts +9 -4
  10. package/dist/drive-toolkit.js +3 -4
  11. package/dist/esm/calendar-toolkit.d.ts +3 -0
  12. package/dist/esm/calendar-toolkit.js +3 -2
  13. package/dist/esm/clase-de-herramienta.d.ts +61 -0
  14. package/dist/esm/clase-de-herramienta.js +148 -0
  15. package/dist/esm/discord-toolkit.d.ts +2 -3
  16. package/dist/esm/discord-toolkit.js +3 -6
  17. package/dist/esm/docs-toolkit.d.ts +2 -1
  18. package/dist/esm/docs-toolkit.js +3 -6
  19. package/dist/esm/drive-toolkit.d.ts +9 -4
  20. package/dist/esm/drive-toolkit.js +3 -4
  21. package/dist/esm/gmail-operations.d.ts +2 -0
  22. package/dist/esm/gmail-operations.js +7 -6
  23. package/dist/esm/index.d.ts +12 -0
  24. package/dist/esm/index.js +7 -0
  25. package/dist/esm/mongo-toolkit.d.ts +47 -0
  26. package/dist/esm/mongo-toolkit.js +98 -0
  27. package/dist/esm/postgres-toolkit.d.ts +52 -0
  28. package/dist/esm/postgres-toolkit.js +85 -0
  29. package/dist/esm/registry.js +10 -0
  30. package/dist/esm/sentiment.d.ts +39 -0
  31. package/dist/esm/sentiment.js +53 -0
  32. package/dist/esm/sheets-toolkit.d.ts +2 -1
  33. package/dist/esm/sheets-toolkit.js +3 -6
  34. package/dist/esm/slack-toolkit.d.ts +2 -3
  35. package/dist/esm/slack-toolkit.js +3 -4
  36. package/dist/esm/telegram-toolkit.d.ts +3 -0
  37. package/dist/esm/telegram-toolkit.js +3 -2
  38. package/dist/esm/toolkits.d.ts +47 -0
  39. package/dist/esm/toolkits.js +74 -0
  40. package/dist/esm/types.d.ts +111 -76
  41. package/dist/esm/types.js +26 -0
  42. package/dist/esm/ui.js +10 -1
  43. package/dist/gmail-operations.d.ts +2 -0
  44. package/dist/gmail-operations.js +11 -10
  45. package/dist/index.d.ts +12 -0
  46. package/dist/index.js +29 -4
  47. package/dist/mongo-toolkit.d.ts +47 -0
  48. package/dist/mongo-toolkit.js +101 -0
  49. package/dist/postgres-toolkit.d.ts +52 -0
  50. package/dist/postgres-toolkit.js +88 -0
  51. package/dist/registry.js +10 -0
  52. package/dist/sentiment.d.ts +39 -0
  53. package/dist/sentiment.js +57 -0
  54. package/dist/sheets-toolkit.d.ts +2 -1
  55. package/dist/sheets-toolkit.js +3 -6
  56. package/dist/slack-toolkit.d.ts +2 -3
  57. package/dist/slack-toolkit.js +3 -4
  58. package/dist/telegram-toolkit.d.ts +3 -0
  59. package/dist/telegram-toolkit.js +3 -2
  60. package/dist/toolkits.d.ts +47 -0
  61. package/dist/toolkits.js +79 -0
  62. package/dist/types.d.ts +111 -76
  63. package/dist/types.js +28 -0
  64. package/dist/ui.js +10 -1
  65. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -2,6 +2,10 @@ export type { NodeType, NodeRole, HandlePosition, NodeConnectionConfig, NodeUICo
2
2
  export { singleMeta, iterableMeta } from './types.js';
3
3
  export { NODE_CONNECTIONS, canReceiveFrom, canReceiveFromNodes, canSendToNodes, isTerminal, isNodeType, ALL_NODE_TYPES, } from './connections.js';
4
4
  export { NODE_UI, PREFIX_TO_TYPE, resolveNodeId, } from './ui.js';
5
+ export { SENTIMENT_LABELS, SENTIMENT_UNCLEAR, SENTIMENT_PORTS, SENTIMENT_PORT_LABEL, SENTIMENT_PORT_SUMMARY, esEtiquetaDeSentimiento, } from './sentiment.js';
6
+ export type { SentimentLabel, SentimentPort } from './sentiment.js';
7
+ export { outputGroupsFor, todosLosOutputGroups } from './types.js';
8
+ export type { OutputGroupsConfig } from './types.js';
5
9
  export { NODE_DISPATCH, getAllNodeCollections, getNodeDispatchConfig, pasaLoQueRecibe, } from './dispatch.js';
6
10
  export type { NodeRegistryEntry, NodeGroup, NodeVersionSpec, VersionCatalog, } from './registry.js';
7
11
  export { NODE_REGISTRY, getNodeRegistryEntry, NODE_DETAIL_PATHS, NODE_COLORS, NODE_STATE_KEYS, PREFIX_TO_NODE_TYPE, NODE_TYPE_TO_PREFIX, } from './registry.js';
@@ -66,6 +70,14 @@ export { DOCS_OPERATIONS, DOCS_OPERATION_SPECS, isDocsOperation, } from './docs-
66
70
  export type { DocsOperation, DocsParamType, DocsParamSlot, DocsParamSpec, DocsOperationSpec, } from './docs-operations.js';
67
71
  export { DOCS_TOOLKIT_SPECS, DOCS_TOOLKIT_BY_TOOL_NAME, DOCS_TOOLKIT_DEFAULTABLE, } from './docs-toolkit.js';
68
72
  export type { DocsToolkitSpec, DocsToolkitParameter, } from './docs-toolkit.js';
73
+ export { MONGO_TOOLKIT_SPECS, MONGO_TOOLKIT_BY_TOOL_NAME, } from './mongo-toolkit.js';
74
+ export type { MongoToolkitSpec, MongoToolkitParameter, } from './mongo-toolkit.js';
75
+ export { POSTGRES_TOOLKIT_SPECS, POSTGRES_TOOLKIT_BY_TOOL_NAME, } from './postgres-toolkit.js';
76
+ export type { PostgresToolkitSpec, PostgresToolkitParameter, } from './postgres-toolkit.js';
77
+ export { claseDeHerramienta, esHerramientaDestructiva, marcarDestructivas, } from './clase-de-herramienta.js';
78
+ export type { ClaseDeHerramienta } from './clase-de-herramienta.js';
79
+ export { TOOLKITS_POR_TIPO, operacionDeToolkit, esOperacionDestructiva, } from './toolkits.js';
80
+ export type { OperacionDeToolkit } from './toolkits.js';
69
81
  export type { LlmProvider, LlmProviderOption, LlmModelOption, } from './llm-models.js';
70
82
  export { LLM_PROVIDERS, LLM_MODELS, MODEL_CONTEXT_WINDOWS, getModelsFor, getDefaultModel, getModelLabel, } from './llm-models.js';
71
83
  export type { ModeloDeOpenRouter, PrecioDeOpenRouter, RespuestaDeModelosDeOpenRouter, } from './openrouter.js';
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- 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 = 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.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.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 = 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 = void 0;
5
- 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 = 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 = void 0;
6
- 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 = exports.MODEL_CONTEXT_WINDOWS = exports.LLM_MODELS = exports.LLM_PROVIDERS = 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 = void 0;
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.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 = exports.MODEL_CONTEXT_WINDOWS = exports.LLM_MODELS = exports.LLM_PROVIDERS = 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
7
  var types_js_1 = require("./types.js");
8
8
  Object.defineProperty(exports, "singleMeta", { enumerable: true, get: function () { return types_js_1.singleMeta; } });
9
9
  Object.defineProperty(exports, "iterableMeta", { enumerable: true, get: function () { return types_js_1.iterableMeta; } });
@@ -21,6 +21,16 @@ var ui_js_1 = require("./ui.js");
21
21
  Object.defineProperty(exports, "NODE_UI", { enumerable: true, get: function () { return ui_js_1.NODE_UI; } });
22
22
  Object.defineProperty(exports, "PREFIX_TO_TYPE", { enumerable: true, get: function () { return ui_js_1.PREFIX_TO_TYPE; } });
23
23
  Object.defineProperty(exports, "resolveNodeId", { enumerable: true, get: function () { return ui_js_1.resolveNodeId; } });
24
+ var sentiment_js_1 = require("./sentiment.js");
25
+ Object.defineProperty(exports, "SENTIMENT_LABELS", { enumerable: true, get: function () { return sentiment_js_1.SENTIMENT_LABELS; } });
26
+ Object.defineProperty(exports, "SENTIMENT_UNCLEAR", { enumerable: true, get: function () { return sentiment_js_1.SENTIMENT_UNCLEAR; } });
27
+ Object.defineProperty(exports, "SENTIMENT_PORTS", { enumerable: true, get: function () { return sentiment_js_1.SENTIMENT_PORTS; } });
28
+ Object.defineProperty(exports, "SENTIMENT_PORT_LABEL", { enumerable: true, get: function () { return sentiment_js_1.SENTIMENT_PORT_LABEL; } });
29
+ Object.defineProperty(exports, "SENTIMENT_PORT_SUMMARY", { enumerable: true, get: function () { return sentiment_js_1.SENTIMENT_PORT_SUMMARY; } });
30
+ Object.defineProperty(exports, "esEtiquetaDeSentimiento", { enumerable: true, get: function () { return sentiment_js_1.esEtiquetaDeSentimiento; } });
31
+ var types_js_2 = require("./types.js");
32
+ Object.defineProperty(exports, "outputGroupsFor", { enumerable: true, get: function () { return types_js_2.outputGroupsFor; } });
33
+ Object.defineProperty(exports, "todosLosOutputGroups", { enumerable: true, get: function () { return types_js_2.todosLosOutputGroups; } });
24
34
  // ── Dispatch config ──
25
35
  /* Ya no es «API only»: `downstreamPayload` lo lee tambien el panel, que sin el
26
36
  ensenaba como entrada de un nodo la salida del que pasa de largo. */
@@ -214,6 +224,21 @@ var docs_toolkit_js_1 = require("./docs-toolkit.js");
214
224
  Object.defineProperty(exports, "DOCS_TOOLKIT_SPECS", { enumerable: true, get: function () { return docs_toolkit_js_1.DOCS_TOOLKIT_SPECS; } });
215
225
  Object.defineProperty(exports, "DOCS_TOOLKIT_BY_TOOL_NAME", { enumerable: true, get: function () { return docs_toolkit_js_1.DOCS_TOOLKIT_BY_TOOL_NAME; } });
216
226
  Object.defineProperty(exports, "DOCS_TOOLKIT_DEFAULTABLE", { enumerable: true, get: function () { return docs_toolkit_js_1.DOCS_TOOLKIT_DEFAULTABLE; } });
227
+ // ── Toolkits de bases de datos, y la clase de cada herramienta (2026-09-24) ──
228
+ var mongo_toolkit_js_1 = require("./mongo-toolkit.js");
229
+ Object.defineProperty(exports, "MONGO_TOOLKIT_SPECS", { enumerable: true, get: function () { return mongo_toolkit_js_1.MONGO_TOOLKIT_SPECS; } });
230
+ Object.defineProperty(exports, "MONGO_TOOLKIT_BY_TOOL_NAME", { enumerable: true, get: function () { return mongo_toolkit_js_1.MONGO_TOOLKIT_BY_TOOL_NAME; } });
231
+ var postgres_toolkit_js_1 = require("./postgres-toolkit.js");
232
+ Object.defineProperty(exports, "POSTGRES_TOOLKIT_SPECS", { enumerable: true, get: function () { return postgres_toolkit_js_1.POSTGRES_TOOLKIT_SPECS; } });
233
+ Object.defineProperty(exports, "POSTGRES_TOOLKIT_BY_TOOL_NAME", { enumerable: true, get: function () { return postgres_toolkit_js_1.POSTGRES_TOOLKIT_BY_TOOL_NAME; } });
234
+ var clase_de_herramienta_js_1 = require("./clase-de-herramienta.js");
235
+ Object.defineProperty(exports, "claseDeHerramienta", { enumerable: true, get: function () { return clase_de_herramienta_js_1.claseDeHerramienta; } });
236
+ Object.defineProperty(exports, "esHerramientaDestructiva", { enumerable: true, get: function () { return clase_de_herramienta_js_1.esHerramientaDestructiva; } });
237
+ Object.defineProperty(exports, "marcarDestructivas", { enumerable: true, get: function () { return clase_de_herramienta_js_1.marcarDestructivas; } });
238
+ var toolkits_js_1 = require("./toolkits.js");
239
+ Object.defineProperty(exports, "TOOLKITS_POR_TIPO", { enumerable: true, get: function () { return toolkits_js_1.TOOLKITS_POR_TIPO; } });
240
+ Object.defineProperty(exports, "operacionDeToolkit", { enumerable: true, get: function () { return toolkits_js_1.operacionDeToolkit; } });
241
+ Object.defineProperty(exports, "esOperacionDestructiva", { enumerable: true, get: function () { return toolkits_js_1.esOperacionDestructiva; } });
217
242
  var llm_models_js_1 = require("./llm-models.js");
218
243
  Object.defineProperty(exports, "LLM_PROVIDERS", { enumerable: true, get: function () { return llm_models_js_1.LLM_PROVIDERS; } });
219
244
  Object.defineProperty(exports, "LLM_MODELS", { enumerable: true, get: function () { return llm_models_js_1.LLM_MODELS; } });
@@ -0,0 +1,47 @@
1
+ /**
2
+ * MongoDB AI Toolkit — las herramientas que un mongoAction expone cuando
3
+ * `aiEnabled` está encendido.
4
+ *
5
+ * ## Lo que el modelo NO elige (2026-09-24, decisiones de Ariel)
6
+ *
7
+ * - **La colección.** Es la del nodo y no hay parámetro para cambiarla: para
8
+ * tocar otra se conecta otro nodo. Una herramienta de base de datos que deja
9
+ * al modelo nombrar la colección le da acceso a todo lo que la credencial
10
+ * alcanza, y eso no se ve al mirar el lienzo.
11
+ * - **El JavaScript del servidor.** `$where`, `$function` y `$accumulator`
12
+ * ejecutan código dentro de Mongo; el handler los rechaza en cualquier
13
+ * filtro o pipeline que venga del modelo.
14
+ * - **Escribir desde una agregación.** `$out` y `$merge` son las dos etapas que
15
+ * escriben; `aggregate_documents` las rechaza, y por eso cuenta como lectura.
16
+ *
17
+ * ## Los nombres
18
+ *
19
+ * Cada nombre empieza por el verbo que dice lo que hace, porque el `destructive`
20
+ * de cada operación lo pone `marcarDestructivas` leyendo ese verbo (ver
21
+ * `clase-de-herramienta.ts`). Por eso `findOneAndUpdate` se ofrece como
22
+ * `update_and_return_document` y no como `find_and_update_document`: con el
23
+ * segundo nombre el verbo diría «lectura» de algo que pisa un documento.
24
+ *
25
+ * Los textos van en inglés porque los lee el modelo.
26
+ */
27
+ import type { MongoOperation } from './mongo-operations';
28
+ export interface MongoToolkitParameter {
29
+ name: string;
30
+ /** El esquema MCP sólo admite estos tres; lo estructurado viaja como JSON
31
+ * en un `string`, igual que las filas de Sheets. */
32
+ type: 'string' | 'number' | 'boolean';
33
+ description: string;
34
+ required: boolean;
35
+ }
36
+ export interface MongoToolkitSpec {
37
+ operation: MongoOperation;
38
+ label: string;
39
+ toolName: string;
40
+ description: string;
41
+ parameters: MongoToolkitParameter[];
42
+ /** Pisa o borra. Lo pone `marcarDestructivas`, no se escribe a mano. */
43
+ destructive?: boolean;
44
+ }
45
+ export declare const MONGO_TOOLKIT_SPECS: MongoToolkitSpec[];
46
+ /** Las herramientas por nombre, para despachar una llamada del modelo. */
47
+ export declare const MONGO_TOOLKIT_BY_TOOL_NAME: Record<string, MongoToolkitSpec>;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ /**
3
+ * MongoDB AI Toolkit — las herramientas que un mongoAction expone cuando
4
+ * `aiEnabled` está encendido.
5
+ *
6
+ * ## Lo que el modelo NO elige (2026-09-24, decisiones de Ariel)
7
+ *
8
+ * - **La colección.** Es la del nodo y no hay parámetro para cambiarla: para
9
+ * tocar otra se conecta otro nodo. Una herramienta de base de datos que deja
10
+ * al modelo nombrar la colección le da acceso a todo lo que la credencial
11
+ * alcanza, y eso no se ve al mirar el lienzo.
12
+ * - **El JavaScript del servidor.** `$where`, `$function` y `$accumulator`
13
+ * ejecutan código dentro de Mongo; el handler los rechaza en cualquier
14
+ * filtro o pipeline que venga del modelo.
15
+ * - **Escribir desde una agregación.** `$out` y `$merge` son las dos etapas que
16
+ * escriben; `aggregate_documents` las rechaza, y por eso cuenta como lectura.
17
+ *
18
+ * ## Los nombres
19
+ *
20
+ * Cada nombre empieza por el verbo que dice lo que hace, porque el `destructive`
21
+ * de cada operación lo pone `marcarDestructivas` leyendo ese verbo (ver
22
+ * `clase-de-herramienta.ts`). Por eso `findOneAndUpdate` se ofrece como
23
+ * `update_and_return_document` y no como `find_and_update_document`: con el
24
+ * segundo nombre el verbo diría «lectura» de algo que pisa un documento.
25
+ *
26
+ * Los textos van en inglés porque los lee el modelo.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.MONGO_TOOLKIT_BY_TOOL_NAME = exports.MONGO_TOOLKIT_SPECS = void 0;
30
+ const clase_de_herramienta_js_1 = require("./clase-de-herramienta.js");
31
+ const p = (name, description, required = true, type = 'string') => ({ name, type, description, required });
32
+ const filtro = (para, required = true) => p('filter', `JSON object with a MongoDB query filter that selects ${para}, e.g. {"email": "a@b.c"} or {"total": {"$gt": 100}}. Server-side JavaScript operators ($where, $function, $accumulator) are rejected.`, required);
33
+ const proyeccion = () => p('projection', 'Optional JSON object choosing the fields to return, e.g. {"name": 1, "email": 1}. Leave it out to return whole documents.', false);
34
+ exports.MONGO_TOOLKIT_SPECS = (0, clase_de_herramienta_js_1.marcarDestructivas)([
35
+ {
36
+ operation: 'findAll',
37
+ label: 'Find documents',
38
+ toolName: 'find_documents',
39
+ description: "Return the documents of this node's collection that match a filter. Returns at most `limit` documents — use a filter that narrows the result instead of reading the whole collection.",
40
+ parameters: [
41
+ filtro('the documents to return. {} matches every document', false),
42
+ proyeccion(),
43
+ p('sort', 'Optional JSON object with the sort order, e.g. {"createdAt": -1} for newest first.', false),
44
+ p('limit', 'Maximum number of documents to return (default 20, maximum 100).', false, 'number'),
45
+ ],
46
+ },
47
+ {
48
+ operation: 'findOne',
49
+ label: 'Find one document',
50
+ toolName: 'find_one_document',
51
+ description: "Return the first document of this node's collection that matches a filter, or nothing when none does.",
52
+ parameters: [filtro('the document'), proyeccion()],
53
+ },
54
+ {
55
+ operation: 'aggregate',
56
+ label: 'Aggregate documents',
57
+ toolName: 'aggregate_documents',
58
+ description: "Run an aggregation pipeline over this node's collection and return its result — for counts, sums, groupings and joins with $lookup. It only reads: the $out and $merge stages, which write, are rejected.",
59
+ parameters: [
60
+ p('pipeline', 'JSON array of aggregation stages, e.g. [{"$match": {"status": "paid"}}, {"$group": {"_id": "$customer", "total": {"$sum": "$amount"}}}].'),
61
+ ],
62
+ },
63
+ {
64
+ operation: 'insertOne',
65
+ label: 'Insert document',
66
+ toolName: 'insert_document',
67
+ description: "Insert one new document into this node's collection and return its _id. It does not check for duplicates — when the document might already exist, find it first.",
68
+ parameters: [
69
+ p('document', 'JSON object with the new document, e.g. {"name": "Ariel", "email": "a@b.c"}.'),
70
+ ],
71
+ },
72
+ {
73
+ operation: 'updateOne',
74
+ label: 'Update document',
75
+ toolName: 'update_document',
76
+ description: "Update the first document of this node's collection that matches a filter. It overwrites the fields you set. When nothing matches it changes nothing — it does not create a document.",
77
+ parameters: [
78
+ filtro('the document to update. It cannot be empty'),
79
+ p('update', 'JSON object with MongoDB update operators, e.g. {"$set": {"status": "shipped"}} or {"$inc": {"stock": -1}}. A plain object without operators is rejected, because it would replace the whole document.'),
80
+ ],
81
+ },
82
+ {
83
+ operation: 'findOneAndUpdate',
84
+ label: 'Update and return document',
85
+ toolName: 'update_and_return_document',
86
+ description: "Update the first document of this node's collection that matches a filter and return it as it is AFTER the update. Use it when you need the updated values in your reply; otherwise update_document is enough.",
87
+ parameters: [
88
+ filtro('the document to update. It cannot be empty'),
89
+ p('update', 'JSON object with MongoDB update operators, e.g. {"$set": {"status": "shipped"}}. A plain object without operators is rejected.'),
90
+ ],
91
+ },
92
+ {
93
+ operation: 'deleteOne',
94
+ label: 'Delete document',
95
+ toolName: 'delete_document',
96
+ description: "Delete the first document of this node's collection that matches a filter. This cannot be undone. When you are not sure which document the filter selects, call find_one_document first.",
97
+ parameters: [filtro('the document to delete. It cannot be empty')],
98
+ },
99
+ ]);
100
+ /** Las herramientas por nombre, para despachar una llamada del modelo. */
101
+ exports.MONGO_TOOLKIT_BY_TOOL_NAME = Object.fromEntries(exports.MONGO_TOOLKIT_SPECS.map((s) => [s.toolName, s]));
@@ -0,0 +1,52 @@
1
+ /**
2
+ * PostgreSQL AI Toolkit — las herramientas que un postgresAction expone cuando
3
+ * `aiEnabled` está encendido.
4
+ *
5
+ * ## Por qué las escrituras NO reciben SQL (2026-09-24, decisión de Ariel)
6
+ *
7
+ * El nodo, en modo de una operación, ejecuta el SQL que se le escribe: sus
8
+ * cinco operaciones son una etiqueta encima del mismo SQL crudo. Si el toolkit
9
+ * hiciera lo mismo, bloquear una herramienta no bloquearía nada — un
10
+ * `insert_rows` puede llevar un `DELETE` dentro de un `WITH`, y quien bloqueó
11
+ * `delete_rows` seguiría viendo desaparecer filas.
12
+ *
13
+ * Así que las tres escrituras reciben la tabla del nodo y JSON, y el SQL lo
14
+ * genera el handler, parametrizado y con los identificadores entrecomillados:
15
+ * el modelo no escribe SQL que se ejecute como escritura.
16
+ *
17
+ * ## Lo que queda con SQL, y cómo se contiene
18
+ *
19
+ * - `query_rows` recibe SQL, y corre dentro de una transacción **READ ONLY**:
20
+ * un `DELETE`, un `UPDATE` o un `CREATE` los rechaza el propio Postgres, no
21
+ * una expresión regular nuestra. Puede leer otras tablas —un JOIN hace
22
+ * falta a menudo—; el límite ahí lo pone el usuario de base de datos de la
23
+ * credencial.
24
+ * - `execute_sql` recibe SQL cualquiera, DDL incluido. Es la excepción
25
+ * consciente a «sólo la tabla del nodo»: SQL crudo no se puede vallar a una
26
+ * tabla. La contienen tres cosas: es siempre destructiva (el gate del AI
27
+ * Node la para si está encendido), se puede bloquear en el nodo, y el
28
+ * usuario de base de datos.
29
+ *
30
+ * Los textos van en inglés porque los lee el modelo.
31
+ */
32
+ import type { PostgresOperation } from './postgres-operations';
33
+ export interface PostgresToolkitParameter {
34
+ name: string;
35
+ /** El esquema MCP sólo admite estos tres; lo estructurado viaja como JSON
36
+ * en un `string`. */
37
+ type: 'string' | 'number' | 'boolean';
38
+ description: string;
39
+ required: boolean;
40
+ }
41
+ export interface PostgresToolkitSpec {
42
+ operation: PostgresOperation;
43
+ label: string;
44
+ toolName: string;
45
+ description: string;
46
+ parameters: PostgresToolkitParameter[];
47
+ /** Pisa o borra. Lo pone `marcarDestructivas`, no se escribe a mano. */
48
+ destructive?: boolean;
49
+ }
50
+ export declare const POSTGRES_TOOLKIT_SPECS: PostgresToolkitSpec[];
51
+ /** Las herramientas por nombre, para despachar una llamada del modelo. */
52
+ export declare const POSTGRES_TOOLKIT_BY_TOOL_NAME: Record<string, PostgresToolkitSpec>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * PostgreSQL AI Toolkit — las herramientas que un postgresAction expone cuando
4
+ * `aiEnabled` está encendido.
5
+ *
6
+ * ## Por qué las escrituras NO reciben SQL (2026-09-24, decisión de Ariel)
7
+ *
8
+ * El nodo, en modo de una operación, ejecuta el SQL que se le escribe: sus
9
+ * cinco operaciones son una etiqueta encima del mismo SQL crudo. Si el toolkit
10
+ * hiciera lo mismo, bloquear una herramienta no bloquearía nada — un
11
+ * `insert_rows` puede llevar un `DELETE` dentro de un `WITH`, y quien bloqueó
12
+ * `delete_rows` seguiría viendo desaparecer filas.
13
+ *
14
+ * Así que las tres escrituras reciben la tabla del nodo y JSON, y el SQL lo
15
+ * genera el handler, parametrizado y con los identificadores entrecomillados:
16
+ * el modelo no escribe SQL que se ejecute como escritura.
17
+ *
18
+ * ## Lo que queda con SQL, y cómo se contiene
19
+ *
20
+ * - `query_rows` recibe SQL, y corre dentro de una transacción **READ ONLY**:
21
+ * un `DELETE`, un `UPDATE` o un `CREATE` los rechaza el propio Postgres, no
22
+ * una expresión regular nuestra. Puede leer otras tablas —un JOIN hace
23
+ * falta a menudo—; el límite ahí lo pone el usuario de base de datos de la
24
+ * credencial.
25
+ * - `execute_sql` recibe SQL cualquiera, DDL incluido. Es la excepción
26
+ * consciente a «sólo la tabla del nodo»: SQL crudo no se puede vallar a una
27
+ * tabla. La contienen tres cosas: es siempre destructiva (el gate del AI
28
+ * Node la para si está encendido), se puede bloquear en el nodo, y el
29
+ * usuario de base de datos.
30
+ *
31
+ * Los textos van en inglés porque los lee el modelo.
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.POSTGRES_TOOLKIT_BY_TOOL_NAME = exports.POSTGRES_TOOLKIT_SPECS = void 0;
35
+ const clase_de_herramienta_js_1 = require("./clase-de-herramienta.js");
36
+ const p = (name, description, required = true, type = 'string') => ({ name, type, description, required });
37
+ const donde = (que) => p('where', `JSON object selecting the rows ${que}: each key is a column and each value the value it must equal, all of them at once, e.g. {"id": 42} or {"status": "pending", "customer_id": 7}. It cannot be empty — an empty condition would touch every row.`);
38
+ const parametros = () => p('params', 'Optional JSON array with the values for the $1, $2… placeholders in the SQL, e.g. ["paid", 100]. Always pass values this way instead of writing them into the SQL.', false);
39
+ exports.POSTGRES_TOOLKIT_SPECS = (0, clase_de_herramienta_js_1.marcarDestructivas)([
40
+ {
41
+ operation: 'query',
42
+ label: 'Query rows',
43
+ toolName: 'query_rows',
44
+ description: 'Run a read-only SQL query (SELECT, WITH … SELECT) and return its rows, at most 200. It runs inside a READ ONLY transaction: a statement that writes is rejected by the database. Use it for lookups, counts, sums and joins.',
45
+ parameters: [
46
+ p('sql', 'The SELECT statement, with $1, $2… placeholders for values, e.g. SELECT * FROM orders WHERE status = $1 LIMIT 20.'),
47
+ parametros(),
48
+ ],
49
+ },
50
+ {
51
+ operation: 'insertOne',
52
+ label: 'Insert rows',
53
+ toolName: 'insert_rows',
54
+ description: "Insert one or more rows into this node's table and return them as stored, with the values the database filled in (ids, defaults). It does not check for duplicates.",
55
+ parameters: [
56
+ p('rows', 'JSON object with one row, or a JSON array of rows. Keys are column names, e.g. {"name": "Ariel", "email": "a@b.c"}. A key that is not a column makes the call fail.'),
57
+ ],
58
+ },
59
+ {
60
+ operation: 'update',
61
+ label: 'Update rows',
62
+ toolName: 'update_rows',
63
+ description: "Update the rows of this node's table that match a condition, overwriting the columns you set, and return them after the update. When no row matches it changes nothing.",
64
+ parameters: [
65
+ p('set', 'JSON object with the columns to overwrite and their new values, e.g. {"status": "shipped"}.'),
66
+ donde('to update'),
67
+ ],
68
+ },
69
+ {
70
+ operation: 'delete',
71
+ label: 'Delete rows',
72
+ toolName: 'delete_rows',
73
+ description: "Delete the rows of this node's table that match a condition and return them as they were. This cannot be undone: when you are not sure which rows match, check with query_rows first.",
74
+ parameters: [donde('to delete')],
75
+ },
76
+ {
77
+ operation: 'execute',
78
+ label: 'Execute SQL',
79
+ toolName: 'execute_sql',
80
+ description: 'Run any SQL statement — including ones that change the schema (CREATE, ALTER, DROP) — and return what it produces. It is not limited to this node\'s table. Prefer query_rows, insert_rows, update_rows or delete_rows whenever one of them can do the job.',
81
+ parameters: [
82
+ p('sql', 'The SQL statement, with $1, $2… placeholders for values.'),
83
+ parametros(),
84
+ ],
85
+ },
86
+ ]);
87
+ /** Las herramientas por nombre, para despachar una llamada del modelo. */
88
+ exports.POSTGRES_TOOLKIT_BY_TOOL_NAME = Object.fromEntries(exports.POSTGRES_TOOLKIT_SPECS.map((s) => [s.toolName, s]));
package/dist/registry.js CHANGED
@@ -412,6 +412,11 @@ exports.NODE_REGISTRY = {
412
412
  allStateKey: "allMongoActions",
413
413
  color: "#34d399",
414
414
  testable: true,
415
+ /* Modo AI toolkit (2026-09-24): con `aiEnabled` el nodo sólo lo llama un
416
+ AI Node —como el resto de toolkits—, y una arista del lienzo no le
417
+ llevaría nada. Hasta que la api y el dashboard le den `aiEnabled`, el
418
+ campo no existe y esto devuelve `false`: no cambia nada. */
419
+ isToolOnly: (e) => e.aiEnabled === true,
415
420
  },
416
421
  postgresAction: {
417
422
  type: "postgresAction",
@@ -424,6 +429,11 @@ exports.NODE_REGISTRY = {
424
429
  allStateKey: "allPostgresActions",
425
430
  color: "#336791",
426
431
  testable: true,
432
+ /* Modo AI toolkit (2026-09-24): con `aiEnabled` el nodo sólo lo llama un
433
+ AI Node —como el resto de toolkits—, y una arista del lienzo no le
434
+ llevaría nada. Hasta que la api y el dashboard le den `aiEnabled`, el
435
+ campo no existe y esto devuelve `false`: no cambia nada. */
436
+ isToolOnly: (e) => e.aiEnabled === true,
427
437
  },
428
438
  notificationAction: {
429
439
  type: "notificationAction",
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Sentiment analysis en el AI Node — las etiquetas, los puertos y el orden.
3
+ *
4
+ * ## Por qué vive aquí y no en cada repo
5
+ *
6
+ * Las tres etiquetas son a la vez TRES cosas: el `enum` del esquema que se le
7
+ * da al modelo, el nombre de los puertos por los que el nodo despacha, y las
8
+ * pastillas de la tarjeta del lienzo. Si el api, hw-nodes y el dashboard
9
+ * escriben su propia lista, la primera que alguien reordene o rebautice deja
10
+ * una arista apuntando a un puerto que ya no existe — y eso no lo dice ningún
11
+ * compilador. Es el mismo motivo por el que las operaciones de cada nodo
12
+ * viven en este paquete.
13
+ *
14
+ * ## Por qué `unclear` no es una etiqueta más
15
+ *
16
+ * El modelo elige entre las TRES de `SENTIMENT_LABELS`; `unclear` no se le
17
+ * ofrece nunca. Es lo que hace el NODO cuando la confianza queda por debajo
18
+ * del umbral (`sentimentThreshold`) o cuando la respuesta no se puede leer.
19
+ * Ofrecérsela al modelo sería darle una salida cómoda para no mojarse, que es
20
+ * justo lo contrario de lo que se busca al poner un umbral.
21
+ *
22
+ * A diferencia del `other` del clasificador, `unclear` SÍ tiene puerto: el
23
+ * caso de uso es mandar a revisión humana lo que el modelo no ve claro, y sin
24
+ * puerto eso obligaba a adivinar por qué un item no salió por ninguna rama.
25
+ */
26
+ /** Lo que el modelo puede contestar, en orden de peor a mejor. */
27
+ export declare const SENTIMENT_LABELS: readonly ["negative", "neutral", "positive"];
28
+ export type SentimentLabel = (typeof SENTIMENT_LABELS)[number];
29
+ /** La salida del nodo cuando no hay etiqueta fiable. No se le ofrece al modelo. */
30
+ export declare const SENTIMENT_UNCLEAR = "unclear";
31
+ /** Los cuatro puertos del modo sentiment, en el orden en que se pintan. */
32
+ export declare const SENTIMENT_PORTS: readonly ["negative", "neutral", "positive", "unclear"];
33
+ export type SentimentPort = (typeof SENTIMENT_PORTS)[number];
34
+ /** El nombre que ve la persona, por puerto. */
35
+ export declare const SENTIMENT_PORT_LABEL: Record<SentimentPort, string>;
36
+ /** Qué significa cada puerto, para el modal de conexión y la doc. */
37
+ export declare const SENTIMENT_PORT_SUMMARY: Record<SentimentPort, string>;
38
+ /** ¿Es una de las tres que el modelo puede contestar? */
39
+ export declare function esEtiquetaDeSentimiento(v: unknown): v is SentimentLabel;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Sentiment analysis en el AI Node — las etiquetas, los puertos y el orden.
4
+ *
5
+ * ## Por qué vive aquí y no en cada repo
6
+ *
7
+ * Las tres etiquetas son a la vez TRES cosas: el `enum` del esquema que se le
8
+ * da al modelo, el nombre de los puertos por los que el nodo despacha, y las
9
+ * pastillas de la tarjeta del lienzo. Si el api, hw-nodes y el dashboard
10
+ * escriben su propia lista, la primera que alguien reordene o rebautice deja
11
+ * una arista apuntando a un puerto que ya no existe — y eso no lo dice ningún
12
+ * compilador. Es el mismo motivo por el que las operaciones de cada nodo
13
+ * viven en este paquete.
14
+ *
15
+ * ## Por qué `unclear` no es una etiqueta más
16
+ *
17
+ * El modelo elige entre las TRES de `SENTIMENT_LABELS`; `unclear` no se le
18
+ * ofrece nunca. Es lo que hace el NODO cuando la confianza queda por debajo
19
+ * del umbral (`sentimentThreshold`) o cuando la respuesta no se puede leer.
20
+ * Ofrecérsela al modelo sería darle una salida cómoda para no mojarse, que es
21
+ * justo lo contrario de lo que se busca al poner un umbral.
22
+ *
23
+ * A diferencia del `other` del clasificador, `unclear` SÍ tiene puerto: el
24
+ * caso de uso es mandar a revisión humana lo que el modelo no ve claro, y sin
25
+ * puerto eso obligaba a adivinar por qué un item no salió por ninguna rama.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.SENTIMENT_PORT_SUMMARY = exports.SENTIMENT_PORT_LABEL = exports.SENTIMENT_PORTS = exports.SENTIMENT_UNCLEAR = exports.SENTIMENT_LABELS = void 0;
29
+ exports.esEtiquetaDeSentimiento = esEtiquetaDeSentimiento;
30
+ /** Lo que el modelo puede contestar, en orden de peor a mejor. */
31
+ exports.SENTIMENT_LABELS = ['negative', 'neutral', 'positive'];
32
+ /** La salida del nodo cuando no hay etiqueta fiable. No se le ofrece al modelo. */
33
+ exports.SENTIMENT_UNCLEAR = 'unclear';
34
+ /** Los cuatro puertos del modo sentiment, en el orden en que se pintan. */
35
+ exports.SENTIMENT_PORTS = [
36
+ ...exports.SENTIMENT_LABELS,
37
+ exports.SENTIMENT_UNCLEAR,
38
+ ];
39
+ /** El nombre que ve la persona, por puerto. */
40
+ exports.SENTIMENT_PORT_LABEL = {
41
+ negative: 'Negative',
42
+ neutral: 'Neutral',
43
+ positive: 'Positive',
44
+ unclear: 'Unclear',
45
+ };
46
+ /** Qué significa cada puerto, para el modal de conexión y la doc. */
47
+ exports.SENTIMENT_PORT_SUMMARY = {
48
+ negative: 'Complaints, frustration, criticism',
49
+ neutral: 'Factual, mixed, or no clear feeling',
50
+ positive: 'Praise, satisfaction, enthusiasm',
51
+ unclear: 'Below the confidence floor, or unreadable',
52
+ };
53
+ /** ¿Es una de las tres que el modelo puede contestar? */
54
+ function esEtiquetaDeSentimiento(v) {
55
+ return (typeof v === 'string' &&
56
+ exports.SENTIMENT_LABELS.includes(v));
57
+ }
@@ -34,7 +34,8 @@ export interface SheetsToolkitSpec {
34
34
  toolName: string;
35
35
  description: string;
36
36
  parameters: SheetsToolkitParameter[];
37
- /** Escribe en la hoja del usuario. Lo usa la confirmación previa del AI Node. */
37
+ /** Pisa o borra. Lo pone `marcarDestructivas` leyendo el verbo del
38
+ * nombre (ver `clase-de-herramienta.ts`), no se escribe a mano. */
38
39
  destructive?: boolean;
39
40
  }
40
41
  export declare const SHEETS_TOOLKIT_SPECS: SheetsToolkitSpec[];
@@ -22,6 +22,7 @@
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.SHEETS_TOOLKIT_DEFAULTABLE = exports.SHEETS_TOOLKIT_BY_TOOL_NAME = exports.SHEETS_TOOLKIT_SPECS = void 0;
25
+ const clase_de_herramienta_js_1 = require("./clase-de-herramienta.js");
25
26
  const p = (name, description, required = true, type = 'string') => ({ name, type, description, required });
26
27
  /*
27
28
  * La hoja y la pestaña del nodo van como **defecto**, y el modelo puede
@@ -44,14 +45,13 @@ const p = (name, description, required = true, type = 'string') => ({ name, type
44
45
  const hoja = () => p('spreadsheetId', "Id of the Google Sheets document — the long chunk of its URL, between /d/ and /edit.");
45
46
  const pestana = () => p('sheetName', 'Name of the tab inside the document, exactly as it reads on its tab strip.');
46
47
  const fila = (que) => p('row', `JSON object holding ${que}. Keys are the sheet's **header names**, spelled exactly as they appear in its title row: {"Name": "Ariel", "Email": "a@b.c"}. A key that is not a header makes the call fail, so when you do not know the headers, call get_rows first.`);
47
- exports.SHEETS_TOOLKIT_SPECS = [
48
+ exports.SHEETS_TOOLKIT_SPECS = (0, clase_de_herramienta_js_1.marcarDestructivas)([
48
49
  {
49
50
  operation: 'appendRow',
50
51
  label: 'Append row',
51
52
  toolName: 'append_row',
52
53
  description: 'Add a new row at the bottom of the tab. It does not check whether the row already exists — when it might, use append_or_update_row instead so you do not duplicate it.',
53
54
  parameters: [fila('the values of the new row'), hoja(), pestana()],
54
- destructive: true,
55
55
  },
56
56
  {
57
57
  operation: 'updateRow',
@@ -65,7 +65,6 @@ exports.SHEETS_TOOLKIT_SPECS = [
65
65
  hoja(),
66
66
  pestana(),
67
67
  ],
68
- destructive: true,
69
68
  },
70
69
  {
71
70
  operation: 'appendOrUpdateRow',
@@ -79,7 +78,6 @@ exports.SHEETS_TOOLKIT_SPECS = [
79
78
  hoja(),
80
79
  pestana(),
81
80
  ],
82
- destructive: true,
83
81
  },
84
82
  {
85
83
  operation: 'readRange',
@@ -116,9 +114,8 @@ exports.SHEETS_TOOLKIT_SPECS = [
116
114
  * en el nodo, y la api la aplica.
117
115
  */
118
116
  parameters: [p('title', 'Name of the new document.')],
119
- destructive: true,
120
117
  },
121
- ];
118
+ ]);
122
119
  /** Las herramientas por nombre, para despachar una llamada del modelo. */
123
120
  exports.SHEETS_TOOLKIT_BY_TOOL_NAME = Object.fromEntries(exports.SHEETS_TOOLKIT_SPECS.map((s) => [s.toolName, s]));
124
121
  /**
@@ -38,9 +38,8 @@ export interface SlackToolkitSpec {
38
38
  /** Descripción (más reglas de uso) que ve el LLM. */
39
39
  description: string;
40
40
  parameters: SlackToolkitParameter[];
41
- /** Operaciones irreversibles o que cambian privilegios. La capa MCP las
42
- * bloquea cuando el nodo de IA lleva `requireConfirmationForDestructive`,
43
- * salvo que la llamada traiga confirmación explícita. */
41
+ /** Pisa o borra. Lo pone `marcarDestructivas` leyendo el verbo del
42
+ * nombre (ver `clase-de-herramienta.ts`), no se escribe a mano. */
44
43
  destructive?: boolean;
45
44
  }
46
45
  export declare const SLACK_TOOLKIT_SPECS: SlackToolkitSpec[];
@@ -27,8 +27,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.SLACK_TOOLKIT_BY_TOOL_NAME = exports.SLACK_TOOLKIT_SPECS = void 0;
28
28
  exports.herramientasDeSlackPara = herramientasDeSlackPara;
29
29
  const slack_operations_js_1 = require("./slack-operations.js");
30
+ const clase_de_herramienta_js_1 = require("./clase-de-herramienta.js");
30
31
  const p = (name, description, required = true, type = 'string') => ({ name, type, description, required });
31
- exports.SLACK_TOOLKIT_SPECS = [
32
+ exports.SLACK_TOOLKIT_SPECS = (0, clase_de_herramienta_js_1.marcarDestructivas)([
32
33
  // ── Messages ─────────────────────────────────────────────────────
33
34
  {
34
35
  operation: 'sendMessage',
@@ -67,7 +68,6 @@ exports.SLACK_TOOLKIT_SPECS = [
67
68
  p('channel', 'Channel where the message lives.'),
68
69
  p('ts', 'Timestamp of the message to delete.'),
69
70
  ],
70
- destructive: true,
71
71
  },
72
72
  {
73
73
  operation: 'sendEphemeral',
@@ -146,7 +146,6 @@ exports.SLACK_TOOLKIT_SPECS = [
146
146
  p('name', 'Channel name — lowercase, no spaces, max 80 chars.'),
147
147
  p('isPrivate', 'Create a private channel instead of public. Default false.', false, 'boolean'),
148
148
  ],
149
- destructive: true,
150
149
  },
151
150
  {
152
151
  operation: 'inviteToChannel',
@@ -216,7 +215,7 @@ exports.SLACK_TOOLKIT_SPECS = [
216
215
  p('threadTs', 'Thread to attach the file to.', false),
217
216
  ],
218
217
  },
219
- ];
218
+ ]);
220
219
  exports.SLACK_TOOLKIT_BY_TOOL_NAME = Object.fromEntries(exports.SLACK_TOOLKIT_SPECS.map((s) => [s.toolName, s]));
221
220
  /**
222
221
  * Las herramientas que ofrecerle al modelo con ESTA credencial.