@contractspec/bundle.library 2.9.1 → 3.0.0

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