@knpkv/control-center 0.9.4 → 0.9.5

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.
Files changed (248) hide show
  1. package/dist/client/.vite/manifest.json +406 -406
  2. package/dist/client/assets/ActiveWorkPage-CeWw2uZl.js +2 -0
  3. package/dist/client/assets/ActiveWorkPage-CeWw2uZl.js.map +1 -0
  4. package/dist/client/assets/{AgentPage-YiYORLod.js → AgentPage-BAy7IgjJ.js} +3 -3
  5. package/dist/client/assets/AgentPage-BAy7IgjJ.js.map +1 -0
  6. package/dist/client/assets/{AtlassianOAuthCallbackPage-PfsrTytb.js → AtlassianOAuthCallbackPage-DDCTmcmB.js} +2 -2
  7. package/dist/client/assets/AtlassianOAuthCallbackPage-DDCTmcmB.js.map +1 -0
  8. package/dist/client/assets/{AuthorizedSharePage-BCwnILXF.js → AuthorizedSharePage-BZPfotuK.js} +2 -2
  9. package/dist/client/assets/AuthorizedSharePage-BZPfotuK.js.map +1 -0
  10. package/dist/client/assets/{BrowserSessionHydrator-BAb76EvO.js → BrowserSessionHydrator-B3yI9F2z.js} +2 -2
  11. package/dist/client/assets/{BrowserSessionHydrator-BAb76EvO.js.map → BrowserSessionHydrator-B3yI9F2z.js.map} +1 -1
  12. package/dist/client/assets/{CommandSearch-BSVXQfjF.js → CommandSearch-BrwiVFBI.js} +2 -2
  13. package/dist/client/assets/{CommandSearch-BSVXQfjF.js.map → CommandSearch-BrwiVFBI.js.map} +1 -1
  14. package/dist/client/assets/Domain-DH_T_LJ8.js.map +1 -1
  15. package/dist/client/assets/{ItemsPage-BzinDuxs.js → ItemsPage-CYmo7Dkm.js} +2 -2
  16. package/dist/client/assets/ItemsPage-CYmo7Dkm.js.map +1 -0
  17. package/dist/client/assets/{OpenPullRequestPage-BABGk9v2.js → OpenPullRequestPage-BcwTerpY.js} +2 -2
  18. package/dist/client/assets/OpenPullRequestPage-BcwTerpY.js.map +1 -0
  19. package/dist/client/assets/{Pages-Bfn7_LhJ.js → Pages-Cj24BSjm.js} +2 -2
  20. package/dist/client/assets/{Pages-Bfn7_LhJ.js.map → Pages-Cj24BSjm.js.map} +1 -1
  21. package/dist/client/assets/{PairPage-4meDmW_A.js → PairPage-JhivkRf1.js} +2 -2
  22. package/dist/client/assets/PairPage-JhivkRf1.js.map +1 -0
  23. package/dist/client/assets/PortfolioOverview-C0RZCx6V.js +2 -0
  24. package/dist/client/assets/PortfolioOverview-C0RZCx6V.js.map +1 -0
  25. package/dist/client/assets/{PullRequestReviewPanel-68vgbLzs.js → PullRequestReviewPanel-BeYAld4m.js} +4 -4
  26. package/dist/client/assets/{PullRequestReviewPanel-68vgbLzs.js.map → PullRequestReviewPanel-BeYAld4m.js.map} +1 -1
  27. package/dist/client/assets/ReleaseRoute-1bUQCSJi.js +2 -0
  28. package/dist/client/assets/ReleaseRoute-1bUQCSJi.js.map +1 -0
  29. package/dist/client/assets/{ReleaseWorkset-DcI6qwPE.js → ReleaseWorkset-DGufwIFe.js} +2 -2
  30. package/dist/client/assets/ReleaseWorkset-DGufwIFe.js.map +1 -0
  31. package/dist/client/assets/{ReviewSuggestionOverview-kNqjbwKQ.js → ReviewSuggestionOverview-CfU-Ynzq.js} +2 -2
  32. package/dist/client/assets/{ReviewSuggestionOverview-kNqjbwKQ.js.map → ReviewSuggestionOverview-CfU-Ynzq.js.map} +1 -1
  33. package/dist/client/assets/{ReviewSuggestionPublicationSurface-BtoYEprT.js → ReviewSuggestionPublicationSurface-DA-3PPs_.js} +2 -2
  34. package/dist/client/assets/ReviewSuggestionPublicationSurface-DA-3PPs_.js.map +1 -0
  35. package/dist/client/assets/{ServicesPage-DihUx1kr.js → ServicesPage-6G9OTRDn.js} +2 -2
  36. package/dist/client/assets/ServicesPage-6G9OTRDn.js.map +1 -0
  37. package/dist/client/assets/{TimelinePage-DyluBeEt.js → TimelinePage-D6YUtggO.js} +2 -2
  38. package/dist/client/assets/TimelinePage-D6YUtggO.js.map +1 -0
  39. package/dist/client/assets/{WorkspaceEntityLink-DjonIGqM.js → WorkspaceEntityLink-BqUurz8P.js} +2 -2
  40. package/dist/client/assets/{WorkspaceEntityLink-DjonIGqM.js.map → WorkspaceEntityLink-BqUurz8P.js.map} +1 -1
  41. package/dist/client/assets/{WorkspaceEntityRoute-DUVwW5WN.js → WorkspaceEntityRoute-CfupCFGN.js} +4 -4
  42. package/dist/client/assets/{WorkspaceEntityRoute-DUVwW5WN.js.map → WorkspaceEntityRoute-CfupCFGN.js.map} +1 -1
  43. package/dist/client/assets/{WorkspaceHomeLink-DSGM8jZK.js → WorkspaceHomeLink-DkAnxFk1.js} +2 -2
  44. package/dist/client/assets/{WorkspaceHomeLink-DSGM8jZK.js.map → WorkspaceHomeLink-DkAnxFk1.js.map} +1 -1
  45. package/dist/client/assets/{WorkspacePullRequestDetails-Z3MfihsH.js → WorkspacePullRequestDetails-SexYOZUB.js} +3 -3
  46. package/dist/client/assets/{WorkspacePullRequestDetails-Z3MfihsH.js.map → WorkspacePullRequestDetails-SexYOZUB.js.map} +1 -1
  47. package/dist/client/assets/{WorkspaceReleaseLayout-S6XHWEwh.js → WorkspaceReleaseLayout-J_IWrKc9.js} +2 -2
  48. package/dist/client/assets/{WorkspaceReleaseLayout-S6XHWEwh.js.map → WorkspaceReleaseLayout-J_IWrKc9.js.map} +1 -1
  49. package/dist/client/assets/{WorkspaceSettingsPage-Dn_eDC3m.js → WorkspaceSettingsPage-CFB0X_Oz.js} +2 -2
  50. package/dist/client/assets/WorkspaceSettingsPage-CFB0X_Oz.js.map +1 -0
  51. package/dist/client/assets/{angular-html-B-gwpVlh-DEM_d4RI.js → angular-html-B-gwpVlh-BHk2rITT.js} +2 -2
  52. package/dist/client/assets/{angular-html-B-gwpVlh-DEM_d4RI.js.map → angular-html-B-gwpVlh-BHk2rITT.js.map} +1 -1
  53. package/dist/client/assets/{angular-ts-BdaH9qH_-6UMLodBB.js → angular-ts-BdaH9qH_-DDpR3-gU.js} +2 -2
  54. package/dist/client/assets/{angular-ts-BdaH9qH_-6UMLodBB.js.map → angular-ts-BdaH9qH_-DDpR3-gU.js.map} +1 -1
  55. package/dist/client/assets/{apl-BLTDDucx-DIkkahEc.js → apl-BLTDDucx-C5lAAuBL.js} +2 -2
  56. package/dist/client/assets/{apl-BLTDDucx-DIkkahEc.js.map → apl-BLTDDucx-C5lAAuBL.js.map} +1 -1
  57. package/dist/client/assets/{astro-CM3EIsEH-D5DYxAYu.js → astro-CM3EIsEH-C-4mMpDY.js} +2 -2
  58. package/dist/client/assets/{astro-CM3EIsEH-D5DYxAYu.js.map → astro-CM3EIsEH-C-4mMpDY.js.map} +1 -1
  59. package/dist/client/assets/{blade-BuLZ1b4i-CBKkB_Nt.js → blade-BuLZ1b4i-Bo26Vrie.js} +2 -2
  60. package/dist/client/assets/{blade-BuLZ1b4i-CBKkB_Nt.js.map → blade-BuLZ1b4i-Bo26Vrie.js.map} +1 -1
  61. package/dist/client/assets/{c-BOe7FNWg-C15nlYFX.js → c-BOe7FNWg-Bn-hh2gC.js} +2 -2
  62. package/dist/client/assets/{c-BOe7FNWg-C15nlYFX.js.map → c-BOe7FNWg-Bn-hh2gC.js.map} +1 -1
  63. package/dist/client/assets/{chapel-DS426I0C-DoL0pgIr.js → chapel-DS426I0C-DZfMl2AF.js} +2 -2
  64. package/dist/client/assets/{chapel-DS426I0C-DoL0pgIr.js.map → chapel-DS426I0C-DZfMl2AF.js.map} +1 -1
  65. package/dist/client/assets/{cobol-D88xw2SU-DlPiznQQ.js → cobol-D88xw2SU-Dszzocsd.js} +2 -2
  66. package/dist/client/assets/{cobol-D88xw2SU-DlPiznQQ.js.map → cobol-D88xw2SU-Dszzocsd.js.map} +1 -1
  67. package/dist/client/assets/{coffee-9O-pYXz5-QB78c27T.js → coffee-9O-pYXz5-B-EAY7Cr.js} +2 -2
  68. package/dist/client/assets/{coffee-9O-pYXz5-QB78c27T.js.map → coffee-9O-pYXz5-B-EAY7Cr.js.map} +1 -1
  69. package/dist/client/assets/{controlCenterRelayDock-CDyCPu8u.js → controlCenterRelayDock-Bq4z8Xad.js} +3 -3
  70. package/dist/client/assets/{controlCenterRelayDock-CDyCPu8u.js.map → controlCenterRelayDock-Bq4z8Xad.js.map} +1 -1
  71. package/dist/client/assets/{controlCenterRelayDockChrome-BWLgzJhc.js → controlCenterRelayDockChrome-M45VQcSE.js} +2 -2
  72. package/dist/client/assets/{controlCenterRelayDockChrome-BWLgzJhc.js.map → controlCenterRelayDockChrome-M45VQcSE.js.map} +1 -1
  73. package/dist/client/assets/{cpp-CPk7VU6o-XEasjJQb.js → cpp-CPk7VU6o-B1PTCDWN.js} +2 -2
  74. package/dist/client/assets/{cpp-CPk7VU6o-XEasjJQb.js.map → cpp-CPk7VU6o-B1PTCDWN.js.map} +1 -1
  75. package/dist/client/assets/{crystal-CRftOMVe-Cl7VOKqv.js → crystal-CRftOMVe-3NFSGC4Y.js} +2 -2
  76. package/dist/client/assets/{crystal-CRftOMVe-Cl7VOKqv.js.map → crystal-CRftOMVe-3NFSGC4Y.js.map} +1 -1
  77. package/dist/client/assets/{css-DKjIhbA_-BqYkMclh.js → css-DKjIhbA_-BZzy1gno.js} +2 -2
  78. package/dist/client/assets/{css-DKjIhbA_-BqYkMclh.js.map → css-DKjIhbA_-BZzy1gno.js.map} +1 -1
  79. package/dist/client/assets/{diff-c2VIds2u.js → diff-CuvBMVEl.js} +3 -3
  80. package/dist/client/assets/{diff-c2VIds2u.js.map → diff-CuvBMVEl.js.map} +1 -1
  81. package/dist/client/assets/{edge-CZci3foK-CcvbLJND.js → edge-CZci3foK-BdZTWeOq.js} +2 -2
  82. package/dist/client/assets/{edge-CZci3foK-CcvbLJND.js.map → edge-CZci3foK-BdZTWeOq.js.map} +1 -1
  83. package/dist/client/assets/{elixir-BFbWRTPN-DCo1tsYk.js → elixir-BFbWRTPN-BSsfSNAc.js} +2 -2
  84. package/dist/client/assets/{elixir-BFbWRTPN-DCo1tsYk.js.map → elixir-BFbWRTPN-BSsfSNAc.js.map} +1 -1
  85. package/dist/client/assets/{elm-BFCSOEGh-KAuEEkOS.js → elm-BFCSOEGh-B7etdM00.js} +2 -2
  86. package/dist/client/assets/{elm-BFCSOEGh-KAuEEkOS.js.map → elm-BFCSOEGh-B7etdM00.js.map} +1 -1
  87. package/dist/client/assets/{erb-C0EkZJvn-3O5TlDRJ.js → erb-C0EkZJvn-BUpElafA.js} +2 -2
  88. package/dist/client/assets/{erb-C0EkZJvn-3O5TlDRJ.js.map → erb-C0EkZJvn-BUpElafA.js.map} +1 -1
  89. package/dist/client/assets/{git-rebase-DBDs07B2-BKfziPiX.js → git-rebase-DBDs07B2-3YW7dddl.js} +2 -2
  90. package/dist/client/assets/{git-rebase-DBDs07B2-BKfziPiX.js.map → git-rebase-DBDs07B2-3YW7dddl.js.map} +1 -1
  91. package/dist/client/assets/{glimmer-js-oqYt1Bty-oOPiIwDh.js → glimmer-js-oqYt1Bty-Q18N5198.js} +2 -2
  92. package/dist/client/assets/{glimmer-js-oqYt1Bty-oOPiIwDh.js.map → glimmer-js-oqYt1Bty-Q18N5198.js.map} +1 -1
  93. package/dist/client/assets/{glimmer-ts-CjmgbZTn-C8gjUbKN.js → glimmer-ts-CjmgbZTn-DflPUBBN.js} +2 -2
  94. package/dist/client/assets/{glimmer-ts-CjmgbZTn-C8gjUbKN.js.map → glimmer-ts-CjmgbZTn-DflPUBBN.js.map} +1 -1
  95. package/dist/client/assets/{glsl-BqUMGrwT-5PoVKbXD.js → glsl-BqUMGrwT-DZSnNyRQ.js} +2 -2
  96. package/dist/client/assets/{glsl-BqUMGrwT-5PoVKbXD.js.map → glsl-BqUMGrwT-DZSnNyRQ.js.map} +1 -1
  97. package/dist/client/assets/{graphql-CEJryLGF-Bx3HP-fV.js → graphql-CEJryLGF-BxoDC-bv.js} +2 -2
  98. package/dist/client/assets/{graphql-CEJryLGF-Bx3HP-fV.js.map → graphql-CEJryLGF-BxoDC-bv.js.map} +1 -1
  99. package/dist/client/assets/{hack-DwBIwaGr-C2bRI1k_.js → hack-DwBIwaGr-BD9UbS9V.js} +2 -2
  100. package/dist/client/assets/{hack-DwBIwaGr-C2bRI1k_.js.map → hack-DwBIwaGr-BD9UbS9V.js.map} +1 -1
  101. package/dist/client/assets/{haml-BgD6GFV2-C-E92qmq.js → haml-BgD6GFV2-tYRnxnkA.js} +2 -2
  102. package/dist/client/assets/{haml-BgD6GFV2-C-E92qmq.js.map → haml-BgD6GFV2-tYRnxnkA.js.map} +1 -1
  103. package/dist/client/assets/{handlebars-DAEAtsmp-B3Qkz-fG.js → handlebars-DAEAtsmp-CzuHoTaP.js} +2 -2
  104. package/dist/client/assets/{handlebars-DAEAtsmp-B3Qkz-fG.js.map → handlebars-DAEAtsmp-CzuHoTaP.js.map} +1 -1
  105. package/dist/client/assets/{html-B63qAdeQ-mzUq7RfB.js → html-B63qAdeQ-BvgXBi7v.js} +2 -2
  106. package/dist/client/assets/{html-B63qAdeQ-mzUq7RfB.js.map → html-B63qAdeQ-BvgXBi7v.js.map} +1 -1
  107. package/dist/client/assets/{html-derivative-DliF0Izh-DKttJgx1.js → html-derivative-DliF0Izh-BdazZa_A.js} +2 -2
  108. package/dist/client/assets/{html-derivative-DliF0Izh-DKttJgx1.js.map → html-derivative-DliF0Izh-BdazZa_A.js.map} +1 -1
  109. package/dist/client/assets/{http-BPdteiK2-BzL978Ty.js → http-BPdteiK2-DscIPq9Z.js} +2 -2
  110. package/dist/client/assets/{http-BPdteiK2-BzL978Ty.js.map → http-BPdteiK2-DscIPq9Z.js.map} +1 -1
  111. package/dist/client/assets/{hurl-y6bQoMbn-VmDIgNNg.js → hurl-y6bQoMbn-BniTWOKW.js} +2 -2
  112. package/dist/client/assets/{hurl-y6bQoMbn-VmDIgNNg.js.map → hurl-y6bQoMbn-BniTWOKW.js.map} +1 -1
  113. package/dist/client/assets/{index-BHQ_NP1r.js → index-DlDEYM2e.js} +3 -3
  114. package/dist/client/assets/{index-BHQ_NP1r.js.map → index-DlDEYM2e.js.map} +1 -1
  115. package/dist/client/assets/index-vGJLpF-N.css +1 -0
  116. package/dist/client/assets/{java-HDTZqoJ--r_CiLO3G.js → java-HDTZqoJ--DonfC-m-.js} +2 -2
  117. package/dist/client/assets/{java-HDTZqoJ--r_CiLO3G.js.map → java-HDTZqoJ--DonfC-m-.js.map} +1 -1
  118. package/dist/client/assets/{javascript-B8-PXjxO-D8IL8RVw.js → javascript-B8-PXjxO-DrojTnjU.js} +2 -2
  119. package/dist/client/assets/{javascript-B8-PXjxO-D8IL8RVw.js.map → javascript-B8-PXjxO-DrojTnjU.js.map} +1 -1
  120. package/dist/client/assets/{jinja-Li2helwk-iQ5WpNSs.js → jinja-Li2helwk-Bn7ViII1.js} +2 -2
  121. package/dist/client/assets/{jinja-Li2helwk-iQ5WpNSs.js.map → jinja-Li2helwk-Bn7ViII1.js.map} +1 -1
  122. package/dist/client/assets/{jison-D4pd2L4r-CnB2TCTC.js → jison-D4pd2L4r-CURwtPm2.js} +2 -2
  123. package/dist/client/assets/{jison-D4pd2L4r-CnB2TCTC.js.map → jison-D4pd2L4r-CURwtPm2.js.map} +1 -1
  124. package/dist/client/assets/{json-CHeq_08V-BzfhDAQG.js → json-CHeq_08V-DGJ-08B3.js} +2 -2
  125. package/dist/client/assets/{json-CHeq_08V-BzfhDAQG.js.map → json-CHeq_08V-DGJ-08B3.js.map} +1 -1
  126. package/dist/client/assets/{jsx-CTDAtxCE-BHaCLB5C.js → jsx-CTDAtxCE-B7AjYoF3.js} +2 -2
  127. package/dist/client/assets/{jsx-CTDAtxCE-BHaCLB5C.js.map → jsx-CTDAtxCE-B7AjYoF3.js.map} +1 -1
  128. package/dist/client/assets/{julia-B8HGxjvO-DUNXU97h.js → julia-B8HGxjvO-CX2HXF0x.js} +2 -2
  129. package/dist/client/assets/{julia-B8HGxjvO-DUNXU97h.js.map → julia-B8HGxjvO-CX2HXF0x.js.map} +1 -1
  130. package/dist/client/assets/{just-C1IY8eCo-CwcMki68.js → just-C1IY8eCo-194MeSWx.js} +2 -2
  131. package/dist/client/assets/{just-C1IY8eCo-CwcMki68.js.map → just-C1IY8eCo-194MeSWx.js.map} +1 -1
  132. package/dist/client/assets/{latex-CWjLpLhK-C2bYvB1V.js → latex-CWjLpLhK-CJV_bAR4.js} +2 -2
  133. package/dist/client/assets/{latex-CWjLpLhK-C2bYvB1V.js.map → latex-CWjLpLhK-CJV_bAR4.js.map} +1 -1
  134. package/dist/client/assets/{liquid-DO0vm52w-5ftSWtSQ.js → liquid-DO0vm52w-C-oH3gBH.js} +2 -2
  135. package/dist/client/assets/{liquid-DO0vm52w-5ftSWtSQ.js.map → liquid-DO0vm52w-C-oH3gBH.js.map} +1 -1
  136. package/dist/client/assets/{lua-rOZn354j-BFEal9UY.js → lua-rOZn354j-CWNr0VLI.js} +2 -2
  137. package/dist/client/assets/{lua-rOZn354j-BFEal9UY.js.map → lua-rOZn354j-CWNr0VLI.js.map} +1 -1
  138. package/dist/client/assets/{marko-CiZdnOV9-VE4QpTYR.js → marko-CiZdnOV9-D1oeBgJ5.js} +2 -2
  139. package/dist/client/assets/{marko-CiZdnOV9-VE4QpTYR.js.map → marko-CiZdnOV9-D1oeBgJ5.js.map} +1 -1
  140. package/dist/client/assets/{mdc-D1ADfxGi-DASKK9_I.js → mdc-D1ADfxGi-DDe8MjBS.js} +2 -2
  141. package/dist/client/assets/{mdc-D1ADfxGi-DASKK9_I.js.map → mdc-D1ADfxGi-DDe8MjBS.js.map} +1 -1
  142. package/dist/client/assets/{nginx-8KXIzHX2-OWn8Z957.js → nginx-8KXIzHX2-76JDQPWv.js} +2 -2
  143. package/dist/client/assets/{nginx-8KXIzHX2-OWn8Z957.js.map → nginx-8KXIzHX2-76JDQPWv.js.map} +1 -1
  144. package/dist/client/assets/{nim-CbBDSJf5-DzS23snq.js → nim-CbBDSJf5-Bg0Tpvlj.js} +2 -2
  145. package/dist/client/assets/{nim-CbBDSJf5-DzS23snq.js.map → nim-CbBDSJf5-Bg0Tpvlj.js.map} +1 -1
  146. package/dist/client/assets/{org-BlnOvN6p-mzfee9SX.js → org-BlnOvN6p-CpQvn0Ms.js} +2 -2
  147. package/dist/client/assets/{org-BlnOvN6p-mzfee9SX.js.map → org-BlnOvN6p-CpQvn0Ms.js.map} +1 -1
  148. package/dist/client/assets/patterns-CJ4c7F5A.js +2 -0
  149. package/dist/client/assets/patterns-CJ4c7F5A.js.map +1 -0
  150. package/dist/client/assets/{perl-CntHWu4k-C3Q6THHX.js → perl-CntHWu4k-R8g6ivQx.js} +2 -2
  151. package/dist/client/assets/{perl-CntHWu4k-C3Q6THHX.js.map → perl-CntHWu4k-R8g6ivQx.js.map} +1 -1
  152. package/dist/client/assets/{php-VF06KE26-uqmHEtRE.js → php-VF06KE26-qz2OohxQ.js} +2 -2
  153. package/dist/client/assets/{php-VF06KE26-uqmHEtRE.js.map → php-VF06KE26-qz2OohxQ.js.map} +1 -1
  154. package/dist/client/assets/primitives-Dj-qYrUZ-BIf5RLs4.js +2 -0
  155. package/dist/client/assets/primitives-Dj-qYrUZ-BIf5RLs4.js.map +1 -0
  156. package/dist/client/assets/{pug-DeZwH1tK-Dy2R8X_Z.js → pug-DeZwH1tK-hE7p1XRn.js} +2 -2
  157. package/dist/client/assets/{pug-DeZwH1tK-Dy2R8X_Z.js.map → pug-DeZwH1tK-hE7p1XRn.js.map} +1 -1
  158. package/dist/client/assets/{pullRequestReviewThreadReplay-Dhslqjta.js → pullRequestReviewThreadReplay-D-FuOlQ0.js} +2 -2
  159. package/dist/client/assets/{pullRequestReviewThreadReplay-Dhslqjta.js.map → pullRequestReviewThreadReplay-D-FuOlQ0.js.map} +1 -1
  160. package/dist/client/assets/{qml-CQhAR2tt-CkperL57.js → qml-CQhAR2tt-Blcerr_b.js} +2 -2
  161. package/dist/client/assets/{qml-CQhAR2tt-CkperL57.js.map → qml-CQhAR2tt-Blcerr_b.js.map} +1 -1
  162. package/dist/client/assets/{r-CGShpgkr-BeuwoEHJ.js → r-CGShpgkr-Bu3ifplH.js} +2 -2
  163. package/dist/client/assets/{r-CGShpgkr-BeuwoEHJ.js.map → r-CGShpgkr-Bu3ifplH.js.map} +1 -1
  164. package/dist/client/assets/{razor-CgB2QCs6-C9kZAmAY.js → razor-CgB2QCs6-C0YckD9e.js} +2 -2
  165. package/dist/client/assets/{razor-CgB2QCs6-C9kZAmAY.js.map → razor-CgB2QCs6-C0YckD9e.js.map} +1 -1
  166. package/dist/client/assets/{regexp-go_CdRjx-BvThUXwF.js → regexp-go_CdRjx-FwuQxSe1.js} +2 -2
  167. package/dist/client/assets/{regexp-go_CdRjx-BvThUXwF.js.map → regexp-go_CdRjx-FwuQxSe1.js.map} +1 -1
  168. package/dist/client/assets/{releaseRoutes-D04aOk03.js → releaseRoutes-Bpw_kfZI.js} +2 -2
  169. package/dist/client/assets/{releaseRoutes-D04aOk03.js.map → releaseRoutes-Bpw_kfZI.js.map} +1 -1
  170. package/dist/client/assets/{rst-CbWMI8ou-B_CNFtWj.js → rst-CbWMI8ou-_a-jzVR0.js} +2 -2
  171. package/dist/client/assets/{rst-CbWMI8ou-B_CNFtWj.js.map → rst-CbWMI8ou-_a-jzVR0.js.map} +1 -1
  172. package/dist/client/assets/{ruby-DsGwIs06-BNNoCsny.js → ruby-DsGwIs06-CvuKCvaN.js} +2 -2
  173. package/dist/client/assets/{ruby-DsGwIs06-BNNoCsny.js.map → ruby-DsGwIs06-CvuKCvaN.js.map} +1 -1
  174. package/dist/client/assets/{sas-DjxN8J4Z-DQwiaVY0.js → sas-DjxN8J4Z-6vMiHBWz.js} +2 -2
  175. package/dist/client/assets/{sas-DjxN8J4Z-DQwiaVY0.js.map → sas-DjxN8J4Z-6vMiHBWz.js.map} +1 -1
  176. package/dist/client/assets/{scss-bkiiULjK-BdNohiDl.js → scss-bkiiULjK-RWkdLi31.js} +2 -2
  177. package/dist/client/assets/{scss-bkiiULjK-BdNohiDl.js.map → scss-bkiiULjK-RWkdLi31.js.map} +1 -1
  178. package/dist/client/assets/{shellscript-Cuh1SIPr-CH9Y9Zzx.js → shellscript-Cuh1SIPr-xep8lhFb.js} +2 -2
  179. package/dist/client/assets/{shellscript-Cuh1SIPr-CH9Y9Zzx.js.map → shellscript-Cuh1SIPr-xep8lhFb.js.map} +1 -1
  180. package/dist/client/assets/{shellsession-C4UOwxb7-BVPXZqFb.js → shellsession-C4UOwxb7-B2Mjt8G4.js} +2 -2
  181. package/dist/client/assets/{shellsession-C4UOwxb7-BVPXZqFb.js.map → shellsession-C4UOwxb7-B2Mjt8G4.js.map} +1 -1
  182. package/dist/client/assets/{soy-CeGFXpLT-bVeC_qdu.js → soy-CeGFXpLT-DB96q8ji.js} +2 -2
  183. package/dist/client/assets/{soy-CeGFXpLT-bVeC_qdu.js.map → soy-CeGFXpLT-DB96q8ji.js.map} +1 -1
  184. package/dist/client/assets/{sql-qDYmMTO1-DRMw6L4F.js → sql-qDYmMTO1-Dp7sA9Pq.js} +2 -2
  185. package/dist/client/assets/{sql-qDYmMTO1-DRMw6L4F.js.map → sql-qDYmMTO1-Dp7sA9Pq.js.map} +1 -1
  186. package/dist/client/assets/{stata-Dzus_rwP-DcGzBrZt.js → stata-Dzus_rwP-Bk81H3oK.js} +2 -2
  187. package/dist/client/assets/{stata-Dzus_rwP-DcGzBrZt.js.map → stata-Dzus_rwP-Bk81H3oK.js.map} +1 -1
  188. package/dist/client/assets/{surrealql-DmTrf8uR-BGVhamzy.js → surrealql-DmTrf8uR-BAVDL68E.js} +2 -2
  189. package/dist/client/assets/{surrealql-DmTrf8uR-BGVhamzy.js.map → surrealql-DmTrf8uR-BAVDL68E.js.map} +1 -1
  190. package/dist/client/assets/{svelte-CWlRonoS-d0HsRKWL.js → svelte-CWlRonoS-g4MbXmCf.js} +2 -2
  191. package/dist/client/assets/{svelte-CWlRonoS-d0HsRKWL.js.map → svelte-CWlRonoS-g4MbXmCf.js.map} +1 -1
  192. package/dist/client/assets/{templ-EuFg1gKs-BBJ25IwK.js → templ-EuFg1gKs-B9lc3TqB.js} +2 -2
  193. package/dist/client/assets/{templ-EuFg1gKs-BBJ25IwK.js.map → templ-EuFg1gKs-B9lc3TqB.js.map} +1 -1
  194. package/dist/client/assets/{tex-Cbbx1SXS-Dh8M7x1F.js → tex-Cbbx1SXS-DPEKlVuI.js} +2 -2
  195. package/dist/client/assets/{tex-Cbbx1SXS-Dh8M7x1F.js.map → tex-Cbbx1SXS-DPEKlVuI.js.map} +1 -1
  196. package/dist/client/assets/{ts-tags-DOHpIWV2-DXabLRoX.js → ts-tags-DOHpIWV2-DN6mmSGx.js} +2 -2
  197. package/dist/client/assets/{ts-tags-DOHpIWV2-DXabLRoX.js.map → ts-tags-DOHpIWV2-DN6mmSGx.js.map} +1 -1
  198. package/dist/client/assets/{tsx-DmRL3u_2-Cn0tVC2C.js → tsx-DmRL3u_2-DulNQGwe.js} +2 -2
  199. package/dist/client/assets/{tsx-DmRL3u_2-Cn0tVC2C.js.map → tsx-DmRL3u_2-DulNQGwe.js.map} +1 -1
  200. package/dist/client/assets/{twig-BzcHspK1-BW8kSayf.js → twig-BzcHspK1-j95wbDo4.js} +2 -2
  201. package/dist/client/assets/{twig-BzcHspK1-BW8kSayf.js.map → twig-BzcHspK1-j95wbDo4.js.map} +1 -1
  202. package/dist/client/assets/{typescript-BYTx4UxO-XIX20smz.js → typescript-BYTx4UxO-C2eU2nTQ.js} +2 -2
  203. package/dist/client/assets/{typescript-BYTx4UxO-XIX20smz.js.map → typescript-BYTx4UxO-C2eU2nTQ.js.map} +1 -1
  204. package/dist/client/assets/{typst-BrfC91e7-BTQczO73.js → typst-BrfC91e7-Bry73qoG.js} +2 -2
  205. package/dist/client/assets/{typst-BrfC91e7-BTQczO73.js.map → typst-BrfC91e7-Bry73qoG.js.map} +1 -1
  206. package/dist/client/assets/{useWorkspaceDefaultLanding-DygvrKuK.js → useWorkspaceDefaultLanding-DPM3tzSI.js} +2 -2
  207. package/dist/client/assets/{useWorkspaceDefaultLanding-DygvrKuK.js.map → useWorkspaceDefaultLanding-DPM3tzSI.js.map} +1 -1
  208. package/dist/client/assets/{vue-B92PIQFm-Bo7Ratnf.js → vue-B92PIQFm-_KBJBFm9.js} +2 -2
  209. package/dist/client/assets/{vue-B92PIQFm-Bo7Ratnf.js.map → vue-B92PIQFm-_KBJBFm9.js.map} +1 -1
  210. package/dist/client/assets/{vue-html-EDHI-aeE-DZaGT8SW.js → vue-html-EDHI-aeE-Cx5Qo046.js} +2 -2
  211. package/dist/client/assets/{vue-html-EDHI-aeE-DZaGT8SW.js.map → vue-html-EDHI-aeE-Cx5Qo046.js.map} +1 -1
  212. package/dist/client/assets/{vue-vine-CmMdgoEY-D5tBNukX.js → vue-vine-CmMdgoEY-CDgVVhf3.js} +2 -2
  213. package/dist/client/assets/{vue-vine-CmMdgoEY-D5tBNukX.js.map → vue-vine-CmMdgoEY-CDgVVhf3.js.map} +1 -1
  214. package/dist/client/assets/{workspaceEntityRoutes-FAiial9O.js → workspaceEntityRoutes-Cc_RtLvy.js} +2 -2
  215. package/dist/client/assets/{workspaceEntityRoutes-FAiial9O.js.map → workspaceEntityRoutes-Cc_RtLvy.js.map} +1 -1
  216. package/dist/client/assets/{workspaceScrollCapture-AJpPgzgz.js → workspaceScrollCapture-Dg3Pebh8.js} +2 -2
  217. package/dist/client/assets/{workspaceScrollCapture-AJpPgzgz.js.map → workspaceScrollCapture-Dg3Pebh8.js.map} +1 -1
  218. package/dist/client/assets/{xml-Bz9Nzp99-Bj4-GEHY.js → xml-Bz9Nzp99-bfRaCa2x.js} +2 -2
  219. package/dist/client/assets/{xml-Bz9Nzp99-Bj4-GEHY.js.map → xml-Bz9Nzp99-bfRaCa2x.js.map} +1 -1
  220. package/dist/client/assets/{xsl-D0pOnfMq-9186FOf_.js → xsl-D0pOnfMq-BaQuui65.js} +2 -2
  221. package/dist/client/assets/{xsl-D0pOnfMq-9186FOf_.js.map → xsl-D0pOnfMq-BaQuui65.js.map} +1 -1
  222. package/dist/client/assets/{yaml-DKDHNCIP-ISipY-zA.js → yaml-DKDHNCIP-B5ot5BQr.js} +2 -2
  223. package/dist/client/assets/{yaml-DKDHNCIP-ISipY-zA.js.map → yaml-DKDHNCIP-B5ot5BQr.js.map} +1 -1
  224. package/dist/client/index.html +2 -2
  225. package/dist/server/assets/controlCenterApi-CIz0g85O.js.map +1 -1
  226. package/package.json +8 -8
  227. package/dist/client/assets/ActiveWorkPage-BxSGZWS_.js +0 -2
  228. package/dist/client/assets/ActiveWorkPage-BxSGZWS_.js.map +0 -1
  229. package/dist/client/assets/AgentPage-YiYORLod.js.map +0 -1
  230. package/dist/client/assets/AtlassianOAuthCallbackPage-PfsrTytb.js.map +0 -1
  231. package/dist/client/assets/AuthorizedSharePage-BCwnILXF.js.map +0 -1
  232. package/dist/client/assets/ItemsPage-BzinDuxs.js.map +0 -1
  233. package/dist/client/assets/OpenPullRequestPage-BABGk9v2.js.map +0 -1
  234. package/dist/client/assets/PairPage-4meDmW_A.js.map +0 -1
  235. package/dist/client/assets/PortfolioOverview-BRB_qe4T.js +0 -2
  236. package/dist/client/assets/PortfolioOverview-BRB_qe4T.js.map +0 -1
  237. package/dist/client/assets/ReleaseRoute-D1srSd83.js +0 -2
  238. package/dist/client/assets/ReleaseRoute-D1srSd83.js.map +0 -1
  239. package/dist/client/assets/ReleaseWorkset-DcI6qwPE.js.map +0 -1
  240. package/dist/client/assets/ReviewSuggestionPublicationSurface-BtoYEprT.js.map +0 -1
  241. package/dist/client/assets/ServicesPage-DihUx1kr.js.map +0 -1
  242. package/dist/client/assets/TimelinePage-DyluBeEt.js.map +0 -1
  243. package/dist/client/assets/WorkspaceSettingsPage-Dn_eDC3m.js.map +0 -1
  244. package/dist/client/assets/index-BZ52pCV1.css +0 -1
  245. package/dist/client/assets/patterns-D0U0WCQS.js +0 -2
  246. package/dist/client/assets/patterns-D0U0WCQS.js.map +0 -1
  247. package/dist/client/assets/primitives-CjQX0eVM-BPKvllZ_.js +0 -2
  248. package/dist/client/assets/primitives-CjQX0eVM-BPKvllZ_.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReleaseRoute-D1srSd83.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","Le","V","Je","He","ve","require_jsx_runtime","useViewTransitionState","workspaceItemsPath","useBrowserSession","releaseActiveWorkPath","releaseAgentPath","releasePreviewPath","releaseParentPath","releaseFullPath","Link","lt","R","We","fe","I","B","Gn","Qn","Un","H","A","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 +0,0 @@
1
- {"version":3,"file":"ReleaseWorkset-DcI6qwPE.js","names":["currentRelationship","titleCase","relationshipLifecycleTone","relationshipConfidenceLabel","traceConnection","loading","tags","isUnauthorizedFailure","Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.forEach","Effect.provide","FetchHttpClient.layer","useState","useRef","useCallback","DateTime.formatUtc","styles","Text","StateLabel","Sheet","Skeleton","StatePanel","Button","Schema.Struct","Schema.Literal","Predicate.isObject","Schema.decodeUnknownOption","Option.isSome","Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.provide","FetchHttpClient.layer","useState","useCallback","styles","Skeleton","ServiceMark","Text","StateLabel","StatePanel","Button","_Fragment","LinkProvider","WorksetCard","__toESM","useLocation","useNavigate","Le","V","fe","He","ve","require_jsx_runtime","useBrowserSession","Link","a","browserReadableSessionKey","B","dr","H","Literal","runPromise","isTagged","formatUtc","EntityId","Struct","isSome","provide","isObject","gen","forEach","decodeUnknownOption","RelationshipId","layer","makeControlCenterApiClient","workspaceEntityPath","shouldRememberWorkspaceScrollPosition","rememberWorkspaceScrollPosition","presentPipelineExecutionStages","confluenceTaskSummary","workspaceEntityStateForHref","WorkspaceEntityLink","import_react","require_react","currentRelationship$1","lifecycle","approvalName","value","releasePipelineApprovalReadiness","nodeById","inspection","node","projectionByEntityId","projection","affectedPipelineIds","relationship","source","target","unverifiablePipelines","gates","entityId","details","approvalActionStages","action","approvalStages","stage","waiting","explicitActions","status","state","relationshipHref","workspaceId","releaseId","relationshipId","statusTone","normalized","reviewStateLabel","pullRequestStateLabel","pipelineStateLabel","titleCase$1","part","selectedObjectService","kind","selectedObjectStatus","selectedObjectFacts","presentSelectedObject","selected","selectReleaseWorksetObject","selectedObjectId","currentRelationship","gapService","entityProjectionByNode","projections","relationshipLifecycleTone$1","relationshipConfidenceLabel$1","confidence","traceConnection$1","nodeId","candidate","isCurrentRelease","selectReleaseWorksetTrace","selectedObject","selectedNodeIds","direction","otherNodeId","left","right","selectReleaseWorksetRelationship","selectedRelationshipId","releaseWorksetRelationshipEvidenceClaims","claimById","claim","claimId","releaseWorksetRelationshipEvidenceIds","evidenceIds","releaseRunbookEntityIds","nodes","gapLabel","issue","presentReleaseWorkset","runbookEntityIds","href","issues","pullRequests","pipelineExecutions","pages","confluenceTaskGaps","page","task","pipelineReadiness","pipelineApprovalGaps","gate","unverifiablePipelineGaps","sourceNodes","pullRequest","linkedJiraKeys","pipeline","tasks","RelationshipDetailSheet_module_default","isUnauthorizedFailure$1","browserRelationshipDetailsTransport","client","history","useRelationshipDetails","requestRevision","setRequestRevision","setState","evidenceKey","evidenceIdsRef","sessionKey","abort","transport","failure","onSessionExpired","currentState","revision","import_jsx_runtime","titleCase","formatRelationshipTimestamp","relationshipActorLabel","actor","relationshipProvenanceLabel","provenance","relationshipRationale","relationshipConfidenceLabel","relationshipLifecycleTone","relationshipScopeLabel","evidenceFreshnessTone","evidence","lifecycleReason","evidencePartyLabel","party","evidenceClaimValueLabel","EvidenceCard","relatedClaimIds","relatedClaims","claims","evidenceId","evidenceClaimId","relationshipHistoryCountLabel","newestRevision","revisions","RelationshipDetailSheet","controller","title","evidenceIntegrityComplete","open","onClose","reason","RelationshipDetailMarker","RelationshipDetailRouteState","makeRelationshipDetailRouteState","matchesRelationshipDetailRouteState","decoded","objectId","closeRelationshipDetailRoute","location","navigate","next","ReleaseWorkset_module_default","loadReleaseEnvironmentSlices","scopes","environmentIds","completed","nextIndex","isStopped","loadNext","index","environmentId","load","workerCount","MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS","aggregateReleaseWorksetInspections","availableNodes","availableProjections","availableClaims","availableEvidence","inspections","entry","item","entityProjections","relationships","evidenceClaims","evidenceItems","truncated","relationshipKey","requiredNodes","presentNodes","entityNodes","requiredProjections","requiredClaims","requiredEvidence","closureMissing","newNodeCount","newProjectionCount","newClaimCount","newEvidenceCount","closureExceedsBound","isUnauthorizedFailure","loadReleaseWorksetInspections","signal","browserReleaseWorksetTransport","useReleaseWorkset","environmentScopeKey","LoadingWorkset","SelectedReleaseWorksetObjectPanel","fact","trace","linkLocation","event","releaseWorksetSessionKey","ReleaseWorkset","browserSession","release","workset","searchParams","selectedTrace","selectedRelationship","selectedEvidenceIds","selectedEvidenceClaims","runbook"],"sources":["../../../src/domain/releasePipelineApproval.ts","../../../src/client/releases/presentReleaseWorkset.ts","../../../src/client/releases/RelationshipDetailSheet.module.css","../../../src/client/releases/useRelationshipDetails.ts","../../../src/client/releases/RelationshipDetailSheet.tsx","../../../src/client/releases/relationshipDetailRoute.ts","../../../src/client/releases/ReleaseWorkset.module.css","../../../src/client/releases/loadReleaseEnvironmentSlices.ts","../../../src/client/releases/useReleaseWorkset.ts","../../../src/client/releases/ReleaseWorkset.tsx"],"sourcesContent":["import type { DeliveryEntityProjection, DeliveryNode, DeliveryRelationship } from \"./deliveryGraph.js\"\nimport type { EntityId } from \"./identifiers.js\"\n\ninterface ReleasePipelineApprovalInspection {\n readonly entityProjections: ReadonlyArray<{ readonly projection: DeliveryEntityProjection }>\n readonly nodes: ReadonlyArray<DeliveryNode>\n readonly relationships: ReadonlyArray<DeliveryRelationship>\n readonly truncated: boolean\n}\n\nexport type ReleasePipelineApprovalGate = Readonly<{\n readonly entityId: EntityId\n readonly pipelineName: string\n readonly state: \"missing\" | \"not-waiting\" | \"waiting\"\n}>\n\nconst currentRelationship = (\n lifecycle: DeliveryRelationship[\"lifecycle\"]\n): boolean => lifecycle._tag !== \"missing\" && lifecycle._tag !== \"rejected\" && lifecycle._tag !== \"superseded\"\n\nconst approvalName = (value: string): boolean =>\n /(?:^|[\\s_-])(?:approval|approve)(?:$|[\\s_-])/iu.test(value) || /release[\\s_-]*gate/iu.test(value)\n\n/** Prove that every pipeline delivering a release PR is stopped at its observed manual approval gate. */\nexport const releasePipelineApprovalReadiness = (inspection: ReleasePipelineApprovalInspection) => {\n const nodeById = new Map(inspection.nodes.map((node) => [node.nodeId, node]))\n const projectionByEntityId = new Map(\n inspection.entityProjections.map(({ projection }) => [projection.entityId, projection])\n )\n const affectedPipelineIds = new Set(\n inspection.relationships.flatMap((relationship): ReadonlyArray<EntityId> => {\n if (\n relationship.kind !== \"delivered-by\" ||\n relationship.sourceNodeKind !== \"pull-request\" ||\n relationship.targetNodeKind !== \"pipeline-execution\" ||\n !currentRelationship(relationship.lifecycle)\n ) return []\n const source = nodeById.get(relationship.sourceNodeId)\n const target = nodeById.get(relationship.targetNodeId)\n return source?.resolution._tag === \"resolved\" &&\n source.resolution.target._tag === \"entity\" &&\n target?.resolution._tag === \"resolved\" &&\n target.resolution.target._tag === \"entity\"\n ? [target.resolution.target.entityId]\n : []\n })\n )\n let unverifiablePipelines = 0\n const gates: Array<ReleasePipelineApprovalGate> = []\n for (const entityId of affectedPipelineIds) {\n const projection = projectionByEntityId.get(entityId)\n const details = projection?.details\n if (\n projection?.entityState !== \"present\" ||\n projection.entityType !== \"pipeline-execution\" ||\n details?._tag !== \"pipeline-execution\"\n ) {\n unverifiablePipelines += 1\n continue\n }\n const approvalActionStages = new Set(\n (details.actions ?? []).flatMap((action) =>\n action.category?.toLocaleLowerCase(\"en-US\") === \"approval\" ||\n action.provider?.toLocaleLowerCase(\"en-US\") === \"manual\"\n ? [action.stageName]\n : []\n )\n )\n const approvalStages = (details.stages ?? []).filter((stage) =>\n approvalActionStages.has(stage.name) || approvalName(stage.name)\n )\n const waiting = approvalStages.some((stage) => {\n if (stage.status !== \"running\") return false\n const explicitActions = (details.actions ?? []).filter((action) =>\n action.stageName === stage.name &&\n (\n action.category?.toLocaleLowerCase(\"en-US\") === \"approval\" ||\n action.provider?.toLocaleLowerCase(\"en-US\") === \"manual\"\n )\n )\n return explicitActions.length === 0 || explicitActions.some(({ status }) => status === \"running\")\n })\n gates.push({\n entityId,\n pipelineName: details.pipelineName,\n state: approvalStages.length === 0 ? \"missing\" : waiting ? \"waiting\" : \"not-waiting\"\n })\n }\n return {\n affected: affectedPipelineIds.size,\n gates,\n missing: gates.filter(({ state }) => state === \"missing\").length,\n notWaiting: gates.filter(({ state }) => state === \"not-waiting\").length,\n ready: !inspection.truncated && unverifiablePipelines === 0 && gates.every(({ state }) => state === \"waiting\"),\n unverifiablePipelines,\n waiting: gates.filter(({ state }) => state === \"waiting\").length\n }\n}\n","import type {\n RlyService,\n RlyWorksetGap,\n RlyWorksetJiraItem,\n RlyWorksetPipeline,\n RlyWorksetPullRequestGroup\n} from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\n\nimport type { ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport { confluenceTaskSummary } from \"../../domain/confluenceTasks.js\"\nimport type {\n DeliveryEntityDetails,\n DeliveryEntityProjection,\n DeliveryRelationship,\n EvidenceClaim\n} from \"../../domain/deliveryGraph.js\"\nimport type {\n EntityId,\n EvidenceId,\n GraphNodeId,\n RelationshipId,\n ReleaseId,\n WorkspaceId\n} from \"../../domain/identifiers.js\"\nimport { releasePipelineApprovalReadiness } from \"../../domain/releasePipelineApproval.js\"\nimport { presentPipelineExecutionStages } from \"../entities/presentWorkspacePipelineExecution.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\ntype Projection = ReleaseDeliveryGraphInspection[\"entityProjections\"][number][\"projection\"]\ntype ProjectionWithDetails<Tag extends DeliveryEntityDetails[\"_tag\"]> = Projection & {\n readonly details: Extract<DeliveryEntityDetails, { readonly _tag: Tag }>\n}\n\nexport interface ReleaseWorksetRunbook {\n readonly completedTasks: number\n readonly href: string\n readonly id: EntityId\n readonly reference: string\n readonly state: string\n readonly title: string\n readonly totalTasks: number\n}\n\nexport interface SelectedReleaseWorksetObject {\n readonly facts: ReadonlyArray<{ readonly label: string; readonly value: string }>\n readonly id: EntityId\n readonly kind: DeliveryEntityProjection[\"entityType\"]\n readonly label: string\n readonly service: RlyService\n readonly status: string\n readonly title: string\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTraceConnection {\n readonly href: string | null\n readonly kind: string\n readonly label: string\n readonly service: RlyService | null\n readonly title: string\n}\n\nexport interface SelectedReleaseWorksetTraceRelationship {\n readonly confidence: string\n readonly detailsHref: string\n readonly direction: \"incoming\" | \"outgoing\"\n readonly evidenceCount: number\n readonly id: RelationshipId\n readonly kind: DeliveryRelationship[\"kind\"]\n readonly lifecycle: string\n readonly other: SelectedReleaseWorksetTraceConnection\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTrace {\n readonly relationships: ReadonlyArray<SelectedReleaseWorksetTraceRelationship>\n readonly truncated: boolean\n}\n\nexport interface ReleaseWorksetPresentation {\n readonly gaps: ReadonlyArray<RlyWorksetGap>\n readonly jiraItems: ReadonlyArray<RlyWorksetJiraItem>\n readonly pipelines: ReadonlyArray<RlyWorksetPipeline>\n readonly pullRequestGroups: ReadonlyArray<RlyWorksetPullRequestGroup>\n readonly runbooks: ReadonlyArray<ReleaseWorksetRunbook>\n readonly truncated: boolean\n}\n\nconst relationshipHref = (\n workspaceId: WorkspaceId,\n releaseId: ReleaseId,\n entityId: EntityId,\n relationshipId: RelationshipId\n): string =>\n `/w/${workspaceId}/releases/${releaseId}?object=${encodeURIComponent(entityId)}&relationship=${\n encodeURIComponent(relationshipId)\n }#release-work`\n\nconst statusTone = (status: string): RlyStateTone => {\n const normalized = status.toLocaleLowerCase(\"en-US\")\n if (\n [\"blocked\", \"changes requested\", \"failed\", \"rejected\", \"rolled back\", \"stopped\", \"superseded\"].some(\n (value) => normalized.includes(value)\n )\n ) {\n return \"critical\"\n }\n if (\n [\"approved\", \"closed\", \"current\", \"done\", \"merged\", \"not required\", \"passed\", \"ready\", \"resolved\", \"succeeded\"]\n .some((value) => normalized.includes(value))\n ) return \"positive\"\n if (\n [\"deploying\", \"in progress\", \"in review\", \"pending\", \"queued\", \"requested\", \"running\", \"verifying\"]\n .some((value) => normalized.includes(value))\n ) return \"progress\"\n return \"neutral\"\n}\n\nconst reviewStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pull-request\" }>[\"reviewState\"]\n): string => {\n switch (state) {\n case \"not-requested\":\n return \"Review not requested\"\n case \"requested\":\n return \"Review requested\"\n case \"changes-requested\":\n return \"Changes requested\"\n case \"approved\":\n return \"Approved\"\n case \"merged\":\n return \"Merged\"\n }\n}\n\nconst pullRequestStateLabel = (\n details: Extract<DeliveryEntityDetails, { readonly _tag: \"pull-request\" }>\n): string => {\n switch (details.reviewState) {\n case \"approved\":\n case \"changes-requested\":\n case \"merged\":\n return reviewStateLabel(details.reviewState)\n case \"not-requested\":\n case \"requested\":\n return details.lifecycle === \"merged\"\n ? \"Merged\"\n : details.lifecycle === \"closed\"\n ? \"Closed\"\n : reviewStateLabel(details.reviewState)\n }\n}\n\nconst pipelineStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pipeline-execution\" }>[\"status\"]\n): string => `${state.charAt(0).toLocaleUpperCase(\"en-US\")}${state.slice(1)}`\n\nconst titleCase = (value: string): string =>\n value.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nconst selectedObjectService = (kind: DeliveryEntityProjection[\"entityType\"]): RlyService => {\n switch (kind) {\n case \"issue\":\n return \"jira\"\n case \"pull-request\":\n return \"codecommit\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n }\n}\n\nconst selectedObjectStatus = (details: DeliveryEntityDetails): string => {\n switch (details._tag) {\n case \"issue\":\n return details.status\n case \"pull-request\":\n return pullRequestStateLabel(details)\n case \"page\":\n case \"deployment\":\n return titleCase(details.status)\n case \"pipeline-execution\":\n return pipelineStateLabel(details.status)\n case \"time-entry\":\n return titleCase(details.approvalState)\n }\n}\n\nconst selectedObjectFacts = (\n details: DeliveryEntityDetails\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n switch (details._tag) {\n case \"issue\":\n return [\n { label: \"Priority\", value: details.priority ?? \"Not set\" },\n { label: \"Estimate\", value: details.estimatePoints === null ? \"Not set\" : `${details.estimatePoints} points` }\n ]\n case \"pull-request\":\n return [\n { label: \"Repository\", value: details.repository },\n { label: \"Branch\", value: `${details.sourceBranch} → ${details.targetBranch}` },\n { label: \"Revision\", value: details.headRevision }\n ]\n case \"page\":\n return [\n { label: \"Space\", value: details.spaceKey },\n { label: \"Revision\", value: details.revision }\n ]\n case \"pipeline-execution\":\n return [\n { label: \"Pipeline\", value: details.pipelineName },\n { label: \"Execution\", value: details.executionId },\n { label: \"Revision\", value: details.triggerRevision }\n ]\n case \"deployment\":\n return [\n { label: \"Environment\", value: details.environmentId },\n { label: \"Revision\", value: details.revision }\n ]\n case \"time-entry\":\n return [\n { label: \"Duration\", value: `${details.durationMinutes} minutes` },\n { label: \"Billing\", value: details.billable ? \"Billable\" : \"Non-billable\" }\n ]\n }\n}\n\nconst presentSelectedObject = (selected: DeliveryEntityProjection): SelectedReleaseWorksetObject => {\n const status = selectedObjectStatus(selected.details)\n return {\n facts: selectedObjectFacts(selected.details),\n id: selected.entityId,\n kind: selected.entityType,\n label: selected.displayKey,\n service: selectedObjectService(selected.entityType),\n status,\n title: selected.title,\n tone: statusTone(status)\n }\n}\n\n/** Resolve every present normalized object into an inspectable selected-object surface. */\nexport const selectReleaseWorksetObject = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null\n): SelectedReleaseWorksetObject | null => {\n if (selectedObjectId === null) return null\n const selected = inspection.entityProjections.find(\n ({ projection }) => projection.entityState === \"present\" && projection.entityId === selectedObjectId\n )?.projection\n if (selected === undefined) return null\n return presentSelectedObject(selected)\n}\n\nconst currentRelationship = (relationship: DeliveryRelationship): boolean =>\n relationship.lifecycle._tag !== \"missing\" &&\n relationship.lifecycle._tag !== \"rejected\" &&\n relationship.lifecycle._tag !== \"superseded\"\n\nconst gapService = (relationship: DeliveryRelationship): RlyService => {\n const missingKind = relationship.sourceNodeKind === \"release\"\n ? relationship.targetNodeKind\n : relationship.sourceNodeKind\n switch (missingKind) {\n case \"issue\":\n return \"jira\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n case \"pull-request\":\n case \"release\":\n case \"environment\":\n return \"codecommit\"\n }\n return \"codecommit\"\n}\n\nconst entityProjectionByNode = (\n inspection: ReleaseDeliveryGraphInspection\n): ReadonlyMap<GraphNodeId, DeliveryEntityProjection> => {\n const projections = new Map(inspection.entityProjections.map(({ projection }) => [projection.entityId, projection]))\n return new Map(\n inspection.nodes.flatMap((node): ReadonlyArray<readonly [GraphNodeId, DeliveryEntityProjection]> => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = projections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [[node.nodeId, projection]]\n })\n )\n}\n\nconst relationshipLifecycleTone = (lifecycle: DeliveryRelationship[\"lifecycle\"][\"_tag\"]): RlyStateTone => {\n switch (lifecycle) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipConfidenceLabel = (confidence: DeliveryRelationship[\"confidence\"]): string => {\n switch (confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst traceConnection = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n nodeId: GraphNodeId,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): SelectedReleaseWorksetTraceConnection => {\n const projection = projections.get(nodeId)\n if (projection !== undefined) {\n const selected = presentSelectedObject(projection)\n return {\n href: projection.entityState === \"present\"\n ? workspaceEntityPath(workspaceId, projection.entityId)\n : null,\n kind: selected.kind,\n label: selected.label,\n service: selected.service,\n title: projection.entityState === \"present\" ? selected.title : `${selected.title} · Deleted`\n }\n }\n const node = inspection.nodes.find((candidate) => candidate.nodeId === nodeId)\n if (node?.resolution._tag === \"missing\") {\n return {\n href: null,\n kind: node.endpointKind,\n label: node.resolution.missingKey,\n service: null,\n title: `Missing ${titleCase(node.endpointKind)}`\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"release\") {\n const isCurrentRelease = node.resolution.target.releaseId === inspection.releaseId\n return {\n href: null,\n kind: \"release\",\n label: `Release ${node.resolution.target.releaseId.slice(-6)}`,\n service: null,\n title: isCurrentRelease ? \"Current release context\" : \"Connected release\"\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"environment\") {\n return {\n href: null,\n kind: \"environment\",\n label: `Environment ${node.resolution.target.environmentId.slice(-6)}`,\n service: null,\n title: \"Delivery environment\"\n }\n }\n return { href: null, kind: \"unknown\", label: nodeId.slice(-6), service: null, title: \"Unresolved graph node\" }\n}\n\n/** Center the bounded current release graph on one selected normalized object. */\nexport const selectReleaseWorksetTrace = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n selectedObjectId: string | null\n): SelectedReleaseWorksetTrace | null => {\n const selectedObject = selectReleaseWorksetObject(inspection, selectedObjectId)\n if (selectedObject === null || selectedObjectId === null) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n const projections = entityProjectionByNode(inspection)\n const relationships = inspection.relationships.flatMap(\n (relationship): ReadonlyArray<SelectedReleaseWorksetTraceRelationship> => {\n const direction = selectedNodeIds.has(relationship.sourceNodeId)\n ? \"outgoing\"\n : selectedNodeIds.has(relationship.targetNodeId)\n ? \"incoming\"\n : null\n if (direction === null) return []\n const otherNodeId = direction === \"outgoing\" ? relationship.targetNodeId : relationship.sourceNodeId\n return [{\n confidence: relationshipConfidenceLabel(relationship.confidence),\n detailsHref: relationshipHref(\n workspaceId,\n inspection.releaseId,\n selectedObject.id,\n relationship.relationshipId\n ),\n direction,\n evidenceCount: relationship.evidenceClaimIds.length,\n id: relationship.relationshipId,\n kind: relationship.kind,\n lifecycle: titleCase(relationship.lifecycle._tag),\n other: traceConnection(inspection, workspaceId, otherNodeId, projections),\n tone: relationshipLifecycleTone(relationship.lifecycle._tag)\n }]\n }\n ).sort((left, right) =>\n left.kind.localeCompare(right.kind) || left.other.label.localeCompare(right.other.label) ||\n left.id.localeCompare(right.id)\n )\n return { relationships, truncated: inspection.truncated }\n}\n\n/** Resolve a URL-selected relationship only when it touches the selected object in this bounded slice. */\nexport const selectReleaseWorksetRelationship = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null,\n selectedRelationshipId: string | null\n): DeliveryRelationship | null => {\n if (\n selectedRelationshipId === null ||\n selectedObjectId === null ||\n selectReleaseWorksetObject(inspection, selectedObjectId) === null\n ) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n let selected: DeliveryRelationship | null = null\n for (const relationship of inspection.relationships) {\n if (\n relationship.relationshipId === selectedRelationshipId &&\n (selectedNodeIds.has(relationship.sourceNodeId) || selectedNodeIds.has(relationship.targetNodeId)) &&\n (selected === null || relationship.revision > selected.revision)\n ) selected = relationship\n }\n return selected\n}\n\n/** Resolve exact referenced claims from the closure-checked release slice. */\nexport const releaseWorksetRelationshipEvidenceClaims = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceClaim> => {\n if (relationship === null) return []\n const claimById = new Map(inspection.evidenceClaims.map((claim) => [claim.evidenceClaimId, claim]))\n return relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = claimById.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n}\n\n/** Resolve the unique evidence observations referenced by one relationship from the closed release slice. */\nexport const releaseWorksetRelationshipEvidenceIds = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceId> => {\n const evidenceIds = new Set<EvidenceId>()\n for (const claim of releaseWorksetRelationshipEvidenceClaims(inspection, relationship)) {\n evidenceIds.add(claim.evidenceId)\n }\n return [...evidenceIds].sort((left, right) => left.localeCompare(right))\n}\n\nconst releaseRunbookEntityIds = (\n inspection: ReleaseDeliveryGraphInspection,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): ReadonlySet<EntityId> => {\n const nodes = new Map(inspection.nodes.map((node) => [node.nodeId, node]))\n return new Set(\n inspection.relationships.flatMap((relationship): ReadonlyArray<EntityId> => {\n if (\n relationship.kind !== \"documented-by\" ||\n relationship.sourceNodeKind !== \"release\" ||\n relationship.targetNodeKind !== \"page\" ||\n !currentRelationship(relationship)\n ) return []\n const source = nodes.get(relationship.sourceNodeId)\n const target = projections.get(relationship.targetNodeId)\n return source?.resolution._tag === \"resolved\" &&\n source.resolution.target._tag === \"release\" &&\n source.resolution.target.releaseId === inspection.releaseId &&\n target?.details._tag === \"page\"\n ? [target.entityId]\n : []\n })\n )\n}\n\nconst gapLabel = (\n relationship: DeliveryRelationship,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): string => {\n const issue = relationship.sourceNodeKind === \"issue\"\n ? projections.get(relationship.sourceNodeId)\n : relationship.targetNodeKind === \"issue\"\n ? projections.get(relationship.targetNodeId)\n : undefined\n if (issue?.details._tag === \"issue\" && relationship.sourceNodeKind === \"pull-request\") {\n return `${issue.details.key} has no CodeCommit pull request`\n }\n return `Missing ${relationship.sourceNodeKind} → ${relationship.targetNodeKind} relationship`\n}\n\n/** Present one bounded graph inspection as three explicit release-work dimensions. */\nexport const presentReleaseWorkset = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId\n): ReleaseWorksetPresentation => {\n const projections = entityProjectionByNode(inspection)\n const runbookEntityIds = releaseRunbookEntityIds(inspection, projections)\n const href = (projection: DeliveryEntityProjection): string => workspaceEntityPath(workspaceId, projection.entityId)\n const issues = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"issue\"> =>\n projection.entityType === \"issue\" && projection.details._tag === \"issue\" && projection.entityState === \"present\"\n )\n const pullRequests = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pull-request\"> =>\n projection.entityType === \"pull-request\" &&\n projection.details._tag === \"pull-request\" &&\n projection.entityState === \"present\"\n )\n const pipelineExecutions = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pipeline-execution\"> =>\n projection.entityType === \"pipeline-execution\" &&\n projection.details._tag === \"pipeline-execution\" &&\n projection.entityState === \"present\"\n )\n const pages = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"page\"> =>\n projection.entityType === \"page\" &&\n projection.details._tag === \"page\" &&\n projection.entityState === \"present\" &&\n runbookEntityIds.has(projection.entityId)\n )\n const confluenceTaskGaps = pages.flatMap((page): ReadonlyArray<RlyWorksetGap> => {\n if (page.details.contentState !== \"loaded\") {\n return [{\n id: `${page.entityId}:confluence-tasks-unavailable`,\n label: `${page.title} tasks are not synchronized`,\n reason: \"Release readiness cannot be verified until the Confluence page body is synchronized.\",\n service: \"confluence\"\n }]\n }\n return confluenceTaskSummary(page.details.content?.markdown ?? \"\").tasks.flatMap((task) =>\n task.checked\n ? []\n : [{\n id: `${page.entityId}:confluence-task:${String(task.lineNumber)}`,\n label: task.label,\n reason: `Confluence task on ${page.title} is not complete.`,\n service: \"confluence\"\n }]\n )\n })\n const pipelineReadiness = releasePipelineApprovalReadiness(inspection)\n const pipelineApprovalGaps = pipelineReadiness.gates.flatMap(\n (gate): ReadonlyArray<RlyWorksetGap> =>\n gate.state === \"waiting\"\n ? []\n : [{\n id: `${gate.entityId}:release-approval-gate`,\n label: gate.state === \"missing\"\n ? `${gate.pipelineName} has no release approval gate`\n : `${gate.pipelineName} is not waiting for Stage approval`,\n reason: gate.state === \"missing\"\n ? \"Every pipeline delivering this release must contain an observed manual approval stage.\"\n : \"The affected pipeline must wait at its manual approval stage before release publication.\",\n service: \"codepipeline\"\n }]\n )\n const unverifiablePipelineGaps: ReadonlyArray<RlyWorksetGap> = pipelineReadiness.unverifiablePipelines === 0\n ? []\n : [{\n id: \"release-pipelines-unverifiable\",\n label: \"Affected pipeline approval state is unavailable\",\n reason: \"Release readiness cannot be verified until every affected pipeline is synchronized.\",\n service: \"codepipeline\"\n }]\n\n return {\n jiraItems: issues.map((issue) => ({\n id: issue.entityId,\n key: issue.details.key,\n title: issue.title,\n state: issue.details.status,\n tone: statusTone(issue.details.status),\n href: href(issue)\n })),\n pullRequestGroups: pullRequests.map((pullRequest) => {\n const sourceNodes = new Set(\n Array.from(projections).flatMap(([nodeId, projection]): ReadonlyArray<GraphNodeId> =>\n projection.entityId === pullRequest.entityId ? [nodeId] : []\n )\n )\n const linkedJiraKeys = Array.from(\n new Set(inspection.relationships.flatMap((relationship): ReadonlyArray<string> => {\n if (\n relationship.kind !== \"implements\" ||\n !sourceNodes.has(relationship.sourceNodeId) ||\n !currentRelationship(relationship)\n ) return []\n const issue = projections.get(relationship.targetNodeId)\n return issue?.details._tag === \"issue\" ? [issue.details.key] : []\n }))\n )\n const state = pullRequestStateLabel(pullRequest.details)\n return {\n id: pullRequest.entityId,\n title: pullRequest.title,\n reference: pullRequest.displayKey,\n state,\n tone: statusTone(state),\n href: href(pullRequest),\n linkedJiraKeys\n }\n }),\n gaps: [\n ...inspection.relationships.flatMap((relationship): ReadonlyArray<RlyWorksetGap> =>\n relationship.lifecycle._tag === \"missing\"\n ? [{\n id: relationship.relationshipId,\n label: gapLabel(relationship, projections),\n reason: relationship.lifecycle.reason,\n service: gapService(relationship)\n }]\n : []\n ),\n ...confluenceTaskGaps,\n ...pipelineApprovalGaps,\n ...unverifiablePipelineGaps\n ],\n pipelines: pipelineExecutions.map((pipeline) => {\n const state = pipelineStateLabel(pipeline.details.status)\n return {\n id: pipeline.entityId,\n title: pipeline.title,\n reference: pipeline.displayKey,\n state,\n tone: statusTone(state),\n href: href(pipeline),\n stages: presentPipelineExecutionStages(pipeline.details.stages)\n }\n }),\n runbooks: pages.map((page) => {\n const tasks = confluenceTaskSummary(page.details.content?.markdown ?? \"\")\n return {\n completedTasks: tasks.completed,\n href: href(page),\n id: page.entityId,\n reference: page.displayKey,\n state: page.details.status,\n title: page.title,\n totalTasks: tasks.total\n }\n }),\n truncated: inspection.truncated\n }\n}\n",".body,\n.loading,\n.content,\n.summary,\n.section,\n.history,\n.evidence,\n.evidenceCard,\n.claims {\n display: grid;\n}\n\n.integrity {\n display: flex;\n align-items: flex-start;\n gap: var(--rly-space-8);\n}\n\n.integrity p {\n margin: 0;\n}\n\n.body,\n.content,\n.loading {\n gap: var(--rly-space-20);\n}\n\n.content,\n.summary,\n.section,\n.evidenceCard {\n gap: var(--rly-space-12);\n}\n\n.summary,\n.evidenceCard {\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.summaryHeading,\n.sectionHeading,\n.historyHeading,\n.evidenceHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-8);\n}\n\n.tags {\n justify-content: flex-end;\n}\n\n.summary h3,\n.section h3,\n.evidenceCard h4,\n.summary p,\n.history p,\n.facts dd {\n margin: 0;\n}\n\n.facts {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.facts div {\n min-width: 0;\n}\n\n.facts dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.facts dd {\n overflow-wrap: anywhere;\n}\n\n.history,\n.claims {\n gap: var(--rly-space-8);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.history li,\n.claims li {\n display: grid;\n gap: var(--rly-space-4);\n padding: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.history li:first-child,\n.claims li:first-child {\n border-block-start: 0;\n}\n\n.claims li {\n grid-template-columns: minmax(8rem, auto) minmax(0, 1fr);\n}\n\n@media (max-width: 36rem) {\n .facts,\n .claims li {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { EvidenceId, RelationshipId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY = 4\n\nexport interface RelationshipDetails {\n readonly evidence: ReadonlyArray<EvidenceInspection>\n readonly history: RelationshipHistoryInspection\n}\n\nexport interface RelationshipDetailsTransport {\n readonly load: (\n relationshipId: RelationshipId,\n evidenceIds: ReadonlyArray<EvidenceId>,\n signal: AbortSignal\n ) => Promise<RelationshipDetails>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load one relationship ledger and only the immutable evidence it references. */\nexport const browserRelationshipDetailsTransport: RelationshipDetailsTransport = {\n load: (relationshipId, evidenceIds, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n const history = yield* client.deliveryGraph.relationshipHistory({ params: { relationshipId } })\n const evidence = yield* Effect.forEach(\n evidenceIds,\n (evidenceId) => client.deliveryGraph.evidence({ params: { evidenceId } }),\n { concurrency: MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY }\n )\n return { evidence, history }\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nexport type RelationshipDetailsState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly details: RelationshipDetails\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n\n/** Keep relationship details bound to the exact selection and authenticated browser session. */\nexport const useRelationshipDetails = (\n relationshipId: RelationshipId | null,\n evidenceIds: ReadonlyArray<EvidenceId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: RelationshipDetailsTransport = browserRelationshipDetailsTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<RelationshipDetailsState>({ _tag: \"idle\" })\n const evidenceKey = evidenceIds.join(\":\")\n const evidenceIdsRef = useRef(evidenceIds)\n\n useEffect(() => {\n evidenceIdsRef.current = evidenceIds\n }, [evidenceIds])\n\n useEffect(() => {\n if (relationshipId === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", evidenceKey, relationshipId, sessionKey })\n transport.load(relationshipId, evidenceIdsRef.current, abort.signal).then(\n (details) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", details, evidenceKey, relationshipId, sessionKey })\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", evidenceKey, relationshipId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [evidenceKey, onSessionExpired, relationshipId, requestRevision, sessionKey, transport])\n\n const currentState: RelationshipDetailsState = relationshipId === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.relationshipId !== relationshipId ||\n state.sessionKey !== sessionKey ||\n state.evidenceKey !== evidenceKey\n ? { _tag: \"loading\", evidenceKey, relationshipId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\n\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { DeliveryRelationship, EvidenceClaim, EvidenceItem } from \"../../domain/deliveryGraph.js\"\nimport type { EvidenceId } from \"../../domain/identifiers.js\"\nimport type { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport styles from \"./RelationshipDetailSheet.module.css\"\nimport { type RelationshipDetailsTransport, useRelationshipDetails } from \"./useRelationshipDetails.js\"\n\nconst titleCase = (value: string): string =>\n value\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const formatRelationshipTimestamp = (value: UtcTimestamp): string =>\n DateTime.formatUtc(value, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n year: \"numeric\"\n })\n\nexport const relationshipActorLabel = (actor: DeliveryRelationship[\"recordedBy\"]): string => {\n switch (actor._tag) {\n case \"human\":\n return `Human · ${actor.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${actor.agentId.slice(-6)}`\n case \"system\":\n return `System · ${actor.component}`\n }\n}\n\nexport const relationshipProvenanceLabel = (provenance: DeliveryRelationship[\"provenance\"]): string => {\n switch (provenance._tag) {\n case \"plugin\":\n return `Plugin source · ${provenance.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human decision · ${provenance.personId.slice(-6)}`\n case \"agent\":\n return `Agent proposal · ${provenance.agentId.slice(-6)}`\n case \"rule\":\n return `Rule · ${provenance.ruleId} v${String(provenance.ruleVersion)}`\n }\n}\n\nconst relationshipRationale = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed by immutable evidence.\"\n case \"inferred\":\n case \"unknown\":\n return relationship.confidence.rationale\n }\n}\n\nconst relationshipConfidenceLabel = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(relationship.confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst relationshipLifecycleTone = (relationship: DeliveryRelationship): RlyStateTone => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipScopeLabel = (relationship: DeliveryRelationship): string => {\n if (relationship.scope === null) return \"Workspace\"\n if (relationship.scope._tag === \"release\") return `Release · ${relationship.scope.releaseId.slice(-6)}`\n return `Environment · ${relationship.scope.environmentId.slice(-6)}`\n}\n\nconst evidenceFreshnessTone = (evidence: EvidenceItem): RlyStateTone => {\n switch (evidence.freshness._tag) {\n case \"current\":\n return \"positive\"\n case \"stale\":\n return \"caution\"\n case \"missing\":\n case \"unavailable\":\n return \"critical\"\n }\n}\n\nconst lifecycleReason = (relationship: DeliveryRelationship): string | null => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n case \"superseded\":\n return relationship.lifecycle.reason\n case \"governed\":\n case \"inferred\":\n case \"proposed\":\n case \"verified\":\n return null\n }\n}\n\nconst evidencePartyLabel = (party: EvidenceItem[\"attribution\"] | EvidenceItem[\"verifier\"]): string => {\n switch (party._tag) {\n case \"plugin\":\n return `Plugin · ${party.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human · ${party.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${party.agentId.slice(-6)}`\n case \"system\":\n return `System · ${party.component}`\n }\n}\n\nexport const evidenceClaimValueLabel = (claim: EvidenceClaim): string => {\n switch (claim.value._tag) {\n case \"flag\":\n return claim.value.value ? \"Yes\" : \"No\"\n case \"state\":\n case \"revision\":\n return claim.value.value\n case \"reference\":\n return `Node ${claim.value.targetNodeId.slice(-6)}`\n }\n}\n\nconst EvidenceCard = ({\n claims,\n inspection,\n relationship\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly inspection: EvidenceInspection\n readonly relationship: DeliveryRelationship\n}): ReactElement => {\n const relatedClaimIds = new Set(relationship.evidenceClaimIds)\n const relatedClaims = claims.filter(\n ({ evidenceClaimId, evidenceId }) =>\n evidenceId === inspection.evidence.evidenceId && relatedClaimIds.has(evidenceClaimId)\n )\n const evidence = inspection.evidence\n return (\n <article className={styles.evidenceCard}>\n <div className={styles.evidenceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Evidence {evidence.evidenceId.slice(-6)}\n </Text>\n <StateLabel label={titleCase(evidence.freshness._tag)} size=\"compact\" tone={evidenceFreshnessTone(evidence)} />\n </div>\n <dl className={styles.facts}>\n <div>\n <dt>Observed</dt>\n <dd>{formatRelationshipTimestamp(evidence.observedAt)}</dd>\n </div>\n <div>\n <dt>Source</dt>\n <dd>{evidencePartyLabel(evidence.attribution)}</dd>\n </div>\n <div>\n <dt>Verified by</dt>\n <dd>{evidencePartyLabel(evidence.verifier)}</dd>\n </div>\n <div>\n <dt>Retention</dt>\n <dd>\n {titleCase(evidence.retention.classification)}\n {evidence.retention.legalHold ? \" · Legal hold\" : \"\"}\n </dd>\n </div>\n <div>\n <dt>Valid until</dt>\n <dd>\n {evidence.validUntil === null ? \"No expiry recorded\" : formatRelationshipTimestamp(evidence.validUntil)}\n </dd>\n </div>\n </dl>\n {relatedClaims.length === 0 ? (\n <Text tone=\"secondary\" variant=\"meta\">\n No referenced claim was returned for this observation.\n </Text>\n ) : (\n <ul className={styles.claims}>\n {relatedClaims.map((claim) => (\n <li key={claim.evidenceClaimId}>\n <Text as=\"span\" variant=\"label\">\n {titleCase(claim.predicate)}\n </Text>\n <Text as=\"span\" tone=\"secondary\">\n {evidenceClaimValueLabel(claim)}\n </Text>\n </li>\n ))}\n </ul>\n )}\n </article>\n )\n}\n\n/** Report the bounded history prefix without presenting it as a complete ledger. */\nexport const relationshipHistoryCountLabel = (revisions: RelationshipHistoryInspection[\"revisions\"]): string => {\n let newestRevision = 0\n for (const revision of revisions) newestRevision = Math.max(newestRevision, revision.revision)\n if (newestRevision > revisions.length) return `${String(revisions.length)} of ${String(newestRevision)} revisions`\n return `${String(revisions.length)} revision${revisions.length === 1 ? \"\" : \"s\"}`\n}\n\n/** URL-owned detail panel for immutable relationship history and evidence. */\nexport const RelationshipDetailSheet = ({\n claims,\n evidenceIds,\n onClose,\n onSessionExpired,\n relationship,\n sessionKey,\n transport\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly evidenceIds: ReadonlyArray<EvidenceId>\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly relationship: DeliveryRelationship | null\n readonly sessionKey: string | null\n readonly transport?: RelationshipDetailsTransport\n}): ReactElement => {\n const controller = useRelationshipDetails(\n relationship?.relationshipId ?? null,\n evidenceIds,\n sessionKey,\n onSessionExpired,\n transport\n )\n const title = relationship === null ? \"Relationship details\" : `${titleCase(relationship.kind)} relationship`\n const evidenceIntegrityComplete = relationship === null || claims.length === relationship.evidenceClaimIds.length\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={relationship !== null}\n >\n <Sheet.Content\n closeLabel={`Close ${title}`}\n description=\"Immutable delivery history and the evidence used to establish this connection.\"\n title={title}\n >\n <Sheet.Body className={styles.body}>\n {relationship === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading relationship details\" className={styles.loading}>\n <Skeleton height=\"7rem\" />\n <Skeleton height=\"12rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The selected relationship remains unchanged. Its history could not be loaded.\"\n title=\"Relationship details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"relationship-summary-title\" className={styles.summary}>\n <div className={styles.summaryHeading}>\n <Text as=\"h3\" id=\"relationship-summary-title\" variant=\"section-title\">\n {relationship.sourceNodeKind} → {relationship.targetNodeKind}\n </Text>\n <div className={styles.tags}>\n <StateLabel\n label={titleCase(relationship.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(relationship)}\n />\n <StateLabel label={relationshipConfidenceLabel(relationship)} size=\"compact\" tone=\"neutral\" />\n </div>\n </div>\n <Text tone=\"secondary\">{relationshipRationale(relationship)}</Text>\n <dl className={styles.facts}>\n <div>\n <dt>Revision</dt>\n <dd>{String(relationship.revision)}</dd>\n </div>\n <div>\n <dt>Recorded by</dt>\n <dd>{relationshipActorLabel(relationship.recordedBy)}</dd>\n </div>\n <div>\n <dt>Origin</dt>\n <dd>{relationshipProvenanceLabel(relationship.provenance)}</dd>\n </div>\n <div>\n <dt>Scope</dt>\n <dd>{relationshipScopeLabel(relationship)}</dd>\n </div>\n <div>\n <dt>Recorded</dt>\n <dd>{formatRelationshipTimestamp(relationship.recordedAt)}</dd>\n </div>\n </dl>\n </section>\n\n <section aria-labelledby=\"relationship-history-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-history-title\" variant=\"label\">\n History\n </Text>\n <StateLabel\n label={relationshipHistoryCountLabel(controller.state.details.history.revisions)}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {controller.state.details.history.revisions.length === 0 ? (\n <Text tone=\"secondary\">No immutable ledger revisions were returned.</Text>\n ) : (\n <ol className={styles.history}>\n {controller.state.details.history.revisions.map((revision) => {\n const reason = lifecycleReason(revision)\n return (\n <li key={`${revision.relationshipId}:${String(revision.revision)}`}>\n <div className={styles.historyHeading}>\n <Text as=\"span\" variant=\"label\">\n Revision {String(revision.revision)}\n </Text>\n <StateLabel\n label={titleCase(revision.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(revision)}\n />\n </div>\n <Text tone=\"secondary\" variant=\"meta\">\n {relationshipActorLabel(revision.recordedBy)} ·{\" \"}\n {formatRelationshipTimestamp(revision.recordedAt)}\n </Text>\n {reason === null ? null : <Text tone=\"secondary\">{reason}</Text>}\n </li>\n )\n })}\n </ol>\n )}\n </section>\n\n <section aria-labelledby=\"relationship-evidence-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-evidence-title\" variant=\"label\">\n Evidence\n </Text>\n <StateLabel\n label={`${String(controller.state.details.evidence.length)} observation${controller.state.details.evidence.length === 1 ? \"\" : \"s\"}`}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {evidenceIntegrityComplete ? null : (\n <div className={styles.integrity}>\n <StateLabel label=\"Evidence incomplete\" size=\"compact\" tone=\"critical\" />\n <Text tone=\"secondary\">\n One or more referenced claims are missing from the release slice. Refresh before relying on this\n relationship.\n </Text>\n </div>\n )}\n {controller.state.details.evidence.length === 0 ? (\n <Text tone=\"secondary\">No immutable evidence is attached to this relationship revision.</Text>\n ) : (\n <div className={styles.evidence}>\n {controller.state.details.evidence.map((inspection) => (\n <EvidenceCard\n claims={claims}\n inspection={inspection}\n key={inspection.evidence.evidenceId}\n relationship={relationship}\n />\n ))}\n </div>\n )}\n </section>\n </div>\n )}\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n","import * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport type { NavigateFunction } from \"react-router\"\n\nimport {\n EntityId,\n type EntityId as EntityIdType,\n RelationshipId,\n type RelationshipId as RelationshipIdType\n} from \"../../domain/identifiers.js\"\n\nconst RelationshipDetailMarker = Schema.Struct({\n _tag: Schema.Literal(\"relationship-detail-origin/v1\"),\n objectId: EntityId,\n relationshipId: RelationshipId\n})\n\nconst RelationshipDetailRouteState = Schema.Struct({\n relationshipDetailOrigin: RelationshipDetailMarker\n})\n\n/** Preserve existing release-origin state while marking an in-app relationship-detail activation. */\nexport const makeRelationshipDetailRouteState = <UnparsedInput>(\n state: UnparsedInput,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n) => ({\n ...((Predicate.isObject(state)) && state),\n relationshipDetailOrigin: {\n _tag: \"relationship-detail-origin/v1\",\n objectId,\n relationshipId\n }\n})\n\n/** Accept Back navigation only for the exact versioned object/relationship activation. */\nexport const matchesRelationshipDetailRouteState = <UnparsedInput>(\n state: UnparsedInput,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): boolean => {\n const decoded = Schema.decodeUnknownOption(RelationshipDetailRouteState)(state)\n return Option.isSome(decoded) &&\n decoded.value.relationshipDetailOrigin.objectId === objectId &&\n decoded.value.relationshipDetailOrigin.relationshipId === relationshipId\n}\n\n/** Close an in-app detail with Back; canonicalize direct detail URLs in place. */\nexport const closeRelationshipDetailRoute = (\n navigate: NavigateFunction,\n location: Readonly<{ hash: string; pathname: string; search: string; state: unknown }>,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): void => {\n if (matchesRelationshipDetailRouteState(location.state, objectId, relationshipId)) {\n navigate(-1)\n return\n }\n const next = new URLSearchParams(location.search)\n next.delete(\"relationship\")\n navigate(\n { hash: location.hash, pathname: location.pathname, search: next.size === 0 ? \"\" : `?${next.toString()}` },\n { replace: true, state: location.state }\n )\n}\n",".root,\n.loading,\n.context,\n.contextGroup,\n.selected,\n.selectedFacts,\n.trace,\n.traceList,\n.runbooks,\n.runbook {\n display: grid;\n}\n\n.root,\n.loading {\n gap: var(--rly-space-16);\n}\n\n.context {\n grid-template-columns: repeat(2, minmax(0, 1fr)) auto;\n align-items: start;\n gap: var(--rly-space-24);\n padding: var(--rly-space-16) var(--rly-space-20);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.contextGroup,\n.runbook {\n gap: var(--rly-space-4);\n}\n\n.contextHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.contextGroup h3 {\n margin: 0;\n}\n\n.selected {\n grid-column: 1 / -1;\n gap: var(--rly-space-12);\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-1);\n}\n\n.selected h3,\n.selected p,\n.selectedFacts dd {\n margin: 0;\n}\n\n.selectedHeading {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.selectedFacts {\n grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.selectedFacts div {\n min-width: 0;\n}\n\n.selectedFacts dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.selectedFacts dd {\n overflow-wrap: anywhere;\n}\n\n.trace {\n gap: var(--rly-space-8);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.traceHeading,\n.traceRelation {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.traceHeading {\n justify-content: space-between;\n}\n\n.traceHeading h4,\n.traceConnection p {\n margin: 0;\n}\n\n.traceList {\n gap: var(--rly-space-4);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.traceList li {\n display: grid;\n grid-template-columns: auto minmax(10rem, 1fr) auto auto auto;\n align-items: center;\n gap: var(--rly-space-12);\n min-width: 0;\n padding: var(--rly-space-8) var(--rly-space-12);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-2);\n}\n\n.traceConnection {\n min-width: 0;\n}\n\n.traceConnection a {\n color: var(--rly-color-text-1);\n overflow-wrap: anywhere;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails {\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.traceConnection a:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.runbooks {\n gap: var(--rly-space-8);\n}\n\n.runbook {\n color: inherit;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.runbook span {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.runbook:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 48rem) {\n .context {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .traceList li {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .traceRelation,\n .traceList li > span,\n .traceDetails {\n grid-column: 2;\n }\n}\n","import type { EnvironmentId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY = 4\n\n/** Load release scope followed by every target environment without saturating browser connection pools. */\nexport const loadReleaseEnvironmentSlices = async <Value>(\n environmentIds: ReadonlyArray<EnvironmentId>,\n load: (environmentId: EnvironmentId | null) => Promise<Value>\n): Promise<ReadonlyArray<Value>> => {\n const scopes: ReadonlyArray<EnvironmentId | null> = [null, ...environmentIds]\n const completed: Array<{ readonly index: number; readonly value: Value }> = []\n let nextIndex = 0\n let isStopped = false\n const loadNext = async (): Promise<void> => {\n while (!isStopped && nextIndex < scopes.length) {\n const index = nextIndex\n nextIndex += 1\n const environmentId = scopes[index]\n if (environmentId === undefined) return\n try {\n completed.push({ index, value: await load(environmentId) })\n } catch (failure) {\n isStopped = true\n throw failure\n }\n }\n }\n const workerCount = Math.min(MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY, scopes.length)\n await Promise.all(Array.from({ length: workerCount }, () => loadNext()))\n return completed.sort((left, right) => left.index - right.index).map(({ value }) => value)\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport { MAXIMUM_RELEASE_SLICE_RECORDS, type ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport type { EnvironmentId, ReleaseId } from \"../../domain/identifiers.js\"\nimport {\n loadReleaseEnvironmentSlices,\n MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n} from \"./loadReleaseEnvironmentSlices.js\"\n\nexport const MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS = MAXIMUM_RELEASE_SLICE_RECORDS\n\n/** Combine release and environment slices while retaining complete relationship closure. */\nexport const aggregateReleaseWorksetInspections = (\n releaseId: ReleaseId,\n inspections: ReadonlyArray<ReleaseDeliveryGraphInspection>\n): ReleaseDeliveryGraphInspection => {\n type Inspection = ReleaseDeliveryGraphInspection\n const availableNodes = new Map<string, Inspection[\"nodes\"][number]>()\n const availableProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const availableClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const availableEvidence = new Map<string, Inspection[\"evidenceItems\"][number]>()\n for (const inspection of inspections) {\n for (const node of inspection.nodes) availableNodes.set(node.nodeId, node)\n for (const entry of inspection.entityProjections) {\n availableProjections.set(entry.projection.entityId, entry)\n }\n for (const claim of inspection.evidenceClaims) availableClaims.set(claim.evidenceClaimId, claim)\n for (const item of inspection.evidenceItems) availableEvidence.set(item.evidenceId, item)\n }\n const nodes = new Map<string, Inspection[\"nodes\"][number]>()\n const entityProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const relationships = new Map<string, Inspection[\"relationships\"][number]>()\n const evidenceClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const evidenceItems = new Map<string, Inspection[\"evidenceItems\"][number]>()\n let truncated = inspections.some((inspection) => inspection.truncated)\n\n for (const relationship of inspections.flatMap(({ relationships }) => relationships)) {\n const relationshipKey = `${relationship.relationshipId}:${String(relationship.revision)}`\n if (relationships.has(relationshipKey)) continue\n const requiredNodes = [\n availableNodes.get(relationship.sourceNodeId),\n availableNodes.get(relationship.targetNodeId)\n ]\n if (requiredNodes.some((node) => node === undefined)) {\n truncated = true\n continue\n }\n const presentNodes = requiredNodes.filter((node) => node !== undefined)\n const entityNodes = presentNodes.filter(\n (node) => node.resolution._tag === \"resolved\" && node.resolution.target._tag === \"entity\"\n )\n const requiredProjections = entityNodes.flatMap((node) => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = availableProjections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [projection]\n })\n const requiredClaims = relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = availableClaims.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n const evidenceIds = new Set(requiredClaims.map(({ evidenceId }) => evidenceId))\n const requiredEvidence = [...evidenceIds].flatMap((evidenceId) => {\n const evidence = availableEvidence.get(evidenceId)\n return evidence === undefined ? [] : [evidence]\n })\n const closureMissing = requiredProjections.length !== entityNodes.length ||\n requiredClaims.length !== relationship.evidenceClaimIds.length ||\n requiredEvidence.length !== evidenceIds.size\n const newNodeCount = presentNodes.filter(({ nodeId }) => !nodes.has(nodeId)).length\n const newProjectionCount = requiredProjections.filter(({ projection }) =>\n !entityProjections.has(projection.entityId)\n ).length\n const newClaimCount = requiredClaims.filter(({ evidenceClaimId }) => !evidenceClaims.has(evidenceClaimId)).length\n const newEvidenceCount = requiredEvidence.filter(({ evidenceId }) => !evidenceItems.has(evidenceId)).length\n const closureExceedsBound = relationships.size === MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n nodes.size + newNodeCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n entityProjections.size + newProjectionCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceClaims.size + newClaimCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceItems.size + newEvidenceCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS\n if (closureMissing || closureExceedsBound) {\n truncated = true\n continue\n }\n relationships.set(relationshipKey, relationship)\n for (const node of presentNodes) nodes.set(node.nodeId, node)\n for (const entry of requiredProjections) entityProjections.set(entry.projection.entityId, entry)\n for (const claim of requiredClaims) evidenceClaims.set(claim.evidenceClaimId, claim)\n for (const item of requiredEvidence) evidenceItems.set(item.evidenceId, item)\n }\n return {\n releaseId,\n environmentId: null,\n truncated,\n nodes: [...nodes.values()],\n entityProjections: [...entityProjections.values()],\n relationships: [...relationships.values()],\n evidenceClaims: [...evidenceClaims.values()],\n evidenceItems: [...evidenceItems.values()]\n }\n}\n\nexport interface ReleaseWorksetTransport {\n readonly load: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<ReleaseDeliveryGraphInspection>\n}\n\nexport const MAXIMUM_RELEASE_WORKSET_REQUEST_CONCURRENCY = MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load every release/environment slice without saturating browser or server connection pools. */\nexport const loadReleaseWorksetInspections = async (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n signal: AbortSignal,\n transport: ReleaseWorksetTransport\n): Promise<ReadonlyArray<ReleaseDeliveryGraphInspection>> => {\n return loadReleaseEnvironmentSlices(\n environmentIds,\n (environmentId) => transport.load(releaseId, environmentId, signal)\n )\n}\n\nexport type ReleaseWorksetState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly inspection: ReleaseDeliveryGraphInspection\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n\n/** Generated-client transport for one authenticated bounded release graph. */\nexport const browserReleaseWorksetTransport: ReleaseWorksetTransport = {\n load: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.releaseSlice({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep one release workset scoped to the exact authenticated browser session. */\nexport const useReleaseWorkset = (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: ReleaseWorksetTransport = browserReleaseWorksetTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<ReleaseWorksetState>({ _tag: \"idle\" })\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", environmentScopeKey, releaseId, sessionKey })\n loadReleaseWorksetInspections(releaseId, environmentIds, abort.signal, transport).then(\n (inspections) => {\n if (!abort.signal.aborted) {\n setState({\n _tag: \"ready\",\n environmentScopeKey,\n inspection: aggregateReleaseWorksetInspections(releaseId, inspections),\n releaseId,\n sessionKey\n })\n }\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", environmentScopeKey, releaseId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [environmentScopeKey, onSessionExpired, releaseId, requestRevision, sessionKey, transport])\n\n const currentState: ReleaseWorksetState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.releaseId !== releaseId ||\n state.sessionKey !== sessionKey ||\n state.environmentScopeKey !== environmentScopeKey\n ? { _tag: \"loading\", environmentScopeKey, releaseId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { ServiceMark, WorksetCard } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement } from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport type { WorkspaceId } from \"../../domain/identifiers.js\"\nimport { WorkspaceEntityLink, workspaceEntityStateForHref } from \"../entities/WorkspaceEntityLink.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport {\n presentReleaseWorkset,\n releaseWorksetRelationshipEvidenceClaims,\n releaseWorksetRelationshipEvidenceIds,\n selectReleaseWorksetObject,\n selectReleaseWorksetRelationship,\n selectReleaseWorksetTrace,\n type SelectedReleaseWorksetObject,\n type SelectedReleaseWorksetTrace\n} from \"./presentReleaseWorkset.js\"\nimport { RelationshipDetailSheet } from \"./RelationshipDetailSheet.js\"\nimport { closeRelationshipDetailRoute, makeRelationshipDetailRouteState } from \"./relationshipDetailRoute.js\"\nimport styles from \"./ReleaseWorkset.module.css\"\nimport { useReleaseWorkset } from \"./useReleaseWorkset.js\"\n\nconst LoadingWorkset = (): ReactElement => (\n <div aria-busy=\"true\" aria-label=\"Loading release work\" className={styles.loading}>\n <Skeleton height=\"3rem\" />\n <Skeleton height=\"15rem\" />\n </div>\n)\n\n/** Inspectable destination for an Items result selected within its release context. */\nexport const SelectedReleaseWorksetObjectPanel = ({\n linkLocation,\n selectedObject,\n trace\n}: {\n readonly linkLocation?: RouterLocationParts\n readonly selectedObject: SelectedReleaseWorksetObject\n readonly trace?: SelectedReleaseWorksetTrace\n}): ReactElement => {\n return (\n <section aria-label={`Selected ${selectedObject.kind} ${selectedObject.label}`} className={styles.selected}>\n <div className={styles.selectedHeading}>\n <ServiceMark service={selectedObject.service} size=\"compact\" />\n <Text as=\"p\" variant=\"label\">\n Selected object · {selectedObject.label}\n </Text>\n <StateLabel label={selectedObject.status} size=\"compact\" tone={selectedObject.tone} />\n </div>\n <Text as=\"h3\" variant=\"section-title\">\n {selectedObject.title}\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n {selectedObject.kind}\n </Text>\n <dl className={styles.selectedFacts}>\n {selectedObject.facts.map((fact) => (\n <div key={fact.label}>\n <dt>{fact.label}</dt>\n <dd>{fact.value}</dd>\n </div>\n ))}\n </dl>\n {trace === undefined ? null : (\n <div className={styles.trace}>\n <div className={styles.traceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Delivery trace\n </Text>\n <StateLabel\n label={`${trace.relationships.length} relationship${trace.relationships.length === 1 ? \"\" : \"s\"}${trace.truncated ? \"+\" : \"\"}`}\n size=\"compact\"\n tone={trace.truncated ? \"caution\" : \"neutral\"}\n />\n </div>\n {trace.relationships.length === 0 ? (\n <Text tone=\"secondary\">No relationship touches this object in the current release slice.</Text>\n ) : (\n <ul className={styles.traceList}>\n {trace.relationships.map((relationship) => (\n <li key={relationship.id}>\n {relationship.other.service === null ? null : (\n <ServiceMark service={relationship.other.service} size=\"compact\" />\n )}\n <div className={styles.traceConnection}>\n <Text as=\"p\" variant=\"label\">\n {relationship.direction === \"incoming\" ? \"From\" : \"To\"} {relationship.other.label}\n </Text>\n {relationship.other.href === null ? (\n <Text tone=\"secondary\">{relationship.other.title}</Text>\n ) : (\n <Link\n onClick={(event) => {\n const href = relationship.other.href\n if (\n linkLocation !== undefined &&\n href !== null &&\n workspaceEntityStateForHref(href, linkLocation) !== undefined &&\n shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)\n ) {\n rememberWorkspaceScrollPosition(linkLocation, href)\n }\n }}\n state={\n linkLocation === undefined\n ? undefined\n : workspaceEntityStateForHref(relationship.other.href, linkLocation)\n }\n to={relationship.other.href}\n >\n {relationship.other.title}\n </Link>\n )}\n </div>\n <div className={styles.traceRelation}>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.kind}\n </Text>\n <StateLabel label={relationship.lifecycle} size=\"compact\" tone={relationship.tone} />\n </div>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.confidence} · {relationship.evidenceCount} evidence claim\n {relationship.evidenceCount === 1 ? \"\" : \"s\"}\n </Text>\n <Link\n aria-label={`Details for ${relationship.kind} ${relationship.direction} relationship with ${relationship.other.label}`}\n className={styles.traceDetails}\n state={makeRelationshipDetailRouteState(linkLocation?.state, selectedObject.id, relationship.id)}\n to={relationship.detailsHref}\n >\n Details\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </section>\n )\n}\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Compatibility name retained for release-workset callers of the shared readable-session policy. */\nexport const releaseWorksetSessionKey = browserReadableSessionKey\n\n/** Render one server-backed release graph without substituting demo relationships. */\nexport const ReleaseWorkset = ({\n release,\n workspaceId\n}: {\n readonly release: PortfolioReleasePresentation\n readonly workspaceId: WorkspaceId\n}): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const controller = useReleaseWorkset(\n release.id,\n release.targetEnvironmentIds,\n sessionKey,\n browserSession.invalidateSession\n )\n if (sessionKey === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return <LoadingWorkset />\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the delivery graph for this release. Saved release facts remain unchanged.\"\n title=\"Release work unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const workset = presentReleaseWorkset(controller.state.inspection, workspaceId)\n const searchParams = new URLSearchParams(location.search)\n const selectedObjectId = searchParams.get(\"object\")\n const selectedRelationshipId = searchParams.get(\"relationship\")\n const selectedObject = selectReleaseWorksetObject(controller.state.inspection, selectedObjectId)\n const selectedTrace = selectReleaseWorksetTrace(controller.state.inspection, workspaceId, selectedObjectId)\n const selectedRelationship = selectReleaseWorksetRelationship(\n controller.state.inspection,\n selectedObjectId,\n selectedRelationshipId\n )\n const selectedEvidenceIds = releaseWorksetRelationshipEvidenceIds(controller.state.inspection, selectedRelationship)\n const selectedEvidenceClaims = releaseWorksetRelationshipEvidenceClaims(\n controller.state.inspection,\n selectedRelationship\n )\n const closeRelationshipDetails = (): void => {\n if (selectedObject === null || selectedRelationship === null) return\n closeRelationshipDetailRoute(navigate, location, selectedObject.id, selectedRelationship.relationshipId)\n }\n return (\n <>\n <div className={styles.root}>\n <div className={styles.context}>\n <div className={styles.contextGroup}>\n <Text as=\"h3\" variant=\"label\">\n Environment\n </Text>\n {release.targetEnvironmentIds.length === 0 ? (\n <Text tone=\"secondary\">No target environment recorded.</Text>\n ) : (\n <div className={styles.tags}>\n {release.targetEnvironmentIds.map((environmentId) => (\n <StateLabel\n key={environmentId}\n label={`Unknown target · ${environmentId.slice(-4)}`}\n size=\"compact\"\n title={`Environment ${environmentId}; provider metadata unavailable`}\n tone=\"neutral\"\n />\n ))}\n </div>\n )}\n </div>\n <div className={styles.contextGroup}>\n <div className={styles.contextHeading}>\n <ServiceMark service=\"confluence\" size=\"compact\" />\n <Text as=\"h3\" variant=\"label\">\n Runbook\n </Text>\n </div>\n {workset.runbooks.length === 0 ? (\n <Text tone=\"secondary\">No runbook linked.</Text>\n ) : (\n <div className={styles.runbooks}>\n {workset.runbooks.map((runbook) => (\n <Link\n className={styles.runbook}\n key={runbook.id}\n onClick={(event) => {\n if (\n workspaceEntityStateForHref(runbook.href, location) !== undefined &&\n shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)\n ) {\n rememberWorkspaceScrollPosition(location, runbook.href)\n }\n }}\n state={workspaceEntityStateForHref(runbook.href, location)}\n to={runbook.href}\n >\n <strong>{runbook.title}</strong>\n <span>\n {runbook.reference}\n {runbook.totalTasks === 0\n ? \"\"\n : ` · ${String(runbook.completedTasks)}/${String(runbook.totalTasks)} tasks`}\n </span>\n </Link>\n ))}\n </div>\n )}\n </div>\n {workset.truncated ? (\n <StateLabel label=\"Bounded view · more records exist\" size=\"compact\" tone=\"caution\" />\n ) : null}\n {selectedObject === null || selectedTrace === null ? null : (\n <SelectedReleaseWorksetObjectPanel\n linkLocation={location}\n selectedObject={selectedObject}\n trace={selectedTrace}\n />\n )}\n </div>\n <LinkProvider component={WorkspaceEntityLink}>\n <WorksetCard\n gaps={workset.gaps}\n heading={`${release.serviceName} release work`}\n jiraItems={workset.jiraItems}\n pipelines={workset.pipelines}\n pullRequestGroups={workset.pullRequestGroups}\n />\n </LinkProvider>\n </div>\n <RelationshipDetailSheet\n claims={selectedEvidenceClaims}\n evidenceIds={selectedEvidenceIds}\n onClose={closeRelationshipDetails}\n onSessionExpired={browserSession.invalidateSession}\n relationship={selectedRelationship}\n sessionKey={sessionKey}\n />\n </>\n )\n}\n"],"mappings":"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"}