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