@contractspec/bundle.library 3.8.10 → 3.8.11

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