@hostwebhook/node-types 1.58.0 → 1.59.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.
@@ -18,7 +18,7 @@ exports.isNodeType = isNodeType;
18
18
  const PROCESSING_OUTPUTS = [
19
19
  'webhook', 'router', 'filter', 'transform', 'cache', 'code', 'rateLimiter',
20
20
  'aggregator', 'conditional', 'delay', 'schemaValidator', 'split', 'markdown', 'fileTransform', 'limit',
21
- 'emailAction', 'gmailAction', 'httpAction', 'mongoAction', 'postgresAction', 'notificationAction', 'sheetsAction', 'calendarAction', 'docsAction', 'driveAction', 'firecrawlAction', 'telegramAction', 'whatsappAction', 'discordAction', 'slackAction', 'googleContactsAction', 'googleAnalyticsAction', 'notionAction', 'vectorStore', 'rssAction', 'socialMediaAction', 'loop',
21
+ 'emailAction', 'gmailAction', 'httpAction', 'mongoAction', 'postgresAction', 'notificationAction', 'sheetsAction', 'calendarAction', 'docsAction', 'driveAction', 'firecrawlAction', 'telegramAction', 'whatsappAction', 'discordAction', 'slackAction', 'googleContactsAction', 'googleAnalyticsAction', 'notionAction', 'vectorStore', 'rssAction', 'socialMediaAction', 'mailchimpAction', 'loop',
22
22
  ];
23
23
  /** Standard processing input sources */
24
24
  const STANDARD_INPUTS = [
@@ -26,7 +26,7 @@ const STANDARD_INPUTS = [
26
26
  'cache', 'code', 'rateLimiter', 'aggregator', 'conditional', 'delay', 'schemaValidator', 'split', 'loop', 'markdown', 'fileTransform', 'limit',
27
27
  ];
28
28
  /** Action nodes that can chain (non-terminal) */
29
- const CHAINABLE_ACTIONS = ['httpAction', 'mongoAction', 'postgresAction', 'sheetsAction', 'calendarAction', 'docsAction', 'driveAction', 'firecrawlAction', 'telegramAction', 'whatsappAction', 'discordAction', 'slackAction', 'googleContactsAction', 'googleAnalyticsAction', 'notionAction', 'vectorStore', 'rssAction', 'socialMediaAction'];
29
+ const CHAINABLE_ACTIONS = ['httpAction', 'mongoAction', 'postgresAction', 'sheetsAction', 'calendarAction', 'docsAction', 'driveAction', 'firecrawlAction', 'telegramAction', 'whatsappAction', 'discordAction', 'slackAction', 'googleContactsAction', 'googleAnalyticsAction', 'notionAction', 'vectorStore', 'rssAction', 'socialMediaAction', 'mailchimpAction'];
30
30
  /** Full input list for action nodes (standard + chainable actions) */
31
31
  const ACTION_INPUTS = [...STANDARD_INPUTS, ...CHAINABLE_ACTIONS];
32
32
  exports.NODE_CONNECTIONS = {
@@ -77,6 +77,7 @@ exports.NODE_CONNECTIONS = {
77
77
  whatsappAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
78
78
  discordAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
79
79
  slackAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
80
+ mailchimpAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
80
81
  googleContactsAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
81
82
  googleAnalyticsAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
82
83
  notionAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
package/dist/dispatch.js CHANGED
@@ -52,6 +52,7 @@ exports.NODE_DISPATCH = {
52
52
  telegramAction: { service: 'telegramActionsService', collection: 'telegramactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
53
53
  whatsappAction: { service: 'whatsappActionsService', collection: 'whatsappactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
54
54
  discordAction: { service: 'discordActionsService', collection: 'discordactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
55
+ mailchimpAction: { service: 'mailchimpActionsService', collection: 'mailchimpactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
55
56
  slackAction: { service: 'slackActionsService', collection: 'slackactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
56
57
  googleContactsAction: { service: 'googleContactsActionsService', collection: 'googlecontactsactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
57
58
  googleAnalyticsAction: { service: 'googleAnalyticsActionsService', collection: 'googleanalyticsactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
package/dist/index.d.ts CHANGED
@@ -24,6 +24,8 @@ export { WHATSAPP_OPERATIONS, isWhatsAppOperation, } from './whatsapp-operations
24
24
  export type { WhatsAppOperation } from './whatsapp-operations';
25
25
  export { DISCORD_OPERATIONS, DISCORD_OPERATION_SPECS, isDiscordOperation, } from './discord-operations';
26
26
  export type { DiscordOperation, DiscordParamSpec, DiscordOperationSpec, } from './discord-operations';
27
+ export { MAILCHIMP_OPERATIONS, MAILCHIMP_OPERATION_SPECS, MAILCHIMP_CONTACT_STATUSES, isMailchimpOperation, } from './mailchimp-operations';
28
+ export type { MailchimpOperation, MailchimpContactStatus, MailchimpParamSpec, MailchimpOperationSpec, } from './mailchimp-operations';
27
29
  export { SLACK_OPERATIONS, SLACK_OPERATION_SPECS, isSlackOperation, } from './slack-operations';
28
30
  export type { SlackOperation, SlackParamSpec, SlackOperationSpec, } from './slack-operations';
29
31
  export { SHEETS_OPERATIONS, SHEETS_OPERATION_SPECS, isSheetsOperation, } from './sheets-operations';
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DRIVE_OPERATION_SPECS = exports.DRIVE_OPERATIONS = exports.GOOGLE_CALENDAR_TOOLKIT_BY_TOOL_NAME = exports.GOOGLE_CALENDAR_TOOLKIT_SPECS = exports.isGoogleCalendarOperation = exports.GOOGLE_CALENDAR_OPERATION_SPECS = exports.GOOGLE_CALENDAR_OPERATIONS = exports.isGmailOperation = exports.resolveGmailSendFields = exports.GMAIL_SEND_LEGACY_FIELDS = exports.NATIVE_EMAIL_TOOLKIT_BY_TOOL_NAME = 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.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.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.isSlackOperation = exports.SLACK_OPERATION_SPECS = exports.SLACK_OPERATIONS = exports.isDiscordOperation = exports.DISCORD_OPERATION_SPECS = exports.DISCORD_OPERATIONS = 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 = void 0;
5
- exports.isCredentialType = exports.getCredentialType = exports.credentialTypeValues = exports.CREDENTIAL_TYPE_VALUES = exports.CREDENTIAL_TYPES = exports.getModelLabel = exports.getDefaultModel = exports.getModelsFor = exports.MODEL_CONTEXT_WINDOWS = exports.LLM_MODELS = exports.LLM_PROVIDERS = void 0;
4
+ 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.isSlackOperation = exports.SLACK_OPERATION_SPECS = exports.SLACK_OPERATIONS = exports.isMailchimpOperation = exports.MAILCHIMP_CONTACT_STATUSES = exports.MAILCHIMP_OPERATION_SPECS = exports.MAILCHIMP_OPERATIONS = exports.isDiscordOperation = exports.DISCORD_OPERATION_SPECS = exports.DISCORD_OPERATIONS = 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 = void 0;
5
+ exports.isCredentialType = exports.getCredentialType = exports.credentialTypeValues = exports.CREDENTIAL_TYPE_VALUES = exports.CREDENTIAL_TYPES = 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 = void 0;
6
6
  var types_1 = require("./types");
7
7
  Object.defineProperty(exports, "singleMeta", { enumerable: true, get: function () { return types_1.singleMeta; } });
8
8
  Object.defineProperty(exports, "iterableMeta", { enumerable: true, get: function () { return types_1.iterableMeta; } });
@@ -87,6 +87,11 @@ var discord_operations_1 = require("./discord-operations");
87
87
  Object.defineProperty(exports, "DISCORD_OPERATIONS", { enumerable: true, get: function () { return discord_operations_1.DISCORD_OPERATIONS; } });
88
88
  Object.defineProperty(exports, "DISCORD_OPERATION_SPECS", { enumerable: true, get: function () { return discord_operations_1.DISCORD_OPERATION_SPECS; } });
89
89
  Object.defineProperty(exports, "isDiscordOperation", { enumerable: true, get: function () { return discord_operations_1.isDiscordOperation; } });
90
+ var mailchimp_operations_1 = require("./mailchimp-operations");
91
+ Object.defineProperty(exports, "MAILCHIMP_OPERATIONS", { enumerable: true, get: function () { return mailchimp_operations_1.MAILCHIMP_OPERATIONS; } });
92
+ Object.defineProperty(exports, "MAILCHIMP_OPERATION_SPECS", { enumerable: true, get: function () { return mailchimp_operations_1.MAILCHIMP_OPERATION_SPECS; } });
93
+ Object.defineProperty(exports, "MAILCHIMP_CONTACT_STATUSES", { enumerable: true, get: function () { return mailchimp_operations_1.MAILCHIMP_CONTACT_STATUSES; } });
94
+ Object.defineProperty(exports, "isMailchimpOperation", { enumerable: true, get: function () { return mailchimp_operations_1.isMailchimpOperation; } });
90
95
  var slack_operations_1 = require("./slack-operations");
91
96
  Object.defineProperty(exports, "SLACK_OPERATIONS", { enumerable: true, get: function () { return slack_operations_1.SLACK_OPERATIONS; } });
92
97
  Object.defineProperty(exports, "SLACK_OPERATION_SPECS", { enumerable: true, get: function () { return slack_operations_1.SLACK_OPERATION_SPECS; } });
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Mailchimp Marketing API operations — single source of truth across the
3
+ * api, the dashboard and downstream consumers (MCP server).
4
+ *
5
+ * ## Three, out of one hundred and eighty-one
6
+ *
7
+ * The Marketing API has 181 routes. This node exposes three, and the choice
8
+ * is argued in `api/docs/ADR-0003-mailchimp.md`: a menu of 181 is how a node
9
+ * becomes unusable, and these three cover what people actually automate —
10
+ * put someone in a list, tag them, drop them into a journey.
11
+ *
12
+ * Campaign creation and sending were considered and left out of v1: a
13
+ * campaign needs a template, a segment and a schedule, which is a
14
+ * configuration surface of its own and not something anyone drives from a
15
+ * webhook on day one.
16
+ *
17
+ * ## Every field here exists in Mailchimp's OpenAPI schema
18
+ *
19
+ * Taken from `api.mailchimp.com/schema/3.0/Swagger.json`, not from memory.
20
+ * If you add a parameter, check it there first — an invented field is
21
+ * accepted, ignored, and then read back by the next maintainer as if it did
22
+ * something.
23
+ */
24
+ export declare const MAILCHIMP_OPERATIONS: readonly ["upsertContact", "setTags", "triggerJourney"];
25
+ export type MailchimpOperation = (typeof MAILCHIMP_OPERATIONS)[number];
26
+ /** Type guard — for DTOs and AI tool calls, where the input is untrusted. */
27
+ export declare function isMailchimpOperation(value: unknown): value is MailchimpOperation;
28
+ /**
29
+ * Contact status. `pending` is the default everywhere on purpose.
30
+ *
31
+ * Writing `subscribed` for someone who never consented is a legal problem,
32
+ * not a technical one — and a default of `subscribed` is exactly what makes
33
+ * it easy. `pending` sends Mailchimp's confirmation email, which is the
34
+ * behaviour someone should have to opt *out* of.
35
+ */
36
+ export declare const MAILCHIMP_CONTACT_STATUSES: readonly ["pending", "subscribed", "unsubscribed", "cleaned", "transactional"];
37
+ export type MailchimpContactStatus = (typeof MAILCHIMP_CONTACT_STATUSES)[number];
38
+ export interface MailchimpParamSpec {
39
+ /** Field key — also the property name on operationConfig. */
40
+ name: string;
41
+ label: string;
42
+ /** Param type, so the dashboard renders the right control. `audience`
43
+ * and `journeyStep` are pickers backed by live Mailchimp lookups. */
44
+ type: 'audience' | 'journeyStep' | 'email' | 'string' | 'status' | 'tags' | 'json' | 'boolean';
45
+ required?: boolean;
46
+ description: string;
47
+ placeholder?: string;
48
+ }
49
+ export interface MailchimpOperationSpec {
50
+ label: string;
51
+ description: string;
52
+ /** The Marketing API route this maps to, so the mapping is checkable. */
53
+ apiRoute: string;
54
+ params: MailchimpParamSpec[];
55
+ }
56
+ export declare const MAILCHIMP_OPERATION_SPECS: Record<MailchimpOperation, MailchimpOperationSpec>;
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * Mailchimp Marketing API operations — single source of truth across the
4
+ * api, the dashboard and downstream consumers (MCP server).
5
+ *
6
+ * ## Three, out of one hundred and eighty-one
7
+ *
8
+ * The Marketing API has 181 routes. This node exposes three, and the choice
9
+ * is argued in `api/docs/ADR-0003-mailchimp.md`: a menu of 181 is how a node
10
+ * becomes unusable, and these three cover what people actually automate —
11
+ * put someone in a list, tag them, drop them into a journey.
12
+ *
13
+ * Campaign creation and sending were considered and left out of v1: a
14
+ * campaign needs a template, a segment and a schedule, which is a
15
+ * configuration surface of its own and not something anyone drives from a
16
+ * webhook on day one.
17
+ *
18
+ * ## Every field here exists in Mailchimp's OpenAPI schema
19
+ *
20
+ * Taken from `api.mailchimp.com/schema/3.0/Swagger.json`, not from memory.
21
+ * If you add a parameter, check it there first — an invented field is
22
+ * accepted, ignored, and then read back by the next maintainer as if it did
23
+ * something.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.MAILCHIMP_OPERATION_SPECS = exports.MAILCHIMP_CONTACT_STATUSES = exports.MAILCHIMP_OPERATIONS = void 0;
27
+ exports.isMailchimpOperation = isMailchimpOperation;
28
+ exports.MAILCHIMP_OPERATIONS = [
29
+ 'upsertContact',
30
+ 'setTags',
31
+ 'triggerJourney',
32
+ ];
33
+ /** Type guard — for DTOs and AI tool calls, where the input is untrusted. */
34
+ function isMailchimpOperation(value) {
35
+ return (typeof value === 'string' &&
36
+ exports.MAILCHIMP_OPERATIONS.includes(value));
37
+ }
38
+ /**
39
+ * Contact status. `pending` is the default everywhere on purpose.
40
+ *
41
+ * Writing `subscribed` for someone who never consented is a legal problem,
42
+ * not a technical one — and a default of `subscribed` is exactly what makes
43
+ * it easy. `pending` sends Mailchimp's confirmation email, which is the
44
+ * behaviour someone should have to opt *out* of.
45
+ */
46
+ exports.MAILCHIMP_CONTACT_STATUSES = [
47
+ 'pending',
48
+ 'subscribed',
49
+ 'unsubscribed',
50
+ 'cleaned',
51
+ 'transactional',
52
+ ];
53
+ exports.MAILCHIMP_OPERATION_SPECS = {
54
+ upsertContact: {
55
+ label: 'Add or update contact',
56
+ description: 'Add a contact to an audience, or update them if the email is already there.',
57
+ apiRoute: 'PUT /lists/{list_id}/members/{subscriber_hash}',
58
+ params: [
59
+ {
60
+ name: 'audienceId',
61
+ label: 'Audience',
62
+ type: 'audience',
63
+ required: true,
64
+ description: 'The audience the contact belongs to.',
65
+ },
66
+ {
67
+ name: 'email',
68
+ label: 'Email address',
69
+ type: 'email',
70
+ required: true,
71
+ description: 'The contact. Mailchimp accepts the address itself here, so no hashing is needed.',
72
+ placeholder: '{{payload.email}}',
73
+ },
74
+ {
75
+ name: 'statusIfNew',
76
+ label: 'Status if new',
77
+ type: 'status',
78
+ required: true,
79
+ description: 'Only applies when the contact does not exist yet. An existing contact keeps the status it already had.',
80
+ },
81
+ {
82
+ name: 'mergeFields',
83
+ label: 'Merge fields',
84
+ type: 'json',
85
+ description: 'Mailchimp merge tags, e.g. {"FNAME":"Ada","LNAME":"Lovelace"}. The tags are defined per audience.',
86
+ placeholder: '{\n "FNAME": "{{payload.firstName}}"\n}',
87
+ },
88
+ {
89
+ name: 'language',
90
+ label: 'Language',
91
+ type: 'string',
92
+ description: 'Two-letter language code, e.g. "es". Optional.',
93
+ },
94
+ {
95
+ name: 'vip',
96
+ label: 'Mark as VIP',
97
+ type: 'boolean',
98
+ description: 'Mailchimp caps VIP contacts at 5,000 per audience.',
99
+ },
100
+ ],
101
+ },
102
+ setTags: {
103
+ label: 'Add or remove tags',
104
+ description: 'Set tags on a contact. Adding and removing happen in the same call.',
105
+ apiRoute: 'POST /lists/{list_id}/members/{subscriber_hash}/tags',
106
+ params: [
107
+ {
108
+ name: 'audienceId',
109
+ label: 'Audience',
110
+ type: 'audience',
111
+ required: true,
112
+ description: 'Tags are scoped to an audience, not to the account.',
113
+ },
114
+ {
115
+ name: 'email',
116
+ label: 'Email address',
117
+ type: 'email',
118
+ required: true,
119
+ description: 'The contact to tag.',
120
+ placeholder: '{{payload.email}}',
121
+ },
122
+ {
123
+ name: 'tags',
124
+ label: 'Tags',
125
+ type: 'tags',
126
+ required: true,
127
+ description: 'Each tag is set active (add) or inactive (remove). One call can do both.',
128
+ },
129
+ {
130
+ name: 'isSyncing',
131
+ label: 'Skip automations',
132
+ type: 'boolean',
133
+ description: 'When on, automations that watch these tags do NOT fire. Use it for a bulk backfill you do not want to trigger emails.',
134
+ },
135
+ ],
136
+ },
137
+ triggerJourney: {
138
+ label: 'Add contact to a journey',
139
+ description: 'Drop a contact into a Customer Journey at a specific step.',
140
+ apiRoute: 'POST /customer-journeys/journeys/{journey_id}/steps/{step_id}/actions/trigger',
141
+ params: [
142
+ {
143
+ name: 'journeyStep',
144
+ label: 'Journey step',
145
+ type: 'journeyStep',
146
+ required: true,
147
+ description: 'The journey and the step inside it. The journey must already be running in Mailchimp.',
148
+ },
149
+ {
150
+ name: 'email',
151
+ label: 'Email address',
152
+ type: 'email',
153
+ required: true,
154
+ description: 'The contact to enrol. They must already exist in the journey audience — this operation does not create them.',
155
+ placeholder: '{{payload.email}}',
156
+ },
157
+ ],
158
+ },
159
+ };
package/dist/registry.js CHANGED
@@ -265,6 +265,14 @@ exports.NODE_REGISTRY = {
265
265
  stateKey: 'firecrawlActions', allStateKey: 'allFirecrawlActions',
266
266
  color: '#f97316', testable: true,
267
267
  },
268
+ mailchimpAction: {
269
+ type: 'mailchimpAction', prefix: 'mc', label: 'Mailchimp',
270
+ group: 'Actions', detailPath: '/dashboard/mailchimp-actions', apiPath: '/mailchimp-actions',
271
+ stateKey: 'mailchimpActions', allStateKey: 'allMailchimpActions',
272
+ // Mailchimp's Cavendish yellow, darkened until it holds contrast on a
273
+ // light canvas. The brand value (#ffe01b) reads as a highlighter there.
274
+ color: '#c9a227', testable: true,
275
+ },
268
276
  telegramAction: {
269
277
  type: 'telegramAction', prefix: 'tg', label: 'Telegram Action',
270
278
  group: 'Actions', detailPath: '/dashboard/telegram-actions', apiPath: '/telegram-actions',
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' | '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' | '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
@@ -75,6 +75,7 @@ exports.NODE_UI = {
75
75
  telegramAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'telegram' } },
76
76
  whatsappAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'whatsapp' } },
77
77
  discordAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'discord' } },
78
+ mailchimpAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'mailchimp' } },
78
79
  slackAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true, routerTargetLabel: 'slack' } },
79
80
  googleContactsAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
80
81
  googleAnalyticsAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
@@ -98,6 +99,7 @@ exports.PREFIX_TO_TYPE = [
98
99
  { prefix: 'wa-', type: 'whatsappAction', canvasType: 'whatsappAction' },
99
100
  { prefix: 'dc-', type: 'discordAction', canvasType: 'discordAction' },
100
101
  { prefix: 'sl-', type: 'slackAction', canvasType: 'slackAction' },
102
+ { prefix: 'mc-', type: 'mailchimpAction', canvasType: 'mailchimpAction' },
101
103
  { prefix: 'gc-', type: 'googleContactsAction', canvasType: 'googleContactsAction' },
102
104
  { prefix: 'gaa-', type: 'googleAnalyticsAction', canvasType: 'googleAnalyticsAction' },
103
105
  { 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.58.0",
3
+ "version": "1.59.0",
4
4
  "description": "Shared node type definitions, connection rules, and dispatch config for HostWebhook",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",