@knpkv/control-center 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +309 -0
- package/dist/client/.vite/manifest.json +452 -0
- package/dist/client/assets/ActiveWorkPage-Bvji6Tys.js +2 -0
- package/dist/client/assets/ActiveWorkPage-Bvji6Tys.js.map +1 -0
- package/dist/client/assets/ActiveWorkPage-CxNa23uW.css +1 -0
- package/dist/client/assets/AgentPage-Bom41la2.js +3 -0
- package/dist/client/assets/AgentPage-Bom41la2.js.map +1 -0
- package/dist/client/assets/AgentPage-f6WXQA21.css +1 -0
- package/dist/client/assets/AtlassianOAuthCallbackPage-Cqqgj2o3.css +1 -0
- package/dist/client/assets/AtlassianOAuthCallbackPage-dr-B9-DD.js +2 -0
- package/dist/client/assets/AtlassianOAuthCallbackPage-dr-B9-DD.js.map +1 -0
- package/dist/client/assets/AuthorizedSharePage-C-P-PNfm.js +2 -0
- package/dist/client/assets/AuthorizedSharePage-C-P-PNfm.js.map +1 -0
- package/dist/client/assets/AuthorizedSharePage-DzE_yvHI.css +1 -0
- package/dist/client/assets/BrowserCrypto-BPiuCuW-.js +2 -0
- package/dist/client/assets/BrowserCrypto-BPiuCuW-.js.map +1 -0
- package/dist/client/assets/BrowserSessionHydrator-C8F_LGhg.js +2 -0
- package/dist/client/assets/BrowserSessionHydrator-C8F_LGhg.js.map +1 -0
- package/dist/client/assets/CommandSearch-D6iFcdvj.js +2 -0
- package/dist/client/assets/CommandSearch-D6iFcdvj.js.map +1 -0
- package/dist/client/assets/CommandSearch-Df36xGJc.css +1 -0
- package/dist/client/assets/Dialog-DwSIPb-B-DVn37afM.js +42 -0
- package/dist/client/assets/Dialog-DwSIPb-B-DVn37afM.js.map +1 -0
- package/dist/client/assets/ItemsPage-DsQCbQ11.css +1 -0
- package/dist/client/assets/ItemsPage-x39U11an.js +2 -0
- package/dist/client/assets/ItemsPage-x39U11an.js.map +1 -0
- package/dist/client/assets/PairPage-D5vlz4OG.js +2 -0
- package/dist/client/assets/PairPage-D5vlz4OG.js.map +1 -0
- package/dist/client/assets/PortfolioOverview-DSUabOmm.js +2 -0
- package/dist/client/assets/PortfolioOverview-DSUabOmm.js.map +1 -0
- package/dist/client/assets/PortfolioOverview-nrb6Ebbh.css +1 -0
- package/dist/client/assets/ReleaseRoute-DyDm5s85.js +2 -0
- package/dist/client/assets/ReleaseRoute-DyDm5s85.js.map +1 -0
- package/dist/client/assets/ReleaseRoute-R3GdFaGc.css +1 -0
- package/dist/client/assets/ReleaseWorkset-6gGnZPS8.css +1 -0
- package/dist/client/assets/ReleaseWorkset-BhGacsgb.js +2 -0
- package/dist/client/assets/ReleaseWorkset-BhGacsgb.js.map +1 -0
- package/dist/client/assets/ServicesPage-CoMVH2Si.js +2 -0
- package/dist/client/assets/ServicesPage-CoMVH2Si.js.map +1 -0
- package/dist/client/assets/ServicesPage-D76DN13E.css +1 -0
- package/dist/client/assets/TimelinePage-38jhMz_L.css +1 -0
- package/dist/client/assets/TimelinePage-D8Fj_351.js +2 -0
- package/dist/client/assets/TimelinePage-D8Fj_351.js.map +1 -0
- package/dist/client/assets/WorkspaceEntityLink-BRifdJHn.js +2 -0
- package/dist/client/assets/WorkspaceEntityLink-BRifdJHn.js.map +1 -0
- package/dist/client/assets/WorkspaceEntityRoute-BwpujSqk.css +1 -0
- package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js +30 -0
- package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js.map +1 -0
- package/dist/client/assets/WorkspaceReleaseLayout-CMg2-6IQ.css +1 -0
- package/dist/client/assets/WorkspaceReleaseLayout-DDLdY0rU.js +2 -0
- package/dist/client/assets/WorkspaceReleaseLayout-DDLdY0rU.js.map +1 -0
- package/dist/client/assets/authenticatedMutationClient-D5yD0rch.js +2 -0
- package/dist/client/assets/authenticatedMutationClient-D5yD0rch.js.map +1 -0
- package/dist/client/assets/authorizedShareTransport-Dyj53kJf.js +2 -0
- package/dist/client/assets/authorizedShareTransport-Dyj53kJf.js.map +1 -0
- package/dist/client/assets/client-OmvShYdC.js +12 -0
- package/dist/client/assets/client-OmvShYdC.js.map +1 -0
- package/dist/client/assets/connectionTestTransport-c25QXx7A.js +2 -0
- package/dist/client/assets/connectionTestTransport-c25QXx7A.js.map +1 -0
- package/dist/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/client/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/dist/client/assets/index-CkslINEH.css +1 -0
- package/dist/client/assets/index-DLoOV6Hp.js +11 -0
- package/dist/client/assets/index-DLoOV6Hp.js.map +1 -0
- package/dist/client/assets/jsx-runtime-n5LQ9ujS.js +2 -0
- package/dist/client/assets/jsx-runtime-n5LQ9ujS.js.map +1 -0
- package/dist/client/assets/patterns-DEbg7R-A-Cw0A2uKS.js +2 -0
- package/dist/client/assets/patterns-DEbg7R-A-Cw0A2uKS.js.map +1 -0
- package/dist/client/assets/presentPortfolio-CkRqd_zz.js +2 -0
- package/dist/client/assets/presentPortfolio-CkRqd_zz.js.map +1 -0
- package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js +2 -0
- package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js.map +1 -0
- package/dist/client/assets/releasePaths-s-fSbIM-.js +2 -0
- package/dist/client/assets/releasePaths-s-fSbIM-.js.map +1 -0
- package/dist/client/assets/releaseRoutes-DSWkTh-E.js +2 -0
- package/dist/client/assets/releaseRoutes-DSWkTh-E.js.map +1 -0
- package/dist/client/assets/serviceOnboarding-B9pvdyWf.js +2 -0
- package/dist/client/assets/serviceOnboarding-B9pvdyWf.js.map +1 -0
- package/dist/client/assets/useCompactReleasePreview-Ch3XxgJU.js +2 -0
- package/dist/client/assets/useCompactReleasePreview-Ch3XxgJU.js.map +1 -0
- package/dist/client/assets/useWorkspaceItems-D0FuHGto.js +2 -0
- package/dist/client/assets/useWorkspaceItems-D0FuHGto.js.map +1 -0
- package/dist/client/assets/workspaceEntityPaths-xAl2jRFm.js +2 -0
- package/dist/client/assets/workspaceEntityPaths-xAl2jRFm.js.map +1 -0
- package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js +2 -0
- package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js.map +1 -0
- package/dist/client/build-graph.json +1465 -0
- package/dist/client/index.html +17 -0
- package/dist/server/api/agent.d.ts +652 -0
- package/dist/server/api/agent.d.ts.map +1 -0
- package/dist/server/api/client.d.ts +17 -0
- package/dist/server/api/client.d.ts.map +1 -0
- package/dist/server/api/controlCenterApi.d.ts +16 -0
- package/dist/server/api/controlCenterApi.d.ts.map +1 -0
- package/dist/server/api/deliveryGraph.d.ts +8714 -0
- package/dist/server/api/deliveryGraph.d.ts.map +1 -0
- package/dist/server/api/errors.d.ts +87 -0
- package/dist/server/api/errors.d.ts.map +1 -0
- package/dist/server/api/index.d.ts +14 -0
- package/dist/server/api/index.d.ts.map +1 -0
- package/dist/server/api/index.js +12 -0
- package/dist/server/api/index.js.map +1 -0
- package/dist/server/api/liveEvents.d.ts +1120 -0
- package/dist/server/api/liveEvents.d.ts.map +1 -0
- package/dist/server/api/media.d.ts +30 -0
- package/dist/server/api/media.d.ts.map +1 -0
- package/dist/server/api/plugins.d.ts +1853 -0
- package/dist/server/api/plugins.d.ts.map +1 -0
- package/dist/server/api/portfolio.d.ts +742 -0
- package/dist/server/api/portfolio.d.ts.map +1 -0
- package/dist/server/api/session.d.ts +204 -0
- package/dist/server/api/session.d.ts.map +1 -0
- package/dist/server/api/shares.d.ts +422 -0
- package/dist/server/api/shares.d.ts.map +1 -0
- package/dist/server/api/timeline.d.ts +86 -0
- package/dist/server/api/timeline.d.ts.map +1 -0
- package/dist/server/api/wire.d.ts +4 -0
- package/dist/server/api/wire.d.ts.map +1 -0
- package/dist/server/assets/BindConfig-BjK10BEb.js +15440 -0
- package/dist/server/assets/BindConfig-BjK10BEb.js.map +1 -0
- package/dist/server/assets/controlCenterApi-tZPvRPRH.js +1430 -0
- package/dist/server/assets/controlCenterApi-tZPvRPRH.js.map +1 -0
- package/dist/server/assets/domainEvent-x7yeq-gU.js +2130 -0
- package/dist/server/assets/domainEvent-x7yeq-gU.js.map +1 -0
- package/dist/server/assets/firstPartyServices-Y41P8uke.js +49 -0
- package/dist/server/assets/firstPartyServices-Y41P8uke.js.map +1 -0
- package/dist/server/assets/manualPluginSynchronization-C0aHB4UM.js +1805 -0
- package/dist/server/assets/manualPluginSynchronization-C0aHB4UM.js.map +1 -0
- package/dist/server/assets/portfolioInvalidation-Ds9Xm4_P.js +15463 -0
- package/dist/server/assets/portfolioInvalidation-Ds9Xm4_P.js.map +1 -0
- package/dist/server/assets/readiness-CzU3vjYQ.js +1012 -0
- package/dist/server/assets/readiness-CzU3vjYQ.js.map +1 -0
- package/dist/server/build-graph.json +3948 -0
- package/dist/server/domain/actors.d.ts +147 -0
- package/dist/server/domain/actors.d.ts.map +1 -0
- package/dist/server/domain/authorizedShare.d.ts +24 -0
- package/dist/server/domain/authorizedShare.d.ts.map +1 -0
- package/dist/server/domain/deliveryGraph.d.ts +848 -0
- package/dist/server/domain/deliveryGraph.d.ts.map +1 -0
- package/dist/server/domain/domainEvent.d.ts +50 -0
- package/dist/server/domain/domainEvent.d.ts.map +1 -0
- package/dist/server/domain/firstPartyServices.d.ts +60 -0
- package/dist/server/domain/firstPartyServices.d.ts.map +1 -0
- package/dist/server/domain/freshness.d.ts +367 -0
- package/dist/server/domain/freshness.d.ts.map +1 -0
- package/dist/server/domain/governedAction/bindings.d.ts +264 -0
- package/dist/server/domain/governedAction/bindings.d.ts.map +1 -0
- package/dist/server/domain/governedAction/index.d.ts +6 -0
- package/dist/server/domain/governedAction/index.d.ts.map +1 -0
- package/dist/server/domain/governedAction/lifecycle.d.ts +71 -0
- package/dist/server/domain/governedAction/lifecycle.d.ts.map +1 -0
- package/dist/server/domain/governedAction/model.d.ts +357 -0
- package/dist/server/domain/governedAction/model.d.ts.map +1 -0
- package/dist/server/domain/governedAction/stateMachine.d.ts +450 -0
- package/dist/server/domain/governedAction/stateMachine.d.ts.map +1 -0
- package/dist/server/domain/identifiers.d.ts +110 -0
- package/dist/server/domain/identifiers.d.ts.map +1 -0
- package/dist/server/domain/index.d.ts +26 -0
- package/dist/server/domain/index.d.ts.map +1 -0
- package/dist/server/domain/index.js +52 -0
- package/dist/server/domain/index.js.map +1 -0
- package/dist/server/domain/normalizedIssue.d.ts +223 -0
- package/dist/server/domain/normalizedIssue.d.ts.map +1 -0
- package/dist/server/domain/plugins/actions.d.ts +246 -0
- package/dist/server/domain/plugins/actions.d.ts.map +1 -0
- package/dist/server/domain/plugins/bounds.d.ts +12 -0
- package/dist/server/domain/plugins/bounds.d.ts.map +1 -0
- package/dist/server/domain/plugins/descriptor.d.ts +205 -0
- package/dist/server/domain/plugins/descriptor.d.ts.map +1 -0
- package/dist/server/domain/plugins/discovery.d.ts +39 -0
- package/dist/server/domain/plugins/discovery.d.ts.map +1 -0
- package/dist/server/domain/plugins/events.d.ts +232 -0
- package/dist/server/domain/plugins/events.d.ts.map +1 -0
- package/dist/server/domain/plugins/index.d.ts +11 -0
- package/dist/server/domain/plugins/index.d.ts.map +1 -0
- package/dist/server/domain/readiness/evaluate.d.ts +4 -0
- package/dist/server/domain/readiness/evaluate.d.ts.map +1 -0
- package/dist/server/domain/readiness/index.d.ts +7 -0
- package/dist/server/domain/readiness/index.d.ts.map +1 -0
- package/dist/server/domain/readiness/material.d.ts +114 -0
- package/dist/server/domain/readiness/material.d.ts.map +1 -0
- package/dist/server/domain/readiness/model.d.ts +1736 -0
- package/dist/server/domain/readiness/model.d.ts.map +1 -0
- package/dist/server/domain/readiness/policy.d.ts +73 -0
- package/dist/server/domain/readiness/policy.d.ts.map +1 -0
- package/dist/server/domain/readiness/rollup.d.ts +6 -0
- package/dist/server/domain/readiness/rollup.d.ts.map +1 -0
- package/dist/server/domain/relationshipRepair.d.ts +97 -0
- package/dist/server/domain/relationshipRepair.d.ts.map +1 -0
- package/dist/server/domain/release.d.ts +191 -0
- package/dist/server/domain/release.d.ts.map +1 -0
- package/dist/server/domain/releaseRelay.d.ts +44 -0
- package/dist/server/domain/releaseRelay.d.ts.map +1 -0
- package/dist/server/domain/sourceRevision.d.ts +39 -0
- package/dist/server/domain/sourceRevision.d.ts.map +1 -0
- package/dist/server/domain/timeline.d.ts +105 -0
- package/dist/server/domain/timeline.d.ts.map +1 -0
- package/dist/server/domain/utcTimestamp.d.ts +9 -0
- package/dist/server/domain/utcTimestamp.d.ts.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/server/DataRootProtocol.d.ts +80 -0
- package/dist/server/server/DataRootProtocol.d.ts.map +1 -0
- package/dist/server/server/agent/AgentJobWorker.d.ts +48 -0
- package/dist/server/server/agent/AgentJobWorker.d.ts.map +1 -0
- package/dist/server/server/agent/AgentRuntimeRegistry.d.ts +17 -0
- package/dist/server/server/agent/AgentRuntimeRegistry.d.ts.map +1 -0
- package/dist/server/server/agent/index.d.ts +4 -0
- package/dist/server/server/agent/index.d.ts.map +1 -0
- package/dist/server/server/api/ApiConfiguration.d.ts +24 -0
- package/dist/server/server/api/ApiConfiguration.d.ts.map +1 -0
- package/dist/server/server/api/ApiMiddleware.d.ts +14 -0
- package/dist/server/server/api/ApiMiddleware.d.ts.map +1 -0
- package/dist/server/server/api/ApplicationServices.d.ts +320 -0
- package/dist/server/server/api/ApplicationServices.d.ts.map +1 -0
- package/dist/server/server/api/ControlCenterApiServer.d.ts +11 -0
- package/dist/server/server/api/ControlCenterApiServer.d.ts.map +1 -0
- package/dist/server/server/api/ErrorMapping.d.ts +29 -0
- package/dist/server/server/api/ErrorMapping.d.ts.map +1 -0
- package/dist/server/server/api/Handlers.d.ts +24 -0
- package/dist/server/server/api/Handlers.d.ts.map +1 -0
- package/dist/server/server/api/LiveStreamAdmission.d.ts +34 -0
- package/dist/server/server/api/LiveStreamAdmission.d.ts.map +1 -0
- package/dist/server/server/api/RequestBoundary.d.ts +17 -0
- package/dist/server/server/api/RequestBoundary.d.ts.map +1 -0
- package/dist/server/server/api/RequestContext.d.ts +38 -0
- package/dist/server/server/api/RequestContext.d.ts.map +1 -0
- package/dist/server/server/api/RequestLimits.d.ts +79 -0
- package/dist/server/server/api/RequestLimits.d.ts.map +1 -0
- package/dist/server/server/api/index.d.ts +9 -0
- package/dist/server/server/api/index.d.ts.map +1 -0
- package/dist/server/server/application/authorizedShares.d.ts +29 -0
- package/dist/server/server/application/authorizedShares.d.ts.map +1 -0
- package/dist/server/server/application/awsResourceDiscovery.d.ts +18 -0
- package/dist/server/server/application/awsResourceDiscovery.d.ts.map +1 -0
- package/dist/server/server/application/connectionOwnership.d.ts +50 -0
- package/dist/server/server/application/connectionOwnership.d.ts.map +1 -0
- package/dist/server/server/application/deliveryGraphInspection.d.ts +59 -0
- package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -0
- package/dist/server/server/application/errors.d.ts +10 -0
- package/dist/server/server/application/errors.d.ts.map +1 -0
- package/dist/server/server/application/fakeReleaseNormalization.d.ts +152 -0
- package/dist/server/server/application/fakeReleaseNormalization.d.ts.map +1 -0
- package/dist/server/server/application/index.d.ts +17 -0
- package/dist/server/server/application/index.d.ts.map +1 -0
- package/dist/server/server/application/liveEvents.d.ts +22 -0
- package/dist/server/server/application/liveEvents.d.ts.map +1 -0
- package/dist/server/server/application/manualPluginSynchronization.d.ts +41 -0
- package/dist/server/server/application/manualPluginSynchronization.d.ts.map +1 -0
- package/dist/server/server/application/mediaReads.d.ts +14 -0
- package/dist/server/server/application/mediaReads.d.ts.map +1 -0
- package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts +109 -0
- package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -0
- package/dist/server/server/application/pluginAdministration.d.ts +1318 -0
- package/dist/server/server/application/pluginAdministration.d.ts.map +1 -0
- package/dist/server/server/application/pluginSynchronizationAuthority.d.ts +22 -0
- package/dist/server/server/application/pluginSynchronizationAuthority.d.ts.map +1 -0
- package/dist/server/server/application/portfolioInvalidation.d.ts +35 -0
- package/dist/server/server/application/portfolioInvalidation.d.ts.map +1 -0
- package/dist/server/server/application/portfolioSnapshots.d.ts +12 -0
- package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -0
- package/dist/server/server/application/readinessDigests.d.ts +3 -0
- package/dist/server/server/application/readinessDigests.d.ts.map +1 -0
- package/dist/server/server/application/relationshipInference.d.ts +57 -0
- package/dist/server/server/application/relationshipInference.d.ts.map +1 -0
- package/dist/server/server/application/relationshipInferenceMaterialization.d.ts +26 -0
- package/dist/server/server/application/relationshipInferenceMaterialization.d.ts.map +1 -0
- package/dist/server/server/application/relationshipRepairProposals.d.ts +41 -0
- package/dist/server/server/application/relationshipRepairProposals.d.ts.map +1 -0
- package/dist/server/server/application/releaseAgent.d.ts +30 -0
- package/dist/server/server/application/releaseAgent.d.ts.map +1 -0
- package/dist/server/server/application/releaseAgentJobs.d.ts +26 -0
- package/dist/server/server/application/releaseAgentJobs.d.ts.map +1 -0
- package/dist/server/server/application/releaseSynchronization.d.ts +55 -0
- package/dist/server/server/application/releaseSynchronization.d.ts.map +1 -0
- package/dist/server/server/application/timelineExportAudits.d.ts +22 -0
- package/dist/server/server/application/timelineExportAudits.d.ts.map +1 -0
- package/dist/server/server/application/timelineExports.d.ts +46 -0
- package/dist/server/server/application/timelineExports.d.ts.map +1 -0
- package/dist/server/server/application/timelineReads.d.ts +29 -0
- package/dist/server/server/application/timelineReads.d.ts.map +1 -0
- package/dist/server/server/auth/Auth.d.ts +169 -0
- package/dist/server/server/auth/Auth.d.ts.map +1 -0
- package/dist/server/server/auth/AuthRepository.d.ts +160 -0
- package/dist/server/server/auth/AuthRepository.d.ts.map +1 -0
- package/dist/server/server/auth/TerminalRecovery.d.ts +35 -0
- package/dist/server/server/auth/TerminalRecovery.d.ts.map +1 -0
- package/dist/server/server/auth/errors.d.ts +31 -0
- package/dist/server/server/auth/errors.d.ts.map +1 -0
- package/dist/server/server/auth/index.d.ts +5 -0
- package/dist/server/server/auth/index.d.ts.map +1 -0
- package/dist/server/server/auth/models.d.ts +63 -0
- package/dist/server/server/auth/models.d.ts.map +1 -0
- package/dist/server/server/cli.d.ts +3 -0
- package/dist/server/server/cli.d.ts.map +1 -0
- package/dist/server/server/cli.js +669 -0
- package/dist/server/server/cli.js.map +1 -0
- package/dist/server/server/cliArguments.d.ts +21 -0
- package/dist/server/server/cliArguments.d.ts.map +1 -0
- package/dist/server/server/cliConfiguration.d.ts +20 -0
- package/dist/server/server/cliConfiguration.d.ts.map +1 -0
- package/dist/server/server/governance/governedActionAuthority.d.ts +54 -0
- package/dist/server/server/governance/governedActionAuthority.d.ts.map +1 -0
- package/dist/server/server/governance/governedActionDigests.d.ts +1348 -0
- package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -0
- package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts +55 -0
- package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts.map +1 -0
- package/dist/server/server/governance/internal/GovernedActionExecutionStore.d.ts +116 -0
- package/dist/server/server/governance/internal/GovernedActionExecutionStore.d.ts.map +1 -0
- package/dist/server/server/governance/internal/GovernedActionPolicyEvaluator.d.ts +120 -0
- package/dist/server/server/governance/internal/GovernedActionPolicyEvaluator.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/begin.d.ts +17 -0
- package/dist/server/server/governance/internal/execution-store/begin.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/current-evidence.d.ts +33 -0
- package/dist/server/server/governance/internal/execution-store/current-evidence.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/current-session.d.ts +29 -0
- package/dist/server/server/governance/internal/execution-store/current-session.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/current-target.d.ts +28 -0
- package/dist/server/server/governance/internal/execution-store/current-target.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts +20 -0
- package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts +78 -0
- package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/inspect.d.ts +17 -0
- package/dist/server/server/governance/internal/execution-store/inspect.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/live.d.ts +6 -0
- package/dist/server/server/governance/internal/execution-store/live.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/preparation.d.ts +42 -0
- package/dist/server/server/governance/internal/execution-store/preparation.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts +33 -0
- package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts +20 -0
- package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/reconciliation-locator.d.ts +5 -0
- package/dist/server/server/governance/internal/execution-store/reconciliation-locator.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/reconciliation-outcome.d.ts +123 -0
- package/dist/server/server/governance/internal/execution-store/reconciliation-outcome.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/record-blocked.d.ts +13 -0
- package/dist/server/server/governance/internal/execution-store/record-blocked.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/record-dispatch.d.ts +12 -0
- package/dist/server/server/governance/internal/execution-store/record-dispatch.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/record-reconciliation.d.ts +12 -0
- package/dist/server/server/governance/internal/execution-store/record-reconciliation.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/record-recovery-unavailable.d.ts +11 -0
- package/dist/server/server/governance/internal/execution-store/record-recovery-unavailable.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/record-unknown.d.ts +11 -0
- package/dist/server/server/governance/internal/execution-store/record-unknown.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/recovery-candidates.d.ts +12 -0
- package/dist/server/server/governance/internal/execution-store/recovery-candidates.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/recovery-claim-expiry.d.ts +9 -0
- package/dist/server/server/governance/internal/execution-store/recovery-claim-expiry.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +465 -0
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -0
- package/dist/server/server/governance/internal/execution-store/tokens.d.ts +52 -0
- package/dist/server/server/governance/internal/execution-store/tokens.d.ts.map +1 -0
- package/dist/server/server/http/StaticApplication.d.ts +8 -0
- package/dist/server/server/http/StaticApplication.d.ts.map +1 -0
- package/dist/server/server/http/index.d.ts +4 -0
- package/dist/server/server/http/index.d.ts.map +1 -0
- package/dist/server/server/http/security/HttpLimits.d.ts +22 -0
- package/dist/server/server/http/security/HttpLimits.d.ts.map +1 -0
- package/dist/server/server/http/security/RequestPolicy.d.ts +26 -0
- package/dist/server/server/http/security/RequestPolicy.d.ts.map +1 -0
- package/dist/server/server/http/security/RichDocument.d.ts +154 -0
- package/dist/server/server/http/security/RichDocument.d.ts.map +1 -0
- package/dist/server/server/http/security/SecurityHeaders.d.ts +7 -0
- package/dist/server/server/http/security/SecurityHeaders.d.ts.map +1 -0
- package/dist/server/server/http/security/StaticAssetStore.d.ts +43 -0
- package/dist/server/server/http/security/StaticAssetStore.d.ts.map +1 -0
- package/dist/server/server/http/security/UrlPolicy.d.ts +30 -0
- package/dist/server/server/http/security/UrlPolicy.d.ts.map +1 -0
- package/dist/server/server/http/security/index.d.ts +8 -0
- package/dist/server/server/http/security/index.d.ts.map +1 -0
- package/dist/server/server/index.d.ts +18 -0
- package/dist/server/server/index.d.ts.map +1 -0
- package/dist/server/server/index.js +583 -0
- package/dist/server/server/index.js.map +1 -0
- package/dist/server/server/observability.d.ts +13 -0
- package/dist/server/server/observability.d.ts.map +1 -0
- package/dist/server/server/persistence/ContentStore.d.ts +86 -0
- package/dist/server/server/persistence/ContentStore.d.ts.map +1 -0
- package/dist/server/server/persistence/Database.d.ts +26 -0
- package/dist/server/server/persistence/Database.d.ts.map +1 -0
- package/dist/server/server/persistence/Persistence.d.ts +7042 -0
- package/dist/server/server/persistence/Persistence.d.ts.map +1 -0
- package/dist/server/server/persistence/PersistenceConfig.d.ts +27 -0
- package/dist/server/server/persistence/PersistenceConfig.d.ts.map +1 -0
- package/dist/server/server/persistence/backup/BackupArchive.d.ts +32 -0
- package/dist/server/server/persistence/backup/BackupArchive.d.ts.map +1 -0
- package/dist/server/server/persistence/backup/BackupArchiveCore.d.ts +23 -0
- package/dist/server/server/persistence/backup/BackupArchiveCore.d.ts.map +1 -0
- package/dist/server/server/persistence/backup/BackupManifest.d.ts +136 -0
- package/dist/server/server/persistence/backup/BackupManifest.d.ts.map +1 -0
- package/dist/server/server/persistence/backup/DatabaseSnapshot.d.ts +53 -0
- package/dist/server/server/persistence/backup/DatabaseSnapshot.d.ts.map +1 -0
- package/dist/server/server/persistence/backup/errors.d.ts +53 -0
- package/dist/server/server/persistence/backup/errors.d.ts.map +1 -0
- package/dist/server/server/persistence/backup/index.d.ts +4 -0
- package/dist/server/server/persistence/backup/index.d.ts.map +1 -0
- package/dist/server/server/persistence/errors.d.ts +99 -0
- package/dist/server/server/persistence/errors.d.ts.map +1 -0
- package/dist/server/server/persistence/governedActionReconciliationLocator.d.ts +14 -0
- package/dist/server/server/persistence/governedActionReconciliationLocator.d.ts.map +1 -0
- package/dist/server/server/persistence/index.d.ts +11 -0
- package/dist/server/server/persistence/index.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/BlobDigest.d.ts +6 -0
- package/dist/server/server/persistence/object-store/BlobDigest.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/BlobPath.d.ts +12 -0
- package/dist/server/server/persistence/object-store/BlobPath.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/BlobPublisher.d.ts +8 -0
- package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/BlobRef.d.ts +16 -0
- package/dist/server/server/persistence/object-store/BlobRef.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/BlobStore.d.ts +37 -0
- package/dist/server/server/persistence/object-store/BlobStore.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/BlobStoreError.d.ts +57 -0
- package/dist/server/server/persistence/object-store/BlobStoreError.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/BlobStoreTypes.d.ts +28 -0
- package/dist/server/server/persistence/object-store/BlobStoreTypes.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/OpenedBlob.d.ts +21 -0
- package/dist/server/server/persistence/object-store/OpenedBlob.d.ts.map +1 -0
- package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +21 -0
- package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/agentJobModels.d.ts +142 -0
- package/dist/server/server/persistence/repositories/agentJobModels.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/agentJobRepository.d.ts +134 -0
- package/dist/server/server/persistence/repositories/agentJobRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/authorizedShareRepository.d.ts +92 -0
- package/dist/server/server/persistence/repositories/authorizedShareRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/contentBlobMetadataRepository.d.ts +67 -0
- package/dist/server/server/persistence/repositories/contentBlobMetadataRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +2989 -0
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +566 -0
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/integrity.d.ts +16 -0
- package/dist/server/server/persistence/repositories/delivery-graph/integrity.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/quarantine.d.ts +22 -0
- package/dist/server/server/persistence/repositories/delivery-graph/quarantine.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +2147 -0
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/release-slice.d.ts +16 -0
- package/dist/server/server/persistence/repositories/delivery-graph/release-slice.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +683 -0
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +946 -0
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +2121 -0
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/domainEventModels.d.ts +89 -0
- package/dist/server/server/persistence/repositories/domainEventModels.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/domainEventRepository.d.ts +85 -0
- package/dist/server/server/persistence/repositories/domainEventRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/entityRepository.d.ts +134 -0
- package/dist/server/server/persistence/repositories/entityRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +1478 -0
- package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +858 -0
- package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/quarantine.d.ts +22 -0
- package/dist/server/server/persistence/repositories/governed-action/quarantine.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/read.d.ts +452 -0
- package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/rows.d.ts +115 -0
- package/dist/server/server/persistence/repositories/governed-action/rows.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +457 -0
- package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +518 -0
- package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +702 -0
- package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governed-action/write.d.ts +618 -0
- package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +467 -0
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/index.d.ts +26 -0
- package/dist/server/server/persistence/repositories/index.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/internal.d.ts +38 -0
- package/dist/server/server/persistence/repositories/internal.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/models.d.ts +420 -0
- package/dist/server/server/persistence/repositories/models.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/peopleRepository.d.ts +407 -0
- package/dist/server/server/persistence/repositories/peopleRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/persistedRowQuarantine.d.ts +20 -0
- package/dist/server/server/persistence/repositories/persistedRowQuarantine.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/pluginConfigurationModels.d.ts +76 -0
- package/dist/server/server/persistence/repositories/pluginConfigurationModels.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/pluginConfigurationRepository.d.ts +179 -0
- package/dist/server/server/persistence/repositories/pluginConfigurationRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/pluginConnectionRepository.d.ts +123 -0
- package/dist/server/server/persistence/repositories/pluginConnectionRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/pluginRuntimeModels.d.ts +195 -0
- package/dist/server/server/persistence/repositories/pluginRuntimeModels.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/pluginRuntimeRepository.d.ts +431 -0
- package/dist/server/server/persistence/repositories/pluginRuntimeRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts +150 -0
- package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/quarantineRepository.d.ts +42 -0
- package/dist/server/server/persistence/repositories/quarantineRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/assessments.d.ts +2679 -0
- package/dist/server/server/persistence/repositories/readiness/assessments.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/codec.d.ts +1368 -0
- package/dist/server/server/persistence/repositories/readiness/codec.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/contract.d.ts +3315 -0
- package/dist/server/server/persistence/repositories/readiness/contract.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/materialization.d.ts +459 -0
- package/dist/server/server/persistence/repositories/readiness/materialization.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/quarantine.d.ts +22 -0
- package/dist/server/server/persistence/repositories/readiness/quarantine.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/queue.d.ts +112 -0
- package/dist/server/server/persistence/repositories/readiness/queue.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/rows.d.ts +169 -0
- package/dist/server/server/persistence/repositories/readiness/rows.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readiness/rules.d.ts +85 -0
- package/dist/server/server/persistence/repositories/readiness/rules.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/readinessRepository.d.ts +1722 -0
- package/dist/server/server/persistence/repositories/readinessRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/relationshipRepairProposalRepository.d.ts +294 -0
- package/dist/server/server/persistence/repositories/relationshipRepairProposalRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/releaseRepository.d.ts +1062 -0
- package/dist/server/server/persistence/repositories/releaseRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/timelineExportAuditRepository.d.ts +39 -0
- package/dist/server/server/persistence/repositories/timelineExportAuditRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/timelineRepository.d.ts +84 -0
- package/dist/server/server/persistence/repositories/timelineRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/repositories/workspaceRepository.d.ts +52 -0
- package/dist/server/server/persistence/repositories/workspaceRepository.d.ts.map +1 -0
- package/dist/server/server/persistence/schema.d.ts +17 -0
- package/dist/server/server/persistence/schema.d.ts.map +1 -0
- package/dist/server/server/persistence/schemas.d.ts +14 -0
- package/dist/server/server/persistence/schemas.d.ts.map +1 -0
- package/dist/server/server/plugins/AtlassianBasicAuth.d.ts +2 -0
- package/dist/server/server/plugins/AtlassianBasicAuth.d.ts.map +1 -0
- package/dist/server/server/plugins/PluginCapabilityCodecs.d.ts +357 -0
- package/dist/server/server/plugins/PluginCapabilityCodecs.d.ts.map +1 -0
- package/dist/server/server/plugins/PluginConnection.d.ts +28 -0
- package/dist/server/server/plugins/PluginConnection.d.ts.map +1 -0
- package/dist/server/server/plugins/PluginConnectionMap.d.ts +22 -0
- package/dist/server/server/plugins/PluginConnectionMap.d.ts.map +1 -0
- package/dist/server/server/plugins/PluginDefinition.d.ts +9 -0
- package/dist/server/server/plugins/PluginDefinition.d.ts.map +1 -0
- package/dist/server/server/plugins/PluginDefinitionV1.d.ts +11 -0
- package/dist/server/server/plugins/PluginDefinitionV1.d.ts.map +1 -0
- package/dist/server/server/plugins/PluginExecutor.d.ts +14 -0
- package/dist/server/server/plugins/PluginExecutor.d.ts.map +1 -0
- package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts +35 -0
- package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts.map +1 -0
- package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts +39 -0
- package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts.map +1 -0
- package/dist/server/server/plugins/catalog/firstPartyServiceCatalog.d.ts +13 -0
- package/dist/server/server/plugins/catalog/firstPartyServiceCatalog.d.ts.map +1 -0
- package/dist/server/server/plugins/clockify/ClockifyReadPlugin.d.ts +78 -0
- package/dist/server/server/plugins/clockify/ClockifyReadPlugin.d.ts.map +1 -0
- package/dist/server/server/plugins/clockify/ClockifyReadProvider.d.ts +2 -0
- package/dist/server/server/plugins/clockify/ClockifyReadProvider.d.ts.map +1 -0
- package/dist/server/server/plugins/clockify/ClockifyTimeEntryNormalization.d.ts +2 -0
- package/dist/server/server/plugins/clockify/ClockifyTimeEntryNormalization.d.ts.map +1 -0
- package/dist/server/server/plugins/clockify/index.d.ts +3 -0
- package/dist/server/server/plugins/clockify/index.d.ts.map +1 -0
- package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts +4 -0
- package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts.map +1 -0
- package/dist/server/server/plugins/codecommit/index.d.ts +3 -0
- package/dist/server/server/plugins/codecommit/index.d.ts.map +1 -0
- package/dist/server/server/plugins/codepipeline/CodePipelinePluginDefinition.d.ts +4 -0
- package/dist/server/server/plugins/codepipeline/CodePipelinePluginDefinition.d.ts.map +1 -0
- package/dist/server/server/plugins/codepipeline/CodePipelineReadClient.d.ts +2 -0
- package/dist/server/server/plugins/codepipeline/CodePipelineReadClient.d.ts.map +1 -0
- package/dist/server/server/plugins/codepipeline/CodePipelineReadProvider.d.ts +2 -0
- package/dist/server/server/plugins/codepipeline/CodePipelineReadProvider.d.ts.map +1 -0
- package/dist/server/server/plugins/codepipeline/index.d.ts +3 -0
- package/dist/server/server/plugins/codepipeline/index.d.ts.map +1 -0
- package/dist/server/server/plugins/confluence/ConfluencePageAdapter.d.ts +2 -0
- package/dist/server/server/plugins/confluence/ConfluencePageAdapter.d.ts.map +1 -0
- package/dist/server/server/plugins/confluence/ConfluencePageClient.d.ts +2 -0
- package/dist/server/server/plugins/confluence/ConfluencePageClient.d.ts.map +1 -0
- package/dist/server/server/plugins/confluence/ConfluencePagePluginDefinition.d.ts +44 -0
- package/dist/server/server/plugins/confluence/ConfluencePagePluginDefinition.d.ts.map +1 -0
- package/dist/server/server/plugins/confluence/ConfluencePageSchemas.d.ts +2 -0
- package/dist/server/server/plugins/confluence/ConfluencePageSchemas.d.ts.map +1 -0
- package/dist/server/server/plugins/confluence/SafeConfluenceMarkdown.d.ts +2 -0
- package/dist/server/server/plugins/confluence/SafeConfluenceMarkdown.d.ts.map +1 -0
- package/dist/server/server/plugins/failures.d.ts +79 -0
- package/dist/server/server/plugins/failures.d.ts.map +1 -0
- package/dist/server/server/plugins/fake/FakePluginDefinition.d.ts +17 -0
- package/dist/server/server/plugins/fake/FakePluginDefinition.d.ts.map +1 -0
- package/dist/server/server/plugins/fake/FakePluginProbe.d.ts +40 -0
- package/dist/server/server/plugins/fake/FakePluginProbe.d.ts.map +1 -0
- package/dist/server/server/plugins/fake/FakePluginScenario.d.ts +46 -0
- package/dist/server/server/plugins/fake/FakePluginScenario.d.ts.map +1 -0
- package/dist/server/server/plugins/firstPartySynchronization.d.ts +7 -0
- package/dist/server/server/plugins/firstPartySynchronization.d.ts.map +1 -0
- package/dist/server/server/plugins/index.d.ts +21 -0
- package/dist/server/server/plugins/index.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/AuthorizedPluginExecutor.d.ts +8 -0
- package/dist/server/server/plugins/internal/AuthorizedPluginExecutor.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/AuthorizedPluginExecutorMap.d.ts +27 -0
- package/dist/server/server/plugins/internal/AuthorizedPluginExecutorMap.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/FirstPartyPluginRuntimeRegistry.d.ts +2 -0
- package/dist/server/server/plugins/internal/FirstPartyPluginRuntimeRegistry.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/PluginRuntime.d.ts +13 -0
- package/dist/server/server/plugins/internal/PluginRuntime.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/PluginRuntimeAuthority.d.ts +154 -0
- package/dist/server/server/plugins/internal/PluginRuntimeAuthority.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/PluginRuntimeAuthorityRepository.d.ts +131 -0
- package/dist/server/server/plugins/internal/PluginRuntimeAuthorityRepository.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/PluginRuntimeAuthoritySource.d.ts +23 -0
- package/dist/server/server/plugins/internal/PluginRuntimeAuthoritySource.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/PluginRuntimeMap.d.ts +23 -0
- package/dist/server/server/plugins/internal/PluginRuntimeMap.d.ts.map +1 -0
- package/dist/server/server/plugins/internal/PluginRuntimeRegistry.d.ts +21 -0
- package/dist/server/server/plugins/internal/PluginRuntimeRegistry.d.ts.map +1 -0
- package/dist/server/server/plugins/jira/JiraIssueNormalization.d.ts +2 -0
- package/dist/server/server/plugins/jira/JiraIssueNormalization.d.ts.map +1 -0
- package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts +74 -0
- package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts.map +1 -0
- package/dist/server/server/plugins/jira/JiraReadProvider.d.ts +7 -0
- package/dist/server/server/plugins/jira/JiraReadProvider.d.ts.map +1 -0
- package/dist/server/server/plugins/jira/index.d.ts +3 -0
- package/dist/server/server/plugins/jira/index.d.ts.map +1 -0
- package/dist/server/server/plugins/negotiation.d.ts +75 -0
- package/dist/server/server/plugins/negotiation.d.ts.map +1 -0
- package/dist/server/server/plugins/retryPolicy.d.ts +28 -0
- package/dist/server/server/plugins/retryPolicy.d.ts.map +1 -0
- package/dist/server/server/readinessDigests.d.ts +103 -0
- package/dist/server/server/readinessDigests.d.ts.map +1 -0
- package/dist/server/server/runtime/Bootstrap.d.ts +39 -0
- package/dist/server/server/runtime/Bootstrap.d.ts.map +1 -0
- package/dist/server/server/runtime/ControlCenterServer.d.ts +57 -0
- package/dist/server/server/runtime/ControlCenterServer.d.ts.map +1 -0
- package/dist/server/server/runtime/DatabaseDrain.d.ts +6 -0
- package/dist/server/server/runtime/DatabaseDrain.d.ts.map +1 -0
- package/dist/server/server/runtime/DomainEventWakeups.d.ts +22 -0
- package/dist/server/server/runtime/DomainEventWakeups.d.ts.map +1 -0
- package/dist/server/server/runtime/FirstPartyPluginRuntime.d.ts +2 -0
- package/dist/server/server/runtime/FirstPartyPluginRuntime.d.ts.map +1 -0
- package/dist/server/server/runtime/GovernedActionExecutionStartup.d.ts +35 -0
- package/dist/server/server/runtime/GovernedActionExecutionStartup.d.ts.map +1 -0
- package/dist/server/server/runtime/NodeTransport.d.ts +57 -0
- package/dist/server/server/runtime/NodeTransport.d.ts.map +1 -0
- package/dist/server/server/runtime/ReleaseSynchronizationStartup.d.ts +44 -0
- package/dist/server/server/runtime/ReleaseSynchronizationStartup.d.ts.map +1 -0
- package/dist/server/server/runtime/RequestUrlBoundary.d.ts +4 -0
- package/dist/server/server/runtime/RequestUrlBoundary.d.ts.map +1 -0
- package/dist/server/server/runtime/ServerLifecycle.d.ts +74 -0
- package/dist/server/server/runtime/ServerLifecycle.d.ts.map +1 -0
- package/dist/server/server/runtime/index.d.ts +9 -0
- package/dist/server/server/runtime/index.d.ts.map +1 -0
- package/dist/server/server/secrets/SecretRef.d.ts +6 -0
- package/dist/server/server/secrets/SecretRef.d.ts.map +1 -0
- package/dist/server/server/secrets/SecretStore.d.ts +39 -0
- package/dist/server/server/secrets/SecretStore.d.ts.map +1 -0
- package/dist/server/server/secrets/SecretStoreError.d.ts +41 -0
- package/dist/server/server/secrets/SecretStoreError.d.ts.map +1 -0
- package/dist/server/server/secrets/index.d.ts +5 -0
- package/dist/server/server/secrets/index.d.ts.map +1 -0
- package/dist/server/server/security/BindConfig.d.ts +51 -0
- package/dist/server/server/security/BindConfig.d.ts.map +1 -0
- package/dist/server/server/security/RequestSecurity.d.ts +84 -0
- package/dist/server/server/security/RequestSecurity.d.ts.map +1 -0
- package/dist/server/server/security/index.d.ts +3 -0
- package/dist/server/server/security/index.d.ts.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,2130 @@
|
|
|
1
|
+
import * as Schema$1 from "effect/Schema";
|
|
2
|
+
import { DateTime, Schema, SchemaTransformation } from "effect";
|
|
3
|
+
import * as DateTime$1 from "effect/DateTime";
|
|
4
|
+
import * as Effect$1 from "effect/Effect";
|
|
5
|
+
import * as Result$1 from "effect/Result";
|
|
6
|
+
//#region src/domain/identifiers.ts
|
|
7
|
+
var CANONICAL_LOWERCASE_UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
|
8
|
+
var canonicalUuid7 = (brand) => Schema.String.check(Schema.isUUID(7)).pipe(Schema.decodeTo(Schema.String.check(Schema.isUUID(7), Schema.isPattern(CANONICAL_LOWERCASE_UUID_PATTERN, { expected: "a canonical lowercase UUID v7" })), SchemaTransformation.toLowerCase()), Schema.brand(brand));
|
|
9
|
+
/** Canonical identifier of an isolated Control Center workspace. */
|
|
10
|
+
var WorkspaceId = canonicalUuid7("WorkspaceId");
|
|
11
|
+
/** Canonical identifier of a release aggregate. */
|
|
12
|
+
var ReleaseId = canonicalUuid7("ReleaseId");
|
|
13
|
+
/** Canonical identifier of a normalized delivery entity. */
|
|
14
|
+
var EntityId = canonicalUuid7("EntityId");
|
|
15
|
+
/** Canonical identifier of a human collaborator. */
|
|
16
|
+
var PersonId = canonicalUuid7("PersonId");
|
|
17
|
+
/** Canonical identifier of an automated agent. */
|
|
18
|
+
var AgentId = canonicalUuid7("AgentId");
|
|
19
|
+
/** Canonical identifier of a deployment environment. */
|
|
20
|
+
var EnvironmentId = canonicalUuid7("EnvironmentId");
|
|
21
|
+
/** Canonical identifier of a configured plugin connection. */
|
|
22
|
+
var PluginConnectionId = canonicalUuid7("PluginConnectionId");
|
|
23
|
+
/** Canonical identifier of one external provider account followed by a workspace. */
|
|
24
|
+
var ProviderAccountId = canonicalUuid7("ProviderAccountId");
|
|
25
|
+
/** Canonical identifier of one repository, pipeline, site, or workspace being followed. */
|
|
26
|
+
var FollowedResourceId = canonicalUuid7("FollowedResourceId");
|
|
27
|
+
/** Canonical identifier of a collaborator role assignment. */
|
|
28
|
+
var RoleAssignmentId = canonicalUuid7("RoleAssignmentId");
|
|
29
|
+
/** Canonical identifier of one delivery-graph relationship. */
|
|
30
|
+
var RelationshipId = canonicalUuid7("RelationshipId");
|
|
31
|
+
/** Canonical identifier of one governed relationship-repair proposal. */
|
|
32
|
+
var RelationshipRepairProposalId = canonicalUuid7("RelationshipRepairProposalId");
|
|
33
|
+
/** Canonical identifier of one immutable relationship-repair review. */
|
|
34
|
+
var RelationshipRepairReviewId = canonicalUuid7("RelationshipRepairReviewId");
|
|
35
|
+
/** Canonical identifier of one immutable evidence claim. */
|
|
36
|
+
var EvidenceClaimId = canonicalUuid7("EvidenceClaimId");
|
|
37
|
+
/** Canonical identifier of one immutable evidence observation envelope. */
|
|
38
|
+
var EvidenceId = canonicalUuid7("EvidenceId");
|
|
39
|
+
/** Canonical identifier of one immutable readiness assessment. */
|
|
40
|
+
var ReadinessAssessmentId = canonicalUuid7("ReadinessAssessmentId");
|
|
41
|
+
/** Canonical identifier of one resolved or explicitly missing graph node. */
|
|
42
|
+
var GraphNodeId = canonicalUuid7("GraphNodeId");
|
|
43
|
+
/** Workspace-local monotonic position used for durable event replay. */
|
|
44
|
+
var EventCursor = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(Schema.brand("EventCursor"));
|
|
45
|
+
/** Canonical identifier of one durable domain event. */
|
|
46
|
+
var DomainEventId = canonicalUuid7("DomainEventId");
|
|
47
|
+
/** Canonical identifier of one asynchronous Control Center job. */
|
|
48
|
+
var JobId = canonicalUuid7("JobId");
|
|
49
|
+
/** Canonical identifier of one durable release-scoped agent thread. */
|
|
50
|
+
var AgentThreadId = canonicalUuid7("AgentThreadId");
|
|
51
|
+
/** Canonical identifier of an authenticated browser session. */
|
|
52
|
+
var SessionId = canonicalUuid7("SessionId");
|
|
53
|
+
/** Canonical identifier of one exact-scope authenticated share grant. */
|
|
54
|
+
var ShareId = canonicalUuid7("ShareId");
|
|
55
|
+
/** Canonical identifier of one governed provider action. */
|
|
56
|
+
var GovernedActionId = canonicalUuid7("GovernedActionId");
|
|
57
|
+
/** Canonical identifier of one immutable governed-action transition. */
|
|
58
|
+
var GovernedActionTransitionId = canonicalUuid7("GovernedActionTransitionId");
|
|
59
|
+
/** Canonical identifier of one immutable human action authorization. */
|
|
60
|
+
var GovernedActionAuthorizationId = canonicalUuid7("GovernedActionAuthorizationId");
|
|
61
|
+
/** Canonical identifier of one governed-action execution attempt. */
|
|
62
|
+
var GovernedActionAttemptId = canonicalUuid7("GovernedActionAttemptId");
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/domain/utcTimestamp.ts
|
|
65
|
+
/**
|
|
66
|
+
* Codec for instants that normalizes accepted ISO-8601 input to UTC and encodes
|
|
67
|
+
* it as a canonical UTC ISO-8601 string.
|
|
68
|
+
*/
|
|
69
|
+
var UtcTimestamp = Schema.DateTimeUtcFromString.annotate({ identifier: "UtcTimestamp" });
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/domain/sourceRevision.ts
|
|
72
|
+
var boundedOpaqueSourceValue = Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(512));
|
|
73
|
+
/** Stable persisted provider names, independent of package abbreviations. */
|
|
74
|
+
var ProviderId = Schema.Literals([
|
|
75
|
+
"codecommit",
|
|
76
|
+
"codepipeline",
|
|
77
|
+
"jira",
|
|
78
|
+
"confluence",
|
|
79
|
+
"clockify"
|
|
80
|
+
]).annotate({ identifier: "ProviderId" });
|
|
81
|
+
/** Opaque immutable identifier assigned to an object by its source provider. */
|
|
82
|
+
var VendorImmutableId = boundedOpaqueSourceValue.pipe(Schema.brand("VendorImmutableId"));
|
|
83
|
+
/** Opaque source-provider revision, version, digest, or ETag. */
|
|
84
|
+
var Revision = boundedOpaqueSourceValue.pipe(Schema.brand("Revision"));
|
|
85
|
+
/** Positive version of the normalization schema used for a source record. */
|
|
86
|
+
var NormalizationSchemaVersion = Schema.Number.check(Schema.isInt(), Schema.isGreaterThan(0)).pipe(Schema.brand("NormalizationSchemaVersion"));
|
|
87
|
+
var hasNoControlCharacters = (value) => Array.from(value).every((character) => {
|
|
88
|
+
const codePoint = character.codePointAt(0);
|
|
89
|
+
return codePoint !== void 0 && !(codePoint >= 0 && codePoint <= 31 || codePoint >= 127 && codePoint <= 159);
|
|
90
|
+
});
|
|
91
|
+
/** Safe navigable URL for an exact provider object, without embedded credentials. */
|
|
92
|
+
var SourceUrl = Schema.String.check(Schema.isMaxLength(4096), Schema.makeFilter(hasNoControlCharacters, { expected: "a source URL without control characters" })).pipe(Schema.decodeTo(Schema.URL, SchemaTransformation.urlFromString), Schema.check(Schema.makeFilter(({ protocol }) => protocol === "https:" || protocol === "http:", { expected: "an HTTP or HTTPS source URL" }), Schema.makeFilter(({ password, username }) => password.length === 0 && username.length === 0, { expected: "a source URL without embedded credentials" })));
|
|
93
|
+
/**
|
|
94
|
+
* Immutable provenance needed to reconcile a normalized record with the exact
|
|
95
|
+
* provider object and revision from which it was derived.
|
|
96
|
+
*/
|
|
97
|
+
var SourceRevision = Schema.Struct({
|
|
98
|
+
providerId: ProviderId,
|
|
99
|
+
pluginConnectionId: PluginConnectionId,
|
|
100
|
+
vendorImmutableId: VendorImmutableId,
|
|
101
|
+
revision: Revision,
|
|
102
|
+
sourceUrl: Schema.Union([SourceUrl, Schema.Null]),
|
|
103
|
+
firstObservedAt: UtcTimestamp,
|
|
104
|
+
lastObservedAt: UtcTimestamp,
|
|
105
|
+
synchronizedAt: UtcTimestamp,
|
|
106
|
+
normalizationSchemaVersion: NormalizationSchemaVersion
|
|
107
|
+
}).check(Schema.makeFilter((sourceRevision) => {
|
|
108
|
+
if (DateTime.toEpochMillis(sourceRevision.firstObservedAt) > DateTime.toEpochMillis(sourceRevision.lastObservedAt)) return {
|
|
109
|
+
path: ["lastObservedAt"],
|
|
110
|
+
issue: "lastObservedAt must not precede firstObservedAt"
|
|
111
|
+
};
|
|
112
|
+
return DateTime.toEpochMillis(sourceRevision.lastObservedAt) <= DateTime.toEpochMillis(sourceRevision.synchronizedAt) ? void 0 : {
|
|
113
|
+
path: ["synchronizedAt"],
|
|
114
|
+
issue: "synchronizedAt must not precede lastObservedAt"
|
|
115
|
+
};
|
|
116
|
+
})).annotate({ identifier: "SourceRevision" });
|
|
117
|
+
//#endregion
|
|
118
|
+
//#region src/domain/freshness.ts
|
|
119
|
+
var StaleAfterSeconds = Schema$1.Int.check(Schema$1.isGreaterThan(0));
|
|
120
|
+
var SafeHealthMessage = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isMinLength(1), Schema$1.isMaxLength(500));
|
|
121
|
+
/** Stable failure classes exposed by plugin health without leaking raw causes. */
|
|
122
|
+
var PluginFailureClass = Schema$1.Literals([
|
|
123
|
+
"authentication",
|
|
124
|
+
"authorization",
|
|
125
|
+
"rate-limit",
|
|
126
|
+
"timeout",
|
|
127
|
+
"malformed-response",
|
|
128
|
+
"outage",
|
|
129
|
+
"unknown"
|
|
130
|
+
]);
|
|
131
|
+
var HealthyPluginHealth = Schema$1.TaggedStruct("healthy", { checkedAt: UtcTimestamp });
|
|
132
|
+
var DegradedPluginHealth = Schema$1.TaggedStruct("degraded", {
|
|
133
|
+
checkedAt: UtcTimestamp,
|
|
134
|
+
failureClass: PluginFailureClass,
|
|
135
|
+
retryAt: Schema$1.NullOr(UtcTimestamp),
|
|
136
|
+
safeMessage: SafeHealthMessage
|
|
137
|
+
}).check(Schema$1.makeFilter(({ checkedAt, retryAt }) => retryAt === null || DateTime$1.Order(checkedAt, retryAt) <= 0, { expected: "plugin retry time to be at or after its health check" }));
|
|
138
|
+
var UnavailablePluginHealth = Schema$1.TaggedStruct("unavailable", {
|
|
139
|
+
checkedAt: UtcTimestamp,
|
|
140
|
+
failureClass: PluginFailureClass,
|
|
141
|
+
retryAt: Schema$1.NullOr(UtcTimestamp),
|
|
142
|
+
safeMessage: SafeHealthMessage
|
|
143
|
+
}).check(Schema$1.makeFilter(({ checkedAt, retryAt }) => retryAt === null || DateTime$1.Order(checkedAt, retryAt) <= 0, { expected: "plugin retry time to be at or after its health check" }));
|
|
144
|
+
var DisabledPluginHealth = Schema$1.TaggedStruct("disabled", { checkedAt: UtcTimestamp });
|
|
145
|
+
/** Health of the plugin connection responsible for a normalized object. */
|
|
146
|
+
var PluginHealth = Schema$1.Union([
|
|
147
|
+
HealthyPluginHealth,
|
|
148
|
+
DegradedPluginHealth,
|
|
149
|
+
UnavailablePluginHealth,
|
|
150
|
+
DisabledPluginHealth
|
|
151
|
+
]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
152
|
+
var UsablePluginHealth = Schema$1.Union([HealthyPluginHealth, DegradedPluginHealth]);
|
|
153
|
+
var ProviderProvenance = Schema$1.TaggedStruct("provider", { sourceRevision: SourceRevision });
|
|
154
|
+
var CachedProvenance = Schema$1.TaggedStruct("cache", {
|
|
155
|
+
cachedAt: UtcTimestamp,
|
|
156
|
+
sourceRevision: SourceRevision
|
|
157
|
+
}).check(Schema$1.makeFilter(({ cachedAt, sourceRevision }) => DateTime$1.Order(sourceRevision.synchronizedAt, cachedAt) <= 0, { expected: "the cache time to be at or after source synchronization" }));
|
|
158
|
+
var NoCacheProvenance = Schema$1.TaggedStruct("none", { pluginConnectionId: PluginConnectionId });
|
|
159
|
+
var sourceAgeSecondsAt = (sourceObservedAt, evaluatedAt) => (DateTime$1.toEpochMillis(evaluatedAt) - DateTime$1.toEpochMillis(sourceObservedAt)) / 1e3;
|
|
160
|
+
var freshnessEvaluation = { evaluatedAt: Schema$1.optional(UtcTimestamp) };
|
|
161
|
+
var evaluatedAtOrHealthCheck = (evaluatedAt, pluginHealth) => evaluatedAt ?? pluginHealth.checkedAt;
|
|
162
|
+
var CurrentFreshness = Schema$1.TaggedStruct("current", {
|
|
163
|
+
...freshnessEvaluation,
|
|
164
|
+
pluginHealth: UsablePluginHealth,
|
|
165
|
+
provenance: Schema$1.Union([ProviderProvenance, CachedProvenance]),
|
|
166
|
+
sourceObservedAt: UtcTimestamp,
|
|
167
|
+
staleAfterSeconds: StaleAfterSeconds,
|
|
168
|
+
synchronizedAt: UtcTimestamp
|
|
169
|
+
}).check(Schema$1.makeFilter(({ evaluatedAt, pluginHealth, provenance, sourceObservedAt, staleAfterSeconds, synchronizedAt }) => DateTime$1.Equivalence(sourceObservedAt, provenance.sourceRevision.lastObservedAt) && DateTime$1.Order(provenance.sourceRevision.synchronizedAt, synchronizedAt) <= 0 && (provenance._tag === "provider" || DateTime$1.Order(provenance.cachedAt, synchronizedAt) <= 0) && DateTime$1.Order(synchronizedAt, pluginHealth.checkedAt) <= 0 && (evaluatedAt === void 0 || DateTime$1.Order(pluginHealth.checkedAt, evaluatedAt) <= 0) && sourceAgeSecondsAt(sourceObservedAt, evaluatedAtOrHealthCheck(evaluatedAt, pluginHealth)) >= 0 && sourceAgeSecondsAt(sourceObservedAt, evaluatedAtOrHealthCheck(evaluatedAt, pluginHealth)) <= staleAfterSeconds, { expected: "current source data to match its revision and remain within its stale threshold" }));
|
|
170
|
+
var StaleFreshness = Schema$1.TaggedStruct("stale", {
|
|
171
|
+
...freshnessEvaluation,
|
|
172
|
+
pluginHealth: PluginHealth,
|
|
173
|
+
provenance: CachedProvenance,
|
|
174
|
+
sourceObservedAt: UtcTimestamp,
|
|
175
|
+
staleAfterSeconds: StaleAfterSeconds,
|
|
176
|
+
synchronizedAt: UtcTimestamp
|
|
177
|
+
}).check(Schema$1.makeFilter(({ evaluatedAt, pluginHealth, provenance, sourceObservedAt, staleAfterSeconds, synchronizedAt }) => DateTime$1.Equivalence(sourceObservedAt, provenance.sourceRevision.lastObservedAt) && DateTime$1.Order(sourceObservedAt, synchronizedAt) <= 0 && DateTime$1.Order(provenance.cachedAt, synchronizedAt) <= 0 && DateTime$1.Order(synchronizedAt, pluginHealth.checkedAt) <= 0 && (evaluatedAt === void 0 || DateTime$1.Order(pluginHealth.checkedAt, evaluatedAt) <= 0) && sourceAgeSecondsAt(sourceObservedAt, evaluatedAtOrHealthCheck(evaluatedAt, pluginHealth)) > staleAfterSeconds, { expected: "stale cache data to be chronological and beyond its stale threshold" }));
|
|
178
|
+
var MissingFreshness = Schema$1.TaggedStruct("missing", {
|
|
179
|
+
pluginHealth: HealthyPluginHealth,
|
|
180
|
+
provenance: NoCacheProvenance,
|
|
181
|
+
sourceObservedAt: Schema$1.Null,
|
|
182
|
+
staleAfterSeconds: StaleAfterSeconds,
|
|
183
|
+
synchronizedAt: UtcTimestamp
|
|
184
|
+
});
|
|
185
|
+
var UnavailableFreshness = Schema$1.TaggedStruct("unavailable", {
|
|
186
|
+
pluginHealth: Schema$1.Union([UnavailablePluginHealth, DisabledPluginHealth]),
|
|
187
|
+
provenance: NoCacheProvenance,
|
|
188
|
+
sourceObservedAt: Schema$1.Null,
|
|
189
|
+
staleAfterSeconds: StaleAfterSeconds,
|
|
190
|
+
synchronizedAt: Schema$1.Null
|
|
191
|
+
});
|
|
192
|
+
/**
|
|
193
|
+
* Freshness of normalized data, preserving cached stale data while separating
|
|
194
|
+
* absence from a connection that cannot currently be queried.
|
|
195
|
+
*/
|
|
196
|
+
var Freshness = Schema$1.Union([
|
|
197
|
+
CurrentFreshness,
|
|
198
|
+
StaleFreshness,
|
|
199
|
+
MissingFreshness,
|
|
200
|
+
UnavailableFreshness
|
|
201
|
+
]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
202
|
+
/** Re-evaluate persisted freshness for a read projection without rewriting its source facts. */
|
|
203
|
+
var evaluateFreshnessAt = Effect$1.fn("Freshness.evaluateAt")(function* (freshness, evaluatedAt) {
|
|
204
|
+
if (freshness._tag !== "current" && freshness._tag !== "stale") return freshness;
|
|
205
|
+
const isStale = freshness._tag === "stale" || sourceAgeSecondsAt(freshness.sourceObservedAt, evaluatedAt) > freshness.staleAfterSeconds;
|
|
206
|
+
const provenance = isStale ? freshness.provenance._tag === "cache" ? freshness.provenance : {
|
|
207
|
+
_tag: "cache",
|
|
208
|
+
cachedAt: freshness.synchronizedAt,
|
|
209
|
+
sourceRevision: freshness.provenance.sourceRevision
|
|
210
|
+
} : freshness.provenance;
|
|
211
|
+
return yield* Schema$1.decodeUnknownEffect(Schema$1.toType(Freshness))({
|
|
212
|
+
...freshness,
|
|
213
|
+
_tag: isStale ? "stale" : "current",
|
|
214
|
+
evaluatedAt,
|
|
215
|
+
provenance
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/domain/plugins/bounds.ts
|
|
220
|
+
var jsonEncoder$1 = new TextEncoder();
|
|
221
|
+
var hasMaximumJsonBytes$1 = (maximumBytes) => Schema$1.makeFilter((value) => {
|
|
222
|
+
const serialized = JSON.stringify(value);
|
|
223
|
+
return serialized !== void 0 && jsonEncoder$1.encode(serialized).byteLength <= maximumBytes;
|
|
224
|
+
}, { expected: `JSON encoded as at most ${maximumBytes} UTF-8 bytes` });
|
|
225
|
+
/** Maximum persisted or dispatched JSON payload accepted from a plugin boundary. */
|
|
226
|
+
var MaximumPluginPayloadBytes = 262144;
|
|
227
|
+
/** Maximum encoded size of one atomic normalized sync page. */
|
|
228
|
+
var MaximumPluginSyncPageBytes = 1048576;
|
|
229
|
+
/** Maximum canonical descriptor JSON accepted before adapter construction. */
|
|
230
|
+
var MaximumPluginDescriptorBytes = 61440;
|
|
231
|
+
/** Bounded JSON for normalized evidence and governed-action payloads. */
|
|
232
|
+
var PluginPayloadJson = Schema$1.Json.check(hasMaximumJsonBytes$1(MaximumPluginPayloadBytes)).annotate({ identifier: "PluginPayloadJson" });
|
|
233
|
+
/** Applies a deterministic upper bound to an already-decoded JSON-shaped value. */
|
|
234
|
+
var hasMaximumPluginJsonBytes = hasMaximumJsonBytes$1;
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/domain/readiness/policy.ts
|
|
237
|
+
/** Locale-independent ordering used by canonical readiness records and digests. */
|
|
238
|
+
var compareReadinessText = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
239
|
+
/** Sorted unique string-like values for deterministic assessment material. */
|
|
240
|
+
var sortedReadinessUnique = (values) => Array.from(new Set(values)).sort(compareReadinessText);
|
|
241
|
+
/** Whether definitions form the complete provider-neutral V1 delivery policy. */
|
|
242
|
+
var readinessDefinitionsShapeIsV1 = (definitions) => {
|
|
243
|
+
const deployments = definitions.filter(({ kind }) => kind === "deployment");
|
|
244
|
+
return definitions.some(({ kind, requirement }) => kind === "execution" && requirement === "required") && definitions.some(({ kind, requirement }) => requirement === "required" && [
|
|
245
|
+
"relationship",
|
|
246
|
+
"approval",
|
|
247
|
+
"check",
|
|
248
|
+
"documentation"
|
|
249
|
+
].includes(kind)) && deployments.length === 1 && deployments[0]?.requirement === "advisory";
|
|
250
|
+
};
|
|
251
|
+
/** Whether definitions and observations form a complete V1 delivery policy shape. */
|
|
252
|
+
var readinessPolicyShapeIsV1 = (definitions, observations) => readinessDefinitionsShapeIsV1(definitions) && observations.some(({ state }) => state._tag === "deployment");
|
|
253
|
+
/** Whether one exact evidence dependency is current enough for a verdict. */
|
|
254
|
+
var readinessEvidenceIsCurrent = (evidence) => evidence.freshness === "current" && evidence.validity === "valid" && (evidence.source._tag === "local" || evidence.source.health === "healthy" || evidence.source.health === "degraded");
|
|
255
|
+
/** Whether every evidence dependency of an observed fact is current and valid. */
|
|
256
|
+
var readinessObservationIsCurrent = (observation) => observation.evidence.length > 0 && observation.evidence.every(readinessEvidenceIsCurrent);
|
|
257
|
+
/** Whether a normalized observation is semantically positive. */
|
|
258
|
+
var readinessObservationIsPositive = (observation) => {
|
|
259
|
+
switch (observation.state._tag) {
|
|
260
|
+
case "relationship": return observation.state.status === "verified" || observation.state.status === "governed";
|
|
261
|
+
case "approval": return observation.state.status === "approved";
|
|
262
|
+
case "check": return observation.state.status === "passed";
|
|
263
|
+
case "execution": return observation.state.status === "succeeded";
|
|
264
|
+
case "documentation": return observation.state.status === "current";
|
|
265
|
+
case "deployment": return observation.state.status === "succeeded";
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
/** Machine-readable explicit-failure reason, independent of freshness. */
|
|
269
|
+
var readinessFailureCode = (observation) => {
|
|
270
|
+
switch (observation.state._tag) {
|
|
271
|
+
case "relationship": return observation.state.status === "rejected" ? "relationship-rejected" : null;
|
|
272
|
+
case "approval": return observation.state.status === "rejected" ? "approval-rejected" : null;
|
|
273
|
+
case "check": return observation.state.status === "failed" ? "check-failed" : observation.state.status === "cancelled" ? "check-cancelled" : null;
|
|
274
|
+
case "execution": return observation.state.status === "failed" ? "execution-failed" : observation.state.status === "stopped" ? "execution-stopped" : null;
|
|
275
|
+
case "documentation": return null;
|
|
276
|
+
case "deployment": return observation.state.status === "failed" ? "deployment-failed" : observation.state.status === "rolled-back" ? "deployment-rolled-back" : null;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
/** Machine-readable non-positive reason for one normalized observation. */
|
|
280
|
+
var readinessNonPositiveCode = (observation) => {
|
|
281
|
+
switch (observation.state._tag) {
|
|
282
|
+
case "relationship": switch (observation.state.status) {
|
|
283
|
+
case "missing": return "relationship-missing";
|
|
284
|
+
case "inferred":
|
|
285
|
+
case "proposed": return "relationship-unverified";
|
|
286
|
+
case "superseded": return "relationship-superseded";
|
|
287
|
+
default: return null;
|
|
288
|
+
}
|
|
289
|
+
case "approval": switch (observation.state.status) {
|
|
290
|
+
case "missing": return "approval-missing";
|
|
291
|
+
case "pending": return "approval-pending";
|
|
292
|
+
case "expired": return "approval-expired";
|
|
293
|
+
default: return null;
|
|
294
|
+
}
|
|
295
|
+
case "check": return observation.state.status === "missing" ? "check-missing" : observation.state.status === "queued" || observation.state.status === "running" ? "check-pending" : null;
|
|
296
|
+
case "execution": return observation.state.status === "missing" ? "execution-missing" : observation.state.status === "queued" || observation.state.status === "running" ? "execution-pending" : null;
|
|
297
|
+
case "documentation": switch (observation.state.status) {
|
|
298
|
+
case "missing": return "documentation-missing";
|
|
299
|
+
case "draft": return "documentation-draft";
|
|
300
|
+
case "stale": return "documentation-stale";
|
|
301
|
+
case "superseded": return "documentation-superseded";
|
|
302
|
+
default: return null;
|
|
303
|
+
}
|
|
304
|
+
case "deployment": return null;
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
/** Whether this observation represents active build or check work. */
|
|
308
|
+
var readinessObservationIsDeliveryActivity = (definition, observation) => definition.requirement === "required" && observation !== null && (observation.state._tag === "execution" && (observation.state.status === "queued" || observation.state.status === "running") || observation.state._tag === "check" && (observation.state.status === "queued" || observation.state.status === "running")) && readinessObservationIsCurrent(observation);
|
|
309
|
+
/** Canonical semantic result retained for one fact evaluation. */
|
|
310
|
+
var readinessFactResult = (definition, observation) => {
|
|
311
|
+
if (observation === null) return definition.requirement === "required" ? "gap" : "advisory";
|
|
312
|
+
if (readinessFailureCode(observation) !== null) return definition.requirement === "required" || definition.kind === "deployment" ? "failed" : "advisory";
|
|
313
|
+
if (readinessObservationIsPositive(observation) && readinessObservationIsCurrent(observation)) return "verified";
|
|
314
|
+
const code = readinessNonPositiveCode(observation);
|
|
315
|
+
if (code === "approval-pending" || code === "check-pending" || code === "execution-pending") return "pending";
|
|
316
|
+
return definition.requirement === "required" ? "gap" : "advisory";
|
|
317
|
+
};
|
|
318
|
+
var missingCode = (definition) => {
|
|
319
|
+
switch (definition.kind) {
|
|
320
|
+
case "relationship": return "relationship-missing";
|
|
321
|
+
case "approval": return "approval-missing";
|
|
322
|
+
case "check": return "check-missing";
|
|
323
|
+
case "execution": return "execution-missing";
|
|
324
|
+
case "documentation": return "documentation-missing";
|
|
325
|
+
case "deployment": return "deployment-missing";
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
var observationEvidenceIds = (observation) => observation === null ? [] : sortedReadinessUnique(observation.evidence.map(({ evidenceId }) => evidenceId));
|
|
329
|
+
var factFinding = (code, definition, observation) => ({
|
|
330
|
+
code,
|
|
331
|
+
subject: {
|
|
332
|
+
_tag: "fact",
|
|
333
|
+
factId: definition.factId
|
|
334
|
+
},
|
|
335
|
+
evidenceIds: observationEvidenceIds(observation)
|
|
336
|
+
});
|
|
337
|
+
var evidenceFinding = (evidence, definition) => {
|
|
338
|
+
const code = evidence.validity === "expired" ? "evidence-expired" : evidence.freshness === "stale" ? "source-stale" : evidence.freshness === "missing" ? "source-missing" : evidence.freshness === "unavailable" || evidence.source._tag === "plugin" && (evidence.source.health === "unavailable" || evidence.source.health === "disabled") ? "source-unavailable" : evidence.source._tag === "plugin" && evidence.source.health === "degraded" ? "plugin-degraded" : null;
|
|
339
|
+
if (code === null) return null;
|
|
340
|
+
return {
|
|
341
|
+
code,
|
|
342
|
+
subject: evidence.source._tag === "plugin" ? {
|
|
343
|
+
_tag: "source",
|
|
344
|
+
pluginConnectionId: evidence.source.pluginConnectionId
|
|
345
|
+
} : {
|
|
346
|
+
_tag: "fact",
|
|
347
|
+
factId: definition.factId
|
|
348
|
+
},
|
|
349
|
+
evidenceIds: [evidence.evidenceId]
|
|
350
|
+
};
|
|
351
|
+
};
|
|
352
|
+
/** Stable sort/deduplication key for readiness findings. */
|
|
353
|
+
var readinessFindingKey = (finding) => {
|
|
354
|
+
const subject = finding.subject._tag === "fact" ? finding.subject.factId : finding.subject._tag === "source" ? finding.subject.pluginConnectionId : "candidate";
|
|
355
|
+
return `${finding.code}:${finding.subject._tag}:${subject}:${finding.evidenceIds.join(",")}`;
|
|
356
|
+
};
|
|
357
|
+
var normalizedFindings = (findings) => {
|
|
358
|
+
const byKey = new Map(findings.map((finding) => [readinessFindingKey(finding), finding]));
|
|
359
|
+
return Array.from(byKey.values()).sort((left, right) => compareReadinessText(readinessFindingKey(left), readinessFindingKey(right)));
|
|
360
|
+
};
|
|
361
|
+
/** Exact blocker, warning, and gap sets implied by retained fact evaluations. */
|
|
362
|
+
var deriveReadinessFindings = (facts, complete) => {
|
|
363
|
+
const blockers = [];
|
|
364
|
+
const warnings = [];
|
|
365
|
+
const gaps = complete ? [] : [{
|
|
366
|
+
code: "input-incomplete",
|
|
367
|
+
subject: { _tag: "candidate" },
|
|
368
|
+
evidenceIds: []
|
|
369
|
+
}];
|
|
370
|
+
for (const { definition, observation } of facts) {
|
|
371
|
+
if (observation === null) {
|
|
372
|
+
if (definition.requirement === "required") gaps.push(factFinding(missingCode(definition), definition, observation));
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
const failure = readinessFailureCode(observation);
|
|
376
|
+
if (failure !== null) {
|
|
377
|
+
const finding = factFinding(failure, definition, observation);
|
|
378
|
+
if (definition.requirement === "required" || definition.kind === "deployment") blockers.push(finding);
|
|
379
|
+
else warnings.push(finding);
|
|
380
|
+
} else if (!readinessObservationIsPositive(observation) || !readinessObservationIsCurrent(observation)) {
|
|
381
|
+
const code = readinessNonPositiveCode(observation);
|
|
382
|
+
if (code !== null) {
|
|
383
|
+
const finding = factFinding(code, definition, observation);
|
|
384
|
+
const active = code === "approval-pending" || code === "check-pending" || code === "execution-pending";
|
|
385
|
+
if (active || definition.requirement === "advisory") warnings.push(finding);
|
|
386
|
+
if (!active && definition.requirement === "required") gaps.push(finding);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
for (const evidence of observation.evidence) {
|
|
390
|
+
const finding = evidenceFinding(evidence, definition);
|
|
391
|
+
if (finding === null) continue;
|
|
392
|
+
warnings.push(finding);
|
|
393
|
+
if (definition.requirement === "required" && finding.code !== "plugin-degraded" && failure === null) gaps.push(finding);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
blockers: normalizedFindings(blockers),
|
|
398
|
+
warnings: normalizedFindings(warnings),
|
|
399
|
+
gaps: normalizedFindings(gaps)
|
|
400
|
+
};
|
|
401
|
+
};
|
|
402
|
+
var freshnessRank = {
|
|
403
|
+
current: 0,
|
|
404
|
+
stale: 1,
|
|
405
|
+
missing: 2,
|
|
406
|
+
unavailable: 3
|
|
407
|
+
};
|
|
408
|
+
var healthRank = {
|
|
409
|
+
healthy: 0,
|
|
410
|
+
degraded: 1,
|
|
411
|
+
unavailable: 2,
|
|
412
|
+
disabled: 3
|
|
413
|
+
};
|
|
414
|
+
/** Exact worst-state summaries for plugin evidence retained by facts. */
|
|
415
|
+
var deriveReadinessSourceSummaries = (facts) => {
|
|
416
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
417
|
+
for (const evidence of facts.flatMap(({ observation }) => observation?.evidence ?? [])) {
|
|
418
|
+
if (evidence.source._tag !== "plugin") continue;
|
|
419
|
+
const current = grouped.get(evidence.source.pluginConnectionId) ?? [];
|
|
420
|
+
current.push(evidence);
|
|
421
|
+
grouped.set(evidence.source.pluginConnectionId, current);
|
|
422
|
+
}
|
|
423
|
+
return Array.from(grouped.entries()).map(([pluginConnectionId, evidence]) => ({
|
|
424
|
+
pluginConnectionId,
|
|
425
|
+
freshness: evidence.reduce((worst, item) => freshnessRank[item.freshness] > freshnessRank[worst] ? item.freshness : worst, "current"),
|
|
426
|
+
health: evidence.reduce((worst, item) => {
|
|
427
|
+
const health = item.source._tag === "plugin" ? item.source.health : "healthy";
|
|
428
|
+
return healthRank[health] > healthRank[worst] ? health : worst;
|
|
429
|
+
}, "healthy"),
|
|
430
|
+
evidenceIds: sortedReadinessUnique(evidence.map(({ evidenceId }) => evidenceId))
|
|
431
|
+
})).sort((left, right) => compareReadinessText(left.pluginConnectionId, right.pluginConnectionId));
|
|
432
|
+
};
|
|
433
|
+
/** Earliest evidence freshness boundary retained by one environment assessment. */
|
|
434
|
+
var deriveReadinessNextEvaluationAt = (facts) => facts.flatMap(({ observation }) => observation?.evidence ?? []).flatMap(({ reevaluateAt }) => reevaluateAt === null ? [] : [reevaluateAt]).reduce((earliest, boundary) => earliest === null || DateTime$1.Order(boundary, earliest) < 0 ? boundary : earliest, null);
|
|
435
|
+
var observationProgress = (observation) => {
|
|
436
|
+
if (observation?.state._tag === "execution" || observation?.state._tag === "deployment") return observation.state.progress;
|
|
437
|
+
return null;
|
|
438
|
+
};
|
|
439
|
+
var stageEvidence = (facts) => sortedReadinessUnique(facts.flatMap(({ evidenceIds }) => evidenceIds));
|
|
440
|
+
/** Derive the exact three delivery stages from canonical fact evaluations. */
|
|
441
|
+
var deriveReadinessStages = (facts) => {
|
|
442
|
+
const build = facts.filter(({ definition }) => definition.kind === "execution");
|
|
443
|
+
const verify = facts.filter(({ definition }) => [
|
|
444
|
+
"relationship",
|
|
445
|
+
"approval",
|
|
446
|
+
"check",
|
|
447
|
+
"documentation"
|
|
448
|
+
].includes(definition.kind));
|
|
449
|
+
const production = facts.filter(({ definition }) => definition.kind === "deployment");
|
|
450
|
+
const deployment = production.find(({ observation }) => observation?.state._tag === "deployment")?.observation;
|
|
451
|
+
const requiredBuild = build.filter(({ definition }) => definition.requirement === "required");
|
|
452
|
+
const requiredVerify = verify.filter(({ definition }) => definition.requirement === "required");
|
|
453
|
+
const activeBuild = requiredBuild.filter(({ observation }) => observation !== null && observation.state._tag === "execution" && (observation.state.status === "queued" || observation.state.status === "running") && readinessObservationIsCurrent(observation));
|
|
454
|
+
const runningBuild = activeBuild.find(({ observation }) => observation?.state._tag === "execution" && observation.state.status === "running");
|
|
455
|
+
const queuedBuild = activeBuild.find(({ observation }) => observation?.state._tag === "execution" && observation.state.status === "queued");
|
|
456
|
+
const activeVerify = requiredVerify.find(({ observation }) => observation !== null && (observation.state._tag === "check" && (observation.state.status === "queued" || observation.state.status === "running") || observation.state._tag === "approval" && observation.state.status === "pending") && readinessObservationIsCurrent(observation));
|
|
457
|
+
const buildState = build.some(({ result }) => result === "failed") ? "failed" : runningBuild !== void 0 ? "running" : queuedBuild !== void 0 ? "queued" : requiredBuild.every(({ result }) => result === "verified") ? "succeeded" : build.some(({ observation }) => observation !== null) ? "held" : "not-started";
|
|
458
|
+
const verifyState = verify.some(({ result }) => result === "failed") ? "failed" : activeVerify !== void 0 ? "pending" : requiredVerify.every(({ result }) => result === "verified") ? "passed" : verify.some(({ observation }) => observation !== null) ? "held" : "not-started";
|
|
459
|
+
let productionState = "not-started";
|
|
460
|
+
if (deployment?.state._tag === "deployment") {
|
|
461
|
+
const current = readinessObservationIsCurrent(deployment);
|
|
462
|
+
switch (deployment.state.status) {
|
|
463
|
+
case "failed":
|
|
464
|
+
productionState = "failed";
|
|
465
|
+
break;
|
|
466
|
+
case "rolled-back":
|
|
467
|
+
productionState = "rolled-back";
|
|
468
|
+
break;
|
|
469
|
+
case "deploying":
|
|
470
|
+
productionState = current ? "deploying" : "held";
|
|
471
|
+
break;
|
|
472
|
+
case "pending":
|
|
473
|
+
productionState = current ? "waiting" : "held";
|
|
474
|
+
break;
|
|
475
|
+
case "succeeded":
|
|
476
|
+
productionState = current ? "succeeded" : "held";
|
|
477
|
+
break;
|
|
478
|
+
case "not-started":
|
|
479
|
+
productionState = current ? "not-started" : "held";
|
|
480
|
+
break;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
build: {
|
|
485
|
+
state: buildState,
|
|
486
|
+
factIds: sortedReadinessUnique(build.map(({ definition }) => definition.factId)),
|
|
487
|
+
evidenceIds: stageEvidence(build),
|
|
488
|
+
progress: observationProgress(runningBuild?.observation ?? queuedBuild?.observation ?? void 0)
|
|
489
|
+
},
|
|
490
|
+
verify: {
|
|
491
|
+
state: verifyState,
|
|
492
|
+
factIds: sortedReadinessUnique(verify.map(({ definition }) => definition.factId)),
|
|
493
|
+
evidenceIds: stageEvidence(verify),
|
|
494
|
+
progress: null
|
|
495
|
+
},
|
|
496
|
+
production: {
|
|
497
|
+
state: productionState,
|
|
498
|
+
factIds: sortedReadinessUnique(production.map(({ definition }) => definition.factId)),
|
|
499
|
+
evidenceIds: stageEvidence(production),
|
|
500
|
+
progress: observationProgress(deployment ?? void 0)
|
|
501
|
+
}
|
|
502
|
+
};
|
|
503
|
+
};
|
|
504
|
+
/** Derive the canonical verdict from facts, findings, and exact stage state. */
|
|
505
|
+
var deriveEnvironmentReadinessVerdict = (input) => {
|
|
506
|
+
if (input.blockers.length > 0) return "blocked";
|
|
507
|
+
if (input.stages.production.state === "deploying") return "deploying";
|
|
508
|
+
if (input.facts.some(({ definition, observation }) => readinessObservationIsDeliveryActivity(definition, observation))) return "building";
|
|
509
|
+
if (input.gaps.length > 0 || input.stages.build.state === "held" || input.stages.verify.state === "held" || input.stages.production.state === "held" || input.facts.some(({ definition, result }) => definition.requirement === "required" && result !== "verified")) return "held";
|
|
510
|
+
return input.stages.production.state === "succeeded" ? "shipped" : "ready";
|
|
511
|
+
};
|
|
512
|
+
/** Exact merged findings implied by retained environment summaries. */
|
|
513
|
+
var deriveReleaseReadinessFindings = (environments) => ({
|
|
514
|
+
blockers: normalizedFindings(environments.flatMap(({ blockers }) => blockers)),
|
|
515
|
+
warnings: normalizedFindings(environments.flatMap(({ warnings }) => warnings)),
|
|
516
|
+
gaps: normalizedFindings(environments.flatMap(({ gaps }) => gaps))
|
|
517
|
+
});
|
|
518
|
+
/** Exact worst-state source summaries implied by retained environments. */
|
|
519
|
+
var deriveReleaseReadinessSourceSummaries = (environments) => {
|
|
520
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
521
|
+
for (const summary of environments.flatMap(({ sourceFreshness }) => sourceFreshness)) {
|
|
522
|
+
const current = grouped.get(summary.pluginConnectionId) ?? [];
|
|
523
|
+
current.push(summary);
|
|
524
|
+
grouped.set(summary.pluginConnectionId, current);
|
|
525
|
+
}
|
|
526
|
+
return Array.from(grouped.entries()).map(([pluginConnectionId, summaries]) => ({
|
|
527
|
+
pluginConnectionId,
|
|
528
|
+
freshness: summaries.reduce((worst, summary) => freshnessRank[summary.freshness] > freshnessRank[worst] ? summary.freshness : worst, "current"),
|
|
529
|
+
health: summaries.reduce((worst, summary) => healthRank[summary.health] > healthRank[worst] ? summary.health : worst, "healthy"),
|
|
530
|
+
evidenceIds: sortedReadinessUnique(summaries.flatMap(({ evidenceIds }) => evidenceIds))
|
|
531
|
+
})).sort((left, right) => compareReadinessText(left.pluginConnectionId, right.pluginConnectionId));
|
|
532
|
+
};
|
|
533
|
+
/** Earliest child freshness boundary implied by retained environments. */
|
|
534
|
+
var deriveReleaseReadinessNextEvaluationAt = (environments) => environments.reduce((earliest, { nextEvaluationAt }) => {
|
|
535
|
+
if (nextEvaluationAt === null) return earliest;
|
|
536
|
+
return earliest === null || DateTime$1.Order(nextEvaluationAt, earliest) < 0 ? nextEvaluationAt : earliest;
|
|
537
|
+
}, null);
|
|
538
|
+
var firstReleaseProgress = (environments, stage) => environments.slice().sort((left, right) => compareReadinessText(left.environmentId, right.environmentId)).find((environment) => environment.stages[stage].progress !== null)?.stages[stage].progress ?? null;
|
|
539
|
+
/** Exact three-stage roll-up implied by retained environment summaries. */
|
|
540
|
+
var deriveReleaseReadinessStages = (environments) => {
|
|
541
|
+
const buildStates = environments.map(({ stages }) => stages.build.state);
|
|
542
|
+
const verifyStates = environments.map(({ stages }) => stages.verify.state);
|
|
543
|
+
const productionStates = environments.map(({ stages }) => stages.production.state);
|
|
544
|
+
const buildState = buildStates.includes("failed") ? "failed" : buildStates.includes("running") ? "running" : buildStates.includes("queued") ? "queued" : buildStates.every((state) => state === "succeeded") ? "succeeded" : buildStates.every((state) => state === "not-started") ? "not-started" : "held";
|
|
545
|
+
const verifyState = verifyStates.includes("failed") ? "failed" : verifyStates.includes("pending") ? "pending" : verifyStates.every((state) => state === "passed") ? "passed" : verifyStates.every((state) => state === "not-started") ? "not-started" : "held";
|
|
546
|
+
let productionState = "not-started";
|
|
547
|
+
if (productionStates.includes("failed")) productionState = "failed";
|
|
548
|
+
else if (productionStates.includes("rolled-back")) productionState = "rolled-back";
|
|
549
|
+
else if (productionStates.includes("deploying")) productionState = "deploying";
|
|
550
|
+
else if (productionStates.includes("held")) productionState = "held";
|
|
551
|
+
else if (productionStates.every((state) => state === "succeeded")) productionState = "succeeded";
|
|
552
|
+
else if (productionStates.some((state) => state === "waiting" || state === "succeeded")) productionState = "waiting";
|
|
553
|
+
return {
|
|
554
|
+
build: {
|
|
555
|
+
state: buildState,
|
|
556
|
+
factIds: sortedReadinessUnique(environments.flatMap(({ stages }) => stages.build.factIds)),
|
|
557
|
+
evidenceIds: sortedReadinessUnique(environments.flatMap(({ stages }) => stages.build.evidenceIds)),
|
|
558
|
+
progress: firstReleaseProgress(environments, "build")
|
|
559
|
+
},
|
|
560
|
+
verify: {
|
|
561
|
+
state: verifyState,
|
|
562
|
+
factIds: sortedReadinessUnique(environments.flatMap(({ stages }) => stages.verify.factIds)),
|
|
563
|
+
evidenceIds: sortedReadinessUnique(environments.flatMap(({ stages }) => stages.verify.evidenceIds)),
|
|
564
|
+
progress: null
|
|
565
|
+
},
|
|
566
|
+
production: {
|
|
567
|
+
state: productionState,
|
|
568
|
+
factIds: sortedReadinessUnique(environments.flatMap(({ stages }) => stages.production.factIds)),
|
|
569
|
+
evidenceIds: sortedReadinessUnique(environments.flatMap(({ stages }) => stages.production.evidenceIds)),
|
|
570
|
+
progress: firstReleaseProgress(environments, "production")
|
|
571
|
+
}
|
|
572
|
+
};
|
|
573
|
+
};
|
|
574
|
+
/** Canonical cross-environment precedence for release readiness. */
|
|
575
|
+
var deriveReleaseReadinessVerdict = (environments) => {
|
|
576
|
+
const verdicts = environments.map(({ verdict }) => verdict);
|
|
577
|
+
if (verdicts.includes("blocked")) return "blocked";
|
|
578
|
+
if (verdicts.includes("deploying")) return "deploying";
|
|
579
|
+
if (verdicts.includes("building")) return "building";
|
|
580
|
+
if (verdicts.includes("held")) return "held";
|
|
581
|
+
return verdicts.every((verdict) => verdict === "shipped") ? "shipped" : "ready";
|
|
582
|
+
};
|
|
583
|
+
var sameStringArray = (left, right) => left.length === right.length && left.every((value, index) => value === right[index]);
|
|
584
|
+
var progressIsEqual = (left, right) => left === null || right === null ? left === right : left._tag === "count" && right._tag === "count" ? left.completed === right.completed && left.total === right.total : left._tag === "percent" && right._tag === "percent" && left.value === right.value;
|
|
585
|
+
/** Structural equality for canonical stage records without serialization shortcuts. */
|
|
586
|
+
var readinessStagesAreEqual = (left, right) => left.build.state === right.build.state && sameStringArray(left.build.factIds, right.build.factIds) && sameStringArray(left.build.evidenceIds, right.build.evidenceIds) && progressIsEqual(left.build.progress, right.build.progress) && left.verify.state === right.verify.state && sameStringArray(left.verify.factIds, right.verify.factIds) && sameStringArray(left.verify.evidenceIds, right.verify.evidenceIds) && progressIsEqual(left.verify.progress, right.verify.progress) && left.production.state === right.production.state && sameStringArray(left.production.factIds, right.production.factIds) && sameStringArray(left.production.evidenceIds, right.production.evidenceIds) && progressIsEqual(left.production.progress, right.production.progress);
|
|
587
|
+
//#endregion
|
|
588
|
+
//#region src/domain/readiness/model.ts
|
|
589
|
+
var boundedIdentifier$1 = (maximumLength, identifier) => Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isMinLength(1), Schema$1.isMaxLength(maximumLength)).annotate({ identifier });
|
|
590
|
+
var unique = (values) => new Set(values).size === values.length;
|
|
591
|
+
var sameOrderedStrings = (left, right) => left.length === right.length && left.every((value, index) => value === right[index]);
|
|
592
|
+
var isCanonicalStrings = (values) => sameOrderedStrings(values, sortedReadinessUnique(values));
|
|
593
|
+
/** Maximum exact evidence dependencies in one environment or release assessment. */
|
|
594
|
+
var MAX_READINESS_EVIDENCE_REFERENCES = 512;
|
|
595
|
+
/** Maximum blockers, warnings, or gaps retained in one assessment. */
|
|
596
|
+
var MAX_READINESS_FINDINGS = 1025;
|
|
597
|
+
/** Stable identity of one V1 readiness fact, independent of display copy. */
|
|
598
|
+
var ReadinessFactId = boundedIdentifier$1(200, "ReadinessFactId").pipe(Schema$1.check(Schema$1.isPattern(/^[a-z0-9][a-z0-9._:/-]*$/u)), Schema$1.brand("ReadinessFactId"));
|
|
599
|
+
/** Hash of the complete canonical candidate input assembled by the application layer. */
|
|
600
|
+
var ReadinessCandidateDigest = Schema$1.String.check(Schema$1.isPattern(/^sha256:[0-9a-f]{64}$/u)).pipe(Schema$1.brand("ReadinessCandidateDigest"));
|
|
601
|
+
/** Positive version of the rule policy used for one assessment. */
|
|
602
|
+
var ReadinessRuleVersion = Schema$1.Int.check(Schema$1.isGreaterThan(0)).pipe(Schema$1.brand("ReadinessRuleVersion"));
|
|
603
|
+
/** Positive version of the evaluator implementation used for one assessment. */
|
|
604
|
+
var ReadinessDerivationVersion = Schema$1.Int.check(Schema$1.isGreaterThan(0)).pipe(Schema$1.brand("ReadinessDerivationVersion"));
|
|
605
|
+
/** V1 readiness policy version. */
|
|
606
|
+
var READINESS_RULE_VERSION_V1 = ReadinessRuleVersion.make(1);
|
|
607
|
+
/** V1 evaluator implementation version. */
|
|
608
|
+
var READINESS_DERIVATION_VERSION_V1 = ReadinessDerivationVersion.make(1);
|
|
609
|
+
/** Positive source revision of the release candidate. */
|
|
610
|
+
var ReadinessReleaseRevision = Schema$1.Int.check(Schema$1.isGreaterThan(0));
|
|
611
|
+
/** Bounded immutable artifact revision, such as a commit or image digest. */
|
|
612
|
+
var ReadinessArtifactRevision = boundedIdentifier$1(512, "ReadinessArtifactRevision");
|
|
613
|
+
/** Stable identity of a readiness rule set. */
|
|
614
|
+
var ReadinessRuleId = boundedIdentifier$1(200, "ReadinessRuleId");
|
|
615
|
+
/** Explicit release or target-environment scope of an assessment. */
|
|
616
|
+
var ReadinessScope = Schema$1.TaggedUnion({
|
|
617
|
+
release: { releaseId: ReleaseId },
|
|
618
|
+
environment: {
|
|
619
|
+
releaseId: ReleaseId,
|
|
620
|
+
environmentId: EnvironmentId
|
|
621
|
+
}
|
|
622
|
+
});
|
|
623
|
+
var CandidateIdentityBase = {
|
|
624
|
+
workspaceId: WorkspaceId,
|
|
625
|
+
releaseRevision: ReadinessReleaseRevision,
|
|
626
|
+
artifactRevision: ReadinessArtifactRevision,
|
|
627
|
+
digest: ReadinessCandidateDigest
|
|
628
|
+
};
|
|
629
|
+
/** Immutable target-environment candidate whose complete material is digest-bound. */
|
|
630
|
+
var EnvironmentReadinessCandidateIdentity = Schema$1.Struct({
|
|
631
|
+
...CandidateIdentityBase,
|
|
632
|
+
scope: Schema$1.TaggedStruct("environment", {
|
|
633
|
+
releaseId: ReleaseId,
|
|
634
|
+
environmentId: EnvironmentId
|
|
635
|
+
})
|
|
636
|
+
});
|
|
637
|
+
/** Immutable release-scope candidate whose child assessments are digest-bound. */
|
|
638
|
+
var ReleaseReadinessCandidateIdentity = Schema$1.Struct({
|
|
639
|
+
...CandidateIdentityBase,
|
|
640
|
+
scope: Schema$1.TaggedStruct("release", { releaseId: ReleaseId })
|
|
641
|
+
});
|
|
642
|
+
/** Immutable deployable candidate whose complete material is bound by a digest. */
|
|
643
|
+
var ReadinessCandidateIdentity = Schema$1.Union([EnvironmentReadinessCandidateIdentity, ReleaseReadinessCandidateIdentity]);
|
|
644
|
+
/** Stable rule-set identity and content digest retained with every assessment. */
|
|
645
|
+
var ReadinessRuleReference = Schema$1.Struct({
|
|
646
|
+
ruleId: ReadinessRuleId,
|
|
647
|
+
version: ReadinessRuleVersion,
|
|
648
|
+
digest: ReadinessCandidateDigest
|
|
649
|
+
});
|
|
650
|
+
/** Canonical six-state readiness verdict. */
|
|
651
|
+
var ReadinessVerdict = Schema$1.Literals([
|
|
652
|
+
"blocked",
|
|
653
|
+
"ready",
|
|
654
|
+
"deploying",
|
|
655
|
+
"building",
|
|
656
|
+
"shipped",
|
|
657
|
+
"held"
|
|
658
|
+
]);
|
|
659
|
+
/** Closed provider-neutral fact categories understood by the V1 evaluator. */
|
|
660
|
+
var ReadinessFactKind = Schema$1.Literals([
|
|
661
|
+
"relationship",
|
|
662
|
+
"approval",
|
|
663
|
+
"check",
|
|
664
|
+
"execution",
|
|
665
|
+
"documentation",
|
|
666
|
+
"deployment"
|
|
667
|
+
]);
|
|
668
|
+
/** Whether a fact gates readiness or only contributes context. */
|
|
669
|
+
var ReadinessFactRequirement = Schema$1.Literals(["required", "advisory"]);
|
|
670
|
+
/** Policy definition that makes missing observations explicit rather than successful by absence. */
|
|
671
|
+
var ReadinessFactDefinition = Schema$1.Struct({
|
|
672
|
+
factId: ReadinessFactId,
|
|
673
|
+
kind: ReadinessFactKind,
|
|
674
|
+
requirement: ReadinessFactRequirement
|
|
675
|
+
});
|
|
676
|
+
var CountProgress = Schema$1.TaggedStruct("count", {
|
|
677
|
+
completed: Schema$1.Int.check(Schema$1.isGreaterThanOrEqualTo(0)),
|
|
678
|
+
total: Schema$1.Int.check(Schema$1.isGreaterThan(0))
|
|
679
|
+
}).check(Schema$1.makeFilter(({ completed, total }) => completed <= total, { expected: "readiness progress completed count not to exceed its total" }));
|
|
680
|
+
var PercentProgress = Schema$1.TaggedStruct("percent", { value: Schema$1.Number.check(Schema$1.makeFilter((value) => value >= 0 && value <= 100, { expected: "readiness progress percentage between zero and one hundred" })) });
|
|
681
|
+
/** Typed progress for builds and deployments without copied display text. */
|
|
682
|
+
var ReadinessProgress = Schema$1.Union([CountProgress, PercentProgress]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
683
|
+
/** Closed normalized observation states; vendor strings never enter rule evaluation. */
|
|
684
|
+
var ReadinessFactState = Schema$1.TaggedUnion({
|
|
685
|
+
relationship: { status: Schema$1.Literals([
|
|
686
|
+
"missing",
|
|
687
|
+
"inferred",
|
|
688
|
+
"proposed",
|
|
689
|
+
"verified",
|
|
690
|
+
"governed",
|
|
691
|
+
"rejected",
|
|
692
|
+
"superseded"
|
|
693
|
+
]) },
|
|
694
|
+
approval: { status: Schema$1.Literals([
|
|
695
|
+
"missing",
|
|
696
|
+
"pending",
|
|
697
|
+
"approved",
|
|
698
|
+
"rejected",
|
|
699
|
+
"expired"
|
|
700
|
+
]) },
|
|
701
|
+
check: { status: Schema$1.Literals([
|
|
702
|
+
"missing",
|
|
703
|
+
"queued",
|
|
704
|
+
"running",
|
|
705
|
+
"passed",
|
|
706
|
+
"failed",
|
|
707
|
+
"cancelled"
|
|
708
|
+
]) },
|
|
709
|
+
execution: {
|
|
710
|
+
status: Schema$1.Literals([
|
|
711
|
+
"missing",
|
|
712
|
+
"queued",
|
|
713
|
+
"running",
|
|
714
|
+
"succeeded",
|
|
715
|
+
"failed",
|
|
716
|
+
"stopped"
|
|
717
|
+
]),
|
|
718
|
+
progress: Schema$1.NullOr(ReadinessProgress)
|
|
719
|
+
},
|
|
720
|
+
documentation: { status: Schema$1.Literals([
|
|
721
|
+
"missing",
|
|
722
|
+
"draft",
|
|
723
|
+
"current",
|
|
724
|
+
"stale",
|
|
725
|
+
"superseded"
|
|
726
|
+
]) },
|
|
727
|
+
deployment: {
|
|
728
|
+
status: Schema$1.Literals([
|
|
729
|
+
"not-started",
|
|
730
|
+
"pending",
|
|
731
|
+
"deploying",
|
|
732
|
+
"succeeded",
|
|
733
|
+
"failed",
|
|
734
|
+
"rolled-back"
|
|
735
|
+
]),
|
|
736
|
+
progress: Schema$1.NullOr(ReadinessProgress)
|
|
737
|
+
}
|
|
738
|
+
});
|
|
739
|
+
/** Exact origin of evidence used for dependency tracking and plugin-health invalidation. */
|
|
740
|
+
var ReadinessEvidenceSource = Schema$1.TaggedUnion({
|
|
741
|
+
plugin: {
|
|
742
|
+
pluginConnectionId: PluginConnectionId,
|
|
743
|
+
health: Schema$1.Literals([
|
|
744
|
+
"healthy",
|
|
745
|
+
"degraded",
|
|
746
|
+
"unavailable",
|
|
747
|
+
"disabled"
|
|
748
|
+
])
|
|
749
|
+
},
|
|
750
|
+
local: { origin: Schema$1.Literals([
|
|
751
|
+
"human",
|
|
752
|
+
"agent",
|
|
753
|
+
"system"
|
|
754
|
+
]) }
|
|
755
|
+
});
|
|
756
|
+
/** Exact evidence dependency and its freshness at the injected evaluation boundary. */
|
|
757
|
+
var ReadinessEvidenceReference = Schema$1.Struct({
|
|
758
|
+
evidenceId: EvidenceId,
|
|
759
|
+
source: ReadinessEvidenceSource,
|
|
760
|
+
freshness: Schema$1.Literals([
|
|
761
|
+
"current",
|
|
762
|
+
"stale",
|
|
763
|
+
"missing",
|
|
764
|
+
"unavailable"
|
|
765
|
+
]),
|
|
766
|
+
validity: Schema$1.Literals(["valid", "expired"]),
|
|
767
|
+
reevaluateAt: Schema$1.NullOr(UtcTimestamp)
|
|
768
|
+
});
|
|
769
|
+
var stateRequiresEvidence = (state) => state.status !== "missing";
|
|
770
|
+
/** One normalized observation for a policy-defined fact. */
|
|
771
|
+
var ReadinessFactObservation = Schema$1.Struct({
|
|
772
|
+
factId: ReadinessFactId,
|
|
773
|
+
state: ReadinessFactState,
|
|
774
|
+
evidence: Schema$1.Array(ReadinessEvidenceReference).check(Schema$1.isMaxLength(128))
|
|
775
|
+
}).check(Schema$1.makeFilter(({ evidence }) => unique(evidence.map(({ evidenceId }) => evidenceId)), { expected: "readiness observation evidence identifiers to be unique" }), Schema$1.makeFilter(({ evidence, state }) => !stateRequiresEvidence(state) || evidence.length > 0, { expected: "a non-empty readiness observation state to reference evidence" }));
|
|
776
|
+
/** Stable machine-readable reason emitted by the V1 rule policy. */
|
|
777
|
+
var ReadinessFindingCode = Schema$1.Literals([
|
|
778
|
+
"input-incomplete",
|
|
779
|
+
"relationship-missing",
|
|
780
|
+
"relationship-unverified",
|
|
781
|
+
"relationship-rejected",
|
|
782
|
+
"relationship-superseded",
|
|
783
|
+
"approval-missing",
|
|
784
|
+
"approval-pending",
|
|
785
|
+
"approval-rejected",
|
|
786
|
+
"approval-expired",
|
|
787
|
+
"check-missing",
|
|
788
|
+
"check-pending",
|
|
789
|
+
"check-failed",
|
|
790
|
+
"check-cancelled",
|
|
791
|
+
"execution-missing",
|
|
792
|
+
"execution-pending",
|
|
793
|
+
"execution-failed",
|
|
794
|
+
"execution-stopped",
|
|
795
|
+
"documentation-missing",
|
|
796
|
+
"documentation-draft",
|
|
797
|
+
"documentation-stale",
|
|
798
|
+
"documentation-superseded",
|
|
799
|
+
"deployment-missing",
|
|
800
|
+
"deployment-failed",
|
|
801
|
+
"deployment-rolled-back",
|
|
802
|
+
"source-stale",
|
|
803
|
+
"source-missing",
|
|
804
|
+
"source-unavailable",
|
|
805
|
+
"plugin-degraded",
|
|
806
|
+
"evidence-expired"
|
|
807
|
+
]);
|
|
808
|
+
/** Stable subject of a readiness finding. */
|
|
809
|
+
var ReadinessFindingSubject = Schema$1.TaggedUnion({
|
|
810
|
+
fact: { factId: ReadinessFactId },
|
|
811
|
+
source: { pluginConnectionId: PluginConnectionId },
|
|
812
|
+
candidate: {}
|
|
813
|
+
});
|
|
814
|
+
/** One blocker, warning, or evidence gap without presentation prose. */
|
|
815
|
+
var ReadinessFinding = Schema$1.Struct({
|
|
816
|
+
code: ReadinessFindingCode,
|
|
817
|
+
subject: ReadinessFindingSubject,
|
|
818
|
+
evidenceIds: Schema$1.Array(EvidenceId).check(Schema$1.isMaxLength(128))
|
|
819
|
+
}).check(Schema$1.makeFilter(({ evidenceIds }) => unique(evidenceIds), { expected: "readiness finding evidence identifiers to be unique" }));
|
|
820
|
+
/** Outcome retained for every evaluated fact. */
|
|
821
|
+
var ReadinessFactResult = Schema$1.Literals([
|
|
822
|
+
"verified",
|
|
823
|
+
"pending",
|
|
824
|
+
"failed",
|
|
825
|
+
"gap",
|
|
826
|
+
"advisory"
|
|
827
|
+
]);
|
|
828
|
+
/** Auditable fact evaluation retained in an environment assessment. */
|
|
829
|
+
var ReadinessFactEvaluation = Schema$1.Struct({
|
|
830
|
+
definition: ReadinessFactDefinition,
|
|
831
|
+
observation: Schema$1.NullOr(ReadinessFactObservation),
|
|
832
|
+
result: ReadinessFactResult,
|
|
833
|
+
evidenceIds: Schema$1.Array(EvidenceId).check(Schema$1.isMaxLength(128))
|
|
834
|
+
}).check(Schema$1.makeFilter(({ definition, evidenceIds, observation, result }) => observation === null ? evidenceIds.length === 0 && result === readinessFactResult(definition, observation) : observation.factId === definition.factId && observation.state._tag === definition.kind && sameOrderedStrings(evidenceIds, sortedReadinessUnique(observation.evidence.map(({ evidenceId }) => evidenceId))) && result === readinessFactResult(definition, observation), { expected: "readiness fact evaluation to match its definition, observation, evidence, and result" }));
|
|
835
|
+
/** Worst current source state for one contributing plugin connection. */
|
|
836
|
+
var ReadinessSourceSummary = Schema$1.Struct({
|
|
837
|
+
pluginConnectionId: PluginConnectionId,
|
|
838
|
+
freshness: Schema$1.Literals([
|
|
839
|
+
"current",
|
|
840
|
+
"stale",
|
|
841
|
+
"missing",
|
|
842
|
+
"unavailable"
|
|
843
|
+
]),
|
|
844
|
+
health: Schema$1.Literals([
|
|
845
|
+
"healthy",
|
|
846
|
+
"degraded",
|
|
847
|
+
"unavailable",
|
|
848
|
+
"disabled"
|
|
849
|
+
]),
|
|
850
|
+
evidenceIds: Schema$1.Array(EvidenceId).check(Schema$1.isMaxLength(512))
|
|
851
|
+
});
|
|
852
|
+
var ReadinessStageBase = {
|
|
853
|
+
factIds: Schema$1.Array(ReadinessFactId).check(Schema$1.isMaxLength(512)),
|
|
854
|
+
evidenceIds: Schema$1.Array(EvidenceId).check(Schema$1.isMaxLength(512)),
|
|
855
|
+
progress: Schema$1.NullOr(ReadinessProgress)
|
|
856
|
+
};
|
|
857
|
+
/** Server-derived Build stage. */
|
|
858
|
+
var BuildReadinessStage = Schema$1.Struct({
|
|
859
|
+
...ReadinessStageBase,
|
|
860
|
+
state: Schema$1.Literals([
|
|
861
|
+
"not-started",
|
|
862
|
+
"queued",
|
|
863
|
+
"running",
|
|
864
|
+
"succeeded",
|
|
865
|
+
"failed",
|
|
866
|
+
"held"
|
|
867
|
+
])
|
|
868
|
+
});
|
|
869
|
+
/** Server-derived Verify stage. */
|
|
870
|
+
var VerifyReadinessStage = Schema$1.Struct({
|
|
871
|
+
...ReadinessStageBase,
|
|
872
|
+
state: Schema$1.Literals([
|
|
873
|
+
"not-started",
|
|
874
|
+
"pending",
|
|
875
|
+
"passed",
|
|
876
|
+
"failed",
|
|
877
|
+
"held"
|
|
878
|
+
])
|
|
879
|
+
});
|
|
880
|
+
/** Server-derived Production stage. */
|
|
881
|
+
var ProductionReadinessStage = Schema$1.Struct({
|
|
882
|
+
...ReadinessStageBase,
|
|
883
|
+
state: Schema$1.Literals([
|
|
884
|
+
"not-started",
|
|
885
|
+
"waiting",
|
|
886
|
+
"deploying",
|
|
887
|
+
"succeeded",
|
|
888
|
+
"failed",
|
|
889
|
+
"rolled-back",
|
|
890
|
+
"held"
|
|
891
|
+
])
|
|
892
|
+
});
|
|
893
|
+
/** Exactly three authoritative delivery stages. */
|
|
894
|
+
var ReadinessStages = Schema$1.Struct({
|
|
895
|
+
build: BuildReadinessStage,
|
|
896
|
+
verify: VerifyReadinessStage,
|
|
897
|
+
production: ProductionReadinessStage
|
|
898
|
+
});
|
|
899
|
+
/** Complete, decoded input for one environment evaluation. */
|
|
900
|
+
var EnvironmentReadinessEvaluationInput = Schema$1.Struct({
|
|
901
|
+
assessmentId: ReadinessAssessmentId,
|
|
902
|
+
previousAssessmentId: Schema$1.NullOr(ReadinessAssessmentId),
|
|
903
|
+
candidate: EnvironmentReadinessCandidateIdentity,
|
|
904
|
+
rule: ReadinessRuleReference,
|
|
905
|
+
derivationVersion: ReadinessDerivationVersion,
|
|
906
|
+
evaluatedAt: UtcTimestamp,
|
|
907
|
+
complete: Schema$1.Boolean,
|
|
908
|
+
definitions: Schema$1.Array(ReadinessFactDefinition).check(Schema$1.isMaxLength(512)),
|
|
909
|
+
observations: Schema$1.Array(ReadinessFactObservation).check(Schema$1.isMaxLength(512))
|
|
910
|
+
}).check(Schema$1.makeFilter(({ assessmentId, previousAssessmentId }) => previousAssessmentId === null || previousAssessmentId !== assessmentId, { expected: "an environment readiness input not to supersede itself" }), Schema$1.makeFilter(({ derivationVersion }) => derivationVersion === READINESS_DERIVATION_VERSION_V1, { expected: "the V1 environment evaluator to use derivation version 1" }), Schema$1.makeFilter(({ definitions }) => unique(definitions.map(({ factId }) => factId)), { expected: "readiness fact definitions to have unique identities" }), Schema$1.makeFilter(({ observations }) => unique(observations.map(({ factId }) => factId)), { expected: "readiness fact observations to have unique identities" }), Schema$1.makeFilter(({ observations }) => observations.reduce((total, observation) => total + observation.evidence.length, 0) <= 512, { expected: "environment readiness input to fit its bounded assessment evidence set" }), Schema$1.makeFilter(({ definitions, observations }) => {
|
|
911
|
+
const definitionsById = new Map(definitions.map((definition) => [definition.factId, definition]));
|
|
912
|
+
return observations.every((observation) => definitionsById.get(observation.factId)?.kind === observation.state._tag);
|
|
913
|
+
}, { expected: "readiness observations to match one policy fact of the same kind" }), Schema$1.makeFilter(({ definitions, observations }) => readinessPolicyShapeIsV1(definitions, observations), { expected: "environment readiness input to contain the complete V1 policy shape" }));
|
|
914
|
+
var factEvidenceIds = (facts) => sortedReadinessUnique(facts.flatMap(({ evidenceIds }) => evidenceIds));
|
|
915
|
+
var factsOfKinds = (facts, kinds) => facts.filter(({ definition }) => kinds.includes(definition.kind));
|
|
916
|
+
var stageMatchesFacts = (stage, facts) => sameOrderedStrings(stage.factIds, sortedReadinessUnique(facts.map(({ definition }) => definition.factId))) && sameOrderedStrings(stage.evidenceIds, factEvidenceIds(facts));
|
|
917
|
+
var canonicalAssessmentCollections = (assessment) => {
|
|
918
|
+
const evidence = new Set(assessment.evidenceIds);
|
|
919
|
+
const findings = [
|
|
920
|
+
assessment.blockers,
|
|
921
|
+
assessment.warnings,
|
|
922
|
+
assessment.gaps
|
|
923
|
+
];
|
|
924
|
+
return isCanonicalStrings(assessment.evidenceIds) && findings.every((items) => sameOrderedStrings(items.map(readinessFindingKey), items.map(readinessFindingKey).sort(compareReadinessText)) && unique(items.map(readinessFindingKey)) && items.every(({ evidenceIds }) => isCanonicalStrings(evidenceIds) && evidenceIds.every((evidenceId) => evidence.has(evidenceId)))) && isCanonicalStrings(assessment.stages.build.factIds) && isCanonicalStrings(assessment.stages.build.evidenceIds) && isCanonicalStrings(assessment.stages.verify.factIds) && isCanonicalStrings(assessment.stages.verify.evidenceIds) && isCanonicalStrings(assessment.stages.production.factIds) && isCanonicalStrings(assessment.stages.production.evidenceIds) && isCanonicalStrings(assessment.sourceFreshness.map(({ pluginConnectionId }) => pluginConnectionId)) && assessment.sourceFreshness.every(({ evidenceIds }) => isCanonicalStrings(evidenceIds) && evidenceIds.every((evidenceId) => evidence.has(evidenceId)));
|
|
925
|
+
};
|
|
926
|
+
var AssessmentBase = {
|
|
927
|
+
assessmentId: ReadinessAssessmentId,
|
|
928
|
+
previousAssessmentId: Schema$1.NullOr(ReadinessAssessmentId),
|
|
929
|
+
candidate: ReadinessCandidateIdentity,
|
|
930
|
+
rule: ReadinessRuleReference,
|
|
931
|
+
derivationVersion: ReadinessDerivationVersion,
|
|
932
|
+
evaluatedAt: UtcTimestamp,
|
|
933
|
+
nextEvaluationAt: Schema$1.NullOr(UtcTimestamp),
|
|
934
|
+
verdict: ReadinessVerdict,
|
|
935
|
+
stages: ReadinessStages,
|
|
936
|
+
blockers: Schema$1.Array(ReadinessFinding).check(Schema$1.isMaxLength(MAX_READINESS_FINDINGS)),
|
|
937
|
+
warnings: Schema$1.Array(ReadinessFinding).check(Schema$1.isMaxLength(MAX_READINESS_FINDINGS)),
|
|
938
|
+
gaps: Schema$1.Array(ReadinessFinding).check(Schema$1.isMaxLength(MAX_READINESS_FINDINGS)),
|
|
939
|
+
sourceFreshness: Schema$1.Array(ReadinessSourceSummary).check(Schema$1.isMaxLength(512)),
|
|
940
|
+
evidenceIds: Schema$1.Array(EvidenceId).check(Schema$1.isMaxLength(512))
|
|
941
|
+
};
|
|
942
|
+
/** Immutable environment assessment retaining exact facts and evidence. */
|
|
943
|
+
var EnvironmentReadinessAssessment = Schema$1.Struct({
|
|
944
|
+
...AssessmentBase,
|
|
945
|
+
_tag: Schema$1.Literal("environment"),
|
|
946
|
+
candidate: EnvironmentReadinessCandidateIdentity,
|
|
947
|
+
inputComplete: Schema$1.Boolean,
|
|
948
|
+
facts: Schema$1.Array(ReadinessFactEvaluation).check(Schema$1.isMaxLength(512)),
|
|
949
|
+
requiredFactIds: Schema$1.Array(ReadinessFactId).check(Schema$1.isMaxLength(512)),
|
|
950
|
+
verifiedFactIds: Schema$1.Array(ReadinessFactId).check(Schema$1.isMaxLength(512))
|
|
951
|
+
}).check(Schema$1.makeFilter(({ derivationVersion }) => derivationVersion === READINESS_DERIVATION_VERSION_V1, { expected: "an environment readiness assessment derived by V1" }), Schema$1.makeFilter(({ assessmentId, previousAssessmentId }) => previousAssessmentId === null || previousAssessmentId !== assessmentId, { expected: "a readiness assessment not to supersede itself" }), Schema$1.makeFilter(({ facts }) => isCanonicalStrings(facts.map(({ definition }) => definition.factId)), { expected: "environment readiness facts to have canonical unique identities" }), Schema$1.makeFilter(({ facts }) => readinessPolicyShapeIsV1(facts.map(({ definition }) => definition), facts.flatMap(({ observation }) => observation === null ? [] : [observation])), { expected: "environment readiness assessment to retain the complete V1 policy shape" }), Schema$1.makeFilter(({ facts, requiredFactIds }) => sameOrderedStrings(requiredFactIds, sortedReadinessUnique(facts.filter(({ definition }) => definition.requirement === "required").map(({ definition }) => definition.factId))), { expected: "environment readiness required facts to match retained evaluations" }), Schema$1.makeFilter(({ facts, verifiedFactIds }) => sameOrderedStrings(verifiedFactIds, sortedReadinessUnique(facts.filter(({ result }) => result === "verified").map(({ definition }) => definition.factId))), { expected: "environment readiness verified facts to match retained evaluations" }), Schema$1.makeFilter(({ blockers, facts, gaps, inputComplete, warnings }) => {
|
|
952
|
+
const expected = deriveReadinessFindings(facts, inputComplete);
|
|
953
|
+
return sameOrderedStrings(blockers.map(readinessFindingKey), expected.blockers.map(readinessFindingKey)) && sameOrderedStrings(warnings.map(readinessFindingKey), expected.warnings.map(readinessFindingKey)) && sameOrderedStrings(gaps.map(readinessFindingKey), expected.gaps.map(readinessFindingKey));
|
|
954
|
+
}, { expected: "environment readiness findings to match retained fact evaluations" }), Schema$1.makeFilter(({ evidenceIds, facts }) => sameOrderedStrings(evidenceIds, factEvidenceIds(facts)), { expected: "environment readiness evidence to match retained fact dependencies" }), Schema$1.makeFilter(({ facts, stages }) => {
|
|
955
|
+
const build = factsOfKinds(facts, ["execution"]);
|
|
956
|
+
const verify = factsOfKinds(facts, [
|
|
957
|
+
"relationship",
|
|
958
|
+
"approval",
|
|
959
|
+
"check",
|
|
960
|
+
"documentation"
|
|
961
|
+
]);
|
|
962
|
+
const production = factsOfKinds(facts, ["deployment"]);
|
|
963
|
+
return stageMatchesFacts(stages.build, build) && stageMatchesFacts(stages.verify, verify) && stageMatchesFacts(stages.production, production);
|
|
964
|
+
}, { expected: "environment readiness stages to retain their exact fact and evidence dependencies" }), Schema$1.makeFilter(({ facts, stages }) => readinessStagesAreEqual(stages, deriveReadinessStages(facts)), { expected: "environment readiness stage states to match retained fact evaluations" }), Schema$1.makeFilter(({ facts, sourceFreshness }) => {
|
|
965
|
+
const expected = deriveReadinessSourceSummaries(facts);
|
|
966
|
+
return sourceFreshness.length === expected.length && sourceFreshness.every((summary, index) => {
|
|
967
|
+
const item = expected[index];
|
|
968
|
+
return item !== void 0 && summary.pluginConnectionId === item.pluginConnectionId && summary.freshness === item.freshness && summary.health === item.health && sameOrderedStrings(summary.evidenceIds, item.evidenceIds);
|
|
969
|
+
});
|
|
970
|
+
}, { expected: "environment readiness source summaries to match retained evidence" }), Schema$1.makeFilter(({ facts, nextEvaluationAt }) => {
|
|
971
|
+
const expected = deriveReadinessNextEvaluationAt(facts);
|
|
972
|
+
return expected === null || nextEvaluationAt === null ? expected === nextEvaluationAt : DateTime$1.Order(expected, nextEvaluationAt) === 0;
|
|
973
|
+
}, { expected: "environment readiness reevaluation time to match retained evidence" }), Schema$1.makeFilter(canonicalAssessmentCollections, { expected: "environment readiness collections to be canonical and evidence-bound" }), Schema$1.makeFilter((assessment) => assessment.verdict === deriveEnvironmentReadinessVerdict(assessment), { expected: "environment readiness verdict to agree with retained facts, findings, and stages" }));
|
|
974
|
+
/** Compact immutable child retained by a release-scope roll-up. */
|
|
975
|
+
var EnvironmentReadinessSummary = Schema$1.Struct({
|
|
976
|
+
assessmentId: ReadinessAssessmentId,
|
|
977
|
+
environmentId: EnvironmentId,
|
|
978
|
+
candidateDigest: ReadinessCandidateDigest,
|
|
979
|
+
inputComplete: Schema$1.Boolean,
|
|
980
|
+
facts: Schema$1.Array(ReadinessFactEvaluation).check(Schema$1.isMaxLength(512)),
|
|
981
|
+
nextEvaluationAt: Schema$1.NullOr(UtcTimestamp),
|
|
982
|
+
verdict: ReadinessVerdict,
|
|
983
|
+
stages: ReadinessStages,
|
|
984
|
+
blockers: Schema$1.Array(ReadinessFinding).check(Schema$1.isMaxLength(MAX_READINESS_FINDINGS)),
|
|
985
|
+
warnings: Schema$1.Array(ReadinessFinding).check(Schema$1.isMaxLength(MAX_READINESS_FINDINGS)),
|
|
986
|
+
gaps: Schema$1.Array(ReadinessFinding).check(Schema$1.isMaxLength(MAX_READINESS_FINDINGS)),
|
|
987
|
+
sourceFreshness: Schema$1.Array(ReadinessSourceSummary).check(Schema$1.isMaxLength(512)),
|
|
988
|
+
evidenceIds: Schema$1.Array(EvidenceId).check(Schema$1.isMaxLength(512))
|
|
989
|
+
}).check(Schema$1.makeFilter(({ facts }) => isCanonicalStrings(facts.map(({ definition }) => definition.factId)), { expected: "an environment readiness summary to have canonical unique facts" }), Schema$1.makeFilter(({ facts }) => readinessPolicyShapeIsV1(facts.map(({ definition }) => definition), facts.flatMap(({ observation }) => observation === null ? [] : [observation])), { expected: "an environment readiness summary to retain the complete V1 policy shape" }), Schema$1.makeFilter(({ blockers, facts, gaps, inputComplete, warnings }) => {
|
|
990
|
+
const expected = deriveReadinessFindings(facts, inputComplete);
|
|
991
|
+
return sameOrderedStrings(blockers.map(readinessFindingKey), expected.blockers.map(readinessFindingKey)) && sameOrderedStrings(warnings.map(readinessFindingKey), expected.warnings.map(readinessFindingKey)) && sameOrderedStrings(gaps.map(readinessFindingKey), expected.gaps.map(readinessFindingKey));
|
|
992
|
+
}, { expected: "environment readiness summary findings to match retained facts" }), Schema$1.makeFilter(({ evidenceIds, facts }) => sameOrderedStrings(evidenceIds, factEvidenceIds(facts)), { expected: "environment readiness summary evidence to match retained facts" }), Schema$1.makeFilter(({ facts, stages }) => readinessStagesAreEqual(stages, deriveReadinessStages(facts)), { expected: "environment readiness summary stages to match retained facts" }), Schema$1.makeFilter(({ facts, sourceFreshness }) => {
|
|
993
|
+
const expected = deriveReadinessSourceSummaries(facts);
|
|
994
|
+
return sourceFreshness.length === expected.length && sourceFreshness.every((summary, index) => {
|
|
995
|
+
const item = expected[index];
|
|
996
|
+
return item !== void 0 && summary.pluginConnectionId === item.pluginConnectionId && summary.freshness === item.freshness && summary.health === item.health && sameOrderedStrings(summary.evidenceIds, item.evidenceIds);
|
|
997
|
+
});
|
|
998
|
+
}, { expected: "environment readiness summary sources to match retained facts" }), Schema$1.makeFilter(({ facts, nextEvaluationAt }) => {
|
|
999
|
+
const expected = deriveReadinessNextEvaluationAt(facts);
|
|
1000
|
+
return expected === null || nextEvaluationAt === null ? expected === nextEvaluationAt : DateTime$1.Order(expected, nextEvaluationAt) === 0;
|
|
1001
|
+
}, { expected: "environment readiness summary reevaluation time to match retained facts" }), Schema$1.makeFilter(canonicalAssessmentCollections, { expected: "environment readiness summary collections to be canonical and evidence-bound" }), Schema$1.makeFilter((summary) => summary.verdict === deriveEnvironmentReadinessVerdict(summary), { expected: "environment readiness summary verdict to match retained facts, findings, and stages" }));
|
|
1002
|
+
/** Immutable release assessment rolled up from current target environments. */
|
|
1003
|
+
var ReleaseReadinessAssessment = Schema$1.Struct({
|
|
1004
|
+
...AssessmentBase,
|
|
1005
|
+
_tag: Schema$1.Literal("release"),
|
|
1006
|
+
candidate: ReleaseReadinessCandidateIdentity,
|
|
1007
|
+
environments: Schema$1.NonEmptyArray(EnvironmentReadinessSummary).check(Schema$1.isMaxLength(512))
|
|
1008
|
+
}).check(Schema$1.makeFilter(({ derivationVersion }) => derivationVersion === READINESS_DERIVATION_VERSION_V1, { expected: "a release readiness assessment derived by V1" }), Schema$1.makeFilter(({ assessmentId, previousAssessmentId }) => previousAssessmentId === null || previousAssessmentId !== assessmentId, { expected: "a release readiness assessment not to supersede itself" }), Schema$1.makeFilter(({ environments }) => isCanonicalStrings(environments.map(({ environmentId }) => environmentId)), { expected: "release readiness environments to have canonical unique identities" }), Schema$1.makeFilter(({ environments, stages }) => readinessStagesAreEqual(stages, deriveReleaseReadinessStages(environments)), { expected: "release readiness stages to match retained environment summaries" }), Schema$1.makeFilter(({ blockers, environments, gaps, warnings }) => {
|
|
1009
|
+
const expected = deriveReleaseReadinessFindings(environments);
|
|
1010
|
+
return sameOrderedStrings(blockers.map(readinessFindingKey), expected.blockers.map(readinessFindingKey)) && sameOrderedStrings(warnings.map(readinessFindingKey), expected.warnings.map(readinessFindingKey)) && sameOrderedStrings(gaps.map(readinessFindingKey), expected.gaps.map(readinessFindingKey));
|
|
1011
|
+
}, { expected: "release readiness findings to match retained environment summaries" }), Schema$1.makeFilter(({ environments, sourceFreshness }) => {
|
|
1012
|
+
const expected = deriveReleaseReadinessSourceSummaries(environments);
|
|
1013
|
+
return sourceFreshness.length === expected.length && sourceFreshness.every((summary, index) => {
|
|
1014
|
+
const item = expected[index];
|
|
1015
|
+
return item !== void 0 && summary.pluginConnectionId === item.pluginConnectionId && summary.freshness === item.freshness && summary.health === item.health && sameOrderedStrings(summary.evidenceIds, item.evidenceIds);
|
|
1016
|
+
});
|
|
1017
|
+
}, { expected: "release readiness sources to match retained environment summaries" }), Schema$1.makeFilter(({ environments, nextEvaluationAt }) => {
|
|
1018
|
+
const expected = deriveReleaseReadinessNextEvaluationAt(environments);
|
|
1019
|
+
return expected === null || nextEvaluationAt === null ? expected === nextEvaluationAt : DateTime$1.Order(expected, nextEvaluationAt) === 0;
|
|
1020
|
+
}, { expected: "release readiness reevaluation time to match retained environment summaries" }), Schema$1.makeFilter(({ environments, evidenceIds }) => sameOrderedStrings(evidenceIds, sortedReadinessUnique(environments.flatMap(({ evidenceIds }) => evidenceIds))), { expected: "release readiness evidence to match retained environment summaries" }), Schema$1.makeFilter(canonicalAssessmentCollections, { expected: "release readiness collections to be canonical and evidence-bound" }), Schema$1.makeFilter(({ environments, verdict }) => verdict === deriveReleaseReadinessVerdict(environments), { expected: "release readiness verdict to agree with its environment summaries" }));
|
|
1021
|
+
/** Any immutable server-authoritative readiness assessment. */
|
|
1022
|
+
var ReadinessAssessment = Schema$1.Union([EnvironmentReadinessAssessment, ReleaseReadinessAssessment]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
1023
|
+
/** Complete, decoded input for one release-scope roll-up. */
|
|
1024
|
+
var ReleaseReadinessRollupInput = Schema$1.Struct({
|
|
1025
|
+
assessmentId: ReadinessAssessmentId,
|
|
1026
|
+
previousAssessmentId: Schema$1.NullOr(ReadinessAssessmentId),
|
|
1027
|
+
candidate: ReleaseReadinessCandidateIdentity,
|
|
1028
|
+
evaluatedAt: UtcTimestamp,
|
|
1029
|
+
environments: Schema$1.NonEmptyArray(EnvironmentReadinessAssessment).check(Schema$1.isMaxLength(512))
|
|
1030
|
+
}).check(Schema$1.makeFilter(({ assessmentId, previousAssessmentId }) => previousAssessmentId === null || previousAssessmentId !== assessmentId, { expected: "a release readiness roll-up input not to supersede itself" }), Schema$1.makeFilter(({ environments }) => unique(environments.map(({ candidate }) => candidate.scope.environmentId)), { expected: "release readiness roll-up environment identities to be unique" }), Schema$1.makeFilter(({ candidate, environments }) => environments.every((assessment) => assessment.candidate.workspaceId === candidate.workspaceId && assessment.candidate.scope.releaseId === candidate.scope.releaseId && assessment.candidate.releaseRevision === candidate.releaseRevision && assessment.candidate.artifactRevision === candidate.artifactRevision), { expected: "release readiness roll-up children to name the same workspace, release, and candidate revision" }), Schema$1.makeFilter(({ environments }) => environments.every((assessment) => assessment.rule.ruleId === environments[0]?.rule.ruleId && assessment.rule.version === environments[0]?.rule.version && assessment.rule.digest === environments[0]?.rule.digest && assessment.derivationVersion === environments[0]?.derivationVersion), { expected: "release readiness roll-up children to use one rule and derivation version" }), Schema$1.makeFilter(({ environments }) => sortedReadinessUnique(environments.flatMap(({ evidenceIds }) => evidenceIds)).length <= 512, { expected: "release readiness roll-up evidence to fit its bounded assessment" }), Schema$1.makeFilter(({ environments }) => [
|
|
1031
|
+
"build",
|
|
1032
|
+
"verify",
|
|
1033
|
+
"production"
|
|
1034
|
+
].every((stage) => {
|
|
1035
|
+
if (stage === "build") return sortedReadinessUnique(environments.flatMap(({ stages }) => stages.build.factIds)).length <= 512;
|
|
1036
|
+
if (stage === "verify") return sortedReadinessUnique(environments.flatMap(({ stages }) => stages.verify.factIds)).length <= 512;
|
|
1037
|
+
return sortedReadinessUnique(environments.flatMap(({ stages }) => stages.production.factIds)).length <= 512;
|
|
1038
|
+
}), { expected: "release readiness roll-up facts to fit its bounded stages" }), Schema$1.makeFilter(({ environments }) => environments.reduce((total, assessment) => total + assessment.blockers.length, 0) <= 1025 && environments.reduce((total, assessment) => total + assessment.warnings.length, 0) <= 1025 && environments.reduce((total, assessment) => total + assessment.gaps.length, 0) <= 1025, { expected: "release readiness roll-up findings to fit its bounded assessment" }), Schema$1.makeFilter(({ environments }) => sortedReadinessUnique(environments.flatMap(({ sourceFreshness }) => sourceFreshness.map(({ pluginConnectionId }) => pluginConnectionId))).length <= 512, { expected: "release readiness roll-up sources to fit its bounded assessment" }), Schema$1.makeFilter(({ environments, evaluatedAt }) => environments.every((assessment) => DateTime$1.Order(assessment.evaluatedAt, evaluatedAt) <= 0), { expected: "release readiness roll-up not to predate its child assessments" }));
|
|
1039
|
+
//#endregion
|
|
1040
|
+
//#region src/domain/actors.ts
|
|
1041
|
+
var DisplayName = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isMinLength(1), Schema$1.isMaxLength(200));
|
|
1042
|
+
var AvatarReferenceValue = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isMinLength(1), Schema$1.isMaxLength(500));
|
|
1043
|
+
var Initials = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isMinLength(1), Schema$1.isMaxLength(4));
|
|
1044
|
+
/** An immutable provider identity associated with a canonical person. */
|
|
1045
|
+
var PersonSourceIdentity = Schema$1.Struct({
|
|
1046
|
+
pluginConnectionId: PluginConnectionId,
|
|
1047
|
+
providerId: ProviderId,
|
|
1048
|
+
vendorPersonId: VendorImmutableId
|
|
1049
|
+
});
|
|
1050
|
+
/** Avatar media reference or deterministic initials fallback. */
|
|
1051
|
+
var PersonAvatar = Schema$1.TaggedUnion({
|
|
1052
|
+
initials: { text: Initials },
|
|
1053
|
+
reference: { reference: AvatarReferenceValue }
|
|
1054
|
+
});
|
|
1055
|
+
/**
|
|
1056
|
+
* Derives a stable one- or two-token initials fallback from a display name.
|
|
1057
|
+
* The first code point of the first and last non-empty tokens is used.
|
|
1058
|
+
*/
|
|
1059
|
+
var derivePersonInitials = (displayName) => {
|
|
1060
|
+
const tokens = displayName.trim().split(/\s+/u).filter(Boolean);
|
|
1061
|
+
const firstToken = tokens.at(0) ?? "";
|
|
1062
|
+
const lastToken = tokens.at(-1) ?? "";
|
|
1063
|
+
return `${Array.from(firstToken).at(0) ?? ""}${tokens.length > 1 ? Array.from(lastToken).at(0) ?? "" : ""}`.toLocaleUpperCase("en-US");
|
|
1064
|
+
};
|
|
1065
|
+
/** Canonical person with provider identities and an accessible avatar fallback. */
|
|
1066
|
+
var Person = Schema$1.Struct({
|
|
1067
|
+
avatar: PersonAvatar,
|
|
1068
|
+
displayName: DisplayName,
|
|
1069
|
+
isActive: Schema$1.Boolean,
|
|
1070
|
+
personId: PersonId,
|
|
1071
|
+
sourceIdentities: Schema$1.Array(PersonSourceIdentity)
|
|
1072
|
+
}).check(Schema$1.makeFilter(({ avatar, displayName }) => avatar._tag === "reference" || avatar.text === derivePersonInitials(displayName), { expected: "initials avatar to match the deterministic display-name fallback" }), Schema$1.makeFilter(({ sourceIdentities }) => {
|
|
1073
|
+
const identityKeys = sourceIdentities.map(({ pluginConnectionId, providerId, vendorPersonId }) => `${providerId}\u0000${pluginConnectionId}\u0000${vendorPersonId}`);
|
|
1074
|
+
return new Set(identityKeys).size === identityKeys.length;
|
|
1075
|
+
}, { expected: "person source identities to be unique" }));
|
|
1076
|
+
/** Human collaborator responsible for a domain action. */
|
|
1077
|
+
var HumanActor = Schema$1.TaggedStruct("human", { personId: PersonId });
|
|
1078
|
+
/** Automated agent responsible for a domain action. */
|
|
1079
|
+
var AgentActor = Schema$1.TaggedStruct("agent", { agentId: AgentId });
|
|
1080
|
+
/** Human or agent responsible for a domain action. */
|
|
1081
|
+
var Actor = Schema$1.Union([HumanActor, AgentActor]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
1082
|
+
/** Explicit collaboration role stored with an assignment. */
|
|
1083
|
+
var Role = Schema$1.Literals([
|
|
1084
|
+
"workspace-owner",
|
|
1085
|
+
"workspace-approver",
|
|
1086
|
+
"release-owner",
|
|
1087
|
+
"release-approver",
|
|
1088
|
+
"change-owner",
|
|
1089
|
+
"issue-owner",
|
|
1090
|
+
"issue-assignee",
|
|
1091
|
+
"page-owner",
|
|
1092
|
+
"author",
|
|
1093
|
+
"contributor",
|
|
1094
|
+
"reviewer",
|
|
1095
|
+
"operator",
|
|
1096
|
+
"deployment-approver",
|
|
1097
|
+
"merge-approver",
|
|
1098
|
+
"watcher"
|
|
1099
|
+
]);
|
|
1100
|
+
/** Exact domain scope to which a role assignment applies. */
|
|
1101
|
+
var RoleScope = Schema$1.TaggedUnion({
|
|
1102
|
+
entity: {
|
|
1103
|
+
entityId: EntityId,
|
|
1104
|
+
workspaceId: WorkspaceId
|
|
1105
|
+
},
|
|
1106
|
+
environment: {
|
|
1107
|
+
environmentId: EnvironmentId,
|
|
1108
|
+
releaseId: ReleaseId,
|
|
1109
|
+
workspaceId: WorkspaceId
|
|
1110
|
+
},
|
|
1111
|
+
release: {
|
|
1112
|
+
releaseId: ReleaseId,
|
|
1113
|
+
workspaceId: WorkspaceId
|
|
1114
|
+
},
|
|
1115
|
+
workspace: { workspaceId: WorkspaceId }
|
|
1116
|
+
});
|
|
1117
|
+
var ActiveAssignmentLifecycle = Schema$1.TaggedStruct("active", { assignedAt: UtcTimestamp });
|
|
1118
|
+
var EndedAssignmentLifecycle = Schema$1.TaggedStruct("ended", {
|
|
1119
|
+
assignedAt: UtcTimestamp,
|
|
1120
|
+
endedAt: UtcTimestamp
|
|
1121
|
+
}).check(Schema$1.makeFilter(({ assignedAt, endedAt }) => DateTime$1.Order(assignedAt, endedAt) <= 0, { expected: "assignment end time to be at or after assignment time" }));
|
|
1122
|
+
var RevokedAssignmentLifecycle = Schema$1.TaggedStruct("revoked", {
|
|
1123
|
+
assignedAt: UtcTimestamp,
|
|
1124
|
+
revokedAt: UtcTimestamp
|
|
1125
|
+
}).check(Schema$1.makeFilter(({ assignedAt, revokedAt }) => DateTime$1.Order(assignedAt, revokedAt) <= 0, { expected: "assignment revocation time to be at or after assignment time" }));
|
|
1126
|
+
/** Lifecycle and chronological bounds of a role assignment. */
|
|
1127
|
+
var AssignmentLifecycle = Schema$1.Union([
|
|
1128
|
+
ActiveAssignmentLifecycle,
|
|
1129
|
+
EndedAssignmentLifecycle,
|
|
1130
|
+
RevokedAssignmentLifecycle
|
|
1131
|
+
]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
1132
|
+
/** Persisted binding of a human or agent role to one exact domain scope. */
|
|
1133
|
+
var RoleAssignment = Schema$1.Struct({
|
|
1134
|
+
actor: Actor,
|
|
1135
|
+
assignmentId: RoleAssignmentId,
|
|
1136
|
+
lifecycle: AssignmentLifecycle,
|
|
1137
|
+
role: Role,
|
|
1138
|
+
scope: RoleScope
|
|
1139
|
+
});
|
|
1140
|
+
//#endregion
|
|
1141
|
+
//#region src/domain/releaseRelay.ts
|
|
1142
|
+
/** Canonical persisted algorithm label for the current Release Relay projection. */
|
|
1143
|
+
var RELEASE_RELAY_ALGORITHM = "relay/v1";
|
|
1144
|
+
/** Explicit v1 alias retained beside the versioned catalog constants. */
|
|
1145
|
+
var RELEASE_RELAY_V1_ALGORITHM = RELEASE_RELAY_ALGORITHM;
|
|
1146
|
+
var freezeCatalog = (catalog) => Object.freeze(catalog);
|
|
1147
|
+
/** Frozen adjective catalog whose order is part of the relay/v1 contract. */
|
|
1148
|
+
var RELEASE_RELAY_V1_ADJECTIVES = freezeCatalog([
|
|
1149
|
+
"Amber",
|
|
1150
|
+
"Azure",
|
|
1151
|
+
"Copper",
|
|
1152
|
+
"Ember",
|
|
1153
|
+
"Golden",
|
|
1154
|
+
"Lunar",
|
|
1155
|
+
"Moss",
|
|
1156
|
+
"Nova",
|
|
1157
|
+
"Quiet",
|
|
1158
|
+
"Silver",
|
|
1159
|
+
"Solar",
|
|
1160
|
+
"Tidal",
|
|
1161
|
+
"Velvet",
|
|
1162
|
+
"Verdant",
|
|
1163
|
+
"Wild",
|
|
1164
|
+
"Winter"
|
|
1165
|
+
]);
|
|
1166
|
+
/** Frozen noun catalog whose order is part of the relay/v1 contract. */
|
|
1167
|
+
var RELEASE_RELAY_V1_NOUNS = freezeCatalog([
|
|
1168
|
+
"Anchor",
|
|
1169
|
+
"Beacon",
|
|
1170
|
+
"Bridge",
|
|
1171
|
+
"Comet",
|
|
1172
|
+
"Finch",
|
|
1173
|
+
"Fork",
|
|
1174
|
+
"Gate",
|
|
1175
|
+
"Grove",
|
|
1176
|
+
"Harbor",
|
|
1177
|
+
"Orbit",
|
|
1178
|
+
"Pulse",
|
|
1179
|
+
"Reef",
|
|
1180
|
+
"Relay",
|
|
1181
|
+
"Spark",
|
|
1182
|
+
"Wave",
|
|
1183
|
+
"Willow"
|
|
1184
|
+
]);
|
|
1185
|
+
/** Schema for the relay/v1 algorithm discriminator. */
|
|
1186
|
+
var ReleaseRelayAlgorithm = Schema.Literal(RELEASE_RELAY_ALGORITHM);
|
|
1187
|
+
/** Persisted relay/v1 adjective. */
|
|
1188
|
+
var ReleaseRelayAdjective = Schema.Literals(RELEASE_RELAY_V1_ADJECTIVES);
|
|
1189
|
+
/** Persisted relay/v1 noun. */
|
|
1190
|
+
var ReleaseRelayNoun = Schema.Literals(RELEASE_RELAY_V1_NOUNS);
|
|
1191
|
+
/** Persisted relay/v1 codename assembled from the frozen catalogs. */
|
|
1192
|
+
var ReleaseRelayCodename = Schema.TemplateLiteral([
|
|
1193
|
+
ReleaseRelayAdjective,
|
|
1194
|
+
" ",
|
|
1195
|
+
ReleaseRelayNoun
|
|
1196
|
+
]);
|
|
1197
|
+
/** Closed index into rly's separately versioned 16-symbol presentation catalog. */
|
|
1198
|
+
var ReleaseRelaySymbolIndex = Schema.Literals([
|
|
1199
|
+
0,
|
|
1200
|
+
1,
|
|
1201
|
+
2,
|
|
1202
|
+
3,
|
|
1203
|
+
4,
|
|
1204
|
+
5,
|
|
1205
|
+
6,
|
|
1206
|
+
7,
|
|
1207
|
+
8,
|
|
1208
|
+
9,
|
|
1209
|
+
10,
|
|
1210
|
+
11,
|
|
1211
|
+
12,
|
|
1212
|
+
13,
|
|
1213
|
+
14,
|
|
1214
|
+
15
|
|
1215
|
+
]);
|
|
1216
|
+
/** Exactly three distinct persisted indices into the release-symbol catalog. */
|
|
1217
|
+
var ReleaseRelaySymbolIndices = Schema.Tuple([
|
|
1218
|
+
ReleaseRelaySymbolIndex,
|
|
1219
|
+
ReleaseRelaySymbolIndex,
|
|
1220
|
+
ReleaseRelaySymbolIndex
|
|
1221
|
+
]).check(Schema.isUnique({ expected: "three distinct release symbol indices" }));
|
|
1222
|
+
/** Versioned, persisted Release Relay identity owned by the Control Center domain. */
|
|
1223
|
+
var ReleaseRelayProjection = Schema.Struct({
|
|
1224
|
+
algorithm: ReleaseRelayAlgorithm,
|
|
1225
|
+
codename: ReleaseRelayCodename,
|
|
1226
|
+
symbolIndices: ReleaseRelaySymbolIndices
|
|
1227
|
+
});
|
|
1228
|
+
var FNV_1A_OFFSET_BASIS = 2166136261;
|
|
1229
|
+
var FNV_1A_PRIME = 16777619;
|
|
1230
|
+
var fnv1a32 = (asciiValue) => {
|
|
1231
|
+
let hash = FNV_1A_OFFSET_BASIS;
|
|
1232
|
+
for (let index = 0; index < asciiValue.length; index += 1) {
|
|
1233
|
+
hash ^= asciiValue.charCodeAt(index);
|
|
1234
|
+
hash = Math.imul(hash, FNV_1A_PRIME) >>> 0;
|
|
1235
|
+
}
|
|
1236
|
+
return hash;
|
|
1237
|
+
};
|
|
1238
|
+
var symbolIndexFromRemainder = (remainder) => {
|
|
1239
|
+
switch (remainder) {
|
|
1240
|
+
case 0: return 0;
|
|
1241
|
+
case 1: return 1;
|
|
1242
|
+
case 2: return 2;
|
|
1243
|
+
case 3: return 3;
|
|
1244
|
+
case 4: return 4;
|
|
1245
|
+
case 5: return 5;
|
|
1246
|
+
case 6: return 6;
|
|
1247
|
+
case 7: return 7;
|
|
1248
|
+
case 8: return 8;
|
|
1249
|
+
case 9: return 9;
|
|
1250
|
+
case 10: return 10;
|
|
1251
|
+
case 11: return 11;
|
|
1252
|
+
case 12: return 12;
|
|
1253
|
+
case 13: return 13;
|
|
1254
|
+
case 14: return 14;
|
|
1255
|
+
default: return 15;
|
|
1256
|
+
}
|
|
1257
|
+
};
|
|
1258
|
+
var catalogValueAt = (catalog, index) => {
|
|
1259
|
+
switch (index) {
|
|
1260
|
+
case 0: return catalog[0];
|
|
1261
|
+
case 1: return catalog[1];
|
|
1262
|
+
case 2: return catalog[2];
|
|
1263
|
+
case 3: return catalog[3];
|
|
1264
|
+
case 4: return catalog[4];
|
|
1265
|
+
case 5: return catalog[5];
|
|
1266
|
+
case 6: return catalog[6];
|
|
1267
|
+
case 7: return catalog[7];
|
|
1268
|
+
case 8: return catalog[8];
|
|
1269
|
+
case 9: return catalog[9];
|
|
1270
|
+
case 10: return catalog[10];
|
|
1271
|
+
case 11: return catalog[11];
|
|
1272
|
+
case 12: return catalog[12];
|
|
1273
|
+
case 13: return catalog[13];
|
|
1274
|
+
case 14: return catalog[14];
|
|
1275
|
+
default: return catalog[15];
|
|
1276
|
+
}
|
|
1277
|
+
};
|
|
1278
|
+
var deriveSymbolIndices = (releaseId) => {
|
|
1279
|
+
const firstIndex = symbolIndexFromRemainder(fnv1a32(`${RELEASE_RELAY_ALGORITHM}|symbol/0|${releaseId}`) % 16);
|
|
1280
|
+
const secondRank = fnv1a32(`${RELEASE_RELAY_ALGORITHM}|symbol/1|${releaseId}`) % 15;
|
|
1281
|
+
const secondIndex = symbolIndexFromRemainder(secondRank < firstIndex ? secondRank : secondRank + 1);
|
|
1282
|
+
const lowerExcludedIndex = Math.min(firstIndex, secondIndex);
|
|
1283
|
+
const upperExcludedIndex = Math.max(firstIndex, secondIndex);
|
|
1284
|
+
const thirdRank = fnv1a32(`${RELEASE_RELAY_ALGORITHM}|symbol/2|${releaseId}`) % 14;
|
|
1285
|
+
return [
|
|
1286
|
+
firstIndex,
|
|
1287
|
+
secondIndex,
|
|
1288
|
+
symbolIndexFromRemainder(thirdRank < lowerExcludedIndex ? thirdRank : thirdRank < upperExcludedIndex - 1 ? thirdRank + 1 : thirdRank + 2)
|
|
1289
|
+
];
|
|
1290
|
+
};
|
|
1291
|
+
/**
|
|
1292
|
+
* Derive the stable relay/v1 projection for one canonical immutable release identifier.
|
|
1293
|
+
*
|
|
1294
|
+
* relay/v1 applies unsigned 32-bit FNV-1a to the ASCII domains
|
|
1295
|
+
* `relay/v1|adjective|<release-id>`, `relay/v1|noun|<release-id>`, and
|
|
1296
|
+
* `relay/v1|symbol/<position>|<release-id>`. Symbol hashes select ranks from the
|
|
1297
|
+
* remaining 16, 15, then 14 indices, making distinctness constructive.
|
|
1298
|
+
*/
|
|
1299
|
+
var deriveReleaseRelay = (releaseId) => {
|
|
1300
|
+
const adjectiveIndex = symbolIndexFromRemainder(fnv1a32(`${RELEASE_RELAY_ALGORITHM}|adjective|${releaseId}`) % 16);
|
|
1301
|
+
const nounIndex = symbolIndexFromRemainder(fnv1a32(`${RELEASE_RELAY_ALGORITHM}|noun|${releaseId}`) % 16);
|
|
1302
|
+
return {
|
|
1303
|
+
algorithm: RELEASE_RELAY_ALGORITHM,
|
|
1304
|
+
codename: `${catalogValueAt(RELEASE_RELAY_V1_ADJECTIVES, adjectiveIndex)} ${catalogValueAt(RELEASE_RELAY_V1_NOUNS, nounIndex)}`,
|
|
1305
|
+
symbolIndices: deriveSymbolIndices(releaseId)
|
|
1306
|
+
};
|
|
1307
|
+
};
|
|
1308
|
+
//#endregion
|
|
1309
|
+
//#region src/domain/release.ts
|
|
1310
|
+
/** Human-readable service name retained independently of provider identity. */
|
|
1311
|
+
var ReleaseServiceName = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(200)).pipe(Schema$1.brand("ReleaseServiceName"));
|
|
1312
|
+
/** Provider-neutral release version or immutable release label. */
|
|
1313
|
+
var ReleaseVersion = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(100)).pipe(Schema$1.brand("ReleaseVersion"));
|
|
1314
|
+
/** Lifecycle of the release aggregate, separate from readiness and pipeline state. */
|
|
1315
|
+
var ReleaseLifecycle = Schema$1.Literals([
|
|
1316
|
+
"assembling",
|
|
1317
|
+
"candidate",
|
|
1318
|
+
"deploying",
|
|
1319
|
+
"released",
|
|
1320
|
+
"cancelled"
|
|
1321
|
+
]);
|
|
1322
|
+
var ReleaseRecord = Schema$1.Struct({
|
|
1323
|
+
createdAt: UtcTimestamp,
|
|
1324
|
+
freshness: Freshness,
|
|
1325
|
+
id: ReleaseId,
|
|
1326
|
+
lifecycle: ReleaseLifecycle,
|
|
1327
|
+
relay: ReleaseRelayProjection,
|
|
1328
|
+
roleAssignments: Schema$1.Array(RoleAssignment),
|
|
1329
|
+
serviceName: ReleaseServiceName,
|
|
1330
|
+
sourceRevisions: Schema$1.Array(SourceRevision),
|
|
1331
|
+
targetEnvironmentIds: Schema$1.Array(EnvironmentId).check(Schema$1.isUnique({ expected: "unique target environment identifiers" })),
|
|
1332
|
+
updatedAt: UtcTimestamp,
|
|
1333
|
+
version: ReleaseVersion,
|
|
1334
|
+
workspaceId: WorkspaceId
|
|
1335
|
+
});
|
|
1336
|
+
var encodeSourceRevision = Schema$1.encodeSync(SourceRevision);
|
|
1337
|
+
var sourceRevisionEquivalence = Schema$1.toEquivalence(Schema$1.toEncoded(SourceRevision));
|
|
1338
|
+
/**
|
|
1339
|
+
* Foundational release aggregate. Readiness, evidence, stages, and delivery
|
|
1340
|
+
* relationships extend this record in their owning slices.
|
|
1341
|
+
*/
|
|
1342
|
+
var Release = ReleaseRecord.check(Schema$1.makeFilter(({ createdAt, updatedAt }) => DateTime$1.Order(createdAt, updatedAt) <= 0, { expected: "release update time to be at or after creation time" }), Schema$1.makeFilter(({ roleAssignments, workspaceId }) => roleAssignments.every(({ scope }) => scope.workspaceId === workspaceId), { expected: "every role assignment to belong to the release workspace" }), Schema$1.makeFilter(({ id, roleAssignments }) => roleAssignments.every(({ scope }) => scope._tag === "release" || scope._tag === "environment" ? scope.releaseId === id : true), { expected: "release-scoped assignments to name this release" }), Schema$1.makeFilter(({ roleAssignments, targetEnvironmentIds }) => {
|
|
1343
|
+
const targets = new Set(targetEnvironmentIds);
|
|
1344
|
+
return roleAssignments.every(({ scope }) => scope._tag === "environment" ? targets.has(scope.environmentId) : true);
|
|
1345
|
+
}, { expected: "environment-scoped assignments to name a release target" }), Schema$1.makeFilter(({ roleAssignments }) => {
|
|
1346
|
+
const assignmentIds = roleAssignments.map(({ assignmentId }) => assignmentId);
|
|
1347
|
+
return new Set(assignmentIds).size === assignmentIds.length;
|
|
1348
|
+
}, { expected: "unique role assignment identifiers" }), Schema$1.makeFilter(({ sourceRevisions }) => {
|
|
1349
|
+
const sourceKeys = sourceRevisions.map(({ pluginConnectionId, providerId, vendorImmutableId }) => `${providerId}\u0000${pluginConnectionId}\u0000${vendorImmutableId}`);
|
|
1350
|
+
return new Set(sourceKeys).size === sourceKeys.length;
|
|
1351
|
+
}, { expected: "one current source revision per provider object" }), Schema$1.makeFilter(({ freshness, sourceRevisions }) => {
|
|
1352
|
+
if (freshness._tag !== "current" && freshness._tag !== "stale") return true;
|
|
1353
|
+
const freshnessRevision = encodeSourceRevision(freshness.provenance.sourceRevision);
|
|
1354
|
+
return sourceRevisions.filter((sourceRevision) => sourceRevisionEquivalence(encodeSourceRevision(sourceRevision), freshnessRevision)).length === 1;
|
|
1355
|
+
}, { expected: "current or stale freshness provenance to match one release source revision" }), Schema$1.makeFilter(({ id, relay }) => {
|
|
1356
|
+
const expected = deriveReleaseRelay(id);
|
|
1357
|
+
return relay.algorithm === expected.algorithm && relay.codename === expected.codename && relay.symbolIndices.every((symbolIndex, index) => symbolIndex === expected.symbolIndices[index]);
|
|
1358
|
+
}, { expected: "persisted relay projection to match the canonical release identifier" })).annotate({ identifier: "Release" });
|
|
1359
|
+
//#endregion
|
|
1360
|
+
//#region src/domain/plugins/descriptor.ts
|
|
1361
|
+
var NonNegativeInteger = Schema$1.Int.check(Schema$1.isGreaterThanOrEqualTo(0));
|
|
1362
|
+
var PositiveInteger = Schema$1.Int.check(Schema$1.isGreaterThan(0));
|
|
1363
|
+
var boundedIdentifier = (name, maximum) => Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(maximum)).pipe(Schema$1.brand(name));
|
|
1364
|
+
/** Stable reverse-DNS identity of a plugin, independent of package abbreviations. */
|
|
1365
|
+
var PluginId = boundedIdentifier("PluginId", 200);
|
|
1366
|
+
/** Strict structured semantic version used by plugin and adapter contracts. */
|
|
1367
|
+
var SemanticVersion = Schema$1.Struct({
|
|
1368
|
+
major: NonNegativeInteger,
|
|
1369
|
+
minor: NonNegativeInteger,
|
|
1370
|
+
patch: NonNegativeInteger
|
|
1371
|
+
}).annotate({ identifier: "SemanticVersion" });
|
|
1372
|
+
/** Independently versioned operations understood by the Control Center host. */
|
|
1373
|
+
var PluginCapabilityId = Schema$1.Literals([
|
|
1374
|
+
"entity.read",
|
|
1375
|
+
"sync.incremental",
|
|
1376
|
+
"action.propose",
|
|
1377
|
+
"action.execute",
|
|
1378
|
+
"action.cancel",
|
|
1379
|
+
"action.reconcile",
|
|
1380
|
+
"diff.inventory",
|
|
1381
|
+
"diff.content"
|
|
1382
|
+
]).annotate({ identifier: "PluginCapabilityId" });
|
|
1383
|
+
/** A capability and the contract versions an adapter can implement. */
|
|
1384
|
+
var PluginCapabilityOfferV1 = Schema$1.Struct({
|
|
1385
|
+
capabilityId: PluginCapabilityId,
|
|
1386
|
+
supportedVersions: Schema$1.Array(PositiveInteger).check(Schema$1.isNonEmpty(), Schema$1.isUnique(), Schema$1.makeFilter((versions) => versions.length <= 16, { expected: "at most 16 supported capability versions" })),
|
|
1387
|
+
requirement: Schema$1.Literals(["required", "optional"])
|
|
1388
|
+
}).annotate({ identifier: "PluginCapabilityOfferV1" });
|
|
1389
|
+
var ConfigurationKey = boundedIdentifier("PluginConfigurationKey", 100);
|
|
1390
|
+
var ConfigurationLabel = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(200));
|
|
1391
|
+
var commonConfigurationFields = {
|
|
1392
|
+
key: ConfigurationKey,
|
|
1393
|
+
label: ConfigurationLabel,
|
|
1394
|
+
description: Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(500)),
|
|
1395
|
+
required: Schema$1.Boolean
|
|
1396
|
+
};
|
|
1397
|
+
var TextConfigurationField = Schema$1.TaggedStruct("text", commonConfigurationFields);
|
|
1398
|
+
var UrlConfigurationField = Schema$1.TaggedStruct("url", commonConfigurationFields);
|
|
1399
|
+
var BooleanConfigurationField = Schema$1.TaggedStruct("boolean", commonConfigurationFields);
|
|
1400
|
+
var IntegerConfigurationField = Schema$1.TaggedStruct("integer", {
|
|
1401
|
+
...commonConfigurationFields,
|
|
1402
|
+
minimum: Schema$1.NullOr(Schema$1.Int),
|
|
1403
|
+
maximum: Schema$1.NullOr(Schema$1.Int)
|
|
1404
|
+
}).check(Schema$1.makeFilter(({ maximum, minimum }) => maximum === null || minimum === null || minimum <= maximum, { expected: "plugin integer configuration minimum not to exceed maximum" }));
|
|
1405
|
+
var SelectConfigurationField = Schema$1.TaggedStruct("select", {
|
|
1406
|
+
...commonConfigurationFields,
|
|
1407
|
+
options: Schema$1.Array(Schema$1.Struct({
|
|
1408
|
+
label: ConfigurationLabel,
|
|
1409
|
+
value: boundedIdentifier("PluginConfigurationOption", 200)
|
|
1410
|
+
})).check(Schema$1.isNonEmpty(), Schema$1.makeFilter((options) => options.length <= 100, { expected: "at most 100 plugin configuration options" }), Schema$1.makeFilter((options) => new Set(options.map(({ value }) => value)).size === options.length, { expected: "unique plugin configuration option values" }))
|
|
1411
|
+
});
|
|
1412
|
+
var SecretReferenceConfigurationField = Schema$1.TaggedStruct("secret-reference", {
|
|
1413
|
+
...commonConfigurationFields,
|
|
1414
|
+
secretKind: Schema$1.Literals([
|
|
1415
|
+
"token",
|
|
1416
|
+
"password",
|
|
1417
|
+
"private-key",
|
|
1418
|
+
"certificate",
|
|
1419
|
+
"opaque"
|
|
1420
|
+
])
|
|
1421
|
+
});
|
|
1422
|
+
/** Secret-free metadata describing a plugin configuration field. */
|
|
1423
|
+
var PluginConfigurationFieldV1 = Schema$1.Union([
|
|
1424
|
+
TextConfigurationField,
|
|
1425
|
+
UrlConfigurationField,
|
|
1426
|
+
BooleanConfigurationField,
|
|
1427
|
+
IntegerConfigurationField,
|
|
1428
|
+
SelectConfigurationField,
|
|
1429
|
+
SecretReferenceConfigurationField
|
|
1430
|
+
]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
1431
|
+
/** Raw version-one descriptor decoded before an adapter factory may run. */
|
|
1432
|
+
var PluginDescriptorV1 = Schema$1.Struct({
|
|
1433
|
+
contractId: Schema$1.Literal("dev.knpkv.control-center.plugin"),
|
|
1434
|
+
contractVersion: SemanticVersion,
|
|
1435
|
+
pluginId: PluginId,
|
|
1436
|
+
adapterVersion: SemanticVersion,
|
|
1437
|
+
displayName: Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(200)),
|
|
1438
|
+
configurationFields: Schema$1.Array(PluginConfigurationFieldV1).check(Schema$1.makeFilter((fields) => fields.length <= 100, { expected: "at most 100 plugin configuration fields" }), Schema$1.makeFilter((fields) => new Set(fields.map(({ key }) => key)).size === fields.length, { expected: "unique plugin configuration field keys" })),
|
|
1439
|
+
capabilities: Schema$1.Array(PluginCapabilityOfferV1).check(Schema$1.isNonEmpty(), Schema$1.makeFilter((capabilities) => capabilities.length <= 32, { expected: "at most 32 plugin capability offers" }))
|
|
1440
|
+
}).check(hasMaximumPluginJsonBytes(MaximumPluginDescriptorBytes)).annotate({ identifier: "PluginDescriptorV1" });
|
|
1441
|
+
/** One capability version selected by the host during negotiation. */
|
|
1442
|
+
var NegotiatedPluginCapabilityV1 = Schema$1.Struct({
|
|
1443
|
+
capabilityId: PluginCapabilityId,
|
|
1444
|
+
version: PositiveInteger
|
|
1445
|
+
}).annotate({ identifier: "NegotiatedPluginCapabilityV1" });
|
|
1446
|
+
/** Descriptor accepted by the host after contract and capability negotiation. */
|
|
1447
|
+
var NegotiatedPluginDescriptorV1 = Schema$1.Struct({
|
|
1448
|
+
descriptor: PluginDescriptorV1,
|
|
1449
|
+
capabilities: Schema$1.Array(NegotiatedPluginCapabilityV1).check(Schema$1.isNonEmpty(), Schema$1.makeFilter((capabilities) => capabilities.length <= 32, { expected: "at most 32 negotiated plugin capabilities" }), Schema$1.makeFilter((capabilities) => new Set(capabilities.map(({ capabilityId }) => capabilityId)).size === capabilities.length, { expected: "unique negotiated plugin capabilities" }))
|
|
1450
|
+
}).annotate({ identifier: "NegotiatedPluginDescriptorV1" });
|
|
1451
|
+
//#endregion
|
|
1452
|
+
//#region src/domain/normalizedIssue.ts
|
|
1453
|
+
var boundedText$1 = (maximum, identifier) => Schema$1.String.check(Schema$1.isMaxLength(maximum)).annotate({ identifier });
|
|
1454
|
+
var boundedNonEmptyText = (maximum, identifier) => boundedText$1(maximum, identifier).check(Schema$1.isTrimmed(), Schema$1.isNonEmpty());
|
|
1455
|
+
var boundedArray = (schema, maximum) => Schema$1.Array(schema).check(Schema$1.isMaxLength(maximum));
|
|
1456
|
+
var MAXIMUM_NORMALIZED_ISSUE_LABELS = 200;
|
|
1457
|
+
var MAXIMUM_NORMALIZED_ISSUE_COMPONENTS = 100;
|
|
1458
|
+
var MAXIMUM_NORMALIZED_ISSUE_FIX_VERSIONS = 99;
|
|
1459
|
+
var MAXIMUM_NORMALIZED_ISSUE_SUBTASKS = 200;
|
|
1460
|
+
var MAXIMUM_NORMALIZED_ISSUE_COLLABORATORS = 200;
|
|
1461
|
+
var MAXIMUM_NORMALIZED_ISSUE_COMMENTS = 200;
|
|
1462
|
+
var MAXIMUM_NORMALIZED_ISSUE_HISTORY = 200;
|
|
1463
|
+
var MAXIMUM_NORMALIZED_ISSUE_HISTORY_CHANGES = 100;
|
|
1464
|
+
var SourceObjectId = boundedNonEmptyText(512, "NormalizedIssueSourceObjectId");
|
|
1465
|
+
var SourcePersonId = boundedNonEmptyText(512, "NormalizedIssueSourcePersonId");
|
|
1466
|
+
var ShortText = boundedText$1(255, "NormalizedIssueShortText");
|
|
1467
|
+
var RichText = boundedText$1(16e3, "NormalizedIssueRichText");
|
|
1468
|
+
var TimestampText = boundedNonEmptyText(100, "NormalizedIssueTimestamp");
|
|
1469
|
+
var AvatarUrl = boundedNonEmptyText(2048, "NormalizedIssueAvatarUrl").check(Schema$1.makeFilter((value) => Result$1.isSuccess(Schema$1.decodeUnknownResult(SourceUrl)(value)), { expected: "an HTTP(S) source URL without embedded credentials" }));
|
|
1470
|
+
/** Provider-neutral named source object retained with a bounded source identity. */
|
|
1471
|
+
var NormalizedIssueNamedValue = Schema$1.Struct({
|
|
1472
|
+
sourceId: Schema$1.NullOr(SourceObjectId),
|
|
1473
|
+
name: Schema$1.NullOr(ShortText)
|
|
1474
|
+
}).annotate({ identifier: "NormalizedIssueNamedValue" });
|
|
1475
|
+
/** Provider-neutral project identity and presentation retained from an issue source. */
|
|
1476
|
+
var NormalizedIssueProject = Schema$1.Struct({
|
|
1477
|
+
sourceId: Schema$1.NullOr(SourceObjectId),
|
|
1478
|
+
key: Schema$1.NullOr(boundedNonEmptyText(100, "NormalizedIssueProjectKey")),
|
|
1479
|
+
name: Schema$1.NullOr(ShortText)
|
|
1480
|
+
}).annotate({ identifier: "NormalizedIssueProject" });
|
|
1481
|
+
/** Provider-neutral release/version reference retained from an issue source. */
|
|
1482
|
+
var NormalizedIssueFixVersion = Schema$1.Struct({
|
|
1483
|
+
sourceId: Schema$1.NullOr(SourceObjectId),
|
|
1484
|
+
name: Schema$1.NullOr(ShortText),
|
|
1485
|
+
released: Schema$1.Boolean,
|
|
1486
|
+
releaseDate: Schema$1.NullOr(TimestampText)
|
|
1487
|
+
}).annotate({ identifier: "NormalizedIssueFixVersion" });
|
|
1488
|
+
/** Provider-neutral parent or subtask reference retained from an issue source. */
|
|
1489
|
+
var NormalizedRelatedIssue = Schema$1.Struct({
|
|
1490
|
+
sourceId: Schema$1.NullOr(SourceObjectId),
|
|
1491
|
+
key: Schema$1.NullOr(boundedNonEmptyText(100, "NormalizedRelatedIssueKey")),
|
|
1492
|
+
summary: Schema$1.NullOr(boundedText$1(500, "NormalizedRelatedIssueSummary")),
|
|
1493
|
+
status: Schema$1.NullOr(NormalizedIssueNamedValue)
|
|
1494
|
+
}).annotate({ identifier: "NormalizedRelatedIssue" });
|
|
1495
|
+
/** Bounded source collaborator used for attribution without provider response types. */
|
|
1496
|
+
var NormalizedIssueCollaborator = Schema$1.Struct({
|
|
1497
|
+
sourcePersonId: SourcePersonId,
|
|
1498
|
+
displayName: boundedNonEmptyText(200, "NormalizedIssueCollaboratorDisplayName"),
|
|
1499
|
+
avatarUrl: Schema$1.NullOr(AvatarUrl),
|
|
1500
|
+
active: Schema$1.Boolean,
|
|
1501
|
+
roles: boundedArray(boundedNonEmptyText(100, "NormalizedIssueCollaboratorRole"), 16).check(Schema$1.isUnique())
|
|
1502
|
+
}).annotate({ identifier: "NormalizedIssueCollaborator" });
|
|
1503
|
+
/** Bounded provider-neutral issue comment. */
|
|
1504
|
+
var NormalizedIssueComment = Schema$1.Struct({
|
|
1505
|
+
sourceId: SourceObjectId,
|
|
1506
|
+
authorSourcePersonId: Schema$1.NullOr(SourcePersonId),
|
|
1507
|
+
updateAuthorSourcePersonId: Schema$1.NullOr(SourcePersonId),
|
|
1508
|
+
body: Schema$1.NullOr(RichText),
|
|
1509
|
+
createdAt: Schema$1.NullOr(TimestampText),
|
|
1510
|
+
updatedAt: Schema$1.NullOr(TimestampText)
|
|
1511
|
+
}).annotate({ identifier: "NormalizedIssueComment" });
|
|
1512
|
+
/** One bounded provider-neutral field transition. */
|
|
1513
|
+
var NormalizedIssueHistoryChange = Schema$1.Struct({
|
|
1514
|
+
field: boundedNonEmptyText(255, "NormalizedIssueHistoryField"),
|
|
1515
|
+
from: Schema$1.NullOr(boundedText$1(1e3, "NormalizedIssueHistoryValue")),
|
|
1516
|
+
to: Schema$1.NullOr(boundedText$1(1e3, "NormalizedIssueHistoryValue"))
|
|
1517
|
+
}).annotate({ identifier: "NormalizedIssueHistoryChange" });
|
|
1518
|
+
/** Bounded provider-neutral issue history entry. */
|
|
1519
|
+
var NormalizedIssueHistoryEntry = Schema$1.Struct({
|
|
1520
|
+
sourceId: SourceObjectId,
|
|
1521
|
+
authorSourcePersonId: Schema$1.NullOr(SourcePersonId),
|
|
1522
|
+
createdAt: Schema$1.NullOr(TimestampText),
|
|
1523
|
+
changes: boundedArray(NormalizedIssueHistoryChange, 100)
|
|
1524
|
+
}).annotate({ identifier: "NormalizedIssueHistoryEntry" });
|
|
1525
|
+
/** Fields whose source material may be deliberately reduced to remain within synchronization bounds. */
|
|
1526
|
+
var NormalizedIssueTruncatedField = Schema$1.Literals([
|
|
1527
|
+
"acceptanceCriteria",
|
|
1528
|
+
"collaborators",
|
|
1529
|
+
"comments",
|
|
1530
|
+
"components",
|
|
1531
|
+
"description",
|
|
1532
|
+
"environment",
|
|
1533
|
+
"fixVersions",
|
|
1534
|
+
"history",
|
|
1535
|
+
"issueType",
|
|
1536
|
+
"key",
|
|
1537
|
+
"labels",
|
|
1538
|
+
"parent",
|
|
1539
|
+
"priority",
|
|
1540
|
+
"project",
|
|
1541
|
+
"resolution",
|
|
1542
|
+
"summary",
|
|
1543
|
+
"status",
|
|
1544
|
+
"subtasks",
|
|
1545
|
+
"updatedAt",
|
|
1546
|
+
"createdAt",
|
|
1547
|
+
"dueDate",
|
|
1548
|
+
"resolvedAt"
|
|
1549
|
+
]);
|
|
1550
|
+
/**
|
|
1551
|
+
* Shared provider-neutral issue detail accepted from normalized plugins.
|
|
1552
|
+
*
|
|
1553
|
+
* The original compact key/status/priority/estimate fields remain required.
|
|
1554
|
+
* Rich fields are optional so older normalized plugins and persisted projections
|
|
1555
|
+
* remain valid; first-party Jira synchronization always supplies every rich field.
|
|
1556
|
+
*/
|
|
1557
|
+
var NormalizedIssueAttributes = Schema$1.Struct({
|
|
1558
|
+
key: boundedNonEmptyText(100, "NormalizedIssueKey"),
|
|
1559
|
+
status: boundedNonEmptyText(100, "NormalizedIssueStatus"),
|
|
1560
|
+
priority: Schema$1.NullOr(boundedNonEmptyText(100, "NormalizedIssuePriority")),
|
|
1561
|
+
estimatePoints: Schema$1.NullOr(Schema$1.Number.check(Schema$1.isGreaterThanOrEqualTo(0))),
|
|
1562
|
+
summary: Schema$1.optionalKey(boundedText$1(500, "NormalizedIssueSummary")),
|
|
1563
|
+
description: Schema$1.optionalKey(Schema$1.NullOr(RichText)),
|
|
1564
|
+
acceptanceCriteria: Schema$1.optionalKey(Schema$1.NullOr(RichText)),
|
|
1565
|
+
environment: Schema$1.optionalKey(Schema$1.NullOr(RichText)),
|
|
1566
|
+
issueType: Schema$1.optionalKey(Schema$1.NullOr(NormalizedIssueNamedValue)),
|
|
1567
|
+
project: Schema$1.optionalKey(Schema$1.NullOr(NormalizedIssueProject)),
|
|
1568
|
+
resolution: Schema$1.optionalKey(Schema$1.NullOr(NormalizedIssueNamedValue)),
|
|
1569
|
+
labels: Schema$1.optionalKey(boundedArray(boundedNonEmptyText(255, "NormalizedIssueLabel"), 200)),
|
|
1570
|
+
components: Schema$1.optionalKey(boundedArray(NormalizedIssueNamedValue, 100)),
|
|
1571
|
+
fixVersions: Schema$1.optionalKey(boundedArray(NormalizedIssueFixVersion, 99)),
|
|
1572
|
+
createdAt: Schema$1.optionalKey(Schema$1.NullOr(TimestampText)),
|
|
1573
|
+
updatedAt: Schema$1.optionalKey(Schema$1.NullOr(TimestampText)),
|
|
1574
|
+
dueDate: Schema$1.optionalKey(Schema$1.NullOr(TimestampText)),
|
|
1575
|
+
resolvedAt: Schema$1.optionalKey(Schema$1.NullOr(TimestampText)),
|
|
1576
|
+
parent: Schema$1.optionalKey(Schema$1.NullOr(NormalizedRelatedIssue)),
|
|
1577
|
+
subtasks: Schema$1.optionalKey(boundedArray(NormalizedRelatedIssue, 200)),
|
|
1578
|
+
assigneeSourcePersonId: Schema$1.optionalKey(Schema$1.NullOr(SourcePersonId)),
|
|
1579
|
+
reporterSourcePersonId: Schema$1.optionalKey(Schema$1.NullOr(SourcePersonId)),
|
|
1580
|
+
creatorSourcePersonId: Schema$1.optionalKey(Schema$1.NullOr(SourcePersonId)),
|
|
1581
|
+
collaborators: Schema$1.optionalKey(boundedArray(NormalizedIssueCollaborator, 200)),
|
|
1582
|
+
comments: Schema$1.optionalKey(boundedArray(NormalizedIssueComment, 200)),
|
|
1583
|
+
commentTotal: Schema$1.optionalKey(Schema$1.Int.check(Schema$1.isGreaterThanOrEqualTo(0))),
|
|
1584
|
+
commentsTruncated: Schema$1.optionalKey(Schema$1.Boolean),
|
|
1585
|
+
commentBodiesTruncated: Schema$1.optionalKey(Schema$1.Boolean),
|
|
1586
|
+
history: Schema$1.optionalKey(boundedArray(NormalizedIssueHistoryEntry, 200)),
|
|
1587
|
+
historyTotal: Schema$1.optionalKey(Schema$1.Int.check(Schema$1.isGreaterThanOrEqualTo(0))),
|
|
1588
|
+
historyTruncated: Schema$1.optionalKey(Schema$1.Boolean),
|
|
1589
|
+
truncatedFields: Schema$1.optionalKey(boundedArray(NormalizedIssueTruncatedField, 32).check(Schema$1.isUnique()))
|
|
1590
|
+
}).annotate({ identifier: "NormalizedIssueAttributes" });
|
|
1591
|
+
//#endregion
|
|
1592
|
+
//#region src/domain/deliveryGraph.ts
|
|
1593
|
+
var boundedText = (maximum, identifier) => Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(maximum)).annotate({ identifier });
|
|
1594
|
+
/** Provider-neutral kind of an object participating in delivery. */
|
|
1595
|
+
var DeliveryEntityKind = Schema$1.Literals([
|
|
1596
|
+
"issue",
|
|
1597
|
+
"pull-request",
|
|
1598
|
+
"page",
|
|
1599
|
+
"pipeline-execution",
|
|
1600
|
+
"deployment",
|
|
1601
|
+
"time-entry"
|
|
1602
|
+
]);
|
|
1603
|
+
/** Connected service responsible for a normalized delivery entity. */
|
|
1604
|
+
var DeliveryEntityService = Schema$1.Literals([
|
|
1605
|
+
"jira",
|
|
1606
|
+
"codecommit",
|
|
1607
|
+
"confluence",
|
|
1608
|
+
"codepipeline",
|
|
1609
|
+
"clockify"
|
|
1610
|
+
]);
|
|
1611
|
+
/** Coarse cross-provider lifecycle used by workspace item search. */
|
|
1612
|
+
var DeliveryEntityStatusGroup = Schema$1.Literals([
|
|
1613
|
+
"active",
|
|
1614
|
+
"done",
|
|
1615
|
+
"failed"
|
|
1616
|
+
]);
|
|
1617
|
+
/** Canonical semantic kind recorded for either endpoint of a relationship. */
|
|
1618
|
+
var RelationshipEndpointKind = Schema$1.Union([DeliveryEntityKind, Schema$1.Literals(["release", "environment"])]);
|
|
1619
|
+
/** Positive immutable revision of a normalized entity or relationship. */
|
|
1620
|
+
var LedgerRevision = Schema$1.Int.check(Schema$1.isGreaterThan(0)).pipe(Schema$1.brand("LedgerRevision"));
|
|
1621
|
+
var IssueDetails = Schema$1.TaggedStruct("issue", { ...NormalizedIssueAttributes.fields });
|
|
1622
|
+
var PullRequestDetails = Schema$1.TaggedStruct("pull-request", {
|
|
1623
|
+
repository: boundedText(200, "RepositoryName"),
|
|
1624
|
+
sourceBranch: boundedText(500, "SourceBranch"),
|
|
1625
|
+
targetBranch: boundedText(500, "TargetBranch"),
|
|
1626
|
+
headRevision: boundedText(512, "HeadRevision"),
|
|
1627
|
+
reviewState: Schema$1.Literals([
|
|
1628
|
+
"not-requested",
|
|
1629
|
+
"requested",
|
|
1630
|
+
"changes-requested",
|
|
1631
|
+
"approved",
|
|
1632
|
+
"merged"
|
|
1633
|
+
])
|
|
1634
|
+
});
|
|
1635
|
+
var PageDetails = Schema$1.TaggedStruct("page", {
|
|
1636
|
+
spaceKey: boundedText(100, "SpaceKey"),
|
|
1637
|
+
revision: boundedText(512, "PageRevision"),
|
|
1638
|
+
status: Schema$1.Literals([
|
|
1639
|
+
"draft",
|
|
1640
|
+
"current",
|
|
1641
|
+
"superseded"
|
|
1642
|
+
]),
|
|
1643
|
+
linkedIssueKeys: Schema$1.optional(Schema$1.Array(boundedText(100, "LinkedIssueKey")).check(Schema$1.isUnique(), Schema$1.isMaxLength(100))),
|
|
1644
|
+
linkedReleaseVersions: Schema$1.optional(Schema$1.Array(boundedText(100, "LinkedReleaseVersion")).check(Schema$1.isUnique(), Schema$1.isMaxLength(100)))
|
|
1645
|
+
});
|
|
1646
|
+
var PipelineDetails = Schema$1.TaggedStruct("pipeline-execution", {
|
|
1647
|
+
pipelineName: boundedText(200, "PipelineName"),
|
|
1648
|
+
executionId: boundedText(512, "PipelineExecutionId"),
|
|
1649
|
+
status: Schema$1.Literals([
|
|
1650
|
+
"queued",
|
|
1651
|
+
"running",
|
|
1652
|
+
"succeeded",
|
|
1653
|
+
"failed",
|
|
1654
|
+
"stopped"
|
|
1655
|
+
]),
|
|
1656
|
+
triggerRevision: boundedText(512, "PipelineTriggerRevision")
|
|
1657
|
+
});
|
|
1658
|
+
var DeploymentDetails = Schema$1.TaggedStruct("deployment", {
|
|
1659
|
+
environmentId: EnvironmentId,
|
|
1660
|
+
revision: boundedText(512, "DeploymentRevision"),
|
|
1661
|
+
status: Schema$1.Literals([
|
|
1662
|
+
"pending",
|
|
1663
|
+
"deploying",
|
|
1664
|
+
"succeeded",
|
|
1665
|
+
"failed",
|
|
1666
|
+
"rolled-back"
|
|
1667
|
+
])
|
|
1668
|
+
});
|
|
1669
|
+
var TimeEntryDetails = Schema$1.TaggedStruct("time-entry", {
|
|
1670
|
+
durationMinutes: Schema$1.Int.check(Schema$1.isGreaterThanOrEqualTo(0)),
|
|
1671
|
+
billable: Schema$1.Boolean,
|
|
1672
|
+
approvalState: Schema$1.Literals([
|
|
1673
|
+
"pending",
|
|
1674
|
+
"approved",
|
|
1675
|
+
"rejected",
|
|
1676
|
+
"not-required"
|
|
1677
|
+
])
|
|
1678
|
+
});
|
|
1679
|
+
/** Provider-neutral entity extension decoded before graph persistence. */
|
|
1680
|
+
var DeliveryEntityDetails = Schema$1.Union([
|
|
1681
|
+
IssueDetails,
|
|
1682
|
+
PullRequestDetails,
|
|
1683
|
+
PageDetails,
|
|
1684
|
+
PipelineDetails,
|
|
1685
|
+
DeploymentDetails,
|
|
1686
|
+
TimeEntryDetails
|
|
1687
|
+
]).pipe(Schema$1.toTaggedUnion("_tag"));
|
|
1688
|
+
/** Immutable normalized projection for one exact entity source revision. */
|
|
1689
|
+
var DeliveryEntityProjection = Schema$1.Struct({
|
|
1690
|
+
workspaceId: WorkspaceId,
|
|
1691
|
+
entityId: EntityId,
|
|
1692
|
+
projectionRevision: LedgerRevision,
|
|
1693
|
+
sourceEntityRevision: LedgerRevision,
|
|
1694
|
+
supersedesProjectionRevision: Schema$1.NullOr(LedgerRevision),
|
|
1695
|
+
projectionSchemaVersion: Schema$1.Int.check(Schema$1.isGreaterThan(0)),
|
|
1696
|
+
entityState: Schema$1.Literals(["present", "deleted"]),
|
|
1697
|
+
entityType: DeliveryEntityKind,
|
|
1698
|
+
displayKey: boundedText(200, "EntityDisplayKey"),
|
|
1699
|
+
title: boundedText(500, "EntityTitle"),
|
|
1700
|
+
details: DeliveryEntityDetails
|
|
1701
|
+
}).check(Schema$1.makeFilter(({ details, entityType }) => details._tag === entityType, { expected: "entity details whose tag matches the entity kind" }), Schema$1.makeFilter(({ projectionRevision, supersedesProjectionRevision }) => projectionRevision === 1 ? supersedesProjectionRevision === null : supersedesProjectionRevision === projectionRevision - 1, { expected: "entity projection to supersede its exact preceding revision" }));
|
|
1702
|
+
/** Resolved graph target with an exact canonical object identity. */
|
|
1703
|
+
var ResolvedDeliveryNode = Schema$1.TaggedUnion({
|
|
1704
|
+
entity: {
|
|
1705
|
+
entityId: EntityId,
|
|
1706
|
+
entityKind: DeliveryEntityKind
|
|
1707
|
+
},
|
|
1708
|
+
environment: {
|
|
1709
|
+
environmentId: EnvironmentId,
|
|
1710
|
+
releaseId: ReleaseId
|
|
1711
|
+
},
|
|
1712
|
+
release: { releaseId: ReleaseId }
|
|
1713
|
+
});
|
|
1714
|
+
/** Resolved or intentionally missing node stored as trusted graph state. */
|
|
1715
|
+
var DeliveryNode = Schema$1.Struct({
|
|
1716
|
+
workspaceId: WorkspaceId,
|
|
1717
|
+
nodeId: GraphNodeId,
|
|
1718
|
+
endpointKind: RelationshipEndpointKind,
|
|
1719
|
+
resolution: Schema$1.TaggedUnion({
|
|
1720
|
+
resolved: { target: ResolvedDeliveryNode },
|
|
1721
|
+
missing: {
|
|
1722
|
+
expectedKind: Schema$1.Literals([
|
|
1723
|
+
"entity",
|
|
1724
|
+
"release",
|
|
1725
|
+
"environment"
|
|
1726
|
+
]),
|
|
1727
|
+
expectedEntityKind: Schema$1.NullOr(DeliveryEntityKind),
|
|
1728
|
+
missingKey: boundedText(512, "MissingDeliveryNodeKey")
|
|
1729
|
+
}
|
|
1730
|
+
}),
|
|
1731
|
+
createdAt: UtcTimestamp
|
|
1732
|
+
}).check(Schema$1.makeFilter(({ resolution }) => resolution._tag !== "missing" || resolution.expectedKind === "entity" === (resolution.expectedEntityKind !== null), { expected: "only missing entity nodes to carry an expected entity kind" }), Schema$1.makeFilter(({ endpointKind, resolution }) => {
|
|
1733
|
+
if (resolution._tag === "missing") return resolution.expectedKind === "entity" ? endpointKind === resolution.expectedEntityKind : endpointKind === resolution.expectedKind;
|
|
1734
|
+
return resolution.target._tag === "entity" ? endpointKind === resolution.target.entityKind : endpointKind === resolution.target._tag;
|
|
1735
|
+
}, { expected: "graph node endpoint kind to match its resolved or expected target kind" }));
|
|
1736
|
+
/** Semantic relationship between delivery nodes. Direction is significant. */
|
|
1737
|
+
var RelationshipKind = Schema$1.Literals([
|
|
1738
|
+
"contains",
|
|
1739
|
+
"implements",
|
|
1740
|
+
"depends-on",
|
|
1741
|
+
"verified-by",
|
|
1742
|
+
"delivered-by",
|
|
1743
|
+
"documented-by",
|
|
1744
|
+
"tracks-time-for"
|
|
1745
|
+
]);
|
|
1746
|
+
var ALL_RELATIONSHIP_ENDPOINT_KINDS = [
|
|
1747
|
+
"issue",
|
|
1748
|
+
"pull-request",
|
|
1749
|
+
"page",
|
|
1750
|
+
"pipeline-execution",
|
|
1751
|
+
"deployment",
|
|
1752
|
+
"time-entry",
|
|
1753
|
+
"release",
|
|
1754
|
+
"environment"
|
|
1755
|
+
];
|
|
1756
|
+
/**
|
|
1757
|
+
* Version-one canonical direction matrix. Passive relationship names read from
|
|
1758
|
+
* source to target: for example, a pull request is `delivered-by` a pipeline
|
|
1759
|
+
* execution. `depends-on` is intentionally the one generic graph edge.
|
|
1760
|
+
*/
|
|
1761
|
+
var RELATIONSHIP_ENDPOINT_MATRIX_V1 = {
|
|
1762
|
+
"contains": {
|
|
1763
|
+
source: ["release"],
|
|
1764
|
+
target: [
|
|
1765
|
+
"issue",
|
|
1766
|
+
"pull-request",
|
|
1767
|
+
"page",
|
|
1768
|
+
"pipeline-execution",
|
|
1769
|
+
"deployment",
|
|
1770
|
+
"time-entry"
|
|
1771
|
+
]
|
|
1772
|
+
},
|
|
1773
|
+
"implements": {
|
|
1774
|
+
source: ["pull-request"],
|
|
1775
|
+
target: ["issue"]
|
|
1776
|
+
},
|
|
1777
|
+
"depends-on": {
|
|
1778
|
+
source: ALL_RELATIONSHIP_ENDPOINT_KINDS,
|
|
1779
|
+
target: ALL_RELATIONSHIP_ENDPOINT_KINDS
|
|
1780
|
+
},
|
|
1781
|
+
"verified-by": {
|
|
1782
|
+
source: ["pull-request"],
|
|
1783
|
+
target: ["pipeline-execution"]
|
|
1784
|
+
},
|
|
1785
|
+
"delivered-by": {
|
|
1786
|
+
source: ["pull-request"],
|
|
1787
|
+
target: ["pipeline-execution"]
|
|
1788
|
+
},
|
|
1789
|
+
"documented-by": {
|
|
1790
|
+
source: ["issue", "release"],
|
|
1791
|
+
target: ["page"]
|
|
1792
|
+
},
|
|
1793
|
+
"tracks-time-for": {
|
|
1794
|
+
source: ["time-entry"],
|
|
1795
|
+
target: ["issue"]
|
|
1796
|
+
}
|
|
1797
|
+
};
|
|
1798
|
+
var relationshipEndpointIsAllowed = (kind, sourceNodeKind, targetNodeKind) => {
|
|
1799
|
+
const rule = RELATIONSHIP_ENDPOINT_MATRIX_V1[kind];
|
|
1800
|
+
return rule.source.some((candidate) => candidate === sourceNodeKind) && rule.target.some((candidate) => candidate === targetNodeKind);
|
|
1801
|
+
};
|
|
1802
|
+
/** Explainable confidence; inferred links can never masquerade as confirmed. */
|
|
1803
|
+
var RelationshipConfidence = Schema$1.TaggedUnion({
|
|
1804
|
+
unknown: { rationale: boundedText(1e3, "UnknownRelationshipConfidenceRationale") },
|
|
1805
|
+
confirmed: {},
|
|
1806
|
+
inferred: {
|
|
1807
|
+
score: Schema$1.Number.check(Schema$1.isBetween({
|
|
1808
|
+
minimum: 0,
|
|
1809
|
+
maximum: 1
|
|
1810
|
+
})),
|
|
1811
|
+
rationale: boundedText(1e3, "RelationshipConfidenceRationale")
|
|
1812
|
+
}
|
|
1813
|
+
});
|
|
1814
|
+
/** Attribution for creation of a relationship revision. */
|
|
1815
|
+
var RelationshipProvenance = Schema$1.TaggedUnion({
|
|
1816
|
+
plugin: {
|
|
1817
|
+
pluginConnectionId: PluginConnectionId,
|
|
1818
|
+
sourceEntityId: EntityId,
|
|
1819
|
+
sourceEntityRevision: LedgerRevision
|
|
1820
|
+
},
|
|
1821
|
+
human: {
|
|
1822
|
+
personId: PersonId,
|
|
1823
|
+
rationale: boundedText(1e3, "HumanRelationshipRationale")
|
|
1824
|
+
},
|
|
1825
|
+
agent: {
|
|
1826
|
+
agentId: AgentId,
|
|
1827
|
+
rationale: boundedText(1e3, "AgentRelationshipRationale")
|
|
1828
|
+
},
|
|
1829
|
+
rule: {
|
|
1830
|
+
ruleId: boundedText(200, "RelationshipRuleId"),
|
|
1831
|
+
ruleVersion: Schema$1.Int.check(Schema$1.isGreaterThan(0)),
|
|
1832
|
+
rationale: boundedText(1e3, "RuleRelationshipRationale")
|
|
1833
|
+
}
|
|
1834
|
+
});
|
|
1835
|
+
/** Lifecycle of one relationship revision. Prior revisions remain immutable. */
|
|
1836
|
+
var RelationshipLifecycle = Schema$1.TaggedUnion({
|
|
1837
|
+
missing: {
|
|
1838
|
+
effectiveAt: UtcTimestamp,
|
|
1839
|
+
reason: boundedText(1e3, "MissingRelationshipReason")
|
|
1840
|
+
},
|
|
1841
|
+
inferred: { effectiveAt: UtcTimestamp },
|
|
1842
|
+
proposed: { effectiveAt: UtcTimestamp },
|
|
1843
|
+
verified: { effectiveAt: UtcTimestamp },
|
|
1844
|
+
governed: { effectiveAt: UtcTimestamp },
|
|
1845
|
+
rejected: {
|
|
1846
|
+
effectiveAt: UtcTimestamp,
|
|
1847
|
+
reason: boundedText(1e3, "RejectionReason")
|
|
1848
|
+
},
|
|
1849
|
+
superseded: {
|
|
1850
|
+
effectiveAt: UtcTimestamp,
|
|
1851
|
+
reason: boundedText(1e3, "SupersessionReason")
|
|
1852
|
+
}
|
|
1853
|
+
});
|
|
1854
|
+
/** Exact release or environment slice in which a relationship is evaluated. */
|
|
1855
|
+
var RelationshipScope = Schema$1.NullOr(Schema$1.TaggedUnion({
|
|
1856
|
+
release: { releaseId: ReleaseId },
|
|
1857
|
+
environment: {
|
|
1858
|
+
releaseId: ReleaseId,
|
|
1859
|
+
environmentId: EnvironmentId
|
|
1860
|
+
}
|
|
1861
|
+
}));
|
|
1862
|
+
/** Human, agent, or system that appended an immutable ledger revision. */
|
|
1863
|
+
var LedgerActor = Schema$1.TaggedUnion({
|
|
1864
|
+
human: { personId: PersonId },
|
|
1865
|
+
agent: { agentId: AgentId },
|
|
1866
|
+
system: { component: boundedText(200, "LedgerSystemComponent") }
|
|
1867
|
+
});
|
|
1868
|
+
/** Immutable relationship ledger revision. */
|
|
1869
|
+
var DeliveryRelationship = Schema$1.Struct({
|
|
1870
|
+
workspaceId: WorkspaceId,
|
|
1871
|
+
relationshipId: RelationshipId,
|
|
1872
|
+
relationshipSchemaVersion: Schema$1.Literal(1),
|
|
1873
|
+
revision: LedgerRevision,
|
|
1874
|
+
supersedesRevision: Schema$1.NullOr(LedgerRevision),
|
|
1875
|
+
kind: RelationshipKind,
|
|
1876
|
+
sourceNodeId: GraphNodeId,
|
|
1877
|
+
sourceNodeKind: RelationshipEndpointKind,
|
|
1878
|
+
targetNodeId: GraphNodeId,
|
|
1879
|
+
targetNodeKind: RelationshipEndpointKind,
|
|
1880
|
+
scope: RelationshipScope,
|
|
1881
|
+
lifecycle: RelationshipLifecycle,
|
|
1882
|
+
confidence: RelationshipConfidence,
|
|
1883
|
+
provenance: RelationshipProvenance,
|
|
1884
|
+
recordedBy: LedgerActor,
|
|
1885
|
+
evidenceClaimIds: Schema$1.Array(EvidenceClaimId).check(Schema$1.isMaxLength(128)),
|
|
1886
|
+
recordedAt: UtcTimestamp
|
|
1887
|
+
}).check(Schema$1.makeFilter(({ evidenceClaimIds }) => new Set(evidenceClaimIds).size === evidenceClaimIds.length, { expected: "relationship evidence references to be unique" }), Schema$1.makeFilter(({ confidence, evidenceClaimIds }) => confidence._tag !== "confirmed" || evidenceClaimIds.length > 0, { expected: "confirmed relationship confidence to reference immutable evidence" }), Schema$1.makeFilter(({ sourceNodeId, targetNodeId }) => sourceNodeId !== targetNodeId, { expected: "relationship source and target to differ" }), Schema$1.makeFilter(({ kind, sourceNodeKind, targetNodeKind }) => relationshipEndpointIsAllowed(kind, sourceNodeKind, targetNodeKind), { expected: "relationship endpoints to follow the canonical version-one direction matrix" }), Schema$1.makeFilter(({ kind, scope }) => kind !== "contains" || scope !== null, { expected: "release containment to carry an explicit release or environment scope" }), Schema$1.makeFilter(({ confidence, lifecycle }) => lifecycle._tag !== "inferred" || confidence._tag !== "confirmed", { expected: "an inferred relationship lifecycle not to claim confirmed confidence" }), Schema$1.makeFilter(({ revision, supersedesRevision }) => revision === 1 ? supersedesRevision === null : supersedesRevision === revision - 1, { expected: "relationship to supersede its exact preceding revision" }));
|
|
1888
|
+
/** Closed assertion vocabulary used by immutable evidence claims. */
|
|
1889
|
+
var EvidencePredicate = Schema$1.Literals([
|
|
1890
|
+
"relationship-observed",
|
|
1891
|
+
"status-observed",
|
|
1892
|
+
"approval-recorded",
|
|
1893
|
+
"check-observed",
|
|
1894
|
+
"execution-observed",
|
|
1895
|
+
"deployment-observed",
|
|
1896
|
+
"documentation-observed",
|
|
1897
|
+
"time-observed"
|
|
1898
|
+
]);
|
|
1899
|
+
/** Bounded, provider-neutral evidence value. */
|
|
1900
|
+
var EvidenceValue = Schema$1.TaggedUnion({
|
|
1901
|
+
flag: { value: Schema$1.Boolean },
|
|
1902
|
+
state: { value: boundedText(500, "EvidenceState") },
|
|
1903
|
+
revision: { value: boundedText(512, "EvidenceRevision") },
|
|
1904
|
+
reference: { targetNodeId: GraphNodeId }
|
|
1905
|
+
});
|
|
1906
|
+
/** Exact actor or source revision responsible for an evidence claim. */
|
|
1907
|
+
var EvidenceAttribution = Schema$1.TaggedUnion({
|
|
1908
|
+
plugin: {
|
|
1909
|
+
pluginConnectionId: PluginConnectionId,
|
|
1910
|
+
sourceEntityId: EntityId,
|
|
1911
|
+
sourceEntityRevision: LedgerRevision
|
|
1912
|
+
},
|
|
1913
|
+
human: { personId: PersonId },
|
|
1914
|
+
agent: { agentId: AgentId },
|
|
1915
|
+
system: { component: boundedText(200, "EvidenceSystemComponent") }
|
|
1916
|
+
});
|
|
1917
|
+
/** Explicit retention policy attached when evidence is recorded. */
|
|
1918
|
+
var EvidenceRetention = Schema$1.Struct({
|
|
1919
|
+
classification: Schema$1.Literals([
|
|
1920
|
+
"audit",
|
|
1921
|
+
"evidence",
|
|
1922
|
+
"normalized-cache"
|
|
1923
|
+
]),
|
|
1924
|
+
retainUntil: Schema$1.NullOr(UtcTimestamp),
|
|
1925
|
+
legalHold: Schema$1.Boolean
|
|
1926
|
+
});
|
|
1927
|
+
/** Independent verification of an evidence observation. */
|
|
1928
|
+
var EvidenceVerifier = Schema$1.TaggedUnion({
|
|
1929
|
+
human: { personId: PersonId },
|
|
1930
|
+
agent: { agentId: AgentId },
|
|
1931
|
+
system: { component: boundedText(200, "EvidenceVerifierComponent") }
|
|
1932
|
+
});
|
|
1933
|
+
/** Immutable observation envelope with provenance, validity, and retention. */
|
|
1934
|
+
var EvidenceItem = Schema$1.Struct({
|
|
1935
|
+
workspaceId: WorkspaceId,
|
|
1936
|
+
evidenceId: EvidenceId,
|
|
1937
|
+
schemaVersion: Schema$1.Int.check(Schema$1.isGreaterThan(0)),
|
|
1938
|
+
attribution: EvidenceAttribution,
|
|
1939
|
+
verifier: EvidenceVerifier,
|
|
1940
|
+
observedAt: UtcTimestamp,
|
|
1941
|
+
recordedAt: UtcTimestamp,
|
|
1942
|
+
validUntil: Schema$1.NullOr(UtcTimestamp),
|
|
1943
|
+
freshness: Freshness,
|
|
1944
|
+
retention: EvidenceRetention
|
|
1945
|
+
}).check(Schema$1.makeFilter(({ attribution, freshness }) => {
|
|
1946
|
+
if (attribution._tag !== "plugin") return true;
|
|
1947
|
+
return freshness.provenance._tag !== "none" && attribution.pluginConnectionId === freshness.provenance.sourceRevision.pluginConnectionId;
|
|
1948
|
+
}, { expected: "plugin evidence attribution to carry its exact freshness source revision" }), Schema$1.makeFilter(({ observedAt, recordedAt }) => DateTime$1.Order(observedAt, recordedAt) <= 0, { expected: "evidence observation time not to follow recording time" }), Schema$1.makeFilter(({ observedAt, validUntil }) => validUntil === null || DateTime$1.Order(observedAt, validUntil) < 0, { expected: "evidence validity to end after observation" }), Schema$1.makeFilter(({ recordedAt, retention }) => retention.retainUntil === null || DateTime$1.Order(recordedAt, retention.retainUntil) <= 0, { expected: "evidence retention not to end before recording" }));
|
|
1949
|
+
/** One immutable normalized claim derived from an evidence observation. */
|
|
1950
|
+
var EvidenceClaim = Schema$1.Struct({
|
|
1951
|
+
workspaceId: WorkspaceId,
|
|
1952
|
+
evidenceClaimId: EvidenceClaimId,
|
|
1953
|
+
evidenceId: EvidenceId,
|
|
1954
|
+
subjectNodeId: GraphNodeId,
|
|
1955
|
+
predicate: EvidencePredicate,
|
|
1956
|
+
value: EvidenceValue,
|
|
1957
|
+
recordedAt: UtcTimestamp,
|
|
1958
|
+
supersedesEvidenceClaimId: Schema$1.NullOr(EvidenceClaimId)
|
|
1959
|
+
}).check(Schema$1.makeFilter(({ evidenceClaimId, supersedesEvidenceClaimId }) => evidenceClaimId !== supersedesEvidenceClaimId, { expected: "evidence not to supersede itself" }));
|
|
1960
|
+
var sourceFreshnessAt = (freshness, at) => {
|
|
1961
|
+
if (freshness._tag !== "current") return freshness._tag;
|
|
1962
|
+
return DateTime$1.toEpochMillis(at) - DateTime$1.toEpochMillis(freshness.sourceObservedAt) < freshness.staleAfterSeconds * 1e3 ? "current" : "stale";
|
|
1963
|
+
};
|
|
1964
|
+
/** Determine source freshness and evidence validity at an injected instant. */
|
|
1965
|
+
var evidenceFreshnessAt = (evidence, at) => ({
|
|
1966
|
+
source: sourceFreshnessAt(evidence.freshness, at),
|
|
1967
|
+
validity: evidence.validUntil === null || DateTime$1.Order(at, evidence.validUntil) < 0 ? "valid" : "expired"
|
|
1968
|
+
});
|
|
1969
|
+
/** Determine whether retained evidence bytes are eligible for governed cleanup. */
|
|
1970
|
+
var evidenceRetentionEligibilityAt = (evidence, at) => !evidence.retention.legalHold && evidence.retention.retainUntil !== null && DateTime$1.Order(evidence.retention.retainUntil, at) <= 0 ? "eligible" : "retain";
|
|
1971
|
+
//#endregion
|
|
1972
|
+
//#region src/domain/relationshipRepair.ts
|
|
1973
|
+
/** Explicit decision proposed for an incomplete delivery relationship. */
|
|
1974
|
+
var RelationshipRepairDisposition = Schema$1.Literals([
|
|
1975
|
+
"link",
|
|
1976
|
+
"verify",
|
|
1977
|
+
"reject"
|
|
1978
|
+
]);
|
|
1979
|
+
/** Bounded human-readable justification stored with a repair proposal. */
|
|
1980
|
+
var RelationshipRepairRationale = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(1e3)).annotate({ identifier: "RelationshipRepairRationale" });
|
|
1981
|
+
/** Authenticated origin retained for proposal review and later audit. */
|
|
1982
|
+
var RelationshipRepairProposalOrigin = Schema$1.Struct({
|
|
1983
|
+
actor: Actor,
|
|
1984
|
+
sessionId: SessionId
|
|
1985
|
+
});
|
|
1986
|
+
/** Final reviewer decision over one exact proposal. */
|
|
1987
|
+
var RelationshipRepairReviewDecision = Schema$1.Literals(["approved", "rejected"]);
|
|
1988
|
+
/** Immutable review evidence retained with a finalized proposal. */
|
|
1989
|
+
var RelationshipRepairReview = Schema$1.Struct({
|
|
1990
|
+
reviewId: RelationshipRepairReviewId,
|
|
1991
|
+
decision: RelationshipRepairReviewDecision,
|
|
1992
|
+
rationale: RelationshipRepairRationale,
|
|
1993
|
+
origin: RelationshipRepairProposalOrigin,
|
|
1994
|
+
reviewedAt: UtcTimestamp
|
|
1995
|
+
}).annotate({ identifier: "RelationshipRepairReview" });
|
|
1996
|
+
/** Immutable evidence that one approved proposal appended an exact ledger revision. */
|
|
1997
|
+
var RelationshipRepairApplication = Schema$1.Struct({
|
|
1998
|
+
proposalId: RelationshipRepairProposalId,
|
|
1999
|
+
relationshipId: RelationshipId,
|
|
2000
|
+
appliedRevision: LedgerRevision,
|
|
2001
|
+
origin: RelationshipRepairProposalOrigin,
|
|
2002
|
+
appliedAt: UtcTimestamp
|
|
2003
|
+
}).annotate({ identifier: "RelationshipRepairApplication" });
|
|
2004
|
+
/** Durable proposal bound to one exact immutable relationship revision. */
|
|
2005
|
+
var RelationshipRepairProposal = Schema$1.Struct({
|
|
2006
|
+
schemaVersion: Schema$1.Literal(2),
|
|
2007
|
+
proposalId: RelationshipRepairProposalId,
|
|
2008
|
+
workspaceId: WorkspaceId,
|
|
2009
|
+
releaseId: ReleaseId,
|
|
2010
|
+
environmentId: Schema$1.NullOr(EnvironmentId),
|
|
2011
|
+
relationshipId: RelationshipId,
|
|
2012
|
+
expectedRevision: LedgerRevision,
|
|
2013
|
+
disposition: RelationshipRepairDisposition,
|
|
2014
|
+
rationale: RelationshipRepairRationale,
|
|
2015
|
+
origin: RelationshipRepairProposalOrigin,
|
|
2016
|
+
status: Schema$1.Literals([
|
|
2017
|
+
"pending",
|
|
2018
|
+
"approved",
|
|
2019
|
+
"rejected"
|
|
2020
|
+
]),
|
|
2021
|
+
proposedAt: UtcTimestamp,
|
|
2022
|
+
review: Schema$1.NullOr(RelationshipRepairReview)
|
|
2023
|
+
}).annotate({ identifier: "RelationshipRepairProposal" });
|
|
2024
|
+
//#endregion
|
|
2025
|
+
//#region src/domain/timeline.ts
|
|
2026
|
+
/** Actor classes that can contribute durable activity to a workspace Timeline. */
|
|
2027
|
+
var TimelineActorKind = Schema$1.Literals([
|
|
2028
|
+
"agent",
|
|
2029
|
+
"human",
|
|
2030
|
+
"plugin",
|
|
2031
|
+
"system"
|
|
2032
|
+
]);
|
|
2033
|
+
/** Durable source streams merged by the Timeline projection. */
|
|
2034
|
+
var TimelineSourceKind = Schema$1.Literals([
|
|
2035
|
+
"action",
|
|
2036
|
+
"plugin-sync",
|
|
2037
|
+
"relationship",
|
|
2038
|
+
"system"
|
|
2039
|
+
]);
|
|
2040
|
+
/** Connected provider identity retained when a durable event has provenance. */
|
|
2041
|
+
var TimelineService = Schema$1.Literals([
|
|
2042
|
+
"codecommit",
|
|
2043
|
+
"codepipeline",
|
|
2044
|
+
"jira",
|
|
2045
|
+
"confluence",
|
|
2046
|
+
"clockify"
|
|
2047
|
+
]);
|
|
2048
|
+
/** Stable cursor for newest-first Timeline pagination. */
|
|
2049
|
+
var TimelineCursor = Schema$1.Struct({
|
|
2050
|
+
eventKey: Schema$1.String.check(Schema$1.isNonEmpty(), Schema$1.isMaxLength(1024)),
|
|
2051
|
+
occurredAt: UtcTimestamp
|
|
2052
|
+
}).annotate({ identifier: "TimelineCursor" });
|
|
2053
|
+
/** Default-redacted, human-readable event from one durable workspace source. */
|
|
2054
|
+
var TimelineEvent = Schema$1.Struct({
|
|
2055
|
+
eventKey: TimelineCursor.fields.eventKey,
|
|
2056
|
+
occurredAt: UtcTimestamp,
|
|
2057
|
+
actor: Schema$1.Struct({
|
|
2058
|
+
kind: TimelineActorKind,
|
|
2059
|
+
label: Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(200))
|
|
2060
|
+
}),
|
|
2061
|
+
sourceKind: TimelineSourceKind,
|
|
2062
|
+
service: Schema$1.NullOr(TimelineService),
|
|
2063
|
+
eventType: Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(200)),
|
|
2064
|
+
title: Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(300)),
|
|
2065
|
+
href: Schema$1.NullOr(Schema$1.String.check(Schema$1.isNonEmpty(), Schema$1.isMaxLength(2048)))
|
|
2066
|
+
}).annotate({ identifier: "TimelineEvent" });
|
|
2067
|
+
var TimelineRawIdentifier = Schema$1.String.check(Schema$1.isNonEmpty(), Schema$1.isMaxLength(2048));
|
|
2068
|
+
/** Owner-visible durable identifiers for one exact Timeline event. */
|
|
2069
|
+
var TimelineEventIdentifiers = Schema$1.Struct({
|
|
2070
|
+
actorId: Schema$1.NullOr(TimelineRawIdentifier),
|
|
2071
|
+
actionId: Schema$1.NullOr(TimelineRawIdentifier),
|
|
2072
|
+
relationshipId: Schema$1.NullOr(TimelineRawIdentifier),
|
|
2073
|
+
pluginConnectionId: Schema$1.NullOr(TimelineRawIdentifier),
|
|
2074
|
+
releaseId: Schema$1.NullOr(TimelineRawIdentifier),
|
|
2075
|
+
entityId: Schema$1.NullOr(TimelineRawIdentifier)
|
|
2076
|
+
}).annotate({ identifier: "TimelineEventIdentifiers" });
|
|
2077
|
+
/** Owner-visible reference to the local agent job attributable to an event. */
|
|
2078
|
+
var TimelineAgentJobDetail = Schema$1.Struct({ jobId: TimelineRawIdentifier }).annotate({ identifier: "TimelineAgentJobDetail" });
|
|
2079
|
+
/** Deliberate owner-only expansion of one otherwise redacted Timeline event. */
|
|
2080
|
+
var TimelineEventDetail = Schema$1.Struct({
|
|
2081
|
+
event: TimelineEvent,
|
|
2082
|
+
identifiers: TimelineEventIdentifiers,
|
|
2083
|
+
agentJob: Schema$1.NullOr(TimelineAgentJobDetail)
|
|
2084
|
+
}).annotate({ identifier: "TimelineEventDetail" });
|
|
2085
|
+
/** One bounded Timeline page. */
|
|
2086
|
+
var TimelinePage = Schema$1.Struct({
|
|
2087
|
+
events: Schema$1.Array(TimelineEvent).check(Schema$1.makeFilter((events) => events.length <= 100, { expected: "at most 100 Timeline events" })),
|
|
2088
|
+
nextCursor: Schema$1.NullOr(TimelineCursor)
|
|
2089
|
+
}).annotate({ identifier: "TimelinePage" });
|
|
2090
|
+
//#endregion
|
|
2091
|
+
//#region src/domain/domainEvent.ts
|
|
2092
|
+
var jsonEncoder = new TextEncoder();
|
|
2093
|
+
var hasMaximumJsonBytes = (maximumBytes) => Schema$1.makeFilter((value) => {
|
|
2094
|
+
const serialized = JSON.stringify(value);
|
|
2095
|
+
return serialized !== void 0 && jsonEncoder.encode(serialized).byteLength <= maximumBytes;
|
|
2096
|
+
}, { expected: `JSON encoded as at most ${maximumBytes} UTF-8 bytes` });
|
|
2097
|
+
var PersistedEventCursor = EventCursor.check(Schema$1.isGreaterThan(0));
|
|
2098
|
+
/** Maximum decoded JSON carried by one durable domain event. */
|
|
2099
|
+
var MaximumDomainEventPayloadBytes = 65536;
|
|
2100
|
+
/** Bounded trace identifier safe to persist independently of the HTTP API. */
|
|
2101
|
+
var DomainEventCorrelationId = Schema$1.String.check(Schema$1.isTrimmed(), Schema$1.isNonEmpty(), Schema$1.isMaxLength(128), Schema$1.isPattern(/^[A-Za-z0-9._:-]+$/u, { expected: "a domain-safe correlation identifier" })).pipe(Schema$1.brand("DomainEventCorrelationId"));
|
|
2102
|
+
/** Optional normalized identities explaining which portfolio facts changed. */
|
|
2103
|
+
var DomainEventMetadataV1 = Schema$1.Struct({
|
|
2104
|
+
releaseId: Schema$1.optionalKey(ReleaseId),
|
|
2105
|
+
pluginConnectionId: Schema$1.optionalKey(PluginConnectionId),
|
|
2106
|
+
entityId: Schema$1.optionalKey(EntityId),
|
|
2107
|
+
jobId: Schema$1.optionalKey(JobId)
|
|
2108
|
+
}).annotate({ identifier: "DomainEventMetadataV1" });
|
|
2109
|
+
/** Portfolio projection that must be refreshed after a durable invalidation. */
|
|
2110
|
+
var PortfolioInvalidationReason = Schema$1.Literals(["release-projection", "plugin-health"]);
|
|
2111
|
+
/** Bounded typed payload persisted with a portfolio invalidation. */
|
|
2112
|
+
var PortfolioInvalidatedPayloadV1 = Schema$1.Struct({ reason: PortfolioInvalidationReason }).check(hasMaximumJsonBytes(MaximumDomainEventPayloadBytes)).annotate({ identifier: "PortfolioInvalidatedPayloadV1" });
|
|
2113
|
+
/** Durable workspace-local event declaring that the authoritative portfolio changed. */
|
|
2114
|
+
var PortfolioInvalidatedEventV1 = Schema$1.Struct({
|
|
2115
|
+
schemaVersion: Schema$1.Literal(1),
|
|
2116
|
+
eventId: DomainEventId,
|
|
2117
|
+
eventCursor: PersistedEventCursor,
|
|
2118
|
+
workspaceId: WorkspaceId,
|
|
2119
|
+
eventType: Schema$1.Literal("portfolio-invalidated"),
|
|
2120
|
+
occurredAt: UtcTimestamp,
|
|
2121
|
+
ingestedAt: UtcTimestamp,
|
|
2122
|
+
causationId: Schema$1.NullOr(DomainEventId),
|
|
2123
|
+
correlationId: Schema$1.NullOr(DomainEventCorrelationId),
|
|
2124
|
+
metadata: DomainEventMetadataV1,
|
|
2125
|
+
payload: PortfolioInvalidatedPayloadV1
|
|
2126
|
+
}).annotate({ identifier: "PortfolioInvalidatedEventV1" });
|
|
2127
|
+
//#endregion
|
|
2128
|
+
export { MAXIMUM_NORMALIZED_ISSUE_HISTORY as $, readinessObservationIsDeliveryActivity as $n, MAX_READINESS_EVIDENCE_REFERENCES as $t, EvidenceAttribution as A, ReadinessVerdict as An, GovernedActionAuthorizationId as Ar, ReleaseRelayAlgorithm as At, RelationshipConfidence as B, deriveReadinessStages as Bn, RelationshipRepairProposalId as Br, HumanActor as Bt, DeliveryEntityDetails as C, ReadinessReleaseRevision as Cn, EntityId as Cr, ReleaseServiceName as Ct, DeliveryEntityStatusGroup as D, ReadinessScope as Dn, EvidenceId as Dr, RELEASE_RELAY_V1_ALGORITHM as Dt, DeliveryEntityService as E, ReadinessRuleVersion as En, EvidenceClaimId as Er, RELEASE_RELAY_V1_ADJECTIVES as Et, EvidenceValue as F, compareReadinessText as Fn, PersonId as Fr, ReleaseRelaySymbolIndices as Ft, RelationshipScope as G, deriveReleaseReadinessVerdict as Gn, ShareId as Gr, RoleAssignment as Gt, RelationshipKind as H, deriveReleaseReadinessNextEvaluationAt as Hn, ReleaseId as Hr, PersonAvatar as Ht, EvidenceVerifier as I, deriveEnvironmentReadinessVerdict as In, PluginConnectionId as Ir, deriveReleaseRelay as It, evidenceRetentionEligibilityAt as J, readinessFactResult as Jn, BuildReadinessStage as Jt, ResolvedDeliveryNode as K, readinessDefinitionsShapeIsV1 as Kn, WorkspaceId as Kr, RoleScope as Kt, LedgerActor as L, deriveReadinessFindings as Ln, ProviderAccountId as Lr, Actor as Lt, EvidenceItem as M, ReleaseReadinessCandidateIdentity as Mn, GovernedActionTransitionId as Mr, ReleaseRelayNoun as Mt, EvidencePredicate as N, ReleaseReadinessRollupInput as Nn, GraphNodeId as Nr, ReleaseRelayProjection as Nt, DeliveryNode as O, ReadinessSourceSummary as On, FollowedResourceId as Or, RELEASE_RELAY_V1_NOUNS as Ot, EvidenceRetention as P, VerifyReadinessStage as Pn, JobId as Pr, ReleaseRelaySymbolIndex as Pt, MAXIMUM_NORMALIZED_ISSUE_FIX_VERSIONS as Q, readinessObservationIsCurrent as Qn, EnvironmentReadinessSummary as Qt, LedgerRevision as R, deriveReadinessNextEvaluationAt as Rn, ReadinessAssessmentId as Rr, AgentActor as Rt, RelationshipRepairReviewDecision as S, ReadinessProgress as Sn, DomainEventId as Sr, ReleaseLifecycle as St, DeliveryEntityProjection as T, ReadinessRuleReference as Tn, EventCursor as Tr, RELEASE_RELAY_ALGORITHM as Tt, RelationshipLifecycle as U, deriveReleaseReadinessSourceSummaries as Un, RoleAssignmentId as Ur, PersonSourceIdentity as Ut, RelationshipEndpointKind as V, deriveReleaseReadinessFindings as Vn, RelationshipRepairReviewId as Vr, Person as Vt, RelationshipProvenance as W, deriveReleaseReadinessStages as Wn, SessionId as Wr, Role as Wt, MAXIMUM_NORMALIZED_ISSUE_COMMENTS as X, readinessFindingKey as Xn, EnvironmentReadinessCandidateIdentity as Xt, MAXIMUM_NORMALIZED_ISSUE_COLLABORATORS as Y, readinessFailureCode as Yn, EnvironmentReadinessAssessment as Yt, MAXIMUM_NORMALIZED_ISSUE_COMPONENTS as Z, readinessNonPositiveCode as Zn, EnvironmentReadinessEvaluationInput as Zt, RelationshipRepairDisposition as _, ReadinessFactResult as _n, SourceUrl as _r, PluginConfigurationFieldV1 as _t, PortfolioInvalidatedPayloadV1 as a, ReadinessAssessment as an, MaximumPluginPayloadBytes as ar, NormalizedIssueComment as at, RelationshipRepairRationale as b, ReadinessFindingCode as bn, AgentId as br, SemanticVersion as bt, TimelineAgentJobDetail as c, ReadinessDerivationVersion as cn, hasMaximumPluginJsonBytes as cr, NormalizedIssueHistoryEntry as ct, TimelineEventDetail as d, ReadinessFactDefinition as dn, PluginHealth as dr, NormalizedIssueTruncatedField as dt, MAX_READINESS_FINDINGS as en, readinessObservationIsPositive as er, MAXIMUM_NORMALIZED_ISSUE_HISTORY_CHANGES as et, TimelineEventIdentifiers as f, ReadinessFactEvaluation as fn, evaluateFreshnessAt as fr, NormalizedRelatedIssue as ft, RelationshipRepairApplication as g, ReadinessFactRequirement as gn, SourceRevision as gr, PluginCapabilityOfferV1 as gt, TimelineSourceKind as h, ReadinessFactObservation as hn, Revision as hr, PluginCapabilityId as ht, PortfolioInvalidatedEventV1 as i, ReadinessArtifactRevision as in, MaximumPluginDescriptorBytes as ir, NormalizedIssueCollaborator as it, EvidenceClaim as j, ReleaseReadinessAssessment as jn, GovernedActionId as jr, ReleaseRelayCodename as jt, DeliveryRelationship as k, ReadinessStages as kn, GovernedActionAttemptId as kr, ReleaseRelayAdjective as kt, TimelineCursor as l, ReadinessEvidenceReference as ln, Freshness as lr, NormalizedIssueNamedValue as lt, TimelineService as m, ReadinessFactKind as mn, ProviderId as mr, NegotiatedPluginDescriptorV1 as mt, DomainEventMetadataV1 as n, READINESS_DERIVATION_VERSION_V1 as nn, readinessStagesAreEqual as nr, MAXIMUM_NORMALIZED_ISSUE_SUBTASKS as nt, PortfolioInvalidationReason as o, ReadinessCandidateDigest as on, MaximumPluginSyncPageBytes as or, NormalizedIssueFixVersion as ot, TimelinePage as p, ReadinessFactId as pn, NormalizationSchemaVersion as pr, NegotiatedPluginCapabilityV1 as pt, evidenceFreshnessAt as q, readinessEvidenceIsCurrent as qn, derivePersonInitials as qt, MaximumDomainEventPayloadBytes as r, READINESS_RULE_VERSION_V1 as rn, sortedReadinessUnique as rr, NormalizedIssueAttributes as rt, TimelineActorKind as s, ReadinessCandidateIdentity as sn, PluginPayloadJson as sr, NormalizedIssueHistoryChange as st, DomainEventCorrelationId as t, ProductionReadinessStage as tn, readinessPolicyShapeIsV1 as tr, MAXIMUM_NORMALIZED_ISSUE_LABELS as tt, TimelineEvent as u, ReadinessEvidenceSource as un, PluginFailureClass as ur, NormalizedIssueProject as ut, RelationshipRepairProposal as v, ReadinessFactState as vn, VendorImmutableId as vr, PluginDescriptorV1 as vt, DeliveryEntityKind as w, ReadinessRuleId as wn, EnvironmentId as wr, ReleaseVersion as wt, RelationshipRepairReview as x, ReadinessFindingSubject as xn, AgentThreadId as xr, Release as xt, RelationshipRepairProposalOrigin as y, ReadinessFinding as yn, UtcTimestamp as yr, PluginId as yt, RELATIONSHIP_ENDPOINT_MATRIX_V1 as z, deriveReadinessSourceSummaries as zn, RelationshipId as zr, AssignmentLifecycle as zt };
|
|
2129
|
+
|
|
2130
|
+
//# sourceMappingURL=domainEvent-x7yeq-gU.js.map
|