@contractspec/bundle.library 3.4.2 → 3.5.0

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 (479) hide show
  1. package/.turbo/turbo-build.log +494 -488
  2. package/CHANGELOG.md +61 -0
  3. package/dist/application/index.js +8 -8
  4. package/dist/application/mcp/cliMcp.js +8 -8
  5. package/dist/application/mcp/contractsMcp.js +8 -8
  6. package/dist/application/mcp/docsMcp.js +8 -8
  7. package/dist/application/mcp/index.js +8 -8
  8. package/dist/application/mcp/internalMcp.js +8 -8
  9. package/dist/application/mcp/providerRankingMcp.js +8 -8
  10. package/dist/bundles/LibraryBundle.d.ts +126 -0
  11. package/dist/bundles/LibraryBundle.js +139 -0
  12. package/dist/bundles/index.d.ts +1 -0
  13. package/dist/bundles/index.js +139 -0
  14. package/dist/components/docs/DocsIndexPage.js +91 -91
  15. package/dist/components/docs/advanced/AdvancedMCPPage.js +125 -125
  16. package/dist/components/docs/advanced/AdvancedOverlayEditorPage.js +49 -49
  17. package/dist/components/docs/advanced/AdvancedRenderersPage.js +51 -51
  18. package/dist/components/docs/advanced/AdvancedSpecExperimentsPage.js +35 -35
  19. package/dist/components/docs/advanced/AdvancedTelemetryPage.js +177 -177
  20. package/dist/components/docs/advanced/AdvancedWorkflowMonitoringPage.js +45 -45
  21. package/dist/components/docs/advanced/index.js +482 -482
  22. package/dist/components/docs/architecture/ArchitectureAppConfigPage.js +107 -107
  23. package/dist/components/docs/architecture/ArchitectureControlPlanePage.js +73 -73
  24. package/dist/components/docs/architecture/ArchitectureIntegrationBindingPage.js +117 -117
  25. package/dist/components/docs/architecture/ArchitectureKnowledgeBindingPage.js +175 -175
  26. package/dist/components/docs/architecture/ArchitectureMultiTenancyPage.js +71 -71
  27. package/dist/components/docs/architecture/ArchitectureOverviewPage.js +205 -205
  28. package/dist/components/docs/architecture/index.js +748 -748
  29. package/dist/components/docs/comparison/ComparisonAutomationPlatformsPage.js +117 -117
  30. package/dist/components/docs/comparison/ComparisonEnterprisePlatformsPage.js +111 -111
  31. package/dist/components/docs/comparison/ComparisonInternalToolBuildersPage.js +117 -117
  32. package/dist/components/docs/comparison/ComparisonOverviewPage.js +97 -97
  33. package/dist/components/docs/comparison/ComparisonWindmillPage.js +125 -125
  34. package/dist/components/docs/comparison/ComparisonWorkflowEnginesPage.js +171 -171
  35. package/dist/components/docs/comparison/index.js +738 -738
  36. package/dist/components/docs/ecosystem/IntegrationsPage.js +45 -45
  37. package/dist/components/docs/ecosystem/PluginsPage.js +73 -73
  38. package/dist/components/docs/ecosystem/RegistryPage.js +37 -37
  39. package/dist/components/docs/ecosystem/TemplatesPage.js +56 -56
  40. package/dist/components/docs/ecosystem/index.js +211 -211
  41. package/dist/components/docs/examples/DocsExamplesPage.js +21 -21
  42. package/dist/components/docs/examples/index.js +21 -21
  43. package/dist/components/docs/getting-started/CLIPage.js +95 -95
  44. package/dist/components/docs/getting-started/CompatibilityPage.js +81 -81
  45. package/dist/components/docs/getting-started/DataViewTutorialPage.js +57 -57
  46. package/dist/components/docs/getting-started/DeveloperToolsPage.js +61 -61
  47. package/dist/components/docs/getting-started/HelloWorldPage.js +77 -77
  48. package/dist/components/docs/getting-started/InstallationPage.js +65 -65
  49. package/dist/components/docs/getting-started/StartHerePage.js +51 -51
  50. package/dist/components/docs/getting-started/TroubleshootingPage.js +73 -73
  51. package/dist/components/docs/getting-started/VSCodeExtensionPage.js +171 -171
  52. package/dist/components/docs/getting-started/index.js +731 -731
  53. package/dist/components/docs/guides/GuideCIDiffGatingPage.js +80 -80
  54. package/dist/components/docs/guides/GuideContractTypesPage.js +232 -232
  55. package/dist/components/docs/guides/GuideDocsPipelinePage.js +82 -82
  56. package/dist/components/docs/guides/GuideGenerateDocsClientsSchemasPage.js +84 -84
  57. package/dist/components/docs/guides/GuideImportExistingCodebasesPage.js +324 -324
  58. package/dist/components/docs/guides/GuideNextjsOneEndpointPage.js +106 -106
  59. package/dist/components/docs/guides/GuideSpecValidationTypingPage.js +78 -78
  60. package/dist/components/docs/guides/GuidesIndexPage.js +43 -43
  61. package/dist/components/docs/guides/index.js +975 -975
  62. package/dist/components/docs/index.js +10791 -10791
  63. package/dist/components/docs/integrations/IntegrationsCircuitBreakersPage.js +17 -17
  64. package/dist/components/docs/integrations/IntegrationsElevenLabsPage.js +47 -47
  65. package/dist/components/docs/integrations/IntegrationsGithubPage.js +61 -61
  66. package/dist/components/docs/integrations/IntegrationsGmailPage.js +49 -49
  67. package/dist/components/docs/integrations/IntegrationsGoogleCalendarPage.js +33 -33
  68. package/dist/components/docs/integrations/IntegrationsHealthRoutingPage.js +65 -65
  69. package/dist/components/docs/integrations/IntegrationsMistralPage.js +69 -69
  70. package/dist/components/docs/integrations/IntegrationsOpenAIPage.js +65 -65
  71. package/dist/components/docs/integrations/IntegrationsOverviewPage.js +313 -313
  72. package/dist/components/docs/integrations/IntegrationsPostmarkPage.js +101 -101
  73. package/dist/components/docs/integrations/IntegrationsPowensPage.js +121 -121
  74. package/dist/components/docs/integrations/IntegrationsQdrantPage.js +49 -49
  75. package/dist/components/docs/integrations/IntegrationsResendPage.js +45 -45
  76. package/dist/components/docs/integrations/IntegrationsS3Page.js +57 -57
  77. package/dist/components/docs/integrations/IntegrationsSlackPage.js +63 -63
  78. package/dist/components/docs/integrations/IntegrationsSpecModelPage.js +139 -139
  79. package/dist/components/docs/integrations/IntegrationsStripePage.js +159 -159
  80. package/dist/components/docs/integrations/IntegrationsTwilioPage.js +61 -61
  81. package/dist/components/docs/integrations/IntegrationsWhatsappMetaPage.js +63 -63
  82. package/dist/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +65 -65
  83. package/dist/components/docs/integrations/index.js +1642 -1642
  84. package/dist/components/docs/intent/ContractFirstApiPage.js +51 -51
  85. package/dist/components/docs/intent/DeterministicCodegenPage.js +59 -59
  86. package/dist/components/docs/intent/GenerateClientFromSchemaPage.js +85 -85
  87. package/dist/components/docs/intent/OpenapiAlternativePage.js +91 -91
  88. package/dist/components/docs/intent/SchemaValidationTypescriptPage.js +59 -59
  89. package/dist/components/docs/intent/SpecDrivenDevelopmentPage.js +51 -51
  90. package/dist/components/docs/intent/index.js +396 -396
  91. package/dist/components/docs/knowledge/KnowledgeCategoriesPage.js +371 -371
  92. package/dist/components/docs/knowledge/KnowledgeExamplesPage.js +79 -79
  93. package/dist/components/docs/knowledge/KnowledgeOverviewPage.js +185 -185
  94. package/dist/components/docs/knowledge/KnowledgeSourcesPage.js +187 -187
  95. package/dist/components/docs/knowledge/KnowledgeSpacesPage.js +141 -141
  96. package/dist/components/docs/knowledge/index.js +963 -963
  97. package/dist/components/docs/libraries/LibrariesAccessibilityPage.js +85 -85
  98. package/dist/components/docs/libraries/LibrariesAiAgentPage.js +63 -63
  99. package/dist/components/docs/libraries/LibrariesAnalyticsPage.js +33 -33
  100. package/dist/components/docs/libraries/LibrariesContentGenPage.js +43 -43
  101. package/dist/components/docs/libraries/LibrariesContractsPage.js +125 -125
  102. package/dist/components/docs/libraries/LibrariesCostTrackingPage.js +45 -45
  103. package/dist/components/docs/libraries/LibrariesDataBackendPage.js +69 -69
  104. package/dist/components/docs/libraries/LibrariesDataViewsPage.js +79 -79
  105. package/dist/components/docs/libraries/LibrariesDesignSystemPage.js +129 -129
  106. package/dist/components/docs/libraries/LibrariesEvolutionPage.js +49 -49
  107. package/dist/components/docs/libraries/LibrariesGraphQLPage.js +73 -73
  108. package/dist/components/docs/libraries/LibrariesGrowthPage.js +35 -35
  109. package/dist/components/docs/libraries/LibrariesMultiTenancyPage.js +43 -43
  110. package/dist/components/docs/libraries/LibrariesObservabilityPage.js +53 -53
  111. package/dist/components/docs/libraries/LibrariesOverlayEnginePage.js +45 -45
  112. package/dist/components/docs/libraries/LibrariesOverviewPage.js +191 -191
  113. package/dist/components/docs/libraries/LibrariesPersonalizationPage.js +47 -47
  114. package/dist/components/docs/libraries/LibrariesProgressiveDeliveryPage.js +53 -53
  115. package/dist/components/docs/libraries/LibrariesResiliencePage.js +49 -49
  116. package/dist/components/docs/libraries/LibrariesRuntimePage.js +87 -87
  117. package/dist/components/docs/libraries/LibrariesSLOPage.js +47 -47
  118. package/dist/components/docs/libraries/LibrariesSchemaPage.js +139 -139
  119. package/dist/components/docs/libraries/LibrariesSupportBotPage.js +57 -57
  120. package/dist/components/docs/libraries/LibrariesTestingPage.js +49 -49
  121. package/dist/components/docs/libraries/LibrariesUIKitPage.js +107 -107
  122. package/dist/components/docs/libraries/LibrariesWorkflowComposerPage.js +35 -35
  123. package/dist/components/docs/libraries/LibrariesWorkflowsPage.js +89 -89
  124. package/dist/components/docs/libraries/index.js +1919 -1919
  125. package/dist/components/docs/manifesto/ManifestoPage.js +79 -79
  126. package/dist/components/docs/ops/AutoEvolutionOpsPage.js +59 -59
  127. package/dist/components/docs/ops/DistributedTracingOpsPage.js +33 -33
  128. package/dist/components/docs/ops/index.js +92 -92
  129. package/dist/components/docs/reference/DocsMarkdownContent.js +27 -27
  130. package/dist/components/docs/reference/DocsReferenceContent.js +34 -34
  131. package/dist/components/docs/reference/DocsReferenceIndexClient.js +23 -23
  132. package/dist/components/docs/reference/DocsReferenceIndexPage.js +26 -26
  133. package/dist/components/docs/reference/DocsReferencePage.js +37 -37
  134. package/dist/components/docs/reference/index.js +63 -63
  135. package/dist/components/docs/safety/SafetyAuditingPage.js +161 -161
  136. package/dist/components/docs/safety/SafetyMigrationsPage.js +169 -169
  137. package/dist/components/docs/safety/SafetyOverviewPage.js +99 -99
  138. package/dist/components/docs/safety/SafetyPDPPage.js +137 -137
  139. package/dist/components/docs/safety/SafetySecurityTrustPage.js +95 -95
  140. package/dist/components/docs/safety/SafetySigningPage.js +39 -39
  141. package/dist/components/docs/safety/SafetyTenantIsolationPage.js +33 -33
  142. package/dist/components/docs/safety/index.js +733 -733
  143. package/dist/components/docs/shared/StudioPrompt.js +9 -9
  144. package/dist/components/docs/specs/SpecsCapabilitiesPage.js +61 -61
  145. package/dist/components/docs/specs/SpecsDataViewsPage.js +119 -119
  146. package/dist/components/docs/specs/SpecsOverlaysPage.js +171 -171
  147. package/dist/components/docs/specs/SpecsOverviewPage.js +167 -167
  148. package/dist/components/docs/specs/SpecsPolicyPage.js +179 -179
  149. package/dist/components/docs/specs/SpecsWorkflowsPage.js +141 -141
  150. package/dist/components/docs/specs/index.js +838 -838
  151. package/dist/components/docs/studio/StudioBYOKPage.js +9 -9
  152. package/dist/components/docs/studio/StudioDeploymentsPage.js +9 -9
  153. package/dist/components/docs/studio/StudioGettingStartedPage.js +9 -9
  154. package/dist/components/docs/studio/StudioIntegrationsPage.js +9 -9
  155. package/dist/components/docs/studio/StudioOverviewPage.js +33 -33
  156. package/dist/components/docs/studio/StudioVisualBuilderPage.js +9 -9
  157. package/dist/components/docs/studio/index.js +78 -78
  158. package/dist/components/integrations/index.js +209 -209
  159. package/dist/components/integrations/molecules/IntegrationCard.js +33 -33
  160. package/dist/components/integrations/organisms/IntegrationMarketplace.js +71 -71
  161. package/dist/components/integrations/organisms/IntegrationSettings.js +98 -98
  162. package/dist/components/integrations/organisms/KnowledgeSourceList.js +40 -40
  163. package/dist/components/legal/PrivacyTemplate.js +477 -477
  164. package/dist/components/legal/TermsTemplate.js +421 -421
  165. package/dist/components/legal/index.js +898 -898
  166. package/dist/components/shared/FeatureGateNotice.js +13 -13
  167. package/dist/components/shared/index.js +13 -13
  168. package/dist/components/shell/WorkspaceHeader.js +37 -37
  169. package/dist/components/shell/WorkspaceProjectShellLayout.js +77 -77
  170. package/dist/components/shell/WorkspaceShellRenderer.d.ts +17 -0
  171. package/dist/components/shell/WorkspaceShellRenderer.js +229 -0
  172. package/dist/components/shell/WorkspaceSidebar.js +27 -27
  173. package/dist/components/shell/index.d.ts +1 -0
  174. package/dist/components/shell/index.js +140 -77
  175. package/dist/components/templates/index.js +272 -272
  176. package/dist/components/templates/messaging/ConversationList.js +27 -27
  177. package/dist/components/templates/messaging/MessageComposer.js +27 -27
  178. package/dist/components/templates/messaging/MessageThread.js +18 -18
  179. package/dist/components/templates/messaging/MessagingWorkspace.js +65 -65
  180. package/dist/components/templates/messaging/index.js +65 -65
  181. package/dist/components/templates/recipes/LanguageSwitcher.js +5 -5
  182. package/dist/components/templates/recipes/RecipeCard.js +26 -26
  183. package/dist/components/templates/recipes/RecipeDetail.js +33 -33
  184. package/dist/components/templates/recipes/RecipeList.js +80 -80
  185. package/dist/components/templates/recipes/index.js +80 -80
  186. package/dist/components/templates/todos/FilterBar.js +39 -39
  187. package/dist/components/templates/todos/TaskForm.js +43 -43
  188. package/dist/components/templates/todos/TaskItem.js +30 -30
  189. package/dist/components/templates/todos/TaskList.js +127 -127
  190. package/dist/components/templates/todos/index.js +127 -127
  191. package/dist/index.js +12323 -12260
  192. package/dist/infrastructure/elysia/index.js +8 -8
  193. package/dist/infrastructure/elysia/logger.js +8 -8
  194. package/dist/infrastructure/index.js +8 -8
  195. package/dist/libs/posthog/client.js +2 -2
  196. package/dist/node/application/index.js +8 -8
  197. package/dist/node/application/mcp/cliMcp.js +8 -8
  198. package/dist/node/application/mcp/contractsMcp.js +8 -8
  199. package/dist/node/application/mcp/docsMcp.js +8 -8
  200. package/dist/node/application/mcp/index.js +8 -8
  201. package/dist/node/application/mcp/internalMcp.js +8 -8
  202. package/dist/node/application/mcp/providerRankingMcp.js +8 -8
  203. package/dist/node/bundles/LibraryBundle.js +138 -0
  204. package/dist/node/bundles/index.js +138 -0
  205. package/dist/node/components/docs/DocsIndexPage.js +91 -91
  206. package/dist/node/components/docs/advanced/AdvancedMCPPage.js +125 -125
  207. package/dist/node/components/docs/advanced/AdvancedOverlayEditorPage.js +49 -49
  208. package/dist/node/components/docs/advanced/AdvancedRenderersPage.js +51 -51
  209. package/dist/node/components/docs/advanced/AdvancedSpecExperimentsPage.js +35 -35
  210. package/dist/node/components/docs/advanced/AdvancedTelemetryPage.js +177 -177
  211. package/dist/node/components/docs/advanced/AdvancedWorkflowMonitoringPage.js +45 -45
  212. package/dist/node/components/docs/advanced/index.js +482 -482
  213. package/dist/node/components/docs/architecture/ArchitectureAppConfigPage.js +107 -107
  214. package/dist/node/components/docs/architecture/ArchitectureControlPlanePage.js +73 -73
  215. package/dist/node/components/docs/architecture/ArchitectureIntegrationBindingPage.js +117 -117
  216. package/dist/node/components/docs/architecture/ArchitectureKnowledgeBindingPage.js +175 -175
  217. package/dist/node/components/docs/architecture/ArchitectureMultiTenancyPage.js +71 -71
  218. package/dist/node/components/docs/architecture/ArchitectureOverviewPage.js +205 -205
  219. package/dist/node/components/docs/architecture/index.js +748 -748
  220. package/dist/node/components/docs/comparison/ComparisonAutomationPlatformsPage.js +117 -117
  221. package/dist/node/components/docs/comparison/ComparisonEnterprisePlatformsPage.js +111 -111
  222. package/dist/node/components/docs/comparison/ComparisonInternalToolBuildersPage.js +117 -117
  223. package/dist/node/components/docs/comparison/ComparisonOverviewPage.js +97 -97
  224. package/dist/node/components/docs/comparison/ComparisonWindmillPage.js +125 -125
  225. package/dist/node/components/docs/comparison/ComparisonWorkflowEnginesPage.js +171 -171
  226. package/dist/node/components/docs/comparison/index.js +738 -738
  227. package/dist/node/components/docs/ecosystem/IntegrationsPage.js +45 -45
  228. package/dist/node/components/docs/ecosystem/PluginsPage.js +73 -73
  229. package/dist/node/components/docs/ecosystem/RegistryPage.js +37 -37
  230. package/dist/node/components/docs/ecosystem/TemplatesPage.js +56 -56
  231. package/dist/node/components/docs/ecosystem/index.js +211 -211
  232. package/dist/node/components/docs/examples/DocsExamplesPage.js +21 -21
  233. package/dist/node/components/docs/examples/index.js +21 -21
  234. package/dist/node/components/docs/getting-started/CLIPage.js +95 -95
  235. package/dist/node/components/docs/getting-started/CompatibilityPage.js +81 -81
  236. package/dist/node/components/docs/getting-started/DataViewTutorialPage.js +57 -57
  237. package/dist/node/components/docs/getting-started/DeveloperToolsPage.js +61 -61
  238. package/dist/node/components/docs/getting-started/HelloWorldPage.js +77 -77
  239. package/dist/node/components/docs/getting-started/InstallationPage.js +65 -65
  240. package/dist/node/components/docs/getting-started/StartHerePage.js +51 -51
  241. package/dist/node/components/docs/getting-started/TroubleshootingPage.js +73 -73
  242. package/dist/node/components/docs/getting-started/VSCodeExtensionPage.js +171 -171
  243. package/dist/node/components/docs/getting-started/index.js +731 -731
  244. package/dist/node/components/docs/guides/GuideCIDiffGatingPage.js +80 -80
  245. package/dist/node/components/docs/guides/GuideContractTypesPage.js +232 -232
  246. package/dist/node/components/docs/guides/GuideDocsPipelinePage.js +82 -82
  247. package/dist/node/components/docs/guides/GuideGenerateDocsClientsSchemasPage.js +84 -84
  248. package/dist/node/components/docs/guides/GuideImportExistingCodebasesPage.js +324 -324
  249. package/dist/node/components/docs/guides/GuideNextjsOneEndpointPage.js +106 -106
  250. package/dist/node/components/docs/guides/GuideSpecValidationTypingPage.js +78 -78
  251. package/dist/node/components/docs/guides/GuidesIndexPage.js +43 -43
  252. package/dist/node/components/docs/guides/index.js +975 -975
  253. package/dist/node/components/docs/index.js +10791 -10791
  254. package/dist/node/components/docs/integrations/IntegrationsCircuitBreakersPage.js +17 -17
  255. package/dist/node/components/docs/integrations/IntegrationsElevenLabsPage.js +47 -47
  256. package/dist/node/components/docs/integrations/IntegrationsGithubPage.js +61 -61
  257. package/dist/node/components/docs/integrations/IntegrationsGmailPage.js +49 -49
  258. package/dist/node/components/docs/integrations/IntegrationsGoogleCalendarPage.js +33 -33
  259. package/dist/node/components/docs/integrations/IntegrationsHealthRoutingPage.js +65 -65
  260. package/dist/node/components/docs/integrations/IntegrationsMistralPage.js +69 -69
  261. package/dist/node/components/docs/integrations/IntegrationsOpenAIPage.js +65 -65
  262. package/dist/node/components/docs/integrations/IntegrationsOverviewPage.js +313 -313
  263. package/dist/node/components/docs/integrations/IntegrationsPostmarkPage.js +101 -101
  264. package/dist/node/components/docs/integrations/IntegrationsPowensPage.js +121 -121
  265. package/dist/node/components/docs/integrations/IntegrationsQdrantPage.js +49 -49
  266. package/dist/node/components/docs/integrations/IntegrationsResendPage.js +45 -45
  267. package/dist/node/components/docs/integrations/IntegrationsS3Page.js +57 -57
  268. package/dist/node/components/docs/integrations/IntegrationsSlackPage.js +63 -63
  269. package/dist/node/components/docs/integrations/IntegrationsSpecModelPage.js +139 -139
  270. package/dist/node/components/docs/integrations/IntegrationsStripePage.js +159 -159
  271. package/dist/node/components/docs/integrations/IntegrationsTwilioPage.js +61 -61
  272. package/dist/node/components/docs/integrations/IntegrationsWhatsappMetaPage.js +63 -63
  273. package/dist/node/components/docs/integrations/IntegrationsWhatsappTwilioPage.js +65 -65
  274. package/dist/node/components/docs/integrations/index.js +1642 -1642
  275. package/dist/node/components/docs/intent/ContractFirstApiPage.js +51 -51
  276. package/dist/node/components/docs/intent/DeterministicCodegenPage.js +59 -59
  277. package/dist/node/components/docs/intent/GenerateClientFromSchemaPage.js +85 -85
  278. package/dist/node/components/docs/intent/OpenapiAlternativePage.js +91 -91
  279. package/dist/node/components/docs/intent/SchemaValidationTypescriptPage.js +59 -59
  280. package/dist/node/components/docs/intent/SpecDrivenDevelopmentPage.js +51 -51
  281. package/dist/node/components/docs/intent/index.js +396 -396
  282. package/dist/node/components/docs/knowledge/KnowledgeCategoriesPage.js +371 -371
  283. package/dist/node/components/docs/knowledge/KnowledgeExamplesPage.js +79 -79
  284. package/dist/node/components/docs/knowledge/KnowledgeOverviewPage.js +185 -185
  285. package/dist/node/components/docs/knowledge/KnowledgeSourcesPage.js +187 -187
  286. package/dist/node/components/docs/knowledge/KnowledgeSpacesPage.js +141 -141
  287. package/dist/node/components/docs/knowledge/index.js +963 -963
  288. package/dist/node/components/docs/libraries/LibrariesAccessibilityPage.js +85 -85
  289. package/dist/node/components/docs/libraries/LibrariesAiAgentPage.js +63 -63
  290. package/dist/node/components/docs/libraries/LibrariesAnalyticsPage.js +33 -33
  291. package/dist/node/components/docs/libraries/LibrariesContentGenPage.js +43 -43
  292. package/dist/node/components/docs/libraries/LibrariesContractsPage.js +125 -125
  293. package/dist/node/components/docs/libraries/LibrariesCostTrackingPage.js +45 -45
  294. package/dist/node/components/docs/libraries/LibrariesDataBackendPage.js +69 -69
  295. package/dist/node/components/docs/libraries/LibrariesDataViewsPage.js +79 -79
  296. package/dist/node/components/docs/libraries/LibrariesDesignSystemPage.js +129 -129
  297. package/dist/node/components/docs/libraries/LibrariesEvolutionPage.js +49 -49
  298. package/dist/node/components/docs/libraries/LibrariesGraphQLPage.js +73 -73
  299. package/dist/node/components/docs/libraries/LibrariesGrowthPage.js +35 -35
  300. package/dist/node/components/docs/libraries/LibrariesMultiTenancyPage.js +43 -43
  301. package/dist/node/components/docs/libraries/LibrariesObservabilityPage.js +53 -53
  302. package/dist/node/components/docs/libraries/LibrariesOverlayEnginePage.js +45 -45
  303. package/dist/node/components/docs/libraries/LibrariesOverviewPage.js +191 -191
  304. package/dist/node/components/docs/libraries/LibrariesPersonalizationPage.js +47 -47
  305. package/dist/node/components/docs/libraries/LibrariesProgressiveDeliveryPage.js +53 -53
  306. package/dist/node/components/docs/libraries/LibrariesResiliencePage.js +49 -49
  307. package/dist/node/components/docs/libraries/LibrariesRuntimePage.js +87 -87
  308. package/dist/node/components/docs/libraries/LibrariesSLOPage.js +47 -47
  309. package/dist/node/components/docs/libraries/LibrariesSchemaPage.js +139 -139
  310. package/dist/node/components/docs/libraries/LibrariesSupportBotPage.js +57 -57
  311. package/dist/node/components/docs/libraries/LibrariesTestingPage.js +49 -49
  312. package/dist/node/components/docs/libraries/LibrariesUIKitPage.js +107 -107
  313. package/dist/node/components/docs/libraries/LibrariesWorkflowComposerPage.js +35 -35
  314. package/dist/node/components/docs/libraries/LibrariesWorkflowsPage.js +89 -89
  315. package/dist/node/components/docs/libraries/index.js +1919 -1919
  316. package/dist/node/components/docs/manifesto/ManifestoPage.js +79 -79
  317. package/dist/node/components/docs/ops/AutoEvolutionOpsPage.js +59 -59
  318. package/dist/node/components/docs/ops/DistributedTracingOpsPage.js +33 -33
  319. package/dist/node/components/docs/ops/index.js +92 -92
  320. package/dist/node/components/docs/reference/DocsMarkdownContent.js +27 -27
  321. package/dist/node/components/docs/reference/DocsReferenceContent.js +34 -34
  322. package/dist/node/components/docs/reference/DocsReferenceIndexClient.js +23 -23
  323. package/dist/node/components/docs/reference/DocsReferenceIndexPage.js +26 -26
  324. package/dist/node/components/docs/reference/DocsReferencePage.js +37 -37
  325. package/dist/node/components/docs/reference/index.js +63 -63
  326. package/dist/node/components/docs/safety/SafetyAuditingPage.js +161 -161
  327. package/dist/node/components/docs/safety/SafetyMigrationsPage.js +169 -169
  328. package/dist/node/components/docs/safety/SafetyOverviewPage.js +99 -99
  329. package/dist/node/components/docs/safety/SafetyPDPPage.js +137 -137
  330. package/dist/node/components/docs/safety/SafetySecurityTrustPage.js +95 -95
  331. package/dist/node/components/docs/safety/SafetySigningPage.js +39 -39
  332. package/dist/node/components/docs/safety/SafetyTenantIsolationPage.js +33 -33
  333. package/dist/node/components/docs/safety/index.js +733 -733
  334. package/dist/node/components/docs/shared/StudioPrompt.js +9 -9
  335. package/dist/node/components/docs/specs/SpecsCapabilitiesPage.js +61 -61
  336. package/dist/node/components/docs/specs/SpecsDataViewsPage.js +119 -119
  337. package/dist/node/components/docs/specs/SpecsOverlaysPage.js +171 -171
  338. package/dist/node/components/docs/specs/SpecsOverviewPage.js +167 -167
  339. package/dist/node/components/docs/specs/SpecsPolicyPage.js +179 -179
  340. package/dist/node/components/docs/specs/SpecsWorkflowsPage.js +141 -141
  341. package/dist/node/components/docs/specs/index.js +838 -838
  342. package/dist/node/components/docs/studio/StudioBYOKPage.js +9 -9
  343. package/dist/node/components/docs/studio/StudioDeploymentsPage.js +9 -9
  344. package/dist/node/components/docs/studio/StudioGettingStartedPage.js +9 -9
  345. package/dist/node/components/docs/studio/StudioIntegrationsPage.js +9 -9
  346. package/dist/node/components/docs/studio/StudioOverviewPage.js +33 -33
  347. package/dist/node/components/docs/studio/StudioVisualBuilderPage.js +9 -9
  348. package/dist/node/components/docs/studio/index.js +78 -78
  349. package/dist/node/components/integrations/index.js +209 -209
  350. package/dist/node/components/integrations/molecules/IntegrationCard.js +33 -33
  351. package/dist/node/components/integrations/organisms/IntegrationMarketplace.js +71 -71
  352. package/dist/node/components/integrations/organisms/IntegrationSettings.js +98 -98
  353. package/dist/node/components/integrations/organisms/KnowledgeSourceList.js +40 -40
  354. package/dist/node/components/legal/PrivacyTemplate.js +477 -477
  355. package/dist/node/components/legal/TermsTemplate.js +421 -421
  356. package/dist/node/components/legal/index.js +898 -898
  357. package/dist/node/components/shared/FeatureGateNotice.js +13 -13
  358. package/dist/node/components/shared/index.js +13 -13
  359. package/dist/node/components/shell/WorkspaceHeader.js +37 -37
  360. package/dist/node/components/shell/WorkspaceProjectShellLayout.js +77 -77
  361. package/dist/node/components/shell/WorkspaceShellRenderer.js +228 -0
  362. package/dist/node/components/shell/WorkspaceSidebar.js +27 -27
  363. package/dist/node/components/shell/index.js +140 -77
  364. package/dist/node/components/templates/index.js +272 -272
  365. package/dist/node/components/templates/messaging/ConversationList.js +27 -27
  366. package/dist/node/components/templates/messaging/MessageComposer.js +27 -27
  367. package/dist/node/components/templates/messaging/MessageThread.js +18 -18
  368. package/dist/node/components/templates/messaging/MessagingWorkspace.js +65 -65
  369. package/dist/node/components/templates/messaging/index.js +65 -65
  370. package/dist/node/components/templates/recipes/LanguageSwitcher.js +5 -5
  371. package/dist/node/components/templates/recipes/RecipeCard.js +26 -26
  372. package/dist/node/components/templates/recipes/RecipeDetail.js +33 -33
  373. package/dist/node/components/templates/recipes/RecipeList.js +80 -80
  374. package/dist/node/components/templates/recipes/index.js +80 -80
  375. package/dist/node/components/templates/todos/FilterBar.js +39 -39
  376. package/dist/node/components/templates/todos/TaskForm.js +43 -43
  377. package/dist/node/components/templates/todos/TaskItem.js +30 -30
  378. package/dist/node/components/templates/todos/TaskList.js +127 -127
  379. package/dist/node/components/templates/todos/index.js +127 -127
  380. package/dist/node/index.js +12323 -12260
  381. package/dist/node/infrastructure/elysia/index.js +8 -8
  382. package/dist/node/infrastructure/elysia/logger.js +8 -8
  383. package/dist/node/infrastructure/index.js +8 -8
  384. package/dist/node/libs/posthog/client.js +2 -2
  385. package/dist/node/presentation/features/atoms/FeatureIcon/FeatureIcon.js +3 -3
  386. package/dist/node/presentation/features/atoms/FeatureIcon/index.js +3 -3
  387. package/dist/node/presentation/features/atoms/index.js +3 -3
  388. package/dist/node/presentation/features/index.js +915 -915
  389. package/dist/node/presentation/features/molecules/FeatureCard/FeatureCard.js +101 -101
  390. package/dist/node/presentation/features/molecules/FeatureCard/index.js +101 -101
  391. package/dist/node/presentation/features/molecules/FeatureCategoryHeader/FeatureCategoryHeader.js +15 -15
  392. package/dist/node/presentation/features/molecules/FeatureCategoryHeader/index.js +15 -15
  393. package/dist/node/presentation/features/molecules/FeatureFilters/FeatureFilters.js +23 -23
  394. package/dist/node/presentation/features/molecules/FeatureFilters/index.js +23 -23
  395. package/dist/node/presentation/features/molecules/FeatureHoverPreview/FeatureHoverPreview.js +67 -67
  396. package/dist/node/presentation/features/molecules/FeatureHoverPreview/index.js +67 -67
  397. package/dist/node/presentation/features/molecules/index.js +139 -139
  398. package/dist/node/presentation/features/organisms/FeatureDataViewsList.js +7 -7
  399. package/dist/node/presentation/features/organisms/FeatureDetail/FeatureDetail.js +57 -57
  400. package/dist/node/presentation/features/organisms/FeatureDetail/index.js +57 -57
  401. package/dist/node/presentation/features/organisms/FeatureDiscovery/FeatureDiscovery.js +183 -183
  402. package/dist/node/presentation/features/organisms/FeatureDiscovery/index.js +183 -183
  403. package/dist/node/presentation/features/organisms/FeatureEventsList.js +7 -7
  404. package/dist/node/presentation/features/organisms/FeatureFormsList.js +7 -7
  405. package/dist/node/presentation/features/organisms/FeatureOperationsList.js +7 -7
  406. package/dist/node/presentation/features/organisms/FeaturePresentationsList.js +7 -7
  407. package/dist/node/presentation/features/organisms/index.js +275 -275
  408. package/dist/node/presentation/features/templates/FeatureDataViewDetailTemplate/FeatureDataViewDetailTemplate.js +126 -126
  409. package/dist/node/presentation/features/templates/FeatureDataViewDetailTemplate/index.js +126 -126
  410. package/dist/node/presentation/features/templates/FeatureDataViewsTemplate/FeatureDataViewsTemplate.js +16 -16
  411. package/dist/node/presentation/features/templates/FeatureDataViewsTemplate/index.js +16 -16
  412. package/dist/node/presentation/features/templates/FeatureEventDetailTemplate/FeatureEventDetailTemplate.js +112 -112
  413. package/dist/node/presentation/features/templates/FeatureEventDetailTemplate/index.js +112 -112
  414. package/dist/node/presentation/features/templates/FeatureEventsTemplate/FeatureEventsTemplate.js +16 -16
  415. package/dist/node/presentation/features/templates/FeatureEventsTemplate/index.js +16 -16
  416. package/dist/node/presentation/features/templates/FeatureFormDetailTemplate/FeatureFormDetailTemplate.js +126 -126
  417. package/dist/node/presentation/features/templates/FeatureFormDetailTemplate/index.js +126 -126
  418. package/dist/node/presentation/features/templates/FeatureFormsTemplate/FeatureFormsTemplate.js +16 -16
  419. package/dist/node/presentation/features/templates/FeatureFormsTemplate/index.js +16 -16
  420. package/dist/node/presentation/features/templates/FeatureOperationDetailTemplate/FeatureOperationDetailTemplate.js +110 -110
  421. package/dist/node/presentation/features/templates/FeatureOperationDetailTemplate/index.js +110 -110
  422. package/dist/node/presentation/features/templates/FeatureOperationsTemplate/FeatureOperationsTemplate.js +16 -16
  423. package/dist/node/presentation/features/templates/FeatureOperationsTemplate/index.js +16 -16
  424. package/dist/node/presentation/features/templates/FeatureOverviewTemplate/FeatureOverviewTemplate.js +66 -66
  425. package/dist/node/presentation/features/templates/FeatureOverviewTemplate/index.js +66 -66
  426. package/dist/node/presentation/features/templates/FeaturePresentationDetailTemplate/FeaturePresentationDetailTemplate.js +112 -112
  427. package/dist/node/presentation/features/templates/FeaturePresentationDetailTemplate/index.js +112 -112
  428. package/dist/node/presentation/features/templates/FeaturePresentationsTemplate/FeaturePresentationsTemplate.js +16 -16
  429. package/dist/node/presentation/features/templates/FeaturePresentationsTemplate/index.js +16 -16
  430. package/dist/presentation/features/atoms/FeatureIcon/FeatureIcon.js +3 -3
  431. package/dist/presentation/features/atoms/FeatureIcon/index.js +3 -3
  432. package/dist/presentation/features/atoms/index.js +3 -3
  433. package/dist/presentation/features/index.js +915 -915
  434. package/dist/presentation/features/molecules/FeatureCard/FeatureCard.js +101 -101
  435. package/dist/presentation/features/molecules/FeatureCard/index.js +101 -101
  436. package/dist/presentation/features/molecules/FeatureCategoryHeader/FeatureCategoryHeader.js +15 -15
  437. package/dist/presentation/features/molecules/FeatureCategoryHeader/index.js +15 -15
  438. package/dist/presentation/features/molecules/FeatureFilters/FeatureFilters.js +23 -23
  439. package/dist/presentation/features/molecules/FeatureFilters/index.js +23 -23
  440. package/dist/presentation/features/molecules/FeatureHoverPreview/FeatureHoverPreview.js +67 -67
  441. package/dist/presentation/features/molecules/FeatureHoverPreview/index.js +67 -67
  442. package/dist/presentation/features/molecules/index.js +139 -139
  443. package/dist/presentation/features/organisms/FeatureDataViewsList.js +7 -7
  444. package/dist/presentation/features/organisms/FeatureDetail/FeatureDetail.js +57 -57
  445. package/dist/presentation/features/organisms/FeatureDetail/index.js +57 -57
  446. package/dist/presentation/features/organisms/FeatureDiscovery/FeatureDiscovery.js +183 -183
  447. package/dist/presentation/features/organisms/FeatureDiscovery/index.js +183 -183
  448. package/dist/presentation/features/organisms/FeatureEventsList.js +7 -7
  449. package/dist/presentation/features/organisms/FeatureFormsList.js +7 -7
  450. package/dist/presentation/features/organisms/FeatureOperationsList.js +7 -7
  451. package/dist/presentation/features/organisms/FeaturePresentationsList.js +7 -7
  452. package/dist/presentation/features/organisms/index.js +275 -275
  453. package/dist/presentation/features/templates/FeatureDataViewDetailTemplate/FeatureDataViewDetailTemplate.js +126 -126
  454. package/dist/presentation/features/templates/FeatureDataViewDetailTemplate/index.js +126 -126
  455. package/dist/presentation/features/templates/FeatureDataViewsTemplate/FeatureDataViewsTemplate.js +16 -16
  456. package/dist/presentation/features/templates/FeatureDataViewsTemplate/index.js +16 -16
  457. package/dist/presentation/features/templates/FeatureEventDetailTemplate/FeatureEventDetailTemplate.js +112 -112
  458. package/dist/presentation/features/templates/FeatureEventDetailTemplate/index.js +112 -112
  459. package/dist/presentation/features/templates/FeatureEventsTemplate/FeatureEventsTemplate.js +16 -16
  460. package/dist/presentation/features/templates/FeatureEventsTemplate/index.js +16 -16
  461. package/dist/presentation/features/templates/FeatureFormDetailTemplate/FeatureFormDetailTemplate.js +126 -126
  462. package/dist/presentation/features/templates/FeatureFormDetailTemplate/index.js +126 -126
  463. package/dist/presentation/features/templates/FeatureFormsTemplate/FeatureFormsTemplate.js +16 -16
  464. package/dist/presentation/features/templates/FeatureFormsTemplate/index.js +16 -16
  465. package/dist/presentation/features/templates/FeatureOperationDetailTemplate/FeatureOperationDetailTemplate.js +110 -110
  466. package/dist/presentation/features/templates/FeatureOperationDetailTemplate/index.js +110 -110
  467. package/dist/presentation/features/templates/FeatureOperationsTemplate/FeatureOperationsTemplate.js +16 -16
  468. package/dist/presentation/features/templates/FeatureOperationsTemplate/index.js +16 -16
  469. package/dist/presentation/features/templates/FeatureOverviewTemplate/FeatureOverviewTemplate.js +66 -66
  470. package/dist/presentation/features/templates/FeatureOverviewTemplate/index.js +66 -66
  471. package/dist/presentation/features/templates/FeaturePresentationDetailTemplate/FeaturePresentationDetailTemplate.js +112 -112
  472. package/dist/presentation/features/templates/FeaturePresentationDetailTemplate/index.js +112 -112
  473. package/dist/presentation/features/templates/FeaturePresentationsTemplate/FeaturePresentationsTemplate.js +16 -16
  474. package/dist/presentation/features/templates/FeaturePresentationsTemplate/index.js +16 -16
  475. package/package.json +71 -22
  476. package/src/bundles/LibraryBundle.ts +152 -0
  477. package/src/bundles/index.ts +1 -0
  478. package/src/components/shell/WorkspaceShellRenderer.tsx +90 -0
  479. package/src/components/shell/index.ts +1 -0
@@ -1,514 +1,514 @@
1
1
  // src/components/docs/safety/SafetyOverviewPage.tsx
2
2
  import Link from "@contractspec/lib.ui-link";
3
3
  import { ChevronRight } from "lucide-react";
4
- import { jsxDEV } from "react/jsx-dev-runtime";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
5
  function SafetyOverviewPage() {
6
- return /* @__PURE__ */ jsxDEV("div", {
6
+ return /* @__PURE__ */ jsxs("div", {
7
7
  className: "space-y-8",
8
8
  children: [
9
- /* @__PURE__ */ jsxDEV("div", {
9
+ /* @__PURE__ */ jsxs("div", {
10
10
  className: "space-y-4",
11
11
  children: [
12
- /* @__PURE__ */ jsxDEV("h1", {
12
+ /* @__PURE__ */ jsx("h1", {
13
13
  className: "text-4xl font-bold",
14
14
  children: "Safety Overview"
15
- }, undefined, false, undefined, this),
16
- /* @__PURE__ */ jsxDEV("p", {
15
+ }),
16
+ /* @__PURE__ */ jsxs("p", {
17
17
  className: "text-muted-foreground",
18
18
  children: [
19
19
  "ContractSpec is designed with ",
20
- /* @__PURE__ */ jsxDEV("strong", {
20
+ /* @__PURE__ */ jsx("strong", {
21
21
  children: "safety by default"
22
- }, undefined, false, undefined, this),
22
+ }),
23
23
  ". Every operation is governed by policies, every change is audited, and every deployment is reversible. This section covers the core safety mechanisms that protect your application and data."
24
24
  ]
25
- }, undefined, true, undefined, this)
25
+ })
26
26
  ]
27
- }, undefined, true, undefined, this),
28
- /* @__PURE__ */ jsxDEV("div", {
27
+ }),
28
+ /* @__PURE__ */ jsxs("div", {
29
29
  className: "space-y-4",
30
30
  children: [
31
- /* @__PURE__ */ jsxDEV("h2", {
31
+ /* @__PURE__ */ jsx("h2", {
32
32
  className: "text-2xl font-bold",
33
33
  children: "Core safety features"
34
- }, undefined, false, undefined, this),
35
- /* @__PURE__ */ jsxDEV("div", {
34
+ }),
35
+ /* @__PURE__ */ jsxs("div", {
36
36
  className: "space-y-6",
37
37
  children: [
38
- /* @__PURE__ */ jsxDEV("div", {
38
+ /* @__PURE__ */ jsxs("div", {
39
39
  className: "space-y-2",
40
40
  children: [
41
- /* @__PURE__ */ jsxDEV("h3", {
41
+ /* @__PURE__ */ jsx("h3", {
42
42
  className: "text-xl font-semibold",
43
- children: /* @__PURE__ */ jsxDEV(Link, {
43
+ children: /* @__PURE__ */ jsx(Link, {
44
44
  href: "/docs/safety/signing",
45
45
  className: "text-violet-400 hover:text-violet-300",
46
46
  children: "Spec Signing"
47
- }, undefined, false, undefined, this)
48
- }, undefined, false, undefined, this),
49
- /* @__PURE__ */ jsxDEV("p", {
47
+ })
48
+ }),
49
+ /* @__PURE__ */ jsx("p", {
50
50
  className: "text-muted-foreground",
51
51
  children: "All specifications are cryptographically signed before deployment. This ensures that only authorized changes reach production and that specs cannot be tampered with in transit or at rest. Signatures are verified at runtime, and unsigned specs are rejected."
52
- }, undefined, false, undefined, this)
52
+ })
53
53
  ]
54
- }, undefined, true, undefined, this),
55
- /* @__PURE__ */ jsxDEV("div", {
54
+ }),
55
+ /* @__PURE__ */ jsxs("div", {
56
56
  className: "space-y-2",
57
57
  children: [
58
- /* @__PURE__ */ jsxDEV("h3", {
58
+ /* @__PURE__ */ jsx("h3", {
59
59
  className: "text-xl font-semibold",
60
- children: /* @__PURE__ */ jsxDEV(Link, {
60
+ children: /* @__PURE__ */ jsx(Link, {
61
61
  href: "/docs/safety/pdp",
62
62
  className: "text-violet-400 hover:text-violet-300",
63
63
  children: "Policy Decision Points (PDP)"
64
- }, undefined, false, undefined, this)
65
- }, undefined, false, undefined, this),
66
- /* @__PURE__ */ jsxDEV("p", {
64
+ })
65
+ }),
66
+ /* @__PURE__ */ jsx("p", {
67
67
  className: "text-muted-foreground",
68
68
  children: "Every API call, UI render, and data access passes through a centralized Policy Decision Point. The PDP evaluates attribute-based access control (ABAC) rules and PII policies to determine whether the operation is allowed. This ensures consistent enforcement across your entire application."
69
- }, undefined, false, undefined, this)
69
+ })
70
70
  ]
71
- }, undefined, true, undefined, this),
72
- /* @__PURE__ */ jsxDEV("div", {
71
+ }),
72
+ /* @__PURE__ */ jsxs("div", {
73
73
  className: "space-y-2",
74
74
  children: [
75
- /* @__PURE__ */ jsxDEV("h3", {
75
+ /* @__PURE__ */ jsx("h3", {
76
76
  className: "text-xl font-semibold",
77
- children: /* @__PURE__ */ jsxDEV(Link, {
77
+ children: /* @__PURE__ */ jsx(Link, {
78
78
  href: "/docs/safety/auditing",
79
79
  className: "text-violet-400 hover:text-violet-300",
80
80
  children: "Audit Logs"
81
- }, undefined, false, undefined, this)
82
- }, undefined, false, undefined, this),
83
- /* @__PURE__ */ jsxDEV("p", {
81
+ })
82
+ }),
83
+ /* @__PURE__ */ jsx("p", {
84
84
  className: "text-muted-foreground",
85
85
  children: "ContractSpec automatically records every operation in tamper-evident audit logs. These logs capture who did what, when, and why—including policy decisions, data access, and administrative actions. Audit logs are essential for compliance, security investigations, and debugging."
86
- }, undefined, false, undefined, this)
86
+ })
87
87
  ]
88
- }, undefined, true, undefined, this),
89
- /* @__PURE__ */ jsxDEV("div", {
88
+ }),
89
+ /* @__PURE__ */ jsxs("div", {
90
90
  className: "space-y-2",
91
91
  children: [
92
- /* @__PURE__ */ jsxDEV("h3", {
92
+ /* @__PURE__ */ jsx("h3", {
93
93
  className: "text-xl font-semibold",
94
- children: /* @__PURE__ */ jsxDEV(Link, {
94
+ children: /* @__PURE__ */ jsx(Link, {
95
95
  href: "/docs/safety/migrations",
96
96
  className: "text-violet-400 hover:text-violet-300",
97
97
  children: "Migrations"
98
- }, undefined, false, undefined, this)
99
- }, undefined, false, undefined, this),
100
- /* @__PURE__ */ jsxDEV("p", {
98
+ })
99
+ }),
100
+ /* @__PURE__ */ jsxs("p", {
101
101
  className: "text-muted-foreground",
102
102
  children: [
103
103
  "Schema and data migrations are managed through",
104
104
  " ",
105
- /* @__PURE__ */ jsxDEV("strong", {
105
+ /* @__PURE__ */ jsx("strong", {
106
106
  children: "MigrationSpecs"
107
- }, undefined, false, undefined, this),
107
+ }),
108
108
  ". Each migration is versioned, reversible, and tested before deployment. This allows you to evolve your application safely without downtime or data loss."
109
109
  ]
110
- }, undefined, true, undefined, this)
110
+ })
111
111
  ]
112
- }, undefined, true, undefined, this),
113
- /* @__PURE__ */ jsxDEV("div", {
112
+ }),
113
+ /* @__PURE__ */ jsxs("div", {
114
114
  className: "space-y-2",
115
115
  children: [
116
- /* @__PURE__ */ jsxDEV("h3", {
116
+ /* @__PURE__ */ jsx("h3", {
117
117
  className: "text-xl font-semibold",
118
118
  children: "Dark Launch & Rollback"
119
- }, undefined, false, undefined, this),
120
- /* @__PURE__ */ jsxDEV("p", {
119
+ }),
120
+ /* @__PURE__ */ jsx("p", {
121
121
  className: "text-muted-foreground",
122
122
  children: 'New features can be deployed in "dark launch" mode, where they run in production but are not visible to users. This allows you to test performance and correctness with real traffic before enabling the feature. If issues arise, you can instantly roll back to the previous version without redeploying.'
123
- }, undefined, false, undefined, this)
123
+ })
124
124
  ]
125
- }, undefined, true, undefined, this),
126
- /* @__PURE__ */ jsxDEV("div", {
125
+ }),
126
+ /* @__PURE__ */ jsxs("div", {
127
127
  className: "space-y-2",
128
128
  children: [
129
- /* @__PURE__ */ jsxDEV("h3", {
129
+ /* @__PURE__ */ jsx("h3", {
130
130
  className: "text-xl font-semibold",
131
131
  children: "Data Classification"
132
- }, undefined, false, undefined, this),
133
- /* @__PURE__ */ jsxDEV("p", {
132
+ }),
133
+ /* @__PURE__ */ jsx("p", {
134
134
  className: "text-muted-foreground",
135
135
  children: "Fields in your specs can be tagged with sensitivity levels (e.g., PII, PHI, confidential). The policy engine uses these tags to enforce access controls, redaction rules, and data retention policies automatically. This reduces the risk of accidental data leaks."
136
- }, undefined, false, undefined, this)
136
+ })
137
137
  ]
138
- }, undefined, true, undefined, this)
138
+ })
139
139
  ]
140
- }, undefined, true, undefined, this)
140
+ })
141
141
  ]
142
- }, undefined, true, undefined, this),
143
- /* @__PURE__ */ jsxDEV("div", {
142
+ }),
143
+ /* @__PURE__ */ jsxs("div", {
144
144
  className: "space-y-4",
145
145
  children: [
146
- /* @__PURE__ */ jsxDEV("h2", {
146
+ /* @__PURE__ */ jsx("h2", {
147
147
  className: "text-2xl font-bold",
148
148
  children: "Why safety matters"
149
- }, undefined, false, undefined, this),
150
- /* @__PURE__ */ jsxDEV("p", {
149
+ }),
150
+ /* @__PURE__ */ jsx("p", {
151
151
  className: "text-muted-foreground",
152
152
  children: "Modern applications handle sensitive data and critical operations. A single bug or misconfiguration can lead to data breaches, compliance violations, or service outages. ContractSpec's safety features are not optional add-ons—they are built into the core platform and enforced automatically."
153
- }, undefined, false, undefined, this),
154
- /* @__PURE__ */ jsxDEV("p", {
153
+ }),
154
+ /* @__PURE__ */ jsx("p", {
155
155
  className: "text-muted-foreground",
156
156
  children: "By making safety the default, ContractSpec allows you to move fast without breaking things. You can deploy new features confidently, knowing that policies are enforced, changes are audited, and rollbacks are always available."
157
- }, undefined, false, undefined, this)
157
+ })
158
158
  ]
159
- }, undefined, true, undefined, this),
160
- /* @__PURE__ */ jsxDEV("div", {
159
+ }),
160
+ /* @__PURE__ */ jsxs("div", {
161
161
  className: "space-y-4",
162
162
  children: [
163
- /* @__PURE__ */ jsxDEV("h2", {
163
+ /* @__PURE__ */ jsx("h2", {
164
164
  className: "text-2xl font-bold",
165
165
  children: "Next steps"
166
- }, undefined, false, undefined, this),
167
- /* @__PURE__ */ jsxDEV("p", {
166
+ }),
167
+ /* @__PURE__ */ jsx("p", {
168
168
  className: "text-muted-foreground",
169
169
  children: "Explore each safety feature in detail using the links above, or continue with the advanced topics:"
170
- }, undefined, false, undefined, this),
171
- /* @__PURE__ */ jsxDEV("div", {
170
+ }),
171
+ /* @__PURE__ */ jsxs("div", {
172
172
  className: "flex flex-wrap gap-4 pt-4",
173
173
  children: [
174
- /* @__PURE__ */ jsxDEV(Link, {
174
+ /* @__PURE__ */ jsxs(Link, {
175
175
  href: "/docs/safety/signing",
176
176
  className: "btn-primary",
177
177
  children: [
178
178
  "Spec Signing ",
179
- /* @__PURE__ */ jsxDEV(ChevronRight, {
179
+ /* @__PURE__ */ jsx(ChevronRight, {
180
180
  size: 16,
181
181
  className: "inline"
182
- }, undefined, false, undefined, this)
182
+ })
183
183
  ]
184
- }, undefined, true, undefined, this),
185
- /* @__PURE__ */ jsxDEV(Link, {
184
+ }),
185
+ /* @__PURE__ */ jsxs(Link, {
186
186
  href: "/docs/safety/pdp",
187
187
  className: "btn-ghost",
188
188
  children: [
189
189
  "Policy Decision Points ",
190
- /* @__PURE__ */ jsxDEV(ChevronRight, {
190
+ /* @__PURE__ */ jsx(ChevronRight, {
191
191
  size: 16,
192
192
  className: "inline"
193
- }, undefined, false, undefined, this)
193
+ })
194
194
  ]
195
- }, undefined, true, undefined, this),
196
- /* @__PURE__ */ jsxDEV(Link, {
195
+ }),
196
+ /* @__PURE__ */ jsxs(Link, {
197
197
  href: "/docs/safety/auditing",
198
198
  className: "btn-ghost",
199
199
  children: [
200
200
  "Audit Logs ",
201
- /* @__PURE__ */ jsxDEV(ChevronRight, {
201
+ /* @__PURE__ */ jsx(ChevronRight, {
202
202
  size: 16,
203
203
  className: "inline"
204
- }, undefined, false, undefined, this)
204
+ })
205
205
  ]
206
- }, undefined, true, undefined, this),
207
- /* @__PURE__ */ jsxDEV(Link, {
206
+ }),
207
+ /* @__PURE__ */ jsxs(Link, {
208
208
  href: "/docs/safety/migrations",
209
209
  className: "btn-ghost",
210
210
  children: [
211
211
  "Migrations ",
212
- /* @__PURE__ */ jsxDEV(ChevronRight, {
212
+ /* @__PURE__ */ jsx(ChevronRight, {
213
213
  size: 16,
214
214
  className: "inline"
215
- }, undefined, false, undefined, this)
215
+ })
216
216
  ]
217
- }, undefined, true, undefined, this),
218
- /* @__PURE__ */ jsxDEV(Link, {
217
+ }),
218
+ /* @__PURE__ */ jsxs(Link, {
219
219
  href: "/docs/safety/security-trust",
220
220
  className: "btn-ghost",
221
221
  children: [
222
222
  "Security & Trust ",
223
- /* @__PURE__ */ jsxDEV(ChevronRight, {
223
+ /* @__PURE__ */ jsx(ChevronRight, {
224
224
  size: 16,
225
225
  className: "inline"
226
- }, undefined, false, undefined, this)
226
+ })
227
227
  ]
228
- }, undefined, true, undefined, this)
228
+ })
229
229
  ]
230
- }, undefined, true, undefined, this)
230
+ })
231
231
  ]
232
- }, undefined, true, undefined, this)
232
+ })
233
233
  ]
234
- }, undefined, true, undefined, this);
234
+ });
235
235
  }
236
236
 
237
237
  // src/components/docs/safety/SafetySigningPage.tsx
238
238
  import Link2 from "@contractspec/lib.ui-link";
239
239
  import { ChevronRight as ChevronRight2 } from "lucide-react";
240
- import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
240
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
241
241
  function SafetySigningPage() {
242
- return /* @__PURE__ */ jsxDEV2("div", {
242
+ return /* @__PURE__ */ jsxs2("div", {
243
243
  className: "space-y-8",
244
244
  children: [
245
- /* @__PURE__ */ jsxDEV2("div", {
245
+ /* @__PURE__ */ jsxs2("div", {
246
246
  className: "space-y-2",
247
247
  children: [
248
- /* @__PURE__ */ jsxDEV2("h1", {
248
+ /* @__PURE__ */ jsx2("h1", {
249
249
  className: "text-4xl font-bold",
250
250
  children: "Spec Signing"
251
- }, undefined, false, undefined, this),
252
- /* @__PURE__ */ jsxDEV2("p", {
251
+ }),
252
+ /* @__PURE__ */ jsx2("p", {
253
253
  className: "text-muted-foreground text-lg",
254
254
  children: "Signing ensures specs haven't been tampered with and provides an audit trail of all changes."
255
- }, undefined, false, undefined, this)
255
+ })
256
256
  ]
257
- }, undefined, true, undefined, this),
258
- /* @__PURE__ */ jsxDEV2("div", {
257
+ }),
258
+ /* @__PURE__ */ jsxs2("div", {
259
259
  className: "space-y-6",
260
260
  children: [
261
- /* @__PURE__ */ jsxDEV2("div", {
261
+ /* @__PURE__ */ jsxs2("div", {
262
262
  className: "space-y-3",
263
263
  children: [
264
- /* @__PURE__ */ jsxDEV2("h2", {
264
+ /* @__PURE__ */ jsx2("h2", {
265
265
  className: "text-2xl font-bold",
266
266
  children: "How it works"
267
- }, undefined, false, undefined, this),
268
- /* @__PURE__ */ jsxDEV2("p", {
267
+ }),
268
+ /* @__PURE__ */ jsx2("p", {
269
269
  className: "text-muted-foreground",
270
270
  children: "Every spec is cryptographically signed before deployment. The signature proves that the spec hasn't been modified since it was signed and creates a permanent record of who deployed it and when."
271
- }, undefined, false, undefined, this)
271
+ })
272
272
  ]
273
- }, undefined, true, undefined, this),
274
- /* @__PURE__ */ jsxDEV2("div", {
273
+ }),
274
+ /* @__PURE__ */ jsxs2("div", {
275
275
  className: "space-y-3",
276
276
  children: [
277
- /* @__PURE__ */ jsxDEV2("h2", {
277
+ /* @__PURE__ */ jsx2("h2", {
278
278
  className: "text-2xl font-bold",
279
279
  children: "Signing a spec"
280
- }, undefined, false, undefined, this),
281
- /* @__PURE__ */ jsxDEV2("div", {
280
+ }),
281
+ /* @__PURE__ */ jsx2("div", {
282
282
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
283
- children: /* @__PURE__ */ jsxDEV2("pre", {
283
+ children: /* @__PURE__ */ jsx2("pre", {
284
284
  children: `contractspec sign app.spec.ts --key ~/.contractspec/key.pem
285
285
  contractspec deploy --signed app.spec.ts.signed`
286
- }, undefined, false, undefined, this)
287
- }, undefined, false, undefined, this)
286
+ })
287
+ })
288
288
  ]
289
- }, undefined, true, undefined, this),
290
- /* @__PURE__ */ jsxDEV2("div", {
289
+ }),
290
+ /* @__PURE__ */ jsxs2("div", {
291
291
  className: "space-y-3",
292
292
  children: [
293
- /* @__PURE__ */ jsxDEV2("h2", {
293
+ /* @__PURE__ */ jsx2("h2", {
294
294
  className: "text-2xl font-bold",
295
295
  children: "Verifying signatures"
296
- }, undefined, false, undefined, this),
297
- /* @__PURE__ */ jsxDEV2("div", {
296
+ }),
297
+ /* @__PURE__ */ jsx2("div", {
298
298
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
299
- children: /* @__PURE__ */ jsxDEV2("pre", {
299
+ children: /* @__PURE__ */ jsx2("pre", {
300
300
  children: `contractspec verify app.spec.ts.signed
301
301
  # Output: ✓ Signature valid
302
302
  # Signed by: alice@example.com
303
303
  # Timestamp: 2024-11-08T10:30:00Z`
304
- }, undefined, false, undefined, this)
305
- }, undefined, false, undefined, this)
304
+ })
305
+ })
306
306
  ]
307
- }, undefined, true, undefined, this),
308
- /* @__PURE__ */ jsxDEV2("div", {
307
+ }),
308
+ /* @__PURE__ */ jsx2("div", {
309
309
  className: "flex items-center gap-4 pt-4",
310
- children: /* @__PURE__ */ jsxDEV2(Link2, {
310
+ children: /* @__PURE__ */ jsxs2(Link2, {
311
311
  href: "/docs/safety/pdp",
312
312
  className: "btn-primary",
313
313
  children: [
314
314
  "Next: Policy Decision Points ",
315
- /* @__PURE__ */ jsxDEV2(ChevronRight2, {
315
+ /* @__PURE__ */ jsx2(ChevronRight2, {
316
316
  size: 16
317
- }, undefined, false, undefined, this)
317
+ })
318
318
  ]
319
- }, undefined, true, undefined, this)
320
- }, undefined, false, undefined, this)
319
+ })
320
+ })
321
321
  ]
322
- }, undefined, true, undefined, this)
322
+ })
323
323
  ]
324
- }, undefined, true, undefined, this);
324
+ });
325
325
  }
326
326
 
327
327
  // src/components/docs/safety/SafetyAuditingPage.tsx
328
328
  import Link3 from "@contractspec/lib.ui-link";
329
329
  import { ChevronRight as ChevronRight3 } from "lucide-react";
330
- import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
330
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
331
331
  function SafetyAuditingPage() {
332
- return /* @__PURE__ */ jsxDEV3("div", {
332
+ return /* @__PURE__ */ jsxs3("div", {
333
333
  className: "space-y-8",
334
334
  children: [
335
- /* @__PURE__ */ jsxDEV3("div", {
335
+ /* @__PURE__ */ jsxs3("div", {
336
336
  className: "space-y-4",
337
337
  children: [
338
- /* @__PURE__ */ jsxDEV3("h1", {
338
+ /* @__PURE__ */ jsx3("h1", {
339
339
  className: "text-4xl font-bold",
340
340
  children: "Audit Logs"
341
- }, undefined, false, undefined, this),
342
- /* @__PURE__ */ jsxDEV3("p", {
341
+ }),
342
+ /* @__PURE__ */ jsxs3("p", {
343
343
  className: "text-muted-foreground",
344
344
  children: [
345
345
  "An ",
346
- /* @__PURE__ */ jsxDEV3("strong", {
346
+ /* @__PURE__ */ jsx3("strong", {
347
347
  children: "audit log"
348
- }, undefined, false, undefined, this),
348
+ }),
349
349
  " (also called an audit trail) is a chronological record of system activities. According to",
350
350
  " ",
351
- /* @__PURE__ */ jsxDEV3("a", {
351
+ /* @__PURE__ */ jsx3("a", {
352
352
  href: "https://www.sumologic.com/glossary/audit-log/",
353
353
  target: "_blank",
354
354
  rel: "noopener noreferrer",
355
355
  className: "text-violet-400 hover:text-violet-300",
356
356
  children: "Sumo Logic"
357
- }, undefined, false, undefined, this),
357
+ }),
358
358
  ', audit logs "provide a detailed record of events and changes within a system, enabling organizations to track user actions, system changes, and access to sensitive data."'
359
359
  ]
360
- }, undefined, true, undefined, this)
360
+ })
361
361
  ]
362
- }, undefined, true, undefined, this),
363
- /* @__PURE__ */ jsxDEV3("div", {
362
+ }),
363
+ /* @__PURE__ */ jsxs3("div", {
364
364
  className: "space-y-4",
365
365
  children: [
366
- /* @__PURE__ */ jsxDEV3("h2", {
366
+ /* @__PURE__ */ jsx3("h2", {
367
367
  className: "text-2xl font-bold",
368
368
  children: "Why audit logs matter"
369
- }, undefined, false, undefined, this),
370
- /* @__PURE__ */ jsxDEV3("div", {
369
+ }),
370
+ /* @__PURE__ */ jsxs3("div", {
371
371
  className: "space-y-3",
372
372
  children: [
373
- /* @__PURE__ */ jsxDEV3("div", {
373
+ /* @__PURE__ */ jsxs3("div", {
374
374
  children: [
375
- /* @__PURE__ */ jsxDEV3("h3", {
375
+ /* @__PURE__ */ jsx3("h3", {
376
376
  className: "text-lg font-semibold",
377
377
  children: "Accountability"
378
- }, undefined, false, undefined, this),
379
- /* @__PURE__ */ jsxDEV3("p", {
378
+ }),
379
+ /* @__PURE__ */ jsx3("p", {
380
380
  className: "text-muted-foreground",
381
381
  children: 'Audit logs answer the question "who did what, when?" This is essential for holding users and administrators accountable for their actions. If data is deleted or modified, the audit log shows exactly who made the change.'
382
- }, undefined, false, undefined, this)
382
+ })
383
383
  ]
384
- }, undefined, true, undefined, this),
385
- /* @__PURE__ */ jsxDEV3("div", {
384
+ }),
385
+ /* @__PURE__ */ jsxs3("div", {
386
386
  children: [
387
- /* @__PURE__ */ jsxDEV3("h3", {
387
+ /* @__PURE__ */ jsx3("h3", {
388
388
  className: "text-lg font-semibold",
389
389
  children: "Security"
390
- }, undefined, false, undefined, this),
391
- /* @__PURE__ */ jsxDEV3("p", {
390
+ }),
391
+ /* @__PURE__ */ jsx3("p", {
392
392
  className: "text-muted-foreground",
393
393
  children: "Audit logs help detect and investigate security incidents. For example, if an attacker gains unauthorized access, the logs reveal which resources they accessed and what actions they performed. This information is critical for incident response and forensics."
394
- }, undefined, false, undefined, this)
394
+ })
395
395
  ]
396
- }, undefined, true, undefined, this),
397
- /* @__PURE__ */ jsxDEV3("div", {
396
+ }),
397
+ /* @__PURE__ */ jsxs3("div", {
398
398
  children: [
399
- /* @__PURE__ */ jsxDEV3("h3", {
399
+ /* @__PURE__ */ jsx3("h3", {
400
400
  className: "text-lg font-semibold",
401
401
  children: "Compliance"
402
- }, undefined, false, undefined, this),
403
- /* @__PURE__ */ jsxDEV3("p", {
402
+ }),
403
+ /* @__PURE__ */ jsx3("p", {
404
404
  className: "text-muted-foreground",
405
405
  children: "Many regulations (GDPR, HIPAA, SOC 2, PCI DSS) require organizations to maintain audit logs. These logs must be tamper-evident, retained for a specified period, and available for inspection by auditors."
406
- }, undefined, false, undefined, this)
406
+ })
407
407
  ]
408
- }, undefined, true, undefined, this),
409
- /* @__PURE__ */ jsxDEV3("div", {
408
+ }),
409
+ /* @__PURE__ */ jsxs3("div", {
410
410
  children: [
411
- /* @__PURE__ */ jsxDEV3("h3", {
411
+ /* @__PURE__ */ jsx3("h3", {
412
412
  className: "text-lg font-semibold",
413
413
  children: "Debugging"
414
- }, undefined, false, undefined, this),
415
- /* @__PURE__ */ jsxDEV3("p", {
414
+ }),
415
+ /* @__PURE__ */ jsx3("p", {
416
416
  className: "text-muted-foreground",
417
417
  children: "When something goes wrong in production, audit logs provide a detailed timeline of events leading up to the failure. This makes it much easier to diagnose and fix issues."
418
- }, undefined, false, undefined, this)
418
+ })
419
419
  ]
420
- }, undefined, true, undefined, this)
420
+ })
421
421
  ]
422
- }, undefined, true, undefined, this)
422
+ })
423
423
  ]
424
- }, undefined, true, undefined, this),
425
- /* @__PURE__ */ jsxDEV3("div", {
424
+ }),
425
+ /* @__PURE__ */ jsxs3("div", {
426
426
  className: "space-y-4",
427
427
  children: [
428
- /* @__PURE__ */ jsxDEV3("h2", {
428
+ /* @__PURE__ */ jsx3("h2", {
429
429
  className: "text-2xl font-bold",
430
430
  children: "What ContractSpec logs"
431
- }, undefined, false, undefined, this),
432
- /* @__PURE__ */ jsxDEV3("p", {
431
+ }),
432
+ /* @__PURE__ */ jsx3("p", {
433
433
  className: "text-muted-foreground",
434
434
  children: "ContractSpec automatically logs every significant operation, including:"
435
- }, undefined, false, undefined, this),
436
- /* @__PURE__ */ jsxDEV3("ul", {
435
+ }),
436
+ /* @__PURE__ */ jsxs3("ul", {
437
437
  className: "text-muted-foreground list-inside list-disc space-y-2",
438
438
  children: [
439
- /* @__PURE__ */ jsxDEV3("li", {
439
+ /* @__PURE__ */ jsxs3("li", {
440
440
  children: [
441
- /* @__PURE__ */ jsxDEV3("strong", {
441
+ /* @__PURE__ */ jsx3("strong", {
442
442
  children: "API calls"
443
- }, undefined, false, undefined, this),
443
+ }),
444
444
  " – Every invocation of a capability, including inputs, outputs, and the user who made the call."
445
445
  ]
446
- }, undefined, true, undefined, this),
447
- /* @__PURE__ */ jsxDEV3("li", {
446
+ }),
447
+ /* @__PURE__ */ jsxs3("li", {
448
448
  children: [
449
- /* @__PURE__ */ jsxDEV3("strong", {
449
+ /* @__PURE__ */ jsx3("strong", {
450
450
  children: "Policy decisions"
451
- }, undefined, false, undefined, this),
451
+ }),
452
452
  " – Every decision made by the",
453
453
  " ",
454
- /* @__PURE__ */ jsxDEV3(Link3, {
454
+ /* @__PURE__ */ jsx3(Link3, {
455
455
  href: "/docs/safety/pdp",
456
456
  className: "text-violet-400 hover:text-violet-300",
457
457
  children: "Policy Decision Point"
458
- }, undefined, false, undefined, this),
458
+ }),
459
459
  ", including the rule that matched and the reason for the decision."
460
460
  ]
461
- }, undefined, true, undefined, this),
462
- /* @__PURE__ */ jsxDEV3("li", {
461
+ }),
462
+ /* @__PURE__ */ jsxs3("li", {
463
463
  children: [
464
- /* @__PURE__ */ jsxDEV3("strong", {
464
+ /* @__PURE__ */ jsx3("strong", {
465
465
  children: "Data access"
466
- }, undefined, false, undefined, this),
466
+ }),
467
467
  " – Every query to a data view, including which fields were accessed and whether any were redacted."
468
468
  ]
469
- }, undefined, true, undefined, this),
470
- /* @__PURE__ */ jsxDEV3("li", {
469
+ }),
470
+ /* @__PURE__ */ jsxs3("li", {
471
471
  children: [
472
- /* @__PURE__ */ jsxDEV3("strong", {
472
+ /* @__PURE__ */ jsx3("strong", {
473
473
  children: "Workflow execution"
474
- }, undefined, false, undefined, this),
474
+ }),
475
475
  " – Every step in a workflow, including retries, compensations, and failures."
476
476
  ]
477
- }, undefined, true, undefined, this),
478
- /* @__PURE__ */ jsxDEV3("li", {
477
+ }),
478
+ /* @__PURE__ */ jsxs3("li", {
479
479
  children: [
480
- /* @__PURE__ */ jsxDEV3("strong", {
480
+ /* @__PURE__ */ jsx3("strong", {
481
481
  children: "Administrative actions"
482
- }, undefined, false, undefined, this),
482
+ }),
483
483
  " – Spec deployments, configuration changes, user role assignments, and other privileged operations."
484
484
  ]
485
- }, undefined, true, undefined, this),
486
- /* @__PURE__ */ jsxDEV3("li", {
485
+ }),
486
+ /* @__PURE__ */ jsxs3("li", {
487
487
  children: [
488
- /* @__PURE__ */ jsxDEV3("strong", {
488
+ /* @__PURE__ */ jsx3("strong", {
489
489
  children: "Authentication events"
490
- }, undefined, false, undefined, this),
490
+ }),
491
491
  " – Login attempts, password resets, and session expirations."
492
492
  ]
493
- }, undefined, true, undefined, this)
493
+ })
494
494
  ]
495
- }, undefined, true, undefined, this)
495
+ })
496
496
  ]
497
- }, undefined, true, undefined, this),
498
- /* @__PURE__ */ jsxDEV3("div", {
497
+ }),
498
+ /* @__PURE__ */ jsxs3("div", {
499
499
  className: "space-y-4",
500
500
  children: [
501
- /* @__PURE__ */ jsxDEV3("h2", {
501
+ /* @__PURE__ */ jsx3("h2", {
502
502
  className: "text-2xl font-bold",
503
503
  children: "Audit log format"
504
- }, undefined, false, undefined, this),
505
- /* @__PURE__ */ jsxDEV3("p", {
504
+ }),
505
+ /* @__PURE__ */ jsx3("p", {
506
506
  className: "text-muted-foreground",
507
507
  children: "Each audit log entry is a structured JSON object containing:"
508
- }, undefined, false, undefined, this),
509
- /* @__PURE__ */ jsxDEV3("div", {
508
+ }),
509
+ /* @__PURE__ */ jsx3("div", {
510
510
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
511
- children: /* @__PURE__ */ jsxDEV3("pre", {
511
+ children: /* @__PURE__ */ jsx3("pre", {
512
512
  children: `{
513
513
  "timestamp": "2025-11-13T14:32:15.123Z",
514
514
  "eventId": "evt_abc123",
@@ -541,316 +541,316 @@ function SafetyAuditingPage() {
541
541
  "reason": "User has admin role"
542
542
  }
543
543
  }`
544
- }, undefined, false, undefined, this)
545
- }, undefined, false, undefined, this)
544
+ })
545
+ })
546
546
  ]
547
- }, undefined, true, undefined, this),
548
- /* @__PURE__ */ jsxDEV3("div", {
547
+ }),
548
+ /* @__PURE__ */ jsxs3("div", {
549
549
  className: "space-y-4",
550
550
  children: [
551
- /* @__PURE__ */ jsxDEV3("h2", {
551
+ /* @__PURE__ */ jsx3("h2", {
552
552
  className: "text-2xl font-bold",
553
553
  children: "Storage and retention"
554
- }, undefined, false, undefined, this),
555
- /* @__PURE__ */ jsxDEV3("p", {
554
+ }),
555
+ /* @__PURE__ */ jsx3("p", {
556
556
  className: "text-muted-foreground",
557
557
  children: "Audit logs are stored in a tamper-evident append-only log. Once written, entries cannot be modified or deleted. This ensures the integrity of the audit trail."
558
- }, undefined, false, undefined, this),
559
- /* @__PURE__ */ jsxDEV3("p", {
558
+ }),
559
+ /* @__PURE__ */ jsx3("p", {
560
560
  className: "text-muted-foreground",
561
561
  children: "ContractSpec supports multiple storage backends:"
562
- }, undefined, false, undefined, this),
563
- /* @__PURE__ */ jsxDEV3("ul", {
562
+ }),
563
+ /* @__PURE__ */ jsxs3("ul", {
564
564
  className: "text-muted-foreground list-inside list-disc space-y-2",
565
565
  children: [
566
- /* @__PURE__ */ jsxDEV3("li", {
566
+ /* @__PURE__ */ jsxs3("li", {
567
567
  children: [
568
- /* @__PURE__ */ jsxDEV3("strong", {
568
+ /* @__PURE__ */ jsx3("strong", {
569
569
  children: "Local file system"
570
- }, undefined, false, undefined, this),
570
+ }),
571
571
  " – For development and testing."
572
572
  ]
573
- }, undefined, true, undefined, this),
574
- /* @__PURE__ */ jsxDEV3("li", {
573
+ }),
574
+ /* @__PURE__ */ jsxs3("li", {
575
575
  children: [
576
- /* @__PURE__ */ jsxDEV3("strong", {
576
+ /* @__PURE__ */ jsx3("strong", {
577
577
  children: "Cloud object storage"
578
- }, undefined, false, undefined, this),
578
+ }),
579
579
  " – S3, GCS, or Azure Blob Storage for production."
580
580
  ]
581
- }, undefined, true, undefined, this),
582
- /* @__PURE__ */ jsxDEV3("li", {
581
+ }),
582
+ /* @__PURE__ */ jsxs3("li", {
583
583
  children: [
584
- /* @__PURE__ */ jsxDEV3("strong", {
584
+ /* @__PURE__ */ jsx3("strong", {
585
585
  children: "SIEM integration"
586
- }, undefined, false, undefined, this),
586
+ }),
587
587
  " – Forward logs to Splunk, Datadog, or other security information and event management systems."
588
588
  ]
589
- }, undefined, true, undefined, this)
589
+ })
590
590
  ]
591
- }, undefined, true, undefined, this),
592
- /* @__PURE__ */ jsxDEV3("p", {
591
+ }),
592
+ /* @__PURE__ */ jsx3("p", {
593
593
  className: "text-muted-foreground",
594
594
  children: "You can configure retention policies to automatically archive or delete old logs after a specified period (e.g., 7 years for GDPR compliance)."
595
- }, undefined, false, undefined, this)
595
+ })
596
596
  ]
597
- }, undefined, true, undefined, this),
598
- /* @__PURE__ */ jsxDEV3("div", {
597
+ }),
598
+ /* @__PURE__ */ jsxs3("div", {
599
599
  className: "space-y-4",
600
600
  children: [
601
- /* @__PURE__ */ jsxDEV3("h2", {
601
+ /* @__PURE__ */ jsx3("h2", {
602
602
  className: "text-2xl font-bold",
603
603
  children: "Querying audit logs"
604
- }, undefined, false, undefined, this),
605
- /* @__PURE__ */ jsxDEV3("p", {
604
+ }),
605
+ /* @__PURE__ */ jsx3("p", {
606
606
  className: "text-muted-foreground",
607
607
  children: "ContractSpec provides a query API for searching audit logs. You can filter by:"
608
- }, undefined, false, undefined, this),
609
- /* @__PURE__ */ jsxDEV3("ul", {
608
+ }),
609
+ /* @__PURE__ */ jsxs3("ul", {
610
610
  className: "text-muted-foreground list-inside list-disc space-y-2",
611
611
  children: [
612
- /* @__PURE__ */ jsxDEV3("li", {
612
+ /* @__PURE__ */ jsx3("li", {
613
613
  children: "Time range"
614
- }, undefined, false, undefined, this),
615
- /* @__PURE__ */ jsxDEV3("li", {
614
+ }),
615
+ /* @__PURE__ */ jsx3("li", {
616
616
  children: "Event type"
617
- }, undefined, false, undefined, this),
618
- /* @__PURE__ */ jsxDEV3("li", {
617
+ }),
618
+ /* @__PURE__ */ jsx3("li", {
619
619
  children: "Actor (user ID, role, IP address)"
620
- }, undefined, false, undefined, this),
621
- /* @__PURE__ */ jsxDEV3("li", {
620
+ }),
621
+ /* @__PURE__ */ jsx3("li", {
622
622
  children: "Resource (capability, data view, workflow)"
623
- }, undefined, false, undefined, this),
624
- /* @__PURE__ */ jsxDEV3("li", {
623
+ }),
624
+ /* @__PURE__ */ jsx3("li", {
625
625
  children: "Result (success, failure, denied)"
626
- }, undefined, false, undefined, this)
626
+ })
627
627
  ]
628
- }, undefined, true, undefined, this),
629
- /* @__PURE__ */ jsxDEV3("p", {
628
+ }),
629
+ /* @__PURE__ */ jsx3("p", {
630
630
  className: "text-muted-foreground",
631
631
  children: 'Example query: "Show all failed login attempts from IP address 203.0.113.42 in the last 24 hours."'
632
- }, undefined, false, undefined, this)
632
+ })
633
633
  ]
634
- }, undefined, true, undefined, this),
635
- /* @__PURE__ */ jsxDEV3("div", {
634
+ }),
635
+ /* @__PURE__ */ jsxs3("div", {
636
636
  className: "space-y-4",
637
637
  children: [
638
- /* @__PURE__ */ jsxDEV3("h2", {
638
+ /* @__PURE__ */ jsx3("h2", {
639
639
  className: "text-2xl font-bold",
640
640
  children: "Best practices"
641
- }, undefined, false, undefined, this),
642
- /* @__PURE__ */ jsxDEV3("ul", {
641
+ }),
642
+ /* @__PURE__ */ jsxs3("ul", {
643
643
  className: "text-muted-foreground list-inside list-disc space-y-2",
644
644
  children: [
645
- /* @__PURE__ */ jsxDEV3("li", {
645
+ /* @__PURE__ */ jsxs3("li", {
646
646
  children: [
647
- /* @__PURE__ */ jsxDEV3("strong", {
647
+ /* @__PURE__ */ jsx3("strong", {
648
648
  children: "Review logs regularly"
649
- }, undefined, false, undefined, this),
649
+ }),
650
650
  " – Set up alerts for suspicious activity (e.g., repeated failed login attempts, unauthorized access attempts)."
651
651
  ]
652
- }, undefined, true, undefined, this),
653
- /* @__PURE__ */ jsxDEV3("li", {
652
+ }),
653
+ /* @__PURE__ */ jsxs3("li", {
654
654
  children: [
655
- /* @__PURE__ */ jsxDEV3("strong", {
655
+ /* @__PURE__ */ jsx3("strong", {
656
656
  children: "Protect log access"
657
- }, undefined, false, undefined, this),
657
+ }),
658
658
  " – Only authorized personnel should be able to view audit logs. Use role-based access control to restrict access."
659
659
  ]
660
- }, undefined, true, undefined, this),
661
- /* @__PURE__ */ jsxDEV3("li", {
660
+ }),
661
+ /* @__PURE__ */ jsxs3("li", {
662
662
  children: [
663
- /* @__PURE__ */ jsxDEV3("strong", {
663
+ /* @__PURE__ */ jsx3("strong", {
664
664
  children: "Retain logs long enough"
665
- }, undefined, false, undefined, this),
665
+ }),
666
666
  " – Check your compliance requirements and configure retention policies accordingly."
667
667
  ]
668
- }, undefined, true, undefined, this),
669
- /* @__PURE__ */ jsxDEV3("li", {
668
+ }),
669
+ /* @__PURE__ */ jsxs3("li", {
670
670
  children: [
671
- /* @__PURE__ */ jsxDEV3("strong", {
671
+ /* @__PURE__ */ jsx3("strong", {
672
672
  children: "Test log integrity"
673
- }, undefined, false, undefined, this),
673
+ }),
674
674
  " – Periodically verify that logs have not been tampered with by checking cryptographic signatures."
675
675
  ]
676
- }, undefined, true, undefined, this)
676
+ })
677
677
  ]
678
- }, undefined, true, undefined, this)
678
+ })
679
679
  ]
680
- }, undefined, true, undefined, this),
681
- /* @__PURE__ */ jsxDEV3("div", {
680
+ }),
681
+ /* @__PURE__ */ jsxs3("div", {
682
682
  className: "flex items-center gap-4 pt-4",
683
683
  children: [
684
- /* @__PURE__ */ jsxDEV3(Link3, {
684
+ /* @__PURE__ */ jsx3(Link3, {
685
685
  href: "/docs/safety/pdp",
686
686
  className: "btn-ghost",
687
687
  children: "Previous: Policy Decision Points"
688
- }, undefined, false, undefined, this),
689
- /* @__PURE__ */ jsxDEV3(Link3, {
688
+ }),
689
+ /* @__PURE__ */ jsxs3(Link3, {
690
690
  href: "/docs/safety/migrations",
691
691
  className: "btn-primary",
692
692
  children: [
693
693
  "Next: Migrations ",
694
- /* @__PURE__ */ jsxDEV3(ChevronRight3, {
694
+ /* @__PURE__ */ jsx3(ChevronRight3, {
695
695
  size: 16
696
- }, undefined, false, undefined, this)
696
+ })
697
697
  ]
698
- }, undefined, true, undefined, this)
698
+ })
699
699
  ]
700
- }, undefined, true, undefined, this)
700
+ })
701
701
  ]
702
- }, undefined, true, undefined, this);
702
+ });
703
703
  }
704
704
 
705
705
  // src/components/docs/safety/SafetyMigrationsPage.tsx
706
706
  import Link4 from "@contractspec/lib.ui-link";
707
707
  import { ChevronRight as ChevronRight4 } from "lucide-react";
708
- import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
708
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
709
709
  function SafetyMigrationsPage() {
710
- return /* @__PURE__ */ jsxDEV4("div", {
710
+ return /* @__PURE__ */ jsxs4("div", {
711
711
  className: "space-y-8",
712
712
  children: [
713
- /* @__PURE__ */ jsxDEV4("div", {
713
+ /* @__PURE__ */ jsxs4("div", {
714
714
  className: "space-y-4",
715
715
  children: [
716
- /* @__PURE__ */ jsxDEV4("h1", {
716
+ /* @__PURE__ */ jsx4("h1", {
717
717
  className: "text-4xl font-bold",
718
718
  children: "Migrations"
719
- }, undefined, false, undefined, this),
720
- /* @__PURE__ */ jsxDEV4("p", {
719
+ }),
720
+ /* @__PURE__ */ jsxs4("p", {
721
721
  className: "text-muted-foreground",
722
722
  children: [
723
723
  "A ",
724
- /* @__PURE__ */ jsxDEV4("strong", {
724
+ /* @__PURE__ */ jsx4("strong", {
725
725
  children: "schema migration"
726
- }, undefined, false, undefined, this),
726
+ }),
727
727
  " (also called a database migration) is a set of incremental, reversible changes to a database schema. According to",
728
728
  " ",
729
- /* @__PURE__ */ jsxDEV4("a", {
729
+ /* @__PURE__ */ jsx4("a", {
730
730
  href: "https://en.wikipedia.org/wiki/Schema_migration",
731
731
  target: "_blank",
732
732
  rel: "noopener noreferrer",
733
733
  className: "text-violet-400 hover:text-violet-300",
734
734
  children: "Wikipedia"
735
- }, undefined, false, undefined, this),
735
+ }),
736
736
  `, schema migrations "allow the database schema to evolve as the application's requirements change, while preserving existing data."`
737
737
  ]
738
- }, undefined, true, undefined, this)
738
+ })
739
739
  ]
740
- }, undefined, true, undefined, this),
741
- /* @__PURE__ */ jsxDEV4("div", {
740
+ }),
741
+ /* @__PURE__ */ jsxs4("div", {
742
742
  className: "space-y-4",
743
743
  children: [
744
- /* @__PURE__ */ jsxDEV4("h2", {
744
+ /* @__PURE__ */ jsx4("h2", {
745
745
  className: "text-2xl font-bold",
746
746
  children: "Why migrations matter"
747
- }, undefined, false, undefined, this),
748
- /* @__PURE__ */ jsxDEV4("p", {
747
+ }),
748
+ /* @__PURE__ */ jsx4("p", {
749
749
  className: "text-muted-foreground",
750
750
  children: "As your application evolves, you'll need to change your data model—adding new fields, renaming tables, changing data types, or restructuring relationships. Without a disciplined approach, these changes can lead to:"
751
- }, undefined, false, undefined, this),
752
- /* @__PURE__ */ jsxDEV4("ul", {
751
+ }),
752
+ /* @__PURE__ */ jsxs4("ul", {
753
753
  className: "text-muted-foreground list-inside list-disc space-y-2",
754
754
  children: [
755
- /* @__PURE__ */ jsxDEV4("li", {
755
+ /* @__PURE__ */ jsx4("li", {
756
756
  children: "Data loss or corruption"
757
- }, undefined, false, undefined, this),
758
- /* @__PURE__ */ jsxDEV4("li", {
757
+ }),
758
+ /* @__PURE__ */ jsx4("li", {
759
759
  children: "Downtime during deployments"
760
- }, undefined, false, undefined, this),
761
- /* @__PURE__ */ jsxDEV4("li", {
760
+ }),
761
+ /* @__PURE__ */ jsx4("li", {
762
762
  children: "Inconsistencies between environments (dev, staging, production)"
763
- }, undefined, false, undefined, this),
764
- /* @__PURE__ */ jsxDEV4("li", {
763
+ }),
764
+ /* @__PURE__ */ jsx4("li", {
765
765
  children: "Difficulty rolling back failed changes"
766
- }, undefined, false, undefined, this)
766
+ })
767
767
  ]
768
- }, undefined, true, undefined, this),
769
- /* @__PURE__ */ jsxDEV4("p", {
768
+ }),
769
+ /* @__PURE__ */ jsx4("p", {
770
770
  className: "text-muted-foreground",
771
771
  children: "Migrations solve these problems by treating schema changes as versioned, tested, and reversible operations."
772
- }, undefined, false, undefined, this)
772
+ })
773
773
  ]
774
- }, undefined, true, undefined, this),
775
- /* @__PURE__ */ jsxDEV4("div", {
774
+ }),
775
+ /* @__PURE__ */ jsxs4("div", {
776
776
  className: "space-y-4",
777
777
  children: [
778
- /* @__PURE__ */ jsxDEV4("h2", {
778
+ /* @__PURE__ */ jsx4("h2", {
779
779
  className: "text-2xl font-bold",
780
780
  children: "How MigrationSpec works"
781
- }, undefined, false, undefined, this),
782
- /* @__PURE__ */ jsxDEV4("p", {
781
+ }),
782
+ /* @__PURE__ */ jsxs4("p", {
783
783
  className: "text-muted-foreground",
784
784
  children: [
785
785
  "In ContractSpec, migrations are defined using",
786
786
  " ",
787
- /* @__PURE__ */ jsxDEV4("strong", {
787
+ /* @__PURE__ */ jsx4("strong", {
788
788
  children: "MigrationSpec"
789
- }, undefined, false, undefined, this),
789
+ }),
790
790
  ". Each migration has:"
791
791
  ]
792
- }, undefined, true, undefined, this),
793
- /* @__PURE__ */ jsxDEV4("ul", {
792
+ }),
793
+ /* @__PURE__ */ jsxs4("ul", {
794
794
  className: "text-muted-foreground list-inside list-disc space-y-2",
795
795
  children: [
796
- /* @__PURE__ */ jsxDEV4("li", {
796
+ /* @__PURE__ */ jsxs4("li", {
797
797
  children: [
798
- /* @__PURE__ */ jsxDEV4("strong", {
798
+ /* @__PURE__ */ jsx4("strong", {
799
799
  children: "Version"
800
- }, undefined, false, undefined, this),
800
+ }),
801
801
  ' – A unique identifier (e.g., "2025-11-13-001") that determines the order of execution.'
802
802
  ]
803
- }, undefined, true, undefined, this),
804
- /* @__PURE__ */ jsxDEV4("li", {
803
+ }),
804
+ /* @__PURE__ */ jsxs4("li", {
805
805
  children: [
806
- /* @__PURE__ */ jsxDEV4("strong", {
806
+ /* @__PURE__ */ jsx4("strong", {
807
807
  children: "Up function"
808
- }, undefined, false, undefined, this),
808
+ }),
809
809
  ` – The forward migration that applies the change (e.g., "add column 'email_verified'").`
810
810
  ]
811
- }, undefined, true, undefined, this),
812
- /* @__PURE__ */ jsxDEV4("li", {
811
+ }),
812
+ /* @__PURE__ */ jsxs4("li", {
813
813
  children: [
814
- /* @__PURE__ */ jsxDEV4("strong", {
814
+ /* @__PURE__ */ jsx4("strong", {
815
815
  children: "Down function"
816
- }, undefined, false, undefined, this),
816
+ }),
817
817
  ` – The reverse migration that undoes the change (e.g., "drop column 'email_verified'").`
818
818
  ]
819
- }, undefined, true, undefined, this),
820
- /* @__PURE__ */ jsxDEV4("li", {
819
+ }),
820
+ /* @__PURE__ */ jsxs4("li", {
821
821
  children: [
822
- /* @__PURE__ */ jsxDEV4("strong", {
822
+ /* @__PURE__ */ jsx4("strong", {
823
823
  children: "Dependencies"
824
- }, undefined, false, undefined, this),
824
+ }),
825
825
  " – Other migrations that must run before this one."
826
826
  ]
827
- }, undefined, true, undefined, this),
828
- /* @__PURE__ */ jsxDEV4("li", {
827
+ }),
828
+ /* @__PURE__ */ jsxs4("li", {
829
829
  children: [
830
- /* @__PURE__ */ jsxDEV4("strong", {
830
+ /* @__PURE__ */ jsx4("strong", {
831
831
  children: "Validation"
832
- }, undefined, false, undefined, this),
832
+ }),
833
833
  ' – Optional checks to ensure the migration succeeded (e.g., "verify all users have an email address").'
834
834
  ]
835
- }, undefined, true, undefined, this)
835
+ })
836
836
  ]
837
- }, undefined, true, undefined, this)
837
+ })
838
838
  ]
839
- }, undefined, true, undefined, this),
840
- /* @__PURE__ */ jsxDEV4("div", {
839
+ }),
840
+ /* @__PURE__ */ jsxs4("div", {
841
841
  className: "space-y-4",
842
842
  children: [
843
- /* @__PURE__ */ jsxDEV4("h2", {
843
+ /* @__PURE__ */ jsx4("h2", {
844
844
  className: "text-2xl font-bold",
845
845
  children: "Example MigrationSpec"
846
- }, undefined, false, undefined, this),
847
- /* @__PURE__ */ jsxDEV4("p", {
846
+ }),
847
+ /* @__PURE__ */ jsx4("p", {
848
848
  className: "text-muted-foreground",
849
849
  children: "Here's a migration that adds an email verification field to the users table:"
850
- }, undefined, false, undefined, this),
851
- /* @__PURE__ */ jsxDEV4("div", {
850
+ }),
851
+ /* @__PURE__ */ jsx4("div", {
852
852
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
853
- children: /* @__PURE__ */ jsxDEV4("pre", {
853
+ children: /* @__PURE__ */ jsx4("pre", {
854
854
  children: `migrationId: add-email-verified
855
855
  version: 2025-11-13-001
856
856
  dependencies: []
@@ -875,397 +875,397 @@ validation:
875
875
  SELECT COUNT(*) FROM users
876
876
  WHERE email_verified IS NULL;
877
877
  expectZeroRows: true`
878
- }, undefined, false, undefined, this)
879
- }, undefined, false, undefined, this)
878
+ })
879
+ })
880
880
  ]
881
- }, undefined, true, undefined, this),
882
- /* @__PURE__ */ jsxDEV4("div", {
881
+ }),
882
+ /* @__PURE__ */ jsxs4("div", {
883
883
  className: "space-y-4",
884
884
  children: [
885
- /* @__PURE__ */ jsxDEV4("h2", {
885
+ /* @__PURE__ */ jsx4("h2", {
886
886
  className: "text-2xl font-bold",
887
887
  children: "Running migrations"
888
- }, undefined, false, undefined, this),
889
- /* @__PURE__ */ jsxDEV4("p", {
888
+ }),
889
+ /* @__PURE__ */ jsx4("p", {
890
890
  className: "text-muted-foreground",
891
891
  children: "Migrations are applied automatically during deployment. The ContractSpec runtime:"
892
- }, undefined, false, undefined, this),
893
- /* @__PURE__ */ jsxDEV4("ol", {
892
+ }),
893
+ /* @__PURE__ */ jsxs4("ol", {
894
894
  className: "text-muted-foreground list-inside list-decimal space-y-2",
895
895
  children: [
896
- /* @__PURE__ */ jsxDEV4("li", {
896
+ /* @__PURE__ */ jsx4("li", {
897
897
  children: "Checks which migrations have already been applied (stored in a migrations table)."
898
- }, undefined, false, undefined, this),
899
- /* @__PURE__ */ jsxDEV4("li", {
898
+ }),
899
+ /* @__PURE__ */ jsx4("li", {
900
900
  children: "Identifies new migrations that need to run."
901
- }, undefined, false, undefined, this),
902
- /* @__PURE__ */ jsxDEV4("li", {
901
+ }),
902
+ /* @__PURE__ */ jsx4("li", {
903
903
  children: "Executes them in order, respecting dependencies."
904
- }, undefined, false, undefined, this),
905
- /* @__PURE__ */ jsxDEV4("li", {
904
+ }),
905
+ /* @__PURE__ */ jsx4("li", {
906
906
  children: "Runs validation checks to ensure success."
907
- }, undefined, false, undefined, this),
908
- /* @__PURE__ */ jsxDEV4("li", {
907
+ }),
908
+ /* @__PURE__ */ jsx4("li", {
909
909
  children: "Records the migration as applied."
910
- }, undefined, false, undefined, this)
910
+ })
911
911
  ]
912
- }, undefined, true, undefined, this),
913
- /* @__PURE__ */ jsxDEV4("p", {
912
+ }),
913
+ /* @__PURE__ */ jsx4("p", {
914
914
  className: "text-muted-foreground",
915
915
  children: "If a migration fails, the deployment is aborted, and the system remains in its previous state. You can then fix the migration and redeploy."
916
- }, undefined, false, undefined, this)
916
+ })
917
917
  ]
918
- }, undefined, true, undefined, this),
919
- /* @__PURE__ */ jsxDEV4("div", {
918
+ }),
919
+ /* @__PURE__ */ jsxs4("div", {
920
920
  className: "space-y-4",
921
921
  children: [
922
- /* @__PURE__ */ jsxDEV4("h2", {
922
+ /* @__PURE__ */ jsx4("h2", {
923
923
  className: "text-2xl font-bold",
924
924
  children: "Rolling back migrations"
925
- }, undefined, false, undefined, this),
926
- /* @__PURE__ */ jsxDEV4("p", {
925
+ }),
926
+ /* @__PURE__ */ jsxs4("p", {
927
927
  className: "text-muted-foreground",
928
928
  children: [
929
929
  "If you need to roll back a deployment, ContractSpec automatically runs the ",
930
- /* @__PURE__ */ jsxDEV4("strong", {
930
+ /* @__PURE__ */ jsx4("strong", {
931
931
  children: "down"
932
- }, undefined, false, undefined, this),
932
+ }),
933
933
  " functions of any migrations that were applied. This restores the database to its previous state."
934
934
  ]
935
- }, undefined, true, undefined, this),
936
- /* @__PURE__ */ jsxDEV4("p", {
935
+ }),
936
+ /* @__PURE__ */ jsx4("p", {
937
937
  className: "text-muted-foreground",
938
938
  children: "Note that rollbacks are not always possible—for example, if you've deleted a column, you cannot recover the data unless you have a backup. For destructive changes, it's best to use a multi-step migration:"
939
- }, undefined, false, undefined, this),
940
- /* @__PURE__ */ jsxDEV4("ol", {
939
+ }),
940
+ /* @__PURE__ */ jsxs4("ol", {
941
941
  className: "text-muted-foreground list-inside list-decimal space-y-2",
942
942
  children: [
943
- /* @__PURE__ */ jsxDEV4("li", {
943
+ /* @__PURE__ */ jsx4("li", {
944
944
  children: "Add the new column (reversible)."
945
- }, undefined, false, undefined, this),
946
- /* @__PURE__ */ jsxDEV4("li", {
945
+ }),
946
+ /* @__PURE__ */ jsx4("li", {
947
947
  children: "Backfill data from the old column to the new column (reversible)."
948
- }, undefined, false, undefined, this),
949
- /* @__PURE__ */ jsxDEV4("li", {
948
+ }),
949
+ /* @__PURE__ */ jsx4("li", {
950
950
  children: "Update application code to use the new column (reversible)."
951
- }, undefined, false, undefined, this),
952
- /* @__PURE__ */ jsxDEV4("li", {
951
+ }),
952
+ /* @__PURE__ */ jsx4("li", {
953
953
  children: "Drop the old column (irreversible—only do this after confirming the new column works)."
954
- }, undefined, false, undefined, this)
954
+ })
955
955
  ]
956
- }, undefined, true, undefined, this)
956
+ })
957
957
  ]
958
- }, undefined, true, undefined, this),
959
- /* @__PURE__ */ jsxDEV4("div", {
958
+ }),
959
+ /* @__PURE__ */ jsxs4("div", {
960
960
  className: "space-y-4",
961
961
  children: [
962
- /* @__PURE__ */ jsxDEV4("h2", {
962
+ /* @__PURE__ */ jsx4("h2", {
963
963
  className: "text-2xl font-bold",
964
964
  children: "Best practices"
965
- }, undefined, false, undefined, this),
966
- /* @__PURE__ */ jsxDEV4("ul", {
965
+ }),
966
+ /* @__PURE__ */ jsxs4("ul", {
967
967
  className: "text-muted-foreground list-inside list-disc space-y-2",
968
968
  children: [
969
- /* @__PURE__ */ jsxDEV4("li", {
969
+ /* @__PURE__ */ jsxs4("li", {
970
970
  children: [
971
- /* @__PURE__ */ jsxDEV4("strong", {
971
+ /* @__PURE__ */ jsx4("strong", {
972
972
  children: "Test migrations locally"
973
- }, undefined, false, undefined, this),
973
+ }),
974
974
  " – Run them against a copy of production data to catch issues before deploying."
975
975
  ]
976
- }, undefined, true, undefined, this),
977
- /* @__PURE__ */ jsxDEV4("li", {
976
+ }),
977
+ /* @__PURE__ */ jsxs4("li", {
978
978
  children: [
979
- /* @__PURE__ */ jsxDEV4("strong", {
979
+ /* @__PURE__ */ jsx4("strong", {
980
980
  children: "Keep migrations small"
981
- }, undefined, false, undefined, this),
981
+ }),
982
982
  " – Each migration should do one thing. This makes them easier to understand and roll back."
983
983
  ]
984
- }, undefined, true, undefined, this),
985
- /* @__PURE__ */ jsxDEV4("li", {
984
+ }),
985
+ /* @__PURE__ */ jsxs4("li", {
986
986
  children: [
987
- /* @__PURE__ */ jsxDEV4("strong", {
987
+ /* @__PURE__ */ jsx4("strong", {
988
988
  children: "Write reversible migrations"
989
- }, undefined, false, undefined, this),
989
+ }),
990
990
  " – Always provide a down function, even if you don't plan to roll back."
991
991
  ]
992
- }, undefined, true, undefined, this),
993
- /* @__PURE__ */ jsxDEV4("li", {
992
+ }),
993
+ /* @__PURE__ */ jsxs4("li", {
994
994
  children: [
995
- /* @__PURE__ */ jsxDEV4("strong", {
995
+ /* @__PURE__ */ jsx4("strong", {
996
996
  children: "Use transactions"
997
- }, undefined, false, undefined, this),
997
+ }),
998
998
  " – Wrap migrations in database transactions so they either fully succeed or fully fail."
999
999
  ]
1000
- }, undefined, true, undefined, this),
1001
- /* @__PURE__ */ jsxDEV4("li", {
1000
+ }),
1001
+ /* @__PURE__ */ jsxs4("li", {
1002
1002
  children: [
1003
- /* @__PURE__ */ jsxDEV4("strong", {
1003
+ /* @__PURE__ */ jsx4("strong", {
1004
1004
  children: "Avoid destructive changes"
1005
- }, undefined, false, undefined, this),
1005
+ }),
1006
1006
  " – Prefer additive changes (adding columns) over destructive ones (dropping columns). If you must delete data, archive it first."
1007
1007
  ]
1008
- }, undefined, true, undefined, this),
1009
- /* @__PURE__ */ jsxDEV4("li", {
1008
+ }),
1009
+ /* @__PURE__ */ jsxs4("li", {
1010
1010
  children: [
1011
- /* @__PURE__ */ jsxDEV4("strong", {
1011
+ /* @__PURE__ */ jsx4("strong", {
1012
1012
  children: "Version your migrations"
1013
- }, undefined, false, undefined, this),
1013
+ }),
1014
1014
  " – Use timestamps or sequential numbers to ensure migrations run in the correct order."
1015
1015
  ]
1016
- }, undefined, true, undefined, this),
1017
- /* @__PURE__ */ jsxDEV4("li", {
1016
+ }),
1017
+ /* @__PURE__ */ jsxs4("li", {
1018
1018
  children: [
1019
- /* @__PURE__ */ jsxDEV4("strong", {
1019
+ /* @__PURE__ */ jsx4("strong", {
1020
1020
  children: "Document breaking changes"
1021
- }, undefined, false, undefined, this),
1021
+ }),
1022
1022
  " – If a migration requires application code changes, note this in the migration description."
1023
1023
  ]
1024
- }, undefined, true, undefined, this)
1024
+ })
1025
1025
  ]
1026
- }, undefined, true, undefined, this)
1026
+ })
1027
1027
  ]
1028
- }, undefined, true, undefined, this),
1029
- /* @__PURE__ */ jsxDEV4("div", {
1028
+ }),
1029
+ /* @__PURE__ */ jsxs4("div", {
1030
1030
  className: "space-y-4",
1031
1031
  children: [
1032
- /* @__PURE__ */ jsxDEV4("h2", {
1032
+ /* @__PURE__ */ jsx4("h2", {
1033
1033
  className: "text-2xl font-bold",
1034
1034
  children: "Zero-downtime migrations"
1035
- }, undefined, false, undefined, this),
1036
- /* @__PURE__ */ jsxDEV4("p", {
1035
+ }),
1036
+ /* @__PURE__ */ jsx4("p", {
1037
1037
  className: "text-muted-foreground",
1038
1038
  children: "Some migrations can cause downtime if not handled carefully. For example, adding a NOT NULL column to a large table can lock the table for minutes. To avoid this, use a multi-step approach:"
1039
- }, undefined, false, undefined, this),
1040
- /* @__PURE__ */ jsxDEV4("ol", {
1039
+ }),
1040
+ /* @__PURE__ */ jsxs4("ol", {
1041
1041
  className: "text-muted-foreground list-inside list-decimal space-y-2",
1042
1042
  children: [
1043
- /* @__PURE__ */ jsxDEV4("li", {
1043
+ /* @__PURE__ */ jsx4("li", {
1044
1044
  children: "Add the column as nullable."
1045
- }, undefined, false, undefined, this),
1046
- /* @__PURE__ */ jsxDEV4("li", {
1045
+ }),
1046
+ /* @__PURE__ */ jsx4("li", {
1047
1047
  children: "Backfill the column in batches (without locking the table)."
1048
- }, undefined, false, undefined, this),
1049
- /* @__PURE__ */ jsxDEV4("li", {
1048
+ }),
1049
+ /* @__PURE__ */ jsx4("li", {
1050
1050
  children: "Add the NOT NULL constraint once all rows are populated."
1051
- }, undefined, false, undefined, this)
1051
+ })
1052
1052
  ]
1053
- }, undefined, true, undefined, this),
1054
- /* @__PURE__ */ jsxDEV4("p", {
1053
+ }),
1054
+ /* @__PURE__ */ jsx4("p", {
1055
1055
  className: "text-muted-foreground",
1056
1056
  children: "ContractSpec's migration system supports this pattern by allowing you to split a logical change into multiple versioned migrations."
1057
- }, undefined, false, undefined, this)
1057
+ })
1058
1058
  ]
1059
- }, undefined, true, undefined, this),
1060
- /* @__PURE__ */ jsxDEV4("div", {
1059
+ }),
1060
+ /* @__PURE__ */ jsxs4("div", {
1061
1061
  className: "flex items-center gap-4 pt-4",
1062
1062
  children: [
1063
- /* @__PURE__ */ jsxDEV4(Link4, {
1063
+ /* @__PURE__ */ jsx4(Link4, {
1064
1064
  href: "/docs/safety/auditing",
1065
1065
  className: "btn-ghost",
1066
1066
  children: "Previous: Audit Logs"
1067
- }, undefined, false, undefined, this),
1068
- /* @__PURE__ */ jsxDEV4(Link4, {
1067
+ }),
1068
+ /* @__PURE__ */ jsxs4(Link4, {
1069
1069
  href: "/docs/advanced/renderers",
1070
1070
  className: "btn-primary",
1071
1071
  children: [
1072
1072
  "Next: Advanced Topics ",
1073
- /* @__PURE__ */ jsxDEV4(ChevronRight4, {
1073
+ /* @__PURE__ */ jsx4(ChevronRight4, {
1074
1074
  size: 16
1075
- }, undefined, false, undefined, this)
1075
+ })
1076
1076
  ]
1077
- }, undefined, true, undefined, this)
1077
+ })
1078
1078
  ]
1079
- }, undefined, true, undefined, this)
1079
+ })
1080
1080
  ]
1081
- }, undefined, true, undefined, this);
1081
+ });
1082
1082
  }
1083
1083
 
1084
1084
  // src/components/docs/safety/SafetyPDPPage.tsx
1085
1085
  import Link5 from "@contractspec/lib.ui-link";
1086
1086
  import { ChevronRight as ChevronRight5 } from "lucide-react";
1087
- import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
1087
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1088
1088
  function SafetyPDPPage() {
1089
- return /* @__PURE__ */ jsxDEV5("div", {
1089
+ return /* @__PURE__ */ jsxs5("div", {
1090
1090
  className: "space-y-8",
1091
1091
  children: [
1092
- /* @__PURE__ */ jsxDEV5("div", {
1092
+ /* @__PURE__ */ jsxs5("div", {
1093
1093
  className: "space-y-4",
1094
1094
  children: [
1095
- /* @__PURE__ */ jsxDEV5("h1", {
1095
+ /* @__PURE__ */ jsx5("h1", {
1096
1096
  className: "text-4xl font-bold",
1097
1097
  children: "Policy Decision Points"
1098
- }, undefined, false, undefined, this),
1099
- /* @__PURE__ */ jsxDEV5("p", {
1098
+ }),
1099
+ /* @__PURE__ */ jsxs5("p", {
1100
1100
  className: "text-muted-foreground",
1101
1101
  children: [
1102
1102
  "A ",
1103
- /* @__PURE__ */ jsxDEV5("strong", {
1103
+ /* @__PURE__ */ jsx5("strong", {
1104
1104
  children: "Policy Decision Point (PDP)"
1105
- }, undefined, false, undefined, this),
1105
+ }),
1106
1106
  " is a centralized component that evaluates access control policies and makes authorization decisions. According to",
1107
1107
  " ",
1108
- /* @__PURE__ */ jsxDEV5("a", {
1108
+ /* @__PURE__ */ jsx5("a", {
1109
1109
  href: "https://www.strongdm.com/blog/policy-decision-point",
1110
1110
  target: "_blank",
1111
1111
  rel: "noopener noreferrer",
1112
1112
  className: "text-violet-400 hover:text-violet-300",
1113
1113
  children: "StrongDM"
1114
- }, undefined, false, undefined, this),
1114
+ }),
1115
1115
  ', the PDP "receives requests for access to resources, evaluates them against policies, and returns a decision (permit or deny)."'
1116
1116
  ]
1117
- }, undefined, true, undefined, this)
1117
+ })
1118
1118
  ]
1119
- }, undefined, true, undefined, this),
1120
- /* @__PURE__ */ jsxDEV5("div", {
1119
+ }),
1120
+ /* @__PURE__ */ jsxs5("div", {
1121
1121
  className: "space-y-4",
1122
1122
  children: [
1123
- /* @__PURE__ */ jsxDEV5("h2", {
1123
+ /* @__PURE__ */ jsx5("h2", {
1124
1124
  className: "text-2xl font-bold",
1125
1125
  children: "How the PDP works in ContractSpec"
1126
- }, undefined, false, undefined, this),
1127
- /* @__PURE__ */ jsxDEV5("p", {
1126
+ }),
1127
+ /* @__PURE__ */ jsx5("p", {
1128
1128
  className: "text-muted-foreground",
1129
1129
  children: "In ContractSpec, the PDP is invoked on every operation—whether it's rendering a UI component, executing a capability, or querying a data view. The flow is:"
1130
- }, undefined, false, undefined, this),
1131
- /* @__PURE__ */ jsxDEV5("ol", {
1130
+ }),
1131
+ /* @__PURE__ */ jsxs5("ol", {
1132
1132
  className: "text-muted-foreground list-inside list-decimal space-y-3",
1133
1133
  children: [
1134
- /* @__PURE__ */ jsxDEV5("li", {
1134
+ /* @__PURE__ */ jsxs5("li", {
1135
1135
  children: [
1136
- /* @__PURE__ */ jsxDEV5("strong", {
1136
+ /* @__PURE__ */ jsx5("strong", {
1137
1137
  children: "Request evaluation"
1138
- }, undefined, false, undefined, this),
1138
+ }),
1139
1139
  " – The runtime sends a request to the PDP containing:",
1140
- /* @__PURE__ */ jsxDEV5("ul", {
1140
+ /* @__PURE__ */ jsxs5("ul", {
1141
1141
  className: "mt-2 ml-6 list-inside list-disc space-y-1",
1142
1142
  children: [
1143
- /* @__PURE__ */ jsxDEV5("li", {
1143
+ /* @__PURE__ */ jsx5("li", {
1144
1144
  children: "The user's identity and attributes (roles, groups, location, etc.)"
1145
- }, undefined, false, undefined, this),
1146
- /* @__PURE__ */ jsxDEV5("li", {
1145
+ }),
1146
+ /* @__PURE__ */ jsx5("li", {
1147
1147
  children: "The resource being accessed (capability, field, workflow step)"
1148
- }, undefined, false, undefined, this),
1149
- /* @__PURE__ */ jsxDEV5("li", {
1148
+ }),
1149
+ /* @__PURE__ */ jsx5("li", {
1150
1150
  children: "The action being performed (read, write, execute)"
1151
- }, undefined, false, undefined, this),
1152
- /* @__PURE__ */ jsxDEV5("li", {
1151
+ }),
1152
+ /* @__PURE__ */ jsx5("li", {
1153
1153
  children: "Contextual information (time of day, device type, IP address)"
1154
- }, undefined, false, undefined, this)
1154
+ })
1155
1155
  ]
1156
- }, undefined, true, undefined, this)
1156
+ })
1157
1157
  ]
1158
- }, undefined, true, undefined, this),
1159
- /* @__PURE__ */ jsxDEV5("li", {
1158
+ }),
1159
+ /* @__PURE__ */ jsxs5("li", {
1160
1160
  children: [
1161
- /* @__PURE__ */ jsxDEV5("strong", {
1161
+ /* @__PURE__ */ jsx5("strong", {
1162
1162
  children: "Policy evaluation"
1163
- }, undefined, false, undefined, this),
1163
+ }),
1164
1164
  " – The PDP evaluates the request against all applicable ",
1165
- /* @__PURE__ */ jsxDEV5("strong", {
1165
+ /* @__PURE__ */ jsx5("strong", {
1166
1166
  children: "PolicySpecs"
1167
- }, undefined, false, undefined, this),
1167
+ }),
1168
1168
  ". These specs define rules using attribute-based access control (ABAC) and can reference:",
1169
- /* @__PURE__ */ jsxDEV5("ul", {
1169
+ /* @__PURE__ */ jsxs5("ul", {
1170
1170
  className: "mt-2 ml-6 list-inside list-disc space-y-1",
1171
1171
  children: [
1172
- /* @__PURE__ */ jsxDEV5("li", {
1172
+ /* @__PURE__ */ jsx5("li", {
1173
1173
  children: `User attributes (e.g., "role == 'admin'")`
1174
- }, undefined, false, undefined, this),
1175
- /* @__PURE__ */ jsxDEV5("li", {
1174
+ }),
1175
+ /* @__PURE__ */ jsx5("li", {
1176
1176
  children: `Resource attributes (e.g., "field.sensitivity == 'PII'")`
1177
- }, undefined, false, undefined, this),
1178
- /* @__PURE__ */ jsxDEV5("li", {
1177
+ }),
1178
+ /* @__PURE__ */ jsx5("li", {
1179
1179
  children: 'Environmental attributes (e.g., "time.hour >= 9 AND time.hour < 17")'
1180
- }, undefined, false, undefined, this)
1180
+ })
1181
1181
  ]
1182
- }, undefined, true, undefined, this)
1182
+ })
1183
1183
  ]
1184
- }, undefined, true, undefined, this),
1185
- /* @__PURE__ */ jsxDEV5("li", {
1184
+ }),
1185
+ /* @__PURE__ */ jsxs5("li", {
1186
1186
  children: [
1187
- /* @__PURE__ */ jsxDEV5("strong", {
1187
+ /* @__PURE__ */ jsx5("strong", {
1188
1188
  children: "Decision return"
1189
- }, undefined, false, undefined, this),
1189
+ }),
1190
1190
  " – The PDP returns one of:",
1191
- /* @__PURE__ */ jsxDEV5("ul", {
1191
+ /* @__PURE__ */ jsxs5("ul", {
1192
1192
  className: "mt-2 ml-6 list-inside list-disc space-y-1",
1193
1193
  children: [
1194
- /* @__PURE__ */ jsxDEV5("li", {
1194
+ /* @__PURE__ */ jsxs5("li", {
1195
1195
  children: [
1196
- /* @__PURE__ */ jsxDEV5("code", {
1196
+ /* @__PURE__ */ jsx5("code", {
1197
1197
  className: "bg-background/50 rounded px-2 py-1",
1198
1198
  children: "PERMIT"
1199
- }, undefined, false, undefined, this),
1199
+ }),
1200
1200
  " ",
1201
1201
  "– The operation is allowed."
1202
1202
  ]
1203
- }, undefined, true, undefined, this),
1204
- /* @__PURE__ */ jsxDEV5("li", {
1203
+ }),
1204
+ /* @__PURE__ */ jsxs5("li", {
1205
1205
  children: [
1206
- /* @__PURE__ */ jsxDEV5("code", {
1206
+ /* @__PURE__ */ jsx5("code", {
1207
1207
  className: "bg-background/50 rounded px-2 py-1",
1208
1208
  children: "DENY"
1209
- }, undefined, false, undefined, this),
1209
+ }),
1210
1210
  " ",
1211
1211
  "– The operation is blocked."
1212
1212
  ]
1213
- }, undefined, true, undefined, this),
1214
- /* @__PURE__ */ jsxDEV5("li", {
1213
+ }),
1214
+ /* @__PURE__ */ jsxs5("li", {
1215
1215
  children: [
1216
- /* @__PURE__ */ jsxDEV5("code", {
1216
+ /* @__PURE__ */ jsx5("code", {
1217
1217
  className: "bg-background/50 rounded px-2 py-1",
1218
1218
  children: "REDACT"
1219
- }, undefined, false, undefined, this),
1219
+ }),
1220
1220
  " ",
1221
1221
  "– The operation is allowed, but sensitive fields are masked."
1222
1222
  ]
1223
- }, undefined, true, undefined, this)
1223
+ })
1224
1224
  ]
1225
- }, undefined, true, undefined, this)
1225
+ })
1226
1226
  ]
1227
- }, undefined, true, undefined, this),
1228
- /* @__PURE__ */ jsxDEV5("li", {
1227
+ }),
1228
+ /* @__PURE__ */ jsxs5("li", {
1229
1229
  children: [
1230
- /* @__PURE__ */ jsxDEV5("strong", {
1230
+ /* @__PURE__ */ jsx5("strong", {
1231
1231
  children: "Enforcement"
1232
- }, undefined, false, undefined, this),
1232
+ }),
1233
1233
  " – The runtime enforces the decision. If denied, the operation fails with a clear error message. If redacted, sensitive fields are replaced with placeholders."
1234
1234
  ]
1235
- }, undefined, true, undefined, this),
1236
- /* @__PURE__ */ jsxDEV5("li", {
1235
+ }),
1236
+ /* @__PURE__ */ jsxs5("li", {
1237
1237
  children: [
1238
- /* @__PURE__ */ jsxDEV5("strong", {
1238
+ /* @__PURE__ */ jsx5("strong", {
1239
1239
  children: "Auditing"
1240
- }, undefined, false, undefined, this),
1240
+ }),
1241
1241
  " – Every PDP decision is logged to the",
1242
1242
  " ",
1243
- /* @__PURE__ */ jsxDEV5(Link5, {
1243
+ /* @__PURE__ */ jsx5(Link5, {
1244
1244
  href: "/docs/safety/auditing",
1245
1245
  className: "text-violet-400 hover:text-violet-300",
1246
1246
  children: "audit log"
1247
- }, undefined, false, undefined, this),
1247
+ }),
1248
1248
  ", including the request, decision, and reasoning."
1249
1249
  ]
1250
- }, undefined, true, undefined, this)
1250
+ })
1251
1251
  ]
1252
- }, undefined, true, undefined, this)
1252
+ })
1253
1253
  ]
1254
- }, undefined, true, undefined, this),
1255
- /* @__PURE__ */ jsxDEV5("div", {
1254
+ }),
1255
+ /* @__PURE__ */ jsxs5("div", {
1256
1256
  className: "space-y-4",
1257
1257
  children: [
1258
- /* @__PURE__ */ jsxDEV5("h2", {
1258
+ /* @__PURE__ */ jsx5("h2", {
1259
1259
  className: "text-2xl font-bold",
1260
1260
  children: "Example PolicySpec"
1261
- }, undefined, false, undefined, this),
1262
- /* @__PURE__ */ jsxDEV5("p", {
1261
+ }),
1262
+ /* @__PURE__ */ jsx5("p", {
1263
1263
  className: "text-muted-foreground",
1264
1264
  children: "Here's a simple policy that restricts access to PII fields:"
1265
- }, undefined, false, undefined, this),
1266
- /* @__PURE__ */ jsxDEV5("div", {
1265
+ }),
1266
+ /* @__PURE__ */ jsx5("div", {
1267
1267
  className: "bg-background/50 border-border text-muted-foreground overflow-x-auto rounded-lg border p-4 font-mono text-sm",
1268
- children: /* @__PURE__ */ jsxDEV5("pre", {
1268
+ children: /* @__PURE__ */ jsx5("pre", {
1269
1269
  children: `policyId: pii-access-control
1270
1270
  version: '1.0.0'.0.0
1271
1271
  rules:
@@ -1285,173 +1285,173 @@ rules:
1285
1285
  condition: |
1286
1286
  user.role NOT IN ['admin', 'support'] AND
1287
1287
  field.sensitivity == 'PII'`
1288
- }, undefined, false, undefined, this)
1289
- }, undefined, false, undefined, this),
1290
- /* @__PURE__ */ jsxDEV5("p", {
1288
+ })
1289
+ }),
1290
+ /* @__PURE__ */ jsx5("p", {
1291
1291
  className: "text-muted-foreground",
1292
1292
  children: "With this policy, admins see all data, support staff see redacted PII, and other users cannot access PII at all."
1293
- }, undefined, false, undefined, this)
1293
+ })
1294
1294
  ]
1295
- }, undefined, true, undefined, this),
1296
- /* @__PURE__ */ jsxDEV5("div", {
1295
+ }),
1296
+ /* @__PURE__ */ jsxs5("div", {
1297
1297
  className: "space-y-4",
1298
1298
  children: [
1299
- /* @__PURE__ */ jsxDEV5("h2", {
1299
+ /* @__PURE__ */ jsx5("h2", {
1300
1300
  className: "text-2xl font-bold",
1301
1301
  children: "Benefits of centralized decision-making"
1302
- }, undefined, false, undefined, this),
1303
- /* @__PURE__ */ jsxDEV5("ul", {
1302
+ }),
1303
+ /* @__PURE__ */ jsxs5("ul", {
1304
1304
  className: "text-muted-foreground list-inside list-disc space-y-2",
1305
1305
  children: [
1306
- /* @__PURE__ */ jsxDEV5("li", {
1306
+ /* @__PURE__ */ jsxs5("li", {
1307
1307
  children: [
1308
- /* @__PURE__ */ jsxDEV5("strong", {
1308
+ /* @__PURE__ */ jsx5("strong", {
1309
1309
  children: "Consistency"
1310
- }, undefined, false, undefined, this),
1310
+ }),
1311
1311
  " – Policies are enforced uniformly across all surfaces (API, UI, workflows)."
1312
1312
  ]
1313
- }, undefined, true, undefined, this),
1314
- /* @__PURE__ */ jsxDEV5("li", {
1313
+ }),
1314
+ /* @__PURE__ */ jsxs5("li", {
1315
1315
  children: [
1316
- /* @__PURE__ */ jsxDEV5("strong", {
1316
+ /* @__PURE__ */ jsx5("strong", {
1317
1317
  children: "Auditability"
1318
- }, undefined, false, undefined, this),
1318
+ }),
1319
1319
  " – Every decision is logged, making it easy to trace why access was granted or denied."
1320
1320
  ]
1321
- }, undefined, true, undefined, this),
1322
- /* @__PURE__ */ jsxDEV5("li", {
1321
+ }),
1322
+ /* @__PURE__ */ jsxs5("li", {
1323
1323
  children: [
1324
- /* @__PURE__ */ jsxDEV5("strong", {
1324
+ /* @__PURE__ */ jsx5("strong", {
1325
1325
  children: "Flexibility"
1326
- }, undefined, false, undefined, this),
1326
+ }),
1327
1327
  " – Policies can be updated without changing application code."
1328
1328
  ]
1329
- }, undefined, true, undefined, this),
1330
- /* @__PURE__ */ jsxDEV5("li", {
1329
+ }),
1330
+ /* @__PURE__ */ jsxs5("li", {
1331
1331
  children: [
1332
- /* @__PURE__ */ jsxDEV5("strong", {
1332
+ /* @__PURE__ */ jsx5("strong", {
1333
1333
  children: "Security"
1334
- }, undefined, false, undefined, this),
1334
+ }),
1335
1335
  " – Reduces the risk of authorization bugs by removing ad-hoc checks scattered throughout the codebase."
1336
1336
  ]
1337
- }, undefined, true, undefined, this)
1337
+ })
1338
1338
  ]
1339
- }, undefined, true, undefined, this)
1339
+ })
1340
1340
  ]
1341
- }, undefined, true, undefined, this),
1342
- /* @__PURE__ */ jsxDEV5("div", {
1341
+ }),
1342
+ /* @__PURE__ */ jsxs5("div", {
1343
1343
  className: "space-y-4",
1344
1344
  children: [
1345
- /* @__PURE__ */ jsxDEV5("h2", {
1345
+ /* @__PURE__ */ jsx5("h2", {
1346
1346
  className: "text-2xl font-bold",
1347
1347
  children: "Performance considerations"
1348
- }, undefined, false, undefined, this),
1349
- /* @__PURE__ */ jsxDEV5("p", {
1348
+ }),
1349
+ /* @__PURE__ */ jsx5("p", {
1350
1350
  className: "text-muted-foreground",
1351
1351
  children: "Because the PDP is invoked on every operation, performance is critical. ContractSpec optimizes this by:"
1352
- }, undefined, false, undefined, this),
1353
- /* @__PURE__ */ jsxDEV5("ul", {
1352
+ }),
1353
+ /* @__PURE__ */ jsxs5("ul", {
1354
1354
  className: "text-muted-foreground list-inside list-disc space-y-2",
1355
1355
  children: [
1356
- /* @__PURE__ */ jsxDEV5("li", {
1356
+ /* @__PURE__ */ jsx5("li", {
1357
1357
  children: "Caching policy decisions for identical requests"
1358
- }, undefined, false, undefined, this),
1359
- /* @__PURE__ */ jsxDEV5("li", {
1358
+ }),
1359
+ /* @__PURE__ */ jsx5("li", {
1360
1360
  children: "Compiling policies into efficient bytecode"
1361
- }, undefined, false, undefined, this),
1362
- /* @__PURE__ */ jsxDEV5("li", {
1361
+ }),
1362
+ /* @__PURE__ */ jsx5("li", {
1363
1363
  children: "Evaluating only the minimal set of rules needed for each request"
1364
- }, undefined, false, undefined, this),
1365
- /* @__PURE__ */ jsxDEV5("li", {
1364
+ }),
1365
+ /* @__PURE__ */ jsx5("li", {
1366
1366
  children: "Running the PDP in-process to avoid network latency"
1367
- }, undefined, false, undefined, this)
1367
+ })
1368
1368
  ]
1369
- }, undefined, true, undefined, this),
1370
- /* @__PURE__ */ jsxDEV5("p", {
1369
+ }),
1370
+ /* @__PURE__ */ jsx5("p", {
1371
1371
  className: "text-muted-foreground",
1372
1372
  children: "In practice, PDP overhead is typically less than 1ms per request."
1373
- }, undefined, false, undefined, this)
1373
+ })
1374
1374
  ]
1375
- }, undefined, true, undefined, this),
1376
- /* @__PURE__ */ jsxDEV5("div", {
1375
+ }),
1376
+ /* @__PURE__ */ jsxs5("div", {
1377
1377
  className: "flex items-center gap-4 pt-4",
1378
1378
  children: [
1379
- /* @__PURE__ */ jsxDEV5(Link5, {
1379
+ /* @__PURE__ */ jsx5(Link5, {
1380
1380
  href: "/docs/safety/signing",
1381
1381
  className: "btn-ghost",
1382
1382
  children: "Previous: Spec Signing"
1383
- }, undefined, false, undefined, this),
1384
- /* @__PURE__ */ jsxDEV5(Link5, {
1383
+ }),
1384
+ /* @__PURE__ */ jsxs5(Link5, {
1385
1385
  href: "/docs/safety/auditing",
1386
1386
  className: "btn-primary",
1387
1387
  children: [
1388
1388
  "Next: Audit Logs ",
1389
- /* @__PURE__ */ jsxDEV5(ChevronRight5, {
1389
+ /* @__PURE__ */ jsx5(ChevronRight5, {
1390
1390
  size: 16
1391
- }, undefined, false, undefined, this)
1391
+ })
1392
1392
  ]
1393
- }, undefined, true, undefined, this)
1393
+ })
1394
1394
  ]
1395
- }, undefined, true, undefined, this)
1395
+ })
1396
1396
  ]
1397
- }, undefined, true, undefined, this);
1397
+ });
1398
1398
  }
1399
1399
 
1400
1400
  // src/components/docs/safety/SafetyTenantIsolationPage.tsx
1401
- import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
1401
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
1402
1402
  function SafetyTenantIsolationPage() {
1403
- return /* @__PURE__ */ jsxDEV6("div", {
1403
+ return /* @__PURE__ */ jsxs6("div", {
1404
1404
  className: "space-y-8",
1405
1405
  children: [
1406
- /* @__PURE__ */ jsxDEV6("div", {
1406
+ /* @__PURE__ */ jsxs6("div", {
1407
1407
  className: "space-y-4",
1408
1408
  children: [
1409
- /* @__PURE__ */ jsxDEV6("h1", {
1409
+ /* @__PURE__ */ jsx6("h1", {
1410
1410
  className: "text-4xl font-bold",
1411
1411
  children: "Tenant Isolation"
1412
- }, undefined, false, undefined, this),
1413
- /* @__PURE__ */ jsxDEV6("p", {
1412
+ }),
1413
+ /* @__PURE__ */ jsx6("p", {
1414
1414
  className: "text-muted-foreground text-lg",
1415
1415
  children: 'Preventing cross-tenant data leaks is the #1 security priority for any SaaS. ContractSpec employs "Defense in Depth" to ensure safety.'
1416
- }, undefined, false, undefined, this)
1416
+ })
1417
1417
  ]
1418
- }, undefined, true, undefined, this),
1419
- /* @__PURE__ */ jsxDEV6("div", {
1418
+ }),
1419
+ /* @__PURE__ */ jsxs6("div", {
1420
1420
  className: "space-y-4",
1421
1421
  children: [
1422
- /* @__PURE__ */ jsxDEV6("h2", {
1422
+ /* @__PURE__ */ jsx6("h2", {
1423
1423
  className: "text-2xl font-bold",
1424
1424
  children: "Layer 1: RLS Middleware"
1425
- }, undefined, false, undefined, this),
1426
- /* @__PURE__ */ jsxDEV6("p", {
1425
+ }),
1426
+ /* @__PURE__ */ jsxs6("p", {
1427
1427
  children: [
1428
1428
  "The primary defense is the Prisma middleware that rewrites queries to include ",
1429
- /* @__PURE__ */ jsxDEV6("code", {
1429
+ /* @__PURE__ */ jsx6("code", {
1430
1430
  children: "WHERE tenantId = ?"
1431
- }, undefined, false, undefined, this),
1431
+ }),
1432
1432
  ". This protects against developer error (forgetting to filter)."
1433
1433
  ]
1434
- }, undefined, true, undefined, this)
1434
+ })
1435
1435
  ]
1436
- }, undefined, true, undefined, this),
1437
- /* @__PURE__ */ jsxDEV6("div", {
1436
+ }),
1437
+ /* @__PURE__ */ jsxs6("div", {
1438
1438
  className: "space-y-4",
1439
1439
  children: [
1440
- /* @__PURE__ */ jsxDEV6("h2", {
1440
+ /* @__PURE__ */ jsx6("h2", {
1441
1441
  className: "text-2xl font-bold",
1442
1442
  children: "Layer 2: Isolation Validator"
1443
- }, undefined, false, undefined, this),
1444
- /* @__PURE__ */ jsxDEV6("p", {
1443
+ }),
1444
+ /* @__PURE__ */ jsxs6("p", {
1445
1445
  children: [
1446
1446
  "For high-security environments, you can use the",
1447
1447
  " ",
1448
- /* @__PURE__ */ jsxDEV6("code", {
1448
+ /* @__PURE__ */ jsx6("code", {
1449
1449
  children: "IsolationValidator"
1450
- }, undefined, false, undefined, this),
1450
+ }),
1451
1451
  " in your test suite to verify that every query generated by your operations actually includes the tenant ID."
1452
1452
  ]
1453
- }, undefined, true, undefined, this),
1454
- /* @__PURE__ */ jsxDEV6("pre", {
1453
+ }),
1454
+ /* @__PURE__ */ jsx6("pre", {
1455
1455
  className: "bg-muted rounded-lg border p-4 text-sm",
1456
1456
  children: `import { IsolationValidator } from '@contractspec/lib.multi-tenancy/isolation';
1457
1457
 
@@ -1464,227 +1464,227 @@ test('findUser query is isolated', () => {
1464
1464
  );
1465
1465
  expect(isValid).toBe(true);
1466
1466
  });`
1467
- }, undefined, false, undefined, this)
1467
+ })
1468
1468
  ]
1469
- }, undefined, true, undefined, this),
1470
- /* @__PURE__ */ jsxDEV6("div", {
1469
+ }),
1470
+ /* @__PURE__ */ jsxs6("div", {
1471
1471
  className: "space-y-4",
1472
1472
  children: [
1473
- /* @__PURE__ */ jsxDEV6("h2", {
1473
+ /* @__PURE__ */ jsx6("h2", {
1474
1474
  className: "text-2xl font-bold",
1475
1475
  children: "Layer 3: Policy Engine"
1476
- }, undefined, false, undefined, this),
1477
- /* @__PURE__ */ jsxDEV6("p", {
1476
+ }),
1477
+ /* @__PURE__ */ jsx6("p", {
1478
1478
  children: "The Policy Decision Point (PDP) verifies that the authenticated user actually belongs to the requested tenant before any operation logic runs."
1479
- }, undefined, false, undefined, this)
1479
+ })
1480
1480
  ]
1481
- }, undefined, true, undefined, this)
1481
+ })
1482
1482
  ]
1483
- }, undefined, true, undefined, this);
1483
+ });
1484
1484
  }
1485
1485
 
1486
1486
  // src/components/docs/safety/SafetySecurityTrustPage.tsx
1487
1487
  import Link6 from "@contractspec/lib.ui-link";
1488
1488
  import { ChevronRight as ChevronRight6 } from "lucide-react";
1489
- import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
1489
+ import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
1490
1490
  function SafetySecurityTrustPage() {
1491
- return /* @__PURE__ */ jsxDEV7("div", {
1491
+ return /* @__PURE__ */ jsxs7("div", {
1492
1492
  className: "space-y-8",
1493
1493
  children: [
1494
- /* @__PURE__ */ jsxDEV7("div", {
1494
+ /* @__PURE__ */ jsxs7("div", {
1495
1495
  className: "space-y-4",
1496
1496
  children: [
1497
- /* @__PURE__ */ jsxDEV7("h1", {
1497
+ /* @__PURE__ */ jsx7("h1", {
1498
1498
  className: "text-4xl font-bold",
1499
1499
  children: "Security & Trust"
1500
- }, undefined, false, undefined, this),
1501
- /* @__PURE__ */ jsxDEV7("p", {
1500
+ }),
1501
+ /* @__PURE__ */ jsx7("p", {
1502
1502
  className: "text-muted-foreground",
1503
1503
  children: "ContractSpec focuses on deterministic, auditable software delivery. This page summarizes our security posture and trust commitments so teams can adopt with clarity."
1504
- }, undefined, false, undefined, this)
1504
+ })
1505
1505
  ]
1506
- }, undefined, true, undefined, this),
1507
- /* @__PURE__ */ jsxDEV7("div", {
1506
+ }),
1507
+ /* @__PURE__ */ jsxs7("div", {
1508
1508
  className: "card-subtle space-y-4 p-6",
1509
1509
  children: [
1510
- /* @__PURE__ */ jsxDEV7("h2", {
1510
+ /* @__PURE__ */ jsx7("h2", {
1511
1511
  className: "text-2xl font-bold",
1512
1512
  children: "Security policy"
1513
- }, undefined, false, undefined, this),
1514
- /* @__PURE__ */ jsxDEV7("p", {
1513
+ }),
1514
+ /* @__PURE__ */ jsx7("p", {
1515
1515
  className: "text-muted-foreground text-sm",
1516
1516
  children: "We publish a dedicated security policy that explains how to report vulnerabilities and how we respond."
1517
- }, undefined, false, undefined, this),
1518
- /* @__PURE__ */ jsxDEV7(Link6, {
1517
+ }),
1518
+ /* @__PURE__ */ jsxs7(Link6, {
1519
1519
  href: "/SECURITY.md",
1520
1520
  className: "btn-primary",
1521
1521
  children: [
1522
1522
  "Read the security policy ",
1523
- /* @__PURE__ */ jsxDEV7(ChevronRight6, {
1523
+ /* @__PURE__ */ jsx7(ChevronRight6, {
1524
1524
  size: 16
1525
- }, undefined, false, undefined, this)
1525
+ })
1526
1526
  ]
1527
- }, undefined, true, undefined, this)
1527
+ })
1528
1528
  ]
1529
- }, undefined, true, undefined, this),
1530
- /* @__PURE__ */ jsxDEV7("div", {
1529
+ }),
1530
+ /* @__PURE__ */ jsxs7("div", {
1531
1531
  className: "grid gap-4 md:grid-cols-2",
1532
1532
  children: [
1533
- /* @__PURE__ */ jsxDEV7("div", {
1533
+ /* @__PURE__ */ jsxs7("div", {
1534
1534
  className: "card-subtle space-y-3 p-6",
1535
1535
  children: [
1536
- /* @__PURE__ */ jsxDEV7("h3", {
1536
+ /* @__PURE__ */ jsx7("h3", {
1537
1537
  className: "text-lg font-semibold",
1538
1538
  children: "Release hygiene"
1539
- }, undefined, false, undefined, this),
1540
- /* @__PURE__ */ jsxDEV7("p", {
1539
+ }),
1540
+ /* @__PURE__ */ jsx7("p", {
1541
1541
  className: "text-muted-foreground text-sm",
1542
1542
  children: "We ship with deterministic CI, changesets, and contract validation so teams can trust every release."
1543
- }, undefined, false, undefined, this),
1544
- /* @__PURE__ */ jsxDEV7("ul", {
1543
+ }),
1544
+ /* @__PURE__ */ jsxs7("ul", {
1545
1545
  className: "text-muted-foreground space-y-2 text-sm",
1546
1546
  children: [
1547
- /* @__PURE__ */ jsxDEV7("li", {
1547
+ /* @__PURE__ */ jsx7("li", {
1548
1548
  children: "Changesets required for published packages."
1549
- }, undefined, false, undefined, this),
1550
- /* @__PURE__ */ jsxDEV7("li", {
1549
+ }),
1550
+ /* @__PURE__ */ jsx7("li", {
1551
1551
  children: "CI gate for contract validation and drift detection."
1552
- }, undefined, false, undefined, this),
1553
- /* @__PURE__ */ jsxDEV7("li", {
1552
+ }),
1553
+ /* @__PURE__ */ jsx7("li", {
1554
1554
  children: "Rollback-friendly release process."
1555
- }, undefined, false, undefined, this)
1555
+ })
1556
1556
  ]
1557
- }, undefined, true, undefined, this)
1557
+ })
1558
1558
  ]
1559
- }, undefined, true, undefined, this),
1560
- /* @__PURE__ */ jsxDEV7("div", {
1559
+ }),
1560
+ /* @__PURE__ */ jsxs7("div", {
1561
1561
  className: "card-subtle space-y-3 p-6",
1562
1562
  children: [
1563
- /* @__PURE__ */ jsxDEV7("h3", {
1563
+ /* @__PURE__ */ jsx7("h3", {
1564
1564
  className: "text-lg font-semibold",
1565
1565
  children: "Data handling"
1566
- }, undefined, false, undefined, this),
1567
- /* @__PURE__ */ jsxDEV7("p", {
1566
+ }),
1567
+ /* @__PURE__ */ jsx7("p", {
1568
1568
  className: "text-muted-foreground text-sm",
1569
1569
  children: "ContractSpec promotes strict data classification and policy-driven access. Specs can tag sensitive fields for enforcement."
1570
- }, undefined, false, undefined, this),
1571
- /* @__PURE__ */ jsxDEV7("ul", {
1570
+ }),
1571
+ /* @__PURE__ */ jsxs7("ul", {
1572
1572
  className: "text-muted-foreground space-y-2 text-sm",
1573
1573
  children: [
1574
- /* @__PURE__ */ jsxDEV7("li", {
1574
+ /* @__PURE__ */ jsx7("li", {
1575
1575
  children: "Schema-level sensitivity tags."
1576
- }, undefined, false, undefined, this),
1577
- /* @__PURE__ */ jsxDEV7("li", {
1576
+ }),
1577
+ /* @__PURE__ */ jsx7("li", {
1578
1578
  children: "Policy Decision Point enforcement."
1579
- }, undefined, false, undefined, this),
1580
- /* @__PURE__ */ jsxDEV7("li", {
1579
+ }),
1580
+ /* @__PURE__ */ jsx7("li", {
1581
1581
  children: "Audit logs for operational traceability."
1582
- }, undefined, false, undefined, this)
1582
+ })
1583
1583
  ]
1584
- }, undefined, true, undefined, this)
1584
+ })
1585
1585
  ]
1586
- }, undefined, true, undefined, this)
1586
+ })
1587
1587
  ]
1588
- }, undefined, true, undefined, this),
1589
- /* @__PURE__ */ jsxDEV7("div", {
1588
+ }),
1589
+ /* @__PURE__ */ jsxs7("div", {
1590
1590
  className: "grid gap-4 md:grid-cols-2",
1591
1591
  children: [
1592
- /* @__PURE__ */ jsxDEV7("div", {
1592
+ /* @__PURE__ */ jsxs7("div", {
1593
1593
  className: "card-subtle space-y-3 p-6",
1594
1594
  children: [
1595
- /* @__PURE__ */ jsxDEV7("h3", {
1595
+ /* @__PURE__ */ jsx7("h3", {
1596
1596
  className: "text-lg font-semibold",
1597
1597
  children: "Supply chain"
1598
- }, undefined, false, undefined, this),
1599
- /* @__PURE__ */ jsxDEV7("p", {
1598
+ }),
1599
+ /* @__PURE__ */ jsx7("p", {
1600
1600
  className: "text-muted-foreground text-sm",
1601
1601
  children: "We track dependency updates and keep the monorepo build reproducible."
1602
- }, undefined, false, undefined, this),
1603
- /* @__PURE__ */ jsxDEV7("ul", {
1602
+ }),
1603
+ /* @__PURE__ */ jsxs7("ul", {
1604
1604
  className: "text-muted-foreground space-y-2 text-sm",
1605
1605
  children: [
1606
- /* @__PURE__ */ jsxDEV7("li", {
1606
+ /* @__PURE__ */ jsx7("li", {
1607
1607
  children: "Dependabot + Renovate-style updates where available."
1608
- }, undefined, false, undefined, this),
1609
- /* @__PURE__ */ jsxDEV7("li", {
1608
+ }),
1609
+ /* @__PURE__ */ jsx7("li", {
1610
1610
  children: "Signed release artifacts planned for Studio release cycles."
1611
- }, undefined, false, undefined, this),
1612
- /* @__PURE__ */ jsxDEV7("li", {
1611
+ }),
1612
+ /* @__PURE__ */ jsx7("li", {
1613
1613
  children: "Transparent changelogs for every package."
1614
- }, undefined, false, undefined, this)
1614
+ })
1615
1615
  ]
1616
- }, undefined, true, undefined, this)
1616
+ })
1617
1617
  ]
1618
- }, undefined, true, undefined, this),
1619
- /* @__PURE__ */ jsxDEV7("div", {
1618
+ }),
1619
+ /* @__PURE__ */ jsxs7("div", {
1620
1620
  className: "card-subtle space-y-3 p-6",
1621
1621
  children: [
1622
- /* @__PURE__ */ jsxDEV7("h3", {
1622
+ /* @__PURE__ */ jsx7("h3", {
1623
1623
  className: "text-lg font-semibold",
1624
1624
  children: "Responsible disclosure"
1625
- }, undefined, false, undefined, this),
1626
- /* @__PURE__ */ jsxDEV7("p", {
1625
+ }),
1626
+ /* @__PURE__ */ jsx7("p", {
1627
1627
  className: "text-muted-foreground text-sm",
1628
1628
  children: "We respond quickly to security reports and coordinate fixes before public disclosure."
1629
- }, undefined, false, undefined, this),
1630
- /* @__PURE__ */ jsxDEV7("ul", {
1629
+ }),
1630
+ /* @__PURE__ */ jsxs7("ul", {
1631
1631
  className: "text-muted-foreground space-y-2 text-sm",
1632
1632
  children: [
1633
- /* @__PURE__ */ jsxDEV7("li", {
1633
+ /* @__PURE__ */ jsx7("li", {
1634
1634
  children: "Security response within 5 business days."
1635
- }, undefined, false, undefined, this),
1636
- /* @__PURE__ */ jsxDEV7("li", {
1635
+ }),
1636
+ /* @__PURE__ */ jsx7("li", {
1637
1637
  children: "Private disclosure via security@contractspec.io."
1638
- }, undefined, false, undefined, this),
1639
- /* @__PURE__ */ jsxDEV7("li", {
1638
+ }),
1639
+ /* @__PURE__ */ jsx7("li", {
1640
1640
  children: "Credit for researchers (with permission)."
1641
- }, undefined, false, undefined, this)
1641
+ })
1642
1642
  ]
1643
- }, undefined, true, undefined, this)
1643
+ })
1644
1644
  ]
1645
- }, undefined, true, undefined, this)
1645
+ })
1646
1646
  ]
1647
- }, undefined, true, undefined, this),
1648
- /* @__PURE__ */ jsxDEV7("div", {
1647
+ }),
1648
+ /* @__PURE__ */ jsxs7("div", {
1649
1649
  className: "space-y-4",
1650
1650
  children: [
1651
- /* @__PURE__ */ jsxDEV7("h2", {
1651
+ /* @__PURE__ */ jsx7("h2", {
1652
1652
  className: "text-2xl font-bold",
1653
1653
  children: "Next steps"
1654
- }, undefined, false, undefined, this),
1655
- /* @__PURE__ */ jsxDEV7("p", {
1654
+ }),
1655
+ /* @__PURE__ */ jsx7("p", {
1656
1656
  className: "text-muted-foreground",
1657
1657
  children: "Explore the broader safety controls or read the roadmap to see upcoming trust investments."
1658
- }, undefined, false, undefined, this),
1659
- /* @__PURE__ */ jsxDEV7("div", {
1658
+ }),
1659
+ /* @__PURE__ */ jsxs7("div", {
1660
1660
  className: "flex flex-wrap gap-4 pt-4",
1661
1661
  children: [
1662
- /* @__PURE__ */ jsxDEV7(Link6, {
1662
+ /* @__PURE__ */ jsxs7(Link6, {
1663
1663
  href: "/docs/safety",
1664
1664
  className: "btn-ghost",
1665
1665
  children: [
1666
1666
  "Safety overview ",
1667
- /* @__PURE__ */ jsxDEV7(ChevronRight6, {
1667
+ /* @__PURE__ */ jsx7(ChevronRight6, {
1668
1668
  size: 16
1669
- }, undefined, false, undefined, this)
1669
+ })
1670
1670
  ]
1671
- }, undefined, true, undefined, this),
1672
- /* @__PURE__ */ jsxDEV7(Link6, {
1671
+ }),
1672
+ /* @__PURE__ */ jsxs7(Link6, {
1673
1673
  href: "/ROADMAP.md",
1674
1674
  className: "btn-ghost",
1675
1675
  children: [
1676
1676
  "Roadmap ",
1677
- /* @__PURE__ */ jsxDEV7(ChevronRight6, {
1677
+ /* @__PURE__ */ jsx7(ChevronRight6, {
1678
1678
  size: 16
1679
- }, undefined, false, undefined, this)
1679
+ })
1680
1680
  ]
1681
- }, undefined, true, undefined, this)
1681
+ })
1682
1682
  ]
1683
- }, undefined, true, undefined, this)
1683
+ })
1684
1684
  ]
1685
- }, undefined, true, undefined, this)
1685
+ })
1686
1686
  ]
1687
- }, undefined, true, undefined, this);
1687
+ });
1688
1688
  }
1689
1689
  export {
1690
1690
  SafetyTenantIsolationPage,