@contractspec/bundle.library 3.9.0 → 3.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (724) hide show
  1. package/.turbo/turbo-build.log +612 -608
  2. package/CHANGELOG.md +89 -0
  3. package/README.md +2 -1
  4. package/dist/__tests__/mocks/prisma.d.ts +5 -5
  5. package/dist/application/context-storage/index.js +1 -1
  6. package/dist/application/index.js +6 -6
  7. package/dist/application/mcp/cliMcp.js +2 -2
  8. package/dist/application/mcp/cliMcp.onboarding.js +1 -1
  9. package/dist/application/mcp/common.js +1 -1
  10. package/dist/application/mcp/contractsMcp.js +2 -2
  11. package/dist/application/mcp/contractsMcpAdoptionTools.js +1 -1
  12. package/dist/application/mcp/contractsMcpResources.js +2 -2
  13. package/dist/application/mcp/contractsMcpTools.js +1 -1
  14. package/dist/application/mcp/docsMcp.catalog.js +2 -2
  15. package/dist/application/mcp/docsMcp.data.js +1 -1
  16. package/dist/application/mcp/docsMcp.js +3 -3
  17. package/dist/application/mcp/docsMcp.prompts.js +3 -3
  18. package/dist/application/mcp/docsMcp.reference.js +2 -2
  19. package/dist/application/mcp/docsMcp.resources.js +2 -2
  20. package/dist/application/mcp/docsMcp.tools.js +2 -2
  21. package/dist/application/mcp/index.js +6 -6
  22. package/dist/application/mcp/internalMcp.js +2 -2
  23. package/dist/application/mcp/normalizeMcpRequest.js +1 -1
  24. package/dist/application/mcp/providerRankingMcp.js +1 -1
  25. package/dist/bundles/LibraryBundle.d.ts +19 -111
  26. package/dist/bundles/LibraryBundle.js +1 -1
  27. package/dist/bundles/index.js +1 -1
  28. package/dist/components/docs/DocsIndexPage.js +2 -2
  29. package/dist/components/docs/advanced/AdvancedMCPPage.js +3 -3
  30. package/dist/components/docs/advanced/AdvancedOverlayEditorPage.js +1 -1
  31. package/dist/components/docs/advanced/AdvancedRenderersPage.js +2 -2
  32. package/dist/components/docs/advanced/AdvancedSpecExperimentsPage.js +4 -4
  33. package/dist/components/docs/advanced/AdvancedTelemetryPage.js +2 -2
  34. package/dist/components/docs/advanced/AdvancedWorkflowMonitoringPage.js +2 -2
  35. package/dist/components/docs/advanced/index.js +9 -9
  36. package/dist/components/docs/architecture/ArchitectureAppConfigPage.js +6 -6
  37. package/dist/components/docs/architecture/ArchitectureControlPlanePage.js +3 -3
  38. package/dist/components/docs/architecture/ArchitectureIntegrationBindingPage.js +7 -7
  39. package/dist/components/docs/architecture/ArchitectureKnowledgeBindingPage.js +6 -6
  40. package/dist/components/docs/architecture/ArchitectureMultiTenancyPage.js +2 -2
  41. package/dist/components/docs/architecture/ArchitectureOverviewPage.js +1 -1
  42. package/dist/components/docs/architecture/index.js +20 -20
  43. package/dist/components/docs/comparison/ComparisonAutomationPlatformsPage.js +1 -1
  44. package/dist/components/docs/comparison/ComparisonEnterprisePlatformsPage.js +1 -1
  45. package/dist/components/docs/comparison/ComparisonInternalToolBuildersPage.js +1 -1
  46. package/dist/components/docs/comparison/ComparisonOverviewPage.js +1 -1
  47. package/dist/components/docs/comparison/ComparisonWindmillPage.js +1 -1
  48. package/dist/components/docs/comparison/ComparisonWorkflowEnginesPage.js +1 -1
  49. package/dist/components/docs/comparison/index.js +1 -1
  50. package/dist/components/docs/docsManifest.js +1 -1
  51. package/dist/components/docs/ecosystem/IntegrationsPage.js +2 -2
  52. package/dist/components/docs/ecosystem/PluginsPage.js +4 -4
  53. package/dist/components/docs/ecosystem/RegistryPage.js +4 -4
  54. package/dist/components/docs/ecosystem/TemplatesPage.js +3 -3
  55. package/dist/components/docs/ecosystem/index.js +11 -11
  56. package/dist/components/docs/examples/DocsExamplesPage.js +1 -1
  57. package/dist/components/docs/examples/ExampleShowcasePage.js +2 -2
  58. package/dist/components/docs/examples/exampleShowcaseData.js +2 -2
  59. package/dist/components/docs/examples/index.js +2 -2
  60. package/dist/components/docs/generated/docs-index.generated.js +1 -1
  61. package/dist/components/docs/generated/index.d.ts +7 -1
  62. package/dist/components/docs/generated/index.js +1 -1
  63. package/dist/components/docs/generated/loader.js +1 -1
  64. package/dist/components/docs/getting-started/CLIPage.js +4 -4
  65. package/dist/components/docs/getting-started/CompatibilityPage.js +1 -1
  66. package/dist/components/docs/getting-started/DataViewTutorialPage.js +4 -4
  67. package/dist/components/docs/getting-started/DeveloperToolsPage.js +1 -1
  68. package/dist/components/docs/getting-started/HelloWorldPage.js +5 -5
  69. package/dist/components/docs/getting-started/InstallationPage.js +3 -3
  70. package/dist/components/docs/getting-started/StartHerePage.js +3 -3
  71. package/dist/components/docs/getting-started/TroubleshootingPage.js +2 -2
  72. package/dist/components/docs/getting-started/VSCodeExtensionPage.js +1 -1
  73. package/dist/components/docs/getting-started/getting-started.docblocks.js +2 -2
  74. package/dist/components/docs/getting-started/index.js +17 -17
  75. package/dist/components/docs/guides/GuideCIDiffGatingPage.js +2 -2
  76. package/dist/components/docs/guides/GuideConnectInRepoPage.js +6 -6
  77. package/dist/components/docs/guides/GuideContractTypesPage.js +6 -6
  78. package/dist/components/docs/guides/GuideDocsPipelinePage.js +3 -3
  79. package/dist/components/docs/guides/GuideFirstModuleBundlePage.js +4 -4
  80. package/dist/components/docs/guides/GuideGenerateDocsClientsSchemasPage.js +2 -2
  81. package/dist/components/docs/guides/GuideHostBuilderWorkbenchPage.js +7 -7
  82. package/dist/components/docs/guides/GuideImportExistingCodebasesPage.js +8 -8
  83. package/dist/components/docs/guides/GuideNextjsOneEndpointPage.js +6 -6
  84. package/dist/components/docs/guides/GuideReleaseCapsulesPage.js +3 -3
  85. package/dist/components/docs/guides/GuideSpecValidationTypingPage.js +4 -4
  86. package/dist/components/docs/guides/GuidesIndexPage.js +2 -2
  87. package/dist/components/docs/guides/index.js +43 -43
  88. package/dist/components/docs/index.js +375 -255
  89. package/dist/components/docs/integrations/IntegrationsCircuitBreakersPage.js +2 -2
  90. package/dist/components/docs/integrations/IntegrationsElevenLabsPage.js +3 -3
  91. package/dist/components/docs/integrations/IntegrationsGithubPage.js +2 -2
  92. package/dist/components/docs/integrations/IntegrationsGmailPage.js +3 -3
  93. package/dist/components/docs/integrations/IntegrationsGoogleCalendarPage.js +3 -3
  94. package/dist/components/docs/integrations/IntegrationsHealthRoutingPage.js +2 -2
  95. package/dist/components/docs/integrations/IntegrationsMistralPage.js +2 -2
  96. package/dist/components/docs/integrations/IntegrationsOpenAIPage.js +2 -2
  97. package/dist/components/docs/integrations/IntegrationsOverviewPage.js +1 -1
  98. package/dist/components/docs/integrations/IntegrationsPostmarkPage.js +2 -2
  99. package/dist/components/docs/integrations/IntegrationsPowensPage.js +2 -2
  100. package/dist/components/docs/integrations/IntegrationsQdrantPage.js +5 -5
  101. package/dist/components/docs/integrations/IntegrationsResendPage.js +3 -3
  102. package/dist/components/docs/integrations/IntegrationsS3Page.js +4 -4
  103. package/dist/components/docs/integrations/IntegrationsSlackPage.js +2 -2
  104. package/dist/components/docs/integrations/IntegrationsSpecModelPage.js +2 -2
  105. package/dist/components/docs/integrations/IntegrationsStripePage.js +2 -2
  106. package/dist/components/docs/integrations/IntegrationsTwilioPage.js +3 -3
  107. package/dist/components/docs/integrations/IntegrationsWhatsappMetaPage.js +2 -2
  108. package/dist/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +2 -2
  109. package/dist/components/docs/integrations/index.js +39 -39
  110. package/dist/components/docs/intent/ContractFirstApiPage.js +2 -2
  111. package/dist/components/docs/intent/DeterministicCodegenPage.js +2 -2
  112. package/dist/components/docs/intent/GenerateClientFromSchemaPage.js +7 -7
  113. package/dist/components/docs/intent/OpenapiAlternativePage.js +3 -3
  114. package/dist/components/docs/intent/SchemaValidationTypescriptPage.js +4 -4
  115. package/dist/components/docs/intent/SpecDrivenDevelopmentPage.js +2 -2
  116. package/dist/components/docs/intent/index.js +15 -15
  117. package/dist/components/docs/intent/intent-pages.docblocks.js +1 -1
  118. package/dist/components/docs/knowledge/KnowledgeCategoriesPage.js +2 -2
  119. package/dist/components/docs/knowledge/KnowledgeExamplesPage.js +2 -2
  120. package/dist/components/docs/knowledge/KnowledgeOverviewPage.js +1 -1
  121. package/dist/components/docs/knowledge/KnowledgeSourcesPage.js +2 -2
  122. package/dist/components/docs/knowledge/KnowledgeSpacesPage.js +2 -2
  123. package/dist/components/docs/knowledge/index.js +5 -5
  124. package/dist/components/docs/libraries/LibrariesAccessibilityPage.js +3 -3
  125. package/dist/components/docs/libraries/LibrariesAiAgentPage.js +3 -3
  126. package/dist/components/docs/libraries/LibrariesAnalyticsPage.js +4 -4
  127. package/dist/components/docs/libraries/LibrariesContentGenPage.js +2 -2
  128. package/dist/components/docs/libraries/LibrariesContractsPage.js +2 -2
  129. package/dist/components/docs/libraries/LibrariesCostTrackingPage.js +3 -3
  130. package/dist/components/docs/libraries/LibrariesCrossPlatformUIPage.content.d.ts +67 -0
  131. package/dist/components/docs/libraries/LibrariesCrossPlatformUIPage.content.js +86 -0
  132. package/dist/components/docs/libraries/LibrariesCrossPlatformUIPage.d.ts +1 -0
  133. package/dist/components/docs/libraries/LibrariesCrossPlatformUIPage.js +86 -0
  134. package/dist/components/docs/libraries/LibrariesDataBackendPage.js +2 -2
  135. package/dist/components/docs/libraries/LibrariesDataViewsPage.js +3 -3
  136. package/dist/components/docs/libraries/LibrariesDesignSystemPage.js +38 -2
  137. package/dist/components/docs/libraries/LibrariesEvolutionPage.js +4 -4
  138. package/dist/components/docs/libraries/LibrariesGraphQLPage.js +2 -2
  139. package/dist/components/docs/libraries/LibrariesGrowthPage.js +3 -3
  140. package/dist/components/docs/libraries/LibrariesMultiTenancyPage.js +3 -3
  141. package/dist/components/docs/libraries/LibrariesObservabilityPage.js +5 -5
  142. package/dist/components/docs/libraries/LibrariesOverlayEnginePage.js +4 -4
  143. package/dist/components/docs/libraries/LibrariesOverviewPage.js +1 -1
  144. package/dist/components/docs/libraries/LibrariesPersonalizationPage.js +4 -4
  145. package/dist/components/docs/libraries/LibrariesProgressiveDeliveryPage.js +3 -3
  146. package/dist/components/docs/libraries/LibrariesResiliencePage.js +4 -4
  147. package/dist/components/docs/libraries/LibrariesRuntimePage.js +2 -2
  148. package/dist/components/docs/libraries/LibrariesSLOPage.js +3 -3
  149. package/dist/components/docs/libraries/LibrariesSchemaPage.js +3 -3
  150. package/dist/components/docs/libraries/LibrariesSupportBotPage.js +3 -3
  151. package/dist/components/docs/libraries/LibrariesTestingPage.js +3 -3
  152. package/dist/components/docs/libraries/LibrariesUIKitPage.js +2 -2
  153. package/dist/components/docs/libraries/LibrariesUIKitWebPage.js +2 -2
  154. package/dist/components/docs/libraries/LibrariesWorkflowComposerPage.js +3 -3
  155. package/dist/components/docs/libraries/LibrariesWorkflowsPage.js +2 -2
  156. package/dist/components/docs/libraries/index.d.ts +1 -0
  157. package/dist/components/docs/libraries/index.js +173 -53
  158. package/dist/components/docs/manifesto/ManifestoPage.js +1 -1
  159. package/dist/components/docs/ops/AutoEvolutionOpsPage.js +2 -2
  160. package/dist/components/docs/ops/DistributedTracingOpsPage.js +2 -2
  161. package/dist/components/docs/ops/index.js +3 -3
  162. package/dist/components/docs/ops/ops-lifecycle.docblocks.js +2 -2
  163. package/dist/components/docs/ops/ops-runbooks-a.docblocks.js +2 -2
  164. package/dist/components/docs/ops/ops-runbooks-b.docblocks.js +2 -2
  165. package/dist/components/docs/ops/ops-slo-tenant.docblocks.js +2 -2
  166. package/dist/components/docs/ops/ops-top.docs.js +2 -2
  167. package/dist/components/docs/ops/ops.docs.js +6 -6
  168. package/dist/components/docs/product/product.docblocks.js +2 -2
  169. package/dist/components/docs/reference/DocsMarkdownContent.js +2 -2
  170. package/dist/components/docs/reference/DocsReferenceContent.js +3 -3
  171. package/dist/components/docs/reference/DocsReferenceIndexClient.js +2 -2
  172. package/dist/components/docs/reference/DocsReferenceIndexPage.js +2 -2
  173. package/dist/components/docs/reference/DocsReferencePage.js +3 -3
  174. package/dist/components/docs/reference/docsMarkdownParser.js +2 -2
  175. package/dist/components/docs/reference/index.js +4 -4
  176. package/dist/components/docs/safety/SafetyAuditingPage.js +2 -2
  177. package/dist/components/docs/safety/SafetyMigrationsPage.js +2 -2
  178. package/dist/components/docs/safety/SafetyOverviewPage.js +1 -1
  179. package/dist/components/docs/safety/SafetyPDPPage.js +2 -2
  180. package/dist/components/docs/safety/SafetySecurityTrustPage.js +1 -1
  181. package/dist/components/docs/safety/SafetySigningPage.js +3 -3
  182. package/dist/components/docs/safety/SafetyTenantIsolationPage.js +2 -2
  183. package/dist/components/docs/safety/index.js +7 -7
  184. package/dist/components/docs/shared/StudioPrompt.js +1 -1
  185. package/dist/components/docs/specs/SpecsBuilderControlPlanePage.js +4 -4
  186. package/dist/components/docs/specs/SpecsCapabilitiesPage.js +2 -2
  187. package/dist/components/docs/specs/SpecsConnectPage.js +2 -2
  188. package/dist/components/docs/specs/SpecsDataViewsPage.js +2 -2
  189. package/dist/components/docs/specs/SpecsModuleBundlesPage.js +3 -3
  190. package/dist/components/docs/specs/SpecsOverlaysPage.js +2 -2
  191. package/dist/components/docs/specs/SpecsOverviewPage.js +1 -1
  192. package/dist/components/docs/specs/SpecsPolicyPage.js +3 -3
  193. package/dist/components/docs/specs/SpecsWorkflowsPage.js +2 -2
  194. package/dist/components/docs/specs/index.js +13 -13
  195. package/dist/components/docs/studio/StudioBYOKPage.js +1 -1
  196. package/dist/components/docs/studio/StudioDeploymentsPage.js +1 -1
  197. package/dist/components/docs/studio/StudioGettingStartedPage.js +1 -1
  198. package/dist/components/docs/studio/StudioIntegrationsPage.js +1 -1
  199. package/dist/components/docs/studio/StudioOverviewPage.js +1 -1
  200. package/dist/components/docs/studio/StudioVisualBuilderPage.js +1 -1
  201. package/dist/components/docs/studio/index.js +1 -1
  202. package/dist/components/docs/tech/contracts/tech-docs.docblocks.js +2 -2
  203. package/dist/components/integrations/index.js +2 -2
  204. package/dist/components/integrations/molecules/IntegrationCard.js +1 -1
  205. package/dist/components/integrations/organisms/IntegrationMarketplace.js +1 -1
  206. package/dist/components/integrations/organisms/IntegrationSettings.js +2 -2
  207. package/dist/components/integrations/organisms/KnowledgeSourceList.js +1 -1
  208. package/dist/components/legal/PrivacyTemplate.js +1 -1
  209. package/dist/components/legal/TermsTemplate.js +1 -1
  210. package/dist/components/legal/index.js +1 -1
  211. package/dist/components/shared/FeatureGateNotice.js +1 -1
  212. package/dist/components/shared/index.js +1 -1
  213. package/dist/components/shell/WorkspaceHeader.js +1 -1
  214. package/dist/components/shell/WorkspaceProjectShellLayout.js +1 -1
  215. package/dist/components/shell/WorkspaceShellRenderer.js +1 -1
  216. package/dist/components/shell/WorkspaceSidebar.js +1 -1
  217. package/dist/components/shell/index.js +1 -1
  218. package/dist/components/templates/engine/index.js +1 -1
  219. package/dist/components/templates/index.js +11 -11
  220. package/dist/components/templates/messaging/ConversationList.js +2 -2
  221. package/dist/components/templates/messaging/MessageComposer.js +4 -4
  222. package/dist/components/templates/messaging/MessageThread.js +3 -3
  223. package/dist/components/templates/messaging/MessagingWorkspace.js +5 -5
  224. package/dist/components/templates/messaging/index.js +5 -5
  225. package/dist/components/templates/recipes/LanguageSwitcher.js +1 -1
  226. package/dist/components/templates/recipes/RecipeCard.js +1 -1
  227. package/dist/components/templates/recipes/RecipeDetail.js +1 -1
  228. package/dist/components/templates/recipes/RecipeList.js +3 -3
  229. package/dist/components/templates/recipes/index.js +3 -3
  230. package/dist/components/templates/todos/FilterBar.js +1 -1
  231. package/dist/components/templates/todos/TaskForm.js +2 -2
  232. package/dist/components/templates/todos/TaskItem.js +1 -1
  233. package/dist/components/templates/todos/TaskList.js +5 -5
  234. package/dist/components/templates/todos/index.js +5 -5
  235. package/dist/config/contractspec-blueprint.js +1 -1
  236. package/dist/config/contractspec-branding.js +1 -1
  237. package/dist/config/contractspec-routes.js +1 -1
  238. package/dist/config/index.js +1 -1
  239. package/dist/features/contracts-registry.js +1 -1
  240. package/dist/features/docs/docs.contracts.js +1 -1
  241. package/dist/features/docs/index.js +1 -1
  242. package/dist/features/docs.feature.js +1 -1
  243. package/dist/features/index.js +1 -1
  244. package/dist/features/mcp.feature.js +1 -1
  245. package/dist/features/presentations.feature.js +1 -1
  246. package/dist/features/registry.js +1 -1
  247. package/dist/index.d.ts +1 -0
  248. package/dist/index.js +382 -262
  249. package/dist/infrastructure/elysia/index.js +1 -1
  250. package/dist/infrastructure/elysia/logger.js +1 -1
  251. package/dist/infrastructure/index.js +1 -1
  252. package/dist/libs/email/client.js +1 -1
  253. package/dist/libs/email/contact.js +3 -3
  254. package/dist/libs/email/newsletter.js +3 -3
  255. package/dist/libs/email/utils.js +2 -2
  256. package/dist/libs/email/waitlist-application.js +3 -3
  257. package/dist/libs/email/waitlist.js +3 -3
  258. package/dist/libs/email.js +6 -6
  259. package/dist/libs/posthog/client.js +1 -1
  260. package/dist/libs/posthog/native.js +1 -1
  261. package/dist/libs/posthog/server.js +1 -1
  262. package/dist/libs/pricing-examples.js +1 -1
  263. package/dist/node/application/context-storage/index.js +1 -1
  264. package/dist/node/application/index.js +6 -6
  265. package/dist/node/application/mcp/cliMcp.js +2 -2
  266. package/dist/node/application/mcp/cliMcp.onboarding.js +1 -1
  267. package/dist/node/application/mcp/common.js +1 -1
  268. package/dist/node/application/mcp/contractsMcp.js +2 -2
  269. package/dist/node/application/mcp/contractsMcpAdoptionTools.js +1 -1
  270. package/dist/node/application/mcp/contractsMcpResources.js +2 -2
  271. package/dist/node/application/mcp/contractsMcpTools.js +1 -1
  272. package/dist/node/application/mcp/docsMcp.catalog.js +2 -2
  273. package/dist/node/application/mcp/docsMcp.data.js +1 -1
  274. package/dist/node/application/mcp/docsMcp.js +3 -3
  275. package/dist/node/application/mcp/docsMcp.prompts.js +3 -3
  276. package/dist/node/application/mcp/docsMcp.reference.js +2 -2
  277. package/dist/node/application/mcp/docsMcp.resources.js +2 -2
  278. package/dist/node/application/mcp/docsMcp.tools.js +2 -2
  279. package/dist/node/application/mcp/index.js +6 -6
  280. package/dist/node/application/mcp/internalMcp.js +2 -2
  281. package/dist/node/application/mcp/normalizeMcpRequest.js +1 -1
  282. package/dist/node/application/mcp/providerRankingMcp.js +1 -1
  283. package/dist/node/bundles/LibraryBundle.js +1 -1
  284. package/dist/node/bundles/index.js +1 -1
  285. package/dist/node/components/docs/DocsIndexPage.js +2 -2
  286. package/dist/node/components/docs/advanced/AdvancedMCPPage.js +3 -3
  287. package/dist/node/components/docs/advanced/AdvancedOverlayEditorPage.js +1 -1
  288. package/dist/node/components/docs/advanced/AdvancedRenderersPage.js +2 -2
  289. package/dist/node/components/docs/advanced/AdvancedSpecExperimentsPage.js +4 -4
  290. package/dist/node/components/docs/advanced/AdvancedTelemetryPage.js +2 -2
  291. package/dist/node/components/docs/advanced/AdvancedWorkflowMonitoringPage.js +2 -2
  292. package/dist/node/components/docs/advanced/index.js +9 -9
  293. package/dist/node/components/docs/architecture/ArchitectureAppConfigPage.js +6 -6
  294. package/dist/node/components/docs/architecture/ArchitectureControlPlanePage.js +3 -3
  295. package/dist/node/components/docs/architecture/ArchitectureIntegrationBindingPage.js +7 -7
  296. package/dist/node/components/docs/architecture/ArchitectureKnowledgeBindingPage.js +6 -6
  297. package/dist/node/components/docs/architecture/ArchitectureMultiTenancyPage.js +2 -2
  298. package/dist/node/components/docs/architecture/ArchitectureOverviewPage.js +1 -1
  299. package/dist/node/components/docs/architecture/index.js +20 -20
  300. package/dist/node/components/docs/comparison/ComparisonAutomationPlatformsPage.js +1 -1
  301. package/dist/node/components/docs/comparison/ComparisonEnterprisePlatformsPage.js +1 -1
  302. package/dist/node/components/docs/comparison/ComparisonInternalToolBuildersPage.js +1 -1
  303. package/dist/node/components/docs/comparison/ComparisonOverviewPage.js +1 -1
  304. package/dist/node/components/docs/comparison/ComparisonWindmillPage.js +1 -1
  305. package/dist/node/components/docs/comparison/ComparisonWorkflowEnginesPage.js +1 -1
  306. package/dist/node/components/docs/comparison/index.js +1 -1
  307. package/dist/node/components/docs/docsManifest.js +1 -1
  308. package/dist/node/components/docs/ecosystem/IntegrationsPage.js +2 -2
  309. package/dist/node/components/docs/ecosystem/PluginsPage.js +4 -4
  310. package/dist/node/components/docs/ecosystem/RegistryPage.js +4 -4
  311. package/dist/node/components/docs/ecosystem/TemplatesPage.js +3 -3
  312. package/dist/node/components/docs/ecosystem/index.js +11 -11
  313. package/dist/node/components/docs/examples/DocsExamplesPage.js +1 -1
  314. package/dist/node/components/docs/examples/ExampleShowcasePage.js +2 -2
  315. package/dist/node/components/docs/examples/exampleShowcaseData.js +2 -2
  316. package/dist/node/components/docs/examples/index.js +2 -2
  317. package/dist/node/components/docs/generated/docs-index.generated.js +1 -1
  318. package/dist/node/components/docs/generated/index.js +1 -1
  319. package/dist/node/components/docs/generated/loader.js +1 -1
  320. package/dist/node/components/docs/getting-started/CLIPage.js +4 -4
  321. package/dist/node/components/docs/getting-started/CompatibilityPage.js +1 -1
  322. package/dist/node/components/docs/getting-started/DataViewTutorialPage.js +4 -4
  323. package/dist/node/components/docs/getting-started/DeveloperToolsPage.js +1 -1
  324. package/dist/node/components/docs/getting-started/HelloWorldPage.js +5 -5
  325. package/dist/node/components/docs/getting-started/InstallationPage.js +3 -3
  326. package/dist/node/components/docs/getting-started/StartHerePage.js +3 -3
  327. package/dist/node/components/docs/getting-started/TroubleshootingPage.js +2 -2
  328. package/dist/node/components/docs/getting-started/VSCodeExtensionPage.js +1 -1
  329. package/dist/node/components/docs/getting-started/getting-started.docblocks.js +2 -2
  330. package/dist/node/components/docs/getting-started/index.js +17 -17
  331. package/dist/node/components/docs/guides/GuideCIDiffGatingPage.js +2 -2
  332. package/dist/node/components/docs/guides/GuideConnectInRepoPage.js +6 -6
  333. package/dist/node/components/docs/guides/GuideContractTypesPage.js +6 -6
  334. package/dist/node/components/docs/guides/GuideDocsPipelinePage.js +3 -3
  335. package/dist/node/components/docs/guides/GuideFirstModuleBundlePage.js +4 -4
  336. package/dist/node/components/docs/guides/GuideGenerateDocsClientsSchemasPage.js +2 -2
  337. package/dist/node/components/docs/guides/GuideHostBuilderWorkbenchPage.js +7 -7
  338. package/dist/node/components/docs/guides/GuideImportExistingCodebasesPage.js +8 -8
  339. package/dist/node/components/docs/guides/GuideNextjsOneEndpointPage.js +6 -6
  340. package/dist/node/components/docs/guides/GuideReleaseCapsulesPage.js +3 -3
  341. package/dist/node/components/docs/guides/GuideSpecValidationTypingPage.js +4 -4
  342. package/dist/node/components/docs/guides/GuidesIndexPage.js +2 -2
  343. package/dist/node/components/docs/guides/index.js +43 -43
  344. package/dist/node/components/docs/index.js +375 -255
  345. package/dist/node/components/docs/integrations/IntegrationsCircuitBreakersPage.js +2 -2
  346. package/dist/node/components/docs/integrations/IntegrationsElevenLabsPage.js +3 -3
  347. package/dist/node/components/docs/integrations/IntegrationsGithubPage.js +2 -2
  348. package/dist/node/components/docs/integrations/IntegrationsGmailPage.js +3 -3
  349. package/dist/node/components/docs/integrations/IntegrationsGoogleCalendarPage.js +3 -3
  350. package/dist/node/components/docs/integrations/IntegrationsHealthRoutingPage.js +2 -2
  351. package/dist/node/components/docs/integrations/IntegrationsMistralPage.js +2 -2
  352. package/dist/node/components/docs/integrations/IntegrationsOpenAIPage.js +2 -2
  353. package/dist/node/components/docs/integrations/IntegrationsOverviewPage.js +1 -1
  354. package/dist/node/components/docs/integrations/IntegrationsPostmarkPage.js +2 -2
  355. package/dist/node/components/docs/integrations/IntegrationsPowensPage.js +2 -2
  356. package/dist/node/components/docs/integrations/IntegrationsQdrantPage.js +5 -5
  357. package/dist/node/components/docs/integrations/IntegrationsResendPage.js +3 -3
  358. package/dist/node/components/docs/integrations/IntegrationsS3Page.js +4 -4
  359. package/dist/node/components/docs/integrations/IntegrationsSlackPage.js +2 -2
  360. package/dist/node/components/docs/integrations/IntegrationsSpecModelPage.js +2 -2
  361. package/dist/node/components/docs/integrations/IntegrationsStripePage.js +2 -2
  362. package/dist/node/components/docs/integrations/IntegrationsTwilioPage.js +3 -3
  363. package/dist/node/components/docs/integrations/IntegrationsWhatsappMetaPage.js +2 -2
  364. package/dist/node/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +2 -2
  365. package/dist/node/components/docs/integrations/index.js +39 -39
  366. package/dist/node/components/docs/intent/ContractFirstApiPage.js +2 -2
  367. package/dist/node/components/docs/intent/DeterministicCodegenPage.js +2 -2
  368. package/dist/node/components/docs/intent/GenerateClientFromSchemaPage.js +7 -7
  369. package/dist/node/components/docs/intent/OpenapiAlternativePage.js +3 -3
  370. package/dist/node/components/docs/intent/SchemaValidationTypescriptPage.js +4 -4
  371. package/dist/node/components/docs/intent/SpecDrivenDevelopmentPage.js +2 -2
  372. package/dist/node/components/docs/intent/index.js +15 -15
  373. package/dist/node/components/docs/intent/intent-pages.docblocks.js +1 -1
  374. package/dist/node/components/docs/knowledge/KnowledgeCategoriesPage.js +2 -2
  375. package/dist/node/components/docs/knowledge/KnowledgeExamplesPage.js +2 -2
  376. package/dist/node/components/docs/knowledge/KnowledgeOverviewPage.js +1 -1
  377. package/dist/node/components/docs/knowledge/KnowledgeSourcesPage.js +2 -2
  378. package/dist/node/components/docs/knowledge/KnowledgeSpacesPage.js +2 -2
  379. package/dist/node/components/docs/knowledge/index.js +5 -5
  380. package/dist/node/components/docs/libraries/LibrariesAccessibilityPage.js +3 -3
  381. package/dist/node/components/docs/libraries/LibrariesAiAgentPage.js +3 -3
  382. package/dist/node/components/docs/libraries/LibrariesAnalyticsPage.js +4 -4
  383. package/dist/node/components/docs/libraries/LibrariesContentGenPage.js +2 -2
  384. package/dist/node/components/docs/libraries/LibrariesContractsPage.js +2 -2
  385. package/dist/node/components/docs/libraries/LibrariesCostTrackingPage.js +3 -3
  386. package/dist/node/components/docs/libraries/LibrariesCrossPlatformUIPage.content.js +85 -0
  387. package/dist/node/components/docs/libraries/LibrariesCrossPlatformUIPage.js +85 -0
  388. package/dist/node/components/docs/libraries/LibrariesDataBackendPage.js +2 -2
  389. package/dist/node/components/docs/libraries/LibrariesDataViewsPage.js +3 -3
  390. package/dist/node/components/docs/libraries/LibrariesDesignSystemPage.js +38 -2
  391. package/dist/node/components/docs/libraries/LibrariesEvolutionPage.js +4 -4
  392. package/dist/node/components/docs/libraries/LibrariesGraphQLPage.js +2 -2
  393. package/dist/node/components/docs/libraries/LibrariesGrowthPage.js +3 -3
  394. package/dist/node/components/docs/libraries/LibrariesMultiTenancyPage.js +3 -3
  395. package/dist/node/components/docs/libraries/LibrariesObservabilityPage.js +5 -5
  396. package/dist/node/components/docs/libraries/LibrariesOverlayEnginePage.js +4 -4
  397. package/dist/node/components/docs/libraries/LibrariesOverviewPage.js +1 -1
  398. package/dist/node/components/docs/libraries/LibrariesPersonalizationPage.js +4 -4
  399. package/dist/node/components/docs/libraries/LibrariesProgressiveDeliveryPage.js +3 -3
  400. package/dist/node/components/docs/libraries/LibrariesResiliencePage.js +4 -4
  401. package/dist/node/components/docs/libraries/LibrariesRuntimePage.js +2 -2
  402. package/dist/node/components/docs/libraries/LibrariesSLOPage.js +3 -3
  403. package/dist/node/components/docs/libraries/LibrariesSchemaPage.js +3 -3
  404. package/dist/node/components/docs/libraries/LibrariesSupportBotPage.js +3 -3
  405. package/dist/node/components/docs/libraries/LibrariesTestingPage.js +3 -3
  406. package/dist/node/components/docs/libraries/LibrariesUIKitPage.js +2 -2
  407. package/dist/node/components/docs/libraries/LibrariesUIKitWebPage.js +2 -2
  408. package/dist/node/components/docs/libraries/LibrariesWorkflowComposerPage.js +3 -3
  409. package/dist/node/components/docs/libraries/LibrariesWorkflowsPage.js +2 -2
  410. package/dist/node/components/docs/libraries/index.js +173 -53
  411. package/dist/node/components/docs/manifesto/ManifestoPage.js +1 -1
  412. package/dist/node/components/docs/ops/AutoEvolutionOpsPage.js +2 -2
  413. package/dist/node/components/docs/ops/DistributedTracingOpsPage.js +2 -2
  414. package/dist/node/components/docs/ops/index.js +3 -3
  415. package/dist/node/components/docs/ops/ops-lifecycle.docblocks.js +2 -2
  416. package/dist/node/components/docs/ops/ops-runbooks-a.docblocks.js +2 -2
  417. package/dist/node/components/docs/ops/ops-runbooks-b.docblocks.js +2 -2
  418. package/dist/node/components/docs/ops/ops-slo-tenant.docblocks.js +2 -2
  419. package/dist/node/components/docs/ops/ops-top.docs.js +2 -2
  420. package/dist/node/components/docs/ops/ops.docs.js +6 -6
  421. package/dist/node/components/docs/product/product.docblocks.js +2 -2
  422. package/dist/node/components/docs/reference/DocsMarkdownContent.js +2 -2
  423. package/dist/node/components/docs/reference/DocsReferenceContent.js +3 -3
  424. package/dist/node/components/docs/reference/DocsReferenceIndexClient.js +2 -2
  425. package/dist/node/components/docs/reference/DocsReferenceIndexPage.js +2 -2
  426. package/dist/node/components/docs/reference/DocsReferencePage.js +3 -3
  427. package/dist/node/components/docs/reference/docsMarkdownParser.js +2 -2
  428. package/dist/node/components/docs/reference/index.js +4 -4
  429. package/dist/node/components/docs/safety/SafetyAuditingPage.js +2 -2
  430. package/dist/node/components/docs/safety/SafetyMigrationsPage.js +2 -2
  431. package/dist/node/components/docs/safety/SafetyOverviewPage.js +1 -1
  432. package/dist/node/components/docs/safety/SafetyPDPPage.js +2 -2
  433. package/dist/node/components/docs/safety/SafetySecurityTrustPage.js +1 -1
  434. package/dist/node/components/docs/safety/SafetySigningPage.js +3 -3
  435. package/dist/node/components/docs/safety/SafetyTenantIsolationPage.js +2 -2
  436. package/dist/node/components/docs/safety/index.js +7 -7
  437. package/dist/node/components/docs/shared/StudioPrompt.js +1 -1
  438. package/dist/node/components/docs/specs/SpecsBuilderControlPlanePage.js +4 -4
  439. package/dist/node/components/docs/specs/SpecsCapabilitiesPage.js +2 -2
  440. package/dist/node/components/docs/specs/SpecsConnectPage.js +2 -2
  441. package/dist/node/components/docs/specs/SpecsDataViewsPage.js +2 -2
  442. package/dist/node/components/docs/specs/SpecsModuleBundlesPage.js +3 -3
  443. package/dist/node/components/docs/specs/SpecsOverlaysPage.js +2 -2
  444. package/dist/node/components/docs/specs/SpecsOverviewPage.js +1 -1
  445. package/dist/node/components/docs/specs/SpecsPolicyPage.js +3 -3
  446. package/dist/node/components/docs/specs/SpecsWorkflowsPage.js +2 -2
  447. package/dist/node/components/docs/specs/index.js +13 -13
  448. package/dist/node/components/docs/studio/StudioBYOKPage.js +1 -1
  449. package/dist/node/components/docs/studio/StudioDeploymentsPage.js +1 -1
  450. package/dist/node/components/docs/studio/StudioGettingStartedPage.js +1 -1
  451. package/dist/node/components/docs/studio/StudioIntegrationsPage.js +1 -1
  452. package/dist/node/components/docs/studio/StudioOverviewPage.js +1 -1
  453. package/dist/node/components/docs/studio/StudioVisualBuilderPage.js +1 -1
  454. package/dist/node/components/docs/studio/index.js +1 -1
  455. package/dist/node/components/docs/tech/contracts/tech-docs.docblocks.js +2 -2
  456. package/dist/node/components/integrations/index.js +2 -2
  457. package/dist/node/components/integrations/molecules/IntegrationCard.js +1 -1
  458. package/dist/node/components/integrations/organisms/IntegrationMarketplace.js +1 -1
  459. package/dist/node/components/integrations/organisms/IntegrationSettings.js +2 -2
  460. package/dist/node/components/integrations/organisms/KnowledgeSourceList.js +1 -1
  461. package/dist/node/components/legal/PrivacyTemplate.js +1 -1
  462. package/dist/node/components/legal/TermsTemplate.js +1 -1
  463. package/dist/node/components/legal/index.js +1 -1
  464. package/dist/node/components/shared/FeatureGateNotice.js +1 -1
  465. package/dist/node/components/shared/index.js +1 -1
  466. package/dist/node/components/shell/WorkspaceHeader.js +1 -1
  467. package/dist/node/components/shell/WorkspaceProjectShellLayout.js +1 -1
  468. package/dist/node/components/shell/WorkspaceShellRenderer.js +1 -1
  469. package/dist/node/components/shell/WorkspaceSidebar.js +1 -1
  470. package/dist/node/components/shell/index.js +1 -1
  471. package/dist/node/components/templates/engine/index.js +1 -1
  472. package/dist/node/components/templates/index.js +11 -11
  473. package/dist/node/components/templates/messaging/ConversationList.js +2 -2
  474. package/dist/node/components/templates/messaging/MessageComposer.js +4 -4
  475. package/dist/node/components/templates/messaging/MessageThread.js +3 -3
  476. package/dist/node/components/templates/messaging/MessagingWorkspace.js +5 -5
  477. package/dist/node/components/templates/messaging/index.js +5 -5
  478. package/dist/node/components/templates/recipes/LanguageSwitcher.js +1 -1
  479. package/dist/node/components/templates/recipes/RecipeCard.js +1 -1
  480. package/dist/node/components/templates/recipes/RecipeDetail.js +1 -1
  481. package/dist/node/components/templates/recipes/RecipeList.js +3 -3
  482. package/dist/node/components/templates/recipes/index.js +3 -3
  483. package/dist/node/components/templates/todos/FilterBar.js +1 -1
  484. package/dist/node/components/templates/todos/TaskForm.js +2 -2
  485. package/dist/node/components/templates/todos/TaskItem.js +1 -1
  486. package/dist/node/components/templates/todos/TaskList.js +5 -5
  487. package/dist/node/components/templates/todos/index.js +5 -5
  488. package/dist/node/config/contractspec-blueprint.js +1 -1
  489. package/dist/node/config/contractspec-branding.js +1 -1
  490. package/dist/node/config/contractspec-routes.js +1 -1
  491. package/dist/node/config/index.js +1 -1
  492. package/dist/node/features/contracts-registry.js +1 -1
  493. package/dist/node/features/docs/docs.contracts.js +1 -1
  494. package/dist/node/features/docs/index.js +1 -1
  495. package/dist/node/features/docs.feature.js +1 -1
  496. package/dist/node/features/index.js +1 -1
  497. package/dist/node/features/mcp.feature.js +1 -1
  498. package/dist/node/features/presentations.feature.js +1 -1
  499. package/dist/node/features/registry.js +1 -1
  500. package/dist/node/index.js +382 -262
  501. package/dist/node/infrastructure/elysia/index.js +1 -1
  502. package/dist/node/infrastructure/elysia/logger.js +1 -1
  503. package/dist/node/infrastructure/index.js +1 -1
  504. package/dist/node/libs/email/client.js +1 -1
  505. package/dist/node/libs/email/contact.js +3 -3
  506. package/dist/node/libs/email/newsletter.js +3 -3
  507. package/dist/node/libs/email/utils.js +2 -2
  508. package/dist/node/libs/email/waitlist-application.js +3 -3
  509. package/dist/node/libs/email/waitlist.js +3 -3
  510. package/dist/node/libs/email.js +6 -6
  511. package/dist/node/libs/posthog/client.js +1 -1
  512. package/dist/node/libs/posthog/native.js +1 -1
  513. package/dist/node/libs/posthog/server.js +1 -1
  514. package/dist/node/libs/pricing-examples.js +1 -1
  515. package/dist/node/presentation/features/atoms/FeatureIcon/FeatureIcon.js +1 -1
  516. package/dist/node/presentation/features/atoms/FeatureIcon/index.js +1 -1
  517. package/dist/node/presentation/features/atoms/index.js +1 -1
  518. package/dist/node/presentation/features/hooks/index.js +1 -1
  519. package/dist/node/presentation/features/hooks/useContractsRegistry.js +1 -1
  520. package/dist/node/presentation/features/hooks/useFeatureFilters.js +1 -1
  521. package/dist/node/presentation/features/hooks/useFeatureRegistry.js +1 -1
  522. package/dist/node/presentation/features/hooks/useRelatedDocs.js +1 -1
  523. package/dist/node/presentation/features/index.js +1 -1
  524. package/dist/node/presentation/features/molecules/FeatureCard/FeatureCard.js +1 -1
  525. package/dist/node/presentation/features/molecules/FeatureCard/index.js +1 -1
  526. package/dist/node/presentation/features/molecules/FeatureCategoryHeader/FeatureCategoryHeader.js +1 -1
  527. package/dist/node/presentation/features/molecules/FeatureCategoryHeader/index.js +1 -1
  528. package/dist/node/presentation/features/molecules/FeatureFilters/FeatureFilters.js +1 -1
  529. package/dist/node/presentation/features/molecules/FeatureFilters/index.js +1 -1
  530. package/dist/node/presentation/features/molecules/FeatureHoverPreview/FeatureHoverPreview.js +1 -1
  531. package/dist/node/presentation/features/molecules/FeatureHoverPreview/index.js +1 -1
  532. package/dist/node/presentation/features/molecules/index.js +1 -1
  533. package/dist/node/presentation/features/organisms/FeatureDataViewsList.js +1 -1
  534. package/dist/node/presentation/features/organisms/FeatureDetail/FeatureDetail.js +1 -1
  535. package/dist/node/presentation/features/organisms/FeatureDetail/index.js +1 -1
  536. package/dist/node/presentation/features/organisms/FeatureDiscovery/FeatureDiscovery.js +1 -1
  537. package/dist/node/presentation/features/organisms/FeatureDiscovery/index.js +1 -1
  538. package/dist/node/presentation/features/organisms/FeatureEventsList.js +1 -1
  539. package/dist/node/presentation/features/organisms/FeatureFormsList.js +1 -1
  540. package/dist/node/presentation/features/organisms/FeatureOperationsList.js +1 -1
  541. package/dist/node/presentation/features/organisms/FeaturePresentationsList.js +1 -1
  542. package/dist/node/presentation/features/organisms/index.js +1 -1
  543. package/dist/node/presentation/features/templates/FeatureDataViewDetailTemplate/FeatureDataViewDetailTemplate.js +1 -1
  544. package/dist/node/presentation/features/templates/FeatureDataViewDetailTemplate/index.js +1 -1
  545. package/dist/node/presentation/features/templates/FeatureDataViewsTemplate/FeatureDataViewsTemplate.js +1 -1
  546. package/dist/node/presentation/features/templates/FeatureDataViewsTemplate/index.js +1 -1
  547. package/dist/node/presentation/features/templates/FeatureEventDetailTemplate/FeatureEventDetailTemplate.js +1 -1
  548. package/dist/node/presentation/features/templates/FeatureEventDetailTemplate/index.js +1 -1
  549. package/dist/node/presentation/features/templates/FeatureEventsTemplate/FeatureEventsTemplate.js +1 -1
  550. package/dist/node/presentation/features/templates/FeatureEventsTemplate/index.js +1 -1
  551. package/dist/node/presentation/features/templates/FeatureFormDetailTemplate/FeatureFormDetailTemplate.js +1 -1
  552. package/dist/node/presentation/features/templates/FeatureFormDetailTemplate/index.js +1 -1
  553. package/dist/node/presentation/features/templates/FeatureFormsTemplate/FeatureFormsTemplate.js +1 -1
  554. package/dist/node/presentation/features/templates/FeatureFormsTemplate/index.js +1 -1
  555. package/dist/node/presentation/features/templates/FeatureOperationDetailTemplate/FeatureOperationDetailTemplate.js +1 -1
  556. package/dist/node/presentation/features/templates/FeatureOperationDetailTemplate/index.js +1 -1
  557. package/dist/node/presentation/features/templates/FeatureOperationsTemplate/FeatureOperationsTemplate.js +1 -1
  558. package/dist/node/presentation/features/templates/FeatureOperationsTemplate/index.js +1 -1
  559. package/dist/node/presentation/features/templates/FeatureOverviewTemplate/FeatureOverviewTemplate.js +1 -1
  560. package/dist/node/presentation/features/templates/FeatureOverviewTemplate/index.js +1 -1
  561. package/dist/node/presentation/features/templates/FeaturePresentationDetailTemplate/FeaturePresentationDetailTemplate.js +1 -1
  562. package/dist/node/presentation/features/templates/FeaturePresentationDetailTemplate/index.js +1 -1
  563. package/dist/node/presentation/features/templates/FeaturePresentationsTemplate/FeaturePresentationsTemplate.js +1 -1
  564. package/dist/node/presentation/features/templates/FeaturePresentationsTemplate/index.js +1 -1
  565. package/dist/presentation/features/atoms/FeatureIcon/FeatureIcon.js +1 -1
  566. package/dist/presentation/features/atoms/FeatureIcon/index.js +1 -1
  567. package/dist/presentation/features/atoms/index.js +1 -1
  568. package/dist/presentation/features/hooks/index.js +1 -1
  569. package/dist/presentation/features/hooks/useContractsRegistry.js +1 -1
  570. package/dist/presentation/features/hooks/useFeatureFilters.js +1 -1
  571. package/dist/presentation/features/hooks/useFeatureRegistry.js +1 -1
  572. package/dist/presentation/features/hooks/useRelatedDocs.js +1 -1
  573. package/dist/presentation/features/index.js +1 -1
  574. package/dist/presentation/features/molecules/FeatureCard/FeatureCard.js +1 -1
  575. package/dist/presentation/features/molecules/FeatureCard/index.js +1 -1
  576. package/dist/presentation/features/molecules/FeatureCategoryHeader/FeatureCategoryHeader.js +1 -1
  577. package/dist/presentation/features/molecules/FeatureCategoryHeader/index.js +1 -1
  578. package/dist/presentation/features/molecules/FeatureFilters/FeatureFilters.js +1 -1
  579. package/dist/presentation/features/molecules/FeatureFilters/index.js +1 -1
  580. package/dist/presentation/features/molecules/FeatureHoverPreview/FeatureHoverPreview.js +1 -1
  581. package/dist/presentation/features/molecules/FeatureHoverPreview/index.js +1 -1
  582. package/dist/presentation/features/molecules/index.js +1 -1
  583. package/dist/presentation/features/organisms/FeatureDataViewsList.js +1 -1
  584. package/dist/presentation/features/organisms/FeatureDetail/FeatureDetail.js +1 -1
  585. package/dist/presentation/features/organisms/FeatureDetail/index.js +1 -1
  586. package/dist/presentation/features/organisms/FeatureDiscovery/FeatureDiscovery.js +1 -1
  587. package/dist/presentation/features/organisms/FeatureDiscovery/index.js +1 -1
  588. package/dist/presentation/features/organisms/FeatureEventsList.js +1 -1
  589. package/dist/presentation/features/organisms/FeatureFormsList.js +1 -1
  590. package/dist/presentation/features/organisms/FeatureOperationsList.js +1 -1
  591. package/dist/presentation/features/organisms/FeaturePresentationsList.js +1 -1
  592. package/dist/presentation/features/organisms/index.js +1 -1
  593. package/dist/presentation/features/templates/FeatureDataViewDetailTemplate/FeatureDataViewDetailTemplate.js +1 -1
  594. package/dist/presentation/features/templates/FeatureDataViewDetailTemplate/index.js +1 -1
  595. package/dist/presentation/features/templates/FeatureDataViewsTemplate/FeatureDataViewsTemplate.js +1 -1
  596. package/dist/presentation/features/templates/FeatureDataViewsTemplate/index.js +1 -1
  597. package/dist/presentation/features/templates/FeatureEventDetailTemplate/FeatureEventDetailTemplate.js +1 -1
  598. package/dist/presentation/features/templates/FeatureEventDetailTemplate/index.js +1 -1
  599. package/dist/presentation/features/templates/FeatureEventsTemplate/FeatureEventsTemplate.js +1 -1
  600. package/dist/presentation/features/templates/FeatureEventsTemplate/index.js +1 -1
  601. package/dist/presentation/features/templates/FeatureFormDetailTemplate/FeatureFormDetailTemplate.js +1 -1
  602. package/dist/presentation/features/templates/FeatureFormDetailTemplate/index.js +1 -1
  603. package/dist/presentation/features/templates/FeatureFormsTemplate/FeatureFormsTemplate.js +1 -1
  604. package/dist/presentation/features/templates/FeatureFormsTemplate/index.js +1 -1
  605. package/dist/presentation/features/templates/FeatureOperationDetailTemplate/FeatureOperationDetailTemplate.js +1 -1
  606. package/dist/presentation/features/templates/FeatureOperationDetailTemplate/index.js +1 -1
  607. package/dist/presentation/features/templates/FeatureOperationsTemplate/FeatureOperationsTemplate.js +1 -1
  608. package/dist/presentation/features/templates/FeatureOperationsTemplate/index.js +1 -1
  609. package/dist/presentation/features/templates/FeatureOverviewTemplate/FeatureOverviewTemplate.js +1 -1
  610. package/dist/presentation/features/templates/FeatureOverviewTemplate/index.js +1 -1
  611. package/dist/presentation/features/templates/FeaturePresentationDetailTemplate/FeaturePresentationDetailTemplate.js +1 -1
  612. package/dist/presentation/features/templates/FeaturePresentationDetailTemplate/index.js +1 -1
  613. package/dist/presentation/features/templates/FeaturePresentationsTemplate/FeaturePresentationsTemplate.js +1 -1
  614. package/dist/presentation/features/templates/FeaturePresentationsTemplate/index.js +1 -1
  615. package/package.json +49 -24
  616. package/src/application/mcp/internalMcp.ts +1 -1
  617. package/src/bundles/LibraryBundle.ts +19 -130
  618. package/src/components/docs/docsManifest.test.ts +14 -0
  619. package/src/components/docs/docsManifest.ts +10 -0
  620. package/src/components/docs/examples/DocsExamplesPage.tsx +3 -3
  621. package/src/components/docs/examples/ExampleShowcasePage.tsx +1 -1
  622. package/src/components/docs/examples/exampleShowcaseData.test.ts +5 -3
  623. package/src/components/docs/examples/exampleShowcaseData.ts +3 -3
  624. package/src/components/docs/generated/docs-index._common.json +1699 -2008
  625. package/src/components/docs/generated/docs-index.agent-console.json +377 -377
  626. package/src/components/docs/generated/docs-index.ai-chat-assistant.json +17 -17
  627. package/src/components/docs/generated/docs-index.ai-chat.json +105 -105
  628. package/src/components/docs/generated/docs-index.ai-support-bot.json +9 -9
  629. package/src/components/docs/generated/docs-index.analytics-dashboard.json +169 -169
  630. package/src/components/docs/generated/docs-index.app-config.json +137 -137
  631. package/src/components/docs/generated/docs-index.artisan-knowledge-product.json +17 -17
  632. package/src/components/docs/generated/docs-index.artisan-payments-stripe.json +33 -33
  633. package/src/components/docs/generated/docs-index.audit-trail.json +49 -49
  634. package/src/components/docs/generated/docs-index.calendar-google.json +9 -9
  635. package/src/components/docs/generated/docs-index.content-generation.json +9 -9
  636. package/src/components/docs/generated/docs-index.control-plane.json +17 -17
  637. package/src/components/docs/generated/docs-index.crm-pipeline.json +161 -161
  638. package/src/components/docs/generated/docs-index.data-grid-showcase.json +25 -25
  639. package/src/components/docs/generated/docs-index.defineExample.json +9 -9
  640. package/src/components/docs/generated/docs-index.email-gmail.json +9 -9
  641. package/src/components/docs/generated/docs-index.feature-flags.json +217 -217
  642. package/src/components/docs/generated/docs-index.files.json +177 -177
  643. package/src/components/docs/generated/docs-index.generated.ts +20 -20
  644. package/src/components/docs/generated/docs-index.harness-lab.json +9 -9
  645. package/src/components/docs/generated/docs-index.health.json +97 -97
  646. package/src/components/docs/generated/docs-index.identity-rbac.json +313 -313
  647. package/src/components/docs/generated/docs-index.in-app-docs.json +9 -9
  648. package/src/components/docs/generated/docs-index.integration-hub.json +265 -265
  649. package/src/components/docs/generated/docs-index.integration-posthog.json +9 -9
  650. package/src/components/docs/generated/docs-index.integration-stripe.json +9 -9
  651. package/src/components/docs/generated/docs-index.integration-supabase.json +9 -9
  652. package/src/components/docs/generated/docs-index.jobs.json +137 -137
  653. package/src/components/docs/generated/docs-index.kb-update-pipeline.json +129 -129
  654. package/src/components/docs/generated/docs-index.knowledge-canon.json +9 -9
  655. package/src/components/docs/generated/docs-index.learning-journey-ambient-coach.json +9 -9
  656. package/src/components/docs/generated/docs-index.learning-journey-crm-onboarding.json +49 -49
  657. package/src/components/docs/generated/docs-index.learning-journey-duo-drills.json +9 -9
  658. package/src/components/docs/generated/docs-index.learning-journey-platform-tour.json +49 -49
  659. package/src/components/docs/generated/docs-index.learning-journey-quest-challenges.json +9 -9
  660. package/src/components/docs/generated/docs-index.learning-journey-registry.json +33 -33
  661. package/src/components/docs/generated/docs-index.learning-journey-studio-onboarding.json +49 -49
  662. package/src/components/docs/generated/docs-index.learning-journey-ui-coaching.json +9 -9
  663. package/src/components/docs/generated/docs-index.learning-journey-ui-gamified.json +9 -9
  664. package/src/components/docs/generated/docs-index.learning-journey-ui-onboarding.json +9 -9
  665. package/src/components/docs/generated/docs-index.learning-journey-ui-shared.json +9 -9
  666. package/src/components/docs/generated/docs-index.learning-journey.json +241 -241
  667. package/src/components/docs/generated/docs-index.learning-patterns.json +9 -9
  668. package/src/components/docs/generated/docs-index.lifecycle-cli.json +9 -9
  669. package/src/components/docs/generated/docs-index.lifecycle-dashboard.json +9 -9
  670. package/src/components/docs/generated/docs-index.locale-jurisdiction-gate.json +65 -65
  671. package/src/components/docs/generated/docs-index.manifest.json +432 -432
  672. package/src/components/docs/generated/docs-index.marketplace.json +337 -337
  673. package/src/components/docs/generated/docs-index.meeting-recorder-providers.json +9 -9
  674. package/src/components/docs/generated/docs-index.meeting-recorder.json +49 -49
  675. package/src/components/docs/generated/docs-index.messaging-agent-actions.json +17 -17
  676. package/src/components/docs/generated/docs-index.metrics.json +201 -201
  677. package/src/components/docs/generated/docs-index.minimal.json +17 -17
  678. package/src/components/docs/generated/docs-index.mobile-demo-landing.json +42 -0
  679. package/src/components/docs/generated/docs-index.notifications.json +65 -65
  680. package/src/components/docs/generated/docs-index.openbanking-powens.json +9 -9
  681. package/src/components/docs/generated/docs-index.openbanking.json +65 -65
  682. package/src/components/docs/generated/docs-index.opencode-cli.json +17 -17
  683. package/src/components/docs/generated/docs-index.personalization.json +9 -9
  684. package/src/components/docs/generated/docs-index.platform-acp.json +137 -137
  685. package/src/components/docs/generated/docs-index.platform-agent.json +201 -201
  686. package/src/components/docs/generated/docs-index.platform-context.json +121 -121
  687. package/src/components/docs/generated/docs-index.platform-control-plane.json +321 -321
  688. package/src/components/docs/generated/docs-index.platform-database.json +89 -89
  689. package/src/components/docs/generated/docs-index.platform-docs.json +161 -161
  690. package/src/components/docs/generated/docs-index.platform-harness.json +177 -177
  691. package/src/components/docs/generated/docs-index.platform-integrations.json +329 -329
  692. package/src/components/docs/generated/docs-index.platform-knowledge.json +57 -57
  693. package/src/components/docs/generated/docs-index.platform-provider-ranking.json +217 -217
  694. package/src/components/docs/generated/docs-index.pocket-family-office.json +129 -129
  695. package/src/components/docs/generated/docs-index.policy-safe-knowledge-assistant.json +9 -9
  696. package/src/components/docs/generated/docs-index.product-intent.json +9 -9
  697. package/src/components/docs/generated/docs-index.project-management-sync.json +9 -9
  698. package/src/components/docs/generated/docs-index.saas-boilerplate.json +209 -209
  699. package/src/components/docs/generated/docs-index.service-business-os.json +193 -193
  700. package/src/components/docs/generated/docs-index.team-hub.json +185 -185
  701. package/src/components/docs/generated/docs-index.unknown.json +521 -521
  702. package/src/components/docs/generated/docs-index.versioned-knowledge-base.json +81 -81
  703. package/src/components/docs/generated/docs-index.video-api-showcase.json +33 -33
  704. package/src/components/docs/generated/docs-index.video-docs-terminal.json +9 -9
  705. package/src/components/docs/generated/docs-index.video-marketing-clip.json +9 -9
  706. package/src/components/docs/generated/docs-index.visualization-showcase.json +17 -17
  707. package/src/components/docs/generated/docs-index.voice-providers.json +9 -9
  708. package/src/components/docs/generated/docs-index.wealth-snapshot.json +153 -153
  709. package/src/components/docs/generated/docs-index.workflow-system.json +433 -433
  710. package/src/components/docs/generated/docs-index.workspace-cli.json +9 -9
  711. package/src/components/docs/generated/index.ts +20 -5
  712. package/src/components/docs/generated/loader.ts +15 -8
  713. package/src/components/docs/getting-started/CompatibilityPage.tsx +14 -0
  714. package/src/components/docs/libraries/LibrariesCrossPlatformUIPage.content.ts +252 -0
  715. package/src/components/docs/libraries/LibrariesCrossPlatformUIPage.tsx +232 -0
  716. package/src/components/docs/libraries/LibrariesDesignSystemPage.tsx +79 -0
  717. package/src/components/docs/libraries/LibrariesOverviewPage.tsx +6 -0
  718. package/src/components/docs/libraries/LibrariesRuntimePage.tsx +15 -0
  719. package/src/components/docs/libraries/LibrariesUIKitPage.tsx +15 -0
  720. package/src/components/docs/libraries/LibrariesUIKitWebPage.tsx +14 -0
  721. package/src/components/docs/libraries/index.ts +1 -0
  722. package/src/components/docs/reference/DocsReferenceIndexPage.tsx +1 -1
  723. package/src/index.ts +1 -1
  724. package/src/components/docs/generated/docs-index.mobile-demo-tasks.json +0 -34
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- 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
2
+ var ne=Object.defineProperty;var ce=(T)=>T;function pe(T,P){this[T]=ce.bind(null,P)}var Je=(T,P)=>{for(var q in P)ne(T,q,{get:P[q],enumerable:!0,configurable:!0,set:pe.bind(P,q)})};var Qe=(T,P)=>()=>(T&&(P=T(T=0)),P);import{jsx as s,jsxs as z}from"react/jsx-runtime";function me(){return z("div",{className:"space-y-8",children:[z("div",{className:"space-y-4",children:[s("h1",{className:"font-bold text-4xl",children:"Integration Circuit Breakers"}),s("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."})]}),z("div",{className:"space-y-4",children:[s("h2",{className:"font-bold text-2xl",children:"Pattern"}),s("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."}),s("pre",{className:"rounded-lg border bg-muted p-4 text-sm",children:`// integrations/stripe.ts
3
3
  import { CircuitBreaker } from '@contractspec/lib.resilience/circuit-breaker';
4
4
 
5
5
  const stripeBreaker = new CircuitBreaker({
@@ -9,8 +9,8 @@ const stripeBreaker = new CircuitBreaker({
9
9
 
10
10
  export async function createCharge(amount: number) {
11
11
  return stripeBreaker.execute(() => stripe.charges.create({ amount }));
12
- }`})]})]})}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
13
- 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
12
+ }`})]})]})}import V from"@contractspec/lib.ui-link";import{ChevronRight as ue}from"lucide-react";import{jsx as k,jsxs as L}from"react/jsx-runtime";function ge(){return L("div",{className:"space-y-8",children:[L("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."})]}),L("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
13
+ ELEVENLABS_API_KEY=...`})})]}),L("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
14
14
  provider:
15
15
  type: elevenlabs
16
16
  operation: textToSpeech
@@ -29,7 +29,7 @@ outputs:
29
29
  audioUrl:
30
30
  type: string
31
31
  audioData:
32
- 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
32
+ type: buffer`})})]}),L("div",{className:"space-y-4",children:[k("h2",{className:"font-bold text-2xl",children:"Use cases"}),L("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"})]})]}),L("div",{className:"flex items-center gap-4 pt-4",children:[k(V,{href:"/docs/integrations/mistral",className:"btn-ghost",children:"Previous: Mistral"}),L(V,{href:"/docs/integrations/qdrant",className:"btn-primary",children:["Next: Qdrant ",k(ue,{size:16})]})]})]})}import F from"@contractspec/lib.ui-link";import{ChevronRight as fe}from"lucide-react";import{jsx as g,jsxs as W}from"react/jsx-runtime";function he(){return W("div",{className:"space-y-8",children:[W("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."})]}),W("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
33
33
  {
34
34
  "token": "ghp_...",
35
35
  "webhookSecret": "..."
@@ -40,13 +40,13 @@ outputs:
40
40
  "defaultOwner": "lssm-tech",
41
41
  "defaultRepo": "contractspec",
42
42
  "apiBaseUrl": "https://api.github.com"
43
- }`})})]}),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"}
43
+ }`})})]}),W("div",{className:"space-y-4",children:[g("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 GitHub events are accepted on"," ",g("code",{className:"rounded bg-background/50 px-2 py-1",children:"/webhooks/github/events"}),"."]}),W("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."})]})]}),W("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"}
44
44
 
45
45
  # Optional dev fallback (off by default)
46
- 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
46
+ CHANNEL_ALLOW_UNMAPPED_WORKSPACE=0`})})]}),W("div",{className:"space-y-4",children:[g("h2",{className:"font-bold text-2xl",children:"Best practices"}),W("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."})]})]}),W("div",{className:"flex items-center gap-4 pt-4",children:[g(F,{href:"/docs/integrations/slack",className:"btn-ghost",children:"Previous: Slack Messaging"}),W(F,{href:"/docs/integrations/whatsapp-meta",className:"btn-primary",children:["Next: WhatsApp Meta ",g(fe,{size:16})]})]})]})}import Y from"@contractspec/lib.ui-link";import{ChevronRight as be}from"lucide-react";import{jsx as v,jsxs as B}from"react/jsx-runtime";function ve(){return B("div",{className:"space-y-8",children:[B("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."})]}),B("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
47
47
  GOOGLE_CLIENT_ID=...
48
48
  GOOGLE_CLIENT_SECRET=...
49
- 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
49
+ GOOGLE_REDIRECT_URI=https://your-app.com/auth/google/callback`})})]}),B("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
50
50
  provider:
51
51
  type: gmail
52
52
  operation: listMessages
@@ -67,10 +67,10 @@ outputs:
67
67
  properties:
68
68
  id: string
69
69
  threadId: string
70
- 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
70
+ snippet: string`})})]}),B("div",{className:"space-y-4",children:[v("h2",{className:"font-bold text-2xl",children:"Use cases"}),B("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"})]})]}),B("div",{className:"flex items-center gap-4 pt-4",children:[v(Y,{href:"/docs/integrations/resend",className:"btn-ghost",children:"Previous: Resend"}),B(Y,{href:"/docs/integrations/google-calendar",className:"btn-primary",children:["Next: Google Calendar ",v(be,{size:16})]})]})]})}import Z from"@contractspec/lib.ui-link";import{ChevronRight as Ne}from"lucide-react";import{jsx as E,jsxs as D}from"react/jsx-runtime";function ye(){return D("div",{className:"space-y-8",children:[D("div",{className:"space-y-4",children:[E("h1",{className:"font-bold text-4xl",children:"Google Calendar"}),E("p",{className:"text-muted-foreground",children:"Integrate Google Calendar to schedule appointments, manage availability, and sync events with your application."})]}),D("div",{className:"space-y-4",children:[E("h2",{className:"font-bold text-2xl",children:"Setup"}),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
71
71
  GOOGLE_CLIENT_ID=...
72
72
  GOOGLE_CLIENT_SECRET=...
73
- 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
73
+ GOOGLE_CALENDAR_ID=primary`})})]}),D("div",{className:"space-y-4",children:[E("h2",{className:"font-bold text-2xl",children:"Creating events"}),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: calendar-create-event
74
74
  provider:
75
75
  type: google-calendar
76
76
  operation: createEvent
@@ -94,7 +94,7 @@ outputs:
94
94
  eventId:
95
95
  type: string
96
96
  htmlLink:
97
- 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:`{
97
+ type: string`})})]}),D("div",{className:"flex items-center gap-4 pt-4",children:[E(Z,{href:"/docs/integrations/gmail",className:"btn-ghost",children:"Previous: Gmail API"}),D(Z,{href:"/docs/integrations/openai",className:"btn-primary",children:["Next: OpenAI ",E(Ne,{size:16})]})]})]})}import J from"@contractspec/lib.ui-link";import{jsx as p,jsxs as _}from"react/jsx-runtime";function ke(){return _("div",{className:"space-y-8",children:[_("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."})]}),_("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:`{
98
98
  "defaultTransport": "official-api",
99
99
  "strategyOrder": [
100
100
  "official-api",
@@ -108,7 +108,7 @@ outputs:
108
108
  "apiBaseUrl": "https://api.provider.example",
109
109
  "mcpUrl": "https://mcp.provider.example",
110
110
  "oauthTokenUrl": "https://api.provider.example/oauth/token"
111
- }`})})]}),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:`{
111
+ }`})})]}),_("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:`{
112
112
  "apiKey": "...",
113
113
  "accessToken": "...",
114
114
  "refreshToken": "...",
@@ -117,8 +117,8 @@ outputs:
117
117
  "tokenExpiresAt": "2026-02-01T00:00:00.000Z",
118
118
  "mcpAccessToken": "...",
119
119
  "webhookSecret": "..."
120
- }`})})]}),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
121
- 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
120
+ }`})})]}),_("div",{className:"space-y-4",children:[p("h2",{className:"font-bold text-2xl",children:"Routing behavior"}),_("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."}),_("li",{children:["Unofficial routes are disabled unless",p("code",{className:"ml-1 rounded bg-background/50 px-2 py-1",children:"allowUnofficial"}),"is true."]}),_("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."]}),_("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."]})]})]}),_("div",{className:"space-y-4",children:[p("h2",{className:"font-bold text-2xl",children:"Provider guidance"}),_("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."})]})]}),_("div",{className:"flex items-center gap-4 pt-4",children:[p(J,{href:"/docs/integrations/whatsapp-twilio",className:"btn-ghost",children:"Previous: WhatsApp Twilio"}),p(J,{href:"/docs/integrations",className:"btn-primary",children:"Back to Integrations"})]})]})}import Q from"@contractspec/lib.ui-link";import{ChevronRight as we}from"lucide-react";import{jsx as r,jsxs as H}from"react/jsx-runtime";function Ae(){return H("div",{className:"space-y-8",children:[H("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."})]}),H("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
121
+ MISTRAL_API_KEY=...`})})]}),H("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
122
122
  provider:
123
123
  type: mistral
124
124
  operation: chatCompletion
@@ -137,7 +137,7 @@ outputs:
137
137
  content:
138
138
  type: string
139
139
  usage:
140
- 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
140
+ type: object`})})]}),H("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
141
141
  provider:
142
142
  type: mistral
143
143
  operation: createEmbedding
@@ -153,7 +153,7 @@ outputs:
153
153
  embedding:
154
154
  type: array
155
155
  items:
156
- 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
156
+ type: number`})})]}),H("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
157
157
  provider:
158
158
  type: mistral
159
159
  operation: transcribe
@@ -173,9 +173,9 @@ outputs:
173
173
  segments:
174
174
  type: array
175
175
  language:
176
- 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
176
+ type: string`})})]}),H("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)."})]}),H("div",{className:"space-y-4",children:[r("h2",{className:"font-bold text-2xl",children:"Best practices"}),H("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"})]})]}),H("div",{className:"flex items-center gap-4 pt-4",children:[r(Q,{href:"/docs/integrations/openai",className:"btn-ghost",children:"Previous: OpenAI"}),H(Q,{href:"/docs/integrations/elevenlabs",className:"btn-primary",children:["Next: ElevenLabs ",r(we,{size:16})]})]})]})}import X from"@contractspec/lib.ui-link";import{ChevronRight as Te}from"lucide-react";import{jsx as d,jsxs as S}from"react/jsx-runtime";function Ie(){return S("div",{className:"space-y-8",children:[S("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."})]}),S("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
177
177
  OPENAI_API_KEY=sk-...
178
- 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
178
+ OPENAI_ORGANIZATION=org-...`})})]}),S("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
179
179
  provider:
180
180
  type: openai
181
181
  operation: chatCompletion
@@ -200,7 +200,7 @@ outputs:
200
200
  content:
201
201
  type: string
202
202
  usage:
203
- 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
203
+ type: object`})})]}),S("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
204
204
  provider:
205
205
  type: openai
206
206
  operation: createEmbedding
@@ -216,7 +216,7 @@ outputs:
216
216
  embedding:
217
217
  type: array
218
218
  items:
219
- 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
219
+ type: number`})})]}),S("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
220
220
  provider:
221
221
  type: openai
222
222
  operation: transcribe
@@ -232,7 +232,7 @@ outputs:
232
232
  text:
233
233
  type: string
234
234
  language:
235
- 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 \u2192 tenant connection \u2192 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
235
+ type: string`})})]}),S("div",{className:"space-y-4",children:[d("h2",{className:"font-bold text-2xl",children:"Best practices"}),S("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"})]})]}),S("div",{className:"flex items-center gap-4 pt-4",children:[d(X,{href:"/docs/integrations/google-calendar",className:"btn-ghost",children:"Previous: Google Calendar"}),S(X,{href:"/docs/integrations/mistral",className:"btn-primary",children:["Next: Mistral ",d(Te,{size:16})]})]})]})}import G from"@contractspec/lib.ui-link";import{jsx as N,jsxs as C}from"react/jsx-runtime";var Pe=[{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 We(){return C("div",{className:"space-y-10",children:[C("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."})]}),C("div",{className:"editorial-proof-strip",children:[C("div",{className:"editorial-stat",children:[N("span",{className:"editorial-label",children:"Binding model"}),N("span",{className:"editorial-stat-value",children:"Integration spec \u2192 tenant connection \u2192 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:C("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"}),C("div",{className:"grid gap-4 md:grid-cols-2",children:[C(G,{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."})]}),C(G,{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:Pe.map((T)=>C("section",{className:"editorial-panel space-y-4",children:[N("h2",{className:"font-serif text-2xl tracking-[-0.03em]",children:T.title}),N("div",{className:"space-y-3",children:T.items.map((P)=>N(G,{href:P.href,className:"docs-chip-link",children:P.title},P.href))})]},T.title))})]})}import $ from"@contractspec/lib.ui-link";import{ChevronRight as _e}from"lucide-react";import{jsx as o,jsxs as b}from"react/jsx-runtime";function Me(){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
236
236
  POSTMARK_API_TOKEN=...
237
237
  POSTMARK_FROM_EMAIL=noreply@example.com
238
238
  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
@@ -278,7 +278,7 @@ config:
278
278
  templateId: "welcome-email"
279
279
  templateData:
280
280
  user_name: \${input.userName}
281
- 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"})," \u2013 Email was successfully delivered"]}),b("li",{children:[o("strong",{children:"Bounce"})," \u2013 Email bounced (hard or soft)"]}),b("li",{children:[o("strong",{children:"SpamComplaint"})," \u2013 Recipient marked email as spam"]}),b("li",{children:[o("strong",{children:"Open"})," \u2013 Recipient opened the email"]}),b("li",{children:[o("strong",{children:"Click"})," \u2013 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:`{
281
+ 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"})," \u2013 Email was successfully delivered"]}),b("li",{children:[o("strong",{children:"Bounce"})," \u2013 Email bounced (hard or soft)"]}),b("li",{children:[o("strong",{children:"SpamComplaint"})," \u2013 Recipient marked email as spam"]}),b("li",{children:[o("strong",{children:"Open"})," \u2013 Recipient opened the email"]}),b("li",{children:[o("strong",{children:"Click"})," \u2013 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($,{href:"/docs/integrations/stripe",className:"btn-ghost",children:"Previous: Stripe"}),b($,{href:"/docs/integrations/resend",className:"btn-primary",children:["Next: Resend ",o(_e,{size:16})]})]})]})}import x from"@contractspec/lib.ui-link";import{ChevronRight as He}from"lucide-react";import{jsx as a,jsxs as i}from"react/jsx-runtime";function Ee(){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:`{
282
282
  "clientId": "powens-client-id",
283
283
  "clientSecret": "powens-client-secret",
284
284
  "apiKey": "optional-api-key",
@@ -333,10 +333,10 @@ inputs:
333
333
  outputs:
334
334
  balances:
335
335
  type: AccountBalanceRecord[]
336
- 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
336
+ 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(x,{href:"/docs/integrations",className:"btn-ghost",children:"Back to Integrations"}),i(x,{href:"/docs/integrations/stripe",className:"btn-primary",children:["Next: Stripe ",a(He,{size:16})]})]})]})}import j from"@contractspec/lib.ui-link";import{ChevronRight as Se}from"lucide-react";import{jsx as y,jsxs as K}from"react/jsx-runtime";function Ce(){return K("div",{className:"space-y-8",children:[K("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."})]}),K("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
337
337
  QDRANT_URL=https://...
338
338
  QDRANT_API_KEY=...
339
- 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
339
+ QDRANT_COLLECTION=documents`})})]}),K("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
340
340
  provider:
341
341
  type: qdrant
342
342
  operation: upsert
@@ -355,7 +355,7 @@ inputs:
355
355
 
356
356
  outputs:
357
357
  status:
358
- 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
358
+ type: string`})})]}),K("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
359
359
  provider:
360
360
  type: qdrant
361
361
  operation: search
@@ -379,7 +379,7 @@ outputs:
379
379
  properties:
380
380
  id: string
381
381
  score: number
382
- 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
382
+ payload: object`})})]}),K("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
383
383
  version: '1.0.0'.0.0
384
384
 
385
385
  steps:
@@ -404,9 +404,9 @@ steps:
404
404
  - role: "user"
405
405
  content: |
406
406
  Context: \${steps.search-documents.output.results}
407
- 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
407
+ Question: \${input.query}`})})]}),K("div",{className:"flex items-center gap-4 pt-4",children:[y(j,{href:"/docs/integrations/elevenlabs",className:"btn-ghost",children:"Previous: ElevenLabs"}),K(j,{href:"/docs/integrations/s3",className:"btn-primary",children:["Next: S3 Storage ",y(Se,{size:16})]})]})]})}import ee from"@contractspec/lib.ui-link";import{ChevronRight as Ue}from"lucide-react";import{jsx as w,jsxs as R}from"react/jsx-runtime";function Oe(){return R("div",{className:"space-y-8",children:[R("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."})]}),R("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
408
408
  RESEND_API_KEY=re_...
409
- 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
409
+ RESEND_FROM_EMAIL=onboarding@resend.dev`})})]}),R("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
410
410
  provider:
411
411
  type: resend
412
412
  operation: sendEmail
@@ -427,12 +427,12 @@ inputs:
427
427
 
428
428
  outputs:
429
429
  id:
430
- 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
430
+ type: string`})})]}),R("div",{className:"space-y-4",children:[w("h2",{className:"font-bold text-2xl",children:"Best practices"}),R("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"})]})]}),R("div",{className:"flex items-center gap-4 pt-4",children:[w(ee,{href:"/docs/integrations/postmark",className:"btn-ghost",children:"Previous: Postmark"}),R(ee,{href:"/docs/integrations/gmail",className:"btn-primary",children:["Next: Gmail API ",w(Ue,{size:16})]})]})]})}import te from"@contractspec/lib.ui-link";import{ChevronRight as Le}from"lucide-react";import{jsx as m,jsxs as U}from"react/jsx-runtime";function Be(){return U("div",{className:"space-y-8",children:[U("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."})]}),U("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
431
431
  S3_ENDPOINT=https://s3.fr-par.scw.cloud
432
432
  S3_ACCESS_KEY_ID=...
433
433
  S3_SECRET_ACCESS_KEY=...
434
434
  S3_BUCKET=my-bucket
435
- 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
435
+ S3_REGION=fr-par`})})]}),U("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
436
436
  provider:
437
437
  type: s3
438
438
  operation: upload
@@ -454,7 +454,7 @@ outputs:
454
454
  url:
455
455
  type: string
456
456
  etag:
457
- 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
457
+ type: string`})})]}),U("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
458
458
  provider:
459
459
  type: s3
460
460
  operation: getPresignedUrl
@@ -469,7 +469,7 @@ inputs:
469
469
 
470
470
  outputs:
471
471
  url:
472
- 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
472
+ type: string`})})]}),U("div",{className:"space-y-4",children:[m("h2",{className:"font-bold text-2xl",children:"Best practices"}),U("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"})]})]}),U("div",{className:"flex items-center gap-4 pt-4",children:[m(te,{href:"/docs/integrations/qdrant",className:"btn-ghost",children:"Previous: Qdrant"}),U(te,{href:"/docs/integrations/twilio",className:"btn-primary",children:["Next: Twilio ",m(Le,{size:16})]})]})]})}import ae from"@contractspec/lib.ui-link";import{ChevronRight as Ke}from"lucide-react";import{jsx as u,jsxs as M}from"react/jsx-runtime";function Re(){return M("div",{className:"space-y-8",children:[M("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."})]}),M("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
473
473
  {
474
474
  "botToken": "xoxb-...",
475
475
  "signingSecret": "..."
@@ -479,7 +479,7 @@ outputs:
479
479
  {
480
480
  "defaultChannelId": "C0123456789",
481
481
  "apiBaseUrl": "https://slack.com/api"
482
- }`})})]}),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)
482
+ }`})})]}),M("div",{className:"space-y-4",children:[u("h2",{className:"font-bold text-2xl",children:"Webhook ingress"}),M("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[M("li",{children:["Inbound events are accepted on"," ",u("code",{className:"rounded bg-background/50 px-2 py-1",children:"/webhooks/slack/events"}),"."]}),M("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."})]})]}),M("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)
483
483
  CHANNEL_WORKSPACE_MAP_SLACK={"T123":"workspace-acme"}
484
484
 
485
485
  # Dispatch protection
@@ -487,7 +487,7 @@ CHANNEL_DISPATCH_TOKEN=...
487
487
 
488
488
  # Optional scheduler
489
489
  CHANNEL_DISPATCH_INTERVAL_MS=120000
490
- 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 = {
490
+ CHANNEL_DISPATCH_RUN_ON_START=1`})})]}),M("div",{className:"space-y-4",children:[u("h2",{className:"font-bold text-2xl",children:"Best practices"}),M("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."})]})]}),M("div",{className:"flex items-center gap-4 pt-4",children:[u(ae,{href:"/docs/integrations/twilio",className:"btn-ghost",children:"Previous: Twilio SMS"}),M(ae,{href:"/docs/integrations/github",className:"btn-primary",children:["Next: GitHub Messaging ",u(Ke,{size:16})]})]})]})}import oe from"@contractspec/lib.ui-link";import{ChevronRight as De}from"lucide-react";import{jsx as t,jsxs as l}from"react/jsx-runtime";function se(){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 = {
491
491
  id: string;
492
492
  label: string;
493
493
  description: string;
@@ -697,7 +697,7 @@ CHANNEL_DISPATCH_RUN_ON_START=1`})})]}),W("div",{className:"space-y-4",children:
697
697
  "clientSecret": "...",
698
698
  "tokenExpiresAt": "2026-02-01T00:00:00.000Z",
699
699
  "mcpAccessToken": "..."
700
- }`})})]}),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
700
+ }`})})]}),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(oe,{href:"/docs/integrations",className:"btn-ghost",children:"Back to Integrations"}),l(oe,{href:"/docs/architecture/integration-binding",className:"btn-primary",children:["Integration Binding ",t(De,{size:16})]})]})]})}import ie from"@contractspec/lib.ui-link";import{ChevronRight as qe}from"lucide-react";import{jsx as e,jsxs as n}from"react/jsx-runtime";function ze(){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
701
701
  STRIPE_SECRET_KEY=sk_test_...
702
702
  STRIPE_PUBLISHABLE_KEY=pk_test_...
703
703
  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
@@ -800,10 +800,10 @@ steps:
800
800
  to: "admin@example.com"
801
801
  template: "payment-error"
802
802
  data:
803
- 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
803
+ 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(ie,{href:"/docs/integrations",className:"btn-ghost",children:"Back to Integrations"}),n(ie,{href:"/docs/integrations/postmark",className:"btn-primary",children:["Next: Postmark ",e(qe,{size:16})]})]})]})}import re from"@contractspec/lib.ui-link";import{jsx as c,jsxs as O}from"react/jsx-runtime";function Ge(){return O("div",{className:"space-y-8",children:[O("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."})]}),O("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
804
804
  TWILIO_ACCOUNT_SID=...
805
805
  TWILIO_AUTH_TOKEN=...
806
- 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
806
+ TWILIO_PHONE_NUMBER=+1234567890`})})]}),O("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
807
807
  provider:
808
808
  type: twilio
809
809
  operation: sendSMS
@@ -820,7 +820,7 @@ outputs:
820
820
  messageSid:
821
821
  type: string
822
822
  status:
823
- 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
823
+ type: string`})})]}),O("div",{className:"space-y-4",children:[c("h2",{className:"font-bold text-2xl",children:"Use cases"}),O("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"})]})]}),O("div",{className:"space-y-4",children:[c("h2",{className:"font-bold text-2xl",children:"Best practices"}),O("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"})]})]}),O("div",{className:"flex items-center gap-4 pt-4",children:[c(re,{href:"/docs/integrations/s3",className:"btn-ghost",children:"Previous: S3 Storage"}),c(re,{href:"/docs/integrations/slack",className:"btn-primary",children:"Next: Slack Messaging"})]})]})}import de from"@contractspec/lib.ui-link";import{ChevronRight as Ve}from"lucide-react";import{jsx as f,jsxs as I}from"react/jsx-runtime";function Fe(){return I("div",{className:"space-y-8",children:[I("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."})]}),I("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
824
824
  {
825
825
  "accessToken": "...",
826
826
  "appSecret": "...",
@@ -831,7 +831,7 @@ outputs:
831
831
  {
832
832
  "phoneNumberId": "120000000001",
833
833
  "apiVersion": "v22.0"
834
- }`})})]}),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
834
+ }`})})]}),I("div",{className:"space-y-4",children:[f("h2",{className:"font-bold text-2xl",children:"Webhook endpoints"}),I("ul",{className:"list-inside list-disc space-y-2 text-muted-foreground",children:[I("li",{children:["Verification challenge:"," ",f("code",{className:"rounded bg-background/50 px-2 py-1",children:"GET /webhooks/whatsapp/meta"})]}),I("li",{children:["Inbound messages:"," ",f("code",{className:"rounded bg-background/50 px-2 py-1",children:"POST /webhooks/whatsapp/meta"})]}),I("li",{children:["Signatures are validated with"," ",f("code",{className:"rounded bg-background/50 px-2 py-1",children:"x-hub-signature-256"}),"."]})]})]}),I("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"}'})})]}),I("div",{className:"space-y-4",children:[f("h2",{className:"font-bold text-2xl",children:"Best practices"}),I("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."})]})]}),I("div",{className:"flex items-center gap-4 pt-4",children:[f(de,{href:"/docs/integrations/github",className:"btn-ghost",children:"Previous: GitHub Messaging"}),I(de,{href:"/docs/integrations/whatsapp-twilio",className:"btn-primary",children:["Next: WhatsApp Twilio ",f(Ve,{size:16})]})]})]})}import le from"@contractspec/lib.ui-link";import{ChevronRight as Ye}from"lucide-react";import{jsx as h,jsxs as A}from"react/jsx-runtime";function Ze(){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
835
835
  {
836
836
  "accountSid": "AC123",
837
837
  "authToken": "..."
@@ -840,4 +840,4 @@ outputs:
840
840
  // optional connection config
841
841
  {
842
842
  "fromNumber": "whatsapp:+15550002"
843
- }`})})]}),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};
843
+ }`})})]}),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(le,{href:"/docs/integrations/whatsapp-meta",className:"btn-ghost",children:"Previous: WhatsApp Meta"}),A(le,{href:"/docs/integrations/health-routing",className:"btn-primary",children:["Next: Health Routing ",h(Ye,{size:16})]})]})]})}export{Ze as IntegrationsWhatsappTwilioPage,Fe as IntegrationsWhatsappMetaPage,Ge as IntegrationsTwilioPage,ze as IntegrationsStripePage,se as IntegrationsSpecModelPage,Re as IntegrationsSlackPage,Be as IntegrationsS3Page,Oe as IntegrationsResendPage,Ce as IntegrationsQdrantPage,Ee as IntegrationsPowensPage,Me as IntegrationsPostmarkPage,We as IntegrationsOverviewPage,Ie as IntegrationsOpenAIPage,Ae as IntegrationsMistralPage,ke as IntegrationsHealthRoutingPage,ye as IntegrationsGoogleCalendarPage,ve as IntegrationsGmailPage,he as IntegrationsGithubPage,ge as IntegrationsElevenLabsPage,me as IntegrationsCircuitBreakersPage};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{contractFirstApiBrief as D}from"@contractspec/bundle.library/components/docs/intent/intent-pages.docblocks";import{SeoOptimizer as J}from"@contractspec/lib.content-gen/seo";import{CodeBlock as H}from"@contractspec/lib.design-system";import I from"@contractspec/lib.ui-link";import{ChevronRight as K}from"lucide-react";import{jsx as q,jsxs as w}from"react/jsx-runtime";var U=new J().optimize(D);function V(){return w("div",{className:"space-y-8",children:[w("div",{className:"space-y-3",children:[q("h1",{className:"font-bold text-4xl",children:D.title}),q("p",{className:"text-lg text-muted-foreground",children:D.summary})]}),w("div",{className:"card-subtle space-y-4 p-6",children:[q("h2",{className:"font-bold text-2xl",children:"Problems Solved"}),q("ul",{className:"space-y-2 text-muted-foreground text-sm",children:D.problems.map((E,G)=>q("li",{children:E},G))})]}),w("div",{className:"card-subtle space-y-4 p-6",children:[q("h2",{className:"font-bold text-2xl",children:"Solutions"}),q("ul",{className:"space-y-2 text-muted-foreground text-sm",children:D.solutions.map((E,G)=>q("li",{children:E},G))})]}),w("div",{className:"space-y-6",children:[w("div",{className:"space-y-3",children:[q("h2",{className:"font-bold text-2xl",children:"Quick Start"}),q("p",{className:"text-muted-foreground text-sm",children:"Define your first API contract and generate consistent implementations."}),q(H,{language:"typescript",filename:"src/contracts/user-create.operation.ts",code:`import { defineOperation } from '@contractspec/lib.contracts-spec/operations';
2
+ var K=Object.defineProperty;var M=(w)=>w;function N(w,D){this[w]=M.bind(null,D)}var T=(w,D)=>{for(var H in D)K(w,H,{get:D[H],enumerable:!0,configurable:!0,set:N.bind(D,H)})};var U=(w,D)=>()=>(w&&(D=w(w=0)),D);import{contractFirstApiBrief as G}from"@contractspec/bundle.library/components/docs/intent/intent-pages.docblocks";import{SeoOptimizer as P}from"@contractspec/lib.content-gen/seo";import{CodeBlock as I}from"@contractspec/lib.design-system";import J from"@contractspec/lib.ui-link";import{ChevronRight as Q}from"lucide-react";import{jsx as q,jsxs as E}from"react/jsx-runtime";var $=new P().optimize(G);function v(){return E("div",{className:"space-y-8",children:[E("div",{className:"space-y-3",children:[q("h1",{className:"font-bold text-4xl",children:G.title}),q("p",{className:"text-lg text-muted-foreground",children:G.summary})]}),E("div",{className:"card-subtle space-y-4 p-6",children:[q("h2",{className:"font-bold text-2xl",children:"Problems Solved"}),q("ul",{className:"space-y-2 text-muted-foreground text-sm",children:G.problems.map((w,D)=>q("li",{children:w},D))})]}),E("div",{className:"card-subtle space-y-4 p-6",children:[q("h2",{className:"font-bold text-2xl",children:"Solutions"}),q("ul",{className:"space-y-2 text-muted-foreground text-sm",children:G.solutions.map((w,D)=>q("li",{children:w},D))})]}),E("div",{className:"space-y-6",children:[E("div",{className:"space-y-3",children:[q("h2",{className:"font-bold text-2xl",children:"Quick Start"}),q("p",{className:"text-muted-foreground text-sm",children:"Define your first API contract and generate consistent implementations."}),q(I,{language:"typescript",filename:"src/contracts/user-create.operation.ts",code:`import { defineOperation } from '@contractspec/lib.contracts-spec/operations';
3
3
  import { SchemaModel, ScalarTypeEnum } from '@contractspec/lib.schema';
4
4
 
5
5
  export const CreateUserOperation = defineOperation({
@@ -33,4 +33,4 @@ export const CreateUserOperation = defineOperation({
33
33
  tags: ['users', 'auth'],
34
34
  description: 'Create a new user account with email and password',
35
35
  },
36
- });`})]}),w("div",{className:"space-y-3",children:[q("h2",{className:"font-bold text-2xl",children:"Generate OpenAPI"}),q("p",{className:"text-muted-foreground text-sm",children:"Export OpenAPI documentation directly from your contracts."}),q(H,{language:"bash",filename:"export-openapi",code:"contractspec openapi export \\\n --registry ./src/contracts/registry.ts \\\n --out ./openapi.json"})]})]}),w("div",{className:"flex items-center gap-4 pt-4",children:[w(I,{href:"/docs/guides/nextjs-one-endpoint",className:"btn-primary",children:["Next.js Guide ",q(K,{size:16})]}),q(I,{href:"/docs/intent/spec-driven-development",className:"btn-ghost",children:"Spec-driven Development"})]})]})}export{U as metadata,V as ContractFirstApiPage};
36
+ });`})]}),E("div",{className:"space-y-3",children:[q("h2",{className:"font-bold text-2xl",children:"Generate OpenAPI"}),q("p",{className:"text-muted-foreground text-sm",children:"Export OpenAPI documentation directly from your contracts."}),q(I,{language:"bash",filename:"export-openapi",code:"contractspec openapi export \\\n --registry ./src/contracts/registry.ts \\\n --out ./openapi.json"})]})]}),E("div",{className:"flex items-center gap-4 pt-4",children:[E(J,{href:"/docs/guides/nextjs-one-endpoint",className:"btn-primary",children:["Next.js Guide ",q(Q,{size:16})]}),q(J,{href:"/docs/intent/spec-driven-development",className:"btn-ghost",children:"Spec-driven Development"})]})]})}export{$ as metadata,v as ContractFirstApiPage};