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