@contractspec/bundle.library 2.9.0 → 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.
Files changed (86) hide show
  1. package/.turbo/turbo-build.log +129 -115
  2. package/CHANGELOG.md +53 -0
  3. package/dist/components/docs/DocsIndexPage.js +1 -1
  4. package/dist/components/docs/architecture/ArchitectureControlPlanePage.d.ts +1 -0
  5. package/dist/components/docs/architecture/ArchitectureControlPlanePage.js +204 -0
  6. package/dist/components/docs/architecture/ArchitectureOverviewPage.js +17 -1
  7. package/dist/components/docs/architecture/index.d.ts +1 -0
  8. package/dist/components/docs/architecture/index.js +507 -289
  9. package/dist/components/docs/ecosystem/IntegrationsPage.js +6 -3
  10. package/dist/components/docs/ecosystem/PluginsPage.js +98 -98
  11. package/dist/components/docs/ecosystem/RegistryPage.js +39 -42
  12. package/dist/components/docs/ecosystem/TemplatesPage.js +26 -21
  13. package/dist/components/docs/ecosystem/ecosystem.docblocks.js +10 -10
  14. package/dist/components/docs/ecosystem/index.js +179 -174
  15. package/dist/components/docs/index.js +6795 -5376
  16. package/dist/components/docs/integrations/IntegrationsElevenLabsPage.js +2 -2
  17. package/dist/components/docs/integrations/IntegrationsGithubPage.d.ts +1 -0
  18. package/dist/components/docs/integrations/IntegrationsGithubPage.js +155 -0
  19. package/dist/components/docs/integrations/IntegrationsHealthRoutingPage.d.ts +1 -0
  20. package/dist/components/docs/integrations/IntegrationsHealthRoutingPage.js +168 -0
  21. package/dist/components/docs/integrations/IntegrationsMistralPage.d.ts +1 -0
  22. package/dist/components/docs/integrations/IntegrationsMistralPage.js +203 -0
  23. package/dist/components/docs/integrations/IntegrationsOpenAIPage.js +2 -2
  24. package/dist/components/docs/integrations/IntegrationsOverviewPage.js +136 -9
  25. package/dist/components/docs/integrations/IntegrationsSlackPage.d.ts +1 -0
  26. package/dist/components/docs/integrations/IntegrationsSlackPage.js +161 -0
  27. package/dist/components/docs/integrations/IntegrationsSpecModelPage.js +72 -0
  28. package/dist/components/docs/integrations/IntegrationsTwilioPage.js +2 -2
  29. package/dist/components/docs/integrations/IntegrationsWhatsappMetaPage.d.ts +1 -0
  30. package/dist/components/docs/integrations/IntegrationsWhatsappMetaPage.js +157 -0
  31. package/dist/components/docs/integrations/IntegrationsWhatsappTwilioPage.d.ts +1 -0
  32. package/dist/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +165 -0
  33. package/dist/components/docs/integrations/index.d.ts +6 -0
  34. package/dist/components/docs/integrations/index.js +1688 -492
  35. package/dist/index.js +8016 -6597
  36. package/dist/node/components/docs/DocsIndexPage.js +1 -1
  37. package/dist/node/components/docs/architecture/ArchitectureControlPlanePage.js +203 -0
  38. package/dist/node/components/docs/architecture/ArchitectureOverviewPage.js +17 -1
  39. package/dist/node/components/docs/architecture/index.js +507 -289
  40. package/dist/node/components/docs/ecosystem/IntegrationsPage.js +6 -3
  41. package/dist/node/components/docs/ecosystem/PluginsPage.js +98 -98
  42. package/dist/node/components/docs/ecosystem/RegistryPage.js +39 -42
  43. package/dist/node/components/docs/ecosystem/TemplatesPage.js +26 -21
  44. package/dist/node/components/docs/ecosystem/ecosystem.docblocks.js +10 -10
  45. package/dist/node/components/docs/ecosystem/index.js +179 -174
  46. package/dist/node/components/docs/index.js +6795 -5376
  47. package/dist/node/components/docs/integrations/IntegrationsElevenLabsPage.js +2 -2
  48. package/dist/node/components/docs/integrations/IntegrationsGithubPage.js +154 -0
  49. package/dist/node/components/docs/integrations/IntegrationsHealthRoutingPage.js +167 -0
  50. package/dist/node/components/docs/integrations/IntegrationsMistralPage.js +202 -0
  51. package/dist/node/components/docs/integrations/IntegrationsOpenAIPage.js +2 -2
  52. package/dist/node/components/docs/integrations/IntegrationsOverviewPage.js +136 -9
  53. package/dist/node/components/docs/integrations/IntegrationsSlackPage.js +160 -0
  54. package/dist/node/components/docs/integrations/IntegrationsSpecModelPage.js +72 -0
  55. package/dist/node/components/docs/integrations/IntegrationsTwilioPage.js +2 -2
  56. package/dist/node/components/docs/integrations/IntegrationsWhatsappMetaPage.js +156 -0
  57. package/dist/node/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +164 -0
  58. package/dist/node/components/docs/integrations/index.js +1688 -492
  59. package/dist/node/index.js +8016 -6597
  60. package/package.json +104 -20
  61. package/src/components/docs/DocsIndexPage.tsx +2 -1
  62. package/src/components/docs/architecture/ArchitectureControlPlanePage.tsx +136 -0
  63. package/src/components/docs/architecture/ArchitectureOverviewPage.tsx +13 -1
  64. package/src/components/docs/architecture/index.ts +1 -0
  65. package/src/components/docs/ecosystem/IntegrationsPage.tsx +4 -3
  66. package/src/components/docs/ecosystem/PluginsPage.tsx +68 -87
  67. package/src/components/docs/ecosystem/RegistryPage.tsx +35 -43
  68. package/src/components/docs/ecosystem/TemplatesPage.tsx +28 -21
  69. package/src/components/docs/ecosystem/ecosystem.docblocks.ts +12 -10
  70. package/src/components/docs/generated/docs-index._common.json +240 -0
  71. package/src/components/docs/generated/docs-index.health.json +98 -0
  72. package/src/components/docs/generated/docs-index.manifest.json +14 -4
  73. package/src/components/docs/generated/docs-index.platform-integrations.json +81 -1
  74. package/src/components/docs/generated/docs-index.video-api-showcase.json +26 -0
  75. package/src/components/docs/integrations/IntegrationsElevenLabsPage.tsx +2 -2
  76. package/src/components/docs/integrations/IntegrationsGithubPage.tsx +90 -0
  77. package/src/components/docs/integrations/IntegrationsHealthRoutingPage.tsx +112 -0
  78. package/src/components/docs/integrations/IntegrationsMistralPage.tsx +133 -0
  79. package/src/components/docs/integrations/IntegrationsOpenAIPage.tsx +2 -2
  80. package/src/components/docs/integrations/IntegrationsOverviewPage.tsx +108 -9
  81. package/src/components/docs/integrations/IntegrationsSlackPage.tsx +98 -0
  82. package/src/components/docs/integrations/IntegrationsSpecModelPage.tsx +59 -0
  83. package/src/components/docs/integrations/IntegrationsTwilioPage.tsx +2 -2
  84. package/src/components/docs/integrations/IntegrationsWhatsappMetaPage.tsx +90 -0
  85. package/src/components/docs/integrations/IntegrationsWhatsappTwilioPage.tsx +92 -0
  86. 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
- | "ai-llm" // OpenAI
111
- | "ai-voice" // ElevenLabs
112
- | "speech-to-text" // OpenAI Whisper
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
- | "open-banking" // Powens (read-only)
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 & Messaging"
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
- | "ai-llm" // OpenAI, Anthropic, Cohere
598
- | "ai-voice" // ElevenLabs, Google TTS
599
- | "speech-to-text" // OpenAI Whisper, Google STT
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: "Back to Integrations"
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;