@hostwebhook/node-types 1.69.0 → 1.71.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.
- package/dist/bucket-operations.d.ts +88 -0
- package/dist/bucket-operations.js +140 -0
- package/dist/calendar-toolkit.d.ts +1 -1
- package/dist/connections.d.ts +1 -1
- package/dist/connections.js +1 -0
- package/dist/discord-operations.d.ts +1 -1
- package/dist/discord-operations.js +4 -4
- package/dist/discord-toolkit.d.ts +1 -1
- package/dist/discord-toolkit.js +3 -3
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +1 -0
- package/dist/docs-toolkit.d.ts +1 -1
- package/dist/drive-toolkit.d.ts +1 -1
- package/dist/esm/bucket-operations.d.ts +88 -0
- package/dist/esm/bucket-operations.js +136 -0
- package/dist/esm/calendar-operations.d.ts +67 -0
- package/dist/esm/calendar-operations.js +176 -0
- package/dist/esm/calendar-toolkit.d.ts +50 -0
- package/dist/esm/calendar-toolkit.js +152 -0
- package/dist/esm/capacidad-de-credencial.d.ts +75 -0
- package/dist/esm/capacidad-de-credencial.js +68 -0
- package/dist/esm/connections.d.ts +17 -0
- package/dist/esm/connections.js +107 -0
- package/dist/esm/credentials.d.ts +144 -0
- package/dist/esm/credentials.js +199 -0
- package/dist/esm/discord-operations.d.ts +104 -0
- package/dist/esm/discord-operations.js +407 -0
- package/dist/esm/discord-toolkit.d.ts +64 -0
- package/dist/esm/discord-toolkit.js +260 -0
- package/dist/esm/dispatch.d.ts +16 -0
- package/dist/esm/dispatch.js +77 -0
- package/dist/esm/docs-operations.d.ts +99 -0
- package/dist/esm/docs-operations.js +127 -0
- package/dist/esm/docs-toolkit.d.ts +42 -0
- package/dist/esm/docs-toolkit.js +97 -0
- package/dist/esm/drive-operations.d.ts +103 -0
- package/dist/esm/drive-operations.js +319 -0
- package/dist/esm/drive-toolkit.d.ts +54 -0
- package/dist/esm/drive-toolkit.js +177 -0
- package/dist/esm/github-operations.d.ts +147 -0
- package/dist/esm/github-operations.js +551 -0
- package/dist/esm/gmail-operations.d.ts +190 -0
- package/dist/esm/gmail-operations.js +560 -0
- package/dist/esm/google-analytics-operations.d.ts +99 -0
- package/dist/esm/google-analytics-operations.js +222 -0
- package/dist/esm/google-contacts-operations.d.ts +93 -0
- package/dist/esm/google-contacts-operations.js +363 -0
- package/dist/esm/index.d.ts +68 -0
- package/dist/esm/index.js +51 -0
- package/dist/esm/jira-operations.d.ts +164 -0
- package/dist/esm/jira-operations.js +470 -0
- package/dist/esm/llm-models.d.ts +101 -0
- package/dist/esm/llm-models.js +230 -0
- package/dist/esm/mailchimp-operations.d.ts +56 -0
- package/dist/esm/mailchimp-operations.js +155 -0
- package/dist/esm/mongo-operations.d.ts +61 -0
- package/dist/esm/mongo-operations.js +120 -0
- package/dist/esm/notion-operations.d.ts +125 -0
- package/dist/esm/notion-operations.js +511 -0
- package/dist/esm/openrouter.d.ts +142 -0
- package/dist/esm/openrouter.js +99 -0
- package/dist/esm/package.json +4 -0
- package/dist/esm/postgres-operations.d.ts +60 -0
- package/dist/esm/postgres-operations.js +75 -0
- package/dist/esm/registry.d.ts +160 -0
- package/dist/esm/registry.js +885 -0
- package/dist/esm/sheets-operations.d.ts +78 -0
- package/dist/esm/sheets-operations.js +150 -0
- package/dist/esm/sheets-toolkit.d.ts +49 -0
- package/dist/esm/sheets-toolkit.js +127 -0
- package/dist/esm/shopify-operations.d.ts +95 -0
- package/dist/esm/shopify-operations.js +259 -0
- package/dist/esm/slack-operations.d.ts +81 -0
- package/dist/esm/slack-operations.js +244 -0
- package/dist/esm/slack-toolkit.d.ts +60 -0
- package/dist/esm/slack-toolkit.js +235 -0
- package/dist/esm/telegram-operations.d.ts +104 -0
- package/dist/esm/telegram-operations.js +351 -0
- package/dist/esm/telegram-toolkit.d.ts +52 -0
- package/dist/esm/telegram-toolkit.js +183 -0
- package/dist/esm/types.d.ts +149 -0
- package/dist/esm/types.js +8 -0
- package/dist/esm/ui.d.ts +13 -0
- package/dist/esm/ui.js +152 -0
- package/dist/esm/whatsapp-operations.d.ts +23 -0
- package/dist/esm/whatsapp-operations.js +36 -0
- package/dist/index.d.ts +68 -66
- package/dist/index.js +193 -187
- package/dist/openrouter.d.ts +1 -1
- package/dist/registry.d.ts +4 -4
- package/dist/registry.js +540 -210
- package/dist/sheets-toolkit.d.ts +1 -1
- package/dist/slack-operations.d.ts +1 -1
- package/dist/slack-operations.js +4 -4
- package/dist/slack-toolkit.d.ts +1 -1
- package/dist/slack-toolkit.js +3 -3
- package/dist/telegram-toolkit.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +2 -0
- package/package.json +21 -3
package/dist/registry.js
CHANGED
|
@@ -19,151 +19,289 @@ exports.versionCatalogErrors = versionCatalogErrors;
|
|
|
19
19
|
exports.NODE_REGISTRY = {
|
|
20
20
|
// ── Sources ──
|
|
21
21
|
webhook: {
|
|
22
|
-
type:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
type: "webhook",
|
|
23
|
+
prefix: "wh",
|
|
24
|
+
label: "Webhook",
|
|
25
|
+
group: "Sources",
|
|
26
|
+
detailPath: "/dashboard/webhooks",
|
|
27
|
+
apiPath: "/webhooks",
|
|
28
|
+
stateKey: "webhooks",
|
|
29
|
+
allStateKey: "allWebhooks",
|
|
30
|
+
color: "#a78bfa",
|
|
31
|
+
testable: false,
|
|
26
32
|
},
|
|
27
33
|
scheduledWorkflow: {
|
|
28
|
-
type:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
type: "scheduledWorkflow",
|
|
35
|
+
prefix: "swf",
|
|
36
|
+
label: "Scheduled Workflow",
|
|
37
|
+
group: "Sources",
|
|
38
|
+
detailPath: "/dashboard/scheduled-workflows",
|
|
39
|
+
apiPath: "/scheduled-workflows",
|
|
40
|
+
stateKey: "scheduledWorkflows",
|
|
41
|
+
allStateKey: "allScheduledWorkflows",
|
|
42
|
+
color: "#2dd4bf",
|
|
43
|
+
testable: true,
|
|
32
44
|
},
|
|
33
45
|
chatTrigger: {
|
|
34
|
-
type:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
type: "chatTrigger",
|
|
47
|
+
prefix: "chat",
|
|
48
|
+
label: "Chat Trigger",
|
|
49
|
+
group: "Sources",
|
|
50
|
+
detailPath: "/dashboard/chat-triggers",
|
|
51
|
+
apiPath: "/chat-triggers",
|
|
52
|
+
stateKey: "chatTriggers",
|
|
53
|
+
allStateKey: "allChatTriggers",
|
|
54
|
+
color: "#06b6d4",
|
|
55
|
+
testable: false,
|
|
38
56
|
},
|
|
39
57
|
trigger: {
|
|
40
|
-
type:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
type: "trigger",
|
|
59
|
+
prefix: "trg",
|
|
60
|
+
label: "Trigger",
|
|
61
|
+
group: "Sources",
|
|
62
|
+
detailPath: "/dashboard/triggers",
|
|
63
|
+
apiPath: "/triggers",
|
|
64
|
+
stateKey: "triggers",
|
|
65
|
+
allStateKey: "allTriggers",
|
|
66
|
+
color: "#ef4444",
|
|
67
|
+
testable: false,
|
|
44
68
|
},
|
|
45
69
|
voiceAgent: {
|
|
46
|
-
type:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
70
|
+
type: "voiceAgent",
|
|
71
|
+
prefix: "va",
|
|
72
|
+
label: "Voice Agent",
|
|
73
|
+
group: "Sources",
|
|
74
|
+
detailPath: "/dashboard/voice-agents",
|
|
75
|
+
apiPath: "/voice-agents",
|
|
76
|
+
stateKey: "voiceAgents",
|
|
77
|
+
allStateKey: "allVoiceAgents",
|
|
78
|
+
color: "#a855f7",
|
|
79
|
+
testable: false,
|
|
50
80
|
},
|
|
51
81
|
// ── Flow Control ──
|
|
52
82
|
filter: {
|
|
53
|
-
type:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
83
|
+
type: "filter",
|
|
84
|
+
prefix: "fi",
|
|
85
|
+
label: "Filter",
|
|
86
|
+
group: "Flow Control",
|
|
87
|
+
detailPath: "/dashboard/filter-nodes",
|
|
88
|
+
apiPath: "/filter-nodes",
|
|
89
|
+
stateKey: "filterNodes",
|
|
90
|
+
allStateKey: "allFilterNodes",
|
|
91
|
+
color: "#facc15",
|
|
92
|
+
testable: true,
|
|
57
93
|
},
|
|
58
94
|
transform: {
|
|
59
|
-
type:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
95
|
+
type: "transform",
|
|
96
|
+
prefix: "tr",
|
|
97
|
+
label: "Transform",
|
|
98
|
+
group: "Flow Control",
|
|
99
|
+
detailPath: "/dashboard/transform-nodes",
|
|
100
|
+
apiPath: "/transform-nodes",
|
|
101
|
+
stateKey: "transformNodes",
|
|
102
|
+
allStateKey: "allTransformNodes",
|
|
103
|
+
color: "#fbbf24",
|
|
104
|
+
testable: true,
|
|
63
105
|
},
|
|
64
106
|
schemaValidator: {
|
|
65
|
-
type:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
107
|
+
type: "schemaValidator",
|
|
108
|
+
prefix: "sv",
|
|
109
|
+
label: "Schema Validator",
|
|
110
|
+
group: "Flow Control",
|
|
111
|
+
detailPath: "/dashboard/schema-validators",
|
|
112
|
+
apiPath: "/schema-validators",
|
|
113
|
+
stateKey: "schemaValidators",
|
|
114
|
+
allStateKey: "allSchemaValidators",
|
|
115
|
+
color: "#818cf8",
|
|
116
|
+
testable: true,
|
|
69
117
|
},
|
|
70
118
|
conditional: {
|
|
71
|
-
type:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
119
|
+
type: "conditional",
|
|
120
|
+
prefix: "cond",
|
|
121
|
+
label: "Conditional",
|
|
122
|
+
group: "Flow Control",
|
|
123
|
+
detailPath: "/dashboard/conditional-nodes",
|
|
124
|
+
apiPath: "/conditional-nodes",
|
|
125
|
+
stateKey: "conditionalNodes",
|
|
126
|
+
allStateKey: "allConditionalNodes",
|
|
127
|
+
color: "#c084fc",
|
|
128
|
+
testable: true,
|
|
75
129
|
},
|
|
76
130
|
delay: {
|
|
77
|
-
type:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
131
|
+
type: "delay",
|
|
132
|
+
prefix: "delay",
|
|
133
|
+
label: "Delay",
|
|
134
|
+
group: "Flow Control",
|
|
135
|
+
detailPath: "/dashboard/delay-nodes",
|
|
136
|
+
apiPath: "/delay-nodes",
|
|
137
|
+
stateKey: "delayNodes",
|
|
138
|
+
allStateKey: "allDelayNodes",
|
|
139
|
+
color: "#94a3b8",
|
|
140
|
+
testable: true,
|
|
81
141
|
},
|
|
82
142
|
rateLimiter: {
|
|
83
|
-
type:
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
143
|
+
type: "rateLimiter",
|
|
144
|
+
prefix: "rl",
|
|
145
|
+
label: "Rate Limiter",
|
|
146
|
+
group: "Flow Control",
|
|
147
|
+
detailPath: "/dashboard/rate-limiter-nodes",
|
|
148
|
+
apiPath: "/rate-limiter-nodes",
|
|
149
|
+
stateKey: "rateLimiterNodes",
|
|
150
|
+
allStateKey: "allRateLimiterNodes",
|
|
151
|
+
color: "#f97316",
|
|
152
|
+
testable: false,
|
|
87
153
|
},
|
|
88
154
|
aggregator: {
|
|
89
|
-
type:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
155
|
+
type: "aggregator",
|
|
156
|
+
prefix: "agg",
|
|
157
|
+
label: "Aggregator",
|
|
158
|
+
group: "Flow Control",
|
|
159
|
+
detailPath: "/dashboard/aggregator-nodes",
|
|
160
|
+
apiPath: "/aggregator-nodes",
|
|
161
|
+
stateKey: "aggregatorNodes",
|
|
162
|
+
allStateKey: "allAggregatorNodes",
|
|
163
|
+
color: "#84cc16",
|
|
164
|
+
testable: true,
|
|
93
165
|
},
|
|
94
166
|
cache: {
|
|
95
|
-
type:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
167
|
+
type: "cache",
|
|
168
|
+
prefix: "cache",
|
|
169
|
+
label: "Cache",
|
|
170
|
+
group: "Flow Control",
|
|
171
|
+
detailPath: "/dashboard/cache-nodes",
|
|
172
|
+
apiPath: "/cache-nodes",
|
|
173
|
+
stateKey: "cacheNodes",
|
|
174
|
+
allStateKey: "allCacheNodes",
|
|
175
|
+
color: "#d946ef",
|
|
176
|
+
testable: true,
|
|
99
177
|
},
|
|
100
178
|
code: {
|
|
101
|
-
type:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
179
|
+
type: "code",
|
|
180
|
+
prefix: "code",
|
|
181
|
+
label: "Code",
|
|
182
|
+
group: "Flow Control",
|
|
183
|
+
detailPath: "/dashboard/code-nodes",
|
|
184
|
+
apiPath: "/code-nodes",
|
|
185
|
+
stateKey: "codeNodes",
|
|
186
|
+
allStateKey: "allCodeNodes",
|
|
187
|
+
color: "#a855f7",
|
|
188
|
+
testable: true,
|
|
105
189
|
},
|
|
106
190
|
ai: {
|
|
107
|
-
type:
|
|
191
|
+
type: "ai",
|
|
192
|
+
prefix: "ai",
|
|
193
|
+
label: "AI",
|
|
108
194
|
/* 'Actions' y no 'Flow Control': un nodo de IA no encamina ni retiene un
|
|
109
195
|
evento —eso es control de flujo— sino que HACE algo con él y devuelve un
|
|
110
196
|
resultado, igual que enviar un correo o escribir en una hoja. Además es
|
|
111
197
|
lo que decide qué se ofrece como acción en el flujo guiado del primer
|
|
112
198
|
flujo (`FIRST_FLOW_ACTIONS` en el dashboard), y ahí tiene que estar. */
|
|
113
|
-
group:
|
|
114
|
-
|
|
115
|
-
|
|
199
|
+
group: "Actions",
|
|
200
|
+
detailPath: "/dashboard/ai-nodes",
|
|
201
|
+
apiPath: "/ai-nodes",
|
|
202
|
+
stateKey: "aiNodes",
|
|
203
|
+
allStateKey: "allAiNodes",
|
|
204
|
+
color: "#d946ef",
|
|
205
|
+
testable: true,
|
|
116
206
|
},
|
|
117
207
|
split: {
|
|
118
|
-
type:
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
208
|
+
type: "split",
|
|
209
|
+
prefix: "split",
|
|
210
|
+
label: "Split",
|
|
211
|
+
group: "Flow Control",
|
|
212
|
+
detailPath: "/dashboard/split-nodes",
|
|
213
|
+
apiPath: "/split-nodes",
|
|
214
|
+
stateKey: "splitNodes",
|
|
215
|
+
allStateKey: "allSplitNodes",
|
|
216
|
+
color: "#38bdf8",
|
|
217
|
+
testable: true,
|
|
122
218
|
},
|
|
123
219
|
merge: {
|
|
124
|
-
type:
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
220
|
+
type: "merge",
|
|
221
|
+
prefix: "merge",
|
|
222
|
+
label: "Merge",
|
|
223
|
+
group: "Flow Control",
|
|
224
|
+
detailPath: "/dashboard/merge-nodes",
|
|
225
|
+
apiPath: "/merge-nodes",
|
|
226
|
+
stateKey: "mergeNodes",
|
|
227
|
+
allStateKey: "allMergeNodes",
|
|
228
|
+
color: "#94a3b8",
|
|
229
|
+
testable: false,
|
|
128
230
|
},
|
|
129
231
|
approval: {
|
|
130
|
-
type:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
232
|
+
type: "approval",
|
|
233
|
+
prefix: "appr",
|
|
234
|
+
label: "Approval",
|
|
235
|
+
group: "Flow Control",
|
|
236
|
+
detailPath: "/dashboard/approval-nodes",
|
|
237
|
+
apiPath: "/approval-nodes",
|
|
238
|
+
stateKey: "approvalNodes",
|
|
239
|
+
allStateKey: "allApprovalNodes",
|
|
240
|
+
color: "#94a3b8",
|
|
241
|
+
testable: true,
|
|
134
242
|
},
|
|
135
243
|
loop: {
|
|
136
|
-
type:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
244
|
+
type: "loop",
|
|
245
|
+
prefix: "loop",
|
|
246
|
+
label: "Loop",
|
|
247
|
+
group: "Flow Control",
|
|
248
|
+
detailPath: "/dashboard/loop-nodes",
|
|
249
|
+
apiPath: "/loop-nodes",
|
|
250
|
+
stateKey: "loopNodes",
|
|
251
|
+
allStateKey: "allLoopNodes",
|
|
252
|
+
color: "#f59e0b",
|
|
253
|
+
testable: true,
|
|
140
254
|
},
|
|
141
255
|
markdown: {
|
|
142
|
-
type:
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
256
|
+
type: "markdown",
|
|
257
|
+
prefix: "md",
|
|
258
|
+
label: "Markdown",
|
|
259
|
+
group: "Flow Control",
|
|
260
|
+
detailPath: "/dashboard/markdown-nodes",
|
|
261
|
+
apiPath: "/markdown-nodes",
|
|
262
|
+
stateKey: "markdownNodes",
|
|
263
|
+
allStateKey: "allMarkdownNodes",
|
|
264
|
+
color: "#6366f1",
|
|
265
|
+
testable: true,
|
|
146
266
|
},
|
|
147
267
|
fileTransform: {
|
|
148
|
-
type:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
268
|
+
type: "fileTransform",
|
|
269
|
+
prefix: "ft",
|
|
270
|
+
label: "File Transform",
|
|
271
|
+
group: "Flow Control",
|
|
272
|
+
detailPath: "/dashboard/file-transform-nodes",
|
|
273
|
+
apiPath: "/file-transform-nodes",
|
|
274
|
+
stateKey: "fileTransformNodes",
|
|
275
|
+
allStateKey: "allFileTransformNodes",
|
|
276
|
+
color: "#f97316",
|
|
277
|
+
testable: true,
|
|
152
278
|
},
|
|
153
279
|
limit: {
|
|
154
|
-
type:
|
|
155
|
-
|
|
156
|
-
|
|
280
|
+
type: "limit",
|
|
281
|
+
prefix: "lim",
|
|
282
|
+
label: "Limit",
|
|
283
|
+
group: "Flow Control",
|
|
284
|
+
detailPath: "/dashboard/limit-nodes",
|
|
285
|
+
apiPath: "/limit-nodes",
|
|
286
|
+
stateKey: "limitNodes",
|
|
287
|
+
allStateKey: "allLimitNodes",
|
|
157
288
|
// Amber matches filter / aggregator family — visually groups
|
|
158
289
|
// "array-shape transformations" together on the canvas.
|
|
159
|
-
color:
|
|
290
|
+
color: "#fbbf24",
|
|
291
|
+
testable: true,
|
|
160
292
|
},
|
|
161
293
|
// ── Routing ──
|
|
162
294
|
router: {
|
|
163
|
-
type:
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
295
|
+
type: "router",
|
|
296
|
+
prefix: "ro",
|
|
297
|
+
label: "Router",
|
|
298
|
+
group: "Flow Control",
|
|
299
|
+
detailPath: "/dashboard/routers",
|
|
300
|
+
apiPath: "/routers",
|
|
301
|
+
stateKey: "routers",
|
|
302
|
+
allStateKey: "allRouters",
|
|
303
|
+
color: "#38bdf8",
|
|
304
|
+
testable: true,
|
|
167
305
|
},
|
|
168
306
|
// ── Actions ──
|
|
169
307
|
/**
|
|
@@ -175,10 +313,16 @@ exports.NODE_REGISTRY = {
|
|
|
175
313
|
* el modo de IA no tiene dieciséis herramientas que ofrecer.
|
|
176
314
|
*/
|
|
177
315
|
emailAction: {
|
|
178
|
-
type:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
316
|
+
type: "emailAction",
|
|
317
|
+
prefix: "ea",
|
|
318
|
+
label: "Email Action",
|
|
319
|
+
group: "Actions",
|
|
320
|
+
detailPath: "/dashboard/email-actions",
|
|
321
|
+
apiPath: "/email-actions",
|
|
322
|
+
stateKey: "emailActions",
|
|
323
|
+
allStateKey: "allEmailActions",
|
|
324
|
+
color: "#f472b6",
|
|
325
|
+
testable: true,
|
|
182
326
|
/**
|
|
183
327
|
* Sigue siendo herramienta: hay una ruta native + aiEnabled donde el nodo
|
|
184
328
|
* AI genera el correo y este lo manda por Resend —en produccion existe un
|
|
@@ -197,96 +341,173 @@ exports.NODE_REGISTRY = {
|
|
|
197
341
|
* solo y el de Email vuelve a caber en una pantalla.
|
|
198
342
|
*/
|
|
199
343
|
gmailAction: {
|
|
200
|
-
type:
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
344
|
+
type: "gmailAction",
|
|
345
|
+
prefix: "gm",
|
|
346
|
+
label: "Gmail",
|
|
347
|
+
group: "Actions",
|
|
348
|
+
detailPath: "/dashboard/gmail-actions",
|
|
349
|
+
apiPath: "/gmail-actions",
|
|
350
|
+
stateKey: "gmailActions",
|
|
351
|
+
allStateKey: "allGmailActions",
|
|
352
|
+
color: "#ea4335",
|
|
353
|
+
testable: true,
|
|
204
354
|
// El toolkit de IA se vino con Gmail: son sus dieciseis operaciones las
|
|
205
355
|
// que el LLM llama, no las dos de Resend. Ver el comentario de arriba.
|
|
206
356
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
207
357
|
},
|
|
208
358
|
httpAction: {
|
|
209
|
-
type:
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
359
|
+
type: "httpAction",
|
|
360
|
+
prefix: "ha",
|
|
361
|
+
label: "HTTP Action",
|
|
362
|
+
group: "Actions",
|
|
363
|
+
detailPath: "/dashboard/http-actions",
|
|
364
|
+
apiPath: "/http-actions",
|
|
365
|
+
stateKey: "httpActions",
|
|
366
|
+
allStateKey: "allHttpActions",
|
|
367
|
+
color: "#3b82f6",
|
|
368
|
+
testable: true,
|
|
213
369
|
},
|
|
214
370
|
mongoAction: {
|
|
215
|
-
type:
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
371
|
+
type: "mongoAction",
|
|
372
|
+
prefix: "ma",
|
|
373
|
+
label: "MongoDB Action",
|
|
374
|
+
group: "Actions",
|
|
375
|
+
detailPath: "/dashboard/mongo-actions",
|
|
376
|
+
apiPath: "/mongo-actions",
|
|
377
|
+
stateKey: "mongoActions",
|
|
378
|
+
allStateKey: "allMongoActions",
|
|
379
|
+
color: "#34d399",
|
|
380
|
+
testable: true,
|
|
219
381
|
},
|
|
220
382
|
postgresAction: {
|
|
221
|
-
type:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
383
|
+
type: "postgresAction",
|
|
384
|
+
prefix: "pg",
|
|
385
|
+
label: "Postgres Action",
|
|
386
|
+
group: "Actions",
|
|
387
|
+
detailPath: "/dashboard/postgres-actions",
|
|
388
|
+
apiPath: "/postgres-actions",
|
|
389
|
+
stateKey: "postgresActions",
|
|
390
|
+
allStateKey: "allPostgresActions",
|
|
391
|
+
color: "#336791",
|
|
392
|
+
testable: true,
|
|
225
393
|
},
|
|
226
394
|
notificationAction: {
|
|
227
|
-
type:
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
395
|
+
type: "notificationAction",
|
|
396
|
+
prefix: "na",
|
|
397
|
+
label: "Notification",
|
|
398
|
+
group: "Actions",
|
|
399
|
+
detailPath: "/dashboard/notification-actions",
|
|
400
|
+
apiPath: "/notification-actions",
|
|
401
|
+
stateKey: "notificationActions",
|
|
402
|
+
allStateKey: "allNotificationActions",
|
|
403
|
+
color: "#f472b6",
|
|
404
|
+
testable: true,
|
|
231
405
|
},
|
|
232
406
|
sheetsAction: {
|
|
233
|
-
type:
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
407
|
+
type: "sheetsAction",
|
|
408
|
+
prefix: "sheet",
|
|
409
|
+
label: "Google Sheets Action",
|
|
410
|
+
group: "Actions",
|
|
411
|
+
detailPath: "/dashboard/sheets-actions",
|
|
412
|
+
apiPath: "/sheets-actions",
|
|
413
|
+
stateKey: "sheetsActions",
|
|
414
|
+
allStateKey: "allSheetsActions",
|
|
415
|
+
color: "#34d399",
|
|
416
|
+
testable: true,
|
|
237
417
|
},
|
|
238
418
|
calendarAction: {
|
|
239
|
-
type:
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
419
|
+
type: "calendarAction",
|
|
420
|
+
prefix: "cal",
|
|
421
|
+
label: "Google Calendar Action",
|
|
422
|
+
group: "Actions",
|
|
423
|
+
detailPath: "/dashboard/calendar-actions",
|
|
424
|
+
apiPath: "/calendar-actions",
|
|
425
|
+
stateKey: "calendarActions",
|
|
426
|
+
allStateKey: "allCalendarActions",
|
|
427
|
+
color: "#60a5fa",
|
|
428
|
+
testable: true,
|
|
243
429
|
// AI Toolkit mode wires the node through the upstream AI Node's
|
|
244
430
|
// tools[] list, not via canvas edges — same pattern as emailAction.
|
|
245
431
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
246
432
|
},
|
|
247
433
|
docsAction: {
|
|
248
|
-
type:
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
434
|
+
type: "docsAction",
|
|
435
|
+
prefix: "doc",
|
|
436
|
+
label: "Google Docs",
|
|
437
|
+
group: "Actions",
|
|
438
|
+
detailPath: "/dashboard/docs-actions",
|
|
439
|
+
apiPath: "/docs-actions",
|
|
440
|
+
stateKey: "docsActions",
|
|
441
|
+
allStateKey: "allDocsActions",
|
|
442
|
+
color: "#4285F4",
|
|
443
|
+
testable: true,
|
|
252
444
|
},
|
|
253
445
|
driveAction: {
|
|
254
|
-
type:
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
446
|
+
type: "driveAction",
|
|
447
|
+
prefix: "drv",
|
|
448
|
+
label: "Google Drive",
|
|
449
|
+
group: "Actions",
|
|
450
|
+
detailPath: "/dashboard/drive-actions",
|
|
451
|
+
apiPath: "/drive-actions",
|
|
452
|
+
stateKey: "driveActions",
|
|
453
|
+
allStateKey: "allDriveActions",
|
|
454
|
+
color: "#22c55e",
|
|
455
|
+
testable: true,
|
|
258
456
|
// AI Toolkit mode wires the node through the upstream AI Node's
|
|
259
457
|
// tools[] list, not via canvas edges — same pattern as emailAction.
|
|
260
458
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
261
459
|
},
|
|
262
460
|
firecrawlAction: {
|
|
263
|
-
type:
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
461
|
+
type: "firecrawlAction",
|
|
462
|
+
prefix: "fc",
|
|
463
|
+
label: "Firecrawl",
|
|
464
|
+
group: "Actions",
|
|
465
|
+
detailPath: "/dashboard/firecrawl-actions",
|
|
466
|
+
apiPath: "/firecrawl-actions",
|
|
467
|
+
stateKey: "firecrawlActions",
|
|
468
|
+
allStateKey: "allFirecrawlActions",
|
|
469
|
+
color: "#f97316",
|
|
470
|
+
testable: true,
|
|
267
471
|
},
|
|
268
472
|
mailchimpAction: {
|
|
269
|
-
type:
|
|
270
|
-
|
|
271
|
-
|
|
473
|
+
type: "mailchimpAction",
|
|
474
|
+
prefix: "mc",
|
|
475
|
+
label: "Mailchimp",
|
|
476
|
+
group: "Actions",
|
|
477
|
+
detailPath: "/dashboard/mailchimp-actions",
|
|
478
|
+
apiPath: "/mailchimp-actions",
|
|
479
|
+
stateKey: "mailchimpActions",
|
|
480
|
+
allStateKey: "allMailchimpActions",
|
|
272
481
|
// Mailchimp's Cavendish yellow, darkened until it holds contrast on a
|
|
273
482
|
// light canvas. The brand value (#ffe01b) reads as a highlighter there.
|
|
274
|
-
color:
|
|
483
|
+
color: "#c9a227",
|
|
484
|
+
testable: true,
|
|
275
485
|
},
|
|
276
486
|
shopifyAction: {
|
|
277
|
-
type:
|
|
278
|
-
|
|
279
|
-
|
|
487
|
+
type: "shopifyAction",
|
|
488
|
+
prefix: "shp",
|
|
489
|
+
label: "Shopify",
|
|
490
|
+
group: "Actions",
|
|
491
|
+
detailPath: "/dashboard/shopify-actions",
|
|
492
|
+
apiPath: "/shopify-actions",
|
|
493
|
+
stateKey: "shopifyActions",
|
|
494
|
+
allStateKey: "allShopifyActions",
|
|
280
495
|
// Shopify's green, abierto un punto. El de marca (#008060) es más oscuro
|
|
281
496
|
// que cualquier otro color de este registro y se hunde contra el lienzo
|
|
282
497
|
// en modo oscuro; éste sigue leyéndose como Shopify y aguanta en los dos
|
|
283
498
|
// temas. Mismo criterio que el amarillo de Mailchimp, al revés.
|
|
284
|
-
color:
|
|
499
|
+
color: "#0a9e70",
|
|
500
|
+
testable: true,
|
|
285
501
|
},
|
|
286
502
|
githubAction: {
|
|
287
|
-
type:
|
|
288
|
-
|
|
289
|
-
|
|
503
|
+
type: "githubAction",
|
|
504
|
+
prefix: "gh",
|
|
505
|
+
label: "GitHub",
|
|
506
|
+
group: "Actions",
|
|
507
|
+
detailPath: "/dashboard/github-actions",
|
|
508
|
+
apiPath: "/github-actions",
|
|
509
|
+
stateKey: "githubActions",
|
|
510
|
+
allStateKey: "allGithubActions",
|
|
290
511
|
// El morado de "merged" de GitHub. Su marca real es acromática, y ahí no
|
|
291
512
|
// hay elección posible: en el minimapa lo único que distingue a un nodo es
|
|
292
513
|
// el color, el gris cálido ya lo ocupa Notion y el frío lo llevan tres.
|
|
@@ -296,15 +517,21 @@ exports.NODE_REGISTRY = {
|
|
|
296
517
|
// color que de verdad dice GitHub, pero **la decisión se cierra mirando el
|
|
297
518
|
// minimapa**, no leyendo este comentario. Si choca, el plan B es un
|
|
298
519
|
// grafito claro, sabiendo que compite con Notion.
|
|
299
|
-
color:
|
|
520
|
+
color: "#8957e5",
|
|
521
|
+
testable: true,
|
|
300
522
|
/* Sin isToolOnly: la v1 no trae modo toolkit de IA, y aquí pesa más que en
|
|
301
523
|
ningún otro nodo — el MCP oficial de GitHub ya cubre ese caso dentro del
|
|
302
524
|
AI Node. Los rieles son este nodo; la improvisación es el MCP. */
|
|
303
525
|
},
|
|
304
526
|
jiraAction: {
|
|
305
|
-
type:
|
|
306
|
-
|
|
307
|
-
|
|
527
|
+
type: "jiraAction",
|
|
528
|
+
prefix: "jr",
|
|
529
|
+
label: "Jira",
|
|
530
|
+
group: "Actions",
|
|
531
|
+
detailPath: "/dashboard/jira-actions",
|
|
532
|
+
apiPath: "/jira-actions",
|
|
533
|
+
stateKey: "jiraActions",
|
|
534
|
+
allStateKey: "allJiraActions",
|
|
308
535
|
// El azul de marca de Jira, y estaba libre. La banda azul es la segunda
|
|
309
536
|
// mas poblada de este registro —nueve nodos— pero ninguno tan profundo:
|
|
310
537
|
// #3b82f6 y #60a5fa son claramente mas claros, y el #336791 de Postgres es
|
|
@@ -312,7 +539,8 @@ exports.NODE_REGISTRY = {
|
|
|
312
539
|
//
|
|
313
540
|
// Sigue valiendo lo que escribio GitHub aqui al lado: **la decision se
|
|
314
541
|
// cierra mirando el minimapa**, no leyendo este comentario.
|
|
315
|
-
color:
|
|
542
|
+
color: "#0052CC",
|
|
543
|
+
testable: true,
|
|
316
544
|
/* Sin isToolOnly: la v1 no trae modo toolkit de IA. Cada toolkit vive dos
|
|
317
545
|
veces —specs del dashboard para el AI Node y specs de la api para MCP— y
|
|
318
546
|
esa duplicacion no se paga antes de ver el nodo en pantalla. Ademas
|
|
@@ -320,11 +548,44 @@ exports.NODE_REGISTRY = {
|
|
|
320
548
|
`MCP_OAUTH_PRESETS.atlassian`, que cubre la cola larga dentro del AI
|
|
321
549
|
Node. Los rieles son este nodo. */
|
|
322
550
|
},
|
|
551
|
+
bucketAction: {
|
|
552
|
+
type: "bucketAction",
|
|
553
|
+
prefix: "bkt",
|
|
554
|
+
label: "Bucket",
|
|
555
|
+
group: "Actions",
|
|
556
|
+
detailPath: "/dashboard/bucket-actions",
|
|
557
|
+
apiPath: "/bucket-actions",
|
|
558
|
+
stateKey: "bucketActions",
|
|
559
|
+
allStateKey: "allBucketActions",
|
|
560
|
+
// Teal profundo, y la banda estaba VACIA por abajo. Los cuatro vecinos de
|
|
561
|
+
// esa familia son claramente mas claros: `#2dd4bf` y `#34d399` son pasteles,
|
|
562
|
+
// `#06b6d4` tira a cian brillante y `#0a9e70` es verde. En el minimapa este
|
|
563
|
+
// es el unico oscuro de la banda, y eso lo distingue.
|
|
564
|
+
//
|
|
565
|
+
// Se eligio neutro a proposito y no un color de marca: el nodo no es de
|
|
566
|
+
// Cloudflare. Pintarlo del naranja de R2 seria mentir en cuanto alguien lo
|
|
567
|
+
// apunte a AWS, a MinIO o a Backblaze — que es justo para lo que se llama
|
|
568
|
+
// `bucketAction` y no `r2Action`.
|
|
569
|
+
//
|
|
570
|
+
// Vale lo que escribieron GitHub y Jira aqui al lado: **la decision se
|
|
571
|
+
// cierra mirando el minimapa**, no leyendo este comentario.
|
|
572
|
+
color: "#0f766e",
|
|
573
|
+
testable: true,
|
|
574
|
+
/* Sin `isToolOnly`: la v1 no trae modo toolkit de IA. Cada toolkit vive dos
|
|
575
|
+
veces —specs del dashboard para el AI Node y specs de la api para MCP— y
|
|
576
|
+
esa duplicacion no se paga antes de ver el nodo en pantalla. */
|
|
577
|
+
},
|
|
323
578
|
telegramAction: {
|
|
324
|
-
type:
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
579
|
+
type: "telegramAction",
|
|
580
|
+
prefix: "tg",
|
|
581
|
+
label: "Telegram Action",
|
|
582
|
+
group: "Actions",
|
|
583
|
+
detailPath: "/dashboard/telegram-actions",
|
|
584
|
+
apiPath: "/telegram-actions",
|
|
585
|
+
stateKey: "telegramActions",
|
|
586
|
+
allStateKey: "allTelegramActions",
|
|
587
|
+
color: "#0ea5e9",
|
|
588
|
+
testable: true,
|
|
328
589
|
// AI Toolkit mode — same pattern as emailAction. One aiEnabled
|
|
329
590
|
// telegramAction expands into N MCP tools (one per operation) in
|
|
330
591
|
// the upstream AI Node's tool list, so we hide canvas handles to
|
|
@@ -333,11 +594,17 @@ exports.NODE_REGISTRY = {
|
|
|
333
594
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
334
595
|
},
|
|
335
596
|
whatsappAction: {
|
|
336
|
-
type:
|
|
337
|
-
|
|
338
|
-
|
|
597
|
+
type: "whatsappAction",
|
|
598
|
+
prefix: "wa",
|
|
599
|
+
label: "WhatsApp Action",
|
|
600
|
+
group: "Actions",
|
|
601
|
+
detailPath: "/dashboard/whatsapp-actions",
|
|
602
|
+
apiPath: "/whatsapp-actions",
|
|
603
|
+
stateKey: "whatsappActions",
|
|
604
|
+
allStateKey: "allWhatsappActions",
|
|
339
605
|
// WhatsApp brand green (#25d366) — instantly recognisable on the canvas.
|
|
340
|
-
color:
|
|
606
|
+
color: "#25d366",
|
|
607
|
+
testable: true,
|
|
341
608
|
// Same toolkit pattern as telegramAction — when aiEnabled the
|
|
342
609
|
// entity stops being a manually-wired single-op action and becomes
|
|
343
610
|
// a multi-op tool surface for an upstream AI Node. Hide canvas
|
|
@@ -346,24 +613,36 @@ exports.NODE_REGISTRY = {
|
|
|
346
613
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
347
614
|
},
|
|
348
615
|
discordAction: {
|
|
349
|
-
type:
|
|
350
|
-
|
|
351
|
-
|
|
616
|
+
type: "discordAction",
|
|
617
|
+
prefix: "dc",
|
|
618
|
+
label: "Discord Action",
|
|
619
|
+
group: "Actions",
|
|
620
|
+
detailPath: "/dashboard/discord-actions",
|
|
621
|
+
apiPath: "/discord-actions",
|
|
622
|
+
stateKey: "discordActions",
|
|
623
|
+
allStateKey: "allDiscordActions",
|
|
352
624
|
// Discord brand "Blurple" (#5865F2).
|
|
353
|
-
color:
|
|
625
|
+
color: "#5865F2",
|
|
626
|
+
testable: true,
|
|
354
627
|
// Same toolkit pattern as telegramAction / whatsappAction. Hide
|
|
355
628
|
// canvas handles when aiEnabled so the user can't manually wire a
|
|
356
629
|
// multi-op tool surface — the LLM picks the operation per call.
|
|
357
630
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
358
631
|
},
|
|
359
632
|
slackAction: {
|
|
360
|
-
type:
|
|
361
|
-
|
|
362
|
-
|
|
633
|
+
type: "slackAction",
|
|
634
|
+
prefix: "sl",
|
|
635
|
+
label: "Slack Action",
|
|
636
|
+
group: "Actions",
|
|
637
|
+
detailPath: "/dashboard/slack-actions",
|
|
638
|
+
apiPath: "/slack-actions",
|
|
639
|
+
stateKey: "slackActions",
|
|
640
|
+
allStateKey: "allSlackActions",
|
|
363
641
|
// Slack brand purple ("aubergine"-derived family). Matches the
|
|
364
642
|
// accent color used by SlackConfigSection / ServiceTriggerNode for
|
|
365
643
|
// visual continuity across Slack-related nodes.
|
|
366
|
-
color:
|
|
644
|
+
color: "#7c3aed",
|
|
645
|
+
testable: true,
|
|
367
646
|
// Same AI-tool gating as Telegram/Discord/WhatsApp/Email/Calendar/
|
|
368
647
|
// Contacts. When aiEnabled the node fans out into 16 MCP tools
|
|
369
648
|
// (one per SLACK_OPERATIONS entry); hide canvas handles to prevent
|
|
@@ -371,11 +650,17 @@ exports.NODE_REGISTRY = {
|
|
|
371
650
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
372
651
|
},
|
|
373
652
|
googleContactsAction: {
|
|
374
|
-
type:
|
|
375
|
-
|
|
376
|
-
|
|
653
|
+
type: "googleContactsAction",
|
|
654
|
+
prefix: "gc",
|
|
655
|
+
label: "Google Contacts",
|
|
656
|
+
group: "Actions",
|
|
657
|
+
detailPath: "/dashboard/google-contacts-actions",
|
|
658
|
+
apiPath: "/google-contacts-actions",
|
|
659
|
+
stateKey: "googleContactsActions",
|
|
660
|
+
allStateKey: "allGoogleContactsActions",
|
|
377
661
|
// Google "blue" used by Google Drive / Docs (#4285F4) — same family.
|
|
378
|
-
color:
|
|
662
|
+
color: "#4285F4",
|
|
663
|
+
testable: true,
|
|
379
664
|
// AI toolkit mode mirrors emailAction / calendarAction — when
|
|
380
665
|
// aiEnabled the node expands into N MCP tools (one per People API
|
|
381
666
|
// operation) in the upstream AI Node's tool list. Hide canvas
|
|
@@ -383,54 +668,84 @@ exports.NODE_REGISTRY = {
|
|
|
383
668
|
isToolOnly: (e) => e.aiEnabled === true,
|
|
384
669
|
},
|
|
385
670
|
googleAnalyticsAction: {
|
|
386
|
-
type:
|
|
387
|
-
|
|
388
|
-
|
|
671
|
+
type: "googleAnalyticsAction",
|
|
672
|
+
prefix: "gaa",
|
|
673
|
+
label: "Google Analytics",
|
|
674
|
+
group: "Actions",
|
|
675
|
+
detailPath: "/dashboard/google-analytics-actions",
|
|
676
|
+
apiPath: "/google-analytics-actions",
|
|
677
|
+
stateKey: "googleAnalyticsActions",
|
|
678
|
+
allStateKey: "allGoogleAnalyticsActions",
|
|
389
679
|
// Naranja de marca de Google Analytics (#E37400). No reutiliza el
|
|
390
680
|
// #ff9933 de RSS ni el orange-500 de Tailwind que ya llevan tres nodos:
|
|
391
681
|
// en el minimapa lo unico que distingue a un nodo es el color.
|
|
392
|
-
color:
|
|
682
|
+
color: "#E37400",
|
|
683
|
+
testable: true,
|
|
393
684
|
/* Sin isToolOnly: la v1 no trae modo toolkit de IA. Cada toolkit vive
|
|
394
685
|
dos veces --specs del dashboard para el AI Node y specs de la api para
|
|
395
686
|
MCP, sin nada que las ate-- y esa duplicacion no se paga antes de ver
|
|
396
687
|
el nodo funcionando en pantalla. */
|
|
397
688
|
},
|
|
398
689
|
notionAction: {
|
|
399
|
-
type:
|
|
400
|
-
|
|
401
|
-
|
|
690
|
+
type: "notionAction",
|
|
691
|
+
prefix: "ntn",
|
|
692
|
+
label: "Notion",
|
|
693
|
+
group: "Actions",
|
|
694
|
+
detailPath: "/dashboard/notion-actions",
|
|
695
|
+
apiPath: "/notion-actions",
|
|
696
|
+
stateKey: "notionActions",
|
|
697
|
+
allStateKey: "allNotionActions",
|
|
402
698
|
// Notion es monocromo de marca (su negro es #37352F), y un punto negro
|
|
403
699
|
// en el minimapa desaparece en modo oscuro. Este stone-500 es el gris
|
|
404
700
|
// CÁLIDO más cercano a esa marca, y no choca con el #94a3b8 (slate, gris
|
|
405
701
|
// frío) que ya llevan tres nodos: en el minimapa lo único que distingue
|
|
406
702
|
// a un nodo es el color.
|
|
407
|
-
color:
|
|
703
|
+
color: "#78716c",
|
|
704
|
+
testable: true,
|
|
408
705
|
/* Sin isToolOnly: la v1 no trae modo toolkit de IA. Cada toolkit vive dos
|
|
409
706
|
veces --specs del dashboard para el AI Node y specs de la api para
|
|
410
707
|
MCP-- y esa duplicación no se paga antes de ver el nodo en pantalla. */
|
|
411
708
|
},
|
|
412
709
|
vectorStore: {
|
|
413
|
-
type:
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
710
|
+
type: "vectorStore",
|
|
711
|
+
prefix: "vs",
|
|
712
|
+
label: "Vector Store",
|
|
713
|
+
group: "Actions",
|
|
714
|
+
detailPath: "/dashboard/vector-store-nodes",
|
|
715
|
+
apiPath: "/vector-store-nodes",
|
|
716
|
+
stateKey: "vectorStoreNodes",
|
|
717
|
+
allStateKey: "allVectorStoreNodes",
|
|
718
|
+
color: "#06b6d4",
|
|
719
|
+
testable: true,
|
|
417
720
|
},
|
|
418
721
|
rssAction: {
|
|
419
|
-
type:
|
|
420
|
-
|
|
421
|
-
|
|
722
|
+
type: "rssAction",
|
|
723
|
+
prefix: "rssa",
|
|
724
|
+
label: "RSS Fetch",
|
|
725
|
+
group: "Actions",
|
|
726
|
+
detailPath: "/dashboard/rss-actions",
|
|
727
|
+
apiPath: "/rss-actions",
|
|
728
|
+
stateKey: "rssActions",
|
|
729
|
+
allStateKey: "allRssActions",
|
|
422
730
|
// Classic RSS feed orange (#ff9933) — distinguishes from rateLimiter /
|
|
423
731
|
// fileTransform / firecrawl which sit on Tailwind orange-500.
|
|
424
|
-
color:
|
|
732
|
+
color: "#ff9933",
|
|
733
|
+
testable: true,
|
|
425
734
|
},
|
|
426
735
|
socialMediaAction: {
|
|
427
|
-
type:
|
|
428
|
-
|
|
429
|
-
|
|
736
|
+
type: "socialMediaAction",
|
|
737
|
+
prefix: "sm",
|
|
738
|
+
label: "Social Media",
|
|
739
|
+
group: "Actions",
|
|
740
|
+
detailPath: "/dashboard/social-media-actions",
|
|
741
|
+
apiPath: "/social-media-actions",
|
|
742
|
+
stateKey: "socialMediaActions",
|
|
743
|
+
allStateKey: "allSocialMediaActions",
|
|
430
744
|
// Pink/magenta (#ec4899) — neutral default; the canvas card overrides
|
|
431
745
|
// with the picked provider's brandColor at render time so each
|
|
432
746
|
// platform reads at a glance (Bluesky #0085ff, Mastodon #6364ff, ...).
|
|
433
|
-
color:
|
|
747
|
+
color: "#ec4899",
|
|
748
|
+
testable: true,
|
|
434
749
|
// AI toolkit mode (Sprint 4) wires through tools[] like the other
|
|
435
750
|
// toolkit-capable actions. Manual + toolkit modes share the same
|
|
436
751
|
// detail page; the segmented control hides ops-config when toolkit.
|
|
@@ -438,10 +753,16 @@ exports.NODE_REGISTRY = {
|
|
|
438
753
|
},
|
|
439
754
|
// ── Annotations ──
|
|
440
755
|
stickyNote: {
|
|
441
|
-
type:
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
756
|
+
type: "stickyNote",
|
|
757
|
+
prefix: "note",
|
|
758
|
+
label: "Sticky Note",
|
|
759
|
+
group: "Annotations",
|
|
760
|
+
detailPath: "",
|
|
761
|
+
apiPath: "/sticky-notes",
|
|
762
|
+
stateKey: "stickyNotes",
|
|
763
|
+
allStateKey: "allStickyNotes",
|
|
764
|
+
color: "#fbbf24",
|
|
765
|
+
testable: false,
|
|
445
766
|
},
|
|
446
767
|
};
|
|
447
768
|
// ── Derived helpers ──
|
|
@@ -450,15 +771,20 @@ function getNodeRegistryEntry(type) {
|
|
|
450
771
|
return exports.NODE_REGISTRY[type];
|
|
451
772
|
}
|
|
452
773
|
/** type → detail page path */
|
|
453
|
-
exports.NODE_DETAIL_PATHS = Object.fromEntries(Object.values(exports.NODE_REGISTRY)
|
|
774
|
+
exports.NODE_DETAIL_PATHS = Object.fromEntries(Object.values(exports.NODE_REGISTRY)
|
|
775
|
+
.filter((n) => n.detailPath)
|
|
776
|
+
.map((n) => [n.type, n.detailPath]));
|
|
454
777
|
/** type → minimap color */
|
|
455
|
-
exports.NODE_COLORS = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map(n => [n.type, n.color]));
|
|
778
|
+
exports.NODE_COLORS = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map((n) => [n.type, n.color]));
|
|
456
779
|
/** type → [stateKey, allStateKey] */
|
|
457
|
-
exports.NODE_STATE_KEYS = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map(n => [
|
|
780
|
+
exports.NODE_STATE_KEYS = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map((n) => [
|
|
781
|
+
n.type,
|
|
782
|
+
[n.stateKey, n.allStateKey],
|
|
783
|
+
]));
|
|
458
784
|
/** prefix → type */
|
|
459
|
-
exports.PREFIX_TO_NODE_TYPE = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map(n => [n.prefix, n.type]));
|
|
785
|
+
exports.PREFIX_TO_NODE_TYPE = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map((n) => [n.prefix, n.type]));
|
|
460
786
|
/** type → prefix */
|
|
461
|
-
exports.NODE_TYPE_TO_PREFIX = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map(n => [n.type, n.prefix]));
|
|
787
|
+
exports.NODE_TYPE_TO_PREFIX = Object.fromEntries(Object.values(exports.NODE_REGISTRY).map((n) => [n.type, n.prefix]));
|
|
462
788
|
function specsFor(type, catalog) {
|
|
463
789
|
return catalog[type]?.versions;
|
|
464
790
|
}
|
|
@@ -478,7 +804,7 @@ function versionsOf(type, catalog = exports.NODE_REGISTRY) {
|
|
|
478
804
|
}
|
|
479
805
|
/** One version's spec, or undefined when the type or the number is unknown. */
|
|
480
806
|
function versionSpec(type, v, catalog = exports.NODE_REGISTRY) {
|
|
481
|
-
return specsFor(type, catalog)?.find(s => s.v === v);
|
|
807
|
+
return specsFor(type, catalog)?.find((s) => s.v === v);
|
|
482
808
|
}
|
|
483
809
|
/**
|
|
484
810
|
* The version a new node of this type is born on.
|
|
@@ -489,7 +815,7 @@ function versionSpec(type, v, catalog = exports.NODE_REGISTRY) {
|
|
|
489
815
|
* is not a convention — it is the truth.
|
|
490
816
|
*/
|
|
491
817
|
function currentVersion(type, catalog = exports.NODE_REGISTRY) {
|
|
492
|
-
const current = specsFor(type, catalog)?.find(s => s.status ===
|
|
818
|
+
const current = specsFor(type, catalog)?.find((s) => s.status === "current");
|
|
493
819
|
return current?.v ?? 1;
|
|
494
820
|
}
|
|
495
821
|
/**
|
|
@@ -527,7 +853,7 @@ function fieldsLost(from, to) {
|
|
|
527
853
|
if (to.cleanBreak)
|
|
528
854
|
return [...from.fields];
|
|
529
855
|
const kept = new Set(to.fields);
|
|
530
|
-
return from.fields.filter(f => !kept.has(f));
|
|
856
|
+
return from.fields.filter((f) => !kept.has(f));
|
|
531
857
|
}
|
|
532
858
|
/**
|
|
533
859
|
* Declaration mistakes in the version catalogs, as readable lines.
|
|
@@ -547,18 +873,22 @@ function versionCatalogErrors(catalog = exports.NODE_REGISTRY) {
|
|
|
547
873
|
errors.push(`${entry.type}: declares an empty versions array — omit the field instead`);
|
|
548
874
|
continue;
|
|
549
875
|
}
|
|
550
|
-
const numbers = versions.map(s => s.v);
|
|
551
|
-
const repeatedNumbers = [
|
|
876
|
+
const numbers = versions.map((s) => s.v);
|
|
877
|
+
const repeatedNumbers = [
|
|
878
|
+
...new Set(numbers.filter((n, i) => numbers.indexOf(n) !== i)),
|
|
879
|
+
];
|
|
552
880
|
if (repeatedNumbers.length)
|
|
553
|
-
errors.push(`${entry.type}: repeated version number ${repeatedNumbers.join(
|
|
881
|
+
errors.push(`${entry.type}: repeated version number ${repeatedNumbers.join(", ")}`);
|
|
554
882
|
for (const spec of versions) {
|
|
555
883
|
if (!Number.isInteger(spec.v) || spec.v < 1)
|
|
556
884
|
errors.push(`${entry.type}: version "${spec.v}" is not a positive integer`);
|
|
557
|
-
const repeatedFields = [
|
|
885
|
+
const repeatedFields = [
|
|
886
|
+
...new Set(spec.fields.filter((f, i) => spec.fields.indexOf(f) !== i)),
|
|
887
|
+
];
|
|
558
888
|
if (repeatedFields.length)
|
|
559
|
-
errors.push(`${entry.type} v${spec.v}: repeated field ${repeatedFields.join(
|
|
889
|
+
errors.push(`${entry.type} v${spec.v}: repeated field ${repeatedFields.join(", ")}`);
|
|
560
890
|
}
|
|
561
|
-
const current = versions.filter(s => s.status ===
|
|
891
|
+
const current = versions.filter((s) => s.status === "current");
|
|
562
892
|
if (current.length !== 1)
|
|
563
893
|
errors.push(`${entry.type}: needs exactly one version with status "current", found ${current.length}`);
|
|
564
894
|
}
|