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