@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)
@@ -797,9 +924,9 @@ outputs:
797
924
  className: "flex items-center gap-4 pt-4",
798
925
  children: [
799
926
  /* @__PURE__ */ jsxDEV3(Link2, {
800
- href: "/docs/integrations/openai",
927
+ href: "/docs/integrations/mistral",
801
928
  className: "btn-ghost",
802
- children: "Previous: OpenAI"
929
+ children: "Previous: Mistral"
803
930
  }, undefined, false, undefined, this),
804
931
  /* @__PURE__ */ jsxDEV3(Link2, {
805
932
  href: "/docs/integrations/qdrant",
@@ -817,11 +944,11 @@ outputs:
817
944
  }, undefined, true, undefined, this);
818
945
  }
819
946
 
820
- // src/components/docs/integrations/IntegrationsGmailPage.tsx
947
+ // src/components/docs/integrations/IntegrationsGithubPage.tsx
821
948
  import Link3 from "@contractspec/lib.ui-link";
822
949
  import { ChevronRight as ChevronRight3 } from "lucide-react";
823
950
  import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
824
- function IntegrationsGmailPage() {
951
+ function IntegrationsGithubPage() {
825
952
  return /* @__PURE__ */ jsxDEV4("div", {
826
953
  className: "space-y-8",
827
954
  children: [
@@ -830,11 +957,11 @@ function IntegrationsGmailPage() {
830
957
  children: [
831
958
  /* @__PURE__ */ jsxDEV4("h1", {
832
959
  className: "text-4xl font-bold",
833
- children: "Gmail API"
960
+ children: "GitHub Messaging"
834
961
  }, undefined, false, undefined, this),
835
962
  /* @__PURE__ */ jsxDEV4("p", {
836
963
  className: "text-muted-foreground",
837
- children: "The Gmail API integration allows you to read inbound emails, manage threads, and build email-based workflows. Perfect for support tickets, email parsing, and automated responses."
964
+ children: "Use GitHub issue and pull request comments as an AI-native messaging channel with webhook verification, policy checks, and reliable outbound dispatch."
838
965
  }, undefined, false, undefined, this)
839
966
  ]
840
967
  }, undefined, true, undefined, this),
@@ -843,19 +970,23 @@ function IntegrationsGmailPage() {
843
970
  children: [
844
971
  /* @__PURE__ */ jsxDEV4("h2", {
845
972
  className: "text-2xl font-bold",
846
- children: "Setup"
847
- }, undefined, false, undefined, this),
848
- /* @__PURE__ */ jsxDEV4("p", {
849
- className: "text-muted-foreground",
850
- children: "Configure OAuth 2.0 credentials in Google Cloud Console:"
973
+ children: "Required secrets and config"
851
974
  }, undefined, false, undefined, this),
852
975
  /* @__PURE__ */ jsxDEV4("div", {
853
976
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
854
977
  children: /* @__PURE__ */ jsxDEV4("pre", {
855
- children: `# .env
856
- GOOGLE_CLIENT_ID=...
857
- GOOGLE_CLIENT_SECRET=...
858
- GOOGLE_REDIRECT_URI=https://your-app.com/auth/google/callback`
978
+ children: `// secret payload
979
+ {
980
+ "token": "ghp_...",
981
+ "webhookSecret": "..."
982
+ }
983
+
984
+ // optional connection config
985
+ {
986
+ "defaultOwner": "lssm-tech",
987
+ "defaultRepo": "contractspec",
988
+ "apiBaseUrl": "https://api.github.com"
989
+ }`
859
990
  }, undefined, false, undefined, this)
860
991
  }, undefined, false, undefined, this)
861
992
  ]
@@ -865,33 +996,55 @@ GOOGLE_REDIRECT_URI=https://your-app.com/auth/google/callback`
865
996
  children: [
866
997
  /* @__PURE__ */ jsxDEV4("h2", {
867
998
  className: "text-2xl font-bold",
868
- children: "Reading emails"
999
+ children: "Webhook ingress"
1000
+ }, undefined, false, undefined, this),
1001
+ /* @__PURE__ */ jsxDEV4("ul", {
1002
+ className: "text-muted-foreground list-inside list-disc space-y-2",
1003
+ children: [
1004
+ /* @__PURE__ */ jsxDEV4("li", {
1005
+ children: [
1006
+ "Inbound GitHub events are accepted on",
1007
+ " ",
1008
+ /* @__PURE__ */ jsxDEV4("code", {
1009
+ className: "bg-background/50 rounded px-2 py-1",
1010
+ children: "/webhooks/github/events"
1011
+ }, undefined, false, undefined, this),
1012
+ "."
1013
+ ]
1014
+ }, undefined, true, undefined, this),
1015
+ /* @__PURE__ */ jsxDEV4("li", {
1016
+ children: [
1017
+ "Signatures are checked using",
1018
+ " ",
1019
+ /* @__PURE__ */ jsxDEV4("code", {
1020
+ className: "bg-background/50 rounded px-2 py-1",
1021
+ children: "x-hub-signature-256"
1022
+ }, undefined, false, undefined, this),
1023
+ " ",
1024
+ "and the configured webhook secret."
1025
+ ]
1026
+ }, undefined, true, undefined, this),
1027
+ /* @__PURE__ */ jsxDEV4("li", {
1028
+ children: "Current normalization focuses on issue comment workflows and durable comment dispatch."
1029
+ }, undefined, false, undefined, this)
1030
+ ]
1031
+ }, undefined, true, undefined, this)
1032
+ ]
1033
+ }, undefined, true, undefined, this),
1034
+ /* @__PURE__ */ jsxDEV4("div", {
1035
+ className: "space-y-4",
1036
+ children: [
1037
+ /* @__PURE__ */ jsxDEV4("h2", {
1038
+ className: "text-2xl font-bold",
1039
+ children: "Workspace mapping"
869
1040
  }, undefined, false, undefined, this),
870
1041
  /* @__PURE__ */ jsxDEV4("div", {
871
1042
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
872
1043
  children: /* @__PURE__ */ jsxDEV4("pre", {
873
- children: `capabilityId: gmail-list-messages
874
- provider:
875
- type: gmail
876
- operation: listMessages
877
-
878
- inputs:
879
- query:
880
- type: string
881
- description: "Gmail search query"
882
- maxResults:
883
- type: number
884
- default: 10
1044
+ children: `CHANNEL_WORKSPACE_MAP_GITHUB={"lssm-tech/contractspec":"workspace-acme"}
885
1045
 
886
- outputs:
887
- messages:
888
- type: array
889
- items:
890
- type: object
891
- properties:
892
- id: string
893
- threadId: string
894
- snippet: string`
1046
+ # Optional dev fallback (off by default)
1047
+ CHANNEL_ALLOW_UNMAPPED_WORKSPACE=0`
895
1048
  }, undefined, false, undefined, this)
896
1049
  }, undefined, false, undefined, this)
897
1050
  ]
@@ -901,22 +1054,19 @@ outputs:
901
1054
  children: [
902
1055
  /* @__PURE__ */ jsxDEV4("h2", {
903
1056
  className: "text-2xl font-bold",
904
- children: "Use cases"
1057
+ children: "Best practices"
905
1058
  }, undefined, false, undefined, this),
906
1059
  /* @__PURE__ */ jsxDEV4("ul", {
907
1060
  className: "text-muted-foreground list-inside list-disc space-y-2",
908
1061
  children: [
909
1062
  /* @__PURE__ */ jsxDEV4("li", {
910
- children: "Parse support emails and create tickets"
911
- }, undefined, false, undefined, this),
912
- /* @__PURE__ */ jsxDEV4("li", {
913
- children: "Extract attachments and process them"
1063
+ children: "Use a least-privileged token scoped for comment operations."
914
1064
  }, undefined, false, undefined, this),
915
1065
  /* @__PURE__ */ jsxDEV4("li", {
916
- children: "Build email-to-task workflows"
1066
+ children: "Route repositories explicitly with workspace maps in multi-tenant environments."
917
1067
  }, undefined, false, undefined, this),
918
1068
  /* @__PURE__ */ jsxDEV4("li", {
919
- children: "Monitor specific email threads"
1069
+ children: "Keep dispatch endpoints protected with token or bearer auth."
920
1070
  }, undefined, false, undefined, this)
921
1071
  ]
922
1072
  }, undefined, true, undefined, this)
@@ -926,15 +1076,15 @@ outputs:
926
1076
  className: "flex items-center gap-4 pt-4",
927
1077
  children: [
928
1078
  /* @__PURE__ */ jsxDEV4(Link3, {
929
- href: "/docs/integrations/resend",
1079
+ href: "/docs/integrations/slack",
930
1080
  className: "btn-ghost",
931
- children: "Previous: Resend"
1081
+ children: "Previous: Slack Messaging"
932
1082
  }, undefined, false, undefined, this),
933
1083
  /* @__PURE__ */ jsxDEV4(Link3, {
934
- href: "/docs/integrations/google-calendar",
1084
+ href: "/docs/integrations/whatsapp-meta",
935
1085
  className: "btn-primary",
936
1086
  children: [
937
- "Next: Google Calendar ",
1087
+ "Next: WhatsApp Meta ",
938
1088
  /* @__PURE__ */ jsxDEV4(ChevronRight3, {
939
1089
  size: 16
940
1090
  }, undefined, false, undefined, this)
@@ -946,11 +1096,11 @@ outputs:
946
1096
  }, undefined, true, undefined, this);
947
1097
  }
948
1098
 
949
- // src/components/docs/integrations/IntegrationsGoogleCalendarPage.tsx
1099
+ // src/components/docs/integrations/IntegrationsGmailPage.tsx
950
1100
  import Link4 from "@contractspec/lib.ui-link";
951
1101
  import { ChevronRight as ChevronRight4 } from "lucide-react";
952
1102
  import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
953
- function IntegrationsGoogleCalendarPage() {
1103
+ function IntegrationsGmailPage() {
954
1104
  return /* @__PURE__ */ jsxDEV5("div", {
955
1105
  className: "space-y-8",
956
1106
  children: [
@@ -959,11 +1109,11 @@ function IntegrationsGoogleCalendarPage() {
959
1109
  children: [
960
1110
  /* @__PURE__ */ jsxDEV5("h1", {
961
1111
  className: "text-4xl font-bold",
962
- children: "Google Calendar"
1112
+ children: "Gmail API"
963
1113
  }, undefined, false, undefined, this),
964
1114
  /* @__PURE__ */ jsxDEV5("p", {
965
1115
  className: "text-muted-foreground",
966
- children: "Integrate Google Calendar to schedule appointments, manage availability, and sync events with your application."
1116
+ children: "The Gmail API integration allows you to read inbound emails, manage threads, and build email-based workflows. Perfect for support tickets, email parsing, and automated responses."
967
1117
  }, undefined, false, undefined, this)
968
1118
  ]
969
1119
  }, undefined, true, undefined, this),
@@ -974,13 +1124,17 @@ function IntegrationsGoogleCalendarPage() {
974
1124
  className: "text-2xl font-bold",
975
1125
  children: "Setup"
976
1126
  }, undefined, false, undefined, this),
1127
+ /* @__PURE__ */ jsxDEV5("p", {
1128
+ className: "text-muted-foreground",
1129
+ children: "Configure OAuth 2.0 credentials in Google Cloud Console:"
1130
+ }, undefined, false, undefined, this),
977
1131
  /* @__PURE__ */ jsxDEV5("div", {
978
1132
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
979
1133
  children: /* @__PURE__ */ jsxDEV5("pre", {
980
1134
  children: `# .env
981
1135
  GOOGLE_CLIENT_ID=...
982
1136
  GOOGLE_CLIENT_SECRET=...
983
- GOOGLE_CALENDAR_ID=primary`
1137
+ GOOGLE_REDIRECT_URI=https://your-app.com/auth/google/callback`
984
1138
  }, undefined, false, undefined, this)
985
1139
  }, undefined, false, undefined, this)
986
1140
  ]
@@ -990,53 +1144,76 @@ GOOGLE_CALENDAR_ID=primary`
990
1144
  children: [
991
1145
  /* @__PURE__ */ jsxDEV5("h2", {
992
1146
  className: "text-2xl font-bold",
993
- children: "Creating events"
1147
+ children: "Reading emails"
994
1148
  }, undefined, false, undefined, this),
995
1149
  /* @__PURE__ */ jsxDEV5("div", {
996
1150
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
997
1151
  children: /* @__PURE__ */ jsxDEV5("pre", {
998
- children: `capabilityId: calendar-create-event
1152
+ children: `capabilityId: gmail-list-messages
999
1153
  provider:
1000
- type: google-calendar
1001
- operation: createEvent
1154
+ type: gmail
1155
+ operation: listMessages
1002
1156
 
1003
1157
  inputs:
1004
- summary:
1005
- type: string
1006
- description:
1158
+ query:
1007
1159
  type: string
1008
- optional: true
1009
- startTime:
1010
- type: timestamp
1011
- endTime:
1012
- type: timestamp
1013
- attendees:
1014
- type: array
1015
- items:
1016
- type: string
1160
+ description: "Gmail search query"
1161
+ maxResults:
1162
+ type: number
1163
+ default: 10
1017
1164
 
1018
1165
  outputs:
1019
- eventId:
1020
- type: string
1021
- htmlLink:
1022
- type: string`
1166
+ messages:
1167
+ type: array
1168
+ items:
1169
+ type: object
1170
+ properties:
1171
+ id: string
1172
+ threadId: string
1173
+ snippet: string`
1023
1174
  }, undefined, false, undefined, this)
1024
1175
  }, undefined, false, undefined, this)
1025
1176
  ]
1026
1177
  }, undefined, true, undefined, this),
1178
+ /* @__PURE__ */ jsxDEV5("div", {
1179
+ className: "space-y-4",
1180
+ children: [
1181
+ /* @__PURE__ */ jsxDEV5("h2", {
1182
+ className: "text-2xl font-bold",
1183
+ children: "Use cases"
1184
+ }, undefined, false, undefined, this),
1185
+ /* @__PURE__ */ jsxDEV5("ul", {
1186
+ className: "text-muted-foreground list-inside list-disc space-y-2",
1187
+ children: [
1188
+ /* @__PURE__ */ jsxDEV5("li", {
1189
+ children: "Parse support emails and create tickets"
1190
+ }, undefined, false, undefined, this),
1191
+ /* @__PURE__ */ jsxDEV5("li", {
1192
+ children: "Extract attachments and process them"
1193
+ }, undefined, false, undefined, this),
1194
+ /* @__PURE__ */ jsxDEV5("li", {
1195
+ children: "Build email-to-task workflows"
1196
+ }, undefined, false, undefined, this),
1197
+ /* @__PURE__ */ jsxDEV5("li", {
1198
+ children: "Monitor specific email threads"
1199
+ }, undefined, false, undefined, this)
1200
+ ]
1201
+ }, undefined, true, undefined, this)
1202
+ ]
1203
+ }, undefined, true, undefined, this),
1027
1204
  /* @__PURE__ */ jsxDEV5("div", {
1028
1205
  className: "flex items-center gap-4 pt-4",
1029
1206
  children: [
1030
1207
  /* @__PURE__ */ jsxDEV5(Link4, {
1031
- href: "/docs/integrations/gmail",
1208
+ href: "/docs/integrations/resend",
1032
1209
  className: "btn-ghost",
1033
- children: "Previous: Gmail API"
1210
+ children: "Previous: Resend"
1034
1211
  }, undefined, false, undefined, this),
1035
1212
  /* @__PURE__ */ jsxDEV5(Link4, {
1036
- href: "/docs/integrations/openai",
1213
+ href: "/docs/integrations/google-calendar",
1037
1214
  className: "btn-primary",
1038
1215
  children: [
1039
- "Next: OpenAI ",
1216
+ "Next: Google Calendar ",
1040
1217
  /* @__PURE__ */ jsxDEV5(ChevronRight4, {
1041
1218
  size: 16
1042
1219
  }, undefined, false, undefined, this)
@@ -1048,11 +1225,11 @@ outputs:
1048
1225
  }, undefined, true, undefined, this);
1049
1226
  }
1050
1227
 
1051
- // src/components/docs/integrations/IntegrationsOpenAIPage.tsx
1228
+ // src/components/docs/integrations/IntegrationsGoogleCalendarPage.tsx
1052
1229
  import Link5 from "@contractspec/lib.ui-link";
1053
1230
  import { ChevronRight as ChevronRight5 } from "lucide-react";
1054
1231
  import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
1055
- function IntegrationsOpenAIPage() {
1232
+ function IntegrationsGoogleCalendarPage() {
1056
1233
  return /* @__PURE__ */ jsxDEV6("div", {
1057
1234
  className: "space-y-8",
1058
1235
  children: [
@@ -1061,11 +1238,11 @@ function IntegrationsOpenAIPage() {
1061
1238
  children: [
1062
1239
  /* @__PURE__ */ jsxDEV6("h1", {
1063
1240
  className: "text-4xl font-bold",
1064
- children: "OpenAI"
1241
+ children: "Google Calendar"
1065
1242
  }, undefined, false, undefined, this),
1066
1243
  /* @__PURE__ */ jsxDEV6("p", {
1067
1244
  className: "text-muted-foreground",
1068
- children: "Integrate OpenAI's powerful AI models for chat completion, embeddings, and speech-to-text. Build intelligent features with GPT-4, generate embeddings for semantic search, and transcribe audio with Whisper."
1245
+ children: "Integrate Google Calendar to schedule appointments, manage availability, and sync events with your application."
1069
1246
  }, undefined, false, undefined, this)
1070
1247
  ]
1071
1248
  }, undefined, true, undefined, this),
@@ -1080,8 +1257,9 @@ function IntegrationsOpenAIPage() {
1080
1257
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1081
1258
  children: /* @__PURE__ */ jsxDEV6("pre", {
1082
1259
  children: `# .env
1083
- OPENAI_API_KEY=sk-...
1084
- OPENAI_ORGANIZATION=org-...`
1260
+ GOOGLE_CLIENT_ID=...
1261
+ GOOGLE_CLIENT_SECRET=...
1262
+ GOOGLE_CALENDAR_ID=primary`
1085
1263
  }, undefined, false, undefined, this)
1086
1264
  }, undefined, false, undefined, this)
1087
1265
  ]
@@ -1091,11 +1269,477 @@ OPENAI_ORGANIZATION=org-...`
1091
1269
  children: [
1092
1270
  /* @__PURE__ */ jsxDEV6("h2", {
1093
1271
  className: "text-2xl font-bold",
1094
- children: "Chat completions"
1272
+ children: "Creating events"
1095
1273
  }, undefined, false, undefined, this),
1096
1274
  /* @__PURE__ */ jsxDEV6("div", {
1097
1275
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1098
1276
  children: /* @__PURE__ */ jsxDEV6("pre", {
1277
+ children: `capabilityId: calendar-create-event
1278
+ provider:
1279
+ type: google-calendar
1280
+ operation: createEvent
1281
+
1282
+ inputs:
1283
+ summary:
1284
+ type: string
1285
+ description:
1286
+ type: string
1287
+ optional: true
1288
+ startTime:
1289
+ type: timestamp
1290
+ endTime:
1291
+ type: timestamp
1292
+ attendees:
1293
+ type: array
1294
+ items:
1295
+ type: string
1296
+
1297
+ outputs:
1298
+ eventId:
1299
+ type: string
1300
+ htmlLink:
1301
+ type: string`
1302
+ }, undefined, false, undefined, this)
1303
+ }, undefined, false, undefined, this)
1304
+ ]
1305
+ }, undefined, true, undefined, this),
1306
+ /* @__PURE__ */ jsxDEV6("div", {
1307
+ className: "flex items-center gap-4 pt-4",
1308
+ children: [
1309
+ /* @__PURE__ */ jsxDEV6(Link5, {
1310
+ href: "/docs/integrations/gmail",
1311
+ className: "btn-ghost",
1312
+ children: "Previous: Gmail API"
1313
+ }, undefined, false, undefined, this),
1314
+ /* @__PURE__ */ jsxDEV6(Link5, {
1315
+ href: "/docs/integrations/openai",
1316
+ className: "btn-primary",
1317
+ children: [
1318
+ "Next: OpenAI ",
1319
+ /* @__PURE__ */ jsxDEV6(ChevronRight5, {
1320
+ size: 16
1321
+ }, undefined, false, undefined, this)
1322
+ ]
1323
+ }, undefined, true, undefined, this)
1324
+ ]
1325
+ }, undefined, true, undefined, this)
1326
+ ]
1327
+ }, undefined, true, undefined, this);
1328
+ }
1329
+
1330
+ // src/components/docs/integrations/IntegrationsHealthRoutingPage.tsx
1331
+ import Link6 from "@contractspec/lib.ui-link";
1332
+ import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
1333
+ function IntegrationsHealthRoutingPage() {
1334
+ return /* @__PURE__ */ jsxDEV7("div", {
1335
+ className: "space-y-8",
1336
+ children: [
1337
+ /* @__PURE__ */ jsxDEV7("div", {
1338
+ className: "space-y-4",
1339
+ children: [
1340
+ /* @__PURE__ */ jsxDEV7("h1", {
1341
+ className: "text-4xl font-bold",
1342
+ children: "Health Routing Strategy"
1343
+ }, undefined, false, undefined, this),
1344
+ /* @__PURE__ */ jsxDEV7("p", {
1345
+ className: "text-muted-foreground",
1346
+ children: "Health integrations resolve providers through deterministic transport strategy order with explicit capability gating and unofficial-route controls."
1347
+ }, undefined, false, undefined, this)
1348
+ ]
1349
+ }, undefined, true, undefined, this),
1350
+ /* @__PURE__ */ jsxDEV7("div", {
1351
+ className: "space-y-4",
1352
+ children: [
1353
+ /* @__PURE__ */ jsxDEV7("h2", {
1354
+ className: "text-2xl font-bold",
1355
+ children: "Connection config fields"
1356
+ }, undefined, false, undefined, this),
1357
+ /* @__PURE__ */ jsxDEV7("div", {
1358
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1359
+ children: /* @__PURE__ */ jsxDEV7("pre", {
1360
+ children: `{
1361
+ "defaultTransport": "official-api",
1362
+ "strategyOrder": [
1363
+ "official-api",
1364
+ "official-mcp",
1365
+ "aggregator-api",
1366
+ "aggregator-mcp",
1367
+ "unofficial"
1368
+ ],
1369
+ "allowUnofficial": false,
1370
+ "unofficialAllowList": ["health.peloton"],
1371
+ "apiBaseUrl": "https://api.provider.example",
1372
+ "mcpUrl": "https://mcp.provider.example",
1373
+ "oauthTokenUrl": "https://api.provider.example/oauth/token"
1374
+ }`
1375
+ }, undefined, false, undefined, this)
1376
+ }, undefined, false, undefined, this)
1377
+ ]
1378
+ }, undefined, true, undefined, this),
1379
+ /* @__PURE__ */ jsxDEV7("div", {
1380
+ className: "space-y-4",
1381
+ children: [
1382
+ /* @__PURE__ */ jsxDEV7("h2", {
1383
+ className: "text-2xl font-bold",
1384
+ children: "Secret payload fields"
1385
+ }, undefined, false, undefined, this),
1386
+ /* @__PURE__ */ jsxDEV7("div", {
1387
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1388
+ children: /* @__PURE__ */ jsxDEV7("pre", {
1389
+ children: `{
1390
+ "apiKey": "...",
1391
+ "accessToken": "...",
1392
+ "refreshToken": "...",
1393
+ "clientId": "...",
1394
+ "clientSecret": "...",
1395
+ "tokenExpiresAt": "2026-02-01T00:00:00.000Z",
1396
+ "mcpAccessToken": "...",
1397
+ "webhookSecret": "..."
1398
+ }`
1399
+ }, undefined, false, undefined, this)
1400
+ }, undefined, false, undefined, this)
1401
+ ]
1402
+ }, undefined, true, undefined, this),
1403
+ /* @__PURE__ */ jsxDEV7("div", {
1404
+ className: "space-y-4",
1405
+ children: [
1406
+ /* @__PURE__ */ jsxDEV7("h2", {
1407
+ className: "text-2xl font-bold",
1408
+ children: "Routing behavior"
1409
+ }, undefined, false, undefined, this),
1410
+ /* @__PURE__ */ jsxDEV7("ul", {
1411
+ className: "text-muted-foreground list-inside list-disc space-y-2",
1412
+ children: [
1413
+ /* @__PURE__ */ jsxDEV7("li", {
1414
+ children: "Unsupported strategies are skipped per provider capability matrix."
1415
+ }, undefined, false, undefined, this),
1416
+ /* @__PURE__ */ jsxDEV7("li", {
1417
+ children: "Missing credentials fail closed and fall through only when a later strategy is valid."
1418
+ }, undefined, false, undefined, this),
1419
+ /* @__PURE__ */ jsxDEV7("li", {
1420
+ children: [
1421
+ "Unofficial routes are disabled unless",
1422
+ /* @__PURE__ */ jsxDEV7("code", {
1423
+ className: "bg-background/50 ml-1 rounded px-2 py-1",
1424
+ children: "allowUnofficial"
1425
+ }, undefined, false, undefined, this),
1426
+ "is true."
1427
+ ]
1428
+ }, undefined, true, undefined, this),
1429
+ /* @__PURE__ */ jsxDEV7("li", {
1430
+ children: [
1431
+ "When",
1432
+ /* @__PURE__ */ jsxDEV7("code", {
1433
+ className: "bg-background/50 ml-1 rounded px-2 py-1",
1434
+ children: "unofficialAllowList"
1435
+ }, undefined, false, undefined, this),
1436
+ "is set, only listed provider keys can route unofficially."
1437
+ ]
1438
+ }, undefined, true, undefined, this),
1439
+ /* @__PURE__ */ jsxDEV7("li", {
1440
+ children: [
1441
+ "OAuth refresh uses",
1442
+ /* @__PURE__ */ jsxDEV7("code", {
1443
+ className: "bg-background/50 ml-1 rounded px-2 py-1",
1444
+ children: "oauthTokenUrl"
1445
+ }, undefined, false, undefined, this),
1446
+ "with refresh/client credentials when APIs return 401."
1447
+ ]
1448
+ }, undefined, true, undefined, this)
1449
+ ]
1450
+ }, undefined, true, undefined, this)
1451
+ ]
1452
+ }, undefined, true, undefined, this),
1453
+ /* @__PURE__ */ jsxDEV7("div", {
1454
+ className: "space-y-4",
1455
+ children: [
1456
+ /* @__PURE__ */ jsxDEV7("h2", {
1457
+ className: "text-2xl font-bold",
1458
+ children: "Provider guidance"
1459
+ }, undefined, false, undefined, this),
1460
+ /* @__PURE__ */ jsxDEV7("ul", {
1461
+ className: "text-muted-foreground list-inside list-disc space-y-2",
1462
+ children: [
1463
+ /* @__PURE__ */ jsxDEV7("li", {
1464
+ children: "Use official APIs when available (Whoop, Oura, Strava, Fitbit)."
1465
+ }, undefined, false, undefined, this),
1466
+ /* @__PURE__ */ jsxDEV7("li", {
1467
+ children: "Use aggregator routing for providers without stable official APIs (Garmin, MyFitnessPal, Eight Sleep, Peloton)."
1468
+ }, undefined, false, undefined, this),
1469
+ /* @__PURE__ */ jsxDEV7("li", {
1470
+ children: "Keep unofficial automation opt-in and auditable for production."
1471
+ }, undefined, false, undefined, this)
1472
+ ]
1473
+ }, undefined, true, undefined, this)
1474
+ ]
1475
+ }, undefined, true, undefined, this),
1476
+ /* @__PURE__ */ jsxDEV7("div", {
1477
+ className: "flex items-center gap-4 pt-4",
1478
+ children: [
1479
+ /* @__PURE__ */ jsxDEV7(Link6, {
1480
+ href: "/docs/integrations/whatsapp-twilio",
1481
+ className: "btn-ghost",
1482
+ children: "Previous: WhatsApp Twilio"
1483
+ }, undefined, false, undefined, this),
1484
+ /* @__PURE__ */ jsxDEV7(Link6, {
1485
+ href: "/docs/integrations",
1486
+ className: "btn-primary",
1487
+ children: "Back to Integrations"
1488
+ }, undefined, false, undefined, this)
1489
+ ]
1490
+ }, undefined, true, undefined, this)
1491
+ ]
1492
+ }, undefined, true, undefined, this);
1493
+ }
1494
+
1495
+ // src/components/docs/integrations/IntegrationsMistralPage.tsx
1496
+ import Link7 from "@contractspec/lib.ui-link";
1497
+ import { ChevronRight as ChevronRight6 } from "lucide-react";
1498
+ import { jsxDEV as jsxDEV8 } from "react/jsx-dev-runtime";
1499
+ function IntegrationsMistralPage() {
1500
+ return /* @__PURE__ */ jsxDEV8("div", {
1501
+ className: "space-y-8",
1502
+ children: [
1503
+ /* @__PURE__ */ jsxDEV8("div", {
1504
+ className: "space-y-4",
1505
+ children: [
1506
+ /* @__PURE__ */ jsxDEV8("h1", {
1507
+ className: "text-4xl font-bold",
1508
+ children: "Mistral"
1509
+ }, undefined, false, undefined, this),
1510
+ /* @__PURE__ */ jsxDEV8("p", {
1511
+ className: "text-muted-foreground",
1512
+ children: "Integrate Mistral models for chat, reasoning, embeddings, speech-to-text, and conversational voice workflows. ContractSpec ships first-class Mistral support across contracts, provider runtime wiring, and CLI provider selection."
1513
+ }, undefined, false, undefined, this)
1514
+ ]
1515
+ }, undefined, true, undefined, this),
1516
+ /* @__PURE__ */ jsxDEV8("div", {
1517
+ className: "space-y-4",
1518
+ children: [
1519
+ /* @__PURE__ */ jsxDEV8("h2", {
1520
+ className: "text-2xl font-bold",
1521
+ children: "Setup"
1522
+ }, undefined, false, undefined, this),
1523
+ /* @__PURE__ */ jsxDEV8("div", {
1524
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1525
+ children: /* @__PURE__ */ jsxDEV8("pre", {
1526
+ children: `# .env
1527
+ MISTRAL_API_KEY=...`
1528
+ }, undefined, false, undefined, this)
1529
+ }, undefined, false, undefined, this)
1530
+ ]
1531
+ }, undefined, true, undefined, this),
1532
+ /* @__PURE__ */ jsxDEV8("div", {
1533
+ className: "space-y-4",
1534
+ children: [
1535
+ /* @__PURE__ */ jsxDEV8("h2", {
1536
+ className: "text-2xl font-bold",
1537
+ children: "Chat and reasoning"
1538
+ }, undefined, false, undefined, this),
1539
+ /* @__PURE__ */ jsxDEV8("div", {
1540
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1541
+ children: /* @__PURE__ */ jsxDEV8("pre", {
1542
+ children: `capabilityId: mistral-chat
1543
+ provider:
1544
+ type: mistral
1545
+ operation: chatCompletion
1546
+
1547
+ inputs:
1548
+ messages:
1549
+ type: array
1550
+ model:
1551
+ type: string
1552
+ default: "mistral-large-latest"
1553
+ temperature:
1554
+ type: number
1555
+ optional: true
1556
+
1557
+ outputs:
1558
+ content:
1559
+ type: string
1560
+ usage:
1561
+ type: object`
1562
+ }, undefined, false, undefined, this)
1563
+ }, undefined, false, undefined, this)
1564
+ ]
1565
+ }, undefined, true, undefined, this),
1566
+ /* @__PURE__ */ jsxDEV8("div", {
1567
+ className: "space-y-4",
1568
+ children: [
1569
+ /* @__PURE__ */ jsxDEV8("h2", {
1570
+ className: "text-2xl font-bold",
1571
+ children: "Embeddings"
1572
+ }, undefined, false, undefined, this),
1573
+ /* @__PURE__ */ jsxDEV8("div", {
1574
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1575
+ children: /* @__PURE__ */ jsxDEV8("pre", {
1576
+ children: `capabilityId: mistral-embeddings
1577
+ provider:
1578
+ type: mistral
1579
+ operation: createEmbedding
1580
+
1581
+ inputs:
1582
+ text:
1583
+ type: string
1584
+ model:
1585
+ type: string
1586
+ default: "mistral-embed"
1587
+
1588
+ outputs:
1589
+ embedding:
1590
+ type: array
1591
+ items:
1592
+ type: number`
1593
+ }, undefined, false, undefined, this)
1594
+ }, undefined, false, undefined, this)
1595
+ ]
1596
+ }, undefined, true, undefined, this),
1597
+ /* @__PURE__ */ jsxDEV8("div", {
1598
+ className: "space-y-4",
1599
+ children: [
1600
+ /* @__PURE__ */ jsxDEV8("h2", {
1601
+ className: "text-2xl font-bold",
1602
+ children: "Speech-to-Text (Voxtral)"
1603
+ }, undefined, false, undefined, this),
1604
+ /* @__PURE__ */ jsxDEV8("div", {
1605
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1606
+ children: /* @__PURE__ */ jsxDEV8("pre", {
1607
+ children: `capabilityId: mistral-stt
1608
+ provider:
1609
+ type: mistral
1610
+ operation: transcribe
1611
+
1612
+ inputs:
1613
+ audio:
1614
+ type: bytes
1615
+ format:
1616
+ type: string
1617
+ language:
1618
+ type: string
1619
+ optional: true
1620
+
1621
+ outputs:
1622
+ text:
1623
+ type: string
1624
+ segments:
1625
+ type: array
1626
+ language:
1627
+ type: string`
1628
+ }, undefined, false, undefined, this)
1629
+ }, undefined, false, undefined, this)
1630
+ ]
1631
+ }, undefined, true, undefined, this),
1632
+ /* @__PURE__ */ jsxDEV8("div", {
1633
+ className: "space-y-4",
1634
+ children: [
1635
+ /* @__PURE__ */ jsxDEV8("h2", {
1636
+ className: "text-2xl font-bold",
1637
+ children: "Conversational voice sessions"
1638
+ }, undefined, false, undefined, this),
1639
+ /* @__PURE__ */ jsxDEV8("p", {
1640
+ className: "text-muted-foreground",
1641
+ children: "Use the conversational provider for session-based realtime voice flows (turn handling, events, and interruption-safe streaming)."
1642
+ }, undefined, false, undefined, this)
1643
+ ]
1644
+ }, undefined, true, undefined, this),
1645
+ /* @__PURE__ */ jsxDEV8("div", {
1646
+ className: "space-y-4",
1647
+ children: [
1648
+ /* @__PURE__ */ jsxDEV8("h2", {
1649
+ className: "text-2xl font-bold",
1650
+ children: "Best practices"
1651
+ }, undefined, false, undefined, this),
1652
+ /* @__PURE__ */ jsxDEV8("ul", {
1653
+ className: "text-muted-foreground list-inside list-disc space-y-2",
1654
+ children: [
1655
+ /* @__PURE__ */ jsxDEV8("li", {
1656
+ children: "Choose model families by workload: coding, reasoning, or speech"
1657
+ }, undefined, false, undefined, this),
1658
+ /* @__PURE__ */ jsxDEV8("li", {
1659
+ children: "Persist session IDs for conversational continuity across turns"
1660
+ }, undefined, false, undefined, this),
1661
+ /* @__PURE__ */ jsxDEV8("li", {
1662
+ children: "Capture token and latency telemetry for provider-level tuning"
1663
+ }, undefined, false, undefined, this),
1664
+ /* @__PURE__ */ jsxDEV8("li", {
1665
+ children: "Set explicit fallbacks for network and rate-limit failures"
1666
+ }, undefined, false, undefined, this)
1667
+ ]
1668
+ }, undefined, true, undefined, this)
1669
+ ]
1670
+ }, undefined, true, undefined, this),
1671
+ /* @__PURE__ */ jsxDEV8("div", {
1672
+ className: "flex items-center gap-4 pt-4",
1673
+ children: [
1674
+ /* @__PURE__ */ jsxDEV8(Link7, {
1675
+ href: "/docs/integrations/openai",
1676
+ className: "btn-ghost",
1677
+ children: "Previous: OpenAI"
1678
+ }, undefined, false, undefined, this),
1679
+ /* @__PURE__ */ jsxDEV8(Link7, {
1680
+ href: "/docs/integrations/elevenlabs",
1681
+ className: "btn-primary",
1682
+ children: [
1683
+ "Next: ElevenLabs ",
1684
+ /* @__PURE__ */ jsxDEV8(ChevronRight6, {
1685
+ size: 16
1686
+ }, undefined, false, undefined, this)
1687
+ ]
1688
+ }, undefined, true, undefined, this)
1689
+ ]
1690
+ }, undefined, true, undefined, this)
1691
+ ]
1692
+ }, undefined, true, undefined, this);
1693
+ }
1694
+
1695
+ // src/components/docs/integrations/IntegrationsOpenAIPage.tsx
1696
+ import Link8 from "@contractspec/lib.ui-link";
1697
+ import { ChevronRight as ChevronRight7 } from "lucide-react";
1698
+ import { jsxDEV as jsxDEV9 } from "react/jsx-dev-runtime";
1699
+ function IntegrationsOpenAIPage() {
1700
+ return /* @__PURE__ */ jsxDEV9("div", {
1701
+ className: "space-y-8",
1702
+ children: [
1703
+ /* @__PURE__ */ jsxDEV9("div", {
1704
+ className: "space-y-4",
1705
+ children: [
1706
+ /* @__PURE__ */ jsxDEV9("h1", {
1707
+ className: "text-4xl font-bold",
1708
+ children: "OpenAI"
1709
+ }, undefined, false, undefined, this),
1710
+ /* @__PURE__ */ jsxDEV9("p", {
1711
+ className: "text-muted-foreground",
1712
+ children: "Integrate OpenAI's powerful AI models for chat completion, embeddings, and speech-to-text. Build intelligent features with GPT-4, generate embeddings for semantic search, and transcribe audio with Whisper."
1713
+ }, undefined, false, undefined, this)
1714
+ ]
1715
+ }, undefined, true, undefined, this),
1716
+ /* @__PURE__ */ jsxDEV9("div", {
1717
+ className: "space-y-4",
1718
+ children: [
1719
+ /* @__PURE__ */ jsxDEV9("h2", {
1720
+ className: "text-2xl font-bold",
1721
+ children: "Setup"
1722
+ }, undefined, false, undefined, this),
1723
+ /* @__PURE__ */ jsxDEV9("div", {
1724
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1725
+ children: /* @__PURE__ */ jsxDEV9("pre", {
1726
+ children: `# .env
1727
+ OPENAI_API_KEY=sk-...
1728
+ OPENAI_ORGANIZATION=org-...`
1729
+ }, undefined, false, undefined, this)
1730
+ }, undefined, false, undefined, this)
1731
+ ]
1732
+ }, undefined, true, undefined, this),
1733
+ /* @__PURE__ */ jsxDEV9("div", {
1734
+ className: "space-y-4",
1735
+ children: [
1736
+ /* @__PURE__ */ jsxDEV9("h2", {
1737
+ className: "text-2xl font-bold",
1738
+ children: "Chat completions"
1739
+ }, undefined, false, undefined, this),
1740
+ /* @__PURE__ */ jsxDEV9("div", {
1741
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1742
+ children: /* @__PURE__ */ jsxDEV9("pre", {
1099
1743
  children: `capabilityId: openai-chat
1100
1744
  provider:
1101
1745
  type: openai
@@ -1126,16 +1770,16 @@ outputs:
1126
1770
  }, undefined, false, undefined, this)
1127
1771
  ]
1128
1772
  }, undefined, true, undefined, this),
1129
- /* @__PURE__ */ jsxDEV6("div", {
1773
+ /* @__PURE__ */ jsxDEV9("div", {
1130
1774
  className: "space-y-4",
1131
1775
  children: [
1132
- /* @__PURE__ */ jsxDEV6("h2", {
1776
+ /* @__PURE__ */ jsxDEV9("h2", {
1133
1777
  className: "text-2xl font-bold",
1134
1778
  children: "Embeddings"
1135
1779
  }, undefined, false, undefined, this),
1136
- /* @__PURE__ */ jsxDEV6("div", {
1780
+ /* @__PURE__ */ jsxDEV9("div", {
1137
1781
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1138
- children: /* @__PURE__ */ jsxDEV6("pre", {
1782
+ children: /* @__PURE__ */ jsxDEV9("pre", {
1139
1783
  children: `capabilityId: openai-embeddings
1140
1784
  provider:
1141
1785
  type: openai
@@ -1157,16 +1801,16 @@ outputs:
1157
1801
  }, undefined, false, undefined, this)
1158
1802
  ]
1159
1803
  }, undefined, true, undefined, this),
1160
- /* @__PURE__ */ jsxDEV6("div", {
1804
+ /* @__PURE__ */ jsxDEV9("div", {
1161
1805
  className: "space-y-4",
1162
1806
  children: [
1163
- /* @__PURE__ */ jsxDEV6("h2", {
1807
+ /* @__PURE__ */ jsxDEV9("h2", {
1164
1808
  className: "text-2xl font-bold",
1165
1809
  children: "Whisper (Speech-to-Text)"
1166
1810
  }, undefined, false, undefined, this),
1167
- /* @__PURE__ */ jsxDEV6("div", {
1811
+ /* @__PURE__ */ jsxDEV9("div", {
1168
1812
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1169
- children: /* @__PURE__ */ jsxDEV6("pre", {
1813
+ children: /* @__PURE__ */ jsxDEV9("pre", {
1170
1814
  children: `capabilityId: openai-transcribe
1171
1815
  provider:
1172
1816
  type: openai
@@ -1188,49 +1832,49 @@ outputs:
1188
1832
  }, undefined, false, undefined, this)
1189
1833
  ]
1190
1834
  }, undefined, true, undefined, this),
1191
- /* @__PURE__ */ jsxDEV6("div", {
1835
+ /* @__PURE__ */ jsxDEV9("div", {
1192
1836
  className: "space-y-4",
1193
1837
  children: [
1194
- /* @__PURE__ */ jsxDEV6("h2", {
1838
+ /* @__PURE__ */ jsxDEV9("h2", {
1195
1839
  className: "text-2xl font-bold",
1196
1840
  children: "Best practices"
1197
1841
  }, undefined, false, undefined, this),
1198
- /* @__PURE__ */ jsxDEV6("ul", {
1842
+ /* @__PURE__ */ jsxDEV9("ul", {
1199
1843
  className: "text-muted-foreground list-inside list-disc space-y-2",
1200
1844
  children: [
1201
- /* @__PURE__ */ jsxDEV6("li", {
1845
+ /* @__PURE__ */ jsxDEV9("li", {
1202
1846
  children: "Use streaming for real-time chat responses"
1203
1847
  }, undefined, false, undefined, this),
1204
- /* @__PURE__ */ jsxDEV6("li", {
1848
+ /* @__PURE__ */ jsxDEV9("li", {
1205
1849
  children: "Cache embeddings to reduce API costs"
1206
1850
  }, undefined, false, undefined, this),
1207
- /* @__PURE__ */ jsxDEV6("li", {
1851
+ /* @__PURE__ */ jsxDEV9("li", {
1208
1852
  children: "Implement rate limiting to avoid quota issues"
1209
1853
  }, undefined, false, undefined, this),
1210
- /* @__PURE__ */ jsxDEV6("li", {
1854
+ /* @__PURE__ */ jsxDEV9("li", {
1211
1855
  children: "Store conversation history for context"
1212
1856
  }, undefined, false, undefined, this),
1213
- /* @__PURE__ */ jsxDEV6("li", {
1857
+ /* @__PURE__ */ jsxDEV9("li", {
1214
1858
  children: "Monitor token usage and costs"
1215
1859
  }, undefined, false, undefined, this)
1216
1860
  ]
1217
1861
  }, undefined, true, undefined, this)
1218
1862
  ]
1219
1863
  }, undefined, true, undefined, this),
1220
- /* @__PURE__ */ jsxDEV6("div", {
1864
+ /* @__PURE__ */ jsxDEV9("div", {
1221
1865
  className: "flex items-center gap-4 pt-4",
1222
1866
  children: [
1223
- /* @__PURE__ */ jsxDEV6(Link5, {
1867
+ /* @__PURE__ */ jsxDEV9(Link8, {
1224
1868
  href: "/docs/integrations/google-calendar",
1225
1869
  className: "btn-ghost",
1226
1870
  children: "Previous: Google Calendar"
1227
1871
  }, undefined, false, undefined, this),
1228
- /* @__PURE__ */ jsxDEV6(Link5, {
1229
- href: "/docs/integrations/elevenlabs",
1872
+ /* @__PURE__ */ jsxDEV9(Link8, {
1873
+ href: "/docs/integrations/mistral",
1230
1874
  className: "btn-primary",
1231
1875
  children: [
1232
- "Next: ElevenLabs ",
1233
- /* @__PURE__ */ jsxDEV6(ChevronRight5, {
1876
+ "Next: Mistral ",
1877
+ /* @__PURE__ */ jsxDEV9(ChevronRight7, {
1234
1878
  size: 16
1235
1879
  }, undefined, false, undefined, this)
1236
1880
  ]
@@ -1242,52 +1886,52 @@ outputs:
1242
1886
  }
1243
1887
 
1244
1888
  // src/components/docs/integrations/IntegrationsPostmarkPage.tsx
1245
- import Link6 from "@contractspec/lib.ui-link";
1246
- import { ChevronRight as ChevronRight6 } from "lucide-react";
1247
- import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
1889
+ import Link9 from "@contractspec/lib.ui-link";
1890
+ import { ChevronRight as ChevronRight8 } from "lucide-react";
1891
+ import { jsxDEV as jsxDEV10 } from "react/jsx-dev-runtime";
1248
1892
  function IntegrationsPostmarkPage() {
1249
- return /* @__PURE__ */ jsxDEV7("div", {
1893
+ return /* @__PURE__ */ jsxDEV10("div", {
1250
1894
  className: "space-y-8",
1251
1895
  children: [
1252
- /* @__PURE__ */ jsxDEV7("div", {
1896
+ /* @__PURE__ */ jsxDEV10("div", {
1253
1897
  className: "space-y-4",
1254
1898
  children: [
1255
- /* @__PURE__ */ jsxDEV7("h1", {
1899
+ /* @__PURE__ */ jsxDEV10("h1", {
1256
1900
  className: "text-4xl font-bold",
1257
1901
  children: "Postmark"
1258
1902
  }, undefined, false, undefined, this),
1259
- /* @__PURE__ */ jsxDEV7("p", {
1903
+ /* @__PURE__ */ jsxDEV10("p", {
1260
1904
  className: "text-muted-foreground",
1261
1905
  children: "Postmark is a transactional email service with industry-leading deliverability. Use it to send order confirmations, password resets, notifications, and other critical emails."
1262
1906
  }, undefined, false, undefined, this)
1263
1907
  ]
1264
1908
  }, undefined, true, undefined, this),
1265
- /* @__PURE__ */ jsxDEV7("div", {
1909
+ /* @__PURE__ */ jsxDEV10("div", {
1266
1910
  className: "space-y-4",
1267
1911
  children: [
1268
- /* @__PURE__ */ jsxDEV7("h2", {
1912
+ /* @__PURE__ */ jsxDEV10("h2", {
1269
1913
  className: "text-2xl font-bold",
1270
1914
  children: "Setup"
1271
1915
  }, undefined, false, undefined, this),
1272
- /* @__PURE__ */ jsxDEV7("p", {
1916
+ /* @__PURE__ */ jsxDEV10("p", {
1273
1917
  className: "text-muted-foreground",
1274
1918
  children: "Add your Postmark credentials to your environment variables:"
1275
1919
  }, undefined, false, undefined, this),
1276
- /* @__PURE__ */ jsxDEV7("div", {
1920
+ /* @__PURE__ */ jsxDEV10("div", {
1277
1921
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1278
- children: /* @__PURE__ */ jsxDEV7("pre", {
1922
+ children: /* @__PURE__ */ jsxDEV10("pre", {
1279
1923
  children: `# .env
1280
1924
  POSTMARK_API_TOKEN=...
1281
1925
  POSTMARK_FROM_EMAIL=noreply@example.com
1282
1926
  POSTMARK_FROM_NAME="Your App Name"`
1283
1927
  }, undefined, false, undefined, this)
1284
1928
  }, undefined, false, undefined, this),
1285
- /* @__PURE__ */ jsxDEV7("p", {
1929
+ /* @__PURE__ */ jsxDEV10("p", {
1286
1930
  className: "text-muted-foreground text-sm",
1287
1931
  children: [
1288
1932
  "Get your API token from the",
1289
1933
  " ",
1290
- /* @__PURE__ */ jsxDEV7("a", {
1934
+ /* @__PURE__ */ jsxDEV10("a", {
1291
1935
  href: "https://account.postmarkapp.com/servers",
1292
1936
  target: "_blank",
1293
1937
  rel: "noopener noreferrer",
@@ -1299,16 +1943,16 @@ POSTMARK_FROM_NAME="Your App Name"`
1299
1943
  }, undefined, true, undefined, this)
1300
1944
  ]
1301
1945
  }, undefined, true, undefined, this),
1302
- /* @__PURE__ */ jsxDEV7("div", {
1946
+ /* @__PURE__ */ jsxDEV10("div", {
1303
1947
  className: "space-y-4",
1304
1948
  children: [
1305
- /* @__PURE__ */ jsxDEV7("h2", {
1949
+ /* @__PURE__ */ jsxDEV10("h2", {
1306
1950
  className: "text-2xl font-bold",
1307
1951
  children: "Sending emails"
1308
1952
  }, undefined, false, undefined, this),
1309
- /* @__PURE__ */ jsxDEV7("div", {
1953
+ /* @__PURE__ */ jsxDEV10("div", {
1310
1954
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1311
- children: /* @__PURE__ */ jsxDEV7("pre", {
1955
+ children: /* @__PURE__ */ jsxDEV10("pre", {
1312
1956
  children: `capabilityId: send-email
1313
1957
  provider:
1314
1958
  type: postmark
@@ -1342,20 +1986,20 @@ outputs:
1342
1986
  }, undefined, false, undefined, this)
1343
1987
  ]
1344
1988
  }, undefined, true, undefined, this),
1345
- /* @__PURE__ */ jsxDEV7("div", {
1989
+ /* @__PURE__ */ jsxDEV10("div", {
1346
1990
  className: "space-y-4",
1347
1991
  children: [
1348
- /* @__PURE__ */ jsxDEV7("h2", {
1992
+ /* @__PURE__ */ jsxDEV10("h2", {
1349
1993
  className: "text-2xl font-bold",
1350
1994
  children: "Using templates"
1351
1995
  }, undefined, false, undefined, this),
1352
- /* @__PURE__ */ jsxDEV7("p", {
1996
+ /* @__PURE__ */ jsxDEV10("p", {
1353
1997
  className: "text-muted-foreground",
1354
1998
  children: "Postmark templates allow you to design emails in their dashboard and populate them with data:"
1355
1999
  }, undefined, false, undefined, this),
1356
- /* @__PURE__ */ jsxDEV7("div", {
2000
+ /* @__PURE__ */ jsxDEV10("div", {
1357
2001
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1358
- children: /* @__PURE__ */ jsxDEV7("pre", {
2002
+ children: /* @__PURE__ */ jsxDEV10("pre", {
1359
2003
  children: `capabilityId: send-welcome-email
1360
2004
  provider:
1361
2005
  type: postmark
@@ -1376,65 +2020,65 @@ config:
1376
2020
  }, undefined, false, undefined, this)
1377
2021
  ]
1378
2022
  }, undefined, true, undefined, this),
1379
- /* @__PURE__ */ jsxDEV7("div", {
2023
+ /* @__PURE__ */ jsxDEV10("div", {
1380
2024
  className: "space-y-4",
1381
2025
  children: [
1382
- /* @__PURE__ */ jsxDEV7("h2", {
2026
+ /* @__PURE__ */ jsxDEV10("h2", {
1383
2027
  className: "text-2xl font-bold",
1384
2028
  children: "Webhooks"
1385
2029
  }, undefined, false, undefined, this),
1386
- /* @__PURE__ */ jsxDEV7("p", {
2030
+ /* @__PURE__ */ jsxDEV10("p", {
1387
2031
  className: "text-muted-foreground",
1388
2032
  children: "Postmark can notify your app about delivery, bounces, and opens:"
1389
2033
  }, undefined, false, undefined, this),
1390
- /* @__PURE__ */ jsxDEV7("div", {
2034
+ /* @__PURE__ */ jsxDEV10("div", {
1391
2035
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1392
- children: /* @__PURE__ */ jsxDEV7("pre", {
2036
+ children: /* @__PURE__ */ jsxDEV10("pre", {
1393
2037
  children: `https://your-app.com/api/webhooks/postmark`
1394
2038
  }, undefined, false, undefined, this)
1395
2039
  }, undefined, false, undefined, this),
1396
- /* @__PURE__ */ jsxDEV7("p", {
2040
+ /* @__PURE__ */ jsxDEV10("p", {
1397
2041
  className: "text-muted-foreground",
1398
2042
  children: "ContractSpec automatically processes these webhook events:"
1399
2043
  }, undefined, false, undefined, this),
1400
- /* @__PURE__ */ jsxDEV7("ul", {
2044
+ /* @__PURE__ */ jsxDEV10("ul", {
1401
2045
  className: "text-muted-foreground list-inside list-disc space-y-2",
1402
2046
  children: [
1403
- /* @__PURE__ */ jsxDEV7("li", {
2047
+ /* @__PURE__ */ jsxDEV10("li", {
1404
2048
  children: [
1405
- /* @__PURE__ */ jsxDEV7("strong", {
2049
+ /* @__PURE__ */ jsxDEV10("strong", {
1406
2050
  children: "Delivery"
1407
2051
  }, undefined, false, undefined, this),
1408
2052
  " \u2013 Email was successfully delivered"
1409
2053
  ]
1410
2054
  }, undefined, true, undefined, this),
1411
- /* @__PURE__ */ jsxDEV7("li", {
2055
+ /* @__PURE__ */ jsxDEV10("li", {
1412
2056
  children: [
1413
- /* @__PURE__ */ jsxDEV7("strong", {
2057
+ /* @__PURE__ */ jsxDEV10("strong", {
1414
2058
  children: "Bounce"
1415
2059
  }, undefined, false, undefined, this),
1416
2060
  " \u2013 Email bounced (hard or soft)"
1417
2061
  ]
1418
2062
  }, undefined, true, undefined, this),
1419
- /* @__PURE__ */ jsxDEV7("li", {
2063
+ /* @__PURE__ */ jsxDEV10("li", {
1420
2064
  children: [
1421
- /* @__PURE__ */ jsxDEV7("strong", {
2065
+ /* @__PURE__ */ jsxDEV10("strong", {
1422
2066
  children: "SpamComplaint"
1423
2067
  }, undefined, false, undefined, this),
1424
2068
  " \u2013 Recipient marked email as spam"
1425
2069
  ]
1426
2070
  }, undefined, true, undefined, this),
1427
- /* @__PURE__ */ jsxDEV7("li", {
2071
+ /* @__PURE__ */ jsxDEV10("li", {
1428
2072
  children: [
1429
- /* @__PURE__ */ jsxDEV7("strong", {
2073
+ /* @__PURE__ */ jsxDEV10("strong", {
1430
2074
  children: "Open"
1431
2075
  }, undefined, false, undefined, this),
1432
2076
  " \u2013 Recipient opened the email"
1433
2077
  ]
1434
2078
  }, undefined, true, undefined, this),
1435
- /* @__PURE__ */ jsxDEV7("li", {
2079
+ /* @__PURE__ */ jsxDEV10("li", {
1436
2080
  children: [
1437
- /* @__PURE__ */ jsxDEV7("strong", {
2081
+ /* @__PURE__ */ jsxDEV10("strong", {
1438
2082
  children: "Click"
1439
2083
  }, undefined, false, undefined, this),
1440
2084
  " \u2013 Recipient clicked a link"
@@ -1444,52 +2088,52 @@ config:
1444
2088
  }, undefined, true, undefined, this)
1445
2089
  ]
1446
2090
  }, undefined, true, undefined, this),
1447
- /* @__PURE__ */ jsxDEV7("div", {
2091
+ /* @__PURE__ */ jsxDEV10("div", {
1448
2092
  className: "space-y-4",
1449
2093
  children: [
1450
- /* @__PURE__ */ jsxDEV7("h2", {
2094
+ /* @__PURE__ */ jsxDEV10("h2", {
1451
2095
  className: "text-2xl font-bold",
1452
2096
  children: "Best practices"
1453
2097
  }, undefined, false, undefined, this),
1454
- /* @__PURE__ */ jsxDEV7("ul", {
2098
+ /* @__PURE__ */ jsxDEV10("ul", {
1455
2099
  className: "text-muted-foreground list-inside list-disc space-y-2",
1456
2100
  children: [
1457
- /* @__PURE__ */ jsxDEV7("li", {
2101
+ /* @__PURE__ */ jsxDEV10("li", {
1458
2102
  children: "Use templates for consistent branding"
1459
2103
  }, undefined, false, undefined, this),
1460
- /* @__PURE__ */ jsxDEV7("li", {
2104
+ /* @__PURE__ */ jsxDEV10("li", {
1461
2105
  children: "Always provide both HTML and plain text versions"
1462
2106
  }, undefined, false, undefined, this),
1463
- /* @__PURE__ */ jsxDEV7("li", {
2107
+ /* @__PURE__ */ jsxDEV10("li", {
1464
2108
  children: "Monitor bounce rates and remove invalid addresses"
1465
2109
  }, undefined, false, undefined, this),
1466
- /* @__PURE__ */ jsxDEV7("li", {
2110
+ /* @__PURE__ */ jsxDEV10("li", {
1467
2111
  children: "Use message streams to separate different email types"
1468
2112
  }, undefined, false, undefined, this),
1469
- /* @__PURE__ */ jsxDEV7("li", {
2113
+ /* @__PURE__ */ jsxDEV10("li", {
1470
2114
  children: "Test emails in the Postmark sandbox before going live"
1471
2115
  }, undefined, false, undefined, this),
1472
- /* @__PURE__ */ jsxDEV7("li", {
2116
+ /* @__PURE__ */ jsxDEV10("li", {
1473
2117
  children: "Set up DKIM and SPF records for your domain"
1474
2118
  }, undefined, false, undefined, this)
1475
2119
  ]
1476
2120
  }, undefined, true, undefined, this)
1477
2121
  ]
1478
2122
  }, undefined, true, undefined, this),
1479
- /* @__PURE__ */ jsxDEV7("div", {
2123
+ /* @__PURE__ */ jsxDEV10("div", {
1480
2124
  className: "flex items-center gap-4 pt-4",
1481
2125
  children: [
1482
- /* @__PURE__ */ jsxDEV7(Link6, {
2126
+ /* @__PURE__ */ jsxDEV10(Link9, {
1483
2127
  href: "/docs/integrations/stripe",
1484
2128
  className: "btn-ghost",
1485
2129
  children: "Previous: Stripe"
1486
2130
  }, undefined, false, undefined, this),
1487
- /* @__PURE__ */ jsxDEV7(Link6, {
2131
+ /* @__PURE__ */ jsxDEV10(Link9, {
1488
2132
  href: "/docs/integrations/resend",
1489
2133
  className: "btn-primary",
1490
2134
  children: [
1491
2135
  "Next: Resend ",
1492
- /* @__PURE__ */ jsxDEV7(ChevronRight6, {
2136
+ /* @__PURE__ */ jsxDEV10(ChevronRight8, {
1493
2137
  size: 16
1494
2138
  }, undefined, false, undefined, this)
1495
2139
  ]
@@ -1501,40 +2145,40 @@ config:
1501
2145
  }
1502
2146
 
1503
2147
  // src/components/docs/integrations/IntegrationsPowensPage.tsx
1504
- import Link7 from "@contractspec/lib.ui-link";
1505
- import { ChevronRight as ChevronRight7 } from "lucide-react";
1506
- import { jsxDEV as jsxDEV8 } from "react/jsx-dev-runtime";
2148
+ import Link10 from "@contractspec/lib.ui-link";
2149
+ import { ChevronRight as ChevronRight9 } from "lucide-react";
2150
+ import { jsxDEV as jsxDEV11 } from "react/jsx-dev-runtime";
1507
2151
  function IntegrationsPowensPage() {
1508
- return /* @__PURE__ */ jsxDEV8("div", {
2152
+ return /* @__PURE__ */ jsxDEV11("div", {
1509
2153
  className: "space-y-8",
1510
2154
  children: [
1511
- /* @__PURE__ */ jsxDEV8("div", {
2155
+ /* @__PURE__ */ jsxDEV11("div", {
1512
2156
  className: "space-y-4",
1513
2157
  children: [
1514
- /* @__PURE__ */ jsxDEV8("h1", {
2158
+ /* @__PURE__ */ jsxDEV11("h1", {
1515
2159
  className: "text-4xl font-bold",
1516
2160
  children: "Powens Open Banking"
1517
2161
  }, undefined, false, undefined, this),
1518
- /* @__PURE__ */ jsxDEV8("p", {
2162
+ /* @__PURE__ */ jsxDEV11("p", {
1519
2163
  className: "text-muted-foreground",
1520
2164
  children: "Powens provides read-only open banking connectivity for ContractSpec applications. The reference integration powers Pocket Family Office by synchronising household bank accounts, transactions, and balances while keeping all raw PII protected."
1521
2165
  }, undefined, false, undefined, this)
1522
2166
  ]
1523
2167
  }, undefined, true, undefined, this),
1524
- /* @__PURE__ */ jsxDEV8("div", {
2168
+ /* @__PURE__ */ jsxDEV11("div", {
1525
2169
  className: "space-y-4",
1526
2170
  children: [
1527
- /* @__PURE__ */ jsxDEV8("h2", {
2171
+ /* @__PURE__ */ jsxDEV11("h2", {
1528
2172
  className: "text-2xl font-bold",
1529
2173
  children: "Setup"
1530
2174
  }, undefined, false, undefined, this),
1531
- /* @__PURE__ */ jsxDEV8("p", {
2175
+ /* @__PURE__ */ jsxDEV11("p", {
1532
2176
  className: "text-muted-foreground",
1533
2177
  children: "Create a Powens BYOK project, then store the credentials in your secret manager. The ContractSpec integration expects the following fields:"
1534
2178
  }, undefined, false, undefined, this),
1535
- /* @__PURE__ */ jsxDEV8("div", {
2179
+ /* @__PURE__ */ jsxDEV11("div", {
1536
2180
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1537
- children: /* @__PURE__ */ jsxDEV8("pre", {
2181
+ children: /* @__PURE__ */ jsxDEV11("pre", {
1538
2182
  children: `{
1539
2183
  "clientId": "powens-client-id",
1540
2184
  "clientSecret": "powens-client-secret",
@@ -1543,25 +2187,25 @@ function IntegrationsPowensPage() {
1543
2187
  }`
1544
2188
  }, undefined, false, undefined, this)
1545
2189
  }, undefined, false, undefined, this),
1546
- /* @__PURE__ */ jsxDEV8("p", {
2190
+ /* @__PURE__ */ jsxDEV11("p", {
1547
2191
  className: "text-muted-foreground text-sm",
1548
2192
  children: "Configure non-secret settings on the integration connection:"
1549
2193
  }, undefined, false, undefined, this),
1550
- /* @__PURE__ */ jsxDEV8("div", {
2194
+ /* @__PURE__ */ jsxDEV11("div", {
1551
2195
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1552
- children: /* @__PURE__ */ jsxDEV8("pre", {
2196
+ children: /* @__PURE__ */ jsxDEV11("pre", {
1553
2197
  children: `environment: sandbox | production
1554
2198
  baseUrl?: https://api-sandbox.powens.com/v2
1555
2199
  region?: eu-west-1
1556
2200
  pollingIntervalMs?: 300000`
1557
2201
  }, undefined, false, undefined, this)
1558
2202
  }, undefined, false, undefined, this),
1559
- /* @__PURE__ */ jsxDEV8("p", {
2203
+ /* @__PURE__ */ jsxDEV11("p", {
1560
2204
  className: "text-muted-foreground text-sm",
1561
2205
  children: [
1562
2206
  "See the",
1563
2207
  " ",
1564
- /* @__PURE__ */ jsxDEV8("a", {
2208
+ /* @__PURE__ */ jsxDEV11("a", {
1565
2209
  href: "https://docs.powens.com/documentation/integration-guides/quick-start/api-overview",
1566
2210
  target: "_blank",
1567
2211
  rel: "noopener noreferrer",
@@ -1574,16 +2218,16 @@ pollingIntervalMs?: 300000`
1574
2218
  }, undefined, true, undefined, this)
1575
2219
  ]
1576
2220
  }, undefined, true, undefined, this),
1577
- /* @__PURE__ */ jsxDEV8("div", {
2221
+ /* @__PURE__ */ jsxDEV11("div", {
1578
2222
  className: "space-y-4",
1579
2223
  children: [
1580
- /* @__PURE__ */ jsxDEV8("h2", {
2224
+ /* @__PURE__ */ jsxDEV11("h2", {
1581
2225
  className: "text-2xl font-bold",
1582
2226
  children: "Capabilities"
1583
2227
  }, undefined, false, undefined, this),
1584
- /* @__PURE__ */ jsxDEV8("div", {
2228
+ /* @__PURE__ */ jsxDEV11("div", {
1585
2229
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1586
- children: /* @__PURE__ */ jsxDEV8("pre", {
2230
+ children: /* @__PURE__ */ jsxDEV11("pre", {
1587
2231
  children: `capabilityId: openbanking.accounts.read
1588
2232
  provider:
1589
2233
  type: openbanking.powens
@@ -1636,26 +2280,26 @@ outputs:
1636
2280
  }, undefined, false, undefined, this)
1637
2281
  ]
1638
2282
  }, undefined, true, undefined, this),
1639
- /* @__PURE__ */ jsxDEV8("div", {
2283
+ /* @__PURE__ */ jsxDEV11("div", {
1640
2284
  className: "space-y-4",
1641
2285
  children: [
1642
- /* @__PURE__ */ jsxDEV8("h2", {
2286
+ /* @__PURE__ */ jsxDEV11("h2", {
1643
2287
  className: "text-2xl font-bold",
1644
2288
  children: "Primary workflows"
1645
2289
  }, undefined, false, undefined, this),
1646
- /* @__PURE__ */ jsxDEV8("div", {
2290
+ /* @__PURE__ */ jsxDEV11("div", {
1647
2291
  className: "space-y-3",
1648
2292
  children: [
1649
- /* @__PURE__ */ jsxDEV8("h3", {
2293
+ /* @__PURE__ */ jsxDEV11("h3", {
1650
2294
  className: "text-lg font-semibold",
1651
2295
  children: "Account sync"
1652
2296
  }, undefined, false, undefined, this),
1653
- /* @__PURE__ */ jsxDEV8("p", {
2297
+ /* @__PURE__ */ jsxDEV11("p", {
1654
2298
  className: "text-muted-foreground",
1655
2299
  children: [
1656
2300
  "The workflow",
1657
2301
  " ",
1658
- /* @__PURE__ */ jsxDEV8("code", {
2302
+ /* @__PURE__ */ jsxDEV11("code", {
1659
2303
  className: "bg-background/50 rounded px-2 py-1",
1660
2304
  children: "pfo.workflow.sync-openbanking-accounts"
1661
2305
  }, undefined, false, undefined, this),
@@ -1665,17 +2309,17 @@ outputs:
1665
2309
  }, undefined, true, undefined, this)
1666
2310
  ]
1667
2311
  }, undefined, true, undefined, this),
1668
- /* @__PURE__ */ jsxDEV8("div", {
2312
+ /* @__PURE__ */ jsxDEV11("div", {
1669
2313
  className: "space-y-3",
1670
2314
  children: [
1671
- /* @__PURE__ */ jsxDEV8("h3", {
2315
+ /* @__PURE__ */ jsxDEV11("h3", {
1672
2316
  className: "text-lg font-semibold",
1673
2317
  children: "Transaction sync"
1674
2318
  }, undefined, false, undefined, this),
1675
- /* @__PURE__ */ jsxDEV8("p", {
2319
+ /* @__PURE__ */ jsxDEV11("p", {
1676
2320
  className: "text-muted-foreground",
1677
2321
  children: [
1678
- /* @__PURE__ */ jsxDEV8("code", {
2322
+ /* @__PURE__ */ jsxDEV11("code", {
1679
2323
  className: "bg-background/50 rounded px-2 py-1",
1680
2324
  children: "pfo.workflow.sync-openbanking-transactions"
1681
2325
  }, undefined, false, undefined, this),
@@ -1685,17 +2329,17 @@ outputs:
1685
2329
  }, undefined, true, undefined, this)
1686
2330
  ]
1687
2331
  }, undefined, true, undefined, this),
1688
- /* @__PURE__ */ jsxDEV8("div", {
2332
+ /* @__PURE__ */ jsxDEV11("div", {
1689
2333
  className: "space-y-3",
1690
2334
  children: [
1691
- /* @__PURE__ */ jsxDEV8("h3", {
2335
+ /* @__PURE__ */ jsxDEV11("h3", {
1692
2336
  className: "text-lg font-semibold",
1693
2337
  children: "Balance refresh"
1694
2338
  }, undefined, false, undefined, this),
1695
- /* @__PURE__ */ jsxDEV8("p", {
2339
+ /* @__PURE__ */ jsxDEV11("p", {
1696
2340
  className: "text-muted-foreground",
1697
2341
  children: [
1698
- /* @__PURE__ */ jsxDEV8("code", {
2342
+ /* @__PURE__ */ jsxDEV11("code", {
1699
2343
  className: "bg-background/50 rounded px-2 py-1",
1700
2344
  children: "pfo.workflow.refresh-openbanking-balances"
1701
2345
  }, undefined, false, undefined, this),
@@ -1705,23 +2349,23 @@ outputs:
1705
2349
  }, undefined, true, undefined, this)
1706
2350
  ]
1707
2351
  }, undefined, true, undefined, this),
1708
- /* @__PURE__ */ jsxDEV8("div", {
2352
+ /* @__PURE__ */ jsxDEV11("div", {
1709
2353
  className: "space-y-3",
1710
2354
  children: [
1711
- /* @__PURE__ */ jsxDEV8("h3", {
2355
+ /* @__PURE__ */ jsxDEV11("h3", {
1712
2356
  className: "text-lg font-semibold",
1713
2357
  children: "Derived financial overview"
1714
2358
  }, undefined, false, undefined, this),
1715
- /* @__PURE__ */ jsxDEV8("p", {
2359
+ /* @__PURE__ */ jsxDEV11("p", {
1716
2360
  className: "text-muted-foreground",
1717
2361
  children: [
1718
- /* @__PURE__ */ jsxDEV8("code", {
2362
+ /* @__PURE__ */ jsxDEV11("code", {
1719
2363
  className: "bg-background/50 rounded px-2 py-1",
1720
2364
  children: "pfo.workflow.generate-openbanking-overview"
1721
2365
  }, undefined, false, undefined, this),
1722
2366
  " ",
1723
2367
  "aggregates balances, category breakdowns, and cashflow trends into the ",
1724
- /* @__PURE__ */ jsxDEV8("code", {
2368
+ /* @__PURE__ */ jsxDEV11("code", {
1725
2369
  children: "knowledge.financial-overview"
1726
2370
  }, undefined, false, undefined, this),
1727
2371
  " space. Only derived summaries are exposed to LLMs."
@@ -1731,28 +2375,28 @@ outputs:
1731
2375
  }, undefined, true, undefined, this)
1732
2376
  ]
1733
2377
  }, undefined, true, undefined, this),
1734
- /* @__PURE__ */ jsxDEV8("div", {
2378
+ /* @__PURE__ */ jsxDEV11("div", {
1735
2379
  className: "space-y-4",
1736
2380
  children: [
1737
- /* @__PURE__ */ jsxDEV8("h2", {
2381
+ /* @__PURE__ */ jsxDEV11("h2", {
1738
2382
  className: "text-2xl font-bold",
1739
2383
  children: "Telemetry & guardrails"
1740
2384
  }, undefined, false, undefined, this),
1741
- /* @__PURE__ */ jsxDEV8("ul", {
2385
+ /* @__PURE__ */ jsxDEV11("ul", {
1742
2386
  className: "text-muted-foreground list-inside list-disc space-y-2",
1743
2387
  children: [
1744
- /* @__PURE__ */ jsxDEV8("li", {
2388
+ /* @__PURE__ */ jsxDEV11("li", {
1745
2389
  children: [
1746
2390
  "Telemetry events such as",
1747
2391
  " ",
1748
- /* @__PURE__ */ jsxDEV8("code", {
2392
+ /* @__PURE__ */ jsxDEV11("code", {
1749
2393
  className: "bg-background/50 rounded px-2 py-1",
1750
2394
  children: "openbanking.accounts.synced"
1751
2395
  }, undefined, false, undefined, this),
1752
2396
  " ",
1753
2397
  "and",
1754
2398
  " ",
1755
- /* @__PURE__ */ jsxDEV8("code", {
2399
+ /* @__PURE__ */ jsxDEV11("code", {
1756
2400
  className: "bg-background/50 rounded px-2 py-1",
1757
2401
  children: "openbanking.transactions.synced"
1758
2402
  }, undefined, false, undefined, this),
@@ -1760,11 +2404,11 @@ outputs:
1760
2404
  "are emitted automatically with tenant, slot, and config metadata."
1761
2405
  ]
1762
2406
  }, undefined, true, undefined, this),
1763
- /* @__PURE__ */ jsxDEV8("li", {
2407
+ /* @__PURE__ */ jsxDEV11("li", {
1764
2408
  children: [
1765
2409
  "Guard helpers ensure the",
1766
2410
  " ",
1767
- /* @__PURE__ */ jsxDEV8("code", {
2411
+ /* @__PURE__ */ jsxDEV11("code", {
1768
2412
  className: "bg-background/50 rounded px-2 py-1",
1769
2413
  children: "primaryOpenBanking"
1770
2414
  }, undefined, false, undefined, this),
@@ -1772,11 +2416,11 @@ outputs:
1772
2416
  "slot is bound and healthy before workflows execute."
1773
2417
  ]
1774
2418
  }, undefined, true, undefined, this),
1775
- /* @__PURE__ */ jsxDEV8("li", {
2419
+ /* @__PURE__ */ jsxDEV11("li", {
1776
2420
  children: [
1777
2421
  "PII fields (IBAN, counterparty names, descriptions) are redacted via",
1778
2422
  " ",
1779
- /* @__PURE__ */ jsxDEV8("code", {
2423
+ /* @__PURE__ */ jsxDEV11("code", {
1780
2424
  className: "bg-background/50 rounded px-2 py-1",
1781
2425
  children: "redactOpenBankingTelemetryPayload"
1782
2426
  }, undefined, false, undefined, this),
@@ -1788,33 +2432,33 @@ outputs:
1788
2432
  }, undefined, true, undefined, this)
1789
2433
  ]
1790
2434
  }, undefined, true, undefined, this),
1791
- /* @__PURE__ */ jsxDEV8("div", {
2435
+ /* @__PURE__ */ jsxDEV11("div", {
1792
2436
  className: "space-y-4",
1793
2437
  children: [
1794
- /* @__PURE__ */ jsxDEV8("h2", {
2438
+ /* @__PURE__ */ jsxDEV11("h2", {
1795
2439
  className: "text-2xl font-bold",
1796
2440
  children: "Best practices"
1797
2441
  }, undefined, false, undefined, this),
1798
- /* @__PURE__ */ jsxDEV8("ul", {
2442
+ /* @__PURE__ */ jsxDEV11("ul", {
1799
2443
  className: "text-muted-foreground list-inside list-disc space-y-2",
1800
2444
  children: [
1801
- /* @__PURE__ */ jsxDEV8("li", {
2445
+ /* @__PURE__ */ jsxDEV11("li", {
1802
2446
  children: "Use BYOK credentials per tenant to avoid cross-tenant exposure."
1803
2447
  }, undefined, false, undefined, this),
1804
- /* @__PURE__ */ jsxDEV8("li", {
2448
+ /* @__PURE__ */ jsxDEV11("li", {
1805
2449
  children: "Store only canonical entities (BankAccountRecord, BankTransactionRecord). Never persist raw Powens payloads or customer PII in logs."
1806
2450
  }, undefined, false, undefined, this),
1807
- /* @__PURE__ */ jsxDEV8("li", {
2451
+ /* @__PURE__ */ jsxDEV11("li", {
1808
2452
  children: "Run the transaction sync on a schedule appropriate for banking SLAs (e.g. every 15 minutes for cashflow dashboards)."
1809
2453
  }, undefined, false, undefined, this),
1810
- /* @__PURE__ */ jsxDEV8("li", {
2454
+ /* @__PURE__ */ jsxDEV11("li", {
1811
2455
  children: "Pair ledger updates with derived summaries to feed the knowledge layer instead of exposing raw transactions to agents."
1812
2456
  }, undefined, false, undefined, this),
1813
- /* @__PURE__ */ jsxDEV8("li", {
2457
+ /* @__PURE__ */ jsxDEV11("li", {
1814
2458
  children: [
1815
2459
  "Monitor telemetry for",
1816
2460
  " ",
1817
- /* @__PURE__ */ jsxDEV8("code", {
2461
+ /* @__PURE__ */ jsxDEV11("code", {
1818
2462
  className: "bg-background/50 rounded px-2 py-1",
1819
2463
  children: "openbanking.*.sync_failed"
1820
2464
  }, undefined, false, undefined, this),
@@ -1826,20 +2470,20 @@ outputs:
1826
2470
  }, undefined, true, undefined, this)
1827
2471
  ]
1828
2472
  }, undefined, true, undefined, this),
1829
- /* @__PURE__ */ jsxDEV8("div", {
2473
+ /* @__PURE__ */ jsxDEV11("div", {
1830
2474
  className: "flex items-center gap-4 pt-4",
1831
2475
  children: [
1832
- /* @__PURE__ */ jsxDEV8(Link7, {
2476
+ /* @__PURE__ */ jsxDEV11(Link10, {
1833
2477
  href: "/docs/integrations",
1834
2478
  className: "btn-ghost",
1835
2479
  children: "Back to Integrations"
1836
2480
  }, undefined, false, undefined, this),
1837
- /* @__PURE__ */ jsxDEV8(Link7, {
2481
+ /* @__PURE__ */ jsxDEV11(Link10, {
1838
2482
  href: "/docs/integrations/stripe",
1839
2483
  className: "btn-primary",
1840
2484
  children: [
1841
2485
  "Next: Stripe ",
1842
- /* @__PURE__ */ jsxDEV8(ChevronRight7, {
2486
+ /* @__PURE__ */ jsxDEV11(ChevronRight9, {
1843
2487
  size: 16
1844
2488
  }, undefined, false, undefined, this)
1845
2489
  ]
@@ -1851,36 +2495,36 @@ outputs:
1851
2495
  }
1852
2496
 
1853
2497
  // src/components/docs/integrations/IntegrationsQdrantPage.tsx
1854
- import Link8 from "@contractspec/lib.ui-link";
1855
- import { ChevronRight as ChevronRight8 } from "lucide-react";
1856
- import { jsxDEV as jsxDEV9 } from "react/jsx-dev-runtime";
2498
+ import Link11 from "@contractspec/lib.ui-link";
2499
+ import { ChevronRight as ChevronRight10 } from "lucide-react";
2500
+ import { jsxDEV as jsxDEV12 } from "react/jsx-dev-runtime";
1857
2501
  function IntegrationsQdrantPage() {
1858
- return /* @__PURE__ */ jsxDEV9("div", {
2502
+ return /* @__PURE__ */ jsxDEV12("div", {
1859
2503
  className: "space-y-8",
1860
2504
  children: [
1861
- /* @__PURE__ */ jsxDEV9("div", {
2505
+ /* @__PURE__ */ jsxDEV12("div", {
1862
2506
  className: "space-y-4",
1863
2507
  children: [
1864
- /* @__PURE__ */ jsxDEV9("h1", {
2508
+ /* @__PURE__ */ jsxDEV12("h1", {
1865
2509
  className: "text-4xl font-bold",
1866
2510
  children: "Qdrant"
1867
2511
  }, undefined, false, undefined, this),
1868
- /* @__PURE__ */ jsxDEV9("p", {
2512
+ /* @__PURE__ */ jsxDEV12("p", {
1869
2513
  className: "text-muted-foreground",
1870
2514
  children: "Qdrant is a high-performance vector database for semantic search, recommendations, and RAG (Retrieval-Augmented Generation) applications."
1871
2515
  }, undefined, false, undefined, this)
1872
2516
  ]
1873
2517
  }, undefined, true, undefined, this),
1874
- /* @__PURE__ */ jsxDEV9("div", {
2518
+ /* @__PURE__ */ jsxDEV12("div", {
1875
2519
  className: "space-y-4",
1876
2520
  children: [
1877
- /* @__PURE__ */ jsxDEV9("h2", {
2521
+ /* @__PURE__ */ jsxDEV12("h2", {
1878
2522
  className: "text-2xl font-bold",
1879
2523
  children: "Setup"
1880
2524
  }, undefined, false, undefined, this),
1881
- /* @__PURE__ */ jsxDEV9("div", {
2525
+ /* @__PURE__ */ jsxDEV12("div", {
1882
2526
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1883
- children: /* @__PURE__ */ jsxDEV9("pre", {
2527
+ children: /* @__PURE__ */ jsxDEV12("pre", {
1884
2528
  children: `# .env
1885
2529
  QDRANT_URL=https://...
1886
2530
  QDRANT_API_KEY=...
@@ -1889,16 +2533,16 @@ QDRANT_COLLECTION=documents`
1889
2533
  }, undefined, false, undefined, this)
1890
2534
  ]
1891
2535
  }, undefined, true, undefined, this),
1892
- /* @__PURE__ */ jsxDEV9("div", {
2536
+ /* @__PURE__ */ jsxDEV12("div", {
1893
2537
  className: "space-y-4",
1894
2538
  children: [
1895
- /* @__PURE__ */ jsxDEV9("h2", {
2539
+ /* @__PURE__ */ jsxDEV12("h2", {
1896
2540
  className: "text-2xl font-bold",
1897
2541
  children: "Storing vectors"
1898
2542
  }, undefined, false, undefined, this),
1899
- /* @__PURE__ */ jsxDEV9("div", {
2543
+ /* @__PURE__ */ jsxDEV12("div", {
1900
2544
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1901
- children: /* @__PURE__ */ jsxDEV9("pre", {
2545
+ children: /* @__PURE__ */ jsxDEV12("pre", {
1902
2546
  children: `capabilityId: qdrant-upsert
1903
2547
  provider:
1904
2548
  type: qdrant
@@ -1923,16 +2567,16 @@ outputs:
1923
2567
  }, undefined, false, undefined, this)
1924
2568
  ]
1925
2569
  }, undefined, true, undefined, this),
1926
- /* @__PURE__ */ jsxDEV9("div", {
2570
+ /* @__PURE__ */ jsxDEV12("div", {
1927
2571
  className: "space-y-4",
1928
2572
  children: [
1929
- /* @__PURE__ */ jsxDEV9("h2", {
2573
+ /* @__PURE__ */ jsxDEV12("h2", {
1930
2574
  className: "text-2xl font-bold",
1931
2575
  children: "Semantic search"
1932
2576
  }, undefined, false, undefined, this),
1933
- /* @__PURE__ */ jsxDEV9("div", {
2577
+ /* @__PURE__ */ jsxDEV12("div", {
1934
2578
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1935
- children: /* @__PURE__ */ jsxDEV9("pre", {
2579
+ children: /* @__PURE__ */ jsxDEV12("pre", {
1936
2580
  children: `capabilityId: qdrant-search
1937
2581
  provider:
1938
2582
  type: qdrant
@@ -1962,16 +2606,16 @@ outputs:
1962
2606
  }, undefined, false, undefined, this)
1963
2607
  ]
1964
2608
  }, undefined, true, undefined, this),
1965
- /* @__PURE__ */ jsxDEV9("div", {
2609
+ /* @__PURE__ */ jsxDEV12("div", {
1966
2610
  className: "space-y-4",
1967
2611
  children: [
1968
- /* @__PURE__ */ jsxDEV9("h2", {
2612
+ /* @__PURE__ */ jsxDEV12("h2", {
1969
2613
  className: "text-2xl font-bold",
1970
2614
  children: "RAG workflow example"
1971
2615
  }, undefined, false, undefined, this),
1972
- /* @__PURE__ */ jsxDEV9("div", {
2616
+ /* @__PURE__ */ jsxDEV12("div", {
1973
2617
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1974
- children: /* @__PURE__ */ jsxDEV9("pre", {
2618
+ children: /* @__PURE__ */ jsxDEV12("pre", {
1975
2619
  children: `workflowId: rag-query
1976
2620
  version: '1.0.0'.0.0
1977
2621
 
@@ -2002,20 +2646,20 @@ steps:
2002
2646
  }, undefined, false, undefined, this)
2003
2647
  ]
2004
2648
  }, undefined, true, undefined, this),
2005
- /* @__PURE__ */ jsxDEV9("div", {
2649
+ /* @__PURE__ */ jsxDEV12("div", {
2006
2650
  className: "flex items-center gap-4 pt-4",
2007
2651
  children: [
2008
- /* @__PURE__ */ jsxDEV9(Link8, {
2652
+ /* @__PURE__ */ jsxDEV12(Link11, {
2009
2653
  href: "/docs/integrations/elevenlabs",
2010
2654
  className: "btn-ghost",
2011
2655
  children: "Previous: ElevenLabs"
2012
2656
  }, undefined, false, undefined, this),
2013
- /* @__PURE__ */ jsxDEV9(Link8, {
2657
+ /* @__PURE__ */ jsxDEV12(Link11, {
2014
2658
  href: "/docs/integrations/s3",
2015
2659
  className: "btn-primary",
2016
2660
  children: [
2017
2661
  "Next: S3 Storage ",
2018
- /* @__PURE__ */ jsxDEV9(ChevronRight8, {
2662
+ /* @__PURE__ */ jsxDEV12(ChevronRight10, {
2019
2663
  size: 16
2020
2664
  }, undefined, false, undefined, this)
2021
2665
  ]
@@ -2027,36 +2671,36 @@ steps:
2027
2671
  }
2028
2672
 
2029
2673
  // src/components/docs/integrations/IntegrationsResendPage.tsx
2030
- import Link9 from "@contractspec/lib.ui-link";
2031
- import { ChevronRight as ChevronRight9 } from "lucide-react";
2032
- import { jsxDEV as jsxDEV10 } from "react/jsx-dev-runtime";
2674
+ import Link12 from "@contractspec/lib.ui-link";
2675
+ import { ChevronRight as ChevronRight11 } from "lucide-react";
2676
+ import { jsxDEV as jsxDEV13 } from "react/jsx-dev-runtime";
2033
2677
  function IntegrationsResendPage() {
2034
- return /* @__PURE__ */ jsxDEV10("div", {
2678
+ return /* @__PURE__ */ jsxDEV13("div", {
2035
2679
  className: "space-y-8",
2036
2680
  children: [
2037
- /* @__PURE__ */ jsxDEV10("div", {
2681
+ /* @__PURE__ */ jsxDEV13("div", {
2038
2682
  className: "space-y-4",
2039
2683
  children: [
2040
- /* @__PURE__ */ jsxDEV10("h1", {
2684
+ /* @__PURE__ */ jsxDEV13("h1", {
2041
2685
  className: "text-4xl font-bold",
2042
2686
  children: "Resend"
2043
2687
  }, undefined, false, undefined, this),
2044
- /* @__PURE__ */ jsxDEV10("p", {
2688
+ /* @__PURE__ */ jsxDEV13("p", {
2045
2689
  className: "text-muted-foreground",
2046
2690
  children: "Resend is a modern email API built for developers. It provides a simple, reliable way to send transactional emails with React Email templates."
2047
2691
  }, undefined, false, undefined, this)
2048
2692
  ]
2049
2693
  }, undefined, true, undefined, this),
2050
- /* @__PURE__ */ jsxDEV10("div", {
2694
+ /* @__PURE__ */ jsxDEV13("div", {
2051
2695
  className: "space-y-4",
2052
2696
  children: [
2053
- /* @__PURE__ */ jsxDEV10("h2", {
2697
+ /* @__PURE__ */ jsxDEV13("h2", {
2054
2698
  className: "text-2xl font-bold",
2055
2699
  children: "Setup"
2056
2700
  }, undefined, false, undefined, this),
2057
- /* @__PURE__ */ jsxDEV10("div", {
2701
+ /* @__PURE__ */ jsxDEV13("div", {
2058
2702
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2059
- children: /* @__PURE__ */ jsxDEV10("pre", {
2703
+ children: /* @__PURE__ */ jsxDEV13("pre", {
2060
2704
  children: `# .env
2061
2705
  RESEND_API_KEY=re_...
2062
2706
  RESEND_FROM_EMAIL=onboarding@resend.dev`
@@ -2064,16 +2708,16 @@ RESEND_FROM_EMAIL=onboarding@resend.dev`
2064
2708
  }, undefined, false, undefined, this)
2065
2709
  ]
2066
2710
  }, undefined, true, undefined, this),
2067
- /* @__PURE__ */ jsxDEV10("div", {
2711
+ /* @__PURE__ */ jsxDEV13("div", {
2068
2712
  className: "space-y-4",
2069
2713
  children: [
2070
- /* @__PURE__ */ jsxDEV10("h2", {
2714
+ /* @__PURE__ */ jsxDEV13("h2", {
2071
2715
  className: "text-2xl font-bold",
2072
2716
  children: "Sending emails"
2073
2717
  }, undefined, false, undefined, this),
2074
- /* @__PURE__ */ jsxDEV10("div", {
2718
+ /* @__PURE__ */ jsxDEV13("div", {
2075
2719
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2076
- children: /* @__PURE__ */ jsxDEV10("pre", {
2720
+ children: /* @__PURE__ */ jsxDEV13("pre", {
2077
2721
  children: `capabilityId: resend-send-email
2078
2722
  provider:
2079
2723
  type: resend
@@ -2100,43 +2744,43 @@ outputs:
2100
2744
  }, undefined, false, undefined, this)
2101
2745
  ]
2102
2746
  }, undefined, true, undefined, this),
2103
- /* @__PURE__ */ jsxDEV10("div", {
2747
+ /* @__PURE__ */ jsxDEV13("div", {
2104
2748
  className: "space-y-4",
2105
2749
  children: [
2106
- /* @__PURE__ */ jsxDEV10("h2", {
2750
+ /* @__PURE__ */ jsxDEV13("h2", {
2107
2751
  className: "text-2xl font-bold",
2108
2752
  children: "Best practices"
2109
2753
  }, undefined, false, undefined, this),
2110
- /* @__PURE__ */ jsxDEV10("ul", {
2754
+ /* @__PURE__ */ jsxDEV13("ul", {
2111
2755
  className: "text-muted-foreground list-inside list-disc space-y-2",
2112
2756
  children: [
2113
- /* @__PURE__ */ jsxDEV10("li", {
2757
+ /* @__PURE__ */ jsxDEV13("li", {
2114
2758
  children: "Use React Email for type-safe templates"
2115
2759
  }, undefined, false, undefined, this),
2116
- /* @__PURE__ */ jsxDEV10("li", {
2760
+ /* @__PURE__ */ jsxDEV13("li", {
2117
2761
  children: "Verify your domain for better deliverability"
2118
2762
  }, undefined, false, undefined, this),
2119
- /* @__PURE__ */ jsxDEV10("li", {
2763
+ /* @__PURE__ */ jsxDEV13("li", {
2120
2764
  children: "Monitor email analytics in the Resend dashboard"
2121
2765
  }, undefined, false, undefined, this)
2122
2766
  ]
2123
2767
  }, undefined, true, undefined, this)
2124
2768
  ]
2125
2769
  }, undefined, true, undefined, this),
2126
- /* @__PURE__ */ jsxDEV10("div", {
2770
+ /* @__PURE__ */ jsxDEV13("div", {
2127
2771
  className: "flex items-center gap-4 pt-4",
2128
2772
  children: [
2129
- /* @__PURE__ */ jsxDEV10(Link9, {
2773
+ /* @__PURE__ */ jsxDEV13(Link12, {
2130
2774
  href: "/docs/integrations/postmark",
2131
2775
  className: "btn-ghost",
2132
2776
  children: "Previous: Postmark"
2133
2777
  }, undefined, false, undefined, this),
2134
- /* @__PURE__ */ jsxDEV10(Link9, {
2778
+ /* @__PURE__ */ jsxDEV13(Link12, {
2135
2779
  href: "/docs/integrations/gmail",
2136
2780
  className: "btn-primary",
2137
2781
  children: [
2138
2782
  "Next: Gmail API ",
2139
- /* @__PURE__ */ jsxDEV10(ChevronRight9, {
2783
+ /* @__PURE__ */ jsxDEV13(ChevronRight11, {
2140
2784
  size: 16
2141
2785
  }, undefined, false, undefined, this)
2142
2786
  ]
@@ -2148,36 +2792,36 @@ outputs:
2148
2792
  }
2149
2793
 
2150
2794
  // src/components/docs/integrations/IntegrationsS3Page.tsx
2151
- import Link10 from "@contractspec/lib.ui-link";
2152
- import { ChevronRight as ChevronRight10 } from "lucide-react";
2153
- import { jsxDEV as jsxDEV11 } from "react/jsx-dev-runtime";
2795
+ import Link13 from "@contractspec/lib.ui-link";
2796
+ import { ChevronRight as ChevronRight12 } from "lucide-react";
2797
+ import { jsxDEV as jsxDEV14 } from "react/jsx-dev-runtime";
2154
2798
  function IntegrationsS3Page() {
2155
- return /* @__PURE__ */ jsxDEV11("div", {
2799
+ return /* @__PURE__ */ jsxDEV14("div", {
2156
2800
  className: "space-y-8",
2157
2801
  children: [
2158
- /* @__PURE__ */ jsxDEV11("div", {
2802
+ /* @__PURE__ */ jsxDEV14("div", {
2159
2803
  className: "space-y-4",
2160
2804
  children: [
2161
- /* @__PURE__ */ jsxDEV11("h1", {
2805
+ /* @__PURE__ */ jsxDEV14("h1", {
2162
2806
  className: "text-4xl font-bold",
2163
2807
  children: "S3-Compatible Storage"
2164
2808
  }, undefined, false, undefined, this),
2165
- /* @__PURE__ */ jsxDEV11("p", {
2809
+ /* @__PURE__ */ jsxDEV14("p", {
2166
2810
  className: "text-muted-foreground",
2167
2811
  children: "Store files, images, and documents using any S3-compatible object storage service including AWS S3, Scaleway Object Storage, MinIO, DigitalOcean Spaces, and more."
2168
2812
  }, undefined, false, undefined, this)
2169
2813
  ]
2170
2814
  }, undefined, true, undefined, this),
2171
- /* @__PURE__ */ jsxDEV11("div", {
2815
+ /* @__PURE__ */ jsxDEV14("div", {
2172
2816
  className: "space-y-4",
2173
2817
  children: [
2174
- /* @__PURE__ */ jsxDEV11("h2", {
2818
+ /* @__PURE__ */ jsxDEV14("h2", {
2175
2819
  className: "text-2xl font-bold",
2176
2820
  children: "Setup"
2177
2821
  }, undefined, false, undefined, this),
2178
- /* @__PURE__ */ jsxDEV11("div", {
2822
+ /* @__PURE__ */ jsxDEV14("div", {
2179
2823
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2180
- children: /* @__PURE__ */ jsxDEV11("pre", {
2824
+ children: /* @__PURE__ */ jsxDEV14("pre", {
2181
2825
  children: `# .env
2182
2826
  S3_ENDPOINT=https://s3.fr-par.scw.cloud
2183
2827
  S3_ACCESS_KEY_ID=...
@@ -2188,16 +2832,16 @@ S3_REGION=fr-par`
2188
2832
  }, undefined, false, undefined, this)
2189
2833
  ]
2190
2834
  }, undefined, true, undefined, this),
2191
- /* @__PURE__ */ jsxDEV11("div", {
2835
+ /* @__PURE__ */ jsxDEV14("div", {
2192
2836
  className: "space-y-4",
2193
2837
  children: [
2194
- /* @__PURE__ */ jsxDEV11("h2", {
2838
+ /* @__PURE__ */ jsxDEV14("h2", {
2195
2839
  className: "text-2xl font-bold",
2196
2840
  children: "Uploading files"
2197
2841
  }, undefined, false, undefined, this),
2198
- /* @__PURE__ */ jsxDEV11("div", {
2842
+ /* @__PURE__ */ jsxDEV14("div", {
2199
2843
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2200
- children: /* @__PURE__ */ jsxDEV11("pre", {
2844
+ children: /* @__PURE__ */ jsxDEV14("pre", {
2201
2845
  children: `capabilityId: s3-upload
2202
2846
  provider:
2203
2847
  type: s3
@@ -2225,16 +2869,16 @@ outputs:
2225
2869
  }, undefined, false, undefined, this)
2226
2870
  ]
2227
2871
  }, undefined, true, undefined, this),
2228
- /* @__PURE__ */ jsxDEV11("div", {
2872
+ /* @__PURE__ */ jsxDEV14("div", {
2229
2873
  className: "space-y-4",
2230
2874
  children: [
2231
- /* @__PURE__ */ jsxDEV11("h2", {
2875
+ /* @__PURE__ */ jsxDEV14("h2", {
2232
2876
  className: "text-2xl font-bold",
2233
2877
  children: "Generating presigned URLs"
2234
2878
  }, undefined, false, undefined, this),
2235
- /* @__PURE__ */ jsxDEV11("div", {
2879
+ /* @__PURE__ */ jsxDEV14("div", {
2236
2880
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2237
- children: /* @__PURE__ */ jsxDEV11("pre", {
2881
+ children: /* @__PURE__ */ jsxDEV14("pre", {
2238
2882
  children: `capabilityId: s3-presigned-url
2239
2883
  provider:
2240
2884
  type: s3
@@ -2255,49 +2899,207 @@ outputs:
2255
2899
  }, undefined, false, undefined, this)
2256
2900
  ]
2257
2901
  }, undefined, true, undefined, this),
2258
- /* @__PURE__ */ jsxDEV11("div", {
2902
+ /* @__PURE__ */ jsxDEV14("div", {
2259
2903
  className: "space-y-4",
2260
2904
  children: [
2261
- /* @__PURE__ */ jsxDEV11("h2", {
2905
+ /* @__PURE__ */ jsxDEV14("h2", {
2262
2906
  className: "text-2xl font-bold",
2263
2907
  children: "Best practices"
2264
2908
  }, undefined, false, undefined, this),
2265
- /* @__PURE__ */ jsxDEV11("ul", {
2909
+ /* @__PURE__ */ jsxDEV14("ul", {
2266
2910
  className: "text-muted-foreground list-inside list-disc space-y-2",
2267
2911
  children: [
2268
- /* @__PURE__ */ jsxDEV11("li", {
2912
+ /* @__PURE__ */ jsxDEV14("li", {
2269
2913
  children: "Use presigned URLs for secure, temporary access"
2270
2914
  }, undefined, false, undefined, this),
2271
- /* @__PURE__ */ jsxDEV11("li", {
2915
+ /* @__PURE__ */ jsxDEV14("li", {
2272
2916
  children: "Set appropriate CORS policies for browser uploads"
2273
2917
  }, undefined, false, undefined, this),
2274
- /* @__PURE__ */ jsxDEV11("li", {
2918
+ /* @__PURE__ */ jsxDEV14("li", {
2275
2919
  children: "Enable versioning for important files"
2276
2920
  }, undefined, false, undefined, this),
2277
- /* @__PURE__ */ jsxDEV11("li", {
2921
+ /* @__PURE__ */ jsxDEV14("li", {
2278
2922
  children: "Use lifecycle policies to archive old files"
2279
2923
  }, undefined, false, undefined, this),
2280
- /* @__PURE__ */ jsxDEV11("li", {
2924
+ /* @__PURE__ */ jsxDEV14("li", {
2281
2925
  children: "Organize files with a clear key structure"
2282
2926
  }, undefined, false, undefined, this)
2283
2927
  ]
2284
2928
  }, undefined, true, undefined, this)
2285
2929
  ]
2286
2930
  }, undefined, true, undefined, this),
2287
- /* @__PURE__ */ jsxDEV11("div", {
2931
+ /* @__PURE__ */ jsxDEV14("div", {
2288
2932
  className: "flex items-center gap-4 pt-4",
2289
2933
  children: [
2290
- /* @__PURE__ */ jsxDEV11(Link10, {
2934
+ /* @__PURE__ */ jsxDEV14(Link13, {
2291
2935
  href: "/docs/integrations/qdrant",
2292
2936
  className: "btn-ghost",
2293
2937
  children: "Previous: Qdrant"
2294
2938
  }, undefined, false, undefined, this),
2295
- /* @__PURE__ */ jsxDEV11(Link10, {
2939
+ /* @__PURE__ */ jsxDEV14(Link13, {
2296
2940
  href: "/docs/integrations/twilio",
2297
2941
  className: "btn-primary",
2298
2942
  children: [
2299
2943
  "Next: Twilio ",
2300
- /* @__PURE__ */ jsxDEV11(ChevronRight10, {
2944
+ /* @__PURE__ */ jsxDEV14(ChevronRight12, {
2945
+ size: 16
2946
+ }, undefined, false, undefined, this)
2947
+ ]
2948
+ }, undefined, true, undefined, this)
2949
+ ]
2950
+ }, undefined, true, undefined, this)
2951
+ ]
2952
+ }, undefined, true, undefined, this);
2953
+ }
2954
+
2955
+ // src/components/docs/integrations/IntegrationsSlackPage.tsx
2956
+ import Link14 from "@contractspec/lib.ui-link";
2957
+ import { ChevronRight as ChevronRight13 } from "lucide-react";
2958
+ import { jsxDEV as jsxDEV15 } from "react/jsx-dev-runtime";
2959
+ function IntegrationsSlackPage() {
2960
+ return /* @__PURE__ */ jsxDEV15("div", {
2961
+ className: "space-y-8",
2962
+ children: [
2963
+ /* @__PURE__ */ jsxDEV15("div", {
2964
+ className: "space-y-4",
2965
+ children: [
2966
+ /* @__PURE__ */ jsxDEV15("h1", {
2967
+ className: "text-4xl font-bold",
2968
+ children: "Slack Messaging"
2969
+ }, undefined, false, undefined, this),
2970
+ /* @__PURE__ */ jsxDEV15("p", {
2971
+ className: "text-muted-foreground",
2972
+ children: "ContractSpec supports signed Slack event ingestion and outbox-backed outbound replies through the channel runtime."
2973
+ }, undefined, false, undefined, this)
2974
+ ]
2975
+ }, undefined, true, undefined, this),
2976
+ /* @__PURE__ */ jsxDEV15("div", {
2977
+ className: "space-y-4",
2978
+ children: [
2979
+ /* @__PURE__ */ jsxDEV15("h2", {
2980
+ className: "text-2xl font-bold",
2981
+ children: "Required secrets and config"
2982
+ }, undefined, false, undefined, this),
2983
+ /* @__PURE__ */ jsxDEV15("div", {
2984
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2985
+ children: /* @__PURE__ */ jsxDEV15("pre", {
2986
+ children: `// secret payload
2987
+ {
2988
+ "botToken": "xoxb-...",
2989
+ "signingSecret": "..."
2990
+ }
2991
+
2992
+ // optional connection config
2993
+ {
2994
+ "defaultChannelId": "C0123456789",
2995
+ "apiBaseUrl": "https://slack.com/api"
2996
+ }`
2997
+ }, undefined, false, undefined, this)
2998
+ }, undefined, false, undefined, this)
2999
+ ]
3000
+ }, undefined, true, undefined, this),
3001
+ /* @__PURE__ */ jsxDEV15("div", {
3002
+ className: "space-y-4",
3003
+ children: [
3004
+ /* @__PURE__ */ jsxDEV15("h2", {
3005
+ className: "text-2xl font-bold",
3006
+ children: "Webhook ingress"
3007
+ }, undefined, false, undefined, this),
3008
+ /* @__PURE__ */ jsxDEV15("ul", {
3009
+ className: "text-muted-foreground list-inside list-disc space-y-2",
3010
+ children: [
3011
+ /* @__PURE__ */ jsxDEV15("li", {
3012
+ children: [
3013
+ "Inbound events are accepted on",
3014
+ " ",
3015
+ /* @__PURE__ */ jsxDEV15("code", {
3016
+ className: "bg-background/50 rounded px-2 py-1",
3017
+ children: "/webhooks/slack/events"
3018
+ }, undefined, false, undefined, this),
3019
+ "."
3020
+ ]
3021
+ }, undefined, true, undefined, this),
3022
+ /* @__PURE__ */ jsxDEV15("li", {
3023
+ children: [
3024
+ "Requests are validated with Slack signatures (",
3025
+ /* @__PURE__ */ jsxDEV15("code", {
3026
+ className: "bg-background/50 rounded px-2 py-1",
3027
+ children: "x-slack-signature"
3028
+ }, undefined, false, undefined, this),
3029
+ " ",
3030
+ "+ timestamp tolerance)."
3031
+ ]
3032
+ }, undefined, true, undefined, this),
3033
+ /* @__PURE__ */ jsxDEV15("li", {
3034
+ children: "Normalized events are deduplicated and persisted before any outbound side effects."
3035
+ }, undefined, false, undefined, this)
3036
+ ]
3037
+ }, undefined, true, undefined, this)
3038
+ ]
3039
+ }, undefined, true, undefined, this),
3040
+ /* @__PURE__ */ jsxDEV15("div", {
3041
+ className: "space-y-4",
3042
+ children: [
3043
+ /* @__PURE__ */ jsxDEV15("h2", {
3044
+ className: "text-2xl font-bold",
3045
+ children: "Workspace routing and dispatch"
3046
+ }, undefined, false, undefined, this),
3047
+ /* @__PURE__ */ jsxDEV15("div", {
3048
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
3049
+ children: /* @__PURE__ */ jsxDEV15("pre", {
3050
+ children: `# Workspace mapping (recommended)
3051
+ CHANNEL_WORKSPACE_MAP_SLACK={"T123":"workspace-acme"}
3052
+
3053
+ # Dispatch protection
3054
+ CHANNEL_DISPATCH_TOKEN=...
3055
+
3056
+ # Optional scheduler
3057
+ CHANNEL_DISPATCH_INTERVAL_MS=120000
3058
+ CHANNEL_DISPATCH_RUN_ON_START=1`
3059
+ }, undefined, false, undefined, this)
3060
+ }, undefined, false, undefined, this)
3061
+ ]
3062
+ }, undefined, true, undefined, this),
3063
+ /* @__PURE__ */ jsxDEV15("div", {
3064
+ className: "space-y-4",
3065
+ children: [
3066
+ /* @__PURE__ */ jsxDEV15("h2", {
3067
+ className: "text-2xl font-bold",
3068
+ children: "Best practices"
3069
+ }, undefined, false, undefined, this),
3070
+ /* @__PURE__ */ jsxDEV15("ul", {
3071
+ className: "text-muted-foreground list-inside list-disc space-y-2",
3072
+ children: [
3073
+ /* @__PURE__ */ jsxDEV15("li", {
3074
+ children: "Keep bot tokens and signing secrets in a managed secret provider."
3075
+ }, undefined, false, undefined, this),
3076
+ /* @__PURE__ */ jsxDEV15("li", {
3077
+ children: "Use workspace mapping to prevent cross-tenant event leakage."
3078
+ }, undefined, false, undefined, this),
3079
+ /* @__PURE__ */ jsxDEV15("li", {
3080
+ children: "Keep dispatch asynchronous so webhook handlers stay fast and reliable."
3081
+ }, undefined, false, undefined, this),
3082
+ /* @__PURE__ */ jsxDEV15("li", {
3083
+ children: "Monitor telemetry for ingest, decision, outbox, and dispatch stages."
3084
+ }, undefined, false, undefined, this)
3085
+ ]
3086
+ }, undefined, true, undefined, this)
3087
+ ]
3088
+ }, undefined, true, undefined, this),
3089
+ /* @__PURE__ */ jsxDEV15("div", {
3090
+ className: "flex items-center gap-4 pt-4",
3091
+ children: [
3092
+ /* @__PURE__ */ jsxDEV15(Link14, {
3093
+ href: "/docs/integrations/twilio",
3094
+ className: "btn-ghost",
3095
+ children: "Previous: Twilio SMS"
3096
+ }, undefined, false, undefined, this),
3097
+ /* @__PURE__ */ jsxDEV15(Link14, {
3098
+ href: "/docs/integrations/github",
3099
+ className: "btn-primary",
3100
+ children: [
3101
+ "Next: GitHub Messaging ",
3102
+ /* @__PURE__ */ jsxDEV15(ChevronRight13, {
2301
3103
  size: 16
2302
3104
  }, undefined, false, undefined, this)
2303
3105
  ]
@@ -2309,46 +3111,46 @@ outputs:
2309
3111
  }
2310
3112
 
2311
3113
  // src/components/docs/integrations/IntegrationsSpecModelPage.tsx
2312
- import Link11 from "@contractspec/lib.ui-link";
2313
- import { ChevronRight as ChevronRight11 } from "lucide-react";
2314
- import { jsxDEV as jsxDEV12 } from "react/jsx-dev-runtime";
3114
+ import Link15 from "@contractspec/lib.ui-link";
3115
+ import { ChevronRight as ChevronRight14 } from "lucide-react";
3116
+ import { jsxDEV as jsxDEV16 } from "react/jsx-dev-runtime";
2315
3117
  function IntegrationsSpecModelPage() {
2316
- return /* @__PURE__ */ jsxDEV12("div", {
3118
+ return /* @__PURE__ */ jsxDEV16("div", {
2317
3119
  className: "space-y-8",
2318
3120
  children: [
2319
- /* @__PURE__ */ jsxDEV12("div", {
3121
+ /* @__PURE__ */ jsxDEV16("div", {
2320
3122
  className: "space-y-4",
2321
3123
  children: [
2322
- /* @__PURE__ */ jsxDEV12("h1", {
3124
+ /* @__PURE__ */ jsxDEV16("h1", {
2323
3125
  className: "text-4xl font-bold",
2324
3126
  children: "Integration Spec Model"
2325
3127
  }, undefined, false, undefined, this),
2326
- /* @__PURE__ */ jsxDEV12("p", {
3128
+ /* @__PURE__ */ jsxDEV16("p", {
2327
3129
  className: "text-muted-foreground",
2328
3130
  children: "Integrations in ContractSpec are defined through typed specifications that declare capabilities, configuration requirements, and connection details. This page covers IntegrationSpec and IntegrationConnection."
2329
3131
  }, undefined, false, undefined, this)
2330
3132
  ]
2331
3133
  }, undefined, true, undefined, this),
2332
- /* @__PURE__ */ jsxDEV12("div", {
3134
+ /* @__PURE__ */ jsxDEV16("div", {
2333
3135
  className: "space-y-4",
2334
3136
  children: [
2335
- /* @__PURE__ */ jsxDEV12("h2", {
3137
+ /* @__PURE__ */ jsxDEV16("h2", {
2336
3138
  className: "text-2xl font-bold",
2337
3139
  children: "IntegrationSpec"
2338
3140
  }, undefined, false, undefined, this),
2339
- /* @__PURE__ */ jsxDEV12("p", {
3141
+ /* @__PURE__ */ jsxDEV16("p", {
2340
3142
  className: "text-muted-foreground",
2341
3143
  children: [
2342
3144
  "The ",
2343
- /* @__PURE__ */ jsxDEV12("strong", {
3145
+ /* @__PURE__ */ jsxDEV16("strong", {
2344
3146
  children: "IntegrationSpec"
2345
3147
  }, undefined, false, undefined, this),
2346
3148
  " is a global definition of an integration provider. It declares what the integration provides and what it requires."
2347
3149
  ]
2348
3150
  }, undefined, true, undefined, this),
2349
- /* @__PURE__ */ jsxDEV12("div", {
3151
+ /* @__PURE__ */ jsxDEV16("div", {
2350
3152
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2351
- children: /* @__PURE__ */ jsxDEV12("pre", {
3153
+ children: /* @__PURE__ */ jsxDEV16("pre", {
2352
3154
  children: `type IntegrationSpec = {
2353
3155
  id: string;
2354
3156
  label: string;
@@ -2407,16 +3209,16 @@ function IntegrationsSpecModelPage() {
2407
3209
  }, undefined, false, undefined, this)
2408
3210
  ]
2409
3211
  }, undefined, true, undefined, this),
2410
- /* @__PURE__ */ jsxDEV12("div", {
3212
+ /* @__PURE__ */ jsxDEV16("div", {
2411
3213
  className: "space-y-4",
2412
3214
  children: [
2413
- /* @__PURE__ */ jsxDEV12("h2", {
3215
+ /* @__PURE__ */ jsxDEV16("h2", {
2414
3216
  className: "text-2xl font-bold",
2415
3217
  children: "Example: Stripe IntegrationSpec"
2416
3218
  }, undefined, false, undefined, this),
2417
- /* @__PURE__ */ jsxDEV12("div", {
3219
+ /* @__PURE__ */ jsxDEV16("div", {
2418
3220
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2419
- children: /* @__PURE__ */ jsxDEV12("pre", {
3221
+ children: /* @__PURE__ */ jsxDEV16("pre", {
2420
3222
  children: `{
2421
3223
  id: "stripe",
2422
3224
  label: "Stripe",
@@ -2487,26 +3289,26 @@ function IntegrationsSpecModelPage() {
2487
3289
  }, undefined, false, undefined, this)
2488
3290
  ]
2489
3291
  }, undefined, true, undefined, this),
2490
- /* @__PURE__ */ jsxDEV12("div", {
3292
+ /* @__PURE__ */ jsxDEV16("div", {
2491
3293
  className: "space-y-4",
2492
3294
  children: [
2493
- /* @__PURE__ */ jsxDEV12("h2", {
3295
+ /* @__PURE__ */ jsxDEV16("h2", {
2494
3296
  className: "text-2xl font-bold",
2495
3297
  children: "IntegrationConnection"
2496
3298
  }, undefined, false, undefined, this),
2497
- /* @__PURE__ */ jsxDEV12("p", {
3299
+ /* @__PURE__ */ jsxDEV16("p", {
2498
3300
  className: "text-muted-foreground",
2499
3301
  children: [
2500
3302
  "An ",
2501
- /* @__PURE__ */ jsxDEV12("strong", {
3303
+ /* @__PURE__ */ jsxDEV16("strong", {
2502
3304
  children: "IntegrationConnection"
2503
3305
  }, undefined, false, undefined, this),
2504
3306
  " is a per-tenant instance of an integration with configured credentials and environment settings."
2505
3307
  ]
2506
3308
  }, undefined, true, undefined, this),
2507
- /* @__PURE__ */ jsxDEV12("div", {
3309
+ /* @__PURE__ */ jsxDEV16("div", {
2508
3310
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2509
- children: /* @__PURE__ */ jsxDEV12("pre", {
3311
+ children: /* @__PURE__ */ jsxDEV16("pre", {
2510
3312
  children: `type IntegrationConnection = {
2511
3313
  id: string;
2512
3314
  tenantId: string;
@@ -2536,16 +3338,16 @@ function IntegrationsSpecModelPage() {
2536
3338
  }, undefined, false, undefined, this)
2537
3339
  ]
2538
3340
  }, undefined, true, undefined, this),
2539
- /* @__PURE__ */ jsxDEV12("div", {
3341
+ /* @__PURE__ */ jsxDEV16("div", {
2540
3342
  className: "space-y-4",
2541
3343
  children: [
2542
- /* @__PURE__ */ jsxDEV12("h2", {
3344
+ /* @__PURE__ */ jsxDEV16("h2", {
2543
3345
  className: "text-2xl font-bold",
2544
3346
  children: "Example: Stripe IntegrationConnection"
2545
3347
  }, undefined, false, undefined, this),
2546
- /* @__PURE__ */ jsxDEV12("div", {
3348
+ /* @__PURE__ */ jsxDEV16("div", {
2547
3349
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2548
- children: /* @__PURE__ */ jsxDEV12("pre", {
3350
+ children: /* @__PURE__ */ jsxDEV16("pre", {
2549
3351
  children: `// Production connection
2550
3352
  {
2551
3353
  id: "conn_stripe_acme_prod",
@@ -2585,47 +3387,119 @@ function IntegrationsSpecModelPage() {
2585
3387
  }, undefined, false, undefined, this)
2586
3388
  ]
2587
3389
  }, undefined, true, undefined, this),
2588
- /* @__PURE__ */ jsxDEV12("div", {
3390
+ /* @__PURE__ */ jsxDEV16("div", {
2589
3391
  className: "space-y-4",
2590
3392
  children: [
2591
- /* @__PURE__ */ jsxDEV12("h2", {
3393
+ /* @__PURE__ */ jsxDEV16("h2", {
3394
+ className: "text-2xl font-bold",
3395
+ children: "Example: Messaging IntegrationConnection"
3396
+ }, undefined, false, undefined, this),
3397
+ /* @__PURE__ */ jsxDEV16("p", {
3398
+ className: "text-muted-foreground",
3399
+ 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."
3400
+ }, undefined, false, undefined, this),
3401
+ /* @__PURE__ */ jsxDEV16("div", {
3402
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
3403
+ children: /* @__PURE__ */ jsxDEV16("pre", {
3404
+ children: `{
3405
+ id: "conn_slack_acme_prod",
3406
+ tenantId: "acme-corp",
3407
+ integrationId: "messaging.slack",
3408
+ environment: "production",
3409
+ config: {
3410
+ defaultChannelId: "C0123456789",
3411
+ apiBaseUrl: "https://slack.com/api"
3412
+ },
3413
+ secretRef: "secret_slack_acme_prod_v1",
3414
+ status: "connected"
3415
+ }
3416
+
3417
+ // secret payload behind secretRef
3418
+ {
3419
+ "botToken": "xoxb-...",
3420
+ "signingSecret": "..."
3421
+ }`
3422
+ }, undefined, false, undefined, this)
3423
+ }, undefined, false, undefined, this)
3424
+ ]
3425
+ }, undefined, true, undefined, this),
3426
+ /* @__PURE__ */ jsxDEV16("div", {
3427
+ className: "space-y-4",
3428
+ children: [
3429
+ /* @__PURE__ */ jsxDEV16("h2", {
3430
+ className: "text-2xl font-bold",
3431
+ children: "Health transport strategy config"
3432
+ }, undefined, false, undefined, this),
3433
+ /* @__PURE__ */ jsxDEV16("p", {
3434
+ className: "text-muted-foreground",
3435
+ children: "Health providers support deterministic transport routing and explicit unofficial gating in connection config."
3436
+ }, undefined, false, undefined, this),
3437
+ /* @__PURE__ */ jsxDEV16("div", {
3438
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
3439
+ children: /* @__PURE__ */ jsxDEV16("pre", {
3440
+ children: `{
3441
+ "defaultTransport": "official-api",
3442
+ "strategyOrder": ["official-api", "aggregator-api", "unofficial"],
3443
+ "allowUnofficial": false,
3444
+ "unofficialAllowList": ["health.peloton"],
3445
+ "mcpUrl": "https://mcp.provider.example",
3446
+ "oauthTokenUrl": "https://api.provider.example/oauth/token"
3447
+ }
3448
+
3449
+ // secret payload behind secretRef
3450
+ {
3451
+ "accessToken": "...",
3452
+ "refreshToken": "...",
3453
+ "clientId": "...",
3454
+ "clientSecret": "...",
3455
+ "tokenExpiresAt": "2026-02-01T00:00:00.000Z",
3456
+ "mcpAccessToken": "..."
3457
+ }`
3458
+ }, undefined, false, undefined, this)
3459
+ }, undefined, false, undefined, this)
3460
+ ]
3461
+ }, undefined, true, undefined, this),
3462
+ /* @__PURE__ */ jsxDEV16("div", {
3463
+ className: "space-y-4",
3464
+ children: [
3465
+ /* @__PURE__ */ jsxDEV16("h2", {
2592
3466
  className: "text-2xl font-bold",
2593
3467
  children: "Health checks"
2594
3468
  }, undefined, false, undefined, this),
2595
- /* @__PURE__ */ jsxDEV12("p", {
3469
+ /* @__PURE__ */ jsxDEV16("p", {
2596
3470
  className: "text-muted-foreground",
2597
3471
  children: "IntegrationConnections are periodically health-checked to ensure they remain valid:"
2598
3472
  }, undefined, false, undefined, this),
2599
- /* @__PURE__ */ jsxDEV12("ul", {
3473
+ /* @__PURE__ */ jsxDEV16("ul", {
2600
3474
  className: "text-muted-foreground list-inside list-disc space-y-2",
2601
3475
  children: [
2602
- /* @__PURE__ */ jsxDEV12("li", {
3476
+ /* @__PURE__ */ jsxDEV16("li", {
2603
3477
  children: [
2604
- /* @__PURE__ */ jsxDEV12("strong", {
3478
+ /* @__PURE__ */ jsxDEV16("strong", {
2605
3479
  children: "API key validation"
2606
3480
  }, undefined, false, undefined, this),
2607
3481
  " - Test that credentials are still valid"
2608
3482
  ]
2609
3483
  }, undefined, true, undefined, this),
2610
- /* @__PURE__ */ jsxDEV12("li", {
3484
+ /* @__PURE__ */ jsxDEV16("li", {
2611
3485
  children: [
2612
- /* @__PURE__ */ jsxDEV12("strong", {
3486
+ /* @__PURE__ */ jsxDEV16("strong", {
2613
3487
  children: "Connectivity check"
2614
3488
  }, undefined, false, undefined, this),
2615
3489
  " - Verify network access to the provider"
2616
3490
  ]
2617
3491
  }, undefined, true, undefined, this),
2618
- /* @__PURE__ */ jsxDEV12("li", {
3492
+ /* @__PURE__ */ jsxDEV16("li", {
2619
3493
  children: [
2620
- /* @__PURE__ */ jsxDEV12("strong", {
3494
+ /* @__PURE__ */ jsxDEV16("strong", {
2621
3495
  children: "Permission verification"
2622
3496
  }, undefined, false, undefined, this),
2623
3497
  " - Ensure required scopes are granted"
2624
3498
  ]
2625
3499
  }, undefined, true, undefined, this),
2626
- /* @__PURE__ */ jsxDEV12("li", {
3500
+ /* @__PURE__ */ jsxDEV16("li", {
2627
3501
  children: [
2628
- /* @__PURE__ */ jsxDEV12("strong", {
3502
+ /* @__PURE__ */ jsxDEV16("strong", {
2629
3503
  children: "Webhook validation"
2630
3504
  }, undefined, false, undefined, this),
2631
3505
  " - Test webhook endpoint reachability"
@@ -2633,91 +3507,91 @@ function IntegrationsSpecModelPage() {
2633
3507
  }, undefined, true, undefined, this)
2634
3508
  ]
2635
3509
  }, undefined, true, undefined, this),
2636
- /* @__PURE__ */ jsxDEV12("p", {
3510
+ /* @__PURE__ */ jsxDEV16("p", {
2637
3511
  className: "text-muted-foreground",
2638
3512
  children: 'Failed health checks update the connection status to "error" and trigger alerts.'
2639
3513
  }, undefined, false, undefined, this)
2640
3514
  ]
2641
3515
  }, undefined, true, undefined, this),
2642
- /* @__PURE__ */ jsxDEV12("div", {
3516
+ /* @__PURE__ */ jsxDEV16("div", {
2643
3517
  className: "space-y-4",
2644
3518
  children: [
2645
- /* @__PURE__ */ jsxDEV12("h2", {
3519
+ /* @__PURE__ */ jsxDEV16("h2", {
2646
3520
  className: "text-2xl font-bold",
2647
3521
  children: "Secret management"
2648
3522
  }, undefined, false, undefined, this),
2649
- /* @__PURE__ */ jsxDEV12("p", {
3523
+ /* @__PURE__ */ jsxDEV16("p", {
2650
3524
  className: "text-muted-foreground",
2651
3525
  children: "Secrets (API keys, tokens) are never stored in plaintext:"
2652
3526
  }, undefined, false, undefined, this),
2653
- /* @__PURE__ */ jsxDEV12("ol", {
3527
+ /* @__PURE__ */ jsxDEV16("ol", {
2654
3528
  className: "text-muted-foreground list-inside list-decimal space-y-2",
2655
3529
  children: [
2656
- /* @__PURE__ */ jsxDEV12("li", {
3530
+ /* @__PURE__ */ jsxDEV16("li", {
2657
3531
  children: "User provides secrets through secure UI or API"
2658
3532
  }, undefined, false, undefined, this),
2659
- /* @__PURE__ */ jsxDEV12("li", {
3533
+ /* @__PURE__ */ jsxDEV16("li", {
2660
3534
  children: "Secrets are encrypted using tenant-specific keys"
2661
3535
  }, undefined, false, undefined, this),
2662
- /* @__PURE__ */ jsxDEV12("li", {
3536
+ /* @__PURE__ */ jsxDEV16("li", {
2663
3537
  children: "Encrypted secrets are stored in secure vault (e.g., AWS Secrets Manager)"
2664
3538
  }, undefined, false, undefined, this),
2665
- /* @__PURE__ */ jsxDEV12("li", {
3539
+ /* @__PURE__ */ jsxDEV16("li", {
2666
3540
  children: "IntegrationConnection stores only a reference (secretRef)"
2667
3541
  }, undefined, false, undefined, this),
2668
- /* @__PURE__ */ jsxDEV12("li", {
3542
+ /* @__PURE__ */ jsxDEV16("li", {
2669
3543
  children: "At runtime, secrets are decrypted on-demand and never logged"
2670
3544
  }, undefined, false, undefined, this)
2671
3545
  ]
2672
3546
  }, undefined, true, undefined, this)
2673
3547
  ]
2674
3548
  }, undefined, true, undefined, this),
2675
- /* @__PURE__ */ jsxDEV12("div", {
3549
+ /* @__PURE__ */ jsxDEV16("div", {
2676
3550
  className: "space-y-4",
2677
3551
  children: [
2678
- /* @__PURE__ */ jsxDEV12("h2", {
3552
+ /* @__PURE__ */ jsxDEV16("h2", {
2679
3553
  className: "text-2xl font-bold",
2680
3554
  children: "Best practices"
2681
3555
  }, undefined, false, undefined, this),
2682
- /* @__PURE__ */ jsxDEV12("ul", {
3556
+ /* @__PURE__ */ jsxDEV16("ul", {
2683
3557
  className: "text-muted-foreground list-inside list-disc space-y-2",
2684
3558
  children: [
2685
- /* @__PURE__ */ jsxDEV12("li", {
3559
+ /* @__PURE__ */ jsxDEV16("li", {
2686
3560
  children: "Always maintain separate sandbox and production connections"
2687
3561
  }, undefined, false, undefined, this),
2688
- /* @__PURE__ */ jsxDEV12("li", {
3562
+ /* @__PURE__ */ jsxDEV16("li", {
2689
3563
  children: "Use descriptive connection IDs that include tenant and environment"
2690
3564
  }, undefined, false, undefined, this),
2691
- /* @__PURE__ */ jsxDEV12("li", {
3565
+ /* @__PURE__ */ jsxDEV16("li", {
2692
3566
  children: "Monitor health check status and set up alerts for failures"
2693
3567
  }, undefined, false, undefined, this),
2694
- /* @__PURE__ */ jsxDEV12("li", {
3568
+ /* @__PURE__ */ jsxDEV16("li", {
2695
3569
  children: "Rotate secrets regularly and update secretRef accordingly"
2696
3570
  }, undefined, false, undefined, this),
2697
- /* @__PURE__ */ jsxDEV12("li", {
3571
+ /* @__PURE__ */ jsxDEV16("li", {
2698
3572
  children: "Document the purpose and ownership of each connection"
2699
3573
  }, undefined, false, undefined, this),
2700
- /* @__PURE__ */ jsxDEV12("li", {
3574
+ /* @__PURE__ */ jsxDEV16("li", {
2701
3575
  children: "Test connections in sandbox before enabling in production"
2702
3576
  }, undefined, false, undefined, this)
2703
3577
  ]
2704
3578
  }, undefined, true, undefined, this)
2705
3579
  ]
2706
3580
  }, undefined, true, undefined, this),
2707
- /* @__PURE__ */ jsxDEV12("div", {
3581
+ /* @__PURE__ */ jsxDEV16("div", {
2708
3582
  className: "flex items-center gap-4 pt-4",
2709
3583
  children: [
2710
- /* @__PURE__ */ jsxDEV12(Link11, {
3584
+ /* @__PURE__ */ jsxDEV16(Link15, {
2711
3585
  href: "/docs/integrations",
2712
3586
  className: "btn-ghost",
2713
3587
  children: "Back to Integrations"
2714
3588
  }, undefined, false, undefined, this),
2715
- /* @__PURE__ */ jsxDEV12(Link11, {
3589
+ /* @__PURE__ */ jsxDEV16(Link15, {
2716
3590
  href: "/docs/architecture/integration-binding",
2717
3591
  className: "btn-primary",
2718
3592
  children: [
2719
3593
  "Integration Binding ",
2720
- /* @__PURE__ */ jsxDEV12(ChevronRight11, {
3594
+ /* @__PURE__ */ jsxDEV16(ChevronRight14, {
2721
3595
  size: 16
2722
3596
  }, undefined, false, undefined, this)
2723
3597
  ]
@@ -2729,52 +3603,52 @@ function IntegrationsSpecModelPage() {
2729
3603
  }
2730
3604
 
2731
3605
  // src/components/docs/integrations/IntegrationsStripePage.tsx
2732
- import Link12 from "@contractspec/lib.ui-link";
2733
- import { ChevronRight as ChevronRight12 } from "lucide-react";
2734
- import { jsxDEV as jsxDEV13 } from "react/jsx-dev-runtime";
3606
+ import Link16 from "@contractspec/lib.ui-link";
3607
+ import { ChevronRight as ChevronRight15 } from "lucide-react";
3608
+ import { jsxDEV as jsxDEV17 } from "react/jsx-dev-runtime";
2735
3609
  function IntegrationsStripePage() {
2736
- return /* @__PURE__ */ jsxDEV13("div", {
3610
+ return /* @__PURE__ */ jsxDEV17("div", {
2737
3611
  className: "space-y-8",
2738
3612
  children: [
2739
- /* @__PURE__ */ jsxDEV13("div", {
3613
+ /* @__PURE__ */ jsxDEV17("div", {
2740
3614
  className: "space-y-4",
2741
3615
  children: [
2742
- /* @__PURE__ */ jsxDEV13("h1", {
3616
+ /* @__PURE__ */ jsxDEV17("h1", {
2743
3617
  className: "text-4xl font-bold",
2744
3618
  children: "Stripe"
2745
3619
  }, undefined, false, undefined, this),
2746
- /* @__PURE__ */ jsxDEV13("p", {
3620
+ /* @__PURE__ */ jsxDEV17("p", {
2747
3621
  className: "text-muted-foreground",
2748
3622
  children: "The Stripe integration enables payment processing, subscription management, and invoicing in your ContractSpec applications. All Stripe operations are type-safe, policy-enforced, and automatically logged."
2749
3623
  }, undefined, false, undefined, this)
2750
3624
  ]
2751
3625
  }, undefined, true, undefined, this),
2752
- /* @__PURE__ */ jsxDEV13("div", {
3626
+ /* @__PURE__ */ jsxDEV17("div", {
2753
3627
  className: "space-y-4",
2754
3628
  children: [
2755
- /* @__PURE__ */ jsxDEV13("h2", {
3629
+ /* @__PURE__ */ jsxDEV17("h2", {
2756
3630
  className: "text-2xl font-bold",
2757
3631
  children: "Setup"
2758
3632
  }, undefined, false, undefined, this),
2759
- /* @__PURE__ */ jsxDEV13("p", {
3633
+ /* @__PURE__ */ jsxDEV17("p", {
2760
3634
  className: "text-muted-foreground",
2761
3635
  children: "Add your Stripe credentials to your environment variables:"
2762
3636
  }, undefined, false, undefined, this),
2763
- /* @__PURE__ */ jsxDEV13("div", {
3637
+ /* @__PURE__ */ jsxDEV17("div", {
2764
3638
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2765
- children: /* @__PURE__ */ jsxDEV13("pre", {
3639
+ children: /* @__PURE__ */ jsxDEV17("pre", {
2766
3640
  children: `# .env
2767
3641
  STRIPE_SECRET_KEY=sk_test_...
2768
3642
  STRIPE_PUBLISHABLE_KEY=pk_test_...
2769
3643
  STRIPE_WEBHOOK_SECRET=whsec_...`
2770
3644
  }, undefined, false, undefined, this)
2771
3645
  }, undefined, false, undefined, this),
2772
- /* @__PURE__ */ jsxDEV13("p", {
3646
+ /* @__PURE__ */ jsxDEV17("p", {
2773
3647
  className: "text-muted-foreground text-sm",
2774
3648
  children: [
2775
3649
  "Get your API keys from the",
2776
3650
  " ",
2777
- /* @__PURE__ */ jsxDEV13("a", {
3651
+ /* @__PURE__ */ jsxDEV17("a", {
2778
3652
  href: "https://dashboard.stripe.com/apikeys",
2779
3653
  target: "_blank",
2780
3654
  rel: "noopener noreferrer",
@@ -2786,23 +3660,23 @@ STRIPE_WEBHOOK_SECRET=whsec_...`
2786
3660
  }, undefined, true, undefined, this)
2787
3661
  ]
2788
3662
  }, undefined, true, undefined, this),
2789
- /* @__PURE__ */ jsxDEV13("div", {
3663
+ /* @__PURE__ */ jsxDEV17("div", {
2790
3664
  className: "space-y-4",
2791
3665
  children: [
2792
- /* @__PURE__ */ jsxDEV13("h2", {
3666
+ /* @__PURE__ */ jsxDEV17("h2", {
2793
3667
  className: "text-2xl font-bold",
2794
3668
  children: "Available capabilities"
2795
3669
  }, undefined, false, undefined, this),
2796
- /* @__PURE__ */ jsxDEV13("div", {
3670
+ /* @__PURE__ */ jsxDEV17("div", {
2797
3671
  className: "space-y-3",
2798
3672
  children: [
2799
- /* @__PURE__ */ jsxDEV13("h3", {
3673
+ /* @__PURE__ */ jsxDEV17("h3", {
2800
3674
  className: "text-lg font-semibold",
2801
3675
  children: "Payment Intents"
2802
3676
  }, undefined, false, undefined, this),
2803
- /* @__PURE__ */ jsxDEV13("div", {
3677
+ /* @__PURE__ */ jsxDEV17("div", {
2804
3678
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2805
- children: /* @__PURE__ */ jsxDEV13("pre", {
3679
+ children: /* @__PURE__ */ jsxDEV17("pre", {
2806
3680
  children: `capabilityId: stripe-create-payment-intent
2807
3681
  provider:
2808
3682
  type: stripe
@@ -2833,16 +3707,16 @@ outputs:
2833
3707
  }, undefined, false, undefined, this)
2834
3708
  ]
2835
3709
  }, undefined, true, undefined, this),
2836
- /* @__PURE__ */ jsxDEV13("div", {
3710
+ /* @__PURE__ */ jsxDEV17("div", {
2837
3711
  className: "space-y-3",
2838
3712
  children: [
2839
- /* @__PURE__ */ jsxDEV13("h3", {
3713
+ /* @__PURE__ */ jsxDEV17("h3", {
2840
3714
  className: "text-lg font-semibold",
2841
3715
  children: "Customers"
2842
3716
  }, undefined, false, undefined, this),
2843
- /* @__PURE__ */ jsxDEV13("div", {
3717
+ /* @__PURE__ */ jsxDEV17("div", {
2844
3718
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2845
- children: /* @__PURE__ */ jsxDEV13("pre", {
3719
+ children: /* @__PURE__ */ jsxDEV17("pre", {
2846
3720
  children: `capabilityId: stripe-create-customer
2847
3721
  provider:
2848
3722
  type: stripe
@@ -2867,16 +3741,16 @@ outputs:
2867
3741
  }, undefined, false, undefined, this)
2868
3742
  ]
2869
3743
  }, undefined, true, undefined, this),
2870
- /* @__PURE__ */ jsxDEV13("div", {
3744
+ /* @__PURE__ */ jsxDEV17("div", {
2871
3745
  className: "space-y-3",
2872
3746
  children: [
2873
- /* @__PURE__ */ jsxDEV13("h3", {
3747
+ /* @__PURE__ */ jsxDEV17("h3", {
2874
3748
  className: "text-lg font-semibold",
2875
3749
  children: "Subscriptions"
2876
3750
  }, undefined, false, undefined, this),
2877
- /* @__PURE__ */ jsxDEV13("div", {
3751
+ /* @__PURE__ */ jsxDEV17("div", {
2878
3752
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2879
- children: /* @__PURE__ */ jsxDEV13("pre", {
3753
+ children: /* @__PURE__ */ jsxDEV17("pre", {
2880
3754
  children: `capabilityId: stripe-create-subscription
2881
3755
  provider:
2882
3756
  type: stripe
@@ -2904,56 +3778,56 @@ outputs:
2904
3778
  }, undefined, true, undefined, this)
2905
3779
  ]
2906
3780
  }, undefined, true, undefined, this),
2907
- /* @__PURE__ */ jsxDEV13("div", {
3781
+ /* @__PURE__ */ jsxDEV17("div", {
2908
3782
  className: "space-y-4",
2909
3783
  children: [
2910
- /* @__PURE__ */ jsxDEV13("h2", {
3784
+ /* @__PURE__ */ jsxDEV17("h2", {
2911
3785
  className: "text-2xl font-bold",
2912
3786
  children: "Webhooks"
2913
3787
  }, undefined, false, undefined, this),
2914
- /* @__PURE__ */ jsxDEV13("p", {
3788
+ /* @__PURE__ */ jsxDEV17("p", {
2915
3789
  className: "text-muted-foreground",
2916
3790
  children: "ContractSpec automatically handles Stripe webhooks. Configure your webhook endpoint in the Stripe Dashboard:"
2917
3791
  }, undefined, false, undefined, this),
2918
- /* @__PURE__ */ jsxDEV13("div", {
3792
+ /* @__PURE__ */ jsxDEV17("div", {
2919
3793
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2920
- children: /* @__PURE__ */ jsxDEV13("pre", {
3794
+ children: /* @__PURE__ */ jsxDEV17("pre", {
2921
3795
  children: `https://your-app.com/api/webhooks/stripe`
2922
3796
  }, undefined, false, undefined, this)
2923
3797
  }, undefined, false, undefined, this),
2924
- /* @__PURE__ */ jsxDEV13("p", {
3798
+ /* @__PURE__ */ jsxDEV17("p", {
2925
3799
  className: "text-muted-foreground",
2926
3800
  children: "Subscribe to these events:"
2927
3801
  }, undefined, false, undefined, this),
2928
- /* @__PURE__ */ jsxDEV13("ul", {
3802
+ /* @__PURE__ */ jsxDEV17("ul", {
2929
3803
  className: "text-muted-foreground list-inside list-disc space-y-2",
2930
3804
  children: [
2931
- /* @__PURE__ */ jsxDEV13("li", {
2932
- children: /* @__PURE__ */ jsxDEV13("code", {
3805
+ /* @__PURE__ */ jsxDEV17("li", {
3806
+ children: /* @__PURE__ */ jsxDEV17("code", {
2933
3807
  className: "bg-background/50 rounded px-2 py-1",
2934
3808
  children: "payment_intent.succeeded"
2935
3809
  }, undefined, false, undefined, this)
2936
3810
  }, undefined, false, undefined, this),
2937
- /* @__PURE__ */ jsxDEV13("li", {
2938
- children: /* @__PURE__ */ jsxDEV13("code", {
3811
+ /* @__PURE__ */ jsxDEV17("li", {
3812
+ children: /* @__PURE__ */ jsxDEV17("code", {
2939
3813
  className: "bg-background/50 rounded px-2 py-1",
2940
3814
  children: "payment_intent.payment_failed"
2941
3815
  }, undefined, false, undefined, this)
2942
3816
  }, undefined, false, undefined, this),
2943
- /* @__PURE__ */ jsxDEV13("li", {
2944
- children: /* @__PURE__ */ jsxDEV13("code", {
3817
+ /* @__PURE__ */ jsxDEV17("li", {
3818
+ children: /* @__PURE__ */ jsxDEV17("code", {
2945
3819
  className: "bg-background/50 rounded px-2 py-1",
2946
3820
  children: "customer.subscription.created"
2947
3821
  }, undefined, false, undefined, this)
2948
3822
  }, undefined, false, undefined, this),
2949
- /* @__PURE__ */ jsxDEV13("li", {
2950
- children: /* @__PURE__ */ jsxDEV13("code", {
3823
+ /* @__PURE__ */ jsxDEV17("li", {
3824
+ children: /* @__PURE__ */ jsxDEV17("code", {
2951
3825
  className: "bg-background/50 rounded px-2 py-1",
2952
3826
  children: "customer.subscription.updated"
2953
3827
  }, undefined, false, undefined, this)
2954
3828
  }, undefined, false, undefined, this),
2955
- /* @__PURE__ */ jsxDEV13("li", {
2956
- children: /* @__PURE__ */ jsxDEV13("code", {
3829
+ /* @__PURE__ */ jsxDEV17("li", {
3830
+ children: /* @__PURE__ */ jsxDEV17("code", {
2957
3831
  className: "bg-background/50 rounded px-2 py-1",
2958
3832
  children: "customer.subscription.deleted"
2959
3833
  }, undefined, false, undefined, this)
@@ -2962,20 +3836,20 @@ outputs:
2962
3836
  }, undefined, true, undefined, this)
2963
3837
  ]
2964
3838
  }, undefined, true, undefined, this),
2965
- /* @__PURE__ */ jsxDEV13("div", {
3839
+ /* @__PURE__ */ jsxDEV17("div", {
2966
3840
  className: "space-y-4",
2967
3841
  children: [
2968
- /* @__PURE__ */ jsxDEV13("h2", {
3842
+ /* @__PURE__ */ jsxDEV17("h2", {
2969
3843
  className: "text-2xl font-bold",
2970
3844
  children: "Example workflow"
2971
3845
  }, undefined, false, undefined, this),
2972
- /* @__PURE__ */ jsxDEV13("p", {
3846
+ /* @__PURE__ */ jsxDEV17("p", {
2973
3847
  className: "text-muted-foreground",
2974
3848
  children: "Here's a complete payment workflow using Stripe:"
2975
3849
  }, undefined, false, undefined, this),
2976
- /* @__PURE__ */ jsxDEV13("div", {
3850
+ /* @__PURE__ */ jsxDEV17("div", {
2977
3851
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
2978
- children: /* @__PURE__ */ jsxDEV13("pre", {
3852
+ children: /* @__PURE__ */ jsxDEV17("pre", {
2979
3853
  children: `workflowId: process-payment
2980
3854
  version: '1.0.0'.0.0
2981
3855
 
@@ -3017,72 +3891,72 @@ steps:
3017
3891
  }, undefined, false, undefined, this)
3018
3892
  ]
3019
3893
  }, undefined, true, undefined, this),
3020
- /* @__PURE__ */ jsxDEV13("div", {
3894
+ /* @__PURE__ */ jsxDEV17("div", {
3021
3895
  className: "space-y-4",
3022
3896
  children: [
3023
- /* @__PURE__ */ jsxDEV13("h2", {
3897
+ /* @__PURE__ */ jsxDEV17("h2", {
3024
3898
  className: "text-2xl font-bold",
3025
3899
  children: "Testing"
3026
3900
  }, undefined, false, undefined, this),
3027
- /* @__PURE__ */ jsxDEV13("p", {
3901
+ /* @__PURE__ */ jsxDEV17("p", {
3028
3902
  className: "text-muted-foreground",
3029
3903
  children: "Use Stripe's test cards for development:"
3030
3904
  }, undefined, false, undefined, this),
3031
- /* @__PURE__ */ jsxDEV13("div", {
3905
+ /* @__PURE__ */ jsxDEV17("div", {
3032
3906
  className: "border-border/50 overflow-x-auto rounded-lg border",
3033
- children: /* @__PURE__ */ jsxDEV13("table", {
3907
+ children: /* @__PURE__ */ jsxDEV17("table", {
3034
3908
  className: "w-full text-left text-sm",
3035
3909
  children: [
3036
- /* @__PURE__ */ jsxDEV13("thead", {
3910
+ /* @__PURE__ */ jsxDEV17("thead", {
3037
3911
  className: "bg-card/50",
3038
- children: /* @__PURE__ */ jsxDEV13("tr", {
3912
+ children: /* @__PURE__ */ jsxDEV17("tr", {
3039
3913
  className: "border-border/50 border-b",
3040
3914
  children: [
3041
- /* @__PURE__ */ jsxDEV13("th", {
3915
+ /* @__PURE__ */ jsxDEV17("th", {
3042
3916
  className: "px-4 py-3 font-semibold",
3043
3917
  children: "Card Number"
3044
3918
  }, undefined, false, undefined, this),
3045
- /* @__PURE__ */ jsxDEV13("th", {
3919
+ /* @__PURE__ */ jsxDEV17("th", {
3046
3920
  className: "px-4 py-3 font-semibold",
3047
3921
  children: "Scenario"
3048
3922
  }, undefined, false, undefined, this)
3049
3923
  ]
3050
3924
  }, undefined, true, undefined, this)
3051
3925
  }, undefined, false, undefined, this),
3052
- /* @__PURE__ */ jsxDEV13("tbody", {
3926
+ /* @__PURE__ */ jsxDEV17("tbody", {
3053
3927
  className: "divide-border/50 divide-y",
3054
3928
  children: [
3055
- /* @__PURE__ */ jsxDEV13("tr", {
3929
+ /* @__PURE__ */ jsxDEV17("tr", {
3056
3930
  children: [
3057
- /* @__PURE__ */ jsxDEV13("td", {
3931
+ /* @__PURE__ */ jsxDEV17("td", {
3058
3932
  className: "px-4 py-3 font-mono",
3059
3933
  children: "4242 4242 4242 4242"
3060
3934
  }, undefined, false, undefined, this),
3061
- /* @__PURE__ */ jsxDEV13("td", {
3935
+ /* @__PURE__ */ jsxDEV17("td", {
3062
3936
  className: "px-4 py-3",
3063
3937
  children: "Successful payment"
3064
3938
  }, undefined, false, undefined, this)
3065
3939
  ]
3066
3940
  }, undefined, true, undefined, this),
3067
- /* @__PURE__ */ jsxDEV13("tr", {
3941
+ /* @__PURE__ */ jsxDEV17("tr", {
3068
3942
  children: [
3069
- /* @__PURE__ */ jsxDEV13("td", {
3943
+ /* @__PURE__ */ jsxDEV17("td", {
3070
3944
  className: "px-4 py-3 font-mono",
3071
3945
  children: "4000 0000 0000 9995"
3072
3946
  }, undefined, false, undefined, this),
3073
- /* @__PURE__ */ jsxDEV13("td", {
3947
+ /* @__PURE__ */ jsxDEV17("td", {
3074
3948
  className: "px-4 py-3",
3075
3949
  children: "Insufficient funds"
3076
3950
  }, undefined, false, undefined, this)
3077
3951
  ]
3078
3952
  }, undefined, true, undefined, this),
3079
- /* @__PURE__ */ jsxDEV13("tr", {
3953
+ /* @__PURE__ */ jsxDEV17("tr", {
3080
3954
  children: [
3081
- /* @__PURE__ */ jsxDEV13("td", {
3955
+ /* @__PURE__ */ jsxDEV17("td", {
3082
3956
  className: "px-4 py-3 font-mono",
3083
3957
  children: "4000 0000 0000 0002"
3084
3958
  }, undefined, false, undefined, this),
3085
- /* @__PURE__ */ jsxDEV13("td", {
3959
+ /* @__PURE__ */ jsxDEV17("td", {
3086
3960
  className: "px-4 py-3",
3087
3961
  children: "Card declined"
3088
3962
  }, undefined, false, undefined, this)
@@ -3095,52 +3969,52 @@ steps:
3095
3969
  }, undefined, false, undefined, this)
3096
3970
  ]
3097
3971
  }, undefined, true, undefined, this),
3098
- /* @__PURE__ */ jsxDEV13("div", {
3972
+ /* @__PURE__ */ jsxDEV17("div", {
3099
3973
  className: "space-y-4",
3100
3974
  children: [
3101
- /* @__PURE__ */ jsxDEV13("h2", {
3975
+ /* @__PURE__ */ jsxDEV17("h2", {
3102
3976
  className: "text-2xl font-bold",
3103
3977
  children: "Best practices"
3104
3978
  }, undefined, false, undefined, this),
3105
- /* @__PURE__ */ jsxDEV13("ul", {
3979
+ /* @__PURE__ */ jsxDEV17("ul", {
3106
3980
  className: "text-muted-foreground list-inside list-disc space-y-2",
3107
3981
  children: [
3108
- /* @__PURE__ */ jsxDEV13("li", {
3982
+ /* @__PURE__ */ jsxDEV17("li", {
3109
3983
  children: "Always use test mode during development"
3110
3984
  }, undefined, false, undefined, this),
3111
- /* @__PURE__ */ jsxDEV13("li", {
3985
+ /* @__PURE__ */ jsxDEV17("li", {
3112
3986
  children: "Verify webhook signatures to prevent fraud"
3113
3987
  }, undefined, false, undefined, this),
3114
- /* @__PURE__ */ jsxDEV13("li", {
3988
+ /* @__PURE__ */ jsxDEV17("li", {
3115
3989
  children: "Handle idempotency for payment operations"
3116
3990
  }, undefined, false, undefined, this),
3117
- /* @__PURE__ */ jsxDEV13("li", {
3991
+ /* @__PURE__ */ jsxDEV17("li", {
3118
3992
  children: "Store customer IDs for recurring payments"
3119
3993
  }, undefined, false, undefined, this),
3120
- /* @__PURE__ */ jsxDEV13("li", {
3994
+ /* @__PURE__ */ jsxDEV17("li", {
3121
3995
  children: "Use metadata to link Stripe objects to your application records"
3122
3996
  }, undefined, false, undefined, this),
3123
- /* @__PURE__ */ jsxDEV13("li", {
3997
+ /* @__PURE__ */ jsxDEV17("li", {
3124
3998
  children: "Monitor failed payments and retry logic"
3125
3999
  }, undefined, false, undefined, this)
3126
4000
  ]
3127
4001
  }, undefined, true, undefined, this)
3128
4002
  ]
3129
4003
  }, undefined, true, undefined, this),
3130
- /* @__PURE__ */ jsxDEV13("div", {
4004
+ /* @__PURE__ */ jsxDEV17("div", {
3131
4005
  className: "flex items-center gap-4 pt-4",
3132
4006
  children: [
3133
- /* @__PURE__ */ jsxDEV13(Link12, {
4007
+ /* @__PURE__ */ jsxDEV17(Link16, {
3134
4008
  href: "/docs/integrations",
3135
4009
  className: "btn-ghost",
3136
4010
  children: "Back to Integrations"
3137
4011
  }, undefined, false, undefined, this),
3138
- /* @__PURE__ */ jsxDEV13(Link12, {
4012
+ /* @__PURE__ */ jsxDEV17(Link16, {
3139
4013
  href: "/docs/integrations/postmark",
3140
4014
  className: "btn-primary",
3141
4015
  children: [
3142
4016
  "Next: Postmark ",
3143
- /* @__PURE__ */ jsxDEV13(ChevronRight12, {
4017
+ /* @__PURE__ */ jsxDEV17(ChevronRight15, {
3144
4018
  size: 16
3145
4019
  }, undefined, false, undefined, this)
3146
4020
  ]
@@ -3152,35 +4026,35 @@ steps:
3152
4026
  }
3153
4027
 
3154
4028
  // src/components/docs/integrations/IntegrationsTwilioPage.tsx
3155
- import Link13 from "@contractspec/lib.ui-link";
3156
- import { jsxDEV as jsxDEV14 } from "react/jsx-dev-runtime";
4029
+ import Link17 from "@contractspec/lib.ui-link";
4030
+ import { jsxDEV as jsxDEV18 } from "react/jsx-dev-runtime";
3157
4031
  function IntegrationsTwilioPage() {
3158
- return /* @__PURE__ */ jsxDEV14("div", {
4032
+ return /* @__PURE__ */ jsxDEV18("div", {
3159
4033
  className: "space-y-8",
3160
4034
  children: [
3161
- /* @__PURE__ */ jsxDEV14("div", {
4035
+ /* @__PURE__ */ jsxDEV18("div", {
3162
4036
  className: "space-y-4",
3163
4037
  children: [
3164
- /* @__PURE__ */ jsxDEV14("h1", {
4038
+ /* @__PURE__ */ jsxDEV18("h1", {
3165
4039
  className: "text-4xl font-bold",
3166
4040
  children: "Twilio"
3167
4041
  }, undefined, false, undefined, this),
3168
- /* @__PURE__ */ jsxDEV14("p", {
4042
+ /* @__PURE__ */ jsxDEV18("p", {
3169
4043
  className: "text-muted-foreground",
3170
4044
  children: "Send SMS notifications, alerts, and two-factor authentication codes using Twilio's reliable messaging platform."
3171
4045
  }, undefined, false, undefined, this)
3172
4046
  ]
3173
4047
  }, undefined, true, undefined, this),
3174
- /* @__PURE__ */ jsxDEV14("div", {
4048
+ /* @__PURE__ */ jsxDEV18("div", {
3175
4049
  className: "space-y-4",
3176
4050
  children: [
3177
- /* @__PURE__ */ jsxDEV14("h2", {
4051
+ /* @__PURE__ */ jsxDEV18("h2", {
3178
4052
  className: "text-2xl font-bold",
3179
4053
  children: "Setup"
3180
4054
  }, undefined, false, undefined, this),
3181
- /* @__PURE__ */ jsxDEV14("div", {
4055
+ /* @__PURE__ */ jsxDEV18("div", {
3182
4056
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
3183
- children: /* @__PURE__ */ jsxDEV14("pre", {
4057
+ children: /* @__PURE__ */ jsxDEV18("pre", {
3184
4058
  children: `# .env
3185
4059
  TWILIO_ACCOUNT_SID=...
3186
4060
  TWILIO_AUTH_TOKEN=...
@@ -3189,16 +4063,16 @@ TWILIO_PHONE_NUMBER=+1234567890`
3189
4063
  }, undefined, false, undefined, this)
3190
4064
  ]
3191
4065
  }, undefined, true, undefined, this),
3192
- /* @__PURE__ */ jsxDEV14("div", {
4066
+ /* @__PURE__ */ jsxDEV18("div", {
3193
4067
  className: "space-y-4",
3194
4068
  children: [
3195
- /* @__PURE__ */ jsxDEV14("h2", {
4069
+ /* @__PURE__ */ jsxDEV18("h2", {
3196
4070
  className: "text-2xl font-bold",
3197
4071
  children: "Sending SMS"
3198
4072
  }, undefined, false, undefined, this),
3199
- /* @__PURE__ */ jsxDEV14("div", {
4073
+ /* @__PURE__ */ jsxDEV18("div", {
3200
4074
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
3201
- children: /* @__PURE__ */ jsxDEV14("pre", {
4075
+ children: /* @__PURE__ */ jsxDEV18("pre", {
3202
4076
  children: `capabilityId: twilio-send-sms
3203
4077
  provider:
3204
4078
  type: twilio
@@ -3221,83 +4095,402 @@ outputs:
3221
4095
  }, undefined, false, undefined, this)
3222
4096
  ]
3223
4097
  }, undefined, true, undefined, this),
3224
- /* @__PURE__ */ jsxDEV14("div", {
4098
+ /* @__PURE__ */ jsxDEV18("div", {
3225
4099
  className: "space-y-4",
3226
4100
  children: [
3227
- /* @__PURE__ */ jsxDEV14("h2", {
4101
+ /* @__PURE__ */ jsxDEV18("h2", {
3228
4102
  className: "text-2xl font-bold",
3229
4103
  children: "Use cases"
3230
4104
  }, undefined, false, undefined, this),
3231
- /* @__PURE__ */ jsxDEV14("ul", {
4105
+ /* @__PURE__ */ jsxDEV18("ul", {
3232
4106
  className: "text-muted-foreground list-inside list-disc space-y-2",
3233
4107
  children: [
3234
- /* @__PURE__ */ jsxDEV14("li", {
4108
+ /* @__PURE__ */ jsxDEV18("li", {
3235
4109
  children: "Order confirmations and shipping updates"
3236
4110
  }, undefined, false, undefined, this),
3237
- /* @__PURE__ */ jsxDEV14("li", {
4111
+ /* @__PURE__ */ jsxDEV18("li", {
3238
4112
  children: "Two-factor authentication codes"
3239
4113
  }, undefined, false, undefined, this),
3240
- /* @__PURE__ */ jsxDEV14("li", {
4114
+ /* @__PURE__ */ jsxDEV18("li", {
3241
4115
  children: "Appointment reminders"
3242
4116
  }, undefined, false, undefined, this),
3243
- /* @__PURE__ */ jsxDEV14("li", {
4117
+ /* @__PURE__ */ jsxDEV18("li", {
3244
4118
  children: "Alert notifications"
3245
4119
  }, undefined, false, undefined, this)
3246
4120
  ]
3247
4121
  }, undefined, true, undefined, this)
3248
4122
  ]
3249
4123
  }, undefined, true, undefined, this),
3250
- /* @__PURE__ */ jsxDEV14("div", {
4124
+ /* @__PURE__ */ jsxDEV18("div", {
3251
4125
  className: "space-y-4",
3252
4126
  children: [
3253
- /* @__PURE__ */ jsxDEV14("h2", {
4127
+ /* @__PURE__ */ jsxDEV18("h2", {
3254
4128
  className: "text-2xl font-bold",
3255
4129
  children: "Best practices"
3256
4130
  }, undefined, false, undefined, this),
3257
- /* @__PURE__ */ jsxDEV14("ul", {
4131
+ /* @__PURE__ */ jsxDEV18("ul", {
3258
4132
  className: "text-muted-foreground list-inside list-disc space-y-2",
3259
4133
  children: [
3260
- /* @__PURE__ */ jsxDEV14("li", {
4134
+ /* @__PURE__ */ jsxDEV18("li", {
3261
4135
  children: "Always use E.164 format for phone numbers (+1234567890)"
3262
4136
  }, undefined, false, undefined, this),
3263
- /* @__PURE__ */ jsxDEV14("li", {
4137
+ /* @__PURE__ */ jsxDEV18("li", {
3264
4138
  children: "Keep messages under 160 characters to avoid splitting"
3265
4139
  }, undefined, false, undefined, this),
3266
- /* @__PURE__ */ jsxDEV14("li", {
4140
+ /* @__PURE__ */ jsxDEV18("li", {
3267
4141
  children: "Implement rate limiting to prevent spam"
3268
4142
  }, undefined, false, undefined, this),
3269
- /* @__PURE__ */ jsxDEV14("li", {
4143
+ /* @__PURE__ */ jsxDEV18("li", {
3270
4144
  children: "Handle delivery failures gracefully"
3271
4145
  }, undefined, false, undefined, this),
3272
- /* @__PURE__ */ jsxDEV14("li", {
4146
+ /* @__PURE__ */ jsxDEV18("li", {
3273
4147
  children: "Respect opt-out requests"
3274
4148
  }, undefined, false, undefined, this)
3275
4149
  ]
3276
4150
  }, undefined, true, undefined, this)
3277
4151
  ]
3278
4152
  }, undefined, true, undefined, this),
3279
- /* @__PURE__ */ jsxDEV14("div", {
4153
+ /* @__PURE__ */ jsxDEV18("div", {
3280
4154
  className: "flex items-center gap-4 pt-4",
3281
4155
  children: [
3282
- /* @__PURE__ */ jsxDEV14(Link13, {
4156
+ /* @__PURE__ */ jsxDEV18(Link17, {
3283
4157
  href: "/docs/integrations/s3",
3284
4158
  className: "btn-ghost",
3285
4159
  children: "Previous: S3 Storage"
3286
4160
  }, undefined, false, undefined, this),
3287
- /* @__PURE__ */ jsxDEV14(Link13, {
3288
- href: "/docs/integrations",
4161
+ /* @__PURE__ */ jsxDEV18(Link17, {
4162
+ href: "/docs/integrations/slack",
3289
4163
  className: "btn-primary",
3290
- children: "Back to Integrations"
4164
+ children: "Next: Slack Messaging"
4165
+ }, undefined, false, undefined, this)
4166
+ ]
4167
+ }, undefined, true, undefined, this)
4168
+ ]
4169
+ }, undefined, true, undefined, this);
4170
+ }
4171
+
4172
+ // src/components/docs/integrations/IntegrationsWhatsappMetaPage.tsx
4173
+ import Link18 from "@contractspec/lib.ui-link";
4174
+ import { ChevronRight as ChevronRight16 } from "lucide-react";
4175
+ import { jsxDEV as jsxDEV19 } from "react/jsx-dev-runtime";
4176
+ function IntegrationsWhatsappMetaPage() {
4177
+ return /* @__PURE__ */ jsxDEV19("div", {
4178
+ className: "space-y-8",
4179
+ children: [
4180
+ /* @__PURE__ */ jsxDEV19("div", {
4181
+ className: "space-y-4",
4182
+ children: [
4183
+ /* @__PURE__ */ jsxDEV19("h1", {
4184
+ className: "text-4xl font-bold",
4185
+ children: "WhatsApp Meta"
4186
+ }, undefined, false, undefined, this),
4187
+ /* @__PURE__ */ jsxDEV19("p", {
4188
+ className: "text-muted-foreground",
4189
+ children: "Meta WhatsApp is the primary WhatsApp channel for ContractSpec's messaging runtime, with signed webhook verification and reliable outbound delivery."
4190
+ }, undefined, false, undefined, this)
4191
+ ]
4192
+ }, undefined, true, undefined, this),
4193
+ /* @__PURE__ */ jsxDEV19("div", {
4194
+ className: "space-y-4",
4195
+ children: [
4196
+ /* @__PURE__ */ jsxDEV19("h2", {
4197
+ className: "text-2xl font-bold",
4198
+ children: "Required secrets and config"
4199
+ }, undefined, false, undefined, this),
4200
+ /* @__PURE__ */ jsxDEV19("div", {
4201
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
4202
+ children: /* @__PURE__ */ jsxDEV19("pre", {
4203
+ children: `// secret payload
4204
+ {
4205
+ "accessToken": "...",
4206
+ "appSecret": "...",
4207
+ "verifyToken": "..."
4208
+ }
4209
+
4210
+ // required connection config
4211
+ {
4212
+ "phoneNumberId": "120000000001",
4213
+ "apiVersion": "v22.0"
4214
+ }`
4215
+ }, undefined, false, undefined, this)
4216
+ }, undefined, false, undefined, this)
4217
+ ]
4218
+ }, undefined, true, undefined, this),
4219
+ /* @__PURE__ */ jsxDEV19("div", {
4220
+ className: "space-y-4",
4221
+ children: [
4222
+ /* @__PURE__ */ jsxDEV19("h2", {
4223
+ className: "text-2xl font-bold",
4224
+ children: "Webhook endpoints"
4225
+ }, undefined, false, undefined, this),
4226
+ /* @__PURE__ */ jsxDEV19("ul", {
4227
+ className: "text-muted-foreground list-inside list-disc space-y-2",
4228
+ children: [
4229
+ /* @__PURE__ */ jsxDEV19("li", {
4230
+ children: [
4231
+ "Verification challenge:",
4232
+ " ",
4233
+ /* @__PURE__ */ jsxDEV19("code", {
4234
+ className: "bg-background/50 rounded px-2 py-1",
4235
+ children: "GET /webhooks/whatsapp/meta"
4236
+ }, undefined, false, undefined, this)
4237
+ ]
4238
+ }, undefined, true, undefined, this),
4239
+ /* @__PURE__ */ jsxDEV19("li", {
4240
+ children: [
4241
+ "Inbound messages:",
4242
+ " ",
4243
+ /* @__PURE__ */ jsxDEV19("code", {
4244
+ className: "bg-background/50 rounded px-2 py-1",
4245
+ children: "POST /webhooks/whatsapp/meta"
4246
+ }, undefined, false, undefined, this)
4247
+ ]
4248
+ }, undefined, true, undefined, this),
4249
+ /* @__PURE__ */ jsxDEV19("li", {
4250
+ children: [
4251
+ "Signatures are validated with",
4252
+ " ",
4253
+ /* @__PURE__ */ jsxDEV19("code", {
4254
+ className: "bg-background/50 rounded px-2 py-1",
4255
+ children: "x-hub-signature-256"
4256
+ }, undefined, false, undefined, this),
4257
+ "."
4258
+ ]
4259
+ }, undefined, true, undefined, this)
4260
+ ]
4261
+ }, undefined, true, undefined, this)
4262
+ ]
4263
+ }, undefined, true, undefined, this),
4264
+ /* @__PURE__ */ jsxDEV19("div", {
4265
+ className: "space-y-4",
4266
+ children: [
4267
+ /* @__PURE__ */ jsxDEV19("h2", {
4268
+ className: "text-2xl font-bold",
4269
+ children: "Workspace mapping"
4270
+ }, undefined, false, undefined, this),
4271
+ /* @__PURE__ */ jsxDEV19("div", {
4272
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
4273
+ children: /* @__PURE__ */ jsxDEV19("pre", {
4274
+ children: `CHANNEL_WORKSPACE_MAP_WHATSAPP_META={"120000000001":"workspace-acme"}`
4275
+ }, undefined, false, undefined, this)
4276
+ }, undefined, false, undefined, this)
4277
+ ]
4278
+ }, undefined, true, undefined, this),
4279
+ /* @__PURE__ */ jsxDEV19("div", {
4280
+ className: "space-y-4",
4281
+ children: [
4282
+ /* @__PURE__ */ jsxDEV19("h2", {
4283
+ className: "text-2xl font-bold",
4284
+ children: "Best practices"
4285
+ }, undefined, false, undefined, this),
4286
+ /* @__PURE__ */ jsxDEV19("ul", {
4287
+ className: "text-muted-foreground list-inside list-disc space-y-2",
4288
+ children: [
4289
+ /* @__PURE__ */ jsxDEV19("li", {
4290
+ children: "Keep verify and app secrets separate from access tokens."
4291
+ }, undefined, false, undefined, this),
4292
+ /* @__PURE__ */ jsxDEV19("li", {
4293
+ children: "Map each phone number ID to a workspace for strict tenant routing."
4294
+ }, undefined, false, undefined, this),
4295
+ /* @__PURE__ */ jsxDEV19("li", {
4296
+ children: "Use Twilio WhatsApp only as fallback when you need active-passive routing."
4297
+ }, undefined, false, undefined, this)
4298
+ ]
4299
+ }, undefined, true, undefined, this)
4300
+ ]
4301
+ }, undefined, true, undefined, this),
4302
+ /* @__PURE__ */ jsxDEV19("div", {
4303
+ className: "flex items-center gap-4 pt-4",
4304
+ children: [
4305
+ /* @__PURE__ */ jsxDEV19(Link18, {
4306
+ href: "/docs/integrations/github",
4307
+ className: "btn-ghost",
4308
+ children: "Previous: GitHub Messaging"
4309
+ }, undefined, false, undefined, this),
4310
+ /* @__PURE__ */ jsxDEV19(Link18, {
4311
+ href: "/docs/integrations/whatsapp-twilio",
4312
+ className: "btn-primary",
4313
+ children: [
4314
+ "Next: WhatsApp Twilio ",
4315
+ /* @__PURE__ */ jsxDEV19(ChevronRight16, {
4316
+ size: 16
4317
+ }, undefined, false, undefined, this)
4318
+ ]
4319
+ }, undefined, true, undefined, this)
4320
+ ]
4321
+ }, undefined, true, undefined, this)
4322
+ ]
4323
+ }, undefined, true, undefined, this);
4324
+ }
4325
+
4326
+ // src/components/docs/integrations/IntegrationsWhatsappTwilioPage.tsx
4327
+ import Link19 from "@contractspec/lib.ui-link";
4328
+ import { ChevronRight as ChevronRight17 } from "lucide-react";
4329
+ import { jsxDEV as jsxDEV20 } from "react/jsx-dev-runtime";
4330
+ function IntegrationsWhatsappTwilioPage() {
4331
+ return /* @__PURE__ */ jsxDEV20("div", {
4332
+ className: "space-y-8",
4333
+ children: [
4334
+ /* @__PURE__ */ jsxDEV20("div", {
4335
+ className: "space-y-4",
4336
+ children: [
4337
+ /* @__PURE__ */ jsxDEV20("h1", {
4338
+ className: "text-4xl font-bold",
4339
+ children: "WhatsApp Twilio"
4340
+ }, undefined, false, undefined, this),
4341
+ /* @__PURE__ */ jsxDEV20("p", {
4342
+ className: "text-muted-foreground",
4343
+ children: "Twilio WhatsApp support provides a durable fallback channel with signature verification and outbox-backed outbound dispatch."
4344
+ }, undefined, false, undefined, this)
4345
+ ]
4346
+ }, undefined, true, undefined, this),
4347
+ /* @__PURE__ */ jsxDEV20("div", {
4348
+ className: "space-y-4",
4349
+ children: [
4350
+ /* @__PURE__ */ jsxDEV20("h2", {
4351
+ className: "text-2xl font-bold",
4352
+ children: "Required secrets and config"
4353
+ }, undefined, false, undefined, this),
4354
+ /* @__PURE__ */ jsxDEV20("div", {
4355
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
4356
+ children: /* @__PURE__ */ jsxDEV20("pre", {
4357
+ children: `// secret payload
4358
+ {
4359
+ "accountSid": "AC123",
4360
+ "authToken": "..."
4361
+ }
4362
+
4363
+ // optional connection config
4364
+ {
4365
+ "fromNumber": "whatsapp:+15550002"
4366
+ }`
4367
+ }, undefined, false, undefined, this)
4368
+ }, undefined, false, undefined, this)
4369
+ ]
4370
+ }, undefined, true, undefined, this),
4371
+ /* @__PURE__ */ jsxDEV20("div", {
4372
+ className: "space-y-4",
4373
+ children: [
4374
+ /* @__PURE__ */ jsxDEV20("h2", {
4375
+ className: "text-2xl font-bold",
4376
+ children: "Webhook ingress"
4377
+ }, undefined, false, undefined, this),
4378
+ /* @__PURE__ */ jsxDEV20("ul", {
4379
+ className: "text-muted-foreground list-inside list-disc space-y-2",
4380
+ children: [
4381
+ /* @__PURE__ */ jsxDEV20("li", {
4382
+ children: [
4383
+ "Inbound Twilio form payloads are accepted on",
4384
+ " ",
4385
+ /* @__PURE__ */ jsxDEV20("code", {
4386
+ className: "bg-background/50 rounded px-2 py-1",
4387
+ children: "/webhooks/whatsapp/twilio"
4388
+ }, undefined, false, undefined, this),
4389
+ "."
4390
+ ]
4391
+ }, undefined, true, undefined, this),
4392
+ /* @__PURE__ */ jsxDEV20("li", {
4393
+ children: [
4394
+ "Signatures are validated with",
4395
+ " ",
4396
+ /* @__PURE__ */ jsxDEV20("code", {
4397
+ className: "bg-background/50 rounded px-2 py-1",
4398
+ children: "x-twilio-signature"
4399
+ }, undefined, false, undefined, this),
4400
+ " ",
4401
+ "and the configured auth token."
4402
+ ]
4403
+ }, undefined, true, undefined, this),
4404
+ /* @__PURE__ */ jsxDEV20("li", {
4405
+ children: [
4406
+ "For deterministic verification, set the exact public webhook URL in",
4407
+ " ",
4408
+ /* @__PURE__ */ jsxDEV20("code", {
4409
+ className: "bg-background/50 rounded px-2 py-1",
4410
+ children: "WHATSAPP_TWILIO_WEBHOOK_URL"
4411
+ }, undefined, false, undefined, this),
4412
+ "."
4413
+ ]
4414
+ }, undefined, true, undefined, this)
4415
+ ]
4416
+ }, undefined, true, undefined, this)
4417
+ ]
4418
+ }, undefined, true, undefined, this),
4419
+ /* @__PURE__ */ jsxDEV20("div", {
4420
+ className: "space-y-4",
4421
+ children: [
4422
+ /* @__PURE__ */ jsxDEV20("h2", {
4423
+ className: "text-2xl font-bold",
4424
+ children: "Workspace mapping"
4425
+ }, undefined, false, undefined, this),
4426
+ /* @__PURE__ */ jsxDEV20("div", {
4427
+ className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
4428
+ children: /* @__PURE__ */ jsxDEV20("pre", {
4429
+ children: `CHANNEL_WORKSPACE_MAP_WHATSAPP_TWILIO={"AC123":"workspace-acme"}`
4430
+ }, undefined, false, undefined, this)
3291
4431
  }, undefined, false, undefined, this)
3292
4432
  ]
4433
+ }, undefined, true, undefined, this),
4434
+ /* @__PURE__ */ jsxDEV20("div", {
4435
+ className: "space-y-4",
4436
+ children: [
4437
+ /* @__PURE__ */ jsxDEV20("h2", {
4438
+ className: "text-2xl font-bold",
4439
+ children: "Best practices"
4440
+ }, undefined, false, undefined, this),
4441
+ /* @__PURE__ */ jsxDEV20("ul", {
4442
+ className: "text-muted-foreground list-inside list-disc space-y-2",
4443
+ children: [
4444
+ /* @__PURE__ */ jsxDEV20("li", {
4445
+ children: "Use Twilio as fallback when Meta WhatsApp is your primary route."
4446
+ }, undefined, false, undefined, this),
4447
+ /* @__PURE__ */ jsxDEV20("li", {
4448
+ children: "Keep account SID mapping explicit to avoid tenant misrouting."
4449
+ }, undefined, false, undefined, this),
4450
+ /* @__PURE__ */ jsxDEV20("li", {
4451
+ children: [
4452
+ "Protect internal dispatch endpoints with",
4453
+ /* @__PURE__ */ jsxDEV20("code", {
4454
+ className: "bg-background/50 ml-1 rounded px-2 py-1",
4455
+ children: "CHANNEL_DISPATCH_TOKEN"
4456
+ }, undefined, false, undefined, this),
4457
+ "."
4458
+ ]
4459
+ }, undefined, true, undefined, this)
4460
+ ]
4461
+ }, undefined, true, undefined, this)
4462
+ ]
4463
+ }, undefined, true, undefined, this),
4464
+ /* @__PURE__ */ jsxDEV20("div", {
4465
+ className: "flex items-center gap-4 pt-4",
4466
+ children: [
4467
+ /* @__PURE__ */ jsxDEV20(Link19, {
4468
+ href: "/docs/integrations/whatsapp-meta",
4469
+ className: "btn-ghost",
4470
+ children: "Previous: WhatsApp Meta"
4471
+ }, undefined, false, undefined, this),
4472
+ /* @__PURE__ */ jsxDEV20(Link19, {
4473
+ href: "/docs/integrations/health-routing",
4474
+ className: "btn-primary",
4475
+ children: [
4476
+ "Next: Health Routing ",
4477
+ /* @__PURE__ */ jsxDEV20(ChevronRight17, {
4478
+ size: 16
4479
+ }, undefined, false, undefined, this)
4480
+ ]
4481
+ }, undefined, true, undefined, this)
4482
+ ]
3293
4483
  }, undefined, true, undefined, this)
3294
4484
  ]
3295
4485
  }, undefined, true, undefined, this);
3296
4486
  }
3297
4487
  export {
4488
+ IntegrationsWhatsappTwilioPage,
4489
+ IntegrationsWhatsappMetaPage,
3298
4490
  IntegrationsTwilioPage,
3299
4491
  IntegrationsStripePage,
3300
4492
  IntegrationsSpecModelPage,
4493
+ IntegrationsSlackPage,
3301
4494
  IntegrationsS3Page,
3302
4495
  IntegrationsResendPage,
3303
4496
  IntegrationsQdrantPage,
@@ -3305,8 +4498,11 @@ export {
3305
4498
  IntegrationsPostmarkPage,
3306
4499
  IntegrationsOverviewPage,
3307
4500
  IntegrationsOpenAIPage,
4501
+ IntegrationsMistralPage,
4502
+ IntegrationsHealthRoutingPage,
3308
4503
  IntegrationsGoogleCalendarPage,
3309
4504
  IntegrationsGmailPage,
4505
+ IntegrationsGithubPage,
3310
4506
  IntegrationsElevenLabsPage,
3311
4507
  IntegrationsCircuitBreakersPage
3312
4508
  };