0nmcp 2.9.0 → 2.9.2

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.
@@ -0,0 +1,700 @@
1
+ /**
2
+ * 0nMCP — Universal Capability Routing System
3
+ * Patent Pending: Universal Capability Routing & Field Resolution
4
+ *
5
+ * Instead of: "send email via SendGrid"
6
+ * You write: {{email.send}} → resolves to user's configured email provider
7
+ *
8
+ * The .0n file defines WHAT to do.
9
+ * The user's account defines HOW.
10
+ */
11
+
12
+ export const CAPABILITIES = {
13
+
14
+ // ══════════════════════════════════════════════════
15
+ // EMAIL
16
+ // ══════════════════════════════════════════════════
17
+ 'email.send': {
18
+ name: 'Send Email',
19
+ variable: '{{email.send}}',
20
+ description: 'Send a transactional or marketing email',
21
+ providers: ['crm', 'sendgrid', 'gmail', 'resend', 'postmark', 'mailgun', 'brevo', 'mailchimp'],
22
+ defaultProvider: 'crm',
23
+ inputSchema: { to: 'string', subject: 'string', body: 'string', from: 'string?', replyTo: 'string?' },
24
+ providerMap: {
25
+ crm: { tool: 'crm_send_email', mapFields: { contactId: '{{resolve.contactId}}', subject: '{{subject}}', body: '{{body}}' } },
26
+ sendgrid: { tool: 'sendgrid_send_email', mapFields: { to: '{{to}}', subject: '{{subject}}', body: '{{body}}' } },
27
+ gmail: { tool: 'gmail_send_email', mapFields: { to: '{{to}}', subject: '{{subject}}', body: '{{body}}' } },
28
+ resend: { tool: 'resend_send_email', mapFields: { to: '{{to}}', subject: '{{subject}}', html: '{{body}}' } },
29
+ postmark: { tool: 'postmark_send_email', mapFields: { To: '{{to}}', Subject: '{{subject}}', HtmlBody: '{{body}}' } },
30
+ mailgun: { tool: 'mailgun_send_message', mapFields: { to: '{{to}}', subject: '{{subject}}', html: '{{body}}' } },
31
+ brevo: { tool: 'brevo_send_transactional', mapFields: { to: [{ email: '{{to}}' }], subject: '{{subject}}', htmlContent: '{{body}}' } },
32
+ },
33
+ },
34
+
35
+ 'email.list_templates': {
36
+ name: 'List Email Templates',
37
+ variable: '{{email.list_templates}}',
38
+ description: 'List available email templates',
39
+ providers: ['crm', 'sendgrid', 'mailchimp', 'postmark'],
40
+ defaultProvider: 'crm',
41
+ },
42
+
43
+ 'email.add_contact': {
44
+ name: 'Add to Email List',
45
+ variable: '{{email.add_contact}}',
46
+ description: 'Add a contact to an email list or audience',
47
+ providers: ['sendgrid', 'mailchimp', 'convertkit', 'activecampaign', 'brevo'],
48
+ defaultProvider: 'mailchimp',
49
+ inputSchema: { email: 'string', firstName: 'string?', lastName: 'string?', listId: 'string?' },
50
+ },
51
+
52
+ // ══════════════════════════════════════════════════
53
+ // SMS / MESSAGING
54
+ // ══════════════════════════════════════════════════
55
+ 'sms.send': {
56
+ name: 'Send SMS',
57
+ variable: '{{sms.send}}',
58
+ description: 'Send a text message',
59
+ providers: ['crm', 'twilio', 'whatsapp'],
60
+ defaultProvider: 'crm',
61
+ inputSchema: { to: 'string', message: 'string' },
62
+ providerMap: {
63
+ crm: { tool: 'crm_send_sms', mapFields: { contactId: '{{resolve.contactId}}', message: '{{message}}' } },
64
+ twilio: { tool: 'twilio_send_sms', mapFields: { to: '{{to}}', body: '{{message}}' } },
65
+ },
66
+ },
67
+
68
+ 'message.send': {
69
+ name: 'Send Message',
70
+ variable: '{{message.send}}',
71
+ description: 'Send a message to a channel or chat',
72
+ providers: ['slack', 'discord', 'telegram', 'whatsapp'],
73
+ defaultProvider: 'slack',
74
+ inputSchema: { channel: 'string', text: 'string' },
75
+ providerMap: {
76
+ slack: { tool: 'slack_send_message', mapFields: { channel: '{{channel}}', text: '{{text}}' } },
77
+ discord: { tool: 'discord_send_message', mapFields: { channelId: '{{channel}}', content: '{{text}}' } },
78
+ telegram: { tool: 'telegram_send_message', mapFields: { chat_id: '{{channel}}', text: '{{text}}' } },
79
+ },
80
+ },
81
+
82
+ // ══════════════════════════════════════════════════
83
+ // CONTACTS / CRM
84
+ // ══════════════════════════════════════════════════
85
+ 'contact.create': {
86
+ name: 'Create Contact',
87
+ variable: '{{contact.create}}',
88
+ description: 'Create a new contact/lead in the CRM',
89
+ providers: ['crm', 'hubspot', 'pipedrive', 'activecampaign', 'intercom'],
90
+ defaultProvider: 'crm',
91
+ inputSchema: { email: 'string', firstName: 'string?', lastName: 'string?', phone: 'string?', company: 'string?', tags: 'array?' },
92
+ },
93
+
94
+ 'contact.search': {
95
+ name: 'Search Contacts',
96
+ variable: '{{contact.search}}',
97
+ description: 'Search for contacts by name, email, or phone',
98
+ providers: ['crm', 'hubspot', 'pipedrive', 'activecampaign'],
99
+ defaultProvider: 'crm',
100
+ inputSchema: { query: 'string' },
101
+ },
102
+
103
+ 'contact.tag': {
104
+ name: 'Tag Contact',
105
+ variable: '{{contact.tag}}',
106
+ description: 'Add tags to a contact for segmentation',
107
+ providers: ['crm', 'activecampaign', 'convertkit', 'hubspot'],
108
+ defaultProvider: 'crm',
109
+ inputSchema: { contactId: 'string', tags: 'array' },
110
+ },
111
+
112
+ // ══════════════════════════════════════════════════
113
+ // CALENDAR / BOOKING
114
+ // ══════════════════════════════════════════════════
115
+ 'calendar.book': {
116
+ name: 'Book Appointment',
117
+ variable: '{{calendar.book}}',
118
+ description: 'Book a calendar appointment or meeting',
119
+ providers: ['crm', 'google_calendar', 'calendly', 'zoom'],
120
+ defaultProvider: 'crm',
121
+ inputSchema: { contactId: 'string?', startTime: 'string', endTime: 'string?', title: 'string', attendees: 'array?' },
122
+ },
123
+
124
+ 'calendar.list': {
125
+ name: 'List Events',
126
+ variable: '{{calendar.list}}',
127
+ description: 'List upcoming calendar events',
128
+ providers: ['crm', 'google_calendar', 'calendly'],
129
+ defaultProvider: 'crm',
130
+ inputSchema: { maxResults: 'number?' },
131
+ },
132
+
133
+ 'meeting.create': {
134
+ name: 'Create Video Meeting',
135
+ variable: '{{meeting.create}}',
136
+ description: 'Create a video meeting room',
137
+ providers: ['zoom', 'google_calendar'],
138
+ defaultProvider: 'zoom',
139
+ inputSchema: { topic: 'string', startTime: 'string', duration: 'number?' },
140
+ },
141
+
142
+ // ══════════════════════════════════════════════════
143
+ // PAYMENTS / INVOICING
144
+ // ══════════════════════════════════════════════════
145
+ 'payment.create_customer': {
146
+ name: 'Create Payment Customer',
147
+ variable: '{{payment.create_customer}}',
148
+ description: 'Create a customer in the payment system',
149
+ providers: ['stripe', 'square', 'quickbooks', 'xero'],
150
+ defaultProvider: 'stripe',
151
+ inputSchema: { email: 'string', name: 'string?' },
152
+ },
153
+
154
+ 'payment.create_invoice': {
155
+ name: 'Create Invoice',
156
+ variable: '{{payment.create_invoice}}',
157
+ description: 'Create and send an invoice',
158
+ providers: ['stripe', 'square', 'quickbooks', 'xero', 'wave'],
159
+ defaultProvider: 'stripe',
160
+ inputSchema: { customer: 'string', amount: 'number', description: 'string?' },
161
+ },
162
+
163
+ 'payment.create_checkout': {
164
+ name: 'Create Checkout',
165
+ variable: '{{payment.create_checkout}}',
166
+ description: 'Create a payment checkout session',
167
+ providers: ['stripe', 'square'],
168
+ defaultProvider: 'stripe',
169
+ inputSchema: { priceId: 'string', successUrl: 'string?', cancelUrl: 'string?' },
170
+ },
171
+
172
+ 'payment.list_transactions': {
173
+ name: 'List Transactions',
174
+ variable: '{{payment.list_transactions}}',
175
+ description: 'List recent payment transactions',
176
+ providers: ['stripe', 'square', 'quickbooks'],
177
+ defaultProvider: 'stripe',
178
+ inputSchema: { limit: 'number?' },
179
+ },
180
+
181
+ // ══════════════════════════════════════════════════
182
+ // SOCIAL MEDIA
183
+ // ══════════════════════════════════════════════════
184
+ 'social.post': {
185
+ name: 'Create Social Post',
186
+ variable: '{{social.post}}',
187
+ description: 'Post to social media',
188
+ providers: ['crm', 'linkedin', 'twitter', 'instagram', 'facebook_ads', 'pinterest', 'tiktok', 'reddit'],
189
+ defaultProvider: 'crm',
190
+ inputSchema: { text: 'string', platform: 'string?', imageUrl: 'string?' },
191
+ },
192
+
193
+ 'social.get_analytics': {
194
+ name: 'Get Social Analytics',
195
+ variable: '{{social.get_analytics}}',
196
+ description: 'Get social media performance metrics',
197
+ providers: ['crm', 'linkedin', 'twitter', 'instagram', 'youtube', 'pinterest'],
198
+ defaultProvider: 'crm',
199
+ inputSchema: { platform: 'string?', dateRange: 'string?' },
200
+ },
201
+
202
+ // ══════════════════════════════════════════════════
203
+ // ADVERTISING
204
+ // ══════════════════════════════════════════════════
205
+ 'ads.create_campaign': {
206
+ name: 'Create Ad Campaign',
207
+ variable: '{{ads.create_campaign}}',
208
+ description: 'Create an advertising campaign',
209
+ providers: ['google_ads', 'facebook_ads', 'linkedin_ads', 'tiktok_ads', 'twitter', 'x_ads', 'pinterest'],
210
+ defaultProvider: 'facebook_ads',
211
+ inputSchema: { name: 'string', budget: 'number', objective: 'string?' },
212
+ },
213
+
214
+ 'ads.get_performance': {
215
+ name: 'Get Ad Performance',
216
+ variable: '{{ads.get_performance}}',
217
+ description: 'Get advertising campaign metrics',
218
+ providers: ['google_ads', 'facebook_ads', 'linkedin_ads', 'tiktok_ads'],
219
+ defaultProvider: 'facebook_ads',
220
+ inputSchema: { campaignId: 'string?', dateRange: 'string?' },
221
+ },
222
+
223
+ // ══════════════════════════════════════════════════
224
+ // PROJECT MANAGEMENT
225
+ // ══════════════════════════════════════════════════
226
+ 'project.create_task': {
227
+ name: 'Create Task',
228
+ variable: '{{project.create_task}}',
229
+ description: 'Create a task or issue',
230
+ providers: ['crm', 'asana', 'trello', 'monday', 'linear', 'jira', 'notion'],
231
+ defaultProvider: 'crm',
232
+ inputSchema: { title: 'string', description: 'string?', assignee: 'string?', dueDate: 'string?', priority: 'string?' },
233
+ },
234
+
235
+ 'project.list_tasks': {
236
+ name: 'List Tasks',
237
+ variable: '{{project.list_tasks}}',
238
+ description: 'List tasks from a project',
239
+ providers: ['crm', 'asana', 'trello', 'monday', 'linear', 'jira'],
240
+ defaultProvider: 'crm',
241
+ inputSchema: { projectId: 'string?', status: 'string?' },
242
+ },
243
+
244
+ 'project.create_issue': {
245
+ name: 'Create Issue',
246
+ variable: '{{project.create_issue}}',
247
+ description: 'Create a bug report or feature request',
248
+ providers: ['github', 'jira', 'linear'],
249
+ defaultProvider: 'github',
250
+ inputSchema: { title: 'string', body: 'string?', labels: 'array?', assignee: 'string?' },
251
+ },
252
+
253
+ // ══════════════════════════════════════════════════
254
+ // STORAGE / FILES
255
+ // ══════════════════════════════════════════════════
256
+ 'storage.upload': {
257
+ name: 'Upload File',
258
+ variable: '{{storage.upload}}',
259
+ description: 'Upload a file to cloud storage',
260
+ providers: ['google_drive', 'dropbox', 'supabase', 'aws'],
261
+ defaultProvider: 'google_drive',
262
+ inputSchema: { fileName: 'string', content: 'string', folder: 'string?' },
263
+ },
264
+
265
+ 'storage.list': {
266
+ name: 'List Files',
267
+ variable: '{{storage.list}}',
268
+ description: 'List files in cloud storage',
269
+ providers: ['google_drive', 'dropbox', 'supabase', 'aws'],
270
+ defaultProvider: 'google_drive',
271
+ inputSchema: { folder: 'string?', limit: 'number?' },
272
+ },
273
+
274
+ // ══════════════════════════════════════════════════
275
+ // DATABASE
276
+ // ══════════════════════════════════════════════════
277
+ 'db.query': {
278
+ name: 'Query Database',
279
+ variable: '{{db.query}}',
280
+ description: 'Query data from a database',
281
+ providers: ['supabase', 'mongodb', 'airtable', 'google_sheets', 'neon', 'planetscale', 'turso', 'cockroachdb'],
282
+ defaultProvider: 'supabase',
283
+ inputSchema: { table: 'string', filter: 'object?', select: 'string?', limit: 'number?' },
284
+ },
285
+
286
+ 'db.insert': {
287
+ name: 'Insert Record',
288
+ variable: '{{db.insert}}',
289
+ description: 'Insert a record into a database',
290
+ providers: ['supabase', 'mongodb', 'airtable', 'google_sheets', 'notion'],
291
+ defaultProvider: 'supabase',
292
+ inputSchema: { table: 'string', data: 'object' },
293
+ },
294
+
295
+ 'db.update': {
296
+ name: 'Update Record',
297
+ variable: '{{db.update}}',
298
+ description: 'Update records in a database',
299
+ providers: ['supabase', 'mongodb', 'airtable', 'notion'],
300
+ defaultProvider: 'supabase',
301
+ inputSchema: { table: 'string', data: 'object', match: 'object' },
302
+ },
303
+
304
+ // ══════════════════════════════════════════════════
305
+ // SPREADSHEETS
306
+ // ══════════════════════════════════════════════════
307
+ 'spreadsheet.read': {
308
+ name: 'Read Spreadsheet',
309
+ variable: '{{spreadsheet.read}}',
310
+ description: 'Read data from a spreadsheet',
311
+ providers: ['google_sheets', 'airtable', 'notion'],
312
+ defaultProvider: 'google_sheets',
313
+ inputSchema: { spreadsheetId: 'string', range: 'string' },
314
+ },
315
+
316
+ 'spreadsheet.write': {
317
+ name: 'Write to Spreadsheet',
318
+ variable: '{{spreadsheet.write}}',
319
+ description: 'Write data to a spreadsheet',
320
+ providers: ['google_sheets', 'airtable', 'notion'],
321
+ defaultProvider: 'google_sheets',
322
+ inputSchema: { spreadsheetId: 'string', range: 'string', values: 'array' },
323
+ },
324
+
325
+ // ══════════════════════════════════════════════════
326
+ // SUPPORT / TICKETING
327
+ // ══════════════════════════════════════════════════
328
+ 'support.create_ticket': {
329
+ name: 'Create Support Ticket',
330
+ variable: '{{support.create_ticket}}',
331
+ description: 'Create a support ticket or help desk issue',
332
+ providers: ['zendesk', 'freshdesk', 'intercom', 'jira', 'crm'],
333
+ defaultProvider: 'crm',
334
+ inputSchema: { subject: 'string', description: 'string', priority: 'string?', contactEmail: 'string?' },
335
+ },
336
+
337
+ 'support.list_tickets': {
338
+ name: 'List Support Tickets',
339
+ variable: '{{support.list_tickets}}',
340
+ description: 'List open support tickets',
341
+ providers: ['zendesk', 'freshdesk', 'intercom', 'jira'],
342
+ defaultProvider: 'zendesk',
343
+ inputSchema: { status: 'string?', limit: 'number?' },
344
+ },
345
+
346
+ // ══════════════════════════════════════════════════
347
+ // E-COMMERCE
348
+ // ══════════════════════════════════════════════════
349
+ 'shop.list_products': {
350
+ name: 'List Products',
351
+ variable: '{{shop.list_products}}',
352
+ description: 'List products from an e-commerce store',
353
+ providers: ['shopify', 'woocommerce', 'bigcommerce', 'square'],
354
+ defaultProvider: 'shopify',
355
+ inputSchema: { limit: 'number?' },
356
+ },
357
+
358
+ 'shop.create_product': {
359
+ name: 'Create Product',
360
+ variable: '{{shop.create_product}}',
361
+ description: 'Create a product in an e-commerce store',
362
+ providers: ['shopify', 'woocommerce', 'bigcommerce', 'stripe'],
363
+ defaultProvider: 'shopify',
364
+ inputSchema: { title: 'string', price: 'number', description: 'string?' },
365
+ },
366
+
367
+ 'shop.list_orders': {
368
+ name: 'List Orders',
369
+ variable: '{{shop.list_orders}}',
370
+ description: 'List recent orders',
371
+ providers: ['shopify', 'woocommerce', 'bigcommerce', 'square'],
372
+ defaultProvider: 'shopify',
373
+ inputSchema: { limit: 'number?', status: 'string?' },
374
+ },
375
+
376
+ // ══════════════════════════════════════════════════
377
+ // DESIGN
378
+ // ══════════════════════════════════════════════════
379
+ 'design.get_file': {
380
+ name: 'Get Design File',
381
+ variable: '{{design.get_file}}',
382
+ description: 'Read a design file',
383
+ providers: ['figma'],
384
+ defaultProvider: 'figma',
385
+ inputSchema: { fileKey: 'string' },
386
+ },
387
+
388
+ 'design.export': {
389
+ name: 'Export Design',
390
+ variable: '{{design.export}}',
391
+ description: 'Export design frames as images',
392
+ providers: ['figma'],
393
+ defaultProvider: 'figma',
394
+ inputSchema: { fileKey: 'string', nodeIds: 'string', format: 'string?' },
395
+ },
396
+
397
+ // ══════════════════════════════════════════════════
398
+ // AI / GENERATION
399
+ // ══════════════════════════════════════════════════
400
+ 'ai.generate_text': {
401
+ name: 'Generate Text',
402
+ variable: '{{ai.generate_text}}',
403
+ description: 'Generate text using AI',
404
+ providers: ['groq', 'openai', 'anthropic', 'mistral', 'cohere', 'ollama', 'replicate', 'deepseek'],
405
+ defaultProvider: 'groq',
406
+ inputSchema: { prompt: 'string', model: 'string?', maxTokens: 'number?' },
407
+ },
408
+
409
+ 'ai.generate_image': {
410
+ name: 'Generate Image',
411
+ variable: '{{ai.generate_image}}',
412
+ description: 'Generate an image using AI',
413
+ providers: ['openai', 'stability', 'replicate'],
414
+ defaultProvider: 'openai',
415
+ inputSchema: { prompt: 'string', size: 'string?' },
416
+ },
417
+
418
+ 'ai.generate_audio': {
419
+ name: 'Generate Audio',
420
+ variable: '{{ai.generate_audio}}',
421
+ description: 'Generate speech from text',
422
+ providers: ['elevenlabs', 'openai'],
423
+ defaultProvider: 'elevenlabs',
424
+ inputSchema: { text: 'string', voiceId: 'string?' },
425
+ },
426
+
427
+ 'ai.transcribe': {
428
+ name: 'Transcribe Audio',
429
+ variable: '{{ai.transcribe}}',
430
+ description: 'Convert speech to text',
431
+ providers: ['deepgram', 'groq', 'openai'],
432
+ defaultProvider: 'deepgram',
433
+ inputSchema: { audioUrl: 'string', language: 'string?' },
434
+ },
435
+
436
+ 'ai.embed': {
437
+ name: 'Create Embedding',
438
+ variable: '{{ai.embed}}',
439
+ description: 'Create vector embeddings from text',
440
+ providers: ['openai', 'cohere', 'ollama'],
441
+ defaultProvider: 'openai',
442
+ inputSchema: { text: 'string', model: 'string?' },
443
+ },
444
+
445
+ // ══════════════════════════════════════════════════
446
+ // DOCUMENTS / SIGNING
447
+ // ══════════════════════════════════════════════════
448
+ 'document.sign': {
449
+ name: 'Send for Signature',
450
+ variable: '{{document.sign}}',
451
+ description: 'Send a document for e-signature',
452
+ providers: ['docusign'],
453
+ defaultProvider: 'docusign',
454
+ inputSchema: { subject: 'string', recipients: 'array', documentUrl: 'string?' },
455
+ },
456
+
457
+ // ══════════════════════════════════════════════════
458
+ // WEBSITE / CMS
459
+ // ══════════════════════════════════════════════════
460
+ 'cms.create_post': {
461
+ name: 'Create Blog Post',
462
+ variable: '{{cms.create_post}}',
463
+ description: 'Create a blog post or page',
464
+ providers: ['crm', 'wordpress', 'webflow', 'notion'],
465
+ defaultProvider: 'crm',
466
+ inputSchema: { title: 'string', content: 'string', status: 'string?' },
467
+ },
468
+
469
+ 'cms.publish': {
470
+ name: 'Publish Site',
471
+ variable: '{{cms.publish}}',
472
+ description: 'Publish or deploy a website',
473
+ providers: ['webflow', 'netlify'],
474
+ defaultProvider: 'webflow',
475
+ inputSchema: { siteId: 'string' },
476
+ },
477
+
478
+ // ══════════════════════════════════════════════════
479
+ // DOMAINS / DNS
480
+ // ══════════════════════════════════════════════════
481
+ 'domain.search': {
482
+ name: 'Search Domains',
483
+ variable: '{{domain.search}}',
484
+ description: 'Search for available domain names',
485
+ providers: ['godaddy', 'cloudflare'],
486
+ defaultProvider: 'godaddy',
487
+ inputSchema: { query: 'string' },
488
+ },
489
+
490
+ 'domain.manage_dns': {
491
+ name: 'Manage DNS',
492
+ variable: '{{domain.manage_dns}}',
493
+ description: 'Create or update DNS records',
494
+ providers: ['cloudflare', 'godaddy'],
495
+ defaultProvider: 'cloudflare',
496
+ inputSchema: { domain: 'string', type: 'string', name: 'string', content: 'string' },
497
+ },
498
+
499
+ // ══════════════════════════════════════════════════
500
+ // COLD EMAIL / OUTREACH
501
+ // ══════════════════════════════════════════════════
502
+ 'outreach.add_lead': {
503
+ name: 'Add Outreach Lead',
504
+ variable: '{{outreach.add_lead}}',
505
+ description: 'Add a lead to a cold email campaign',
506
+ providers: ['smartlead', 'lemlist'],
507
+ defaultProvider: 'smartlead',
508
+ inputSchema: { email: 'string', firstName: 'string?', campaignId: 'string' },
509
+ },
510
+
511
+ // ══════════════════════════════════════════════════
512
+ // FORMS / DATA COLLECTION
513
+ // ══════════════════════════════════════════════════
514
+ 'form.get_responses': {
515
+ name: 'Get Form Responses',
516
+ variable: '{{form.get_responses}}',
517
+ description: 'Get responses from a form',
518
+ providers: ['typeform', 'crm', 'google_sheets'],
519
+ defaultProvider: 'typeform',
520
+ inputSchema: { formId: 'string' },
521
+ },
522
+
523
+ // ══════════════════════════════════════════════════
524
+ // EDUCATION / COURSES
525
+ // ══════════════════════════════════════════════════
526
+ 'course.create': {
527
+ name: 'Create Course',
528
+ variable: '{{course.create}}',
529
+ description: 'Create a course with modules and lessons',
530
+ providers: ['crm'],
531
+ defaultProvider: 'crm',
532
+ inputSchema: { title: 'string', description: 'string?', modules: 'array' },
533
+ },
534
+
535
+ // ══════════════════════════════════════════════════
536
+ // SXO / SEO
537
+ // ══════════════════════════════════════════════════
538
+ 'sxo.scan': {
539
+ name: 'SXO Domain Scan',
540
+ variable: '{{sxo.scan}}',
541
+ description: 'Scan a domain for SXO/SEO/AI readiness score',
542
+ providers: ['sxo'],
543
+ defaultProvider: 'sxo',
544
+ inputSchema: { url: 'string' },
545
+ },
546
+
547
+ // ══════════════════════════════════════════════════
548
+ // PIPELINE / SALES
549
+ // ══════════════════════════════════════════════════
550
+ 'pipeline.create_deal': {
551
+ name: 'Create Deal',
552
+ variable: '{{pipeline.create_deal}}',
553
+ description: 'Create a deal/opportunity in the sales pipeline',
554
+ providers: ['crm', 'hubspot', 'pipedrive'],
555
+ defaultProvider: 'crm',
556
+ inputSchema: { name: 'string', value: 'number?', stage: 'string?', contactId: 'string?' },
557
+ },
558
+
559
+ 'pipeline.move_stage': {
560
+ name: 'Move Deal Stage',
561
+ variable: '{{pipeline.move_stage}}',
562
+ description: 'Move a deal to a different pipeline stage',
563
+ providers: ['crm', 'hubspot', 'pipedrive'],
564
+ defaultProvider: 'crm',
565
+ inputSchema: { dealId: 'string', stageId: 'string' },
566
+ },
567
+
568
+ // ══════════════════════════════════════════════════
569
+ // VOICE / PHONE
570
+ // ══════════════════════════════════════════════════
571
+ 'voice.call': {
572
+ name: 'Make Phone Call',
573
+ variable: '{{voice.call}}',
574
+ description: 'Initiate a phone call',
575
+ providers: ['twilio', 'crm'],
576
+ defaultProvider: 'twilio',
577
+ inputSchema: { to: 'string', from: 'string?', message: 'string?' },
578
+ },
579
+
580
+ 'voice.tts': {
581
+ name: 'Text to Speech',
582
+ variable: '{{voice.tts}}',
583
+ description: 'Convert text to natural speech audio',
584
+ providers: ['elevenlabs', 'openai'],
585
+ defaultProvider: 'elevenlabs',
586
+ inputSchema: { text: 'string', voiceId: 'string?' },
587
+ },
588
+
589
+ 'voice.transcribe': {
590
+ name: 'Transcribe Audio',
591
+ variable: '{{voice.transcribe}}',
592
+ description: 'Convert audio/speech to text',
593
+ providers: ['deepgram', 'groq', 'openai'],
594
+ defaultProvider: 'deepgram',
595
+ inputSchema: { audioUrl: 'string' },
596
+ },
597
+
598
+ // ══════════════════════════════════════════════════
599
+ // ACCOUNTING
600
+ // ══════════════════════════════════════════════════
601
+ 'accounting.create_invoice': {
602
+ name: 'Create Accounting Invoice',
603
+ variable: '{{accounting.create_invoice}}',
604
+ description: 'Create an invoice in the accounting system',
605
+ providers: ['quickbooks', 'xero', 'wave'],
606
+ defaultProvider: 'quickbooks',
607
+ inputSchema: { customer: 'string', lineItems: 'array', dueDate: 'string?' },
608
+ },
609
+
610
+ 'accounting.list_invoices': {
611
+ name: 'List Accounting Invoices',
612
+ variable: '{{accounting.list_invoices}}',
613
+ description: 'List invoices from accounting',
614
+ providers: ['quickbooks', 'xero'],
615
+ defaultProvider: 'quickbooks',
616
+ inputSchema: { limit: 'number?', status: 'string?' },
617
+ },
618
+
619
+ // ══════════════════════════════════════════════════
620
+ // AUTOMATION / WORKFLOWS
621
+ // ══════════════════════════════════════════════════
622
+ 'automation.trigger': {
623
+ name: 'Trigger Automation',
624
+ variable: '{{automation.trigger}}',
625
+ description: 'Trigger an automation workflow',
626
+ providers: ['crm', 'zapier', 'make', 'n8n', 'pabbly'],
627
+ defaultProvider: 'crm',
628
+ inputSchema: { workflowId: 'string?', data: 'object?' },
629
+ },
630
+
631
+ // ══════════════════════════════════════════════════
632
+ // DEPLOYMENT / HOSTING
633
+ // ══════════════════════════════════════════════════
634
+ 'deploy.site': {
635
+ name: 'Deploy Website',
636
+ variable: '{{deploy.site}}',
637
+ description: 'Deploy or publish a website',
638
+ providers: ['netlify', 'cloudflare', 'render', 'railway'],
639
+ defaultProvider: 'netlify',
640
+ inputSchema: { siteId: 'string' },
641
+ },
642
+
643
+ // ══════════════════════════════════════════════════
644
+ // VIDEO
645
+ // ══════════════════════════════════════════════════
646
+ 'video.get': {
647
+ name: 'Get Video',
648
+ variable: '{{video.get}}',
649
+ description: 'Get video details or recording',
650
+ providers: ['youtube', 'loom', 'twitch'],
651
+ defaultProvider: 'youtube',
652
+ inputSchema: { videoId: 'string' },
653
+ },
654
+ }
655
+
656
+ /**
657
+ * Resolve a capability to the user's configured provider
658
+ */
659
+ export function resolveCapability(capabilityId, userConfig = {}) {
660
+ const cap = CAPABILITIES[capabilityId]
661
+ if (!cap) return null
662
+
663
+ // Check user's preferred provider for this capability
664
+ const preferredProvider = userConfig[capabilityId] || userConfig[capabilityId.split('.')[0]] || cap.defaultProvider
665
+
666
+ // Verify the provider is in the allowed list
667
+ if (cap.providers.includes(preferredProvider)) {
668
+ return { capability: cap, provider: preferredProvider, tool: cap.providerMap?.[preferredProvider]?.tool }
669
+ }
670
+
671
+ // Fallback to default
672
+ return { capability: cap, provider: cap.defaultProvider, tool: cap.providerMap?.[cap.defaultProvider]?.tool }
673
+ }
674
+
675
+ /**
676
+ * List all capabilities
677
+ */
678
+ export function listCapabilities() {
679
+ return Object.entries(CAPABILITIES).map(([id, cap]) => ({
680
+ id,
681
+ variable: cap.variable,
682
+ name: cap.name,
683
+ description: cap.description,
684
+ providers: cap.providers,
685
+ defaultProvider: cap.defaultProvider,
686
+ }))
687
+ }
688
+
689
+ /**
690
+ * Get capabilities by category
691
+ */
692
+ export function getCapabilitiesByCategory() {
693
+ const categories = {}
694
+ for (const [id, cap] of Object.entries(CAPABILITIES)) {
695
+ const category = id.split('.')[0]
696
+ if (!categories[category]) categories[category] = []
697
+ categories[category].push({ id, ...cap })
698
+ }
699
+ return categories
700
+ }