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