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