@contractspec/bundle.library 3.8.9 → 3.8.11
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 +606 -594
- package/CHANGELOG.md +68 -0
- package/dist/application/context-storage/index.js +1 -28
- package/dist/application/index.js +13 -2133
- package/dist/application/mcp/cliMcp.js +4 -452
- package/dist/application/mcp/common.js +1 -193
- package/dist/application/mcp/contractsMcp.js +2 -549
- package/dist/application/mcp/contractsMcpResources.js +2 -123
- package/dist/application/mcp/contractsMcpTools.js +1 -199
- package/dist/application/mcp/docsMcp.catalog.js +3 -381
- package/dist/application/mcp/docsMcp.data.js +1 -147
- package/dist/application/mcp/docsMcp.js +6 -1039
- package/dist/application/mcp/docsMcp.prompts.js +6 -521
- package/dist/application/mcp/docsMcp.reference.js +3 -235
- package/dist/application/mcp/docsMcp.resources.js +3 -519
- package/dist/application/mcp/docsMcp.tools.js +3 -518
- package/dist/application/mcp/index.js +13 -2106
- package/dist/application/mcp/internalMcp.js +2 -410
- package/dist/application/mcp/normalizeMcpRequest.js +1 -21
- package/dist/application/mcp/providerRankingMcp.js +1 -530
- package/dist/bundles/LibraryBundle.js +1 -138
- package/dist/bundles/index.js +1 -138
- package/dist/components/docs/DocsIndexPage.js +2 -912
- package/dist/components/docs/advanced/AdvancedMCPPage.js +4 -271
- package/dist/components/docs/advanced/AdvancedOverlayEditorPage.js +1 -107
- package/dist/components/docs/advanced/AdvancedRenderersPage.js +2 -118
- package/dist/components/docs/advanced/AdvancedSpecExperimentsPage.js +4 -92
- package/dist/components/docs/advanced/AdvancedTelemetryPage.js +2 -373
- package/dist/components/docs/advanced/AdvancedWorkflowMonitoringPage.js +2 -99
- package/dist/components/docs/advanced/index.js +10 -1055
- package/dist/components/docs/architecture/ArchitectureAppConfigPage.js +6 -243
- package/dist/components/docs/architecture/ArchitectureControlPlanePage.js +3 -160
- package/dist/components/docs/architecture/ArchitectureIntegrationBindingPage.js +7 -259
- package/dist/components/docs/architecture/ArchitectureKnowledgeBindingPage.js +6 -374
- package/dist/components/docs/architecture/ArchitectureMultiTenancyPage.js +2 -166
- package/dist/components/docs/architecture/ArchitectureOverviewPage.js +1 -143
- package/dist/components/docs/architecture/index.js +20 -1340
- package/dist/components/docs/comparison/ComparisonAutomationPlatformsPage.js +1 -245
- package/dist/components/docs/comparison/ComparisonEnterprisePlatformsPage.js +1 -230
- package/dist/components/docs/comparison/ComparisonInternalToolBuildersPage.js +1 -245
- package/dist/components/docs/comparison/ComparisonOverviewPage.js +1 -202
- package/dist/components/docs/comparison/ComparisonWindmillPage.js +1 -254
- package/dist/components/docs/comparison/ComparisonWorkflowEnginesPage.js +1 -339
- package/dist/components/docs/comparison/index.js +1 -1510
- package/dist/components/docs/docsManifest.js +1 -611
- package/dist/components/docs/docsManifest.test.d.ts +1 -0
- package/dist/components/docs/ecosystem/IntegrationsPage.js +2 -103
- package/dist/components/docs/ecosystem/PluginsPage.js +13 -179
- package/dist/components/docs/ecosystem/RegistryPage.js +7 -100
- package/dist/components/docs/ecosystem/TemplatesPage.js +3 -141
- package/dist/components/docs/ecosystem/ecosystem.docblocks.js +2 -48
- package/dist/components/docs/ecosystem/index.js +23 -569
- package/dist/components/docs/examples/DocsExamplesPage.js +4 -124
- package/dist/components/docs/examples/ExampleShowcasePage.js +4 -244
- package/dist/components/docs/examples/exampleShowcaseData.js +4 -39
- package/dist/components/docs/examples/index.js +4 -330
- package/dist/components/docs/generated/docs-index.generated.js +1 -5
- package/dist/components/docs/generated/index.js +1 -74
- package/dist/components/docs/generated/loader.js +1 -74
- package/dist/components/docs/getting-started/CLIPage.js +4 -271
- package/dist/components/docs/getting-started/CompatibilityPage.js +1 -173
- package/dist/components/docs/getting-started/DataViewTutorialPage.js +4 -134
- package/dist/components/docs/getting-started/DeveloperToolsPage.js +1 -194
- package/dist/components/docs/getting-started/HelloWorldPage.js +5 -183
- package/dist/components/docs/getting-started/InstallationPage.js +3 -154
- package/dist/components/docs/getting-started/StartHerePage.js +2 -129
- package/dist/components/docs/getting-started/TroubleshootingPage.js +2 -168
- package/dist/components/docs/getting-started/VSCodeExtensionPage.js +1 -432
- package/dist/components/docs/getting-started/getting-started.docblocks.js +4 -41
- package/dist/components/docs/getting-started/index.js +18 -1869
- package/dist/components/docs/guides/GuideCIDiffGatingPage.js +2 -196
- package/dist/components/docs/guides/GuideConnectInRepoPage.d.ts +1 -0
- package/dist/components/docs/guides/GuideConnectInRepoPage.js +44 -0
- package/dist/components/docs/guides/GuideContractTypesPage.js +6 -541
- package/dist/components/docs/guides/GuideDocsPipelinePage.js +3 -207
- package/dist/components/docs/guides/GuideFirstModuleBundlePage.d.ts +1 -0
- package/dist/components/docs/guides/GuideFirstModuleBundlePage.js +76 -0
- package/dist/components/docs/guides/GuideGenerateDocsClientsSchemasPage.js +2 -209
- package/dist/components/docs/guides/GuideHostBuilderWorkbenchPage.d.ts +1 -0
- package/dist/components/docs/guides/GuideHostBuilderWorkbenchPage.js +70 -0
- package/dist/components/docs/guides/GuideImportExistingCodebasesPage.js +8 -754
- package/dist/components/docs/guides/GuideNextjsOneEndpointPage.js +6 -268
- package/dist/components/docs/guides/GuideSpecValidationTypingPage.js +4 -196
- package/dist/components/docs/guides/GuidesIndexPage.js +2 -169
- package/dist/components/docs/guides/guides.docblocks.js +11 -75
- package/dist/components/docs/guides/index.d.ts +3 -0
- package/dist/components/docs/guides/index.js +213 -2428
- package/dist/components/docs/index.js +542 -24297
- package/dist/components/docs/integrations/IntegrationsCircuitBreakersPage.js +2 -42
- package/dist/components/docs/integrations/IntegrationsElevenLabsPage.js +3 -105
- package/dist/components/docs/integrations/IntegrationsGithubPage.js +3 -142
- package/dist/components/docs/integrations/IntegrationsGmailPage.js +3 -109
- package/dist/components/docs/integrations/IntegrationsGoogleCalendarPage.js +3 -79
- package/dist/components/docs/integrations/IntegrationsHealthRoutingPage.js +3 -146
- package/dist/components/docs/integrations/IntegrationsMistralPage.js +5 -150
- package/dist/components/docs/integrations/IntegrationsOpenAIPage.js +5 -140
- package/dist/components/docs/integrations/IntegrationsOverviewPage.js +1 -160
- package/dist/components/docs/integrations/IntegrationsPostmarkPage.js +4 -218
- package/dist/components/docs/integrations/IntegrationsPowensPage.js +4 -300
- package/dist/components/docs/integrations/IntegrationsQdrantPage.js +5 -111
- package/dist/components/docs/integrations/IntegrationsResendPage.js +3 -102
- package/dist/components/docs/integrations/IntegrationsS3Page.js +4 -124
- package/dist/components/docs/integrations/IntegrationsSlackPage.js +3 -144
- package/dist/components/docs/integrations/IntegrationsSpecModelPage.js +7 -290
- package/dist/components/docs/integrations/IntegrationsStripePage.js +6 -327
- package/dist/components/docs/integrations/IntegrationsTwilioPage.js +3 -128
- package/dist/components/docs/integrations/IntegrationsWhatsappMetaPage.js +2 -146
- package/dist/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +2 -156
- package/dist/components/docs/integrations/index.js +52 -3100
- package/dist/components/docs/intent/ContractFirstApiPage.js +2 -126
- package/dist/components/docs/intent/DeterministicCodegenPage.js +2 -148
- package/dist/components/docs/intent/GenerateClientFromSchemaPage.js +7 -207
- package/dist/components/docs/intent/OpenapiAlternativePage.js +3 -201
- package/dist/components/docs/intent/SchemaValidationTypescriptPage.js +4 -144
- package/dist/components/docs/intent/SpecDrivenDevelopmentPage.js +2 -126
- package/dist/components/docs/intent/index.js +15 -1135
- package/dist/components/docs/intent/intent-pages.docblocks.js +1 -201
- package/dist/components/docs/knowledge/KnowledgeCategoriesPage.js +6 -750
- package/dist/components/docs/knowledge/KnowledgeExamplesPage.js +4 -175
- package/dist/components/docs/knowledge/KnowledgeOverviewPage.js +1 -116
- package/dist/components/docs/knowledge/KnowledgeSourcesPage.js +8 -391
- package/dist/components/docs/knowledge/KnowledgeSpacesPage.js +6 -302
- package/dist/components/docs/knowledge/index.js +21 -1730
- package/dist/components/docs/libraries/LibrariesAccessibilityPage.js +3 -198
- package/dist/components/docs/libraries/LibrariesAiAgentPage.js +3 -141
- package/dist/components/docs/libraries/LibrariesAnalyticsPage.js +4 -80
- package/dist/components/docs/libraries/LibrariesContentGenPage.js +2 -100
- package/dist/components/docs/libraries/LibrariesContractsPage.js +2 -284
- package/dist/components/docs/libraries/LibrariesCostTrackingPage.js +3 -112
- package/dist/components/docs/libraries/LibrariesDataBackendPage.js +2 -166
- package/dist/components/docs/libraries/LibrariesDataViewsPage.js +3 -186
- package/dist/components/docs/libraries/LibrariesDesignSystemPage.js +4 -279
- package/dist/components/docs/libraries/LibrariesEvolutionPage.js +4 -127
- package/dist/components/docs/libraries/LibrariesGraphQLPage.js +2 -173
- package/dist/components/docs/libraries/LibrariesGrowthPage.js +3 -88
- package/dist/components/docs/libraries/LibrariesMultiTenancyPage.js +3 -108
- package/dist/components/docs/libraries/LibrariesObservabilityPage.js +5 -130
- package/dist/components/docs/libraries/LibrariesOverlayEnginePage.js +4 -110
- package/dist/components/docs/libraries/LibrariesOverviewPage.js +1 -170
- package/dist/components/docs/libraries/LibrariesPersonalizationPage.js +4 -114
- package/dist/components/docs/libraries/LibrariesProgressiveDeliveryPage.js +3 -132
- package/dist/components/docs/libraries/LibrariesResiliencePage.js +4 -120
- package/dist/components/docs/libraries/LibrariesRuntimePage.js +2 -200
- package/dist/components/docs/libraries/LibrariesSLOPage.js +3 -116
- package/dist/components/docs/libraries/LibrariesSchemaPage.js +3 -273
- package/dist/components/docs/libraries/LibrariesSupportBotPage.js +3 -134
- package/dist/components/docs/libraries/LibrariesTestingPage.js +3 -133
- package/dist/components/docs/libraries/LibrariesUIKitPage.js +2 -230
- package/dist/components/docs/libraries/LibrariesWorkflowComposerPage.js +3 -88
- package/dist/components/docs/libraries/LibrariesWorkflowsPage.js +2 -181
- package/dist/components/docs/libraries/index.js +54 -4147
- package/dist/components/docs/manifesto/ManifestoPage.js +1 -86
- package/dist/components/docs/ops/AutoEvolutionOpsPage.js +2 -132
- package/dist/components/docs/ops/DistributedTracingOpsPage.js +2 -71
- package/dist/components/docs/ops/index.js +3 -202
- package/dist/components/docs/ops/ops-lifecycle.docblocks.js +3 -38
- package/dist/components/docs/ops/ops-runbooks-a.docblocks.js +3 -94
- package/dist/components/docs/ops/ops-runbooks-b.docblocks.js +3 -76
- package/dist/components/docs/ops/ops-slo-tenant.docblocks.js +3 -76
- package/dist/components/docs/ops/ops-top.docs.js +2 -17
- package/dist/components/docs/ops/ops.docs.js +10 -302
- package/dist/components/docs/product/product.docblocks.js +5 -72
- package/dist/components/docs/reference/DocsMarkdownContent.js +2 -196
- package/dist/components/docs/reference/DocsReferenceContent.js +3 -256
- package/dist/components/docs/reference/DocsReferenceIndexClient.js +2 -127
- package/dist/components/docs/reference/DocsReferenceIndexPage.js +2 -206
- package/dist/components/docs/reference/DocsReferencePage.js +3 -265
- package/dist/components/docs/reference/docsMarkdownParser.js +2 -92
- package/dist/components/docs/reference/index.js +4 -470
- package/dist/components/docs/safety/SafetyAuditingPage.js +2 -350
- package/dist/components/docs/safety/SafetyMigrationsPage.js +2 -359
- package/dist/components/docs/safety/SafetyOverviewPage.js +1 -101
- package/dist/components/docs/safety/SafetyPDPPage.js +2 -301
- package/dist/components/docs/safety/SafetySecurityTrustPage.js +1 -206
- package/dist/components/docs/safety/SafetySigningPage.js +3 -90
- package/dist/components/docs/safety/SafetyTenantIsolationPage.js +2 -79
- package/dist/components/docs/safety/index.js +7 -1480
- package/dist/components/docs/shared/StudioPrompt.js +1 -31
- package/dist/components/docs/specs/SpecsBuilderControlPlanePage.d.ts +1 -0
- package/dist/components/docs/specs/SpecsBuilderControlPlanePage.js +34 -0
- package/dist/components/docs/specs/SpecsCapabilitiesPage.js +2 -158
- package/dist/components/docs/specs/SpecsConnectPage.d.ts +1 -0
- package/dist/components/docs/specs/SpecsConnectPage.js +8 -0
- package/dist/components/docs/specs/SpecsDataViewsPage.js +2 -260
- package/dist/components/docs/specs/SpecsModuleBundlesPage.d.ts +1 -0
- package/dist/components/docs/specs/SpecsModuleBundlesPage.js +67 -0
- package/dist/components/docs/specs/SpecsOverlaysPage.js +2 -372
- package/dist/components/docs/specs/SpecsOverviewPage.js +1 -186
- package/dist/components/docs/specs/SpecsPolicyPage.js +3 -420
- package/dist/components/docs/specs/SpecsWorkflowsPage.js +2 -312
- package/dist/components/docs/specs/index.d.ts +3 -0
- package/dist/components/docs/specs/index.js +109 -1702
- package/dist/components/docs/studio/StudioBYOKPage.js +1 -26
- package/dist/components/docs/studio/StudioDeploymentsPage.js +1 -26
- package/dist/components/docs/studio/StudioGettingStartedPage.js +1 -26
- package/dist/components/docs/studio/StudioIntegrationsPage.js +1 -26
- package/dist/components/docs/studio/StudioOverviewPage.js +1 -157
- package/dist/components/docs/studio/StudioVisualBuilderPage.js +1 -26
- package/dist/components/docs/studio/index.js +1 -282
- package/dist/components/docs/tech/contracts/tech-docs.docblocks.js +2 -19
- package/dist/components/integrations/index.js +2 -600
- package/dist/components/integrations/molecules/IntegrationCard.js +1 -100
- package/dist/components/integrations/organisms/IntegrationMarketplace.js +1 -214
- package/dist/components/integrations/organisms/IntegrationSettings.js +2 -284
- package/dist/components/integrations/organisms/KnowledgeSourceList.js +1 -103
- package/dist/components/legal/PrivacyTemplate.js +1 -1025
- package/dist/components/legal/TermsTemplate.js +1 -941
- package/dist/components/legal/index.js +1 -1963
- package/dist/components/shared/FeatureGateNotice.js +1 -38
- package/dist/components/shared/index.js +1 -38
- package/dist/components/shell/WorkspaceHeader.js +1 -100
- package/dist/components/shell/WorkspaceProjectShellLayout.js +1 -222
- package/dist/components/shell/WorkspaceShellRenderer.js +1 -228
- package/dist/components/shell/WorkspaceSidebar.js +1 -68
- package/dist/components/shell/index.js +1 -287
- package/dist/components/templates/engine/index.js +1 -39
- package/dist/components/templates/index.js +11 -965
- package/dist/components/templates/messaging/ConversationList.js +2 -83
- package/dist/components/templates/messaging/MessageComposer.js +4 -150
- package/dist/components/templates/messaging/MessageThread.js +3 -83
- package/dist/components/templates/messaging/MessagingWorkspace.js +5 -265
- package/dist/components/templates/messaging/index.js +5 -269
- package/dist/components/templates/recipes/LanguageSwitcher.js +1 -16
- package/dist/components/templates/recipes/RecipeCard.js +1 -80
- package/dist/components/templates/recipes/RecipeDetail.js +1 -74
- package/dist/components/templates/recipes/RecipeList.js +3 -245
- package/dist/components/templates/recipes/index.js +3 -248
- package/dist/components/templates/todos/FilterBar.js +1 -107
- package/dist/components/templates/todos/TaskForm.js +2 -158
- package/dist/components/templates/todos/TaskItem.js +1 -77
- package/dist/components/templates/todos/TaskList.js +5 -449
- package/dist/components/templates/todos/index.js +5 -452
- package/dist/config/contractspec-blueprint.js +1 -123
- package/dist/config/contractspec-branding.js +1 -44
- package/dist/config/contractspec-routes.js +1 -24
- package/dist/config/index.js +1 -126
- package/dist/features/contracts-registry.js +1 -178
- package/dist/features/docs/docs.contracts.js +1 -17
- package/dist/features/docs/index.js +1 -17
- package/dist/features/docs.feature.js +1 -33
- package/dist/features/index.js +1 -315
- package/dist/features/mcp.feature.js +1 -30
- package/dist/features/presentations.feature.js +1 -33
- package/dist/features/registry.js +1 -116
- package/dist/index.js +556 -28580
- package/dist/infrastructure/elysia/index.js +1 -35
- package/dist/infrastructure/elysia/logger.js +1 -35
- package/dist/infrastructure/index.js +1 -35
- package/dist/libs/email/client.js +1 -114
- package/dist/libs/email/contact.js +12 -165
- package/dist/libs/email/newsletter.js +6 -167
- package/dist/libs/email/types.js +0 -2
- package/dist/libs/email/utils.js +2 -8
- package/dist/libs/email/waitlist-application.js +28 -209
- package/dist/libs/email/waitlist.js +6 -167
- package/dist/libs/email.js +46 -363
- package/dist/libs/posthog/client.js +1 -63
- package/dist/libs/posthog/native.js +1 -23
- package/dist/libs/posthog/server.js +1 -13
- package/dist/libs/pricing-examples.js +1 -18
- package/dist/node/application/context-storage/index.js +1 -28
- package/dist/node/application/index.js +13 -2133
- package/dist/node/application/mcp/cliMcp.js +4 -452
- package/dist/node/application/mcp/common.js +1 -193
- package/dist/node/application/mcp/contractsMcp.js +2 -549
- package/dist/node/application/mcp/contractsMcpResources.js +2 -123
- package/dist/node/application/mcp/contractsMcpTools.js +1 -199
- package/dist/node/application/mcp/docsMcp.catalog.js +3 -381
- package/dist/node/application/mcp/docsMcp.data.js +1 -147
- package/dist/node/application/mcp/docsMcp.js +6 -1039
- package/dist/node/application/mcp/docsMcp.prompts.js +6 -521
- package/dist/node/application/mcp/docsMcp.reference.js +3 -235
- package/dist/node/application/mcp/docsMcp.resources.js +3 -519
- package/dist/node/application/mcp/docsMcp.tools.js +3 -518
- package/dist/node/application/mcp/index.js +13 -2106
- package/dist/node/application/mcp/internalMcp.js +2 -410
- package/dist/node/application/mcp/normalizeMcpRequest.js +1 -21
- package/dist/node/application/mcp/providerRankingMcp.js +1 -530
- package/dist/node/bundles/LibraryBundle.js +1 -138
- package/dist/node/bundles/index.js +1 -138
- package/dist/node/components/docs/DocsIndexPage.js +2 -912
- package/dist/node/components/docs/advanced/AdvancedMCPPage.js +4 -271
- package/dist/node/components/docs/advanced/AdvancedOverlayEditorPage.js +1 -107
- package/dist/node/components/docs/advanced/AdvancedRenderersPage.js +2 -118
- package/dist/node/components/docs/advanced/AdvancedSpecExperimentsPage.js +4 -92
- package/dist/node/components/docs/advanced/AdvancedTelemetryPage.js +2 -373
- package/dist/node/components/docs/advanced/AdvancedWorkflowMonitoringPage.js +2 -99
- package/dist/node/components/docs/advanced/index.js +10 -1055
- package/dist/node/components/docs/architecture/ArchitectureAppConfigPage.js +6 -243
- package/dist/node/components/docs/architecture/ArchitectureControlPlanePage.js +3 -160
- package/dist/node/components/docs/architecture/ArchitectureIntegrationBindingPage.js +7 -259
- package/dist/node/components/docs/architecture/ArchitectureKnowledgeBindingPage.js +6 -374
- package/dist/node/components/docs/architecture/ArchitectureMultiTenancyPage.js +2 -166
- package/dist/node/components/docs/architecture/ArchitectureOverviewPage.js +1 -143
- package/dist/node/components/docs/architecture/index.js +20 -1340
- package/dist/node/components/docs/comparison/ComparisonAutomationPlatformsPage.js +1 -245
- package/dist/node/components/docs/comparison/ComparisonEnterprisePlatformsPage.js +1 -230
- package/dist/node/components/docs/comparison/ComparisonInternalToolBuildersPage.js +1 -245
- package/dist/node/components/docs/comparison/ComparisonOverviewPage.js +1 -202
- package/dist/node/components/docs/comparison/ComparisonWindmillPage.js +1 -254
- package/dist/node/components/docs/comparison/ComparisonWorkflowEnginesPage.js +1 -339
- package/dist/node/components/docs/comparison/index.js +1 -1510
- package/dist/node/components/docs/docsManifest.js +1 -611
- package/dist/node/components/docs/ecosystem/IntegrationsPage.js +2 -103
- package/dist/node/components/docs/ecosystem/PluginsPage.js +13 -179
- package/dist/node/components/docs/ecosystem/RegistryPage.js +7 -100
- package/dist/node/components/docs/ecosystem/TemplatesPage.js +3 -141
- package/dist/node/components/docs/ecosystem/ecosystem.docblocks.js +2 -48
- package/dist/node/components/docs/ecosystem/index.js +23 -569
- package/dist/node/components/docs/examples/DocsExamplesPage.js +4 -124
- package/dist/node/components/docs/examples/ExampleShowcasePage.js +4 -244
- package/dist/node/components/docs/examples/exampleShowcaseData.js +4 -39
- package/dist/node/components/docs/examples/index.js +4 -330
- package/dist/node/components/docs/generated/docs-index.generated.js +1 -5
- package/dist/node/components/docs/generated/index.js +1 -74
- package/dist/node/components/docs/generated/loader.js +1 -74
- package/dist/node/components/docs/getting-started/CLIPage.js +4 -271
- package/dist/node/components/docs/getting-started/CompatibilityPage.js +1 -173
- package/dist/node/components/docs/getting-started/DataViewTutorialPage.js +4 -134
- package/dist/node/components/docs/getting-started/DeveloperToolsPage.js +1 -194
- package/dist/node/components/docs/getting-started/HelloWorldPage.js +5 -183
- package/dist/node/components/docs/getting-started/InstallationPage.js +3 -154
- package/dist/node/components/docs/getting-started/StartHerePage.js +2 -129
- package/dist/node/components/docs/getting-started/TroubleshootingPage.js +2 -168
- package/dist/node/components/docs/getting-started/VSCodeExtensionPage.js +1 -432
- package/dist/node/components/docs/getting-started/getting-started.docblocks.js +4 -41
- package/dist/node/components/docs/getting-started/index.js +18 -1869
- package/dist/node/components/docs/guides/GuideCIDiffGatingPage.js +2 -196
- package/dist/node/components/docs/guides/GuideConnectInRepoPage.js +43 -0
- package/dist/node/components/docs/guides/GuideContractTypesPage.js +6 -541
- package/dist/node/components/docs/guides/GuideDocsPipelinePage.js +3 -207
- package/dist/node/components/docs/guides/GuideFirstModuleBundlePage.js +75 -0
- package/dist/node/components/docs/guides/GuideGenerateDocsClientsSchemasPage.js +2 -209
- package/dist/node/components/docs/guides/GuideHostBuilderWorkbenchPage.js +69 -0
- package/dist/node/components/docs/guides/GuideImportExistingCodebasesPage.js +8 -754
- package/dist/node/components/docs/guides/GuideNextjsOneEndpointPage.js +6 -268
- package/dist/node/components/docs/guides/GuideSpecValidationTypingPage.js +4 -196
- package/dist/node/components/docs/guides/GuidesIndexPage.js +2 -169
- package/dist/node/components/docs/guides/guides.docblocks.js +11 -75
- package/dist/node/components/docs/guides/index.js +213 -2428
- package/dist/node/components/docs/index.js +542 -24297
- package/dist/node/components/docs/integrations/IntegrationsCircuitBreakersPage.js +2 -42
- package/dist/node/components/docs/integrations/IntegrationsElevenLabsPage.js +3 -105
- package/dist/node/components/docs/integrations/IntegrationsGithubPage.js +3 -142
- package/dist/node/components/docs/integrations/IntegrationsGmailPage.js +3 -109
- package/dist/node/components/docs/integrations/IntegrationsGoogleCalendarPage.js +3 -79
- package/dist/node/components/docs/integrations/IntegrationsHealthRoutingPage.js +3 -146
- package/dist/node/components/docs/integrations/IntegrationsMistralPage.js +5 -150
- package/dist/node/components/docs/integrations/IntegrationsOpenAIPage.js +5 -140
- package/dist/node/components/docs/integrations/IntegrationsOverviewPage.js +1 -160
- package/dist/node/components/docs/integrations/IntegrationsPostmarkPage.js +4 -218
- package/dist/node/components/docs/integrations/IntegrationsPowensPage.js +4 -300
- package/dist/node/components/docs/integrations/IntegrationsQdrantPage.js +5 -111
- package/dist/node/components/docs/integrations/IntegrationsResendPage.js +3 -102
- package/dist/node/components/docs/integrations/IntegrationsS3Page.js +4 -124
- package/dist/node/components/docs/integrations/IntegrationsSlackPage.js +3 -144
- package/dist/node/components/docs/integrations/IntegrationsSpecModelPage.js +7 -290
- package/dist/node/components/docs/integrations/IntegrationsStripePage.js +6 -327
- package/dist/node/components/docs/integrations/IntegrationsTwilioPage.js +3 -128
- package/dist/node/components/docs/integrations/IntegrationsWhatsappMetaPage.js +2 -146
- package/dist/node/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +2 -156
- package/dist/node/components/docs/integrations/index.js +52 -3100
- package/dist/node/components/docs/intent/ContractFirstApiPage.js +2 -126
- package/dist/node/components/docs/intent/DeterministicCodegenPage.js +2 -148
- package/dist/node/components/docs/intent/GenerateClientFromSchemaPage.js +7 -207
- package/dist/node/components/docs/intent/OpenapiAlternativePage.js +3 -201
- package/dist/node/components/docs/intent/SchemaValidationTypescriptPage.js +4 -144
- package/dist/node/components/docs/intent/SpecDrivenDevelopmentPage.js +2 -126
- package/dist/node/components/docs/intent/index.js +15 -1135
- package/dist/node/components/docs/intent/intent-pages.docblocks.js +1 -201
- package/dist/node/components/docs/knowledge/KnowledgeCategoriesPage.js +6 -750
- package/dist/node/components/docs/knowledge/KnowledgeExamplesPage.js +4 -175
- package/dist/node/components/docs/knowledge/KnowledgeOverviewPage.js +1 -116
- package/dist/node/components/docs/knowledge/KnowledgeSourcesPage.js +8 -391
- package/dist/node/components/docs/knowledge/KnowledgeSpacesPage.js +6 -302
- package/dist/node/components/docs/knowledge/index.js +21 -1730
- package/dist/node/components/docs/libraries/LibrariesAccessibilityPage.js +3 -198
- package/dist/node/components/docs/libraries/LibrariesAiAgentPage.js +3 -141
- package/dist/node/components/docs/libraries/LibrariesAnalyticsPage.js +4 -80
- package/dist/node/components/docs/libraries/LibrariesContentGenPage.js +2 -100
- package/dist/node/components/docs/libraries/LibrariesContractsPage.js +2 -284
- package/dist/node/components/docs/libraries/LibrariesCostTrackingPage.js +3 -112
- package/dist/node/components/docs/libraries/LibrariesDataBackendPage.js +2 -166
- package/dist/node/components/docs/libraries/LibrariesDataViewsPage.js +3 -186
- package/dist/node/components/docs/libraries/LibrariesDesignSystemPage.js +4 -279
- package/dist/node/components/docs/libraries/LibrariesEvolutionPage.js +4 -127
- package/dist/node/components/docs/libraries/LibrariesGraphQLPage.js +2 -173
- package/dist/node/components/docs/libraries/LibrariesGrowthPage.js +3 -88
- package/dist/node/components/docs/libraries/LibrariesMultiTenancyPage.js +3 -108
- package/dist/node/components/docs/libraries/LibrariesObservabilityPage.js +5 -130
- package/dist/node/components/docs/libraries/LibrariesOverlayEnginePage.js +4 -110
- package/dist/node/components/docs/libraries/LibrariesOverviewPage.js +1 -170
- package/dist/node/components/docs/libraries/LibrariesPersonalizationPage.js +4 -114
- package/dist/node/components/docs/libraries/LibrariesProgressiveDeliveryPage.js +3 -132
- package/dist/node/components/docs/libraries/LibrariesResiliencePage.js +4 -120
- package/dist/node/components/docs/libraries/LibrariesRuntimePage.js +2 -200
- package/dist/node/components/docs/libraries/LibrariesSLOPage.js +3 -116
- package/dist/node/components/docs/libraries/LibrariesSchemaPage.js +3 -273
- package/dist/node/components/docs/libraries/LibrariesSupportBotPage.js +3 -134
- package/dist/node/components/docs/libraries/LibrariesTestingPage.js +3 -133
- package/dist/node/components/docs/libraries/LibrariesUIKitPage.js +2 -230
- package/dist/node/components/docs/libraries/LibrariesWorkflowComposerPage.js +3 -88
- package/dist/node/components/docs/libraries/LibrariesWorkflowsPage.js +2 -181
- package/dist/node/components/docs/libraries/index.js +54 -4147
- package/dist/node/components/docs/manifesto/ManifestoPage.js +1 -86
- package/dist/node/components/docs/ops/AutoEvolutionOpsPage.js +2 -132
- package/dist/node/components/docs/ops/DistributedTracingOpsPage.js +2 -71
- package/dist/node/components/docs/ops/index.js +3 -202
- package/dist/node/components/docs/ops/ops-lifecycle.docblocks.js +3 -38
- package/dist/node/components/docs/ops/ops-runbooks-a.docblocks.js +3 -94
- package/dist/node/components/docs/ops/ops-runbooks-b.docblocks.js +3 -76
- package/dist/node/components/docs/ops/ops-slo-tenant.docblocks.js +3 -76
- package/dist/node/components/docs/ops/ops-top.docs.js +2 -17
- package/dist/node/components/docs/ops/ops.docs.js +10 -302
- package/dist/node/components/docs/product/product.docblocks.js +5 -72
- package/dist/node/components/docs/reference/DocsMarkdownContent.js +2 -196
- package/dist/node/components/docs/reference/DocsReferenceContent.js +3 -256
- package/dist/node/components/docs/reference/DocsReferenceIndexClient.js +2 -127
- package/dist/node/components/docs/reference/DocsReferenceIndexPage.js +2 -206
- package/dist/node/components/docs/reference/DocsReferencePage.js +3 -265
- package/dist/node/components/docs/reference/docsMarkdownParser.js +2 -92
- package/dist/node/components/docs/reference/index.js +4 -470
- package/dist/node/components/docs/safety/SafetyAuditingPage.js +2 -350
- package/dist/node/components/docs/safety/SafetyMigrationsPage.js +2 -359
- package/dist/node/components/docs/safety/SafetyOverviewPage.js +1 -101
- package/dist/node/components/docs/safety/SafetyPDPPage.js +2 -301
- package/dist/node/components/docs/safety/SafetySecurityTrustPage.js +1 -206
- package/dist/node/components/docs/safety/SafetySigningPage.js +3 -90
- package/dist/node/components/docs/safety/SafetyTenantIsolationPage.js +2 -79
- package/dist/node/components/docs/safety/index.js +7 -1480
- package/dist/node/components/docs/shared/StudioPrompt.js +1 -31
- package/dist/node/components/docs/specs/SpecsBuilderControlPlanePage.js +33 -0
- package/dist/node/components/docs/specs/SpecsCapabilitiesPage.js +2 -158
- package/dist/node/components/docs/specs/SpecsConnectPage.js +7 -0
- package/dist/node/components/docs/specs/SpecsDataViewsPage.js +2 -260
- package/dist/node/components/docs/specs/SpecsModuleBundlesPage.js +66 -0
- package/dist/node/components/docs/specs/SpecsOverlaysPage.js +2 -372
- package/dist/node/components/docs/specs/SpecsOverviewPage.js +1 -186
- package/dist/node/components/docs/specs/SpecsPolicyPage.js +3 -420
- package/dist/node/components/docs/specs/SpecsWorkflowsPage.js +2 -312
- package/dist/node/components/docs/specs/index.js +109 -1702
- package/dist/node/components/docs/studio/StudioBYOKPage.js +1 -26
- package/dist/node/components/docs/studio/StudioDeploymentsPage.js +1 -26
- package/dist/node/components/docs/studio/StudioGettingStartedPage.js +1 -26
- package/dist/node/components/docs/studio/StudioIntegrationsPage.js +1 -26
- package/dist/node/components/docs/studio/StudioOverviewPage.js +1 -157
- package/dist/node/components/docs/studio/StudioVisualBuilderPage.js +1 -26
- package/dist/node/components/docs/studio/index.js +1 -282
- package/dist/node/components/docs/tech/contracts/tech-docs.docblocks.js +2 -19
- package/dist/node/components/integrations/index.js +2 -600
- package/dist/node/components/integrations/molecules/IntegrationCard.js +1 -100
- package/dist/node/components/integrations/organisms/IntegrationMarketplace.js +1 -214
- package/dist/node/components/integrations/organisms/IntegrationSettings.js +2 -284
- package/dist/node/components/integrations/organisms/KnowledgeSourceList.js +1 -103
- package/dist/node/components/legal/PrivacyTemplate.js +1 -1025
- package/dist/node/components/legal/TermsTemplate.js +1 -941
- package/dist/node/components/legal/index.js +1 -1963
- package/dist/node/components/shared/FeatureGateNotice.js +1 -38
- package/dist/node/components/shared/index.js +1 -38
- package/dist/node/components/shell/WorkspaceHeader.js +1 -100
- package/dist/node/components/shell/WorkspaceProjectShellLayout.js +1 -222
- package/dist/node/components/shell/WorkspaceShellRenderer.js +1 -228
- package/dist/node/components/shell/WorkspaceSidebar.js +1 -68
- package/dist/node/components/shell/index.js +1 -287
- package/dist/node/components/templates/engine/index.js +1 -39
- package/dist/node/components/templates/index.js +11 -965
- package/dist/node/components/templates/messaging/ConversationList.js +2 -83
- package/dist/node/components/templates/messaging/MessageComposer.js +4 -150
- package/dist/node/components/templates/messaging/MessageThread.js +3 -83
- package/dist/node/components/templates/messaging/MessagingWorkspace.js +5 -265
- package/dist/node/components/templates/messaging/index.js +5 -269
- package/dist/node/components/templates/recipes/LanguageSwitcher.js +1 -16
- package/dist/node/components/templates/recipes/RecipeCard.js +1 -80
- package/dist/node/components/templates/recipes/RecipeDetail.js +1 -74
- package/dist/node/components/templates/recipes/RecipeList.js +3 -245
- package/dist/node/components/templates/recipes/index.js +3 -248
- package/dist/node/components/templates/todos/FilterBar.js +1 -107
- package/dist/node/components/templates/todos/TaskForm.js +2 -158
- package/dist/node/components/templates/todos/TaskItem.js +1 -77
- package/dist/node/components/templates/todos/TaskList.js +5 -449
- package/dist/node/components/templates/todos/index.js +5 -452
- package/dist/node/config/contractspec-blueprint.js +1 -123
- package/dist/node/config/contractspec-branding.js +1 -44
- package/dist/node/config/contractspec-routes.js +1 -24
- package/dist/node/config/index.js +1 -126
- package/dist/node/features/contracts-registry.js +1 -178
- package/dist/node/features/docs/docs.contracts.js +1 -17
- package/dist/node/features/docs/index.js +1 -17
- package/dist/node/features/docs.feature.js +1 -33
- package/dist/node/features/index.js +1 -315
- package/dist/node/features/mcp.feature.js +1 -30
- package/dist/node/features/presentations.feature.js +1 -33
- package/dist/node/features/registry.js +1 -116
- package/dist/node/index.js +556 -28580
- package/dist/node/infrastructure/elysia/index.js +1 -35
- package/dist/node/infrastructure/elysia/logger.js +1 -35
- package/dist/node/infrastructure/index.js +1 -35
- package/dist/node/libs/email/client.js +1 -114
- package/dist/node/libs/email/contact.js +12 -165
- package/dist/node/libs/email/newsletter.js +6 -167
- package/dist/node/libs/email/types.js +0 -2
- package/dist/node/libs/email/utils.js +2 -8
- package/dist/node/libs/email/waitlist-application.js +28 -209
- package/dist/node/libs/email/waitlist.js +6 -167
- package/dist/node/libs/email.js +46 -363
- package/dist/node/libs/posthog/client.js +1 -63
- package/dist/node/libs/posthog/native.js +1 -23
- package/dist/node/libs/posthog/server.js +1 -13
- package/dist/node/libs/pricing-examples.js +1 -18
- package/dist/node/presentation/features/atoms/FeatureIcon/FeatureIcon.js +1 -97
- package/dist/node/presentation/features/atoms/FeatureIcon/index.js +1 -97
- package/dist/node/presentation/features/atoms/index.js +1 -97
- package/dist/node/presentation/features/hooks/index.js +1 -397
- package/dist/node/presentation/features/hooks/useContractsRegistry.js +1 -289
- package/dist/node/presentation/features/hooks/useFeatureFilters.js +1 -75
- package/dist/node/presentation/features/hooks/useFeatureRegistry.js +1 -147
- package/dist/node/presentation/features/hooks/useRelatedDocs.js +1 -28
- package/dist/node/presentation/features/index.js +1 -3063
- package/dist/node/presentation/features/molecules/FeatureCard/FeatureCard.js +1 -366
- package/dist/node/presentation/features/molecules/FeatureCard/index.js +1 -366
- package/dist/node/presentation/features/molecules/FeatureCategoryHeader/FeatureCategoryHeader.js +1 -50
- package/dist/node/presentation/features/molecules/FeatureCategoryHeader/index.js +1 -50
- package/dist/node/presentation/features/molecules/FeatureFilters/FeatureFilters.js +1 -92
- package/dist/node/presentation/features/molecules/FeatureFilters/index.js +1 -92
- package/dist/node/presentation/features/molecules/FeatureHoverPreview/FeatureHoverPreview.js +1 -176
- package/dist/node/presentation/features/molecules/FeatureHoverPreview/index.js +1 -176
- package/dist/node/presentation/features/molecules/index.js +1 -505
- package/dist/node/presentation/features/organisms/FeatureDataViewsList.js +1 -304
- package/dist/node/presentation/features/organisms/FeatureDetail/FeatureDetail.js +1 -154
- package/dist/node/presentation/features/organisms/FeatureDetail/index.js +1 -154
- package/dist/node/presentation/features/organisms/FeatureDiscovery/FeatureDiscovery.js +1 -909
- package/dist/node/presentation/features/organisms/FeatureDiscovery/index.js +1 -909
- package/dist/node/presentation/features/organisms/FeatureEventsList.js +1 -302
- package/dist/node/presentation/features/organisms/FeatureFormsList.js +1 -302
- package/dist/node/presentation/features/organisms/FeatureOperationsList.js +1 -180
- package/dist/node/presentation/features/organisms/FeaturePresentationsList.js +1 -304
- package/dist/node/presentation/features/organisms/index.js +1 -1359
- package/dist/node/presentation/features/templates/FeatureDataViewDetailTemplate/FeatureDataViewDetailTemplate.js +1 -332
- package/dist/node/presentation/features/templates/FeatureDataViewDetailTemplate/index.js +1 -332
- package/dist/node/presentation/features/templates/FeatureDataViewsTemplate/FeatureDataViewsTemplate.js +1 -342
- package/dist/node/presentation/features/templates/FeatureDataViewsTemplate/index.js +1 -342
- package/dist/node/presentation/features/templates/FeatureEventDetailTemplate/FeatureEventDetailTemplate.js +1 -303
- package/dist/node/presentation/features/templates/FeatureEventDetailTemplate/index.js +1 -303
- package/dist/node/presentation/features/templates/FeatureEventsTemplate/FeatureEventsTemplate.js +1 -340
- package/dist/node/presentation/features/templates/FeatureEventsTemplate/index.js +1 -340
- package/dist/node/presentation/features/templates/FeatureFormDetailTemplate/FeatureFormDetailTemplate.js +1 -329
- package/dist/node/presentation/features/templates/FeatureFormDetailTemplate/index.js +1 -329
- package/dist/node/presentation/features/templates/FeatureFormsTemplate/FeatureFormsTemplate.js +1 -340
- package/dist/node/presentation/features/templates/FeatureFormsTemplate/index.js +1 -340
- package/dist/node/presentation/features/templates/FeatureOperationDetailTemplate/FeatureOperationDetailTemplate.js +1 -302
- package/dist/node/presentation/features/templates/FeatureOperationDetailTemplate/index.js +1 -302
- package/dist/node/presentation/features/templates/FeatureOperationsTemplate/FeatureOperationsTemplate.js +1 -218
- package/dist/node/presentation/features/templates/FeatureOperationsTemplate/index.js +1 -218
- package/dist/node/presentation/features/templates/FeatureOverviewTemplate/FeatureOverviewTemplate.js +1 -187
- package/dist/node/presentation/features/templates/FeatureOverviewTemplate/index.js +1 -187
- package/dist/node/presentation/features/templates/FeaturePresentationDetailTemplate/FeaturePresentationDetailTemplate.js +1 -306
- package/dist/node/presentation/features/templates/FeaturePresentationDetailTemplate/index.js +1 -306
- package/dist/node/presentation/features/templates/FeaturePresentationsTemplate/FeaturePresentationsTemplate.js +1 -342
- package/dist/node/presentation/features/templates/FeaturePresentationsTemplate/index.js +1 -342
- package/dist/presentation/features/atoms/FeatureIcon/FeatureIcon.js +1 -97
- package/dist/presentation/features/atoms/FeatureIcon/index.js +1 -97
- package/dist/presentation/features/atoms/index.js +1 -97
- package/dist/presentation/features/hooks/index.js +1 -397
- package/dist/presentation/features/hooks/useContractsRegistry.js +1 -289
- package/dist/presentation/features/hooks/useFeatureFilters.js +1 -75
- package/dist/presentation/features/hooks/useFeatureRegistry.js +1 -147
- package/dist/presentation/features/hooks/useRelatedDocs.js +1 -28
- package/dist/presentation/features/index.js +1 -3063
- package/dist/presentation/features/molecules/FeatureCard/FeatureCard.js +1 -366
- package/dist/presentation/features/molecules/FeatureCard/index.js +1 -366
- package/dist/presentation/features/molecules/FeatureCategoryHeader/FeatureCategoryHeader.js +1 -50
- package/dist/presentation/features/molecules/FeatureCategoryHeader/index.js +1 -50
- package/dist/presentation/features/molecules/FeatureFilters/FeatureFilters.js +1 -92
- package/dist/presentation/features/molecules/FeatureFilters/index.js +1 -92
- package/dist/presentation/features/molecules/FeatureHoverPreview/FeatureHoverPreview.js +1 -176
- package/dist/presentation/features/molecules/FeatureHoverPreview/index.js +1 -176
- package/dist/presentation/features/molecules/index.js +1 -505
- package/dist/presentation/features/organisms/FeatureDataViewsList.js +1 -304
- package/dist/presentation/features/organisms/FeatureDetail/FeatureDetail.js +1 -154
- package/dist/presentation/features/organisms/FeatureDetail/index.js +1 -154
- package/dist/presentation/features/organisms/FeatureDiscovery/FeatureDiscovery.js +1 -909
- package/dist/presentation/features/organisms/FeatureDiscovery/index.js +1 -909
- package/dist/presentation/features/organisms/FeatureEventsList.js +1 -302
- package/dist/presentation/features/organisms/FeatureFormsList.js +1 -302
- package/dist/presentation/features/organisms/FeatureOperationsList.js +1 -180
- package/dist/presentation/features/organisms/FeaturePresentationsList.js +1 -304
- package/dist/presentation/features/organisms/index.js +1 -1359
- package/dist/presentation/features/templates/FeatureDataViewDetailTemplate/FeatureDataViewDetailTemplate.js +1 -332
- package/dist/presentation/features/templates/FeatureDataViewDetailTemplate/index.js +1 -332
- package/dist/presentation/features/templates/FeatureDataViewsTemplate/FeatureDataViewsTemplate.js +1 -342
- package/dist/presentation/features/templates/FeatureDataViewsTemplate/index.js +1 -342
- package/dist/presentation/features/templates/FeatureEventDetailTemplate/FeatureEventDetailTemplate.js +1 -303
- package/dist/presentation/features/templates/FeatureEventDetailTemplate/index.js +1 -303
- package/dist/presentation/features/templates/FeatureEventsTemplate/FeatureEventsTemplate.js +1 -340
- package/dist/presentation/features/templates/FeatureEventsTemplate/index.js +1 -340
- package/dist/presentation/features/templates/FeatureFormDetailTemplate/FeatureFormDetailTemplate.js +1 -329
- package/dist/presentation/features/templates/FeatureFormDetailTemplate/index.js +1 -329
- package/dist/presentation/features/templates/FeatureFormsTemplate/FeatureFormsTemplate.js +1 -340
- package/dist/presentation/features/templates/FeatureFormsTemplate/index.js +1 -340
- package/dist/presentation/features/templates/FeatureOperationDetailTemplate/FeatureOperationDetailTemplate.js +1 -302
- package/dist/presentation/features/templates/FeatureOperationDetailTemplate/index.js +1 -302
- package/dist/presentation/features/templates/FeatureOperationsTemplate/FeatureOperationsTemplate.js +1 -218
- package/dist/presentation/features/templates/FeatureOperationsTemplate/index.js +1 -218
- package/dist/presentation/features/templates/FeatureOverviewTemplate/FeatureOverviewTemplate.js +1 -187
- package/dist/presentation/features/templates/FeatureOverviewTemplate/index.js +1 -187
- package/dist/presentation/features/templates/FeaturePresentationDetailTemplate/FeaturePresentationDetailTemplate.js +1 -306
- package/dist/presentation/features/templates/FeaturePresentationDetailTemplate/index.js +1 -306
- package/dist/presentation/features/templates/FeaturePresentationsTemplate/FeaturePresentationsTemplate.js +1 -342
- package/dist/presentation/features/templates/FeaturePresentationsTemplate/index.js +1 -342
- package/package.json +109 -37
- package/src/components/docs/DocsIndexPage.tsx +55 -0
- package/src/components/docs/architecture/ArchitectureControlPlanePage.tsx +19 -0
- package/src/components/docs/architecture/ArchitectureOverviewPage.tsx +34 -0
- package/src/components/docs/docsManifest.test.ts +70 -0
- package/src/components/docs/docsManifest.ts +71 -1
- package/src/components/docs/ecosystem/PluginsPage.tsx +24 -10
- package/src/components/docs/ecosystem/RegistryPage.tsx +11 -6
- package/src/components/docs/generated/docs-index._common.json +206 -273
- package/src/components/docs/generated/docs-index.control-plane.json +18 -0
- package/src/components/docs/generated/docs-index.defineExample.json +10 -0
- package/src/components/docs/generated/docs-index.manifest.json +22 -12
- package/src/components/docs/generated/docs-index.platform-acp.json +64 -0
- package/src/components/docs/generated/docs-index.platform-agent.json +89 -1
- package/src/components/docs/generated/docs-index.platform-context.json +48 -0
- package/src/components/docs/generated/docs-index.platform-control-plane.json +72 -0
- package/src/components/docs/generated/docs-index.platform-database.json +40 -0
- package/src/components/docs/generated/docs-index.platform-docs.json +64 -0
- package/src/components/docs/generated/docs-index.platform-provider-ranking.json +89 -1
- package/src/components/docs/generated/docs-index.pocket-family-office.json +8 -0
- package/src/components/docs/generated/docs-index.unknown.json +8 -0
- package/src/components/docs/guides/GuideConnectInRepoPage.tsx +184 -0
- package/src/components/docs/guides/GuideFirstModuleBundlePage.tsx +182 -0
- package/src/components/docs/guides/GuideHostBuilderWorkbenchPage.tsx +230 -0
- package/src/components/docs/guides/GuidesIndexPage.tsx +21 -0
- package/src/components/docs/guides/index.ts +3 -0
- package/src/components/docs/specs/SpecsBuilderControlPlanePage.tsx +210 -0
- package/src/components/docs/specs/SpecsConnectPage.tsx +162 -0
- package/src/components/docs/specs/SpecsModuleBundlesPage.tsx +223 -0
- package/src/components/docs/specs/SpecsOverlaysPage.tsx +20 -0
- package/src/components/docs/specs/SpecsOverviewPage.tsx +44 -0
- package/src/components/docs/specs/SpecsWorkflowsPage.tsx +9 -1
- package/src/components/docs/specs/index.ts +3 -0
- package/src/components/docs/studio/StudioOverviewPage.tsx +26 -0
- package/src/infrastructure/elysia/logger.ts +11 -3
|
@@ -1,35 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
function IntegrationsCircuitBreakersPage() {
|
|
4
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
5
|
-
className: "space-y-8",
|
|
6
|
-
children: [
|
|
7
|
-
/* @__PURE__ */ jsxs("div", {
|
|
8
|
-
className: "space-y-4",
|
|
9
|
-
children: [
|
|
10
|
-
/* @__PURE__ */ jsx("h1", {
|
|
11
|
-
className: "font-bold text-4xl",
|
|
12
|
-
children: "Integration Circuit Breakers"
|
|
13
|
-
}),
|
|
14
|
-
/* @__PURE__ */ jsx("p", {
|
|
15
|
-
className: "text-lg text-muted-foreground",
|
|
16
|
-
children: "External APIs are the most common source of instability. Wrap every integration call in a circuit breaker to protect your system."
|
|
17
|
-
})
|
|
18
|
-
]
|
|
19
|
-
}),
|
|
20
|
-
/* @__PURE__ */ jsxs("div", {
|
|
21
|
-
className: "space-y-4",
|
|
22
|
-
children: [
|
|
23
|
-
/* @__PURE__ */ jsx("h2", {
|
|
24
|
-
className: "font-bold text-2xl",
|
|
25
|
-
children: "Pattern"
|
|
26
|
-
}),
|
|
27
|
-
/* @__PURE__ */ jsx("p", {
|
|
28
|
-
children: "Create a dedicated circuit breaker instance for each external service. This ensures that a failure in Stripe doesn't trigger the circuit breaker for Twilio."
|
|
29
|
-
}),
|
|
30
|
-
/* @__PURE__ */ jsx("pre", {
|
|
31
|
-
className: "rounded-lg border bg-muted p-4 text-sm",
|
|
32
|
-
children: `// integrations/stripe.ts
|
|
1
|
+
import{jsx as R,jsxs as q}from"react/jsx-runtime";function le(){return q("div",{className:"space-y-8",children:[q("div",{className:"space-y-4",children:[R("h1",{className:"font-bold text-4xl",children:"Integration Circuit Breakers"}),R("p",{className:"text-lg text-muted-foreground",children:"External APIs are the most common source of instability. Wrap every integration call in a circuit breaker to protect your system."})]}),q("div",{className:"space-y-4",children:[R("h2",{className:"font-bold text-2xl",children:"Pattern"}),R("p",{children:"Create a dedicated circuit breaker instance for each external service. This ensures that a failure in Stripe doesn't trigger the circuit breaker for Twilio."}),R("pre",{className:"rounded-lg border bg-muted p-4 text-sm",children:`// integrations/stripe.ts
|
|
33
2
|
import { CircuitBreaker } from '@contractspec/lib.resilience/circuit-breaker';
|
|
34
3
|
|
|
35
4
|
const stripeBreaker = new CircuitBreaker({
|
|
@@ -39,62 +8,8 @@ const stripeBreaker = new CircuitBreaker({
|
|
|
39
8
|
|
|
40
9
|
export async function createCharge(amount: number) {
|
|
41
10
|
return stripeBreaker.execute(() => stripe.charges.create({ amount }));
|
|
42
|
-
}`
|
|
43
|
-
|
|
44
|
-
]
|
|
45
|
-
})
|
|
46
|
-
]
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// src/components/docs/integrations/IntegrationsElevenLabsPage.tsx
|
|
51
|
-
import Link from "@contractspec/lib.ui-link";
|
|
52
|
-
import { ChevronRight } from "lucide-react";
|
|
53
|
-
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
54
|
-
function IntegrationsElevenLabsPage() {
|
|
55
|
-
return /* @__PURE__ */ jsxs2("div", {
|
|
56
|
-
className: "space-y-8",
|
|
57
|
-
children: [
|
|
58
|
-
/* @__PURE__ */ jsxs2("div", {
|
|
59
|
-
className: "space-y-4",
|
|
60
|
-
children: [
|
|
61
|
-
/* @__PURE__ */ jsx2("h1", {
|
|
62
|
-
className: "font-bold text-4xl",
|
|
63
|
-
children: "ElevenLabs"
|
|
64
|
-
}),
|
|
65
|
-
/* @__PURE__ */ jsx2("p", {
|
|
66
|
-
className: "text-muted-foreground",
|
|
67
|
-
children: "ElevenLabs provides state-of-the-art text-to-speech and voice cloning technology. Create natural-sounding voiceovers, audiobooks, and voice assistants."
|
|
68
|
-
})
|
|
69
|
-
]
|
|
70
|
-
}),
|
|
71
|
-
/* @__PURE__ */ jsxs2("div", {
|
|
72
|
-
className: "space-y-4",
|
|
73
|
-
children: [
|
|
74
|
-
/* @__PURE__ */ jsx2("h2", {
|
|
75
|
-
className: "font-bold text-2xl",
|
|
76
|
-
children: "Setup"
|
|
77
|
-
}),
|
|
78
|
-
/* @__PURE__ */ jsx2("div", {
|
|
79
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
80
|
-
children: /* @__PURE__ */ jsx2("pre", {
|
|
81
|
-
children: `# .env
|
|
82
|
-
ELEVENLABS_API_KEY=...`
|
|
83
|
-
})
|
|
84
|
-
})
|
|
85
|
-
]
|
|
86
|
-
}),
|
|
87
|
-
/* @__PURE__ */ jsxs2("div", {
|
|
88
|
-
className: "space-y-4",
|
|
89
|
-
children: [
|
|
90
|
-
/* @__PURE__ */ jsx2("h2", {
|
|
91
|
-
className: "font-bold text-2xl",
|
|
92
|
-
children: "Text-to-Speech"
|
|
93
|
-
}),
|
|
94
|
-
/* @__PURE__ */ jsx2("div", {
|
|
95
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
96
|
-
children: /* @__PURE__ */ jsx2("pre", {
|
|
97
|
-
children: `capabilityId: elevenlabs-tts
|
|
11
|
+
}`})]})]})}import G from"@contractspec/lib.ui-link";import{ChevronRight as ne}from"lucide-react";import{jsx as k,jsxs as U}from"react/jsx-runtime";function ce(){return U("div",{className:"space-y-8",children:[U("div",{className:"space-y-4",children:[k("h1",{className:"font-bold text-4xl",children:"ElevenLabs"}),k("p",{className:"text-muted-foreground",children:"ElevenLabs provides state-of-the-art text-to-speech and voice cloning technology. Create natural-sounding voiceovers, audiobooks, and voice assistants."})]}),U("div",{className:"space-y-4",children:[k("h2",{className:"font-bold text-2xl",children:"Setup"}),k("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:k("pre",{children:`# .env
|
|
12
|
+
ELEVENLABS_API_KEY=...`})})]}),U("div",{className:"space-y-4",children:[k("h2",{className:"font-bold text-2xl",children:"Text-to-Speech"}),k("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:k("pre",{children:`capabilityId: elevenlabs-tts
|
|
98
13
|
provider:
|
|
99
14
|
type: elevenlabs
|
|
100
15
|
operation: textToSpeech
|
|
@@ -113,93 +28,7 @@ outputs:
|
|
|
113
28
|
audioUrl:
|
|
114
29
|
type: string
|
|
115
30
|
audioData:
|
|
116
|
-
type: buffer`
|
|
117
|
-
})
|
|
118
|
-
})
|
|
119
|
-
]
|
|
120
|
-
}),
|
|
121
|
-
/* @__PURE__ */ jsxs2("div", {
|
|
122
|
-
className: "space-y-4",
|
|
123
|
-
children: [
|
|
124
|
-
/* @__PURE__ */ jsx2("h2", {
|
|
125
|
-
className: "font-bold text-2xl",
|
|
126
|
-
children: "Use cases"
|
|
127
|
-
}),
|
|
128
|
-
/* @__PURE__ */ jsxs2("ul", {
|
|
129
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
130
|
-
children: [
|
|
131
|
-
/* @__PURE__ */ jsx2("li", {
|
|
132
|
-
children: "Generate voiceovers for videos"
|
|
133
|
-
}),
|
|
134
|
-
/* @__PURE__ */ jsx2("li", {
|
|
135
|
-
children: "Create audio versions of articles"
|
|
136
|
-
}),
|
|
137
|
-
/* @__PURE__ */ jsx2("li", {
|
|
138
|
-
children: "Build voice assistants"
|
|
139
|
-
}),
|
|
140
|
-
/* @__PURE__ */ jsx2("li", {
|
|
141
|
-
children: "Produce audiobooks"
|
|
142
|
-
})
|
|
143
|
-
]
|
|
144
|
-
})
|
|
145
|
-
]
|
|
146
|
-
}),
|
|
147
|
-
/* @__PURE__ */ jsxs2("div", {
|
|
148
|
-
className: "flex items-center gap-4 pt-4",
|
|
149
|
-
children: [
|
|
150
|
-
/* @__PURE__ */ jsx2(Link, {
|
|
151
|
-
href: "/docs/integrations/mistral",
|
|
152
|
-
className: "btn-ghost",
|
|
153
|
-
children: "Previous: Mistral"
|
|
154
|
-
}),
|
|
155
|
-
/* @__PURE__ */ jsxs2(Link, {
|
|
156
|
-
href: "/docs/integrations/qdrant",
|
|
157
|
-
className: "btn-primary",
|
|
158
|
-
children: [
|
|
159
|
-
"Next: Qdrant ",
|
|
160
|
-
/* @__PURE__ */ jsx2(ChevronRight, {
|
|
161
|
-
size: 16
|
|
162
|
-
})
|
|
163
|
-
]
|
|
164
|
-
})
|
|
165
|
-
]
|
|
166
|
-
})
|
|
167
|
-
]
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// src/components/docs/integrations/IntegrationsGithubPage.tsx
|
|
172
|
-
import Link2 from "@contractspec/lib.ui-link";
|
|
173
|
-
import { ChevronRight as ChevronRight2 } from "lucide-react";
|
|
174
|
-
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
175
|
-
function IntegrationsGithubPage() {
|
|
176
|
-
return /* @__PURE__ */ jsxs3("div", {
|
|
177
|
-
className: "space-y-8",
|
|
178
|
-
children: [
|
|
179
|
-
/* @__PURE__ */ jsxs3("div", {
|
|
180
|
-
className: "space-y-4",
|
|
181
|
-
children: [
|
|
182
|
-
/* @__PURE__ */ jsx3("h1", {
|
|
183
|
-
className: "font-bold text-4xl",
|
|
184
|
-
children: "GitHub Messaging"
|
|
185
|
-
}),
|
|
186
|
-
/* @__PURE__ */ jsx3("p", {
|
|
187
|
-
className: "text-muted-foreground",
|
|
188
|
-
children: "Use GitHub issue and pull request comments as an AI-native messaging channel with webhook verification, policy checks, and reliable outbound dispatch."
|
|
189
|
-
})
|
|
190
|
-
]
|
|
191
|
-
}),
|
|
192
|
-
/* @__PURE__ */ jsxs3("div", {
|
|
193
|
-
className: "space-y-4",
|
|
194
|
-
children: [
|
|
195
|
-
/* @__PURE__ */ jsx3("h2", {
|
|
196
|
-
className: "font-bold text-2xl",
|
|
197
|
-
children: "Required secrets and config"
|
|
198
|
-
}),
|
|
199
|
-
/* @__PURE__ */ jsx3("div", {
|
|
200
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
201
|
-
children: /* @__PURE__ */ jsx3("pre", {
|
|
202
|
-
children: `// secret payload
|
|
31
|
+
type: buffer`})})]}),U("div",{className:"space-y-4",children:[k("h2",{className:"font-bold text-2xl",children:"Use cases"}),U("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[k("li",{children:"Generate voiceovers for videos"}),k("li",{children:"Create audio versions of articles"}),k("li",{children:"Build voice assistants"}),k("li",{children:"Produce audiobooks"})]})]}),U("div",{className:"flex items-center gap-4 pt-4",children:[k(G,{href:"/docs/integrations/mistral",className:"btn-ghost",children:"Previous: Mistral"}),U(G,{href:"/docs/integrations/qdrant",className:"btn-primary",children:["Next: Qdrant ",k(ne,{size:16})]})]})]})}import V from"@contractspec/lib.ui-link";import{ChevronRight as pe}from"lucide-react";import{jsx as g,jsxs as I}from"react/jsx-runtime";function me(){return I("div",{className:"space-y-8",children:[I("div",{className:"space-y-4",children:[g("h1",{className:"font-bold text-4xl",children:"GitHub Messaging"}),g("p",{className:"text-muted-foreground",children:"Use GitHub issue and pull request comments as an AI-native messaging channel with webhook verification, policy checks, and reliable outbound dispatch."})]}),I("div",{className:"space-y-4",children:[g("h2",{className:"font-bold text-2xl",children:"Required secrets and config"}),g("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:g("pre",{children:`// secret payload
|
|
203
32
|
{
|
|
204
33
|
"token": "ghp_...",
|
|
205
34
|
"webhookSecret": "..."
|
|
@@ -210,170 +39,13 @@ function IntegrationsGithubPage() {
|
|
|
210
39
|
"defaultOwner": "lssm-tech",
|
|
211
40
|
"defaultRepo": "contractspec",
|
|
212
41
|
"apiBaseUrl": "https://api.github.com"
|
|
213
|
-
}`
|
|
214
|
-
})
|
|
215
|
-
})
|
|
216
|
-
]
|
|
217
|
-
}),
|
|
218
|
-
/* @__PURE__ */ jsxs3("div", {
|
|
219
|
-
className: "space-y-4",
|
|
220
|
-
children: [
|
|
221
|
-
/* @__PURE__ */ jsx3("h2", {
|
|
222
|
-
className: "font-bold text-2xl",
|
|
223
|
-
children: "Webhook ingress"
|
|
224
|
-
}),
|
|
225
|
-
/* @__PURE__ */ jsxs3("ul", {
|
|
226
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
227
|
-
children: [
|
|
228
|
-
/* @__PURE__ */ jsxs3("li", {
|
|
229
|
-
children: [
|
|
230
|
-
"Inbound GitHub events are accepted on",
|
|
231
|
-
" ",
|
|
232
|
-
/* @__PURE__ */ jsx3("code", {
|
|
233
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
234
|
-
children: "/webhooks/github/events"
|
|
235
|
-
}),
|
|
236
|
-
"."
|
|
237
|
-
]
|
|
238
|
-
}),
|
|
239
|
-
/* @__PURE__ */ jsxs3("li", {
|
|
240
|
-
children: [
|
|
241
|
-
"Signatures are checked using",
|
|
242
|
-
" ",
|
|
243
|
-
/* @__PURE__ */ jsx3("code", {
|
|
244
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
245
|
-
children: "x-hub-signature-256"
|
|
246
|
-
}),
|
|
247
|
-
" ",
|
|
248
|
-
"and the configured webhook secret."
|
|
249
|
-
]
|
|
250
|
-
}),
|
|
251
|
-
/* @__PURE__ */ jsx3("li", {
|
|
252
|
-
children: "Current normalization focuses on issue comment workflows and durable comment dispatch."
|
|
253
|
-
})
|
|
254
|
-
]
|
|
255
|
-
})
|
|
256
|
-
]
|
|
257
|
-
}),
|
|
258
|
-
/* @__PURE__ */ jsxs3("div", {
|
|
259
|
-
className: "space-y-4",
|
|
260
|
-
children: [
|
|
261
|
-
/* @__PURE__ */ jsx3("h2", {
|
|
262
|
-
className: "font-bold text-2xl",
|
|
263
|
-
children: "Workspace mapping"
|
|
264
|
-
}),
|
|
265
|
-
/* @__PURE__ */ jsx3("div", {
|
|
266
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
267
|
-
children: /* @__PURE__ */ jsx3("pre", {
|
|
268
|
-
children: `CHANNEL_WORKSPACE_MAP_GITHUB={"lssm-tech/contractspec":"workspace-acme"}
|
|
42
|
+
}`})})]}),I("div",{className:"space-y-4",children:[g("h2",{className:"font-bold text-2xl",children:"Webhook ingress"}),I("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[I("li",{children:["Inbound GitHub events are accepted on"," ",g("code",{className:"rounded bg-background/50 px-2 py-1",children:"/webhooks/github/events"}),"."]}),I("li",{children:["Signatures are checked using"," ",g("code",{className:"rounded bg-background/50 px-2 py-1",children:"x-hub-signature-256"})," ","and the configured webhook secret."]}),g("li",{children:"Current normalization focuses on issue comment workflows and durable comment dispatch."})]})]}),I("div",{className:"space-y-4",children:[g("h2",{className:"font-bold text-2xl",children:"Workspace mapping"}),g("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:g("pre",{children:`CHANNEL_WORKSPACE_MAP_GITHUB={"lssm-tech/contractspec":"workspace-acme"}
|
|
269
43
|
|
|
270
44
|
# Optional dev fallback (off by default)
|
|
271
|
-
CHANNEL_ALLOW_UNMAPPED_WORKSPACE=0`
|
|
272
|
-
})
|
|
273
|
-
})
|
|
274
|
-
]
|
|
275
|
-
}),
|
|
276
|
-
/* @__PURE__ */ jsxs3("div", {
|
|
277
|
-
className: "space-y-4",
|
|
278
|
-
children: [
|
|
279
|
-
/* @__PURE__ */ jsx3("h2", {
|
|
280
|
-
className: "font-bold text-2xl",
|
|
281
|
-
children: "Best practices"
|
|
282
|
-
}),
|
|
283
|
-
/* @__PURE__ */ jsxs3("ul", {
|
|
284
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
285
|
-
children: [
|
|
286
|
-
/* @__PURE__ */ jsx3("li", {
|
|
287
|
-
children: "Use a least-privileged token scoped for comment operations."
|
|
288
|
-
}),
|
|
289
|
-
/* @__PURE__ */ jsx3("li", {
|
|
290
|
-
children: "Route repositories explicitly with workspace maps in multi-tenant environments."
|
|
291
|
-
}),
|
|
292
|
-
/* @__PURE__ */ jsx3("li", {
|
|
293
|
-
children: "Keep dispatch endpoints protected with token or bearer auth."
|
|
294
|
-
})
|
|
295
|
-
]
|
|
296
|
-
})
|
|
297
|
-
]
|
|
298
|
-
}),
|
|
299
|
-
/* @__PURE__ */ jsxs3("div", {
|
|
300
|
-
className: "flex items-center gap-4 pt-4",
|
|
301
|
-
children: [
|
|
302
|
-
/* @__PURE__ */ jsx3(Link2, {
|
|
303
|
-
href: "/docs/integrations/slack",
|
|
304
|
-
className: "btn-ghost",
|
|
305
|
-
children: "Previous: Slack Messaging"
|
|
306
|
-
}),
|
|
307
|
-
/* @__PURE__ */ jsxs3(Link2, {
|
|
308
|
-
href: "/docs/integrations/whatsapp-meta",
|
|
309
|
-
className: "btn-primary",
|
|
310
|
-
children: [
|
|
311
|
-
"Next: WhatsApp Meta ",
|
|
312
|
-
/* @__PURE__ */ jsx3(ChevronRight2, {
|
|
313
|
-
size: 16
|
|
314
|
-
})
|
|
315
|
-
]
|
|
316
|
-
})
|
|
317
|
-
]
|
|
318
|
-
})
|
|
319
|
-
]
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// src/components/docs/integrations/IntegrationsGmailPage.tsx
|
|
324
|
-
import Link3 from "@contractspec/lib.ui-link";
|
|
325
|
-
import { ChevronRight as ChevronRight3 } from "lucide-react";
|
|
326
|
-
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
327
|
-
function IntegrationsGmailPage() {
|
|
328
|
-
return /* @__PURE__ */ jsxs4("div", {
|
|
329
|
-
className: "space-y-8",
|
|
330
|
-
children: [
|
|
331
|
-
/* @__PURE__ */ jsxs4("div", {
|
|
332
|
-
className: "space-y-4",
|
|
333
|
-
children: [
|
|
334
|
-
/* @__PURE__ */ jsx4("h1", {
|
|
335
|
-
className: "font-bold text-4xl",
|
|
336
|
-
children: "Gmail API"
|
|
337
|
-
}),
|
|
338
|
-
/* @__PURE__ */ jsx4("p", {
|
|
339
|
-
className: "text-muted-foreground",
|
|
340
|
-
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."
|
|
341
|
-
})
|
|
342
|
-
]
|
|
343
|
-
}),
|
|
344
|
-
/* @__PURE__ */ jsxs4("div", {
|
|
345
|
-
className: "space-y-4",
|
|
346
|
-
children: [
|
|
347
|
-
/* @__PURE__ */ jsx4("h2", {
|
|
348
|
-
className: "font-bold text-2xl",
|
|
349
|
-
children: "Setup"
|
|
350
|
-
}),
|
|
351
|
-
/* @__PURE__ */ jsx4("p", {
|
|
352
|
-
className: "text-muted-foreground",
|
|
353
|
-
children: "Configure OAuth 2.0 credentials in Google Cloud Console:"
|
|
354
|
-
}),
|
|
355
|
-
/* @__PURE__ */ jsx4("div", {
|
|
356
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
357
|
-
children: /* @__PURE__ */ jsx4("pre", {
|
|
358
|
-
children: `# .env
|
|
45
|
+
CHANNEL_ALLOW_UNMAPPED_WORKSPACE=0`})})]}),I("div",{className:"space-y-4",children:[g("h2",{className:"font-bold text-2xl",children:"Best practices"}),I("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[g("li",{children:"Use a least-privileged token scoped for comment operations."}),g("li",{children:"Route repositories explicitly with workspace maps in multi-tenant environments."}),g("li",{children:"Keep dispatch endpoints protected with token or bearer auth."})]})]}),I("div",{className:"flex items-center gap-4 pt-4",children:[g(V,{href:"/docs/integrations/slack",className:"btn-ghost",children:"Previous: Slack Messaging"}),I(V,{href:"/docs/integrations/whatsapp-meta",className:"btn-primary",children:["Next: WhatsApp Meta ",g(pe,{size:16})]})]})]})}import F from"@contractspec/lib.ui-link";import{ChevronRight as ue}from"lucide-react";import{jsx as v,jsxs as O}from"react/jsx-runtime";function ge(){return O("div",{className:"space-y-8",children:[O("div",{className:"space-y-4",children:[v("h1",{className:"font-bold text-4xl",children:"Gmail API"}),v("p",{className:"text-muted-foreground",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."})]}),O("div",{className:"space-y-4",children:[v("h2",{className:"font-bold text-2xl",children:"Setup"}),v("p",{className:"text-muted-foreground",children:"Configure OAuth 2.0 credentials in Google Cloud Console:"}),v("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:v("pre",{children:`# .env
|
|
359
46
|
GOOGLE_CLIENT_ID=...
|
|
360
47
|
GOOGLE_CLIENT_SECRET=...
|
|
361
|
-
GOOGLE_REDIRECT_URI=https://your-app.com/auth/google/callback`
|
|
362
|
-
})
|
|
363
|
-
})
|
|
364
|
-
]
|
|
365
|
-
}),
|
|
366
|
-
/* @__PURE__ */ jsxs4("div", {
|
|
367
|
-
className: "space-y-4",
|
|
368
|
-
children: [
|
|
369
|
-
/* @__PURE__ */ jsx4("h2", {
|
|
370
|
-
className: "font-bold text-2xl",
|
|
371
|
-
children: "Reading emails"
|
|
372
|
-
}),
|
|
373
|
-
/* @__PURE__ */ jsx4("div", {
|
|
374
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
375
|
-
children: /* @__PURE__ */ jsx4("pre", {
|
|
376
|
-
children: `capabilityId: gmail-list-messages
|
|
48
|
+
GOOGLE_REDIRECT_URI=https://your-app.com/auth/google/callback`})})]}),O("div",{className:"space-y-4",children:[v("h2",{className:"font-bold text-2xl",children:"Reading emails"}),v("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:v("pre",{children:`capabilityId: gmail-list-messages
|
|
377
49
|
provider:
|
|
378
50
|
type: gmail
|
|
379
51
|
operation: listMessages
|
|
@@ -394,111 +66,10 @@ outputs:
|
|
|
394
66
|
properties:
|
|
395
67
|
id: string
|
|
396
68
|
threadId: string
|
|
397
|
-
snippet: string`
|
|
398
|
-
})
|
|
399
|
-
})
|
|
400
|
-
]
|
|
401
|
-
}),
|
|
402
|
-
/* @__PURE__ */ jsxs4("div", {
|
|
403
|
-
className: "space-y-4",
|
|
404
|
-
children: [
|
|
405
|
-
/* @__PURE__ */ jsx4("h2", {
|
|
406
|
-
className: "font-bold text-2xl",
|
|
407
|
-
children: "Use cases"
|
|
408
|
-
}),
|
|
409
|
-
/* @__PURE__ */ jsxs4("ul", {
|
|
410
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
411
|
-
children: [
|
|
412
|
-
/* @__PURE__ */ jsx4("li", {
|
|
413
|
-
children: "Parse support emails and create tickets"
|
|
414
|
-
}),
|
|
415
|
-
/* @__PURE__ */ jsx4("li", {
|
|
416
|
-
children: "Extract attachments and process them"
|
|
417
|
-
}),
|
|
418
|
-
/* @__PURE__ */ jsx4("li", {
|
|
419
|
-
children: "Build email-to-task workflows"
|
|
420
|
-
}),
|
|
421
|
-
/* @__PURE__ */ jsx4("li", {
|
|
422
|
-
children: "Monitor specific email threads"
|
|
423
|
-
})
|
|
424
|
-
]
|
|
425
|
-
})
|
|
426
|
-
]
|
|
427
|
-
}),
|
|
428
|
-
/* @__PURE__ */ jsxs4("div", {
|
|
429
|
-
className: "flex items-center gap-4 pt-4",
|
|
430
|
-
children: [
|
|
431
|
-
/* @__PURE__ */ jsx4(Link3, {
|
|
432
|
-
href: "/docs/integrations/resend",
|
|
433
|
-
className: "btn-ghost",
|
|
434
|
-
children: "Previous: Resend"
|
|
435
|
-
}),
|
|
436
|
-
/* @__PURE__ */ jsxs4(Link3, {
|
|
437
|
-
href: "/docs/integrations/google-calendar",
|
|
438
|
-
className: "btn-primary",
|
|
439
|
-
children: [
|
|
440
|
-
"Next: Google Calendar ",
|
|
441
|
-
/* @__PURE__ */ jsx4(ChevronRight3, {
|
|
442
|
-
size: 16
|
|
443
|
-
})
|
|
444
|
-
]
|
|
445
|
-
})
|
|
446
|
-
]
|
|
447
|
-
})
|
|
448
|
-
]
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// src/components/docs/integrations/IntegrationsGoogleCalendarPage.tsx
|
|
453
|
-
import Link4 from "@contractspec/lib.ui-link";
|
|
454
|
-
import { ChevronRight as ChevronRight4 } from "lucide-react";
|
|
455
|
-
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
456
|
-
function IntegrationsGoogleCalendarPage() {
|
|
457
|
-
return /* @__PURE__ */ jsxs5("div", {
|
|
458
|
-
className: "space-y-8",
|
|
459
|
-
children: [
|
|
460
|
-
/* @__PURE__ */ jsxs5("div", {
|
|
461
|
-
className: "space-y-4",
|
|
462
|
-
children: [
|
|
463
|
-
/* @__PURE__ */ jsx5("h1", {
|
|
464
|
-
className: "font-bold text-4xl",
|
|
465
|
-
children: "Google Calendar"
|
|
466
|
-
}),
|
|
467
|
-
/* @__PURE__ */ jsx5("p", {
|
|
468
|
-
className: "text-muted-foreground",
|
|
469
|
-
children: "Integrate Google Calendar to schedule appointments, manage availability, and sync events with your application."
|
|
470
|
-
})
|
|
471
|
-
]
|
|
472
|
-
}),
|
|
473
|
-
/* @__PURE__ */ jsxs5("div", {
|
|
474
|
-
className: "space-y-4",
|
|
475
|
-
children: [
|
|
476
|
-
/* @__PURE__ */ jsx5("h2", {
|
|
477
|
-
className: "font-bold text-2xl",
|
|
478
|
-
children: "Setup"
|
|
479
|
-
}),
|
|
480
|
-
/* @__PURE__ */ jsx5("div", {
|
|
481
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
482
|
-
children: /* @__PURE__ */ jsx5("pre", {
|
|
483
|
-
children: `# .env
|
|
69
|
+
snippet: string`})})]}),O("div",{className:"space-y-4",children:[v("h2",{className:"font-bold text-2xl",children:"Use cases"}),O("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[v("li",{children:"Parse support emails and create tickets"}),v("li",{children:"Extract attachments and process them"}),v("li",{children:"Build email-to-task workflows"}),v("li",{children:"Monitor specific email threads"})]})]}),O("div",{className:"flex items-center gap-4 pt-4",children:[v(F,{href:"/docs/integrations/resend",className:"btn-ghost",children:"Previous: Resend"}),O(F,{href:"/docs/integrations/google-calendar",className:"btn-primary",children:["Next: Google Calendar ",v(ue,{size:16})]})]})]})}import Y from"@contractspec/lib.ui-link";import{ChevronRight as fe}from"lucide-react";import{jsx as M,jsxs as K}from"react/jsx-runtime";function he(){return K("div",{className:"space-y-8",children:[K("div",{className:"space-y-4",children:[M("h1",{className:"font-bold text-4xl",children:"Google Calendar"}),M("p",{className:"text-muted-foreground",children:"Integrate Google Calendar to schedule appointments, manage availability, and sync events with your application."})]}),K("div",{className:"space-y-4",children:[M("h2",{className:"font-bold text-2xl",children:"Setup"}),M("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:M("pre",{children:`# .env
|
|
484
70
|
GOOGLE_CLIENT_ID=...
|
|
485
71
|
GOOGLE_CLIENT_SECRET=...
|
|
486
|
-
GOOGLE_CALENDAR_ID=primary`
|
|
487
|
-
})
|
|
488
|
-
})
|
|
489
|
-
]
|
|
490
|
-
}),
|
|
491
|
-
/* @__PURE__ */ jsxs5("div", {
|
|
492
|
-
className: "space-y-4",
|
|
493
|
-
children: [
|
|
494
|
-
/* @__PURE__ */ jsx5("h2", {
|
|
495
|
-
className: "font-bold text-2xl",
|
|
496
|
-
children: "Creating events"
|
|
497
|
-
}),
|
|
498
|
-
/* @__PURE__ */ jsx5("div", {
|
|
499
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
500
|
-
children: /* @__PURE__ */ jsx5("pre", {
|
|
501
|
-
children: `capabilityId: calendar-create-event
|
|
72
|
+
GOOGLE_CALENDAR_ID=primary`})})]}),K("div",{className:"space-y-4",children:[M("h2",{className:"font-bold text-2xl",children:"Creating events"}),M("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:M("pre",{children:`capabilityId: calendar-create-event
|
|
502
73
|
provider:
|
|
503
74
|
type: google-calendar
|
|
504
75
|
operation: createEvent
|
|
@@ -522,66 +93,7 @@ outputs:
|
|
|
522
93
|
eventId:
|
|
523
94
|
type: string
|
|
524
95
|
htmlLink:
|
|
525
|
-
type: string`
|
|
526
|
-
})
|
|
527
|
-
})
|
|
528
|
-
]
|
|
529
|
-
}),
|
|
530
|
-
/* @__PURE__ */ jsxs5("div", {
|
|
531
|
-
className: "flex items-center gap-4 pt-4",
|
|
532
|
-
children: [
|
|
533
|
-
/* @__PURE__ */ jsx5(Link4, {
|
|
534
|
-
href: "/docs/integrations/gmail",
|
|
535
|
-
className: "btn-ghost",
|
|
536
|
-
children: "Previous: Gmail API"
|
|
537
|
-
}),
|
|
538
|
-
/* @__PURE__ */ jsxs5(Link4, {
|
|
539
|
-
href: "/docs/integrations/openai",
|
|
540
|
-
className: "btn-primary",
|
|
541
|
-
children: [
|
|
542
|
-
"Next: OpenAI ",
|
|
543
|
-
/* @__PURE__ */ jsx5(ChevronRight4, {
|
|
544
|
-
size: 16
|
|
545
|
-
})
|
|
546
|
-
]
|
|
547
|
-
})
|
|
548
|
-
]
|
|
549
|
-
})
|
|
550
|
-
]
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
// src/components/docs/integrations/IntegrationsHealthRoutingPage.tsx
|
|
555
|
-
import Link5 from "@contractspec/lib.ui-link";
|
|
556
|
-
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
557
|
-
function IntegrationsHealthRoutingPage() {
|
|
558
|
-
return /* @__PURE__ */ jsxs6("div", {
|
|
559
|
-
className: "space-y-8",
|
|
560
|
-
children: [
|
|
561
|
-
/* @__PURE__ */ jsxs6("div", {
|
|
562
|
-
className: "space-y-4",
|
|
563
|
-
children: [
|
|
564
|
-
/* @__PURE__ */ jsx6("h1", {
|
|
565
|
-
className: "font-bold text-4xl",
|
|
566
|
-
children: "Health Routing Strategy"
|
|
567
|
-
}),
|
|
568
|
-
/* @__PURE__ */ jsx6("p", {
|
|
569
|
-
className: "text-muted-foreground",
|
|
570
|
-
children: "Health integrations resolve providers through deterministic transport strategy order with explicit capability gating and unofficial-route controls."
|
|
571
|
-
})
|
|
572
|
-
]
|
|
573
|
-
}),
|
|
574
|
-
/* @__PURE__ */ jsxs6("div", {
|
|
575
|
-
className: "space-y-4",
|
|
576
|
-
children: [
|
|
577
|
-
/* @__PURE__ */ jsx6("h2", {
|
|
578
|
-
className: "font-bold text-2xl",
|
|
579
|
-
children: "Connection config fields"
|
|
580
|
-
}),
|
|
581
|
-
/* @__PURE__ */ jsx6("div", {
|
|
582
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
583
|
-
children: /* @__PURE__ */ jsx6("pre", {
|
|
584
|
-
children: `{
|
|
96
|
+
type: string`})})]}),K("div",{className:"flex items-center gap-4 pt-4",children:[M(Y,{href:"/docs/integrations/gmail",className:"btn-ghost",children:"Previous: Gmail API"}),K(Y,{href:"/docs/integrations/openai",className:"btn-primary",children:["Next: OpenAI ",M(fe,{size:16})]})]})]})}import Z from"@contractspec/lib.ui-link";import{jsx as p,jsxs as P}from"react/jsx-runtime";function be(){return P("div",{className:"space-y-8",children:[P("div",{className:"space-y-4",children:[p("h1",{className:"font-bold text-4xl",children:"Health Routing Strategy"}),p("p",{className:"text-muted-foreground",children:"Health integrations resolve providers through deterministic transport strategy order with explicit capability gating and unofficial-route controls."})]}),P("div",{className:"space-y-4",children:[p("h2",{className:"font-bold text-2xl",children:"Connection config fields"}),p("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:p("pre",{children:`{
|
|
585
97
|
"defaultTransport": "official-api",
|
|
586
98
|
"strategyOrder": [
|
|
587
99
|
"official-api",
|
|
@@ -595,22 +107,7 @@ function IntegrationsHealthRoutingPage() {
|
|
|
595
107
|
"apiBaseUrl": "https://api.provider.example",
|
|
596
108
|
"mcpUrl": "https://mcp.provider.example",
|
|
597
109
|
"oauthTokenUrl": "https://api.provider.example/oauth/token"
|
|
598
|
-
}`
|
|
599
|
-
})
|
|
600
|
-
})
|
|
601
|
-
]
|
|
602
|
-
}),
|
|
603
|
-
/* @__PURE__ */ jsxs6("div", {
|
|
604
|
-
className: "space-y-4",
|
|
605
|
-
children: [
|
|
606
|
-
/* @__PURE__ */ jsx6("h2", {
|
|
607
|
-
className: "font-bold text-2xl",
|
|
608
|
-
children: "Secret payload fields"
|
|
609
|
-
}),
|
|
610
|
-
/* @__PURE__ */ jsx6("div", {
|
|
611
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
612
|
-
children: /* @__PURE__ */ jsx6("pre", {
|
|
613
|
-
children: `{
|
|
110
|
+
}`})})]}),P("div",{className:"space-y-4",children:[p("h2",{className:"font-bold text-2xl",children:"Secret payload fields"}),p("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:p("pre",{children:`{
|
|
614
111
|
"apiKey": "...",
|
|
615
112
|
"accessToken": "...",
|
|
616
113
|
"refreshToken": "...",
|
|
@@ -619,151 +116,8 @@ function IntegrationsHealthRoutingPage() {
|
|
|
619
116
|
"tokenExpiresAt": "2026-02-01T00:00:00.000Z",
|
|
620
117
|
"mcpAccessToken": "...",
|
|
621
118
|
"webhookSecret": "..."
|
|
622
|
-
}`
|
|
623
|
-
|
|
624
|
-
})
|
|
625
|
-
]
|
|
626
|
-
}),
|
|
627
|
-
/* @__PURE__ */ jsxs6("div", {
|
|
628
|
-
className: "space-y-4",
|
|
629
|
-
children: [
|
|
630
|
-
/* @__PURE__ */ jsx6("h2", {
|
|
631
|
-
className: "font-bold text-2xl",
|
|
632
|
-
children: "Routing behavior"
|
|
633
|
-
}),
|
|
634
|
-
/* @__PURE__ */ jsxs6("ul", {
|
|
635
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
636
|
-
children: [
|
|
637
|
-
/* @__PURE__ */ jsx6("li", {
|
|
638
|
-
children: "Unsupported strategies are skipped per provider capability matrix."
|
|
639
|
-
}),
|
|
640
|
-
/* @__PURE__ */ jsx6("li", {
|
|
641
|
-
children: "Missing credentials fail closed and fall through only when a later strategy is valid."
|
|
642
|
-
}),
|
|
643
|
-
/* @__PURE__ */ jsxs6("li", {
|
|
644
|
-
children: [
|
|
645
|
-
"Unofficial routes are disabled unless",
|
|
646
|
-
/* @__PURE__ */ jsx6("code", {
|
|
647
|
-
className: "ml-1 rounded bg-background/50 px-2 py-1",
|
|
648
|
-
children: "allowUnofficial"
|
|
649
|
-
}),
|
|
650
|
-
"is true."
|
|
651
|
-
]
|
|
652
|
-
}),
|
|
653
|
-
/* @__PURE__ */ jsxs6("li", {
|
|
654
|
-
children: [
|
|
655
|
-
"When",
|
|
656
|
-
/* @__PURE__ */ jsx6("code", {
|
|
657
|
-
className: "ml-1 rounded bg-background/50 px-2 py-1",
|
|
658
|
-
children: "unofficialAllowList"
|
|
659
|
-
}),
|
|
660
|
-
"is set, only listed provider keys can route unofficially."
|
|
661
|
-
]
|
|
662
|
-
}),
|
|
663
|
-
/* @__PURE__ */ jsxs6("li", {
|
|
664
|
-
children: [
|
|
665
|
-
"OAuth refresh uses",
|
|
666
|
-
/* @__PURE__ */ jsx6("code", {
|
|
667
|
-
className: "ml-1 rounded bg-background/50 px-2 py-1",
|
|
668
|
-
children: "oauthTokenUrl"
|
|
669
|
-
}),
|
|
670
|
-
"with refresh/client credentials when APIs return 401."
|
|
671
|
-
]
|
|
672
|
-
})
|
|
673
|
-
]
|
|
674
|
-
})
|
|
675
|
-
]
|
|
676
|
-
}),
|
|
677
|
-
/* @__PURE__ */ jsxs6("div", {
|
|
678
|
-
className: "space-y-4",
|
|
679
|
-
children: [
|
|
680
|
-
/* @__PURE__ */ jsx6("h2", {
|
|
681
|
-
className: "font-bold text-2xl",
|
|
682
|
-
children: "Provider guidance"
|
|
683
|
-
}),
|
|
684
|
-
/* @__PURE__ */ jsxs6("ul", {
|
|
685
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
686
|
-
children: [
|
|
687
|
-
/* @__PURE__ */ jsx6("li", {
|
|
688
|
-
children: "Use official APIs when available (Whoop, Oura, Strava, Fitbit)."
|
|
689
|
-
}),
|
|
690
|
-
/* @__PURE__ */ jsx6("li", {
|
|
691
|
-
children: "Use aggregator routing for providers without stable official APIs (Garmin, MyFitnessPal, Eight Sleep, Peloton)."
|
|
692
|
-
}),
|
|
693
|
-
/* @__PURE__ */ jsx6("li", {
|
|
694
|
-
children: "Keep unofficial automation opt-in and auditable for production."
|
|
695
|
-
})
|
|
696
|
-
]
|
|
697
|
-
})
|
|
698
|
-
]
|
|
699
|
-
}),
|
|
700
|
-
/* @__PURE__ */ jsxs6("div", {
|
|
701
|
-
className: "flex items-center gap-4 pt-4",
|
|
702
|
-
children: [
|
|
703
|
-
/* @__PURE__ */ jsx6(Link5, {
|
|
704
|
-
href: "/docs/integrations/whatsapp-twilio",
|
|
705
|
-
className: "btn-ghost",
|
|
706
|
-
children: "Previous: WhatsApp Twilio"
|
|
707
|
-
}),
|
|
708
|
-
/* @__PURE__ */ jsx6(Link5, {
|
|
709
|
-
href: "/docs/integrations",
|
|
710
|
-
className: "btn-primary",
|
|
711
|
-
children: "Back to Integrations"
|
|
712
|
-
})
|
|
713
|
-
]
|
|
714
|
-
})
|
|
715
|
-
]
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
// src/components/docs/integrations/IntegrationsMistralPage.tsx
|
|
720
|
-
import Link6 from "@contractspec/lib.ui-link";
|
|
721
|
-
import { ChevronRight as ChevronRight5 } from "lucide-react";
|
|
722
|
-
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
723
|
-
function IntegrationsMistralPage() {
|
|
724
|
-
return /* @__PURE__ */ jsxs7("div", {
|
|
725
|
-
className: "space-y-8",
|
|
726
|
-
children: [
|
|
727
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
728
|
-
className: "space-y-4",
|
|
729
|
-
children: [
|
|
730
|
-
/* @__PURE__ */ jsx7("h1", {
|
|
731
|
-
className: "font-bold text-4xl",
|
|
732
|
-
children: "Mistral"
|
|
733
|
-
}),
|
|
734
|
-
/* @__PURE__ */ jsx7("p", {
|
|
735
|
-
className: "text-muted-foreground",
|
|
736
|
-
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."
|
|
737
|
-
})
|
|
738
|
-
]
|
|
739
|
-
}),
|
|
740
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
741
|
-
className: "space-y-4",
|
|
742
|
-
children: [
|
|
743
|
-
/* @__PURE__ */ jsx7("h2", {
|
|
744
|
-
className: "font-bold text-2xl",
|
|
745
|
-
children: "Setup"
|
|
746
|
-
}),
|
|
747
|
-
/* @__PURE__ */ jsx7("div", {
|
|
748
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
749
|
-
children: /* @__PURE__ */ jsx7("pre", {
|
|
750
|
-
children: `# .env
|
|
751
|
-
MISTRAL_API_KEY=...`
|
|
752
|
-
})
|
|
753
|
-
})
|
|
754
|
-
]
|
|
755
|
-
}),
|
|
756
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
757
|
-
className: "space-y-4",
|
|
758
|
-
children: [
|
|
759
|
-
/* @__PURE__ */ jsx7("h2", {
|
|
760
|
-
className: "font-bold text-2xl",
|
|
761
|
-
children: "Chat and reasoning"
|
|
762
|
-
}),
|
|
763
|
-
/* @__PURE__ */ jsx7("div", {
|
|
764
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
765
|
-
children: /* @__PURE__ */ jsx7("pre", {
|
|
766
|
-
children: `capabilityId: mistral-chat
|
|
119
|
+
}`})})]}),P("div",{className:"space-y-4",children:[p("h2",{className:"font-bold text-2xl",children:"Routing behavior"}),P("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[p("li",{children:"Unsupported strategies are skipped per provider capability matrix."}),p("li",{children:"Missing credentials fail closed and fall through only when a later strategy is valid."}),P("li",{children:["Unofficial routes are disabled unless",p("code",{className:"ml-1 rounded bg-background/50 px-2 py-1",children:"allowUnofficial"}),"is true."]}),P("li",{children:["When",p("code",{className:"ml-1 rounded bg-background/50 px-2 py-1",children:"unofficialAllowList"}),"is set, only listed provider keys can route unofficially."]}),P("li",{children:["OAuth refresh uses",p("code",{className:"ml-1 rounded bg-background/50 px-2 py-1",children:"oauthTokenUrl"}),"with refresh/client credentials when APIs return 401."]})]})]}),P("div",{className:"space-y-4",children:[p("h2",{className:"font-bold text-2xl",children:"Provider guidance"}),P("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[p("li",{children:"Use official APIs when available (Whoop, Oura, Strava, Fitbit)."}),p("li",{children:"Use aggregator routing for providers without stable official APIs (Garmin, MyFitnessPal, Eight Sleep, Peloton)."}),p("li",{children:"Keep unofficial automation opt-in and auditable for production."})]})]}),P("div",{className:"flex items-center gap-4 pt-4",children:[p(Z,{href:"/docs/integrations/whatsapp-twilio",className:"btn-ghost",children:"Previous: WhatsApp Twilio"}),p(Z,{href:"/docs/integrations",className:"btn-primary",children:"Back to Integrations"})]})]})}import J from"@contractspec/lib.ui-link";import{ChevronRight as ve}from"lucide-react";import{jsx as r,jsxs as _}from"react/jsx-runtime";function Ne(){return _("div",{className:"space-y-8",children:[_("div",{className:"space-y-4",children:[r("h1",{className:"font-bold text-4xl",children:"Mistral"}),r("p",{className:"text-muted-foreground",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."})]}),_("div",{className:"space-y-4",children:[r("h2",{className:"font-bold text-2xl",children:"Setup"}),r("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:r("pre",{children:`# .env
|
|
120
|
+
MISTRAL_API_KEY=...`})})]}),_("div",{className:"space-y-4",children:[r("h2",{className:"font-bold text-2xl",children:"Chat and reasoning"}),r("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:r("pre",{children:`capabilityId: mistral-chat
|
|
767
121
|
provider:
|
|
768
122
|
type: mistral
|
|
769
123
|
operation: chatCompletion
|
|
@@ -782,22 +136,7 @@ outputs:
|
|
|
782
136
|
content:
|
|
783
137
|
type: string
|
|
784
138
|
usage:
|
|
785
|
-
type: object`
|
|
786
|
-
})
|
|
787
|
-
})
|
|
788
|
-
]
|
|
789
|
-
}),
|
|
790
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
791
|
-
className: "space-y-4",
|
|
792
|
-
children: [
|
|
793
|
-
/* @__PURE__ */ jsx7("h2", {
|
|
794
|
-
className: "font-bold text-2xl",
|
|
795
|
-
children: "Embeddings"
|
|
796
|
-
}),
|
|
797
|
-
/* @__PURE__ */ jsx7("div", {
|
|
798
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
799
|
-
children: /* @__PURE__ */ jsx7("pre", {
|
|
800
|
-
children: `capabilityId: mistral-embeddings
|
|
139
|
+
type: object`})})]}),_("div",{className:"space-y-4",children:[r("h2",{className:"font-bold text-2xl",children:"Embeddings"}),r("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:r("pre",{children:`capabilityId: mistral-embeddings
|
|
801
140
|
provider:
|
|
802
141
|
type: mistral
|
|
803
142
|
operation: createEmbedding
|
|
@@ -813,22 +152,7 @@ outputs:
|
|
|
813
152
|
embedding:
|
|
814
153
|
type: array
|
|
815
154
|
items:
|
|
816
|
-
type: number`
|
|
817
|
-
})
|
|
818
|
-
})
|
|
819
|
-
]
|
|
820
|
-
}),
|
|
821
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
822
|
-
className: "space-y-4",
|
|
823
|
-
children: [
|
|
824
|
-
/* @__PURE__ */ jsx7("h2", {
|
|
825
|
-
className: "font-bold text-2xl",
|
|
826
|
-
children: "Speech-to-Text (Voxtral)"
|
|
827
|
-
}),
|
|
828
|
-
/* @__PURE__ */ jsx7("div", {
|
|
829
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
830
|
-
children: /* @__PURE__ */ jsx7("pre", {
|
|
831
|
-
children: `capabilityId: mistral-stt
|
|
155
|
+
type: number`})})]}),_("div",{className:"space-y-4",children:[r("h2",{className:"font-bold text-2xl",children:"Speech-to-Text (Voxtral)"}),r("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:r("pre",{children:`capabilityId: mistral-stt
|
|
832
156
|
provider:
|
|
833
157
|
type: mistral
|
|
834
158
|
operation: transcribe
|
|
@@ -848,123 +172,9 @@ outputs:
|
|
|
848
172
|
segments:
|
|
849
173
|
type: array
|
|
850
174
|
language:
|
|
851
|
-
type: string`
|
|
852
|
-
})
|
|
853
|
-
})
|
|
854
|
-
]
|
|
855
|
-
}),
|
|
856
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
857
|
-
className: "space-y-4",
|
|
858
|
-
children: [
|
|
859
|
-
/* @__PURE__ */ jsx7("h2", {
|
|
860
|
-
className: "font-bold text-2xl",
|
|
861
|
-
children: "Conversational voice sessions"
|
|
862
|
-
}),
|
|
863
|
-
/* @__PURE__ */ jsx7("p", {
|
|
864
|
-
className: "text-muted-foreground",
|
|
865
|
-
children: "Use the conversational provider for session-based realtime voice flows (turn handling, events, and interruption-safe streaming)."
|
|
866
|
-
})
|
|
867
|
-
]
|
|
868
|
-
}),
|
|
869
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
870
|
-
className: "space-y-4",
|
|
871
|
-
children: [
|
|
872
|
-
/* @__PURE__ */ jsx7("h2", {
|
|
873
|
-
className: "font-bold text-2xl",
|
|
874
|
-
children: "Best practices"
|
|
875
|
-
}),
|
|
876
|
-
/* @__PURE__ */ jsxs7("ul", {
|
|
877
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
878
|
-
children: [
|
|
879
|
-
/* @__PURE__ */ jsx7("li", {
|
|
880
|
-
children: "Choose model families by workload: coding, reasoning, or speech"
|
|
881
|
-
}),
|
|
882
|
-
/* @__PURE__ */ jsx7("li", {
|
|
883
|
-
children: "Persist session IDs for conversational continuity across turns"
|
|
884
|
-
}),
|
|
885
|
-
/* @__PURE__ */ jsx7("li", {
|
|
886
|
-
children: "Capture token and latency telemetry for provider-level tuning"
|
|
887
|
-
}),
|
|
888
|
-
/* @__PURE__ */ jsx7("li", {
|
|
889
|
-
children: "Set explicit fallbacks for network and rate-limit failures"
|
|
890
|
-
})
|
|
891
|
-
]
|
|
892
|
-
})
|
|
893
|
-
]
|
|
894
|
-
}),
|
|
895
|
-
/* @__PURE__ */ jsxs7("div", {
|
|
896
|
-
className: "flex items-center gap-4 pt-4",
|
|
897
|
-
children: [
|
|
898
|
-
/* @__PURE__ */ jsx7(Link6, {
|
|
899
|
-
href: "/docs/integrations/openai",
|
|
900
|
-
className: "btn-ghost",
|
|
901
|
-
children: "Previous: OpenAI"
|
|
902
|
-
}),
|
|
903
|
-
/* @__PURE__ */ jsxs7(Link6, {
|
|
904
|
-
href: "/docs/integrations/elevenlabs",
|
|
905
|
-
className: "btn-primary",
|
|
906
|
-
children: [
|
|
907
|
-
"Next: ElevenLabs ",
|
|
908
|
-
/* @__PURE__ */ jsx7(ChevronRight5, {
|
|
909
|
-
size: 16
|
|
910
|
-
})
|
|
911
|
-
]
|
|
912
|
-
})
|
|
913
|
-
]
|
|
914
|
-
})
|
|
915
|
-
]
|
|
916
|
-
});
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
// src/components/docs/integrations/IntegrationsOpenAIPage.tsx
|
|
920
|
-
import Link7 from "@contractspec/lib.ui-link";
|
|
921
|
-
import { ChevronRight as ChevronRight6 } from "lucide-react";
|
|
922
|
-
import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
923
|
-
function IntegrationsOpenAIPage() {
|
|
924
|
-
return /* @__PURE__ */ jsxs8("div", {
|
|
925
|
-
className: "space-y-8",
|
|
926
|
-
children: [
|
|
927
|
-
/* @__PURE__ */ jsxs8("div", {
|
|
928
|
-
className: "space-y-4",
|
|
929
|
-
children: [
|
|
930
|
-
/* @__PURE__ */ jsx8("h1", {
|
|
931
|
-
className: "font-bold text-4xl",
|
|
932
|
-
children: "OpenAI"
|
|
933
|
-
}),
|
|
934
|
-
/* @__PURE__ */ jsx8("p", {
|
|
935
|
-
className: "text-muted-foreground",
|
|
936
|
-
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."
|
|
937
|
-
})
|
|
938
|
-
]
|
|
939
|
-
}),
|
|
940
|
-
/* @__PURE__ */ jsxs8("div", {
|
|
941
|
-
className: "space-y-4",
|
|
942
|
-
children: [
|
|
943
|
-
/* @__PURE__ */ jsx8("h2", {
|
|
944
|
-
className: "font-bold text-2xl",
|
|
945
|
-
children: "Setup"
|
|
946
|
-
}),
|
|
947
|
-
/* @__PURE__ */ jsx8("div", {
|
|
948
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
949
|
-
children: /* @__PURE__ */ jsx8("pre", {
|
|
950
|
-
children: `# .env
|
|
175
|
+
type: string`})})]}),_("div",{className:"space-y-4",children:[r("h2",{className:"font-bold text-2xl",children:"Conversational voice sessions"}),r("p",{className:"text-muted-foreground",children:"Use the conversational provider for session-based realtime voice flows (turn handling, events, and interruption-safe streaming)."})]}),_("div",{className:"space-y-4",children:[r("h2",{className:"font-bold text-2xl",children:"Best practices"}),_("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[r("li",{children:"Choose model families by workload: coding, reasoning, or speech"}),r("li",{children:"Persist session IDs for conversational continuity across turns"}),r("li",{children:"Capture token and latency telemetry for provider-level tuning"}),r("li",{children:"Set explicit fallbacks for network and rate-limit failures"})]})]}),_("div",{className:"flex items-center gap-4 pt-4",children:[r(J,{href:"/docs/integrations/openai",className:"btn-ghost",children:"Previous: OpenAI"}),_(J,{href:"/docs/integrations/elevenlabs",className:"btn-primary",children:["Next: ElevenLabs ",r(ve,{size:16})]})]})]})}import Q from"@contractspec/lib.ui-link";import{ChevronRight as ye}from"lucide-react";import{jsx as d,jsxs as H}from"react/jsx-runtime";function ke(){return H("div",{className:"space-y-8",children:[H("div",{className:"space-y-4",children:[d("h1",{className:"font-bold text-4xl",children:"OpenAI"}),d("p",{className:"text-muted-foreground",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."})]}),H("div",{className:"space-y-4",children:[d("h2",{className:"font-bold text-2xl",children:"Setup"}),d("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:d("pre",{children:`# .env
|
|
951
176
|
OPENAI_API_KEY=sk-...
|
|
952
|
-
OPENAI_ORGANIZATION=org-...`
|
|
953
|
-
})
|
|
954
|
-
})
|
|
955
|
-
]
|
|
956
|
-
}),
|
|
957
|
-
/* @__PURE__ */ jsxs8("div", {
|
|
958
|
-
className: "space-y-4",
|
|
959
|
-
children: [
|
|
960
|
-
/* @__PURE__ */ jsx8("h2", {
|
|
961
|
-
className: "font-bold text-2xl",
|
|
962
|
-
children: "Chat completions"
|
|
963
|
-
}),
|
|
964
|
-
/* @__PURE__ */ jsx8("div", {
|
|
965
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
966
|
-
children: /* @__PURE__ */ jsx8("pre", {
|
|
967
|
-
children: `capabilityId: openai-chat
|
|
177
|
+
OPENAI_ORGANIZATION=org-...`})})]}),H("div",{className:"space-y-4",children:[d("h2",{className:"font-bold text-2xl",children:"Chat completions"}),d("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:d("pre",{children:`capabilityId: openai-chat
|
|
968
178
|
provider:
|
|
969
179
|
type: openai
|
|
970
180
|
operation: chatCompletion
|
|
@@ -989,22 +199,7 @@ outputs:
|
|
|
989
199
|
content:
|
|
990
200
|
type: string
|
|
991
201
|
usage:
|
|
992
|
-
type: object`
|
|
993
|
-
})
|
|
994
|
-
})
|
|
995
|
-
]
|
|
996
|
-
}),
|
|
997
|
-
/* @__PURE__ */ jsxs8("div", {
|
|
998
|
-
className: "space-y-4",
|
|
999
|
-
children: [
|
|
1000
|
-
/* @__PURE__ */ jsx8("h2", {
|
|
1001
|
-
className: "font-bold text-2xl",
|
|
1002
|
-
children: "Embeddings"
|
|
1003
|
-
}),
|
|
1004
|
-
/* @__PURE__ */ jsx8("div", {
|
|
1005
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1006
|
-
children: /* @__PURE__ */ jsx8("pre", {
|
|
1007
|
-
children: `capabilityId: openai-embeddings
|
|
202
|
+
type: object`})})]}),H("div",{className:"space-y-4",children:[d("h2",{className:"font-bold text-2xl",children:"Embeddings"}),d("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:d("pre",{children:`capabilityId: openai-embeddings
|
|
1008
203
|
provider:
|
|
1009
204
|
type: openai
|
|
1010
205
|
operation: createEmbedding
|
|
@@ -1020,22 +215,7 @@ outputs:
|
|
|
1020
215
|
embedding:
|
|
1021
216
|
type: array
|
|
1022
217
|
items:
|
|
1023
|
-
type: number`
|
|
1024
|
-
})
|
|
1025
|
-
})
|
|
1026
|
-
]
|
|
1027
|
-
}),
|
|
1028
|
-
/* @__PURE__ */ jsxs8("div", {
|
|
1029
|
-
className: "space-y-4",
|
|
1030
|
-
children: [
|
|
1031
|
-
/* @__PURE__ */ jsx8("h2", {
|
|
1032
|
-
className: "font-bold text-2xl",
|
|
1033
|
-
children: "Whisper (Speech-to-Text)"
|
|
1034
|
-
}),
|
|
1035
|
-
/* @__PURE__ */ jsx8("div", {
|
|
1036
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1037
|
-
children: /* @__PURE__ */ jsx8("pre", {
|
|
1038
|
-
children: `capabilityId: openai-transcribe
|
|
218
|
+
type: number`})})]}),H("div",{className:"space-y-4",children:[d("h2",{className:"font-bold text-2xl",children:"Whisper (Speech-to-Text)"}),d("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:d("pre",{children:`capabilityId: openai-transcribe
|
|
1039
219
|
provider:
|
|
1040
220
|
type: openai
|
|
1041
221
|
operation: transcribe
|
|
@@ -1051,291 +231,10 @@ outputs:
|
|
|
1051
231
|
text:
|
|
1052
232
|
type: string
|
|
1053
233
|
language:
|
|
1054
|
-
type: string`
|
|
1055
|
-
})
|
|
1056
|
-
})
|
|
1057
|
-
]
|
|
1058
|
-
}),
|
|
1059
|
-
/* @__PURE__ */ jsxs8("div", {
|
|
1060
|
-
className: "space-y-4",
|
|
1061
|
-
children: [
|
|
1062
|
-
/* @__PURE__ */ jsx8("h2", {
|
|
1063
|
-
className: "font-bold text-2xl",
|
|
1064
|
-
children: "Best practices"
|
|
1065
|
-
}),
|
|
1066
|
-
/* @__PURE__ */ jsxs8("ul", {
|
|
1067
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
1068
|
-
children: [
|
|
1069
|
-
/* @__PURE__ */ jsx8("li", {
|
|
1070
|
-
children: "Use streaming for real-time chat responses"
|
|
1071
|
-
}),
|
|
1072
|
-
/* @__PURE__ */ jsx8("li", {
|
|
1073
|
-
children: "Cache embeddings to reduce API costs"
|
|
1074
|
-
}),
|
|
1075
|
-
/* @__PURE__ */ jsx8("li", {
|
|
1076
|
-
children: "Implement rate limiting to avoid quota issues"
|
|
1077
|
-
}),
|
|
1078
|
-
/* @__PURE__ */ jsx8("li", {
|
|
1079
|
-
children: "Store conversation history for context"
|
|
1080
|
-
}),
|
|
1081
|
-
/* @__PURE__ */ jsx8("li", {
|
|
1082
|
-
children: "Monitor token usage and costs"
|
|
1083
|
-
})
|
|
1084
|
-
]
|
|
1085
|
-
})
|
|
1086
|
-
]
|
|
1087
|
-
}),
|
|
1088
|
-
/* @__PURE__ */ jsxs8("div", {
|
|
1089
|
-
className: "flex items-center gap-4 pt-4",
|
|
1090
|
-
children: [
|
|
1091
|
-
/* @__PURE__ */ jsx8(Link7, {
|
|
1092
|
-
href: "/docs/integrations/google-calendar",
|
|
1093
|
-
className: "btn-ghost",
|
|
1094
|
-
children: "Previous: Google Calendar"
|
|
1095
|
-
}),
|
|
1096
|
-
/* @__PURE__ */ jsxs8(Link7, {
|
|
1097
|
-
href: "/docs/integrations/mistral",
|
|
1098
|
-
className: "btn-primary",
|
|
1099
|
-
children: [
|
|
1100
|
-
"Next: Mistral ",
|
|
1101
|
-
/* @__PURE__ */ jsx8(ChevronRight6, {
|
|
1102
|
-
size: 16
|
|
1103
|
-
})
|
|
1104
|
-
]
|
|
1105
|
-
})
|
|
1106
|
-
]
|
|
1107
|
-
})
|
|
1108
|
-
]
|
|
1109
|
-
});
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
// src/components/docs/integrations/IntegrationsOverviewPage.tsx
|
|
1113
|
-
import Link8 from "@contractspec/lib.ui-link";
|
|
1114
|
-
import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1115
|
-
var groups = [
|
|
1116
|
-
{
|
|
1117
|
-
title: "Models and voice",
|
|
1118
|
-
items: [
|
|
1119
|
-
{ title: "OpenAI", href: "/docs/integrations/openai" },
|
|
1120
|
-
{ title: "Mistral", href: "/docs/integrations/mistral" },
|
|
1121
|
-
{ title: "ElevenLabs", href: "/docs/integrations/elevenlabs" }
|
|
1122
|
-
]
|
|
1123
|
-
},
|
|
1124
|
-
{
|
|
1125
|
-
title: "Messaging and product operations",
|
|
1126
|
-
items: [
|
|
1127
|
-
{ title: "GitHub", href: "/docs/integrations/github" },
|
|
1128
|
-
{ title: "Slack", href: "/docs/integrations/slack" },
|
|
1129
|
-
{ title: "Twilio", href: "/docs/integrations/twilio" },
|
|
1130
|
-
{ title: "Postmark", href: "/docs/integrations/postmark" }
|
|
1131
|
-
]
|
|
1132
|
-
},
|
|
1133
|
-
{
|
|
1134
|
-
title: "Data, storage, and retrieval",
|
|
1135
|
-
items: [
|
|
1136
|
-
{ title: "Qdrant", href: "/docs/integrations/qdrant" },
|
|
1137
|
-
{ title: "S3 storage", href: "/docs/integrations/s3" },
|
|
1138
|
-
{ title: "Gmail", href: "/docs/integrations/gmail" },
|
|
1139
|
-
{ title: "Google Calendar", href: "/docs/integrations/google-calendar" }
|
|
1140
|
-
]
|
|
1141
|
-
},
|
|
1142
|
-
{
|
|
1143
|
-
title: "Payments and external workflows",
|
|
1144
|
-
items: [
|
|
1145
|
-
{ title: "Stripe", href: "/docs/integrations/stripe" },
|
|
1146
|
-
{ title: "Powens", href: "/docs/integrations/powens" },
|
|
1147
|
-
{
|
|
1148
|
-
title: "Circuit breakers",
|
|
1149
|
-
href: "/docs/integrations/circuit-breakers"
|
|
1150
|
-
},
|
|
1151
|
-
{
|
|
1152
|
-
title: "Health routing",
|
|
1153
|
-
href: "/docs/integrations/health-routing"
|
|
1154
|
-
}
|
|
1155
|
-
]
|
|
1156
|
-
}
|
|
1157
|
-
];
|
|
1158
|
-
function IntegrationsOverviewPage() {
|
|
1159
|
-
return /* @__PURE__ */ jsxs9("div", {
|
|
1160
|
-
className: "space-y-10",
|
|
1161
|
-
children: [
|
|
1162
|
-
/* @__PURE__ */ jsxs9("div", {
|
|
1163
|
-
className: "space-y-3",
|
|
1164
|
-
children: [
|
|
1165
|
-
/* @__PURE__ */ jsx9("p", {
|
|
1166
|
-
className: "editorial-kicker",
|
|
1167
|
-
children: "Integrations"
|
|
1168
|
-
}),
|
|
1169
|
-
/* @__PURE__ */ jsx9("h1", {
|
|
1170
|
-
className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
|
|
1171
|
-
children: "Integrations stay explicit: spec what a provider offers, then bind it per tenant and per app."
|
|
1172
|
-
}),
|
|
1173
|
-
/* @__PURE__ */ jsx9("p", {
|
|
1174
|
-
className: "max-w-3xl text-lg text-muted-foreground leading-8",
|
|
1175
|
-
children: "The integration model keeps provider behavior out of ad hoc glue code. Define the capability contract first, configure the provider connection explicitly, then bind the integration into app workflows and runtime surfaces with clear ownership."
|
|
1176
|
-
})
|
|
1177
|
-
]
|
|
1178
|
-
}),
|
|
1179
|
-
/* @__PURE__ */ jsxs9("div", {
|
|
1180
|
-
className: "editorial-proof-strip",
|
|
1181
|
-
children: [
|
|
1182
|
-
/* @__PURE__ */ jsxs9("div", {
|
|
1183
|
-
className: "editorial-stat",
|
|
1184
|
-
children: [
|
|
1185
|
-
/* @__PURE__ */ jsx9("span", {
|
|
1186
|
-
className: "editorial-label",
|
|
1187
|
-
children: "Binding model"
|
|
1188
|
-
}),
|
|
1189
|
-
/* @__PURE__ */ jsx9("span", {
|
|
1190
|
-
className: "editorial-stat-value",
|
|
1191
|
-
children: "Integration spec → tenant connection → app binding"
|
|
1192
|
-
})
|
|
1193
|
-
]
|
|
1194
|
-
}),
|
|
1195
|
-
/* @__PURE__ */ jsx9("p", {
|
|
1196
|
-
className: "max-w-2xl text-muted-foreground text-sm leading-7",
|
|
1197
|
-
children: "That separation is what makes reuse, tenant isolation, and provider swaps practical without rewriting every surface."
|
|
1198
|
-
})
|
|
1199
|
-
]
|
|
1200
|
-
}),
|
|
1201
|
-
/* @__PURE__ */ jsx9("section", {
|
|
1202
|
-
className: "editorial-panel space-y-5",
|
|
1203
|
-
children: /* @__PURE__ */ jsxs9("div", {
|
|
1204
|
-
className: "space-y-2",
|
|
1205
|
-
children: [
|
|
1206
|
-
/* @__PURE__ */ jsx9("h2", {
|
|
1207
|
-
className: "font-serif text-3xl tracking-[-0.03em]",
|
|
1208
|
-
children: "Start with the model, then pick a provider"
|
|
1209
|
-
}),
|
|
1210
|
-
/* @__PURE__ */ jsxs9("div", {
|
|
1211
|
-
className: "grid gap-4 md:grid-cols-2",
|
|
1212
|
-
children: [
|
|
1213
|
-
/* @__PURE__ */ jsxs9(Link8, {
|
|
1214
|
-
href: "/docs/integrations/spec-model",
|
|
1215
|
-
className: "docs-footer-link",
|
|
1216
|
-
children: [
|
|
1217
|
-
/* @__PURE__ */ jsx9("h3", {
|
|
1218
|
-
className: "font-semibold text-lg",
|
|
1219
|
-
children: "Integration spec model"
|
|
1220
|
-
}),
|
|
1221
|
-
/* @__PURE__ */ jsx9("p", {
|
|
1222
|
-
className: "text-muted-foreground text-sm leading-7",
|
|
1223
|
-
children: "Define what the provider offers, what configuration it needs, and how the runtime should treat it."
|
|
1224
|
-
})
|
|
1225
|
-
]
|
|
1226
|
-
}),
|
|
1227
|
-
/* @__PURE__ */ jsxs9(Link8, {
|
|
1228
|
-
href: "/docs/architecture/integration-binding",
|
|
1229
|
-
className: "docs-footer-link",
|
|
1230
|
-
children: [
|
|
1231
|
-
/* @__PURE__ */ jsx9("h3", {
|
|
1232
|
-
className: "font-semibold text-lg",
|
|
1233
|
-
children: "Integration binding"
|
|
1234
|
-
}),
|
|
1235
|
-
/* @__PURE__ */ jsx9("p", {
|
|
1236
|
-
className: "text-muted-foreground text-sm leading-7",
|
|
1237
|
-
children: "Understand how tenant connections get mapped into concrete app surfaces and workflows."
|
|
1238
|
-
})
|
|
1239
|
-
]
|
|
1240
|
-
})
|
|
1241
|
-
]
|
|
1242
|
-
})
|
|
1243
|
-
]
|
|
1244
|
-
})
|
|
1245
|
-
}),
|
|
1246
|
-
/* @__PURE__ */ jsx9("div", {
|
|
1247
|
-
className: "grid gap-5 md:grid-cols-2",
|
|
1248
|
-
children: groups.map((group) => /* @__PURE__ */ jsxs9("section", {
|
|
1249
|
-
className: "editorial-panel space-y-4",
|
|
1250
|
-
children: [
|
|
1251
|
-
/* @__PURE__ */ jsx9("h2", {
|
|
1252
|
-
className: "font-serif text-2xl tracking-[-0.03em]",
|
|
1253
|
-
children: group.title
|
|
1254
|
-
}),
|
|
1255
|
-
/* @__PURE__ */ jsx9("div", {
|
|
1256
|
-
className: "space-y-3",
|
|
1257
|
-
children: group.items.map((item) => /* @__PURE__ */ jsx9(Link8, {
|
|
1258
|
-
href: item.href,
|
|
1259
|
-
className: "docs-chip-link",
|
|
1260
|
-
children: item.title
|
|
1261
|
-
}, item.href))
|
|
1262
|
-
})
|
|
1263
|
-
]
|
|
1264
|
-
}, group.title))
|
|
1265
|
-
})
|
|
1266
|
-
]
|
|
1267
|
-
});
|
|
1268
|
-
}
|
|
1269
|
-
|
|
1270
|
-
// src/components/docs/integrations/IntegrationsPostmarkPage.tsx
|
|
1271
|
-
import Link9 from "@contractspec/lib.ui-link";
|
|
1272
|
-
import { ChevronRight as ChevronRight7 } from "lucide-react";
|
|
1273
|
-
import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1274
|
-
function IntegrationsPostmarkPage() {
|
|
1275
|
-
return /* @__PURE__ */ jsxs10("div", {
|
|
1276
|
-
className: "space-y-8",
|
|
1277
|
-
children: [
|
|
1278
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
1279
|
-
className: "space-y-4",
|
|
1280
|
-
children: [
|
|
1281
|
-
/* @__PURE__ */ jsx10("h1", {
|
|
1282
|
-
className: "font-bold text-4xl",
|
|
1283
|
-
children: "Postmark"
|
|
1284
|
-
}),
|
|
1285
|
-
/* @__PURE__ */ jsx10("p", {
|
|
1286
|
-
className: "text-muted-foreground",
|
|
1287
|
-
children: "Postmark is a transactional email service with industry-leading deliverability. Use it to send order confirmations, password resets, notifications, and other critical emails."
|
|
1288
|
-
})
|
|
1289
|
-
]
|
|
1290
|
-
}),
|
|
1291
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
1292
|
-
className: "space-y-4",
|
|
1293
|
-
children: [
|
|
1294
|
-
/* @__PURE__ */ jsx10("h2", {
|
|
1295
|
-
className: "font-bold text-2xl",
|
|
1296
|
-
children: "Setup"
|
|
1297
|
-
}),
|
|
1298
|
-
/* @__PURE__ */ jsx10("p", {
|
|
1299
|
-
className: "text-muted-foreground",
|
|
1300
|
-
children: "Add your Postmark credentials to your environment variables:"
|
|
1301
|
-
}),
|
|
1302
|
-
/* @__PURE__ */ jsx10("div", {
|
|
1303
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1304
|
-
children: /* @__PURE__ */ jsx10("pre", {
|
|
1305
|
-
children: `# .env
|
|
234
|
+
type: string`})})]}),H("div",{className:"space-y-4",children:[d("h2",{className:"font-bold text-2xl",children:"Best practices"}),H("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[d("li",{children:"Use streaming for real-time chat responses"}),d("li",{children:"Cache embeddings to reduce API costs"}),d("li",{children:"Implement rate limiting to avoid quota issues"}),d("li",{children:"Store conversation history for context"}),d("li",{children:"Monitor token usage and costs"})]})]}),H("div",{className:"flex items-center gap-4 pt-4",children:[d(Q,{href:"/docs/integrations/google-calendar",className:"btn-ghost",children:"Previous: Google Calendar"}),H(Q,{href:"/docs/integrations/mistral",className:"btn-primary",children:["Next: Mistral ",d(ye,{size:16})]})]})]})}import z from"@contractspec/lib.ui-link";import{jsx as N,jsxs as E}from"react/jsx-runtime";var we=[{title:"Models and voice",items:[{title:"OpenAI",href:"/docs/integrations/openai"},{title:"Mistral",href:"/docs/integrations/mistral"},{title:"ElevenLabs",href:"/docs/integrations/elevenlabs"}]},{title:"Messaging and product operations",items:[{title:"GitHub",href:"/docs/integrations/github"},{title:"Slack",href:"/docs/integrations/slack"},{title:"Twilio",href:"/docs/integrations/twilio"},{title:"Postmark",href:"/docs/integrations/postmark"}]},{title:"Data, storage, and retrieval",items:[{title:"Qdrant",href:"/docs/integrations/qdrant"},{title:"S3 storage",href:"/docs/integrations/s3"},{title:"Gmail",href:"/docs/integrations/gmail"},{title:"Google Calendar",href:"/docs/integrations/google-calendar"}]},{title:"Payments and external workflows",items:[{title:"Stripe",href:"/docs/integrations/stripe"},{title:"Powens",href:"/docs/integrations/powens"},{title:"Circuit breakers",href:"/docs/integrations/circuit-breakers"},{title:"Health routing",href:"/docs/integrations/health-routing"}]}];function Ae(){return E("div",{className:"space-y-10",children:[E("div",{className:"space-y-3",children:[N("p",{className:"editorial-kicker",children:"Integrations"}),N("h1",{className:"font-serif text-4xl tracking-[-0.04em] md:text-5xl",children:"Integrations stay explicit: spec what a provider offers, then bind it per tenant and per app."}),N("p",{className:"max-w-3xl text-lg text-muted-foreground leading-8",children:"The integration model keeps provider behavior out of ad hoc glue code. Define the capability contract first, configure the provider connection explicitly, then bind the integration into app workflows and runtime surfaces with clear ownership."})]}),E("div",{className:"editorial-proof-strip",children:[E("div",{className:"editorial-stat",children:[N("span",{className:"editorial-label",children:"Binding model"}),N("span",{className:"editorial-stat-value",children:"Integration spec → tenant connection → app binding"})]}),N("p",{className:"max-w-2xl text-muted-foreground text-sm leading-7",children:"That separation is what makes reuse, tenant isolation, and provider swaps practical without rewriting every surface."})]}),N("section",{className:"editorial-panel space-y-5",children:E("div",{className:"space-y-2",children:[N("h2",{className:"font-serif text-3xl tracking-[-0.03em]",children:"Start with the model, then pick a provider"}),E("div",{className:"grid gap-4 md:grid-cols-2",children:[E(z,{href:"/docs/integrations/spec-model",className:"docs-footer-link",children:[N("h3",{className:"font-semibold text-lg",children:"Integration spec model"}),N("p",{className:"text-muted-foreground text-sm leading-7",children:"Define what the provider offers, what configuration it needs, and how the runtime should treat it."})]}),E(z,{href:"/docs/architecture/integration-binding",className:"docs-footer-link",children:[N("h3",{className:"font-semibold text-lg",children:"Integration binding"}),N("p",{className:"text-muted-foreground text-sm leading-7",children:"Understand how tenant connections get mapped into concrete app surfaces and workflows."})]})]})]})}),N("div",{className:"grid gap-5 md:grid-cols-2",children:we.map((D)=>E("section",{className:"editorial-panel space-y-4",children:[N("h2",{className:"font-serif text-2xl tracking-[-0.03em]",children:D.title}),N("div",{className:"space-y-3",children:D.items.map((s)=>N(z,{href:s.href,className:"docs-chip-link",children:s.title},s.href))})]},D.title))})]})}import X from"@contractspec/lib.ui-link";import{ChevronRight as Te}from"lucide-react";import{jsx as o,jsxs as b}from"react/jsx-runtime";function Ie(){return b("div",{className:"space-y-8",children:[b("div",{className:"space-y-4",children:[o("h1",{className:"font-bold text-4xl",children:"Postmark"}),o("p",{className:"text-muted-foreground",children:"Postmark is a transactional email service with industry-leading deliverability. Use it to send order confirmations, password resets, notifications, and other critical emails."})]}),b("div",{className:"space-y-4",children:[o("h2",{className:"font-bold text-2xl",children:"Setup"}),o("p",{className:"text-muted-foreground",children:"Add your Postmark credentials to your environment variables:"}),o("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:o("pre",{children:`# .env
|
|
1306
235
|
POSTMARK_API_TOKEN=...
|
|
1307
236
|
POSTMARK_FROM_EMAIL=noreply@example.com
|
|
1308
|
-
POSTMARK_FROM_NAME="Your App Name"`
|
|
1309
|
-
})
|
|
1310
|
-
}),
|
|
1311
|
-
/* @__PURE__ */ jsxs10("p", {
|
|
1312
|
-
className: "text-muted-foreground text-sm",
|
|
1313
|
-
children: [
|
|
1314
|
-
"Get your API token from the",
|
|
1315
|
-
" ",
|
|
1316
|
-
/* @__PURE__ */ jsx10("a", {
|
|
1317
|
-
href: "https://account.postmarkapp.com/servers",
|
|
1318
|
-
target: "_blank",
|
|
1319
|
-
rel: "noopener noreferrer",
|
|
1320
|
-
className: "text-violet-400 hover:text-violet-300",
|
|
1321
|
-
children: "Postmark Dashboard"
|
|
1322
|
-
}),
|
|
1323
|
-
"."
|
|
1324
|
-
]
|
|
1325
|
-
})
|
|
1326
|
-
]
|
|
1327
|
-
}),
|
|
1328
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
1329
|
-
className: "space-y-4",
|
|
1330
|
-
children: [
|
|
1331
|
-
/* @__PURE__ */ jsx10("h2", {
|
|
1332
|
-
className: "font-bold text-2xl",
|
|
1333
|
-
children: "Sending emails"
|
|
1334
|
-
}),
|
|
1335
|
-
/* @__PURE__ */ jsx10("div", {
|
|
1336
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1337
|
-
children: /* @__PURE__ */ jsx10("pre", {
|
|
1338
|
-
children: `capabilityId: send-email
|
|
237
|
+
POSTMARK_FROM_NAME="Your App Name"`})}),b("p",{className:"text-muted-foreground text-sm",children:["Get your API token from the"," ",o("a",{href:"https://account.postmarkapp.com/servers",target:"_blank",rel:"noopener noreferrer",className:"text-violet-400 hover:text-violet-300",children:"Postmark Dashboard"}),"."]})]}),b("div",{className:"space-y-4",children:[o("h2",{className:"font-bold text-2xl",children:"Sending emails"}),o("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:o("pre",{children:`capabilityId: send-email
|
|
1339
238
|
provider:
|
|
1340
239
|
type: postmark
|
|
1341
240
|
operation: sendEmail
|
|
@@ -1363,26 +262,7 @@ outputs:
|
|
|
1363
262
|
messageId:
|
|
1364
263
|
type: string
|
|
1365
264
|
submittedAt:
|
|
1366
|
-
type: timestamp`
|
|
1367
|
-
})
|
|
1368
|
-
})
|
|
1369
|
-
]
|
|
1370
|
-
}),
|
|
1371
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
1372
|
-
className: "space-y-4",
|
|
1373
|
-
children: [
|
|
1374
|
-
/* @__PURE__ */ jsx10("h2", {
|
|
1375
|
-
className: "font-bold text-2xl",
|
|
1376
|
-
children: "Using templates"
|
|
1377
|
-
}),
|
|
1378
|
-
/* @__PURE__ */ jsx10("p", {
|
|
1379
|
-
className: "text-muted-foreground",
|
|
1380
|
-
children: "Postmark templates allow you to design emails in their dashboard and populate them with data:"
|
|
1381
|
-
}),
|
|
1382
|
-
/* @__PURE__ */ jsx10("div", {
|
|
1383
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1384
|
-
children: /* @__PURE__ */ jsx10("pre", {
|
|
1385
|
-
children: `capabilityId: send-welcome-email
|
|
265
|
+
type: timestamp`})})]}),b("div",{className:"space-y-4",children:[o("h2",{className:"font-bold text-2xl",children:"Using templates"}),o("p",{className:"text-muted-foreground",children:"Postmark templates allow you to design emails in their dashboard and populate them with data:"}),o("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:o("pre",{children:`capabilityId: send-welcome-email
|
|
1386
266
|
provider:
|
|
1387
267
|
type: postmark
|
|
1388
268
|
operation: sendEmail
|
|
@@ -1397,220 +277,15 @@ config:
|
|
|
1397
277
|
templateId: "welcome-email"
|
|
1398
278
|
templateData:
|
|
1399
279
|
user_name: \${input.userName}
|
|
1400
|
-
login_url: "https://app.example.com/login"`
|
|
1401
|
-
})
|
|
1402
|
-
})
|
|
1403
|
-
]
|
|
1404
|
-
}),
|
|
1405
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
1406
|
-
className: "space-y-4",
|
|
1407
|
-
children: [
|
|
1408
|
-
/* @__PURE__ */ jsx10("h2", {
|
|
1409
|
-
className: "font-bold text-2xl",
|
|
1410
|
-
children: "Webhooks"
|
|
1411
|
-
}),
|
|
1412
|
-
/* @__PURE__ */ jsx10("p", {
|
|
1413
|
-
className: "text-muted-foreground",
|
|
1414
|
-
children: "Postmark can notify your app about delivery, bounces, and opens:"
|
|
1415
|
-
}),
|
|
1416
|
-
/* @__PURE__ */ jsx10("div", {
|
|
1417
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1418
|
-
children: /* @__PURE__ */ jsx10("pre", {
|
|
1419
|
-
children: `https://your-app.com/api/webhooks/postmark`
|
|
1420
|
-
})
|
|
1421
|
-
}),
|
|
1422
|
-
/* @__PURE__ */ jsx10("p", {
|
|
1423
|
-
className: "text-muted-foreground",
|
|
1424
|
-
children: "ContractSpec automatically processes these webhook events:"
|
|
1425
|
-
}),
|
|
1426
|
-
/* @__PURE__ */ jsxs10("ul", {
|
|
1427
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
1428
|
-
children: [
|
|
1429
|
-
/* @__PURE__ */ jsxs10("li", {
|
|
1430
|
-
children: [
|
|
1431
|
-
/* @__PURE__ */ jsx10("strong", {
|
|
1432
|
-
children: "Delivery"
|
|
1433
|
-
}),
|
|
1434
|
-
" – Email was successfully delivered"
|
|
1435
|
-
]
|
|
1436
|
-
}),
|
|
1437
|
-
/* @__PURE__ */ jsxs10("li", {
|
|
1438
|
-
children: [
|
|
1439
|
-
/* @__PURE__ */ jsx10("strong", {
|
|
1440
|
-
children: "Bounce"
|
|
1441
|
-
}),
|
|
1442
|
-
" – Email bounced (hard or soft)"
|
|
1443
|
-
]
|
|
1444
|
-
}),
|
|
1445
|
-
/* @__PURE__ */ jsxs10("li", {
|
|
1446
|
-
children: [
|
|
1447
|
-
/* @__PURE__ */ jsx10("strong", {
|
|
1448
|
-
children: "SpamComplaint"
|
|
1449
|
-
}),
|
|
1450
|
-
" – Recipient marked email as spam"
|
|
1451
|
-
]
|
|
1452
|
-
}),
|
|
1453
|
-
/* @__PURE__ */ jsxs10("li", {
|
|
1454
|
-
children: [
|
|
1455
|
-
/* @__PURE__ */ jsx10("strong", {
|
|
1456
|
-
children: "Open"
|
|
1457
|
-
}),
|
|
1458
|
-
" – Recipient opened the email"
|
|
1459
|
-
]
|
|
1460
|
-
}),
|
|
1461
|
-
/* @__PURE__ */ jsxs10("li", {
|
|
1462
|
-
children: [
|
|
1463
|
-
/* @__PURE__ */ jsx10("strong", {
|
|
1464
|
-
children: "Click"
|
|
1465
|
-
}),
|
|
1466
|
-
" – Recipient clicked a link"
|
|
1467
|
-
]
|
|
1468
|
-
})
|
|
1469
|
-
]
|
|
1470
|
-
})
|
|
1471
|
-
]
|
|
1472
|
-
}),
|
|
1473
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
1474
|
-
className: "space-y-4",
|
|
1475
|
-
children: [
|
|
1476
|
-
/* @__PURE__ */ jsx10("h2", {
|
|
1477
|
-
className: "font-bold text-2xl",
|
|
1478
|
-
children: "Best practices"
|
|
1479
|
-
}),
|
|
1480
|
-
/* @__PURE__ */ jsxs10("ul", {
|
|
1481
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
1482
|
-
children: [
|
|
1483
|
-
/* @__PURE__ */ jsx10("li", {
|
|
1484
|
-
children: "Use templates for consistent branding"
|
|
1485
|
-
}),
|
|
1486
|
-
/* @__PURE__ */ jsx10("li", {
|
|
1487
|
-
children: "Always provide both HTML and plain text versions"
|
|
1488
|
-
}),
|
|
1489
|
-
/* @__PURE__ */ jsx10("li", {
|
|
1490
|
-
children: "Monitor bounce rates and remove invalid addresses"
|
|
1491
|
-
}),
|
|
1492
|
-
/* @__PURE__ */ jsx10("li", {
|
|
1493
|
-
children: "Use message streams to separate different email types"
|
|
1494
|
-
}),
|
|
1495
|
-
/* @__PURE__ */ jsx10("li", {
|
|
1496
|
-
children: "Test emails in the Postmark sandbox before going live"
|
|
1497
|
-
}),
|
|
1498
|
-
/* @__PURE__ */ jsx10("li", {
|
|
1499
|
-
children: "Set up DKIM and SPF records for your domain"
|
|
1500
|
-
})
|
|
1501
|
-
]
|
|
1502
|
-
})
|
|
1503
|
-
]
|
|
1504
|
-
}),
|
|
1505
|
-
/* @__PURE__ */ jsxs10("div", {
|
|
1506
|
-
className: "flex items-center gap-4 pt-4",
|
|
1507
|
-
children: [
|
|
1508
|
-
/* @__PURE__ */ jsx10(Link9, {
|
|
1509
|
-
href: "/docs/integrations/stripe",
|
|
1510
|
-
className: "btn-ghost",
|
|
1511
|
-
children: "Previous: Stripe"
|
|
1512
|
-
}),
|
|
1513
|
-
/* @__PURE__ */ jsxs10(Link9, {
|
|
1514
|
-
href: "/docs/integrations/resend",
|
|
1515
|
-
className: "btn-primary",
|
|
1516
|
-
children: [
|
|
1517
|
-
"Next: Resend ",
|
|
1518
|
-
/* @__PURE__ */ jsx10(ChevronRight7, {
|
|
1519
|
-
size: 16
|
|
1520
|
-
})
|
|
1521
|
-
]
|
|
1522
|
-
})
|
|
1523
|
-
]
|
|
1524
|
-
})
|
|
1525
|
-
]
|
|
1526
|
-
});
|
|
1527
|
-
}
|
|
1528
|
-
|
|
1529
|
-
// src/components/docs/integrations/IntegrationsPowensPage.tsx
|
|
1530
|
-
import Link10 from "@contractspec/lib.ui-link";
|
|
1531
|
-
import { ChevronRight as ChevronRight8 } from "lucide-react";
|
|
1532
|
-
import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1533
|
-
function IntegrationsPowensPage() {
|
|
1534
|
-
return /* @__PURE__ */ jsxs11("div", {
|
|
1535
|
-
className: "space-y-8",
|
|
1536
|
-
children: [
|
|
1537
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1538
|
-
className: "space-y-4",
|
|
1539
|
-
children: [
|
|
1540
|
-
/* @__PURE__ */ jsx11("h1", {
|
|
1541
|
-
className: "font-bold text-4xl",
|
|
1542
|
-
children: "Powens Open Banking"
|
|
1543
|
-
}),
|
|
1544
|
-
/* @__PURE__ */ jsx11("p", {
|
|
1545
|
-
className: "text-muted-foreground",
|
|
1546
|
-
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."
|
|
1547
|
-
})
|
|
1548
|
-
]
|
|
1549
|
-
}),
|
|
1550
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1551
|
-
className: "space-y-4",
|
|
1552
|
-
children: [
|
|
1553
|
-
/* @__PURE__ */ jsx11("h2", {
|
|
1554
|
-
className: "font-bold text-2xl",
|
|
1555
|
-
children: "Setup"
|
|
1556
|
-
}),
|
|
1557
|
-
/* @__PURE__ */ jsx11("p", {
|
|
1558
|
-
className: "text-muted-foreground",
|
|
1559
|
-
children: "Create a Powens BYOK project, then store the credentials in your secret manager. The ContractSpec integration expects the following fields:"
|
|
1560
|
-
}),
|
|
1561
|
-
/* @__PURE__ */ jsx11("div", {
|
|
1562
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1563
|
-
children: /* @__PURE__ */ jsx11("pre", {
|
|
1564
|
-
children: `{
|
|
280
|
+
login_url: "https://app.example.com/login"`})})]}),b("div",{className:"space-y-4",children:[o("h2",{className:"font-bold text-2xl",children:"Webhooks"}),o("p",{className:"text-muted-foreground",children:"Postmark can notify your app about delivery, bounces, and opens:"}),o("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:o("pre",{children:"https://your-app.com/api/webhooks/postmark"})}),o("p",{className:"text-muted-foreground",children:"ContractSpec automatically processes these webhook events:"}),b("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[b("li",{children:[o("strong",{children:"Delivery"})," – Email was successfully delivered"]}),b("li",{children:[o("strong",{children:"Bounce"})," – Email bounced (hard or soft)"]}),b("li",{children:[o("strong",{children:"SpamComplaint"})," – Recipient marked email as spam"]}),b("li",{children:[o("strong",{children:"Open"})," – Recipient opened the email"]}),b("li",{children:[o("strong",{children:"Click"})," – Recipient clicked a link"]})]})]}),b("div",{className:"space-y-4",children:[o("h2",{className:"font-bold text-2xl",children:"Best practices"}),b("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[o("li",{children:"Use templates for consistent branding"}),o("li",{children:"Always provide both HTML and plain text versions"}),o("li",{children:"Monitor bounce rates and remove invalid addresses"}),o("li",{children:"Use message streams to separate different email types"}),o("li",{children:"Test emails in the Postmark sandbox before going live"}),o("li",{children:"Set up DKIM and SPF records for your domain"})]})]}),b("div",{className:"flex items-center gap-4 pt-4",children:[o(X,{href:"/docs/integrations/stripe",className:"btn-ghost",children:"Previous: Stripe"}),b(X,{href:"/docs/integrations/resend",className:"btn-primary",children:["Next: Resend ",o(Te,{size:16})]})]})]})}import $ from"@contractspec/lib.ui-link";import{ChevronRight as Pe}from"lucide-react";import{jsx as a,jsxs as i}from"react/jsx-runtime";function We(){return i("div",{className:"space-y-8",children:[i("div",{className:"space-y-4",children:[a("h1",{className:"font-bold text-4xl",children:"Powens Open Banking"}),a("p",{className:"text-muted-foreground",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."})]}),i("div",{className:"space-y-4",children:[a("h2",{className:"font-bold text-2xl",children:"Setup"}),a("p",{className:"text-muted-foreground",children:"Create a Powens BYOK project, then store the credentials in your secret manager. The ContractSpec integration expects the following fields:"}),a("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:a("pre",{children:`{
|
|
1565
281
|
"clientId": "powens-client-id",
|
|
1566
282
|
"clientSecret": "powens-client-secret",
|
|
1567
283
|
"apiKey": "optional-api-key",
|
|
1568
284
|
"webhookSecret": "optional-webhook-secret"
|
|
1569
|
-
}`
|
|
1570
|
-
})
|
|
1571
|
-
}),
|
|
1572
|
-
/* @__PURE__ */ jsx11("p", {
|
|
1573
|
-
className: "text-muted-foreground text-sm",
|
|
1574
|
-
children: "Configure non-secret settings on the integration connection:"
|
|
1575
|
-
}),
|
|
1576
|
-
/* @__PURE__ */ jsx11("div", {
|
|
1577
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1578
|
-
children: /* @__PURE__ */ jsx11("pre", {
|
|
1579
|
-
children: `environment: sandbox | production
|
|
285
|
+
}`})}),a("p",{className:"text-muted-foreground text-sm",children:"Configure non-secret settings on the integration connection:"}),a("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:a("pre",{children:`environment: sandbox | production
|
|
1580
286
|
baseUrl?: https://api-sandbox.powens.com/v2
|
|
1581
287
|
region?: eu-west-1
|
|
1582
|
-
pollingIntervalMs?: 300000`
|
|
1583
|
-
})
|
|
1584
|
-
}),
|
|
1585
|
-
/* @__PURE__ */ jsxs11("p", {
|
|
1586
|
-
className: "text-muted-foreground text-sm",
|
|
1587
|
-
children: [
|
|
1588
|
-
"See the",
|
|
1589
|
-
" ",
|
|
1590
|
-
/* @__PURE__ */ jsx11("a", {
|
|
1591
|
-
href: "https://docs.powens.com/documentation/integration-guides/quick-start/api-overview",
|
|
1592
|
-
target: "_blank",
|
|
1593
|
-
rel: "noopener noreferrer",
|
|
1594
|
-
className: "text-violet-400 hover:text-violet-300",
|
|
1595
|
-
children: "Powens API documentation"
|
|
1596
|
-
}),
|
|
1597
|
-
" ",
|
|
1598
|
-
"for information on generating credentials and managing BYOK projects."
|
|
1599
|
-
]
|
|
1600
|
-
})
|
|
1601
|
-
]
|
|
1602
|
-
}),
|
|
1603
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1604
|
-
className: "space-y-4",
|
|
1605
|
-
children: [
|
|
1606
|
-
/* @__PURE__ */ jsx11("h2", {
|
|
1607
|
-
className: "font-bold text-2xl",
|
|
1608
|
-
children: "Capabilities"
|
|
1609
|
-
}),
|
|
1610
|
-
/* @__PURE__ */ jsx11("div", {
|
|
1611
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1612
|
-
children: /* @__PURE__ */ jsx11("pre", {
|
|
1613
|
-
children: `capabilityId: openbanking.accounts.read
|
|
288
|
+
pollingIntervalMs?: 300000`})}),i("p",{className:"text-muted-foreground text-sm",children:["See the"," ",a("a",{href:"https://docs.powens.com/documentation/integration-guides/quick-start/api-overview",target:"_blank",rel:"noopener noreferrer",className:"text-violet-400 hover:text-violet-300",children:"Powens API documentation"})," ","for information on generating credentials and managing BYOK projects."]})]}),i("div",{className:"space-y-4",children:[a("h2",{className:"font-bold text-2xl",children:"Capabilities"}),a("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:a("pre",{children:`capabilityId: openbanking.accounts.read
|
|
1614
289
|
provider:
|
|
1615
290
|
type: openbanking.powens
|
|
1616
291
|
operation: listAccounts
|
|
@@ -1657,275 +332,10 @@ inputs:
|
|
|
1657
332
|
outputs:
|
|
1658
333
|
balances:
|
|
1659
334
|
type: AccountBalanceRecord[]
|
|
1660
|
-
description: "Current/available balances with timestamps"`
|
|
1661
|
-
})
|
|
1662
|
-
})
|
|
1663
|
-
]
|
|
1664
|
-
}),
|
|
1665
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1666
|
-
className: "space-y-4",
|
|
1667
|
-
children: [
|
|
1668
|
-
/* @__PURE__ */ jsx11("h2", {
|
|
1669
|
-
className: "font-bold text-2xl",
|
|
1670
|
-
children: "Primary workflows"
|
|
1671
|
-
}),
|
|
1672
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1673
|
-
className: "space-y-3",
|
|
1674
|
-
children: [
|
|
1675
|
-
/* @__PURE__ */ jsx11("h3", {
|
|
1676
|
-
className: "font-semibold text-lg",
|
|
1677
|
-
children: "Account sync"
|
|
1678
|
-
}),
|
|
1679
|
-
/* @__PURE__ */ jsxs11("p", {
|
|
1680
|
-
className: "text-muted-foreground",
|
|
1681
|
-
children: [
|
|
1682
|
-
"The workflow",
|
|
1683
|
-
" ",
|
|
1684
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1685
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1686
|
-
children: "pfo.workflow.sync-openbanking-accounts"
|
|
1687
|
-
}),
|
|
1688
|
-
" ",
|
|
1689
|
-
"refreshes account metadata, then surfaces canonical records to other automations."
|
|
1690
|
-
]
|
|
1691
|
-
})
|
|
1692
|
-
]
|
|
1693
|
-
}),
|
|
1694
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1695
|
-
className: "space-y-3",
|
|
1696
|
-
children: [
|
|
1697
|
-
/* @__PURE__ */ jsx11("h3", {
|
|
1698
|
-
className: "font-semibold text-lg",
|
|
1699
|
-
children: "Transaction sync"
|
|
1700
|
-
}),
|
|
1701
|
-
/* @__PURE__ */ jsxs11("p", {
|
|
1702
|
-
className: "text-muted-foreground",
|
|
1703
|
-
children: [
|
|
1704
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1705
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1706
|
-
children: "pfo.workflow.sync-openbanking-transactions"
|
|
1707
|
-
}),
|
|
1708
|
-
" ",
|
|
1709
|
-
"ingests incremental transactions for each linked account and stores them in the canonical ledger."
|
|
1710
|
-
]
|
|
1711
|
-
})
|
|
1712
|
-
]
|
|
1713
|
-
}),
|
|
1714
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1715
|
-
className: "space-y-3",
|
|
1716
|
-
children: [
|
|
1717
|
-
/* @__PURE__ */ jsx11("h3", {
|
|
1718
|
-
className: "font-semibold text-lg",
|
|
1719
|
-
children: "Balance refresh"
|
|
1720
|
-
}),
|
|
1721
|
-
/* @__PURE__ */ jsxs11("p", {
|
|
1722
|
-
className: "text-muted-foreground",
|
|
1723
|
-
children: [
|
|
1724
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1725
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1726
|
-
children: "pfo.workflow.refresh-openbanking-balances"
|
|
1727
|
-
}),
|
|
1728
|
-
" ",
|
|
1729
|
-
"retrieves current and available balances to power dashboards and anomaly detection."
|
|
1730
|
-
]
|
|
1731
|
-
})
|
|
1732
|
-
]
|
|
1733
|
-
}),
|
|
1734
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1735
|
-
className: "space-y-3",
|
|
1736
|
-
children: [
|
|
1737
|
-
/* @__PURE__ */ jsx11("h3", {
|
|
1738
|
-
className: "font-semibold text-lg",
|
|
1739
|
-
children: "Derived financial overview"
|
|
1740
|
-
}),
|
|
1741
|
-
/* @__PURE__ */ jsxs11("p", {
|
|
1742
|
-
className: "text-muted-foreground",
|
|
1743
|
-
children: [
|
|
1744
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1745
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1746
|
-
children: "pfo.workflow.generate-openbanking-overview"
|
|
1747
|
-
}),
|
|
1748
|
-
" ",
|
|
1749
|
-
"aggregates balances, category breakdowns, and cashflow trends into the ",
|
|
1750
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1751
|
-
children: "knowledge.financial-overview"
|
|
1752
|
-
}),
|
|
1753
|
-
" space. Only derived summaries are exposed to LLMs."
|
|
1754
|
-
]
|
|
1755
|
-
})
|
|
1756
|
-
]
|
|
1757
|
-
})
|
|
1758
|
-
]
|
|
1759
|
-
}),
|
|
1760
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1761
|
-
className: "space-y-4",
|
|
1762
|
-
children: [
|
|
1763
|
-
/* @__PURE__ */ jsx11("h2", {
|
|
1764
|
-
className: "font-bold text-2xl",
|
|
1765
|
-
children: "Telemetry & guardrails"
|
|
1766
|
-
}),
|
|
1767
|
-
/* @__PURE__ */ jsxs11("ul", {
|
|
1768
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
1769
|
-
children: [
|
|
1770
|
-
/* @__PURE__ */ jsxs11("li", {
|
|
1771
|
-
children: [
|
|
1772
|
-
"Telemetry events such as",
|
|
1773
|
-
" ",
|
|
1774
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1775
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1776
|
-
children: "openbanking.accounts.synced"
|
|
1777
|
-
}),
|
|
1778
|
-
" ",
|
|
1779
|
-
"and",
|
|
1780
|
-
" ",
|
|
1781
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1782
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1783
|
-
children: "openbanking.transactions.synced"
|
|
1784
|
-
}),
|
|
1785
|
-
" ",
|
|
1786
|
-
"are emitted automatically with tenant, slot, and config metadata."
|
|
1787
|
-
]
|
|
1788
|
-
}),
|
|
1789
|
-
/* @__PURE__ */ jsxs11("li", {
|
|
1790
|
-
children: [
|
|
1791
|
-
"Guard helpers ensure the",
|
|
1792
|
-
" ",
|
|
1793
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1794
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1795
|
-
children: "primaryOpenBanking"
|
|
1796
|
-
}),
|
|
1797
|
-
" ",
|
|
1798
|
-
"slot is bound and healthy before workflows execute."
|
|
1799
|
-
]
|
|
1800
|
-
}),
|
|
1801
|
-
/* @__PURE__ */ jsxs11("li", {
|
|
1802
|
-
children: [
|
|
1803
|
-
"PII fields (IBAN, counterparty names, descriptions) are redacted via",
|
|
1804
|
-
" ",
|
|
1805
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1806
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1807
|
-
children: "redactOpenBankingTelemetryPayload"
|
|
1808
|
-
}),
|
|
1809
|
-
" ",
|
|
1810
|
-
"before logging or sending telemetry."
|
|
1811
|
-
]
|
|
1812
|
-
})
|
|
1813
|
-
]
|
|
1814
|
-
})
|
|
1815
|
-
]
|
|
1816
|
-
}),
|
|
1817
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1818
|
-
className: "space-y-4",
|
|
1819
|
-
children: [
|
|
1820
|
-
/* @__PURE__ */ jsx11("h2", {
|
|
1821
|
-
className: "font-bold text-2xl",
|
|
1822
|
-
children: "Best practices"
|
|
1823
|
-
}),
|
|
1824
|
-
/* @__PURE__ */ jsxs11("ul", {
|
|
1825
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
1826
|
-
children: [
|
|
1827
|
-
/* @__PURE__ */ jsx11("li", {
|
|
1828
|
-
children: "Use BYOK credentials per tenant to avoid cross-tenant exposure."
|
|
1829
|
-
}),
|
|
1830
|
-
/* @__PURE__ */ jsx11("li", {
|
|
1831
|
-
children: "Store only canonical entities (BankAccountRecord, BankTransactionRecord). Never persist raw Powens payloads or customer PII in logs."
|
|
1832
|
-
}),
|
|
1833
|
-
/* @__PURE__ */ jsx11("li", {
|
|
1834
|
-
children: "Run the transaction sync on a schedule appropriate for banking SLAs (e.g. every 15 minutes for cashflow dashboards)."
|
|
1835
|
-
}),
|
|
1836
|
-
/* @__PURE__ */ jsx11("li", {
|
|
1837
|
-
children: "Pair ledger updates with derived summaries to feed the knowledge layer instead of exposing raw transactions to agents."
|
|
1838
|
-
}),
|
|
1839
|
-
/* @__PURE__ */ jsxs11("li", {
|
|
1840
|
-
children: [
|
|
1841
|
-
"Monitor telemetry for",
|
|
1842
|
-
" ",
|
|
1843
|
-
/* @__PURE__ */ jsx11("code", {
|
|
1844
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
1845
|
-
children: "openbanking.*.sync_failed"
|
|
1846
|
-
}),
|
|
1847
|
-
" ",
|
|
1848
|
-
"events to detect credential issues early."
|
|
1849
|
-
]
|
|
1850
|
-
})
|
|
1851
|
-
]
|
|
1852
|
-
})
|
|
1853
|
-
]
|
|
1854
|
-
}),
|
|
1855
|
-
/* @__PURE__ */ jsxs11("div", {
|
|
1856
|
-
className: "flex items-center gap-4 pt-4",
|
|
1857
|
-
children: [
|
|
1858
|
-
/* @__PURE__ */ jsx11(Link10, {
|
|
1859
|
-
href: "/docs/integrations",
|
|
1860
|
-
className: "btn-ghost",
|
|
1861
|
-
children: "Back to Integrations"
|
|
1862
|
-
}),
|
|
1863
|
-
/* @__PURE__ */ jsxs11(Link10, {
|
|
1864
|
-
href: "/docs/integrations/stripe",
|
|
1865
|
-
className: "btn-primary",
|
|
1866
|
-
children: [
|
|
1867
|
-
"Next: Stripe ",
|
|
1868
|
-
/* @__PURE__ */ jsx11(ChevronRight8, {
|
|
1869
|
-
size: 16
|
|
1870
|
-
})
|
|
1871
|
-
]
|
|
1872
|
-
})
|
|
1873
|
-
]
|
|
1874
|
-
})
|
|
1875
|
-
]
|
|
1876
|
-
});
|
|
1877
|
-
}
|
|
1878
|
-
|
|
1879
|
-
// src/components/docs/integrations/IntegrationsQdrantPage.tsx
|
|
1880
|
-
import Link11 from "@contractspec/lib.ui-link";
|
|
1881
|
-
import { ChevronRight as ChevronRight9 } from "lucide-react";
|
|
1882
|
-
import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1883
|
-
function IntegrationsQdrantPage() {
|
|
1884
|
-
return /* @__PURE__ */ jsxs12("div", {
|
|
1885
|
-
className: "space-y-8",
|
|
1886
|
-
children: [
|
|
1887
|
-
/* @__PURE__ */ jsxs12("div", {
|
|
1888
|
-
className: "space-y-4",
|
|
1889
|
-
children: [
|
|
1890
|
-
/* @__PURE__ */ jsx12("h1", {
|
|
1891
|
-
className: "font-bold text-4xl",
|
|
1892
|
-
children: "Qdrant"
|
|
1893
|
-
}),
|
|
1894
|
-
/* @__PURE__ */ jsx12("p", {
|
|
1895
|
-
className: "text-muted-foreground",
|
|
1896
|
-
children: "Qdrant is a high-performance vector database for semantic search, recommendations, and RAG (Retrieval-Augmented Generation) applications."
|
|
1897
|
-
})
|
|
1898
|
-
]
|
|
1899
|
-
}),
|
|
1900
|
-
/* @__PURE__ */ jsxs12("div", {
|
|
1901
|
-
className: "space-y-4",
|
|
1902
|
-
children: [
|
|
1903
|
-
/* @__PURE__ */ jsx12("h2", {
|
|
1904
|
-
className: "font-bold text-2xl",
|
|
1905
|
-
children: "Setup"
|
|
1906
|
-
}),
|
|
1907
|
-
/* @__PURE__ */ jsx12("div", {
|
|
1908
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1909
|
-
children: /* @__PURE__ */ jsx12("pre", {
|
|
1910
|
-
children: `# .env
|
|
335
|
+
description: "Current/available balances with timestamps"`})})]}),i("div",{className:"space-y-4",children:[a("h2",{className:"font-bold text-2xl",children:"Primary workflows"}),i("div",{className:"space-y-3",children:[a("h3",{className:"font-semibold text-lg",children:"Account sync"}),i("p",{className:"text-muted-foreground",children:["The workflow"," ",a("code",{className:"rounded bg-background/50 px-2 py-1",children:"pfo.workflow.sync-openbanking-accounts"})," ","refreshes account metadata, then surfaces canonical records to other automations."]})]}),i("div",{className:"space-y-3",children:[a("h3",{className:"font-semibold text-lg",children:"Transaction sync"}),i("p",{className:"text-muted-foreground",children:[a("code",{className:"rounded bg-background/50 px-2 py-1",children:"pfo.workflow.sync-openbanking-transactions"})," ","ingests incremental transactions for each linked account and stores them in the canonical ledger."]})]}),i("div",{className:"space-y-3",children:[a("h3",{className:"font-semibold text-lg",children:"Balance refresh"}),i("p",{className:"text-muted-foreground",children:[a("code",{className:"rounded bg-background/50 px-2 py-1",children:"pfo.workflow.refresh-openbanking-balances"})," ","retrieves current and available balances to power dashboards and anomaly detection."]})]}),i("div",{className:"space-y-3",children:[a("h3",{className:"font-semibold text-lg",children:"Derived financial overview"}),i("p",{className:"text-muted-foreground",children:[a("code",{className:"rounded bg-background/50 px-2 py-1",children:"pfo.workflow.generate-openbanking-overview"})," ","aggregates balances, category breakdowns, and cashflow trends into the ",a("code",{children:"knowledge.financial-overview"})," space. Only derived summaries are exposed to LLMs."]})]})]}),i("div",{className:"space-y-4",children:[a("h2",{className:"font-bold text-2xl",children:"Telemetry & guardrails"}),i("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[i("li",{children:["Telemetry events such as"," ",a("code",{className:"rounded bg-background/50 px-2 py-1",children:"openbanking.accounts.synced"})," ","and"," ",a("code",{className:"rounded bg-background/50 px-2 py-1",children:"openbanking.transactions.synced"})," ","are emitted automatically with tenant, slot, and config metadata."]}),i("li",{children:["Guard helpers ensure the"," ",a("code",{className:"rounded bg-background/50 px-2 py-1",children:"primaryOpenBanking"})," ","slot is bound and healthy before workflows execute."]}),i("li",{children:["PII fields (IBAN, counterparty names, descriptions) are redacted via"," ",a("code",{className:"rounded bg-background/50 px-2 py-1",children:"redactOpenBankingTelemetryPayload"})," ","before logging or sending telemetry."]})]})]}),i("div",{className:"space-y-4",children:[a("h2",{className:"font-bold text-2xl",children:"Best practices"}),i("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[a("li",{children:"Use BYOK credentials per tenant to avoid cross-tenant exposure."}),a("li",{children:"Store only canonical entities (BankAccountRecord, BankTransactionRecord). Never persist raw Powens payloads or customer PII in logs."}),a("li",{children:"Run the transaction sync on a schedule appropriate for banking SLAs (e.g. every 15 minutes for cashflow dashboards)."}),a("li",{children:"Pair ledger updates with derived summaries to feed the knowledge layer instead of exposing raw transactions to agents."}),i("li",{children:["Monitor telemetry for"," ",a("code",{className:"rounded bg-background/50 px-2 py-1",children:"openbanking.*.sync_failed"})," ","events to detect credential issues early."]})]})]}),i("div",{className:"flex items-center gap-4 pt-4",children:[a($,{href:"/docs/integrations",className:"btn-ghost",children:"Back to Integrations"}),i($,{href:"/docs/integrations/stripe",className:"btn-primary",children:["Next: Stripe ",a(Pe,{size:16})]})]})]})}import x from"@contractspec/lib.ui-link";import{ChevronRight as _e}from"lucide-react";import{jsx as y,jsxs as L}from"react/jsx-runtime";function Me(){return L("div",{className:"space-y-8",children:[L("div",{className:"space-y-4",children:[y("h1",{className:"font-bold text-4xl",children:"Qdrant"}),y("p",{className:"text-muted-foreground",children:"Qdrant is a high-performance vector database for semantic search, recommendations, and RAG (Retrieval-Augmented Generation) applications."})]}),L("div",{className:"space-y-4",children:[y("h2",{className:"font-bold text-2xl",children:"Setup"}),y("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:y("pre",{children:`# .env
|
|
1911
336
|
QDRANT_URL=https://...
|
|
1912
337
|
QDRANT_API_KEY=...
|
|
1913
|
-
QDRANT_COLLECTION=documents`
|
|
1914
|
-
})
|
|
1915
|
-
})
|
|
1916
|
-
]
|
|
1917
|
-
}),
|
|
1918
|
-
/* @__PURE__ */ jsxs12("div", {
|
|
1919
|
-
className: "space-y-4",
|
|
1920
|
-
children: [
|
|
1921
|
-
/* @__PURE__ */ jsx12("h2", {
|
|
1922
|
-
className: "font-bold text-2xl",
|
|
1923
|
-
children: "Storing vectors"
|
|
1924
|
-
}),
|
|
1925
|
-
/* @__PURE__ */ jsx12("div", {
|
|
1926
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1927
|
-
children: /* @__PURE__ */ jsx12("pre", {
|
|
1928
|
-
children: `capabilityId: qdrant-upsert
|
|
338
|
+
QDRANT_COLLECTION=documents`})})]}),L("div",{className:"space-y-4",children:[y("h2",{className:"font-bold text-2xl",children:"Storing vectors"}),y("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:y("pre",{children:`capabilityId: qdrant-upsert
|
|
1929
339
|
provider:
|
|
1930
340
|
type: qdrant
|
|
1931
341
|
operation: upsert
|
|
@@ -1944,22 +354,7 @@ inputs:
|
|
|
1944
354
|
|
|
1945
355
|
outputs:
|
|
1946
356
|
status:
|
|
1947
|
-
type: string`
|
|
1948
|
-
})
|
|
1949
|
-
})
|
|
1950
|
-
]
|
|
1951
|
-
}),
|
|
1952
|
-
/* @__PURE__ */ jsxs12("div", {
|
|
1953
|
-
className: "space-y-4",
|
|
1954
|
-
children: [
|
|
1955
|
-
/* @__PURE__ */ jsx12("h2", {
|
|
1956
|
-
className: "font-bold text-2xl",
|
|
1957
|
-
children: "Semantic search"
|
|
1958
|
-
}),
|
|
1959
|
-
/* @__PURE__ */ jsx12("div", {
|
|
1960
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
1961
|
-
children: /* @__PURE__ */ jsx12("pre", {
|
|
1962
|
-
children: `capabilityId: qdrant-search
|
|
357
|
+
type: string`})})]}),L("div",{className:"space-y-4",children:[y("h2",{className:"font-bold text-2xl",children:"Semantic search"}),y("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:y("pre",{children:`capabilityId: qdrant-search
|
|
1963
358
|
provider:
|
|
1964
359
|
type: qdrant
|
|
1965
360
|
operation: search
|
|
@@ -1983,22 +378,7 @@ outputs:
|
|
|
1983
378
|
properties:
|
|
1984
379
|
id: string
|
|
1985
380
|
score: number
|
|
1986
|
-
payload: object`
|
|
1987
|
-
})
|
|
1988
|
-
})
|
|
1989
|
-
]
|
|
1990
|
-
}),
|
|
1991
|
-
/* @__PURE__ */ jsxs12("div", {
|
|
1992
|
-
className: "space-y-4",
|
|
1993
|
-
children: [
|
|
1994
|
-
/* @__PURE__ */ jsx12("h2", {
|
|
1995
|
-
className: "font-bold text-2xl",
|
|
1996
|
-
children: "RAG workflow example"
|
|
1997
|
-
}),
|
|
1998
|
-
/* @__PURE__ */ jsx12("div", {
|
|
1999
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2000
|
-
children: /* @__PURE__ */ jsx12("pre", {
|
|
2001
|
-
children: `workflowId: rag-query
|
|
381
|
+
payload: object`})})]}),L("div",{className:"space-y-4",children:[y("h2",{className:"font-bold text-2xl",children:"RAG workflow example"}),y("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:y("pre",{children:`workflowId: rag-query
|
|
2002
382
|
version: '1.0.0'.0.0
|
|
2003
383
|
|
|
2004
384
|
steps:
|
|
@@ -2023,84 +403,9 @@ steps:
|
|
|
2023
403
|
- role: "user"
|
|
2024
404
|
content: |
|
|
2025
405
|
Context: \${steps.search-documents.output.results}
|
|
2026
|
-
Question: \${input.query}`
|
|
2027
|
-
})
|
|
2028
|
-
})
|
|
2029
|
-
]
|
|
2030
|
-
}),
|
|
2031
|
-
/* @__PURE__ */ jsxs12("div", {
|
|
2032
|
-
className: "flex items-center gap-4 pt-4",
|
|
2033
|
-
children: [
|
|
2034
|
-
/* @__PURE__ */ jsx12(Link11, {
|
|
2035
|
-
href: "/docs/integrations/elevenlabs",
|
|
2036
|
-
className: "btn-ghost",
|
|
2037
|
-
children: "Previous: ElevenLabs"
|
|
2038
|
-
}),
|
|
2039
|
-
/* @__PURE__ */ jsxs12(Link11, {
|
|
2040
|
-
href: "/docs/integrations/s3",
|
|
2041
|
-
className: "btn-primary",
|
|
2042
|
-
children: [
|
|
2043
|
-
"Next: S3 Storage ",
|
|
2044
|
-
/* @__PURE__ */ jsx12(ChevronRight9, {
|
|
2045
|
-
size: 16
|
|
2046
|
-
})
|
|
2047
|
-
]
|
|
2048
|
-
})
|
|
2049
|
-
]
|
|
2050
|
-
})
|
|
2051
|
-
]
|
|
2052
|
-
});
|
|
2053
|
-
}
|
|
2054
|
-
|
|
2055
|
-
// src/components/docs/integrations/IntegrationsResendPage.tsx
|
|
2056
|
-
import Link12 from "@contractspec/lib.ui-link";
|
|
2057
|
-
import { ChevronRight as ChevronRight10 } from "lucide-react";
|
|
2058
|
-
import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
2059
|
-
function IntegrationsResendPage() {
|
|
2060
|
-
return /* @__PURE__ */ jsxs13("div", {
|
|
2061
|
-
className: "space-y-8",
|
|
2062
|
-
children: [
|
|
2063
|
-
/* @__PURE__ */ jsxs13("div", {
|
|
2064
|
-
className: "space-y-4",
|
|
2065
|
-
children: [
|
|
2066
|
-
/* @__PURE__ */ jsx13("h1", {
|
|
2067
|
-
className: "font-bold text-4xl",
|
|
2068
|
-
children: "Resend"
|
|
2069
|
-
}),
|
|
2070
|
-
/* @__PURE__ */ jsx13("p", {
|
|
2071
|
-
className: "text-muted-foreground",
|
|
2072
|
-
children: "Resend is a modern email API built for developers. It provides a simple, reliable way to send transactional emails with React Email templates."
|
|
2073
|
-
})
|
|
2074
|
-
]
|
|
2075
|
-
}),
|
|
2076
|
-
/* @__PURE__ */ jsxs13("div", {
|
|
2077
|
-
className: "space-y-4",
|
|
2078
|
-
children: [
|
|
2079
|
-
/* @__PURE__ */ jsx13("h2", {
|
|
2080
|
-
className: "font-bold text-2xl",
|
|
2081
|
-
children: "Setup"
|
|
2082
|
-
}),
|
|
2083
|
-
/* @__PURE__ */ jsx13("div", {
|
|
2084
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2085
|
-
children: /* @__PURE__ */ jsx13("pre", {
|
|
2086
|
-
children: `# .env
|
|
406
|
+
Question: \${input.query}`})})]}),L("div",{className:"flex items-center gap-4 pt-4",children:[y(x,{href:"/docs/integrations/elevenlabs",className:"btn-ghost",children:"Previous: ElevenLabs"}),L(x,{href:"/docs/integrations/s3",className:"btn-primary",children:["Next: S3 Storage ",y(_e,{size:16})]})]})]})}import j from"@contractspec/lib.ui-link";import{ChevronRight as He}from"lucide-react";import{jsx as w,jsxs as B}from"react/jsx-runtime";function Ee(){return B("div",{className:"space-y-8",children:[B("div",{className:"space-y-4",children:[w("h1",{className:"font-bold text-4xl",children:"Resend"}),w("p",{className:"text-muted-foreground",children:"Resend is a modern email API built for developers. It provides a simple, reliable way to send transactional emails with React Email templates."})]}),B("div",{className:"space-y-4",children:[w("h2",{className:"font-bold text-2xl",children:"Setup"}),w("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:w("pre",{children:`# .env
|
|
2087
407
|
RESEND_API_KEY=re_...
|
|
2088
|
-
RESEND_FROM_EMAIL=onboarding@resend.dev`
|
|
2089
|
-
})
|
|
2090
|
-
})
|
|
2091
|
-
]
|
|
2092
|
-
}),
|
|
2093
|
-
/* @__PURE__ */ jsxs13("div", {
|
|
2094
|
-
className: "space-y-4",
|
|
2095
|
-
children: [
|
|
2096
|
-
/* @__PURE__ */ jsx13("h2", {
|
|
2097
|
-
className: "font-bold text-2xl",
|
|
2098
|
-
children: "Sending emails"
|
|
2099
|
-
}),
|
|
2100
|
-
/* @__PURE__ */ jsx13("div", {
|
|
2101
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2102
|
-
children: /* @__PURE__ */ jsx13("pre", {
|
|
2103
|
-
children: `capabilityId: resend-send-email
|
|
408
|
+
RESEND_FROM_EMAIL=onboarding@resend.dev`})})]}),B("div",{className:"space-y-4",children:[w("h2",{className:"font-bold text-2xl",children:"Sending emails"}),w("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:w("pre",{children:`capabilityId: resend-send-email
|
|
2104
409
|
provider:
|
|
2105
410
|
type: resend
|
|
2106
411
|
operation: sendEmail
|
|
@@ -2121,110 +426,12 @@ inputs:
|
|
|
2121
426
|
|
|
2122
427
|
outputs:
|
|
2123
428
|
id:
|
|
2124
|
-
type: string`
|
|
2125
|
-
})
|
|
2126
|
-
})
|
|
2127
|
-
]
|
|
2128
|
-
}),
|
|
2129
|
-
/* @__PURE__ */ jsxs13("div", {
|
|
2130
|
-
className: "space-y-4",
|
|
2131
|
-
children: [
|
|
2132
|
-
/* @__PURE__ */ jsx13("h2", {
|
|
2133
|
-
className: "font-bold text-2xl",
|
|
2134
|
-
children: "Best practices"
|
|
2135
|
-
}),
|
|
2136
|
-
/* @__PURE__ */ jsxs13("ul", {
|
|
2137
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
2138
|
-
children: [
|
|
2139
|
-
/* @__PURE__ */ jsx13("li", {
|
|
2140
|
-
children: "Use React Email for type-safe templates"
|
|
2141
|
-
}),
|
|
2142
|
-
/* @__PURE__ */ jsx13("li", {
|
|
2143
|
-
children: "Verify your domain for better deliverability"
|
|
2144
|
-
}),
|
|
2145
|
-
/* @__PURE__ */ jsx13("li", {
|
|
2146
|
-
children: "Monitor email analytics in the Resend dashboard"
|
|
2147
|
-
})
|
|
2148
|
-
]
|
|
2149
|
-
})
|
|
2150
|
-
]
|
|
2151
|
-
}),
|
|
2152
|
-
/* @__PURE__ */ jsxs13("div", {
|
|
2153
|
-
className: "flex items-center gap-4 pt-4",
|
|
2154
|
-
children: [
|
|
2155
|
-
/* @__PURE__ */ jsx13(Link12, {
|
|
2156
|
-
href: "/docs/integrations/postmark",
|
|
2157
|
-
className: "btn-ghost",
|
|
2158
|
-
children: "Previous: Postmark"
|
|
2159
|
-
}),
|
|
2160
|
-
/* @__PURE__ */ jsxs13(Link12, {
|
|
2161
|
-
href: "/docs/integrations/gmail",
|
|
2162
|
-
className: "btn-primary",
|
|
2163
|
-
children: [
|
|
2164
|
-
"Next: Gmail API ",
|
|
2165
|
-
/* @__PURE__ */ jsx13(ChevronRight10, {
|
|
2166
|
-
size: 16
|
|
2167
|
-
})
|
|
2168
|
-
]
|
|
2169
|
-
})
|
|
2170
|
-
]
|
|
2171
|
-
})
|
|
2172
|
-
]
|
|
2173
|
-
});
|
|
2174
|
-
}
|
|
2175
|
-
|
|
2176
|
-
// src/components/docs/integrations/IntegrationsS3Page.tsx
|
|
2177
|
-
import Link13 from "@contractspec/lib.ui-link";
|
|
2178
|
-
import { ChevronRight as ChevronRight11 } from "lucide-react";
|
|
2179
|
-
import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2180
|
-
function IntegrationsS3Page() {
|
|
2181
|
-
return /* @__PURE__ */ jsxs14("div", {
|
|
2182
|
-
className: "space-y-8",
|
|
2183
|
-
children: [
|
|
2184
|
-
/* @__PURE__ */ jsxs14("div", {
|
|
2185
|
-
className: "space-y-4",
|
|
2186
|
-
children: [
|
|
2187
|
-
/* @__PURE__ */ jsx14("h1", {
|
|
2188
|
-
className: "font-bold text-4xl",
|
|
2189
|
-
children: "S3-Compatible Storage"
|
|
2190
|
-
}),
|
|
2191
|
-
/* @__PURE__ */ jsx14("p", {
|
|
2192
|
-
className: "text-muted-foreground",
|
|
2193
|
-
children: "Store files, images, and documents using any S3-compatible object storage service including AWS S3, Scaleway Object Storage, MinIO, DigitalOcean Spaces, and more."
|
|
2194
|
-
})
|
|
2195
|
-
]
|
|
2196
|
-
}),
|
|
2197
|
-
/* @__PURE__ */ jsxs14("div", {
|
|
2198
|
-
className: "space-y-4",
|
|
2199
|
-
children: [
|
|
2200
|
-
/* @__PURE__ */ jsx14("h2", {
|
|
2201
|
-
className: "font-bold text-2xl",
|
|
2202
|
-
children: "Setup"
|
|
2203
|
-
}),
|
|
2204
|
-
/* @__PURE__ */ jsx14("div", {
|
|
2205
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2206
|
-
children: /* @__PURE__ */ jsx14("pre", {
|
|
2207
|
-
children: `# .env
|
|
429
|
+
type: string`})})]}),B("div",{className:"space-y-4",children:[w("h2",{className:"font-bold text-2xl",children:"Best practices"}),B("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[w("li",{children:"Use React Email for type-safe templates"}),w("li",{children:"Verify your domain for better deliverability"}),w("li",{children:"Monitor email analytics in the Resend dashboard"})]})]}),B("div",{className:"flex items-center gap-4 pt-4",children:[w(j,{href:"/docs/integrations/postmark",className:"btn-ghost",children:"Previous: Postmark"}),B(j,{href:"/docs/integrations/gmail",className:"btn-primary",children:["Next: Gmail API ",w(He,{size:16})]})]})]})}import ee from"@contractspec/lib.ui-link";import{ChevronRight as Se}from"lucide-react";import{jsx as m,jsxs as S}from"react/jsx-runtime";function Ce(){return S("div",{className:"space-y-8",children:[S("div",{className:"space-y-4",children:[m("h1",{className:"font-bold text-4xl",children:"S3-Compatible Storage"}),m("p",{className:"text-muted-foreground",children:"Store files, images, and documents using any S3-compatible object storage service including AWS S3, Scaleway Object Storage, MinIO, DigitalOcean Spaces, and more."})]}),S("div",{className:"space-y-4",children:[m("h2",{className:"font-bold text-2xl",children:"Setup"}),m("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:m("pre",{children:`# .env
|
|
2208
430
|
S3_ENDPOINT=https://s3.fr-par.scw.cloud
|
|
2209
431
|
S3_ACCESS_KEY_ID=...
|
|
2210
432
|
S3_SECRET_ACCESS_KEY=...
|
|
2211
433
|
S3_BUCKET=my-bucket
|
|
2212
|
-
S3_REGION=fr-par`
|
|
2213
|
-
})
|
|
2214
|
-
})
|
|
2215
|
-
]
|
|
2216
|
-
}),
|
|
2217
|
-
/* @__PURE__ */ jsxs14("div", {
|
|
2218
|
-
className: "space-y-4",
|
|
2219
|
-
children: [
|
|
2220
|
-
/* @__PURE__ */ jsx14("h2", {
|
|
2221
|
-
className: "font-bold text-2xl",
|
|
2222
|
-
children: "Uploading files"
|
|
2223
|
-
}),
|
|
2224
|
-
/* @__PURE__ */ jsx14("div", {
|
|
2225
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2226
|
-
children: /* @__PURE__ */ jsx14("pre", {
|
|
2227
|
-
children: `capabilityId: s3-upload
|
|
434
|
+
S3_REGION=fr-par`})})]}),S("div",{className:"space-y-4",children:[m("h2",{className:"font-bold text-2xl",children:"Uploading files"}),m("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:m("pre",{children:`capabilityId: s3-upload
|
|
2228
435
|
provider:
|
|
2229
436
|
type: s3
|
|
2230
437
|
operation: upload
|
|
@@ -2246,22 +453,7 @@ outputs:
|
|
|
2246
453
|
url:
|
|
2247
454
|
type: string
|
|
2248
455
|
etag:
|
|
2249
|
-
type: string`
|
|
2250
|
-
})
|
|
2251
|
-
})
|
|
2252
|
-
]
|
|
2253
|
-
}),
|
|
2254
|
-
/* @__PURE__ */ jsxs14("div", {
|
|
2255
|
-
className: "space-y-4",
|
|
2256
|
-
children: [
|
|
2257
|
-
/* @__PURE__ */ jsx14("h2", {
|
|
2258
|
-
className: "font-bold text-2xl",
|
|
2259
|
-
children: "Generating presigned URLs"
|
|
2260
|
-
}),
|
|
2261
|
-
/* @__PURE__ */ jsx14("div", {
|
|
2262
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2263
|
-
children: /* @__PURE__ */ jsx14("pre", {
|
|
2264
|
-
children: `capabilityId: s3-presigned-url
|
|
456
|
+
type: string`})})]}),S("div",{className:"space-y-4",children:[m("h2",{className:"font-bold text-2xl",children:"Generating presigned URLs"}),m("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:m("pre",{children:`capabilityId: s3-presigned-url
|
|
2265
457
|
provider:
|
|
2266
458
|
type: s3
|
|
2267
459
|
operation: getPresignedUrl
|
|
@@ -2276,96 +468,7 @@ inputs:
|
|
|
2276
468
|
|
|
2277
469
|
outputs:
|
|
2278
470
|
url:
|
|
2279
|
-
type: string`
|
|
2280
|
-
})
|
|
2281
|
-
})
|
|
2282
|
-
]
|
|
2283
|
-
}),
|
|
2284
|
-
/* @__PURE__ */ jsxs14("div", {
|
|
2285
|
-
className: "space-y-4",
|
|
2286
|
-
children: [
|
|
2287
|
-
/* @__PURE__ */ jsx14("h2", {
|
|
2288
|
-
className: "font-bold text-2xl",
|
|
2289
|
-
children: "Best practices"
|
|
2290
|
-
}),
|
|
2291
|
-
/* @__PURE__ */ jsxs14("ul", {
|
|
2292
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
2293
|
-
children: [
|
|
2294
|
-
/* @__PURE__ */ jsx14("li", {
|
|
2295
|
-
children: "Use presigned URLs for secure, temporary access"
|
|
2296
|
-
}),
|
|
2297
|
-
/* @__PURE__ */ jsx14("li", {
|
|
2298
|
-
children: "Set appropriate CORS policies for browser uploads"
|
|
2299
|
-
}),
|
|
2300
|
-
/* @__PURE__ */ jsx14("li", {
|
|
2301
|
-
children: "Enable versioning for important files"
|
|
2302
|
-
}),
|
|
2303
|
-
/* @__PURE__ */ jsx14("li", {
|
|
2304
|
-
children: "Use lifecycle policies to archive old files"
|
|
2305
|
-
}),
|
|
2306
|
-
/* @__PURE__ */ jsx14("li", {
|
|
2307
|
-
children: "Organize files with a clear key structure"
|
|
2308
|
-
})
|
|
2309
|
-
]
|
|
2310
|
-
})
|
|
2311
|
-
]
|
|
2312
|
-
}),
|
|
2313
|
-
/* @__PURE__ */ jsxs14("div", {
|
|
2314
|
-
className: "flex items-center gap-4 pt-4",
|
|
2315
|
-
children: [
|
|
2316
|
-
/* @__PURE__ */ jsx14(Link13, {
|
|
2317
|
-
href: "/docs/integrations/qdrant",
|
|
2318
|
-
className: "btn-ghost",
|
|
2319
|
-
children: "Previous: Qdrant"
|
|
2320
|
-
}),
|
|
2321
|
-
/* @__PURE__ */ jsxs14(Link13, {
|
|
2322
|
-
href: "/docs/integrations/twilio",
|
|
2323
|
-
className: "btn-primary",
|
|
2324
|
-
children: [
|
|
2325
|
-
"Next: Twilio ",
|
|
2326
|
-
/* @__PURE__ */ jsx14(ChevronRight11, {
|
|
2327
|
-
size: 16
|
|
2328
|
-
})
|
|
2329
|
-
]
|
|
2330
|
-
})
|
|
2331
|
-
]
|
|
2332
|
-
})
|
|
2333
|
-
]
|
|
2334
|
-
});
|
|
2335
|
-
}
|
|
2336
|
-
|
|
2337
|
-
// src/components/docs/integrations/IntegrationsSlackPage.tsx
|
|
2338
|
-
import Link14 from "@contractspec/lib.ui-link";
|
|
2339
|
-
import { ChevronRight as ChevronRight12 } from "lucide-react";
|
|
2340
|
-
import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
2341
|
-
function IntegrationsSlackPage() {
|
|
2342
|
-
return /* @__PURE__ */ jsxs15("div", {
|
|
2343
|
-
className: "space-y-8",
|
|
2344
|
-
children: [
|
|
2345
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
2346
|
-
className: "space-y-4",
|
|
2347
|
-
children: [
|
|
2348
|
-
/* @__PURE__ */ jsx15("h1", {
|
|
2349
|
-
className: "font-bold text-4xl",
|
|
2350
|
-
children: "Slack Messaging"
|
|
2351
|
-
}),
|
|
2352
|
-
/* @__PURE__ */ jsx15("p", {
|
|
2353
|
-
className: "text-muted-foreground",
|
|
2354
|
-
children: "ContractSpec supports signed Slack event ingestion and outbox-backed outbound replies through the channel runtime."
|
|
2355
|
-
})
|
|
2356
|
-
]
|
|
2357
|
-
}),
|
|
2358
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
2359
|
-
className: "space-y-4",
|
|
2360
|
-
children: [
|
|
2361
|
-
/* @__PURE__ */ jsx15("h2", {
|
|
2362
|
-
className: "font-bold text-2xl",
|
|
2363
|
-
children: "Required secrets and config"
|
|
2364
|
-
}),
|
|
2365
|
-
/* @__PURE__ */ jsx15("div", {
|
|
2366
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2367
|
-
children: /* @__PURE__ */ jsx15("pre", {
|
|
2368
|
-
children: `// secret payload
|
|
471
|
+
type: string`})})]}),S("div",{className:"space-y-4",children:[m("h2",{className:"font-bold text-2xl",children:"Best practices"}),S("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[m("li",{children:"Use presigned URLs for secure, temporary access"}),m("li",{children:"Set appropriate CORS policies for browser uploads"}),m("li",{children:"Enable versioning for important files"}),m("li",{children:"Use lifecycle policies to archive old files"}),m("li",{children:"Organize files with a clear key structure"})]})]}),S("div",{className:"flex items-center gap-4 pt-4",children:[m(ee,{href:"/docs/integrations/qdrant",className:"btn-ghost",children:"Previous: Qdrant"}),S(ee,{href:"/docs/integrations/twilio",className:"btn-primary",children:["Next: Twilio ",m(Se,{size:16})]})]})]})}import te from"@contractspec/lib.ui-link";import{ChevronRight as Ue}from"lucide-react";import{jsx as u,jsxs as W}from"react/jsx-runtime";function Oe(){return W("div",{className:"space-y-8",children:[W("div",{className:"space-y-4",children:[u("h1",{className:"font-bold text-4xl",children:"Slack Messaging"}),u("p",{className:"text-muted-foreground",children:"ContractSpec supports signed Slack event ingestion and outbox-backed outbound replies through the channel runtime."})]}),W("div",{className:"space-y-4",children:[u("h2",{className:"font-bold text-2xl",children:"Required secrets and config"}),u("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:u("pre",{children:`// secret payload
|
|
2369
472
|
{
|
|
2370
473
|
"botToken": "xoxb-...",
|
|
2371
474
|
"signingSecret": "..."
|
|
@@ -2375,61 +478,7 @@ function IntegrationsSlackPage() {
|
|
|
2375
478
|
{
|
|
2376
479
|
"defaultChannelId": "C0123456789",
|
|
2377
480
|
"apiBaseUrl": "https://slack.com/api"
|
|
2378
|
-
}`
|
|
2379
|
-
})
|
|
2380
|
-
})
|
|
2381
|
-
]
|
|
2382
|
-
}),
|
|
2383
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
2384
|
-
className: "space-y-4",
|
|
2385
|
-
children: [
|
|
2386
|
-
/* @__PURE__ */ jsx15("h2", {
|
|
2387
|
-
className: "font-bold text-2xl",
|
|
2388
|
-
children: "Webhook ingress"
|
|
2389
|
-
}),
|
|
2390
|
-
/* @__PURE__ */ jsxs15("ul", {
|
|
2391
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
2392
|
-
children: [
|
|
2393
|
-
/* @__PURE__ */ jsxs15("li", {
|
|
2394
|
-
children: [
|
|
2395
|
-
"Inbound events are accepted on",
|
|
2396
|
-
" ",
|
|
2397
|
-
/* @__PURE__ */ jsx15("code", {
|
|
2398
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
2399
|
-
children: "/webhooks/slack/events"
|
|
2400
|
-
}),
|
|
2401
|
-
"."
|
|
2402
|
-
]
|
|
2403
|
-
}),
|
|
2404
|
-
/* @__PURE__ */ jsxs15("li", {
|
|
2405
|
-
children: [
|
|
2406
|
-
"Requests are validated with Slack signatures (",
|
|
2407
|
-
/* @__PURE__ */ jsx15("code", {
|
|
2408
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
2409
|
-
children: "x-slack-signature"
|
|
2410
|
-
}),
|
|
2411
|
-
" ",
|
|
2412
|
-
"+ timestamp tolerance)."
|
|
2413
|
-
]
|
|
2414
|
-
}),
|
|
2415
|
-
/* @__PURE__ */ jsx15("li", {
|
|
2416
|
-
children: "Normalized events are deduplicated and persisted before any outbound side effects."
|
|
2417
|
-
})
|
|
2418
|
-
]
|
|
2419
|
-
})
|
|
2420
|
-
]
|
|
2421
|
-
}),
|
|
2422
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
2423
|
-
className: "space-y-4",
|
|
2424
|
-
children: [
|
|
2425
|
-
/* @__PURE__ */ jsx15("h2", {
|
|
2426
|
-
className: "font-bold text-2xl",
|
|
2427
|
-
children: "Workspace routing and dispatch"
|
|
2428
|
-
}),
|
|
2429
|
-
/* @__PURE__ */ jsx15("div", {
|
|
2430
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2431
|
-
children: /* @__PURE__ */ jsx15("pre", {
|
|
2432
|
-
children: `# Workspace mapping (recommended)
|
|
481
|
+
}`})})]}),W("div",{className:"space-y-4",children:[u("h2",{className:"font-bold text-2xl",children:"Webhook ingress"}),W("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[W("li",{children:["Inbound events are accepted on"," ",u("code",{className:"rounded bg-background/50 px-2 py-1",children:"/webhooks/slack/events"}),"."]}),W("li",{children:["Requests are validated with Slack signatures (",u("code",{className:"rounded bg-background/50 px-2 py-1",children:"x-slack-signature"})," ","+ timestamp tolerance)."]}),u("li",{children:"Normalized events are deduplicated and persisted before any outbound side effects."})]})]}),W("div",{className:"space-y-4",children:[u("h2",{className:"font-bold text-2xl",children:"Workspace routing and dispatch"}),u("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:u("pre",{children:`# Workspace mapping (recommended)
|
|
2433
482
|
CHANNEL_WORKSPACE_MAP_SLACK={"T123":"workspace-acme"}
|
|
2434
483
|
|
|
2435
484
|
# Dispatch protection
|
|
@@ -2437,103 +486,7 @@ CHANNEL_DISPATCH_TOKEN=...
|
|
|
2437
486
|
|
|
2438
487
|
# Optional scheduler
|
|
2439
488
|
CHANNEL_DISPATCH_INTERVAL_MS=120000
|
|
2440
|
-
CHANNEL_DISPATCH_RUN_ON_START=1`
|
|
2441
|
-
})
|
|
2442
|
-
})
|
|
2443
|
-
]
|
|
2444
|
-
}),
|
|
2445
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
2446
|
-
className: "space-y-4",
|
|
2447
|
-
children: [
|
|
2448
|
-
/* @__PURE__ */ jsx15("h2", {
|
|
2449
|
-
className: "font-bold text-2xl",
|
|
2450
|
-
children: "Best practices"
|
|
2451
|
-
}),
|
|
2452
|
-
/* @__PURE__ */ jsxs15("ul", {
|
|
2453
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
2454
|
-
children: [
|
|
2455
|
-
/* @__PURE__ */ jsx15("li", {
|
|
2456
|
-
children: "Keep bot tokens and signing secrets in a managed secret provider."
|
|
2457
|
-
}),
|
|
2458
|
-
/* @__PURE__ */ jsx15("li", {
|
|
2459
|
-
children: "Use workspace mapping to prevent cross-tenant event leakage."
|
|
2460
|
-
}),
|
|
2461
|
-
/* @__PURE__ */ jsx15("li", {
|
|
2462
|
-
children: "Keep dispatch asynchronous so webhook handlers stay fast and reliable."
|
|
2463
|
-
}),
|
|
2464
|
-
/* @__PURE__ */ jsx15("li", {
|
|
2465
|
-
children: "Monitor telemetry for ingest, decision, outbox, and dispatch stages."
|
|
2466
|
-
})
|
|
2467
|
-
]
|
|
2468
|
-
})
|
|
2469
|
-
]
|
|
2470
|
-
}),
|
|
2471
|
-
/* @__PURE__ */ jsxs15("div", {
|
|
2472
|
-
className: "flex items-center gap-4 pt-4",
|
|
2473
|
-
children: [
|
|
2474
|
-
/* @__PURE__ */ jsx15(Link14, {
|
|
2475
|
-
href: "/docs/integrations/twilio",
|
|
2476
|
-
className: "btn-ghost",
|
|
2477
|
-
children: "Previous: Twilio SMS"
|
|
2478
|
-
}),
|
|
2479
|
-
/* @__PURE__ */ jsxs15(Link14, {
|
|
2480
|
-
href: "/docs/integrations/github",
|
|
2481
|
-
className: "btn-primary",
|
|
2482
|
-
children: [
|
|
2483
|
-
"Next: GitHub Messaging ",
|
|
2484
|
-
/* @__PURE__ */ jsx15(ChevronRight12, {
|
|
2485
|
-
size: 16
|
|
2486
|
-
})
|
|
2487
|
-
]
|
|
2488
|
-
})
|
|
2489
|
-
]
|
|
2490
|
-
})
|
|
2491
|
-
]
|
|
2492
|
-
});
|
|
2493
|
-
}
|
|
2494
|
-
|
|
2495
|
-
// src/components/docs/integrations/IntegrationsSpecModelPage.tsx
|
|
2496
|
-
import Link15 from "@contractspec/lib.ui-link";
|
|
2497
|
-
import { ChevronRight as ChevronRight13 } from "lucide-react";
|
|
2498
|
-
import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
2499
|
-
function IntegrationsSpecModelPage() {
|
|
2500
|
-
return /* @__PURE__ */ jsxs16("div", {
|
|
2501
|
-
className: "space-y-8",
|
|
2502
|
-
children: [
|
|
2503
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2504
|
-
className: "space-y-4",
|
|
2505
|
-
children: [
|
|
2506
|
-
/* @__PURE__ */ jsx16("h1", {
|
|
2507
|
-
className: "font-bold text-4xl",
|
|
2508
|
-
children: "Integration Spec Model"
|
|
2509
|
-
}),
|
|
2510
|
-
/* @__PURE__ */ jsx16("p", {
|
|
2511
|
-
className: "text-muted-foreground",
|
|
2512
|
-
children: "Integrations in ContractSpec are defined through typed specifications that declare capabilities, configuration requirements, and connection details. This page covers IntegrationSpec and IntegrationConnection."
|
|
2513
|
-
})
|
|
2514
|
-
]
|
|
2515
|
-
}),
|
|
2516
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2517
|
-
className: "space-y-4",
|
|
2518
|
-
children: [
|
|
2519
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2520
|
-
className: "font-bold text-2xl",
|
|
2521
|
-
children: "IntegrationSpec"
|
|
2522
|
-
}),
|
|
2523
|
-
/* @__PURE__ */ jsxs16("p", {
|
|
2524
|
-
className: "text-muted-foreground",
|
|
2525
|
-
children: [
|
|
2526
|
-
"The ",
|
|
2527
|
-
/* @__PURE__ */ jsx16("strong", {
|
|
2528
|
-
children: "IntegrationSpec"
|
|
2529
|
-
}),
|
|
2530
|
-
" is a global definition of an integration provider. It declares what the integration provides and what it requires."
|
|
2531
|
-
]
|
|
2532
|
-
}),
|
|
2533
|
-
/* @__PURE__ */ jsx16("div", {
|
|
2534
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2535
|
-
children: /* @__PURE__ */ jsx16("pre", {
|
|
2536
|
-
children: `type IntegrationSpec = {
|
|
489
|
+
CHANNEL_DISPATCH_RUN_ON_START=1`})})]}),W("div",{className:"space-y-4",children:[u("h2",{className:"font-bold text-2xl",children:"Best practices"}),W("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[u("li",{children:"Keep bot tokens and signing secrets in a managed secret provider."}),u("li",{children:"Use workspace mapping to prevent cross-tenant event leakage."}),u("li",{children:"Keep dispatch asynchronous so webhook handlers stay fast and reliable."}),u("li",{children:"Monitor telemetry for ingest, decision, outbox, and dispatch stages."})]})]}),W("div",{className:"flex items-center gap-4 pt-4",children:[u(te,{href:"/docs/integrations/twilio",className:"btn-ghost",children:"Previous: Twilio SMS"}),W(te,{href:"/docs/integrations/github",className:"btn-primary",children:["Next: GitHub Messaging ",u(Ue,{size:16})]})]})]})}import ae from"@contractspec/lib.ui-link";import{ChevronRight as Le}from"lucide-react";import{jsx as t,jsxs as l}from"react/jsx-runtime";function Be(){return l("div",{className:"space-y-8",children:[l("div",{className:"space-y-4",children:[t("h1",{className:"font-bold text-4xl",children:"Integration Spec Model"}),t("p",{className:"text-muted-foreground",children:"Integrations in ContractSpec are defined through typed specifications that declare capabilities, configuration requirements, and connection details. This page covers IntegrationSpec and IntegrationConnection."})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"IntegrationSpec"}),l("p",{className:"text-muted-foreground",children:["The ",t("strong",{children:"IntegrationSpec"})," is a global definition of an integration provider. It declares what the integration provides and what it requires."]}),t("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:t("pre",{children:`type IntegrationSpec = {
|
|
2537
490
|
id: string;
|
|
2538
491
|
label: string;
|
|
2539
492
|
description: string;
|
|
@@ -2586,22 +539,7 @@ function IntegrationsSpecModelPage() {
|
|
|
2586
539
|
version: string;
|
|
2587
540
|
createdAt: string;
|
|
2588
541
|
updatedAt: string;
|
|
2589
|
-
};`
|
|
2590
|
-
})
|
|
2591
|
-
})
|
|
2592
|
-
]
|
|
2593
|
-
}),
|
|
2594
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2595
|
-
className: "space-y-4",
|
|
2596
|
-
children: [
|
|
2597
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2598
|
-
className: "font-bold text-2xl",
|
|
2599
|
-
children: "Example: Stripe IntegrationSpec"
|
|
2600
|
-
}),
|
|
2601
|
-
/* @__PURE__ */ jsx16("div", {
|
|
2602
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2603
|
-
children: /* @__PURE__ */ jsx16("pre", {
|
|
2604
|
-
children: `{
|
|
542
|
+
};`})})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"Example: Stripe IntegrationSpec"}),t("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:t("pre",{children:`{
|
|
2605
543
|
id: "stripe",
|
|
2606
544
|
label: "Stripe",
|
|
2607
545
|
description: "Payment processing and subscription management",
|
|
@@ -2666,32 +604,7 @@ function IntegrationsSpecModelPage() {
|
|
|
2666
604
|
docsUrl: "https://docs.contractspec.com/integrations/stripe",
|
|
2667
605
|
setupGuideUrl: "https://stripe.com/docs/keys",
|
|
2668
606
|
version: "1.0.0"
|
|
2669
|
-
}`
|
|
2670
|
-
})
|
|
2671
|
-
})
|
|
2672
|
-
]
|
|
2673
|
-
}),
|
|
2674
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2675
|
-
className: "space-y-4",
|
|
2676
|
-
children: [
|
|
2677
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2678
|
-
className: "font-bold text-2xl",
|
|
2679
|
-
children: "IntegrationConnection"
|
|
2680
|
-
}),
|
|
2681
|
-
/* @__PURE__ */ jsxs16("p", {
|
|
2682
|
-
className: "text-muted-foreground",
|
|
2683
|
-
children: [
|
|
2684
|
-
"An ",
|
|
2685
|
-
/* @__PURE__ */ jsx16("strong", {
|
|
2686
|
-
children: "IntegrationConnection"
|
|
2687
|
-
}),
|
|
2688
|
-
" is a per-tenant instance of an integration with configured credentials and environment settings."
|
|
2689
|
-
]
|
|
2690
|
-
}),
|
|
2691
|
-
/* @__PURE__ */ jsx16("div", {
|
|
2692
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2693
|
-
children: /* @__PURE__ */ jsx16("pre", {
|
|
2694
|
-
children: `type IntegrationConnection = {
|
|
607
|
+
}`})})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"IntegrationConnection"}),l("p",{className:"text-muted-foreground",children:["An ",t("strong",{children:"IntegrationConnection"})," is a per-tenant instance of an integration with configured credentials and environment settings."]}),t("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:t("pre",{children:`type IntegrationConnection = {
|
|
2695
608
|
id: string;
|
|
2696
609
|
tenantId: string;
|
|
2697
610
|
integrationId: string;
|
|
@@ -2715,22 +628,7 @@ function IntegrationsSpecModelPage() {
|
|
|
2715
628
|
createdAt: string;
|
|
2716
629
|
updatedAt: string;
|
|
2717
630
|
createdBy: string;
|
|
2718
|
-
};`
|
|
2719
|
-
})
|
|
2720
|
-
})
|
|
2721
|
-
]
|
|
2722
|
-
}),
|
|
2723
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2724
|
-
className: "space-y-4",
|
|
2725
|
-
children: [
|
|
2726
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2727
|
-
className: "font-bold text-2xl",
|
|
2728
|
-
children: "Example: Stripe IntegrationConnection"
|
|
2729
|
-
}),
|
|
2730
|
-
/* @__PURE__ */ jsx16("div", {
|
|
2731
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2732
|
-
children: /* @__PURE__ */ jsx16("pre", {
|
|
2733
|
-
children: `// Production connection
|
|
631
|
+
};`})})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"Example: Stripe IntegrationConnection"}),t("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:t("pre",{children:`// Production connection
|
|
2734
632
|
{
|
|
2735
633
|
id: "conn_stripe_acme_prod",
|
|
2736
634
|
tenantId: "acme-corp",
|
|
@@ -2764,26 +662,7 @@ function IntegrationsSpecModelPage() {
|
|
|
2764
662
|
createdAt: "2025-01-01T00:00:00Z",
|
|
2765
663
|
updatedAt: "2025-01-15T10:25:00Z",
|
|
2766
664
|
createdBy: "dev@acme.com"
|
|
2767
|
-
}`
|
|
2768
|
-
})
|
|
2769
|
-
})
|
|
2770
|
-
]
|
|
2771
|
-
}),
|
|
2772
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2773
|
-
className: "space-y-4",
|
|
2774
|
-
children: [
|
|
2775
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2776
|
-
className: "font-bold text-2xl",
|
|
2777
|
-
children: "Example: Messaging IntegrationConnection"
|
|
2778
|
-
}),
|
|
2779
|
-
/* @__PURE__ */ jsx16("p", {
|
|
2780
|
-
className: "text-muted-foreground",
|
|
2781
|
-
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."
|
|
2782
|
-
}),
|
|
2783
|
-
/* @__PURE__ */ jsx16("div", {
|
|
2784
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2785
|
-
children: /* @__PURE__ */ jsx16("pre", {
|
|
2786
|
-
children: `{
|
|
665
|
+
}`})})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"Example: Messaging IntegrationConnection"}),t("p",{className:"text-muted-foreground",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."}),t("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:t("pre",{children:`{
|
|
2787
666
|
id: "conn_slack_acme_prod",
|
|
2788
667
|
tenantId: "acme-corp",
|
|
2789
668
|
integrationId: "messaging.slack",
|
|
@@ -2800,26 +679,7 @@ function IntegrationsSpecModelPage() {
|
|
|
2800
679
|
{
|
|
2801
680
|
"botToken": "xoxb-...",
|
|
2802
681
|
"signingSecret": "..."
|
|
2803
|
-
}`
|
|
2804
|
-
})
|
|
2805
|
-
})
|
|
2806
|
-
]
|
|
2807
|
-
}),
|
|
2808
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2809
|
-
className: "space-y-4",
|
|
2810
|
-
children: [
|
|
2811
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2812
|
-
className: "font-bold text-2xl",
|
|
2813
|
-
children: "Health transport strategy config"
|
|
2814
|
-
}),
|
|
2815
|
-
/* @__PURE__ */ jsx16("p", {
|
|
2816
|
-
className: "text-muted-foreground",
|
|
2817
|
-
children: "Health providers support deterministic transport routing and explicit unofficial gating in connection config."
|
|
2818
|
-
}),
|
|
2819
|
-
/* @__PURE__ */ jsx16("div", {
|
|
2820
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
2821
|
-
children: /* @__PURE__ */ jsx16("pre", {
|
|
2822
|
-
children: `{
|
|
682
|
+
}`})})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"Health transport strategy config"}),t("p",{className:"text-muted-foreground",children:"Health providers support deterministic transport routing and explicit unofficial gating in connection config."}),t("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:t("pre",{children:`{
|
|
2823
683
|
"defaultTransport": "official-api",
|
|
2824
684
|
"strategyOrder": ["official-api", "aggregator-api", "unofficial"],
|
|
2825
685
|
"allowUnofficial": false,
|
|
@@ -2836,230 +696,10 @@ function IntegrationsSpecModelPage() {
|
|
|
2836
696
|
"clientSecret": "...",
|
|
2837
697
|
"tokenExpiresAt": "2026-02-01T00:00:00.000Z",
|
|
2838
698
|
"mcpAccessToken": "..."
|
|
2839
|
-
}`
|
|
2840
|
-
})
|
|
2841
|
-
})
|
|
2842
|
-
]
|
|
2843
|
-
}),
|
|
2844
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2845
|
-
className: "space-y-4",
|
|
2846
|
-
children: [
|
|
2847
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2848
|
-
className: "font-bold text-2xl",
|
|
2849
|
-
children: "Health checks"
|
|
2850
|
-
}),
|
|
2851
|
-
/* @__PURE__ */ jsx16("p", {
|
|
2852
|
-
className: "text-muted-foreground",
|
|
2853
|
-
children: "IntegrationConnections are periodically health-checked to ensure they remain valid:"
|
|
2854
|
-
}),
|
|
2855
|
-
/* @__PURE__ */ jsxs16("ul", {
|
|
2856
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
2857
|
-
children: [
|
|
2858
|
-
/* @__PURE__ */ jsxs16("li", {
|
|
2859
|
-
children: [
|
|
2860
|
-
/* @__PURE__ */ jsx16("strong", {
|
|
2861
|
-
children: "API key validation"
|
|
2862
|
-
}),
|
|
2863
|
-
" - Test that credentials are still valid"
|
|
2864
|
-
]
|
|
2865
|
-
}),
|
|
2866
|
-
/* @__PURE__ */ jsxs16("li", {
|
|
2867
|
-
children: [
|
|
2868
|
-
/* @__PURE__ */ jsx16("strong", {
|
|
2869
|
-
children: "Connectivity check"
|
|
2870
|
-
}),
|
|
2871
|
-
" - Verify network access to the provider"
|
|
2872
|
-
]
|
|
2873
|
-
}),
|
|
2874
|
-
/* @__PURE__ */ jsxs16("li", {
|
|
2875
|
-
children: [
|
|
2876
|
-
/* @__PURE__ */ jsx16("strong", {
|
|
2877
|
-
children: "Permission verification"
|
|
2878
|
-
}),
|
|
2879
|
-
" - Ensure required scopes are granted"
|
|
2880
|
-
]
|
|
2881
|
-
}),
|
|
2882
|
-
/* @__PURE__ */ jsxs16("li", {
|
|
2883
|
-
children: [
|
|
2884
|
-
/* @__PURE__ */ jsx16("strong", {
|
|
2885
|
-
children: "Webhook validation"
|
|
2886
|
-
}),
|
|
2887
|
-
" - Test webhook endpoint reachability"
|
|
2888
|
-
]
|
|
2889
|
-
})
|
|
2890
|
-
]
|
|
2891
|
-
}),
|
|
2892
|
-
/* @__PURE__ */ jsx16("p", {
|
|
2893
|
-
className: "text-muted-foreground",
|
|
2894
|
-
children: 'Failed health checks update the connection status to "error" and trigger alerts.'
|
|
2895
|
-
})
|
|
2896
|
-
]
|
|
2897
|
-
}),
|
|
2898
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2899
|
-
className: "space-y-4",
|
|
2900
|
-
children: [
|
|
2901
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2902
|
-
className: "font-bold text-2xl",
|
|
2903
|
-
children: "Secret management"
|
|
2904
|
-
}),
|
|
2905
|
-
/* @__PURE__ */ jsx16("p", {
|
|
2906
|
-
className: "text-muted-foreground",
|
|
2907
|
-
children: "Secrets (API keys, tokens) are never stored in plaintext:"
|
|
2908
|
-
}),
|
|
2909
|
-
/* @__PURE__ */ jsxs16("ol", {
|
|
2910
|
-
className: "list-inside list-decimal space-y-2 text-muted-foreground",
|
|
2911
|
-
children: [
|
|
2912
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2913
|
-
children: "User provides secrets through secure UI or API"
|
|
2914
|
-
}),
|
|
2915
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2916
|
-
children: "Secrets are encrypted using tenant-specific keys"
|
|
2917
|
-
}),
|
|
2918
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2919
|
-
children: "Encrypted secrets are stored in secure vault (e.g., AWS Secrets Manager)"
|
|
2920
|
-
}),
|
|
2921
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2922
|
-
children: "IntegrationConnection stores only a reference (secretRef)"
|
|
2923
|
-
}),
|
|
2924
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2925
|
-
children: "At runtime, secrets are decrypted on-demand and never logged"
|
|
2926
|
-
})
|
|
2927
|
-
]
|
|
2928
|
-
})
|
|
2929
|
-
]
|
|
2930
|
-
}),
|
|
2931
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2932
|
-
className: "space-y-4",
|
|
2933
|
-
children: [
|
|
2934
|
-
/* @__PURE__ */ jsx16("h2", {
|
|
2935
|
-
className: "font-bold text-2xl",
|
|
2936
|
-
children: "Best practices"
|
|
2937
|
-
}),
|
|
2938
|
-
/* @__PURE__ */ jsxs16("ul", {
|
|
2939
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
2940
|
-
children: [
|
|
2941
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2942
|
-
children: "Always maintain separate sandbox and production connections"
|
|
2943
|
-
}),
|
|
2944
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2945
|
-
children: "Use descriptive connection IDs that include tenant and environment"
|
|
2946
|
-
}),
|
|
2947
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2948
|
-
children: "Monitor health check status and set up alerts for failures"
|
|
2949
|
-
}),
|
|
2950
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2951
|
-
children: "Rotate secrets regularly and update secretRef accordingly"
|
|
2952
|
-
}),
|
|
2953
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2954
|
-
children: "Document the purpose and ownership of each connection"
|
|
2955
|
-
}),
|
|
2956
|
-
/* @__PURE__ */ jsx16("li", {
|
|
2957
|
-
children: "Test connections in sandbox before enabling in production"
|
|
2958
|
-
})
|
|
2959
|
-
]
|
|
2960
|
-
})
|
|
2961
|
-
]
|
|
2962
|
-
}),
|
|
2963
|
-
/* @__PURE__ */ jsxs16("div", {
|
|
2964
|
-
className: "flex items-center gap-4 pt-4",
|
|
2965
|
-
children: [
|
|
2966
|
-
/* @__PURE__ */ jsx16(Link15, {
|
|
2967
|
-
href: "/docs/integrations",
|
|
2968
|
-
className: "btn-ghost",
|
|
2969
|
-
children: "Back to Integrations"
|
|
2970
|
-
}),
|
|
2971
|
-
/* @__PURE__ */ jsxs16(Link15, {
|
|
2972
|
-
href: "/docs/architecture/integration-binding",
|
|
2973
|
-
className: "btn-primary",
|
|
2974
|
-
children: [
|
|
2975
|
-
"Integration Binding ",
|
|
2976
|
-
/* @__PURE__ */ jsx16(ChevronRight13, {
|
|
2977
|
-
size: 16
|
|
2978
|
-
})
|
|
2979
|
-
]
|
|
2980
|
-
})
|
|
2981
|
-
]
|
|
2982
|
-
})
|
|
2983
|
-
]
|
|
2984
|
-
});
|
|
2985
|
-
}
|
|
2986
|
-
|
|
2987
|
-
// src/components/docs/integrations/IntegrationsStripePage.tsx
|
|
2988
|
-
import Link16 from "@contractspec/lib.ui-link";
|
|
2989
|
-
import { ChevronRight as ChevronRight14 } from "lucide-react";
|
|
2990
|
-
import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2991
|
-
function IntegrationsStripePage() {
|
|
2992
|
-
return /* @__PURE__ */ jsxs17("div", {
|
|
2993
|
-
className: "space-y-8",
|
|
2994
|
-
children: [
|
|
2995
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
2996
|
-
className: "space-y-4",
|
|
2997
|
-
children: [
|
|
2998
|
-
/* @__PURE__ */ jsx17("h1", {
|
|
2999
|
-
className: "font-bold text-4xl",
|
|
3000
|
-
children: "Stripe"
|
|
3001
|
-
}),
|
|
3002
|
-
/* @__PURE__ */ jsx17("p", {
|
|
3003
|
-
className: "text-muted-foreground",
|
|
3004
|
-
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."
|
|
3005
|
-
})
|
|
3006
|
-
]
|
|
3007
|
-
}),
|
|
3008
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3009
|
-
className: "space-y-4",
|
|
3010
|
-
children: [
|
|
3011
|
-
/* @__PURE__ */ jsx17("h2", {
|
|
3012
|
-
className: "font-bold text-2xl",
|
|
3013
|
-
children: "Setup"
|
|
3014
|
-
}),
|
|
3015
|
-
/* @__PURE__ */ jsx17("p", {
|
|
3016
|
-
className: "text-muted-foreground",
|
|
3017
|
-
children: "Add your Stripe credentials to your environment variables:"
|
|
3018
|
-
}),
|
|
3019
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3020
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3021
|
-
children: /* @__PURE__ */ jsx17("pre", {
|
|
3022
|
-
children: `# .env
|
|
699
|
+
}`})})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"Health checks"}),t("p",{className:"text-muted-foreground",children:"IntegrationConnections are periodically health-checked to ensure they remain valid:"}),l("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[l("li",{children:[t("strong",{children:"API key validation"})," - Test that credentials are still valid"]}),l("li",{children:[t("strong",{children:"Connectivity check"})," - Verify network access to the provider"]}),l("li",{children:[t("strong",{children:"Permission verification"})," - Ensure required scopes are granted"]}),l("li",{children:[t("strong",{children:"Webhook validation"})," - Test webhook endpoint reachability"]})]}),t("p",{className:"text-muted-foreground",children:'Failed health checks update the connection status to "error" and trigger alerts.'})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"Secret management"}),t("p",{className:"text-muted-foreground",children:"Secrets (API keys, tokens) are never stored in plaintext:"}),l("ol",{className:"list-inside list-decimal space-y-2 text-muted-foreground",children:[t("li",{children:"User provides secrets through secure UI or API"}),t("li",{children:"Secrets are encrypted using tenant-specific keys"}),t("li",{children:"Encrypted secrets are stored in secure vault (e.g., AWS Secrets Manager)"}),t("li",{children:"IntegrationConnection stores only a reference (secretRef)"}),t("li",{children:"At runtime, secrets are decrypted on-demand and never logged"})]})]}),l("div",{className:"space-y-4",children:[t("h2",{className:"font-bold text-2xl",children:"Best practices"}),l("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[t("li",{children:"Always maintain separate sandbox and production connections"}),t("li",{children:"Use descriptive connection IDs that include tenant and environment"}),t("li",{children:"Monitor health check status and set up alerts for failures"}),t("li",{children:"Rotate secrets regularly and update secretRef accordingly"}),t("li",{children:"Document the purpose and ownership of each connection"}),t("li",{children:"Test connections in sandbox before enabling in production"})]})]}),l("div",{className:"flex items-center gap-4 pt-4",children:[t(ae,{href:"/docs/integrations",className:"btn-ghost",children:"Back to Integrations"}),l(ae,{href:"/docs/architecture/integration-binding",className:"btn-primary",children:["Integration Binding ",t(Le,{size:16})]})]})]})}import oe from"@contractspec/lib.ui-link";import{ChevronRight as Ke}from"lucide-react";import{jsx as e,jsxs as n}from"react/jsx-runtime";function Re(){return n("div",{className:"space-y-8",children:[n("div",{className:"space-y-4",children:[e("h1",{className:"font-bold text-4xl",children:"Stripe"}),e("p",{className:"text-muted-foreground",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."})]}),n("div",{className:"space-y-4",children:[e("h2",{className:"font-bold text-2xl",children:"Setup"}),e("p",{className:"text-muted-foreground",children:"Add your Stripe credentials to your environment variables:"}),e("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:e("pre",{children:`# .env
|
|
3023
700
|
STRIPE_SECRET_KEY=sk_test_...
|
|
3024
701
|
STRIPE_PUBLISHABLE_KEY=pk_test_...
|
|
3025
|
-
STRIPE_WEBHOOK_SECRET=whsec_...`
|
|
3026
|
-
})
|
|
3027
|
-
}),
|
|
3028
|
-
/* @__PURE__ */ jsxs17("p", {
|
|
3029
|
-
className: "text-muted-foreground text-sm",
|
|
3030
|
-
children: [
|
|
3031
|
-
"Get your API keys from the",
|
|
3032
|
-
" ",
|
|
3033
|
-
/* @__PURE__ */ jsx17("a", {
|
|
3034
|
-
href: "https://dashboard.stripe.com/apikeys",
|
|
3035
|
-
target: "_blank",
|
|
3036
|
-
rel: "noopener noreferrer",
|
|
3037
|
-
className: "text-violet-400 hover:text-violet-300",
|
|
3038
|
-
children: "Stripe Dashboard"
|
|
3039
|
-
}),
|
|
3040
|
-
"."
|
|
3041
|
-
]
|
|
3042
|
-
})
|
|
3043
|
-
]
|
|
3044
|
-
}),
|
|
3045
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3046
|
-
className: "space-y-4",
|
|
3047
|
-
children: [
|
|
3048
|
-
/* @__PURE__ */ jsx17("h2", {
|
|
3049
|
-
className: "font-bold text-2xl",
|
|
3050
|
-
children: "Available capabilities"
|
|
3051
|
-
}),
|
|
3052
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3053
|
-
className: "space-y-3",
|
|
3054
|
-
children: [
|
|
3055
|
-
/* @__PURE__ */ jsx17("h3", {
|
|
3056
|
-
className: "font-semibold text-lg",
|
|
3057
|
-
children: "Payment Intents"
|
|
3058
|
-
}),
|
|
3059
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3060
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3061
|
-
children: /* @__PURE__ */ jsx17("pre", {
|
|
3062
|
-
children: `capabilityId: stripe-create-payment-intent
|
|
702
|
+
STRIPE_WEBHOOK_SECRET=whsec_...`})}),n("p",{className:"text-muted-foreground text-sm",children:["Get your API keys from the"," ",e("a",{href:"https://dashboard.stripe.com/apikeys",target:"_blank",rel:"noopener noreferrer",className:"text-violet-400 hover:text-violet-300",children:"Stripe Dashboard"}),"."]})]}),n("div",{className:"space-y-4",children:[e("h2",{className:"font-bold text-2xl",children:"Available capabilities"}),n("div",{className:"space-y-3",children:[e("h3",{className:"font-semibold text-lg",children:"Payment Intents"}),e("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:e("pre",{children:`capabilityId: stripe-create-payment-intent
|
|
3063
703
|
provider:
|
|
3064
704
|
type: stripe
|
|
3065
705
|
operation: createPaymentIntent
|
|
@@ -3084,22 +724,7 @@ outputs:
|
|
|
3084
724
|
clientSecret:
|
|
3085
725
|
type: string
|
|
3086
726
|
status:
|
|
3087
|
-
type: string`
|
|
3088
|
-
})
|
|
3089
|
-
})
|
|
3090
|
-
]
|
|
3091
|
-
}),
|
|
3092
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3093
|
-
className: "space-y-3",
|
|
3094
|
-
children: [
|
|
3095
|
-
/* @__PURE__ */ jsx17("h3", {
|
|
3096
|
-
className: "font-semibold text-lg",
|
|
3097
|
-
children: "Customers"
|
|
3098
|
-
}),
|
|
3099
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3100
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3101
|
-
children: /* @__PURE__ */ jsx17("pre", {
|
|
3102
|
-
children: `capabilityId: stripe-create-customer
|
|
727
|
+
type: string`})})]}),n("div",{className:"space-y-3",children:[e("h3",{className:"font-semibold text-lg",children:"Customers"}),e("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:e("pre",{children:`capabilityId: stripe-create-customer
|
|
3103
728
|
provider:
|
|
3104
729
|
type: stripe
|
|
3105
730
|
operation: createCustomer
|
|
@@ -3118,22 +743,7 @@ outputs:
|
|
|
3118
743
|
customerId:
|
|
3119
744
|
type: string
|
|
3120
745
|
email:
|
|
3121
|
-
type: string`
|
|
3122
|
-
})
|
|
3123
|
-
})
|
|
3124
|
-
]
|
|
3125
|
-
}),
|
|
3126
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3127
|
-
className: "space-y-3",
|
|
3128
|
-
children: [
|
|
3129
|
-
/* @__PURE__ */ jsx17("h3", {
|
|
3130
|
-
className: "font-semibold text-lg",
|
|
3131
|
-
children: "Subscriptions"
|
|
3132
|
-
}),
|
|
3133
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3134
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3135
|
-
children: /* @__PURE__ */ jsx17("pre", {
|
|
3136
|
-
children: `capabilityId: stripe-create-subscription
|
|
746
|
+
type: string`})})]}),n("div",{className:"space-y-3",children:[e("h3",{className:"font-semibold text-lg",children:"Subscriptions"}),e("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:e("pre",{children:`capabilityId: stripe-create-subscription
|
|
3137
747
|
provider:
|
|
3138
748
|
type: stripe
|
|
3139
749
|
operation: createSubscription
|
|
@@ -3153,86 +763,7 @@ outputs:
|
|
|
3153
763
|
status:
|
|
3154
764
|
type: string
|
|
3155
765
|
currentPeriodEnd:
|
|
3156
|
-
type: timestamp`
|
|
3157
|
-
})
|
|
3158
|
-
})
|
|
3159
|
-
]
|
|
3160
|
-
})
|
|
3161
|
-
]
|
|
3162
|
-
}),
|
|
3163
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3164
|
-
className: "space-y-4",
|
|
3165
|
-
children: [
|
|
3166
|
-
/* @__PURE__ */ jsx17("h2", {
|
|
3167
|
-
className: "font-bold text-2xl",
|
|
3168
|
-
children: "Webhooks"
|
|
3169
|
-
}),
|
|
3170
|
-
/* @__PURE__ */ jsx17("p", {
|
|
3171
|
-
className: "text-muted-foreground",
|
|
3172
|
-
children: "ContractSpec automatically handles Stripe webhooks. Configure your webhook endpoint in the Stripe Dashboard:"
|
|
3173
|
-
}),
|
|
3174
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3175
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3176
|
-
children: /* @__PURE__ */ jsx17("pre", {
|
|
3177
|
-
children: `https://your-app.com/api/webhooks/stripe`
|
|
3178
|
-
})
|
|
3179
|
-
}),
|
|
3180
|
-
/* @__PURE__ */ jsx17("p", {
|
|
3181
|
-
className: "text-muted-foreground",
|
|
3182
|
-
children: "Subscribe to these events:"
|
|
3183
|
-
}),
|
|
3184
|
-
/* @__PURE__ */ jsxs17("ul", {
|
|
3185
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3186
|
-
children: [
|
|
3187
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3188
|
-
children: /* @__PURE__ */ jsx17("code", {
|
|
3189
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3190
|
-
children: "payment_intent.succeeded"
|
|
3191
|
-
})
|
|
3192
|
-
}),
|
|
3193
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3194
|
-
children: /* @__PURE__ */ jsx17("code", {
|
|
3195
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3196
|
-
children: "payment_intent.payment_failed"
|
|
3197
|
-
})
|
|
3198
|
-
}),
|
|
3199
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3200
|
-
children: /* @__PURE__ */ jsx17("code", {
|
|
3201
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3202
|
-
children: "customer.subscription.created"
|
|
3203
|
-
})
|
|
3204
|
-
}),
|
|
3205
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3206
|
-
children: /* @__PURE__ */ jsx17("code", {
|
|
3207
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3208
|
-
children: "customer.subscription.updated"
|
|
3209
|
-
})
|
|
3210
|
-
}),
|
|
3211
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3212
|
-
children: /* @__PURE__ */ jsx17("code", {
|
|
3213
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3214
|
-
children: "customer.subscription.deleted"
|
|
3215
|
-
})
|
|
3216
|
-
})
|
|
3217
|
-
]
|
|
3218
|
-
})
|
|
3219
|
-
]
|
|
3220
|
-
}),
|
|
3221
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3222
|
-
className: "space-y-4",
|
|
3223
|
-
children: [
|
|
3224
|
-
/* @__PURE__ */ jsx17("h2", {
|
|
3225
|
-
className: "font-bold text-2xl",
|
|
3226
|
-
children: "Example workflow"
|
|
3227
|
-
}),
|
|
3228
|
-
/* @__PURE__ */ jsx17("p", {
|
|
3229
|
-
className: "text-muted-foreground",
|
|
3230
|
-
children: "Here's a complete payment workflow using Stripe:"
|
|
3231
|
-
}),
|
|
3232
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3233
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3234
|
-
children: /* @__PURE__ */ jsx17("pre", {
|
|
3235
|
-
children: `workflowId: process-payment
|
|
766
|
+
type: timestamp`})})]})]}),n("div",{className:"space-y-4",children:[e("h2",{className:"font-bold text-2xl",children:"Webhooks"}),e("p",{className:"text-muted-foreground",children:"ContractSpec automatically handles Stripe webhooks. Configure your webhook endpoint in the Stripe Dashboard:"}),e("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:e("pre",{children:"https://your-app.com/api/webhooks/stripe"})}),e("p",{className:"text-muted-foreground",children:"Subscribe to these events:"}),n("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[e("li",{children:e("code",{className:"rounded bg-background/50 px-2 py-1",children:"payment_intent.succeeded"})}),e("li",{children:e("code",{className:"rounded bg-background/50 px-2 py-1",children:"payment_intent.payment_failed"})}),e("li",{children:e("code",{className:"rounded bg-background/50 px-2 py-1",children:"customer.subscription.created"})}),e("li",{children:e("code",{className:"rounded bg-background/50 px-2 py-1",children:"customer.subscription.updated"})}),e("li",{children:e("code",{className:"rounded bg-background/50 px-2 py-1",children:"customer.subscription.deleted"})})]})]}),n("div",{className:"space-y-4",children:[e("h2",{className:"font-bold text-2xl",children:"Example workflow"}),e("p",{className:"text-muted-foreground",children:"Here's a complete payment workflow using Stripe:"}),e("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:e("pre",{children:`workflowId: process-payment
|
|
3236
767
|
version: '1.0.0'.0.0
|
|
3237
768
|
|
|
3238
769
|
steps:
|
|
@@ -3268,194 +799,10 @@ steps:
|
|
|
3268
799
|
to: "admin@example.com"
|
|
3269
800
|
template: "payment-error"
|
|
3270
801
|
data:
|
|
3271
|
-
error: \${error.message}`
|
|
3272
|
-
})
|
|
3273
|
-
})
|
|
3274
|
-
]
|
|
3275
|
-
}),
|
|
3276
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3277
|
-
className: "space-y-4",
|
|
3278
|
-
children: [
|
|
3279
|
-
/* @__PURE__ */ jsx17("h2", {
|
|
3280
|
-
className: "font-bold text-2xl",
|
|
3281
|
-
children: "Testing"
|
|
3282
|
-
}),
|
|
3283
|
-
/* @__PURE__ */ jsx17("p", {
|
|
3284
|
-
className: "text-muted-foreground",
|
|
3285
|
-
children: "Use Stripe's test cards for development:"
|
|
3286
|
-
}),
|
|
3287
|
-
/* @__PURE__ */ jsx17("div", {
|
|
3288
|
-
className: "overflow-x-auto rounded-lg border border-border/50",
|
|
3289
|
-
children: /* @__PURE__ */ jsxs17("table", {
|
|
3290
|
-
className: "w-full text-left text-sm",
|
|
3291
|
-
children: [
|
|
3292
|
-
/* @__PURE__ */ jsx17("thead", {
|
|
3293
|
-
className: "bg-card/50",
|
|
3294
|
-
children: /* @__PURE__ */ jsxs17("tr", {
|
|
3295
|
-
className: "border-border/50 border-b",
|
|
3296
|
-
children: [
|
|
3297
|
-
/* @__PURE__ */ jsx17("th", {
|
|
3298
|
-
className: "px-4 py-3 font-semibold",
|
|
3299
|
-
children: "Card Number"
|
|
3300
|
-
}),
|
|
3301
|
-
/* @__PURE__ */ jsx17("th", {
|
|
3302
|
-
className: "px-4 py-3 font-semibold",
|
|
3303
|
-
children: "Scenario"
|
|
3304
|
-
})
|
|
3305
|
-
]
|
|
3306
|
-
})
|
|
3307
|
-
}),
|
|
3308
|
-
/* @__PURE__ */ jsxs17("tbody", {
|
|
3309
|
-
className: "divide-y divide-border/50",
|
|
3310
|
-
children: [
|
|
3311
|
-
/* @__PURE__ */ jsxs17("tr", {
|
|
3312
|
-
children: [
|
|
3313
|
-
/* @__PURE__ */ jsx17("td", {
|
|
3314
|
-
className: "px-4 py-3 font-mono",
|
|
3315
|
-
children: "4242 4242 4242 4242"
|
|
3316
|
-
}),
|
|
3317
|
-
/* @__PURE__ */ jsx17("td", {
|
|
3318
|
-
className: "px-4 py-3",
|
|
3319
|
-
children: "Successful payment"
|
|
3320
|
-
})
|
|
3321
|
-
]
|
|
3322
|
-
}),
|
|
3323
|
-
/* @__PURE__ */ jsxs17("tr", {
|
|
3324
|
-
children: [
|
|
3325
|
-
/* @__PURE__ */ jsx17("td", {
|
|
3326
|
-
className: "px-4 py-3 font-mono",
|
|
3327
|
-
children: "4000 0000 0000 9995"
|
|
3328
|
-
}),
|
|
3329
|
-
/* @__PURE__ */ jsx17("td", {
|
|
3330
|
-
className: "px-4 py-3",
|
|
3331
|
-
children: "Insufficient funds"
|
|
3332
|
-
})
|
|
3333
|
-
]
|
|
3334
|
-
}),
|
|
3335
|
-
/* @__PURE__ */ jsxs17("tr", {
|
|
3336
|
-
children: [
|
|
3337
|
-
/* @__PURE__ */ jsx17("td", {
|
|
3338
|
-
className: "px-4 py-3 font-mono",
|
|
3339
|
-
children: "4000 0000 0000 0002"
|
|
3340
|
-
}),
|
|
3341
|
-
/* @__PURE__ */ jsx17("td", {
|
|
3342
|
-
className: "px-4 py-3",
|
|
3343
|
-
children: "Card declined"
|
|
3344
|
-
})
|
|
3345
|
-
]
|
|
3346
|
-
})
|
|
3347
|
-
]
|
|
3348
|
-
})
|
|
3349
|
-
]
|
|
3350
|
-
})
|
|
3351
|
-
})
|
|
3352
|
-
]
|
|
3353
|
-
}),
|
|
3354
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3355
|
-
className: "space-y-4",
|
|
3356
|
-
children: [
|
|
3357
|
-
/* @__PURE__ */ jsx17("h2", {
|
|
3358
|
-
className: "font-bold text-2xl",
|
|
3359
|
-
children: "Best practices"
|
|
3360
|
-
}),
|
|
3361
|
-
/* @__PURE__ */ jsxs17("ul", {
|
|
3362
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3363
|
-
children: [
|
|
3364
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3365
|
-
children: "Always use test mode during development"
|
|
3366
|
-
}),
|
|
3367
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3368
|
-
children: "Verify webhook signatures to prevent fraud"
|
|
3369
|
-
}),
|
|
3370
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3371
|
-
children: "Handle idempotency for payment operations"
|
|
3372
|
-
}),
|
|
3373
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3374
|
-
children: "Store customer IDs for recurring payments"
|
|
3375
|
-
}),
|
|
3376
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3377
|
-
children: "Use metadata to link Stripe objects to your application records"
|
|
3378
|
-
}),
|
|
3379
|
-
/* @__PURE__ */ jsx17("li", {
|
|
3380
|
-
children: "Monitor failed payments and retry logic"
|
|
3381
|
-
})
|
|
3382
|
-
]
|
|
3383
|
-
})
|
|
3384
|
-
]
|
|
3385
|
-
}),
|
|
3386
|
-
/* @__PURE__ */ jsxs17("div", {
|
|
3387
|
-
className: "flex items-center gap-4 pt-4",
|
|
3388
|
-
children: [
|
|
3389
|
-
/* @__PURE__ */ jsx17(Link16, {
|
|
3390
|
-
href: "/docs/integrations",
|
|
3391
|
-
className: "btn-ghost",
|
|
3392
|
-
children: "Back to Integrations"
|
|
3393
|
-
}),
|
|
3394
|
-
/* @__PURE__ */ jsxs17(Link16, {
|
|
3395
|
-
href: "/docs/integrations/postmark",
|
|
3396
|
-
className: "btn-primary",
|
|
3397
|
-
children: [
|
|
3398
|
-
"Next: Postmark ",
|
|
3399
|
-
/* @__PURE__ */ jsx17(ChevronRight14, {
|
|
3400
|
-
size: 16
|
|
3401
|
-
})
|
|
3402
|
-
]
|
|
3403
|
-
})
|
|
3404
|
-
]
|
|
3405
|
-
})
|
|
3406
|
-
]
|
|
3407
|
-
});
|
|
3408
|
-
}
|
|
3409
|
-
|
|
3410
|
-
// src/components/docs/integrations/IntegrationsTwilioPage.tsx
|
|
3411
|
-
import Link17 from "@contractspec/lib.ui-link";
|
|
3412
|
-
import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
3413
|
-
function IntegrationsTwilioPage() {
|
|
3414
|
-
return /* @__PURE__ */ jsxs18("div", {
|
|
3415
|
-
className: "space-y-8",
|
|
3416
|
-
children: [
|
|
3417
|
-
/* @__PURE__ */ jsxs18("div", {
|
|
3418
|
-
className: "space-y-4",
|
|
3419
|
-
children: [
|
|
3420
|
-
/* @__PURE__ */ jsx18("h1", {
|
|
3421
|
-
className: "font-bold text-4xl",
|
|
3422
|
-
children: "Twilio"
|
|
3423
|
-
}),
|
|
3424
|
-
/* @__PURE__ */ jsx18("p", {
|
|
3425
|
-
className: "text-muted-foreground",
|
|
3426
|
-
children: "Send SMS notifications, alerts, and two-factor authentication codes using Twilio's reliable messaging platform."
|
|
3427
|
-
})
|
|
3428
|
-
]
|
|
3429
|
-
}),
|
|
3430
|
-
/* @__PURE__ */ jsxs18("div", {
|
|
3431
|
-
className: "space-y-4",
|
|
3432
|
-
children: [
|
|
3433
|
-
/* @__PURE__ */ jsx18("h2", {
|
|
3434
|
-
className: "font-bold text-2xl",
|
|
3435
|
-
children: "Setup"
|
|
3436
|
-
}),
|
|
3437
|
-
/* @__PURE__ */ jsx18("div", {
|
|
3438
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3439
|
-
children: /* @__PURE__ */ jsx18("pre", {
|
|
3440
|
-
children: `# .env
|
|
802
|
+
error: \${error.message}`})})]}),n("div",{className:"space-y-4",children:[e("h2",{className:"font-bold text-2xl",children:"Testing"}),e("p",{className:"text-muted-foreground",children:"Use Stripe's test cards for development:"}),e("div",{className:"overflow-x-auto rounded-lg border border-border/50",children:n("table",{className:"w-full text-left text-sm",children:[e("thead",{className:"bg-card/50",children:n("tr",{className:"border-border/50 border-b",children:[e("th",{className:"px-4 py-3 font-semibold",children:"Card Number"}),e("th",{className:"px-4 py-3 font-semibold",children:"Scenario"})]})}),n("tbody",{className:"divide-y divide-border/50",children:[n("tr",{children:[e("td",{className:"px-4 py-3 font-mono",children:"4242 4242 4242 4242"}),e("td",{className:"px-4 py-3",children:"Successful payment"})]}),n("tr",{children:[e("td",{className:"px-4 py-3 font-mono",children:"4000 0000 0000 9995"}),e("td",{className:"px-4 py-3",children:"Insufficient funds"})]}),n("tr",{children:[e("td",{className:"px-4 py-3 font-mono",children:"4000 0000 0000 0002"}),e("td",{className:"px-4 py-3",children:"Card declined"})]})]})]})})]}),n("div",{className:"space-y-4",children:[e("h2",{className:"font-bold text-2xl",children:"Best practices"}),n("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[e("li",{children:"Always use test mode during development"}),e("li",{children:"Verify webhook signatures to prevent fraud"}),e("li",{children:"Handle idempotency for payment operations"}),e("li",{children:"Store customer IDs for recurring payments"}),e("li",{children:"Use metadata to link Stripe objects to your application records"}),e("li",{children:"Monitor failed payments and retry logic"})]})]}),n("div",{className:"flex items-center gap-4 pt-4",children:[e(oe,{href:"/docs/integrations",className:"btn-ghost",children:"Back to Integrations"}),n(oe,{href:"/docs/integrations/postmark",className:"btn-primary",children:["Next: Postmark ",e(Ke,{size:16})]})]})]})}import ie from"@contractspec/lib.ui-link";import{jsx as c,jsxs as C}from"react/jsx-runtime";function De(){return C("div",{className:"space-y-8",children:[C("div",{className:"space-y-4",children:[c("h1",{className:"font-bold text-4xl",children:"Twilio"}),c("p",{className:"text-muted-foreground",children:"Send SMS notifications, alerts, and two-factor authentication codes using Twilio's reliable messaging platform."})]}),C("div",{className:"space-y-4",children:[c("h2",{className:"font-bold text-2xl",children:"Setup"}),c("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:c("pre",{children:`# .env
|
|
3441
803
|
TWILIO_ACCOUNT_SID=...
|
|
3442
804
|
TWILIO_AUTH_TOKEN=...
|
|
3443
|
-
TWILIO_PHONE_NUMBER=+1234567890`
|
|
3444
|
-
})
|
|
3445
|
-
})
|
|
3446
|
-
]
|
|
3447
|
-
}),
|
|
3448
|
-
/* @__PURE__ */ jsxs18("div", {
|
|
3449
|
-
className: "space-y-4",
|
|
3450
|
-
children: [
|
|
3451
|
-
/* @__PURE__ */ jsx18("h2", {
|
|
3452
|
-
className: "font-bold text-2xl",
|
|
3453
|
-
children: "Sending SMS"
|
|
3454
|
-
}),
|
|
3455
|
-
/* @__PURE__ */ jsx18("div", {
|
|
3456
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3457
|
-
children: /* @__PURE__ */ jsx18("pre", {
|
|
3458
|
-
children: `capabilityId: twilio-send-sms
|
|
805
|
+
TWILIO_PHONE_NUMBER=+1234567890`})})]}),C("div",{className:"space-y-4",children:[c("h2",{className:"font-bold text-2xl",children:"Sending SMS"}),c("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:c("pre",{children:`capabilityId: twilio-send-sms
|
|
3459
806
|
provider:
|
|
3460
807
|
type: twilio
|
|
3461
808
|
operation: sendSMS
|
|
@@ -3472,117 +819,7 @@ outputs:
|
|
|
3472
819
|
messageSid:
|
|
3473
820
|
type: string
|
|
3474
821
|
status:
|
|
3475
|
-
type: string`
|
|
3476
|
-
})
|
|
3477
|
-
})
|
|
3478
|
-
]
|
|
3479
|
-
}),
|
|
3480
|
-
/* @__PURE__ */ jsxs18("div", {
|
|
3481
|
-
className: "space-y-4",
|
|
3482
|
-
children: [
|
|
3483
|
-
/* @__PURE__ */ jsx18("h2", {
|
|
3484
|
-
className: "font-bold text-2xl",
|
|
3485
|
-
children: "Use cases"
|
|
3486
|
-
}),
|
|
3487
|
-
/* @__PURE__ */ jsxs18("ul", {
|
|
3488
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3489
|
-
children: [
|
|
3490
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3491
|
-
children: "Order confirmations and shipping updates"
|
|
3492
|
-
}),
|
|
3493
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3494
|
-
children: "Two-factor authentication codes"
|
|
3495
|
-
}),
|
|
3496
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3497
|
-
children: "Appointment reminders"
|
|
3498
|
-
}),
|
|
3499
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3500
|
-
children: "Alert notifications"
|
|
3501
|
-
})
|
|
3502
|
-
]
|
|
3503
|
-
})
|
|
3504
|
-
]
|
|
3505
|
-
}),
|
|
3506
|
-
/* @__PURE__ */ jsxs18("div", {
|
|
3507
|
-
className: "space-y-4",
|
|
3508
|
-
children: [
|
|
3509
|
-
/* @__PURE__ */ jsx18("h2", {
|
|
3510
|
-
className: "font-bold text-2xl",
|
|
3511
|
-
children: "Best practices"
|
|
3512
|
-
}),
|
|
3513
|
-
/* @__PURE__ */ jsxs18("ul", {
|
|
3514
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3515
|
-
children: [
|
|
3516
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3517
|
-
children: "Always use E.164 format for phone numbers (+1234567890)"
|
|
3518
|
-
}),
|
|
3519
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3520
|
-
children: "Keep messages under 160 characters to avoid splitting"
|
|
3521
|
-
}),
|
|
3522
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3523
|
-
children: "Implement rate limiting to prevent spam"
|
|
3524
|
-
}),
|
|
3525
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3526
|
-
children: "Handle delivery failures gracefully"
|
|
3527
|
-
}),
|
|
3528
|
-
/* @__PURE__ */ jsx18("li", {
|
|
3529
|
-
children: "Respect opt-out requests"
|
|
3530
|
-
})
|
|
3531
|
-
]
|
|
3532
|
-
})
|
|
3533
|
-
]
|
|
3534
|
-
}),
|
|
3535
|
-
/* @__PURE__ */ jsxs18("div", {
|
|
3536
|
-
className: "flex items-center gap-4 pt-4",
|
|
3537
|
-
children: [
|
|
3538
|
-
/* @__PURE__ */ jsx18(Link17, {
|
|
3539
|
-
href: "/docs/integrations/s3",
|
|
3540
|
-
className: "btn-ghost",
|
|
3541
|
-
children: "Previous: S3 Storage"
|
|
3542
|
-
}),
|
|
3543
|
-
/* @__PURE__ */ jsx18(Link17, {
|
|
3544
|
-
href: "/docs/integrations/slack",
|
|
3545
|
-
className: "btn-primary",
|
|
3546
|
-
children: "Next: Slack Messaging"
|
|
3547
|
-
})
|
|
3548
|
-
]
|
|
3549
|
-
})
|
|
3550
|
-
]
|
|
3551
|
-
});
|
|
3552
|
-
}
|
|
3553
|
-
|
|
3554
|
-
// src/components/docs/integrations/IntegrationsWhatsappMetaPage.tsx
|
|
3555
|
-
import Link18 from "@contractspec/lib.ui-link";
|
|
3556
|
-
import { ChevronRight as ChevronRight15 } from "lucide-react";
|
|
3557
|
-
import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
3558
|
-
function IntegrationsWhatsappMetaPage() {
|
|
3559
|
-
return /* @__PURE__ */ jsxs19("div", {
|
|
3560
|
-
className: "space-y-8",
|
|
3561
|
-
children: [
|
|
3562
|
-
/* @__PURE__ */ jsxs19("div", {
|
|
3563
|
-
className: "space-y-4",
|
|
3564
|
-
children: [
|
|
3565
|
-
/* @__PURE__ */ jsx19("h1", {
|
|
3566
|
-
className: "font-bold text-4xl",
|
|
3567
|
-
children: "WhatsApp Meta"
|
|
3568
|
-
}),
|
|
3569
|
-
/* @__PURE__ */ jsx19("p", {
|
|
3570
|
-
className: "text-muted-foreground",
|
|
3571
|
-
children: "Meta WhatsApp is the primary WhatsApp channel for ContractSpec's messaging runtime, with signed webhook verification and reliable outbound delivery."
|
|
3572
|
-
})
|
|
3573
|
-
]
|
|
3574
|
-
}),
|
|
3575
|
-
/* @__PURE__ */ jsxs19("div", {
|
|
3576
|
-
className: "space-y-4",
|
|
3577
|
-
children: [
|
|
3578
|
-
/* @__PURE__ */ jsx19("h2", {
|
|
3579
|
-
className: "font-bold text-2xl",
|
|
3580
|
-
children: "Required secrets and config"
|
|
3581
|
-
}),
|
|
3582
|
-
/* @__PURE__ */ jsx19("div", {
|
|
3583
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3584
|
-
children: /* @__PURE__ */ jsx19("pre", {
|
|
3585
|
-
children: `// secret payload
|
|
822
|
+
type: string`})})]}),C("div",{className:"space-y-4",children:[c("h2",{className:"font-bold text-2xl",children:"Use cases"}),C("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[c("li",{children:"Order confirmations and shipping updates"}),c("li",{children:"Two-factor authentication codes"}),c("li",{children:"Appointment reminders"}),c("li",{children:"Alert notifications"})]})]}),C("div",{className:"space-y-4",children:[c("h2",{className:"font-bold text-2xl",children:"Best practices"}),C("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[c("li",{children:"Always use E.164 format for phone numbers (+1234567890)"}),c("li",{children:"Keep messages under 160 characters to avoid splitting"}),c("li",{children:"Implement rate limiting to prevent spam"}),c("li",{children:"Handle delivery failures gracefully"}),c("li",{children:"Respect opt-out requests"})]})]}),C("div",{className:"flex items-center gap-4 pt-4",children:[c(ie,{href:"/docs/integrations/s3",className:"btn-ghost",children:"Previous: S3 Storage"}),c(ie,{href:"/docs/integrations/slack",className:"btn-primary",children:"Next: Slack Messaging"})]})]})}import re from"@contractspec/lib.ui-link";import{ChevronRight as se}from"lucide-react";import{jsx as f,jsxs as T}from"react/jsx-runtime";function qe(){return T("div",{className:"space-y-8",children:[T("div",{className:"space-y-4",children:[f("h1",{className:"font-bold text-4xl",children:"WhatsApp Meta"}),f("p",{className:"text-muted-foreground",children:"Meta WhatsApp is the primary WhatsApp channel for ContractSpec's messaging runtime, with signed webhook verification and reliable outbound delivery."})]}),T("div",{className:"space-y-4",children:[f("h2",{className:"font-bold text-2xl",children:"Required secrets and config"}),f("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:f("pre",{children:`// secret payload
|
|
3586
823
|
{
|
|
3587
824
|
"accessToken": "...",
|
|
3588
825
|
"appSecret": "...",
|
|
@@ -3593,150 +830,7 @@ function IntegrationsWhatsappMetaPage() {
|
|
|
3593
830
|
{
|
|
3594
831
|
"phoneNumberId": "120000000001",
|
|
3595
832
|
"apiVersion": "v22.0"
|
|
3596
|
-
}`
|
|
3597
|
-
})
|
|
3598
|
-
})
|
|
3599
|
-
]
|
|
3600
|
-
}),
|
|
3601
|
-
/* @__PURE__ */ jsxs19("div", {
|
|
3602
|
-
className: "space-y-4",
|
|
3603
|
-
children: [
|
|
3604
|
-
/* @__PURE__ */ jsx19("h2", {
|
|
3605
|
-
className: "font-bold text-2xl",
|
|
3606
|
-
children: "Webhook endpoints"
|
|
3607
|
-
}),
|
|
3608
|
-
/* @__PURE__ */ jsxs19("ul", {
|
|
3609
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3610
|
-
children: [
|
|
3611
|
-
/* @__PURE__ */ jsxs19("li", {
|
|
3612
|
-
children: [
|
|
3613
|
-
"Verification challenge:",
|
|
3614
|
-
" ",
|
|
3615
|
-
/* @__PURE__ */ jsx19("code", {
|
|
3616
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3617
|
-
children: "GET /webhooks/whatsapp/meta"
|
|
3618
|
-
})
|
|
3619
|
-
]
|
|
3620
|
-
}),
|
|
3621
|
-
/* @__PURE__ */ jsxs19("li", {
|
|
3622
|
-
children: [
|
|
3623
|
-
"Inbound messages:",
|
|
3624
|
-
" ",
|
|
3625
|
-
/* @__PURE__ */ jsx19("code", {
|
|
3626
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3627
|
-
children: "POST /webhooks/whatsapp/meta"
|
|
3628
|
-
})
|
|
3629
|
-
]
|
|
3630
|
-
}),
|
|
3631
|
-
/* @__PURE__ */ jsxs19("li", {
|
|
3632
|
-
children: [
|
|
3633
|
-
"Signatures are validated with",
|
|
3634
|
-
" ",
|
|
3635
|
-
/* @__PURE__ */ jsx19("code", {
|
|
3636
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3637
|
-
children: "x-hub-signature-256"
|
|
3638
|
-
}),
|
|
3639
|
-
"."
|
|
3640
|
-
]
|
|
3641
|
-
})
|
|
3642
|
-
]
|
|
3643
|
-
})
|
|
3644
|
-
]
|
|
3645
|
-
}),
|
|
3646
|
-
/* @__PURE__ */ jsxs19("div", {
|
|
3647
|
-
className: "space-y-4",
|
|
3648
|
-
children: [
|
|
3649
|
-
/* @__PURE__ */ jsx19("h2", {
|
|
3650
|
-
className: "font-bold text-2xl",
|
|
3651
|
-
children: "Workspace mapping"
|
|
3652
|
-
}),
|
|
3653
|
-
/* @__PURE__ */ jsx19("div", {
|
|
3654
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3655
|
-
children: /* @__PURE__ */ jsx19("pre", {
|
|
3656
|
-
children: `CHANNEL_WORKSPACE_MAP_WHATSAPP_META={"120000000001":"workspace-acme"}`
|
|
3657
|
-
})
|
|
3658
|
-
})
|
|
3659
|
-
]
|
|
3660
|
-
}),
|
|
3661
|
-
/* @__PURE__ */ jsxs19("div", {
|
|
3662
|
-
className: "space-y-4",
|
|
3663
|
-
children: [
|
|
3664
|
-
/* @__PURE__ */ jsx19("h2", {
|
|
3665
|
-
className: "font-bold text-2xl",
|
|
3666
|
-
children: "Best practices"
|
|
3667
|
-
}),
|
|
3668
|
-
/* @__PURE__ */ jsxs19("ul", {
|
|
3669
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3670
|
-
children: [
|
|
3671
|
-
/* @__PURE__ */ jsx19("li", {
|
|
3672
|
-
children: "Keep verify and app secrets separate from access tokens."
|
|
3673
|
-
}),
|
|
3674
|
-
/* @__PURE__ */ jsx19("li", {
|
|
3675
|
-
children: "Map each phone number ID to a workspace for strict tenant routing."
|
|
3676
|
-
}),
|
|
3677
|
-
/* @__PURE__ */ jsx19("li", {
|
|
3678
|
-
children: "Use Twilio WhatsApp only as fallback when you need active-passive routing."
|
|
3679
|
-
})
|
|
3680
|
-
]
|
|
3681
|
-
})
|
|
3682
|
-
]
|
|
3683
|
-
}),
|
|
3684
|
-
/* @__PURE__ */ jsxs19("div", {
|
|
3685
|
-
className: "flex items-center gap-4 pt-4",
|
|
3686
|
-
children: [
|
|
3687
|
-
/* @__PURE__ */ jsx19(Link18, {
|
|
3688
|
-
href: "/docs/integrations/github",
|
|
3689
|
-
className: "btn-ghost",
|
|
3690
|
-
children: "Previous: GitHub Messaging"
|
|
3691
|
-
}),
|
|
3692
|
-
/* @__PURE__ */ jsxs19(Link18, {
|
|
3693
|
-
href: "/docs/integrations/whatsapp-twilio",
|
|
3694
|
-
className: "btn-primary",
|
|
3695
|
-
children: [
|
|
3696
|
-
"Next: WhatsApp Twilio ",
|
|
3697
|
-
/* @__PURE__ */ jsx19(ChevronRight15, {
|
|
3698
|
-
size: 16
|
|
3699
|
-
})
|
|
3700
|
-
]
|
|
3701
|
-
})
|
|
3702
|
-
]
|
|
3703
|
-
})
|
|
3704
|
-
]
|
|
3705
|
-
});
|
|
3706
|
-
}
|
|
3707
|
-
|
|
3708
|
-
// src/components/docs/integrations/IntegrationsWhatsappTwilioPage.tsx
|
|
3709
|
-
import Link19 from "@contractspec/lib.ui-link";
|
|
3710
|
-
import { ChevronRight as ChevronRight16 } from "lucide-react";
|
|
3711
|
-
import { jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
3712
|
-
function IntegrationsWhatsappTwilioPage() {
|
|
3713
|
-
return /* @__PURE__ */ jsxs20("div", {
|
|
3714
|
-
className: "space-y-8",
|
|
3715
|
-
children: [
|
|
3716
|
-
/* @__PURE__ */ jsxs20("div", {
|
|
3717
|
-
className: "space-y-4",
|
|
3718
|
-
children: [
|
|
3719
|
-
/* @__PURE__ */ jsx20("h1", {
|
|
3720
|
-
className: "font-bold text-4xl",
|
|
3721
|
-
children: "WhatsApp Twilio"
|
|
3722
|
-
}),
|
|
3723
|
-
/* @__PURE__ */ jsx20("p", {
|
|
3724
|
-
className: "text-muted-foreground",
|
|
3725
|
-
children: "Twilio WhatsApp support provides a durable fallback channel with signature verification and outbox-backed outbound dispatch."
|
|
3726
|
-
})
|
|
3727
|
-
]
|
|
3728
|
-
}),
|
|
3729
|
-
/* @__PURE__ */ jsxs20("div", {
|
|
3730
|
-
className: "space-y-4",
|
|
3731
|
-
children: [
|
|
3732
|
-
/* @__PURE__ */ jsx20("h2", {
|
|
3733
|
-
className: "font-bold text-2xl",
|
|
3734
|
-
children: "Required secrets and config"
|
|
3735
|
-
}),
|
|
3736
|
-
/* @__PURE__ */ jsx20("div", {
|
|
3737
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3738
|
-
children: /* @__PURE__ */ jsx20("pre", {
|
|
3739
|
-
children: `// secret payload
|
|
833
|
+
}`})})]}),T("div",{className:"space-y-4",children:[f("h2",{className:"font-bold text-2xl",children:"Webhook endpoints"}),T("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[T("li",{children:["Verification challenge:"," ",f("code",{className:"rounded bg-background/50 px-2 py-1",children:"GET /webhooks/whatsapp/meta"})]}),T("li",{children:["Inbound messages:"," ",f("code",{className:"rounded bg-background/50 px-2 py-1",children:"POST /webhooks/whatsapp/meta"})]}),T("li",{children:["Signatures are validated with"," ",f("code",{className:"rounded bg-background/50 px-2 py-1",children:"x-hub-signature-256"}),"."]})]})]}),T("div",{className:"space-y-4",children:[f("h2",{className:"font-bold text-2xl",children:"Workspace mapping"}),f("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:f("pre",{children:'CHANNEL_WORKSPACE_MAP_WHATSAPP_META={"120000000001":"workspace-acme"}'})})]}),T("div",{className:"space-y-4",children:[f("h2",{className:"font-bold text-2xl",children:"Best practices"}),T("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[f("li",{children:"Keep verify and app secrets separate from access tokens."}),f("li",{children:"Map each phone number ID to a workspace for strict tenant routing."}),f("li",{children:"Use Twilio WhatsApp only as fallback when you need active-passive routing."})]})]}),T("div",{className:"flex items-center gap-4 pt-4",children:[f(re,{href:"/docs/integrations/github",className:"btn-ghost",children:"Previous: GitHub Messaging"}),T(re,{href:"/docs/integrations/whatsapp-twilio",className:"btn-primary",children:["Next: WhatsApp Twilio ",f(se,{size:16})]})]})]})}import de from"@contractspec/lib.ui-link";import{ChevronRight as ze}from"lucide-react";import{jsx as h,jsxs as A}from"react/jsx-runtime";function Ge(){return A("div",{className:"space-y-8",children:[A("div",{className:"space-y-4",children:[h("h1",{className:"font-bold text-4xl",children:"WhatsApp Twilio"}),h("p",{className:"text-muted-foreground",children:"Twilio WhatsApp support provides a durable fallback channel with signature verification and outbox-backed outbound dispatch."})]}),A("div",{className:"space-y-4",children:[h("h2",{className:"font-bold text-2xl",children:"Required secrets and config"}),h("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:h("pre",{children:`// secret payload
|
|
3740
834
|
{
|
|
3741
835
|
"accountSid": "AC123",
|
|
3742
836
|
"authToken": "..."
|
|
@@ -3745,146 +839,4 @@ function IntegrationsWhatsappTwilioPage() {
|
|
|
3745
839
|
// optional connection config
|
|
3746
840
|
{
|
|
3747
841
|
"fromNumber": "whatsapp:+15550002"
|
|
3748
|
-
}`
|
|
3749
|
-
})
|
|
3750
|
-
})
|
|
3751
|
-
]
|
|
3752
|
-
}),
|
|
3753
|
-
/* @__PURE__ */ jsxs20("div", {
|
|
3754
|
-
className: "space-y-4",
|
|
3755
|
-
children: [
|
|
3756
|
-
/* @__PURE__ */ jsx20("h2", {
|
|
3757
|
-
className: "font-bold text-2xl",
|
|
3758
|
-
children: "Webhook ingress"
|
|
3759
|
-
}),
|
|
3760
|
-
/* @__PURE__ */ jsxs20("ul", {
|
|
3761
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3762
|
-
children: [
|
|
3763
|
-
/* @__PURE__ */ jsxs20("li", {
|
|
3764
|
-
children: [
|
|
3765
|
-
"Inbound Twilio form payloads are accepted on",
|
|
3766
|
-
" ",
|
|
3767
|
-
/* @__PURE__ */ jsx20("code", {
|
|
3768
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3769
|
-
children: "/webhooks/whatsapp/twilio"
|
|
3770
|
-
}),
|
|
3771
|
-
"."
|
|
3772
|
-
]
|
|
3773
|
-
}),
|
|
3774
|
-
/* @__PURE__ */ jsxs20("li", {
|
|
3775
|
-
children: [
|
|
3776
|
-
"Signatures are validated with",
|
|
3777
|
-
" ",
|
|
3778
|
-
/* @__PURE__ */ jsx20("code", {
|
|
3779
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3780
|
-
children: "x-twilio-signature"
|
|
3781
|
-
}),
|
|
3782
|
-
" ",
|
|
3783
|
-
"and the configured auth token."
|
|
3784
|
-
]
|
|
3785
|
-
}),
|
|
3786
|
-
/* @__PURE__ */ jsxs20("li", {
|
|
3787
|
-
children: [
|
|
3788
|
-
"For deterministic verification, set the exact public webhook URL in",
|
|
3789
|
-
" ",
|
|
3790
|
-
/* @__PURE__ */ jsx20("code", {
|
|
3791
|
-
className: "rounded bg-background/50 px-2 py-1",
|
|
3792
|
-
children: "WHATSAPP_TWILIO_WEBHOOK_URL"
|
|
3793
|
-
}),
|
|
3794
|
-
"."
|
|
3795
|
-
]
|
|
3796
|
-
})
|
|
3797
|
-
]
|
|
3798
|
-
})
|
|
3799
|
-
]
|
|
3800
|
-
}),
|
|
3801
|
-
/* @__PURE__ */ jsxs20("div", {
|
|
3802
|
-
className: "space-y-4",
|
|
3803
|
-
children: [
|
|
3804
|
-
/* @__PURE__ */ jsx20("h2", {
|
|
3805
|
-
className: "font-bold text-2xl",
|
|
3806
|
-
children: "Workspace mapping"
|
|
3807
|
-
}),
|
|
3808
|
-
/* @__PURE__ */ jsx20("div", {
|
|
3809
|
-
className: "overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",
|
|
3810
|
-
children: /* @__PURE__ */ jsx20("pre", {
|
|
3811
|
-
children: `CHANNEL_WORKSPACE_MAP_WHATSAPP_TWILIO={"AC123":"workspace-acme"}`
|
|
3812
|
-
})
|
|
3813
|
-
})
|
|
3814
|
-
]
|
|
3815
|
-
}),
|
|
3816
|
-
/* @__PURE__ */ jsxs20("div", {
|
|
3817
|
-
className: "space-y-4",
|
|
3818
|
-
children: [
|
|
3819
|
-
/* @__PURE__ */ jsx20("h2", {
|
|
3820
|
-
className: "font-bold text-2xl",
|
|
3821
|
-
children: "Best practices"
|
|
3822
|
-
}),
|
|
3823
|
-
/* @__PURE__ */ jsxs20("ul", {
|
|
3824
|
-
className: "list-inside list-disc space-y-2 text-muted-foreground",
|
|
3825
|
-
children: [
|
|
3826
|
-
/* @__PURE__ */ jsx20("li", {
|
|
3827
|
-
children: "Use Twilio as fallback when Meta WhatsApp is your primary route."
|
|
3828
|
-
}),
|
|
3829
|
-
/* @__PURE__ */ jsx20("li", {
|
|
3830
|
-
children: "Keep account SID mapping explicit to avoid tenant misrouting."
|
|
3831
|
-
}),
|
|
3832
|
-
/* @__PURE__ */ jsxs20("li", {
|
|
3833
|
-
children: [
|
|
3834
|
-
"Protect internal dispatch endpoints with",
|
|
3835
|
-
/* @__PURE__ */ jsx20("code", {
|
|
3836
|
-
className: "ml-1 rounded bg-background/50 px-2 py-1",
|
|
3837
|
-
children: "CHANNEL_DISPATCH_TOKEN"
|
|
3838
|
-
}),
|
|
3839
|
-
"."
|
|
3840
|
-
]
|
|
3841
|
-
})
|
|
3842
|
-
]
|
|
3843
|
-
})
|
|
3844
|
-
]
|
|
3845
|
-
}),
|
|
3846
|
-
/* @__PURE__ */ jsxs20("div", {
|
|
3847
|
-
className: "flex items-center gap-4 pt-4",
|
|
3848
|
-
children: [
|
|
3849
|
-
/* @__PURE__ */ jsx20(Link19, {
|
|
3850
|
-
href: "/docs/integrations/whatsapp-meta",
|
|
3851
|
-
className: "btn-ghost",
|
|
3852
|
-
children: "Previous: WhatsApp Meta"
|
|
3853
|
-
}),
|
|
3854
|
-
/* @__PURE__ */ jsxs20(Link19, {
|
|
3855
|
-
href: "/docs/integrations/health-routing",
|
|
3856
|
-
className: "btn-primary",
|
|
3857
|
-
children: [
|
|
3858
|
-
"Next: Health Routing ",
|
|
3859
|
-
/* @__PURE__ */ jsx20(ChevronRight16, {
|
|
3860
|
-
size: 16
|
|
3861
|
-
})
|
|
3862
|
-
]
|
|
3863
|
-
})
|
|
3864
|
-
]
|
|
3865
|
-
})
|
|
3866
|
-
]
|
|
3867
|
-
});
|
|
3868
|
-
}
|
|
3869
|
-
export {
|
|
3870
|
-
IntegrationsWhatsappTwilioPage,
|
|
3871
|
-
IntegrationsWhatsappMetaPage,
|
|
3872
|
-
IntegrationsTwilioPage,
|
|
3873
|
-
IntegrationsStripePage,
|
|
3874
|
-
IntegrationsSpecModelPage,
|
|
3875
|
-
IntegrationsSlackPage,
|
|
3876
|
-
IntegrationsS3Page,
|
|
3877
|
-
IntegrationsResendPage,
|
|
3878
|
-
IntegrationsQdrantPage,
|
|
3879
|
-
IntegrationsPowensPage,
|
|
3880
|
-
IntegrationsPostmarkPage,
|
|
3881
|
-
IntegrationsOverviewPage,
|
|
3882
|
-
IntegrationsOpenAIPage,
|
|
3883
|
-
IntegrationsMistralPage,
|
|
3884
|
-
IntegrationsHealthRoutingPage,
|
|
3885
|
-
IntegrationsGoogleCalendarPage,
|
|
3886
|
-
IntegrationsGmailPage,
|
|
3887
|
-
IntegrationsGithubPage,
|
|
3888
|
-
IntegrationsElevenLabsPage,
|
|
3889
|
-
IntegrationsCircuitBreakersPage
|
|
3890
|
-
};
|
|
842
|
+
}`})})]}),A("div",{className:"space-y-4",children:[h("h2",{className:"font-bold text-2xl",children:"Webhook ingress"}),A("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[A("li",{children:["Inbound Twilio form payloads are accepted on"," ",h("code",{className:"rounded bg-background/50 px-2 py-1",children:"/webhooks/whatsapp/twilio"}),"."]}),A("li",{children:["Signatures are validated with"," ",h("code",{className:"rounded bg-background/50 px-2 py-1",children:"x-twilio-signature"})," ","and the configured auth token."]}),A("li",{children:["For deterministic verification, set the exact public webhook URL in"," ",h("code",{className:"rounded bg-background/50 px-2 py-1",children:"WHATSAPP_TWILIO_WEBHOOK_URL"}),"."]})]})]}),A("div",{className:"space-y-4",children:[h("h2",{className:"font-bold text-2xl",children:"Workspace mapping"}),h("div",{className:"overflow-x-auto rounded-lg border border-border bg-background/50 p-4 font-mono text-muted-foreground text-sm",children:h("pre",{children:'CHANNEL_WORKSPACE_MAP_WHATSAPP_TWILIO={"AC123":"workspace-acme"}'})})]}),A("div",{className:"space-y-4",children:[h("h2",{className:"font-bold text-2xl",children:"Best practices"}),A("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[h("li",{children:"Use Twilio as fallback when Meta WhatsApp is your primary route."}),h("li",{children:"Keep account SID mapping explicit to avoid tenant misrouting."}),A("li",{children:["Protect internal dispatch endpoints with",h("code",{className:"ml-1 rounded bg-background/50 px-2 py-1",children:"CHANNEL_DISPATCH_TOKEN"}),"."]})]})]}),A("div",{className:"flex items-center gap-4 pt-4",children:[h(de,{href:"/docs/integrations/whatsapp-meta",className:"btn-ghost",children:"Previous: WhatsApp Meta"}),A(de,{href:"/docs/integrations/health-routing",className:"btn-primary",children:["Next: Health Routing ",h(ze,{size:16})]})]})]})}export{Ge as IntegrationsWhatsappTwilioPage,qe as IntegrationsWhatsappMetaPage,De as IntegrationsTwilioPage,Re as IntegrationsStripePage,Be as IntegrationsSpecModelPage,Oe as IntegrationsSlackPage,Ce as IntegrationsS3Page,Ee as IntegrationsResendPage,Me as IntegrationsQdrantPage,We as IntegrationsPowensPage,Ie as IntegrationsPostmarkPage,Ae as IntegrationsOverviewPage,ke as IntegrationsOpenAIPage,Ne as IntegrationsMistralPage,be as IntegrationsHealthRoutingPage,he as IntegrationsGoogleCalendarPage,ge as IntegrationsGmailPage,me as IntegrationsGithubPage,ce as IntegrationsElevenLabsPage,le as IntegrationsCircuitBreakersPage};
|