@knpkv/control-center 0.9.0 → 0.9.1
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/README.md +3 -2
- package/dist/client/.vite/manifest.json +430 -430
- package/dist/client/assets/{ActiveWorkPage-Upg00yYW.js → ActiveWorkPage-zWJnB-Cc.js} +2 -2
- package/dist/client/assets/{ActiveWorkPage-Upg00yYW.js.map → ActiveWorkPage-zWJnB-Cc.js.map} +1 -1
- package/dist/client/assets/{AgentPage-BCtDk8yR.js → AgentPage-DCrGAe9-.js} +2 -2
- package/dist/client/assets/{AgentPage-BCtDk8yR.js.map → AgentPage-DCrGAe9-.js.map} +1 -1
- package/dist/client/assets/{AtlassianOAuthCallbackPage-ChTCY_Un.js → AtlassianOAuthCallbackPage-DiYS-wZV.js} +2 -2
- package/dist/client/assets/{AtlassianOAuthCallbackPage-ChTCY_Un.js.map → AtlassianOAuthCallbackPage-DiYS-wZV.js.map} +1 -1
- package/dist/client/assets/{AuthorizedSharePage-BEk1V9hS.js → AuthorizedSharePage-D69hX3jN.js} +2 -2
- package/dist/client/assets/{AuthorizedSharePage-BEk1V9hS.js.map → AuthorizedSharePage-D69hX3jN.js.map} +1 -1
- package/dist/client/assets/{BrowserSessionHydrator-CB9DxOnS.js → BrowserSessionHydrator-DuScelRj.js} +2 -2
- package/dist/client/assets/{BrowserSessionHydrator-CB9DxOnS.js.map → BrowserSessionHydrator-DuScelRj.js.map} +1 -1
- package/dist/client/assets/{CommandSearch-ZtucgGqT.js → CommandSearch-BxhhZB25.js} +2 -2
- package/dist/client/assets/{CommandSearch-ZtucgGqT.js.map → CommandSearch-BxhhZB25.js.map} +1 -1
- package/dist/client/assets/{Dialog-CplGpe1F-DvPHUaxb.js → Dialog-CplGpe1F-DeMJtg-H.js} +2 -2
- package/dist/client/assets/{Dialog-CplGpe1F-DvPHUaxb.js.map → Dialog-CplGpe1F-DeMJtg-H.js.map} +1 -1
- package/dist/client/assets/{ItemsPage-rWXr2AYt.js → ItemsPage-BoSTawlJ.js} +2 -2
- package/dist/client/assets/{ItemsPage-rWXr2AYt.js.map → ItemsPage-BoSTawlJ.js.map} +1 -1
- package/dist/client/assets/{OpenPullRequestPage-C7Uo5MRd.js → OpenPullRequestPage-BfzPMfn_.js} +2 -2
- package/dist/client/assets/{OpenPullRequestPage-C7Uo5MRd.js.map → OpenPullRequestPage-BfzPMfn_.js.map} +1 -1
- package/dist/client/assets/{Pages-D2qsa2F2.js → Pages-DGc7_0RQ.js} +2 -2
- package/dist/client/assets/{Pages-D2qsa2F2.js.map → Pages-DGc7_0RQ.js.map} +1 -1
- package/dist/client/assets/{PairPage-DhpqcT8c.js → PairPage-DCNv3CTt.js} +2 -2
- package/dist/client/assets/{PairPage-DhpqcT8c.js.map → PairPage-DCNv3CTt.js.map} +1 -1
- package/dist/client/assets/{PortfolioOverview-mX6k5nL-.js → PortfolioOverview-Cnnxhgpt.js} +2 -2
- package/dist/client/assets/{PortfolioOverview-mX6k5nL-.js.map → PortfolioOverview-Cnnxhgpt.js.map} +1 -1
- package/dist/client/assets/{PullRequestReviewPanel-DoI2jcWK.js → PullRequestReviewPanel-Blbjn1Ns.js} +4 -4
- package/dist/client/assets/{PullRequestReviewPanel-DoI2jcWK.js.map → PullRequestReviewPanel-Blbjn1Ns.js.map} +1 -1
- package/dist/client/assets/{ReleaseRoute-C80uadO-.js → ReleaseRoute-0QrCZbE4.js} +2 -2
- package/dist/client/assets/{ReleaseRoute-C80uadO-.js.map → ReleaseRoute-0QrCZbE4.js.map} +1 -1
- package/dist/client/assets/{ReleaseWorkset-D2Q-pMv0.js → ReleaseWorkset-DxZ0mgJC.js} +2 -2
- package/dist/client/assets/{ReleaseWorkset-D2Q-pMv0.js.map → ReleaseWorkset-DxZ0mgJC.js.map} +1 -1
- package/dist/client/assets/{ReviewSuggestionOverview-BMy26AXn.js → ReviewSuggestionOverview-CZyq_yfx.js} +2 -2
- package/dist/client/assets/{ReviewSuggestionOverview-BMy26AXn.js.map → ReviewSuggestionOverview-CZyq_yfx.js.map} +1 -1
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-CRWl9aYb.js → ReviewSuggestionPublicationSurface-B6b8PzT8.js} +2 -2
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-CRWl9aYb.js.map → ReviewSuggestionPublicationSurface-B6b8PzT8.js.map} +1 -1
- package/dist/client/assets/{ServicesPage-Bfr3sYg7.js → ServicesPage-zCaWYAK6.js} +2 -2
- package/dist/client/assets/{ServicesPage-Bfr3sYg7.js.map → ServicesPage-zCaWYAK6.js.map} +1 -1
- package/dist/client/assets/{TimelinePage-52RmwoTM.js → TimelinePage-5cMSPV9K.js} +2 -2
- package/dist/client/assets/{TimelinePage-52RmwoTM.js.map → TimelinePage-5cMSPV9K.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityLink-DwxZwXwT.js → WorkspaceEntityLink-CW3XgIHd.js} +2 -2
- package/dist/client/assets/{WorkspaceEntityLink-DwxZwXwT.js.map → WorkspaceEntityLink-CW3XgIHd.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityRoute-BWvMo9IK.js → WorkspaceEntityRoute-HlXUP8jk.js} +4 -4
- package/dist/client/assets/{WorkspaceEntityRoute-BWvMo9IK.js.map → WorkspaceEntityRoute-HlXUP8jk.js.map} +1 -1
- package/dist/client/assets/WorkspaceHomeLink-Bkd98CxT.js +2 -0
- package/dist/client/assets/{WorkspaceHomeLink-Vs72lXwi.js.map → WorkspaceHomeLink-Bkd98CxT.js.map} +1 -1
- package/dist/client/assets/{WorkspacePullRequestDetails-yNQRd79F.js → WorkspacePullRequestDetails-mIv0fssg.js} +3 -3
- package/dist/client/assets/{WorkspacePullRequestDetails-yNQRd79F.js.map → WorkspacePullRequestDetails-mIv0fssg.js.map} +1 -1
- package/dist/client/assets/{WorkspaceReleaseLayout-Ci-HsUIO.js → WorkspaceReleaseLayout-D2RrmuSp.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-Ci-HsUIO.js.map → WorkspaceReleaseLayout-D2RrmuSp.js.map} +1 -1
- package/dist/client/assets/{WorkspaceSettingsPage-CiQKaJv2.js → WorkspaceSettingsPage-CiVpUW2n.js} +2 -2
- package/dist/client/assets/{WorkspaceSettingsPage-CiQKaJv2.js.map → WorkspaceSettingsPage-CiVpUW2n.js.map} +1 -1
- package/dist/client/assets/{angular-html-B-gwpVlh-Cq4vjMyj.js → angular-html-B-gwpVlh-Cymx1bgk.js} +2 -2
- package/dist/client/assets/{angular-html-B-gwpVlh-Cq4vjMyj.js.map → angular-html-B-gwpVlh-Cymx1bgk.js.map} +1 -1
- package/dist/client/assets/{angular-ts-BdaH9qH_-e9JuDelg.js → angular-ts-BdaH9qH_-DfV0rlVi.js} +2 -2
- package/dist/client/assets/{angular-ts-BdaH9qH_-e9JuDelg.js.map → angular-ts-BdaH9qH_-DfV0rlVi.js.map} +1 -1
- package/dist/client/assets/{apl-BLTDDucx-BzhLkVBd.js → apl-BLTDDucx-QGqL8Zyu.js} +2 -2
- package/dist/client/assets/{apl-BLTDDucx-BzhLkVBd.js.map → apl-BLTDDucx-QGqL8Zyu.js.map} +1 -1
- package/dist/client/assets/{astro-CM3EIsEH-Ow1Hk5_H.js → astro-CM3EIsEH-UPw08TJg.js} +2 -2
- package/dist/client/assets/{astro-CM3EIsEH-Ow1Hk5_H.js.map → astro-CM3EIsEH-UPw08TJg.js.map} +1 -1
- package/dist/client/assets/{blade-BuLZ1b4i-BEq2hRPF.js → blade-BuLZ1b4i-DveZJd7d.js} +2 -2
- package/dist/client/assets/{blade-BuLZ1b4i-BEq2hRPF.js.map → blade-BuLZ1b4i-DveZJd7d.js.map} +1 -1
- package/dist/client/assets/{c-BOe7FNWg-b0CPmvGq.js → c-BOe7FNWg-C6rvzF2w.js} +2 -2
- package/dist/client/assets/{c-BOe7FNWg-b0CPmvGq.js.map → c-BOe7FNWg-C6rvzF2w.js.map} +1 -1
- package/dist/client/assets/{chapel-DS426I0C-Bdl9gjGU.js → chapel-DS426I0C-CyMEywxj.js} +2 -2
- package/dist/client/assets/{chapel-DS426I0C-Bdl9gjGU.js.map → chapel-DS426I0C-CyMEywxj.js.map} +1 -1
- package/dist/client/assets/{cobol-D88xw2SU-B-tWRYTQ.js → cobol-D88xw2SU-CJdybb9y.js} +2 -2
- package/dist/client/assets/{cobol-D88xw2SU-B-tWRYTQ.js.map → cobol-D88xw2SU-CJdybb9y.js.map} +1 -1
- package/dist/client/assets/{coffee-9O-pYXz5-CIYW8apR.js → coffee-9O-pYXz5-CwYHswTW.js} +2 -2
- package/dist/client/assets/{coffee-9O-pYXz5-CIYW8apR.js.map → coffee-9O-pYXz5-CwYHswTW.js.map} +1 -1
- package/dist/client/assets/{controlCenterRelayDock-zaVoWYIC.js → controlCenterRelayDock-BJGzwNRb.js} +3 -3
- package/dist/client/assets/{controlCenterRelayDock-zaVoWYIC.js.map → controlCenterRelayDock-BJGzwNRb.js.map} +1 -1
- package/dist/client/assets/{controlCenterRelayDockChrome-BYmBsXTg.js → controlCenterRelayDockChrome-NY7Yy3Wd.js} +2 -2
- package/dist/client/assets/{controlCenterRelayDockChrome-BYmBsXTg.js.map → controlCenterRelayDockChrome-NY7Yy3Wd.js.map} +1 -1
- package/dist/client/assets/{cpp-CPk7VU6o-BaDGXMSE.js → cpp-CPk7VU6o-meCcDOMv.js} +2 -2
- package/dist/client/assets/{cpp-CPk7VU6o-BaDGXMSE.js.map → cpp-CPk7VU6o-meCcDOMv.js.map} +1 -1
- package/dist/client/assets/{crystal-CRftOMVe-DHnKmVfR.js → crystal-CRftOMVe-BqF5ZH9X.js} +2 -2
- package/dist/client/assets/{crystal-CRftOMVe-DHnKmVfR.js.map → crystal-CRftOMVe-BqF5ZH9X.js.map} +1 -1
- package/dist/client/assets/{css-DKjIhbA_-CHqfnemG.js → css-DKjIhbA_-bArDG2fj.js} +2 -2
- package/dist/client/assets/{css-DKjIhbA_-CHqfnemG.js.map → css-DKjIhbA_-bArDG2fj.js.map} +1 -1
- package/dist/client/assets/{diff-BeVL1ItO.js → diff-BwuHSQEv.js} +3 -3
- package/dist/client/assets/{diff-BeVL1ItO.js.map → diff-BwuHSQEv.js.map} +1 -1
- package/dist/client/assets/{edge-CZci3foK-BGBPQtXV.js → edge-CZci3foK-Baej4bS3.js} +2 -2
- package/dist/client/assets/{edge-CZci3foK-BGBPQtXV.js.map → edge-CZci3foK-Baej4bS3.js.map} +1 -1
- package/dist/client/assets/{elixir-BFbWRTPN-D8ufalD-.js → elixir-BFbWRTPN-BWJLR11U.js} +2 -2
- package/dist/client/assets/{elixir-BFbWRTPN-D8ufalD-.js.map → elixir-BFbWRTPN-BWJLR11U.js.map} +1 -1
- package/dist/client/assets/{elm-BFCSOEGh-BWI2TEHg.js → elm-BFCSOEGh-CpyI6Neq.js} +2 -2
- package/dist/client/assets/{elm-BFCSOEGh-BWI2TEHg.js.map → elm-BFCSOEGh-CpyI6Neq.js.map} +1 -1
- package/dist/client/assets/{erb-C0EkZJvn-CGeW6FLC.js → erb-C0EkZJvn-Beo0qNuA.js} +2 -2
- package/dist/client/assets/{erb-C0EkZJvn-CGeW6FLC.js.map → erb-C0EkZJvn-Beo0qNuA.js.map} +1 -1
- package/dist/client/assets/{git-rebase-DBDs07B2-C__RuUYe.js → git-rebase-DBDs07B2-Br9li6by.js} +2 -2
- package/dist/client/assets/{git-rebase-DBDs07B2-C__RuUYe.js.map → git-rebase-DBDs07B2-Br9li6by.js.map} +1 -1
- package/dist/client/assets/{glimmer-js-oqYt1Bty-vrJ7QEYA.js → glimmer-js-oqYt1Bty-CI97juJO.js} +2 -2
- package/dist/client/assets/{glimmer-js-oqYt1Bty-vrJ7QEYA.js.map → glimmer-js-oqYt1Bty-CI97juJO.js.map} +1 -1
- package/dist/client/assets/{glimmer-ts-CjmgbZTn-CZyNz47e.js → glimmer-ts-CjmgbZTn-CFc8doTi.js} +2 -2
- package/dist/client/assets/{glimmer-ts-CjmgbZTn-CZyNz47e.js.map → glimmer-ts-CjmgbZTn-CFc8doTi.js.map} +1 -1
- package/dist/client/assets/{glsl-BqUMGrwT-BZCkTWpI.js → glsl-BqUMGrwT-BVf1nX6P.js} +2 -2
- package/dist/client/assets/{glsl-BqUMGrwT-BZCkTWpI.js.map → glsl-BqUMGrwT-BVf1nX6P.js.map} +1 -1
- package/dist/client/assets/{graphql-CEJryLGF-DDeR3BFq.js → graphql-CEJryLGF-CfFuHqok.js} +2 -2
- package/dist/client/assets/{graphql-CEJryLGF-DDeR3BFq.js.map → graphql-CEJryLGF-CfFuHqok.js.map} +1 -1
- package/dist/client/assets/{hack-DwBIwaGr-BeH7XNPv.js → hack-DwBIwaGr-BPMqrtdG.js} +2 -2
- package/dist/client/assets/{hack-DwBIwaGr-BeH7XNPv.js.map → hack-DwBIwaGr-BPMqrtdG.js.map} +1 -1
- package/dist/client/assets/{haml-BgD6GFV2-CCEflW5Z.js → haml-BgD6GFV2-Di-RgCFS.js} +2 -2
- package/dist/client/assets/{haml-BgD6GFV2-CCEflW5Z.js.map → haml-BgD6GFV2-Di-RgCFS.js.map} +1 -1
- package/dist/client/assets/{handlebars-DAEAtsmp-Dqwx0Kwh.js → handlebars-DAEAtsmp-BpuAuOPs.js} +2 -2
- package/dist/client/assets/{handlebars-DAEAtsmp-Dqwx0Kwh.js.map → handlebars-DAEAtsmp-BpuAuOPs.js.map} +1 -1
- package/dist/client/assets/{html-B63qAdeQ-BjlpEcyt.js → html-B63qAdeQ-Bp_oaeLi.js} +2 -2
- package/dist/client/assets/{html-B63qAdeQ-BjlpEcyt.js.map → html-B63qAdeQ-Bp_oaeLi.js.map} +1 -1
- package/dist/client/assets/{html-derivative-DliF0Izh-Dq9RKlA8.js → html-derivative-DliF0Izh-Bw81poXH.js} +2 -2
- package/dist/client/assets/{html-derivative-DliF0Izh-Dq9RKlA8.js.map → html-derivative-DliF0Izh-Bw81poXH.js.map} +1 -1
- package/dist/client/assets/{http-BPdteiK2-Cj-CMxKK.js → http-BPdteiK2-BBjGiW6O.js} +2 -2
- package/dist/client/assets/{http-BPdteiK2-Cj-CMxKK.js.map → http-BPdteiK2-BBjGiW6O.js.map} +1 -1
- package/dist/client/assets/{hurl-y6bQoMbn-DeXMgrrh.js → hurl-y6bQoMbn-CGKICVmL.js} +2 -2
- package/dist/client/assets/{hurl-y6bQoMbn-DeXMgrrh.js.map → hurl-y6bQoMbn-CGKICVmL.js.map} +1 -1
- package/dist/client/assets/{index-E-cqUXMY.js → index-fW9vMAFR.js} +3 -3
- package/dist/client/assets/{index-E-cqUXMY.js.map → index-fW9vMAFR.js.map} +1 -1
- package/dist/client/assets/{java-HDTZqoJ--BO-Jj0c5.js → java-HDTZqoJ--BeIYdX-t.js} +2 -2
- package/dist/client/assets/{java-HDTZqoJ--BO-Jj0c5.js.map → java-HDTZqoJ--BeIYdX-t.js.map} +1 -1
- package/dist/client/assets/{javascript-B8-PXjxO-CNlEZ_U-.js → javascript-B8-PXjxO-C4s21pIs.js} +2 -2
- package/dist/client/assets/{javascript-B8-PXjxO-CNlEZ_U-.js.map → javascript-B8-PXjxO-C4s21pIs.js.map} +1 -1
- package/dist/client/assets/{jinja-Li2helwk-CViXQJpU.js → jinja-Li2helwk-BCopqVIq.js} +2 -2
- package/dist/client/assets/{jinja-Li2helwk-CViXQJpU.js.map → jinja-Li2helwk-BCopqVIq.js.map} +1 -1
- package/dist/client/assets/{jison-D4pd2L4r-BoCbGSBL.js → jison-D4pd2L4r-CTDGIVzo.js} +2 -2
- package/dist/client/assets/{jison-D4pd2L4r-BoCbGSBL.js.map → jison-D4pd2L4r-CTDGIVzo.js.map} +1 -1
- package/dist/client/assets/{json-CHeq_08V-B5PDP4--.js → json-CHeq_08V-CdHymei0.js} +2 -2
- package/dist/client/assets/{json-CHeq_08V-B5PDP4--.js.map → json-CHeq_08V-CdHymei0.js.map} +1 -1
- package/dist/client/assets/{jsx-CTDAtxCE-YPyPyysB.js → jsx-CTDAtxCE-BKJFk7NT.js} +2 -2
- package/dist/client/assets/{jsx-CTDAtxCE-YPyPyysB.js.map → jsx-CTDAtxCE-BKJFk7NT.js.map} +1 -1
- package/dist/client/assets/{julia-B8HGxjvO-B7cty-kU.js → julia-B8HGxjvO-DbZcmZnq.js} +2 -2
- package/dist/client/assets/{julia-B8HGxjvO-B7cty-kU.js.map → julia-B8HGxjvO-DbZcmZnq.js.map} +1 -1
- package/dist/client/assets/{just-C1IY8eCo-BHAYLNfG.js → just-C1IY8eCo-DnzjlI44.js} +2 -2
- package/dist/client/assets/{just-C1IY8eCo-BHAYLNfG.js.map → just-C1IY8eCo-DnzjlI44.js.map} +1 -1
- package/dist/client/assets/{latex-CWjLpLhK-D7HTZDbj.js → latex-CWjLpLhK-BRJ7QYc1.js} +2 -2
- package/dist/client/assets/{latex-CWjLpLhK-D7HTZDbj.js.map → latex-CWjLpLhK-BRJ7QYc1.js.map} +1 -1
- package/dist/client/assets/{liquid-DO0vm52w-lvCobhXx.js → liquid-DO0vm52w-COb7GO7S.js} +2 -2
- package/dist/client/assets/{liquid-DO0vm52w-lvCobhXx.js.map → liquid-DO0vm52w-COb7GO7S.js.map} +1 -1
- package/dist/client/assets/{lua-rOZn354j-ODMkPdxs.js → lua-rOZn354j-B2CBXdd4.js} +2 -2
- package/dist/client/assets/{lua-rOZn354j-ODMkPdxs.js.map → lua-rOZn354j-B2CBXdd4.js.map} +1 -1
- package/dist/client/assets/{marko-CiZdnOV9-D9_XzPtX.js → marko-CiZdnOV9-CrlbLtbs.js} +2 -2
- package/dist/client/assets/{marko-CiZdnOV9-D9_XzPtX.js.map → marko-CiZdnOV9-CrlbLtbs.js.map} +1 -1
- package/dist/client/assets/{mdc-D1ADfxGi-B9kHGPaY.js → mdc-D1ADfxGi-5tloi5Ku.js} +2 -2
- package/dist/client/assets/{mdc-D1ADfxGi-B9kHGPaY.js.map → mdc-D1ADfxGi-5tloi5Ku.js.map} +1 -1
- package/dist/client/assets/{nginx-8KXIzHX2-8svBtm3U.js → nginx-8KXIzHX2-Y9gA2lux.js} +2 -2
- package/dist/client/assets/{nginx-8KXIzHX2-8svBtm3U.js.map → nginx-8KXIzHX2-Y9gA2lux.js.map} +1 -1
- package/dist/client/assets/{nim-CbBDSJf5-Ba_yd7rp.js → nim-CbBDSJf5-1Pnbq29n.js} +2 -2
- package/dist/client/assets/{nim-CbBDSJf5-Ba_yd7rp.js.map → nim-CbBDSJf5-1Pnbq29n.js.map} +1 -1
- package/dist/client/assets/{org-BlnOvN6p-Dvs9aaDc.js → org-BlnOvN6p-CUznrYZp.js} +2 -2
- package/dist/client/assets/{org-BlnOvN6p-Dvs9aaDc.js.map → org-BlnOvN6p-CUznrYZp.js.map} +1 -1
- package/dist/client/assets/{patterns-C3f2OP8b.js → patterns-Bc4kz9tn.js} +2 -2
- package/dist/client/assets/{patterns-C3f2OP8b.js.map → patterns-Bc4kz9tn.js.map} +1 -1
- package/dist/client/assets/{perl-CntHWu4k-2uoQgsvj.js → perl-CntHWu4k-BhS1nQNx.js} +2 -2
- package/dist/client/assets/{perl-CntHWu4k-2uoQgsvj.js.map → perl-CntHWu4k-BhS1nQNx.js.map} +1 -1
- package/dist/client/assets/{php-VF06KE26-Cy5BNgCu.js → php-VF06KE26-DTPzSju2.js} +2 -2
- package/dist/client/assets/{php-VF06KE26-Cy5BNgCu.js.map → php-VF06KE26-DTPzSju2.js.map} +1 -1
- package/dist/client/assets/{primitives-BnTwQBvt-Wa0KbeR5.js → primitives-BXWPLy2C-mP10m9L8.js} +2 -2
- package/dist/client/assets/{primitives-BnTwQBvt-Wa0KbeR5.js.map → primitives-BXWPLy2C-mP10m9L8.js.map} +1 -1
- package/dist/client/assets/{pug-DeZwH1tK-sFeyNqLq.js → pug-DeZwH1tK-B9No4pnM.js} +2 -2
- package/dist/client/assets/{pug-DeZwH1tK-sFeyNqLq.js.map → pug-DeZwH1tK-B9No4pnM.js.map} +1 -1
- package/dist/client/assets/{pullRequestReviewThreadReplay-CZK0ojth.js → pullRequestReviewThreadReplay-GsJkHDmp.js} +2 -2
- package/dist/client/assets/{pullRequestReviewThreadReplay-CZK0ojth.js.map → pullRequestReviewThreadReplay-GsJkHDmp.js.map} +1 -1
- package/dist/client/assets/{qml-CQhAR2tt-ghxlEb6L.js → qml-CQhAR2tt-XfN_XeIY.js} +2 -2
- package/dist/client/assets/{qml-CQhAR2tt-ghxlEb6L.js.map → qml-CQhAR2tt-XfN_XeIY.js.map} +1 -1
- package/dist/client/assets/{r-CGShpgkr-BnDtomVK.js → r-CGShpgkr-CSPdymwb.js} +2 -2
- package/dist/client/assets/{r-CGShpgkr-BnDtomVK.js.map → r-CGShpgkr-CSPdymwb.js.map} +1 -1
- package/dist/client/assets/{razor-CgB2QCs6-Du0sH0Qv.js → razor-CgB2QCs6-CpnEe0o4.js} +2 -2
- package/dist/client/assets/{razor-CgB2QCs6-Du0sH0Qv.js.map → razor-CgB2QCs6-CpnEe0o4.js.map} +1 -1
- package/dist/client/assets/{regexp-go_CdRjx-DZsiR-xj.js → regexp-go_CdRjx-CygQCdLU.js} +2 -2
- package/dist/client/assets/{regexp-go_CdRjx-DZsiR-xj.js.map → regexp-go_CdRjx-CygQCdLU.js.map} +1 -1
- package/dist/client/assets/{releaseRoutes-DLfDmfqe.js → releaseRoutes-Dk8MT0in.js} +2 -2
- package/dist/client/assets/{releaseRoutes-DLfDmfqe.js.map → releaseRoutes-Dk8MT0in.js.map} +1 -1
- package/dist/client/assets/{rst-CbWMI8ou-frdHzckK.js → rst-CbWMI8ou-GxcerOld.js} +2 -2
- package/dist/client/assets/{rst-CbWMI8ou-frdHzckK.js.map → rst-CbWMI8ou-GxcerOld.js.map} +1 -1
- package/dist/client/assets/{ruby-DsGwIs06-DFbM8woV.js → ruby-DsGwIs06-DFlD6ccB.js} +2 -2
- package/dist/client/assets/{ruby-DsGwIs06-DFbM8woV.js.map → ruby-DsGwIs06-DFlD6ccB.js.map} +1 -1
- package/dist/client/assets/{sas-DjxN8J4Z-Fo0Jhar_.js → sas-DjxN8J4Z-O-nhpylU.js} +2 -2
- package/dist/client/assets/{sas-DjxN8J4Z-Fo0Jhar_.js.map → sas-DjxN8J4Z-O-nhpylU.js.map} +1 -1
- package/dist/client/assets/{scss-bkiiULjK-jVZWZBbu.js → scss-bkiiULjK-BCCx5Vl_.js} +2 -2
- package/dist/client/assets/{scss-bkiiULjK-jVZWZBbu.js.map → scss-bkiiULjK-BCCx5Vl_.js.map} +1 -1
- package/dist/client/assets/{shellscript-Cuh1SIPr-Dbirzu6D.js → shellscript-Cuh1SIPr-CHsx4a67.js} +2 -2
- package/dist/client/assets/{shellscript-Cuh1SIPr-Dbirzu6D.js.map → shellscript-Cuh1SIPr-CHsx4a67.js.map} +1 -1
- package/dist/client/assets/{shellsession-C4UOwxb7-7CJWgYuy.js → shellsession-C4UOwxb7-D6bkncqE.js} +2 -2
- package/dist/client/assets/{shellsession-C4UOwxb7-7CJWgYuy.js.map → shellsession-C4UOwxb7-D6bkncqE.js.map} +1 -1
- package/dist/client/assets/{soy-CeGFXpLT-D9dc77z6.js → soy-CeGFXpLT-9HOh-Ygc.js} +2 -2
- package/dist/client/assets/{soy-CeGFXpLT-D9dc77z6.js.map → soy-CeGFXpLT-9HOh-Ygc.js.map} +1 -1
- package/dist/client/assets/{sql-qDYmMTO1-uEsSySDj.js → sql-qDYmMTO1-CEdQ0v3n.js} +2 -2
- package/dist/client/assets/{sql-qDYmMTO1-uEsSySDj.js.map → sql-qDYmMTO1-CEdQ0v3n.js.map} +1 -1
- package/dist/client/assets/{stata-Dzus_rwP-BH7vam06.js → stata-Dzus_rwP-BuG1u1jJ.js} +2 -2
- package/dist/client/assets/{stata-Dzus_rwP-BH7vam06.js.map → stata-Dzus_rwP-BuG1u1jJ.js.map} +1 -1
- package/dist/client/assets/{surrealql-DmTrf8uR-CWkOYJpX.js → surrealql-DmTrf8uR-CSBOHXCO.js} +2 -2
- package/dist/client/assets/{surrealql-DmTrf8uR-CWkOYJpX.js.map → surrealql-DmTrf8uR-CSBOHXCO.js.map} +1 -1
- package/dist/client/assets/{svelte-CWlRonoS-BlW_D3qk.js → svelte-CWlRonoS-DgXWzKbz.js} +2 -2
- package/dist/client/assets/{svelte-CWlRonoS-BlW_D3qk.js.map → svelte-CWlRonoS-DgXWzKbz.js.map} +1 -1
- package/dist/client/assets/{templ-EuFg1gKs-BPpn997C.js → templ-EuFg1gKs-Gm_jX91q.js} +2 -2
- package/dist/client/assets/{templ-EuFg1gKs-BPpn997C.js.map → templ-EuFg1gKs-Gm_jX91q.js.map} +1 -1
- package/dist/client/assets/{tex-Cbbx1SXS-BYnCXVUj.js → tex-Cbbx1SXS-UHGl4s7W.js} +2 -2
- package/dist/client/assets/{tex-Cbbx1SXS-BYnCXVUj.js.map → tex-Cbbx1SXS-UHGl4s7W.js.map} +1 -1
- package/dist/client/assets/{ts-tags-DOHpIWV2-DGGUehb1.js → ts-tags-DOHpIWV2-BFeQ2_qS.js} +2 -2
- package/dist/client/assets/{ts-tags-DOHpIWV2-DGGUehb1.js.map → ts-tags-DOHpIWV2-BFeQ2_qS.js.map} +1 -1
- package/dist/client/assets/{tsx-DmRL3u_2-BuphZRb1.js → tsx-DmRL3u_2-XbmtCpCA.js} +2 -2
- package/dist/client/assets/{tsx-DmRL3u_2-BuphZRb1.js.map → tsx-DmRL3u_2-XbmtCpCA.js.map} +1 -1
- package/dist/client/assets/{twig-BzcHspK1-BHSYcxkL.js → twig-BzcHspK1-taTu1Drs.js} +2 -2
- package/dist/client/assets/{twig-BzcHspK1-BHSYcxkL.js.map → twig-BzcHspK1-taTu1Drs.js.map} +1 -1
- package/dist/client/assets/{typescript-BYTx4UxO-BWghQV1V.js → typescript-BYTx4UxO-kK2df6yp.js} +2 -2
- package/dist/client/assets/{typescript-BYTx4UxO-BWghQV1V.js.map → typescript-BYTx4UxO-kK2df6yp.js.map} +1 -1
- package/dist/client/assets/{typst-BrfC91e7-D-qhUyZC.js → typst-BrfC91e7-D77xpI_O.js} +2 -2
- package/dist/client/assets/{typst-BrfC91e7-D-qhUyZC.js.map → typst-BrfC91e7-D77xpI_O.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceDefaultLanding-DaE2YGNd.js → useWorkspaceDefaultLanding-CHavgP2x.js} +2 -2
- package/dist/client/assets/{useWorkspaceDefaultLanding-DaE2YGNd.js.map → useWorkspaceDefaultLanding-CHavgP2x.js.map} +1 -1
- package/dist/client/assets/{vue-B92PIQFm-CoGWLOqg.js → vue-B92PIQFm-CxfWUGFO.js} +2 -2
- package/dist/client/assets/{vue-B92PIQFm-CoGWLOqg.js.map → vue-B92PIQFm-CxfWUGFO.js.map} +1 -1
- package/dist/client/assets/{vue-html-EDHI-aeE-CC2k9uRQ.js → vue-html-EDHI-aeE-uPrIvgh4.js} +2 -2
- package/dist/client/assets/{vue-html-EDHI-aeE-CC2k9uRQ.js.map → vue-html-EDHI-aeE-uPrIvgh4.js.map} +1 -1
- package/dist/client/assets/{vue-vine-CmMdgoEY-_zZ7pZf1.js → vue-vine-CmMdgoEY-eCdJx6AS.js} +2 -2
- package/dist/client/assets/{vue-vine-CmMdgoEY-_zZ7pZf1.js.map → vue-vine-CmMdgoEY-eCdJx6AS.js.map} +1 -1
- package/dist/client/assets/{workspaceEntityRoutes-BUuMTdMr.js → workspaceEntityRoutes-DeWAeNbF.js} +2 -2
- package/dist/client/assets/{workspaceEntityRoutes-BUuMTdMr.js.map → workspaceEntityRoutes-DeWAeNbF.js.map} +1 -1
- package/dist/client/assets/{workspaceScrollCapture-DllLzjf8.js → workspaceScrollCapture-Cr6uBq-z.js} +2 -2
- package/dist/client/assets/{workspaceScrollCapture-DllLzjf8.js.map → workspaceScrollCapture-Cr6uBq-z.js.map} +1 -1
- package/dist/client/assets/{xml-Bz9Nzp99-B0ZZBRFq.js → xml-Bz9Nzp99-DniaQ-4l.js} +2 -2
- package/dist/client/assets/{xml-Bz9Nzp99-B0ZZBRFq.js.map → xml-Bz9Nzp99-DniaQ-4l.js.map} +1 -1
- package/dist/client/assets/{xsl-D0pOnfMq-DJSuRtxm.js → xsl-D0pOnfMq-DIsX5RIx.js} +2 -2
- package/dist/client/assets/{xsl-D0pOnfMq-DJSuRtxm.js.map → xsl-D0pOnfMq-DIsX5RIx.js.map} +1 -1
- package/dist/client/assets/{yaml-DKDHNCIP-CkHFy1FE.js → yaml-DKDHNCIP-DZpgjsVZ.js} +2 -2
- package/dist/client/assets/{yaml-DKDHNCIP-CkHFy1FE.js.map → yaml-DKDHNCIP-DZpgjsVZ.js.map} +1 -1
- package/dist/client/index.html +1 -1
- package/package.json +8 -8
- package/dist/client/assets/WorkspaceHomeLink-Vs72lXwi.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReleaseRoute-C80uadO-.js","names":["Effect.gen","Crypto.Crypto","Schema.decodeUnknownEffect","RelationshipRepairProposalIdSchema","Effect.runPromise","Effect.provide","FetchHttpClient.layer","BrowserCrypto.layer","actions","useRef","useState","Button","Text","StatePanel","StateLabel","Surface","styles","Effect.gen","Crypto.Crypto","Schema.decodeUnknownEffect","RelationshipRepairReviewIdSchema","Effect.runPromise","Effect.provide","FetchHttpClient.layer","BrowserCrypto.layer","Predicate.isTagged","ignoreSessionExpired","DateTime.Order","useState","useRef","useCallback","Person","styles","DateTime.formatUtc","useState","useRef","Surface","StateLabel","Text","_Fragment","StatePanel","Button","Field","Skeleton","useRef","styles","StatePanel","Button","Surface","ServiceMark","Text","StateLabel","AgentContextButton","PeopleStrip","useState","ReleasePreview","StageRail","ReleaseRelay","FreshnessStamp","Verdict","__toESM","useParams","useOutletContext","useLocation","useNavigate","V","Je","Le","He","ve","useViewTransitionState","Link","workspaceItemsPath","useBrowserSession","releaseActiveWorkPath","releaseAgentPath","releasePreviewPath","require_jsx_runtime","releaseParentPath","releaseFullPath","lt","R","We","fe","I","B","Gn","Qn","Un","y","j","runPromise","Order","isTagged","decodeUnknownEffect","formatUtc","provide","gen","RelationshipRepairProposalId","RelationshipRepairReviewId","Crypto","layer","layer$1","makeControlCenterApiClient","readReleaseOrigin","releaseTransitionNames","resolveReleaseOrigin","decodeReleaseRouteId","releaseOriginHref","makeAuthenticatedMutationClient","loadReleaseEnvironmentSlices","ReleaseWorkset","usePrefersReducedReleaseMotion","useCompactReleasePreview","import_react","require_react","makeRelationshipRepairProposalId","uuid","browserRelationshipRepairCandidateTransport","draft","environmentId","RelationshipRepairCandidatePicker_module_default","import_jsx_runtime","titleCase","value","candidateTitle","candidate","aggregateCandidatePages","seen","candidates","pages","page","identity","truncated","PickerResult","result","stateTag","announce","RelationshipRepairCandidatePicker","state","setState","request","actorId","session","authorityScope","environmentScopeKey","environmentIds","releaseId","run","abort","effect","onSuccess","onFailure","discover","transport","signal","select","refreshCandidate","item","staleCandidate","create","pendingProposalId","proposalId","onCreated","isCreating","makeRelationshipRepairReviewId","browserRelationshipRepairTransport","isUnauthorizedFailure","ignoreSessionExpired$1","proposalOrder","proposedAtOrder","right","left","aggregateProposalPages","proposalsById","applicationsByProposalId","proposal","application","orderedProposals","proposals","applications","useRelationshipRepairProposals","requestRevision","setRequestRevision","actionAbort","busyProposal","pendingReviews","stateRef","sessionKey","failure","onSessionExpired","currentState","beginAction","current","finishAction","review","pending","intent","decision","rationale","revision","RelationshipRepairPanel_module_default","ignoreSessionExpired","shortId","id","isSameActor","actorPerson","collaborator","release","actor","ActorIdentity","role","statusPresentation","formattedTime","timestamp","ProposalRow","isReviewing","setIsReviewing","setRationale","announcement","setAnnouncement","statusRef","status","canReview","mutationsEnabled","canApply","reviewRationale","onReview","apply","onApply","actionFailed","onRetry","event","controlProps","isGloballyBusy","isBusy","LoadingPanel","RelationshipRepairPanelView","sessionScopeKey","relationshipRepairSessionAccess","RelationshipRepairPanelContent","access","browserSessionState","controller","RelationshipRepairPanel","browserSession","ReleaseRoute_module_default","selectRelease","routeReleaseId","context","ReleaseNotFound","workspaceId","ReleaseRouteLoading","PortfolioOverviewView","ReleaseAction","location","action","ReleaseEvidence","releaseContextLabel","ReleaseAgentEntry","navigate","prefersReducedMotion","CompleteCollaborators","ReleasePreviewContent","isCompact","exit","setExit","isOpen","setIsOpen","resolvedOrigin","selection","originHref","fullPath","agentPath","previewPath","isPreviewTransitioning","isFullTransitioning","isAgentTransitioning","transitionNames","requestOrigin","open","ReleasePreviewRoute","params","FullRelease","headingRef","origin","originLabel","ReleaseFullRoute"],"sources":["../../../src/client/releases/relationshipRepairCandidateTransport.ts","../../../src/client/releases/RelationshipRepairCandidatePicker.module.css","../../../src/client/releases/RelationshipRepairCandidatePicker.tsx","../../../src/client/releases/relationshipRepairTransport.ts","../../../src/client/releases/useRelationshipRepairProposals.ts","../../../src/client/releases/RelationshipRepairPanel.module.css","../../../src/client/releases/RelationshipRepairPanel.tsx","../../../src/client/releases/ReleaseRoute.module.css","../../../src/client/releases/ReleaseRoute.tsx"],"sourcesContent":["import * as BrowserCrypto from \"@effect/platform-browser/BrowserCrypto\"\nimport * as Crypto from \"effect/Crypto\"\nimport * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Schema from \"effect/Schema\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { RelationshipRepairCandidates, RelationshipRepairProposalDraft } from \"../../api/deliveryGraph.js\"\nimport type { LedgerRevision } from \"../../domain/deliveryGraph.js\"\nimport type {\n EnvironmentId,\n RelationshipId,\n RelationshipRepairProposalId,\n ReleaseId\n} from \"../../domain/identifiers.js\"\nimport { RelationshipRepairProposalId as RelationshipRepairProposalIdSchema } from \"../../domain/identifiers.js\"\nimport type { RelationshipRepairProposal } from \"../../domain/relationshipRepair.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\n/** Generate one canonical proposal identity at the browser mutation boundary. */\nexport const makeRelationshipRepairProposalId = Effect.gen(function*() {\n const cryptoService = yield* Crypto.Crypto\n const uuid = yield* cryptoService.randomUUIDv7\n return yield* Schema.decodeUnknownEffect(RelationshipRepairProposalIdSchema)(uuid)\n})\n\nexport interface RelationshipRepairCandidateTransport {\n readonly create: (\n releaseId: ReleaseId,\n draft: RelationshipRepairProposalDraft,\n proposalId: RelationshipRepairProposalId,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposal>\n readonly draft: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n relationshipId: RelationshipId,\n revision: LedgerRevision,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposalDraft>\n readonly list: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<RelationshipRepairCandidates>\n readonly makeProposalId: () => Promise<RelationshipRepairProposalId>\n}\n\n/** Generated-client transport for owner-governed repair candidate creation. */\nexport const browserRelationshipRepairCandidateTransport: RelationshipRepairCandidateTransport = {\n create: (releaseId, draft, proposalId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.deliveryGraph.createRepairProposal({\n params: {\n releaseId,\n relationshipId: draft.precondition.relationshipId\n },\n payload: {\n proposalId,\n environmentId: draft.candidate.impact.environmentId,\n expectedRevision: draft.precondition.expectedRevision,\n disposition: draft.proposal.disposition,\n rationale: draft.proposal.rationale\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n draft: (releaseId, environmentId, relationshipId, revision, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.repairProposalDraft({\n params: { releaseId, relationshipId },\n query: environmentId === null ? { revision } : { environmentId, revision }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n list: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.repairCandidates({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n makeProposalId: () => Effect.runPromise(makeRelationshipRepairProposalId.pipe(Effect.provide(BrowserCrypto.layer)))\n}\n",".candidates,\n.draft {\n display: grid;\n}\n\n.candidates {\n gap: var(--rly-space-8);\n}\n\n.candidateHeader,\n.draftHeader,\n.actions {\n align-items: center;\n display: flex;\n justify-content: space-between;\n}\n\n.candidate {\n align-items: center;\n background: transparent;\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-control);\n color: var(--rly-color-text-1);\n cursor: pointer;\n display: flex;\n font: inherit;\n gap: var(--rly-space-16);\n justify-content: space-between;\n padding: var(--rly-space-16);\n text-align: start;\n}\n\n.candidate:hover,\n.candidate:focus-visible {\n background: var(--rly-color-surface-2);\n border-color: var(--rly-color-border-2);\n outline: none;\n}\n\n.candidate > span:first-child {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.candidate strong {\n font: var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height)\n var(--rly-type-body-font);\n text-transform: capitalize;\n}\n\n.candidate small {\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.draft {\n gap: var(--rly-space-16);\n padding: var(--rly-space-20);\n}\n\n.draftHeader {\n gap: var(--rly-space-16);\n}\n\n.actions {\n justify-content: flex-end;\n gap: var(--rly-space-8);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .draft {\n animation: reveal-draft 160ms ease-out both;\n }\n}\n\n@keyframes reveal-draft {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n}\n","import { Button, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement, type ReactNode, useEffect, useRef, useState } from \"react\"\n\nimport type {\n RelationshipRepairCandidate,\n RelationshipRepairCandidates,\n RelationshipRepairProposalDraft\n} from \"../../api/deliveryGraph.js\"\nimport { MAXIMUM_RELEASE_SLICE_RECORDS } from \"../../api/deliveryGraph.js\"\nimport type { SessionSummary } from \"../../api/session.js\"\nimport type { EnvironmentId, RelationshipRepairProposalId, ReleaseId } from \"../../domain/identifiers.js\"\nimport { loadReleaseEnvironmentSlices } from \"./loadReleaseEnvironmentSlices.js\"\nimport {\n browserRelationshipRepairCandidateTransport,\n type RelationshipRepairCandidateTransport\n} from \"./relationshipRepairCandidateTransport.js\"\nimport styles from \"./RelationshipRepairCandidatePicker.module.css\"\n\ntype PickerState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"load-failed\" }\n | { readonly _tag: \"ready\"; readonly page: RelationshipRepairCandidates }\n | { readonly _tag: \"drafting\"; readonly page: RelationshipRepairCandidates }\n | {\n readonly _tag: \"draft-failed\"\n readonly candidate: RelationshipRepairCandidate\n readonly page: RelationshipRepairCandidates\n }\n | {\n readonly _tag: \"draft\"\n readonly draft: RelationshipRepairProposalDraft\n readonly page: RelationshipRepairCandidates\n }\n | {\n readonly _tag: \"creating\"\n readonly draft: RelationshipRepairProposalDraft\n readonly page: RelationshipRepairCandidates\n readonly proposalId: RelationshipRepairProposalId | null\n }\n | {\n readonly _tag: \"create-failed\"\n readonly draft: RelationshipRepairProposalDraft\n readonly page: RelationshipRepairCandidates\n readonly proposalId: RelationshipRepairProposalId | null\n }\n | { readonly _tag: \"created\" }\n\nconst titleCase = (value: string): string => value.replaceAll(\"-\", \" \")\n\nconst candidateTitle = (candidate: RelationshipRepairCandidate): string =>\n `${titleCase(candidate.relationship.sourceNodeKind)} → ${titleCase(candidate.relationship.targetNodeKind)}`\n\nconst aggregateCandidatePages = (\n releaseId: ReleaseId,\n pages: ReadonlyArray<RelationshipRepairCandidates>\n): RelationshipRepairCandidates => {\n const seen = new Set<string>()\n const candidates: Array<RelationshipRepairCandidate> = []\n for (const candidate of pages.flatMap((page) => page.candidates)) {\n const identity = `${candidate.relationship.relationshipId}:${candidate.relationship.revision}`\n if (seen.has(identity)) continue\n seen.add(identity)\n candidates.push(candidate)\n }\n return {\n releaseId,\n environmentId: null,\n truncated: pages.some(({ truncated }) => truncated) || candidates.length > MAXIMUM_RELEASE_SLICE_RECORDS,\n candidates: candidates.slice(0, MAXIMUM_RELEASE_SLICE_RECORDS)\n }\n}\n\nconst PickerResult = ({\n announce = false,\n children,\n stateTag\n}: {\n readonly announce?: boolean\n readonly children: ReactNode\n readonly stateTag: PickerState[\"_tag\"]\n}): ReactElement => {\n const result = useRef<HTMLDivElement>(null)\n useEffect(() => result.current?.focus(), [stateTag])\n return (\n <div aria-live={announce ? \"polite\" : undefined} ref={result} role={announce ? \"status\" : undefined} tabIndex={-1}>\n {children}\n </div>\n )\n}\n\ninterface RelationshipRepairCandidatePickerProps {\n readonly environmentIds: ReadonlyArray<EnvironmentId>\n readonly onCreated: () => void\n readonly releaseId: ReleaseId\n readonly session: SessionSummary\n readonly transport?: RelationshipRepairCandidateTransport\n}\n\n/** Discover one incomplete relationship, preview its immutable draft, then create a governed proposal. */\nexport const RelationshipRepairCandidatePicker = ({\n environmentIds,\n onCreated,\n releaseId,\n session,\n transport = browserRelationshipRepairCandidateTransport\n}: RelationshipRepairCandidatePickerProps): ReactElement | null => {\n const [state, setState] = useState<PickerState>({ _tag: \"idle\" })\n const request = useRef<AbortController | null>(null)\n const actorId = session.actor._tag === \"human\" ? session.actor.personId : session.actor.agentId\n const authorityScope = `${session.sessionId}:${session.workspaceId}:${session.permission}:${session.actor._tag}:${actorId}`\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n request.current?.abort()\n request.current = null\n setState({ _tag: \"idle\" })\n return () => request.current?.abort()\n }, [authorityScope, environmentScopeKey, releaseId])\n\n if (session.permission !== \"workspace-owner\") return null\n\n const run = async <Value,>(\n effect: (signal: AbortSignal) => Promise<Value>,\n onSuccess: (value: Value) => void,\n onFailure: () => void\n ): Promise<void> => {\n request.current?.abort()\n const abort = new AbortController()\n request.current = abort\n try {\n const value = await effect(abort.signal)\n if (!abort.signal.aborted && request.current === abort) onSuccess(value)\n } catch {\n if (!abort.signal.aborted && request.current === abort) onFailure()\n } finally {\n if (request.current === abort) request.current = null\n }\n }\n\n const discover = (): void => {\n setState({ _tag: \"loading\" })\n void run(\n (signal) =>\n loadReleaseEnvironmentSlices(environmentIds, (environmentId) =>\n transport.list(releaseId, environmentId, signal)\n ),\n (pages) => setState({ _tag: \"ready\", page: aggregateCandidatePages(releaseId, pages) }),\n () => setState({ _tag: \"load-failed\" })\n )\n }\n\n const select = (candidate: RelationshipRepairCandidate, page: RelationshipRepairCandidates): void => {\n setState({ _tag: \"drafting\", page })\n void run(\n (signal) =>\n transport.draft(\n releaseId,\n candidate.impact.environmentId,\n candidate.relationship.relationshipId,\n candidate.relationship.revision,\n signal\n ),\n (draft) => setState({ _tag: \"draft\", draft, page }),\n () => setState({ _tag: \"draft-failed\", candidate, page })\n )\n }\n\n const refreshCandidate = (staleCandidate: RelationshipRepairCandidate): void => {\n setState({ _tag: \"loading\" })\n void run(\n (signal) =>\n loadReleaseEnvironmentSlices(environmentIds, (environmentId) =>\n transport.list(releaseId, environmentId, signal)\n ),\n (pages) => {\n const page = aggregateCandidatePages(releaseId, pages)\n const candidate = page.candidates.find(\n (item) => item.relationship.relationshipId === staleCandidate.relationship.relationshipId\n )\n if (candidate === undefined) {\n setState({ _tag: \"ready\", page })\n return\n }\n select(candidate, page)\n },\n () => setState({ _tag: \"load-failed\" })\n )\n }\n\n const create = (\n draft: RelationshipRepairProposalDraft,\n page: RelationshipRepairCandidates,\n pendingProposalId: RelationshipRepairProposalId | null = null\n ): void => {\n request.current?.abort()\n const abort = new AbortController()\n request.current = abort\n setState({ _tag: \"creating\", draft, page, proposalId: pendingProposalId })\n void (async () => {\n let proposalId = pendingProposalId\n try {\n proposalId ??= await transport.makeProposalId()\n if (abort.signal.aborted || request.current !== abort) return\n setState({ _tag: \"creating\", draft, page, proposalId })\n await transport.create(releaseId, draft, proposalId, abort.signal)\n if (abort.signal.aborted || request.current !== abort) return\n setState({ _tag: \"created\" })\n onCreated()\n } catch {\n if (!abort.signal.aborted && request.current === abort) {\n setState({ _tag: \"create-failed\", draft, page, proposalId })\n }\n } finally {\n if (request.current === abort) request.current = null\n }\n })()\n }\n\n if (state._tag === \"idle\") {\n return <Button onClick={discover}>Find repair candidates</Button>\n }\n if (state._tag === \"loading\") {\n return (\n <PickerResult announce stateTag={state._tag}>\n <Text tone=\"secondary\">Finding incomplete relationships…</Text>\n </PickerResult>\n )\n }\n if (state._tag === \"load-failed\") {\n return (\n <PickerResult stateTag={state._tag}>\n <StatePanel\n action={<Button onClick={discover}>Try again</Button>}\n announce=\"assertive\"\n description=\"Candidate discovery did not change the release.\"\n title=\"Could not find candidates\"\n tone=\"caution\"\n />\n </PickerResult>\n )\n }\n if (state._tag === \"created\") {\n return (\n <PickerResult announce stateTag={state._tag}>\n <StateLabel label=\"Proposal created\" tone=\"positive\" />\n </PickerResult>\n )\n }\n if (state._tag === \"drafting\") {\n return (\n <PickerResult announce stateTag={state._tag}>\n <Text tone=\"secondary\">Preparing an exact proposal…</Text>\n </PickerResult>\n )\n }\n if (state._tag === \"draft-failed\") {\n return (\n <PickerResult stateTag={state._tag}>\n <StatePanel\n action={<Button onClick={() => refreshCandidate(state.candidate)}>Refresh candidate</Button>}\n announce=\"assertive\"\n description=\"The relationship may have changed since discovery.\"\n title=\"Candidate is stale\"\n tone=\"caution\"\n />\n </PickerResult>\n )\n }\n if (state._tag === \"draft\" || state._tag === \"creating\" || state._tag === \"create-failed\") {\n const isCreating = state._tag === \"creating\"\n return (\n <PickerResult announce={isCreating} stateTag={state._tag}>\n <Surface as=\"section\" className={styles.draft} padding=\"none\" tone=\"secondary\">\n <div className={styles.draftHeader}>\n <div>\n <Text as=\"h4\" variant=\"card-title\">\n {titleCase(state.draft.proposal.disposition)} relationship\n </Text>\n <Text tone=\"tertiary\" variant=\"meta\">\n r{state.draft.precondition.expectedRevision} → r{state.draft.precondition.expectedRevision + 1}\n </Text>\n </div>\n <StateLabel label=\"Proposal preview\" size=\"compact\" tone=\"neutral\" />\n </div>\n <Text>{state.draft.proposal.rationale}</Text>\n {state._tag === \"create-failed\" ? (\n <Text role=\"alert\" tone=\"secondary\">\n The relationship changed or the proposal was not recorded. Refresh the candidate before retrying.\n </Text>\n ) : null}\n <div className={styles.actions}>\n <Button disabled={isCreating} onClick={() => setState({ _tag: \"ready\", page: state.page })} variant=\"quiet\">\n Back\n </Button>\n <Button\n loading={isCreating}\n onClick={() => create(state.draft, state.page, state._tag === \"create-failed\" ? state.proposalId : null)}\n variant=\"primary\"\n >\n Create proposal\n </Button>\n </div>\n </Surface>\n </PickerResult>\n )\n }\n\n if (state.page.candidates.length === 0) {\n return (\n <PickerResult announce stateTag={state._tag}>\n <Text tone=\"secondary\">No incomplete relationships need an owner decision.</Text>\n </PickerResult>\n )\n }\n return (\n <PickerResult stateTag={state._tag}>\n <div className={styles.candidates}>\n <div className={styles.candidateHeader}>\n <Text tone=\"secondary\">\n {state.page.candidates.length}\n {state.page.truncated ? \"+\" : \"\"} incomplete relationship\n {state.page.candidates.length === 1 ? \"\" : \"s\"}\n </Text>\n <Button onClick={() => setState({ _tag: \"idle\" })} variant=\"quiet\">\n Close\n </Button>\n </div>\n {state.page.candidates.map((candidate) => (\n <button\n className={styles.candidate}\n key={candidate.relationship.relationshipId}\n onClick={() => select(candidate, state.page)}\n type=\"button\"\n >\n <span>\n <strong>{candidateTitle(candidate)}</strong>\n <small>{candidate.explanation}</small>\n </span>\n <span aria-hidden=\"true\">→</span>\n </button>\n ))}\n </div>\n </PickerResult>\n )\n}\n","import * as BrowserCrypto from \"@effect/platform-browser/BrowserCrypto\"\nimport * as Crypto from \"effect/Crypto\"\nimport * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Schema from \"effect/Schema\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type {\n ApplyRelationshipRepairProposalResponse,\n RelationshipRepairProposalList\n} from \"../../api/deliveryGraph.js\"\nimport type {\n EnvironmentId,\n RelationshipRepairProposalId,\n RelationshipRepairReviewId,\n ReleaseId\n} from \"../../domain/identifiers.js\"\nimport { RelationshipRepairReviewId as RelationshipRepairReviewIdSchema } from \"../../domain/identifiers.js\"\nimport type { RelationshipRepairProposal, RelationshipRepairReviewDecision } from \"../../domain/relationshipRepair.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\n/** Generate a browser-native UUID v7 without weakening the public identifier contract. */\nexport const makeRelationshipRepairReviewId = Effect.gen(function*() {\n const cryptoService = yield* Crypto.Crypto\n const uuid = yield* cryptoService.randomUUIDv7\n return yield* Schema.decodeUnknownEffect(RelationshipRepairReviewIdSchema)(uuid)\n})\n\nexport interface RelationshipRepairTransport {\n readonly apply: (\n proposalId: RelationshipRepairProposalId,\n signal: AbortSignal\n ) => Promise<ApplyRelationshipRepairProposalResponse>\n readonly list: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposalList>\n readonly makeReviewId: () => Promise<RelationshipRepairReviewId>\n readonly review: (\n proposalId: RelationshipRepairProposalId,\n reviewId: RelationshipRepairReviewId,\n decision: RelationshipRepairReviewDecision,\n rationale: string,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposal>\n}\n\n/** Generated-client transport for the release repair decision ledger. */\nexport const browserRelationshipRepairTransport: RelationshipRepairTransport = {\n apply: (proposalId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.deliveryGraph.applyRepairProposal({ params: { proposalId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n list: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.listRepairProposals({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n makeReviewId: () => Effect.runPromise(makeRelationshipRepairReviewId.pipe(Effect.provide(BrowserCrypto.layer))),\n review: (proposalId, reviewId, decision, rationale, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.deliveryGraph.reviewRepairProposal({\n params: { proposalId },\n payload: {\n reviewId,\n decision,\n rationale\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n","import * as DateTime from \"effect/DateTime\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { MAXIMUM_REPAIR_PROPOSALS, type RelationshipRepairProposalList } from \"../../api/deliveryGraph.js\"\nimport type {\n EnvironmentId,\n RelationshipRepairProposalId,\n RelationshipRepairReviewId,\n ReleaseId\n} from \"../../domain/identifiers.js\"\nimport type {\n RelationshipRepairApplication,\n RelationshipRepairProposal,\n RelationshipRepairReviewDecision\n} from \"../../domain/relationshipRepair.js\"\nimport { loadReleaseEnvironmentSlices } from \"./loadReleaseEnvironmentSlices.js\"\nimport { browserRelationshipRepairTransport, type RelationshipRepairTransport } from \"./relationshipRepairTransport.js\"\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\nconst ignoreSessionExpired = (): void => undefined\n\nexport type RelationshipRepairPanelState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly actionFailure: RelationshipRepairProposalId | null\n readonly applications: ReadonlyMap<RelationshipRepairProposalId, RelationshipRepairApplication>\n readonly busyProposalId: RelationshipRepairProposalId | null\n readonly environmentScopeKey: string\n readonly page: RelationshipRepairProposalList\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n\nexport interface RelationshipRepairProposalController {\n readonly apply: (proposalId: RelationshipRepairProposalId) => Promise<boolean>\n readonly retry: () => void\n readonly review: (\n proposalId: RelationshipRepairProposalId,\n decision: RelationshipRepairReviewDecision,\n rationale: string\n ) => Promise<boolean>\n readonly state: RelationshipRepairPanelState\n}\n\ninterface PendingReviewIntent {\n readonly decision: RelationshipRepairReviewDecision\n readonly rationale: string\n readonly reviewId: RelationshipRepairReviewId\n}\n\nconst proposalOrder = (left: RelationshipRepairProposal, right: RelationshipRepairProposal): number => {\n const proposedAtOrder = DateTime.Order(right.proposedAt, left.proposedAt)\n return proposedAtOrder === 0 ? right.proposalId.localeCompare(left.proposalId) : proposedAtOrder\n}\n\nconst aggregateProposalPages = (\n releaseId: ReleaseId,\n pages: ReadonlyArray<RelationshipRepairProposalList>\n): RelationshipRepairProposalList => {\n const proposalsById = new Map<RelationshipRepairProposalId, RelationshipRepairProposal>()\n const applicationsByProposalId = new Map<RelationshipRepairProposalId, RelationshipRepairApplication>()\n for (const page of pages) {\n for (const proposal of page.proposals) proposalsById.set(proposal.proposalId, proposal)\n for (const application of page.applications) {\n applicationsByProposalId.set(application.proposalId, application)\n }\n }\n const orderedProposals = [...proposalsById.values()].sort(proposalOrder)\n const proposals = orderedProposals.slice(0, MAXIMUM_REPAIR_PROPOSALS)\n const applications = proposals.flatMap((proposal): ReadonlyArray<RelationshipRepairApplication> => {\n const application = applicationsByProposalId.get(proposal.proposalId)\n return application === undefined ? [] : [application]\n })\n return {\n releaseId,\n environmentId: null,\n status: null,\n truncated: pages.some(({ truncated }) => truncated) || orderedProposals.length > MAXIMUM_REPAIR_PROPOSALS,\n proposals,\n applications\n }\n}\n\n/** Keep one release's proposal ledger current after explicit review and apply actions. */\nexport const useRelationshipRepairProposals = (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n sessionKey: string | null,\n transport: RelationshipRepairTransport = browserRelationshipRepairTransport,\n onSessionExpired: (sessionKey: string) => void = ignoreSessionExpired\n): RelationshipRepairProposalController => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<RelationshipRepairPanelState>({ _tag: \"idle\" })\n const actionAbort = useRef<AbortController | null>(null)\n const busyProposal = useRef<RelationshipRepairProposalId | null>(null)\n const pendingReviews = useRef(new Map<RelationshipRepairProposalId, PendingReviewIntent>())\n const stateRef = useRef(state)\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n actionAbort.current?.abort()\n actionAbort.current = null\n busyProposal.current = null\n pendingReviews.current.clear()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\" })\n loadReleaseEnvironmentSlices(\n environmentIds,\n (environmentId) => transport.list(releaseId, environmentId, abort.signal)\n ).then(\n (pages) => {\n if (!abort.signal.aborted) {\n const page = aggregateProposalPages(releaseId, pages)\n setState({\n _tag: \"ready\",\n actionFailure: null,\n applications: new Map(page.applications.map((application) => [application.proposalId, application])),\n busyProposalId: null,\n environmentScopeKey,\n page,\n releaseId,\n sessionKey\n })\n }\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n }\n )\n return () => abort.abort()\n }, [environmentScopeKey, onSessionExpired, releaseId, requestRevision, sessionKey, transport])\n\n useEffect(() => () => actionAbort.current?.abort(), [])\n\n const currentState = state._tag === \"ready\" &&\n (state.environmentScopeKey !== environmentScopeKey ||\n state.releaseId !== releaseId ||\n state.sessionKey !== sessionKey)\n ? { _tag: \"loading\" } satisfies RelationshipRepairPanelState\n : state\n stateRef.current = currentState\n\n const beginAction = useCallback((proposalId: RelationshipRepairProposalId): AbortController | null => {\n if (stateRef.current._tag !== \"ready\" || busyProposal.current !== null) return null\n const abort = new AbortController()\n busyProposal.current = proposalId\n actionAbort.current?.abort()\n actionAbort.current = abort\n setState((current) =>\n current._tag === \"ready\"\n ? { ...current, actionFailure: null, busyProposalId: proposalId }\n : current\n )\n return abort\n }, [])\n\n const finishAction = useCallback((abort: AbortController): boolean => {\n if (actionAbort.current !== abort) return false\n actionAbort.current = null\n busyProposal.current = null\n return true\n }, [])\n\n const review = useCallback(async (\n proposalId: RelationshipRepairProposalId,\n decision: RelationshipRepairReviewDecision,\n rationale: string\n ): Promise<boolean> => {\n const abort = beginAction(proposalId)\n if (abort === null) return false\n try {\n const pending = pendingReviews.current.get(proposalId)\n const intent = pending?.decision === decision && pending.rationale === rationale\n ? pending\n : { decision, rationale, reviewId: await transport.makeReviewId() }\n pendingReviews.current.set(proposalId, intent)\n const proposal = await transport.review(proposalId, intent.reviewId, decision, rationale, abort.signal)\n if (!finishAction(abort) || abort.signal.aborted) return false\n pendingReviews.current.delete(proposalId)\n setState((current) =>\n current._tag !== \"ready\" || abort.signal.aborted\n ? current\n : {\n ...current,\n busyProposalId: null,\n page: {\n ...current.page,\n proposals: current.page.proposals.map((item) => item.proposalId === proposalId ? proposal : item)\n }\n }\n )\n return true\n } catch {\n if (!abort.signal.aborted && finishAction(abort)) {\n setState((current) =>\n current._tag === \"ready\"\n ? { ...current, actionFailure: proposalId, busyProposalId: null }\n : current\n )\n }\n return false\n }\n }, [beginAction, finishAction, transport])\n\n const apply = useCallback(async (proposalId: RelationshipRepairProposalId): Promise<boolean> => {\n const abort = beginAction(proposalId)\n if (abort === null) return false\n try {\n const result = await transport.apply(proposalId, abort.signal)\n if (!finishAction(abort) || abort.signal.aborted) return false\n setState((current) => {\n if (current._tag !== \"ready\" || abort.signal.aborted) return current\n const applications = new Map(current.applications)\n applications.set(proposalId, result.application)\n return { ...current, applications, busyProposalId: null }\n })\n return true\n } catch {\n if (!abort.signal.aborted && finishAction(abort)) {\n setState((current) =>\n current._tag === \"ready\"\n ? { ...current, actionFailure: proposalId, busyProposalId: null }\n : current\n )\n }\n return false\n }\n }, [beginAction, finishAction, transport])\n\n return {\n apply,\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n review,\n state: currentState\n }\n}\n",".root,\n.ledger,\n.proposal,\n.proposalHeader,\n.decision,\n.reviewEvidence,\n.reviewForm,\n.loading,\n.panelStack {\n display: grid;\n}\n\n.reviewEvidence {\n gap: var(--rly-space-4);\n padding: var(--rly-space-12) var(--rly-space-16);\n border-inline-start: var(--rly-space-4) solid var(--rly-color-border-2);\n background: var(--rly-color-surface-1);\n}\n\n.root,\n.loading,\n.panelStack {\n gap: var(--rly-space-24);\n}\n\n.header,\n.proposalHeader,\n.peopleTrace,\n.actions,\n.agentIdentity {\n align-items: center;\n display: flex;\n}\n\n.header,\n.proposalHeader {\n justify-content: space-between;\n}\n\n.header {\n gap: var(--rly-space-24);\n}\n\n.header > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.ledger {\n gap: var(--rly-space-12);\n}\n\n.proposal {\n gap: var(--rly-space-20);\n overflow: hidden;\n padding: var(--rly-space-24);\n}\n\n.proposalHeader {\n gap: var(--rly-space-16);\n}\n\n.decision {\n gap: var(--rly-space-4);\n}\n\n.decision strong {\n font: var(--rly-type-section-title-weight) var(--rly-type-section-title-size) /\n var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);\n letter-spacing: var(--rly-type-section-title-tracking);\n text-transform: capitalize;\n}\n\n.decision code {\n color: var(--rly-color-text-2);\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height)\n var(--rly-type-code-font);\n}\n\n.rationale {\n max-inline-size: 58ch;\n}\n\n.peopleTrace {\n flex-wrap: wrap;\n gap: var(--rly-space-12);\n}\n\n.traceArrow {\n color: var(--rly-color-text-3);\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / 1 var(--rly-type-code-font);\n}\n\n.agentIdentity {\n gap: var(--rly-space-8);\n}\n\n.agentGlyph {\n align-items: center;\n background: var(--rly-color-surface-3);\n border-radius: 50%;\n color: var(--rly-color-agent);\n display: inline-flex;\n block-size: var(--rly-space-24);\n inline-size: var(--rly-space-24);\n justify-content: center;\n}\n\n.agentIdentity > span:last-child {\n display: grid;\n}\n\n.agentIdentity strong,\n.agentIdentity small {\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.agentIdentity small {\n color: var(--rly-color-text-2);\n}\n\n.reviewForm {\n border-block-start: 1px solid var(--rly-color-border-1);\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-20);\n}\n\n.actions {\n flex-wrap: wrap;\n gap: var(--rly-space-8);\n}\n\n.actionFailure {\n margin-block: var(--rly-space-4);\n}\n\n.status:focus {\n border-radius: var(--rly-radius-control);\n}\n\n.srOnly {\n block-size: 1px;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n inline-size: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .header,\n .proposalHeader {\n align-items: flex-start;\n flex-direction: column;\n }\n\n .proposal {\n padding: var(--rly-space-20);\n }\n\n .traceArrow {\n display: none;\n }\n\n .peopleTrace {\n align-items: flex-start;\n flex-direction: column;\n }\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .reviewForm {\n animation: reveal-review 160ms ease-out both;\n }\n}\n\n@keyframes reveal-review {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n}\n","import { Person, type RlyPerson } from \"@knpkv/rly/patterns\"\nimport {\n Button,\n Field,\n type RlyStateTone,\n Skeleton,\n StateLabel,\n StatePanel,\n Surface,\n Text\n} from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\n\nimport type { SessionSummary } from \"../../api/session.js\"\nimport type { Actor } from \"../../domain/actors.js\"\nimport type {\n RelationshipRepairApplication,\n RelationshipRepairProposal,\n RelationshipRepairReviewDecision\n} from \"../../domain/relationshipRepair.js\"\nimport type { RelationshipRepairProposalId } from \"../../domain/identifiers.js\"\nimport { type BrowserSessionState, useBrowserSession } from \"../BrowserSession.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport { RelationshipRepairCandidatePicker } from \"./RelationshipRepairCandidatePicker.js\"\nimport { type RelationshipRepairPanelState, useRelationshipRepairProposals } from \"./useRelationshipRepairProposals.js\"\nimport type { RelationshipRepairTransport } from \"./relationshipRepairTransport.js\"\nimport styles from \"./RelationshipRepairPanel.module.css\"\n\nconst ignoreSessionExpired = (): void => undefined\n\ninterface RelationshipRepairPanelViewProps {\n readonly mutationsEnabled: boolean\n readonly onApply: (proposalId: RelationshipRepairProposalId) => Promise<boolean>\n readonly onRetry: () => void\n readonly onReview: (\n proposalId: RelationshipRepairProposalId,\n decision: RelationshipRepairReviewDecision,\n rationale: string\n ) => Promise<boolean>\n readonly release: PortfolioReleasePresentation\n readonly session: SessionSummary\n readonly state: RelationshipRepairPanelState\n}\n\nconst shortId = (id: string): string => id.slice(-6)\n\nconst isSameActor = (left: Actor, right: Actor): boolean =>\n left._tag === right._tag &&\n (left._tag === \"human\"\n ? right._tag === \"human\" && left.personId === right.personId\n : right._tag === \"agent\" && left.agentId === right.agentId)\n\nconst actorPerson = (\n actor: Extract<Actor, { readonly _tag: \"human\" }>,\n release: PortfolioReleasePresentation,\n role: string\n): RlyPerson => {\n const collaborator = release.collaborators.find(({ id }) => id.startsWith(`${actor.personId}:`))\n return collaborator === undefined\n ? { id: actor.personId, name: `Person ${shortId(actor.personId)}`, role }\n : { ...collaborator, role }\n}\n\nconst ActorIdentity = ({\n actor,\n release,\n role\n}: {\n readonly actor: Actor\n readonly release: PortfolioReleasePresentation\n readonly role: string\n}): ReactElement =>\n actor._tag === \"human\" ? (\n <Person person={actorPerson(actor, release, role)} size=\"compact\" />\n ) : (\n <div className={styles.agentIdentity}>\n <span aria-hidden=\"true\" className={styles.agentGlyph}>\n ✦\n </span>\n <span>\n <strong>Agent {shortId(actor.agentId)}</strong>\n <small>{role}</small>\n </span>\n </div>\n )\n\ninterface RepairStatusPresentation {\n readonly label: string\n readonly tone: RlyStateTone\n}\n\nconst statusPresentation = (\n proposal: RelationshipRepairProposal,\n application: RelationshipRepairApplication | undefined\n): RepairStatusPresentation => {\n if (application !== undefined) return { label: `Applied · r${application.appliedRevision}`, tone: \"positive\" }\n switch (proposal.status) {\n case \"pending\":\n return { label: \"Needs review\", tone: \"caution\" }\n case \"approved\":\n return { label: \"Ready to apply\", tone: \"positive\" }\n case \"rejected\":\n return { label: \"Rejected\", tone: \"critical\" }\n }\n}\n\nconst formattedTime = (timestamp: RelationshipRepairProposal[\"proposedAt\"]): string =>\n DateTime.formatUtc(timestamp, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\"\n })\n\ninterface ProposalRowProps {\n readonly actionFailed: boolean\n readonly application: RelationshipRepairApplication | undefined\n readonly isBusy: boolean\n readonly isGloballyBusy: boolean\n readonly mutationsEnabled: boolean\n readonly onApply: RelationshipRepairPanelViewProps[\"onApply\"]\n readonly onRetry: RelationshipRepairPanelViewProps[\"onRetry\"]\n readonly onReview: RelationshipRepairPanelViewProps[\"onReview\"]\n readonly proposal: RelationshipRepairProposal\n readonly release: PortfolioReleasePresentation\n readonly session: SessionSummary\n}\n\nconst ProposalRow = ({\n actionFailed,\n application,\n isBusy,\n isGloballyBusy,\n mutationsEnabled,\n onApply,\n onRetry,\n onReview,\n proposal,\n release,\n session\n}: ProposalRowProps): ReactElement => {\n const [isReviewing, setIsReviewing] = useState(false)\n const [rationale, setRationale] = useState(\"\")\n const [announcement, setAnnouncement] = useState<string | null>(null)\n const statusRef = useRef<HTMLDivElement>(null)\n const status = statusPresentation(proposal, application)\n const canReview =\n mutationsEnabled &&\n proposal.status === \"pending\" &&\n (session.permission === \"workspace-owner\" || session.permission === \"workspace-approver\") &&\n !isSameActor(proposal.origin.actor, session.actor)\n const canApply =\n mutationsEnabled &&\n proposal.status === \"approved\" &&\n application === undefined &&\n session.permission === \"workspace-owner\"\n const reviewRationale = rationale.trim()\n\n const review = async (decision: RelationshipRepairReviewDecision): Promise<void> => {\n if (reviewRationale.length === 0) return\n const recorded = await onReview(proposal.proposalId, decision, reviewRationale)\n if (!recorded) return\n setIsReviewing(false)\n setRationale(\"\")\n setAnnouncement(decision === \"approved\" ? \"Proposal approved.\" : \"Proposal rejected.\")\n }\n\n const apply = async (): Promise<void> => {\n const recorded = await onApply(proposal.proposalId)\n if (recorded) setAnnouncement(\"Repair applied.\")\n }\n\n useEffect(() => {\n if (announcement !== null) statusRef.current?.focus()\n }, [announcement])\n\n return (\n <Surface as=\"article\" className={styles.proposal} padding=\"none\" tone=\"secondary\">\n <header className={styles.proposalHeader}>\n <div className={styles.decision}>\n <strong>\n {proposal.disposition[0]?.toLocaleUpperCase(\"en-US\")}\n {proposal.disposition.slice(1)}\n </strong>\n <code>\n r{proposal.expectedRevision} → r{proposal.expectedRevision + 1}\n </code>\n </div>\n <div className={styles.status} ref={statusRef} tabIndex={announcement === null ? undefined : -1}>\n <StateLabel label={status.label} size=\"compact\" tone={status.tone} />\n <span aria-live=\"polite\" className={styles.srOnly}>\n {announcement ?? \"\"}\n </span>\n </div>\n </header>\n\n <Text className={styles.rationale} variant=\"body-large\">\n {proposal.rationale}\n </Text>\n\n <div className={styles.peopleTrace}>\n <ActorIdentity\n actor={proposal.origin.actor}\n release={release}\n role={`Proposed · ${formattedTime(proposal.proposedAt)}`}\n />\n {proposal.review === null ? null : (\n <>\n <span aria-hidden=\"true\" className={styles.traceArrow}>\n →\n </span>\n <ActorIdentity\n actor={proposal.review.origin.actor}\n release={release}\n role={`${proposal.review.decision === \"approved\" ? \"Approved\" : \"Rejected\"} · ${formattedTime(proposal.review.reviewedAt)}`}\n />\n </>\n )}\n {application === undefined ? null : (\n <>\n <span aria-hidden=\"true\" className={styles.traceArrow}>\n →\n </span>\n <ActorIdentity\n actor={application.origin.actor}\n release={release}\n role={`Applied revision ${application.appliedRevision} · ${formattedTime(application.appliedAt)}`}\n />\n </>\n )}\n </div>\n\n {proposal.review === null ? null : (\n <div className={styles.reviewEvidence}>\n <Text as=\"strong\" variant=\"label\">\n Review note\n </Text>\n <Text tone=\"secondary\">{proposal.review.rationale}</Text>\n </div>\n )}\n\n {actionFailed ? (\n <StatePanel\n action={<Button onClick={onRetry}>Reload decisions</Button>}\n announce=\"assertive\"\n className={styles.actionFailure}\n description=\"The proposal may have changed. Reload the release decisions before trying again.\"\n title=\"Action not recorded\"\n tone=\"caution\"\n />\n ) : null}\n\n {isReviewing && canReview ? (\n <form className={styles.reviewForm} onSubmit={(event) => event.preventDefault()}>\n <Field description=\"Stored with the immutable decision.\" label=\"Review note\" required>\n {(controlProps) => (\n <textarea\n {...controlProps}\n autoFocus\n maxLength={1_000}\n onChange={(event) => setRationale(event.currentTarget.value)}\n value={rationale}\n />\n )}\n </Field>\n <div className={styles.actions}>\n <Button\n disabled={reviewRationale.length === 0 || isGloballyBusy}\n loading={isBusy}\n onClick={() => void review(\"rejected\")}\n variant=\"quiet\"\n >\n Reject\n </Button>\n <Button\n disabled={reviewRationale.length === 0 || isGloballyBusy}\n loading={isBusy}\n onClick={() => void review(\"approved\")}\n variant=\"primary\"\n >\n Approve\n </Button>\n </div>\n </form>\n ) : (\n <div className={styles.actions}>\n {canReview ? (\n <Button disabled={isGloballyBusy} onClick={() => setIsReviewing(true)}>\n Review proposal\n </Button>\n ) : null}\n {canApply ? (\n <Button\n disabled={isGloballyBusy && !isBusy}\n loading={isBusy}\n onClick={() => void apply()}\n variant=\"primary\"\n >\n Apply repair\n </Button>\n ) : null}\n {proposal.status === \"pending\" && isSameActor(proposal.origin.actor, session.actor) ? (\n <Text tone=\"tertiary\" variant=\"meta\">\n Another owner or approver must review.\n </Text>\n ) : null}\n </div>\n )}\n </Surface>\n )\n}\n\nconst LoadingPanel = (): ReactElement => (\n <div aria-label=\"Loading release decisions\" className={styles.loading} role=\"status\">\n <Skeleton decorative={false} height=\"1.5rem\" label=\"Loading release decisions\" width=\"12rem\" />\n <Skeleton decorative height=\"11rem\" variant=\"block\" />\n </div>\n)\n\n/** Render the exact, human-attributed decision ledger for one release. */\nexport const RelationshipRepairPanelView = ({\n mutationsEnabled,\n onApply,\n onRetry,\n onReview,\n release,\n session,\n state\n}: RelationshipRepairPanelViewProps): ReactElement => {\n if (state._tag === \"idle\" || state._tag === \"loading\") return <LoadingPanel />\n if (state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={onRetry}>Try again</Button>}\n description=\"Control Center could not read the governed decisions for this release.\"\n title=\"Release decisions unavailable\"\n tone=\"caution\"\n />\n )\n }\n if (state.page.proposals.length === 0) {\n return (\n <StatePanel\n description=\"No relationship repair is waiting for review or application.\"\n title=\"No repair decisions\"\n />\n )\n }\n\n return (\n <div className={styles.root}>\n <header className={styles.header}>\n <div>\n <Text as=\"h3\" variant=\"card-title\">\n Repair decisions\n </Text>\n <Text tone=\"secondary\">One compact ledger from proposal to human decision to applied revision.</Text>\n </div>\n <StateLabel\n label={`${state.page.proposals.length}${state.page.truncated ? \"+\" : \"\"} decision${state.page.proposals.length === 1 ? \"\" : \"s\"}`}\n size=\"compact\"\n tone=\"neutral\"\n />\n </header>\n <div className={styles.ledger}>\n {state.page.proposals.map((proposal) => (\n <ProposalRow\n actionFailed={state.actionFailure === proposal.proposalId}\n application={state.applications.get(proposal.proposalId)}\n isBusy={state.busyProposalId === proposal.proposalId}\n isGloballyBusy={state.busyProposalId !== null}\n key={proposal.proposalId}\n mutationsEnabled={mutationsEnabled}\n onApply={onApply}\n onRetry={onRetry}\n onReview={onReview}\n proposal={proposal}\n release={release}\n session={session}\n />\n ))}\n </div>\n </div>\n )\n}\n\nconst sessionScopeKey = (session: SessionSummary): string => {\n const actorId = session.actor._tag === \"human\" ? session.actor.personId : session.actor.agentId\n return `${session.sessionId}:${session.workspaceId}:${session.permission}:${session.actor._tag}:${actorId}`\n}\n\ninterface RelationshipRepairSessionAccess {\n readonly mutationsEnabled: boolean\n readonly session: SessionSummary | null\n}\n\n/** Cookie-authenticated reads survive storage failure; mutation controls do not. */\nexport const relationshipRepairSessionAccess = (state: BrowserSessionState): RelationshipRepairSessionAccess => {\n switch (state._tag) {\n case \"authenticated\":\n return { mutationsEnabled: true, session: state.session }\n case \"storage-unavailable\":\n return { mutationsEnabled: false, session: state.session }\n case \"anonymous\":\n case \"blocked\":\n case \"checking\":\n case \"unavailable\":\n return { mutationsEnabled: false, session: null }\n }\n}\n\n/** Render the repair ledger from an explicit browser-session state. */\nexport const RelationshipRepairPanelContent = ({\n browserSessionState,\n onSessionExpired = ignoreSessionExpired,\n release,\n transport\n}: {\n readonly browserSessionState: BrowserSessionState\n readonly onSessionExpired?: (sessionKey: string) => void\n readonly release: PortfolioReleasePresentation\n readonly transport?: RelationshipRepairTransport\n}): ReactElement => {\n const access = relationshipRepairSessionAccess(browserSessionState)\n const controller = useRelationshipRepairProposals(\n release.id,\n release.targetEnvironmentIds,\n access.session?.sessionId ?? null,\n transport,\n onSessionExpired\n )\n if (access.session === null) return <LoadingPanel />\n return (\n <div className={styles.panelStack}>\n <RelationshipRepairPanelView\n mutationsEnabled={access.mutationsEnabled}\n onApply={controller.apply}\n onRetry={controller.retry}\n onReview={controller.review}\n release={release}\n session={access.session}\n state={controller.state}\n />\n {access.mutationsEnabled ? (\n <RelationshipRepairCandidatePicker\n environmentIds={release.targetEnvironmentIds}\n key={`${release.id}:${release.targetEnvironmentIds.join(\":\")}:${sessionScopeKey(access.session)}`}\n onCreated={controller.retry}\n releaseId={release.id}\n session={access.session}\n />\n ) : null}\n </div>\n )\n}\n\n/** Connect one full release view to its authenticated repair-proposal ledger. */\nexport const RelationshipRepairPanel = ({\n release\n}: {\n readonly release: PortfolioReleasePresentation\n}): ReactElement => {\n const browserSession = useBrowserSession()\n return (\n <RelationshipRepairPanelContent\n browserSessionState={browserSession.state}\n onSessionExpired={browserSession.invalidateSession}\n release={release}\n />\n )\n}\n",".state {\n display: grid;\n min-block-size: 60dvh;\n place-items: center;\n}\n\n.state a,\n.back,\n.releaseAction {\n color: inherit;\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.releaseAction {\n display: inline-flex;\n min-block-size: var(--rly-space-48);\n align-items: center;\n justify-content: center;\n padding-inline: var(--rly-space-24);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font-size: var(--rly-type-body-large-size);\n text-decoration: none;\n}\n\n.releaseAction:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-4);\n}\n\n.previewDetails,\n.evidence,\n.full,\n.fullHeader,\n.fullTitle,\n.section {\n display: grid;\n}\n\n.previewDetails,\n.evidence {\n gap: var(--rly-space-16);\n}\n\n.evidenceHeading,\n.fullIdentity {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-16);\n}\n\n.evidenceHeading > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.full {\n gap: clamp(4rem, 9vw, 8rem);\n}\n\n.fullHeader {\n gap: var(--rly-space-32);\n}\n\n.fullTitle {\n gap: var(--rly-space-12);\n}\n\n.fullTitle h1 {\n max-inline-size: 12ch;\n outline: none;\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.section {\n gap: var(--rly-space-24);\n}\n\n@media (max-width: 40rem) {\n .full {\n gap: var(--rly-space-64);\n }\n\n .fullHeader {\n gap: var(--rly-space-24);\n }\n}\n","import {\n AgentContextButton,\n FreshnessStamp,\n PeopleStrip,\n ReleasePreview,\n ReleaseRelay,\n ServiceMark,\n StageRail,\n Verdict\n} from \"@knpkv/rly/patterns\"\nimport { Button, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\nimport { Link, useLocation, useNavigate, useOutletContext, useParams, useViewTransitionState } from \"react-router\"\n\nimport { PortfolioOverviewView } from \"../portfolio/PortfolioOverview.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport type { WorkspaceReleaseOutletContext } from \"./WorkspaceReleaseLayout.js\"\nimport {\n decodeReleaseRouteId,\n readReleaseOrigin,\n releaseActiveWorkPath,\n releaseAgentPath,\n resolveReleaseOrigin,\n releaseFullPath,\n releaseOriginHref,\n releaseParentPath,\n releasePreviewPath,\n releaseTransitionNames,\n workspaceItemsPath\n} from \"./releaseRoutes.js\"\nimport styles from \"./ReleaseRoute.module.css\"\nimport { useCompactReleasePreview, usePrefersReducedReleaseMotion } from \"./useCompactReleasePreview.js\"\nimport { RelationshipRepairPanel } from \"./RelationshipRepairPanel.js\"\nimport { ReleaseWorkset } from \"./ReleaseWorkset.js\"\n\ninterface ReleaseRouteSelection {\n readonly release: PortfolioReleasePresentation\n readonly releaseId: NonNullable<ReturnType<typeof decodeReleaseRouteId>>\n}\n\nconst selectRelease = (\n context: WorkspaceReleaseOutletContext,\n routeReleaseId: string | undefined\n): ReleaseRouteSelection | null => {\n const releaseId = decodeReleaseRouteId(routeReleaseId)\n if (releaseId === null || context.controller.state._tag !== \"ready\") return null\n const release = context.controller.state.portfolio.releases.find((candidate) => candidate.id === releaseId)\n return release === undefined ? null : { release, releaseId }\n}\n\nconst ReleaseNotFound = ({ workspaceId }: Pick<WorkspaceReleaseOutletContext, \"workspaceId\">): ReactElement => {\n const stateRef = useRef<HTMLElement>(null)\n useEffect(() => stateRef.current?.focus(), [])\n return (\n <section className={styles.state} data-release-not-found=\"\" ref={stateRef} tabIndex={-1}>\n <StatePanel\n action={<Link to={releaseParentPath(workspaceId)}>Return to workspace overview</Link>}\n description=\"This release does not exist in the current workspace snapshot. It may have been removed or the address may be incorrect.\"\n title=\"Release not found\"\n />\n </section>\n )\n}\n\nconst ReleaseRouteLoading = ({ context }: { readonly context: WorkspaceReleaseOutletContext }): ReactElement => {\n const stateRef = useRef<HTMLDivElement>(null)\n useEffect(() => stateRef.current?.querySelector<HTMLElement>(\"#portfolio-title\")?.focus(), [])\n return (\n <div ref={stateRef}>\n <PortfolioOverviewView\n onPreviewRelease={() => undefined}\n onRetry={context.controller.onRetry}\n state={context.controller.state}\n />\n </div>\n )\n}\n\nexport const ReleaseAction = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const location = useLocation()\n const action = (() => {\n switch (release.readinessVerdict) {\n case \"blocked\":\n return { label: \"Review blocker\", to: releaseActiveWorkPath(context.workspaceId, release.id) }\n case \"held\":\n return { label: \"Repair missing links\", to: `${releaseFullPath(context.workspaceId, release.id)}#release-work` }\n case \"ready\":\n return {\n label: \"Review ship evidence\",\n to: `${releaseFullPath(context.workspaceId, release.id)}#release-evidence`\n }\n case \"deploying\":\n return { label: \"Open deployment\", to: `${releaseFullPath(context.workspaceId, release.id)}#release-work` }\n case \"building\":\n return { label: \"Open build\", to: `${releaseFullPath(context.workspaceId, release.id)}#release-work` }\n case \"shipped\":\n return {\n label: \"View release record\",\n to: `${releaseFullPath(context.workspaceId, release.id)}#release-evidence`\n }\n case \"unknown\":\n return null\n }\n })()\n return action === null ? (\n <Button disabled size=\"principal\" stretch variant=\"primary\">\n Readiness evidence required\n </Button>\n ) : (\n <Link className={styles.releaseAction} state={location.state} to={action.to}>\n {action.label}\n </Link>\n )\n}\n\nexport const ReleaseEvidence = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement => (\n <Surface as=\"section\" className={styles.evidence} padding=\"compact\" tone=\"secondary\">\n <div className={styles.evidenceHeading}>\n {release.source.service === null ? null : <ServiceMark service={release.source.service} />}\n <div>\n <Text as=\"h2\" variant=\"card-title\">\n {release.source.displayName}\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n Source evidence\n </Text>\n </div>\n </div>\n <StateLabel label={release.source.healthLabel} size=\"compact\" tone={release.source.healthTone} />\n {release.source.warning === null ? (\n <Text tone=\"secondary\">Detailed evidence is not evaluated in the tracer snapshot.</Text>\n ) : (\n <Text tone=\"secondary\">{release.source.warning}</Text>\n )}\n </Surface>\n)\n\nconst releaseContextLabel = (release: PortfolioReleasePresentation): string =>\n `${release.serviceName} · ${release.version} · ${release.relay.codename} · ${release.id}`\n\nexport const ReleaseAgentEntry = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const location = useLocation()\n const navigate = useNavigate()\n const prefersReducedMotion = usePrefersReducedReleaseMotion()\n return (\n <AgentContextButton\n actionLabel=\"Ask about this release\"\n agentName=\"Relay\"\n context={releaseContextLabel(release)}\n onClick={() =>\n navigate(releaseAgentPath(context.workspaceId, release.id), {\n state: location.state,\n viewTransition: !prefersReducedMotion\n })\n }\n />\n )\n}\n\nconst CompleteCollaborators = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement =>\n release.collaborators.length === 0 ? (\n <StatePanel\n description=\"Assign an owner or approver before a governed release action can proceed.\"\n title=\"No release collaborators assigned\"\n />\n ) : (\n <PeopleStrip\n aria-label={`All ${release.serviceName} release collaborators`}\n expanded\n limit={release.collaborators.length}\n onExpandedChange={() => undefined}\n people={release.collaborators}\n />\n )\n\ntype PreviewExit = \"origin\" | null\n\nconst ReleasePreviewContent = ({ selection }: { readonly selection: ReleaseRouteSelection }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const isCompact = useCompactReleasePreview()\n const prefersReducedMotion = usePrefersReducedReleaseMotion()\n const location = useLocation()\n const navigate = useNavigate()\n const [exit, setExit] = useState<PreviewExit>(null)\n const [isOpen, setIsOpen] = useState(true)\n const resolvedOrigin = resolveReleaseOrigin(location.state, context.workspaceId, selection.releaseId)\n const originHref = releaseOriginHref(resolvedOrigin.origin)\n const fullPath = releaseFullPath(context.workspaceId, selection.releaseId)\n const agentPath = releaseAgentPath(context.workspaceId, selection.releaseId)\n const previewPath = releasePreviewPath(context.workspaceId, selection.releaseId)\n const isPreviewTransitioning = useViewTransitionState(previewPath)\n const isFullTransitioning = useViewTransitionState(fullPath)\n const isAgentTransitioning = useViewTransitionState(agentPath)\n const transitionNames =\n isPreviewTransitioning || isFullTransitioning || isAgentTransitioning\n ? releaseTransitionNames(selection.releaseId)\n : undefined\n\n useEffect(() => {\n if (isOpen || exit === null) return\n navigate(originHref, { replace: true })\n }, [context.workspaceId, exit, isOpen, navigate, originHref, selection.releaseId])\n\n const requestOrigin = (): void => {\n context.requestReleaseFocus(selection.releaseId)\n setExit(\"origin\")\n setIsOpen(false)\n }\n\n return (\n <ReleasePreview\n agentEntry={<ReleaseAgentEntry release={selection.release} />}\n collaborators={<CompleteCollaborators release={selection.release} />}\n entryMotion={resolvedOrigin.isStored ? \"external\" : \"intrinsic\"}\n evidence={<ReleaseEvidence release={selection.release} />}\n onOpenChange={(open) => {\n if (!open) requestOrigin()\n }}\n onOpenFullView={() => navigate(fullPath, { state: location.state, viewTransition: !prefersReducedMotion })}\n open={isOpen}\n openFullViewLabel={`Open ${selection.release.relay.codename} full view`}\n presentation={isCompact ? \"sheet\" : \"dialog\"}\n primaryAction={<ReleaseAction release={selection.release} />}\n release={selection.release.release}\n stages={<StageRail heading=\"Release stages\" stages={selection.release.stages} />}\n {...(transitionNames === undefined ? {} : { transitionNames })}\n workset={\n <div className={styles.previewDetails}>\n <ReleaseWorkset release={selection.release} workspaceId={context.workspaceId} />\n </div>\n }\n />\n )\n}\n\n/** Render the canonical release preview over its still-mounted workspace origin. */\nexport const ReleasePreviewRoute = (): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const params = useParams()\n if (context.controller.state._tag !== \"ready\") return <ReleaseRouteLoading context={context} />\n const selection = selectRelease(context, params.releaseId)\n return selection === null ? (\n <ReleaseNotFound workspaceId={context.workspaceId} />\n ) : (\n <ReleasePreviewContent selection={selection} />\n )\n}\n\nconst FullRelease = ({ selection }: { readonly selection: ReleaseRouteSelection }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const location = useLocation()\n const headingRef = useRef<HTMLHeadingElement>(null)\n const origin = readReleaseOrigin(location.state, context.workspaceId, selection.releaseId)\n const originLabel = origin.pathname === workspaceItemsPath(context.workspaceId) ? \"Back to items\" : \"Back to overview\"\n const release = selection.release\n const fullPath = releaseFullPath(context.workspaceId, selection.releaseId)\n const agentPath = releaseAgentPath(context.workspaceId, selection.releaseId)\n const isFullTransitioning = useViewTransitionState(fullPath)\n const isAgentTransitioning = useViewTransitionState(agentPath)\n const transitionNames =\n isFullTransitioning || isAgentTransitioning ? releaseTransitionNames(selection.releaseId) : undefined\n\n useEffect(() => headingRef.current?.focus(), [])\n\n return (\n <article className={styles.full} data-release-full-id={release.id}>\n <header className={styles.fullHeader}>\n <Link className={styles.back} to={releaseOriginHref(origin)}>\n {originLabel}\n </Link>\n <div className={styles.fullIdentity}>\n <ReleaseRelay\n algorithm={release.relay.algorithm}\n codename={release.relay.codename}\n data-rly-release-transition-name={transitionNames?.relay}\n data-rly-release-transition-part=\"relay\"\n size=\"hero\"\n style={transitionNames === undefined ? undefined : { viewTransitionName: transitionNames.relay }}\n symbolIndices={release.relay.symbolIndices}\n />\n {release.source.freshnessDateTime === null || release.source.freshnessTime === null ? (\n <FreshnessStamp state={release.source.freshness} />\n ) : (\n <FreshnessStamp\n dateTime={release.source.freshnessDateTime}\n state={release.source.freshness}\n time={release.source.freshnessTime}\n />\n )}\n </div>\n <div className={styles.fullTitle}>\n <Text as=\"h1\" id=\"release-title\" ref={headingRef} tabIndex={-1} variant=\"verdict\">\n {release.serviceName}\n </Text>\n <Text\n as=\"code\"\n data-rly-release-transition-name={transitionNames?.version}\n data-rly-release-transition-part=\"version\"\n style={transitionNames === undefined ? undefined : { viewTransitionName: transitionNames.version }}\n tone=\"secondary\"\n variant=\"code\"\n >\n {release.version}\n </Text>\n </div>\n <Verdict\n data-rly-release-transition-name={transitionNames?.verdict}\n data-rly-release-transition-part=\"verdict\"\n reason={release.readinessReason}\n style={transitionNames === undefined ? undefined : { viewTransitionName: transitionNames.verdict }}\n tone={release.release.tone}\n verdict={release.release.verdict}\n />\n <ReleaseAction release={release} />\n </header>\n\n <StageRail heading=\"Build, verify, production\" stages={release.stages} />\n <section aria-labelledby=\"release-people\" className={styles.section}>\n <Text as=\"h2\" id=\"release-people\" variant=\"section-title\">\n People\n </Text>\n <CompleteCollaborators release={release} />\n </section>\n <section aria-labelledby=\"release-work-title\" className={styles.section} id=\"release-work\">\n <Text as=\"h2\" id=\"release-work-title\" variant=\"section-title\">\n Delivery relationships\n </Text>\n <ReleaseWorkset release={release} workspaceId={context.workspaceId} />\n <RelationshipRepairPanel release={release} />\n </section>\n <section aria-labelledby=\"release-evidence-title\" className={styles.section} id=\"release-evidence\">\n <Text as=\"h2\" id=\"release-evidence-title\" variant=\"section-title\">\n Evidence\n </Text>\n <ReleaseEvidence release={release} />\n </section>\n <section aria-labelledby=\"release-agent\" className={styles.section}>\n <Text as=\"h2\" id=\"release-agent\" variant=\"section-title\">\n Release agent\n </Text>\n <ReleaseAgentEntry release={release} />\n </section>\n </article>\n )\n}\n\n/** Render an exact release at its canonical full route without selecting a fallback entity. */\nexport const ReleaseFullRoute = (): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const params = useParams()\n if (context.controller.state._tag !== \"ready\") return <ReleaseRouteLoading context={context} />\n const selection = selectRelease(context, params.releaseId)\n return selection === null ? (\n <ReleaseNotFound workspaceId={context.workspaceId} />\n ) : (\n <FullRelease selection={selection} />\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReleaseRoute-0QrCZbE4.js","names":["Effect.gen","Crypto.Crypto","Schema.decodeUnknownEffect","RelationshipRepairProposalIdSchema","Effect.runPromise","Effect.provide","FetchHttpClient.layer","BrowserCrypto.layer","actions","useRef","useState","Button","Text","StatePanel","StateLabel","Surface","styles","Effect.gen","Crypto.Crypto","Schema.decodeUnknownEffect","RelationshipRepairReviewIdSchema","Effect.runPromise","Effect.provide","FetchHttpClient.layer","BrowserCrypto.layer","Predicate.isTagged","ignoreSessionExpired","DateTime.Order","useState","useRef","useCallback","Person","styles","DateTime.formatUtc","useState","useRef","Surface","StateLabel","Text","_Fragment","StatePanel","Button","Field","Skeleton","useRef","styles","StatePanel","Button","Surface","ServiceMark","Text","StateLabel","AgentContextButton","PeopleStrip","useState","ReleasePreview","StageRail","ReleaseRelay","FreshnessStamp","Verdict","__toESM","useParams","useOutletContext","useLocation","useNavigate","V","Je","Le","He","ve","useViewTransitionState","Link","workspaceItemsPath","useBrowserSession","releaseActiveWorkPath","releaseAgentPath","releasePreviewPath","require_jsx_runtime","releaseParentPath","releaseFullPath","lt","R","We","fe","I","B","Gn","Qn","Un","y","j","runPromise","Order","isTagged","decodeUnknownEffect","formatUtc","provide","gen","RelationshipRepairProposalId","RelationshipRepairReviewId","Crypto","layer","layer$1","makeControlCenterApiClient","readReleaseOrigin","releaseTransitionNames","resolveReleaseOrigin","decodeReleaseRouteId","releaseOriginHref","makeAuthenticatedMutationClient","loadReleaseEnvironmentSlices","ReleaseWorkset","usePrefersReducedReleaseMotion","useCompactReleasePreview","import_react","require_react","makeRelationshipRepairProposalId","uuid","browserRelationshipRepairCandidateTransport","draft","environmentId","RelationshipRepairCandidatePicker_module_default","import_jsx_runtime","titleCase","value","candidateTitle","candidate","aggregateCandidatePages","seen","candidates","pages","page","identity","truncated","PickerResult","result","stateTag","announce","RelationshipRepairCandidatePicker","state","setState","request","actorId","session","authorityScope","environmentScopeKey","environmentIds","releaseId","run","abort","effect","onSuccess","onFailure","discover","transport","signal","select","refreshCandidate","item","staleCandidate","create","pendingProposalId","proposalId","onCreated","isCreating","makeRelationshipRepairReviewId","browserRelationshipRepairTransport","isUnauthorizedFailure","ignoreSessionExpired$1","proposalOrder","proposedAtOrder","right","left","aggregateProposalPages","proposalsById","applicationsByProposalId","proposal","application","orderedProposals","proposals","applications","useRelationshipRepairProposals","requestRevision","setRequestRevision","actionAbort","busyProposal","pendingReviews","stateRef","sessionKey","failure","onSessionExpired","currentState","beginAction","current","finishAction","review","pending","intent","decision","rationale","revision","RelationshipRepairPanel_module_default","ignoreSessionExpired","shortId","id","isSameActor","actorPerson","collaborator","release","actor","ActorIdentity","role","statusPresentation","formattedTime","timestamp","ProposalRow","isReviewing","setIsReviewing","setRationale","announcement","setAnnouncement","statusRef","status","canReview","mutationsEnabled","canApply","reviewRationale","onReview","apply","onApply","actionFailed","onRetry","event","controlProps","isGloballyBusy","isBusy","LoadingPanel","RelationshipRepairPanelView","sessionScopeKey","relationshipRepairSessionAccess","RelationshipRepairPanelContent","access","browserSessionState","controller","RelationshipRepairPanel","browserSession","ReleaseRoute_module_default","selectRelease","routeReleaseId","context","ReleaseNotFound","workspaceId","ReleaseRouteLoading","PortfolioOverviewView","ReleaseAction","location","action","ReleaseEvidence","releaseContextLabel","ReleaseAgentEntry","navigate","prefersReducedMotion","CompleteCollaborators","ReleasePreviewContent","isCompact","exit","setExit","isOpen","setIsOpen","resolvedOrigin","selection","originHref","fullPath","agentPath","previewPath","isPreviewTransitioning","isFullTransitioning","isAgentTransitioning","transitionNames","requestOrigin","open","ReleasePreviewRoute","params","FullRelease","headingRef","origin","originLabel","ReleaseFullRoute"],"sources":["../../../src/client/releases/relationshipRepairCandidateTransport.ts","../../../src/client/releases/RelationshipRepairCandidatePicker.module.css","../../../src/client/releases/RelationshipRepairCandidatePicker.tsx","../../../src/client/releases/relationshipRepairTransport.ts","../../../src/client/releases/useRelationshipRepairProposals.ts","../../../src/client/releases/RelationshipRepairPanel.module.css","../../../src/client/releases/RelationshipRepairPanel.tsx","../../../src/client/releases/ReleaseRoute.module.css","../../../src/client/releases/ReleaseRoute.tsx"],"sourcesContent":["import * as BrowserCrypto from \"@effect/platform-browser/BrowserCrypto\"\nimport * as Crypto from \"effect/Crypto\"\nimport * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Schema from \"effect/Schema\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { RelationshipRepairCandidates, RelationshipRepairProposalDraft } from \"../../api/deliveryGraph.js\"\nimport type { LedgerRevision } from \"../../domain/deliveryGraph.js\"\nimport type {\n EnvironmentId,\n RelationshipId,\n RelationshipRepairProposalId,\n ReleaseId\n} from \"../../domain/identifiers.js\"\nimport { RelationshipRepairProposalId as RelationshipRepairProposalIdSchema } from \"../../domain/identifiers.js\"\nimport type { RelationshipRepairProposal } from \"../../domain/relationshipRepair.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\n/** Generate one canonical proposal identity at the browser mutation boundary. */\nexport const makeRelationshipRepairProposalId = Effect.gen(function*() {\n const cryptoService = yield* Crypto.Crypto\n const uuid = yield* cryptoService.randomUUIDv7\n return yield* Schema.decodeUnknownEffect(RelationshipRepairProposalIdSchema)(uuid)\n})\n\nexport interface RelationshipRepairCandidateTransport {\n readonly create: (\n releaseId: ReleaseId,\n draft: RelationshipRepairProposalDraft,\n proposalId: RelationshipRepairProposalId,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposal>\n readonly draft: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n relationshipId: RelationshipId,\n revision: LedgerRevision,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposalDraft>\n readonly list: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<RelationshipRepairCandidates>\n readonly makeProposalId: () => Promise<RelationshipRepairProposalId>\n}\n\n/** Generated-client transport for owner-governed repair candidate creation. */\nexport const browserRelationshipRepairCandidateTransport: RelationshipRepairCandidateTransport = {\n create: (releaseId, draft, proposalId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.deliveryGraph.createRepairProposal({\n params: {\n releaseId,\n relationshipId: draft.precondition.relationshipId\n },\n payload: {\n proposalId,\n environmentId: draft.candidate.impact.environmentId,\n expectedRevision: draft.precondition.expectedRevision,\n disposition: draft.proposal.disposition,\n rationale: draft.proposal.rationale\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n draft: (releaseId, environmentId, relationshipId, revision, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.repairProposalDraft({\n params: { releaseId, relationshipId },\n query: environmentId === null ? { revision } : { environmentId, revision }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n list: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.repairCandidates({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n makeProposalId: () => Effect.runPromise(makeRelationshipRepairProposalId.pipe(Effect.provide(BrowserCrypto.layer)))\n}\n",".candidates,\n.draft {\n display: grid;\n}\n\n.candidates {\n gap: var(--rly-space-8);\n}\n\n.candidateHeader,\n.draftHeader,\n.actions {\n align-items: center;\n display: flex;\n justify-content: space-between;\n}\n\n.candidate {\n align-items: center;\n background: transparent;\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-control);\n color: var(--rly-color-text-1);\n cursor: pointer;\n display: flex;\n font: inherit;\n gap: var(--rly-space-16);\n justify-content: space-between;\n padding: var(--rly-space-16);\n text-align: start;\n}\n\n.candidate:hover,\n.candidate:focus-visible {\n background: var(--rly-color-surface-2);\n border-color: var(--rly-color-border-2);\n outline: none;\n}\n\n.candidate > span:first-child {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.candidate strong {\n font: var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height)\n var(--rly-type-body-font);\n text-transform: capitalize;\n}\n\n.candidate small {\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.draft {\n gap: var(--rly-space-16);\n padding: var(--rly-space-20);\n}\n\n.draftHeader {\n gap: var(--rly-space-16);\n}\n\n.actions {\n justify-content: flex-end;\n gap: var(--rly-space-8);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .draft {\n animation: reveal-draft 160ms ease-out both;\n }\n}\n\n@keyframes reveal-draft {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n}\n","import { Button, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement, type ReactNode, useEffect, useRef, useState } from \"react\"\n\nimport type {\n RelationshipRepairCandidate,\n RelationshipRepairCandidates,\n RelationshipRepairProposalDraft\n} from \"../../api/deliveryGraph.js\"\nimport { MAXIMUM_RELEASE_SLICE_RECORDS } from \"../../api/deliveryGraph.js\"\nimport type { SessionSummary } from \"../../api/session.js\"\nimport type { EnvironmentId, RelationshipRepairProposalId, ReleaseId } from \"../../domain/identifiers.js\"\nimport { loadReleaseEnvironmentSlices } from \"./loadReleaseEnvironmentSlices.js\"\nimport {\n browserRelationshipRepairCandidateTransport,\n type RelationshipRepairCandidateTransport\n} from \"./relationshipRepairCandidateTransport.js\"\nimport styles from \"./RelationshipRepairCandidatePicker.module.css\"\n\ntype PickerState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"load-failed\" }\n | { readonly _tag: \"ready\"; readonly page: RelationshipRepairCandidates }\n | { readonly _tag: \"drafting\"; readonly page: RelationshipRepairCandidates }\n | {\n readonly _tag: \"draft-failed\"\n readonly candidate: RelationshipRepairCandidate\n readonly page: RelationshipRepairCandidates\n }\n | {\n readonly _tag: \"draft\"\n readonly draft: RelationshipRepairProposalDraft\n readonly page: RelationshipRepairCandidates\n }\n | {\n readonly _tag: \"creating\"\n readonly draft: RelationshipRepairProposalDraft\n readonly page: RelationshipRepairCandidates\n readonly proposalId: RelationshipRepairProposalId | null\n }\n | {\n readonly _tag: \"create-failed\"\n readonly draft: RelationshipRepairProposalDraft\n readonly page: RelationshipRepairCandidates\n readonly proposalId: RelationshipRepairProposalId | null\n }\n | { readonly _tag: \"created\" }\n\nconst titleCase = (value: string): string => value.replaceAll(\"-\", \" \")\n\nconst candidateTitle = (candidate: RelationshipRepairCandidate): string =>\n `${titleCase(candidate.relationship.sourceNodeKind)} → ${titleCase(candidate.relationship.targetNodeKind)}`\n\nconst aggregateCandidatePages = (\n releaseId: ReleaseId,\n pages: ReadonlyArray<RelationshipRepairCandidates>\n): RelationshipRepairCandidates => {\n const seen = new Set<string>()\n const candidates: Array<RelationshipRepairCandidate> = []\n for (const candidate of pages.flatMap((page) => page.candidates)) {\n const identity = `${candidate.relationship.relationshipId}:${candidate.relationship.revision}`\n if (seen.has(identity)) continue\n seen.add(identity)\n candidates.push(candidate)\n }\n return {\n releaseId,\n environmentId: null,\n truncated: pages.some(({ truncated }) => truncated) || candidates.length > MAXIMUM_RELEASE_SLICE_RECORDS,\n candidates: candidates.slice(0, MAXIMUM_RELEASE_SLICE_RECORDS)\n }\n}\n\nconst PickerResult = ({\n announce = false,\n children,\n stateTag\n}: {\n readonly announce?: boolean\n readonly children: ReactNode\n readonly stateTag: PickerState[\"_tag\"]\n}): ReactElement => {\n const result = useRef<HTMLDivElement>(null)\n useEffect(() => result.current?.focus(), [stateTag])\n return (\n <div aria-live={announce ? \"polite\" : undefined} ref={result} role={announce ? \"status\" : undefined} tabIndex={-1}>\n {children}\n </div>\n )\n}\n\ninterface RelationshipRepairCandidatePickerProps {\n readonly environmentIds: ReadonlyArray<EnvironmentId>\n readonly onCreated: () => void\n readonly releaseId: ReleaseId\n readonly session: SessionSummary\n readonly transport?: RelationshipRepairCandidateTransport\n}\n\n/** Discover one incomplete relationship, preview its immutable draft, then create a governed proposal. */\nexport const RelationshipRepairCandidatePicker = ({\n environmentIds,\n onCreated,\n releaseId,\n session,\n transport = browserRelationshipRepairCandidateTransport\n}: RelationshipRepairCandidatePickerProps): ReactElement | null => {\n const [state, setState] = useState<PickerState>({ _tag: \"idle\" })\n const request = useRef<AbortController | null>(null)\n const actorId = session.actor._tag === \"human\" ? session.actor.personId : session.actor.agentId\n const authorityScope = `${session.sessionId}:${session.workspaceId}:${session.permission}:${session.actor._tag}:${actorId}`\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n request.current?.abort()\n request.current = null\n setState({ _tag: \"idle\" })\n return () => request.current?.abort()\n }, [authorityScope, environmentScopeKey, releaseId])\n\n if (session.permission !== \"workspace-owner\") return null\n\n const run = async <Value,>(\n effect: (signal: AbortSignal) => Promise<Value>,\n onSuccess: (value: Value) => void,\n onFailure: () => void\n ): Promise<void> => {\n request.current?.abort()\n const abort = new AbortController()\n request.current = abort\n try {\n const value = await effect(abort.signal)\n if (!abort.signal.aborted && request.current === abort) onSuccess(value)\n } catch {\n if (!abort.signal.aborted && request.current === abort) onFailure()\n } finally {\n if (request.current === abort) request.current = null\n }\n }\n\n const discover = (): void => {\n setState({ _tag: \"loading\" })\n void run(\n (signal) =>\n loadReleaseEnvironmentSlices(environmentIds, (environmentId) =>\n transport.list(releaseId, environmentId, signal)\n ),\n (pages) => setState({ _tag: \"ready\", page: aggregateCandidatePages(releaseId, pages) }),\n () => setState({ _tag: \"load-failed\" })\n )\n }\n\n const select = (candidate: RelationshipRepairCandidate, page: RelationshipRepairCandidates): void => {\n setState({ _tag: \"drafting\", page })\n void run(\n (signal) =>\n transport.draft(\n releaseId,\n candidate.impact.environmentId,\n candidate.relationship.relationshipId,\n candidate.relationship.revision,\n signal\n ),\n (draft) => setState({ _tag: \"draft\", draft, page }),\n () => setState({ _tag: \"draft-failed\", candidate, page })\n )\n }\n\n const refreshCandidate = (staleCandidate: RelationshipRepairCandidate): void => {\n setState({ _tag: \"loading\" })\n void run(\n (signal) =>\n loadReleaseEnvironmentSlices(environmentIds, (environmentId) =>\n transport.list(releaseId, environmentId, signal)\n ),\n (pages) => {\n const page = aggregateCandidatePages(releaseId, pages)\n const candidate = page.candidates.find(\n (item) => item.relationship.relationshipId === staleCandidate.relationship.relationshipId\n )\n if (candidate === undefined) {\n setState({ _tag: \"ready\", page })\n return\n }\n select(candidate, page)\n },\n () => setState({ _tag: \"load-failed\" })\n )\n }\n\n const create = (\n draft: RelationshipRepairProposalDraft,\n page: RelationshipRepairCandidates,\n pendingProposalId: RelationshipRepairProposalId | null = null\n ): void => {\n request.current?.abort()\n const abort = new AbortController()\n request.current = abort\n setState({ _tag: \"creating\", draft, page, proposalId: pendingProposalId })\n void (async () => {\n let proposalId = pendingProposalId\n try {\n proposalId ??= await transport.makeProposalId()\n if (abort.signal.aborted || request.current !== abort) return\n setState({ _tag: \"creating\", draft, page, proposalId })\n await transport.create(releaseId, draft, proposalId, abort.signal)\n if (abort.signal.aborted || request.current !== abort) return\n setState({ _tag: \"created\" })\n onCreated()\n } catch {\n if (!abort.signal.aborted && request.current === abort) {\n setState({ _tag: \"create-failed\", draft, page, proposalId })\n }\n } finally {\n if (request.current === abort) request.current = null\n }\n })()\n }\n\n if (state._tag === \"idle\") {\n return <Button onClick={discover}>Find repair candidates</Button>\n }\n if (state._tag === \"loading\") {\n return (\n <PickerResult announce stateTag={state._tag}>\n <Text tone=\"secondary\">Finding incomplete relationships…</Text>\n </PickerResult>\n )\n }\n if (state._tag === \"load-failed\") {\n return (\n <PickerResult stateTag={state._tag}>\n <StatePanel\n action={<Button onClick={discover}>Try again</Button>}\n announce=\"assertive\"\n description=\"Candidate discovery did not change the release.\"\n title=\"Could not find candidates\"\n tone=\"caution\"\n />\n </PickerResult>\n )\n }\n if (state._tag === \"created\") {\n return (\n <PickerResult announce stateTag={state._tag}>\n <StateLabel label=\"Proposal created\" tone=\"positive\" />\n </PickerResult>\n )\n }\n if (state._tag === \"drafting\") {\n return (\n <PickerResult announce stateTag={state._tag}>\n <Text tone=\"secondary\">Preparing an exact proposal…</Text>\n </PickerResult>\n )\n }\n if (state._tag === \"draft-failed\") {\n return (\n <PickerResult stateTag={state._tag}>\n <StatePanel\n action={<Button onClick={() => refreshCandidate(state.candidate)}>Refresh candidate</Button>}\n announce=\"assertive\"\n description=\"The relationship may have changed since discovery.\"\n title=\"Candidate is stale\"\n tone=\"caution\"\n />\n </PickerResult>\n )\n }\n if (state._tag === \"draft\" || state._tag === \"creating\" || state._tag === \"create-failed\") {\n const isCreating = state._tag === \"creating\"\n return (\n <PickerResult announce={isCreating} stateTag={state._tag}>\n <Surface as=\"section\" className={styles.draft} padding=\"none\" tone=\"secondary\">\n <div className={styles.draftHeader}>\n <div>\n <Text as=\"h4\" variant=\"card-title\">\n {titleCase(state.draft.proposal.disposition)} relationship\n </Text>\n <Text tone=\"tertiary\" variant=\"meta\">\n r{state.draft.precondition.expectedRevision} → r{state.draft.precondition.expectedRevision + 1}\n </Text>\n </div>\n <StateLabel label=\"Proposal preview\" size=\"compact\" tone=\"neutral\" />\n </div>\n <Text>{state.draft.proposal.rationale}</Text>\n {state._tag === \"create-failed\" ? (\n <Text role=\"alert\" tone=\"secondary\">\n The relationship changed or the proposal was not recorded. Refresh the candidate before retrying.\n </Text>\n ) : null}\n <div className={styles.actions}>\n <Button disabled={isCreating} onClick={() => setState({ _tag: \"ready\", page: state.page })} variant=\"quiet\">\n Back\n </Button>\n <Button\n loading={isCreating}\n onClick={() => create(state.draft, state.page, state._tag === \"create-failed\" ? state.proposalId : null)}\n variant=\"primary\"\n >\n Create proposal\n </Button>\n </div>\n </Surface>\n </PickerResult>\n )\n }\n\n if (state.page.candidates.length === 0) {\n return (\n <PickerResult announce stateTag={state._tag}>\n <Text tone=\"secondary\">No incomplete relationships need an owner decision.</Text>\n </PickerResult>\n )\n }\n return (\n <PickerResult stateTag={state._tag}>\n <div className={styles.candidates}>\n <div className={styles.candidateHeader}>\n <Text tone=\"secondary\">\n {state.page.candidates.length}\n {state.page.truncated ? \"+\" : \"\"} incomplete relationship\n {state.page.candidates.length === 1 ? \"\" : \"s\"}\n </Text>\n <Button onClick={() => setState({ _tag: \"idle\" })} variant=\"quiet\">\n Close\n </Button>\n </div>\n {state.page.candidates.map((candidate) => (\n <button\n className={styles.candidate}\n key={candidate.relationship.relationshipId}\n onClick={() => select(candidate, state.page)}\n type=\"button\"\n >\n <span>\n <strong>{candidateTitle(candidate)}</strong>\n <small>{candidate.explanation}</small>\n </span>\n <span aria-hidden=\"true\">→</span>\n </button>\n ))}\n </div>\n </PickerResult>\n )\n}\n","import * as BrowserCrypto from \"@effect/platform-browser/BrowserCrypto\"\nimport * as Crypto from \"effect/Crypto\"\nimport * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Schema from \"effect/Schema\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type {\n ApplyRelationshipRepairProposalResponse,\n RelationshipRepairProposalList\n} from \"../../api/deliveryGraph.js\"\nimport type {\n EnvironmentId,\n RelationshipRepairProposalId,\n RelationshipRepairReviewId,\n ReleaseId\n} from \"../../domain/identifiers.js\"\nimport { RelationshipRepairReviewId as RelationshipRepairReviewIdSchema } from \"../../domain/identifiers.js\"\nimport type { RelationshipRepairProposal, RelationshipRepairReviewDecision } from \"../../domain/relationshipRepair.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\n/** Generate a browser-native UUID v7 without weakening the public identifier contract. */\nexport const makeRelationshipRepairReviewId = Effect.gen(function*() {\n const cryptoService = yield* Crypto.Crypto\n const uuid = yield* cryptoService.randomUUIDv7\n return yield* Schema.decodeUnknownEffect(RelationshipRepairReviewIdSchema)(uuid)\n})\n\nexport interface RelationshipRepairTransport {\n readonly apply: (\n proposalId: RelationshipRepairProposalId,\n signal: AbortSignal\n ) => Promise<ApplyRelationshipRepairProposalResponse>\n readonly list: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposalList>\n readonly makeReviewId: () => Promise<RelationshipRepairReviewId>\n readonly review: (\n proposalId: RelationshipRepairProposalId,\n reviewId: RelationshipRepairReviewId,\n decision: RelationshipRepairReviewDecision,\n rationale: string,\n signal: AbortSignal\n ) => Promise<RelationshipRepairProposal>\n}\n\n/** Generated-client transport for the release repair decision ledger. */\nexport const browserRelationshipRepairTransport: RelationshipRepairTransport = {\n apply: (proposalId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.deliveryGraph.applyRepairProposal({ params: { proposalId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n list: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.listRepairProposals({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n makeReviewId: () => Effect.runPromise(makeRelationshipRepairReviewId.pipe(Effect.provide(BrowserCrypto.layer))),\n review: (proposalId, reviewId, decision, rationale, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.deliveryGraph.reviewRepairProposal({\n params: { proposalId },\n payload: {\n reviewId,\n decision,\n rationale\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n","import * as DateTime from \"effect/DateTime\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { MAXIMUM_REPAIR_PROPOSALS, type RelationshipRepairProposalList } from \"../../api/deliveryGraph.js\"\nimport type {\n EnvironmentId,\n RelationshipRepairProposalId,\n RelationshipRepairReviewId,\n ReleaseId\n} from \"../../domain/identifiers.js\"\nimport type {\n RelationshipRepairApplication,\n RelationshipRepairProposal,\n RelationshipRepairReviewDecision\n} from \"../../domain/relationshipRepair.js\"\nimport { loadReleaseEnvironmentSlices } from \"./loadReleaseEnvironmentSlices.js\"\nimport { browserRelationshipRepairTransport, type RelationshipRepairTransport } from \"./relationshipRepairTransport.js\"\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\nconst ignoreSessionExpired = (): void => undefined\n\nexport type RelationshipRepairPanelState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly actionFailure: RelationshipRepairProposalId | null\n readonly applications: ReadonlyMap<RelationshipRepairProposalId, RelationshipRepairApplication>\n readonly busyProposalId: RelationshipRepairProposalId | null\n readonly environmentScopeKey: string\n readonly page: RelationshipRepairProposalList\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n\nexport interface RelationshipRepairProposalController {\n readonly apply: (proposalId: RelationshipRepairProposalId) => Promise<boolean>\n readonly retry: () => void\n readonly review: (\n proposalId: RelationshipRepairProposalId,\n decision: RelationshipRepairReviewDecision,\n rationale: string\n ) => Promise<boolean>\n readonly state: RelationshipRepairPanelState\n}\n\ninterface PendingReviewIntent {\n readonly decision: RelationshipRepairReviewDecision\n readonly rationale: string\n readonly reviewId: RelationshipRepairReviewId\n}\n\nconst proposalOrder = (left: RelationshipRepairProposal, right: RelationshipRepairProposal): number => {\n const proposedAtOrder = DateTime.Order(right.proposedAt, left.proposedAt)\n return proposedAtOrder === 0 ? right.proposalId.localeCompare(left.proposalId) : proposedAtOrder\n}\n\nconst aggregateProposalPages = (\n releaseId: ReleaseId,\n pages: ReadonlyArray<RelationshipRepairProposalList>\n): RelationshipRepairProposalList => {\n const proposalsById = new Map<RelationshipRepairProposalId, RelationshipRepairProposal>()\n const applicationsByProposalId = new Map<RelationshipRepairProposalId, RelationshipRepairApplication>()\n for (const page of pages) {\n for (const proposal of page.proposals) proposalsById.set(proposal.proposalId, proposal)\n for (const application of page.applications) {\n applicationsByProposalId.set(application.proposalId, application)\n }\n }\n const orderedProposals = [...proposalsById.values()].sort(proposalOrder)\n const proposals = orderedProposals.slice(0, MAXIMUM_REPAIR_PROPOSALS)\n const applications = proposals.flatMap((proposal): ReadonlyArray<RelationshipRepairApplication> => {\n const application = applicationsByProposalId.get(proposal.proposalId)\n return application === undefined ? [] : [application]\n })\n return {\n releaseId,\n environmentId: null,\n status: null,\n truncated: pages.some(({ truncated }) => truncated) || orderedProposals.length > MAXIMUM_REPAIR_PROPOSALS,\n proposals,\n applications\n }\n}\n\n/** Keep one release's proposal ledger current after explicit review and apply actions. */\nexport const useRelationshipRepairProposals = (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n sessionKey: string | null,\n transport: RelationshipRepairTransport = browserRelationshipRepairTransport,\n onSessionExpired: (sessionKey: string) => void = ignoreSessionExpired\n): RelationshipRepairProposalController => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<RelationshipRepairPanelState>({ _tag: \"idle\" })\n const actionAbort = useRef<AbortController | null>(null)\n const busyProposal = useRef<RelationshipRepairProposalId | null>(null)\n const pendingReviews = useRef(new Map<RelationshipRepairProposalId, PendingReviewIntent>())\n const stateRef = useRef(state)\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n actionAbort.current?.abort()\n actionAbort.current = null\n busyProposal.current = null\n pendingReviews.current.clear()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\" })\n loadReleaseEnvironmentSlices(\n environmentIds,\n (environmentId) => transport.list(releaseId, environmentId, abort.signal)\n ).then(\n (pages) => {\n if (!abort.signal.aborted) {\n const page = aggregateProposalPages(releaseId, pages)\n setState({\n _tag: \"ready\",\n actionFailure: null,\n applications: new Map(page.applications.map((application) => [application.proposalId, application])),\n busyProposalId: null,\n environmentScopeKey,\n page,\n releaseId,\n sessionKey\n })\n }\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n }\n )\n return () => abort.abort()\n }, [environmentScopeKey, onSessionExpired, releaseId, requestRevision, sessionKey, transport])\n\n useEffect(() => () => actionAbort.current?.abort(), [])\n\n const currentState = state._tag === \"ready\" &&\n (state.environmentScopeKey !== environmentScopeKey ||\n state.releaseId !== releaseId ||\n state.sessionKey !== sessionKey)\n ? { _tag: \"loading\" } satisfies RelationshipRepairPanelState\n : state\n stateRef.current = currentState\n\n const beginAction = useCallback((proposalId: RelationshipRepairProposalId): AbortController | null => {\n if (stateRef.current._tag !== \"ready\" || busyProposal.current !== null) return null\n const abort = new AbortController()\n busyProposal.current = proposalId\n actionAbort.current?.abort()\n actionAbort.current = abort\n setState((current) =>\n current._tag === \"ready\"\n ? { ...current, actionFailure: null, busyProposalId: proposalId }\n : current\n )\n return abort\n }, [])\n\n const finishAction = useCallback((abort: AbortController): boolean => {\n if (actionAbort.current !== abort) return false\n actionAbort.current = null\n busyProposal.current = null\n return true\n }, [])\n\n const review = useCallback(async (\n proposalId: RelationshipRepairProposalId,\n decision: RelationshipRepairReviewDecision,\n rationale: string\n ): Promise<boolean> => {\n const abort = beginAction(proposalId)\n if (abort === null) return false\n try {\n const pending = pendingReviews.current.get(proposalId)\n const intent = pending?.decision === decision && pending.rationale === rationale\n ? pending\n : { decision, rationale, reviewId: await transport.makeReviewId() }\n pendingReviews.current.set(proposalId, intent)\n const proposal = await transport.review(proposalId, intent.reviewId, decision, rationale, abort.signal)\n if (!finishAction(abort) || abort.signal.aborted) return false\n pendingReviews.current.delete(proposalId)\n setState((current) =>\n current._tag !== \"ready\" || abort.signal.aborted\n ? current\n : {\n ...current,\n busyProposalId: null,\n page: {\n ...current.page,\n proposals: current.page.proposals.map((item) => item.proposalId === proposalId ? proposal : item)\n }\n }\n )\n return true\n } catch {\n if (!abort.signal.aborted && finishAction(abort)) {\n setState((current) =>\n current._tag === \"ready\"\n ? { ...current, actionFailure: proposalId, busyProposalId: null }\n : current\n )\n }\n return false\n }\n }, [beginAction, finishAction, transport])\n\n const apply = useCallback(async (proposalId: RelationshipRepairProposalId): Promise<boolean> => {\n const abort = beginAction(proposalId)\n if (abort === null) return false\n try {\n const result = await transport.apply(proposalId, abort.signal)\n if (!finishAction(abort) || abort.signal.aborted) return false\n setState((current) => {\n if (current._tag !== \"ready\" || abort.signal.aborted) return current\n const applications = new Map(current.applications)\n applications.set(proposalId, result.application)\n return { ...current, applications, busyProposalId: null }\n })\n return true\n } catch {\n if (!abort.signal.aborted && finishAction(abort)) {\n setState((current) =>\n current._tag === \"ready\"\n ? { ...current, actionFailure: proposalId, busyProposalId: null }\n : current\n )\n }\n return false\n }\n }, [beginAction, finishAction, transport])\n\n return {\n apply,\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n review,\n state: currentState\n }\n}\n",".root,\n.ledger,\n.proposal,\n.proposalHeader,\n.decision,\n.reviewEvidence,\n.reviewForm,\n.loading,\n.panelStack {\n display: grid;\n}\n\n.reviewEvidence {\n gap: var(--rly-space-4);\n padding: var(--rly-space-12) var(--rly-space-16);\n border-inline-start: var(--rly-space-4) solid var(--rly-color-border-2);\n background: var(--rly-color-surface-1);\n}\n\n.root,\n.loading,\n.panelStack {\n gap: var(--rly-space-24);\n}\n\n.header,\n.proposalHeader,\n.peopleTrace,\n.actions,\n.agentIdentity {\n align-items: center;\n display: flex;\n}\n\n.header,\n.proposalHeader {\n justify-content: space-between;\n}\n\n.header {\n gap: var(--rly-space-24);\n}\n\n.header > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.ledger {\n gap: var(--rly-space-12);\n}\n\n.proposal {\n gap: var(--rly-space-20);\n overflow: hidden;\n padding: var(--rly-space-24);\n}\n\n.proposalHeader {\n gap: var(--rly-space-16);\n}\n\n.decision {\n gap: var(--rly-space-4);\n}\n\n.decision strong {\n font: var(--rly-type-section-title-weight) var(--rly-type-section-title-size) /\n var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);\n letter-spacing: var(--rly-type-section-title-tracking);\n text-transform: capitalize;\n}\n\n.decision code {\n color: var(--rly-color-text-2);\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height)\n var(--rly-type-code-font);\n}\n\n.rationale {\n max-inline-size: 58ch;\n}\n\n.peopleTrace {\n flex-wrap: wrap;\n gap: var(--rly-space-12);\n}\n\n.traceArrow {\n color: var(--rly-color-text-3);\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / 1 var(--rly-type-code-font);\n}\n\n.agentIdentity {\n gap: var(--rly-space-8);\n}\n\n.agentGlyph {\n align-items: center;\n background: var(--rly-color-surface-3);\n border-radius: 50%;\n color: var(--rly-color-agent);\n display: inline-flex;\n block-size: var(--rly-space-24);\n inline-size: var(--rly-space-24);\n justify-content: center;\n}\n\n.agentIdentity > span:last-child {\n display: grid;\n}\n\n.agentIdentity strong,\n.agentIdentity small {\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.agentIdentity small {\n color: var(--rly-color-text-2);\n}\n\n.reviewForm {\n border-block-start: 1px solid var(--rly-color-border-1);\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-20);\n}\n\n.actions {\n flex-wrap: wrap;\n gap: var(--rly-space-8);\n}\n\n.actionFailure {\n margin-block: var(--rly-space-4);\n}\n\n.status:focus {\n border-radius: var(--rly-radius-control);\n}\n\n.srOnly {\n block-size: 1px;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n inline-size: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .header,\n .proposalHeader {\n align-items: flex-start;\n flex-direction: column;\n }\n\n .proposal {\n padding: var(--rly-space-20);\n }\n\n .traceArrow {\n display: none;\n }\n\n .peopleTrace {\n align-items: flex-start;\n flex-direction: column;\n }\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .reviewForm {\n animation: reveal-review 160ms ease-out both;\n }\n}\n\n@keyframes reveal-review {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n}\n","import { Person, type RlyPerson } from \"@knpkv/rly/patterns\"\nimport {\n Button,\n Field,\n type RlyStateTone,\n Skeleton,\n StateLabel,\n StatePanel,\n Surface,\n Text\n} from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\n\nimport type { SessionSummary } from \"../../api/session.js\"\nimport type { Actor } from \"../../domain/actors.js\"\nimport type {\n RelationshipRepairApplication,\n RelationshipRepairProposal,\n RelationshipRepairReviewDecision\n} from \"../../domain/relationshipRepair.js\"\nimport type { RelationshipRepairProposalId } from \"../../domain/identifiers.js\"\nimport { type BrowserSessionState, useBrowserSession } from \"../BrowserSession.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport { RelationshipRepairCandidatePicker } from \"./RelationshipRepairCandidatePicker.js\"\nimport { type RelationshipRepairPanelState, useRelationshipRepairProposals } from \"./useRelationshipRepairProposals.js\"\nimport type { RelationshipRepairTransport } from \"./relationshipRepairTransport.js\"\nimport styles from \"./RelationshipRepairPanel.module.css\"\n\nconst ignoreSessionExpired = (): void => undefined\n\ninterface RelationshipRepairPanelViewProps {\n readonly mutationsEnabled: boolean\n readonly onApply: (proposalId: RelationshipRepairProposalId) => Promise<boolean>\n readonly onRetry: () => void\n readonly onReview: (\n proposalId: RelationshipRepairProposalId,\n decision: RelationshipRepairReviewDecision,\n rationale: string\n ) => Promise<boolean>\n readonly release: PortfolioReleasePresentation\n readonly session: SessionSummary\n readonly state: RelationshipRepairPanelState\n}\n\nconst shortId = (id: string): string => id.slice(-6)\n\nconst isSameActor = (left: Actor, right: Actor): boolean =>\n left._tag === right._tag &&\n (left._tag === \"human\"\n ? right._tag === \"human\" && left.personId === right.personId\n : right._tag === \"agent\" && left.agentId === right.agentId)\n\nconst actorPerson = (\n actor: Extract<Actor, { readonly _tag: \"human\" }>,\n release: PortfolioReleasePresentation,\n role: string\n): RlyPerson => {\n const collaborator = release.collaborators.find(({ id }) => id.startsWith(`${actor.personId}:`))\n return collaborator === undefined\n ? { id: actor.personId, name: `Person ${shortId(actor.personId)}`, role }\n : { ...collaborator, role }\n}\n\nconst ActorIdentity = ({\n actor,\n release,\n role\n}: {\n readonly actor: Actor\n readonly release: PortfolioReleasePresentation\n readonly role: string\n}): ReactElement =>\n actor._tag === \"human\" ? (\n <Person person={actorPerson(actor, release, role)} size=\"compact\" />\n ) : (\n <div className={styles.agentIdentity}>\n <span aria-hidden=\"true\" className={styles.agentGlyph}>\n ✦\n </span>\n <span>\n <strong>Agent {shortId(actor.agentId)}</strong>\n <small>{role}</small>\n </span>\n </div>\n )\n\ninterface RepairStatusPresentation {\n readonly label: string\n readonly tone: RlyStateTone\n}\n\nconst statusPresentation = (\n proposal: RelationshipRepairProposal,\n application: RelationshipRepairApplication | undefined\n): RepairStatusPresentation => {\n if (application !== undefined) return { label: `Applied · r${application.appliedRevision}`, tone: \"positive\" }\n switch (proposal.status) {\n case \"pending\":\n return { label: \"Needs review\", tone: \"caution\" }\n case \"approved\":\n return { label: \"Ready to apply\", tone: \"positive\" }\n case \"rejected\":\n return { label: \"Rejected\", tone: \"critical\" }\n }\n}\n\nconst formattedTime = (timestamp: RelationshipRepairProposal[\"proposedAt\"]): string =>\n DateTime.formatUtc(timestamp, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\"\n })\n\ninterface ProposalRowProps {\n readonly actionFailed: boolean\n readonly application: RelationshipRepairApplication | undefined\n readonly isBusy: boolean\n readonly isGloballyBusy: boolean\n readonly mutationsEnabled: boolean\n readonly onApply: RelationshipRepairPanelViewProps[\"onApply\"]\n readonly onRetry: RelationshipRepairPanelViewProps[\"onRetry\"]\n readonly onReview: RelationshipRepairPanelViewProps[\"onReview\"]\n readonly proposal: RelationshipRepairProposal\n readonly release: PortfolioReleasePresentation\n readonly session: SessionSummary\n}\n\nconst ProposalRow = ({\n actionFailed,\n application,\n isBusy,\n isGloballyBusy,\n mutationsEnabled,\n onApply,\n onRetry,\n onReview,\n proposal,\n release,\n session\n}: ProposalRowProps): ReactElement => {\n const [isReviewing, setIsReviewing] = useState(false)\n const [rationale, setRationale] = useState(\"\")\n const [announcement, setAnnouncement] = useState<string | null>(null)\n const statusRef = useRef<HTMLDivElement>(null)\n const status = statusPresentation(proposal, application)\n const canReview =\n mutationsEnabled &&\n proposal.status === \"pending\" &&\n (session.permission === \"workspace-owner\" || session.permission === \"workspace-approver\") &&\n !isSameActor(proposal.origin.actor, session.actor)\n const canApply =\n mutationsEnabled &&\n proposal.status === \"approved\" &&\n application === undefined &&\n session.permission === \"workspace-owner\"\n const reviewRationale = rationale.trim()\n\n const review = async (decision: RelationshipRepairReviewDecision): Promise<void> => {\n if (reviewRationale.length === 0) return\n const recorded = await onReview(proposal.proposalId, decision, reviewRationale)\n if (!recorded) return\n setIsReviewing(false)\n setRationale(\"\")\n setAnnouncement(decision === \"approved\" ? \"Proposal approved.\" : \"Proposal rejected.\")\n }\n\n const apply = async (): Promise<void> => {\n const recorded = await onApply(proposal.proposalId)\n if (recorded) setAnnouncement(\"Repair applied.\")\n }\n\n useEffect(() => {\n if (announcement !== null) statusRef.current?.focus()\n }, [announcement])\n\n return (\n <Surface as=\"article\" className={styles.proposal} padding=\"none\" tone=\"secondary\">\n <header className={styles.proposalHeader}>\n <div className={styles.decision}>\n <strong>\n {proposal.disposition[0]?.toLocaleUpperCase(\"en-US\")}\n {proposal.disposition.slice(1)}\n </strong>\n <code>\n r{proposal.expectedRevision} → r{proposal.expectedRevision + 1}\n </code>\n </div>\n <div className={styles.status} ref={statusRef} tabIndex={announcement === null ? undefined : -1}>\n <StateLabel label={status.label} size=\"compact\" tone={status.tone} />\n <span aria-live=\"polite\" className={styles.srOnly}>\n {announcement ?? \"\"}\n </span>\n </div>\n </header>\n\n <Text className={styles.rationale} variant=\"body-large\">\n {proposal.rationale}\n </Text>\n\n <div className={styles.peopleTrace}>\n <ActorIdentity\n actor={proposal.origin.actor}\n release={release}\n role={`Proposed · ${formattedTime(proposal.proposedAt)}`}\n />\n {proposal.review === null ? null : (\n <>\n <span aria-hidden=\"true\" className={styles.traceArrow}>\n →\n </span>\n <ActorIdentity\n actor={proposal.review.origin.actor}\n release={release}\n role={`${proposal.review.decision === \"approved\" ? \"Approved\" : \"Rejected\"} · ${formattedTime(proposal.review.reviewedAt)}`}\n />\n </>\n )}\n {application === undefined ? null : (\n <>\n <span aria-hidden=\"true\" className={styles.traceArrow}>\n →\n </span>\n <ActorIdentity\n actor={application.origin.actor}\n release={release}\n role={`Applied revision ${application.appliedRevision} · ${formattedTime(application.appliedAt)}`}\n />\n </>\n )}\n </div>\n\n {proposal.review === null ? null : (\n <div className={styles.reviewEvidence}>\n <Text as=\"strong\" variant=\"label\">\n Review note\n </Text>\n <Text tone=\"secondary\">{proposal.review.rationale}</Text>\n </div>\n )}\n\n {actionFailed ? (\n <StatePanel\n action={<Button onClick={onRetry}>Reload decisions</Button>}\n announce=\"assertive\"\n className={styles.actionFailure}\n description=\"The proposal may have changed. Reload the release decisions before trying again.\"\n title=\"Action not recorded\"\n tone=\"caution\"\n />\n ) : null}\n\n {isReviewing && canReview ? (\n <form className={styles.reviewForm} onSubmit={(event) => event.preventDefault()}>\n <Field description=\"Stored with the immutable decision.\" label=\"Review note\" required>\n {(controlProps) => (\n <textarea\n {...controlProps}\n autoFocus\n maxLength={1_000}\n onChange={(event) => setRationale(event.currentTarget.value)}\n value={rationale}\n />\n )}\n </Field>\n <div className={styles.actions}>\n <Button\n disabled={reviewRationale.length === 0 || isGloballyBusy}\n loading={isBusy}\n onClick={() => void review(\"rejected\")}\n variant=\"quiet\"\n >\n Reject\n </Button>\n <Button\n disabled={reviewRationale.length === 0 || isGloballyBusy}\n loading={isBusy}\n onClick={() => void review(\"approved\")}\n variant=\"primary\"\n >\n Approve\n </Button>\n </div>\n </form>\n ) : (\n <div className={styles.actions}>\n {canReview ? (\n <Button disabled={isGloballyBusy} onClick={() => setIsReviewing(true)}>\n Review proposal\n </Button>\n ) : null}\n {canApply ? (\n <Button\n disabled={isGloballyBusy && !isBusy}\n loading={isBusy}\n onClick={() => void apply()}\n variant=\"primary\"\n >\n Apply repair\n </Button>\n ) : null}\n {proposal.status === \"pending\" && isSameActor(proposal.origin.actor, session.actor) ? (\n <Text tone=\"tertiary\" variant=\"meta\">\n Another owner or approver must review.\n </Text>\n ) : null}\n </div>\n )}\n </Surface>\n )\n}\n\nconst LoadingPanel = (): ReactElement => (\n <div aria-label=\"Loading release decisions\" className={styles.loading} role=\"status\">\n <Skeleton decorative={false} height=\"1.5rem\" label=\"Loading release decisions\" width=\"12rem\" />\n <Skeleton decorative height=\"11rem\" variant=\"block\" />\n </div>\n)\n\n/** Render the exact, human-attributed decision ledger for one release. */\nexport const RelationshipRepairPanelView = ({\n mutationsEnabled,\n onApply,\n onRetry,\n onReview,\n release,\n session,\n state\n}: RelationshipRepairPanelViewProps): ReactElement => {\n if (state._tag === \"idle\" || state._tag === \"loading\") return <LoadingPanel />\n if (state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={onRetry}>Try again</Button>}\n description=\"Control Center could not read the governed decisions for this release.\"\n title=\"Release decisions unavailable\"\n tone=\"caution\"\n />\n )\n }\n if (state.page.proposals.length === 0) {\n return (\n <StatePanel\n description=\"No relationship repair is waiting for review or application.\"\n title=\"No repair decisions\"\n />\n )\n }\n\n return (\n <div className={styles.root}>\n <header className={styles.header}>\n <div>\n <Text as=\"h3\" variant=\"card-title\">\n Repair decisions\n </Text>\n <Text tone=\"secondary\">One compact ledger from proposal to human decision to applied revision.</Text>\n </div>\n <StateLabel\n label={`${state.page.proposals.length}${state.page.truncated ? \"+\" : \"\"} decision${state.page.proposals.length === 1 ? \"\" : \"s\"}`}\n size=\"compact\"\n tone=\"neutral\"\n />\n </header>\n <div className={styles.ledger}>\n {state.page.proposals.map((proposal) => (\n <ProposalRow\n actionFailed={state.actionFailure === proposal.proposalId}\n application={state.applications.get(proposal.proposalId)}\n isBusy={state.busyProposalId === proposal.proposalId}\n isGloballyBusy={state.busyProposalId !== null}\n key={proposal.proposalId}\n mutationsEnabled={mutationsEnabled}\n onApply={onApply}\n onRetry={onRetry}\n onReview={onReview}\n proposal={proposal}\n release={release}\n session={session}\n />\n ))}\n </div>\n </div>\n )\n}\n\nconst sessionScopeKey = (session: SessionSummary): string => {\n const actorId = session.actor._tag === \"human\" ? session.actor.personId : session.actor.agentId\n return `${session.sessionId}:${session.workspaceId}:${session.permission}:${session.actor._tag}:${actorId}`\n}\n\ninterface RelationshipRepairSessionAccess {\n readonly mutationsEnabled: boolean\n readonly session: SessionSummary | null\n}\n\n/** Cookie-authenticated reads survive storage failure; mutation controls do not. */\nexport const relationshipRepairSessionAccess = (state: BrowserSessionState): RelationshipRepairSessionAccess => {\n switch (state._tag) {\n case \"authenticated\":\n return { mutationsEnabled: true, session: state.session }\n case \"storage-unavailable\":\n return { mutationsEnabled: false, session: state.session }\n case \"anonymous\":\n case \"blocked\":\n case \"checking\":\n case \"unavailable\":\n return { mutationsEnabled: false, session: null }\n }\n}\n\n/** Render the repair ledger from an explicit browser-session state. */\nexport const RelationshipRepairPanelContent = ({\n browserSessionState,\n onSessionExpired = ignoreSessionExpired,\n release,\n transport\n}: {\n readonly browserSessionState: BrowserSessionState\n readonly onSessionExpired?: (sessionKey: string) => void\n readonly release: PortfolioReleasePresentation\n readonly transport?: RelationshipRepairTransport\n}): ReactElement => {\n const access = relationshipRepairSessionAccess(browserSessionState)\n const controller = useRelationshipRepairProposals(\n release.id,\n release.targetEnvironmentIds,\n access.session?.sessionId ?? null,\n transport,\n onSessionExpired\n )\n if (access.session === null) return <LoadingPanel />\n return (\n <div className={styles.panelStack}>\n <RelationshipRepairPanelView\n mutationsEnabled={access.mutationsEnabled}\n onApply={controller.apply}\n onRetry={controller.retry}\n onReview={controller.review}\n release={release}\n session={access.session}\n state={controller.state}\n />\n {access.mutationsEnabled ? (\n <RelationshipRepairCandidatePicker\n environmentIds={release.targetEnvironmentIds}\n key={`${release.id}:${release.targetEnvironmentIds.join(\":\")}:${sessionScopeKey(access.session)}`}\n onCreated={controller.retry}\n releaseId={release.id}\n session={access.session}\n />\n ) : null}\n </div>\n )\n}\n\n/** Connect one full release view to its authenticated repair-proposal ledger. */\nexport const RelationshipRepairPanel = ({\n release\n}: {\n readonly release: PortfolioReleasePresentation\n}): ReactElement => {\n const browserSession = useBrowserSession()\n return (\n <RelationshipRepairPanelContent\n browserSessionState={browserSession.state}\n onSessionExpired={browserSession.invalidateSession}\n release={release}\n />\n )\n}\n",".state {\n display: grid;\n min-block-size: 60dvh;\n place-items: center;\n}\n\n.state a,\n.back,\n.releaseAction {\n color: inherit;\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.releaseAction {\n display: inline-flex;\n min-block-size: var(--rly-space-48);\n align-items: center;\n justify-content: center;\n padding-inline: var(--rly-space-24);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font-size: var(--rly-type-body-large-size);\n text-decoration: none;\n}\n\n.releaseAction:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-4);\n}\n\n.previewDetails,\n.evidence,\n.full,\n.fullHeader,\n.fullTitle,\n.section {\n display: grid;\n}\n\n.previewDetails,\n.evidence {\n gap: var(--rly-space-16);\n}\n\n.evidenceHeading,\n.fullIdentity {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-16);\n}\n\n.evidenceHeading > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.full {\n gap: clamp(4rem, 9vw, 8rem);\n}\n\n.fullHeader {\n gap: var(--rly-space-32);\n}\n\n.fullTitle {\n gap: var(--rly-space-12);\n}\n\n.fullTitle h1 {\n max-inline-size: 12ch;\n outline: none;\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.section {\n gap: var(--rly-space-24);\n}\n\n@media (max-width: 40rem) {\n .full {\n gap: var(--rly-space-64);\n }\n\n .fullHeader {\n gap: var(--rly-space-24);\n }\n}\n","import {\n AgentContextButton,\n FreshnessStamp,\n PeopleStrip,\n ReleasePreview,\n ReleaseRelay,\n ServiceMark,\n StageRail,\n Verdict\n} from \"@knpkv/rly/patterns\"\nimport { Button, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\nimport { Link, useLocation, useNavigate, useOutletContext, useParams, useViewTransitionState } from \"react-router\"\n\nimport { PortfolioOverviewView } from \"../portfolio/PortfolioOverview.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport type { WorkspaceReleaseOutletContext } from \"./WorkspaceReleaseLayout.js\"\nimport {\n decodeReleaseRouteId,\n readReleaseOrigin,\n releaseActiveWorkPath,\n releaseAgentPath,\n resolveReleaseOrigin,\n releaseFullPath,\n releaseOriginHref,\n releaseParentPath,\n releasePreviewPath,\n releaseTransitionNames,\n workspaceItemsPath\n} from \"./releaseRoutes.js\"\nimport styles from \"./ReleaseRoute.module.css\"\nimport { useCompactReleasePreview, usePrefersReducedReleaseMotion } from \"./useCompactReleasePreview.js\"\nimport { RelationshipRepairPanel } from \"./RelationshipRepairPanel.js\"\nimport { ReleaseWorkset } from \"./ReleaseWorkset.js\"\n\ninterface ReleaseRouteSelection {\n readonly release: PortfolioReleasePresentation\n readonly releaseId: NonNullable<ReturnType<typeof decodeReleaseRouteId>>\n}\n\nconst selectRelease = (\n context: WorkspaceReleaseOutletContext,\n routeReleaseId: string | undefined\n): ReleaseRouteSelection | null => {\n const releaseId = decodeReleaseRouteId(routeReleaseId)\n if (releaseId === null || context.controller.state._tag !== \"ready\") return null\n const release = context.controller.state.portfolio.releases.find((candidate) => candidate.id === releaseId)\n return release === undefined ? null : { release, releaseId }\n}\n\nconst ReleaseNotFound = ({ workspaceId }: Pick<WorkspaceReleaseOutletContext, \"workspaceId\">): ReactElement => {\n const stateRef = useRef<HTMLElement>(null)\n useEffect(() => stateRef.current?.focus(), [])\n return (\n <section className={styles.state} data-release-not-found=\"\" ref={stateRef} tabIndex={-1}>\n <StatePanel\n action={<Link to={releaseParentPath(workspaceId)}>Return to workspace overview</Link>}\n description=\"This release does not exist in the current workspace snapshot. It may have been removed or the address may be incorrect.\"\n title=\"Release not found\"\n />\n </section>\n )\n}\n\nconst ReleaseRouteLoading = ({ context }: { readonly context: WorkspaceReleaseOutletContext }): ReactElement => {\n const stateRef = useRef<HTMLDivElement>(null)\n useEffect(() => stateRef.current?.querySelector<HTMLElement>(\"#portfolio-title\")?.focus(), [])\n return (\n <div ref={stateRef}>\n <PortfolioOverviewView\n onPreviewRelease={() => undefined}\n onRetry={context.controller.onRetry}\n state={context.controller.state}\n />\n </div>\n )\n}\n\nexport const ReleaseAction = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const location = useLocation()\n const action = (() => {\n switch (release.readinessVerdict) {\n case \"blocked\":\n return { label: \"Review blocker\", to: releaseActiveWorkPath(context.workspaceId, release.id) }\n case \"held\":\n return { label: \"Repair missing links\", to: `${releaseFullPath(context.workspaceId, release.id)}#release-work` }\n case \"ready\":\n return {\n label: \"Review ship evidence\",\n to: `${releaseFullPath(context.workspaceId, release.id)}#release-evidence`\n }\n case \"deploying\":\n return { label: \"Open deployment\", to: `${releaseFullPath(context.workspaceId, release.id)}#release-work` }\n case \"building\":\n return { label: \"Open build\", to: `${releaseFullPath(context.workspaceId, release.id)}#release-work` }\n case \"shipped\":\n return {\n label: \"View release record\",\n to: `${releaseFullPath(context.workspaceId, release.id)}#release-evidence`\n }\n case \"unknown\":\n return null\n }\n })()\n return action === null ? (\n <Button disabled size=\"principal\" stretch variant=\"primary\">\n Readiness evidence required\n </Button>\n ) : (\n <Link className={styles.releaseAction} state={location.state} to={action.to}>\n {action.label}\n </Link>\n )\n}\n\nexport const ReleaseEvidence = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement => (\n <Surface as=\"section\" className={styles.evidence} padding=\"compact\" tone=\"secondary\">\n <div className={styles.evidenceHeading}>\n {release.source.service === null ? null : <ServiceMark service={release.source.service} />}\n <div>\n <Text as=\"h2\" variant=\"card-title\">\n {release.source.displayName}\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n Source evidence\n </Text>\n </div>\n </div>\n <StateLabel label={release.source.healthLabel} size=\"compact\" tone={release.source.healthTone} />\n {release.source.warning === null ? (\n <Text tone=\"secondary\">Detailed evidence is not evaluated in the tracer snapshot.</Text>\n ) : (\n <Text tone=\"secondary\">{release.source.warning}</Text>\n )}\n </Surface>\n)\n\nconst releaseContextLabel = (release: PortfolioReleasePresentation): string =>\n `${release.serviceName} · ${release.version} · ${release.relay.codename} · ${release.id}`\n\nexport const ReleaseAgentEntry = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const location = useLocation()\n const navigate = useNavigate()\n const prefersReducedMotion = usePrefersReducedReleaseMotion()\n return (\n <AgentContextButton\n actionLabel=\"Ask about this release\"\n agentName=\"Relay\"\n context={releaseContextLabel(release)}\n onClick={() =>\n navigate(releaseAgentPath(context.workspaceId, release.id), {\n state: location.state,\n viewTransition: !prefersReducedMotion\n })\n }\n />\n )\n}\n\nconst CompleteCollaborators = ({ release }: { readonly release: PortfolioReleasePresentation }): ReactElement =>\n release.collaborators.length === 0 ? (\n <StatePanel\n description=\"Assign an owner or approver before a governed release action can proceed.\"\n title=\"No release collaborators assigned\"\n />\n ) : (\n <PeopleStrip\n aria-label={`All ${release.serviceName} release collaborators`}\n expanded\n limit={release.collaborators.length}\n onExpandedChange={() => undefined}\n people={release.collaborators}\n />\n )\n\ntype PreviewExit = \"origin\" | null\n\nconst ReleasePreviewContent = ({ selection }: { readonly selection: ReleaseRouteSelection }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const isCompact = useCompactReleasePreview()\n const prefersReducedMotion = usePrefersReducedReleaseMotion()\n const location = useLocation()\n const navigate = useNavigate()\n const [exit, setExit] = useState<PreviewExit>(null)\n const [isOpen, setIsOpen] = useState(true)\n const resolvedOrigin = resolveReleaseOrigin(location.state, context.workspaceId, selection.releaseId)\n const originHref = releaseOriginHref(resolvedOrigin.origin)\n const fullPath = releaseFullPath(context.workspaceId, selection.releaseId)\n const agentPath = releaseAgentPath(context.workspaceId, selection.releaseId)\n const previewPath = releasePreviewPath(context.workspaceId, selection.releaseId)\n const isPreviewTransitioning = useViewTransitionState(previewPath)\n const isFullTransitioning = useViewTransitionState(fullPath)\n const isAgentTransitioning = useViewTransitionState(agentPath)\n const transitionNames =\n isPreviewTransitioning || isFullTransitioning || isAgentTransitioning\n ? releaseTransitionNames(selection.releaseId)\n : undefined\n\n useEffect(() => {\n if (isOpen || exit === null) return\n navigate(originHref, { replace: true })\n }, [context.workspaceId, exit, isOpen, navigate, originHref, selection.releaseId])\n\n const requestOrigin = (): void => {\n context.requestReleaseFocus(selection.releaseId)\n setExit(\"origin\")\n setIsOpen(false)\n }\n\n return (\n <ReleasePreview\n agentEntry={<ReleaseAgentEntry release={selection.release} />}\n collaborators={<CompleteCollaborators release={selection.release} />}\n entryMotion={resolvedOrigin.isStored ? \"external\" : \"intrinsic\"}\n evidence={<ReleaseEvidence release={selection.release} />}\n onOpenChange={(open) => {\n if (!open) requestOrigin()\n }}\n onOpenFullView={() => navigate(fullPath, { state: location.state, viewTransition: !prefersReducedMotion })}\n open={isOpen}\n openFullViewLabel={`Open ${selection.release.relay.codename} full view`}\n presentation={isCompact ? \"sheet\" : \"dialog\"}\n primaryAction={<ReleaseAction release={selection.release} />}\n release={selection.release.release}\n stages={<StageRail heading=\"Release stages\" stages={selection.release.stages} />}\n {...(transitionNames === undefined ? {} : { transitionNames })}\n workset={\n <div className={styles.previewDetails}>\n <ReleaseWorkset release={selection.release} workspaceId={context.workspaceId} />\n </div>\n }\n />\n )\n}\n\n/** Render the canonical release preview over its still-mounted workspace origin. */\nexport const ReleasePreviewRoute = (): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const params = useParams()\n if (context.controller.state._tag !== \"ready\") return <ReleaseRouteLoading context={context} />\n const selection = selectRelease(context, params.releaseId)\n return selection === null ? (\n <ReleaseNotFound workspaceId={context.workspaceId} />\n ) : (\n <ReleasePreviewContent selection={selection} />\n )\n}\n\nconst FullRelease = ({ selection }: { readonly selection: ReleaseRouteSelection }): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const location = useLocation()\n const headingRef = useRef<HTMLHeadingElement>(null)\n const origin = readReleaseOrigin(location.state, context.workspaceId, selection.releaseId)\n const originLabel = origin.pathname === workspaceItemsPath(context.workspaceId) ? \"Back to items\" : \"Back to overview\"\n const release = selection.release\n const fullPath = releaseFullPath(context.workspaceId, selection.releaseId)\n const agentPath = releaseAgentPath(context.workspaceId, selection.releaseId)\n const isFullTransitioning = useViewTransitionState(fullPath)\n const isAgentTransitioning = useViewTransitionState(agentPath)\n const transitionNames =\n isFullTransitioning || isAgentTransitioning ? releaseTransitionNames(selection.releaseId) : undefined\n\n useEffect(() => headingRef.current?.focus(), [])\n\n return (\n <article className={styles.full} data-release-full-id={release.id}>\n <header className={styles.fullHeader}>\n <Link className={styles.back} to={releaseOriginHref(origin)}>\n {originLabel}\n </Link>\n <div className={styles.fullIdentity}>\n <ReleaseRelay\n algorithm={release.relay.algorithm}\n codename={release.relay.codename}\n data-rly-release-transition-name={transitionNames?.relay}\n data-rly-release-transition-part=\"relay\"\n size=\"hero\"\n style={transitionNames === undefined ? undefined : { viewTransitionName: transitionNames.relay }}\n symbolIndices={release.relay.symbolIndices}\n />\n {release.source.freshnessDateTime === null || release.source.freshnessTime === null ? (\n <FreshnessStamp state={release.source.freshness} />\n ) : (\n <FreshnessStamp\n dateTime={release.source.freshnessDateTime}\n state={release.source.freshness}\n time={release.source.freshnessTime}\n />\n )}\n </div>\n <div className={styles.fullTitle}>\n <Text as=\"h1\" id=\"release-title\" ref={headingRef} tabIndex={-1} variant=\"verdict\">\n {release.serviceName}\n </Text>\n <Text\n as=\"code\"\n data-rly-release-transition-name={transitionNames?.version}\n data-rly-release-transition-part=\"version\"\n style={transitionNames === undefined ? undefined : { viewTransitionName: transitionNames.version }}\n tone=\"secondary\"\n variant=\"code\"\n >\n {release.version}\n </Text>\n </div>\n <Verdict\n data-rly-release-transition-name={transitionNames?.verdict}\n data-rly-release-transition-part=\"verdict\"\n reason={release.readinessReason}\n style={transitionNames === undefined ? undefined : { viewTransitionName: transitionNames.verdict }}\n tone={release.release.tone}\n verdict={release.release.verdict}\n />\n <ReleaseAction release={release} />\n </header>\n\n <StageRail heading=\"Build, verify, production\" stages={release.stages} />\n <section aria-labelledby=\"release-people\" className={styles.section}>\n <Text as=\"h2\" id=\"release-people\" variant=\"section-title\">\n People\n </Text>\n <CompleteCollaborators release={release} />\n </section>\n <section aria-labelledby=\"release-work-title\" className={styles.section} id=\"release-work\">\n <Text as=\"h2\" id=\"release-work-title\" variant=\"section-title\">\n Delivery relationships\n </Text>\n <ReleaseWorkset release={release} workspaceId={context.workspaceId} />\n <RelationshipRepairPanel release={release} />\n </section>\n <section aria-labelledby=\"release-evidence-title\" className={styles.section} id=\"release-evidence\">\n <Text as=\"h2\" id=\"release-evidence-title\" variant=\"section-title\">\n Evidence\n </Text>\n <ReleaseEvidence release={release} />\n </section>\n <section aria-labelledby=\"release-agent\" className={styles.section}>\n <Text as=\"h2\" id=\"release-agent\" variant=\"section-title\">\n Release agent\n </Text>\n <ReleaseAgentEntry release={release} />\n </section>\n </article>\n )\n}\n\n/** Render an exact release at its canonical full route without selecting a fallback entity. */\nexport const ReleaseFullRoute = (): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const params = useParams()\n if (context.controller.state._tag !== \"ready\") return <ReleaseRouteLoading context={context} />\n const selection = selectRelease(context, params.releaseId)\n return selection === null ? (\n <ReleaseNotFound workspaceId={context.workspaceId} />\n ) : (\n <FullRelease selection={selection} />\n )\n}\n"],"mappings":"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"}
|