@knpkv/control-center 0.10.3 → 0.10.4
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/dist/client/.vite/manifest.json +406 -406
- package/dist/client/assets/{ActiveWorkPage-DJbMyFnV.js → ActiveWorkPage-DK9ucRgq.js} +2 -2
- package/dist/client/assets/{ActiveWorkPage-DJbMyFnV.js.map → ActiveWorkPage-DK9ucRgq.js.map} +1 -1
- package/dist/client/assets/{AgentPage-CkoowYNN.js → AgentPage-DiaRhWH4.js} +2 -2
- package/dist/client/assets/{AgentPage-CkoowYNN.js.map → AgentPage-DiaRhWH4.js.map} +1 -1
- package/dist/client/assets/{AtlassianOAuthCallbackPage-i2zdrAW9.js → AtlassianOAuthCallbackPage-B00yNx-2.js} +2 -2
- package/dist/client/assets/{AtlassianOAuthCallbackPage-i2zdrAW9.js.map → AtlassianOAuthCallbackPage-B00yNx-2.js.map} +1 -1
- package/dist/client/assets/{AuthorizedSharePage-BKRFQEW5.js → AuthorizedSharePage-BJM10BAd.js} +2 -2
- package/dist/client/assets/{AuthorizedSharePage-BKRFQEW5.js.map → AuthorizedSharePage-BJM10BAd.js.map} +1 -1
- package/dist/client/assets/{BrowserSessionHydrator-DsrYOye8.js → BrowserSessionHydrator-Bm8F4Ctu.js} +2 -2
- package/dist/client/assets/{BrowserSessionHydrator-DsrYOye8.js.map → BrowserSessionHydrator-Bm8F4Ctu.js.map} +1 -1
- package/dist/client/assets/{CommandSearch-B3ogcxH6.js → CommandSearch-BxAJW0LJ.js} +2 -2
- package/dist/client/assets/{CommandSearch-B3ogcxH6.js.map → CommandSearch-BxAJW0LJ.js.map} +1 -1
- package/dist/client/assets/{ItemsPage-C8Kvj_hC.js → ItemsPage-DkKQR0qC.js} +2 -2
- package/dist/client/assets/{ItemsPage-C8Kvj_hC.js.map → ItemsPage-DkKQR0qC.js.map} +1 -1
- package/dist/client/assets/{OpenPullRequestPage-CdKHYk5U.js → OpenPullRequestPage-BXQFgiq0.js} +2 -2
- package/dist/client/assets/{OpenPullRequestPage-CdKHYk5U.js.map → OpenPullRequestPage-BXQFgiq0.js.map} +1 -1
- package/dist/client/assets/{Pages-_Z_n1J6R.js → Pages-DlF3u5xB.js} +2 -2
- package/dist/client/assets/{Pages-_Z_n1J6R.js.map → Pages-DlF3u5xB.js.map} +1 -1
- package/dist/client/assets/{PairPage-BEMXhRqa.js → PairPage-CKINCdoy.js} +2 -2
- package/dist/client/assets/{PairPage-BEMXhRqa.js.map → PairPage-CKINCdoy.js.map} +1 -1
- package/dist/client/assets/{PortfolioOverview-k2woweJX.js → PortfolioOverview-ajQK-ZVn.js} +2 -2
- package/dist/client/assets/{PortfolioOverview-k2woweJX.js.map → PortfolioOverview-ajQK-ZVn.js.map} +1 -1
- package/dist/client/assets/{PullRequestReviewPanel-BZ9gJ9do.js → PullRequestReviewPanel-CUiPHp33.js} +4 -4
- package/dist/client/assets/{PullRequestReviewPanel-BZ9gJ9do.js.map → PullRequestReviewPanel-CUiPHp33.js.map} +1 -1
- package/dist/client/assets/{ReleaseRoute-D5Mrpp8w.js → ReleaseRoute-Dccsofss.js} +2 -2
- package/dist/client/assets/ReleaseRoute-Dccsofss.js.map +1 -0
- package/dist/client/assets/{ReleaseWorkset-idMU3iUy.js → ReleaseWorkset-CpploDSa.js} +2 -2
- package/dist/client/assets/{ReleaseWorkset-idMU3iUy.js.map → ReleaseWorkset-CpploDSa.js.map} +1 -1
- package/dist/client/assets/{ReviewSuggestionOverview-sS1HGbOF.js → ReviewSuggestionOverview-C0gKrq0N.js} +2 -2
- package/dist/client/assets/{ReviewSuggestionOverview-sS1HGbOF.js.map → ReviewSuggestionOverview-C0gKrq0N.js.map} +1 -1
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-CIUTjuOD.js → ReviewSuggestionPublicationSurface-B485cO3v.js} +2 -2
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-CIUTjuOD.js.map → ReviewSuggestionPublicationSurface-B485cO3v.js.map} +1 -1
- package/dist/client/assets/{ServicesPage-C2sELVLy.js → ServicesPage-DxMDCBRr.js} +2 -2
- package/dist/client/assets/{ServicesPage-C2sELVLy.js.map → ServicesPage-DxMDCBRr.js.map} +1 -1
- package/dist/client/assets/{TimelinePage-5BEpQPra.js → TimelinePage-BzvR1pQi.js} +2 -2
- package/dist/client/assets/{TimelinePage-5BEpQPra.js.map → TimelinePage-BzvR1pQi.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityLink-w0WA7xRO.js → WorkspaceEntityLink-DOOjBPKo.js} +2 -2
- package/dist/client/assets/{WorkspaceEntityLink-w0WA7xRO.js.map → WorkspaceEntityLink-DOOjBPKo.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityRoute-BpO38Ge1.js → WorkspaceEntityRoute-HkedzU2L.js} +4 -4
- package/dist/client/assets/{WorkspaceEntityRoute-BpO38Ge1.js.map → WorkspaceEntityRoute-HkedzU2L.js.map} +1 -1
- package/dist/client/assets/{WorkspaceHomeLink-Xl8GvzFw.js → WorkspaceHomeLink-Dn-m2Xhv.js} +2 -2
- package/dist/client/assets/{WorkspaceHomeLink-Xl8GvzFw.js.map → WorkspaceHomeLink-Dn-m2Xhv.js.map} +1 -1
- package/dist/client/assets/{WorkspacePullRequestDetails-COZdOIOb.js → WorkspacePullRequestDetails-DuIuN53U.js} +3 -3
- package/dist/client/assets/{WorkspacePullRequestDetails-COZdOIOb.js.map → WorkspacePullRequestDetails-DuIuN53U.js.map} +1 -1
- package/dist/client/assets/{WorkspaceReleaseLayout-D__SEsHt.js → WorkspaceReleaseLayout-CmOYomjP.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-D__SEsHt.js.map → WorkspaceReleaseLayout-CmOYomjP.js.map} +1 -1
- package/dist/client/assets/{WorkspaceSettingsPage-D-0O9-41.js → WorkspaceSettingsPage-Co6JSDzD.js} +2 -2
- package/dist/client/assets/{WorkspaceSettingsPage-D-0O9-41.js.map → WorkspaceSettingsPage-Co6JSDzD.js.map} +1 -1
- package/dist/client/assets/{angular-html-B-gwpVlh-BRbhVJ6Y.js → angular-html-B-gwpVlh-Bgrt633l.js} +2 -2
- package/dist/client/assets/{angular-html-B-gwpVlh-BRbhVJ6Y.js.map → angular-html-B-gwpVlh-Bgrt633l.js.map} +1 -1
- package/dist/client/assets/{angular-ts-BdaH9qH_-CreuaMKb.js → angular-ts-BdaH9qH_-BkPrletd.js} +2 -2
- package/dist/client/assets/{angular-ts-BdaH9qH_-CreuaMKb.js.map → angular-ts-BdaH9qH_-BkPrletd.js.map} +1 -1
- package/dist/client/assets/{apl-BLTDDucx-E9crm-GK.js → apl-BLTDDucx-wY4O_74Y.js} +2 -2
- package/dist/client/assets/{apl-BLTDDucx-E9crm-GK.js.map → apl-BLTDDucx-wY4O_74Y.js.map} +1 -1
- package/dist/client/assets/{astro-CM3EIsEH-DpNG08M6.js → astro-CM3EIsEH-D7flgJwH.js} +2 -2
- package/dist/client/assets/{astro-CM3EIsEH-DpNG08M6.js.map → astro-CM3EIsEH-D7flgJwH.js.map} +1 -1
- package/dist/client/assets/{blade-BuLZ1b4i-s07PULYH.js → blade-BuLZ1b4i-qswDnG1D.js} +2 -2
- package/dist/client/assets/{blade-BuLZ1b4i-s07PULYH.js.map → blade-BuLZ1b4i-qswDnG1D.js.map} +1 -1
- package/dist/client/assets/{c-BOe7FNWg-PrQjeFQ3.js → c-BOe7FNWg-9K6ZU3yU.js} +2 -2
- package/dist/client/assets/{c-BOe7FNWg-PrQjeFQ3.js.map → c-BOe7FNWg-9K6ZU3yU.js.map} +1 -1
- package/dist/client/assets/{chapel-DS426I0C-DB9jZ2L5.js → chapel-DS426I0C-D7P1_fn5.js} +2 -2
- package/dist/client/assets/{chapel-DS426I0C-DB9jZ2L5.js.map → chapel-DS426I0C-D7P1_fn5.js.map} +1 -1
- package/dist/client/assets/{cobol-D88xw2SU-C4G8uiv_.js → cobol-D88xw2SU-BeZ5JZSl.js} +2 -2
- package/dist/client/assets/{cobol-D88xw2SU-C4G8uiv_.js.map → cobol-D88xw2SU-BeZ5JZSl.js.map} +1 -1
- package/dist/client/assets/{coffee-9O-pYXz5-BZexwMqx.js → coffee-9O-pYXz5-CB0EJ1nc.js} +2 -2
- package/dist/client/assets/{coffee-9O-pYXz5-BZexwMqx.js.map → coffee-9O-pYXz5-CB0EJ1nc.js.map} +1 -1
- package/dist/client/assets/{controlCenterRelayDock-CyvFJBSX.js → controlCenterRelayDock-Duxhij28.js} +3 -3
- package/dist/client/assets/{controlCenterRelayDock-CyvFJBSX.js.map → controlCenterRelayDock-Duxhij28.js.map} +1 -1
- package/dist/client/assets/{controlCenterRelayDockChrome-LsVvlXRh.js → controlCenterRelayDockChrome-8SmLWAq4.js} +2 -2
- package/dist/client/assets/{controlCenterRelayDockChrome-LsVvlXRh.js.map → controlCenterRelayDockChrome-8SmLWAq4.js.map} +1 -1
- package/dist/client/assets/{cpp-CPk7VU6o-lNmTk_pG.js → cpp-CPk7VU6o-hQ9MAV3y.js} +2 -2
- package/dist/client/assets/{cpp-CPk7VU6o-lNmTk_pG.js.map → cpp-CPk7VU6o-hQ9MAV3y.js.map} +1 -1
- package/dist/client/assets/{crystal-CRftOMVe-BSooBDgS.js → crystal-CRftOMVe-DN_g4Upk.js} +2 -2
- package/dist/client/assets/{crystal-CRftOMVe-BSooBDgS.js.map → crystal-CRftOMVe-DN_g4Upk.js.map} +1 -1
- package/dist/client/assets/{css-DKjIhbA_-kkwCxkks.js → css-DKjIhbA_-CUnFG3ES.js} +2 -2
- package/dist/client/assets/{css-DKjIhbA_-kkwCxkks.js.map → css-DKjIhbA_-CUnFG3ES.js.map} +1 -1
- package/dist/client/assets/{diff-BvynzM0a.js → diff-Ci0yCkTU.js} +3 -3
- package/dist/client/assets/{diff-BvynzM0a.js.map → diff-Ci0yCkTU.js.map} +1 -1
- package/dist/client/assets/{edge-CZci3foK-DbjelmsF.js → edge-CZci3foK-Ctlg1YxQ.js} +2 -2
- package/dist/client/assets/{edge-CZci3foK-DbjelmsF.js.map → edge-CZci3foK-Ctlg1YxQ.js.map} +1 -1
- package/dist/client/assets/{elixir-BFbWRTPN-DGdecMQe.js → elixir-BFbWRTPN-cC1K9Ezq.js} +2 -2
- package/dist/client/assets/{elixir-BFbWRTPN-DGdecMQe.js.map → elixir-BFbWRTPN-cC1K9Ezq.js.map} +1 -1
- package/dist/client/assets/{elm-BFCSOEGh-B9BWZIGp.js → elm-BFCSOEGh-XnRYfTO2.js} +2 -2
- package/dist/client/assets/{elm-BFCSOEGh-B9BWZIGp.js.map → elm-BFCSOEGh-XnRYfTO2.js.map} +1 -1
- package/dist/client/assets/{erb-C0EkZJvn-BQCINe4O.js → erb-C0EkZJvn-Dzi6SH3N.js} +2 -2
- package/dist/client/assets/{erb-C0EkZJvn-BQCINe4O.js.map → erb-C0EkZJvn-Dzi6SH3N.js.map} +1 -1
- package/dist/client/assets/{git-rebase-DBDs07B2-BsUn_6wp.js → git-rebase-DBDs07B2-CPonOskG.js} +2 -2
- package/dist/client/assets/{git-rebase-DBDs07B2-BsUn_6wp.js.map → git-rebase-DBDs07B2-CPonOskG.js.map} +1 -1
- package/dist/client/assets/{glimmer-js-oqYt1Bty-DhwIdeuV.js → glimmer-js-oqYt1Bty-8uN_RGfs.js} +2 -2
- package/dist/client/assets/{glimmer-js-oqYt1Bty-DhwIdeuV.js.map → glimmer-js-oqYt1Bty-8uN_RGfs.js.map} +1 -1
- package/dist/client/assets/{glimmer-ts-CjmgbZTn-D--4KEri.js → glimmer-ts-CjmgbZTn-BbhdlUs3.js} +2 -2
- package/dist/client/assets/{glimmer-ts-CjmgbZTn-D--4KEri.js.map → glimmer-ts-CjmgbZTn-BbhdlUs3.js.map} +1 -1
- package/dist/client/assets/{glsl-BqUMGrwT-BugoDbsL.js → glsl-BqUMGrwT-BdC4EsWs.js} +2 -2
- package/dist/client/assets/{glsl-BqUMGrwT-BugoDbsL.js.map → glsl-BqUMGrwT-BdC4EsWs.js.map} +1 -1
- package/dist/client/assets/{graphql-CEJryLGF-CK33Sd2D.js → graphql-CEJryLGF-BRAA6O06.js} +2 -2
- package/dist/client/assets/{graphql-CEJryLGF-CK33Sd2D.js.map → graphql-CEJryLGF-BRAA6O06.js.map} +1 -1
- package/dist/client/assets/{hack-DwBIwaGr-BlHtHO90.js → hack-DwBIwaGr-BAtB0Umc.js} +2 -2
- package/dist/client/assets/{hack-DwBIwaGr-BlHtHO90.js.map → hack-DwBIwaGr-BAtB0Umc.js.map} +1 -1
- package/dist/client/assets/{haml-BgD6GFV2-Cn_7eMhf.js → haml-BgD6GFV2-Cc0uNVUI.js} +2 -2
- package/dist/client/assets/{haml-BgD6GFV2-Cn_7eMhf.js.map → haml-BgD6GFV2-Cc0uNVUI.js.map} +1 -1
- package/dist/client/assets/{handlebars-DAEAtsmp-Ddwvn7SX.js → handlebars-DAEAtsmp-DLsK2kOk.js} +2 -2
- package/dist/client/assets/{handlebars-DAEAtsmp-Ddwvn7SX.js.map → handlebars-DAEAtsmp-DLsK2kOk.js.map} +1 -1
- package/dist/client/assets/{html-B63qAdeQ-C8grXLcX.js → html-B63qAdeQ-BI2TthmT.js} +2 -2
- package/dist/client/assets/{html-B63qAdeQ-C8grXLcX.js.map → html-B63qAdeQ-BI2TthmT.js.map} +1 -1
- package/dist/client/assets/{html-derivative-DliF0Izh-eHtyKN9s.js → html-derivative-DliF0Izh-CMfd68Cg.js} +2 -2
- package/dist/client/assets/{html-derivative-DliF0Izh-eHtyKN9s.js.map → html-derivative-DliF0Izh-CMfd68Cg.js.map} +1 -1
- package/dist/client/assets/{http-BPdteiK2-tAvZYLK6.js → http-BPdteiK2-CX-IhbOk.js} +2 -2
- package/dist/client/assets/{http-BPdteiK2-tAvZYLK6.js.map → http-BPdteiK2-CX-IhbOk.js.map} +1 -1
- package/dist/client/assets/{hurl-y6bQoMbn-BGQBtGLU.js → hurl-y6bQoMbn-7mwJ2k07.js} +2 -2
- package/dist/client/assets/{hurl-y6bQoMbn-BGQBtGLU.js.map → hurl-y6bQoMbn-7mwJ2k07.js.map} +1 -1
- package/dist/client/assets/{index-BDOFEVxB.js → index-CyCO7dDM.js} +3 -3
- package/dist/client/assets/{index-BDOFEVxB.js.map → index-CyCO7dDM.js.map} +1 -1
- package/dist/client/assets/{index-DBsf6vDR.css → index-Dn0IKu62.css} +1 -1
- package/dist/client/assets/{java-HDTZqoJ--BjrQmsMC.js → java-HDTZqoJ--B9p-6FTD.js} +2 -2
- package/dist/client/assets/{java-HDTZqoJ--BjrQmsMC.js.map → java-HDTZqoJ--B9p-6FTD.js.map} +1 -1
- package/dist/client/assets/{javascript-B8-PXjxO-Bq-MMO25.js → javascript-B8-PXjxO-CxKVIkrE.js} +2 -2
- package/dist/client/assets/{javascript-B8-PXjxO-Bq-MMO25.js.map → javascript-B8-PXjxO-CxKVIkrE.js.map} +1 -1
- package/dist/client/assets/{jinja-Li2helwk-l0WFvHGY.js → jinja-Li2helwk-wiEfSEKd.js} +2 -2
- package/dist/client/assets/{jinja-Li2helwk-l0WFvHGY.js.map → jinja-Li2helwk-wiEfSEKd.js.map} +1 -1
- package/dist/client/assets/{jison-D4pd2L4r-DfaKq-VY.js → jison-D4pd2L4r-CdTHAA5K.js} +2 -2
- package/dist/client/assets/{jison-D4pd2L4r-DfaKq-VY.js.map → jison-D4pd2L4r-CdTHAA5K.js.map} +1 -1
- package/dist/client/assets/{json-CHeq_08V-DZfpiOP9.js → json-CHeq_08V-BaAxXEpC.js} +2 -2
- package/dist/client/assets/{json-CHeq_08V-DZfpiOP9.js.map → json-CHeq_08V-BaAxXEpC.js.map} +1 -1
- package/dist/client/assets/{jsx-CTDAtxCE-Zsgbxq22.js → jsx-CTDAtxCE-DqkBvJVQ.js} +2 -2
- package/dist/client/assets/{jsx-CTDAtxCE-Zsgbxq22.js.map → jsx-CTDAtxCE-DqkBvJVQ.js.map} +1 -1
- package/dist/client/assets/{julia-B8HGxjvO-LAG3JTya.js → julia-B8HGxjvO-BViJH-3Z.js} +2 -2
- package/dist/client/assets/{julia-B8HGxjvO-LAG3JTya.js.map → julia-B8HGxjvO-BViJH-3Z.js.map} +1 -1
- package/dist/client/assets/{just-C1IY8eCo-BbIdo5MA.js → just-C1IY8eCo-DyJ_BTeb.js} +2 -2
- package/dist/client/assets/{just-C1IY8eCo-BbIdo5MA.js.map → just-C1IY8eCo-DyJ_BTeb.js.map} +1 -1
- package/dist/client/assets/{latex-CWjLpLhK-46pD4fMG.js → latex-CWjLpLhK-DpCuHsze.js} +2 -2
- package/dist/client/assets/{latex-CWjLpLhK-46pD4fMG.js.map → latex-CWjLpLhK-DpCuHsze.js.map} +1 -1
- package/dist/client/assets/{liquid-DO0vm52w-Cy8GQMCW.js → liquid-DO0vm52w-CEF5fJp5.js} +2 -2
- package/dist/client/assets/{liquid-DO0vm52w-Cy8GQMCW.js.map → liquid-DO0vm52w-CEF5fJp5.js.map} +1 -1
- package/dist/client/assets/{lua-rOZn354j-Cbcfon72.js → lua-rOZn354j-CaHUiAfq.js} +2 -2
- package/dist/client/assets/{lua-rOZn354j-Cbcfon72.js.map → lua-rOZn354j-CaHUiAfq.js.map} +1 -1
- package/dist/client/assets/{marko-CiZdnOV9-CcFVdIL7.js → marko-CiZdnOV9-Brrk-_VN.js} +2 -2
- package/dist/client/assets/{marko-CiZdnOV9-CcFVdIL7.js.map → marko-CiZdnOV9-Brrk-_VN.js.map} +1 -1
- package/dist/client/assets/{mdc-D1ADfxGi-YqDuYoZm.js → mdc-D1ADfxGi-Co8KdHkR.js} +2 -2
- package/dist/client/assets/{mdc-D1ADfxGi-YqDuYoZm.js.map → mdc-D1ADfxGi-Co8KdHkR.js.map} +1 -1
- package/dist/client/assets/{nginx-8KXIzHX2-Bic9RPc2.js → nginx-8KXIzHX2-CEzGaPe_.js} +2 -2
- package/dist/client/assets/{nginx-8KXIzHX2-Bic9RPc2.js.map → nginx-8KXIzHX2-CEzGaPe_.js.map} +1 -1
- package/dist/client/assets/{nim-CbBDSJf5-BQ6kTMUg.js → nim-CbBDSJf5-whZa9TGm.js} +2 -2
- package/dist/client/assets/{nim-CbBDSJf5-BQ6kTMUg.js.map → nim-CbBDSJf5-whZa9TGm.js.map} +1 -1
- package/dist/client/assets/{org-BlnOvN6p-B_-wxUCO.js → org-BlnOvN6p-C-HBqFDh.js} +2 -2
- package/dist/client/assets/{org-BlnOvN6p-B_-wxUCO.js.map → org-BlnOvN6p-C-HBqFDh.js.map} +1 -1
- package/dist/client/assets/{patterns-Nc-ycn7Y.js → patterns-DsePY14f.js} +2 -2
- package/dist/client/assets/{patterns-Nc-ycn7Y.js.map → patterns-DsePY14f.js.map} +1 -1
- package/dist/client/assets/{perl-CntHWu4k-BuEQuG7U.js → perl-CntHWu4k-DLNYobup.js} +2 -2
- package/dist/client/assets/{perl-CntHWu4k-BuEQuG7U.js.map → perl-CntHWu4k-DLNYobup.js.map} +1 -1
- package/dist/client/assets/{php-VF06KE26-BliObRgA.js → php-VF06KE26-Dp4fuXKl.js} +2 -2
- package/dist/client/assets/{php-VF06KE26-BliObRgA.js.map → php-VF06KE26-Dp4fuXKl.js.map} +1 -1
- package/dist/client/assets/{primitives-CgvvYKjR-BnO9EmQf.js → primitives-Bd6WhE78-DyJtZKnH.js} +2 -2
- package/dist/client/assets/primitives-Bd6WhE78-DyJtZKnH.js.map +1 -0
- package/dist/client/assets/{pug-DeZwH1tK-DpL6DGEh.js → pug-DeZwH1tK-Bho3PjIQ.js} +2 -2
- package/dist/client/assets/{pug-DeZwH1tK-DpL6DGEh.js.map → pug-DeZwH1tK-Bho3PjIQ.js.map} +1 -1
- package/dist/client/assets/{pullRequestReviewThreadReplay-FCMFIIPG.js → pullRequestReviewThreadReplay-D-Gd3hoP.js} +2 -2
- package/dist/client/assets/{pullRequestReviewThreadReplay-FCMFIIPG.js.map → pullRequestReviewThreadReplay-D-Gd3hoP.js.map} +1 -1
- package/dist/client/assets/{qml-CQhAR2tt-Cjst7VAs.js → qml-CQhAR2tt-D1c_pknn.js} +2 -2
- package/dist/client/assets/{qml-CQhAR2tt-Cjst7VAs.js.map → qml-CQhAR2tt-D1c_pknn.js.map} +1 -1
- package/dist/client/assets/{r-CGShpgkr-BVeckCHF.js → r-CGShpgkr-C7bXpPjk.js} +2 -2
- package/dist/client/assets/{r-CGShpgkr-BVeckCHF.js.map → r-CGShpgkr-C7bXpPjk.js.map} +1 -1
- package/dist/client/assets/{razor-CgB2QCs6-Cd3_piVw.js → razor-CgB2QCs6-DhGc3RMt.js} +2 -2
- package/dist/client/assets/{razor-CgB2QCs6-Cd3_piVw.js.map → razor-CgB2QCs6-DhGc3RMt.js.map} +1 -1
- package/dist/client/assets/{regexp-go_CdRjx-CR2YSHZ1.js → regexp-go_CdRjx-CJ0kv0kL.js} +2 -2
- package/dist/client/assets/{regexp-go_CdRjx-CR2YSHZ1.js.map → regexp-go_CdRjx-CJ0kv0kL.js.map} +1 -1
- package/dist/client/assets/{releaseRoutes-DPwinWrO.js → releaseRoutes-cNpu7gsD.js} +2 -2
- package/dist/client/assets/{releaseRoutes-DPwinWrO.js.map → releaseRoutes-cNpu7gsD.js.map} +1 -1
- package/dist/client/assets/{rst-CbWMI8ou-DAnUZELh.js → rst-CbWMI8ou-QeegT2a0.js} +2 -2
- package/dist/client/assets/{rst-CbWMI8ou-DAnUZELh.js.map → rst-CbWMI8ou-QeegT2a0.js.map} +1 -1
- package/dist/client/assets/{ruby-DsGwIs06--OWGrZzF.js → ruby-DsGwIs06-zfezgkhT.js} +2 -2
- package/dist/client/assets/{ruby-DsGwIs06--OWGrZzF.js.map → ruby-DsGwIs06-zfezgkhT.js.map} +1 -1
- package/dist/client/assets/{sas-DjxN8J4Z-jVfbDYqr.js → sas-DjxN8J4Z-CnTs8n2C.js} +2 -2
- package/dist/client/assets/{sas-DjxN8J4Z-jVfbDYqr.js.map → sas-DjxN8J4Z-CnTs8n2C.js.map} +1 -1
- package/dist/client/assets/{scss-bkiiULjK-D2AbGytL.js → scss-bkiiULjK-XMjkwalx.js} +2 -2
- package/dist/client/assets/{scss-bkiiULjK-D2AbGytL.js.map → scss-bkiiULjK-XMjkwalx.js.map} +1 -1
- package/dist/client/assets/{shellscript-Cuh1SIPr-BiNPTO6b.js → shellscript-Cuh1SIPr-46XCCu2F.js} +2 -2
- package/dist/client/assets/{shellscript-Cuh1SIPr-BiNPTO6b.js.map → shellscript-Cuh1SIPr-46XCCu2F.js.map} +1 -1
- package/dist/client/assets/{shellsession-C4UOwxb7-kRylcT_R.js → shellsession-C4UOwxb7-BKA80XTI.js} +2 -2
- package/dist/client/assets/{shellsession-C4UOwxb7-kRylcT_R.js.map → shellsession-C4UOwxb7-BKA80XTI.js.map} +1 -1
- package/dist/client/assets/{soy-CeGFXpLT-C8n-t50V.js → soy-CeGFXpLT-Nlu0Kd5l.js} +2 -2
- package/dist/client/assets/{soy-CeGFXpLT-C8n-t50V.js.map → soy-CeGFXpLT-Nlu0Kd5l.js.map} +1 -1
- package/dist/client/assets/{sql-qDYmMTO1-CMujL9b5.js → sql-qDYmMTO1-D24X-mUh.js} +2 -2
- package/dist/client/assets/{sql-qDYmMTO1-CMujL9b5.js.map → sql-qDYmMTO1-D24X-mUh.js.map} +1 -1
- package/dist/client/assets/{stata-Dzus_rwP-xpTbStns.js → stata-Dzus_rwP-DJ7CmNSn.js} +2 -2
- package/dist/client/assets/{stata-Dzus_rwP-xpTbStns.js.map → stata-Dzus_rwP-DJ7CmNSn.js.map} +1 -1
- package/dist/client/assets/{surrealql-DmTrf8uR-C71726g6.js → surrealql-DmTrf8uR-C3LuBr-Y.js} +2 -2
- package/dist/client/assets/{surrealql-DmTrf8uR-C71726g6.js.map → surrealql-DmTrf8uR-C3LuBr-Y.js.map} +1 -1
- package/dist/client/assets/{svelte-CWlRonoS-Dsmgsl3p.js → svelte-CWlRonoS-B_ECcTzN.js} +2 -2
- package/dist/client/assets/{svelte-CWlRonoS-Dsmgsl3p.js.map → svelte-CWlRonoS-B_ECcTzN.js.map} +1 -1
- package/dist/client/assets/{templ-EuFg1gKs-Dlt8LDbj.js → templ-EuFg1gKs-ByAnUgBM.js} +2 -2
- package/dist/client/assets/{templ-EuFg1gKs-Dlt8LDbj.js.map → templ-EuFg1gKs-ByAnUgBM.js.map} +1 -1
- package/dist/client/assets/{tex-Cbbx1SXS-CGW7lVtU.js → tex-Cbbx1SXS-0Ywa__H_.js} +2 -2
- package/dist/client/assets/{tex-Cbbx1SXS-CGW7lVtU.js.map → tex-Cbbx1SXS-0Ywa__H_.js.map} +1 -1
- package/dist/client/assets/{ts-tags-DOHpIWV2-Cs4BupLU.js → ts-tags-DOHpIWV2-CuulTIKM.js} +2 -2
- package/dist/client/assets/{ts-tags-DOHpIWV2-Cs4BupLU.js.map → ts-tags-DOHpIWV2-CuulTIKM.js.map} +1 -1
- package/dist/client/assets/{tsx-DmRL3u_2-Br3tQc1n.js → tsx-DmRL3u_2-GCLpfMRQ.js} +2 -2
- package/dist/client/assets/{tsx-DmRL3u_2-Br3tQc1n.js.map → tsx-DmRL3u_2-GCLpfMRQ.js.map} +1 -1
- package/dist/client/assets/{twig-BzcHspK1-DTeHZkzh.js → twig-BzcHspK1-BaXWhuif.js} +2 -2
- package/dist/client/assets/{twig-BzcHspK1-DTeHZkzh.js.map → twig-BzcHspK1-BaXWhuif.js.map} +1 -1
- package/dist/client/assets/{typescript-BYTx4UxO-Ckgqgf_6.js → typescript-BYTx4UxO-D62Ug8gp.js} +2 -2
- package/dist/client/assets/{typescript-BYTx4UxO-Ckgqgf_6.js.map → typescript-BYTx4UxO-D62Ug8gp.js.map} +1 -1
- package/dist/client/assets/{typst-BrfC91e7-C5LPu314.js → typst-BrfC91e7-BqtmZjA2.js} +2 -2
- package/dist/client/assets/{typst-BrfC91e7-C5LPu314.js.map → typst-BrfC91e7-BqtmZjA2.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceDefaultLanding-DwCv_p0F.js → useWorkspaceDefaultLanding-CNq5BmMV.js} +2 -2
- package/dist/client/assets/{useWorkspaceDefaultLanding-DwCv_p0F.js.map → useWorkspaceDefaultLanding-CNq5BmMV.js.map} +1 -1
- package/dist/client/assets/{vue-B92PIQFm-D2EcIWyt.js → vue-B92PIQFm-C54gWdwm.js} +2 -2
- package/dist/client/assets/{vue-B92PIQFm-D2EcIWyt.js.map → vue-B92PIQFm-C54gWdwm.js.map} +1 -1
- package/dist/client/assets/{vue-html-EDHI-aeE-Cu1z77i2.js → vue-html-EDHI-aeE-Cw2PnKOb.js} +2 -2
- package/dist/client/assets/{vue-html-EDHI-aeE-Cu1z77i2.js.map → vue-html-EDHI-aeE-Cw2PnKOb.js.map} +1 -1
- package/dist/client/assets/{vue-vine-CmMdgoEY-xSl0fRHe.js → vue-vine-CmMdgoEY-C9ayJcHX.js} +2 -2
- package/dist/client/assets/{vue-vine-CmMdgoEY-xSl0fRHe.js.map → vue-vine-CmMdgoEY-C9ayJcHX.js.map} +1 -1
- package/dist/client/assets/{workspaceEntityRoutes-DY6gXtOy.js → workspaceEntityRoutes-BYPBqjUZ.js} +2 -2
- package/dist/client/assets/{workspaceEntityRoutes-DY6gXtOy.js.map → workspaceEntityRoutes-BYPBqjUZ.js.map} +1 -1
- package/dist/client/assets/{workspaceScrollCapture-B4_xSwNQ.js → workspaceScrollCapture-u6lJbYGL.js} +2 -2
- package/dist/client/assets/{workspaceScrollCapture-B4_xSwNQ.js.map → workspaceScrollCapture-u6lJbYGL.js.map} +1 -1
- package/dist/client/assets/{xml-Bz9Nzp99-Dci4Wxub.js → xml-Bz9Nzp99-q2auRtdj.js} +2 -2
- package/dist/client/assets/{xml-Bz9Nzp99-Dci4Wxub.js.map → xml-Bz9Nzp99-q2auRtdj.js.map} +1 -1
- package/dist/client/assets/{xsl-D0pOnfMq-BJ-ZDrUM.js → xsl-D0pOnfMq-DV7XsD_5.js} +2 -2
- package/dist/client/assets/{xsl-D0pOnfMq-BJ-ZDrUM.js.map → xsl-D0pOnfMq-DV7XsD_5.js.map} +1 -1
- package/dist/client/assets/{yaml-DKDHNCIP-DhiHdxcC.js → yaml-DKDHNCIP-DSSGln5p.js} +2 -2
- package/dist/client/assets/{yaml-DKDHNCIP-DhiHdxcC.js.map → yaml-DKDHNCIP-DSSGln5p.js.map} +1 -1
- package/dist/client/index.html +2 -2
- package/package.json +9 -9
- package/dist/client/assets/ReleaseRoute-D5Mrpp8w.js.map +0 -1
- package/dist/client/assets/primitives-CgvvYKjR-BnO9EmQf.js.map +0 -1
package/dist/client/assets/{ReleaseWorkset-idMU3iUy.js.map → ReleaseWorkset-CpploDSa.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReleaseWorkset-idMU3iUy.js","names":["currentRelationship","titleCase","relationshipLifecycleTone","relationshipConfidenceLabel","traceConnection","loading","tags","isUnauthorizedFailure","Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.forEach","Effect.provide","FetchHttpClient.layer","useState","useRef","useCallback","DateTime.formatUtc","styles","Text","StateLabel","Sheet","Skeleton","StatePanel","Button","Schema.Struct","Schema.Literal","Predicate.isObject","Schema.decodeUnknownOption","Option.isSome","Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.provide","FetchHttpClient.layer","useState","useCallback","styles","Skeleton","ServiceMark","Text","StateLabel","StatePanel","Button","_Fragment","LinkProvider","WorksetCard","__toESM","useLocation","useNavigate","Le","V","fe","He","ve","require_jsx_runtime","useBrowserSession","Link","a","browserReadableSessionKey","Mr","z","ue","provide","runPromise","Literal","isObject","decodeUnknownOption","EntityId","Struct","gen","isSome","forEach","isTagged","formatUtc","RelationshipId","layer","makeControlCenterApiClient","workspaceEntityPath","shouldRememberWorkspaceScrollPosition","rememberWorkspaceScrollPosition","presentPipelineExecutionStages","confluenceTaskSummary","workspaceEntityStateForHref","WorkspaceEntityLink","import_react","require_react","currentRelationship$1","lifecycle","approvalName","value","releasePipelineApprovalReadiness","nodeById","inspection","node","projectionByEntityId","projection","affectedPipelineIds","relationship","source","target","unverifiablePipelines","gates","entityId","details","approvalActionStages","action","approvalStages","stage","waiting","explicitActions","status","state","relationshipHref","workspaceId","releaseId","relationshipId","statusTone","normalized","reviewStateLabel","pullRequestStateLabel","pipelineStateLabel","titleCase$1","part","selectedObjectService","kind","selectedObjectStatus","selectedObjectFacts","presentSelectedObject","selected","selectReleaseWorksetObject","selectedObjectId","currentRelationship","gapService","entityProjectionByNode","projections","relationshipLifecycleTone$1","relationshipConfidenceLabel$1","confidence","traceConnection$1","nodeId","candidate","isCurrentRelease","selectReleaseWorksetTrace","selectedObject","selectedNodeIds","direction","otherNodeId","left","right","selectReleaseWorksetRelationship","selectedRelationshipId","releaseWorksetRelationshipEvidenceClaims","claimById","claim","claimId","releaseWorksetRelationshipEvidenceIds","evidenceIds","releaseRunbookEntityIds","nodes","gapLabel","issue","presentReleaseWorkset","runbookEntityIds","href","issues","pullRequests","pipelineExecutions","pages","confluenceTaskGaps","page","task","pipelineReadiness","pipelineApprovalGaps","gate","unverifiablePipelineGaps","sourceNodes","pullRequest","linkedJiraKeys","pipeline","tasks","RelationshipDetailSheet_module_default","isUnauthorizedFailure$1","browserRelationshipDetailsTransport","client","history","useRelationshipDetails","requestRevision","setRequestRevision","setState","evidenceKey","evidenceIdsRef","sessionKey","abort","transport","failure","onSessionExpired","currentState","revision","import_jsx_runtime","titleCase","formatRelationshipTimestamp","relationshipActorLabel","actor","relationshipProvenanceLabel","provenance","relationshipRationale","relationshipConfidenceLabel","relationshipLifecycleTone","relationshipScopeLabel","evidenceFreshnessTone","evidence","lifecycleReason","evidencePartyLabel","party","evidenceClaimValueLabel","EvidenceCard","relatedClaimIds","relatedClaims","claims","evidenceId","evidenceClaimId","relationshipHistoryCountLabel","newestRevision","revisions","RelationshipDetailSheet","controller","title","evidenceIntegrityComplete","open","onClose","reason","RelationshipDetailMarker","RelationshipDetailRouteState","makeRelationshipDetailRouteState","matchesRelationshipDetailRouteState","decoded","objectId","closeRelationshipDetailRoute","location","navigate","next","ReleaseWorkset_module_default","loadReleaseEnvironmentSlices","scopes","environmentIds","completed","nextIndex","isStopped","loadNext","index","environmentId","load","workerCount","MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS","aggregateReleaseWorksetInspections","availableNodes","availableProjections","availableClaims","availableEvidence","inspections","entry","item","entityProjections","relationships","evidenceClaims","evidenceItems","truncated","relationshipKey","requiredNodes","presentNodes","entityNodes","requiredProjections","requiredClaims","requiredEvidence","closureMissing","newNodeCount","newProjectionCount","newClaimCount","newEvidenceCount","closureExceedsBound","isUnauthorizedFailure","loadReleaseWorksetInspections","signal","browserReleaseWorksetTransport","useReleaseWorkset","environmentScopeKey","LoadingWorkset","SelectedReleaseWorksetObjectPanel","fact","trace","linkLocation","event","releaseWorksetSessionKey","ReleaseWorkset","browserSession","release","workset","searchParams","selectedTrace","selectedRelationship","selectedEvidenceIds","selectedEvidenceClaims","runbook"],"sources":["../../../src/domain/releasePipelineApproval.ts","../../../src/client/releases/presentReleaseWorkset.ts","../../../src/client/releases/RelationshipDetailSheet.module.css","../../../src/client/releases/useRelationshipDetails.ts","../../../src/client/releases/RelationshipDetailSheet.tsx","../../../src/client/releases/relationshipDetailRoute.ts","../../../src/client/releases/ReleaseWorkset.module.css","../../../src/client/releases/loadReleaseEnvironmentSlices.ts","../../../src/client/releases/useReleaseWorkset.ts","../../../src/client/releases/ReleaseWorkset.tsx"],"sourcesContent":["import type { DeliveryEntityProjection, DeliveryNode, DeliveryRelationship } from \"./deliveryGraph.js\"\nimport type { EntityId } from \"./identifiers.js\"\n\ninterface ReleasePipelineApprovalInspection {\n readonly entityProjections: ReadonlyArray<{ readonly projection: DeliveryEntityProjection }>\n readonly nodes: ReadonlyArray<DeliveryNode>\n readonly relationships: ReadonlyArray<DeliveryRelationship>\n readonly truncated: boolean\n}\n\nexport type ReleasePipelineApprovalGate = Readonly<{\n readonly entityId: EntityId\n readonly pipelineName: string\n readonly state: \"missing\" | \"not-waiting\" | \"waiting\"\n}>\n\nconst currentRelationship = (\n lifecycle: DeliveryRelationship[\"lifecycle\"]\n): boolean => lifecycle._tag !== \"missing\" && lifecycle._tag !== \"rejected\" && lifecycle._tag !== \"superseded\"\n\nconst approvalName = (value: string): boolean =>\n /(?:^|[\\s_-])(?:approval|approve)(?:$|[\\s_-])/iu.test(value) || /release[\\s_-]*gate/iu.test(value)\n\n/** Prove that every pipeline delivering a release PR is stopped at its observed manual approval gate. */\nexport const releasePipelineApprovalReadiness = (inspection: ReleasePipelineApprovalInspection) => {\n const nodeById = new Map(inspection.nodes.map((node) => [node.nodeId, node]))\n const projectionByEntityId = new Map(\n inspection.entityProjections.map(({ projection }) => [projection.entityId, projection])\n )\n const affectedPipelineIds = new Set(\n inspection.relationships.flatMap((relationship): ReadonlyArray<EntityId> => {\n if (\n relationship.kind !== \"delivered-by\" ||\n relationship.sourceNodeKind !== \"pull-request\" ||\n relationship.targetNodeKind !== \"pipeline-execution\" ||\n !currentRelationship(relationship.lifecycle)\n ) return []\n const source = nodeById.get(relationship.sourceNodeId)\n const target = nodeById.get(relationship.targetNodeId)\n return source?.resolution._tag === \"resolved\" &&\n source.resolution.target._tag === \"entity\" &&\n target?.resolution._tag === \"resolved\" &&\n target.resolution.target._tag === \"entity\"\n ? [target.resolution.target.entityId]\n : []\n })\n )\n let unverifiablePipelines = 0\n const gates: Array<ReleasePipelineApprovalGate> = []\n for (const entityId of affectedPipelineIds) {\n const projection = projectionByEntityId.get(entityId)\n const details = projection?.details\n if (\n projection?.entityState !== \"present\" ||\n projection.entityType !== \"pipeline-execution\" ||\n details?._tag !== \"pipeline-execution\"\n ) {\n unverifiablePipelines += 1\n continue\n }\n const approvalActionStages = new Set(\n (details.actions ?? []).flatMap((action) =>\n action.category?.toLocaleLowerCase(\"en-US\") === \"approval\" ||\n action.provider?.toLocaleLowerCase(\"en-US\") === \"manual\"\n ? [action.stageName]\n : []\n )\n )\n const approvalStages = (details.stages ?? []).filter((stage) =>\n approvalActionStages.has(stage.name) || approvalName(stage.name)\n )\n const waiting = approvalStages.some((stage) => {\n if (stage.status !== \"running\") return false\n const explicitActions = (details.actions ?? []).filter((action) =>\n action.stageName === stage.name &&\n (\n action.category?.toLocaleLowerCase(\"en-US\") === \"approval\" ||\n action.provider?.toLocaleLowerCase(\"en-US\") === \"manual\"\n )\n )\n return explicitActions.length === 0 || explicitActions.some(({ status }) => status === \"running\")\n })\n gates.push({\n entityId,\n pipelineName: details.pipelineName,\n state: approvalStages.length === 0 ? \"missing\" : waiting ? \"waiting\" : \"not-waiting\"\n })\n }\n return {\n affected: affectedPipelineIds.size,\n gates,\n missing: gates.filter(({ state }) => state === \"missing\").length,\n notWaiting: gates.filter(({ state }) => state === \"not-waiting\").length,\n ready: !inspection.truncated && unverifiablePipelines === 0 && gates.every(({ state }) => state === \"waiting\"),\n unverifiablePipelines,\n waiting: gates.filter(({ state }) => state === \"waiting\").length\n }\n}\n","import type {\n RlyService,\n RlyWorksetGap,\n RlyWorksetJiraItem,\n RlyWorksetPipeline,\n RlyWorksetPullRequestGroup\n} from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\n\nimport type { ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport { confluenceTaskSummary } from \"../../domain/confluenceTasks.js\"\nimport type {\n DeliveryEntityDetails,\n DeliveryEntityProjection,\n DeliveryRelationship,\n EvidenceClaim\n} from \"../../domain/deliveryGraph.js\"\nimport type {\n EntityId,\n EvidenceId,\n GraphNodeId,\n RelationshipId,\n ReleaseId,\n WorkspaceId\n} from \"../../domain/identifiers.js\"\nimport { releasePipelineApprovalReadiness } from \"../../domain/releasePipelineApproval.js\"\nimport { presentPipelineExecutionStages } from \"../entities/presentWorkspacePipelineExecution.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\ntype Projection = ReleaseDeliveryGraphInspection[\"entityProjections\"][number][\"projection\"]\ntype ProjectionWithDetails<Tag extends DeliveryEntityDetails[\"_tag\"]> = Projection & {\n readonly details: Extract<DeliveryEntityDetails, { readonly _tag: Tag }>\n}\n\nexport interface ReleaseWorksetRunbook {\n readonly completedTasks: number\n readonly href: string\n readonly id: EntityId\n readonly reference: string\n readonly state: string\n readonly title: string\n readonly totalTasks: number\n}\n\nexport interface SelectedReleaseWorksetObject {\n readonly facts: ReadonlyArray<{ readonly label: string; readonly value: string }>\n readonly id: EntityId\n readonly kind: DeliveryEntityProjection[\"entityType\"]\n readonly label: string\n readonly service: RlyService\n readonly status: string\n readonly title: string\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTraceConnection {\n readonly href: string | null\n readonly kind: string\n readonly label: string\n readonly service: RlyService | null\n readonly title: string\n}\n\nexport interface SelectedReleaseWorksetTraceRelationship {\n readonly confidence: string\n readonly detailsHref: string\n readonly direction: \"incoming\" | \"outgoing\"\n readonly evidenceCount: number\n readonly id: RelationshipId\n readonly kind: DeliveryRelationship[\"kind\"]\n readonly lifecycle: string\n readonly other: SelectedReleaseWorksetTraceConnection\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTrace {\n readonly relationships: ReadonlyArray<SelectedReleaseWorksetTraceRelationship>\n readonly truncated: boolean\n}\n\nexport interface ReleaseWorksetPresentation {\n readonly gaps: ReadonlyArray<RlyWorksetGap>\n readonly jiraItems: ReadonlyArray<RlyWorksetJiraItem>\n readonly pipelines: ReadonlyArray<RlyWorksetPipeline>\n readonly pullRequestGroups: ReadonlyArray<RlyWorksetPullRequestGroup>\n readonly runbooks: ReadonlyArray<ReleaseWorksetRunbook>\n readonly truncated: boolean\n}\n\nconst relationshipHref = (\n workspaceId: WorkspaceId,\n releaseId: ReleaseId,\n entityId: EntityId,\n relationshipId: RelationshipId\n): string =>\n `/w/${workspaceId}/releases/${releaseId}?object=${encodeURIComponent(entityId)}&relationship=${\n encodeURIComponent(relationshipId)\n }#release-work`\n\nconst statusTone = (status: string): RlyStateTone => {\n const normalized = status.toLocaleLowerCase(\"en-US\")\n if (\n [\"blocked\", \"changes requested\", \"failed\", \"rejected\", \"rolled back\", \"stopped\", \"superseded\"].some(\n (value) => normalized.includes(value)\n )\n ) {\n return \"critical\"\n }\n if (\n [\"approved\", \"closed\", \"current\", \"done\", \"merged\", \"not required\", \"passed\", \"ready\", \"resolved\", \"succeeded\"]\n .some((value) => normalized.includes(value))\n ) return \"positive\"\n if (\n [\"deploying\", \"in progress\", \"in review\", \"pending\", \"queued\", \"requested\", \"running\", \"verifying\"]\n .some((value) => normalized.includes(value))\n ) return \"progress\"\n return \"neutral\"\n}\n\nconst reviewStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pull-request\" }>[\"reviewState\"]\n): string => {\n switch (state) {\n case \"not-requested\":\n return \"Review not requested\"\n case \"requested\":\n return \"Review requested\"\n case \"changes-requested\":\n return \"Changes requested\"\n case \"approved\":\n return \"Approved\"\n case \"merged\":\n return \"Merged\"\n }\n}\n\nconst pullRequestStateLabel = (\n details: Extract<DeliveryEntityDetails, { readonly _tag: \"pull-request\" }>\n): string => {\n switch (details.reviewState) {\n case \"approved\":\n case \"changes-requested\":\n case \"merged\":\n return reviewStateLabel(details.reviewState)\n case \"not-requested\":\n case \"requested\":\n return details.lifecycle === \"merged\"\n ? \"Merged\"\n : details.lifecycle === \"closed\"\n ? \"Closed\"\n : reviewStateLabel(details.reviewState)\n }\n}\n\nconst pipelineStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pipeline-execution\" }>[\"status\"]\n): string => `${state.charAt(0).toLocaleUpperCase(\"en-US\")}${state.slice(1)}`\n\nconst titleCase = (value: string): string =>\n value.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nconst selectedObjectService = (kind: DeliveryEntityProjection[\"entityType\"]): RlyService => {\n switch (kind) {\n case \"issue\":\n return \"jira\"\n case \"pull-request\":\n return \"codecommit\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n }\n}\n\nconst selectedObjectStatus = (details: DeliveryEntityDetails): string => {\n switch (details._tag) {\n case \"issue\":\n return details.status\n case \"pull-request\":\n return pullRequestStateLabel(details)\n case \"page\":\n case \"deployment\":\n return titleCase(details.status)\n case \"pipeline-execution\":\n return pipelineStateLabel(details.status)\n case \"time-entry\":\n return titleCase(details.approvalState)\n }\n}\n\nconst selectedObjectFacts = (\n details: DeliveryEntityDetails\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n switch (details._tag) {\n case \"issue\":\n return [\n { label: \"Priority\", value: details.priority ?? \"Not set\" },\n { label: \"Estimate\", value: details.estimatePoints === null ? \"Not set\" : `${details.estimatePoints} points` }\n ]\n case \"pull-request\":\n return [\n { label: \"Repository\", value: details.repository },\n { label: \"Branch\", value: `${details.sourceBranch} → ${details.targetBranch}` },\n { label: \"Revision\", value: details.headRevision }\n ]\n case \"page\":\n return [\n { label: \"Space\", value: details.spaceKey },\n { label: \"Revision\", value: details.revision }\n ]\n case \"pipeline-execution\":\n return [\n { label: \"Pipeline\", value: details.pipelineName },\n { label: \"Execution\", value: details.executionId },\n { label: \"Revision\", value: details.triggerRevision }\n ]\n case \"deployment\":\n return [\n { label: \"Environment\", value: details.environmentId },\n { label: \"Revision\", value: details.revision }\n ]\n case \"time-entry\":\n return [\n { label: \"Duration\", value: `${details.durationMinutes} minutes` },\n { label: \"Billing\", value: details.billable ? \"Billable\" : \"Non-billable\" }\n ]\n }\n}\n\nconst presentSelectedObject = (selected: DeliveryEntityProjection): SelectedReleaseWorksetObject => {\n const status = selectedObjectStatus(selected.details)\n return {\n facts: selectedObjectFacts(selected.details),\n id: selected.entityId,\n kind: selected.entityType,\n label: selected.displayKey,\n service: selectedObjectService(selected.entityType),\n status,\n title: selected.title,\n tone: statusTone(status)\n }\n}\n\n/** Resolve every present normalized object into an inspectable selected-object surface. */\nexport const selectReleaseWorksetObject = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null\n): SelectedReleaseWorksetObject | null => {\n if (selectedObjectId === null) return null\n const selected = inspection.entityProjections.find(\n ({ projection }) => projection.entityState === \"present\" && projection.entityId === selectedObjectId\n )?.projection\n if (selected === undefined) return null\n return presentSelectedObject(selected)\n}\n\nconst currentRelationship = (relationship: DeliveryRelationship): boolean =>\n relationship.lifecycle._tag !== \"missing\" &&\n relationship.lifecycle._tag !== \"rejected\" &&\n relationship.lifecycle._tag !== \"superseded\"\n\nconst gapService = (relationship: DeliveryRelationship): RlyService => {\n const missingKind = relationship.sourceNodeKind === \"release\"\n ? relationship.targetNodeKind\n : relationship.sourceNodeKind\n switch (missingKind) {\n case \"issue\":\n return \"jira\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n case \"pull-request\":\n case \"release\":\n case \"environment\":\n return \"codecommit\"\n }\n return \"codecommit\"\n}\n\nconst entityProjectionByNode = (\n inspection: ReleaseDeliveryGraphInspection\n): ReadonlyMap<GraphNodeId, DeliveryEntityProjection> => {\n const projections = new Map(inspection.entityProjections.map(({ projection }) => [projection.entityId, projection]))\n return new Map(\n inspection.nodes.flatMap((node): ReadonlyArray<readonly [GraphNodeId, DeliveryEntityProjection]> => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = projections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [[node.nodeId, projection]]\n })\n )\n}\n\nconst relationshipLifecycleTone = (lifecycle: DeliveryRelationship[\"lifecycle\"][\"_tag\"]): RlyStateTone => {\n switch (lifecycle) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipConfidenceLabel = (confidence: DeliveryRelationship[\"confidence\"]): string => {\n switch (confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst traceConnection = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n nodeId: GraphNodeId,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): SelectedReleaseWorksetTraceConnection => {\n const projection = projections.get(nodeId)\n if (projection !== undefined) {\n const selected = presentSelectedObject(projection)\n return {\n href: projection.entityState === \"present\"\n ? workspaceEntityPath(workspaceId, projection.entityId)\n : null,\n kind: selected.kind,\n label: selected.label,\n service: selected.service,\n title: projection.entityState === \"present\" ? selected.title : `${selected.title} · Deleted`\n }\n }\n const node = inspection.nodes.find((candidate) => candidate.nodeId === nodeId)\n if (node?.resolution._tag === \"missing\") {\n return {\n href: null,\n kind: node.endpointKind,\n label: node.resolution.missingKey,\n service: null,\n title: `Missing ${titleCase(node.endpointKind)}`\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"release\") {\n const isCurrentRelease = node.resolution.target.releaseId === inspection.releaseId\n return {\n href: null,\n kind: \"release\",\n label: `Release ${node.resolution.target.releaseId.slice(-6)}`,\n service: null,\n title: isCurrentRelease ? \"Current release context\" : \"Connected release\"\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"environment\") {\n return {\n href: null,\n kind: \"environment\",\n label: `Environment ${node.resolution.target.environmentId.slice(-6)}`,\n service: null,\n title: \"Delivery environment\"\n }\n }\n return { href: null, kind: \"unknown\", label: nodeId.slice(-6), service: null, title: \"Unresolved graph node\" }\n}\n\n/** Center the bounded current release graph on one selected normalized object. */\nexport const selectReleaseWorksetTrace = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n selectedObjectId: string | null\n): SelectedReleaseWorksetTrace | null => {\n const selectedObject = selectReleaseWorksetObject(inspection, selectedObjectId)\n if (selectedObject === null || selectedObjectId === null) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n const projections = entityProjectionByNode(inspection)\n const relationships = inspection.relationships.flatMap(\n (relationship): ReadonlyArray<SelectedReleaseWorksetTraceRelationship> => {\n const direction = selectedNodeIds.has(relationship.sourceNodeId)\n ? \"outgoing\"\n : selectedNodeIds.has(relationship.targetNodeId)\n ? \"incoming\"\n : null\n if (direction === null) return []\n const otherNodeId = direction === \"outgoing\" ? relationship.targetNodeId : relationship.sourceNodeId\n return [{\n confidence: relationshipConfidenceLabel(relationship.confidence),\n detailsHref: relationshipHref(\n workspaceId,\n inspection.releaseId,\n selectedObject.id,\n relationship.relationshipId\n ),\n direction,\n evidenceCount: relationship.evidenceClaimIds.length,\n id: relationship.relationshipId,\n kind: relationship.kind,\n lifecycle: titleCase(relationship.lifecycle._tag),\n other: traceConnection(inspection, workspaceId, otherNodeId, projections),\n tone: relationshipLifecycleTone(relationship.lifecycle._tag)\n }]\n }\n ).sort((left, right) =>\n left.kind.localeCompare(right.kind) || left.other.label.localeCompare(right.other.label) ||\n left.id.localeCompare(right.id)\n )\n return { relationships, truncated: inspection.truncated }\n}\n\n/** Resolve a URL-selected relationship only when it touches the selected object in this bounded slice. */\nexport const selectReleaseWorksetRelationship = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null,\n selectedRelationshipId: string | null\n): DeliveryRelationship | null => {\n if (\n selectedRelationshipId === null ||\n selectedObjectId === null ||\n selectReleaseWorksetObject(inspection, selectedObjectId) === null\n ) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n let selected: DeliveryRelationship | null = null\n for (const relationship of inspection.relationships) {\n if (\n relationship.relationshipId === selectedRelationshipId &&\n (selectedNodeIds.has(relationship.sourceNodeId) || selectedNodeIds.has(relationship.targetNodeId)) &&\n (selected === null || relationship.revision > selected.revision)\n ) selected = relationship\n }\n return selected\n}\n\n/** Resolve exact referenced claims from the closure-checked release slice. */\nexport const releaseWorksetRelationshipEvidenceClaims = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceClaim> => {\n if (relationship === null) return []\n const claimById = new Map(inspection.evidenceClaims.map((claim) => [claim.evidenceClaimId, claim]))\n return relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = claimById.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n}\n\n/** Resolve the unique evidence observations referenced by one relationship from the closed release slice. */\nexport const releaseWorksetRelationshipEvidenceIds = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceId> => {\n const evidenceIds = new Set<EvidenceId>()\n for (const claim of releaseWorksetRelationshipEvidenceClaims(inspection, relationship)) {\n evidenceIds.add(claim.evidenceId)\n }\n return [...evidenceIds].sort((left, right) => left.localeCompare(right))\n}\n\nconst releaseRunbookEntityIds = (\n inspection: ReleaseDeliveryGraphInspection,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): ReadonlySet<EntityId> => {\n const nodes = new Map(inspection.nodes.map((node) => [node.nodeId, node]))\n return new Set(\n inspection.relationships.flatMap((relationship): ReadonlyArray<EntityId> => {\n if (\n relationship.kind !== \"documented-by\" ||\n relationship.sourceNodeKind !== \"release\" ||\n relationship.targetNodeKind !== \"page\" ||\n !currentRelationship(relationship)\n ) return []\n const source = nodes.get(relationship.sourceNodeId)\n const target = projections.get(relationship.targetNodeId)\n return source?.resolution._tag === \"resolved\" &&\n source.resolution.target._tag === \"release\" &&\n source.resolution.target.releaseId === inspection.releaseId &&\n target?.details._tag === \"page\"\n ? [target.entityId]\n : []\n })\n )\n}\n\nconst gapLabel = (\n relationship: DeliveryRelationship,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): string => {\n const issue = relationship.sourceNodeKind === \"issue\"\n ? projections.get(relationship.sourceNodeId)\n : relationship.targetNodeKind === \"issue\"\n ? projections.get(relationship.targetNodeId)\n : undefined\n if (issue?.details._tag === \"issue\" && relationship.sourceNodeKind === \"pull-request\") {\n return `${issue.details.key} has no CodeCommit pull request`\n }\n return `Missing ${relationship.sourceNodeKind} → ${relationship.targetNodeKind} relationship`\n}\n\n/** Present one bounded graph inspection as three explicit release-work dimensions. */\nexport const presentReleaseWorkset = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId\n): ReleaseWorksetPresentation => {\n const projections = entityProjectionByNode(inspection)\n const runbookEntityIds = releaseRunbookEntityIds(inspection, projections)\n const href = (projection: DeliveryEntityProjection): string => workspaceEntityPath(workspaceId, projection.entityId)\n const issues = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"issue\"> =>\n projection.entityType === \"issue\" && projection.details._tag === \"issue\" && projection.entityState === \"present\"\n )\n const pullRequests = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pull-request\"> =>\n projection.entityType === \"pull-request\" &&\n projection.details._tag === \"pull-request\" &&\n projection.entityState === \"present\"\n )\n const pipelineExecutions = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pipeline-execution\"> =>\n projection.entityType === \"pipeline-execution\" &&\n projection.details._tag === \"pipeline-execution\" &&\n projection.entityState === \"present\"\n )\n const pages = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"page\"> =>\n projection.entityType === \"page\" &&\n projection.details._tag === \"page\" &&\n projection.entityState === \"present\" &&\n runbookEntityIds.has(projection.entityId)\n )\n const confluenceTaskGaps = pages.flatMap((page): ReadonlyArray<RlyWorksetGap> => {\n if (page.details.contentState !== \"loaded\") {\n return [{\n id: `${page.entityId}:confluence-tasks-unavailable`,\n label: `${page.title} tasks are not synchronized`,\n reason: \"Release readiness cannot be verified until the Confluence page body is synchronized.\",\n service: \"confluence\"\n }]\n }\n return confluenceTaskSummary(page.details.content?.markdown ?? \"\").tasks.flatMap((task) =>\n task.checked\n ? []\n : [{\n id: `${page.entityId}:confluence-task:${String(task.lineNumber)}`,\n label: task.label,\n reason: `Confluence task on ${page.title} is not complete.`,\n service: \"confluence\"\n }]\n )\n })\n const pipelineReadiness = releasePipelineApprovalReadiness(inspection)\n const pipelineApprovalGaps = pipelineReadiness.gates.flatMap(\n (gate): ReadonlyArray<RlyWorksetGap> =>\n gate.state === \"waiting\"\n ? []\n : [{\n id: `${gate.entityId}:release-approval-gate`,\n label: gate.state === \"missing\"\n ? `${gate.pipelineName} has no release approval gate`\n : `${gate.pipelineName} is not waiting for Stage approval`,\n reason: gate.state === \"missing\"\n ? \"Every pipeline delivering this release must contain an observed manual approval stage.\"\n : \"The affected pipeline must wait at its manual approval stage before release publication.\",\n service: \"codepipeline\"\n }]\n )\n const unverifiablePipelineGaps: ReadonlyArray<RlyWorksetGap> = pipelineReadiness.unverifiablePipelines === 0\n ? []\n : [{\n id: \"release-pipelines-unverifiable\",\n label: \"Affected pipeline approval state is unavailable\",\n reason: \"Release readiness cannot be verified until every affected pipeline is synchronized.\",\n service: \"codepipeline\"\n }]\n\n return {\n jiraItems: issues.map((issue) => ({\n id: issue.entityId,\n key: issue.details.key,\n title: issue.title,\n state: issue.details.status,\n tone: statusTone(issue.details.status),\n href: href(issue)\n })),\n pullRequestGroups: pullRequests.map((pullRequest) => {\n const sourceNodes = new Set(\n Array.from(projections).flatMap(([nodeId, projection]): ReadonlyArray<GraphNodeId> =>\n projection.entityId === pullRequest.entityId ? [nodeId] : []\n )\n )\n const linkedJiraKeys = Array.from(\n new Set(inspection.relationships.flatMap((relationship): ReadonlyArray<string> => {\n if (\n relationship.kind !== \"implements\" ||\n !sourceNodes.has(relationship.sourceNodeId) ||\n !currentRelationship(relationship)\n ) return []\n const issue = projections.get(relationship.targetNodeId)\n return issue?.details._tag === \"issue\" ? [issue.details.key] : []\n }))\n )\n const state = pullRequestStateLabel(pullRequest.details)\n return {\n id: pullRequest.entityId,\n title: pullRequest.title,\n reference: pullRequest.displayKey,\n state,\n tone: statusTone(state),\n href: href(pullRequest),\n linkedJiraKeys\n }\n }),\n gaps: [\n ...inspection.relationships.flatMap((relationship): ReadonlyArray<RlyWorksetGap> =>\n relationship.lifecycle._tag === \"missing\"\n ? [{\n id: relationship.relationshipId,\n label: gapLabel(relationship, projections),\n reason: relationship.lifecycle.reason,\n service: gapService(relationship)\n }]\n : []\n ),\n ...confluenceTaskGaps,\n ...pipelineApprovalGaps,\n ...unverifiablePipelineGaps\n ],\n pipelines: pipelineExecutions.map((pipeline) => {\n const state = pipelineStateLabel(pipeline.details.status)\n return {\n id: pipeline.entityId,\n title: pipeline.title,\n reference: pipeline.displayKey,\n state,\n tone: statusTone(state),\n href: href(pipeline),\n stages: presentPipelineExecutionStages(pipeline.details.stages)\n }\n }),\n runbooks: pages.map((page) => {\n const tasks = confluenceTaskSummary(page.details.content?.markdown ?? \"\")\n return {\n completedTasks: tasks.completed,\n href: href(page),\n id: page.entityId,\n reference: page.displayKey,\n state: page.details.status,\n title: page.title,\n totalTasks: tasks.total\n }\n }),\n truncated: inspection.truncated\n }\n}\n",".body,\n.loading,\n.content,\n.summary,\n.section,\n.history,\n.evidence,\n.evidenceCard,\n.claims {\n display: grid;\n}\n\n.integrity {\n display: flex;\n align-items: flex-start;\n gap: var(--rly-space-8);\n}\n\n.integrity p {\n margin: 0;\n}\n\n.body,\n.content,\n.loading {\n gap: var(--rly-space-20);\n}\n\n.content,\n.summary,\n.section,\n.evidenceCard {\n gap: var(--rly-space-12);\n}\n\n.summary,\n.evidenceCard {\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.summaryHeading,\n.sectionHeading,\n.historyHeading,\n.evidenceHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-8);\n}\n\n.tags {\n justify-content: flex-end;\n}\n\n.summary h3,\n.section h3,\n.evidenceCard h4,\n.summary p,\n.history p,\n.facts dd {\n margin: 0;\n}\n\n.facts {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.facts div {\n min-width: 0;\n}\n\n.facts 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.facts dd {\n min-inline-size: 0;\n overflow-wrap: break-word;\n}\n\n.history,\n.claims {\n gap: var(--rly-space-8);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.history li,\n.claims li {\n display: grid;\n gap: var(--rly-space-4);\n padding: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.history li:first-child,\n.claims li:first-child {\n border-block-start: 0;\n}\n\n.claims li {\n grid-template-columns: minmax(8rem, auto) minmax(0, 1fr);\n}\n\n@media (max-width: 36rem) {\n .facts,\n .claims li {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { EvidenceId, RelationshipId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY = 4\n\nexport interface RelationshipDetails {\n readonly evidence: ReadonlyArray<EvidenceInspection>\n readonly history: RelationshipHistoryInspection\n}\n\nexport interface RelationshipDetailsTransport {\n readonly load: (\n relationshipId: RelationshipId,\n evidenceIds: ReadonlyArray<EvidenceId>,\n signal: AbortSignal\n ) => Promise<RelationshipDetails>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load one relationship ledger and only the immutable evidence it references. */\nexport const browserRelationshipDetailsTransport: RelationshipDetailsTransport = {\n load: (relationshipId, evidenceIds, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n const history = yield* client.deliveryGraph.relationshipHistory({ params: { relationshipId } })\n const evidence = yield* Effect.forEach(\n evidenceIds,\n (evidenceId) => client.deliveryGraph.evidence({ params: { evidenceId } }),\n { concurrency: MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY }\n )\n return { evidence, history }\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nexport type RelationshipDetailsState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly details: RelationshipDetails\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n\n/** Keep relationship details bound to the exact selection and authenticated browser session. */\nexport const useRelationshipDetails = (\n relationshipId: RelationshipId | null,\n evidenceIds: ReadonlyArray<EvidenceId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: RelationshipDetailsTransport = browserRelationshipDetailsTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<RelationshipDetailsState>({ _tag: \"idle\" })\n const evidenceKey = evidenceIds.join(\":\")\n const evidenceIdsRef = useRef(evidenceIds)\n\n useEffect(() => {\n evidenceIdsRef.current = evidenceIds\n }, [evidenceIds])\n\n useEffect(() => {\n if (relationshipId === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", evidenceKey, relationshipId, sessionKey })\n transport.load(relationshipId, evidenceIdsRef.current, abort.signal).then(\n (details) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", details, evidenceKey, relationshipId, sessionKey })\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", evidenceKey, relationshipId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [evidenceKey, onSessionExpired, relationshipId, requestRevision, sessionKey, transport])\n\n const currentState: RelationshipDetailsState = relationshipId === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.relationshipId !== relationshipId ||\n state.sessionKey !== sessionKey ||\n state.evidenceKey !== evidenceKey\n ? { _tag: \"loading\", evidenceKey, relationshipId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\n\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { DeliveryRelationship, EvidenceClaim, EvidenceItem } from \"../../domain/deliveryGraph.js\"\nimport type { EvidenceId } from \"../../domain/identifiers.js\"\nimport type { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport styles from \"./RelationshipDetailSheet.module.css\"\nimport { type RelationshipDetailsTransport, useRelationshipDetails } from \"./useRelationshipDetails.js\"\n\nconst titleCase = (value: string): string =>\n value\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const formatRelationshipTimestamp = (value: UtcTimestamp): string =>\n DateTime.formatUtc(value, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n year: \"numeric\"\n })\n\nexport const relationshipActorLabel = (actor: DeliveryRelationship[\"recordedBy\"]): string => {\n switch (actor._tag) {\n case \"human\":\n return `Human · ${actor.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${actor.agentId.slice(-6)}`\n case \"system\":\n return `System · ${actor.component}`\n }\n}\n\nexport const relationshipProvenanceLabel = (provenance: DeliveryRelationship[\"provenance\"]): string => {\n switch (provenance._tag) {\n case \"plugin\":\n return `Plugin source · ${provenance.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human decision · ${provenance.personId.slice(-6)}`\n case \"agent\":\n return `Agent proposal · ${provenance.agentId.slice(-6)}`\n case \"rule\":\n return `Rule · ${provenance.ruleId} v${String(provenance.ruleVersion)}`\n }\n}\n\nconst relationshipRationale = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed by immutable evidence.\"\n case \"inferred\":\n case \"unknown\":\n return relationship.confidence.rationale\n }\n}\n\nconst relationshipConfidenceLabel = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(relationship.confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst relationshipLifecycleTone = (relationship: DeliveryRelationship): RlyStateTone => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipScopeLabel = (relationship: DeliveryRelationship): string => {\n if (relationship.scope === null) return \"Workspace\"\n if (relationship.scope._tag === \"release\") return `Release · ${relationship.scope.releaseId.slice(-6)}`\n return `Environment · ${relationship.scope.environmentId.slice(-6)}`\n}\n\nconst evidenceFreshnessTone = (evidence: EvidenceItem): RlyStateTone => {\n switch (evidence.freshness._tag) {\n case \"current\":\n return \"positive\"\n case \"stale\":\n return \"caution\"\n case \"missing\":\n case \"unavailable\":\n return \"critical\"\n }\n}\n\nconst lifecycleReason = (relationship: DeliveryRelationship): string | null => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n case \"superseded\":\n return relationship.lifecycle.reason\n case \"governed\":\n case \"inferred\":\n case \"proposed\":\n case \"verified\":\n return null\n }\n}\n\nconst evidencePartyLabel = (party: EvidenceItem[\"attribution\"] | EvidenceItem[\"verifier\"]): string => {\n switch (party._tag) {\n case \"plugin\":\n return `Plugin · ${party.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human · ${party.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${party.agentId.slice(-6)}`\n case \"system\":\n return `System · ${party.component}`\n }\n}\n\nexport const evidenceClaimValueLabel = (claim: EvidenceClaim): string => {\n switch (claim.value._tag) {\n case \"flag\":\n return claim.value.value ? \"Yes\" : \"No\"\n case \"state\":\n case \"revision\":\n return claim.value.value\n case \"reference\":\n return `Node ${claim.value.targetNodeId.slice(-6)}`\n }\n}\n\nconst EvidenceCard = ({\n claims,\n inspection,\n relationship\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly inspection: EvidenceInspection\n readonly relationship: DeliveryRelationship\n}): ReactElement => {\n const relatedClaimIds = new Set(relationship.evidenceClaimIds)\n const relatedClaims = claims.filter(\n ({ evidenceClaimId, evidenceId }) =>\n evidenceId === inspection.evidence.evidenceId && relatedClaimIds.has(evidenceClaimId)\n )\n const evidence = inspection.evidence\n return (\n <article className={styles.evidenceCard}>\n <div className={styles.evidenceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Evidence {evidence.evidenceId.slice(-6)}\n </Text>\n <StateLabel label={titleCase(evidence.freshness._tag)} size=\"compact\" tone={evidenceFreshnessTone(evidence)} />\n </div>\n <dl className={styles.facts}>\n <div>\n <dt>Observed</dt>\n <dd>{formatRelationshipTimestamp(evidence.observedAt)}</dd>\n </div>\n <div>\n <dt>Source</dt>\n <dd>{evidencePartyLabel(evidence.attribution)}</dd>\n </div>\n <div>\n <dt>Verified by</dt>\n <dd>{evidencePartyLabel(evidence.verifier)}</dd>\n </div>\n <div>\n <dt>Retention</dt>\n <dd>\n {titleCase(evidence.retention.classification)}\n {evidence.retention.legalHold ? \" · Legal hold\" : \"\"}\n </dd>\n </div>\n <div>\n <dt>Valid until</dt>\n <dd>\n {evidence.validUntil === null ? \"No expiry recorded\" : formatRelationshipTimestamp(evidence.validUntil)}\n </dd>\n </div>\n </dl>\n {relatedClaims.length === 0 ? (\n <Text tone=\"secondary\" variant=\"meta\">\n No referenced claim was returned for this observation.\n </Text>\n ) : (\n <ul className={styles.claims}>\n {relatedClaims.map((claim) => (\n <li key={claim.evidenceClaimId}>\n <Text as=\"span\" variant=\"label\">\n {titleCase(claim.predicate)}\n </Text>\n <Text as=\"span\" tone=\"secondary\">\n {evidenceClaimValueLabel(claim)}\n </Text>\n </li>\n ))}\n </ul>\n )}\n </article>\n )\n}\n\n/** Report the bounded history prefix without presenting it as a complete ledger. */\nexport const relationshipHistoryCountLabel = (revisions: RelationshipHistoryInspection[\"revisions\"]): string => {\n let newestRevision = 0\n for (const revision of revisions) newestRevision = Math.max(newestRevision, revision.revision)\n if (newestRevision > revisions.length) return `${String(revisions.length)} of ${String(newestRevision)} revisions`\n return `${String(revisions.length)} revision${revisions.length === 1 ? \"\" : \"s\"}`\n}\n\n/** URL-owned detail panel for immutable relationship history and evidence. */\nexport const RelationshipDetailSheet = ({\n claims,\n evidenceIds,\n onClose,\n onSessionExpired,\n relationship,\n sessionKey,\n transport\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly evidenceIds: ReadonlyArray<EvidenceId>\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly relationship: DeliveryRelationship | null\n readonly sessionKey: string | null\n readonly transport?: RelationshipDetailsTransport\n}): ReactElement => {\n const controller = useRelationshipDetails(\n relationship?.relationshipId ?? null,\n evidenceIds,\n sessionKey,\n onSessionExpired,\n transport\n )\n const title = relationship === null ? \"Relationship details\" : `${titleCase(relationship.kind)} relationship`\n const evidenceIntegrityComplete = relationship === null || claims.length === relationship.evidenceClaimIds.length\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={relationship !== null}\n >\n <Sheet.Content\n closeLabel={`Close ${title}`}\n description=\"Immutable delivery history and the evidence used to establish this connection.\"\n title={title}\n >\n <Sheet.Body className={styles.body}>\n {relationship === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading relationship details\" className={styles.loading}>\n <Skeleton height=\"7rem\" />\n <Skeleton height=\"12rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The selected relationship remains unchanged. Its history could not be loaded.\"\n title=\"Relationship details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"relationship-summary-title\" className={styles.summary}>\n <div className={styles.summaryHeading}>\n <Text as=\"h3\" id=\"relationship-summary-title\" variant=\"section-title\">\n {relationship.sourceNodeKind} → {relationship.targetNodeKind}\n </Text>\n <div className={styles.tags}>\n <StateLabel\n label={titleCase(relationship.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(relationship)}\n />\n <StateLabel label={relationshipConfidenceLabel(relationship)} size=\"compact\" tone=\"neutral\" />\n </div>\n </div>\n <Text tone=\"secondary\">{relationshipRationale(relationship)}</Text>\n <dl className={styles.facts}>\n <div>\n <dt>Revision</dt>\n <dd>{String(relationship.revision)}</dd>\n </div>\n <div>\n <dt>Recorded by</dt>\n <dd>{relationshipActorLabel(relationship.recordedBy)}</dd>\n </div>\n <div>\n <dt>Origin</dt>\n <dd>{relationshipProvenanceLabel(relationship.provenance)}</dd>\n </div>\n <div>\n <dt>Scope</dt>\n <dd>{relationshipScopeLabel(relationship)}</dd>\n </div>\n <div>\n <dt>Recorded</dt>\n <dd>{formatRelationshipTimestamp(relationship.recordedAt)}</dd>\n </div>\n </dl>\n </section>\n\n <section aria-labelledby=\"relationship-history-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-history-title\" variant=\"label\">\n History\n </Text>\n <StateLabel\n label={relationshipHistoryCountLabel(controller.state.details.history.revisions)}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {controller.state.details.history.revisions.length === 0 ? (\n <Text tone=\"secondary\">No immutable ledger revisions were returned.</Text>\n ) : (\n <ol className={styles.history}>\n {controller.state.details.history.revisions.map((revision) => {\n const reason = lifecycleReason(revision)\n return (\n <li key={`${revision.relationshipId}:${String(revision.revision)}`}>\n <div className={styles.historyHeading}>\n <Text as=\"span\" variant=\"label\">\n Revision {String(revision.revision)}\n </Text>\n <StateLabel\n label={titleCase(revision.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(revision)}\n />\n </div>\n <Text tone=\"secondary\" variant=\"meta\">\n {relationshipActorLabel(revision.recordedBy)} ·{\" \"}\n {formatRelationshipTimestamp(revision.recordedAt)}\n </Text>\n {reason === null ? null : <Text tone=\"secondary\">{reason}</Text>}\n </li>\n )\n })}\n </ol>\n )}\n </section>\n\n <section aria-labelledby=\"relationship-evidence-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-evidence-title\" variant=\"label\">\n Evidence\n </Text>\n <StateLabel\n label={`${String(controller.state.details.evidence.length)} observation${controller.state.details.evidence.length === 1 ? \"\" : \"s\"}`}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {evidenceIntegrityComplete ? null : (\n <div className={styles.integrity}>\n <StateLabel label=\"Evidence incomplete\" size=\"compact\" tone=\"critical\" />\n <Text tone=\"secondary\">\n One or more referenced claims are missing from the release slice. Refresh before relying on this\n relationship.\n </Text>\n </div>\n )}\n {controller.state.details.evidence.length === 0 ? (\n <Text tone=\"secondary\">No immutable evidence is attached to this relationship revision.</Text>\n ) : (\n <div className={styles.evidence}>\n {controller.state.details.evidence.map((inspection) => (\n <EvidenceCard\n claims={claims}\n inspection={inspection}\n key={inspection.evidence.evidenceId}\n relationship={relationship}\n />\n ))}\n </div>\n )}\n </section>\n </div>\n )}\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n","import * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport type { NavigateFunction } from \"react-router\"\n\nimport {\n EntityId,\n type EntityId as EntityIdType,\n RelationshipId,\n type RelationshipId as RelationshipIdType\n} from \"../../domain/identifiers.js\"\n\nconst RelationshipDetailMarker = Schema.Struct({\n _tag: Schema.Literal(\"relationship-detail-origin/v1\"),\n objectId: EntityId,\n relationshipId: RelationshipId\n})\n\nconst RelationshipDetailRouteState = Schema.Struct({\n relationshipDetailOrigin: RelationshipDetailMarker\n})\n\n/** Preserve existing release-origin state while marking an in-app relationship-detail activation. */\nexport const makeRelationshipDetailRouteState = <UnparsedInput>(\n state: UnparsedInput,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n) => ({\n ...((Predicate.isObject(state)) && state),\n relationshipDetailOrigin: {\n _tag: \"relationship-detail-origin/v1\",\n objectId,\n relationshipId\n }\n})\n\n/** Accept Back navigation only for the exact versioned object/relationship activation. */\nexport const matchesRelationshipDetailRouteState = <UnparsedInput>(\n state: UnparsedInput,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): boolean => {\n const decoded = Schema.decodeUnknownOption(RelationshipDetailRouteState)(state)\n return Option.isSome(decoded) &&\n decoded.value.relationshipDetailOrigin.objectId === objectId &&\n decoded.value.relationshipDetailOrigin.relationshipId === relationshipId\n}\n\n/** Close an in-app detail with Back; canonicalize direct detail URLs in place. */\nexport const closeRelationshipDetailRoute = (\n navigate: NavigateFunction,\n location: Readonly<{ hash: string; pathname: string; search: string; state: unknown }>,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): void => {\n if (matchesRelationshipDetailRouteState(location.state, objectId, relationshipId)) {\n navigate(-1)\n return\n }\n const next = new URLSearchParams(location.search)\n next.delete(\"relationship\")\n navigate(\n { hash: location.hash, pathname: location.pathname, search: next.size === 0 ? \"\" : `?${next.toString()}` },\n { replace: true, state: location.state }\n )\n}\n",".root,\n.loading,\n.context,\n.contextGroup,\n.selected,\n.selectedFacts,\n.trace,\n.traceList,\n.runbooks,\n.runbook {\n display: grid;\n}\n\n.root,\n.loading {\n gap: var(--rly-space-16);\n}\n\n.context {\n grid-template-columns: repeat(2, minmax(0, 1fr)) auto;\n align-items: start;\n gap: var(--rly-space-24);\n padding: var(--rly-space-16) var(--rly-space-20);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.contextGroup,\n.runbook {\n gap: var(--rly-space-4);\n}\n\n.contextHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.contextGroup h3 {\n margin: 0;\n}\n\n.selected {\n grid-column: 1 / -1;\n gap: var(--rly-space-12);\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-1);\n}\n\n.selected h3,\n.selected p,\n.selectedFacts dd {\n margin: 0;\n}\n\n.selectedHeading {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.selectedFacts {\n grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.selectedFacts div {\n min-width: 0;\n}\n\n.selectedFacts 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.selectedFacts dd {\n min-inline-size: 0;\n overflow-wrap: break-word;\n}\n\n.trace {\n gap: var(--rly-space-8);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.traceHeading,\n.traceRelation {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.traceHeading {\n justify-content: space-between;\n}\n\n.traceHeading h4,\n.traceConnection p {\n margin: 0;\n}\n\n.traceList {\n gap: var(--rly-space-4);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.traceList li {\n display: grid;\n grid-template-columns: auto minmax(10rem, 1fr) auto auto auto;\n align-items: center;\n gap: var(--rly-space-12);\n min-width: 0;\n padding: var(--rly-space-8) var(--rly-space-12);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-2);\n}\n\n.traceConnection {\n min-width: 0;\n}\n\n.traceConnection a {\n color: var(--rly-color-text-1);\n min-inline-size: 0;\n overflow-wrap: break-word;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails {\n color: var(--rly-color-text-1);\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-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\n}\n\n.traceConnection a:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\n}\n\n.runbooks {\n gap: var(--rly-space-8);\n}\n\n.runbook {\n color: inherit;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.runbook span {\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.runbook:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\n}\n\n@media (max-width: 48rem) {\n .context {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .traceList li {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .traceRelation,\n .traceList li > span,\n .traceDetails {\n grid-column: 2;\n }\n}\n","import type { EnvironmentId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY = 4\n\n/** Load release scope followed by every target environment without saturating browser connection pools. */\nexport const loadReleaseEnvironmentSlices = async <Value>(\n environmentIds: ReadonlyArray<EnvironmentId>,\n load: (environmentId: EnvironmentId | null) => Promise<Value>\n): Promise<ReadonlyArray<Value>> => {\n const scopes: ReadonlyArray<EnvironmentId | null> = [null, ...environmentIds]\n const completed: Array<{ readonly index: number; readonly value: Value }> = []\n let nextIndex = 0\n let isStopped = false\n const loadNext = async (): Promise<void> => {\n while (!isStopped && nextIndex < scopes.length) {\n const index = nextIndex\n nextIndex += 1\n const environmentId = scopes[index]\n if (environmentId === undefined) return\n try {\n completed.push({ index, value: await load(environmentId) })\n } catch (failure) {\n isStopped = true\n throw failure\n }\n }\n }\n const workerCount = Math.min(MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY, scopes.length)\n await Promise.all(Array.from({ length: workerCount }, () => loadNext()))\n return completed.sort((left, right) => left.index - right.index).map(({ value }) => value)\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport { MAXIMUM_RELEASE_SLICE_RECORDS, type ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport type { EnvironmentId, ReleaseId } from \"../../domain/identifiers.js\"\nimport {\n loadReleaseEnvironmentSlices,\n MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n} from \"./loadReleaseEnvironmentSlices.js\"\n\nexport const MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS = MAXIMUM_RELEASE_SLICE_RECORDS\n\n/** Combine release and environment slices while retaining complete relationship closure. */\nexport const aggregateReleaseWorksetInspections = (\n releaseId: ReleaseId,\n inspections: ReadonlyArray<ReleaseDeliveryGraphInspection>\n): ReleaseDeliveryGraphInspection => {\n type Inspection = ReleaseDeliveryGraphInspection\n const availableNodes = new Map<string, Inspection[\"nodes\"][number]>()\n const availableProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const availableClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const availableEvidence = new Map<string, Inspection[\"evidenceItems\"][number]>()\n for (const inspection of inspections) {\n for (const node of inspection.nodes) availableNodes.set(node.nodeId, node)\n for (const entry of inspection.entityProjections) {\n availableProjections.set(entry.projection.entityId, entry)\n }\n for (const claim of inspection.evidenceClaims) availableClaims.set(claim.evidenceClaimId, claim)\n for (const item of inspection.evidenceItems) availableEvidence.set(item.evidenceId, item)\n }\n const nodes = new Map<string, Inspection[\"nodes\"][number]>()\n const entityProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const relationships = new Map<string, Inspection[\"relationships\"][number]>()\n const evidenceClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const evidenceItems = new Map<string, Inspection[\"evidenceItems\"][number]>()\n let truncated = inspections.some((inspection) => inspection.truncated)\n\n for (const relationship of inspections.flatMap(({ relationships }) => relationships)) {\n const relationshipKey = `${relationship.relationshipId}:${String(relationship.revision)}`\n if (relationships.has(relationshipKey)) continue\n const requiredNodes = [\n availableNodes.get(relationship.sourceNodeId),\n availableNodes.get(relationship.targetNodeId)\n ]\n if (requiredNodes.some((node) => node === undefined)) {\n truncated = true\n continue\n }\n const presentNodes = requiredNodes.filter((node) => node !== undefined)\n const entityNodes = presentNodes.filter(\n (node) => node.resolution._tag === \"resolved\" && node.resolution.target._tag === \"entity\"\n )\n const requiredProjections = entityNodes.flatMap((node) => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = availableProjections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [projection]\n })\n const requiredClaims = relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = availableClaims.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n const evidenceIds = new Set(requiredClaims.map(({ evidenceId }) => evidenceId))\n const requiredEvidence = [...evidenceIds].flatMap((evidenceId) => {\n const evidence = availableEvidence.get(evidenceId)\n return evidence === undefined ? [] : [evidence]\n })\n const closureMissing = requiredProjections.length !== entityNodes.length ||\n requiredClaims.length !== relationship.evidenceClaimIds.length ||\n requiredEvidence.length !== evidenceIds.size\n const newNodeCount = presentNodes.filter(({ nodeId }) => !nodes.has(nodeId)).length\n const newProjectionCount = requiredProjections.filter(({ projection }) =>\n !entityProjections.has(projection.entityId)\n ).length\n const newClaimCount = requiredClaims.filter(({ evidenceClaimId }) => !evidenceClaims.has(evidenceClaimId)).length\n const newEvidenceCount = requiredEvidence.filter(({ evidenceId }) => !evidenceItems.has(evidenceId)).length\n const closureExceedsBound = relationships.size === MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n nodes.size + newNodeCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n entityProjections.size + newProjectionCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceClaims.size + newClaimCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceItems.size + newEvidenceCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS\n if (closureMissing || closureExceedsBound) {\n truncated = true\n continue\n }\n relationships.set(relationshipKey, relationship)\n for (const node of presentNodes) nodes.set(node.nodeId, node)\n for (const entry of requiredProjections) entityProjections.set(entry.projection.entityId, entry)\n for (const claim of requiredClaims) evidenceClaims.set(claim.evidenceClaimId, claim)\n for (const item of requiredEvidence) evidenceItems.set(item.evidenceId, item)\n }\n return {\n releaseId,\n environmentId: null,\n truncated,\n nodes: [...nodes.values()],\n entityProjections: [...entityProjections.values()],\n relationships: [...relationships.values()],\n evidenceClaims: [...evidenceClaims.values()],\n evidenceItems: [...evidenceItems.values()]\n }\n}\n\nexport interface ReleaseWorksetTransport {\n readonly load: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<ReleaseDeliveryGraphInspection>\n}\n\nexport const MAXIMUM_RELEASE_WORKSET_REQUEST_CONCURRENCY = MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load every release/environment slice without saturating browser or server connection pools. */\nexport const loadReleaseWorksetInspections = async (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n signal: AbortSignal,\n transport: ReleaseWorksetTransport\n): Promise<ReadonlyArray<ReleaseDeliveryGraphInspection>> => {\n return loadReleaseEnvironmentSlices(\n environmentIds,\n (environmentId) => transport.load(releaseId, environmentId, signal)\n )\n}\n\nexport type ReleaseWorksetState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly inspection: ReleaseDeliveryGraphInspection\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n\n/** Generated-client transport for one authenticated bounded release graph. */\nexport const browserReleaseWorksetTransport: ReleaseWorksetTransport = {\n load: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.releaseSlice({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep one release workset scoped to the exact authenticated browser session. */\nexport const useReleaseWorkset = (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: ReleaseWorksetTransport = browserReleaseWorksetTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<ReleaseWorksetState>({ _tag: \"idle\" })\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", environmentScopeKey, releaseId, sessionKey })\n loadReleaseWorksetInspections(releaseId, environmentIds, abort.signal, transport).then(\n (inspections) => {\n if (!abort.signal.aborted) {\n setState({\n _tag: \"ready\",\n environmentScopeKey,\n inspection: aggregateReleaseWorksetInspections(releaseId, inspections),\n releaseId,\n sessionKey\n })\n }\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", environmentScopeKey, releaseId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [environmentScopeKey, onSessionExpired, releaseId, requestRevision, sessionKey, transport])\n\n const currentState: ReleaseWorksetState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.releaseId !== releaseId ||\n state.sessionKey !== sessionKey ||\n state.environmentScopeKey !== environmentScopeKey\n ? { _tag: \"loading\", environmentScopeKey, releaseId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { ServiceMark, WorksetCard } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement } from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport type { WorkspaceId } from \"../../domain/identifiers.js\"\nimport { WorkspaceEntityLink, workspaceEntityStateForHref } from \"../entities/WorkspaceEntityLink.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport {\n presentReleaseWorkset,\n releaseWorksetRelationshipEvidenceClaims,\n releaseWorksetRelationshipEvidenceIds,\n selectReleaseWorksetObject,\n selectReleaseWorksetRelationship,\n selectReleaseWorksetTrace,\n type SelectedReleaseWorksetObject,\n type SelectedReleaseWorksetTrace\n} from \"./presentReleaseWorkset.js\"\nimport { RelationshipDetailSheet } from \"./RelationshipDetailSheet.js\"\nimport { closeRelationshipDetailRoute, makeRelationshipDetailRouteState } from \"./relationshipDetailRoute.js\"\nimport styles from \"./ReleaseWorkset.module.css\"\nimport { useReleaseWorkset } from \"./useReleaseWorkset.js\"\n\nconst LoadingWorkset = (): ReactElement => (\n <div aria-busy=\"true\" aria-label=\"Loading release work\" className={styles.loading}>\n <Skeleton height=\"3rem\" />\n <Skeleton height=\"15rem\" />\n </div>\n)\n\n/** Inspectable destination for an Items result selected within its release context. */\nexport const SelectedReleaseWorksetObjectPanel = ({\n linkLocation,\n selectedObject,\n trace\n}: {\n readonly linkLocation?: RouterLocationParts\n readonly selectedObject: SelectedReleaseWorksetObject\n readonly trace?: SelectedReleaseWorksetTrace\n}): ReactElement => {\n return (\n <section aria-label={`Selected ${selectedObject.kind} ${selectedObject.label}`} className={styles.selected}>\n <div className={styles.selectedHeading}>\n <ServiceMark service={selectedObject.service} size=\"compact\" />\n <Text as=\"p\" variant=\"label\">\n Selected object · {selectedObject.label}\n </Text>\n <StateLabel label={selectedObject.status} size=\"compact\" tone={selectedObject.tone} />\n </div>\n <Text as=\"h3\" variant=\"section-title\">\n {selectedObject.title}\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n {selectedObject.kind}\n </Text>\n <dl className={styles.selectedFacts}>\n {selectedObject.facts.map((fact) => (\n <div key={fact.label}>\n <dt>{fact.label}</dt>\n <dd>{fact.value}</dd>\n </div>\n ))}\n </dl>\n {trace === undefined ? null : (\n <div className={styles.trace}>\n <div className={styles.traceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Delivery trace\n </Text>\n <StateLabel\n label={`${trace.relationships.length} relationship${trace.relationships.length === 1 ? \"\" : \"s\"}${trace.truncated ? \"+\" : \"\"}`}\n size=\"compact\"\n tone={trace.truncated ? \"caution\" : \"neutral\"}\n />\n </div>\n {trace.relationships.length === 0 ? (\n <Text tone=\"secondary\">No relationship touches this object in the current release slice.</Text>\n ) : (\n <ul className={styles.traceList}>\n {trace.relationships.map((relationship) => (\n <li key={relationship.id}>\n {relationship.other.service === null ? null : (\n <ServiceMark service={relationship.other.service} size=\"compact\" />\n )}\n <div className={styles.traceConnection}>\n <Text as=\"p\" variant=\"label\">\n {relationship.direction === \"incoming\" ? \"From\" : \"To\"} {relationship.other.label}\n </Text>\n {relationship.other.href === null ? (\n <Text tone=\"secondary\">{relationship.other.title}</Text>\n ) : (\n <Link\n onClick={(event) => {\n const href = relationship.other.href\n if (\n linkLocation !== undefined &&\n href !== null &&\n workspaceEntityStateForHref(href, linkLocation) !== undefined &&\n shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)\n ) {\n rememberWorkspaceScrollPosition(linkLocation, href)\n }\n }}\n state={\n linkLocation === undefined\n ? undefined\n : workspaceEntityStateForHref(relationship.other.href, linkLocation)\n }\n to={relationship.other.href}\n >\n {relationship.other.title}\n </Link>\n )}\n </div>\n <div className={styles.traceRelation}>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.kind}\n </Text>\n <StateLabel label={relationship.lifecycle} size=\"compact\" tone={relationship.tone} />\n </div>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.confidence} · {relationship.evidenceCount} evidence claim\n {relationship.evidenceCount === 1 ? \"\" : \"s\"}\n </Text>\n <Link\n aria-label={`Details for ${relationship.kind} ${relationship.direction} relationship with ${relationship.other.label}`}\n className={styles.traceDetails}\n state={makeRelationshipDetailRouteState(linkLocation?.state, selectedObject.id, relationship.id)}\n to={relationship.detailsHref}\n >\n Details\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </section>\n )\n}\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Compatibility name retained for release-workset callers of the shared readable-session policy. */\nexport const releaseWorksetSessionKey = browserReadableSessionKey\n\n/** Render one server-backed release graph without substituting demo relationships. */\nexport const ReleaseWorkset = ({\n release,\n workspaceId\n}: {\n readonly release: PortfolioReleasePresentation\n readonly workspaceId: WorkspaceId\n}): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const controller = useReleaseWorkset(\n release.id,\n release.targetEnvironmentIds,\n sessionKey,\n browserSession.invalidateSession\n )\n if (sessionKey === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return <LoadingWorkset />\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the delivery graph for this release. Saved release facts remain unchanged.\"\n title=\"Release work unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const workset = presentReleaseWorkset(controller.state.inspection, workspaceId)\n const searchParams = new URLSearchParams(location.search)\n const selectedObjectId = searchParams.get(\"object\")\n const selectedRelationshipId = searchParams.get(\"relationship\")\n const selectedObject = selectReleaseWorksetObject(controller.state.inspection, selectedObjectId)\n const selectedTrace = selectReleaseWorksetTrace(controller.state.inspection, workspaceId, selectedObjectId)\n const selectedRelationship = selectReleaseWorksetRelationship(\n controller.state.inspection,\n selectedObjectId,\n selectedRelationshipId\n )\n const selectedEvidenceIds = releaseWorksetRelationshipEvidenceIds(controller.state.inspection, selectedRelationship)\n const selectedEvidenceClaims = releaseWorksetRelationshipEvidenceClaims(\n controller.state.inspection,\n selectedRelationship\n )\n const closeRelationshipDetails = (): void => {\n if (selectedObject === null || selectedRelationship === null) return\n closeRelationshipDetailRoute(navigate, location, selectedObject.id, selectedRelationship.relationshipId)\n }\n return (\n <>\n <div className={styles.root}>\n <div className={styles.context}>\n <div className={styles.contextGroup}>\n <Text as=\"h3\" variant=\"label\">\n Environment\n </Text>\n {release.targetEnvironmentIds.length === 0 ? (\n <Text tone=\"secondary\">No target environment recorded.</Text>\n ) : (\n <div className={styles.tags}>\n {release.targetEnvironmentIds.map((environmentId) => (\n <StateLabel\n key={environmentId}\n label={`Unknown target · ${environmentId.slice(-4)}`}\n size=\"compact\"\n title={`Environment ${environmentId}; provider metadata unavailable`}\n tone=\"neutral\"\n />\n ))}\n </div>\n )}\n </div>\n <div className={styles.contextGroup}>\n <div className={styles.contextHeading}>\n <ServiceMark service=\"confluence\" size=\"compact\" />\n <Text as=\"h3\" variant=\"label\">\n Runbook\n </Text>\n </div>\n {workset.runbooks.length === 0 ? (\n <Text tone=\"secondary\">No runbook linked.</Text>\n ) : (\n <div className={styles.runbooks}>\n {workset.runbooks.map((runbook) => (\n <Link\n className={styles.runbook}\n key={runbook.id}\n onClick={(event) => {\n if (\n workspaceEntityStateForHref(runbook.href, location) !== undefined &&\n shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)\n ) {\n rememberWorkspaceScrollPosition(location, runbook.href)\n }\n }}\n state={workspaceEntityStateForHref(runbook.href, location)}\n to={runbook.href}\n >\n <strong>{runbook.title}</strong>\n <span>\n {runbook.reference}\n {runbook.totalTasks === 0\n ? \"\"\n : ` · ${String(runbook.completedTasks)}/${String(runbook.totalTasks)} tasks`}\n </span>\n </Link>\n ))}\n </div>\n )}\n </div>\n {workset.truncated ? (\n <StateLabel label=\"Bounded view · more records exist\" size=\"compact\" tone=\"caution\" />\n ) : null}\n {selectedObject === null || selectedTrace === null ? null : (\n <SelectedReleaseWorksetObjectPanel\n linkLocation={location}\n selectedObject={selectedObject}\n trace={selectedTrace}\n />\n )}\n </div>\n <LinkProvider component={WorkspaceEntityLink}>\n <WorksetCard\n gaps={workset.gaps}\n heading={`${release.serviceName} release work`}\n jiraItems={workset.jiraItems}\n pipelines={workset.pipelines}\n pullRequestGroups={workset.pullRequestGroups}\n />\n </LinkProvider>\n </div>\n <RelationshipDetailSheet\n claims={selectedEvidenceClaims}\n evidenceIds={selectedEvidenceIds}\n onClose={closeRelationshipDetails}\n onSessionExpired={browserSession.invalidateSession}\n relationship={selectedRelationship}\n sessionKey={sessionKey}\n />\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReleaseWorkset-CpploDSa.js","names":["currentRelationship","titleCase","relationshipLifecycleTone","relationshipConfidenceLabel","traceConnection","loading","tags","isUnauthorizedFailure","Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.forEach","Effect.provide","FetchHttpClient.layer","useState","useRef","useCallback","DateTime.formatUtc","styles","Text","StateLabel","Sheet","Skeleton","StatePanel","Button","Schema.Struct","Schema.Literal","Predicate.isObject","Schema.decodeUnknownOption","Option.isSome","Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.provide","FetchHttpClient.layer","useState","useCallback","styles","Skeleton","ServiceMark","Text","StateLabel","StatePanel","Button","_Fragment","LinkProvider","WorksetCard","__toESM","useLocation","useNavigate","Le","V","fe","He","ve","require_jsx_runtime","useBrowserSession","Link","a","browserReadableSessionKey","Mr","z","Re","provide","runPromise","Literal","isObject","decodeUnknownOption","EntityId","Struct","gen","isSome","forEach","isTagged","formatUtc","RelationshipId","layer","makeControlCenterApiClient","workspaceEntityPath","shouldRememberWorkspaceScrollPosition","rememberWorkspaceScrollPosition","presentPipelineExecutionStages","confluenceTaskSummary","workspaceEntityStateForHref","WorkspaceEntityLink","import_react","require_react","currentRelationship$1","lifecycle","approvalName","value","releasePipelineApprovalReadiness","nodeById","inspection","node","projectionByEntityId","projection","affectedPipelineIds","relationship","source","target","unverifiablePipelines","gates","entityId","details","approvalActionStages","action","approvalStages","stage","waiting","explicitActions","status","state","relationshipHref","workspaceId","releaseId","relationshipId","statusTone","normalized","reviewStateLabel","pullRequestStateLabel","pipelineStateLabel","titleCase$1","part","selectedObjectService","kind","selectedObjectStatus","selectedObjectFacts","presentSelectedObject","selected","selectReleaseWorksetObject","selectedObjectId","currentRelationship","gapService","entityProjectionByNode","projections","relationshipLifecycleTone$1","relationshipConfidenceLabel$1","confidence","traceConnection$1","nodeId","candidate","isCurrentRelease","selectReleaseWorksetTrace","selectedObject","selectedNodeIds","direction","otherNodeId","left","right","selectReleaseWorksetRelationship","selectedRelationshipId","releaseWorksetRelationshipEvidenceClaims","claimById","claim","claimId","releaseWorksetRelationshipEvidenceIds","evidenceIds","releaseRunbookEntityIds","nodes","gapLabel","issue","presentReleaseWorkset","runbookEntityIds","href","issues","pullRequests","pipelineExecutions","pages","confluenceTaskGaps","page","task","pipelineReadiness","pipelineApprovalGaps","gate","unverifiablePipelineGaps","sourceNodes","pullRequest","linkedJiraKeys","pipeline","tasks","RelationshipDetailSheet_module_default","isUnauthorizedFailure$1","browserRelationshipDetailsTransport","client","history","useRelationshipDetails","requestRevision","setRequestRevision","setState","evidenceKey","evidenceIdsRef","sessionKey","abort","transport","failure","onSessionExpired","currentState","revision","import_jsx_runtime","titleCase","formatRelationshipTimestamp","relationshipActorLabel","actor","relationshipProvenanceLabel","provenance","relationshipRationale","relationshipConfidenceLabel","relationshipLifecycleTone","relationshipScopeLabel","evidenceFreshnessTone","evidence","lifecycleReason","evidencePartyLabel","party","evidenceClaimValueLabel","EvidenceCard","relatedClaimIds","relatedClaims","claims","evidenceId","evidenceClaimId","relationshipHistoryCountLabel","newestRevision","revisions","RelationshipDetailSheet","controller","title","evidenceIntegrityComplete","open","onClose","reason","RelationshipDetailMarker","RelationshipDetailRouteState","makeRelationshipDetailRouteState","matchesRelationshipDetailRouteState","decoded","objectId","closeRelationshipDetailRoute","location","navigate","next","ReleaseWorkset_module_default","loadReleaseEnvironmentSlices","scopes","environmentIds","completed","nextIndex","isStopped","loadNext","index","environmentId","load","workerCount","MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS","aggregateReleaseWorksetInspections","availableNodes","availableProjections","availableClaims","availableEvidence","inspections","entry","item","entityProjections","relationships","evidenceClaims","evidenceItems","truncated","relationshipKey","requiredNodes","presentNodes","entityNodes","requiredProjections","requiredClaims","requiredEvidence","closureMissing","newNodeCount","newProjectionCount","newClaimCount","newEvidenceCount","closureExceedsBound","isUnauthorizedFailure","loadReleaseWorksetInspections","signal","browserReleaseWorksetTransport","useReleaseWorkset","environmentScopeKey","LoadingWorkset","SelectedReleaseWorksetObjectPanel","fact","trace","linkLocation","event","releaseWorksetSessionKey","ReleaseWorkset","browserSession","release","workset","searchParams","selectedTrace","selectedRelationship","selectedEvidenceIds","selectedEvidenceClaims","runbook"],"sources":["../../../src/domain/releasePipelineApproval.ts","../../../src/client/releases/presentReleaseWorkset.ts","../../../src/client/releases/RelationshipDetailSheet.module.css","../../../src/client/releases/useRelationshipDetails.ts","../../../src/client/releases/RelationshipDetailSheet.tsx","../../../src/client/releases/relationshipDetailRoute.ts","../../../src/client/releases/ReleaseWorkset.module.css","../../../src/client/releases/loadReleaseEnvironmentSlices.ts","../../../src/client/releases/useReleaseWorkset.ts","../../../src/client/releases/ReleaseWorkset.tsx"],"sourcesContent":["import type { DeliveryEntityProjection, DeliveryNode, DeliveryRelationship } from \"./deliveryGraph.js\"\nimport type { EntityId } from \"./identifiers.js\"\n\ninterface ReleasePipelineApprovalInspection {\n readonly entityProjections: ReadonlyArray<{ readonly projection: DeliveryEntityProjection }>\n readonly nodes: ReadonlyArray<DeliveryNode>\n readonly relationships: ReadonlyArray<DeliveryRelationship>\n readonly truncated: boolean\n}\n\nexport type ReleasePipelineApprovalGate = Readonly<{\n readonly entityId: EntityId\n readonly pipelineName: string\n readonly state: \"missing\" | \"not-waiting\" | \"waiting\"\n}>\n\nconst currentRelationship = (\n lifecycle: DeliveryRelationship[\"lifecycle\"]\n): boolean => lifecycle._tag !== \"missing\" && lifecycle._tag !== \"rejected\" && lifecycle._tag !== \"superseded\"\n\nconst approvalName = (value: string): boolean =>\n /(?:^|[\\s_-])(?:approval|approve)(?:$|[\\s_-])/iu.test(value) || /release[\\s_-]*gate/iu.test(value)\n\n/** Prove that every pipeline delivering a release PR is stopped at its observed manual approval gate. */\nexport const releasePipelineApprovalReadiness = (inspection: ReleasePipelineApprovalInspection) => {\n const nodeById = new Map(inspection.nodes.map((node) => [node.nodeId, node]))\n const projectionByEntityId = new Map(\n inspection.entityProjections.map(({ projection }) => [projection.entityId, projection])\n )\n const affectedPipelineIds = new Set(\n inspection.relationships.flatMap((relationship): ReadonlyArray<EntityId> => {\n if (\n relationship.kind !== \"delivered-by\" ||\n relationship.sourceNodeKind !== \"pull-request\" ||\n relationship.targetNodeKind !== \"pipeline-execution\" ||\n !currentRelationship(relationship.lifecycle)\n ) return []\n const source = nodeById.get(relationship.sourceNodeId)\n const target = nodeById.get(relationship.targetNodeId)\n return source?.resolution._tag === \"resolved\" &&\n source.resolution.target._tag === \"entity\" &&\n target?.resolution._tag === \"resolved\" &&\n target.resolution.target._tag === \"entity\"\n ? [target.resolution.target.entityId]\n : []\n })\n )\n let unverifiablePipelines = 0\n const gates: Array<ReleasePipelineApprovalGate> = []\n for (const entityId of affectedPipelineIds) {\n const projection = projectionByEntityId.get(entityId)\n const details = projection?.details\n if (\n projection?.entityState !== \"present\" ||\n projection.entityType !== \"pipeline-execution\" ||\n details?._tag !== \"pipeline-execution\"\n ) {\n unverifiablePipelines += 1\n continue\n }\n const approvalActionStages = new Set(\n (details.actions ?? []).flatMap((action) =>\n action.category?.toLocaleLowerCase(\"en-US\") === \"approval\" ||\n action.provider?.toLocaleLowerCase(\"en-US\") === \"manual\"\n ? [action.stageName]\n : []\n )\n )\n const approvalStages = (details.stages ?? []).filter((stage) =>\n approvalActionStages.has(stage.name) || approvalName(stage.name)\n )\n const waiting = approvalStages.some((stage) => {\n if (stage.status !== \"running\") return false\n const explicitActions = (details.actions ?? []).filter((action) =>\n action.stageName === stage.name &&\n (\n action.category?.toLocaleLowerCase(\"en-US\") === \"approval\" ||\n action.provider?.toLocaleLowerCase(\"en-US\") === \"manual\"\n )\n )\n return explicitActions.length === 0 || explicitActions.some(({ status }) => status === \"running\")\n })\n gates.push({\n entityId,\n pipelineName: details.pipelineName,\n state: approvalStages.length === 0 ? \"missing\" : waiting ? \"waiting\" : \"not-waiting\"\n })\n }\n return {\n affected: affectedPipelineIds.size,\n gates,\n missing: gates.filter(({ state }) => state === \"missing\").length,\n notWaiting: gates.filter(({ state }) => state === \"not-waiting\").length,\n ready: !inspection.truncated && unverifiablePipelines === 0 && gates.every(({ state }) => state === \"waiting\"),\n unverifiablePipelines,\n waiting: gates.filter(({ state }) => state === \"waiting\").length\n }\n}\n","import type {\n RlyService,\n RlyWorksetGap,\n RlyWorksetJiraItem,\n RlyWorksetPipeline,\n RlyWorksetPullRequestGroup\n} from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\n\nimport type { ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport { confluenceTaskSummary } from \"../../domain/confluenceTasks.js\"\nimport type {\n DeliveryEntityDetails,\n DeliveryEntityProjection,\n DeliveryRelationship,\n EvidenceClaim\n} from \"../../domain/deliveryGraph.js\"\nimport type {\n EntityId,\n EvidenceId,\n GraphNodeId,\n RelationshipId,\n ReleaseId,\n WorkspaceId\n} from \"../../domain/identifiers.js\"\nimport { releasePipelineApprovalReadiness } from \"../../domain/releasePipelineApproval.js\"\nimport { presentPipelineExecutionStages } from \"../entities/presentWorkspacePipelineExecution.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\ntype Projection = ReleaseDeliveryGraphInspection[\"entityProjections\"][number][\"projection\"]\ntype ProjectionWithDetails<Tag extends DeliveryEntityDetails[\"_tag\"]> = Projection & {\n readonly details: Extract<DeliveryEntityDetails, { readonly _tag: Tag }>\n}\n\nexport interface ReleaseWorksetRunbook {\n readonly completedTasks: number\n readonly href: string\n readonly id: EntityId\n readonly reference: string\n readonly state: string\n readonly title: string\n readonly totalTasks: number\n}\n\nexport interface SelectedReleaseWorksetObject {\n readonly facts: ReadonlyArray<{ readonly label: string; readonly value: string }>\n readonly id: EntityId\n readonly kind: DeliveryEntityProjection[\"entityType\"]\n readonly label: string\n readonly service: RlyService\n readonly status: string\n readonly title: string\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTraceConnection {\n readonly href: string | null\n readonly kind: string\n readonly label: string\n readonly service: RlyService | null\n readonly title: string\n}\n\nexport interface SelectedReleaseWorksetTraceRelationship {\n readonly confidence: string\n readonly detailsHref: string\n readonly direction: \"incoming\" | \"outgoing\"\n readonly evidenceCount: number\n readonly id: RelationshipId\n readonly kind: DeliveryRelationship[\"kind\"]\n readonly lifecycle: string\n readonly other: SelectedReleaseWorksetTraceConnection\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTrace {\n readonly relationships: ReadonlyArray<SelectedReleaseWorksetTraceRelationship>\n readonly truncated: boolean\n}\n\nexport interface ReleaseWorksetPresentation {\n readonly gaps: ReadonlyArray<RlyWorksetGap>\n readonly jiraItems: ReadonlyArray<RlyWorksetJiraItem>\n readonly pipelines: ReadonlyArray<RlyWorksetPipeline>\n readonly pullRequestGroups: ReadonlyArray<RlyWorksetPullRequestGroup>\n readonly runbooks: ReadonlyArray<ReleaseWorksetRunbook>\n readonly truncated: boolean\n}\n\nconst relationshipHref = (\n workspaceId: WorkspaceId,\n releaseId: ReleaseId,\n entityId: EntityId,\n relationshipId: RelationshipId\n): string =>\n `/w/${workspaceId}/releases/${releaseId}?object=${encodeURIComponent(entityId)}&relationship=${\n encodeURIComponent(relationshipId)\n }#release-work`\n\nconst statusTone = (status: string): RlyStateTone => {\n const normalized = status.toLocaleLowerCase(\"en-US\")\n if (\n [\"blocked\", \"changes requested\", \"failed\", \"rejected\", \"rolled back\", \"stopped\", \"superseded\"].some(\n (value) => normalized.includes(value)\n )\n ) {\n return \"critical\"\n }\n if (\n [\"approved\", \"closed\", \"current\", \"done\", \"merged\", \"not required\", \"passed\", \"ready\", \"resolved\", \"succeeded\"]\n .some((value) => normalized.includes(value))\n ) return \"positive\"\n if (\n [\"deploying\", \"in progress\", \"in review\", \"pending\", \"queued\", \"requested\", \"running\", \"verifying\"]\n .some((value) => normalized.includes(value))\n ) return \"progress\"\n return \"neutral\"\n}\n\nconst reviewStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pull-request\" }>[\"reviewState\"]\n): string => {\n switch (state) {\n case \"not-requested\":\n return \"Review not requested\"\n case \"requested\":\n return \"Review requested\"\n case \"changes-requested\":\n return \"Changes requested\"\n case \"approved\":\n return \"Approved\"\n case \"merged\":\n return \"Merged\"\n }\n}\n\nconst pullRequestStateLabel = (\n details: Extract<DeliveryEntityDetails, { readonly _tag: \"pull-request\" }>\n): string => {\n switch (details.reviewState) {\n case \"approved\":\n case \"changes-requested\":\n case \"merged\":\n return reviewStateLabel(details.reviewState)\n case \"not-requested\":\n case \"requested\":\n return details.lifecycle === \"merged\"\n ? \"Merged\"\n : details.lifecycle === \"closed\"\n ? \"Closed\"\n : reviewStateLabel(details.reviewState)\n }\n}\n\nconst pipelineStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pipeline-execution\" }>[\"status\"]\n): string => `${state.charAt(0).toLocaleUpperCase(\"en-US\")}${state.slice(1)}`\n\nconst titleCase = (value: string): string =>\n value.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nconst selectedObjectService = (kind: DeliveryEntityProjection[\"entityType\"]): RlyService => {\n switch (kind) {\n case \"issue\":\n return \"jira\"\n case \"pull-request\":\n return \"codecommit\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n }\n}\n\nconst selectedObjectStatus = (details: DeliveryEntityDetails): string => {\n switch (details._tag) {\n case \"issue\":\n return details.status\n case \"pull-request\":\n return pullRequestStateLabel(details)\n case \"page\":\n case \"deployment\":\n return titleCase(details.status)\n case \"pipeline-execution\":\n return pipelineStateLabel(details.status)\n case \"time-entry\":\n return titleCase(details.approvalState)\n }\n}\n\nconst selectedObjectFacts = (\n details: DeliveryEntityDetails\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n switch (details._tag) {\n case \"issue\":\n return [\n { label: \"Priority\", value: details.priority ?? \"Not set\" },\n { label: \"Estimate\", value: details.estimatePoints === null ? \"Not set\" : `${details.estimatePoints} points` }\n ]\n case \"pull-request\":\n return [\n { label: \"Repository\", value: details.repository },\n { label: \"Branch\", value: `${details.sourceBranch} → ${details.targetBranch}` },\n { label: \"Revision\", value: details.headRevision }\n ]\n case \"page\":\n return [\n { label: \"Space\", value: details.spaceKey },\n { label: \"Revision\", value: details.revision }\n ]\n case \"pipeline-execution\":\n return [\n { label: \"Pipeline\", value: details.pipelineName },\n { label: \"Execution\", value: details.executionId },\n { label: \"Revision\", value: details.triggerRevision }\n ]\n case \"deployment\":\n return [\n { label: \"Environment\", value: details.environmentId },\n { label: \"Revision\", value: details.revision }\n ]\n case \"time-entry\":\n return [\n { label: \"Duration\", value: `${details.durationMinutes} minutes` },\n { label: \"Billing\", value: details.billable ? \"Billable\" : \"Non-billable\" }\n ]\n }\n}\n\nconst presentSelectedObject = (selected: DeliveryEntityProjection): SelectedReleaseWorksetObject => {\n const status = selectedObjectStatus(selected.details)\n return {\n facts: selectedObjectFacts(selected.details),\n id: selected.entityId,\n kind: selected.entityType,\n label: selected.displayKey,\n service: selectedObjectService(selected.entityType),\n status,\n title: selected.title,\n tone: statusTone(status)\n }\n}\n\n/** Resolve every present normalized object into an inspectable selected-object surface. */\nexport const selectReleaseWorksetObject = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null\n): SelectedReleaseWorksetObject | null => {\n if (selectedObjectId === null) return null\n const selected = inspection.entityProjections.find(\n ({ projection }) => projection.entityState === \"present\" && projection.entityId === selectedObjectId\n )?.projection\n if (selected === undefined) return null\n return presentSelectedObject(selected)\n}\n\nconst currentRelationship = (relationship: DeliveryRelationship): boolean =>\n relationship.lifecycle._tag !== \"missing\" &&\n relationship.lifecycle._tag !== \"rejected\" &&\n relationship.lifecycle._tag !== \"superseded\"\n\nconst gapService = (relationship: DeliveryRelationship): RlyService => {\n const missingKind = relationship.sourceNodeKind === \"release\"\n ? relationship.targetNodeKind\n : relationship.sourceNodeKind\n switch (missingKind) {\n case \"issue\":\n return \"jira\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n case \"pull-request\":\n case \"release\":\n case \"environment\":\n return \"codecommit\"\n }\n return \"codecommit\"\n}\n\nconst entityProjectionByNode = (\n inspection: ReleaseDeliveryGraphInspection\n): ReadonlyMap<GraphNodeId, DeliveryEntityProjection> => {\n const projections = new Map(inspection.entityProjections.map(({ projection }) => [projection.entityId, projection]))\n return new Map(\n inspection.nodes.flatMap((node): ReadonlyArray<readonly [GraphNodeId, DeliveryEntityProjection]> => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = projections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [[node.nodeId, projection]]\n })\n )\n}\n\nconst relationshipLifecycleTone = (lifecycle: DeliveryRelationship[\"lifecycle\"][\"_tag\"]): RlyStateTone => {\n switch (lifecycle) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipConfidenceLabel = (confidence: DeliveryRelationship[\"confidence\"]): string => {\n switch (confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst traceConnection = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n nodeId: GraphNodeId,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): SelectedReleaseWorksetTraceConnection => {\n const projection = projections.get(nodeId)\n if (projection !== undefined) {\n const selected = presentSelectedObject(projection)\n return {\n href: projection.entityState === \"present\"\n ? workspaceEntityPath(workspaceId, projection.entityId)\n : null,\n kind: selected.kind,\n label: selected.label,\n service: selected.service,\n title: projection.entityState === \"present\" ? selected.title : `${selected.title} · Deleted`\n }\n }\n const node = inspection.nodes.find((candidate) => candidate.nodeId === nodeId)\n if (node?.resolution._tag === \"missing\") {\n return {\n href: null,\n kind: node.endpointKind,\n label: node.resolution.missingKey,\n service: null,\n title: `Missing ${titleCase(node.endpointKind)}`\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"release\") {\n const isCurrentRelease = node.resolution.target.releaseId === inspection.releaseId\n return {\n href: null,\n kind: \"release\",\n label: `Release ${node.resolution.target.releaseId.slice(-6)}`,\n service: null,\n title: isCurrentRelease ? \"Current release context\" : \"Connected release\"\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"environment\") {\n return {\n href: null,\n kind: \"environment\",\n label: `Environment ${node.resolution.target.environmentId.slice(-6)}`,\n service: null,\n title: \"Delivery environment\"\n }\n }\n return { href: null, kind: \"unknown\", label: nodeId.slice(-6), service: null, title: \"Unresolved graph node\" }\n}\n\n/** Center the bounded current release graph on one selected normalized object. */\nexport const selectReleaseWorksetTrace = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n selectedObjectId: string | null\n): SelectedReleaseWorksetTrace | null => {\n const selectedObject = selectReleaseWorksetObject(inspection, selectedObjectId)\n if (selectedObject === null || selectedObjectId === null) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n const projections = entityProjectionByNode(inspection)\n const relationships = inspection.relationships.flatMap(\n (relationship): ReadonlyArray<SelectedReleaseWorksetTraceRelationship> => {\n const direction = selectedNodeIds.has(relationship.sourceNodeId)\n ? \"outgoing\"\n : selectedNodeIds.has(relationship.targetNodeId)\n ? \"incoming\"\n : null\n if (direction === null) return []\n const otherNodeId = direction === \"outgoing\" ? relationship.targetNodeId : relationship.sourceNodeId\n return [{\n confidence: relationshipConfidenceLabel(relationship.confidence),\n detailsHref: relationshipHref(\n workspaceId,\n inspection.releaseId,\n selectedObject.id,\n relationship.relationshipId\n ),\n direction,\n evidenceCount: relationship.evidenceClaimIds.length,\n id: relationship.relationshipId,\n kind: relationship.kind,\n lifecycle: titleCase(relationship.lifecycle._tag),\n other: traceConnection(inspection, workspaceId, otherNodeId, projections),\n tone: relationshipLifecycleTone(relationship.lifecycle._tag)\n }]\n }\n ).sort((left, right) =>\n left.kind.localeCompare(right.kind) || left.other.label.localeCompare(right.other.label) ||\n left.id.localeCompare(right.id)\n )\n return { relationships, truncated: inspection.truncated }\n}\n\n/** Resolve a URL-selected relationship only when it touches the selected object in this bounded slice. */\nexport const selectReleaseWorksetRelationship = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null,\n selectedRelationshipId: string | null\n): DeliveryRelationship | null => {\n if (\n selectedRelationshipId === null ||\n selectedObjectId === null ||\n selectReleaseWorksetObject(inspection, selectedObjectId) === null\n ) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n let selected: DeliveryRelationship | null = null\n for (const relationship of inspection.relationships) {\n if (\n relationship.relationshipId === selectedRelationshipId &&\n (selectedNodeIds.has(relationship.sourceNodeId) || selectedNodeIds.has(relationship.targetNodeId)) &&\n (selected === null || relationship.revision > selected.revision)\n ) selected = relationship\n }\n return selected\n}\n\n/** Resolve exact referenced claims from the closure-checked release slice. */\nexport const releaseWorksetRelationshipEvidenceClaims = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceClaim> => {\n if (relationship === null) return []\n const claimById = new Map(inspection.evidenceClaims.map((claim) => [claim.evidenceClaimId, claim]))\n return relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = claimById.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n}\n\n/** Resolve the unique evidence observations referenced by one relationship from the closed release slice. */\nexport const releaseWorksetRelationshipEvidenceIds = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceId> => {\n const evidenceIds = new Set<EvidenceId>()\n for (const claim of releaseWorksetRelationshipEvidenceClaims(inspection, relationship)) {\n evidenceIds.add(claim.evidenceId)\n }\n return [...evidenceIds].sort((left, right) => left.localeCompare(right))\n}\n\nconst releaseRunbookEntityIds = (\n inspection: ReleaseDeliveryGraphInspection,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): ReadonlySet<EntityId> => {\n const nodes = new Map(inspection.nodes.map((node) => [node.nodeId, node]))\n return new Set(\n inspection.relationships.flatMap((relationship): ReadonlyArray<EntityId> => {\n if (\n relationship.kind !== \"documented-by\" ||\n relationship.sourceNodeKind !== \"release\" ||\n relationship.targetNodeKind !== \"page\" ||\n !currentRelationship(relationship)\n ) return []\n const source = nodes.get(relationship.sourceNodeId)\n const target = projections.get(relationship.targetNodeId)\n return source?.resolution._tag === \"resolved\" &&\n source.resolution.target._tag === \"release\" &&\n source.resolution.target.releaseId === inspection.releaseId &&\n target?.details._tag === \"page\"\n ? [target.entityId]\n : []\n })\n )\n}\n\nconst gapLabel = (\n relationship: DeliveryRelationship,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): string => {\n const issue = relationship.sourceNodeKind === \"issue\"\n ? projections.get(relationship.sourceNodeId)\n : relationship.targetNodeKind === \"issue\"\n ? projections.get(relationship.targetNodeId)\n : undefined\n if (issue?.details._tag === \"issue\" && relationship.sourceNodeKind === \"pull-request\") {\n return `${issue.details.key} has no CodeCommit pull request`\n }\n return `Missing ${relationship.sourceNodeKind} → ${relationship.targetNodeKind} relationship`\n}\n\n/** Present one bounded graph inspection as three explicit release-work dimensions. */\nexport const presentReleaseWorkset = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId\n): ReleaseWorksetPresentation => {\n const projections = entityProjectionByNode(inspection)\n const runbookEntityIds = releaseRunbookEntityIds(inspection, projections)\n const href = (projection: DeliveryEntityProjection): string => workspaceEntityPath(workspaceId, projection.entityId)\n const issues = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"issue\"> =>\n projection.entityType === \"issue\" && projection.details._tag === \"issue\" && projection.entityState === \"present\"\n )\n const pullRequests = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pull-request\"> =>\n projection.entityType === \"pull-request\" &&\n projection.details._tag === \"pull-request\" &&\n projection.entityState === \"present\"\n )\n const pipelineExecutions = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pipeline-execution\"> =>\n projection.entityType === \"pipeline-execution\" &&\n projection.details._tag === \"pipeline-execution\" &&\n projection.entityState === \"present\"\n )\n const pages = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"page\"> =>\n projection.entityType === \"page\" &&\n projection.details._tag === \"page\" &&\n projection.entityState === \"present\" &&\n runbookEntityIds.has(projection.entityId)\n )\n const confluenceTaskGaps = pages.flatMap((page): ReadonlyArray<RlyWorksetGap> => {\n if (page.details.contentState !== \"loaded\") {\n return [{\n id: `${page.entityId}:confluence-tasks-unavailable`,\n label: `${page.title} tasks are not synchronized`,\n reason: \"Release readiness cannot be verified until the Confluence page body is synchronized.\",\n service: \"confluence\"\n }]\n }\n return confluenceTaskSummary(page.details.content?.markdown ?? \"\").tasks.flatMap((task) =>\n task.checked\n ? []\n : [{\n id: `${page.entityId}:confluence-task:${String(task.lineNumber)}`,\n label: task.label,\n reason: `Confluence task on ${page.title} is not complete.`,\n service: \"confluence\"\n }]\n )\n })\n const pipelineReadiness = releasePipelineApprovalReadiness(inspection)\n const pipelineApprovalGaps = pipelineReadiness.gates.flatMap(\n (gate): ReadonlyArray<RlyWorksetGap> =>\n gate.state === \"waiting\"\n ? []\n : [{\n id: `${gate.entityId}:release-approval-gate`,\n label: gate.state === \"missing\"\n ? `${gate.pipelineName} has no release approval gate`\n : `${gate.pipelineName} is not waiting for Stage approval`,\n reason: gate.state === \"missing\"\n ? \"Every pipeline delivering this release must contain an observed manual approval stage.\"\n : \"The affected pipeline must wait at its manual approval stage before release publication.\",\n service: \"codepipeline\"\n }]\n )\n const unverifiablePipelineGaps: ReadonlyArray<RlyWorksetGap> = pipelineReadiness.unverifiablePipelines === 0\n ? []\n : [{\n id: \"release-pipelines-unverifiable\",\n label: \"Affected pipeline approval state is unavailable\",\n reason: \"Release readiness cannot be verified until every affected pipeline is synchronized.\",\n service: \"codepipeline\"\n }]\n\n return {\n jiraItems: issues.map((issue) => ({\n id: issue.entityId,\n key: issue.details.key,\n title: issue.title,\n state: issue.details.status,\n tone: statusTone(issue.details.status),\n href: href(issue)\n })),\n pullRequestGroups: pullRequests.map((pullRequest) => {\n const sourceNodes = new Set(\n Array.from(projections).flatMap(([nodeId, projection]): ReadonlyArray<GraphNodeId> =>\n projection.entityId === pullRequest.entityId ? [nodeId] : []\n )\n )\n const linkedJiraKeys = Array.from(\n new Set(inspection.relationships.flatMap((relationship): ReadonlyArray<string> => {\n if (\n relationship.kind !== \"implements\" ||\n !sourceNodes.has(relationship.sourceNodeId) ||\n !currentRelationship(relationship)\n ) return []\n const issue = projections.get(relationship.targetNodeId)\n return issue?.details._tag === \"issue\" ? [issue.details.key] : []\n }))\n )\n const state = pullRequestStateLabel(pullRequest.details)\n return {\n id: pullRequest.entityId,\n title: pullRequest.title,\n reference: pullRequest.displayKey,\n state,\n tone: statusTone(state),\n href: href(pullRequest),\n linkedJiraKeys\n }\n }),\n gaps: [\n ...inspection.relationships.flatMap((relationship): ReadonlyArray<RlyWorksetGap> =>\n relationship.lifecycle._tag === \"missing\"\n ? [{\n id: relationship.relationshipId,\n label: gapLabel(relationship, projections),\n reason: relationship.lifecycle.reason,\n service: gapService(relationship)\n }]\n : []\n ),\n ...confluenceTaskGaps,\n ...pipelineApprovalGaps,\n ...unverifiablePipelineGaps\n ],\n pipelines: pipelineExecutions.map((pipeline) => {\n const state = pipelineStateLabel(pipeline.details.status)\n return {\n id: pipeline.entityId,\n title: pipeline.title,\n reference: pipeline.displayKey,\n state,\n tone: statusTone(state),\n href: href(pipeline),\n stages: presentPipelineExecutionStages(pipeline.details.stages)\n }\n }),\n runbooks: pages.map((page) => {\n const tasks = confluenceTaskSummary(page.details.content?.markdown ?? \"\")\n return {\n completedTasks: tasks.completed,\n href: href(page),\n id: page.entityId,\n reference: page.displayKey,\n state: page.details.status,\n title: page.title,\n totalTasks: tasks.total\n }\n }),\n truncated: inspection.truncated\n }\n}\n",".body,\n.loading,\n.content,\n.summary,\n.section,\n.history,\n.evidence,\n.evidenceCard,\n.claims {\n display: grid;\n}\n\n.integrity {\n display: flex;\n align-items: flex-start;\n gap: var(--rly-space-8);\n}\n\n.integrity p {\n margin: 0;\n}\n\n.body,\n.content,\n.loading {\n gap: var(--rly-space-20);\n}\n\n.content,\n.summary,\n.section,\n.evidenceCard {\n gap: var(--rly-space-12);\n}\n\n.summary,\n.evidenceCard {\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.summaryHeading,\n.sectionHeading,\n.historyHeading,\n.evidenceHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-8);\n}\n\n.tags {\n justify-content: flex-end;\n}\n\n.summary h3,\n.section h3,\n.evidenceCard h4,\n.summary p,\n.history p,\n.facts dd {\n margin: 0;\n}\n\n.facts {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.facts div {\n min-width: 0;\n}\n\n.facts 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.facts dd {\n min-inline-size: 0;\n overflow-wrap: break-word;\n}\n\n.history,\n.claims {\n gap: var(--rly-space-8);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.history li,\n.claims li {\n display: grid;\n gap: var(--rly-space-4);\n padding: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.history li:first-child,\n.claims li:first-child {\n border-block-start: 0;\n}\n\n.claims li {\n grid-template-columns: minmax(8rem, auto) minmax(0, 1fr);\n}\n\n@media (max-width: 36rem) {\n .facts,\n .claims li {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { EvidenceId, RelationshipId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY = 4\n\nexport interface RelationshipDetails {\n readonly evidence: ReadonlyArray<EvidenceInspection>\n readonly history: RelationshipHistoryInspection\n}\n\nexport interface RelationshipDetailsTransport {\n readonly load: (\n relationshipId: RelationshipId,\n evidenceIds: ReadonlyArray<EvidenceId>,\n signal: AbortSignal\n ) => Promise<RelationshipDetails>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load one relationship ledger and only the immutable evidence it references. */\nexport const browserRelationshipDetailsTransport: RelationshipDetailsTransport = {\n load: (relationshipId, evidenceIds, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n const history = yield* client.deliveryGraph.relationshipHistory({ params: { relationshipId } })\n const evidence = yield* Effect.forEach(\n evidenceIds,\n (evidenceId) => client.deliveryGraph.evidence({ params: { evidenceId } }),\n { concurrency: MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY }\n )\n return { evidence, history }\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nexport type RelationshipDetailsState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly details: RelationshipDetails\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n\n/** Keep relationship details bound to the exact selection and authenticated browser session. */\nexport const useRelationshipDetails = (\n relationshipId: RelationshipId | null,\n evidenceIds: ReadonlyArray<EvidenceId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: RelationshipDetailsTransport = browserRelationshipDetailsTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<RelationshipDetailsState>({ _tag: \"idle\" })\n const evidenceKey = evidenceIds.join(\":\")\n const evidenceIdsRef = useRef(evidenceIds)\n\n useEffect(() => {\n evidenceIdsRef.current = evidenceIds\n }, [evidenceIds])\n\n useEffect(() => {\n if (relationshipId === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", evidenceKey, relationshipId, sessionKey })\n transport.load(relationshipId, evidenceIdsRef.current, abort.signal).then(\n (details) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", details, evidenceKey, relationshipId, sessionKey })\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", evidenceKey, relationshipId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [evidenceKey, onSessionExpired, relationshipId, requestRevision, sessionKey, transport])\n\n const currentState: RelationshipDetailsState = relationshipId === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.relationshipId !== relationshipId ||\n state.sessionKey !== sessionKey ||\n state.evidenceKey !== evidenceKey\n ? { _tag: \"loading\", evidenceKey, relationshipId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\n\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { DeliveryRelationship, EvidenceClaim, EvidenceItem } from \"../../domain/deliveryGraph.js\"\nimport type { EvidenceId } from \"../../domain/identifiers.js\"\nimport type { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport styles from \"./RelationshipDetailSheet.module.css\"\nimport { type RelationshipDetailsTransport, useRelationshipDetails } from \"./useRelationshipDetails.js\"\n\nconst titleCase = (value: string): string =>\n value\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const formatRelationshipTimestamp = (value: UtcTimestamp): string =>\n DateTime.formatUtc(value, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n year: \"numeric\"\n })\n\nexport const relationshipActorLabel = (actor: DeliveryRelationship[\"recordedBy\"]): string => {\n switch (actor._tag) {\n case \"human\":\n return `Human · ${actor.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${actor.agentId.slice(-6)}`\n case \"system\":\n return `System · ${actor.component}`\n }\n}\n\nexport const relationshipProvenanceLabel = (provenance: DeliveryRelationship[\"provenance\"]): string => {\n switch (provenance._tag) {\n case \"plugin\":\n return `Plugin source · ${provenance.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human decision · ${provenance.personId.slice(-6)}`\n case \"agent\":\n return `Agent proposal · ${provenance.agentId.slice(-6)}`\n case \"rule\":\n return `Rule · ${provenance.ruleId} v${String(provenance.ruleVersion)}`\n }\n}\n\nconst relationshipRationale = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed by immutable evidence.\"\n case \"inferred\":\n case \"unknown\":\n return relationship.confidence.rationale\n }\n}\n\nconst relationshipConfidenceLabel = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(relationship.confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst relationshipLifecycleTone = (relationship: DeliveryRelationship): RlyStateTone => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipScopeLabel = (relationship: DeliveryRelationship): string => {\n if (relationship.scope === null) return \"Workspace\"\n if (relationship.scope._tag === \"release\") return `Release · ${relationship.scope.releaseId.slice(-6)}`\n return `Environment · ${relationship.scope.environmentId.slice(-6)}`\n}\n\nconst evidenceFreshnessTone = (evidence: EvidenceItem): RlyStateTone => {\n switch (evidence.freshness._tag) {\n case \"current\":\n return \"positive\"\n case \"stale\":\n return \"caution\"\n case \"missing\":\n case \"unavailable\":\n return \"critical\"\n }\n}\n\nconst lifecycleReason = (relationship: DeliveryRelationship): string | null => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n case \"superseded\":\n return relationship.lifecycle.reason\n case \"governed\":\n case \"inferred\":\n case \"proposed\":\n case \"verified\":\n return null\n }\n}\n\nconst evidencePartyLabel = (party: EvidenceItem[\"attribution\"] | EvidenceItem[\"verifier\"]): string => {\n switch (party._tag) {\n case \"plugin\":\n return `Plugin · ${party.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human · ${party.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${party.agentId.slice(-6)}`\n case \"system\":\n return `System · ${party.component}`\n }\n}\n\nexport const evidenceClaimValueLabel = (claim: EvidenceClaim): string => {\n switch (claim.value._tag) {\n case \"flag\":\n return claim.value.value ? \"Yes\" : \"No\"\n case \"state\":\n case \"revision\":\n return claim.value.value\n case \"reference\":\n return `Node ${claim.value.targetNodeId.slice(-6)}`\n }\n}\n\nconst EvidenceCard = ({\n claims,\n inspection,\n relationship\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly inspection: EvidenceInspection\n readonly relationship: DeliveryRelationship\n}): ReactElement => {\n const relatedClaimIds = new Set(relationship.evidenceClaimIds)\n const relatedClaims = claims.filter(\n ({ evidenceClaimId, evidenceId }) =>\n evidenceId === inspection.evidence.evidenceId && relatedClaimIds.has(evidenceClaimId)\n )\n const evidence = inspection.evidence\n return (\n <article className={styles.evidenceCard}>\n <div className={styles.evidenceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Evidence {evidence.evidenceId.slice(-6)}\n </Text>\n <StateLabel label={titleCase(evidence.freshness._tag)} size=\"compact\" tone={evidenceFreshnessTone(evidence)} />\n </div>\n <dl className={styles.facts}>\n <div>\n <dt>Observed</dt>\n <dd>{formatRelationshipTimestamp(evidence.observedAt)}</dd>\n </div>\n <div>\n <dt>Source</dt>\n <dd>{evidencePartyLabel(evidence.attribution)}</dd>\n </div>\n <div>\n <dt>Verified by</dt>\n <dd>{evidencePartyLabel(evidence.verifier)}</dd>\n </div>\n <div>\n <dt>Retention</dt>\n <dd>\n {titleCase(evidence.retention.classification)}\n {evidence.retention.legalHold ? \" · Legal hold\" : \"\"}\n </dd>\n </div>\n <div>\n <dt>Valid until</dt>\n <dd>\n {evidence.validUntil === null ? \"No expiry recorded\" : formatRelationshipTimestamp(evidence.validUntil)}\n </dd>\n </div>\n </dl>\n {relatedClaims.length === 0 ? (\n <Text tone=\"secondary\" variant=\"meta\">\n No referenced claim was returned for this observation.\n </Text>\n ) : (\n <ul className={styles.claims}>\n {relatedClaims.map((claim) => (\n <li key={claim.evidenceClaimId}>\n <Text as=\"span\" variant=\"label\">\n {titleCase(claim.predicate)}\n </Text>\n <Text as=\"span\" tone=\"secondary\">\n {evidenceClaimValueLabel(claim)}\n </Text>\n </li>\n ))}\n </ul>\n )}\n </article>\n )\n}\n\n/** Report the bounded history prefix without presenting it as a complete ledger. */\nexport const relationshipHistoryCountLabel = (revisions: RelationshipHistoryInspection[\"revisions\"]): string => {\n let newestRevision = 0\n for (const revision of revisions) newestRevision = Math.max(newestRevision, revision.revision)\n if (newestRevision > revisions.length) return `${String(revisions.length)} of ${String(newestRevision)} revisions`\n return `${String(revisions.length)} revision${revisions.length === 1 ? \"\" : \"s\"}`\n}\n\n/** URL-owned detail panel for immutable relationship history and evidence. */\nexport const RelationshipDetailSheet = ({\n claims,\n evidenceIds,\n onClose,\n onSessionExpired,\n relationship,\n sessionKey,\n transport\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly evidenceIds: ReadonlyArray<EvidenceId>\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly relationship: DeliveryRelationship | null\n readonly sessionKey: string | null\n readonly transport?: RelationshipDetailsTransport\n}): ReactElement => {\n const controller = useRelationshipDetails(\n relationship?.relationshipId ?? null,\n evidenceIds,\n sessionKey,\n onSessionExpired,\n transport\n )\n const title = relationship === null ? \"Relationship details\" : `${titleCase(relationship.kind)} relationship`\n const evidenceIntegrityComplete = relationship === null || claims.length === relationship.evidenceClaimIds.length\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={relationship !== null}\n >\n <Sheet.Content\n closeLabel={`Close ${title}`}\n description=\"Immutable delivery history and the evidence used to establish this connection.\"\n title={title}\n >\n <Sheet.Body className={styles.body}>\n {relationship === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading relationship details\" className={styles.loading}>\n <Skeleton height=\"7rem\" />\n <Skeleton height=\"12rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The selected relationship remains unchanged. Its history could not be loaded.\"\n title=\"Relationship details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"relationship-summary-title\" className={styles.summary}>\n <div className={styles.summaryHeading}>\n <Text as=\"h3\" id=\"relationship-summary-title\" variant=\"section-title\">\n {relationship.sourceNodeKind} → {relationship.targetNodeKind}\n </Text>\n <div className={styles.tags}>\n <StateLabel\n label={titleCase(relationship.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(relationship)}\n />\n <StateLabel label={relationshipConfidenceLabel(relationship)} size=\"compact\" tone=\"neutral\" />\n </div>\n </div>\n <Text tone=\"secondary\">{relationshipRationale(relationship)}</Text>\n <dl className={styles.facts}>\n <div>\n <dt>Revision</dt>\n <dd>{String(relationship.revision)}</dd>\n </div>\n <div>\n <dt>Recorded by</dt>\n <dd>{relationshipActorLabel(relationship.recordedBy)}</dd>\n </div>\n <div>\n <dt>Origin</dt>\n <dd>{relationshipProvenanceLabel(relationship.provenance)}</dd>\n </div>\n <div>\n <dt>Scope</dt>\n <dd>{relationshipScopeLabel(relationship)}</dd>\n </div>\n <div>\n <dt>Recorded</dt>\n <dd>{formatRelationshipTimestamp(relationship.recordedAt)}</dd>\n </div>\n </dl>\n </section>\n\n <section aria-labelledby=\"relationship-history-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-history-title\" variant=\"label\">\n History\n </Text>\n <StateLabel\n label={relationshipHistoryCountLabel(controller.state.details.history.revisions)}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {controller.state.details.history.revisions.length === 0 ? (\n <Text tone=\"secondary\">No immutable ledger revisions were returned.</Text>\n ) : (\n <ol className={styles.history}>\n {controller.state.details.history.revisions.map((revision) => {\n const reason = lifecycleReason(revision)\n return (\n <li key={`${revision.relationshipId}:${String(revision.revision)}`}>\n <div className={styles.historyHeading}>\n <Text as=\"span\" variant=\"label\">\n Revision {String(revision.revision)}\n </Text>\n <StateLabel\n label={titleCase(revision.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(revision)}\n />\n </div>\n <Text tone=\"secondary\" variant=\"meta\">\n {relationshipActorLabel(revision.recordedBy)} ·{\" \"}\n {formatRelationshipTimestamp(revision.recordedAt)}\n </Text>\n {reason === null ? null : <Text tone=\"secondary\">{reason}</Text>}\n </li>\n )\n })}\n </ol>\n )}\n </section>\n\n <section aria-labelledby=\"relationship-evidence-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-evidence-title\" variant=\"label\">\n Evidence\n </Text>\n <StateLabel\n label={`${String(controller.state.details.evidence.length)} observation${controller.state.details.evidence.length === 1 ? \"\" : \"s\"}`}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {evidenceIntegrityComplete ? null : (\n <div className={styles.integrity}>\n <StateLabel label=\"Evidence incomplete\" size=\"compact\" tone=\"critical\" />\n <Text tone=\"secondary\">\n One or more referenced claims are missing from the release slice. Refresh before relying on this\n relationship.\n </Text>\n </div>\n )}\n {controller.state.details.evidence.length === 0 ? (\n <Text tone=\"secondary\">No immutable evidence is attached to this relationship revision.</Text>\n ) : (\n <div className={styles.evidence}>\n {controller.state.details.evidence.map((inspection) => (\n <EvidenceCard\n claims={claims}\n inspection={inspection}\n key={inspection.evidence.evidenceId}\n relationship={relationship}\n />\n ))}\n </div>\n )}\n </section>\n </div>\n )}\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n","import * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport type { NavigateFunction } from \"react-router\"\n\nimport {\n EntityId,\n type EntityId as EntityIdType,\n RelationshipId,\n type RelationshipId as RelationshipIdType\n} from \"../../domain/identifiers.js\"\n\nconst RelationshipDetailMarker = Schema.Struct({\n _tag: Schema.Literal(\"relationship-detail-origin/v1\"),\n objectId: EntityId,\n relationshipId: RelationshipId\n})\n\nconst RelationshipDetailRouteState = Schema.Struct({\n relationshipDetailOrigin: RelationshipDetailMarker\n})\n\n/** Preserve existing release-origin state while marking an in-app relationship-detail activation. */\nexport const makeRelationshipDetailRouteState = <UnparsedInput>(\n state: UnparsedInput,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n) => ({\n ...((Predicate.isObject(state)) && state),\n relationshipDetailOrigin: {\n _tag: \"relationship-detail-origin/v1\",\n objectId,\n relationshipId\n }\n})\n\n/** Accept Back navigation only for the exact versioned object/relationship activation. */\nexport const matchesRelationshipDetailRouteState = <UnparsedInput>(\n state: UnparsedInput,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): boolean => {\n const decoded = Schema.decodeUnknownOption(RelationshipDetailRouteState)(state)\n return Option.isSome(decoded) &&\n decoded.value.relationshipDetailOrigin.objectId === objectId &&\n decoded.value.relationshipDetailOrigin.relationshipId === relationshipId\n}\n\n/** Close an in-app detail with Back; canonicalize direct detail URLs in place. */\nexport const closeRelationshipDetailRoute = (\n navigate: NavigateFunction,\n location: Readonly<{ hash: string; pathname: string; search: string; state: unknown }>,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): void => {\n if (matchesRelationshipDetailRouteState(location.state, objectId, relationshipId)) {\n navigate(-1)\n return\n }\n const next = new URLSearchParams(location.search)\n next.delete(\"relationship\")\n navigate(\n { hash: location.hash, pathname: location.pathname, search: next.size === 0 ? \"\" : `?${next.toString()}` },\n { replace: true, state: location.state }\n )\n}\n",".root,\n.loading,\n.context,\n.contextGroup,\n.selected,\n.selectedFacts,\n.trace,\n.traceList,\n.runbooks,\n.runbook {\n display: grid;\n}\n\n.root,\n.loading {\n gap: var(--rly-space-16);\n}\n\n.context {\n grid-template-columns: repeat(2, minmax(0, 1fr)) auto;\n align-items: start;\n gap: var(--rly-space-24);\n padding: var(--rly-space-16) var(--rly-space-20);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.contextGroup,\n.runbook {\n gap: var(--rly-space-4);\n}\n\n.contextHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.contextGroup h3 {\n margin: 0;\n}\n\n.selected {\n grid-column: 1 / -1;\n gap: var(--rly-space-12);\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-1);\n}\n\n.selected h3,\n.selected p,\n.selectedFacts dd {\n margin: 0;\n}\n\n.selectedHeading {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.selectedFacts {\n grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.selectedFacts div {\n min-width: 0;\n}\n\n.selectedFacts 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.selectedFacts dd {\n min-inline-size: 0;\n overflow-wrap: break-word;\n}\n\n.trace {\n gap: var(--rly-space-8);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.traceHeading,\n.traceRelation {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.traceHeading {\n justify-content: space-between;\n}\n\n.traceHeading h4,\n.traceConnection p {\n margin: 0;\n}\n\n.traceList {\n gap: var(--rly-space-4);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.traceList li {\n display: grid;\n grid-template-columns: auto minmax(10rem, 1fr) auto auto auto;\n align-items: center;\n gap: var(--rly-space-12);\n min-width: 0;\n padding: var(--rly-space-8) var(--rly-space-12);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-2);\n}\n\n.traceConnection {\n min-width: 0;\n}\n\n.traceConnection a {\n color: var(--rly-color-text-1);\n min-inline-size: 0;\n overflow-wrap: break-word;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails {\n color: var(--rly-color-text-1);\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-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\n}\n\n.traceConnection a:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\n}\n\n.runbooks {\n gap: var(--rly-space-8);\n}\n\n.runbook {\n color: inherit;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.runbook span {\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.runbook:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\n}\n\n@media (max-width: 48rem) {\n .context {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .traceList li {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .traceRelation,\n .traceList li > span,\n .traceDetails {\n grid-column: 2;\n }\n}\n","import type { EnvironmentId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY = 4\n\n/** Load release scope followed by every target environment without saturating browser connection pools. */\nexport const loadReleaseEnvironmentSlices = async <Value>(\n environmentIds: ReadonlyArray<EnvironmentId>,\n load: (environmentId: EnvironmentId | null) => Promise<Value>\n): Promise<ReadonlyArray<Value>> => {\n const scopes: ReadonlyArray<EnvironmentId | null> = [null, ...environmentIds]\n const completed: Array<{ readonly index: number; readonly value: Value }> = []\n let nextIndex = 0\n let isStopped = false\n const loadNext = async (): Promise<void> => {\n while (!isStopped && nextIndex < scopes.length) {\n const index = nextIndex\n nextIndex += 1\n const environmentId = scopes[index]\n if (environmentId === undefined) return\n try {\n completed.push({ index, value: await load(environmentId) })\n } catch (failure) {\n isStopped = true\n throw failure\n }\n }\n }\n const workerCount = Math.min(MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY, scopes.length)\n await Promise.all(Array.from({ length: workerCount }, () => loadNext()))\n return completed.sort((left, right) => left.index - right.index).map(({ value }) => value)\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport { MAXIMUM_RELEASE_SLICE_RECORDS, type ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport type { EnvironmentId, ReleaseId } from \"../../domain/identifiers.js\"\nimport {\n loadReleaseEnvironmentSlices,\n MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n} from \"./loadReleaseEnvironmentSlices.js\"\n\nexport const MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS = MAXIMUM_RELEASE_SLICE_RECORDS\n\n/** Combine release and environment slices while retaining complete relationship closure. */\nexport const aggregateReleaseWorksetInspections = (\n releaseId: ReleaseId,\n inspections: ReadonlyArray<ReleaseDeliveryGraphInspection>\n): ReleaseDeliveryGraphInspection => {\n type Inspection = ReleaseDeliveryGraphInspection\n const availableNodes = new Map<string, Inspection[\"nodes\"][number]>()\n const availableProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const availableClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const availableEvidence = new Map<string, Inspection[\"evidenceItems\"][number]>()\n for (const inspection of inspections) {\n for (const node of inspection.nodes) availableNodes.set(node.nodeId, node)\n for (const entry of inspection.entityProjections) {\n availableProjections.set(entry.projection.entityId, entry)\n }\n for (const claim of inspection.evidenceClaims) availableClaims.set(claim.evidenceClaimId, claim)\n for (const item of inspection.evidenceItems) availableEvidence.set(item.evidenceId, item)\n }\n const nodes = new Map<string, Inspection[\"nodes\"][number]>()\n const entityProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const relationships = new Map<string, Inspection[\"relationships\"][number]>()\n const evidenceClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const evidenceItems = new Map<string, Inspection[\"evidenceItems\"][number]>()\n let truncated = inspections.some((inspection) => inspection.truncated)\n\n for (const relationship of inspections.flatMap(({ relationships }) => relationships)) {\n const relationshipKey = `${relationship.relationshipId}:${String(relationship.revision)}`\n if (relationships.has(relationshipKey)) continue\n const requiredNodes = [\n availableNodes.get(relationship.sourceNodeId),\n availableNodes.get(relationship.targetNodeId)\n ]\n if (requiredNodes.some((node) => node === undefined)) {\n truncated = true\n continue\n }\n const presentNodes = requiredNodes.filter((node) => node !== undefined)\n const entityNodes = presentNodes.filter(\n (node) => node.resolution._tag === \"resolved\" && node.resolution.target._tag === \"entity\"\n )\n const requiredProjections = entityNodes.flatMap((node) => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = availableProjections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [projection]\n })\n const requiredClaims = relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = availableClaims.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n const evidenceIds = new Set(requiredClaims.map(({ evidenceId }) => evidenceId))\n const requiredEvidence = [...evidenceIds].flatMap((evidenceId) => {\n const evidence = availableEvidence.get(evidenceId)\n return evidence === undefined ? [] : [evidence]\n })\n const closureMissing = requiredProjections.length !== entityNodes.length ||\n requiredClaims.length !== relationship.evidenceClaimIds.length ||\n requiredEvidence.length !== evidenceIds.size\n const newNodeCount = presentNodes.filter(({ nodeId }) => !nodes.has(nodeId)).length\n const newProjectionCount = requiredProjections.filter(({ projection }) =>\n !entityProjections.has(projection.entityId)\n ).length\n const newClaimCount = requiredClaims.filter(({ evidenceClaimId }) => !evidenceClaims.has(evidenceClaimId)).length\n const newEvidenceCount = requiredEvidence.filter(({ evidenceId }) => !evidenceItems.has(evidenceId)).length\n const closureExceedsBound = relationships.size === MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n nodes.size + newNodeCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n entityProjections.size + newProjectionCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceClaims.size + newClaimCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceItems.size + newEvidenceCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS\n if (closureMissing || closureExceedsBound) {\n truncated = true\n continue\n }\n relationships.set(relationshipKey, relationship)\n for (const node of presentNodes) nodes.set(node.nodeId, node)\n for (const entry of requiredProjections) entityProjections.set(entry.projection.entityId, entry)\n for (const claim of requiredClaims) evidenceClaims.set(claim.evidenceClaimId, claim)\n for (const item of requiredEvidence) evidenceItems.set(item.evidenceId, item)\n }\n return {\n releaseId,\n environmentId: null,\n truncated,\n nodes: [...nodes.values()],\n entityProjections: [...entityProjections.values()],\n relationships: [...relationships.values()],\n evidenceClaims: [...evidenceClaims.values()],\n evidenceItems: [...evidenceItems.values()]\n }\n}\n\nexport interface ReleaseWorksetTransport {\n readonly load: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<ReleaseDeliveryGraphInspection>\n}\n\nexport const MAXIMUM_RELEASE_WORKSET_REQUEST_CONCURRENCY = MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load every release/environment slice without saturating browser or server connection pools. */\nexport const loadReleaseWorksetInspections = async (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n signal: AbortSignal,\n transport: ReleaseWorksetTransport\n): Promise<ReadonlyArray<ReleaseDeliveryGraphInspection>> => {\n return loadReleaseEnvironmentSlices(\n environmentIds,\n (environmentId) => transport.load(releaseId, environmentId, signal)\n )\n}\n\nexport type ReleaseWorksetState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly inspection: ReleaseDeliveryGraphInspection\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n\n/** Generated-client transport for one authenticated bounded release graph. */\nexport const browserReleaseWorksetTransport: ReleaseWorksetTransport = {\n load: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.releaseSlice({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep one release workset scoped to the exact authenticated browser session. */\nexport const useReleaseWorkset = (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: ReleaseWorksetTransport = browserReleaseWorksetTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<ReleaseWorksetState>({ _tag: \"idle\" })\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", environmentScopeKey, releaseId, sessionKey })\n loadReleaseWorksetInspections(releaseId, environmentIds, abort.signal, transport).then(\n (inspections) => {\n if (!abort.signal.aborted) {\n setState({\n _tag: \"ready\",\n environmentScopeKey,\n inspection: aggregateReleaseWorksetInspections(releaseId, inspections),\n releaseId,\n sessionKey\n })\n }\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", environmentScopeKey, releaseId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [environmentScopeKey, onSessionExpired, releaseId, requestRevision, sessionKey, transport])\n\n const currentState: ReleaseWorksetState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.releaseId !== releaseId ||\n state.sessionKey !== sessionKey ||\n state.environmentScopeKey !== environmentScopeKey\n ? { _tag: \"loading\", environmentScopeKey, releaseId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { ServiceMark, WorksetCard } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement } from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport type { WorkspaceId } from \"../../domain/identifiers.js\"\nimport { WorkspaceEntityLink, workspaceEntityStateForHref } from \"../entities/WorkspaceEntityLink.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport {\n presentReleaseWorkset,\n releaseWorksetRelationshipEvidenceClaims,\n releaseWorksetRelationshipEvidenceIds,\n selectReleaseWorksetObject,\n selectReleaseWorksetRelationship,\n selectReleaseWorksetTrace,\n type SelectedReleaseWorksetObject,\n type SelectedReleaseWorksetTrace\n} from \"./presentReleaseWorkset.js\"\nimport { RelationshipDetailSheet } from \"./RelationshipDetailSheet.js\"\nimport { closeRelationshipDetailRoute, makeRelationshipDetailRouteState } from \"./relationshipDetailRoute.js\"\nimport styles from \"./ReleaseWorkset.module.css\"\nimport { useReleaseWorkset } from \"./useReleaseWorkset.js\"\n\nconst LoadingWorkset = (): ReactElement => (\n <div aria-busy=\"true\" aria-label=\"Loading release work\" className={styles.loading}>\n <Skeleton height=\"3rem\" />\n <Skeleton height=\"15rem\" />\n </div>\n)\n\n/** Inspectable destination for an Items result selected within its release context. */\nexport const SelectedReleaseWorksetObjectPanel = ({\n linkLocation,\n selectedObject,\n trace\n}: {\n readonly linkLocation?: RouterLocationParts\n readonly selectedObject: SelectedReleaseWorksetObject\n readonly trace?: SelectedReleaseWorksetTrace\n}): ReactElement => {\n return (\n <section aria-label={`Selected ${selectedObject.kind} ${selectedObject.label}`} className={styles.selected}>\n <div className={styles.selectedHeading}>\n <ServiceMark service={selectedObject.service} size=\"compact\" />\n <Text as=\"p\" variant=\"label\">\n Selected object · {selectedObject.label}\n </Text>\n <StateLabel label={selectedObject.status} size=\"compact\" tone={selectedObject.tone} />\n </div>\n <Text as=\"h3\" variant=\"section-title\">\n {selectedObject.title}\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n {selectedObject.kind}\n </Text>\n <dl className={styles.selectedFacts}>\n {selectedObject.facts.map((fact) => (\n <div key={fact.label}>\n <dt>{fact.label}</dt>\n <dd>{fact.value}</dd>\n </div>\n ))}\n </dl>\n {trace === undefined ? null : (\n <div className={styles.trace}>\n <div className={styles.traceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Delivery trace\n </Text>\n <StateLabel\n label={`${trace.relationships.length} relationship${trace.relationships.length === 1 ? \"\" : \"s\"}${trace.truncated ? \"+\" : \"\"}`}\n size=\"compact\"\n tone={trace.truncated ? \"caution\" : \"neutral\"}\n />\n </div>\n {trace.relationships.length === 0 ? (\n <Text tone=\"secondary\">No relationship touches this object in the current release slice.</Text>\n ) : (\n <ul className={styles.traceList}>\n {trace.relationships.map((relationship) => (\n <li key={relationship.id}>\n {relationship.other.service === null ? null : (\n <ServiceMark service={relationship.other.service} size=\"compact\" />\n )}\n <div className={styles.traceConnection}>\n <Text as=\"p\" variant=\"label\">\n {relationship.direction === \"incoming\" ? \"From\" : \"To\"} {relationship.other.label}\n </Text>\n {relationship.other.href === null ? (\n <Text tone=\"secondary\">{relationship.other.title}</Text>\n ) : (\n <Link\n onClick={(event) => {\n const href = relationship.other.href\n if (\n linkLocation !== undefined &&\n href !== null &&\n workspaceEntityStateForHref(href, linkLocation) !== undefined &&\n shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)\n ) {\n rememberWorkspaceScrollPosition(linkLocation, href)\n }\n }}\n state={\n linkLocation === undefined\n ? undefined\n : workspaceEntityStateForHref(relationship.other.href, linkLocation)\n }\n to={relationship.other.href}\n >\n {relationship.other.title}\n </Link>\n )}\n </div>\n <div className={styles.traceRelation}>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.kind}\n </Text>\n <StateLabel label={relationship.lifecycle} size=\"compact\" tone={relationship.tone} />\n </div>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.confidence} · {relationship.evidenceCount} evidence claim\n {relationship.evidenceCount === 1 ? \"\" : \"s\"}\n </Text>\n <Link\n aria-label={`Details for ${relationship.kind} ${relationship.direction} relationship with ${relationship.other.label}`}\n className={styles.traceDetails}\n state={makeRelationshipDetailRouteState(linkLocation?.state, selectedObject.id, relationship.id)}\n to={relationship.detailsHref}\n >\n Details\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </section>\n )\n}\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Compatibility name retained for release-workset callers of the shared readable-session policy. */\nexport const releaseWorksetSessionKey = browserReadableSessionKey\n\n/** Render one server-backed release graph without substituting demo relationships. */\nexport const ReleaseWorkset = ({\n release,\n workspaceId\n}: {\n readonly release: PortfolioReleasePresentation\n readonly workspaceId: WorkspaceId\n}): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const controller = useReleaseWorkset(\n release.id,\n release.targetEnvironmentIds,\n sessionKey,\n browserSession.invalidateSession\n )\n if (sessionKey === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return <LoadingWorkset />\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the delivery graph for this release. Saved release facts remain unchanged.\"\n title=\"Release work unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const workset = presentReleaseWorkset(controller.state.inspection, workspaceId)\n const searchParams = new URLSearchParams(location.search)\n const selectedObjectId = searchParams.get(\"object\")\n const selectedRelationshipId = searchParams.get(\"relationship\")\n const selectedObject = selectReleaseWorksetObject(controller.state.inspection, selectedObjectId)\n const selectedTrace = selectReleaseWorksetTrace(controller.state.inspection, workspaceId, selectedObjectId)\n const selectedRelationship = selectReleaseWorksetRelationship(\n controller.state.inspection,\n selectedObjectId,\n selectedRelationshipId\n )\n const selectedEvidenceIds = releaseWorksetRelationshipEvidenceIds(controller.state.inspection, selectedRelationship)\n const selectedEvidenceClaims = releaseWorksetRelationshipEvidenceClaims(\n controller.state.inspection,\n selectedRelationship\n )\n const closeRelationshipDetails = (): void => {\n if (selectedObject === null || selectedRelationship === null) return\n closeRelationshipDetailRoute(navigate, location, selectedObject.id, selectedRelationship.relationshipId)\n }\n return (\n <>\n <div className={styles.root}>\n <div className={styles.context}>\n <div className={styles.contextGroup}>\n <Text as=\"h3\" variant=\"label\">\n Environment\n </Text>\n {release.targetEnvironmentIds.length === 0 ? (\n <Text tone=\"secondary\">No target environment recorded.</Text>\n ) : (\n <div className={styles.tags}>\n {release.targetEnvironmentIds.map((environmentId) => (\n <StateLabel\n key={environmentId}\n label={`Unknown target · ${environmentId.slice(-4)}`}\n size=\"compact\"\n title={`Environment ${environmentId}; provider metadata unavailable`}\n tone=\"neutral\"\n />\n ))}\n </div>\n )}\n </div>\n <div className={styles.contextGroup}>\n <div className={styles.contextHeading}>\n <ServiceMark service=\"confluence\" size=\"compact\" />\n <Text as=\"h3\" variant=\"label\">\n Runbook\n </Text>\n </div>\n {workset.runbooks.length === 0 ? (\n <Text tone=\"secondary\">No runbook linked.</Text>\n ) : (\n <div className={styles.runbooks}>\n {workset.runbooks.map((runbook) => (\n <Link\n className={styles.runbook}\n key={runbook.id}\n onClick={(event) => {\n if (\n workspaceEntityStateForHref(runbook.href, location) !== undefined &&\n shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)\n ) {\n rememberWorkspaceScrollPosition(location, runbook.href)\n }\n }}\n state={workspaceEntityStateForHref(runbook.href, location)}\n to={runbook.href}\n >\n <strong>{runbook.title}</strong>\n <span>\n {runbook.reference}\n {runbook.totalTasks === 0\n ? \"\"\n : ` · ${String(runbook.completedTasks)}/${String(runbook.totalTasks)} tasks`}\n </span>\n </Link>\n ))}\n </div>\n )}\n </div>\n {workset.truncated ? (\n <StateLabel label=\"Bounded view · more records exist\" size=\"compact\" tone=\"caution\" />\n ) : null}\n {selectedObject === null || selectedTrace === null ? null : (\n <SelectedReleaseWorksetObjectPanel\n linkLocation={location}\n selectedObject={selectedObject}\n trace={selectedTrace}\n />\n )}\n </div>\n <LinkProvider component={WorkspaceEntityLink}>\n <WorksetCard\n gaps={workset.gaps}\n heading={`${release.serviceName} release work`}\n jiraItems={workset.jiraItems}\n pipelines={workset.pipelines}\n pullRequestGroups={workset.pullRequestGroups}\n />\n </LinkProvider>\n </div>\n <RelationshipDetailSheet\n claims={selectedEvidenceClaims}\n evidenceIds={selectedEvidenceIds}\n onClose={closeRelationshipDetails}\n onSessionExpired={browserSession.invalidateSession}\n relationship={selectedRelationship}\n sessionKey={sessionKey}\n />\n </>\n )\n}\n"],"mappings":"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"}
|