@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 @@
|
|
|
1
|
+
{"version":3,"file":"ServicesPage-CoMVH2Si.js","names":[],"sources":["../../../src/client/services/AtlassianAccountSetupForm.module.css","../../../src/client/services/serviceSetupValues.ts","../../../src/client/services/AtlassianAccountSetupForm.tsx","../../../src/client/services/AwsAccountSetupForm.module.css","../../../src/client/services/AwsAccountSetupForm.tsx","../../../src/client/services/ServicesPage.module.css","../../../src/client/services/ConnectionTestEvidence.tsx","../../../src/client/services/ConnectionSynchronization.tsx","../../../src/client/services/connectionState.ts","../../../src/client/services/ProviderAccountCard.tsx","../../../src/client/services/ServicesPage.tsx"],"sourcesContent":[".form,\n.intro,\n.fallback {\n display: grid;\n gap: var(--rly-space-12);\n}\n\n.form {\n gap: var(--rly-space-20);\n}\n\n.intro {\n gap: var(--rly-space-4);\n}\n\n.resources {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--rly-space-12);\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--rly-space-8);\n}\n\n.error {\n color: var(--rly-color-blocked-ink);\n}\n\n@media (max-width: 40rem) {\n .resources {\n grid-template-columns: 1fr;\n }\n}\n","import type { CreatePluginConnectionValue, PluginServiceCatalogEntry } from \"../../api/plugins.js\"\n\n/** One provider adapter connection assembled by a setup workflow. */\nexport interface ServiceConnectionDraft {\n readonly catalog: PluginServiceCatalogEntry\n readonly displayName: string\n readonly values: ReadonlyArray<CreatePluginConnectionValue>\n}\n\n/** Convert one browser field value into the catalog-declared setup variant. */\nexport const serviceSetupValue = (\n field: PluginServiceCatalogEntry[\"configurationFields\"][number],\n value: string\n): CreatePluginConnectionValue => {\n switch (field.kind) {\n case \"integer\":\n return { _tag: \"integer\", key: field.key, value: Number(value) }\n case \"secret\":\n return { _tag: \"secret\", key: field.key, value }\n case \"text\":\n case \"url\":\n return { _tag: field.kind, key: field.key, value }\n }\n}\n\n/** Build a complete setup value list from catalog defaults and explicit overrides. */\nexport const serviceSetupValues = (\n catalog: PluginServiceCatalogEntry,\n overrides: ReadonlyMap<string, string>\n): ReadonlyArray<CreatePluginConnectionValue> =>\n catalog.configurationFields.flatMap((field) => {\n const value = overrides.get(field.key) ?? field.defaultValue\n return value === null && !field.required ? [] : [serviceSetupValue(field, value ?? \"\")]\n })\n","import { Button, Field, Text } from \"@knpkv/rly/primitives\"\nimport { type FormEvent, type ReactElement, useEffect, useRef, useState } from \"react\"\n\nimport type {\n AtlassianOAuthGrantStartResponse,\n AtlassianOAuthClientConfiguration,\n AtlassianOAuthProviderIntent,\n AtlassianProfileDiscoveryResponse,\n DiscoveredAtlassianProfile,\n PluginServiceCatalogEntry\n} from \"../../api/plugins.js\"\nimport styles from \"./AtlassianAccountSetupForm.module.css\"\nimport { rememberAtlassianOAuthSetupIntent } from \"./atlassianOAuthSetupIntentStorage.js\"\nimport { type ServiceConnectionDraft, serviceSetupValues } from \"./serviceSetupValues.js\"\n\ntype AuthenticationMode = \"oauth\" | \"api-token\"\nexport interface AtlassianSetupIntent {\n readonly preferredProfileId: string | null\n readonly preferredSiteId: string | null\n readonly providers: AtlassianOAuthProviderIntent\n readonly requestedOAuthProviders: AtlassianOAuthProviderIntent | null\n}\n\nconst selectedProfile = (\n profiles: AtlassianProfileDiscoveryResponse,\n profileId: string\n): DiscoveredAtlassianProfile | undefined => profiles.find((profile) => profile.profileId === profileId)\n\nconst isUsableProfile = (profile: DiscoveredAtlassianProfile, intent: AtlassianSetupIntent): boolean =>\n profile.status === \"valid\" &&\n (intent.preferredSiteId === null || profile.cloudId === intent.preferredSiteId) &&\n intent.providers.every((providerId) => profile.providers.includes(providerId))\n\nconst profileAvailability = (profile: DiscoveredAtlassianProfile): string => {\n if (profile.status === \"expired\") return \"expired\"\n if (!profile.providers.includes(\"jira\")) return \"Confluence only\"\n if (!profile.providers.includes(\"confluence\")) return \"Jira only\"\n return \"Jira + Confluence\"\n}\n\n/** Configure Jira and Confluence beneath one shared Atlassian identity. */\nexport const AtlassianAccountSetupForm = ({\n catalogs,\n isSubmitting,\n onCancel,\n onStartOAuth,\n onSubmit,\n profiles,\n profilesState,\n setupIntent\n}: {\n readonly catalogs: ReadonlyArray<PluginServiceCatalogEntry>\n readonly isSubmitting: boolean\n readonly onCancel: () => void\n readonly onStartOAuth: (\n providers: AtlassianOAuthProviderIntent,\n signal: AbortSignal,\n configuration?: AtlassianOAuthClientConfiguration\n ) => Promise<AtlassianOAuthGrantStartResponse>\n readonly onSubmit: (drafts: ReadonlyArray<ServiceConnectionDraft>) => Promise<boolean>\n readonly profiles: AtlassianProfileDiscoveryResponse\n readonly profilesState: \"failed\" | \"idle\" | \"loading\" | \"ready\"\n readonly setupIntent: AtlassianSetupIntent\n}): ReactElement => {\n const jira = catalogs.find(({ providerId }) => providerId === \"jira\")\n const confluence = catalogs.find(({ providerId }) => providerId === \"confluence\")\n const setupJira = setupIntent.providers.includes(\"jira\")\n const setupConfluence = setupIntent.providers.includes(\"confluence\")\n const [accountName, setAccountName] = useState(\"Atlassian workspace\")\n const [authenticationMode, setAuthenticationMode] = useState<AuthenticationMode>(\"oauth\")\n const [profileId, setProfileId] = useState(\"\")\n const [siteUrl, setSiteUrl] = useState(\"\")\n const [siteId, setSiteId] = useState(\"\")\n const [projectId, setProjectId] = useState(\"\")\n const [spaceId, setSpaceId] = useState(\"\")\n const [probePageId, setProbePageId] = useState(\"\")\n const [email, setEmail] = useState(\"\")\n const [apiToken, setApiToken] = useState(\"\")\n const [isStartingOAuth, setIsStartingOAuth] = useState(false)\n const [oauthCallbackUrl, setOAuthCallbackUrl] = useState<string | null>(null)\n const [oauthClientId, setOAuthClientId] = useState(\"\")\n const [oauthClientSecret, setOAuthClientSecret] = useState(\"\")\n const [setupError, setSetupError] = useState<string | null>(null)\n const startRequest = useRef<AbortController | null>(null)\n\n useEffect(() => () => startRequest.current?.abort(), [])\n\n useEffect(() => {\n if (authenticationMode !== \"oauth\") return\n const currentProfile = selectedProfile(profiles, profileId)\n if (currentProfile !== undefined && isUsableProfile(currentProfile, setupIntent)) return\n const preferredProfile =\n setupIntent.preferredProfileId === null ? undefined : selectedProfile(profiles, setupIntent.preferredProfileId)\n const initialProfile =\n preferredProfile !== undefined && isUsableProfile(preferredProfile, setupIntent)\n ? preferredProfile\n : profiles.find((profile) => isUsableProfile(profile, setupIntent))\n setProfileId(initialProfile?.profileId ?? \"\")\n }, [authenticationMode, profileId, profiles, setupIntent])\n\n useEffect(() => {\n if (setupIntent.preferredSiteId !== null) setSiteId(setupIntent.preferredSiteId)\n }, [setupIntent.preferredSiteId])\n\n useEffect(() => {\n if (authenticationMode !== \"oauth\") return\n const profile = selectedProfile(profiles, profileId)\n if (profile === undefined) return\n setSiteUrl(profile.siteUrl)\n setSiteId(profile.cloudId)\n }, [authenticationMode, profileId, profiles])\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n setSetupError(null)\n if ((setupJira && jira === undefined) || (setupConfluence && confluence === undefined)) {\n setSetupError(\"The installed Atlassian adapters are unavailable.\")\n return\n }\n const normalizedAccountName = accountName.trim()\n const normalizedSiteUrl = siteUrl.trim()\n const normalizedSiteId = siteId.trim()\n const normalizedProjectId = projectId.trim()\n const normalizedSpaceId = spaceId.trim()\n const normalizedProbePageId = probePageId.trim()\n if (\n normalizedAccountName.length === 0 ||\n normalizedSiteUrl.length === 0 ||\n normalizedSiteId.length === 0 ||\n (setupJira && normalizedProjectId.length === 0) ||\n (setupConfluence && (normalizedSpaceId.length === 0 || normalizedProbePageId.length === 0))\n ) {\n setSetupError(\n setupJira && setupConfluence\n ? \"Add the Atlassian site identity, Jira project, Confluence space, and readable health page.\"\n : setupJira\n ? \"Add the Atlassian site identity and Jira project.\"\n : \"Add the Atlassian site identity, Confluence space, and readable health page.\"\n )\n return\n }\n const authentication: ReadonlyArray<readonly [string, string]> =\n authenticationMode === \"oauth\"\n ? [\n [\"authMode\", \"oauth\"],\n [\"oauthProfileId\", profileId]\n ]\n : [\n [\"authMode\", \"api-token\"],\n [\"email\", email.trim()],\n [\"apiToken\", apiToken]\n ]\n const oauthProfile = selectedProfile(profiles, profileId)\n if (authenticationMode === \"oauth\" && (oauthProfile === undefined || !isUsableProfile(oauthProfile, setupIntent))) {\n setSetupError(\"Choose a valid profile for the products being connected, or use an API token instead.\")\n return\n }\n if (authenticationMode === \"api-token\" && (email.trim().length === 0 || apiToken.length === 0)) {\n setSetupError(\"Add the Atlassian email and API token.\")\n return\n }\n if (authenticationMode === \"api-token\" && setupJira && setupIntent.preferredSiteId !== null) {\n setSetupError(\"Use a matching OAuth profile to add a Jira project to this Atlassian site.\")\n return\n }\n const sharedValues: ReadonlyArray<readonly [string, string]> = [\n ...authentication,\n [\"webBaseUrl\", normalizedSiteUrl],\n [\"siteBaseUrl\", normalizedSiteUrl],\n [\"siteId\", normalizedSiteId],\n [\"projectId\", normalizedProjectId],\n [\"spaceId\", normalizedSpaceId],\n [\"probePageId\", normalizedProbePageId]\n ]\n const overrides = new Map<string, string>(sharedValues)\n const drafts: ReadonlyArray<ServiceConnectionDraft> = [\n ...(setupJira && jira !== undefined\n ? [\n {\n catalog: jira,\n displayName: `${normalizedAccountName} · Jira`,\n values: serviceSetupValues(jira, overrides)\n }\n ]\n : []),\n ...(setupConfluence && confluence !== undefined\n ? [\n {\n catalog: confluence,\n displayName: `${normalizedAccountName} · Confluence`,\n values: serviceSetupValues(confluence, overrides)\n }\n ]\n : [])\n ]\n void onSubmit(drafts).then((didCreate) => {\n if (!didCreate) setSetupError(\"Some Atlassian services could not be connected. Review the cards below and retry.\")\n })\n }\n\n const startOAuth = (configuration?: AtlassianOAuthClientConfiguration): void => {\n if (setupIntent.requestedOAuthProviders === null) return\n setSetupError(null)\n setOAuthCallbackUrl(null)\n setIsStartingOAuth(true)\n startRequest.current?.abort()\n const request = new AbortController()\n startRequest.current = request\n void onStartOAuth(setupIntent.requestedOAuthProviders, request.signal, configuration).then(\n (result) => {\n if (request.signal.aborted) return\n if (result._tag === \"configuration-required\") {\n setOAuthCallbackUrl(result.callbackUrl)\n setSetupError(\"OAuth needs a one-time local client configuration before sign-in.\")\n setIsStartingOAuth(false)\n return\n }\n if (\n !rememberAtlassianOAuthSetupIntent(result.authorizationUrl, {\n preferredSiteId: setupIntent.preferredSiteId,\n providers: setupIntent.providers\n })\n ) {\n setSetupError(\"Control Center could not preserve this Atlassian setup across sign-in. Try again.\")\n setIsStartingOAuth(false)\n return\n }\n window.location.assign(result.authorizationUrl)\n },\n () => {\n if (request.signal.aborted) return\n setSetupError(\"Control Center could not start Atlassian sign-in. Try again.\")\n setIsStartingOAuth(false)\n }\n )\n }\n\n const configureOAuth = (): void => {\n const clientId = oauthClientId.trim()\n if (clientId.length === 0 || oauthClientSecret.length === 0) {\n setSetupError(\"Add the Atlassian OAuth client ID and client secret.\")\n return\n }\n startOAuth({ clientId, clientSecret: oauthClientSecret })\n }\n\n const useApiToken = (): void => {\n startRequest.current?.abort()\n startRequest.current = null\n setIsStartingOAuth(false)\n setAuthenticationMode(\"api-token\")\n }\n\n const discoveryMessage =\n profilesState === \"loading\"\n ? \"Finding local Atlassian OAuth profiles…\"\n : profilesState === \"failed\"\n ? \"OAuth profile discovery is unavailable. API token fallback remains available.\"\n : profilesState === \"ready\"\n ? `${profiles.filter((profile) => isUsableProfile(profile, setupIntent)).length} ${setupJira && setupConfluence ? \"shared \" : \"\"}OAuth ${profiles.filter((profile) => isUsableProfile(profile, setupIntent)).length === 1 ? \"profile\" : \"profiles\"} ready`\n : \"OAuth profiles stay on this machine and are shared by Jira and Confluence.\"\n\n return (\n <form className={styles.form} onSubmit={submit}>\n <div className={styles.intro}>\n <Text as=\"h3\" variant=\"card-title\">\n {setupJira && setupConfluence\n ? \"One identity. Jira and Confluence together.\"\n : setupJira\n ? \"Connect Jira with your Atlassian identity.\"\n : \"Connect Confluence with your Atlassian identity.\"}\n </Text>\n <Text tone=\"secondary\" variant=\"body\">\n OAuth is preferred. Control Center reads the selected local profile only inside the server runtime.\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n {discoveryMessage}\n </Text>\n </div>\n <Field label=\"Account name\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n maxLength={90}\n onChange={(event) => setAccountName(event.currentTarget.value)}\n value={accountName}\n />\n )}\n </Field>\n {authenticationMode === \"oauth\" ? (\n <>\n <Button\n disabled={setupIntent.requestedOAuthProviders === null}\n loading={isStartingOAuth}\n onClick={() => startOAuth()}\n type=\"button\"\n variant=\"primary\"\n >\n Sign in with Atlassian\n </Button>\n {oauthCallbackUrl === null ? null : (\n <div className={styles.fallback}>\n <Text as=\"p\" tone=\"secondary\" variant=\"meta\">\n Create an OAuth 2.0 integration in Atlassian Developer Console and add <code>{oauthCallbackUrl}</code>\n as its callback URL. The credentials stay on this Control Center machine.\n </Text>\n <Field label=\"OAuth client ID\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n autoComplete=\"off\"\n maxLength={500}\n onChange={(event) => setOAuthClientId(event.currentTarget.value)}\n value={oauthClientId}\n />\n )}\n </Field>\n <Field label=\"OAuth client secret\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n autoComplete=\"off\"\n maxLength={16_384}\n onChange={(event) => setOAuthClientSecret(event.currentTarget.value)}\n type=\"password\"\n value={oauthClientSecret}\n />\n )}\n </Field>\n <Button loading={isStartingOAuth} onClick={configureOAuth} type=\"button\" variant=\"primary\">\n Save OAuth app and continue\n </Button>\n </div>\n )}\n <Field label=\"OAuth profile\" required size=\"compact\">\n {(controlProps) => (\n <select {...controlProps} onChange={(event) => setProfileId(event.currentTarget.value)} value={profileId}>\n <option value=\"\">Choose a profile already on this machine</option>\n {profiles\n .filter(\n (profile) => setupIntent.preferredSiteId === null || profile.cloudId === setupIntent.preferredSiteId\n )\n .map((profile) => (\n <option\n disabled={!isUsableProfile(profile, setupIntent)}\n key={profile.profileId}\n value={profile.profileId}\n >\n {profile.name} · {profileAvailability(profile)}\n </option>\n ))}\n </select>\n )}\n </Field>\n {setupJira && setupIntent.preferredSiteId !== null ? null : (\n <Button onClick={useApiToken} type=\"button\" variant=\"quiet\">\n Use API token instead\n </Button>\n )}\n </>\n ) : (\n <div className={styles.fallback}>\n <Field label=\"Atlassian email\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n autoComplete=\"username\"\n onChange={(event) => setEmail(event.currentTarget.value)}\n type=\"email\"\n value={email}\n />\n )}\n </Field>\n <Field label=\"API token\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n autoComplete=\"off\"\n maxLength={16_384}\n onChange={(event) => setApiToken(event.currentTarget.value)}\n type=\"password\"\n value={apiToken}\n />\n )}\n </Field>\n <Button onClick={() => setAuthenticationMode(\"oauth\")} type=\"button\" variant=\"quiet\">\n Use OAuth profile\n </Button>\n </div>\n )}\n <Field label=\"Atlassian site URL\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n disabled={authenticationMode === \"oauth\"}\n onChange={(event) => setSiteUrl(event.currentTarget.value)}\n placeholder=\"https://team.atlassian.net/\"\n type=\"url\"\n value={siteUrl}\n />\n )}\n </Field>\n <Field\n description=\"The stable Atlassian cloud ID; filled from OAuth when available.\"\n label=\"Site ID\"\n required\n size=\"compact\"\n >\n {(controlProps) => (\n <input\n {...controlProps}\n disabled={authenticationMode === \"oauth\" || setupIntent.preferredSiteId !== null}\n onChange={(event) => setSiteId(event.currentTarget.value)}\n value={siteId}\n />\n )}\n </Field>\n {setupJira ? (\n <Field\n description=\"The immutable Jira project ID followed by this connection.\"\n label=\"Jira project ID\"\n required\n size=\"compact\"\n >\n {(controlProps) => (\n <input {...controlProps} onChange={(event) => setProjectId(event.currentTarget.value)} value={projectId} />\n )}\n </Field>\n ) : null}\n {setupConfluence ? (\n <div className={styles.resources}>\n <Field label=\"Confluence space ID\" required size=\"compact\">\n {(controlProps) => (\n <input {...controlProps} onChange={(event) => setSpaceId(event.currentTarget.value)} value={spaceId} />\n )}\n </Field>\n <Field\n description=\"A readable page used only for the connection check.\"\n label=\"Health page ID\"\n required\n size=\"compact\"\n >\n {(controlProps) => (\n <input\n {...controlProps}\n onChange={(event) => setProbePageId(event.currentTarget.value)}\n value={probePageId}\n />\n )}\n </Field>\n </div>\n ) : null}\n {setupError === null ? null : (\n <Text as=\"p\" className={styles.error} role=\"alert\" variant=\"body\">\n {setupError}\n </Text>\n )}\n <div className={styles.actions}>\n <Button disabled={isSubmitting} onClick={onCancel} type=\"button\" variant=\"secondary\">\n Cancel\n </Button>\n <Button loading={isSubmitting} type=\"submit\" variant=\"primary\">\n Connect Atlassian\n </Button>\n </div>\n </form>\n )\n}\n",".form {\n display: grid;\n gap: var(--rly-space-20);\n}\n\n.intro {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.resources {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--rly-space-12);\n}\n\n.resources textarea {\n min-block-size: 7rem;\n resize: vertical;\n}\n\n.discoveryActions,\n.resourcePanelHeading {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.resourcePanel {\n display: grid;\n align-content: start;\n gap: var(--rly-space-8);\n min-inline-size: 0;\n padding: var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n}\n\n.resourcePanelHeading {\n justify-content: space-between;\n}\n\n.choiceList {\n display: grid;\n gap: var(--rly-space-4);\n max-block-size: 13rem;\n overflow: auto;\n}\n\n.choice {\n display: flex;\n align-items: center;\n gap: var(--rly-space-8);\n padding: var(--rly-space-4);\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--rly-space-8);\n}\n\n.error {\n color: var(--rly-color-blocked-ink);\n}\n\n@media (max-width: 40rem) {\n .resources {\n grid-template-columns: 1fr;\n }\n}\n","import { Button, Field, StateLabel, Text } from \"@knpkv/rly/primitives\"\nimport { type FormEvent, type ReactElement, useEffect, useRef, useState } from \"react\"\n\nimport type {\n AwsProfileDiscoveryResponse,\n AwsResourceDiscoveryRequest,\n AwsResourceDiscoveryResponse,\n AwsServiceResourceDiscovery,\n PluginServiceCatalogEntry\n} from \"../../api/plugins.js\"\nimport styles from \"./AwsAccountSetupForm.module.css\"\nimport { type ServiceConnectionDraft, serviceSetupValues } from \"./serviceSetupValues.js\"\n\nconst MAXIMUM_FOLLOWED_RESOURCES = 20\n\ntype ResourceDiscoveryState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly response: AwsResourceDiscoveryResponse }\n\nconst parseResourceNames = (input: string): ReadonlyArray<string> => [\n ...new Set(\n input\n .split(/[\\n,]/u)\n .map((name) => name.trim())\n .filter((name) => name.length > 0)\n )\n]\n\nconst mergeResourceNames = (selected: ReadonlySet<string>, manual: string): ReadonlyArray<string> => [\n ...new Set([...selected, ...parseResourceNames(manual)])\n]\n\n/** Preserve explicit choices across refreshes, including temporarily undiscoverable names. */\nexport const refreshedAwsResourceChoices = (\n discovered: ReadonlyArray<string>,\n selected: ReadonlySet<string>\n): ReadonlyArray<string> => [...new Set([...discovered, ...selected])].sort((left, right) => left.localeCompare(right))\n\n/** Case-insensitive resource search used by both AWS service lists. */\nexport const searchAwsResourceNames = (names: ReadonlyArray<string>, query: string): ReadonlyArray<string> => {\n const normalizedQuery = query.trim().toLocaleLowerCase()\n return normalizedQuery.length === 0\n ? names\n : names.filter((name) => name.toLocaleLowerCase().includes(normalizedQuery))\n}\n\nconst connectionDrafts = ({\n accountName,\n codeCommit,\n codePipeline,\n pipelineNames,\n profile,\n region,\n repositoryNames\n}: {\n readonly accountName: string\n readonly codeCommit: PluginServiceCatalogEntry\n readonly codePipeline: PluginServiceCatalogEntry\n readonly pipelineNames: ReadonlyArray<string>\n readonly profile: string\n readonly region: string\n readonly repositoryNames: ReadonlyArray<string>\n}): ReadonlyArray<ServiceConnectionDraft> => [\n ...repositoryNames.map((repositoryName) => ({\n catalog: codeCommit,\n displayName: `${accountName} · ${repositoryName}`,\n values: serviceSetupValues(\n codeCommit,\n new Map([\n [\"profile\", profile],\n [\"region\", region],\n [\"repositoryName\", repositoryName]\n ])\n )\n })),\n ...pipelineNames.map((pipelineName) => ({\n catalog: codePipeline,\n displayName: `${accountName} · ${pipelineName}`,\n values: serviceSetupValues(\n codePipeline,\n new Map([\n [\"profile\", profile],\n [\"region\", region],\n [\"pipelineName\", pipelineName]\n ])\n )\n }))\n]\n\nconst profileDiscoveryMessage = (profileCount: number, state: \"failed\" | \"idle\" | \"loading\" | \"ready\"): string => {\n switch (state) {\n case \"loading\":\n return \"Discovering local AWS profiles…\"\n case \"ready\":\n return `${profileCount} local AWS ${profileCount === 1 ? \"profile\" : \"profiles\"} detected`\n case \"failed\":\n return \"Profile discovery unavailable. Enter a profile manually.\"\n case \"idle\":\n return \"AWS profiles are discovered locally by the Control Center server.\"\n }\n}\n\nconst failureMessage = (service: \"CodeCommit\" | \"CodePipeline\", failureClass: string): string =>\n failureClass === \"authorization\"\n ? `${service} access was denied. Select names manually or update this profile's permissions.`\n : `${service} discovery is unavailable (${failureClass}). Select names manually or refresh.`\n\nconst ResourcePicker = ({\n label,\n query,\n selected,\n service,\n setQuery,\n setSelected\n}: {\n readonly label: string\n readonly query: string\n readonly selected: ReadonlySet<string>\n readonly service: AwsServiceResourceDiscovery\n readonly setQuery: (query: string) => void\n readonly setSelected: (selected: ReadonlySet<string>) => void\n}): ReactElement => {\n if (service._tag === \"failed\") {\n const preservedNames = [...selected].sort((left, right) => left.localeCompare(right))\n return (\n <div className={styles.resourcePanel}>\n <div className={styles.resourcePanelHeading}>\n <Text as=\"h4\" variant=\"card-title\">\n {label}\n </Text>\n <StateLabel label={`${selected.size} selected`} size=\"compact\" tone=\"neutral\" />\n </div>\n <Text as=\"p\" className={styles.error} role=\"status\" variant=\"body\">\n {failureMessage(label === \"Repositories\" ? \"CodeCommit\" : \"CodePipeline\", service.failureClass)}\n </Text>\n {preservedNames.length === 0 ? null : (\n <>\n <Text tone=\"secondary\" variant=\"meta\">\n Preserved from the previous discovery. Clear any resource you no longer want to connect.\n </Text>\n <div className={styles.choiceList}>\n {preservedNames.map((name) => (\n <label className={styles.choice} key={name}>\n <input\n checked\n onChange={() => {\n const next = new Set(selected)\n next.delete(name)\n setSelected(next)\n }}\n type=\"checkbox\"\n />\n <span>{name}</span>\n </label>\n ))}\n </div>\n </>\n )}\n </div>\n )\n }\n const names = refreshedAwsResourceChoices(service.names, selected)\n const visibleNames = searchAwsResourceNames(names, query)\n return (\n <div className={styles.resourcePanel}>\n <div className={styles.resourcePanelHeading}>\n <Text as=\"h4\" variant=\"card-title\">\n {label}\n </Text>\n <StateLabel label={`${selected.size} selected`} size=\"compact\" tone=\"neutral\" />\n </div>\n {names.length === 0 ? (\n <Text tone=\"secondary\" variant=\"body\">\n No {label.toLocaleLowerCase()} were found in this region.\n </Text>\n ) : (\n <>\n <Field label={`Search ${label.toLocaleLowerCase()}`} size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n onChange={(event) => setQuery(event.currentTarget.value)}\n type=\"search\"\n value={query}\n />\n )}\n </Field>\n <div className={styles.choiceList}>\n {visibleNames.map((name) => (\n <label className={styles.choice} key={name}>\n <input\n checked={selected.has(name)}\n onChange={(event) => {\n const next = new Set(selected)\n if (event.currentTarget.checked) next.add(name)\n else next.delete(name)\n setSelected(next)\n }}\n type=\"checkbox\"\n />\n <span>{name}</span>\n </label>\n ))}\n </div>\n {visibleNames.length === 0 ? (\n <Text tone=\"secondary\" variant=\"body\">\n No matching resources.\n </Text>\n ) : null}\n {service.truncated ? (\n <Text tone=\"secondary\" variant=\"meta\">\n Showing the first 20 names. Use manual entry for another name.\n </Text>\n ) : null}\n </>\n )}\n </div>\n )\n}\n\n/** Configure one AWS account and the repositories and pipelines followed beneath it. */\nexport const AwsAccountSetupForm = ({\n awsProfiles,\n awsProfilesState,\n catalogs,\n isSubmitting,\n onCancel,\n onDiscover,\n onSubmit\n}: {\n readonly awsProfiles: AwsProfileDiscoveryResponse\n readonly awsProfilesState: \"failed\" | \"idle\" | \"loading\" | \"ready\"\n readonly catalogs: ReadonlyArray<PluginServiceCatalogEntry>\n readonly isSubmitting: boolean\n readonly onCancel: () => void\n readonly onDiscover: (\n request: AwsResourceDiscoveryRequest,\n signal: AbortSignal\n ) => Promise<AwsResourceDiscoveryResponse>\n readonly onSubmit: (drafts: ReadonlyArray<ServiceConnectionDraft>) => Promise<boolean>\n}): ReactElement => {\n const codeCommit = catalogs.find(({ providerId }) => providerId === \"codecommit\")\n const codePipeline = catalogs.find(({ providerId }) => providerId === \"codepipeline\")\n const [accountName, setAccountName] = useState(\"AWS account\")\n const [profile, setProfile] = useState(\"default\")\n const [region, setRegion] = useState(\"\")\n const [repositoryNames, setRepositoryNames] = useState(\"\")\n const [pipelineNames, setPipelineNames] = useState(\"\")\n const [selectedRepositories, setSelectedRepositories] = useState<ReadonlySet<string>>(new Set())\n const [selectedPipelines, setSelectedPipelines] = useState<ReadonlySet<string>>(new Set())\n const [repositoryQuery, setRepositoryQuery] = useState(\"\")\n const [pipelineQuery, setPipelineQuery] = useState(\"\")\n const [isManualEntryOpen, setIsManualEntryOpen] = useState(true)\n const [discoveryState, setDiscoveryState] = useState<ResourceDiscoveryState>({ _tag: \"idle\" })\n const [setupError, setSetupError] = useState<string | null>(null)\n const discoveryRequest = useRef<AbortController | null>(null)\n\n useEffect(() => () => discoveryRequest.current?.abort(), [])\n\n useEffect(() => {\n const detectedRegion = awsProfiles.find((candidate) => candidate.profile === profile)?.region\n if (detectedRegion !== null && detectedRegion !== undefined) {\n setRegion((current) => (current.trim().length === 0 ? detectedRegion : current))\n }\n }, [awsProfiles, profile])\n\n const resetDiscovery = (): void => {\n discoveryRequest.current?.abort()\n discoveryRequest.current = null\n setDiscoveryState({ _tag: \"idle\" })\n setSelectedRepositories(new Set())\n setSelectedPipelines(new Set())\n }\n\n const discover = (): void => {\n setSetupError(null)\n const request = { profile: profile.trim(), region: region.trim() }\n if (request.profile.length === 0 || request.region.length === 0) {\n setSetupError(\"Add an AWS profile and region before testing discovery.\")\n return\n }\n discoveryRequest.current?.abort()\n const controller = new AbortController()\n discoveryRequest.current = controller\n setDiscoveryState({ _tag: \"loading\" })\n onDiscover(request, controller.signal).then(\n (response) => {\n if (controller.signal.aborted) return\n discoveryRequest.current = null\n setDiscoveryState({ _tag: \"ready\", response })\n },\n () => {\n if (controller.signal.aborted) return\n discoveryRequest.current = null\n setDiscoveryState({ _tag: \"failed\" })\n }\n )\n }\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n setSetupError(null)\n if (codeCommit === undefined || codePipeline === undefined) {\n setSetupError(\"The installed AWS adapters are unavailable.\")\n return\n }\n const normalizedAccountName = accountName.trim()\n const normalizedProfile = profile.trim()\n const normalizedRegion = region.trim()\n if (normalizedAccountName.length === 0 || normalizedProfile.length === 0 || normalizedRegion.length === 0) {\n setSetupError(\"Add an account name, AWS profile, and region.\")\n return\n }\n const repositories = mergeResourceNames(selectedRepositories, isManualEntryOpen ? repositoryNames : \"\")\n const pipelines = mergeResourceNames(selectedPipelines, isManualEntryOpen ? pipelineNames : \"\")\n if (repositories.length === 0 && pipelines.length === 0) {\n setSetupError(\"Select or manually add at least one repository or pipeline to follow.\")\n return\n }\n if (repositories.length > MAXIMUM_FOLLOWED_RESOURCES || pipelines.length > MAXIMUM_FOLLOWED_RESOURCES) {\n setSetupError(`Follow at most ${MAXIMUM_FOLLOWED_RESOURCES} repositories and pipelines per account.`)\n return\n }\n if ([...repositories, ...pipelines].some((name) => name.length > 100)) {\n setSetupError(\"Repository and pipeline names must be 100 characters or fewer.\")\n return\n }\n const drafts = connectionDrafts({\n accountName: normalizedAccountName,\n codeCommit,\n codePipeline,\n pipelineNames: pipelines,\n profile: normalizedProfile,\n region: normalizedRegion,\n repositoryNames: repositories\n })\n void onSubmit(drafts).then((didCreate) => {\n if (!didCreate) setSetupError(\"Some AWS resources could not be connected. Review the cards below and retry.\")\n })\n }\n\n return (\n <form className={styles.form} onSubmit={submit}>\n <div className={styles.intro}>\n <Text as=\"h3\" variant=\"card-title\">\n One account. Many delivery streams.\n </Text>\n <Text tone=\"secondary\" variant=\"body\">\n Choose one local AWS profile and region, verify its account, then select CodeCommit repositories and\n CodePipeline pipelines.\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n {profileDiscoveryMessage(awsProfiles.length, awsProfilesState)}\n </Text>\n </div>\n <Field label=\"Account name\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n maxLength={90}\n onChange={(event) => setAccountName(event.currentTarget.value)}\n value={accountName}\n />\n )}\n </Field>\n <Field label=\"AWS profile\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n list={awsProfiles.length > 0 ? \"aws-account-profiles\" : undefined}\n maxLength={200}\n onChange={(event) => {\n const nextProfile = event.currentTarget.value\n const detectedRegion = awsProfiles.find((candidate) => candidate.profile === nextProfile)?.region\n setProfile(nextProfile)\n setRegion(detectedRegion ?? \"\")\n resetDiscovery()\n }}\n value={profile}\n />\n )}\n </Field>\n <Field label=\"AWS region\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n maxLength={100}\n onChange={(event) => {\n setRegion(event.currentTarget.value)\n resetDiscovery()\n }}\n value={region}\n />\n )}\n </Field>\n <div className={styles.discoveryActions}>\n <Button loading={discoveryState._tag === \"loading\"} onClick={discover} type=\"button\" variant=\"secondary\">\n {discoveryState._tag === \"ready\" ? \"Refresh discovery\" : \"Test & discover\"}\n </Button>\n {discoveryState._tag === \"ready\" ? (\n <Text tone=\"secondary\" variant=\"body\">\n Verified AWS account {discoveryState.response.accountId}\n </Text>\n ) : discoveryState._tag === \"failed\" ? (\n <Text as=\"p\" className={styles.error} role=\"alert\" variant=\"body\">\n Account verification failed. Check the profile and region, or enter resource names manually.\n </Text>\n ) : null}\n </div>\n {discoveryState._tag === \"ready\" ? (\n <div className={styles.resources}>\n <ResourcePicker\n label=\"Repositories\"\n query={repositoryQuery}\n selected={selectedRepositories}\n service={discoveryState.response.codeCommit}\n setQuery={setRepositoryQuery}\n setSelected={setSelectedRepositories}\n />\n <ResourcePicker\n label=\"Pipelines\"\n query={pipelineQuery}\n selected={selectedPipelines}\n service={discoveryState.response.codePipeline}\n setQuery={setPipelineQuery}\n setSelected={setSelectedPipelines}\n />\n </div>\n ) : null}\n <div>\n <Button onClick={() => setIsManualEntryOpen((current) => !current)} type=\"button\" variant=\"quiet\">\n {isManualEntryOpen ? \"Hide manual name entry\" : \"Enter resource names manually\"}\n </Button>\n </div>\n {isManualEntryOpen ? (\n <div className={styles.resources}>\n <Field\n description=\"Comma or line separated. Maximum 20 including selected names.\"\n label=\"Repository names\"\n size=\"compact\"\n >\n {(controlProps) => (\n <textarea\n {...controlProps}\n maxLength={4_096}\n onChange={(event) => setRepositoryNames(event.currentTarget.value)}\n placeholder=\"payments-api\\nrisk-engine\"\n value={repositoryNames}\n />\n )}\n </Field>\n <Field\n description=\"Comma or line separated. Maximum 20 including selected names.\"\n label=\"Pipeline names\"\n size=\"compact\"\n >\n {(controlProps) => (\n <textarea\n {...controlProps}\n maxLength={4_096}\n onChange={(event) => setPipelineNames(event.currentTarget.value)}\n placeholder=\"payments-production\\nrisk-production\"\n value={pipelineNames}\n />\n )}\n </Field>\n </div>\n ) : null}\n {awsProfiles.length > 0 ? (\n <datalist id=\"aws-account-profiles\">\n {awsProfiles.map((candidate) => (\n <option\n key={candidate.profile}\n label={candidate.region ?? \"Region not configured\"}\n value={candidate.profile}\n />\n ))}\n </datalist>\n ) : null}\n {setupError === null ? null : (\n <Text as=\"p\" className={styles.error} role=\"alert\" variant=\"body\">\n {setupError}\n </Text>\n )}\n <div className={styles.actions}>\n <Button disabled={isSubmitting} onClick={onCancel} type=\"button\" variant=\"secondary\">\n Cancel\n </Button>\n <Button loading={isSubmitting} type=\"submit\" variant=\"primary\">\n Connect AWS account\n </Button>\n </div>\n </form>\n )\n}\n",".page {\n display: grid;\n gap: var(--rly-space-40);\n}\n\n.heading {\n display: grid;\n max-inline-size: 48rem;\n gap: var(--rly-space-12);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));\n gap: var(--rly-space-16);\n}\n\n.accounts,\n.accountCard,\n.accountIdentity,\n.resourceList,\n.resource,\n.sectionHeading {\n display: grid;\n}\n\n.accounts,\n.accountCard {\n gap: var(--rly-space-20);\n}\n\n.sectionHeading,\n.accountIdentity,\n.resource,\n.resourceList {\n gap: var(--rly-space-8);\n}\n\n.accountGrid {\n display: grid;\n gap: var(--rly-space-16);\n}\n\n.accountHeading,\n.resourceHeading,\n.accountActions,\n.resourceActions {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.accountHeading,\n.resourceHeading {\n justify-content: space-between;\n}\n\n.accountActions,\n.resourceActions {\n flex-wrap: wrap;\n}\n\n.accountActions {\n padding-block-start: var(--rly-space-4);\n}\n\n.resource {\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-2);\n}\n\n.card {\n display: grid;\n align-content: start;\n gap: var(--rly-space-24);\n}\n\n.cardHeading,\n.cardAction {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-16);\n}\n\n.synchronization,\n.syncState {\n display: grid;\n gap: var(--rly-space-6);\n}\n\n.syncActions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--rly-space-8);\n}\n\n.connectionIdentity {\n display: flex;\n min-inline-size: 0;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.testEvidence {\n display: grid;\n gap: var(--rly-space-12);\n padding: var(--rly-space-16);\n border-inline-start: 2px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-2);\n}\n\n.identity {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.setupForm {\n display: grid;\n gap: var(--rly-space-16);\n}\n\n.setupActions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--rly-space-8);\n}\n\n.setupError {\n color: var(--rly-color-blocked-ink);\n}\n\n.identifier {\n overflow-wrap: anywhere;\n}\n\n@media (max-width: 32rem) {\n .cardHeading,\n .cardAction,\n .accountHeading,\n .resourceHeading {\n align-items: flex-start;\n flex-direction: column;\n }\n}\n","import { StateLabel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\n\nimport type { PluginConnectionTestResult } from \"../../api/plugins.js\"\nimport type { ConnectionTestState } from \"./connectionState.js\"\nimport styles from \"./ServicesPage.module.css\"\n\nconst checkedAt = (result: PluginConnectionTestResult): string => DateTime.formatIso(result.checkedAt)\n\n/** Provider identity and timing evidence from the most recent explicit live test. */\nexport const ConnectionTestEvidence = ({\n state\n}: {\n readonly state: ConnectionTestState | undefined\n}): ReactElement | null => {\n if (state === undefined || state._tag === \"testing\") return null\n if (state._tag === \"request-failed\") {\n return (\n <div aria-live=\"polite\" className={styles.testEvidence} role=\"status\">\n <StateLabel label=\"Test failed\" tone=\"critical\" />\n <Text tone=\"secondary\" variant=\"body\">\n Control Center could not complete the test. Check the server and try again.\n </Text>\n </div>\n )\n }\n const result = state.result\n const checkedAtIso = checkedAt(result)\n return (\n <div aria-live=\"polite\" className={styles.testEvidence} role=\"status\">\n <StateLabel\n label={result._tag === \"healthy\" ? \"Connection healthy\" : \"Test failed\"}\n tone={result._tag === \"healthy\" ? \"positive\" : \"critical\"}\n />\n {result._tag === \"healthy\" ? (\n <div className={styles.identity}>\n <Text tone=\"secondary\" variant=\"meta\">\n {result.identity.label}\n </Text>\n <Text as=\"span\" variant=\"card-title\">\n {result.identity.displayName}\n </Text>\n <Text className={styles.identifier} tone=\"secondary\" variant=\"body\">\n {result.identity.providerImmutableId}\n </Text>\n </div>\n ) : (\n <Text tone=\"secondary\" variant=\"body\">\n {result.safeMessage}\n </Text>\n )}\n <Text tone=\"secondary\" variant=\"meta\">\n Checked <time dateTime={checkedAtIso}>{checkedAtIso}</time> · {result.latencyMilliseconds} ms\n </Text>\n </div>\n )\n}\n","import { Button, StateLabel, Text } from \"@knpkv/rly/primitives\"\nimport type { ReactElement } from \"react\"\n\nimport type { PluginSynchronizationState } from \"../../api/plugins.js\"\nimport styles from \"./ServicesPage.module.css\"\n\n/** Browser lifecycle for one connection's durable manual synchronization state. */\nexport type ConnectionSynchronizationViewState =\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"syncing\"; readonly previous: PluginSynchronizationState | null }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly synchronization: PluginSynchronizationState }\n\nconst resultPresentation = (\n result: PluginSynchronizationState[\"result\"]\n): { readonly label: string; readonly tone: \"critical\" | \"neutral\" | \"positive\" | \"progress\" } => {\n switch (result) {\n case \"never\":\n return { label: \"Never synchronized\", tone: \"neutral\" }\n case \"running\":\n return { label: \"Synchronizing\", tone: \"progress\" }\n case \"synchronized\":\n return { label: \"Synchronized\", tone: \"positive\" }\n case \"source-unavailable\":\n return { label: \"Source unavailable\", tone: \"critical\" }\n case \"interrupted\":\n return { label: \"Interrupted\", tone: \"critical\" }\n }\n}\n\nconst StateDetails = ({ synchronization }: { readonly synchronization: PluginSynchronizationState }): ReactElement => {\n const presentation = resultPresentation(synchronization.result)\n return (\n <div className={styles.syncState}>\n <StateLabel label={presentation.label} size=\"compact\" tone={presentation.tone} />\n <Text tone=\"secondary\" variant=\"meta\">\n Last attempt: {synchronization.lastAttemptAt === null ? \"never\" : String(synchronization.lastAttemptAt)} · Last\n success: {synchronization.lastSuccessAt === null ? \"never\" : String(synchronization.lastSuccessAt)}\n {` · ${synchronization.pagesCommitted} ${synchronization.pagesCommitted === 1 ? \"page\" : \"pages\"}`}\n </Text>\n </div>\n )\n}\n\n/** Compact read/action presentation for the shared manual-sync API. */\nexport const ConnectionSynchronization = ({\n canSynchronize,\n onRefresh,\n onSynchronize,\n state\n}: {\n readonly canSynchronize: boolean\n readonly onRefresh: () => void\n readonly onSynchronize: () => void\n readonly state: ConnectionSynchronizationViewState | undefined\n}): ReactElement | null => {\n if (state === undefined) return null\n const synchronization =\n state._tag === \"ready\" ? state.synchronization : state._tag === \"syncing\" ? state.previous : null\n return (\n <div className={styles.synchronization}>\n {synchronization === null ? null : <StateDetails synchronization={synchronization} />}\n {state._tag === \"loading\" ? (\n <Text tone=\"secondary\" variant=\"meta\">\n Loading synchronization state…\n </Text>\n ) : null}\n {state._tag === \"failed\" ? (\n <Text as=\"p\" className={styles.setupError} role=\"alert\" variant=\"body\">\n Synchronization state is unavailable.\n </Text>\n ) : null}\n <div className={styles.syncActions}>\n <Button\n disabled={!canSynchronize || state._tag === \"loading\" || state._tag === \"syncing\"}\n loading={state._tag === \"syncing\"}\n onClick={onSynchronize}\n variant=\"secondary\"\n >\n Sync now\n </Button>\n {state._tag === \"failed\" ? (\n <Button onClick={onRefresh} variant=\"quiet\">\n Refresh state\n </Button>\n ) : null}\n </div>\n </div>\n )\n}\n","import type { PluginConnectionSummary, PluginConnectionTestResult } from \"../../api/plugins.js\"\n\nexport type ConnectionTestState =\n | { readonly _tag: \"testing\" }\n | { readonly _tag: \"result\"; readonly result: PluginConnectionTestResult }\n | { readonly _tag: \"request-failed\" }\n\nexport type ConnectionEnablementState = \"changing\" | \"request-failed\"\n\n/** Present durable and freshly tested connection state with one consistent vocabulary. */\nexport const connectionStatus = (\n connection: PluginConnectionSummary,\n testState: ConnectionTestState | undefined\n): { readonly label: string; readonly tone: \"neutral\" | \"positive\" | \"critical\" | \"caution\" | \"progress\" } => {\n if (!connection.isEnabled) return { label: \"Disabled\", tone: \"neutral\" }\n if (testState?._tag === \"testing\") return { label: \"Checking\", tone: \"progress\" }\n if (testState?._tag === \"result\") {\n return testState.result._tag === \"healthy\"\n ? { label: \"Healthy\", tone: \"positive\" }\n : { label: \"Unavailable\", tone: \"critical\" }\n }\n if (connection.health === null) return { label: \"Not checked\", tone: \"neutral\" }\n switch (connection.health._tag) {\n case \"healthy\":\n return { label: \"Healthy\", tone: \"positive\" }\n case \"degraded\":\n return { label: \"Degraded\", tone: \"caution\" }\n case \"unavailable\":\n return { label: \"Unavailable\", tone: \"critical\" }\n case \"disabled\":\n return { label: \"Not checked\", tone: \"neutral\" }\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, StateLabel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport type { ReactElement } from \"react\"\n\nimport type { PluginConnectionSummary, ProviderAccountSummary } from \"../../api/plugins.js\"\nimport type { PluginConnectionId } from \"../../domain/identifiers.js\"\nimport type { ProviderId } from \"../../domain/sourceRevision.js\"\nimport { ConnectionTestEvidence } from \"./ConnectionTestEvidence.js\"\nimport { ConnectionSynchronization, type ConnectionSynchronizationViewState } from \"./ConnectionSynchronization.js\"\nimport { type ConnectionEnablementState, type ConnectionTestState, connectionStatus } from \"./connectionState.js\"\nimport styles from \"./ServicesPage.module.css\"\n\nconst resourceKind = (providerId: ProviderId): string => {\n switch (providerId) {\n case \"codecommit\":\n return \"Repository\"\n case \"codepipeline\":\n return \"Pipeline\"\n case \"jira\":\n return \"Project\"\n case \"confluence\":\n return \"Space\"\n case \"clockify\":\n return \"Workspace\"\n }\n}\n\n/** Compact account-level view of independently actionable provider resources. */\nexport const ProviderAccountCard = ({\n account,\n canConfigure,\n connections,\n enablementStates,\n onAdd,\n onRefreshSynchronization,\n onSetEnabled,\n onSynchronize,\n onTest,\n synchronizationStates,\n testStates\n}: {\n readonly account: ProviderAccountSummary\n readonly canConfigure: boolean\n readonly connections: ReadonlyArray<PluginConnectionSummary>\n readonly enablementStates: ReadonlyMap<PluginConnectionId, ConnectionEnablementState>\n readonly onAdd: (providerId: ProviderId, providerImmutableId: string) => void\n readonly onSetEnabled: (pluginConnectionId: PluginConnectionId, isEnabled: boolean) => void\n readonly onRefreshSynchronization: (pluginConnectionId: PluginConnectionId) => void\n readonly onSynchronize: (pluginConnectionId: PluginConnectionId) => void\n readonly synchronizationStates: ReadonlyMap<PluginConnectionId, ConnectionSynchronizationViewState>\n readonly onTest: (pluginConnectionId: PluginConnectionId) => void\n readonly testStates: ReadonlyMap<PluginConnectionId, ConnectionTestState>\n}): ReactElement => (\n <Surface as=\"article\" className={styles.accountCard} padding=\"default\" shape=\"grouped\">\n <div className={styles.accountHeading}>\n <div className={styles.accountIdentity}>\n <Text as=\"h2\" variant=\"section-title\">\n {account.providerFamily === \"aws\"\n ? \"AWS account\"\n : account.providerFamily === \"atlassian\"\n ? \"Atlassian site\"\n : \"Provider account\"}{\" \"}\n {account.displayName}\n </Text>\n <Text className={styles.identifier} tone=\"secondary\" variant=\"meta\">\n Verified identity · {account.providerImmutableId}\n </Text>\n </div>\n <StateLabel\n label={`${account.resources.length} ${account.resources.length === 1 ? \"resource\" : \"resources\"}`}\n size=\"compact\"\n tone=\"positive\"\n />\n </div>\n <div className={styles.resourceList}>\n {account.resources.map((resource) => {\n const connection = connections.find((candidate) => candidate.followedResourceId === resource.followedResourceId)\n const testState = connection === undefined ? undefined : testStates.get(connection.pluginConnectionId)\n const enablementState =\n connection === undefined ? undefined : enablementStates.get(connection.pluginConnectionId)\n const status: ReturnType<typeof connectionStatus> =\n connection === undefined ? { label: \"Followed\", tone: \"neutral\" } : connectionStatus(connection, testState)\n const isTesting = testState?._tag === \"testing\"\n const isChanging = enablementState === \"changing\"\n return (\n <div className={styles.resource} key={resource.followedResourceId}>\n <div className={styles.resourceHeading}>\n <div className={styles.connectionIdentity}>\n <ServiceMark service={resource.providerId} size=\"compact\" />\n <div className={styles.identity}>\n <Text as=\"h3\" variant=\"card-title\">\n {resource.displayName}\n </Text>\n <Text className={styles.identifier} tone=\"secondary\" variant=\"meta\">\n {resourceKind(resource.providerId)} · {resource.providerImmutableId}\n </Text>\n </div>\n </div>\n <StateLabel label={status.label} size=\"compact\" tone={status.tone} />\n </div>\n {connection === undefined ? null : (\n <>\n <ConnectionTestEvidence state={testState} />\n <ConnectionSynchronization\n canSynchronize={canConfigure && connection.isEnabled}\n onRefresh={() => onRefreshSynchronization(connection.pluginConnectionId)}\n onSynchronize={() => onSynchronize(connection.pluginConnectionId)}\n state={synchronizationStates.get(connection.pluginConnectionId)}\n />\n <div className={styles.resourceActions}>\n <Button\n disabled={!canConfigure || isChanging || isTesting || !connection.isEnabled}\n loading={isTesting}\n onClick={() => onTest(connection.pluginConnectionId)}\n variant=\"secondary\"\n >\n Test\n </Button>\n <Button\n disabled={!canConfigure || isChanging}\n loading={isChanging}\n onClick={() => onSetEnabled(connection.pluginConnectionId, !connection.isEnabled)}\n variant=\"quiet\"\n >\n {connection.isEnabled ? \"Disable\" : \"Enable\"}\n </Button>\n </div>\n {enablementState === \"request-failed\" ? (\n <Text as=\"p\" className={styles.setupError} role=\"alert\" variant=\"body\">\n Control Center could not change this service. Refresh and try again.\n </Text>\n ) : null}\n </>\n )}\n </div>\n )\n })}\n </div>\n {account.providerFamily === \"aws\" ? (\n <div className={styles.accountActions}>\n <Button\n disabled={!canConfigure}\n onClick={() => onAdd(\"codecommit\", account.providerImmutableId)}\n variant=\"secondary\"\n >\n Add repository\n </Button>\n <Button\n disabled={!canConfigure}\n onClick={() => onAdd(\"codepipeline\", account.providerImmutableId)}\n variant=\"secondary\"\n >\n Add pipeline\n </Button>\n </div>\n ) : account.providerFamily === \"atlassian\" ? (\n <div className={styles.accountActions}>\n <Button disabled={!canConfigure} onClick={() => onAdd(\"jira\", account.providerImmutableId)} variant=\"secondary\">\n Add Jira project\n </Button>\n <Button\n disabled={!canConfigure}\n onClick={() => onAdd(\"confluence\", account.providerImmutableId)}\n variant=\"secondary\"\n >\n Add Confluence space\n </Button>\n </div>\n ) : null}\n </Surface>\n)\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Field, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Predicate from \"effect/Predicate\"\nimport { type FormEvent, type ReactElement, useCallback, useEffect, useRef, useState } from \"react\"\nimport { useNavigate, useSearchParams } from \"react-router\"\n\nimport type {\n AtlassianOAuthClientConfiguration,\n AtlassianOAuthGrantStartResponse,\n AtlassianOAuthProviderIntent,\n AtlassianProfileDiscoveryResponse,\n AwsProfileDiscoveryResponse,\n AwsResourceDiscoveryRequest,\n AwsResourceDiscoveryResponse,\n CreatePluginConnectionRequest,\n CreatePluginConnectionResponse,\n CreatePluginConnectionValue,\n PluginConnectionSummary,\n PluginOverviewResponse,\n PluginServiceCatalogEntry\n} from \"../../api/plugins.js\"\nimport type { PluginConnectionId } from \"../../domain/identifiers.js\"\nimport { firstPartyServiceIdentities, type FirstPartyServiceIdentity } from \"../../domain/firstPartyServices.js\"\nimport type { ProviderId } from \"../../domain/sourceRevision.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { AtlassianAccountSetupForm, type AtlassianSetupIntent } from \"./AtlassianAccountSetupForm.js\"\nimport { AwsAccountSetupForm } from \"./AwsAccountSetupForm.js\"\nimport { ConnectionTestEvidence } from \"./ConnectionTestEvidence.js\"\nimport { ConnectionSynchronization, type ConnectionSynchronizationViewState } from \"./ConnectionSynchronization.js\"\nimport { browserConnectionTestTransport, type ConnectionTestTransport } from \"./connectionTestTransport.js\"\nimport { type ConnectionEnablementState, type ConnectionTestState, connectionStatus } from \"./connectionState.js\"\nimport { ProviderAccountCard } from \"./ProviderAccountCard.js\"\nimport { type ServiceConnectionDraft, serviceSetupValue } from \"./serviceSetupValues.js\"\nimport {\n selectedAtlassianOAuthProfileId,\n selectedAtlassianOAuthProviders,\n selectedAtlassianOAuthSiteId,\n selectedServiceProvider,\n servicePairingPath\n} from \"./serviceOnboarding.js\"\nimport styles from \"./ServicesPage.module.css\"\n\ntype AwsProfilesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly profiles: AwsProfileDiscoveryResponse }\n\ntype AtlassianProfilesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly profiles: AtlassianProfileDiscoveryResponse }\n\ntype ConnectionsState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly overview: PluginOverviewResponse }\n\nconst setupDraftKey = (draft: ServiceConnectionDraft): string => `${draft.catalog.providerId}\\0${draft.displayName}`\n\nconst allAtlassianProducts: AtlassianOAuthProviderIntent = [\"jira\", \"confluence\"]\n\nconst allAtlassianProductsIntent: AtlassianSetupIntent = {\n preferredProfileId: null,\n preferredSiteId: null,\n providers: allAtlassianProducts,\n requestedOAuthProviders: allAtlassianProducts\n}\n\nconst missingAtlassianProducts = (\n connections: ReadonlyArray<PluginConnectionSummary>\n): AtlassianOAuthProviderIntent => {\n const providers = allAtlassianProducts.filter(\n (providerId) => !connections.some((connection) => connection.providerId === providerId)\n )\n return providers.length === 0 ? allAtlassianProducts : providers\n}\n\nconst hasCanonicalProfileForConnectedProduct = (\n connections: ReadonlyArray<PluginConnectionSummary>,\n profiles: AtlassianProfileDiscoveryResponse,\n setupProviders: AtlassianOAuthProviderIntent\n): boolean =>\n setupProviders.length === 1 &&\n allAtlassianProducts.some(\n (providerId) =>\n !setupProviders.includes(providerId) &&\n connections.some((connection) => connection.providerId === providerId) &&\n profiles.some((profile) => !profile.profileId.startsWith(\"legacy:\") && profile.providers.includes(providerId))\n )\n\nconst hasConnectedProductOutsideSetup = (\n connections: ReadonlyArray<PluginConnectionSummary>,\n setupProviders: AtlassianOAuthProviderIntent\n): boolean =>\n setupProviders.length === 1 &&\n allAtlassianProducts.some(\n (providerId) =>\n !setupProviders.includes(providerId) && connections.some((connection) => connection.providerId === providerId)\n )\n\nconst missingAtlassianProductsIntent = (\n connections: ReadonlyArray<PluginConnectionSummary>,\n requestedProvider?: \"jira\" | \"confluence\"\n): AtlassianSetupIntent => {\n const providers =\n requestedProvider !== undefined && connections.some(({ providerId }) => providerId === requestedProvider)\n ? [requestedProvider]\n : missingAtlassianProducts(connections)\n return {\n preferredProfileId: null,\n preferredSiteId: null,\n providers,\n requestedOAuthProviders: null\n }\n}\n\nconst resolvedAtlassianSetupIntent = (\n intent: AtlassianSetupIntent,\n connections: ReadonlyArray<PluginConnectionSummary>,\n profilesState: AtlassianProfilesState\n): AtlassianSetupIntent => {\n if (intent.requestedOAuthProviders !== null) return intent\n const hasOutsideConnection = hasConnectedProductOutsideSetup(connections, intent.providers)\n if (hasOutsideConnection && (profilesState._tag === \"idle\" || profilesState._tag === \"loading\")) {\n return intent\n }\n const profiles = profilesState._tag === \"ready\" ? profilesState.profiles : []\n return {\n ...intent,\n requestedOAuthProviders:\n (hasOutsideConnection && profilesState._tag === \"failed\") ||\n hasCanonicalProfileForConnectedProduct(connections, profiles, intent.providers)\n ? allAtlassianProducts\n : intent.providers\n }\n}\n\nconst ConnectionCard = ({\n canConfigure,\n canTest,\n connection,\n enablementState,\n onConfigure,\n onRefreshSynchronization,\n onSetEnabled,\n onSynchronize,\n onTest,\n synchronizationState,\n testState\n}: {\n readonly canConfigure: boolean\n readonly canTest: boolean\n readonly connection: PluginConnectionSummary\n readonly enablementState: ConnectionEnablementState | undefined\n readonly onConfigure: () => void\n readonly onSetEnabled: (pluginConnectionId: PluginConnectionId, isEnabled: boolean) => void\n readonly onRefreshSynchronization: (pluginConnectionId: PluginConnectionId) => void\n readonly onSynchronize: (pluginConnectionId: PluginConnectionId) => void\n readonly synchronizationState: ConnectionSynchronizationViewState | undefined\n readonly onTest: (pluginConnectionId: PluginConnectionId) => void\n readonly testState: ConnectionTestState | undefined\n}): ReactElement => {\n const isTesting = testState?._tag === \"testing\"\n const hasTested = testState !== undefined && testState._tag !== \"testing\"\n const isChanging = enablementState === \"changing\"\n const status = connectionStatus(connection, testState)\n return (\n <Surface as=\"article\" className={styles.card} padding=\"default\" shape=\"grouped\">\n <div className={styles.cardHeading}>\n <div className={styles.connectionIdentity}>\n <ServiceMark service={connection.providerId} size=\"compact\" />\n <Text as=\"h2\" variant=\"card-title\">\n {connection.displayName}\n </Text>\n </div>\n <StateLabel label={status.label} size=\"compact\" tone={status.tone} />\n </div>\n <ConnectionTestEvidence state={testState} />\n <ConnectionSynchronization\n canSynchronize={canConfigure && connection.isEnabled}\n onRefresh={() => onRefreshSynchronization(connection.pluginConnectionId)}\n onSynchronize={() => onSynchronize(connection.pluginConnectionId)}\n state={synchronizationState}\n />\n <div className={styles.cardAction}>\n <Button\n disabled={!canTest || isChanging || isTesting || !connection.isEnabled}\n loading={isTesting}\n onClick={() => onTest(connection.pluginConnectionId)}\n variant=\"secondary\"\n >\n {hasTested ? \"Retry test\" : \"Test connection\"}\n </Button>\n <Button disabled={!canConfigure} onClick={onConfigure} variant=\"secondary\">\n Add connection\n </Button>\n <Button\n disabled={!canConfigure || isChanging}\n loading={isChanging}\n onClick={() => onSetEnabled(connection.pluginConnectionId, !connection.isEnabled)}\n variant={connection.isEnabled ? \"secondary\" : \"primary\"}\n >\n {connection.isEnabled ? \"Disable\" : \"Enable service\"}\n </Button>\n {!canTest ? (\n <Text tone=\"secondary\" variant=\"meta\">\n Owner access is required.\n </Text>\n ) : null}\n </div>\n {enablementState === \"request-failed\" ? (\n <Text as=\"p\" className={styles.setupError} role=\"alert\" variant=\"body\">\n Control Center could not change this service. Refresh and try again.\n </Text>\n ) : null}\n </Surface>\n )\n}\n\nconst SetupForm = ({\n catalog,\n isSubmitting,\n onCancel,\n onSubmit\n}: {\n readonly catalog: PluginServiceCatalogEntry\n readonly isSubmitting: boolean\n readonly onCancel: () => void\n readonly onSubmit: (displayName: string, values: ReadonlyArray<CreatePluginConnectionValue>) => Promise<boolean>\n}): ReactElement => {\n const [displayName, setDisplayName] = useState(catalog.displayName)\n const [setupError, setSetupError] = useState<string | null>(null)\n const [values, setValues] = useState<ReadonlyMap<string, string>>(\n new Map(catalog.configurationFields.map((field) => [field.key, field.defaultValue ?? \"\"]))\n )\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n setSetupError(null)\n const requestValues = catalog.configurationFields.map((field) =>\n serviceSetupValue(field, values.get(field.key) ?? \"\")\n )\n void onSubmit(displayName, requestValues).then((didCreate) => {\n if (!didCreate) {\n setSetupError(\"Control Center could not create this connection. Check the fields and try again.\")\n return\n }\n setValues((current) => {\n const cleared = new Map(current)\n for (const field of catalog.configurationFields) {\n if (field.kind === \"secret\") cleared.set(field.key, \"\")\n }\n return cleared\n })\n })\n }\n\n const updateValue = (key: string, value: string): void => {\n setValues((current) => new Map(current).set(key, value))\n }\n\n return (\n <form className={styles.setupForm} onSubmit={submit}>\n <Field label=\"Connection name\" required size=\"compact\">\n {(controlProps) => (\n <input\n {...controlProps}\n maxLength={200}\n onChange={(event) => setDisplayName(event.currentTarget.value)}\n value={displayName}\n />\n )}\n </Field>\n {catalog.configurationFields.map((field) => (\n <Field\n description={field.description}\n key={field.key}\n label={field.label}\n required={field.required}\n size=\"compact\"\n >\n {(controlProps) => (\n <input\n {...controlProps}\n autoComplete={field.kind === \"secret\" ? \"off\" : undefined}\n disabled={field.isReadOnly}\n max={field.maximum ?? undefined}\n maxLength={field.kind === \"integer\" ? undefined : field.kind === \"secret\" ? 16_384 : 4_096}\n min={field.minimum ?? undefined}\n onChange={(event) => updateValue(field.key, event.currentTarget.value)}\n type={\n field.kind === \"secret\"\n ? \"password\"\n : field.kind === \"integer\"\n ? \"number\"\n : field.kind === \"url\"\n ? \"url\"\n : \"text\"\n }\n value={values.get(field.key) ?? \"\"}\n />\n )}\n </Field>\n ))}\n {setupError === null ? null : (\n <Text as=\"p\" className={styles.setupError} role=\"alert\" variant=\"body\">\n {setupError}\n </Text>\n )}\n <div className={styles.setupActions}>\n <Button disabled={isSubmitting} onClick={onCancel} type=\"button\" variant=\"secondary\">\n Cancel\n </Button>\n <Button loading={isSubmitting} type=\"submit\" variant=\"primary\">\n Enable and test\n </Button>\n </div>\n </form>\n )\n}\n\nconst CatalogCard = ({\n atlassianProfiles,\n atlassianProfilesState,\n atlassianSetupIntent,\n awsProfiles,\n awsProfilesState,\n canConfigure,\n catalog,\n catalogs,\n isAdditional,\n isOpen,\n isRecovery,\n isSubmitting,\n onCancel,\n onDiscoverAws,\n onOpen,\n onStartAtlassianOAuth,\n onSubmit,\n onSubmitAtlassian,\n onSubmitAws\n}: {\n readonly atlassianProfiles: AtlassianProfileDiscoveryResponse\n readonly atlassianProfilesState: AtlassianProfilesState[\"_tag\"]\n readonly atlassianSetupIntent: AtlassianSetupIntent\n readonly awsProfiles: AwsProfileDiscoveryResponse\n readonly awsProfilesState: AwsProfilesState[\"_tag\"]\n readonly canConfigure: boolean\n readonly catalog: PluginServiceCatalogEntry\n readonly catalogs: ReadonlyArray<PluginServiceCatalogEntry>\n readonly isAdditional: boolean\n readonly isOpen: boolean\n readonly isSubmitting: boolean\n readonly isRecovery: boolean\n readonly onCancel: () => void\n readonly onDiscoverAws: (\n request: AwsResourceDiscoveryRequest,\n signal: AbortSignal\n ) => Promise<AwsResourceDiscoveryResponse>\n readonly onOpen: () => void\n readonly onStartAtlassianOAuth: (\n providers: AtlassianOAuthProviderIntent,\n signal: AbortSignal,\n configuration?: AtlassianOAuthClientConfiguration\n ) => Promise<AtlassianOAuthGrantStartResponse>\n readonly onSubmit: (displayName: string, values: ReadonlyArray<CreatePluginConnectionValue>) => Promise<boolean>\n readonly onSubmitAtlassian: (drafts: ReadonlyArray<ServiceConnectionDraft>) => Promise<boolean>\n readonly onSubmitAws: (drafts: ReadonlyArray<ServiceConnectionDraft>) => Promise<boolean>\n}): ReactElement => {\n const isAws = catalog.providerId === \"codecommit\" || catalog.providerId === \"codepipeline\"\n const isAtlassian = catalog.providerId === \"jira\" || catalog.providerId === \"confluence\"\n return (\n <Surface as=\"article\" className={styles.card} padding=\"default\" shape=\"grouped\">\n <div className={styles.cardHeading}>\n <div className={styles.connectionIdentity}>\n <ServiceMark service={catalog.providerId} size=\"compact\" />\n <Text as=\"h2\" variant=\"card-title\">\n {catalog.displayName}\n </Text>\n </div>\n <StateLabel\n label={isRecovery ? \"Needs correction\" : isAdditional ? \"Add another\" : \"Not configured\"}\n size=\"compact\"\n tone={isRecovery ? \"critical\" : \"neutral\"}\n />\n </div>\n <Text tone=\"secondary\" variant=\"body\">\n {catalog.description}\n </Text>\n {isOpen ? (\n isAws ? (\n <AwsAccountSetupForm\n awsProfiles={awsProfiles}\n awsProfilesState={awsProfilesState}\n catalogs={catalogs}\n isSubmitting={isSubmitting}\n onCancel={onCancel}\n onDiscover={onDiscoverAws}\n onSubmit={onSubmitAws}\n />\n ) : isAtlassian ? (\n <AtlassianAccountSetupForm\n catalogs={catalogs}\n isSubmitting={isSubmitting}\n onCancel={onCancel}\n onStartOAuth={onStartAtlassianOAuth}\n onSubmit={onSubmitAtlassian}\n profiles={atlassianProfiles}\n profilesState={atlassianProfilesState}\n setupIntent={atlassianSetupIntent}\n />\n ) : (\n <SetupForm catalog={catalog} isSubmitting={isSubmitting} onCancel={onCancel} onSubmit={onSubmit} />\n )\n ) : (\n <div className={styles.cardAction}>\n <Button disabled={!canConfigure} onClick={onOpen} variant=\"secondary\">\n {isAws\n ? \"Configure AWS account\"\n : isAdditional && catalog.providerId === \"jira\"\n ? \"Add Jira project\"\n : isAdditional && catalog.providerId === \"confluence\"\n ? \"Add Confluence space\"\n : isAtlassian\n ? \"Configure Atlassian\"\n : \"Enable service\"}\n </Button>\n {!canConfigure ? (\n <Text tone=\"secondary\" variant=\"meta\">\n Owner access is required.\n </Text>\n ) : null}\n </div>\n )}\n </Surface>\n )\n}\n\nconst ServicePreviewCard = ({\n actionLabel = \"Pair to enable\",\n isActionDisabled = false,\n onEnable,\n service,\n statusLabel = \"Available\",\n statusTone = \"positive\"\n}: {\n readonly actionLabel?: string\n readonly isActionDisabled?: boolean\n readonly onEnable: () => void\n readonly service: FirstPartyServiceIdentity\n readonly statusLabel?: string\n readonly statusTone?: \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n}): ReactElement => (\n <Surface as=\"article\" className={styles.card} padding=\"default\" shape=\"grouped\">\n <div className={styles.cardHeading}>\n <div className={styles.connectionIdentity}>\n <ServiceMark service={service.providerId} size=\"compact\" />\n <Text as=\"h2\" variant=\"card-title\">\n {service.displayName}\n </Text>\n </div>\n <StateLabel label={statusLabel} size=\"compact\" tone={statusTone} />\n </div>\n <Text tone=\"secondary\" variant=\"body\">\n {service.description}\n </Text>\n <div className={styles.cardAction}>\n <Button disabled={isActionDisabled} onClick={onEnable} variant=\"primary\">\n {actionLabel}\n </Button>\n </div>\n </Surface>\n)\n\n/** Manage fixed first-party providers and prove configured identities with owner-only live checks. */\nexport const ServicesPage = ({\n transport = browserConnectionTestTransport\n}: {\n readonly transport?: ConnectionTestTransport\n} = {}): ReactElement => {\n const navigate = useNavigate()\n const [searchParams, setSearchParams] = useSearchParams()\n const { invalidateSession, state: sessionState } = useBrowserSession()\n const sessionKey = browserReadableSessionKey(sessionState)\n const [requestRevision, setRequestRevision] = useState(0)\n const [connectionsState, setConnectionsState] = useState<ConnectionsState>({ _tag: \"idle\" })\n const [awsProfilesState, setAwsProfilesState] = useState<AwsProfilesState>({ _tag: \"idle\" })\n const [atlassianProfilesState, setAtlassianProfilesState] = useState<AtlassianProfilesState>({ _tag: \"idle\" })\n const [testStates, setTestStates] = useState<ReadonlyMap<PluginConnectionId, ConnectionTestState>>(new Map())\n const [enablementStates, setEnablementStates] = useState<ReadonlyMap<PluginConnectionId, ConnectionEnablementState>>(\n new Map()\n )\n const [synchronizationStates, setSynchronizationStates] = useState<\n ReadonlyMap<PluginConnectionId, ConnectionSynchronizationViewState>\n >(new Map())\n const [openProvider, setOpenProvider] = useState<ProviderId | null>(null)\n const [atlassianSetupIntent, setAtlassianSetupIntent] = useState<AtlassianSetupIntent | null>(null)\n const [submittingProvider, setSubmittingProvider] = useState<ProviderId | null>(null)\n const testRequests = useRef(new Map<PluginConnectionId, AbortController>())\n const createRequest = useRef<AbortController | null>(null)\n const completedBatchDrafts = useRef(new Map<ProviderId, Set<string>>())\n const enablementRequests = useRef(new Map<PluginConnectionId, AbortController>())\n const awsProfileRequest = useRef<AbortController | null>(null)\n const atlassianProfileRequest = useRef<AbortController | null>(null)\n const synchronizationRequests = useRef(new Map<PluginConnectionId, AbortController>())\n\n const refreshSynchronization = useCallback(\n (pluginConnectionId: PluginConnectionId): void => {\n if (sessionKey === null || transport.synchronization === undefined) return\n synchronizationRequests.current.get(pluginConnectionId)?.abort()\n const request = new AbortController()\n synchronizationRequests.current.set(pluginConnectionId, request)\n setSynchronizationStates((current) => new Map(current).set(pluginConnectionId, { _tag: \"loading\" }))\n transport.synchronization(pluginConnectionId, request.signal).then(\n (synchronization) => {\n if (request.signal.aborted) return\n synchronizationRequests.current.delete(pluginConnectionId)\n setSynchronizationStates((current) =>\n new Map(current).set(pluginConnectionId, { _tag: \"ready\", synchronization })\n )\n },\n (failure) => {\n if (request.signal.aborted) return\n synchronizationRequests.current.delete(pluginConnectionId)\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setSynchronizationStates((current) => new Map(current).set(pluginConnectionId, { _tag: \"failed\" }))\n }\n )\n },\n [invalidateSession, sessionKey, transport]\n )\n\n const synchronizeConnection = useCallback(\n (pluginConnectionId: PluginConnectionId): void => {\n if (sessionKey === null || transport.synchronize === undefined) return\n synchronizationRequests.current.get(pluginConnectionId)?.abort()\n const request = new AbortController()\n synchronizationRequests.current.set(pluginConnectionId, request)\n setSynchronizationStates((current) => {\n const existing = current.get(pluginConnectionId)\n const previous = existing?._tag === \"ready\" ? existing.synchronization : null\n return new Map(current).set(pluginConnectionId, { _tag: \"syncing\", previous })\n })\n transport.synchronize(pluginConnectionId, request.signal).then(\n (synchronization) => {\n if (request.signal.aborted) return\n synchronizationRequests.current.delete(pluginConnectionId)\n setSynchronizationStates((current) =>\n new Map(current).set(pluginConnectionId, { _tag: \"ready\", synchronization })\n )\n },\n (failure) => {\n if (request.signal.aborted) return\n synchronizationRequests.current.delete(pluginConnectionId)\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setSynchronizationStates((current) => new Map(current).set(pluginConnectionId, { _tag: \"failed\" }))\n }\n )\n },\n [invalidateSession, sessionKey, transport]\n )\n\n useEffect(() => {\n if (sessionKey === null) {\n setConnectionsState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n setConnectionsState({ _tag: \"loading\" })\n transport.overview(request.signal).then(\n (overview) => {\n if (!request.signal.aborted) setConnectionsState({ _tag: \"ready\", overview })\n },\n (failure) => {\n if (request.signal.aborted) return\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setConnectionsState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [invalidateSession, requestRevision, sessionKey, transport])\n\n useEffect(() => {\n if (connectionsState._tag !== \"ready\" || transport.synchronization === undefined) return\n const synchronizable = connectionsState.overview.connections.filter(\n ({ supportsSynchronization }) => supportsSynchronization\n )\n const synchronizableIds = new Set(synchronizable.map(({ pluginConnectionId }) => pluginConnectionId))\n for (const [pluginConnectionId, request] of synchronizationRequests.current) {\n if (synchronizableIds.has(pluginConnectionId)) continue\n request.abort()\n synchronizationRequests.current.delete(pluginConnectionId)\n }\n setSynchronizationStates((current) => {\n const next = new Map(current)\n let changed = false\n for (const pluginConnectionId of next.keys()) {\n if (synchronizableIds.has(pluginConnectionId)) continue\n next.delete(pluginConnectionId)\n changed = true\n }\n return changed ? next : current\n })\n for (const connection of synchronizable) refreshSynchronization(connection.pluginConnectionId)\n return () => {\n for (const connection of synchronizable) {\n synchronizationRequests.current.get(connection.pluginConnectionId)?.abort()\n synchronizationRequests.current.delete(connection.pluginConnectionId)\n }\n }\n }, [connectionsState, refreshSynchronization, transport.synchronization])\n\n useEffect(() => {\n if (sessionKey === null || (openProvider !== \"codecommit\" && openProvider !== \"codepipeline\")) return\n awsProfileRequest.current?.abort()\n const request = new AbortController()\n awsProfileRequest.current = request\n setAwsProfilesState({ _tag: \"loading\" })\n const discoverAwsProfiles = transport.discoverAwsProfiles\n if (discoverAwsProfiles === undefined) {\n setAwsProfilesState({ _tag: \"failed\" })\n return () => request.abort()\n }\n discoverAwsProfiles(request.signal).then(\n (profiles) => {\n if (!request.signal.aborted) setAwsProfilesState({ _tag: \"ready\", profiles })\n },\n (failure) => {\n if (request.signal.aborted) return\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setAwsProfilesState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [invalidateSession, openProvider, sessionKey, transport])\n\n useEffect(() => {\n if (sessionKey === null || (openProvider !== \"jira\" && openProvider !== \"confluence\")) return\n atlassianProfileRequest.current?.abort()\n const request = new AbortController()\n atlassianProfileRequest.current = request\n setAtlassianProfilesState({ _tag: \"loading\" })\n const discoverAtlassianProfiles = transport.discoverAtlassianProfiles\n if (discoverAtlassianProfiles === undefined) {\n setAtlassianProfilesState({ _tag: \"failed\" })\n return () => request.abort()\n }\n discoverAtlassianProfiles(request.signal).then(\n (profiles) => {\n if (!request.signal.aborted) setAtlassianProfilesState({ _tag: \"ready\", profiles })\n },\n (failure) => {\n if (request.signal.aborted) return\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setAtlassianProfilesState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [invalidateSession, openProvider, sessionKey, transport])\n\n useEffect(() => {\n setTestStates(new Map())\n setEnablementStates(new Map())\n setSynchronizationStates(new Map())\n setOpenProvider(null)\n setAtlassianSetupIntent(null)\n setSubmittingProvider(null)\n setAwsProfilesState({ _tag: \"idle\" })\n setAtlassianProfilesState({ _tag: \"idle\" })\n completedBatchDrafts.current.clear()\n return () => {\n for (const request of testRequests.current.values()) request.abort()\n testRequests.current.clear()\n createRequest.current?.abort()\n createRequest.current = null\n awsProfileRequest.current?.abort()\n awsProfileRequest.current = null\n atlassianProfileRequest.current?.abort()\n atlassianProfileRequest.current = null\n for (const request of synchronizationRequests.current.values()) request.abort()\n synchronizationRequests.current.clear()\n for (const request of enablementRequests.current.values()) request.abort()\n enablementRequests.current.clear()\n }\n }, [sessionKey])\n\n useEffect(() => {\n if (\n connectionsState._tag !== \"ready\" ||\n sessionState._tag !== \"authenticated\" ||\n sessionState.session.permission !== \"workspace-owner\"\n ) {\n return\n }\n const requestedProvider = selectedServiceProvider(searchParams, \"enable\")\n if (requestedProvider === null) return\n if (!connectionsState.overview.catalog.some(({ providerId }) => providerId === requestedProvider)) return\n if (requestedProvider === \"jira\" || requestedProvider === \"confluence\") {\n const callbackProviders = selectedAtlassianOAuthProviders(searchParams)\n const hasAlignedCallbackIntent = callbackProviders?.includes(requestedProvider) === true\n setAtlassianSetupIntent(\n !hasAlignedCallbackIntent\n ? missingAtlassianProductsIntent(connectionsState.overview.connections, requestedProvider)\n : {\n preferredProfileId: selectedAtlassianOAuthProfileId(searchParams),\n preferredSiteId: selectedAtlassianOAuthSiteId(searchParams),\n providers: callbackProviders,\n requestedOAuthProviders: callbackProviders\n }\n )\n }\n setOpenProvider(requestedProvider)\n const nextSearchParams = new URLSearchParams(searchParams)\n nextSearchParams.delete(\"enable\")\n nextSearchParams.delete(\"atlassianProfile\")\n nextSearchParams.delete(\"atlassianProvider\")\n nextSearchParams.delete(\"atlassianSite\")\n setSearchParams(nextSearchParams, { replace: true })\n }, [connectionsState, searchParams, sessionState, setSearchParams])\n\n const testConnection = useCallback(\n (pluginConnectionId: PluginConnectionId): void => {\n if (sessionKey === null) return\n testRequests.current.get(pluginConnectionId)?.abort()\n const request = new AbortController()\n testRequests.current.set(pluginConnectionId, request)\n setTestStates((current) => new Map(current).set(pluginConnectionId, { _tag: \"testing\" }))\n transport.test(pluginConnectionId, request.signal).then(\n (result) => {\n if (request.signal.aborted) return\n testRequests.current.delete(pluginConnectionId)\n setTestStates((current) => new Map(current).set(pluginConnectionId, { _tag: \"result\", result }))\n },\n (failure) => {\n if (request.signal.aborted) return\n testRequests.current.delete(pluginConnectionId)\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setTestStates((current) => new Map(current).set(pluginConnectionId, { _tag: \"request-failed\" }))\n }\n )\n },\n [invalidateSession, sessionKey, transport]\n )\n\n const createConnections = useCallback(\n async (drafts: ReadonlyArray<ServiceConnectionDraft>, originProvider: ProviderId): Promise<boolean> => {\n if (sessionKey === null) return false\n createRequest.current?.abort()\n const request = new AbortController()\n createRequest.current = request\n setSubmittingProvider(originProvider)\n let hasFailedTest = false\n let hasSetupFailure = false\n let shouldRefreshOverview = false\n const completed = completedBatchDrafts.current.get(originProvider) ?? new Set<string>()\n completedBatchDrafts.current.set(originProvider, completed)\n const acceptResponse = (draftKey: string, response: CreatePluginConnectionResponse): void => {\n completed.add(draftKey)\n hasFailedTest = hasFailedTest || response.test._tag !== \"healthy\"\n shouldRefreshOverview = shouldRefreshOverview || response.connection.providerAccountId !== null\n setConnectionsState((current) =>\n current._tag === \"ready\"\n ? {\n _tag: \"ready\",\n overview: {\n ...current.overview,\n connections: [...current.overview.connections, response.connection]\n }\n }\n : current\n )\n setTestStates((current) =>\n new Map(current).set(response.connection.pluginConnectionId, {\n _tag: \"result\",\n result: response.test\n })\n )\n }\n try {\n const pending = drafts.filter((draft) => !completed.has(setupDraftKey(draft)))\n if (transport.createBatch !== undefined && pending.length > 0) {\n const draftKeysByConnectionId = new Map<PluginConnectionId, string>()\n const connections: Array<CreatePluginConnectionRequest> = []\n for (const draft of pending) {\n const pluginConnectionId = await transport.makeConnectionId()\n draftKeysByConnectionId.set(pluginConnectionId, setupDraftKey(draft))\n connections.push({\n pluginConnectionId,\n providerId: draft.catalog.providerId,\n displayName: draft.displayName,\n values: draft.values\n })\n }\n const batch = await transport.createBatch({ connections }, request.signal)\n if (request.signal.aborted) return false\n const completedConnectionIds = new Set<PluginConnectionId>()\n for (const result of batch.results) {\n const pluginConnectionId =\n result._tag === \"failed\" ? result.pluginConnectionId : result.response.connection.pluginConnectionId\n if (!draftKeysByConnectionId.has(pluginConnectionId) || completedConnectionIds.has(pluginConnectionId)) {\n hasSetupFailure = true\n continue\n }\n completedConnectionIds.add(pluginConnectionId)\n if (result._tag === \"failed\") {\n hasSetupFailure = true\n continue\n }\n const draftKey = draftKeysByConnectionId.get(result.response.connection.pluginConnectionId)\n if (draftKey !== undefined) acceptResponse(draftKey, result.response)\n }\n hasSetupFailure = hasSetupFailure || completedConnectionIds.size !== connections.length\n } else\n for (const draft of pending) {\n const draftKey = setupDraftKey(draft)\n const pluginConnectionId = await transport.makeConnectionId()\n const response = await transport.create(\n {\n pluginConnectionId,\n providerId: draft.catalog.providerId,\n displayName: draft.displayName,\n values: draft.values\n },\n request.signal\n )\n if (request.signal.aborted) return false\n acceptResponse(draftKey, response)\n }\n if (shouldRefreshOverview) {\n try {\n const refreshedOverview = await transport.overview(request.signal)\n if (!request.signal.aborted) setConnectionsState({ _tag: \"ready\", overview: refreshedOverview })\n } catch (failure: unknown) {\n if (request.signal.aborted) return false\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n }\n }\n if (hasSetupFailure) completedBatchDrafts.current.set(originProvider, completed)\n else completedBatchDrafts.current.delete(originProvider)\n createRequest.current = null\n setOpenProvider(hasFailedTest || hasSetupFailure ? originProvider : null)\n setSubmittingProvider(null)\n return !hasSetupFailure\n } catch (failure: unknown) {\n if (request.signal.aborted) return false\n createRequest.current = null\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setSubmittingProvider(null)\n return false\n }\n },\n [invalidateSession, sessionKey, transport]\n )\n\n const createConnection = useCallback(\n (\n catalog: PluginServiceCatalogEntry,\n displayName: string,\n values: ReadonlyArray<CreatePluginConnectionValue>\n ): Promise<boolean> => createConnections([{ catalog, displayName, values }], catalog.providerId),\n [createConnections]\n )\n\n const setConnectionEnabled = useCallback(\n (pluginConnectionId: PluginConnectionId, isEnabled: boolean): void => {\n if (sessionKey === null) return\n if (!isEnabled) {\n testRequests.current.get(pluginConnectionId)?.abort()\n testRequests.current.delete(pluginConnectionId)\n setTestStates((current) => {\n const next = new Map(current)\n next.delete(pluginConnectionId)\n return next\n })\n }\n enablementRequests.current.get(pluginConnectionId)?.abort()\n const request = new AbortController()\n enablementRequests.current.set(pluginConnectionId, request)\n setEnablementStates((current) => new Map(current).set(pluginConnectionId, \"changing\"))\n transport.setEnabled(pluginConnectionId, isEnabled, request.signal).then(\n (connection) => {\n if (request.signal.aborted) return\n enablementRequests.current.delete(pluginConnectionId)\n setConnectionsState((current) =>\n current._tag === \"ready\"\n ? {\n _tag: \"ready\",\n overview: {\n ...current.overview,\n connections: current.overview.connections.map((candidate) =>\n candidate.pluginConnectionId === pluginConnectionId ? connection : candidate\n )\n }\n }\n : current\n )\n setEnablementStates((current) => {\n const next = new Map(current)\n next.delete(pluginConnectionId)\n return next\n })\n if (isEnabled) {\n testConnection(pluginConnectionId)\n } else {\n setTestStates((current) => {\n const next = new Map(current)\n next.delete(pluginConnectionId)\n return next\n })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n enablementRequests.current.delete(pluginConnectionId)\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) invalidateSession(sessionKey)\n setEnablementStates((current) => new Map(current).set(pluginConnectionId, \"request-failed\"))\n }\n )\n },\n [invalidateSession, sessionKey, testConnection, transport]\n )\n\n const session =\n sessionState._tag === \"authenticated\" || sessionState._tag === \"storage-unavailable\" ? sessionState.session : null\n const canConfigure = sessionState._tag === \"authenticated\" && sessionState.session.permission === \"workspace-owner\"\n\n return (\n <section aria-labelledby=\"services-title\" className={styles.page}>\n <header className={styles.heading}>\n <Text as=\"h1\" id=\"services-title\" variant=\"page-title\">\n Services\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n {session === null || (connectionsState._tag === \"ready\" && connectionsState.overview.connections.length === 0)\n ? \"Choose a service below. Control Center will enable it and verify the exact account before using it.\"\n : \"Configure first-party providers and verify the exact account each connection represents.\"}\n </Text>\n </header>\n {session === null && sessionState._tag !== \"checking\" ? (\n <div className={styles.grid}>\n {firstPartyServiceIdentities.map((service) => (\n <ServicePreviewCard\n key={service.providerId}\n onEnable={() => navigate(servicePairingPath(service.providerId))}\n service={service}\n />\n ))}\n </div>\n ) : connectionsState._tag === \"loading\" || connectionsState._tag === \"idle\" ? (\n <div className={styles.grid}>\n {firstPartyServiceIdentities.map((service) => (\n <ServicePreviewCard\n actionLabel=\"Loading connections\"\n isActionDisabled\n key={service.providerId}\n onEnable={() => undefined}\n service={service}\n statusLabel=\"Loading\"\n statusTone=\"progress\"\n />\n ))}\n </div>\n ) : connectionsState._tag === \"failed\" ? (\n <>\n <StatePanel\n action={<Button onClick={() => setRequestRevision((revision) => revision + 1)}>Try again</Button>}\n description=\"Control Center could not load connection details. The installed services remain visible below.\"\n title=\"Connections unavailable\"\n />\n <div className={styles.grid}>\n {firstPartyServiceIdentities.map((service) => (\n <ServicePreviewCard\n actionLabel=\"Retry connections\"\n key={service.providerId}\n onEnable={() => setRequestRevision((revision) => revision + 1)}\n service={service}\n statusLabel=\"Installed\"\n statusTone=\"neutral\"\n />\n ))}\n </div>\n </>\n ) : (\n <>\n {connectionsState.overview.accounts.length === 0 ? null : (\n <section aria-labelledby=\"connected-accounts-title\" className={styles.accounts}>\n <div className={styles.sectionHeading}>\n <Text as=\"h2\" id=\"connected-accounts-title\" variant=\"section-title\">\n Connected accounts\n </Text>\n <Text tone=\"secondary\" variant=\"body\">\n One verified provider identity can own several followed resources.\n </Text>\n </div>\n <div className={styles.accountGrid}>\n {connectionsState.overview.accounts.map((account) => (\n <ProviderAccountCard\n account={account}\n canConfigure={canConfigure}\n connections={connectionsState.overview.connections}\n enablementStates={enablementStates}\n key={account.providerAccountId}\n onAdd={(providerId, providerImmutableId) => {\n if (providerId === \"jira\" || providerId === \"confluence\") {\n setAtlassianSetupIntent({\n preferredProfileId: null,\n preferredSiteId: providerImmutableId,\n providers: [providerId],\n requestedOAuthProviders: null\n })\n }\n setOpenProvider(providerId)\n }}\n onSetEnabled={setConnectionEnabled}\n onRefreshSynchronization={refreshSynchronization}\n onSynchronize={synchronizeConnection}\n synchronizationStates={synchronizationStates}\n onTest={testConnection}\n testStates={testStates}\n />\n ))}\n </div>\n </section>\n )}\n <div className={styles.grid}>\n {connectionsState.overview.catalog.flatMap((catalog) => {\n const configured = connectionsState.overview.connections.filter(\n (connection) => connection.providerId === catalog.providerId\n )\n const groupedResourceIds = new Set(\n connectionsState.overview.accounts.flatMap(({ resources }) =>\n resources.map(({ followedResourceId }) => followedResourceId)\n )\n )\n const standaloneConnections = configured.filter(\n ({ followedResourceId }) => followedResourceId === null || !groupedResourceIds.has(followedResourceId)\n )\n const missingAtlassianIntent = missingAtlassianProductsIntent(\n connectionsState.overview.connections,\n catalog.providerId === \"jira\" || catalog.providerId === \"confluence\" ? catalog.providerId : undefined\n )\n const setupIntent = resolvedAtlassianSetupIntent(\n atlassianSetupIntent ?? missingAtlassianIntent,\n connectionsState.overview.connections,\n atlassianProfilesState\n )\n const cards = standaloneConnections.map((connection) => (\n <ConnectionCard\n canConfigure={canConfigure}\n canTest={canConfigure}\n connection={connection}\n enablementState={enablementStates.get(connection.pluginConnectionId)}\n key={connection.pluginConnectionId}\n onConfigure={() => {\n if (catalog.providerId === \"jira\" || catalog.providerId === \"confluence\") {\n setAtlassianSetupIntent(allAtlassianProductsIntent)\n }\n setOpenProvider(catalog.providerId)\n }}\n onSetEnabled={setConnectionEnabled}\n onRefreshSynchronization={refreshSynchronization}\n onSynchronize={synchronizeConnection}\n onTest={testConnection}\n synchronizationState={synchronizationStates.get(connection.pluginConnectionId)}\n testState={testStates.get(connection.pluginConnectionId)}\n />\n ))\n if (\n configured.length > 0 &&\n openProvider !== catalog.providerId &&\n catalog.providerId !== \"jira\" &&\n catalog.providerId !== \"confluence\"\n )\n return cards\n return [\n ...cards,\n <CatalogCard\n atlassianProfiles={atlassianProfilesState._tag === \"ready\" ? atlassianProfilesState.profiles : []}\n atlassianProfilesState={atlassianProfilesState._tag}\n atlassianSetupIntent={setupIntent}\n awsProfiles={awsProfilesState._tag === \"ready\" ? awsProfilesState.profiles : []}\n awsProfilesState={awsProfilesState._tag}\n canConfigure={canConfigure}\n catalog={catalog}\n catalogs={connectionsState.overview.catalog}\n isAdditional={\n configured.length > 0 && (catalog.providerId === \"jira\" || catalog.providerId === \"confluence\")\n }\n isOpen={openProvider === catalog.providerId}\n isRecovery={standaloneConnections.length > 0}\n isSubmitting={submittingProvider === catalog.providerId}\n key={`${catalog.providerId}-catalog`}\n onCancel={() => {\n completedBatchDrafts.current.delete(catalog.providerId)\n setAtlassianSetupIntent(null)\n setOpenProvider(null)\n }}\n onDiscoverAws={(request, signal) => {\n const discover = transport.discoverAwsResources\n if (discover === undefined)\n return Promise.reject(new Error(\"AWS resource discovery is unavailable\"))\n return discover(request, signal).catch((failure: unknown) => {\n if (sessionKey !== null && Predicate.isTagged(\"UnauthorizedApiError\")(failure)) {\n invalidateSession(sessionKey)\n }\n return Promise.reject(failure)\n })\n }}\n onOpen={() => {\n if (openProvider !== catalog.providerId) {\n completedBatchDrafts.current.delete(catalog.providerId)\n }\n if (catalog.providerId === \"jira\" || catalog.providerId === \"confluence\") {\n setAtlassianSetupIntent(missingAtlassianIntent)\n }\n setOpenProvider(catalog.providerId)\n }}\n onStartAtlassianOAuth={(providers, signal, configuration) => {\n const start = transport.startAtlassianOAuthGrant\n if (start === undefined) return Promise.reject(new Error(\"Atlassian OAuth is unavailable\"))\n return start(providers, signal, configuration)\n }}\n onSubmit={(displayName, values) => createConnection(catalog, displayName, values)}\n onSubmitAtlassian={(drafts) => createConnections(drafts, catalog.providerId)}\n onSubmitAws={(drafts) => createConnections(drafts, catalog.providerId)}\n />\n ]\n })}\n </div>\n </>\n )}\n </section>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._form_piwc3_1,._intro_piwc3_2,._fallback_piwc3_3{gap:var(--rly-space-12);display:grid}._form_piwc3_1{gap:var(--rly-space-20)}._intro_piwc3_2{gap:var(--rly-space-4)}._resources_piwc3_16{gap:var(--rly-space-12);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}._actions_piwc3_22{justify-content:flex-end;gap:var(--rly-space-8);flex-wrap:wrap;display:flex}._error_piwc3_29{color:var(--rly-color-blocked-ink)}@media (width<=40rem){._resources_piwc3_16{grid-template-columns:1fr}}._form_1gjxb_1{gap:var(--rly-space-20);display:grid}._intro_1gjxb_6{gap:var(--rly-space-4);display:grid}._resources_1gjxb_11{gap:var(--rly-space-12);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}._resources_1gjxb_11 textarea{resize:vertical;min-block-size:7rem}._discoveryActions_1gjxb_22,._resourcePanelHeading_1gjxb_23{align-items:center;gap:var(--rly-space-8);flex-wrap:wrap;display:flex}._resourcePanel_1gjxb_23{align-content:start;gap:var(--rly-space-8);min-inline-size:0;padding:var(--rly-space-12);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);display:grid}._resourcePanelHeading_1gjxb_23{justify-content:space-between}._choiceList_1gjxb_44{gap:var(--rly-space-4);max-block-size:13rem;display:grid;overflow:auto}._choice_1gjxb_44{align-items:center;gap:var(--rly-space-8);padding:var(--rly-space-4);display:flex}._actions_1gjxb_58{justify-content:flex-end;gap:var(--rly-space-8);flex-wrap:wrap;display:flex}._error_1gjxb_65{color:var(--rly-color-blocked-ink)}@media (width<=40rem){._resources_1gjxb_11{grid-template-columns:1fr}}._page_1ib7n_1{gap:var(--rly-space-40);display:grid}._heading_1ib7n_6{gap:var(--rly-space-12);max-inline-size:48rem;display:grid}._grid_1ib7n_12{gap:var(--rly-space-16);grid-template-columns:repeat(auto-fit,minmax(min(100%,22rem),1fr));display:grid}._accounts_1ib7n_18,._accountCard_1ib7n_19,._accountIdentity_1ib7n_20,._resourceList_1ib7n_21,._resource_1ib7n_21,._sectionHeading_1ib7n_23{display:grid}._accounts_1ib7n_18,._accountCard_1ib7n_19{gap:var(--rly-space-20)}._sectionHeading_1ib7n_23,._accountIdentity_1ib7n_20,._resource_1ib7n_21,._resourceList_1ib7n_21{gap:var(--rly-space-8)}._accountGrid_1ib7n_39{gap:var(--rly-space-16);display:grid}._accountHeading_1ib7n_44,._resourceHeading_1ib7n_45,._accountActions_1ib7n_46,._resourceActions_1ib7n_47{align-items:center;gap:var(--rly-space-12);display:flex}._accountHeading_1ib7n_44,._resourceHeading_1ib7n_45{justify-content:space-between}._accountActions_1ib7n_46,._resourceActions_1ib7n_47{flex-wrap:wrap}._accountActions_1ib7n_46{padding-block-start:var(--rly-space-4)}._resource_1ib7n_21{padding:var(--rly-space-16);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);background:var(--rly-color-surface-2)}._card_1ib7n_74{align-content:start;gap:var(--rly-space-24);display:grid}._cardHeading_1ib7n_80,._cardAction_1ib7n_81{justify-content:space-between;align-items:center;gap:var(--rly-space-16);display:flex}._synchronization_1ib7n_88,._syncState_1ib7n_89{gap:var(--rly-space-6);display:grid}._syncActions_1ib7n_94{gap:var(--rly-space-8);flex-wrap:wrap;display:flex}._connectionIdentity_1ib7n_100{align-items:center;gap:var(--rly-space-12);min-inline-size:0;display:flex}._testEvidence_1ib7n_107{gap:var(--rly-space-12);padding:var(--rly-space-16);border-inline-start:2px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);background:var(--rly-color-surface-2);display:grid}._identity_1ib7n_116{gap:var(--rly-space-4);display:grid}._setupForm_1ib7n_121{gap:var(--rly-space-16);display:grid}._setupActions_1ib7n_126{justify-content:flex-end;gap:var(--rly-space-8);flex-wrap:wrap;display:flex}._setupError_1ib7n_133{color:var(--rly-color-blocked-ink)}._identifier_1ib7n_137{overflow-wrap:anywhere}@media (width<=32rem){._cardHeading_1ib7n_80,._cardAction_1ib7n_81,._accountHeading_1ib7n_44,._resourceHeading_1ib7n_45{flex-direction:column;align-items:flex-start}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._body_vqgmt_1,._loading_vqgmt_2,._content_vqgmt_3,._identity_vqgmt_4,._identityMeta_vqgmt_5,._section_vqgmt_6,._ledger_vqgmt_7{display:grid}._body_vqgmt_1,._loading_vqgmt_2,._content_vqgmt_3{gap:var(--rly-space-20)}._identity_vqgmt_4,._section_vqgmt_6{gap:var(--rly-space-12)}._identity_vqgmt_4{padding-block:var(--rly-space-12) var(--rly-space-20);border-block-end:1px solid var(--rly-color-border-1)}._identity_vqgmt_4 h2,._identity_vqgmt_4 p,._section_vqgmt_6 h3,._ledger_vqgmt_7 dd{margin:0}._identity_vqgmt_4 h2{overflow-wrap:anywhere;text-wrap:balance;max-inline-size:13ch}._identityMeta_vqgmt_5{align-items:center;gap:var(--rly-space-8) var(--rly-space-12);grid-template-columns:repeat(2,minmax(0,max-content))}._ledger_vqgmt_7{margin:0}._ledger_vqgmt_7 div{gap:var(--rly-space-12);padding-block:var(--rly-space-12);border-block-start:1px solid var(--rly-color-border-1);grid-template-columns:minmax(7rem,.35fr) minmax(0,1fr);display:grid}._ledger_vqgmt_7 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._ledger_vqgmt_7 dd{overflow-wrap:anywhere;font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._footerLink_vqgmt_70{min-block-size:3rem;padding-inline:var(--rly-space-16);border-radius:var(--rly-radius-control);background:var(--rly-color-action-background);color:var(--rly-color-action-foreground);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-align:center;justify-content:center;align-items:center;text-decoration:none;display:inline-flex}._footerLink_vqgmt_70:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-2)}@media (width<=30rem){._identityMeta_vqgmt_5,._ledger_vqgmt_7 div{grid-template-columns:minmax(0,1fr)}}._page_18su2_1,._hero_18su2_2,._page_18su2_1{gap:clamp(2.5rem,7vw,6rem)}._hero_18su2_2{gap:var(--rly-space-16)}._hero_18su2_2 p,._hero_18su2_2 h1{margin:0}._hero_18su2_2 h1{letter-spacing:-.075em;text-wrap:balance;max-inline-size:9ch}._intro_18su2_22{max-inline-size:46rem}._askRelay_18su2_26{min-block-size:3.5rem;inline-size:fit-content;padding-inline:var(--rly-space-20);border-radius:var(--rly-radius-control);background:var(--rly-color-action-background);color:var(--rly-color-action-foreground);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);align-items:center;text-decoration:none;display:inline-flex}._summary_18su2_40{border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-group);grid-template-columns:repeat(4,minmax(0,1fr));margin:0;display:grid;overflow:hidden}._summary_18su2_40 div{gap:var(--rly-space-12);min-block-size:8rem;padding:var(--rly-space-20);background:var(--rly-color-surface-1);display:grid}._summary_18su2_40 div+div{border-inline-start:1px solid var(--rly-color-border-1)}._summary_18su2_40 dt{color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font)}._summary_18su2_40 dd{color:var(--rly-color-text-1);letter-spacing:-.07em;margin:0;font-size:clamp(2.5rem,6vw,5rem);font-weight:700;line-height:.9}._summary_18su2_40 div[data-source=action]{box-shadow:inset 0 4px var(--rly-color-service-codecommit)}._summary_18su2_40 div[data-source=relationship]{box-shadow:inset 0 4px var(--rly-color-service-codepipeline)}._summary_18su2_40 div[data-source=plugin-sync]{box-shadow:inset 0 4px var(--rly-color-service-jira)}._summary_18su2_40 div[data-source=system]{box-shadow:inset 0 4px var(--rly-color-focus)}._filters_18su2_89{gap:var(--rly-space-12);grid-template-columns:2fr 1fr 1fr;display:grid}._filters_18su2_89 label{gap:var(--rly-space-8);color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);display:grid}._filters_18su2_89 select,._filters_18su2_89 input{min-block-size:3.5rem;inline-size:100%;padding-inline:var(--rly-space-16);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);background:var(--rly-color-surface-1);color:var(--rly-color-text-1);font:inherit}._events_18su2_115{border-block-start:1px solid var(--rly-color-border-1);margin:0;padding:0;list-style:none}._rowActor_18su2_122{gap:var(--rly-space-8);justify-items:start;display:grid}@media (width<=48rem){._summary_18su2_40{grid-template-columns:repeat(2,minmax(0,1fr))}._summary_18su2_40 div:nth-child(3){border-inline-start:0}._summary_18su2_40 div:nth-child(n+3){border-block-start:1px solid var(--rly-color-border-1)}._filters_18su2_89{grid-template-columns:1fr}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{a as r,h as i,i as a,n as o,r as s,t as c,w as l}from"./Dialog-DwSIPb-B-DVn37afM.js";import{a as u,c as d,i as f,o as p,s as m}from"./index-DLoOV6Hp.js";import{a as h,v as g}from"./patterns-DEbg7R-A-Cw0A2uKS.js";import{J as _,K as v,M as y,Q as b,d as x,dt as S,i as C,pt as w,st as T,t as E,zt as D}from"./client-OmvShYdC.js";import{t as O}from"./WorkspaceEntityLink-BRifdJHn.js";var k=e(t(),1),A={body:`_body_vqgmt_1`,loading:`_loading_vqgmt_2`,content:`_content_vqgmt_3`,identity:`_identity_vqgmt_4`,identityMeta:`_identityMeta_vqgmt_5`,section:`_section_vqgmt_6`,ledger:`_ledger_vqgmt_7`,footerLink:`_footerLink_vqgmt_70`},j=D(`UnauthorizedApiError`),M={load:(e,t)=>w(T(function*(){return yield*(yield*E()).timeline.detail({params:{eventKey:e}})}).pipe(S(C)),{signal:t})},N=(e,t,n,r=M)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`});(0,k.useEffect)(()=>{if(e===null||t===null){s({_tag:`idle`});return}let i=new AbortController;return s({_tag:`loading`,eventKey:e,sessionKey:t}),r.load(e,i.signal).then(n=>{i.signal.aborted||s({_tag:`ready`,detail:n,eventKey:e,sessionKey:t})},r=>{i.signal.aborted||(j(r)&&n(t),s({_tag:`failed`,eventKey:e,sessionKey:t}))}),()=>i.abort()},[e,n,i,t,r]);let c=e===null||t===null?{_tag:`idle`}:o._tag===`idle`||o.eventKey!==e||o.sessionKey!==t?{_tag:`loading`,eventKey:e,sessionKey:t}:o;return{retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:c}},P=n(),F={action:`Governed action`,"plugin-sync":`Service sync`,relationship:`Delivery link`,system:`Control Center`},I=e=>_(e.occurredAt,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`,second:`2-digit`,year:`numeric`}),L=e=>{let t=[{label:`Actor`,value:e.identifiers.actorId},{label:`Agent job`,value:e.agentJob?.jobId??null},{label:`Action`,value:e.identifiers.actionId},{label:`Relationship`,value:e.identifiers.relationshipId},{label:`Connection`,value:e.identifiers.pluginConnectionId},{label:`Release`,value:e.identifiers.releaseId},{label:`Entity`,value:e.identifiers.entityId}];return[{label:`Event`,value:e.event.eventKey},{label:`Type`,value:e.event.eventType},...t.filter(e=>e.value!==null)]},R=({agentHref:e,event:t,onClose:n,onSessionExpired:l,sessionKey:u,transport:d})=>{let p=N(t?.eventKey??null,u,l,d);return(0,P.jsx)(a.Root,{onOpenChange:e=>{e||n()},open:t!==null,children:(0,P.jsxs)(a.Content,{closeLabel:`Close event details`,description:`Durable provenance for this exact workspace event.`,title:`Event details`,children:[(0,P.jsx)(a.Body,{className:A.body,children:t===null||p.state._tag===`idle`||p.state._tag===`loading`?(0,P.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading event details`,className:A.loading,children:[(0,P.jsx)(r,{height:`10rem`}),(0,P.jsx)(r,{height:`14rem`})]}):p.state._tag===`failed`?(0,P.jsx)(o,{action:(0,P.jsx)(c,{onClick:p.retry,children:`Try again`}),description:`The Timeline row remains unchanged. Its provenance could not be loaded.`,title:`Event details unavailable`,tone:`caution`}):(0,P.jsxs)(`div`,{className:A.content,children:[(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-detail-title`,className:A.identity,children:[(0,P.jsx)(f,{tone:`secondary`,variant:`label`,children:F[p.state.detail.event.sourceKind]}),(0,P.jsx)(f,{as:`h2`,id:`timeline-detail-title`,variant:`page-title`,children:p.state.detail.event.title}),(0,P.jsxs)(`div`,{className:A.identityMeta,children:[(0,P.jsx)(s,{label:p.state.detail.event.actor.kind,size:`compact`,tone:p.state.detail.event.actor.kind===`agent`?`progress`:`neutral`}),p.state.detail.event.service===null?null:(0,P.jsx)(g,{service:p.state.detail.event.service,size:`compact`}),(0,P.jsx)(f,{tone:`secondary`,variant:`meta`,children:p.state.detail.event.actor.label}),(0,P.jsxs)(f,{as:`time`,dateTime:v(p.state.detail.event.occurredAt),tone:`secondary`,variant:`meta`,children:[I(p.state.detail.event),` UTC`]})]})]}),(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-provenance-title`,className:A.section,children:[(0,P.jsx)(f,{as:`h3`,id:`timeline-provenance-title`,variant:`section-title`,children:`Provenance`}),(0,P.jsx)(`dl`,{className:A.ledger,children:L(p.state.detail).map(({label:e,value:t})=>(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:e}),(0,P.jsx)(`dd`,{children:t})]},e))})]})]})}),(0,P.jsx)(a.Footer,{children:(0,P.jsx)(i,{className:A.footerLink,to:e,children:`Ask Relay about this event`})})]})})},z={page:`_page_18su2_1`,hero:`_hero_18su2_2`,intro:`_intro_18su2_22`,askRelay:`_askRelay_18su2_26`,summary:`_summary_18su2_40`,filters:`_filters_18su2_89`,events:`_events_18su2_115`,rowActor:`_rowActor_18su2_122`},B=(e,t)=>y(x)(`${e}T${t?`23:59:59.999`:`00:00:00.000`}Z`),V={load:(e,t,n)=>w(T(function*(){return yield*(yield*E()).timeline.page({query:{...t.actorKind===`all`?{}:{actor:t.actorKind},...n===null?{}:{beforeEventKey:n.eventKey,beforeOccurredAt:n.occurredAt},...t.from.length===0?{}:{from:B(t.from,!1)},limit:50,...t.to.length===0?{}:{to:B(t.to,!0)}}})}).pipe(S(C)),{signal:e})},H=D(`UnauthorizedApiError`),U=(e,t,n,r=V)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`}),c=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(c.current?.abort(),t===null){s({_tag:`idle`});return}let i=new AbortController;return c.current=i,s({_tag:`loading`}),r.load(i.signal,e,null).then(e=>{i.signal.aborted||s({_tag:`ready`,events:e.events,isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(H(e)&&n(t),s({_tag:`failed`}))}),()=>i.abort()},[`${e.actorKind}|${e.from}|${e.to}`,e,n,i,t,r]),{loadMore:(0,k.useCallback)(()=>{if(t===null||o._tag!==`ready`||o.nextCursor===null||o.isLoadingMore)return;c.current?.abort();let i=new AbortController;c.current=i;let a=o;s({...a,isLoadingMore:!0}),r.load(i.signal,e,a.nextCursor).then(e=>{i.signal.aborted||s({_tag:`ready`,events:[...a.events,...e.events],isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(H(e)&&n(t),s({...a,isLoadingMore:!1}))})},[e,n,t,o,r]),retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:o}},W=e=>new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}).format(b(e)),G=[{label:`Everyone`,value:`all`},{label:`People`,value:`human`},{label:`Agents`,value:`agent`},{label:`Services`,value:`plugin`},{label:`System`,value:`system`}],K=[`action`,`relationship`,`plugin-sync`,`system`],q=e=>G.find(t=>t.value===e)?.value??`all`,J={action:{label:`Governed action`},"plugin-sync":{label:`Service sync`},relationship:{label:`Delivery link`},system:{label:`Control Center`}},Y=({actor:e,continued:t,event:n})=>(0,P.jsx)(h,{continued:t,event:{actor:e??n.actor.label,actorKind:n.actor.kind,dateTime:v(n.occurredAt),detail:J[n.sourceKind].label,...n.href===null?{}:{href:n.href},id:n.eventKey,...n.service===null?{}:{service:n.service},time:W(n.occurredAt),title:n.title}}),X=e=>{switch(e._tag){case`authenticated`:return e.session.permission===`workspace-owner`;case`storage-unavailable`:return e.session?.permission===`workspace-owner`;case`anonymous`:case`blocked`:case`checking`:case`unavailable`:return!1}},Z=(e,t,n,r)=>{let i=new URLSearchParams(t);return i.set(`event`,r),u(e,`?${i.toString()}`,n)},Q=({events:e})=>{let t=(0,k.useMemo)(()=>new Map([[`action`,e.filter(({sourceKind:e})=>e===`action`).length],[`relationship`,e.filter(({sourceKind:e})=>e===`relationship`).length],[`plugin-sync`,e.filter(({sourceKind:e})=>e===`plugin-sync`).length],[`system`,e.filter(({sourceKind:e})=>e===`system`).length]]),[e]);return(0,P.jsx)(`dl`,{className:z.summary,children:K.map(e=>(0,P.jsxs)(`div`,{"data-source":e,children:[(0,P.jsx)(`dt`,{children:J[e].label}),(0,P.jsx)(`dd`,{children:t.get(e)??0})]},e))})},$=({detailTransport:e,transport:t=V}={})=>{let n=l(),r=m(),a=p(r.state),[s,h]=(0,k.useState)({actorKind:`all`,from:``,to:``}),[g,_]=(0,k.useState)(null),v=U(s,a,r.invalidateSession,t),y=u(n.pathname,n.search,n.hash),b=X(r.state);if(v.state._tag===`idle`||v.state._tag===`loading`)return(0,P.jsx)(o,{description:`Combining durable activity across your connected services.`,title:`Loading Timeline`});if(v.state._tag===`failed`)return(0,P.jsx)(o,{action:(0,P.jsx)(c,{onClick:v.retry,children:`Try again`}),description:`The Timeline could not be read.`,title:`Timeline unavailable`});let x=v.state;return(0,P.jsxs)(`article`,{className:z.page,children:[(0,P.jsxs)(`header`,{className:z.hero,children:[(0,P.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:`Timeline`}),(0,P.jsxs)(f,{as:`h1`,variant:`verdict`,children:[`Everything`,(0,P.jsx)(`br`,{}),`that moved.`]}),(0,P.jsx)(f,{className:z.intro,tone:`secondary`,variant:`body-large`,children:`One chronological truth across people, agents, code, delivery links, and connected services.`}),(0,P.jsx)(i,{className:z.askRelay,to:y,children:`Ask Relay about this Timeline`})]}),(0,P.jsx)(Q,{events:x.events}),(0,P.jsxs)(`section`,{"aria-label":`Timeline filters`,className:z.filters,children:[(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`Actor`}),(0,P.jsx)(`select`,{value:s.actorKind,onChange:e=>h({...s,actorKind:q(e.currentTarget.value)}),children:G.map(e=>(0,P.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`From`}),(0,P.jsx)(`input`,{type:`date`,value:s.from,onChange:e=>h({...s,from:e.currentTarget.value})})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`To`}),(0,P.jsx)(`input`,{type:`date`,value:s.to,onChange:e=>h({...s,to:e.currentTarget.value})})]})]}),x.events.length===0?(0,P.jsx)(o,{description:`Try a wider date range or another actor.`,title:`No activity in this view`}):(0,P.jsx)(d,{component:O,children:(0,P.jsx)(`ol`,{className:z.events,children:x.events.map((e,t)=>(0,P.jsx)(Y,{actor:b?(0,P.jsxs)(`span`,{className:z.rowActor,children:[(0,P.jsx)(`span`,{children:e.actor.label}),(0,P.jsx)(c,{onClick:()=>_(e),size:`compact`,variant:`quiet`,children:`Inspect`})]}):void 0,continued:t<x.events.length-1,event:e},e.eventKey))})}),x.nextCursor===null?null:(0,P.jsx)(c,{disabled:x.isLoadingMore,onClick:v.loadMore,size:`principal`,stretch:!0,children:x.isLoadingMore?`Loading…`:`Show earlier activity`}),(0,P.jsx)(R,{agentHref:g===null?y:Z(n.pathname,n.search,n.hash,g.eventKey),event:g,onClose:()=>_(null),onSessionExpired:r.invalidateSession,sessionKey:a,...e===void 0?{}:{transport:e}})]})};export{$ as TimelinePage,X as canInspectTimelineDetails,Z as timelineEventAgentPath};
|
|
2
|
+
//# sourceMappingURL=TimelinePage-D8Fj_351.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimelinePage-D8Fj_351.js","names":[],"sources":["../../../src/client/timeline/TimelineDetailSheet.module.css","../../../src/client/timeline/useTimelineDetail.ts","../../../src/client/timeline/TimelineDetailSheet.tsx","../../../src/client/timeline/TimelinePage.module.css","../../../src/client/timeline/useTimeline.ts","../../../src/client/timeline/TimelinePage.tsx"],"sourcesContent":[".body,\n.loading,\n.content,\n.identity,\n.identityMeta,\n.section,\n.ledger {\n display: grid;\n}\n\n.body,\n.loading,\n.content {\n gap: var(--rly-space-20);\n}\n\n.identity,\n.section {\n gap: var(--rly-space-12);\n}\n\n.identity {\n padding-block: var(--rly-space-12) var(--rly-space-20);\n border-block-end: 1px solid var(--rly-color-border-1);\n}\n\n.identity h2,\n.identity p,\n.section h3,\n.ledger dd {\n margin: 0;\n}\n\n.identity h2 {\n max-inline-size: 13ch;\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.identityMeta {\n grid-template-columns: repeat(2, minmax(0, max-content));\n align-items: center;\n gap: var(--rly-space-8) var(--rly-space-12);\n}\n\n.ledger {\n margin: 0;\n}\n\n.ledger div {\n display: grid;\n grid-template-columns: minmax(7rem, 0.35fr) minmax(0, 1fr);\n gap: var(--rly-space-12);\n padding-block: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.ledger dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.ledger dd {\n overflow-wrap: anywhere;\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height)\n var(--rly-type-code-font);\n}\n\n.footerLink {\n min-block-size: 3rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding-inline: var(--rly-space-16);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-align: center;\n text-decoration: none;\n}\n\n.footerLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 30rem) {\n .identityMeta,\n .ledger div {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineEvent, TimelineEventDetail } from \"../../domain/timeline.js\"\n\n/** Browser boundary for one exact owner-only Timeline event expansion. */\nexport interface TimelineDetailTransport {\n readonly load: (eventKey: TimelineEvent[\"eventKey\"], signal: AbortSignal) => Promise<TimelineEventDetail>\n}\n\nexport type TimelineDetailState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly detail: TimelineEventDetail\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for an owner-authorized event detail read. */\nexport const browserTimelineDetailTransport: TimelineDetailTransport = {\n load: (eventKey, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.detail({ params: { eventKey } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep a detail result bound to the exact event and authenticated session that requested it. */\nexport const useTimelineDetail = (\n eventKey: TimelineEvent[\"eventKey\"] | null,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineDetailTransport = browserTimelineDetailTransport\n): { readonly retry: () => void; readonly state: TimelineDetailState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineDetailState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (eventKey === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", eventKey, sessionKey })\n transport.load(eventKey, abort.signal).then(\n (detail) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", detail, eventKey, sessionKey })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", eventKey, sessionKey })\n }\n )\n return () => abort.abort()\n }, [eventKey, onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: TimelineDetailState = eventKey === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.eventKey !== eventKey || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", eventKey, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { TimelineEvent, TimelineEventDetail, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport styles from \"./TimelineDetailSheet.module.css\"\nimport { type TimelineDetailTransport, useTimelineDetail } from \"./useTimelineDetail.js\"\n\nconst sourceLabels: Readonly<Record<TimelineSourceKind, string>> = {\n action: \"Governed action\",\n \"plugin-sync\": \"Service sync\",\n relationship: \"Delivery link\",\n system: \"Control Center\"\n}\n\nconst formatTimestamp = (event: TimelineEvent): string =>\n DateTime.formatUtc(event.occurredAt, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n second: \"2-digit\",\n year: \"numeric\"\n })\n\n/** Non-secret durable references that make one owner-visible event attributable. */\nexport const timelineDetailLedger = (\n detail: TimelineEventDetail\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n const optionalEntries: ReadonlyArray<{ readonly label: string; readonly value: string | null }> = [\n { label: \"Actor\", value: detail.identifiers.actorId },\n { label: \"Agent job\", value: detail.agentJob?.jobId ?? null },\n { label: \"Action\", value: detail.identifiers.actionId },\n { label: \"Relationship\", value: detail.identifiers.relationshipId },\n { label: \"Connection\", value: detail.identifiers.pluginConnectionId },\n { label: \"Release\", value: detail.identifiers.releaseId },\n { label: \"Entity\", value: detail.identifiers.entityId }\n ]\n return [\n { label: \"Event\", value: detail.event.eventKey },\n { label: \"Type\", value: detail.event.eventType },\n ...optionalEntries.filter(\n (entry): entry is { readonly label: string; readonly value: string } => entry.value !== null\n )\n ]\n}\n\n/** Owner-only expansion of one redacted Timeline row into its durable provenance. */\nexport const TimelineDetailSheet = ({\n agentHref,\n event,\n onClose,\n onSessionExpired,\n sessionKey,\n transport\n}: {\n readonly agentHref: string\n readonly event: TimelineEvent | null\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly sessionKey: string | null\n readonly transport?: TimelineDetailTransport\n}): ReactElement => {\n const controller = useTimelineDetail(event?.eventKey ?? null, sessionKey, onSessionExpired, transport)\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={event !== null}\n >\n <Sheet.Content\n closeLabel=\"Close event details\"\n description=\"Durable provenance for this exact workspace event.\"\n title=\"Event details\"\n >\n <Sheet.Body className={styles.body}>\n {event === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading event details\" className={styles.loading}>\n <Skeleton height=\"10rem\" />\n <Skeleton height=\"14rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline row remains unchanged. Its provenance could not be loaded.\"\n title=\"Event details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"timeline-detail-title\" className={styles.identity}>\n <Text tone=\"secondary\" variant=\"label\">\n {sourceLabels[controller.state.detail.event.sourceKind]}\n </Text>\n <Text as=\"h2\" id=\"timeline-detail-title\" variant=\"page-title\">\n {controller.state.detail.event.title}\n </Text>\n <div className={styles.identityMeta}>\n <StateLabel\n label={controller.state.detail.event.actor.kind}\n size=\"compact\"\n tone={controller.state.detail.event.actor.kind === \"agent\" ? \"progress\" : \"neutral\"}\n />\n {controller.state.detail.event.service === null ? null : (\n <ServiceMark service={controller.state.detail.event.service} size=\"compact\" />\n )}\n <Text tone=\"secondary\" variant=\"meta\">\n {controller.state.detail.event.actor.label}\n </Text>\n <Text\n as=\"time\"\n dateTime={DateTime.formatIso(controller.state.detail.event.occurredAt)}\n tone=\"secondary\"\n variant=\"meta\"\n >\n {formatTimestamp(controller.state.detail.event)} UTC\n </Text>\n </div>\n </section>\n\n <section aria-labelledby=\"timeline-provenance-title\" className={styles.section}>\n <Text as=\"h3\" id=\"timeline-provenance-title\" variant=\"section-title\">\n Provenance\n </Text>\n <dl className={styles.ledger}>\n {timelineDetailLedger(controller.state.detail).map(({ label, value }) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n </section>\n </div>\n )}\n </Sheet.Body>\n <Sheet.Footer>\n <Link className={styles.footerLink} to={agentHref}>\n Ask Relay about this event\n </Link>\n </Sheet.Footer>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n",".page,\n.hero,\n.page {\n gap: clamp(2.5rem, 7vw, 6rem);\n}\n\n.hero {\n gap: var(--rly-space-16);\n}\n\n.hero p,\n.hero h1 {\n margin: 0;\n}\n\n.hero h1 {\n max-inline-size: 9ch;\n letter-spacing: -0.075em;\n text-wrap: balance;\n}\n\n.intro {\n max-inline-size: 46rem;\n}\n\n.askRelay {\n inline-size: fit-content;\n min-block-size: 3.5rem;\n display: inline-flex;\n align-items: center;\n padding-inline: var(--rly-space-20);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.summary {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n margin: 0;\n overflow: hidden;\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n}\n\n.summary div {\n display: grid;\n gap: var(--rly-space-12);\n min-block-size: 8rem;\n padding: var(--rly-space-20);\n background: var(--rly-color-surface-1);\n}\n\n.summary div + div {\n border-inline-start: 1px solid var(--rly-color-border-1);\n}\n\n.summary dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.summary dd {\n margin: 0;\n color: var(--rly-color-text-1);\n font-size: clamp(2.5rem, 6vw, 5rem);\n font-weight: 700;\n line-height: 0.9;\n letter-spacing: -0.07em;\n}\n\n.summary div[data-source=\"action\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codecommit);\n}\n.summary div[data-source=\"relationship\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codepipeline);\n}\n.summary div[data-source=\"plugin-sync\"] {\n box-shadow: inset 0 4px var(--rly-color-service-jira);\n}\n.summary div[data-source=\"system\"] {\n box-shadow: inset 0 4px var(--rly-color-focus);\n}\n\n.filters {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n gap: var(--rly-space-12);\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.filters select,\n.filters input {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.events {\n margin: 0;\n padding: 0;\n list-style: none;\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.rowActor {\n display: grid;\n gap: var(--rly-space-8);\n justify-items: start;\n}\n\n@media (max-width: 48rem) {\n .summary {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .summary div:nth-child(3) {\n border-inline-start: 0;\n }\n .summary div:nth-child(n + 3) {\n border-block-start: 1px solid var(--rly-color-border-1);\n }\n .filters {\n grid-template-columns: 1fr;\n }\n}\n","import * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineActorKind, TimelineCursor, TimelineEvent, TimelinePage } from \"../../domain/timeline.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\n\n/** User-controlled Timeline filters. */\nexport interface TimelineFilters {\n readonly actorKind: TimelineActorKind | \"all\"\n readonly from: string\n readonly to: string\n}\n\n/** Browser transport boundary for Timeline tests and authenticated reads. */\nexport interface TimelineTransport {\n readonly load: (\n signal: AbortSignal,\n filters: TimelineFilters,\n cursor: TimelineCursor | null\n ) => Promise<TimelinePage>\n}\n\nexport type TimelineState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly events: ReadonlyArray<TimelineEvent>\n readonly isLoadingMore: boolean\n readonly nextCursor: TimelineCursor | null\n }\n\nconst dateBoundary = (value: string, isEnd: boolean): TimelineCursor[\"occurredAt\"] =>\n Schema.decodeSync(UtcTimestamp)(`${value}T${isEnd ? \"23:59:59.999\" : \"00:00:00.000\"}Z`)\n\n/** Generated-client transport for the authenticated Timeline page. */\nexport const browserTimelineTransport: TimelineTransport = {\n load: (signal, filters, cursor) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.page({\n query: {\n ...(filters.actorKind === \"all\" ? {} : { actor: filters.actorKind }),\n ...(cursor === null\n ? {}\n : { beforeEventKey: cursor.eventKey, beforeOccurredAt: cursor.occurredAt }),\n ...(filters.from.length === 0 ? {} : { from: dateBoundary(filters.from, false) }),\n limit: 50,\n ...(filters.to.length === 0 ? {} : { to: dateBoundary(filters.to, true) })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load and incrementally page one exact authenticated Timeline filter set. */\nexport const useTimeline = (\n filters: TimelineFilters,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineTransport = browserTimelineTransport\n): {\n readonly loadMore: () => void\n readonly retry: () => void\n readonly state: TimelineState\n} => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineState>({ _tag: \"idle\" })\n const activeRequest = useRef<AbortController | null>(null)\n const filterKey = `${filters.actorKind}|${filters.from}|${filters.to}`\n\n useEffect(() => {\n activeRequest.current?.abort()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n activeRequest.current = request\n setState({ _tag: \"loading\" })\n transport.load(request.signal, filters, null).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({ _tag: \"ready\", events: page.events, isLoadingMore: false, nextCursor: page.nextCursor })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [filterKey, filters, onSessionExpired, requestRevision, sessionKey, transport])\n\n const loadMore = useCallback((): void => {\n if (sessionKey === null || state._tag !== \"ready\" || state.nextCursor === null || state.isLoadingMore) return\n activeRequest.current?.abort()\n const request = new AbortController()\n activeRequest.current = request\n const current = state\n setState({ ...current, isLoadingMore: true })\n transport.load(request.signal, filters, current.nextCursor).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({\n _tag: \"ready\",\n events: [...current.events, ...page.events],\n isLoadingMore: false,\n nextCursor: page.nextCursor\n })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ ...current, isLoadingMore: false })\n }\n )\n }, [filters, onSessionExpired, sessionKey, state, transport])\n\n return {\n loadMore,\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state\n }\n}\n\n/** Compact UTC timestamp for Timeline rows. */\nexport const formatTimelineTimestamp = (timestamp: TimelineEvent[\"occurredAt\"]): string =>\n new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n }).format(DateTime.toDateUtc(timestamp))\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { TimelineRow as RlyTimelineRow } from \"@knpkv/rly/patterns\"\nimport { Button, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type ReactElement, type ReactNode, useMemo, useState } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport type { TimelineActorKind, TimelineEvent, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport { browserReadableSessionKey, type BrowserSessionState, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport { WorkspaceEntityLink } from \"../entities/WorkspaceEntityLink.js\"\nimport { TimelineDetailSheet } from \"./TimelineDetailSheet.js\"\nimport type { TimelineDetailTransport } from \"./useTimelineDetail.js\"\nimport styles from \"./TimelinePage.module.css\"\nimport {\n browserTimelineTransport,\n formatTimelineTimestamp,\n type TimelineFilters,\n type TimelineTransport,\n useTimeline\n} from \"./useTimeline.js\"\n\nconst actorOptions: ReadonlyArray<{ readonly label: string; readonly value: TimelineActorKind | \"all\" }> = [\n { label: \"Everyone\", value: \"all\" },\n { label: \"People\", value: \"human\" },\n { label: \"Agents\", value: \"agent\" },\n { label: \"Services\", value: \"plugin\" },\n { label: \"System\", value: \"system\" }\n]\nconst timelineSources: ReadonlyArray<TimelineSourceKind> = [\"action\", \"relationship\", \"plugin-sync\", \"system\"]\n\nconst actorFilter = (value: string): TimelineFilters[\"actorKind\"] =>\n actorOptions.find((option) => option.value === value)?.value ?? \"all\"\n\nconst sourcePresentation: Readonly<Record<TimelineSourceKind, { readonly label: string }>> = {\n action: { label: \"Governed action\" },\n \"plugin-sync\": { label: \"Service sync\" },\n relationship: { label: \"Delivery link\" },\n system: { label: \"Control Center\" }\n}\n\nconst TimelineRow = ({\n actor,\n continued,\n event\n}: {\n readonly actor?: ReactNode\n readonly continued: boolean\n readonly event: TimelineEvent\n}): ReactElement => (\n <RlyTimelineRow\n continued={continued}\n event={{\n actor: actor ?? event.actor.label,\n actorKind: event.actor.kind,\n dateTime: DateTime.formatIso(event.occurredAt),\n detail: sourcePresentation[event.sourceKind].label,\n ...(event.href === null ? {} : { href: event.href }),\n id: event.eventKey,\n ...(event.service === null ? {} : { service: event.service }),\n time: formatTimelineTimestamp(event.occurredAt),\n title: event.title\n }}\n />\n)\n\n/** Only workspace owners can deliberately expand redacted Timeline rows. */\nexport const canInspectTimelineDetails = (state: BrowserSessionState): boolean => {\n switch (state._tag) {\n case \"authenticated\":\n return state.session.permission === \"workspace-owner\"\n case \"storage-unavailable\":\n return state.session?.permission === \"workspace-owner\"\n case \"anonymous\":\n case \"blocked\":\n case \"checking\":\n case \"unavailable\":\n return false\n }\n}\n\n/** Preserve one selected event alongside the current Timeline filters for Relay. */\nexport const timelineEventAgentPath = (\n pathname: string,\n search: string,\n hash: string,\n eventKey: TimelineEvent[\"eventKey\"]\n): string => {\n const context = new URLSearchParams(search)\n context.set(\"event\", eventKey)\n return contextualAgentPath(pathname, `?${context.toString()}`, hash)\n}\n\nconst SourceSummary = ({ events }: { readonly events: ReadonlyArray<TimelineEvent> }): ReactElement => {\n const totals = useMemo(\n () =>\n new Map<TimelineSourceKind, number>([\n [\"action\", events.filter(({ sourceKind }) => sourceKind === \"action\").length],\n [\"relationship\", events.filter(({ sourceKind }) => sourceKind === \"relationship\").length],\n [\"plugin-sync\", events.filter(({ sourceKind }) => sourceKind === \"plugin-sync\").length],\n [\"system\", events.filter(({ sourceKind }) => sourceKind === \"system\").length]\n ]),\n [events]\n )\n return (\n <dl className={styles.summary}>\n {timelineSources.map((source) => {\n return (\n <div data-source={source} key={source}>\n <dt>{sourcePresentation[source].label}</dt>\n <dd>{totals.get(source) ?? 0}</dd>\n </div>\n )\n })}\n </dl>\n )\n}\n\n/** Bird's-eye view of attributable human, agent, service, and system activity. */\nexport const TimelinePage = ({\n detailTransport,\n transport = browserTimelineTransport\n}: {\n readonly detailTransport?: TimelineDetailTransport\n readonly transport?: TimelineTransport\n} = {}): ReactElement => {\n const location = useLocation()\n const browserSession = useBrowserSession()\n const sessionKey = browserReadableSessionKey(browserSession.state)\n const [filters, setFilters] = useState<TimelineFilters>({ actorKind: \"all\", from: \"\", to: \"\" })\n const [selectedEvent, setSelectedEvent] = useState<TimelineEvent | null>(null)\n const controller = useTimeline(filters, sessionKey, browserSession.invalidateSession, transport)\n const agentHref = contextualAgentPath(location.pathname, location.search, location.hash)\n const canInspect = canInspectTimelineDetails(browserSession.state)\n\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <StatePanel description=\"Combining durable activity across your connected services.\" title=\"Loading Timeline\" />\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline could not be read.\"\n title=\"Timeline unavailable\"\n />\n )\n }\n const timelineState = controller.state\n\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Timeline\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Everything\n <br />\n that moved.\n </Text>\n <Text className={styles.intro} tone=\"secondary\" variant=\"body-large\">\n One chronological truth across people, agents, code, delivery links, and connected services.\n </Text>\n <Link className={styles.askRelay} to={agentHref}>\n Ask Relay about this Timeline\n </Link>\n </header>\n\n <SourceSummary events={timelineState.events} />\n\n <section aria-label=\"Timeline filters\" className={styles.filters}>\n <label>\n <span>Actor</span>\n <select\n value={filters.actorKind}\n onChange={(event) => setFilters({ ...filters, actorKind: actorFilter(event.currentTarget.value) })}\n >\n {actorOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>From</span>\n <input\n type=\"date\"\n value={filters.from}\n onChange={(event) => setFilters({ ...filters, from: event.currentTarget.value })}\n />\n </label>\n <label>\n <span>To</span>\n <input\n type=\"date\"\n value={filters.to}\n onChange={(event) => setFilters({ ...filters, to: event.currentTarget.value })}\n />\n </label>\n </section>\n\n {timelineState.events.length === 0 ? (\n <StatePanel description=\"Try a wider date range or another actor.\" title=\"No activity in this view\" />\n ) : (\n <LinkProvider component={WorkspaceEntityLink}>\n <ol className={styles.events}>\n {timelineState.events.map((event, index) => (\n <TimelineRow\n actor={\n canInspect ? (\n <span className={styles.rowActor}>\n <span>{event.actor.label}</span>\n <Button onClick={() => setSelectedEvent(event)} size=\"compact\" variant=\"quiet\">\n Inspect\n </Button>\n </span>\n ) : undefined\n }\n continued={index < timelineState.events.length - 1}\n event={event}\n key={event.eventKey}\n />\n ))}\n </ol>\n </LinkProvider>\n )}\n {timelineState.nextCursor === null ? null : (\n <Button disabled={timelineState.isLoadingMore} onClick={controller.loadMore} size=\"principal\" stretch>\n {timelineState.isLoadingMore ? \"Loading…\" : \"Show earlier activity\"}\n </Button>\n )}\n <TimelineDetailSheet\n agentHref={\n selectedEvent === null\n ? agentHref\n : timelineEventAgentPath(location.pathname, location.search, location.hash, selectedEvent.eventKey)\n }\n event={selectedEvent}\n onClose={() => setSelectedEvent(null)}\n onSessionExpired={browserSession.invalidateSession}\n sessionKey={sessionKey}\n {...(detailTransport === undefined ? {} : { transport: detailTransport })}\n />\n </article>\n )\n}\n"],"mappings":"srBCgCM,EAAwB,EAAmB,sBAAsB,EAG1D,EAA0D,CACrE,MAAO,EAAU,IACf,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,SAAS,OAAO,CAAE,OAAQ,CAAE,UAAS,CAAE,CAAC,CAC/D,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,CACJ,EAGa,GACX,EACA,EACA,EACA,EAAqC,IACmC,CACxE,GAAM,CAAC,EAAiB,IAAA,EAAA,EAAA,SAAA,CAA+B,CAAC,EAClD,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAA0C,CAAE,KAAM,MAAO,CAAC,GAExE,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,IAAa,MAAQ,IAAe,KAAM,CAC5C,EAAS,CAAE,KAAM,MAAO,CAAC,EACzB,MACF,CACA,IAAM,EAAQ,IAAI,gBAYlB,OAXA,EAAS,CAAE,KAAM,UAAW,WAAU,YAAW,CAAC,EAClD,EAAU,KAAK,EAAU,EAAM,MAAM,CAAC,CAAC,KACpC,GAAW,CACL,EAAM,OAAO,SAAS,EAAS,CAAE,KAAM,QAAS,SAAQ,WAAU,YAAW,CAAC,CACrF,EACC,GAAY,CACP,EAAM,OAAO,UACb,EAAsB,CAAO,GAAG,EAAiB,CAAU,EAC/D,EAAS,CAAE,KAAM,SAAU,WAAU,YAAW,CAAC,EACnD,CACF,MACa,EAAM,MAAM,CAC3B,EAAG,CAAC,EAAU,EAAkB,EAAiB,EAAY,CAAS,CAAC,EAEvE,IAAM,EAAoC,IAAa,MAAQ,IAAe,KAC1E,CAAE,KAAM,MAAO,EACf,EAAM,OAAS,QAAU,EAAM,WAAa,GAAY,EAAM,aAAe,EAC7E,CAAE,KAAM,UAAW,WAAU,YAAW,EACxC,EAEJ,MAAO,CACL,OAAA,EAAA,EAAA,YAAA,KAAyB,EAAoB,GAAa,EAAW,CAAC,EAAG,CAAC,CAAC,EAC3E,MAAO,CACT,CACF,QC5EM,EAA6D,CACjE,OAAQ,kBACR,cAAe,eACf,aAAc,gBACd,OAAQ,gBACV,EAEM,EAAmB,GACvB,EAAmB,EAAM,WAAY,CACnC,IAAK,UACL,KAAM,UACN,OAAQ,GACR,OAAQ,QACR,OAAQ,UACR,MAAO,QACP,OAAQ,UACR,KAAM,SACR,CAAC,EAGU,EACX,GACsE,CACtE,IAAM,EAA4F,CAChG,CAAE,MAAO,QAAS,MAAO,EAAO,YAAY,OAAQ,EACpD,CAAE,MAAO,YAAa,MAAO,EAAO,UAAU,OAAS,IAAK,EAC5D,CAAE,MAAO,SAAU,MAAO,EAAO,YAAY,QAAS,EACtD,CAAE,MAAO,eAAgB,MAAO,EAAO,YAAY,cAAe,EAClE,CAAE,MAAO,aAAc,MAAO,EAAO,YAAY,kBAAmB,EACpE,CAAE,MAAO,UAAW,MAAO,EAAO,YAAY,SAAU,EACxD,CAAE,MAAO,SAAU,MAAO,EAAO,YAAY,QAAS,CACxD,EACA,MAAO,CACL,CAAE,MAAO,QAAS,MAAO,EAAO,MAAM,QAAS,EAC/C,CAAE,MAAO,OAAQ,MAAO,EAAO,MAAM,SAAU,EAC/C,GAAG,EAAgB,OAChB,GAAuE,EAAM,QAAU,IAC1F,CACF,CACF,EAGa,GAAuB,CAClC,YACA,QACA,UACA,mBACA,aACA,eAQkB,CAClB,IAAM,EAAa,EAAkB,GAAO,UAAY,KAAM,EAAY,EAAkB,CAAS,EAErG,OACE,EAAA,EAAA,IAAA,CAAC,EAAM,KAAP,CACE,aAAe,GAAS,CACjB,GAAM,EAAQ,CACrB,EACA,KAAM,IAAU,eAEhB,EAAA,EAAA,KAAA,CAAC,EAAM,QAAP,CACE,WAAW,sBACX,YAAY,qDACZ,MAAM,yBAHR,EAKE,EAAA,EAAA,IAAA,CAAC,EAAM,KAAP,CAAY,UAAW,EAAO,cAC3B,IAAU,MAAQ,EAAW,MAAM,OAAS,QAAU,EAAW,MAAM,OAAS,WAC/E,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,YAAU,OAAO,aAAW,wBAAwB,UAAW,EAAO,iBAA3E,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,OAAS,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,OAAS,CAAA,CACvB,IACH,EAAW,MAAM,OAAS,UAC5B,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,EAAW,eAAO,WAAiB,CAAA,EAC5D,YAAY,0EACZ,MAAM,4BACN,KAAK,SACN,CAAA,GAED,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,iBAAvB,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,kBAAgB,wBAAwB,UAAW,EAAO,kBAAnE,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,YAAY,QAAQ,iBAC5B,EAAa,EAAW,MAAM,OAAO,MAAM,WACxC,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,GAAG,wBAAwB,QAAQ,sBAC9C,EAAW,MAAM,OAAO,MAAM,KAC3B,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,sBAAvB,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAW,MAAM,OAAO,MAAM,MAAM,KAC3C,KAAK,UACL,KAAM,EAAW,MAAM,OAAO,MAAM,MAAM,OAAS,QAAU,WAAa,SAC3E,CAAA,EACA,EAAW,MAAM,OAAO,MAAM,UAAY,KAAO,MAChD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,QAAS,EAAW,MAAM,OAAO,MAAM,QAAS,KAAK,SAAW,CAAA,GAE/E,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,YAAY,QAAQ,gBAC5B,EAAW,MAAM,OAAO,MAAM,MAAM,KACjC,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAG,OACH,SAAU,EAAmB,EAAW,MAAM,OAAO,MAAM,UAAU,EACrE,KAAK,YACL,QAAQ,gBAJV,CAMG,EAAgB,EAAW,MAAM,OAAO,KAAK,EAAE,MAC5C,GACH,GACE,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,kBAAgB,4BAA4B,UAAW,EAAO,iBAAvE,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,GAAG,4BAA4B,QAAQ,yBAAgB,YAE/D,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,gBACnB,EAAqB,EAAW,MAAM,MAAM,CAAC,CAAC,KAAK,CAAE,QAAO,YAC3D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,CAAU,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,CAAU,CAAA,CACZ,CAAA,EAHK,CAGL,CACN,CACC,CAAA,CACG,GACN,GAEG,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,EAAM,OAAP,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,WAAY,GAAI,WAAW,4BAE7C,CAAA,CACM,CAAA,CACD,GACL,CAAA,CAEhB,wNEhHM,GAAgB,EAAe,IACnC,EAAkB,CAAY,CAAC,CAAC,GAAG,EAAM,GAAG,EAAQ,eAAiB,eAAe,EAAE,EAG3E,EAA8C,CACzD,MAAO,EAAQ,EAAS,IACtB,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,SAAS,KAAK,CACjC,MAAO,CACL,GAAI,EAAQ,YAAc,MAAQ,CAAC,EAAI,CAAE,MAAO,EAAQ,SAAU,EAClE,GAAI,IAAW,KACX,CAAC,EACD,CAAE,eAAgB,EAAO,SAAU,iBAAkB,EAAO,UAAW,EAC3E,GAAI,EAAQ,KAAK,SAAW,EAAI,CAAC,EAAI,CAAE,KAAM,EAAa,EAAQ,KAAM,EAAK,CAAE,EAC/E,MAAO,GACP,GAAI,EAAQ,GAAG,SAAW,EAAI,CAAC,EAAI,CAAE,GAAI,EAAa,EAAQ,GAAI,EAAI,CAAE,CAC1E,CACF,CAAC,CACH,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,CACJ,EAEM,EAAwB,EAAmB,sBAAsB,EAG1D,GACX,EACA,EACA,EACA,EAA+B,IAK5B,CACH,GAAM,CAAC,EAAiB,IAAA,EAAA,EAAA,SAAA,CAA+B,CAAC,EAClD,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAAoC,CAAE,KAAM,MAAO,CAAC,EAC5D,GAAA,EAAA,EAAA,OAAA,CAA+C,IAAI,EAqDzD,OAlDA,EAAA,EAAA,UAAA,KAAgB,CAEd,GADA,EAAc,SAAS,MAAM,EACzB,IAAe,KAAM,CACvB,EAAS,CAAE,KAAM,MAAO,CAAC,EACzB,MACF,CACA,IAAM,EAAU,IAAI,gBAepB,MAdA,GAAc,QAAU,EACxB,EAAS,CAAE,KAAM,SAAU,CAAC,EAC5B,EAAU,KAAK,EAAQ,OAAQ,EAAS,IAAI,CAAC,CAAC,KAC3C,GAAS,CACH,EAAQ,OAAO,SAClB,EAAS,CAAE,KAAM,QAAS,OAAQ,EAAK,OAAQ,cAAe,GAAO,WAAY,EAAK,UAAW,CAAC,CAEtG,EACC,GAAY,CACP,EAAQ,OAAO,UACf,EAAsB,CAAO,GAAG,EAAiB,CAAU,EAC/D,EAAS,CAAE,KAAM,QAAS,CAAC,EAC7B,CACF,MACa,EAAQ,MAAM,CAC7B,EAAG,CAAC,GAxBiB,EAAQ,UAAU,GAAG,EAAQ,KAAK,GAAG,EAAQ,KAwBnD,EAAS,EAAkB,EAAiB,EAAY,CAAS,CAAC,EA4B1E,CACL,UAAA,EAAA,EAAA,YAAA,KA3BuC,CACvC,GAAI,IAAe,MAAQ,EAAM,OAAS,SAAW,EAAM,aAAe,MAAQ,EAAM,cAAe,OACvG,EAAc,SAAS,MAAM,EAC7B,IAAM,EAAU,IAAI,gBACpB,EAAc,QAAU,EACxB,IAAM,EAAU,EAChB,EAAS,CAAE,GAAG,EAAS,cAAe,EAAK,CAAC,EAC5C,EAAU,KAAK,EAAQ,OAAQ,EAAS,EAAQ,UAAU,CAAC,CAAC,KACzD,GAAS,CACH,EAAQ,OAAO,SAClB,EAAS,CACP,KAAM,QACN,OAAQ,CAAC,GAAG,EAAQ,OAAQ,GAAG,EAAK,MAAM,EAC1C,cAAe,GACf,WAAY,EAAK,UACnB,CAAC,CAEL,EACC,GAAY,CACP,EAAQ,OAAO,UACf,EAAsB,CAAO,GAAG,EAAiB,CAAU,EAC/D,EAAS,CAAE,GAAG,EAAS,cAAe,EAAM,CAAC,EAC/C,CACF,CACF,EAAG,CAAC,EAAS,EAAkB,EAAY,EAAO,CAAS,CAGzD,EACA,OAAA,EAAA,EAAA,YAAA,KAAyB,EAAoB,GAAa,EAAW,CAAC,EAAG,CAAC,CAAC,EAC3E,OACF,CACF,EAGa,EAA2B,GACtC,IAAI,KAAK,eAAe,QAAS,CAC/B,UAAW,SACX,UAAW,QACX,SAAU,KACZ,CAAC,CAAC,CAAC,OAAO,EAAmB,CAAS,CAAC,EC1HnC,EAAqG,CACzG,CAAE,MAAO,WAAY,MAAO,KAAM,EAClC,CAAE,MAAO,SAAU,MAAO,OAAQ,EAClC,CAAE,MAAO,SAAU,MAAO,OAAQ,EAClC,CAAE,MAAO,WAAY,MAAO,QAAS,EACrC,CAAE,MAAO,SAAU,MAAO,QAAS,CACrC,EACM,EAAqD,CAAC,SAAU,eAAgB,cAAe,QAAQ,EAEvG,EAAe,GACnB,EAAa,KAAM,GAAW,EAAO,QAAU,CAAK,CAAC,EAAE,OAAS,MAE5D,EAAuF,CAC3F,OAAQ,CAAE,MAAO,iBAAkB,EACnC,cAAe,CAAE,MAAO,cAAe,EACvC,aAAc,CAAE,MAAO,eAAgB,EACvC,OAAQ,CAAE,MAAO,gBAAiB,CACpC,EAEM,GAAe,CACnB,QACA,YACA,YAMA,EAAA,EAAA,IAAA,CAAC,EAAD,CACa,YACX,MAAO,CACL,MAAO,GAAS,EAAM,MAAM,MAC5B,UAAW,EAAM,MAAM,KACvB,SAAU,EAAmB,EAAM,UAAU,EAC7C,OAAQ,EAAmB,EAAM,WAAW,CAAC,MAC7C,GAAI,EAAM,OAAS,KAAO,CAAC,EAAI,CAAE,KAAM,EAAM,IAAK,EAClD,GAAI,EAAM,SACV,GAAI,EAAM,UAAY,KAAO,CAAC,EAAI,CAAE,QAAS,EAAM,OAAQ,EAC3D,KAAM,EAAwB,EAAM,UAAU,EAC9C,MAAO,EAAM,KACf,CACD,CAAA,EAIU,EAA6B,GAAwC,CAChF,OAAQ,EAAM,KAAd,CACE,IAAK,gBACH,OAAO,EAAM,QAAQ,aAAe,kBACtC,IAAK,sBACH,OAAO,EAAM,SAAS,aAAe,kBACvC,IAAK,YACL,IAAK,UACL,IAAK,WACL,IAAK,cACH,MAAO,EACX,CACF,EAGa,GACX,EACA,EACA,EACA,IACW,CACX,IAAM,EAAU,IAAI,gBAAgB,CAAM,EAE1C,OADA,EAAQ,IAAI,QAAS,CAAQ,EACtB,EAAoB,EAAU,IAAI,EAAQ,SAAS,IAAK,CAAI,CACrE,EAEM,GAAiB,CAAE,YAA8E,CACrG,IAAM,GAAA,EAAA,EAAA,QAAA,KAEF,IAAI,IAAgC,CAClC,CAAC,SAAU,EAAO,QAAQ,CAAE,gBAAiB,IAAe,QAAQ,CAAC,CAAC,MAAM,EAC5E,CAAC,eAAgB,EAAO,QAAQ,CAAE,gBAAiB,IAAe,cAAc,CAAC,CAAC,MAAM,EACxF,CAAC,cAAe,EAAO,QAAQ,CAAE,gBAAiB,IAAe,aAAa,CAAC,CAAC,MAAM,EACtF,CAAC,SAAU,EAAO,QAAQ,CAAE,gBAAiB,IAAe,QAAQ,CAAC,CAAC,MAAM,CAC9E,CAAC,EACH,CAAC,CAAM,CACT,EACA,OACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,iBACnB,EAAgB,IAAK,IAElB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,cAAa,WAAlB,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAmB,EAAO,CAAC,KAAU,CAAA,GAC1C,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAO,IAAI,CAAM,GAAK,CAAM,CAAA,CAC9B,GAH0B,CAG1B,CAER,CACC,CAAA,CAER,EAGa,GAAgB,CAC3B,kBACA,YAAY,GAIV,CAAC,IAAoB,CACvB,IAAM,EAAW,EAAY,EACvB,EAAiB,EAAkB,EACnC,EAAa,EAA0B,EAAe,KAAK,EAC3D,CAAC,EAAS,IAAA,EAAA,EAAA,SAAA,CAAwC,CAAE,UAAW,MAAO,KAAM,GAAI,GAAI,EAAG,CAAC,EACxF,CAAC,EAAe,IAAA,EAAA,EAAA,SAAA,CAAmD,IAAI,EACvE,EAAa,EAAY,EAAS,EAAY,EAAe,kBAAmB,CAAS,EACzF,EAAY,EAAoB,EAAS,SAAU,EAAS,OAAQ,EAAS,IAAI,EACjF,EAAa,EAA0B,EAAe,KAAK,EAEjE,GAAI,EAAW,MAAM,OAAS,QAAU,EAAW,MAAM,OAAS,UAChE,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,YAAY,6DAA6D,MAAM,kBAAoB,CAAA,EAGnH,GAAI,EAAW,MAAM,OAAS,SAC5B,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,EAAW,eAAO,WAAiB,CAAA,EAC5D,YAAY,kCACZ,MAAM,sBACP,CAAA,EAGL,IAAM,EAAgB,EAAW,MAEjC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,cAA3B,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,cAA1B,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,IAAI,KAAK,YAAY,QAAQ,iBAAQ,UAExC,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAG,KAAK,QAAQ,mBAAtB,CAAgC,cAE9B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EAAC,aAEF,KACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,MAAO,KAAK,YAAY,QAAQ,sBAAa,8FAE/D,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,SAAU,GAAI,WAAW,+BAE3C,CAAA,CACA,KAER,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,OAAQ,EAAc,MAAS,CAAA,GAE9C,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,aAAW,mBAAmB,UAAW,EAAO,iBAAzD,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,OAAW,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,MAAO,EAAQ,UACf,SAAW,GAAU,EAAW,CAAE,GAAG,EAAS,UAAW,EAAY,EAAM,cAAc,KAAK,CAAE,CAAC,WAEhG,EAAa,IAAK,IACjB,EAAA,EAAA,IAAA,CAAC,SAAD,CAA2B,MAAO,EAAO,eACtC,EAAO,KACF,EAFK,EAAO,KAEZ,CACT,CACK,CAAA,CACH,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,MAAU,CAAA,GAChB,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,KAAK,OACL,MAAO,EAAQ,KACf,SAAW,GAAU,EAAW,CAAE,GAAG,EAAS,KAAM,EAAM,cAAc,KAAM,CAAC,CAChF,CAAA,CACI,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,IAAQ,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,KAAK,OACL,MAAO,EAAQ,GACf,SAAW,GAAU,EAAW,CAAE,GAAG,EAAS,GAAI,EAAM,cAAc,KAAM,CAAC,CAC9E,CAAA,CACI,CAAA,CAAA,CACA,IAER,EAAc,OAAO,SAAW,GAC/B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,YAAY,2CAA2C,MAAM,0BAA4B,CAAA,GAErG,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,UAAW,YACvB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,gBACnB,EAAc,OAAO,KAAK,EAAO,KAChC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,GACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,kBAAxB,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAM,MAAM,KAAY,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,YAAe,EAAiB,CAAK,EAAG,KAAK,UAAU,QAAQ,iBAAQ,SAEvE,CAAA,CACJ,IACJ,IAAA,GAEN,UAAW,EAAQ,EAAc,OAAO,OAAS,EAC1C,OAER,EADM,EAAM,QACZ,CACF,CACC,CAAA,CACQ,CAAA,EAEf,EAAc,aAAe,KAAO,MACnC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,SAAU,EAAc,cAAe,QAAS,EAAW,SAAU,KAAK,YAAY,QAAA,YAC3F,EAAc,cAAgB,WAAa,uBACtC,CAAA,GAEV,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UACE,IAAkB,KACd,EACA,EAAuB,EAAS,SAAU,EAAS,OAAQ,EAAS,KAAM,EAAc,QAAQ,EAEtG,MAAO,EACP,YAAe,EAAiB,IAAI,EACpC,iBAAkB,EAAe,kBACrB,aACZ,GAAK,IAAoB,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,CAAgB,CACxE,CAAA,CACM,GAEb"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{h as r,w as i}from"./Dialog-DwSIPb-B-DVn37afM.js";import{n as a,o,r as s}from"./workspaceEntityRoutes-CRcfSq7c.js";var c=e(t(),1),l=n(),u=(e,t)=>{let n=o(e);return n===null?void 0:s(t.state,n.workspaceId,n.entityId,a(t))},d=(0,c.forwardRef)(function({href:e,...t},n){let a=i();return(0,l.jsx)(r,{...t,ref:n,state:u(e,a),to:e})});export{u as n,d as t};
|
|
2
|
+
//# sourceMappingURL=WorkspaceEntityLink-BRifdJHn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceEntityLink-BRifdJHn.js","names":[],"sources":["../../../src/client/entities/WorkspaceEntityLink.tsx"],"sourcesContent":["import type { RlyLinkProps } from \"@knpkv/rly/foundations\"\nimport { forwardRef, type ReactElement } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport {\n entityOriginFromLocation,\n makeWorkspaceEntityRouteState,\n workspaceEntityTargetFromHref\n} from \"../items/workspaceEntityRoutes.js\"\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Preserve the validated root origin when an Rly relationship opens another canonical entity. */\nexport const workspaceEntityStateForHref = (href: string, location: RouterLocationParts): unknown => {\n const target = workspaceEntityTargetFromHref(href)\n return target === null\n ? undefined\n : makeWorkspaceEntityRouteState(\n location.state,\n target.workspaceId,\n target.entityId,\n entityOriginFromLocation(location)\n )\n}\n\n/** React Router bridge installed only inside lazy entity-aware route chunks. */\nexport const WorkspaceEntityLink = forwardRef<HTMLAnchorElement, RlyLinkProps>(function WorkspaceEntityLink(\n { href, ...props },\n ref\n): ReactElement {\n const location = useLocation()\n return <Link {...props} ref={ref} state={workspaceEntityStateForHref(href, location)} to={href} />\n})\n"],"mappings":"2MAkBa,GAA+B,EAAc,IAA2C,CACnG,IAAM,EAAS,EAA8B,CAAI,EACjD,OAAO,IAAW,KACd,IAAA,GACA,EACE,EAAS,MACT,EAAO,YACP,EAAO,SACP,EAAyB,CAAQ,CACnC,CACN,EAGa,GAAA,EAAA,EAAA,WAAA,CAAkE,SAC7E,CAAE,OAAM,GAAG,GACX,EACc,CACd,IAAM,EAAW,EAAY,EAC7B,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAY,MAAK,MAAO,EAA4B,EAAM,CAAQ,EAAG,GAAI,CAAO,CAAA,CACnG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._state_dgh51_1{outline:none;place-items:center;min-block-size:60dvh;display:grid}._state_dgh51_1>*{inline-size:min(100%,42rem)}._loading_dgh51_12,._loadingColumns_dgh51_13,._content_dgh51_14,._deliveryPath_dgh51_15,._facts_dgh51_16,._evidence_dgh51_17,._activity_dgh51_18,._sectionHeading_dgh51_19{display:grid}._loading_dgh51_12{gap:var(--rly-space-32);min-block-size:60dvh}._loadingColumns_dgh51_13{gap:var(--rly-space-24);grid-template-columns:minmax(var(--rly-space-0), 1fr) minmax(var(--rly-space-0), 20rem)}._back_dgh51_33,._principalAction_dgh51_34,._releasePath_dgh51_35 a{color:inherit;font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-underline-offset:var(--rly-space-4)}._back_dgh51_33:focus-visible,._principalAction_dgh51_34:focus-visible,._releasePath_dgh51_35 a:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-4)}._principalAction_dgh51_34{background:var(--rly-color-action-background);border-radius:var(--rly-radius-control);color:var(--rly-color-action-foreground);font-size:var(--rly-type-body-large-size);min-block-size:var(--rly-space-48);padding-inline:var(--rly-space-24);justify-content:center;align-items:center;text-decoration:none;display:inline-flex}._content_dgh51_14{gap:var(--rly-space-24)}._deliveryPath_dgh51_15{gap:var(--rly-space-20)}._sectionHeading_dgh51_19{gap:var(--rly-space-4)}._pathRail_dgh51_74{align-items:stretch;gap:var(--rly-space-12);min-inline-size:var(--rly-space-0);padding-block:var(--rly-space-4);display:flex;overflow-x:auto}._pathNode_dgh51_83,._pathEmpty_dgh51_84,._releasePath_dgh51_35 li{background:var(--rly-color-surface-2);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-control);align-items:center;gap:var(--rly-space-12);min-block-size:var(--rly-space-48);padding:var(--rly-space-12) var(--rly-space-16);flex:none;display:flex}._pathNode_dgh51_83>span{gap:var(--rly-space-2);display:grid}._pathNode_dgh51_83 code,._pathEmpty_dgh51_84{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._releasePath_dgh51_35{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none;display:contents}._releasePath_dgh51_35 li:before{color:var(--rly-color-text-3);content:"→";margin-inline-end:var(--rly-space-4)}._facts_dgh51_16,._evidence_dgh51_17{gap:var(--rly-space-16)}._facts_dgh51_16 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._facts_dgh51_16 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(6rem, .65fr) minmax(var(--rly-space-0), 1fr);display:grid}._facts_dgh51_16 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._facts_dgh51_16 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._workingCircle_dgh51_152{--entity-accent:var(--rly-color-focus);isolation:isolate;min-inline-size:var(--rly-space-0);position:relative;overflow:hidden}._workingCircle_dgh51_152:before{block-size:calc(var(--rly-space-64) * 2);border:1px solid color-mix(in srgb, var(--entity-accent) 46%, var(--rly-color-border-1));border-radius:var(--rly-radius-round);content:"";inline-size:calc(var(--rly-space-64) * 2);pointer-events:none;z-index:-1;position:absolute;inset-block-start:calc(var(--rly-space-64) * -1);inset-inline-end:calc(var(--rly-space-48) * -1)}._shell_dgh51_174[data-service=codecommit] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-codecommit)}._shell_dgh51_174[data-service=codepipeline] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-codepipeline)}._shell_dgh51_174[data-service=jira] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-jira)}._shell_dgh51_174[data-service=confluence] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-confluence)}._shell_dgh51_174[data-service=clockify] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-clockify)}._activity_dgh51_18{gap:var(--rly-space-24)}._timeline_dgh51_198{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}@media (width<=44rem){._loadingColumns_dgh51_13,._facts_dgh51_16 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}@media (prefers-reduced-motion:reduce){._pathRail_dgh51_74{scroll-behavior:auto}}._document_1cny9_1,._section_1cny9_2,._sectionHeading_1cny9_3,._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6,._related_1cny9_7,._metadata_1cny9_8,._attribution_1cny9_9{display:grid}._document_1cny9_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._section_1cny9_2{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_1cny9_3{gap:var(--rly-space-4)}._richText_1cny9_28,._commentBody_1cny9_29{overflow-wrap:anywhere}._richText_1cny9_28{font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font);max-inline-size:58ch}._richText_1cny9_28>:first-child,._commentBody_1cny9_29>:first-child{margin-block-start:var(--rly-space-0)}._richText_1cny9_28>:last-child,._commentBody_1cny9_29>:last-child{margin-block-end:var(--rly-space-0)}._richText_1cny9_28 pre,._commentBody_1cny9_29 pre{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-field);max-inline-size:100%;padding:var(--rly-space-16);overflow:auto}._richText_1cny9_28 blockquote,._commentBody_1cny9_29 blockquote{border-inline-start:2px solid var(--rly-color-border-2);margin-inline:var(--rly-space-0);padding-inline-start:var(--rly-space-16)}._richText_1cny9_28 a,._commentBody_1cny9_29 a{color:var(--rly-color-service-jira)}._criteria_1cny9_70{border-inline-start:var(--rly-space-4) solid var(--rly-color-service-jira);padding:var(--rly-space-8) var(--rly-space-24)}._boundaryNotice_1cny9_75,._collectionNotice_1cny9_76{border-radius:var(--rly-radius-field);margin:var(--rly-space-0);padding:var(--rly-space-12) var(--rly-space-16)}._boundaryNotice_1cny9_75{background:var(--rly-color-held-tint);color:var(--rly-color-held-ink)}._collectionNotice_1cny9_76{background:var(--rly-color-surface-2)}._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._people_1cny9_4{gap:var(--rly-space-20);grid-template-columns:repeat(auto-fit,minmax(13rem,1fr))}._metadata_1cny9_8{gap:var(--rly-space-0) var(--rly-space-32);grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._metadata_1cny9_8>div{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-6);padding-block:var(--rly-space-16);display:grid}._metadata_1cny9_8 dt,._history_1cny9_6 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._metadata_1cny9_8 dd,._history_1cny9_6 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._related_1cny9_7{gap:var(--rly-space-12);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr))}._related_1cny9_7>div{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-control);gap:var(--rly-space-6);padding:var(--rly-space-16);display:grid}._related_1cny9_7 strong,._related_1cny9_7 a{font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._related_1cny9_7 a{color:var(--rly-color-service-jira);text-underline-offset:var(--rly-space-4);inline-size:fit-content;text-decoration-thickness:1px}._related_1cny9_7 small,._attribution_1cny9_9 time{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._conversation_1cny9_5,._history_1cny9_6{gap:var(--rly-space-0)}._conversation_1cny9_5>li,._history_1cny9_6>li{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-16);padding-block:var(--rly-space-24);display:grid}._conversation_1cny9_5>li:first-child,._history_1cny9_6>li:first-child{padding-block-start:var(--rly-space-0)}._attribution_1cny9_9{align-items:center;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._history_1cny9_6 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._history_1cny9_6 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(7rem, .35fr) minmax(var(--rly-space-0), 1fr);display:grid}@media (width<=44rem){._document_1cny9_1{gap:var(--rly-space-40)}._metadata_1cny9_8,._history_1cny9_6 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}._criteria_1cny9_70{padding-inline-end:var(--rly-space-0)}}
|