@hostwebhook/node-types 1.41.0 → 1.43.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.
@@ -17,16 +17,16 @@ exports.isNodeType = isNodeType;
17
17
  /** All node types that can appear as pipeline outputs */
18
18
  const PROCESSING_OUTPUTS = [
19
19
  'endpoint', 'router', 'filter', 'transform', 'cache', 'code', 'rateLimiter',
20
- 'aggregator', 'conditional', 'delay', 'schemaValidator', 'split', 'markdown', 'fileTransform',
21
- 'emailAction', 'httpAction', 'mongoAction', 'postgresAction', 'notificationAction', 'sheetsAction', 'calendarAction', 'docsAction', 'driveAction', 'firecrawlAction', 'telegramAction', 'whatsappAction', 'discordAction', 'slackAction', 'googleContactsAction', 'vectorStore', 'rssAction', 'loop',
20
+ 'aggregator', 'conditional', 'delay', 'schemaValidator', 'split', 'markdown', 'fileTransform', 'limit',
21
+ 'emailAction', 'httpAction', 'mongoAction', 'postgresAction', 'notificationAction', 'sheetsAction', 'calendarAction', 'docsAction', 'driveAction', 'firecrawlAction', 'telegramAction', 'whatsappAction', 'discordAction', 'slackAction', 'googleContactsAction', 'vectorStore', 'rssAction', 'socialMediaAction', 'loop',
22
22
  ];
23
23
  /** Standard processing input sources */
24
24
  const STANDARD_INPUTS = [
25
25
  'endpoint', 'scheduledWebhook', 'serviceTrigger', 'voiceAgent', 'router', 'filter', 'transform',
26
- 'cache', 'code', 'rateLimiter', 'aggregator', 'conditional', 'delay', 'schemaValidator', 'split', 'loop', 'markdown', 'fileTransform',
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', 'vectorStore', 'rssAction'];
29
+ const CHAINABLE_ACTIONS = ['httpAction', 'mongoAction', 'postgresAction', 'sheetsAction', 'calendarAction', 'docsAction', 'driveAction', 'firecrawlAction', 'telegramAction', 'whatsappAction', 'discordAction', 'slackAction', 'googleContactsAction', 'vectorStore', 'rssAction', 'socialMediaAction'];
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 = {
@@ -79,9 +79,11 @@ exports.NODE_CONNECTIONS = {
79
79
  googleContactsAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
80
80
  vectorStore: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
81
81
  rssAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
82
+ socialMediaAction: { acceptsInputFrom: ACTION_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
82
83
  // ── Processing (transform-like) ──
83
84
  markdown: { acceptsInputFrom: STANDARD_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
84
85
  fileTransform: { acceptsInputFrom: STANDARD_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
86
+ limit: { acceptsInputFrom: STANDARD_INPUTS, canOutputTo: PROCESSING_OUTPUTS },
85
87
  // ── Annotations (visual only, no pipeline processing) ──
86
88
  stickyNote: { acceptsInputFrom: [], canOutputTo: [] },
87
89
  };
@@ -30,6 +30,7 @@ exports.CREDENTIAL_TYPES = [
30
30
  { type: 'telegram_bot' },
31
31
  { type: 'whatsapp_business' },
32
32
  { type: 'discord_bot' },
33
+ { type: 'bluesky_app_password' },
33
34
  ];
34
35
  /**
35
36
  * Plain string array — what the Mongoose `enum` field and the
package/dist/dispatch.js CHANGED
@@ -22,6 +22,7 @@ exports.NODE_DISPATCH = {
22
22
  markdown: { service: 'markdownNodesService', collection: 'markdownnodes', hasFilters: false, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'generic' },
23
23
  fileTransform: { service: 'fileTransformNodesService', collection: 'filetransformnodes', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'generic' },
24
24
  vectorStore: { service: 'vectorStoreNodesService', collection: 'vectorstorenodes', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'generic' },
25
+ limit: { service: 'limitNodesService', collection: 'limitnodes', hasFilters: false, outputFields: ['outputNodes'], customDispatch: false, pipelineDispatch: 'generic' },
25
26
  // ── Pipeline processing — custom dispatch (dedicated switch case) ──
26
27
  schemaValidator: { service: 'schemaValidatorsService', collection: 'schemavalidators', hasFilters: false, outputFields: ['outputNodes', 'invalidOutputNodes'], customDispatch: true, pipelineDispatch: 'custom' },
27
28
  delay: { service: 'delayNodesService', collection: 'delaynodes', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'custom' },
@@ -53,6 +54,7 @@ exports.NODE_DISPATCH = {
53
54
  slackAction: { service: 'slackActionsService', collection: 'slackactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
54
55
  googleContactsAction: { service: 'googleContactsActionsService', collection: 'googlecontactsactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
55
56
  rssAction: { service: 'rssActionsService', collection: 'rssactions', hasFilters: false, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
57
+ socialMediaAction: { service: 'socialMediaActionsService', collection: 'socialmediaactions', hasFilters: true, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
56
58
  // ── Sources — start the flow themselves, not dispatched ──
57
59
  endpoint: { service: 'endpointsService', collection: 'endpoints', hasFilters: false, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
58
60
  scheduledWebhook: { service: 'scheduledWebhooksService', collection: 'scheduledwebhooks', hasFilters: false, outputFields: ['outputNodes'], customDispatch: true, pipelineDispatch: 'excluded' },
package/dist/registry.js CHANGED
@@ -138,6 +138,14 @@ exports.NODE_REGISTRY = {
138
138
  stateKey: 'fileTransformNodes', allStateKey: 'allFileTransformNodes',
139
139
  color: '#f97316', testable: true,
140
140
  },
141
+ limit: {
142
+ type: 'limit', prefix: 'lim', label: 'Limit',
143
+ group: 'Flow Control', detailPath: '/dashboard/limit-nodes', apiPath: '/limit-nodes',
144
+ stateKey: 'limitNodes', allStateKey: 'allLimitNodes',
145
+ // Amber matches filter / aggregator family — visually groups
146
+ // "array-shape transformations" together on the canvas.
147
+ color: '#fbbf24', testable: true,
148
+ },
141
149
  // ── Routing ──
142
150
  router: {
143
151
  type: 'router', prefix: 'ro', label: 'Router',
@@ -292,6 +300,19 @@ exports.NODE_REGISTRY = {
292
300
  // fileTransform / firecrawl which sit on Tailwind orange-500.
293
301
  color: '#ff9933', testable: true,
294
302
  },
303
+ socialMediaAction: {
304
+ type: 'socialMediaAction', prefix: 'sm', label: 'Social Media',
305
+ group: 'Actions', detailPath: '/dashboard/social-media-actions', apiPath: '/social-media-actions',
306
+ stateKey: 'socialMediaActions', allStateKey: 'allSocialMediaActions',
307
+ // Pink/magenta (#ec4899) — neutral default; the canvas card overrides
308
+ // with the picked provider's brandColor at render time so each
309
+ // platform reads at a glance (Bluesky #0085ff, Mastodon #6364ff, ...).
310
+ color: '#ec4899', testable: true,
311
+ // AI toolkit mode (Sprint 4) wires through tools[] like the other
312
+ // toolkit-capable actions. Manual + toolkit modes share the same
313
+ // detail page; the segmented control hides ops-config when toolkit.
314
+ isToolOnly: (e) => e.aiEnabled === true,
315
+ },
295
316
  // ── Annotations ──
296
317
  stickyNote: {
297
318
  type: 'stickyNote', prefix: 'note', label: 'Sticky Note',
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** All valid node type identifiers */
2
- export type NodeType = 'endpoint' | 'scheduledWebhook' | 'chatTrigger' | 'serviceTrigger' | 'voiceAgent' | 'filter' | 'transform' | 'schemaValidator' | 'conditional' | 'delay' | 'rateLimiter' | 'aggregator' | 'cache' | 'code' | 'ai' | 'merge' | 'approval' | 'split' | 'loop' | 'markdown' | 'fileTransform' | 'router' | 'emailAction' | 'httpAction' | 'mongoAction' | 'postgresAction' | 'notificationAction' | 'sheetsAction' | 'calendarAction' | 'docsAction' | 'driveAction' | 'firecrawlAction' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'googleContactsAction' | 'vectorStore' | 'rssAction' | 'stickyNote';
2
+ export type NodeType = 'endpoint' | 'scheduledWebhook' | 'chatTrigger' | 'serviceTrigger' | 'voiceAgent' | 'filter' | 'transform' | 'schemaValidator' | 'conditional' | 'delay' | 'rateLimiter' | 'aggregator' | 'cache' | 'code' | 'ai' | 'merge' | 'approval' | 'split' | 'loop' | 'markdown' | 'fileTransform' | 'limit' | 'router' | 'emailAction' | 'httpAction' | 'mongoAction' | 'postgresAction' | 'notificationAction' | 'sheetsAction' | 'calendarAction' | 'docsAction' | 'driveAction' | 'firecrawlAction' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'googleContactsAction' | 'vectorStore' | 'rssAction' | 'socialMediaAction' | '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
@@ -31,6 +31,7 @@ exports.NODE_UI = {
31
31
  ai: { fromNodes: true, toNodes: true },
32
32
  markdown: { fromNodes: true, toNodes: true, special: { loopBackAllowed: true } },
33
33
  fileTransform: { fromNodes: true, toNodes: true },
34
+ limit: { fromNodes: true, toNodes: true, special: { loopBackAllowed: true } },
34
35
  // ── Flow control nodes ──
35
36
  split: { fromNodes: true, toNodes: true, outputHandles: ['right'], special: { connectModal: 'output-group', outputGroups: { field: 'outputs', nameField: 'name', summaryField: 'field', label: 'output', elseField: 'remainderOutputNodes' } } },
36
37
  merge: { fromNodes: true, toNodes: true, inputHandles: ['left', 'top'] },
@@ -56,6 +57,7 @@ exports.NODE_UI = {
56
57
  googleContactsAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
57
58
  vectorStore: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
58
59
  rssAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
60
+ socialMediaAction: { fromNodes: true, toNodes: true, inputHandles: ['left'], dotHandles: { input: ['left-in'], output: ['right-out'] }, special: { loopBackAllowed: true } },
59
61
  // ── Annotations ──
60
62
  stickyNote: { fromNodes: false, toNodes: false },
61
63
  };
@@ -95,11 +97,13 @@ exports.PREFIX_TO_TYPE = [
95
97
  { prefix: 'loop-', type: 'loop', canvasType: 'loop' },
96
98
  { prefix: 'md-', type: 'markdown', canvasType: 'markdown' },
97
99
  { prefix: 'ft-', type: 'fileTransform', canvasType: 'fileTransform' },
100
+ { prefix: 'lim-', type: 'limit', canvasType: 'limit' },
98
101
  { prefix: 'doc-', type: 'docsAction', canvasType: 'docsAction' },
99
102
  { prefix: 'drv-', type: 'driveAction', canvasType: 'driveAction' },
100
103
  { prefix: 'fc-', type: 'firecrawlAction', canvasType: 'firecrawlAction' },
101
104
  { prefix: 'vs-', type: 'vectorStore', canvasType: 'vectorStore' },
102
105
  { prefix: 'rssa-', type: 'rssAction', canvasType: 'rssAction' },
106
+ { prefix: 'sm-', type: 'socialMediaAction', canvasType: 'socialMediaAction' },
103
107
  { prefix: 'note-', type: 'stickyNote', canvasType: 'stickyNote' },
104
108
  ];
105
109
  /** Resolve canvas node ID to { type, entityId } */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostwebhook/node-types",
3
- "version": "1.41.0",
3
+ "version": "1.43.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",