@contractspec/bundle.library 3.8.10 → 3.8.12

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