@hostwebhook/node-types 1.82.0 → 1.84.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.
@@ -58,6 +58,8 @@ export const NODE_DISPATCH = {
58
58
  jiraAction: { service: 'jiraActionsService', collection: 'jiraactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
59
59
  bucketAction: { service: 'bucketActionsService', collection: 'bucketactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
60
60
  apifyAction: { service: 'apifyActionsService', collection: 'apifyactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
61
+ calendlyAction: { service: 'calendlyActionsService', collection: 'calendlyactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
62
+ airtableAction: { service: 'airtableActionsService', collection: 'airtableactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
61
63
  slackAction: { service: 'slackActionsService', collection: 'slackactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
62
64
  googleContactsAction: { service: 'googleContactsActionsService', collection: 'googlecontactsactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
63
65
  googleAnalyticsAction: { service: 'googleAnalyticsActionsService', collection: 'googleanalyticsactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded', downstreamPayload: 'result' },
@@ -80,6 +80,12 @@ export interface GmailParamSpec {
80
80
  value: string;
81
81
  label: string;
82
82
  }>;
83
+ /**
84
+ * Se pinta en la pestaña «Advanced» y no en «Config» [2026-09-14]. Igual
85
+ * que Drive, GitHub o Bucket. Lo que va ahí: las cabeceras del hilo
86
+ * (threadId, inReplyTo, references), CC/BCC, y los adjuntos.
87
+ */
88
+ advanced?: boolean;
83
89
  }
84
90
  export interface GmailOperationSpec {
85
91
  /** Etiqueta del desplegable y de la página. */
@@ -108,6 +114,12 @@ export interface GmailOperationSpec {
108
114
  * renderizador se invocaba tras `operation !== "send"`— y la ruta determinista no
109
115
  * las sabe mandar: `emailSender.send` recibe to/subject/html y nada más. Darles
110
116
  * soporte es una función nueva, no una mudanza.
117
+ *
118
+ * `attachments` [2026-09-14]: las cuatro operaciones que arman un mensaje
119
+ * (send, sendAndWaitForResponse, createDraft, replyToThread) adjuntan lo que
120
+ * el flujo ya tiene. Es una RUTA del payload, como el «File from payload» de
121
+ * Jira: la api saca las referencias `_file`, las resuelve por el registro con
122
+ * el `orgId` y arma el `multipart/mixed`. No hay subida a mano. Va en Advanced.
111
123
  */
112
124
  export declare const GMAIL_OPERATION_SPECS: Record<GmailOperation, GmailOperationSpec>;
113
125
  export declare const GMAIL_DROPDOWN_OPERATIONS: readonly GmailOperation[];
@@ -74,6 +74,12 @@ export const GMAIL_OPERATION_GROUPS = ['Messages', 'Drafts', 'Labels', 'Threads'
74
74
  * renderizador se invocaba tras `operation !== "send"`— y la ruta determinista no
75
75
  * las sabe mandar: `emailSender.send` recibe to/subject/html y nada más. Darles
76
76
  * soporte es una función nueva, no una mudanza.
77
+ *
78
+ * `attachments` [2026-09-14]: las cuatro operaciones que arman un mensaje
79
+ * (send, sendAndWaitForResponse, createDraft, replyToThread) adjuntan lo que
80
+ * el flujo ya tiene. Es una RUTA del payload, como el «File from payload» de
81
+ * Jira: la api saca las referencias `_file`, las resuelve por el registro con
82
+ * el `orgId` y arma el `multipart/mixed`. No hay subida a mano. Va en Advanced.
77
83
  */
78
84
  export const GMAIL_OPERATION_SPECS = {
79
85
  send: {
@@ -85,6 +91,7 @@ export const GMAIL_OPERATION_SPECS = {
85
91
  { name: 'to', label: 'To', type: 'emails', required: true, placeholder: '{{payload.email}}' },
86
92
  { name: 'subject', label: 'Subject', type: 'string', required: true, placeholder: 'Order #{{payload.id}}' },
87
93
  { name: 'body', label: 'Body (HTML)', type: 'htmlTemplate', required: true, placeholder: '<p>Hi {{payload.name}}...</p>', language: 'html' },
94
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
88
95
  ],
89
96
  },
90
97
  sendAndWaitForResponse: {
@@ -103,6 +110,7 @@ export const GMAIL_OPERATION_SPECS = {
103
110
  { name: 'disapproveCommentLabel', label: 'Comment form label', type: 'string', placeholder: 'Why are you disapproving?', description: "Heading shown above the textarea. Only used when 'Require comment' is on." },
104
111
  { name: 'disapproveCommentPlaceholder', label: 'Comment placeholder', type: 'string', placeholder: 'Tell the sender why — this helps them improve the next attempt.', description: "Hint shown inside the empty textarea. Only used when 'Require comment' is on." },
105
112
  { name: 'timeoutMinutes', label: 'Timeout (minutes)', type: 'number', placeholder: '1440', description: 'Auto-resolve as approved=false after this many minutes. Default 1440 (24h).' },
113
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
106
114
  ],
107
115
  },
108
116
  createDraft: {
@@ -114,11 +122,12 @@ export const GMAIL_OPERATION_SPECS = {
114
122
  { name: 'to', label: 'To', type: 'emails', required: true, placeholder: '{{payload.email}}', description: 'Recipients the draft will be addressed to' },
115
123
  { name: 'subject', label: 'Subject', type: 'string', placeholder: 'Draft: {{payload.topic}}' },
116
124
  { name: 'body', label: 'Body (HTML)', type: 'htmlTemplate', language: 'html' },
117
- { name: 'cc', label: 'CC', type: 'emails' },
118
- { name: 'bcc', label: 'BCC', type: 'emails' },
119
- { name: 'threadId', label: 'Thread ID', type: 'string', description: 'Optional — attach draft to an existing thread' },
120
- { name: 'inReplyTo', label: 'In-Reply-To', type: 'string', description: 'Optional Message-ID header' },
121
- { name: 'references', label: 'References', type: 'string', description: 'Optional References chain' },
125
+ { name: 'cc', label: 'CC', type: 'emails', advanced: true },
126
+ { name: 'bcc', label: 'BCC', type: 'emails', advanced: true },
127
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
128
+ { name: 'threadId', label: 'Thread ID', type: 'string', advanced: true, description: 'Optional — attach draft to an existing thread' },
129
+ { name: 'inReplyTo', label: 'In-Reply-To', type: 'string', advanced: true, description: 'Optional Message-ID header' },
130
+ { name: 'references', label: 'References', type: 'string', advanced: true, description: 'Optional References chain' },
122
131
  ],
123
132
  },
124
133
  sendDraft: {
@@ -139,8 +148,9 @@ export const GMAIL_OPERATION_SPECS = {
139
148
  { name: 'body', label: 'Body (HTML)', type: 'htmlTemplate', required: true, language: 'html' },
140
149
  { name: 'subject', label: 'Subject', type: 'string', description: 'Optional — defaults to "Re: <original>"' },
141
150
  { name: 'to', label: 'To', type: 'emails', description: 'Optional — defaults to last sender in thread' },
142
- { name: 'cc', label: 'CC', type: 'emails' },
143
- { name: 'bcc', label: 'BCC', type: 'emails' },
151
+ { name: 'cc', label: 'CC', type: 'emails', advanced: true },
152
+ { name: 'bcc', label: 'BCC', type: 'emails', advanced: true },
153
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
144
154
  ],
145
155
  },
146
156
  getMessage: {
@@ -278,6 +288,14 @@ export const GMAIL_OPERATION_SPECS = {
278
288
  export const GMAIL_DROPDOWN_OPERATIONS = GMAIL_OPERATIONS.filter((op) => GMAIL_OPERATION_SPECS[op].group !== undefined);
279
289
  export const GMAIL_TOOLKIT_OPERATIONS = GMAIL_OPERATIONS.filter((op) => op !== 'sendAndWaitForResponse');
280
290
  const p = (name, description, required = true, type = 'string') => ({ name, type, description, required });
291
+ /**
292
+ * Los adjuntos, para la IA [2026-09-14]: el modelo no sube ficheros, pasa
293
+ * las referencias que ya están en el payload (los objetos `_file`) tal cual,
294
+ * como texto JSON. La api las resuelve por el registro de la organización.
295
+ */
296
+ const ADJUNTOS = p('attachments', 'Optional. Files to attach, taken from the payload: pass the `_file` reference object(s) ' +
297
+ 'exactly as they appear (a single `_file`, or the `_files` / `files` array), as a JSON ' +
298
+ 'string. Never invent one. Up to 5 files, 25 MB in total.', false);
281
299
  export const GMAIL_TOOLKIT_SPECS = [
282
300
  {
283
301
  operation: 'send',
@@ -297,6 +315,7 @@ export const GMAIL_TOOLKIT_SPECS = [
297
315
  p('body', 'HTML-formatted email body.'),
298
316
  p('cc', 'Optional CC recipients.', false),
299
317
  p('bcc', 'Optional BCC recipients.', false),
318
+ ADJUNTOS,
300
319
  ],
301
320
  },
302
321
  {
@@ -319,6 +338,7 @@ export const GMAIL_TOOLKIT_SPECS = [
319
338
  p('threadId', 'Optional — attach draft to an existing thread.', false),
320
339
  p('inReplyTo', 'Optional Message-ID header to reply to.', false),
321
340
  p('references', 'Optional References header chain.', false),
341
+ ADJUNTOS,
322
342
  ],
323
343
  },
324
344
  {
@@ -355,6 +375,7 @@ export const GMAIL_TOOLKIT_SPECS = [
355
375
  p('subject', 'Optional — defaults to "Re: <original>".', false),
356
376
  p('cc', 'Optional CC recipients.', false),
357
377
  p('bcc', 'Optional BCC recipients.', false),
378
+ ADJUNTOS,
358
379
  ],
359
380
  },
360
381
  {
@@ -510,6 +531,7 @@ export const GMAIL_SEND_AND_WAIT_TOOL_SPEC = {
510
531
  p('disapproveLabel', "Optional. Disapprove button label. Default: 'Disapprove'.", false),
511
532
  p('includeDisapprove', 'Optional. Include the Disapprove button. Default: true. Set to false for approve-only confirmations.', false),
512
533
  p('timeoutMinutes', 'Optional. Minutes to wait before auto-resolving with approved=false. Default 1440 (24h).', false),
534
+ ADJUNTOS,
513
535
  ],
514
536
  };
515
537
  /** Todo lo que el nodo sabe ejecutar, se ofrezca o no como herramienta. */
@@ -40,6 +40,10 @@ export { BUCKET_OPERATIONS, BUCKET_OPERATION_SPECS, BUCKET_ITERABLE_OPERATIONS,
40
40
  export type { BucketOperation, BucketParamType, BucketParamSpec, BucketOperationSpec, } from './bucket-operations.js';
41
41
  export { APIFY_OPERATIONS, APIFY_OPERATION_SPECS, APIFY_ITERABLE_OPERATIONS, isApifyOperation, } from './apify-operations.js';
42
42
  export type { ApifyOperation, ApifyParamType, ApifyParamSpec, ApifyOperationSpec, } from './apify-operations.js';
43
+ export { CALENDLY_OPERATIONS, CALENDLY_OPERATION_SPECS, CALENDLY_ITERABLE_OPERATIONS, isCalendlyOperation, } from './calendly-operations.js';
44
+ export type { CalendlyOperation, CalendlyParamType, CalendlyParamSpec, CalendlyOperationSpec, } from './calendly-operations.js';
45
+ export { AIRTABLE_OPERATIONS, AIRTABLE_OPERATION_SPECS, AIRTABLE_ITERABLE_OPERATIONS, isAirtableOperation, } from './airtable-operations.js';
46
+ export type { AirtableOperation, AirtableParamType, AirtableParamSpec, AirtableOperationSpec, } from './airtable-operations.js';
43
47
  export { SLACK_OPERATIONS, SLACK_OPERATION_SPECS, SLACK_CAPACIDADES_POR_CREDENCIAL, operacionesDeSlackPara, slackPuedeEjecutar, camposDeSlackNoDisponibles, isSlackOperation, } from './slack-operations.js';
44
48
  export type { SlackOperation, SlackParamSpec, SlackOperationSpec, } from './slack-operations.js';
45
49
  export { SLACK_TOOLKIT_SPECS, SLACK_TOOLKIT_BY_TOOL_NAME, herramientasDeSlackPara, } from './slack-toolkit.js';
package/dist/esm/index.js CHANGED
@@ -36,6 +36,8 @@ export { GITHUB_OPERATIONS, GITHUB_OPERATION_SPECS, GITHUB_DROPDOWN_OPERATIONS,
36
36
  export { JIRA_OPERATIONS, JIRA_OPERATION_SPECS, JIRA_DROPDOWN_OPERATIONS, JIRA_ITERABLE_OPERATIONS, isJiraOperation, } from './jira-operations.js';
37
37
  export { BUCKET_OPERATIONS, BUCKET_OPERATION_SPECS, BUCKET_ITERABLE_OPERATIONS, isBucketOperation, } from './bucket-operations.js';
38
38
  export { APIFY_OPERATIONS, APIFY_OPERATION_SPECS, APIFY_ITERABLE_OPERATIONS, isApifyOperation, } from './apify-operations.js';
39
+ export { CALENDLY_OPERATIONS, CALENDLY_OPERATION_SPECS, CALENDLY_ITERABLE_OPERATIONS, isCalendlyOperation, } from './calendly-operations.js';
40
+ export { AIRTABLE_OPERATIONS, AIRTABLE_OPERATION_SPECS, AIRTABLE_ITERABLE_OPERATIONS, isAirtableOperation, } from './airtable-operations.js';
39
41
  export { SLACK_OPERATIONS, SLACK_OPERATION_SPECS, SLACK_CAPACIDADES_POR_CREDENCIAL, operacionesDeSlackPara, slackPuedeEjecutar, camposDeSlackNoDisponibles, isSlackOperation, } from './slack-operations.js';
40
42
  /* Misma pareja que en Discord: `SlackOperationSpec` es el formulario,
41
43
  `SlackToolkitSpec` es la herramienta que ve el LLM. */
@@ -645,6 +645,41 @@ export const NODE_REGISTRY = {
645
645
  testable: true,
646
646
  /* Sin `isToolOnly`: no trae modo toolkit de IA todavía. */
647
647
  },
648
+ calendlyAction: {
649
+ type: "calendlyAction",
650
+ prefix: "cly",
651
+ label: "Calendly",
652
+ group: "Actions",
653
+ detailPath: "/dashboard/calendly-actions",
654
+ apiPath: "/calendly-actions",
655
+ stateKey: "calendlyActions",
656
+ allStateKey: "allCalendlyActions",
657
+ /* [2026-09-15] El azul de la marca de Calendly (`#006BFF`). Es más
658
+ saturado que el de HTTP (`#3b82f6`) y más claro que el de Jira
659
+ (`#0052CC`); en el minimapa se distingue de los dos. Como dicen los
660
+ vecinos: la decisión se cierra mirando el minimapa. */
661
+ color: "#006BFF",
662
+ testable: true,
663
+ /* Sin `isToolOnly`: no trae modo toolkit de IA todavía, como Apify. */
664
+ },
665
+ airtableAction: {
666
+ type: "airtableAction",
667
+ prefix: "air",
668
+ label: "Airtable",
669
+ group: "Actions",
670
+ detailPath: "/dashboard/airtable-actions",
671
+ apiPath: "/airtable-actions",
672
+ stateKey: "airtableActions",
673
+ allStateKey: "allAirtableActions",
674
+ /* [2026-09-15] El amarillo de Airtable (`#FCB400`) es el color del
675
+ logo, pero sobre el lienzo claro se pierde y se confunde con Filter y
676
+ Transform (`#facc15`, `#fbbf24`). Oscurecido hasta que aguanta. Queda
677
+ cerca del mostaza de Mailchimp (`#c9a227`), y ésa es la comparación que
678
+ hay que hacer en el minimapa. */
679
+ color: "#c58a00",
680
+ testable: true,
681
+ /* Sin `isToolOnly`: no trae modo toolkit de IA todavía, como Apify. */
682
+ },
648
683
  telegramAction: {
649
684
  type: "telegramAction",
650
685
  prefix: "tg",
@@ -1,5 +1,5 @@
1
1
  /** All valid node type identifiers */
2
- export type NodeType = 'webhook' | 'scheduledWorkflow' | 'chatTrigger' | 'trigger' | 'voiceAgent' | 'filter' | 'transform' | 'schemaValidator' | 'conditional' | 'delay' | 'rateLimiter' | 'aggregator' | 'cache' | 'code' | 'ai' | 'merge' | 'approval' | 'split' | 'loop' | 'markdown' | 'fileTransform' | 'limit' | 'router' | 'emailAction' | 'gmailAction' | 'httpAction' | 'mongoAction' | 'postgresAction' | 'notificationAction' | 'sheetsAction' | 'calendarAction' | 'docsAction' | 'driveAction' | 'firecrawlAction' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'googleContactsAction' | 'googleAnalyticsAction' | 'notionAction' | 'vectorStore' | 'rssAction' | 'socialMediaAction' | 'mailchimpAction' | 'shopifyAction' | 'githubAction' | 'jiraAction' | 'bucketAction' | 'apifyAction' | 'stickyNote';
2
+ export type NodeType = 'webhook' | 'scheduledWorkflow' | 'chatTrigger' | 'trigger' | 'voiceAgent' | 'filter' | 'transform' | 'schemaValidator' | 'conditional' | 'delay' | 'rateLimiter' | 'aggregator' | 'cache' | 'code' | 'ai' | 'merge' | 'approval' | 'split' | 'loop' | 'markdown' | 'fileTransform' | 'limit' | 'router' | 'emailAction' | 'gmailAction' | 'httpAction' | 'mongoAction' | 'postgresAction' | 'notificationAction' | 'sheetsAction' | 'calendarAction' | 'docsAction' | 'driveAction' | 'firecrawlAction' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'googleContactsAction' | 'googleAnalyticsAction' | 'notionAction' | 'vectorStore' | 'rssAction' | 'socialMediaAction' | 'mailchimpAction' | 'shopifyAction' | 'githubAction' | 'jiraAction' | 'bucketAction' | 'apifyAction' | 'calendlyAction' | 'airtableAction' | 'stickyNote';
3
3
  /** Node role in the pipeline */
4
4
  export type NodeRole = 'source' | 'processing' | 'flowControl' | 'routing' | 'action' | 'monitoring';
5
5
  /** Handle positions on the canvas node */
package/dist/esm/ui.js CHANGED
@@ -95,6 +95,8 @@ export const NODE_UI = {
95
95
  jiraAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'jira' } },
96
96
  bucketAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'bucket' } },
97
97
  apifyAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'apify' } },
98
+ calendlyAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'calendly' } },
99
+ airtableAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'airtable' } },
98
100
  slackAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'slack' } },
99
101
  googleContactsAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
100
102
  googleAnalyticsAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
@@ -124,6 +126,8 @@ export const PREFIX_TO_TYPE = [
124
126
  { prefix: 'jr-', type: 'jiraAction', canvasType: 'jiraAction' },
125
127
  { prefix: 'bkt-', type: 'bucketAction', canvasType: 'bucketAction' },
126
128
  { prefix: 'apify-', type: 'apifyAction', canvasType: 'apifyAction' },
129
+ { prefix: 'cly-', type: 'calendlyAction', canvasType: 'calendlyAction' },
130
+ { prefix: 'air-', type: 'airtableAction', canvasType: 'airtableAction' },
127
131
  { prefix: 'gc-', type: 'googleContactsAction', canvasType: 'googleContactsAction' },
128
132
  { prefix: 'gaa-', type: 'googleAnalyticsAction', canvasType: 'googleAnalyticsAction' },
129
133
  { prefix: 'ntn-', type: 'notionAction', canvasType: 'notionAction' },
@@ -80,6 +80,12 @@ export interface GmailParamSpec {
80
80
  value: string;
81
81
  label: string;
82
82
  }>;
83
+ /**
84
+ * Se pinta en la pestaña «Advanced» y no en «Config» [2026-09-14]. Igual
85
+ * que Drive, GitHub o Bucket. Lo que va ahí: las cabeceras del hilo
86
+ * (threadId, inReplyTo, references), CC/BCC, y los adjuntos.
87
+ */
88
+ advanced?: boolean;
83
89
  }
84
90
  export interface GmailOperationSpec {
85
91
  /** Etiqueta del desplegable y de la página. */
@@ -108,6 +114,12 @@ export interface GmailOperationSpec {
108
114
  * renderizador se invocaba tras `operation !== "send"`— y la ruta determinista no
109
115
  * las sabe mandar: `emailSender.send` recibe to/subject/html y nada más. Darles
110
116
  * soporte es una función nueva, no una mudanza.
117
+ *
118
+ * `attachments` [2026-09-14]: las cuatro operaciones que arman un mensaje
119
+ * (send, sendAndWaitForResponse, createDraft, replyToThread) adjuntan lo que
120
+ * el flujo ya tiene. Es una RUTA del payload, como el «File from payload» de
121
+ * Jira: la api saca las referencias `_file`, las resuelve por el registro con
122
+ * el `orgId` y arma el `multipart/mixed`. No hay subida a mano. Va en Advanced.
111
123
  */
112
124
  export declare const GMAIL_OPERATION_SPECS: Record<GmailOperation, GmailOperationSpec>;
113
125
  export declare const GMAIL_DROPDOWN_OPERATIONS: readonly GmailOperation[];
@@ -79,6 +79,12 @@ exports.GMAIL_OPERATION_GROUPS = ['Messages', 'Drafts', 'Labels', 'Threads'];
79
79
  * renderizador se invocaba tras `operation !== "send"`— y la ruta determinista no
80
80
  * las sabe mandar: `emailSender.send` recibe to/subject/html y nada más. Darles
81
81
  * soporte es una función nueva, no una mudanza.
82
+ *
83
+ * `attachments` [2026-09-14]: las cuatro operaciones que arman un mensaje
84
+ * (send, sendAndWaitForResponse, createDraft, replyToThread) adjuntan lo que
85
+ * el flujo ya tiene. Es una RUTA del payload, como el «File from payload» de
86
+ * Jira: la api saca las referencias `_file`, las resuelve por el registro con
87
+ * el `orgId` y arma el `multipart/mixed`. No hay subida a mano. Va en Advanced.
82
88
  */
83
89
  exports.GMAIL_OPERATION_SPECS = {
84
90
  send: {
@@ -90,6 +96,7 @@ exports.GMAIL_OPERATION_SPECS = {
90
96
  { name: 'to', label: 'To', type: 'emails', required: true, placeholder: '{{payload.email}}' },
91
97
  { name: 'subject', label: 'Subject', type: 'string', required: true, placeholder: 'Order #{{payload.id}}' },
92
98
  { name: 'body', label: 'Body (HTML)', type: 'htmlTemplate', required: true, placeholder: '<p>Hi {{payload.name}}...</p>', language: 'html' },
99
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
93
100
  ],
94
101
  },
95
102
  sendAndWaitForResponse: {
@@ -108,6 +115,7 @@ exports.GMAIL_OPERATION_SPECS = {
108
115
  { name: 'disapproveCommentLabel', label: 'Comment form label', type: 'string', placeholder: 'Why are you disapproving?', description: "Heading shown above the textarea. Only used when 'Require comment' is on." },
109
116
  { name: 'disapproveCommentPlaceholder', label: 'Comment placeholder', type: 'string', placeholder: 'Tell the sender why — this helps them improve the next attempt.', description: "Hint shown inside the empty textarea. Only used when 'Require comment' is on." },
110
117
  { name: 'timeoutMinutes', label: 'Timeout (minutes)', type: 'number', placeholder: '1440', description: 'Auto-resolve as approved=false after this many minutes. Default 1440 (24h).' },
118
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
111
119
  ],
112
120
  },
113
121
  createDraft: {
@@ -119,11 +127,12 @@ exports.GMAIL_OPERATION_SPECS = {
119
127
  { name: 'to', label: 'To', type: 'emails', required: true, placeholder: '{{payload.email}}', description: 'Recipients the draft will be addressed to' },
120
128
  { name: 'subject', label: 'Subject', type: 'string', placeholder: 'Draft: {{payload.topic}}' },
121
129
  { name: 'body', label: 'Body (HTML)', type: 'htmlTemplate', language: 'html' },
122
- { name: 'cc', label: 'CC', type: 'emails' },
123
- { name: 'bcc', label: 'BCC', type: 'emails' },
124
- { name: 'threadId', label: 'Thread ID', type: 'string', description: 'Optional — attach draft to an existing thread' },
125
- { name: 'inReplyTo', label: 'In-Reply-To', type: 'string', description: 'Optional Message-ID header' },
126
- { name: 'references', label: 'References', type: 'string', description: 'Optional References chain' },
130
+ { name: 'cc', label: 'CC', type: 'emails', advanced: true },
131
+ { name: 'bcc', label: 'BCC', type: 'emails', advanced: true },
132
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
133
+ { name: 'threadId', label: 'Thread ID', type: 'string', advanced: true, description: 'Optional — attach draft to an existing thread' },
134
+ { name: 'inReplyTo', label: 'In-Reply-To', type: 'string', advanced: true, description: 'Optional Message-ID header' },
135
+ { name: 'references', label: 'References', type: 'string', advanced: true, description: 'Optional References chain' },
127
136
  ],
128
137
  },
129
138
  sendDraft: {
@@ -144,8 +153,9 @@ exports.GMAIL_OPERATION_SPECS = {
144
153
  { name: 'body', label: 'Body (HTML)', type: 'htmlTemplate', required: true, language: 'html' },
145
154
  { name: 'subject', label: 'Subject', type: 'string', description: 'Optional — defaults to "Re: <original>"' },
146
155
  { name: 'to', label: 'To', type: 'emails', description: 'Optional — defaults to last sender in thread' },
147
- { name: 'cc', label: 'CC', type: 'emails' },
148
- { name: 'bcc', label: 'BCC', type: 'emails' },
156
+ { name: 'cc', label: 'CC', type: 'emails', advanced: true },
157
+ { name: 'bcc', label: 'BCC', type: 'emails', advanced: true },
158
+ { name: 'attachments', label: 'Files from the payload', type: 'string', advanced: true, placeholder: '{{payload._files}}', description: 'A file reference from the payload — what a webhook uploaded ({{payload._files}}), what a Drive list downloaded ({{payload.files}}), or one file ({{payload._file}}). Up to 5 files, 25 MB in total.' },
149
159
  ],
150
160
  },
151
161
  getMessage: {
@@ -283,6 +293,14 @@ exports.GMAIL_OPERATION_SPECS = {
283
293
  exports.GMAIL_DROPDOWN_OPERATIONS = exports.GMAIL_OPERATIONS.filter((op) => exports.GMAIL_OPERATION_SPECS[op].group !== undefined);
284
294
  exports.GMAIL_TOOLKIT_OPERATIONS = exports.GMAIL_OPERATIONS.filter((op) => op !== 'sendAndWaitForResponse');
285
295
  const p = (name, description, required = true, type = 'string') => ({ name, type, description, required });
296
+ /**
297
+ * Los adjuntos, para la IA [2026-09-14]: el modelo no sube ficheros, pasa
298
+ * las referencias que ya están en el payload (los objetos `_file`) tal cual,
299
+ * como texto JSON. La api las resuelve por el registro de la organización.
300
+ */
301
+ const ADJUNTOS = p('attachments', 'Optional. Files to attach, taken from the payload: pass the `_file` reference object(s) ' +
302
+ 'exactly as they appear (a single `_file`, or the `_files` / `files` array), as a JSON ' +
303
+ 'string. Never invent one. Up to 5 files, 25 MB in total.', false);
286
304
  exports.GMAIL_TOOLKIT_SPECS = [
287
305
  {
288
306
  operation: 'send',
@@ -302,6 +320,7 @@ exports.GMAIL_TOOLKIT_SPECS = [
302
320
  p('body', 'HTML-formatted email body.'),
303
321
  p('cc', 'Optional CC recipients.', false),
304
322
  p('bcc', 'Optional BCC recipients.', false),
323
+ ADJUNTOS,
305
324
  ],
306
325
  },
307
326
  {
@@ -324,6 +343,7 @@ exports.GMAIL_TOOLKIT_SPECS = [
324
343
  p('threadId', 'Optional — attach draft to an existing thread.', false),
325
344
  p('inReplyTo', 'Optional Message-ID header to reply to.', false),
326
345
  p('references', 'Optional References header chain.', false),
346
+ ADJUNTOS,
327
347
  ],
328
348
  },
329
349
  {
@@ -360,6 +380,7 @@ exports.GMAIL_TOOLKIT_SPECS = [
360
380
  p('subject', 'Optional — defaults to "Re: <original>".', false),
361
381
  p('cc', 'Optional CC recipients.', false),
362
382
  p('bcc', 'Optional BCC recipients.', false),
383
+ ADJUNTOS,
363
384
  ],
364
385
  },
365
386
  {
@@ -515,6 +536,7 @@ exports.GMAIL_SEND_AND_WAIT_TOOL_SPEC = {
515
536
  p('disapproveLabel', "Optional. Disapprove button label. Default: 'Disapprove'.", false),
516
537
  p('includeDisapprove', 'Optional. Include the Disapprove button. Default: true. Set to false for approve-only confirmations.', false),
517
538
  p('timeoutMinutes', 'Optional. Minutes to wait before auto-resolving with approved=false. Default 1440 (24h).', false),
539
+ ADJUNTOS,
518
540
  ],
519
541
  };
520
542
  /** Todo lo que el nodo sabe ejecutar, se ofrezca o no como herramienta. */
package/dist/index.d.ts CHANGED
@@ -40,6 +40,10 @@ export { BUCKET_OPERATIONS, BUCKET_OPERATION_SPECS, BUCKET_ITERABLE_OPERATIONS,
40
40
  export type { BucketOperation, BucketParamType, BucketParamSpec, BucketOperationSpec, } from './bucket-operations.js';
41
41
  export { APIFY_OPERATIONS, APIFY_OPERATION_SPECS, APIFY_ITERABLE_OPERATIONS, isApifyOperation, } from './apify-operations.js';
42
42
  export type { ApifyOperation, ApifyParamType, ApifyParamSpec, ApifyOperationSpec, } from './apify-operations.js';
43
+ export { CALENDLY_OPERATIONS, CALENDLY_OPERATION_SPECS, CALENDLY_ITERABLE_OPERATIONS, isCalendlyOperation, } from './calendly-operations.js';
44
+ export type { CalendlyOperation, CalendlyParamType, CalendlyParamSpec, CalendlyOperationSpec, } from './calendly-operations.js';
45
+ export { AIRTABLE_OPERATIONS, AIRTABLE_OPERATION_SPECS, AIRTABLE_ITERABLE_OPERATIONS, isAirtableOperation, } from './airtable-operations.js';
46
+ export type { AirtableOperation, AirtableParamType, AirtableParamSpec, AirtableOperationSpec, } from './airtable-operations.js';
43
47
  export { SLACK_OPERATIONS, SLACK_OPERATION_SPECS, SLACK_CAPACIDADES_POR_CREDENCIAL, operacionesDeSlackPara, slackPuedeEjecutar, camposDeSlackNoDisponibles, isSlackOperation, } from './slack-operations.js';
44
48
  export type { SlackOperation, SlackParamSpec, SlackOperationSpec, } from './slack-operations.js';
45
49
  export { SLACK_TOOLKIT_SPECS, SLACK_TOOLKIT_BY_TOOL_NAME, herramientasDeSlackPara, } from './slack-toolkit.js';
package/dist/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
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
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.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 = 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.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 = 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;
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; } });
@@ -147,6 +147,16 @@ Object.defineProperty(exports, "APIFY_OPERATIONS", { enumerable: true, get: func
147
147
  Object.defineProperty(exports, "APIFY_OPERATION_SPECS", { enumerable: true, get: function () { return apify_operations_js_1.APIFY_OPERATION_SPECS; } });
148
148
  Object.defineProperty(exports, "APIFY_ITERABLE_OPERATIONS", { enumerable: true, get: function () { return apify_operations_js_1.APIFY_ITERABLE_OPERATIONS; } });
149
149
  Object.defineProperty(exports, "isApifyOperation", { enumerable: true, get: function () { return apify_operations_js_1.isApifyOperation; } });
150
+ var calendly_operations_js_1 = require("./calendly-operations.js");
151
+ Object.defineProperty(exports, "CALENDLY_OPERATIONS", { enumerable: true, get: function () { return calendly_operations_js_1.CALENDLY_OPERATIONS; } });
152
+ Object.defineProperty(exports, "CALENDLY_OPERATION_SPECS", { enumerable: true, get: function () { return calendly_operations_js_1.CALENDLY_OPERATION_SPECS; } });
153
+ Object.defineProperty(exports, "CALENDLY_ITERABLE_OPERATIONS", { enumerable: true, get: function () { return calendly_operations_js_1.CALENDLY_ITERABLE_OPERATIONS; } });
154
+ Object.defineProperty(exports, "isCalendlyOperation", { enumerable: true, get: function () { return calendly_operations_js_1.isCalendlyOperation; } });
155
+ var airtable_operations_js_1 = require("./airtable-operations.js");
156
+ Object.defineProperty(exports, "AIRTABLE_OPERATIONS", { enumerable: true, get: function () { return airtable_operations_js_1.AIRTABLE_OPERATIONS; } });
157
+ Object.defineProperty(exports, "AIRTABLE_OPERATION_SPECS", { enumerable: true, get: function () { return airtable_operations_js_1.AIRTABLE_OPERATION_SPECS; } });
158
+ Object.defineProperty(exports, "AIRTABLE_ITERABLE_OPERATIONS", { enumerable: true, get: function () { return airtable_operations_js_1.AIRTABLE_ITERABLE_OPERATIONS; } });
159
+ Object.defineProperty(exports, "isAirtableOperation", { enumerable: true, get: function () { return airtable_operations_js_1.isAirtableOperation; } });
150
160
  var slack_operations_js_1 = require("./slack-operations.js");
151
161
  Object.defineProperty(exports, "SLACK_OPERATIONS", { enumerable: true, get: function () { return slack_operations_js_1.SLACK_OPERATIONS; } });
152
162
  Object.defineProperty(exports, "SLACK_OPERATION_SPECS", { enumerable: true, get: function () { return slack_operations_js_1.SLACK_OPERATION_SPECS; } });
package/dist/registry.js CHANGED
@@ -656,6 +656,41 @@ exports.NODE_REGISTRY = {
656
656
  testable: true,
657
657
  /* Sin `isToolOnly`: no trae modo toolkit de IA todavía. */
658
658
  },
659
+ calendlyAction: {
660
+ type: "calendlyAction",
661
+ prefix: "cly",
662
+ label: "Calendly",
663
+ group: "Actions",
664
+ detailPath: "/dashboard/calendly-actions",
665
+ apiPath: "/calendly-actions",
666
+ stateKey: "calendlyActions",
667
+ allStateKey: "allCalendlyActions",
668
+ /* [2026-09-15] El azul de la marca de Calendly (`#006BFF`). Es más
669
+ saturado que el de HTTP (`#3b82f6`) y más claro que el de Jira
670
+ (`#0052CC`); en el minimapa se distingue de los dos. Como dicen los
671
+ vecinos: la decisión se cierra mirando el minimapa. */
672
+ color: "#006BFF",
673
+ testable: true,
674
+ /* Sin `isToolOnly`: no trae modo toolkit de IA todavía, como Apify. */
675
+ },
676
+ airtableAction: {
677
+ type: "airtableAction",
678
+ prefix: "air",
679
+ label: "Airtable",
680
+ group: "Actions",
681
+ detailPath: "/dashboard/airtable-actions",
682
+ apiPath: "/airtable-actions",
683
+ stateKey: "airtableActions",
684
+ allStateKey: "allAirtableActions",
685
+ /* [2026-09-15] El amarillo de Airtable (`#FCB400`) es el color del
686
+ logo, pero sobre el lienzo claro se pierde y se confunde con Filter y
687
+ Transform (`#facc15`, `#fbbf24`). Oscurecido hasta que aguanta. Queda
688
+ cerca del mostaza de Mailchimp (`#c9a227`), y ésa es la comparación que
689
+ hay que hacer en el minimapa. */
690
+ color: "#c58a00",
691
+ testable: true,
692
+ /* Sin `isToolOnly`: no trae modo toolkit de IA todavía, como Apify. */
693
+ },
659
694
  telegramAction: {
660
695
  type: "telegramAction",
661
696
  prefix: "tg",
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** All valid node type identifiers */
2
- export type NodeType = 'webhook' | 'scheduledWorkflow' | 'chatTrigger' | 'trigger' | 'voiceAgent' | 'filter' | 'transform' | 'schemaValidator' | 'conditional' | 'delay' | 'rateLimiter' | 'aggregator' | 'cache' | 'code' | 'ai' | 'merge' | 'approval' | 'split' | 'loop' | 'markdown' | 'fileTransform' | 'limit' | 'router' | 'emailAction' | 'gmailAction' | 'httpAction' | 'mongoAction' | 'postgresAction' | 'notificationAction' | 'sheetsAction' | 'calendarAction' | 'docsAction' | 'driveAction' | 'firecrawlAction' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'googleContactsAction' | 'googleAnalyticsAction' | 'notionAction' | 'vectorStore' | 'rssAction' | 'socialMediaAction' | 'mailchimpAction' | 'shopifyAction' | 'githubAction' | 'jiraAction' | 'bucketAction' | 'apifyAction' | 'stickyNote';
2
+ export type NodeType = 'webhook' | 'scheduledWorkflow' | 'chatTrigger' | 'trigger' | 'voiceAgent' | 'filter' | 'transform' | 'schemaValidator' | 'conditional' | 'delay' | 'rateLimiter' | 'aggregator' | 'cache' | 'code' | 'ai' | 'merge' | 'approval' | 'split' | 'loop' | 'markdown' | 'fileTransform' | 'limit' | 'router' | 'emailAction' | 'gmailAction' | 'httpAction' | 'mongoAction' | 'postgresAction' | 'notificationAction' | 'sheetsAction' | 'calendarAction' | 'docsAction' | 'driveAction' | 'firecrawlAction' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'googleContactsAction' | 'googleAnalyticsAction' | 'notionAction' | 'vectorStore' | 'rssAction' | 'socialMediaAction' | 'mailchimpAction' | 'shopifyAction' | 'githubAction' | 'jiraAction' | 'bucketAction' | 'apifyAction' | 'calendlyAction' | 'airtableAction' | 'stickyNote';
3
3
  /** Node role in the pipeline */
4
4
  export type NodeRole = 'source' | 'processing' | 'flowControl' | 'routing' | 'action' | 'monitoring';
5
5
  /** Handle positions on the canvas node */
package/dist/ui.js CHANGED
@@ -99,6 +99,8 @@ exports.NODE_UI = {
99
99
  jiraAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'jira' } },
100
100
  bucketAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'bucket' } },
101
101
  apifyAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'apify' } },
102
+ calendlyAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'calendly' } },
103
+ airtableAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'airtable' } },
102
104
  slackAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'slack' } },
103
105
  googleContactsAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
104
106
  googleAnalyticsAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
@@ -128,6 +130,8 @@ exports.PREFIX_TO_TYPE = [
128
130
  { prefix: 'jr-', type: 'jiraAction', canvasType: 'jiraAction' },
129
131
  { prefix: 'bkt-', type: 'bucketAction', canvasType: 'bucketAction' },
130
132
  { prefix: 'apify-', type: 'apifyAction', canvasType: 'apifyAction' },
133
+ { prefix: 'cly-', type: 'calendlyAction', canvasType: 'calendlyAction' },
134
+ { prefix: 'air-', type: 'airtableAction', canvasType: 'airtableAction' },
131
135
  { prefix: 'gc-', type: 'googleContactsAction', canvasType: 'googleContactsAction' },
132
136
  { prefix: 'gaa-', type: 'googleAnalyticsAction', canvasType: 'googleAnalyticsAction' },
133
137
  { prefix: 'ntn-', type: 'notionAction', canvasType: 'notionAction' },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostwebhook/node-types",
3
- "version": "1.82.0",
3
+ "version": "1.84.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",