@contractspec/bundle.library 2.9.1 → 3.0.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/.turbo/turbo-build.log +129 -115
- package/CHANGELOG.md +38 -0
- package/dist/components/docs/DocsIndexPage.js +1 -1
- package/dist/components/docs/architecture/ArchitectureControlPlanePage.d.ts +1 -0
- package/dist/components/docs/architecture/ArchitectureControlPlanePage.js +204 -0
- package/dist/components/docs/architecture/ArchitectureOverviewPage.js +17 -1
- package/dist/components/docs/architecture/index.d.ts +1 -0
- package/dist/components/docs/architecture/index.js +507 -289
- package/dist/components/docs/ecosystem/IntegrationsPage.js +6 -3
- package/dist/components/docs/ecosystem/PluginsPage.js +98 -98
- package/dist/components/docs/ecosystem/RegistryPage.js +39 -42
- package/dist/components/docs/ecosystem/TemplatesPage.js +26 -21
- package/dist/components/docs/ecosystem/ecosystem.docblocks.js +10 -10
- package/dist/components/docs/ecosystem/index.js +179 -174
- package/dist/components/docs/index.js +6795 -5376
- package/dist/components/docs/integrations/IntegrationsElevenLabsPage.js +2 -2
- package/dist/components/docs/integrations/IntegrationsGithubPage.d.ts +1 -0
- package/dist/components/docs/integrations/IntegrationsGithubPage.js +155 -0
- package/dist/components/docs/integrations/IntegrationsHealthRoutingPage.d.ts +1 -0
- package/dist/components/docs/integrations/IntegrationsHealthRoutingPage.js +168 -0
- package/dist/components/docs/integrations/IntegrationsMistralPage.d.ts +1 -0
- package/dist/components/docs/integrations/IntegrationsMistralPage.js +203 -0
- package/dist/components/docs/integrations/IntegrationsOpenAIPage.js +2 -2
- package/dist/components/docs/integrations/IntegrationsOverviewPage.js +136 -9
- package/dist/components/docs/integrations/IntegrationsSlackPage.d.ts +1 -0
- package/dist/components/docs/integrations/IntegrationsSlackPage.js +161 -0
- package/dist/components/docs/integrations/IntegrationsSpecModelPage.js +72 -0
- package/dist/components/docs/integrations/IntegrationsTwilioPage.js +2 -2
- package/dist/components/docs/integrations/IntegrationsWhatsappMetaPage.d.ts +1 -0
- package/dist/components/docs/integrations/IntegrationsWhatsappMetaPage.js +157 -0
- package/dist/components/docs/integrations/IntegrationsWhatsappTwilioPage.d.ts +1 -0
- package/dist/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +165 -0
- package/dist/components/docs/integrations/index.d.ts +6 -0
- package/dist/components/docs/integrations/index.js +1688 -492
- package/dist/index.js +8016 -6597
- package/dist/node/components/docs/DocsIndexPage.js +1 -1
- package/dist/node/components/docs/architecture/ArchitectureControlPlanePage.js +203 -0
- package/dist/node/components/docs/architecture/ArchitectureOverviewPage.js +17 -1
- package/dist/node/components/docs/architecture/index.js +507 -289
- package/dist/node/components/docs/ecosystem/IntegrationsPage.js +6 -3
- package/dist/node/components/docs/ecosystem/PluginsPage.js +98 -98
- package/dist/node/components/docs/ecosystem/RegistryPage.js +39 -42
- package/dist/node/components/docs/ecosystem/TemplatesPage.js +26 -21
- package/dist/node/components/docs/ecosystem/ecosystem.docblocks.js +10 -10
- package/dist/node/components/docs/ecosystem/index.js +179 -174
- package/dist/node/components/docs/index.js +6795 -5376
- package/dist/node/components/docs/integrations/IntegrationsElevenLabsPage.js +2 -2
- package/dist/node/components/docs/integrations/IntegrationsGithubPage.js +154 -0
- package/dist/node/components/docs/integrations/IntegrationsHealthRoutingPage.js +167 -0
- package/dist/node/components/docs/integrations/IntegrationsMistralPage.js +202 -0
- package/dist/node/components/docs/integrations/IntegrationsOpenAIPage.js +2 -2
- package/dist/node/components/docs/integrations/IntegrationsOverviewPage.js +136 -9
- package/dist/node/components/docs/integrations/IntegrationsSlackPage.js +160 -0
- package/dist/node/components/docs/integrations/IntegrationsSpecModelPage.js +72 -0
- package/dist/node/components/docs/integrations/IntegrationsTwilioPage.js +2 -2
- package/dist/node/components/docs/integrations/IntegrationsWhatsappMetaPage.js +156 -0
- package/dist/node/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +164 -0
- package/dist/node/components/docs/integrations/index.js +1688 -492
- package/dist/node/index.js +8016 -6597
- package/package.json +104 -20
- package/src/components/docs/DocsIndexPage.tsx +2 -1
- package/src/components/docs/architecture/ArchitectureControlPlanePage.tsx +136 -0
- package/src/components/docs/architecture/ArchitectureOverviewPage.tsx +13 -1
- package/src/components/docs/architecture/index.ts +1 -0
- package/src/components/docs/ecosystem/IntegrationsPage.tsx +4 -3
- package/src/components/docs/ecosystem/PluginsPage.tsx +68 -87
- package/src/components/docs/ecosystem/RegistryPage.tsx +35 -43
- package/src/components/docs/ecosystem/TemplatesPage.tsx +28 -21
- package/src/components/docs/ecosystem/ecosystem.docblocks.ts +12 -10
- package/src/components/docs/generated/docs-index._common.json +240 -0
- package/src/components/docs/generated/docs-index.health.json +98 -0
- package/src/components/docs/generated/docs-index.manifest.json +14 -4
- package/src/components/docs/generated/docs-index.platform-integrations.json +81 -1
- package/src/components/docs/generated/docs-index.video-api-showcase.json +26 -0
- package/src/components/docs/integrations/IntegrationsElevenLabsPage.tsx +2 -2
- package/src/components/docs/integrations/IntegrationsGithubPage.tsx +90 -0
- package/src/components/docs/integrations/IntegrationsHealthRoutingPage.tsx +112 -0
- package/src/components/docs/integrations/IntegrationsMistralPage.tsx +133 -0
- package/src/components/docs/integrations/IntegrationsOpenAIPage.tsx +2 -2
- package/src/components/docs/integrations/IntegrationsOverviewPage.tsx +108 -9
- package/src/components/docs/integrations/IntegrationsSlackPage.tsx +98 -0
- package/src/components/docs/integrations/IntegrationsSpecModelPage.tsx +59 -0
- package/src/components/docs/integrations/IntegrationsTwilioPage.tsx +2 -2
- package/src/components/docs/integrations/IntegrationsWhatsappMetaPage.tsx +90 -0
- package/src/components/docs/integrations/IntegrationsWhatsappTwilioPage.tsx +92 -0
- package/src/components/docs/integrations/index.ts +6 -0
|
@@ -104,15 +104,22 @@ function IntegrationsOverviewPage() {
|
|
|
104
104
|
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
105
105
|
children: `type IntegrationCategory =
|
|
106
106
|
| "payments" // Stripe
|
|
107
|
+
| "open-banking" // Powens
|
|
107
108
|
| "email" // Postmark, Resend, Gmail
|
|
108
109
|
| "calendar" // Google Calendar
|
|
109
110
|
| "sms" // Twilio
|
|
110
|
-
| "
|
|
111
|
-
| "
|
|
112
|
-
| "
|
|
111
|
+
| "messaging" // Slack, GitHub, WhatsApp
|
|
112
|
+
| "health" // Whoop, Oura, Strava, Fitbit
|
|
113
|
+
| "ai-llm" // OpenAI, Mistral
|
|
114
|
+
| "ai-voice-tts" // ElevenLabs
|
|
115
|
+
| "ai-voice-stt" // OpenAI Whisper, Mistral Voxtral
|
|
116
|
+
| "ai-voice-conversational" // OpenAI Realtime, Mistral Voice
|
|
117
|
+
| "ai-image" // OpenAI Image, Fal
|
|
113
118
|
| "vector-db" // Qdrant
|
|
119
|
+
| "database" // Supabase Postgres
|
|
114
120
|
| "storage" // S3-compatible
|
|
115
|
-
| "
|
|
121
|
+
| "meeting-recorder" // Fireflies, tl;dv
|
|
122
|
+
| "project-management" // Linear, Jira, Notion
|
|
116
123
|
| "accounting" // Coming soon
|
|
117
124
|
| "crm" // Coming soon
|
|
118
125
|
| "helpdesk" // Coming soon
|
|
@@ -289,6 +296,20 @@ function IntegrationsOverviewPage() {
|
|
|
289
296
|
}, undefined, false, undefined, this)
|
|
290
297
|
]
|
|
291
298
|
}, undefined, true, undefined, this),
|
|
299
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
300
|
+
href: "/docs/integrations/mistral",
|
|
301
|
+
className: "card-subtle group p-4 transition-colors hover:border-violet-500/50",
|
|
302
|
+
children: [
|
|
303
|
+
/* @__PURE__ */ jsxDEV("h4", {
|
|
304
|
+
className: "font-bold transition-colors group-hover:text-violet-400",
|
|
305
|
+
children: "Mistral"
|
|
306
|
+
}, undefined, false, undefined, this),
|
|
307
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
308
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
309
|
+
children: "LLMs, embeddings, Voxtral STT, and conversational voice"
|
|
310
|
+
}, undefined, false, undefined, this)
|
|
311
|
+
]
|
|
312
|
+
}, undefined, true, undefined, this),
|
|
292
313
|
/* @__PURE__ */ jsxDEV(Link, {
|
|
293
314
|
href: "/docs/integrations/elevenlabs",
|
|
294
315
|
className: "card-subtle group p-4 transition-colors hover:border-violet-500/50",
|
|
@@ -352,7 +373,7 @@ function IntegrationsOverviewPage() {
|
|
|
352
373
|
children: [
|
|
353
374
|
/* @__PURE__ */ jsxDEV("h3", {
|
|
354
375
|
className: "text-xl font-semibold",
|
|
355
|
-
children: "SMS
|
|
376
|
+
children: "SMS"
|
|
356
377
|
}, undefined, false, undefined, this),
|
|
357
378
|
/* @__PURE__ */ jsxDEV("div", {
|
|
358
379
|
className: "grid gap-4 md:grid-cols-2",
|
|
@@ -366,7 +387,103 @@ function IntegrationsOverviewPage() {
|
|
|
366
387
|
}, undefined, false, undefined, this),
|
|
367
388
|
/* @__PURE__ */ jsxDEV("p", {
|
|
368
389
|
className: "text-muted-foreground mt-1 text-sm",
|
|
369
|
-
children: "SMS notifications and messaging"
|
|
390
|
+
children: "SMS notifications and transactional messaging"
|
|
391
|
+
}, undefined, false, undefined, this)
|
|
392
|
+
]
|
|
393
|
+
}, undefined, true, undefined, this)
|
|
394
|
+
}, undefined, false, undefined, this)
|
|
395
|
+
]
|
|
396
|
+
}, undefined, true, undefined, this),
|
|
397
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
398
|
+
className: "space-y-3",
|
|
399
|
+
children: [
|
|
400
|
+
/* @__PURE__ */ jsxDEV("h3", {
|
|
401
|
+
className: "text-xl font-semibold",
|
|
402
|
+
children: "Messaging channels"
|
|
403
|
+
}, undefined, false, undefined, this),
|
|
404
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
405
|
+
className: "grid gap-4 md:grid-cols-2",
|
|
406
|
+
children: [
|
|
407
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
408
|
+
href: "/docs/integrations/slack",
|
|
409
|
+
className: "card-subtle group p-4 transition-colors hover:border-violet-500/50",
|
|
410
|
+
children: [
|
|
411
|
+
/* @__PURE__ */ jsxDEV("h4", {
|
|
412
|
+
className: "font-bold transition-colors group-hover:text-violet-400",
|
|
413
|
+
children: "Slack"
|
|
414
|
+
}, undefined, false, undefined, this),
|
|
415
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
416
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
417
|
+
children: "Signed event ingestion and outbox-backed replies"
|
|
418
|
+
}, undefined, false, undefined, this)
|
|
419
|
+
]
|
|
420
|
+
}, undefined, true, undefined, this),
|
|
421
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
422
|
+
href: "/docs/integrations/github",
|
|
423
|
+
className: "card-subtle group p-4 transition-colors hover:border-violet-500/50",
|
|
424
|
+
children: [
|
|
425
|
+
/* @__PURE__ */ jsxDEV("h4", {
|
|
426
|
+
className: "font-bold transition-colors group-hover:text-violet-400",
|
|
427
|
+
children: "GitHub"
|
|
428
|
+
}, undefined, false, undefined, this),
|
|
429
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
430
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
431
|
+
children: "Issue and PR comment workflows with webhook verification"
|
|
432
|
+
}, undefined, false, undefined, this)
|
|
433
|
+
]
|
|
434
|
+
}, undefined, true, undefined, this),
|
|
435
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
436
|
+
href: "/docs/integrations/whatsapp-meta",
|
|
437
|
+
className: "card-subtle group p-4 transition-colors hover:border-violet-500/50",
|
|
438
|
+
children: [
|
|
439
|
+
/* @__PURE__ */ jsxDEV("h4", {
|
|
440
|
+
className: "font-bold transition-colors group-hover:text-violet-400",
|
|
441
|
+
children: "WhatsApp Meta"
|
|
442
|
+
}, undefined, false, undefined, this),
|
|
443
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
444
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
445
|
+
children: "Primary WhatsApp Business API transport for inbound and outbound"
|
|
446
|
+
}, undefined, false, undefined, this)
|
|
447
|
+
]
|
|
448
|
+
}, undefined, true, undefined, this),
|
|
449
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
450
|
+
href: "/docs/integrations/whatsapp-twilio",
|
|
451
|
+
className: "card-subtle group p-4 transition-colors hover:border-violet-500/50",
|
|
452
|
+
children: [
|
|
453
|
+
/* @__PURE__ */ jsxDEV("h4", {
|
|
454
|
+
className: "font-bold transition-colors group-hover:text-violet-400",
|
|
455
|
+
children: "WhatsApp Twilio"
|
|
456
|
+
}, undefined, false, undefined, this),
|
|
457
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
458
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
459
|
+
children: "Fallback WhatsApp route with Twilio signature validation"
|
|
460
|
+
}, undefined, false, undefined, this)
|
|
461
|
+
]
|
|
462
|
+
}, undefined, true, undefined, this)
|
|
463
|
+
]
|
|
464
|
+
}, undefined, true, undefined, this)
|
|
465
|
+
]
|
|
466
|
+
}, undefined, true, undefined, this),
|
|
467
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
468
|
+
className: "space-y-3",
|
|
469
|
+
children: [
|
|
470
|
+
/* @__PURE__ */ jsxDEV("h3", {
|
|
471
|
+
className: "text-xl font-semibold",
|
|
472
|
+
children: "Health & wearables"
|
|
473
|
+
}, undefined, false, undefined, this),
|
|
474
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
475
|
+
className: "grid gap-4 md:grid-cols-2",
|
|
476
|
+
children: /* @__PURE__ */ jsxDEV(Link, {
|
|
477
|
+
href: "/docs/integrations/health-routing",
|
|
478
|
+
className: "card-subtle group p-4 transition-colors hover:border-violet-500/50",
|
|
479
|
+
children: [
|
|
480
|
+
/* @__PURE__ */ jsxDEV("h4", {
|
|
481
|
+
className: "font-bold transition-colors group-hover:text-violet-400",
|
|
482
|
+
children: "Health routing strategy"
|
|
483
|
+
}, undefined, false, undefined, this),
|
|
484
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
485
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
486
|
+
children: "Official vs aggregator transport order, unofficial gating, and OAuth refresh config"
|
|
370
487
|
}, undefined, false, undefined, this)
|
|
371
488
|
]
|
|
372
489
|
}, undefined, true, undefined, this)
|
|
@@ -559,6 +676,8 @@ POSTMARK_FROM_EMAIL=noreply@example.com
|
|
|
559
676
|
OPENAI_API_KEY=sk-...
|
|
560
677
|
OPENAI_ORGANIZATION=org-...
|
|
561
678
|
|
|
679
|
+
MISTRAL_API_KEY=...
|
|
680
|
+
|
|
562
681
|
QDRANT_URL=https://...
|
|
563
682
|
QDRANT_API_KEY=...
|
|
564
683
|
|
|
@@ -591,14 +710,22 @@ STRIPE_SECRET_OVERRIDE=env://STRIPE_SECRET_KEY`
|
|
|
591
710
|
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
592
711
|
children: `type IntegrationCategory =
|
|
593
712
|
| "payments" // Stripe, PayPal, etc.
|
|
713
|
+
| "open-banking" // Powens and open banking providers
|
|
594
714
|
| "email" // Postmark, Resend, Gmail
|
|
595
715
|
| "calendar" // Google Calendar, Outlook
|
|
596
716
|
| "sms" // Twilio, MessageBird
|
|
597
|
-
| "
|
|
598
|
-
| "
|
|
599
|
-
| "
|
|
717
|
+
| "messaging" // Slack, GitHub, WhatsApp
|
|
718
|
+
| "health" // Whoop, Oura, Strava, Fitbit
|
|
719
|
+
| "ai-llm" // OpenAI, Anthropic, Cohere, Mistral
|
|
720
|
+
| "ai-voice-tts" // ElevenLabs, Google TTS
|
|
721
|
+
| "ai-voice-stt" // OpenAI Whisper, Google STT, Mistral Voxtral
|
|
722
|
+
| "ai-voice-conversational" // OpenAI Realtime, Mistral Voice
|
|
723
|
+
| "ai-image" // OpenAI Image, Fal
|
|
600
724
|
| "vector-db" // Qdrant, Pinecone, Weaviate
|
|
725
|
+
| "database" // Supabase, Postgres
|
|
601
726
|
| "storage" // S3, GCS, Azure Blob
|
|
727
|
+
| "meeting-recorder" // Fireflies, tl;dv, Granola
|
|
728
|
+
| "project-management" // Linear, Jira, Notion
|
|
602
729
|
| "accounting" // QuickBooks, Xero (coming soon)
|
|
603
730
|
| "crm" // Salesforce, HubSpot (coming soon)
|
|
604
731
|
| "helpdesk" // Zendesk, Intercom (coming soon)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function IntegrationsSlackPage(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/components/docs/integrations/IntegrationsSlackPage.tsx
|
|
3
|
+
import Link from "@contractspec/lib.ui-link";
|
|
4
|
+
import { ChevronRight } from "lucide-react";
|
|
5
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
6
|
+
function IntegrationsSlackPage() {
|
|
7
|
+
return /* @__PURE__ */ jsxDEV("div", {
|
|
8
|
+
className: "space-y-8",
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
11
|
+
className: "space-y-4",
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ jsxDEV("h1", {
|
|
14
|
+
className: "text-4xl font-bold",
|
|
15
|
+
children: "Slack Messaging"
|
|
16
|
+
}, undefined, false, undefined, this),
|
|
17
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
18
|
+
className: "text-muted-foreground",
|
|
19
|
+
children: "ContractSpec supports signed Slack event ingestion and outbox-backed outbound replies through the channel runtime."
|
|
20
|
+
}, undefined, false, undefined, this)
|
|
21
|
+
]
|
|
22
|
+
}, undefined, true, undefined, this),
|
|
23
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
24
|
+
className: "space-y-4",
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
27
|
+
className: "text-2xl font-bold",
|
|
28
|
+
children: "Required secrets and config"
|
|
29
|
+
}, undefined, false, undefined, this),
|
|
30
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
31
|
+
className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
|
|
32
|
+
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
33
|
+
children: `// secret payload
|
|
34
|
+
{
|
|
35
|
+
"botToken": "xoxb-...",
|
|
36
|
+
"signingSecret": "..."
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// optional connection config
|
|
40
|
+
{
|
|
41
|
+
"defaultChannelId": "C0123456789",
|
|
42
|
+
"apiBaseUrl": "https://slack.com/api"
|
|
43
|
+
}`
|
|
44
|
+
}, undefined, false, undefined, this)
|
|
45
|
+
}, undefined, false, undefined, this)
|
|
46
|
+
]
|
|
47
|
+
}, undefined, true, undefined, this),
|
|
48
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
49
|
+
className: "space-y-4",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
52
|
+
className: "text-2xl font-bold",
|
|
53
|
+
children: "Webhook ingress"
|
|
54
|
+
}, undefined, false, undefined, this),
|
|
55
|
+
/* @__PURE__ */ jsxDEV("ul", {
|
|
56
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
59
|
+
children: [
|
|
60
|
+
"Inbound events are accepted on",
|
|
61
|
+
" ",
|
|
62
|
+
/* @__PURE__ */ jsxDEV("code", {
|
|
63
|
+
className: "bg-background/50 rounded px-2 py-1",
|
|
64
|
+
children: "/webhooks/slack/events"
|
|
65
|
+
}, undefined, false, undefined, this),
|
|
66
|
+
"."
|
|
67
|
+
]
|
|
68
|
+
}, undefined, true, undefined, this),
|
|
69
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
70
|
+
children: [
|
|
71
|
+
"Requests are validated with Slack signatures (",
|
|
72
|
+
/* @__PURE__ */ jsxDEV("code", {
|
|
73
|
+
className: "bg-background/50 rounded px-2 py-1",
|
|
74
|
+
children: "x-slack-signature"
|
|
75
|
+
}, undefined, false, undefined, this),
|
|
76
|
+
" ",
|
|
77
|
+
"+ timestamp tolerance)."
|
|
78
|
+
]
|
|
79
|
+
}, undefined, true, undefined, this),
|
|
80
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
81
|
+
children: "Normalized events are deduplicated and persisted before any outbound side effects."
|
|
82
|
+
}, undefined, false, undefined, this)
|
|
83
|
+
]
|
|
84
|
+
}, undefined, true, undefined, this)
|
|
85
|
+
]
|
|
86
|
+
}, undefined, true, undefined, this),
|
|
87
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
88
|
+
className: "space-y-4",
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
91
|
+
className: "text-2xl font-bold",
|
|
92
|
+
children: "Workspace routing and dispatch"
|
|
93
|
+
}, undefined, false, undefined, this),
|
|
94
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
95
|
+
className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
|
|
96
|
+
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
97
|
+
children: `# Workspace mapping (recommended)
|
|
98
|
+
CHANNEL_WORKSPACE_MAP_SLACK={"T123":"workspace-acme"}
|
|
99
|
+
|
|
100
|
+
# Dispatch protection
|
|
101
|
+
CHANNEL_DISPATCH_TOKEN=...
|
|
102
|
+
|
|
103
|
+
# Optional scheduler
|
|
104
|
+
CHANNEL_DISPATCH_INTERVAL_MS=120000
|
|
105
|
+
CHANNEL_DISPATCH_RUN_ON_START=1`
|
|
106
|
+
}, undefined, false, undefined, this)
|
|
107
|
+
}, undefined, false, undefined, this)
|
|
108
|
+
]
|
|
109
|
+
}, undefined, true, undefined, this),
|
|
110
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
111
|
+
className: "space-y-4",
|
|
112
|
+
children: [
|
|
113
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
114
|
+
className: "text-2xl font-bold",
|
|
115
|
+
children: "Best practices"
|
|
116
|
+
}, undefined, false, undefined, this),
|
|
117
|
+
/* @__PURE__ */ jsxDEV("ul", {
|
|
118
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
119
|
+
children: [
|
|
120
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
121
|
+
children: "Keep bot tokens and signing secrets in a managed secret provider."
|
|
122
|
+
}, undefined, false, undefined, this),
|
|
123
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
124
|
+
children: "Use workspace mapping to prevent cross-tenant event leakage."
|
|
125
|
+
}, undefined, false, undefined, this),
|
|
126
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
127
|
+
children: "Keep dispatch asynchronous so webhook handlers stay fast and reliable."
|
|
128
|
+
}, undefined, false, undefined, this),
|
|
129
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
130
|
+
children: "Monitor telemetry for ingest, decision, outbox, and dispatch stages."
|
|
131
|
+
}, undefined, false, undefined, this)
|
|
132
|
+
]
|
|
133
|
+
}, undefined, true, undefined, this)
|
|
134
|
+
]
|
|
135
|
+
}, undefined, true, undefined, this),
|
|
136
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
137
|
+
className: "flex items-center gap-4 pt-4",
|
|
138
|
+
children: [
|
|
139
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
140
|
+
href: "/docs/integrations/twilio",
|
|
141
|
+
className: "btn-ghost",
|
|
142
|
+
children: "Previous: Twilio SMS"
|
|
143
|
+
}, undefined, false, undefined, this),
|
|
144
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
145
|
+
href: "/docs/integrations/github",
|
|
146
|
+
className: "btn-primary",
|
|
147
|
+
children: [
|
|
148
|
+
"Next: GitHub Messaging ",
|
|
149
|
+
/* @__PURE__ */ jsxDEV(ChevronRight, {
|
|
150
|
+
size: 16
|
|
151
|
+
}, undefined, false, undefined, this)
|
|
152
|
+
]
|
|
153
|
+
}, undefined, true, undefined, this)
|
|
154
|
+
]
|
|
155
|
+
}, undefined, true, undefined, this)
|
|
156
|
+
]
|
|
157
|
+
}, undefined, true, undefined, this);
|
|
158
|
+
}
|
|
159
|
+
export {
|
|
160
|
+
IntegrationsSlackPage
|
|
161
|
+
};
|
|
@@ -271,6 +271,78 @@ function IntegrationsSpecModelPage() {
|
|
|
271
271
|
createdAt: "2025-01-01T00:00:00Z",
|
|
272
272
|
updatedAt: "2025-01-15T10:25:00Z",
|
|
273
273
|
createdBy: "dev@acme.com"
|
|
274
|
+
}`
|
|
275
|
+
}, undefined, false, undefined, this)
|
|
276
|
+
}, undefined, false, undefined, this)
|
|
277
|
+
]
|
|
278
|
+
}, undefined, true, undefined, this),
|
|
279
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
280
|
+
className: "space-y-4",
|
|
281
|
+
children: [
|
|
282
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
283
|
+
className: "text-2xl font-bold",
|
|
284
|
+
children: "Example: Messaging IntegrationConnection"
|
|
285
|
+
}, undefined, false, undefined, this),
|
|
286
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
287
|
+
className: "text-muted-foreground",
|
|
288
|
+
children: "Messaging providers use the same spec + connection model, then route inbound events through the channel runtime for signature validation, idempotent ingestion, policy decisions, and outbox-backed dispatch."
|
|
289
|
+
}, undefined, false, undefined, this),
|
|
290
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
291
|
+
className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
|
|
292
|
+
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
293
|
+
children: `{
|
|
294
|
+
id: "conn_slack_acme_prod",
|
|
295
|
+
tenantId: "acme-corp",
|
|
296
|
+
integrationId: "messaging.slack",
|
|
297
|
+
environment: "production",
|
|
298
|
+
config: {
|
|
299
|
+
defaultChannelId: "C0123456789",
|
|
300
|
+
apiBaseUrl: "https://slack.com/api"
|
|
301
|
+
},
|
|
302
|
+
secretRef: "secret_slack_acme_prod_v1",
|
|
303
|
+
status: "connected"
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// secret payload behind secretRef
|
|
307
|
+
{
|
|
308
|
+
"botToken": "xoxb-...",
|
|
309
|
+
"signingSecret": "..."
|
|
310
|
+
}`
|
|
311
|
+
}, undefined, false, undefined, this)
|
|
312
|
+
}, undefined, false, undefined, this)
|
|
313
|
+
]
|
|
314
|
+
}, undefined, true, undefined, this),
|
|
315
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
316
|
+
className: "space-y-4",
|
|
317
|
+
children: [
|
|
318
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
319
|
+
className: "text-2xl font-bold",
|
|
320
|
+
children: "Health transport strategy config"
|
|
321
|
+
}, undefined, false, undefined, this),
|
|
322
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
323
|
+
className: "text-muted-foreground",
|
|
324
|
+
children: "Health providers support deterministic transport routing and explicit unofficial gating in connection config."
|
|
325
|
+
}, undefined, false, undefined, this),
|
|
326
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
327
|
+
className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
|
|
328
|
+
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
329
|
+
children: `{
|
|
330
|
+
"defaultTransport": "official-api",
|
|
331
|
+
"strategyOrder": ["official-api", "aggregator-api", "unofficial"],
|
|
332
|
+
"allowUnofficial": false,
|
|
333
|
+
"unofficialAllowList": ["health.peloton"],
|
|
334
|
+
"mcpUrl": "https://mcp.provider.example",
|
|
335
|
+
"oauthTokenUrl": "https://api.provider.example/oauth/token"
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// secret payload behind secretRef
|
|
339
|
+
{
|
|
340
|
+
"accessToken": "...",
|
|
341
|
+
"refreshToken": "...",
|
|
342
|
+
"clientId": "...",
|
|
343
|
+
"clientSecret": "...",
|
|
344
|
+
"tokenExpiresAt": "2026-02-01T00:00:00.000Z",
|
|
345
|
+
"mcpAccessToken": "..."
|
|
274
346
|
}`
|
|
275
347
|
}, undefined, false, undefined, this)
|
|
276
348
|
}, undefined, false, undefined, this)
|
|
@@ -133,9 +133,9 @@ outputs:
|
|
|
133
133
|
children: "Previous: S3 Storage"
|
|
134
134
|
}, undefined, false, undefined, this),
|
|
135
135
|
/* @__PURE__ */ jsxDEV(Link, {
|
|
136
|
-
href: "/docs/integrations",
|
|
136
|
+
href: "/docs/integrations/slack",
|
|
137
137
|
className: "btn-primary",
|
|
138
|
-
children: "
|
|
138
|
+
children: "Next: Slack Messaging"
|
|
139
139
|
}, undefined, false, undefined, this)
|
|
140
140
|
]
|
|
141
141
|
}, undefined, true, undefined, this)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function IntegrationsWhatsappMetaPage(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/components/docs/integrations/IntegrationsWhatsappMetaPage.tsx
|
|
3
|
+
import Link from "@contractspec/lib.ui-link";
|
|
4
|
+
import { ChevronRight } from "lucide-react";
|
|
5
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
6
|
+
function IntegrationsWhatsappMetaPage() {
|
|
7
|
+
return /* @__PURE__ */ jsxDEV("div", {
|
|
8
|
+
className: "space-y-8",
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
11
|
+
className: "space-y-4",
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ jsxDEV("h1", {
|
|
14
|
+
className: "text-4xl font-bold",
|
|
15
|
+
children: "WhatsApp Meta"
|
|
16
|
+
}, undefined, false, undefined, this),
|
|
17
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
18
|
+
className: "text-muted-foreground",
|
|
19
|
+
children: "Meta WhatsApp is the primary WhatsApp channel for ContractSpec's messaging runtime, with signed webhook verification and reliable outbound delivery."
|
|
20
|
+
}, undefined, false, undefined, this)
|
|
21
|
+
]
|
|
22
|
+
}, undefined, true, undefined, this),
|
|
23
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
24
|
+
className: "space-y-4",
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
27
|
+
className: "text-2xl font-bold",
|
|
28
|
+
children: "Required secrets and config"
|
|
29
|
+
}, undefined, false, undefined, this),
|
|
30
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
31
|
+
className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
|
|
32
|
+
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
33
|
+
children: `// secret payload
|
|
34
|
+
{
|
|
35
|
+
"accessToken": "...",
|
|
36
|
+
"appSecret": "...",
|
|
37
|
+
"verifyToken": "..."
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// required connection config
|
|
41
|
+
{
|
|
42
|
+
"phoneNumberId": "120000000001",
|
|
43
|
+
"apiVersion": "v22.0"
|
|
44
|
+
}`
|
|
45
|
+
}, undefined, false, undefined, this)
|
|
46
|
+
}, undefined, false, undefined, this)
|
|
47
|
+
]
|
|
48
|
+
}, undefined, true, undefined, this),
|
|
49
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
50
|
+
className: "space-y-4",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
53
|
+
className: "text-2xl font-bold",
|
|
54
|
+
children: "Webhook endpoints"
|
|
55
|
+
}, undefined, false, undefined, this),
|
|
56
|
+
/* @__PURE__ */ jsxDEV("ul", {
|
|
57
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
60
|
+
children: [
|
|
61
|
+
"Verification challenge:",
|
|
62
|
+
" ",
|
|
63
|
+
/* @__PURE__ */ jsxDEV("code", {
|
|
64
|
+
className: "bg-background/50 rounded px-2 py-1",
|
|
65
|
+
children: "GET /webhooks/whatsapp/meta"
|
|
66
|
+
}, undefined, false, undefined, this)
|
|
67
|
+
]
|
|
68
|
+
}, undefined, true, undefined, this),
|
|
69
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
70
|
+
children: [
|
|
71
|
+
"Inbound messages:",
|
|
72
|
+
" ",
|
|
73
|
+
/* @__PURE__ */ jsxDEV("code", {
|
|
74
|
+
className: "bg-background/50 rounded px-2 py-1",
|
|
75
|
+
children: "POST /webhooks/whatsapp/meta"
|
|
76
|
+
}, undefined, false, undefined, this)
|
|
77
|
+
]
|
|
78
|
+
}, undefined, true, undefined, this),
|
|
79
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
80
|
+
children: [
|
|
81
|
+
"Signatures are validated with",
|
|
82
|
+
" ",
|
|
83
|
+
/* @__PURE__ */ jsxDEV("code", {
|
|
84
|
+
className: "bg-background/50 rounded px-2 py-1",
|
|
85
|
+
children: "x-hub-signature-256"
|
|
86
|
+
}, undefined, false, undefined, this),
|
|
87
|
+
"."
|
|
88
|
+
]
|
|
89
|
+
}, undefined, true, undefined, this)
|
|
90
|
+
]
|
|
91
|
+
}, undefined, true, undefined, this)
|
|
92
|
+
]
|
|
93
|
+
}, undefined, true, undefined, this),
|
|
94
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
95
|
+
className: "space-y-4",
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
98
|
+
className: "text-2xl font-bold",
|
|
99
|
+
children: "Workspace mapping"
|
|
100
|
+
}, undefined, false, undefined, this),
|
|
101
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
102
|
+
className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
|
|
103
|
+
children: /* @__PURE__ */ jsxDEV("pre", {
|
|
104
|
+
children: `CHANNEL_WORKSPACE_MAP_WHATSAPP_META={"120000000001":"workspace-acme"}`
|
|
105
|
+
}, undefined, false, undefined, this)
|
|
106
|
+
}, undefined, false, undefined, this)
|
|
107
|
+
]
|
|
108
|
+
}, undefined, true, undefined, this),
|
|
109
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
110
|
+
className: "space-y-4",
|
|
111
|
+
children: [
|
|
112
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
113
|
+
className: "text-2xl font-bold",
|
|
114
|
+
children: "Best practices"
|
|
115
|
+
}, undefined, false, undefined, this),
|
|
116
|
+
/* @__PURE__ */ jsxDEV("ul", {
|
|
117
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
118
|
+
children: [
|
|
119
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
120
|
+
children: "Keep verify and app secrets separate from access tokens."
|
|
121
|
+
}, undefined, false, undefined, this),
|
|
122
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
123
|
+
children: "Map each phone number ID to a workspace for strict tenant routing."
|
|
124
|
+
}, undefined, false, undefined, this),
|
|
125
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
126
|
+
children: "Use Twilio WhatsApp only as fallback when you need active-passive routing."
|
|
127
|
+
}, undefined, false, undefined, this)
|
|
128
|
+
]
|
|
129
|
+
}, undefined, true, undefined, this)
|
|
130
|
+
]
|
|
131
|
+
}, undefined, true, undefined, this),
|
|
132
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
133
|
+
className: "flex items-center gap-4 pt-4",
|
|
134
|
+
children: [
|
|
135
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
136
|
+
href: "/docs/integrations/github",
|
|
137
|
+
className: "btn-ghost",
|
|
138
|
+
children: "Previous: GitHub Messaging"
|
|
139
|
+
}, undefined, false, undefined, this),
|
|
140
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
141
|
+
href: "/docs/integrations/whatsapp-twilio",
|
|
142
|
+
className: "btn-primary",
|
|
143
|
+
children: [
|
|
144
|
+
"Next: WhatsApp Twilio ",
|
|
145
|
+
/* @__PURE__ */ jsxDEV(ChevronRight, {
|
|
146
|
+
size: 16
|
|
147
|
+
}, undefined, false, undefined, this)
|
|
148
|
+
]
|
|
149
|
+
}, undefined, true, undefined, this)
|
|
150
|
+
]
|
|
151
|
+
}, undefined, true, undefined, this)
|
|
152
|
+
]
|
|
153
|
+
}, undefined, true, undefined, this);
|
|
154
|
+
}
|
|
155
|
+
export {
|
|
156
|
+
IntegrationsWhatsappMetaPage
|
|
157
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function IntegrationsWhatsappTwilioPage(): import("react/jsx-runtime").JSX.Element;
|