@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,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{m as n}from"./hooks-CGvBGjhq.js";import{a as r,d as i,r as a,v as o}from"./Dialog-_t9OodCK-CzkLh9VB.js";import{t as s}from"./jsx-runtime-NZYk81nU.js";import{b as c,w as l}from"./index-BHQ_NP1r.js";import{n as u}from"./patterns-D0U0WCQS.js";import{n as d,t as f}from"./primitives-CjQX0eVM-BPKvllZ_.js";import{Ci as p,Ei as m,Ha as h,Hi as g,Mi as _,Ni as v,Oa as y,Pi as b,Wr as x,aa as S,ha as C,on as w,qn as T,ri as E,sn as D}from"./agent-api-0YXZd1ag.js";import{i as O,n as k,r as A}from"./presentWorkspaceItems-Cd0qEwW1.js";import{t as j}from"./authorizedShareTransport-xJy2K3un.js";var M=e(t(),1),N={page:`_page_m9pfd_1`,hero:`_hero_m9pfd_2`,item:`_item_m9pfd_3`,facts:`_facts_m9pfd_4`,itemHeader:`_itemHeader_m9pfd_24`},P=s(),F=3e4,I=e=>t=>h(t,`_tag`)&&t._tag===e,L=I(`NotFoundApiError`),R=I(`UnauthorizedApiError`),z=class extends S(`AuthorizedShareResolveError`){},B=({transport:e=j}={})=>{let t=n(),s=c(),h=T(w)(t.shareId),S=T(D)(t.workspaceId),I=y(h)?h.value:null,B=y(S)?S.value:null,V=s.state._tag===`authenticated`||s.state._tag===`storage-unavailable`?s.state.session:null,H=V!==null&&V.workspaceId===B?V:null,[U,W]=(0,M.useState)(0),[G,K]=(0,M.useState)({_tag:`idle`});if((0,M.useEffect)(()=>{if(I===null||B===null||H===null){K({_tag:`idle`});return}let t=new AbortController;K({_tag:`loading`});let n=b({try:()=>e.resolve(B,I,t.signal),catch:e=>new z({cause:e})}).pipe(v(e=>_(()=>{t.signal.aborted||K({_tag:`ready`,resolution:e})}))),r=p(n,g(C(F))).pipe(E(e=>_(()=>{t.signal.aborted||(R(e.cause)&&s.invalidateSession(H.sessionId),K(L(e.cause)?{_tag:`not-found`}:{_tag:`failed`}))})));return m(r,{signal:t.signal}).catch(()=>{t.signal.aborted||K({_tag:`failed`})}),()=>t.abort()},[s,U,H,I,e,B]),I===null||B===null)return(0,P.jsx)(a,{action:(0,P.jsx)(l,{to:`/`,children:`Return to Control Center`}),description:`This authorized link is malformed. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(s.state._tag===`checking`||G._tag===`loading`)return(0,P.jsxs)(`section`,{"aria-label":`Loading authorized share`,className:N.page,children:[(0,P.jsx)(r,{height:`8rem`,variant:`block`}),(0,P.jsx)(r,{height:`18rem`,variant:`block`})]});if(V===null)return(0,P.jsx)(a,{action:(0,P.jsx)(l,{to:`/pair`,children:`Pair this browser`}),description:`This link grants no bearer access. Pair as the selected person, then reopen it.`,title:`Authentication required`,tone:`caution`});if(V.workspaceId!==B)return(0,P.jsx)(a,{description:`This link is scoped to another workspace. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(G._tag===`not-found`)return(0,P.jsx)(a,{description:`The link may target another person, be expired or revoked, or point to a deleted item.`,title:`Share unavailable`,tone:`caution`});if(G._tag===`failed`||G._tag===`idle`)return(0,P.jsx)(a,{action:(0,P.jsx)(i,{onClick:()=>W(e=>e+1),children:`Try again`}),description:`Control Center could not resolve this authorized link.`,title:`Share unavailable`,tone:`caution`});let q=G.resolution.item.projection,J=A(q.details),Y=O(q.entityType,J);return(0,P.jsxs)(`article`,{className:N.page,children:[(0,P.jsxs)(`header`,{className:N.hero,children:[(0,P.jsx)(d,{as:`p`,tone:`secondary`,variant:`label`,children:`Authorized item`}),(0,P.jsx)(d,{as:`h1`,variant:`verdict`,children:`Exact scope. Nothing adjacent.`}),(0,P.jsx)(d,{tone:`secondary`,variant:`body-large`,children:`This view contains only the granted current item projection. Releases, relationships, and evidence remain private.`})]}),(0,P.jsxs)(f,{as:`section`,className:N.item,padding:`spacious`,tone:`secondary`,children:[(0,P.jsxs)(`div`,{className:N.itemHeader,children:[(0,P.jsx)(u,{service:k(q.entityType),size:`compact`}),(0,P.jsx)(o,{label:J,size:`compact`,tone:Y.tone})]}),(0,P.jsx)(d,{as:`p`,tone:`secondary`,variant:`label`,children:q.displayKey}),(0,P.jsx)(d,{as:`h2`,variant:`section-title`,children:q.title}),(0,P.jsxs)(`dl`,{className:N.facts,children:[(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Type`}),(0,P.jsx)(`dd`,{children:q.entityType})]}),(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Observed`}),(0,P.jsx)(`dd`,{children:x(G.resolution.item.recordedAt)})]}),(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Expires`}),(0,P.jsx)(`dd`,{children:x(G.resolution.share.expiresAt)})]})]})]})]})};export{B as AuthorizedSharePage};
2
- //# sourceMappingURL=AuthorizedSharePage-BCwnILXF.js.map
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{m as n}from"./hooks-CGvBGjhq.js";import{a as r,d as i,r as a,v as o}from"./Dialog-_t9OodCK-CzkLh9VB.js";import{t as s}from"./jsx-runtime-NZYk81nU.js";import{b as c,w as l}from"./index-DlDEYM2e.js";import{y as u}from"./patterns-CJ4c7F5A.js";import{n as d,t as f}from"./primitives-Dj-qYrUZ-BIf5RLs4.js";import{Ci as p,Ei as m,Ha as h,Hi as g,Mi as _,Ni as v,Oa as y,Pi as b,Wr as x,aa as S,ha as C,on as w,qn as T,ri as E,sn as D}from"./agent-api-0YXZd1ag.js";import{i as O,n as k,r as A}from"./presentWorkspaceItems-Cd0qEwW1.js";import{t as j}from"./authorizedShareTransport-xJy2K3un.js";var M=e(t(),1),N={page:`_page_m9pfd_1`,hero:`_hero_m9pfd_2`,item:`_item_m9pfd_3`,facts:`_facts_m9pfd_4`,itemHeader:`_itemHeader_m9pfd_24`},P=s(),F=3e4,I=e=>t=>h(t,`_tag`)&&t._tag===e,L=I(`NotFoundApiError`),R=I(`UnauthorizedApiError`),z=class extends S(`AuthorizedShareResolveError`){},B=({transport:e=j}={})=>{let t=n(),s=c(),h=T(w)(t.shareId),S=T(D)(t.workspaceId),I=y(h)?h.value:null,B=y(S)?S.value:null,V=s.state._tag===`authenticated`||s.state._tag===`storage-unavailable`?s.state.session:null,H=V!==null&&V.workspaceId===B?V:null,[U,W]=(0,M.useState)(0),[G,K]=(0,M.useState)({_tag:`idle`});if((0,M.useEffect)(()=>{if(I===null||B===null||H===null){K({_tag:`idle`});return}let t=new AbortController;K({_tag:`loading`});let n=b({try:()=>e.resolve(B,I,t.signal),catch:e=>new z({cause:e})}).pipe(v(e=>_(()=>{t.signal.aborted||K({_tag:`ready`,resolution:e})}))),r=p(n,g(C(F))).pipe(E(e=>_(()=>{t.signal.aborted||(R(e.cause)&&s.invalidateSession(H.sessionId),K(L(e.cause)?{_tag:`not-found`}:{_tag:`failed`}))})));return m(r,{signal:t.signal}).catch(()=>{t.signal.aborted||K({_tag:`failed`})}),()=>t.abort()},[s,U,H,I,e,B]),I===null||B===null)return(0,P.jsx)(a,{action:(0,P.jsx)(l,{to:`/`,children:`Return to Control Center`}),description:`This authorized link is malformed. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(s.state._tag===`checking`||G._tag===`loading`)return(0,P.jsxs)(`section`,{"aria-label":`Loading authorized share`,className:N.page,children:[(0,P.jsx)(r,{height:`8rem`,variant:`block`}),(0,P.jsx)(r,{height:`18rem`,variant:`block`})]});if(V===null)return(0,P.jsx)(a,{action:(0,P.jsx)(l,{to:`/pair`,children:`Pair this browser`}),description:`This link grants no bearer access. Pair as the selected person, then reopen it.`,title:`Authentication required`,tone:`caution`});if(V.workspaceId!==B)return(0,P.jsx)(a,{description:`This link is scoped to another workspace. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(G._tag===`not-found`)return(0,P.jsx)(a,{description:`The link may target another person, be expired or revoked, or point to a deleted item.`,title:`Share unavailable`,tone:`caution`});if(G._tag===`failed`||G._tag===`idle`)return(0,P.jsx)(a,{action:(0,P.jsx)(i,{onClick:()=>W(e=>e+1),children:`Try again`}),description:`Control Center could not resolve this authorized link.`,title:`Share unavailable`,tone:`caution`});let q=G.resolution.item.projection,J=A(q.details),Y=O(q.entityType,J);return(0,P.jsxs)(`article`,{className:N.page,children:[(0,P.jsxs)(`header`,{className:N.hero,children:[(0,P.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:`Authorized item`}),(0,P.jsx)(f,{as:`h1`,variant:`verdict`,children:`Exact scope. Nothing adjacent.`}),(0,P.jsx)(f,{tone:`secondary`,variant:`body-large`,children:`This view contains only the granted current item projection. Releases, relationships, and evidence remain private.`})]}),(0,P.jsxs)(d,{as:`section`,className:N.item,padding:`spacious`,tone:`secondary`,children:[(0,P.jsxs)(`div`,{className:N.itemHeader,children:[(0,P.jsx)(u,{service:k(q.entityType),size:`compact`}),(0,P.jsx)(o,{label:J,size:`compact`,tone:Y.tone})]}),(0,P.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:q.displayKey}),(0,P.jsx)(f,{as:`h2`,variant:`section-title`,children:q.title}),(0,P.jsxs)(`dl`,{className:N.facts,children:[(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Type`}),(0,P.jsx)(`dd`,{children:q.entityType})]}),(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Observed`}),(0,P.jsx)(`dd`,{children:x(G.resolution.item.recordedAt)})]}),(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Expires`}),(0,P.jsx)(`dd`,{children:x(G.resolution.share.expiresAt)})]})]})]})]})};export{B as AuthorizedSharePage};
2
+ //# sourceMappingURL=AuthorizedSharePage-BZPfotuK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthorizedSharePage-BZPfotuK.js","names":["Predicate.hasProperty","Data.TaggedError","Schema.decodeUnknownOption","Option.isSome","useState","Effect.tryPromise","Effect.tap","Effect.sync","Effect.repeat","Schedule.spaced","Duration.millis","Effect.catch","StatePanel","styles","Skeleton","Button","Text","Surface","ServiceMark","StateLabel","DateTime.formatIso","__toESM","useParams","Le","V","He","ve","require_jsx_runtime","useBrowserSession","Link","z","z$1","se","repeat","runPromise","hasProperty","spaced","sync","tap","isSome","tryPromise","formatIso","TaggedError","millis","ShareId","decodeUnknownOption","catch_","WorkspaceId","statusPresentation","serviceFor","statusFor","browserAuthorizedShareTransport","import_react","require_react","AuthorizedSharePage_module_default","import_jsx_runtime","SHARE_REVALIDATION_MILLISECONDS","isTaggedFailure","failure","tag","isNotFound","isUnauthorized","AuthorizedShareResolveError","AuthorizedSharePage","params","browserSession","decodedShareId","decodedWorkspaceId","shareId","workspaceId","authenticatedSession","session","requestRevision","setRequestRevision","state","setState","request","resolveOnce","transport","program","revision","projection","status","presentation"],"sources":["../../../src/client/items/AuthorizedSharePage.module.css","../../../src/client/items/AuthorizedSharePage.tsx"],"sourcesContent":[".page,\n.hero,\n.item,\n.facts {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n max-inline-size: 58rem;\n margin-inline: auto;\n}\n\n.hero,\n.item {\n gap: var(--rly-space-12);\n}\n\n.hero > *,\n.item > * {\n margin: 0;\n}\n\n.itemHeader {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.facts {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--rly-space-12);\n margin-block: var(--rly-space-8);\n}\n\n.facts div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.facts dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.item a {\n justify-self: start;\n min-block-size: 3rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.item a:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 40rem) {\n .facts {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Data from \"effect/Data\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Duration from \"effect/Duration\"\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schedule from \"effect/Schedule\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useState } from \"react\"\nimport { Link, useParams } from \"react-router\"\n\nimport type { AuthorizedShareResolution } from \"../../api/shares.js\"\nimport { ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { browserAuthorizedShareTransport, type AuthorizedShareTransport } from \"./authorizedShareTransport.js\"\nimport { serviceFor, statusFor, statusPresentation } from \"./presentWorkspaceItems.js\"\nimport styles from \"./AuthorizedSharePage.module.css\"\n\ntype AuthorizedSharePageState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"not-found\" }\n | { readonly _tag: \"ready\"; readonly resolution: AuthorizedShareResolution }\n\nconst SHARE_REVALIDATION_MILLISECONDS = 30_000\n\nconst isTaggedFailure =\n (tag: string) =>\n <UnparsedInput,>(failure: UnparsedInput): boolean =>\n Predicate.hasProperty(failure, \"_tag\") && failure._tag === tag\n\nconst isNotFound = isTaggedFailure(\"NotFoundApiError\")\nconst isUnauthorized = isTaggedFailure(\"UnauthorizedApiError\")\n\nclass AuthorizedShareResolveError extends Data.TaggedError(\"AuthorizedShareResolveError\")<{\n readonly cause: unknown\n}> {}\n\nexport interface AuthorizedSharePageProps {\n readonly transport?: AuthorizedShareTransport\n}\n\n/** Direct-load authenticated page for one exact shared normalized item. */\nexport const AuthorizedSharePage = ({\n transport = browserAuthorizedShareTransport\n}: AuthorizedSharePageProps = {}): ReactElement => {\n const params = useParams()\n const browserSession = useBrowserSession()\n const decodedShareId = Schema.decodeUnknownOption(ShareId)(params.shareId)\n const decodedWorkspaceId = Schema.decodeUnknownOption(WorkspaceId)(params.workspaceId)\n const shareId = Option.isSome(decodedShareId) ? decodedShareId.value : null\n const workspaceId = Option.isSome(decodedWorkspaceId) ? decodedWorkspaceId.value : null\n const authenticatedSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const session =\n authenticatedSession !== null && authenticatedSession.workspaceId === workspaceId ? authenticatedSession : null\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<AuthorizedSharePageState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (shareId === null || workspaceId === null || session === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n setState({ _tag: \"loading\" })\n const resolveOnce = Effect.tryPromise({\n try: () => transport.resolve(workspaceId, shareId, request.signal),\n catch: (cause) => new AuthorizedShareResolveError({ cause })\n }).pipe(\n Effect.tap((resolution) =>\n Effect.sync(() => {\n if (!request.signal.aborted) setState({ _tag: \"ready\", resolution })\n })\n )\n )\n const program = Effect.repeat(resolveOnce, Schedule.spaced(Duration.millis(SHARE_REVALIDATION_MILLISECONDS))).pipe(\n Effect.catch((failure) =>\n Effect.sync(() => {\n if (request.signal.aborted) return\n if (isUnauthorized(failure.cause)) browserSession.invalidateSession(session.sessionId)\n setState(isNotFound(failure.cause) ? { _tag: \"not-found\" } : { _tag: \"failed\" })\n })\n )\n )\n Effect.runPromise(program, { signal: request.signal }).catch(() => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n })\n return () => request.abort()\n }, [browserSession, requestRevision, session, shareId, transport, workspaceId])\n\n if (shareId === null || workspaceId === null) {\n return (\n <StatePanel\n action={<Link to=\"/\">Return to Control Center</Link>}\n description=\"This authorized link is malformed. No item was substituted.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (browserSession.state._tag === \"checking\" || state._tag === \"loading\") {\n return (\n <section aria-label=\"Loading authorized share\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"18rem\" variant=\"block\" />\n </section>\n )\n }\n\n if (authenticatedSession === null) {\n return (\n <StatePanel\n action={<Link to=\"/pair\">Pair this browser</Link>}\n description=\"This link grants no bearer access. Pair as the selected person, then reopen it.\"\n title=\"Authentication required\"\n tone=\"caution\"\n />\n )\n }\n\n if (authenticatedSession.workspaceId !== workspaceId) {\n return (\n <StatePanel\n description=\"This link is scoped to another workspace. No item was substituted.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (state._tag === \"not-found\") {\n return (\n <StatePanel\n description=\"The link may target another person, be expired or revoked, or point to a deleted item.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (state._tag === \"failed\" || state._tag === \"idle\") {\n return (\n <StatePanel\n action={<Button onClick={() => setRequestRevision((revision) => revision + 1)}>Try again</Button>}\n description=\"Control Center could not resolve this authorized link.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const projection = state.resolution.item.projection\n const status = statusFor(projection.details)\n const presentation = statusPresentation(projection.entityType, status)\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Authorized item\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Exact scope. Nothing adjacent.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n This view contains only the granted current item projection. Releases, relationships, and evidence remain\n private.\n </Text>\n </header>\n <Surface as=\"section\" className={styles.item} padding=\"spacious\" tone=\"secondary\">\n <div className={styles.itemHeader}>\n <ServiceMark service={serviceFor(projection.entityType)} size=\"compact\" />\n <StateLabel label={status} size=\"compact\" tone={presentation.tone} />\n </div>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n {projection.displayKey}\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {projection.title}\n </Text>\n <dl className={styles.facts}>\n <div>\n <dt>Type</dt>\n <dd>{projection.entityType}</dd>\n </div>\n <div>\n <dt>Observed</dt>\n <dd>{DateTime.formatIso(state.resolution.item.recordedAt)}</dd>\n </div>\n <div>\n <dt>Expires</dt>\n <dd>{DateTime.formatIso(state.resolution.share.expiresAt)}</dd>\n </div>\n </dl>\n </Surface>\n </article>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{b as n}from"./index-BHQ_NP1r.js";import{Ei as r,Ga as i,Ha as a,Si as o,mi as s}from"./agent-api-0YXZd1ag.js";import{a as c,t as l}from"./client-C9AVNoed.js";var u=e(t(),1),d=s(function*(){return yield*(yield*l()).session.current()}).pipe(o(c)),f=e=>!a(e,`_tag`)||!i(e._tag)?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},p=({loadSession:e=d}={})=>{let{beginHydration:t,completeHydration:i}=n();return(0,u.useEffect)(()=>{let n=t(),a=new AbortController,o=!0;return r(e,{signal:a.signal}).then(e=>{o&&i(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{o&&i(n,f(e))}),()=>{o=!1,a.abort()}},[t,i,e]),null};export{p as BrowserSessionHydrator};
2
- //# sourceMappingURL=BrowserSessionHydrator-BAb76EvO.js.map
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{b as n}from"./index-DlDEYM2e.js";import{Ei as r,Ga as i,Ha as a,Si as o,mi as s}from"./agent-api-0YXZd1ag.js";import{a as c,t as l}from"./client-C9AVNoed.js";var u=e(t(),1),d=s(function*(){return yield*(yield*l()).session.current()}).pipe(o(c)),f=e=>!a(e,`_tag`)||!i(e._tag)?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},p=({loadSession:e=d}={})=>{let{beginHydration:t,completeHydration:i}=n();return(0,u.useEffect)(()=>{let n=t(),a=new AbortController,o=!0;return r(e,{signal:a.signal}).then(e=>{o&&i(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{o&&i(n,f(e))}),()=>{o=!1,a.abort()}},[t,i,e]),null};export{p as BrowserSessionHydrator};
2
+ //# sourceMappingURL=BrowserSessionHydrator-B3yI9F2z.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserSessionHydrator-BAb76EvO.js","names":["Effect.gen","Effect.provide","FetchHttpClient.layer","Predicate.hasProperty","Predicate.isString","__toESM","useBrowserSession","runPromise","isString","hasProperty","provide","gen","layer","makeControlCenterApiClient","import_react","require_react","loadBrowserSession","failedSessionState","failure","BrowserSessionHydrator","attempt","beginHydration","request","isCurrent","loadSession","completeHydration","result"],"sources":["../../../src/client/BrowserSessionHydrator.tsx"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport { type ReactElement, useEffect } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { useBrowserSession, type BrowserSessionState } from \"./BrowserSession.js\"\n\nconst loadBrowserSession = Effect.gen(function* () {\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.current()\n}).pipe(Effect.provide(FetchHttpClient.layer))\n\nconst failedSessionState = <UnparsedInput,>(\n failure: UnparsedInput\n): Exclude<BrowserSessionState, { readonly _tag: \"authenticated\" | \"checking\" }> => {\n if (!Predicate.hasProperty(failure, \"_tag\") || !Predicate.isString(failure._tag)) {\n return { _tag: \"unavailable\" }\n }\n if (failure._tag === \"UnauthorizedApiError\") return { _tag: \"anonymous\" }\n if (failure._tag === \"ForbiddenApiError\") return { _tag: \"blocked\" }\n return { _tag: \"unavailable\" }\n}\n\ninterface BrowserSessionHydratorProps {\n readonly loadSession?: typeof loadBrowserSession\n}\n\n/** Recover this tab's mutation proof once, regardless of its initial route. */\nexport const BrowserSessionHydrator = ({\n loadSession = loadBrowserSession\n}: BrowserSessionHydratorProps = {}): ReactElement | null => {\n const { beginHydration, completeHydration } = useBrowserSession()\n\n useEffect(() => {\n const attempt = beginHydration()\n const request = new AbortController()\n let isCurrent = true\n Effect.runPromise(loadSession, { signal: request.signal }).then(\n (result) => {\n if (!isCurrent) return\n completeHydration(attempt, {\n _tag: \"authenticated\",\n csrfToken: result.csrfToken,\n session: result.session\n })\n },\n <UnparsedInput,>(failure: UnparsedInput) => {\n if (isCurrent) completeHydration(attempt, failedSessionState(failure))\n }\n )\n return () => {\n isCurrent = false\n request.abort()\n }\n }, [beginHydration, completeHydration, loadSession])\n\n return null\n}\n"],"mappings":"0QAQMgB,EAAqBhB,EAAW,WAAa,CAEjD,OAAO,OAAO,MADQa,EAA2B,EAAA,CAC5B,QAAQ,QAAQ,CACvC,CAAC,CAAC,CAAC,KAAKZ,EAAeC,CAAqB,CAAC,EAEvCe,EACJ,GAEI,CAACd,EAAsBe,EAAS,MAAM,GAAK,CAACd,EAAmBc,EAAQ,IAAI,EACtE,CAAE,KAAM,aAAc,EAE3BA,EAAQ,OAAS,uBAA+B,CAAE,KAAM,WAAY,EACpEA,EAAQ,OAAS,oBAA4B,CAAE,KAAM,SAAU,EAC5D,CAAE,KAAM,aAAc,EAQlBC,GAA0B,CACrC,cAAcH,GACiB,CAAC,IAA2B,CAC3D,GAAM,CAAE,iBAAgB,qBAAsBV,EAAkB,EAyBhE,OAvBA,EAAAQ,EAAA,UAAA,KAAgB,CACd,IAAMM,EAAUC,EAAe,EACzBC,EAAU,IAAI,gBAChBC,EAAY,GAchB,OAbAhB,EAAkBiB,EAAa,CAAE,OAAQF,EAAQ,MAAO,CAAC,CAAC,CAAC,KACxD,GAAW,CACLC,GACLE,EAAkBL,EAAS,CACzB,KAAM,gBACN,UAAWM,EAAO,UAClB,QAASA,EAAO,OAClB,CAAC,CACH,EACiB,GAA2B,CACtCH,GAAWE,EAAkBL,EAASH,EAAmBC,CAAO,CAAC,CACvE,CACF,MACa,CACX,EAAY,GACZI,EAAQ,MAAM,CAChB,CACF,EAAG,CAACD,EAAgBI,EAAmBD,CAAW,CAAC,EAE5C,IACT"}
1
+ {"version":3,"file":"BrowserSessionHydrator-B3yI9F2z.js","names":["Effect.gen","Effect.provide","FetchHttpClient.layer","Predicate.hasProperty","Predicate.isString","__toESM","useBrowserSession","runPromise","isString","hasProperty","provide","gen","layer","makeControlCenterApiClient","import_react","require_react","loadBrowserSession","failedSessionState","failure","BrowserSessionHydrator","attempt","beginHydration","request","isCurrent","loadSession","completeHydration","result"],"sources":["../../../src/client/BrowserSessionHydrator.tsx"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport { type ReactElement, useEffect } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { useBrowserSession, type BrowserSessionState } from \"./BrowserSession.js\"\n\nconst loadBrowserSession = Effect.gen(function* () {\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.current()\n}).pipe(Effect.provide(FetchHttpClient.layer))\n\nconst failedSessionState = <UnparsedInput,>(\n failure: UnparsedInput\n): Exclude<BrowserSessionState, { readonly _tag: \"authenticated\" | \"checking\" }> => {\n if (!Predicate.hasProperty(failure, \"_tag\") || !Predicate.isString(failure._tag)) {\n return { _tag: \"unavailable\" }\n }\n if (failure._tag === \"UnauthorizedApiError\") return { _tag: \"anonymous\" }\n if (failure._tag === \"ForbiddenApiError\") return { _tag: \"blocked\" }\n return { _tag: \"unavailable\" }\n}\n\ninterface BrowserSessionHydratorProps {\n readonly loadSession?: typeof loadBrowserSession\n}\n\n/** Recover this tab's mutation proof once, regardless of its initial route. */\nexport const BrowserSessionHydrator = ({\n loadSession = loadBrowserSession\n}: BrowserSessionHydratorProps = {}): ReactElement | null => {\n const { beginHydration, completeHydration } = useBrowserSession()\n\n useEffect(() => {\n const attempt = beginHydration()\n const request = new AbortController()\n let isCurrent = true\n Effect.runPromise(loadSession, { signal: request.signal }).then(\n (result) => {\n if (!isCurrent) return\n completeHydration(attempt, {\n _tag: \"authenticated\",\n csrfToken: result.csrfToken,\n session: result.session\n })\n },\n <UnparsedInput,>(failure: UnparsedInput) => {\n if (isCurrent) completeHydration(attempt, failedSessionState(failure))\n }\n )\n return () => {\n isCurrent = false\n request.abort()\n }\n }, [beginHydration, completeHydration, loadSession])\n\n return null\n}\n"],"mappings":"0QAQMgB,EAAqBhB,EAAW,WAAa,CAEjD,OAAO,OAAO,MADQa,EAA2B,EAAA,CAC5B,QAAQ,QAAQ,CACvC,CAAC,CAAC,CAAC,KAAKZ,EAAeC,CAAqB,CAAC,EAEvCe,EACJ,GAEI,CAACd,EAAsBe,EAAS,MAAM,GAAK,CAACd,EAAmBc,EAAQ,IAAI,EACtE,CAAE,KAAM,aAAc,EAE3BA,EAAQ,OAAS,uBAA+B,CAAE,KAAM,WAAY,EACpEA,EAAQ,OAAS,oBAA4B,CAAE,KAAM,SAAU,EAC5D,CAAE,KAAM,aAAc,EAQlBC,GAA0B,CACrC,cAAcH,GACiB,CAAC,IAA2B,CAC3D,GAAM,CAAE,iBAAgB,qBAAsBV,EAAkB,EAyBhE,OAvBA,EAAAQ,EAAA,UAAA,KAAgB,CACd,IAAMM,EAAUC,EAAe,EACzBC,EAAU,IAAI,gBAChBC,EAAY,GAchB,OAbAhB,EAAkBiB,EAAa,CAAE,OAAQF,EAAQ,MAAO,CAAC,CAAC,CAAC,KACxD,GAAW,CACLC,GACLE,EAAkBL,EAAS,CACzB,KAAM,gBACN,UAAWM,EAAO,UAClB,QAASA,EAAO,OAClB,CAAC,CACH,EACiB,GAA2B,CACtCH,GAAWE,EAAkBL,EAASH,EAAmBC,CAAO,CAAC,CACvE,CACF,MACa,CACX,EAAY,GACZI,EAAQ,MAAM,CAChB,CACF,EAAG,CAACD,EAAgBI,EAAmBD,CAAW,CAAC,EAE5C,IACT"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{s as n,u as r}from"./hooks-CGvBGjhq.js";import{_ as i,v as a}from"./Dialog-_t9OodCK-CzkLh9VB.js";import{t as o}from"./jsx-runtime-NZYk81nU.js";import{_ as s,b as c,l,p as u,w as d,y as f}from"./index-BHQ_NP1r.js";import{n as p}from"./patterns-D0U0WCQS.js";import{Ei as m,Ga as h,Ka as g,Si as _,mi as v}from"./agent-api-0YXZd1ag.js";import{a as y,t as b}from"./client-C9AVNoed.js";import{i as x,o as S}from"./releaseRoutes-D04aOk03.js";import{t as C}from"./presentPortfolio-C0MbGMFp.js";import{n as w,r as T}from"./workspaceEntityRoutes-FAiial9O.js";import{n as E,t as D}from"./useWorkspaceItems-BROb2PDr.js";import{t as O}from"./workspaceScrollCapture-AJpPgzgz.js";var k=e(t(),1),A=e=>{let t=new URLSearchParams,n=e.trim();return n.length>0&&t.set(`q`,n),t},j=(e,t)=>{let n=A(t),r=n.size===0?``:`?${n.toString()}`;return`${s(e)}${r}#results`},M=g(`UnauthorizedApiError`),N={load:e=>m(v(function*(){return yield*(yield*b()).portfolio.snapshot()}).pipe(_(y)),{signal:e})},P=e=>C(e).releases.map(t=>({codename:t.relay.codename,href:u(e.workspaceId,t.id),id:t.id,serviceName:t.serviceName,status:t.lifecycleLabel,tone:t.lifecycleTone,version:t.version})),F=(e,t,n=N)=>{let[r,i]=(0,k.useState)(0),[a,o]=(0,k.useState)({_tag:`idle`});(0,k.useEffect)(()=>{if(e===null){o({_tag:`idle`});return}let r=new AbortController;return o({_tag:`loading`,sessionKey:e}),n.load(r.signal).then(t=>{r.signal.aborted||o({_tag:`ready`,releases:P(t),sessionKey:e,workspaceId:t.workspaceId})},n=>{r.signal.aborted||(M(n)&&t(e),o({_tag:`failed`,sessionKey:e}))}),()=>r.abort()},[t,r,e,n]);let s=e===null?{_tag:`idle`}:a._tag===`idle`||a.sessionKey!==e?{_tag:`loading`,sessionKey:e}:a;return{retry:(0,k.useCallback)(()=>i(e=>e+1),[]),state:s}},I={trigger:`_trigger_dhy9p_1`,pairTrigger:`_pairTrigger_dhy9p_2`,dialog:`_dialog_dhy9p_13`,searchField:`_searchField_dhy9p_17`,results:`_results_dhy9p_43`,result:`_result_dhy9p_43`,resultCopy:`_resultCopy_dhy9p_69`,releaseMark:`_releaseMark_dhy9p_75`,resultKey:`_resultKey_dhy9p_96`,message:`_message_dhy9p_102`,loading:`_loading_dhy9p_103`,footer:`_footer_dhy9p_120`,visuallyHidden:`_visuallyHidden_dhy9p_149`},L=o(),R=2,z=6,B=new Set,V=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),H=e=>e===null?!1:`isContentEditable`in e&&e.isContentEditable===!0?!0:!(`nodeName`in e)||!h(e.nodeName)?!1:e.nodeName===`INPUT`||e.nodeName===`SELECT`||e.nodeName===`TEXTAREA`,U=(e,t)=>{let n=t.map(e=>e.toLocaleLowerCase(`en-US`));return n.some(t=>t===e)?0:n.some(t=>t.startsWith(e))?1:n.some(t=>t.includes(e))?2:3},W=(e,t,n)=>{let r=n.trim().toLocaleLowerCase(`en-US`);if(r.length===0)return[];let i=e.flatMap(e=>{let t=U(r,[e.codename,e.version,e.serviceName,e.status]);return t===3?[]:[{_tag:`release`,rank:t,release:e}]}),a=t.flatMap(e=>{let t=U(r,[e.key,e.title,e.status]);return t===3?[]:[{_tag:`item`,item:e,rank:t}]});return[...i,...a].sort((e,t)=>{if(e.rank!==t.rank)return e.rank-t.rank;if(e._tag!==t._tag)return e._tag===`release`?-1:1;let n=e._tag===`release`?e.release.codename:e.item.key,r=t._tag===`release`?t.release.codename:t.item.key;return n.localeCompare(r)}).slice(0,z)},G=({releaseTransport:e=N,sessionKey:t,transport:o=D,workspaceId:s})=>{let u=c(),f=n(),m=r(),h=(0,k.useRef)(null),[g,_]=(0,k.useState)(!1),[v,y]=(0,k.useState)(``),[b,C]=(0,k.useState)(0),A=v.trim(),M=(0,k.useDeferredValue)(A),P=M.length>=R,z=F(g?t:null,u.invalidateSession,e),U=z.state,G=(0,k.useMemo)(()=>U._tag===`ready`&&U.workspaceId===s?new Set(U.releases.map(({id:e})=>e)):B,[U,s]),K=U._tag===`ready`&&U.workspaceId===s,q=(0,k.useMemo)(()=>({owner:`all`,query:P?M:``,service:`all`,status:`all`,type:`all`}),[M,P]),J=E(s,G,q,U._tag===`ready`?U.releases.map(({id:e})=>e).join(`:`):`command-search`,g&&P&&K?t:null,u.invalidateSession,o),Y=K&&J.state._tag===`ready`&&!J.state.refreshing?W(U.releases,J.state.items,M):[],X=Y.length>0,Z=e=>{_(e),e||(y(``),C(0))};(0,k.useEffect)(()=>{let e=e=>{e.defaultPrevented||H(e.target)||e.key.toLocaleLowerCase(`en-US`)!==`k`||!e.metaKey&&!e.ctrlKey||(e.preventDefault(),_(!0))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[]),(0,k.useEffect)(()=>C(0),[M]);let Q=e=>{if(Z(!1),e._tag===`release`){m(e.release.href,{state:x(s,e.release.id,S(f))});return}let t=e.item;O(f,t.href),m(t.href,{state:T(f.state,s,t.entityId,w(f))})};return(0,L.jsxs)(i.Root,{onOpenChange:Z,open:g,children:[(0,L.jsx)(i.Trigger,{className:I.trigger,size:`compact`,variant:`quiet`,children:`Search ⌘K`}),(0,L.jsxs)(i.Content,{className:I.dialog,description:`Find releases and current work, or continue with Relay.`,initialFocusRef:h,size:`wide`,title:`Go anywhere.`,children:[(0,L.jsxs)(`label`,{className:I.searchField,children:[(0,L.jsx)(`span`,{className:I.visuallyHidden,children:`Search workspace`}),(0,L.jsx)(`input`,{"aria-activedescendant":X?`command-search-option-${b}`:void 0,"aria-autocomplete":`list`,"aria-busy":M!==A||U._tag===`loading`||J.state._tag===`loading`,"aria-controls":X?`command-search-results`:void 0,"aria-expanded":X,"aria-label":`Search workspace`,autoComplete:`off`,maxLength:200,onChange:e=>y(e.currentTarget.value),onKeyDown:e=>{if(Y.length!==0){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;C(e=>(e+t+Y.length)%Y.length);return}if(e.key===`Enter`){e.preventDefault();let t=Y[b];t!==void 0&&Q(t)}}},placeholder:`Release, ticket, PR, page, pipeline…`,ref:h,role:`combobox`,type:`search`,value:v})]}),A.length<R?(0,L.jsxs)(`div`,{className:I.message,children:[(0,L.jsx)(`strong`,{children:`Type two characters.`}),(0,L.jsx)(`span`,{children:`Search releases, tickets, pull requests, docs, pipelines, deployments, and time.`})]}):M!==A||U._tag===`idle`||U._tag===`loading`||J.state._tag===`idle`||J.state._tag===`loading`?(0,L.jsx)(`div`,{className:I.loading,children:`Searching the current workspace…`}):!K||J.state._tag===`failed`?(0,L.jsxs)(`div`,{className:I.message,children:[(0,L.jsx)(`strong`,{children:`Search is unavailable.`}),(0,L.jsx)(`span`,{children:`The release and item indexes were not changed.`}),(0,L.jsx)(`button`,{onClick:()=>{z.retry(),J.retry()},type:`button`,children:`Try again`})]}):Y.length===0?(0,L.jsxs)(`div`,{className:I.message,children:[(0,L.jsxs)(`strong`,{children:[`No release or current item matches “`,M,`”.`]}),(0,L.jsx)(`span`,{children:`Try a release name, version, key, title, or current status.`})]}):(0,L.jsx)(`div`,{"aria-label":`Workspace search results`,className:I.results,id:`command-search-results`,role:`listbox`,children:Y.map((e,t)=>{let n=e._tag===`release`,r=n?e.release.id:e.item.entityId;return(0,L.jsxs)(`button`,{"aria-selected":t===b,className:I.result,id:`command-search-option-${t}`,onClick:()=>Q(e),onMouseEnter:()=>C(t),role:`option`,type:`button`,children:[n?(0,L.jsx)(`span`,{className:I.releaseMark,children:`R`}):(0,L.jsx)(p,{service:e.item.service,size:`compact`}),(0,L.jsxs)(`span`,{className:I.resultCopy,children:[(0,L.jsx)(`span`,{className:I.resultKey,children:n?`${e.release.version} · Release`:e.item.key}),(0,L.jsx)(`strong`,{children:n?e.release.codename:e.item.title}),(0,L.jsx)(`span`,{children:n?e.release.serviceName:V(e.item.kind)})]}),(0,L.jsx)(a,{label:n?e.release.status:e.item.status,size:`compact`,tone:n?e.release.tone:e.item.tone})]},r)})}),(0,L.jsxs)(`footer`,{className:I.footer,children:[(0,L.jsx)(d,{onClick:()=>Z(!1),to:j(s,A),children:`Open item results`}),(0,L.jsx)(d,{onClick:()=>Z(!1),to:l(f.pathname,f.search,f.hash),children:`Ask Relay from here`}),(0,L.jsx)(`span`,{children:`↑↓ choose · Enter open · Esc close`})]})]})]})},K=e=>{let t=c(),n=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,r=f(t.state);return n!==null&&n.workspaceId!==e.workspaceId?null:r===null?(0,L.jsx)(d,{className:I.pairTrigger,to:`/pair`,children:`Pair to search`}):(0,L.jsx)(G,{...e,sessionKey:r})};export{K as CommandSearch,W as commandSearchResults};
2
- //# sourceMappingURL=CommandSearch-BSVXQfjF.js.map
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{s as n,u as r}from"./hooks-CGvBGjhq.js";import{_ as i,v as a}from"./Dialog-_t9OodCK-CzkLh9VB.js";import{t as o}from"./jsx-runtime-NZYk81nU.js";import{_ as s,b as c,l,p as u,w as d,y as f}from"./index-DlDEYM2e.js";import{y as p}from"./patterns-CJ4c7F5A.js";import{Ei as m,Ga as h,Ka as g,Si as _,mi as v}from"./agent-api-0YXZd1ag.js";import{a as y,t as b}from"./client-C9AVNoed.js";import{i as x,o as S}from"./releaseRoutes-Bpw_kfZI.js";import{t as C}from"./presentPortfolio-C0MbGMFp.js";import{n as w,r as T}from"./workspaceEntityRoutes-Cc_RtLvy.js";import{n as E,t as D}from"./useWorkspaceItems-BROb2PDr.js";import{t as O}from"./workspaceScrollCapture-Dg3Pebh8.js";var k=e(t(),1),A=e=>{let t=new URLSearchParams,n=e.trim();return n.length>0&&t.set(`q`,n),t},j=(e,t)=>{let n=A(t),r=n.size===0?``:`?${n.toString()}`;return`${s(e)}${r}#results`},M=g(`UnauthorizedApiError`),N={load:e=>m(v(function*(){return yield*(yield*b()).portfolio.snapshot()}).pipe(_(y)),{signal:e})},P=e=>C(e).releases.map(t=>({codename:t.relay.codename,href:u(e.workspaceId,t.id),id:t.id,serviceName:t.serviceName,status:t.lifecycleLabel,tone:t.lifecycleTone,version:t.version})),F=(e,t,n=N)=>{let[r,i]=(0,k.useState)(0),[a,o]=(0,k.useState)({_tag:`idle`});(0,k.useEffect)(()=>{if(e===null){o({_tag:`idle`});return}let r=new AbortController;return o({_tag:`loading`,sessionKey:e}),n.load(r.signal).then(t=>{r.signal.aborted||o({_tag:`ready`,releases:P(t),sessionKey:e,workspaceId:t.workspaceId})},n=>{r.signal.aborted||(M(n)&&t(e),o({_tag:`failed`,sessionKey:e}))}),()=>r.abort()},[t,r,e,n]);let s=e===null?{_tag:`idle`}:a._tag===`idle`||a.sessionKey!==e?{_tag:`loading`,sessionKey:e}:a;return{retry:(0,k.useCallback)(()=>i(e=>e+1),[]),state:s}},I={trigger:`_trigger_dhy9p_1`,pairTrigger:`_pairTrigger_dhy9p_2`,dialog:`_dialog_dhy9p_13`,searchField:`_searchField_dhy9p_17`,results:`_results_dhy9p_43`,result:`_result_dhy9p_43`,resultCopy:`_resultCopy_dhy9p_69`,releaseMark:`_releaseMark_dhy9p_75`,resultKey:`_resultKey_dhy9p_96`,message:`_message_dhy9p_102`,loading:`_loading_dhy9p_103`,footer:`_footer_dhy9p_120`,visuallyHidden:`_visuallyHidden_dhy9p_149`},L=o(),R=2,z=6,B=new Set,V=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),H=e=>e===null?!1:`isContentEditable`in e&&e.isContentEditable===!0?!0:!(`nodeName`in e)||!h(e.nodeName)?!1:e.nodeName===`INPUT`||e.nodeName===`SELECT`||e.nodeName===`TEXTAREA`,U=(e,t)=>{let n=t.map(e=>e.toLocaleLowerCase(`en-US`));return n.some(t=>t===e)?0:n.some(t=>t.startsWith(e))?1:n.some(t=>t.includes(e))?2:3},W=(e,t,n)=>{let r=n.trim().toLocaleLowerCase(`en-US`);if(r.length===0)return[];let i=e.flatMap(e=>{let t=U(r,[e.codename,e.version,e.serviceName,e.status]);return t===3?[]:[{_tag:`release`,rank:t,release:e}]}),a=t.flatMap(e=>{let t=U(r,[e.key,e.title,e.status]);return t===3?[]:[{_tag:`item`,item:e,rank:t}]});return[...i,...a].sort((e,t)=>{if(e.rank!==t.rank)return e.rank-t.rank;if(e._tag!==t._tag)return e._tag===`release`?-1:1;let n=e._tag===`release`?e.release.codename:e.item.key,r=t._tag===`release`?t.release.codename:t.item.key;return n.localeCompare(r)}).slice(0,z)},G=({releaseTransport:e=N,sessionKey:t,transport:o=D,workspaceId:s})=>{let u=c(),f=n(),m=r(),h=(0,k.useRef)(null),[g,_]=(0,k.useState)(!1),[v,y]=(0,k.useState)(``),[b,C]=(0,k.useState)(0),A=v.trim(),M=(0,k.useDeferredValue)(A),P=M.length>=R,z=F(g?t:null,u.invalidateSession,e),U=z.state,G=(0,k.useMemo)(()=>U._tag===`ready`&&U.workspaceId===s?new Set(U.releases.map(({id:e})=>e)):B,[U,s]),K=U._tag===`ready`&&U.workspaceId===s,q=(0,k.useMemo)(()=>({owner:`all`,query:P?M:``,service:`all`,status:`all`,type:`all`}),[M,P]),J=E(s,G,q,U._tag===`ready`?U.releases.map(({id:e})=>e).join(`:`):`command-search`,g&&P&&K?t:null,u.invalidateSession,o),Y=K&&J.state._tag===`ready`&&!J.state.refreshing?W(U.releases,J.state.items,M):[],X=Y.length>0,Z=e=>{_(e),e||(y(``),C(0))};(0,k.useEffect)(()=>{let e=e=>{e.defaultPrevented||H(e.target)||e.key.toLocaleLowerCase(`en-US`)!==`k`||!e.metaKey&&!e.ctrlKey||(e.preventDefault(),_(!0))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[]),(0,k.useEffect)(()=>C(0),[M]);let Q=e=>{if(Z(!1),e._tag===`release`){m(e.release.href,{state:x(s,e.release.id,S(f))});return}let t=e.item;O(f,t.href),m(t.href,{state:T(f.state,s,t.entityId,w(f))})};return(0,L.jsxs)(i.Root,{onOpenChange:Z,open:g,children:[(0,L.jsx)(i.Trigger,{className:I.trigger,size:`compact`,variant:`quiet`,children:`Search ⌘K`}),(0,L.jsxs)(i.Content,{className:I.dialog,description:`Find releases and current work, or continue with Relay.`,initialFocusRef:h,size:`wide`,title:`Go anywhere.`,children:[(0,L.jsxs)(`label`,{className:I.searchField,children:[(0,L.jsx)(`span`,{className:I.visuallyHidden,children:`Search workspace`}),(0,L.jsx)(`input`,{"aria-activedescendant":X?`command-search-option-${b}`:void 0,"aria-autocomplete":`list`,"aria-busy":M!==A||U._tag===`loading`||J.state._tag===`loading`,"aria-controls":X?`command-search-results`:void 0,"aria-expanded":X,"aria-label":`Search workspace`,autoComplete:`off`,maxLength:200,onChange:e=>y(e.currentTarget.value),onKeyDown:e=>{if(Y.length!==0){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;C(e=>(e+t+Y.length)%Y.length);return}if(e.key===`Enter`){e.preventDefault();let t=Y[b];t!==void 0&&Q(t)}}},placeholder:`Release, ticket, PR, page, pipeline…`,ref:h,role:`combobox`,type:`search`,value:v})]}),A.length<R?(0,L.jsxs)(`div`,{className:I.message,children:[(0,L.jsx)(`strong`,{children:`Type two characters.`}),(0,L.jsx)(`span`,{children:`Search releases, tickets, pull requests, docs, pipelines, deployments, and time.`})]}):M!==A||U._tag===`idle`||U._tag===`loading`||J.state._tag===`idle`||J.state._tag===`loading`?(0,L.jsx)(`div`,{className:I.loading,children:`Searching the current workspace…`}):!K||J.state._tag===`failed`?(0,L.jsxs)(`div`,{className:I.message,children:[(0,L.jsx)(`strong`,{children:`Search is unavailable.`}),(0,L.jsx)(`span`,{children:`The release and item indexes were not changed.`}),(0,L.jsx)(`button`,{onClick:()=>{z.retry(),J.retry()},type:`button`,children:`Try again`})]}):Y.length===0?(0,L.jsxs)(`div`,{className:I.message,children:[(0,L.jsxs)(`strong`,{children:[`No release or current item matches “`,M,`”.`]}),(0,L.jsx)(`span`,{children:`Try a release name, version, key, title, or current status.`})]}):(0,L.jsx)(`div`,{"aria-label":`Workspace search results`,className:I.results,id:`command-search-results`,role:`listbox`,children:Y.map((e,t)=>{let n=e._tag===`release`,r=n?e.release.id:e.item.entityId;return(0,L.jsxs)(`button`,{"aria-selected":t===b,className:I.result,id:`command-search-option-${t}`,onClick:()=>Q(e),onMouseEnter:()=>C(t),role:`option`,type:`button`,children:[n?(0,L.jsx)(`span`,{className:I.releaseMark,children:`R`}):(0,L.jsx)(p,{service:e.item.service,size:`compact`}),(0,L.jsxs)(`span`,{className:I.resultCopy,children:[(0,L.jsx)(`span`,{className:I.resultKey,children:n?`${e.release.version} · Release`:e.item.key}),(0,L.jsx)(`strong`,{children:n?e.release.codename:e.item.title}),(0,L.jsx)(`span`,{children:n?e.release.serviceName:V(e.item.kind)})]}),(0,L.jsx)(a,{label:n?e.release.status:e.item.status,size:`compact`,tone:n?e.release.tone:e.item.tone})]},r)})}),(0,L.jsxs)(`footer`,{className:I.footer,children:[(0,L.jsx)(d,{onClick:()=>Z(!1),to:j(s,A),children:`Open item results`}),(0,L.jsx)(d,{onClick:()=>Z(!1),to:l(f.pathname,f.search,f.hash),children:`Ask Relay from here`}),(0,L.jsx)(`span`,{children:`↑↓ choose · Enter open · Esc close`})]})]})]})},K=e=>{let t=c(),n=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,r=f(t.state);return n!==null&&n.workspaceId!==e.workspaceId?null:r===null?(0,L.jsx)(d,{className:I.pairTrigger,to:`/pair`,children:`Pair to search`}):(0,L.jsx)(G,{...e,sessionKey:r})};export{K as CommandSearch,W as commandSearchResults};
2
+ //# sourceMappingURL=CommandSearch-BrwiVFBI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandSearch-BSVXQfjF.js","names":["Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.provide","FetchHttpClient.layer","useState","useCallback","Predicate.isString","useRef","useState","useDeferredValue","useMemo","styles","ServiceMark","StateLabel","Dialog","__toESM","useLocation","useNavigate","tt","ve","require_jsx_runtime","workspaceItemsPath","useBrowserSession","releaseFullPath","Link","browserReadableSessionKey","B","runPromise","isString","isTagged","provide","gen","layer","makeControlCenterApiClient","makeReleaseRouteState","releaseOriginFromLocation","presentPortfolio","entityOriginFromLocation","makeWorkspaceEntityRouteState","useWorkspaceItems","browserWorkspaceItemsTransport","rememberWorkspaceScrollPosition","import_react","require_react","searchParameters","parameters","normalized","query","commandSearchItemsHref","search","workspaceId","isUnauthorizedFailure","browserCommandReleasesTransport","presentCommandReleases","snapshot","release","useCommandReleases","requestRevision","setRequestRevision","state","setState","sessionKey","abort","transport","failure","onSessionExpired","currentState","revision","CommandSearch_module_default","import_jsx_runtime","MINIMUM_QUERY_LENGTH","RESULT_LIMIT","EMPTY_RELEASE_SCOPE","kindLabel","kind","part","isEditingTarget","target","matchRank","normalizedValues","values","value","commandSearchResults","normalizedQuery","releaseResults","releases","rank","itemResults","items","item","left","right","leftLabel","rightLabel","CommandSearchSurface","browserSession","location","navigate","inputRef","open","setOpen","setQuery","highlightedIndex","setHighlightedIndex","deferredQuery","queryReady","releaseTransport","releaseState","releaseScope","id","releasesReady","filters","results","showListbox","changeOpen","nextOpen","openFromKeyboard","event","openResult","result","delta","current","selected","isRelease","key","index","contextualAgentPath","CommandSearch","readableSession","props"],"sources":["../../../src/client/command/commandSearchRoutes.ts","../../../src/client/command/useCommandReleases.ts","../../../src/client/command/CommandSearch.module.css","../../../src/client/command/CommandSearch.tsx"],"sourcesContent":["import type { EntityId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceItemsPath } from \"../releases/releasePaths.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nconst searchParameters = (query: string): URLSearchParams => {\n const parameters = new URLSearchParams()\n const normalized = query.trim()\n if (normalized.length > 0) parameters.set(\"q\", normalized)\n return parameters\n}\n\n/** Open the workspace Items route with the exact command-search text. */\nexport const commandSearchItemsHref = (workspaceId: WorkspaceId, query: string): string => {\n const parameters = searchParameters(query)\n const search = parameters.size === 0 ? \"\" : `?${parameters.toString()}`\n return `${workspaceItemsPath(workspaceId)}${search}#results`\n}\n\n/** Open one command-search result without inventing a release membership. */\nexport const commandSearchItemHref = (\n workspaceId: WorkspaceId,\n entityId: EntityId\n): string => workspaceEntityPath(workspaceId, entityId)\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 type { PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { presentPortfolio } from \"../portfolio/presentPortfolio.js\"\nimport { releaseFullPath } from \"../releases/releasePaths.js\"\n\nexport type CommandReleasePresentation = {\n readonly codename: string\n readonly href: string\n readonly id: ReleaseId\n readonly serviceName: string\n readonly status: string\n readonly tone: \"caution\" | \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n readonly version: string\n}\n\nexport type CommandReleasesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\"; readonly sessionKey: string }\n | { readonly _tag: \"failed\"; readonly sessionKey: string }\n | {\n readonly _tag: \"ready\"\n readonly releases: ReadonlyArray<CommandReleasePresentation>\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n }\n\nexport type CommandReleasesTransport = {\n readonly load: (signal: AbortSignal) => Promise<PortfolioSnapshot>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for one authenticated, bounded portfolio snapshot. */\nexport const browserCommandReleasesTransport: CommandReleasesTransport = {\n load: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.portfolio.snapshot()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst presentCommandReleases = (snapshot: PortfolioSnapshot): ReadonlyArray<CommandReleasePresentation> =>\n presentPortfolio(snapshot).releases.map((release) => ({\n codename: release.relay.codename,\n href: releaseFullPath(snapshot.workspaceId, release.id),\n id: release.id,\n serviceName: release.serviceName,\n status: release.lifecycleLabel,\n tone: release.lifecycleTone,\n version: release.version\n }))\n\n/** Load one session-isolated release index while the command surface is open. */\nexport const useCommandReleases = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: CommandReleasesTransport = browserCommandReleasesTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<CommandReleasesState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", sessionKey })\n transport.load(abort.signal).then(\n (snapshot) => {\n if (abort.signal.aborted) return\n setState({\n _tag: \"ready\",\n releases: presentCommandReleases(snapshot),\n sessionKey,\n workspaceId: snapshot.workspaceId\n })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", sessionKey })\n }\n )\n return () => abort.abort()\n }, [onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: CommandReleasesState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n",".trigger,\n.pairTrigger {\n white-space: nowrap;\n}\n\n.pairTrigger {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.dialog {\n gap: var(--rly-space-16);\n}\n\n.searchField {\n display: block;\n}\n\n.searchField input {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: 4.5rem;\n border: 0;\n border-block-end: 1px solid var(--rly-color-border-2);\n outline: 0;\n background: transparent;\n color: var(--rly-color-text-1);\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}\n\n.searchField input::placeholder {\n color: var(--rly-color-text-3);\n}\n\n.searchField input:focus-visible {\n border-block-end-color: var(--rly-color-focus);\n}\n\n.results {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.result {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rly-space-12);\n inline-size: 100%;\n min-block-size: 4.5rem;\n padding: var(--rly-space-12);\n border: 1px solid transparent;\n border-radius: var(--rly-radius-control);\n background: transparent;\n color: var(--rly-color-text-1);\n cursor: pointer;\n text-align: start;\n}\n\n.result[aria-selected=\"true\"] {\n border-color: var(--rly-color-border-2);\n background: var(--rly-color-surface-2);\n}\n\n.resultCopy {\n display: grid;\n min-inline-size: 0;\n gap: var(--rly-space-2);\n}\n\n.releaseMark {\n display: grid;\n inline-size: var(--rly-space-32);\n block-size: var(--rly-space-32);\n place-items: center;\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.resultCopy strong {\n overflow: hidden;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resultCopy > span:last-child,\n.resultKey {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.message,\n.loading {\n display: grid;\n min-block-size: 10rem;\n place-content: center;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n text-align: center;\n}\n\n.message strong {\n color: var(--rly-color-text-1);\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n}\n\n.message a,\n.message button,\n.footer a {\n color: var(--rly-color-text-1);\n font: inherit;\n text-underline-offset: 0.2em;\n}\n\n.message button {\n border: 0;\n background: transparent;\n cursor: pointer;\n text-decoration: underline;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n color: var(--rly-color-text-3);\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.footer span {\n margin-inline-start: auto;\n}\n\n.visuallyHidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .footer span {\n display: none;\n }\n\n .result {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .result > :last-child {\n grid-column: 2;\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Dialog, StateLabel } from \"@knpkv/rly/primitives\"\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport type { WorkspaceItemPresentation } from \"../items/presentWorkspaceItems.js\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"../items/workspaceEntityRoutes.js\"\nimport {\n browserWorkspaceItemsTransport,\n useWorkspaceItems,\n type WorkspaceItemsQuery,\n type WorkspaceItemsTransport\n} from \"../items/useWorkspaceItems.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { rememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport { commandSearchItemsHref } from \"./commandSearchRoutes.js\"\nimport {\n browserCommandReleasesTransport,\n type CommandReleasePresentation,\n type CommandReleasesTransport,\n useCommandReleases\n} from \"./useCommandReleases.js\"\nimport styles from \"./CommandSearch.module.css\"\nimport * as Predicate from \"effect/Predicate\"\n\nconst MINIMUM_QUERY_LENGTH = 2\nconst RESULT_LIMIT = 6\nconst EMPTY_RELEASE_SCOPE: ReadonlySet<ReleaseId> = new Set()\n\ntype CommandSearchResult =\n | { readonly _tag: \"item\"; readonly item: WorkspaceItemPresentation; readonly rank: number }\n | { readonly _tag: \"release\"; readonly rank: number; readonly release: CommandReleasePresentation }\n\nconst kindLabel = (kind: WorkspaceItemPresentation[\"kind\"]): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nconst isEditingTarget = (target: EventTarget | null): boolean => {\n if (target === null) return false\n if (\"isContentEditable\" in target && target.isContentEditable === true) return true\n if (!(\"nodeName\" in target) || !Predicate.isString(target.nodeName)) return false\n return target.nodeName === \"INPUT\" || target.nodeName === \"SELECT\" || target.nodeName === \"TEXTAREA\"\n}\n\nconst matchRank = (query: string, values: ReadonlyArray<string>): number => {\n const normalizedValues = values.map((value) => value.toLocaleLowerCase(\"en-US\"))\n if (normalizedValues.some((value) => value === query)) return 0\n if (normalizedValues.some((value) => value.startsWith(query))) return 1\n return normalizedValues.some((value) => value.includes(query)) ? 2 : 3\n}\n\n/** Combine bounded release and service-entity results with deterministic exact/prefix/contains ranking. */\nexport const commandSearchResults = (\n releases: ReadonlyArray<CommandReleasePresentation>,\n items: ReadonlyArray<WorkspaceItemPresentation>,\n query: string\n): ReadonlyArray<CommandSearchResult> => {\n const normalizedQuery = query.trim().toLocaleLowerCase(\"en-US\")\n if (normalizedQuery.length === 0) return []\n const releaseResults: ReadonlyArray<CommandSearchResult> = releases.flatMap((release) => {\n const rank = matchRank(normalizedQuery, [release.codename, release.version, release.serviceName, release.status])\n return rank === 3 ? [] : [{ _tag: \"release\", rank, release }]\n })\n const itemResults: ReadonlyArray<CommandSearchResult> = items.flatMap((item) => {\n const rank = matchRank(normalizedQuery, [item.key, item.title, item.status])\n return rank === 3 ? [] : [{ _tag: \"item\", item, rank }]\n })\n return [...releaseResults, ...itemResults]\n .sort((left, right) => {\n if (left.rank !== right.rank) return left.rank - right.rank\n if (left._tag !== right._tag) return left._tag === \"release\" ? -1 : 1\n const leftLabel = left._tag === \"release\" ? left.release.codename : left.item.key\n const rightLabel = right._tag === \"release\" ? right.release.codename : right.item.key\n return leftLabel.localeCompare(rightLabel)\n })\n .slice(0, RESULT_LIMIT)\n}\n\nexport type CommandSearchProps = {\n readonly releaseTransport?: CommandReleasesTransport\n readonly transport?: WorkspaceItemsTransport\n readonly workspaceId: WorkspaceId\n}\n\ntype CommandSearchSurfaceProps = CommandSearchProps & { readonly sessionKey: string }\n\nconst CommandSearchSurface = ({\n releaseTransport = browserCommandReleasesTransport,\n sessionKey,\n transport = browserWorkspaceItemsTransport,\n workspaceId\n}: CommandSearchSurfaceProps): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const inputRef = useRef<HTMLInputElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const normalizedQuery = query.trim()\n const deferredQuery = useDeferredValue(normalizedQuery)\n const queryReady = deferredQuery.length >= MINIMUM_QUERY_LENGTH\n const releases = useCommandReleases(open ? sessionKey : null, browserSession.invalidateSession, releaseTransport)\n const releaseState = releases.state\n const releaseScope = useMemo(\n () =>\n releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n ? new Set(releaseState.releases.map(({ id }) => id))\n : EMPTY_RELEASE_SCOPE,\n [releaseState, workspaceId]\n )\n const releasesReady = releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n const filters = useMemo<WorkspaceItemsQuery>(\n () => ({ owner: \"all\", query: queryReady ? deferredQuery : \"\", service: \"all\", status: \"all\", type: \"all\" }),\n [deferredQuery, queryReady]\n )\n const items = useWorkspaceItems(\n workspaceId,\n releaseScope,\n filters,\n releaseState._tag === \"ready\" ? releaseState.releases.map(({ id }) => id).join(\":\") : \"command-search\",\n open && queryReady && releasesReady ? sessionKey : null,\n browserSession.invalidateSession,\n transport\n )\n const results =\n releasesReady && items.state._tag === \"ready\" && !items.state.refreshing\n ? commandSearchResults(releaseState.releases, items.state.items, deferredQuery)\n : []\n const showListbox = results.length > 0\n\n const changeOpen = (nextOpen: boolean): void => {\n setOpen(nextOpen)\n if (!nextOpen) {\n setQuery(\"\")\n setHighlightedIndex(0)\n }\n }\n\n useEffect(() => {\n const openFromKeyboard = (event: KeyboardEvent): void => {\n if (\n event.defaultPrevented ||\n isEditingTarget(event.target) ||\n event.key.toLocaleLowerCase(\"en-US\") !== \"k\" ||\n (!event.metaKey && !event.ctrlKey)\n )\n return\n event.preventDefault()\n setOpen(true)\n }\n document.addEventListener(\"keydown\", openFromKeyboard)\n return () => document.removeEventListener(\"keydown\", openFromKeyboard)\n }, [])\n\n useEffect(() => setHighlightedIndex(0), [deferredQuery])\n\n const openResult = (result: CommandSearchResult): void => {\n changeOpen(false)\n if (result._tag === \"release\") {\n navigate(result.release.href, {\n state: makeReleaseRouteState(workspaceId, result.release.id, releaseOriginFromLocation(location))\n })\n return\n }\n const item = result.item\n rememberWorkspaceScrollPosition(location, item.href)\n navigate(item.href, {\n state: makeWorkspaceEntityRouteState(\n location.state,\n workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )\n })\n }\n\n const onInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>): void => {\n if (results.length === 0) return\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n const delta = event.key === \"ArrowDown\" ? 1 : -1\n setHighlightedIndex((current) => (current + delta + results.length) % results.length)\n return\n }\n if (event.key === \"Enter\") {\n event.preventDefault()\n const selected = results[highlightedIndex]\n if (selected !== undefined) openResult(selected)\n }\n }\n\n const content = (): ReactElement => {\n if (normalizedQuery.length < MINIMUM_QUERY_LENGTH) {\n return (\n <div className={styles.message}>\n <strong>Type two characters.</strong>\n <span>Search releases, tickets, pull requests, docs, pipelines, deployments, and time.</span>\n </div>\n )\n }\n const loading =\n deferredQuery !== normalizedQuery ||\n releaseState._tag === \"idle\" ||\n releaseState._tag === \"loading\" ||\n items.state._tag === \"idle\" ||\n items.state._tag === \"loading\"\n if (loading) return <div className={styles.loading}>Searching the current workspace…</div>\n if (!releasesReady || items.state._tag === \"failed\") {\n return (\n <div className={styles.message}>\n <strong>Search is unavailable.</strong>\n <span>The release and item indexes were not changed.</span>\n <button\n onClick={() => {\n releases.retry()\n items.retry()\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n )\n }\n if (results.length === 0) {\n return (\n <div className={styles.message}>\n <strong>No release or current item matches “{deferredQuery}”.</strong>\n <span>Try a release name, version, key, title, or current status.</span>\n </div>\n )\n }\n return (\n <div aria-label=\"Workspace search results\" className={styles.results} id=\"command-search-results\" role=\"listbox\">\n {results.map((result, index) => {\n const isRelease = result._tag === \"release\"\n const key = isRelease ? result.release.id : result.item.entityId\n return (\n <button\n aria-selected={index === highlightedIndex}\n className={styles.result}\n id={`command-search-option-${index}`}\n key={key}\n onClick={() => openResult(result)}\n onMouseEnter={() => setHighlightedIndex(index)}\n role=\"option\"\n type=\"button\"\n >\n {isRelease ? (\n <span className={styles.releaseMark}>R</span>\n ) : (\n <ServiceMark service={result.item.service} size=\"compact\" />\n )}\n <span className={styles.resultCopy}>\n <span className={styles.resultKey}>\n {isRelease ? `${result.release.version} · Release` : result.item.key}\n </span>\n <strong>{isRelease ? result.release.codename : result.item.title}</strong>\n <span>{isRelease ? result.release.serviceName : kindLabel(result.item.kind)}</span>\n </span>\n <StateLabel\n label={isRelease ? result.release.status : result.item.status}\n size=\"compact\"\n tone={isRelease ? result.release.tone : result.item.tone}\n />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <Dialog.Root onOpenChange={changeOpen} open={open}>\n <Dialog.Trigger className={styles.trigger} size=\"compact\" variant=\"quiet\">\n Search ⌘K\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.dialog}\n description=\"Find releases and current work, or continue with Relay.\"\n initialFocusRef={inputRef}\n size=\"wide\"\n title=\"Go anywhere.\"\n >\n <label className={styles.searchField}>\n <span className={styles.visuallyHidden}>Search workspace</span>\n <input\n aria-activedescendant={showListbox ? `command-search-option-${highlightedIndex}` : undefined}\n aria-autocomplete=\"list\"\n aria-busy={\n deferredQuery !== normalizedQuery || releaseState._tag === \"loading\" || items.state._tag === \"loading\"\n }\n aria-controls={showListbox ? \"command-search-results\" : undefined}\n aria-expanded={showListbox}\n aria-label=\"Search workspace\"\n autoComplete=\"off\"\n maxLength={200}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n placeholder=\"Release, ticket, PR, page, pipeline…\"\n ref={inputRef}\n role=\"combobox\"\n type=\"search\"\n value={query}\n />\n </label>\n {content()}\n <footer className={styles.footer}>\n <Link onClick={() => changeOpen(false)} to={commandSearchItemsHref(workspaceId, normalizedQuery)}>\n Open item results\n </Link>\n <Link\n onClick={() => changeOpen(false)}\n to={contextualAgentPath(location.pathname, location.search, location.hash)}\n >\n Ask Relay from here\n </Link>\n <span>↑↓ choose · Enter open · Esc close</span>\n </footer>\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n\n/** Suppress search when a syntactically valid route does not belong to the readable browser session. */\nexport const CommandSearch = (props: CommandSearchProps): ReactElement | null => {\n const browserSession = useBrowserSession()\n const readableSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const sessionKey = browserReadableSessionKey(browserSession.state)\n if (readableSession !== null && readableSession.workspaceId !== props.workspaceId) return null\n if (sessionKey === null) {\n return (\n <Link className={styles.pairTrigger} to=\"/pair\">\n Pair to search\n </Link>\n )\n }\n return <CommandSearchSurface {...props} sessionKey={sessionKey} />\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommandSearch-BrwiVFBI.js","names":["Predicate.isTagged","Effect.runPromise","Effect.gen","Effect.provide","FetchHttpClient.layer","useState","useCallback","Predicate.isString","useRef","useState","useDeferredValue","useMemo","styles","ServiceMark","StateLabel","Dialog","__toESM","useLocation","useNavigate","tt","ve","require_jsx_runtime","workspaceItemsPath","useBrowserSession","releaseFullPath","Link","browserReadableSessionKey","z","runPromise","isString","isTagged","provide","gen","layer","makeControlCenterApiClient","makeReleaseRouteState","releaseOriginFromLocation","presentPortfolio","entityOriginFromLocation","makeWorkspaceEntityRouteState","useWorkspaceItems","browserWorkspaceItemsTransport","rememberWorkspaceScrollPosition","import_react","require_react","searchParameters","parameters","normalized","query","commandSearchItemsHref","search","workspaceId","isUnauthorizedFailure","browserCommandReleasesTransport","presentCommandReleases","snapshot","release","useCommandReleases","requestRevision","setRequestRevision","state","setState","sessionKey","abort","transport","failure","onSessionExpired","currentState","revision","CommandSearch_module_default","import_jsx_runtime","MINIMUM_QUERY_LENGTH","RESULT_LIMIT","EMPTY_RELEASE_SCOPE","kindLabel","kind","part","isEditingTarget","target","matchRank","normalizedValues","values","value","commandSearchResults","normalizedQuery","releaseResults","releases","rank","itemResults","items","item","left","right","leftLabel","rightLabel","CommandSearchSurface","browserSession","location","navigate","inputRef","open","setOpen","setQuery","highlightedIndex","setHighlightedIndex","deferredQuery","queryReady","releaseTransport","releaseState","releaseScope","id","releasesReady","filters","results","showListbox","changeOpen","nextOpen","openFromKeyboard","event","openResult","result","delta","current","selected","isRelease","key","index","contextualAgentPath","CommandSearch","readableSession","props"],"sources":["../../../src/client/command/commandSearchRoutes.ts","../../../src/client/command/useCommandReleases.ts","../../../src/client/command/CommandSearch.module.css","../../../src/client/command/CommandSearch.tsx"],"sourcesContent":["import type { EntityId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceItemsPath } from \"../releases/releasePaths.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nconst searchParameters = (query: string): URLSearchParams => {\n const parameters = new URLSearchParams()\n const normalized = query.trim()\n if (normalized.length > 0) parameters.set(\"q\", normalized)\n return parameters\n}\n\n/** Open the workspace Items route with the exact command-search text. */\nexport const commandSearchItemsHref = (workspaceId: WorkspaceId, query: string): string => {\n const parameters = searchParameters(query)\n const search = parameters.size === 0 ? \"\" : `?${parameters.toString()}`\n return `${workspaceItemsPath(workspaceId)}${search}#results`\n}\n\n/** Open one command-search result without inventing a release membership. */\nexport const commandSearchItemHref = (\n workspaceId: WorkspaceId,\n entityId: EntityId\n): string => workspaceEntityPath(workspaceId, entityId)\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 type { PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { presentPortfolio } from \"../portfolio/presentPortfolio.js\"\nimport { releaseFullPath } from \"../releases/releasePaths.js\"\n\nexport type CommandReleasePresentation = {\n readonly codename: string\n readonly href: string\n readonly id: ReleaseId\n readonly serviceName: string\n readonly status: string\n readonly tone: \"caution\" | \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n readonly version: string\n}\n\nexport type CommandReleasesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\"; readonly sessionKey: string }\n | { readonly _tag: \"failed\"; readonly sessionKey: string }\n | {\n readonly _tag: \"ready\"\n readonly releases: ReadonlyArray<CommandReleasePresentation>\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n }\n\nexport type CommandReleasesTransport = {\n readonly load: (signal: AbortSignal) => Promise<PortfolioSnapshot>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for one authenticated, bounded portfolio snapshot. */\nexport const browserCommandReleasesTransport: CommandReleasesTransport = {\n load: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.portfolio.snapshot()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst presentCommandReleases = (snapshot: PortfolioSnapshot): ReadonlyArray<CommandReleasePresentation> =>\n presentPortfolio(snapshot).releases.map((release) => ({\n codename: release.relay.codename,\n href: releaseFullPath(snapshot.workspaceId, release.id),\n id: release.id,\n serviceName: release.serviceName,\n status: release.lifecycleLabel,\n tone: release.lifecycleTone,\n version: release.version\n }))\n\n/** Load one session-isolated release index while the command surface is open. */\nexport const useCommandReleases = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: CommandReleasesTransport = browserCommandReleasesTransport\n) => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<CommandReleasesState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", sessionKey })\n transport.load(abort.signal).then(\n (snapshot) => {\n if (abort.signal.aborted) return\n setState({\n _tag: \"ready\",\n releases: presentCommandReleases(snapshot),\n sessionKey,\n workspaceId: snapshot.workspaceId\n })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", sessionKey })\n }\n )\n return () => abort.abort()\n }, [onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: CommandReleasesState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n",".trigger,\n.pairTrigger {\n white-space: nowrap;\n}\n\n.pairTrigger {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.dialog {\n gap: var(--rly-space-16);\n}\n\n.searchField {\n display: block;\n}\n\n.searchField input {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: 4.5rem;\n border: 0;\n border-block-end: 1px solid var(--rly-color-border-2);\n outline: 0;\n background: transparent;\n color: var(--rly-color-text-1);\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}\n\n.searchField input::placeholder {\n color: var(--rly-color-text-3);\n}\n\n.searchField input:focus-visible {\n border-block-end-color: var(--rly-color-focus);\n}\n\n.results {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.result {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rly-space-12);\n inline-size: 100%;\n min-block-size: 4.5rem;\n padding: var(--rly-space-12);\n border: 1px solid transparent;\n border-radius: var(--rly-radius-control);\n background: transparent;\n color: var(--rly-color-text-1);\n cursor: pointer;\n text-align: start;\n}\n\n.result[aria-selected=\"true\"] {\n border-color: var(--rly-color-border-2);\n background: var(--rly-color-surface-2);\n}\n\n.resultCopy {\n display: grid;\n min-inline-size: 0;\n gap: var(--rly-space-2);\n}\n\n.releaseMark {\n display: grid;\n inline-size: var(--rly-space-32);\n block-size: var(--rly-space-32);\n place-items: center;\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.resultCopy strong {\n overflow: hidden;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resultCopy > span:last-child,\n.resultKey {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.message,\n.loading {\n display: grid;\n min-block-size: 10rem;\n place-content: center;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n text-align: center;\n}\n\n.message strong {\n color: var(--rly-color-text-1);\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n}\n\n.message a,\n.message button,\n.footer a {\n color: var(--rly-color-text-1);\n font: inherit;\n text-underline-offset: 0.2em;\n}\n\n.message button {\n border: 0;\n background: transparent;\n cursor: pointer;\n text-decoration: underline;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n color: var(--rly-color-text-3);\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.footer span {\n margin-inline-start: auto;\n}\n\n.visuallyHidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .footer span {\n display: none;\n }\n\n .result {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .result > :last-child {\n grid-column: 2;\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Dialog, StateLabel } from \"@knpkv/rly/primitives\"\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport type { WorkspaceItemPresentation } from \"../items/presentWorkspaceItems.js\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"../items/workspaceEntityRoutes.js\"\nimport {\n browserWorkspaceItemsTransport,\n useWorkspaceItems,\n type WorkspaceItemsQuery,\n type WorkspaceItemsTransport\n} from \"../items/useWorkspaceItems.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { rememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport { commandSearchItemsHref } from \"./commandSearchRoutes.js\"\nimport {\n browserCommandReleasesTransport,\n type CommandReleasePresentation,\n type CommandReleasesTransport,\n useCommandReleases\n} from \"./useCommandReleases.js\"\nimport styles from \"./CommandSearch.module.css\"\nimport * as Predicate from \"effect/Predicate\"\n\nconst MINIMUM_QUERY_LENGTH = 2\nconst RESULT_LIMIT = 6\nconst EMPTY_RELEASE_SCOPE: ReadonlySet<ReleaseId> = new Set()\n\ntype CommandSearchResult =\n | { readonly _tag: \"item\"; readonly item: WorkspaceItemPresentation; readonly rank: number }\n | { readonly _tag: \"release\"; readonly rank: number; readonly release: CommandReleasePresentation }\n\nconst kindLabel = (kind: WorkspaceItemPresentation[\"kind\"]): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nconst isEditingTarget = (target: EventTarget | null): boolean => {\n if (target === null) return false\n if (\"isContentEditable\" in target && target.isContentEditable === true) return true\n if (!(\"nodeName\" in target) || !Predicate.isString(target.nodeName)) return false\n return target.nodeName === \"INPUT\" || target.nodeName === \"SELECT\" || target.nodeName === \"TEXTAREA\"\n}\n\nconst matchRank = (query: string, values: ReadonlyArray<string>): number => {\n const normalizedValues = values.map((value) => value.toLocaleLowerCase(\"en-US\"))\n if (normalizedValues.some((value) => value === query)) return 0\n if (normalizedValues.some((value) => value.startsWith(query))) return 1\n return normalizedValues.some((value) => value.includes(query)) ? 2 : 3\n}\n\n/** Combine bounded release and service-entity results with deterministic exact/prefix/contains ranking. */\nexport const commandSearchResults = (\n releases: ReadonlyArray<CommandReleasePresentation>,\n items: ReadonlyArray<WorkspaceItemPresentation>,\n query: string\n): ReadonlyArray<CommandSearchResult> => {\n const normalizedQuery = query.trim().toLocaleLowerCase(\"en-US\")\n if (normalizedQuery.length === 0) return []\n const releaseResults: ReadonlyArray<CommandSearchResult> = releases.flatMap((release) => {\n const rank = matchRank(normalizedQuery, [release.codename, release.version, release.serviceName, release.status])\n return rank === 3 ? [] : [{ _tag: \"release\", rank, release }]\n })\n const itemResults: ReadonlyArray<CommandSearchResult> = items.flatMap((item) => {\n const rank = matchRank(normalizedQuery, [item.key, item.title, item.status])\n return rank === 3 ? [] : [{ _tag: \"item\", item, rank }]\n })\n return [...releaseResults, ...itemResults]\n .sort((left, right) => {\n if (left.rank !== right.rank) return left.rank - right.rank\n if (left._tag !== right._tag) return left._tag === \"release\" ? -1 : 1\n const leftLabel = left._tag === \"release\" ? left.release.codename : left.item.key\n const rightLabel = right._tag === \"release\" ? right.release.codename : right.item.key\n return leftLabel.localeCompare(rightLabel)\n })\n .slice(0, RESULT_LIMIT)\n}\n\nexport type CommandSearchProps = {\n readonly releaseTransport?: CommandReleasesTransport\n readonly transport?: WorkspaceItemsTransport\n readonly workspaceId: WorkspaceId\n}\n\ntype CommandSearchSurfaceProps = CommandSearchProps & { readonly sessionKey: string }\n\nconst CommandSearchSurface = ({\n releaseTransport = browserCommandReleasesTransport,\n sessionKey,\n transport = browserWorkspaceItemsTransport,\n workspaceId\n}: CommandSearchSurfaceProps): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const inputRef = useRef<HTMLInputElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const normalizedQuery = query.trim()\n const deferredQuery = useDeferredValue(normalizedQuery)\n const queryReady = deferredQuery.length >= MINIMUM_QUERY_LENGTH\n const releases = useCommandReleases(open ? sessionKey : null, browserSession.invalidateSession, releaseTransport)\n const releaseState = releases.state\n const releaseScope = useMemo(\n () =>\n releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n ? new Set(releaseState.releases.map(({ id }) => id))\n : EMPTY_RELEASE_SCOPE,\n [releaseState, workspaceId]\n )\n const releasesReady = releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n const filters = useMemo<WorkspaceItemsQuery>(\n () => ({ owner: \"all\", query: queryReady ? deferredQuery : \"\", service: \"all\", status: \"all\", type: \"all\" }),\n [deferredQuery, queryReady]\n )\n const items = useWorkspaceItems(\n workspaceId,\n releaseScope,\n filters,\n releaseState._tag === \"ready\" ? releaseState.releases.map(({ id }) => id).join(\":\") : \"command-search\",\n open && queryReady && releasesReady ? sessionKey : null,\n browserSession.invalidateSession,\n transport\n )\n const results =\n releasesReady && items.state._tag === \"ready\" && !items.state.refreshing\n ? commandSearchResults(releaseState.releases, items.state.items, deferredQuery)\n : []\n const showListbox = results.length > 0\n\n const changeOpen = (nextOpen: boolean): void => {\n setOpen(nextOpen)\n if (!nextOpen) {\n setQuery(\"\")\n setHighlightedIndex(0)\n }\n }\n\n useEffect(() => {\n const openFromKeyboard = (event: KeyboardEvent): void => {\n if (\n event.defaultPrevented ||\n isEditingTarget(event.target) ||\n event.key.toLocaleLowerCase(\"en-US\") !== \"k\" ||\n (!event.metaKey && !event.ctrlKey)\n )\n return\n event.preventDefault()\n setOpen(true)\n }\n document.addEventListener(\"keydown\", openFromKeyboard)\n return () => document.removeEventListener(\"keydown\", openFromKeyboard)\n }, [])\n\n useEffect(() => setHighlightedIndex(0), [deferredQuery])\n\n const openResult = (result: CommandSearchResult): void => {\n changeOpen(false)\n if (result._tag === \"release\") {\n navigate(result.release.href, {\n state: makeReleaseRouteState(workspaceId, result.release.id, releaseOriginFromLocation(location))\n })\n return\n }\n const item = result.item\n rememberWorkspaceScrollPosition(location, item.href)\n navigate(item.href, {\n state: makeWorkspaceEntityRouteState(\n location.state,\n workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )\n })\n }\n\n const onInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>): void => {\n if (results.length === 0) return\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n const delta = event.key === \"ArrowDown\" ? 1 : -1\n setHighlightedIndex((current) => (current + delta + results.length) % results.length)\n return\n }\n if (event.key === \"Enter\") {\n event.preventDefault()\n const selected = results[highlightedIndex]\n if (selected !== undefined) openResult(selected)\n }\n }\n\n const content = (): ReactElement => {\n if (normalizedQuery.length < MINIMUM_QUERY_LENGTH) {\n return (\n <div className={styles.message}>\n <strong>Type two characters.</strong>\n <span>Search releases, tickets, pull requests, docs, pipelines, deployments, and time.</span>\n </div>\n )\n }\n const loading =\n deferredQuery !== normalizedQuery ||\n releaseState._tag === \"idle\" ||\n releaseState._tag === \"loading\" ||\n items.state._tag === \"idle\" ||\n items.state._tag === \"loading\"\n if (loading) return <div className={styles.loading}>Searching the current workspace…</div>\n if (!releasesReady || items.state._tag === \"failed\") {\n return (\n <div className={styles.message}>\n <strong>Search is unavailable.</strong>\n <span>The release and item indexes were not changed.</span>\n <button\n onClick={() => {\n releases.retry()\n items.retry()\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n )\n }\n if (results.length === 0) {\n return (\n <div className={styles.message}>\n <strong>No release or current item matches “{deferredQuery}”.</strong>\n <span>Try a release name, version, key, title, or current status.</span>\n </div>\n )\n }\n return (\n <div aria-label=\"Workspace search results\" className={styles.results} id=\"command-search-results\" role=\"listbox\">\n {results.map((result, index) => {\n const isRelease = result._tag === \"release\"\n const key = isRelease ? result.release.id : result.item.entityId\n return (\n <button\n aria-selected={index === highlightedIndex}\n className={styles.result}\n id={`command-search-option-${index}`}\n key={key}\n onClick={() => openResult(result)}\n onMouseEnter={() => setHighlightedIndex(index)}\n role=\"option\"\n type=\"button\"\n >\n {isRelease ? (\n <span className={styles.releaseMark}>R</span>\n ) : (\n <ServiceMark service={result.item.service} size=\"compact\" />\n )}\n <span className={styles.resultCopy}>\n <span className={styles.resultKey}>\n {isRelease ? `${result.release.version} · Release` : result.item.key}\n </span>\n <strong>{isRelease ? result.release.codename : result.item.title}</strong>\n <span>{isRelease ? result.release.serviceName : kindLabel(result.item.kind)}</span>\n </span>\n <StateLabel\n label={isRelease ? result.release.status : result.item.status}\n size=\"compact\"\n tone={isRelease ? result.release.tone : result.item.tone}\n />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <Dialog.Root onOpenChange={changeOpen} open={open}>\n <Dialog.Trigger className={styles.trigger} size=\"compact\" variant=\"quiet\">\n Search ⌘K\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.dialog}\n description=\"Find releases and current work, or continue with Relay.\"\n initialFocusRef={inputRef}\n size=\"wide\"\n title=\"Go anywhere.\"\n >\n <label className={styles.searchField}>\n <span className={styles.visuallyHidden}>Search workspace</span>\n <input\n aria-activedescendant={showListbox ? `command-search-option-${highlightedIndex}` : undefined}\n aria-autocomplete=\"list\"\n aria-busy={\n deferredQuery !== normalizedQuery || releaseState._tag === \"loading\" || items.state._tag === \"loading\"\n }\n aria-controls={showListbox ? \"command-search-results\" : undefined}\n aria-expanded={showListbox}\n aria-label=\"Search workspace\"\n autoComplete=\"off\"\n maxLength={200}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n placeholder=\"Release, ticket, PR, page, pipeline…\"\n ref={inputRef}\n role=\"combobox\"\n type=\"search\"\n value={query}\n />\n </label>\n {content()}\n <footer className={styles.footer}>\n <Link onClick={() => changeOpen(false)} to={commandSearchItemsHref(workspaceId, normalizedQuery)}>\n Open item results\n </Link>\n <Link\n onClick={() => changeOpen(false)}\n to={contextualAgentPath(location.pathname, location.search, location.hash)}\n >\n Ask Relay from here\n </Link>\n <span>↑↓ choose · Enter open · Esc close</span>\n </footer>\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n\n/** Suppress search when a syntactically valid route does not belong to the readable browser session. */\nexport const CommandSearch = (props: CommandSearchProps): ReactElement | null => {\n const browserSession = useBrowserSession()\n const readableSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const sessionKey = browserReadableSessionKey(browserSession.state)\n if (readableSession !== null && readableSession.workspaceId !== props.workspaceId) return null\n if (sessionKey === null) {\n return (\n <Link className={styles.pairTrigger} to=\"/pair\">\n Pair to search\n </Link>\n )\n }\n return <CommandSearchSurface {...props} sessionKey={sessionKey} />\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Domain-DH_T_LJ8.js","names":["Schema.brand","Schema.Literals","Schema.Class","Schema.optional","Schema.String","Schema.Number","Schema.Array","Schema.withDecodingDefaultTypeKey","Effect.succeed","Schema.Boolean","Schema.Date","Schema.isPattern","Schema.Struct","Schema.isTrimmed","Schema.isNonEmpty","Schema.isMaxLength","Schema.decodeTo","SchemaGetter.transformEffect","Effect.fail","SchemaIssue.InvalidValue","SchemaGetter.transform","Schema.suspend","Data.taggedEnum","Schema.optionalKey","succeed","Number","transformEffect","Class","decodeTo","brand","String","Struct","InvalidValue","Literals","ArraySchema","fail","isNonEmpty","suspend","optionalKey","transform","isPattern","optional","taggedEnum","isMaxLength","isTrimmed","Date","Boolean","withDecodingDefaultTypeKey","PullRequestId","RepositoryName","AwsProfileName","AwsRegion","CommentId","SandboxId","PullRequestStatus","NotificationType","SandboxStatus","Account","ApprovalRule","consoleDomainForRegion","region","codecommitConsoleUrl","repo","prId","CodeCommitLocatorRegion","CodeCommitLocatorRepositoryName","CodeCommitLocatorPullRequestId","CodeCommitPullRequestLocator","codeCommitConsoleHost","codeCommitPullRequestPath","parseCodeCommitPullRequestUrl","input","url","host","path","domain","repositoryName","pullRequestId","view","queryRegions","CodeCommitPullRequestUrl","locator","options","RelativeFileVersion","PRCommentJson","CommentThreadJson","PersistentNotificationType"],"sources":["../../../../codecommit-core/src/Domain.ts"],"sourcesContent":["/**\n * Domain models for CodeCommit operations.\n *\n * Provides branded types for compile-time ID safety, `Schema.Class` models\n * with computed properties, and `Schema.Literal` enumerations. Central types\n * include {@link PullRequest} (with approval rules, approver ARNs, and\n * review detection), {@link ApprovalRule} (per-PR rule with pool members\n * and satisfaction state), and {@link PersistentNotification} (including\n * approval_requested and review_reminder types).\n *\n * **Mental model**\n *\n * - ApprovalRule: per-PR rule with pool members (normalized names) + raw ARNs\n * - needsMyReview: standalone fn (not method) so it works with wire objects too\n * - PersistentNotificationType: includes approval_requested, review_reminder\n *\n * **Gotchas**\n *\n * - ApprovalRule uses `Schema.Class`, but instances round-trip as plain objects\n * through JSON without class instance checks\n *\n * **Common tasks**\n *\n * - Define approval rule: {@link ApprovalRule}\n * - Check review needed: {@link needsMyReview}\n * - PR console URL: {@link codecommitConsoleUrl}\n * - Notification types: {@link PersistentNotificationType}\n *\n * **Quickstart**\n *\n * ```ts\n * import { needsMyReview, PullRequest } from \"./Domain.js\"\n *\n * declare const pr: PullRequest\n * if (needsMyReview(pr, \"alice\")) {\n * console.log(`Review needed: ${pr.consoleUrl}`)\n * }\n * ```\n *\n * @category Domain\n * @module\n */\nimport { Data, Effect, Schema, SchemaGetter, SchemaIssue } from \"effect\"\n\n// ---------------------------------------------------------------------------\n// Branded Types\n// ---------------------------------------------------------------------------\n\n/**\n * Branded pull request identifier.\n *\n * @category Domain\n */\nexport const PullRequestId = Schema.String.pipe(Schema.brand(\"PullRequestId\"))\nexport type PullRequestId = typeof PullRequestId.Type\n\n/**\n * Branded repository name.\n *\n * @category Domain\n */\nexport const RepositoryName = Schema.String.pipe(Schema.brand(\"RepositoryName\"))\nexport type RepositoryName = typeof RepositoryName.Type\n\n/**\n * Branded AWS profile name.\n *\n * @category Domain\n */\nexport const AwsProfileName = Schema.String.pipe(Schema.brand(\"AwsProfileName\"))\nexport type AwsProfileName = typeof AwsProfileName.Type\n\n/**\n * Branded AWS region name.\n *\n * @category Domain\n */\nexport const AwsRegion = Schema.String.pipe(Schema.brand(\"AwsRegion\"))\nexport type AwsRegion = typeof AwsRegion.Type\n\n/**\n * Branded comment identifier.\n *\n * @category Domain\n */\nexport const CommentId = Schema.String.pipe(Schema.brand(\"CommentId\"))\nexport type CommentId = typeof CommentId.Type\n\n/**\n * Branded sandbox identifier.\n *\n * @category Domain\n */\nexport const SandboxId = Schema.String.pipe(Schema.brand(\"SandboxId\"))\nexport type SandboxId = typeof SandboxId.Type\n\n// ---------------------------------------------------------------------------\n// Enumerations\n// ---------------------------------------------------------------------------\n\n/**\n * Pull request status.\n *\n * @category Domain\n */\nexport const PullRequestStatus = Schema.Literals([\"OPEN\", \"CLOSED\", \"MERGED\"])\nexport type PullRequestStatus = typeof PullRequestStatus.Type\n\n/** Normalizes provider/cache account identifiers; blank values are unresolved, not identities. */\nexport const normalizeAccountId = (value: string | null | undefined): string | undefined => {\n const normalized = value?.trim()\n return normalized === undefined || normalized.length === 0 ? undefined : normalized\n}\n\n/**\n * Notification severity type.\n *\n * @category Domain\n */\nexport const NotificationType = Schema.Literals([\"error\", \"info\", \"warning\", \"success\"])\nexport type NotificationType = typeof NotificationType.Type\n\n/**\n * Application loading status.\n *\n * @category Domain\n */\nexport const AppStatus = Schema.Literals([\"idle\", \"loading\", \"error\"])\nexport type AppStatus = typeof AppStatus.Type\n\n/**\n * Sandbox lifecycle status.\n *\n * @category Domain\n */\nexport const SandboxStatus = Schema.Literals([\n \"creating\",\n \"cloning\",\n \"starting\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"error\"\n])\nexport type SandboxStatus = typeof SandboxStatus.Type\n\n// ---------------------------------------------------------------------------\n// Domain Models\n// ---------------------------------------------------------------------------\n\n/**\n * AWS account reference (profile + region).\n *\n * @category Domain\n */\nexport class Account extends Schema.Class<Account>(\"Account\")({\n profile: AwsProfileName,\n region: AwsRegion,\n awsAccountId: Schema.optional(Schema.String),\n repoAccountId: Schema.optional(Schema.String)\n}) {}\n\n/**\n * Approval rule attached to a pull request.\n *\n * @category Domain\n */\nexport class ApprovalRule extends Schema.Class<ApprovalRule>(\"ApprovalRule\")({\n ruleName: Schema.String,\n requiredApprovals: Schema.Number,\n poolMembers: Schema.Array(Schema.String),\n poolMemberArns: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([]))),\n satisfied: Schema.Boolean,\n fromTemplate: Schema.optional(Schema.String)\n}) {}\n\n/**\n * CodeCommit pull request.\n *\n * @category Domain\n */\nexport class PullRequest extends Schema.Class<PullRequest>(\"PullRequest\")({\n id: PullRequestId,\n title: Schema.String,\n description: Schema.optional(Schema.String),\n author: Schema.String,\n repositoryName: RepositoryName,\n creationDate: Schema.Date,\n lastModifiedDate: Schema.Date,\n link: Schema.String,\n account: Account,\n status: PullRequestStatus,\n sourceBranch: Schema.String,\n destinationBranch: Schema.String,\n isMergeable: Schema.Boolean,\n isApproved: Schema.Boolean,\n commentCount: Schema.optional(Schema.Number),\n healthScore: Schema.optional(Schema.Number),\n fetchedAt: Schema.optional(Schema.Date),\n approvedBy: Schema.Array(Schema.String),\n approvedByArns: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([]))),\n commentedBy: Schema.Array(Schema.String),\n filesChanged: Schema.optional(Schema.Number),\n approvalRules: Schema.Array(ApprovalRule).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([])))\n}) {\n get consoleUrl(): string {\n return codecommitConsoleUrl(this.account.region, this.repositoryName, this.id)\n }\n}\n\n/**\n * Robust identity comparison for matching a caller against an author or\n * approval-pool member.\n *\n * Both sides normally arrive already normalised by `normalizeAuthor`\n * (ARN → trailing `/`-segment), so the happy path is a plain equality. Under\n * cross-account SSO / assumed-role setups the two strings can still diverge —\n * e.g. one side is a full ARN or `AWSReservedSSO_<perm>_<id>/<user>` form while\n * the other is the bare username, or they differ only in case. This is a\n * SUPERSET of exact match: it still matches when the strings are equal, and\n * additionally matches when, after case-folding and reducing each side to its\n * final `/`- or `:`-segment (the username), the username segments are equal.\n * It deliberately anchors on the username segment so unrelated users never match.\n *\n * @category Domain\n */\nexport const identityMatches = (callerUsername: string, prAuthor: string): boolean => {\n const norm = (s: string) => s.trim().toLowerCase()\n const tail = (s: string) => {\n const segments = norm(s).split(/[/:]/).filter((seg) => seg.length > 0)\n return segments[segments.length - 1] ?? \"\"\n }\n const a = norm(callerUsername)\n const b = norm(prAuthor)\n if (a === \"\" || b === \"\") return false\n if (a === b) return true\n const ta = tail(callerUsername)\n const tb = tail(prAuthor)\n return ta !== \"\" && ta === tb\n}\n\n/**\n * Check if a PR needs review from the given user.\n * Standalone function so it works with both Schema.Class instances and plain wire objects.\n *\n * Uses {@link identityMatches} (a superset of exact equality) for the\n * caller-vs-pool-member and caller-vs-approver comparisons so SSO/ARN identity\n * forms still match when they refer to the same user.\n */\nexport const needsMyReview = (\n pr: { readonly approvalRules: ReadonlyArray<ApprovalRule>; readonly approvedBy: ReadonlyArray<string> },\n currentUser: string | undefined\n): boolean => {\n if (currentUser === undefined || currentUser.length === 0) return false\n if (pr.approvedBy.some((approver) => identityMatches(currentUser, approver))) return false\n return pr.approvalRules.some(\n (rule) => !rule.satisfied && rule.poolMembers.some((member) => identityMatches(currentUser, member))\n )\n}\n\n/**\n * Pull requests a queue or list may show.\n *\n * A disabled account keeps its cached rows so re-enabling it needs no provider\n * round trip, so every queue drops them on read. URL-addressable surfaces — the\n * PR detail route, a notification link, a stats jump — keep resolving against\n * the whole cache, which is why this is a list filter rather than a filter on\n * the cache itself.\n *\n * `enabledProfiles` must come from the persisted config, never from\n * `AppState.accounts`: that snapshot is rebuilt from AWS profile detection,\n * which comes back empty when there is no readable `~/.aws/config` and would\n * silently un-hide everything. `undefined` says enablement is not known — the\n * list passes through, because showing one pull request too many beats blanking\n * the queue — while an empty set says nothing is enabled and hides everything.\n *\n * @category Domain\n */\nexport const listedForEnabledAccounts = <A extends { readonly account: { readonly profile: string } }>(\n pullRequests: ReadonlyArray<A>,\n enabledProfiles: ReadonlySet<string> | undefined\n): ReadonlyArray<A> =>\n enabledProfiles === undefined\n ? pullRequests\n : pullRequests.filter((pullRequest) => enabledProfiles.has(pullRequest.account.profile))\n\nconst consoleDomainForRegion = (region: string): string =>\n region.startsWith(\"cn-\")\n ? \"console.amazonaws.cn\"\n : region.startsWith(\"us-gov-\")\n ? \"console.amazonaws-us-gov.com\"\n : \"console.aws.amazon.com\"\n\nexport const codecommitConsoleUrl = (region: string, repo: string, prId: string): string =>\n `https://${region}.${\n consoleDomainForRegion(\n region\n )\n }/codesuite/codecommit/repositories/${repo}/pull-requests/${prId}?region=${region}`\n\nconst CodeCommitLocatorRegion = AwsRegion.check(\n Schema.isPattern(/^[a-z]{2}(?:-gov)?-[a-z0-9-]+-[0-9]+$/u)\n)\nconst CodeCommitLocatorRepositoryName = RepositoryName.check(\n Schema.isPattern(/^[A-Za-z0-9._-]{1,100}$/u)\n)\nconst CodeCommitLocatorPullRequestId = PullRequestId.check(\n Schema.isPattern(/^[0-9]{1,200}$/u)\n)\n\n/** Provider coordinates recovered from an AWS CodeCommit console pull-request URL. */\nexport const CodeCommitPullRequestLocator = Schema.Struct({\n region: CodeCommitLocatorRegion,\n repositoryName: CodeCommitLocatorRepositoryName,\n pullRequestId: CodeCommitLocatorPullRequestId\n})\nexport type CodeCommitPullRequestLocator = typeof CodeCommitPullRequestLocator.Type\n\nconst codeCommitConsoleHost =\n /^(?<region>[a-z]{2}(?:-gov)?-[a-z0-9-]+-\\d+)\\.(?<domain>console\\.aws\\.amazon\\.com|console\\.amazonaws\\.cn|console\\.amazonaws-us-gov\\.com)$/u\nconst codeCommitPullRequestPath =\n /^\\/codesuite\\/codecommit\\/repositories\\/(?<repositoryName>[A-Za-z0-9._-]{1,100})\\/pull-requests\\/(?<pullRequestId>[0-9]{1,200})(?:\\/(?<view>activity|changes|details))?$/u\n\nconst parseCodeCommitPullRequestUrl = (input: string): CodeCommitPullRequestLocator | null => {\n if (!URL.canParse(input)) return null\n const url = new URL(input)\n const host = codeCommitConsoleHost.exec(url.hostname)\n const path = codeCommitPullRequestPath.exec(url.pathname)\n const region = host?.groups?.region\n const domain = host?.groups?.domain\n const repositoryName = path?.groups?.repositoryName\n const pullRequestId = path?.groups?.pullRequestId\n const view = path?.groups?.view\n const queryRegions = url.searchParams.getAll(\"region\")\n if (\n url.protocol !== \"https:\" ||\n url.port.length > 0 ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n (url.hash.length > 0 && view !== \"activity\") ||\n region === undefined ||\n domain === undefined ||\n repositoryName === undefined ||\n pullRequestId === undefined ||\n domain !== consoleDomainForRegion(region) ||\n queryRegions.length > 1 ||\n (queryRegions.length === 1 && queryRegions[0] !== region)\n ) return null\n return {\n region: AwsRegion.make(region),\n repositoryName: RepositoryName.make(repositoryName),\n pullRequestId: PullRequestId.make(pullRequestId)\n }\n}\n\n/**\n * Decodes a shared AWS Console PR link into provider coordinates.\n *\n * The URL does not identify an AWS account. Callers must resolve the locator\n * within their authenticated workspace and reject ambiguous matches.\n */\nexport const CodeCommitPullRequestUrl = Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(2_048)\n).pipe(\n Schema.decodeTo(CodeCommitPullRequestLocator, {\n decode: SchemaGetter.transformEffect((input, options) => {\n const locator = parseCodeCommitPullRequestUrl(input)\n return locator === null\n ? Effect.fail(\n new SchemaIssue.InvalidValue({ expected: \"an AWS CodeCommit pull-request console URL\" }, input, options)\n )\n : Effect.succeed(locator)\n }),\n encode: SchemaGetter.transform(({ pullRequestId, region, repositoryName }) =>\n codecommitConsoleUrl(region, repositoryName, pullRequestId)\n )\n })\n)\n\n/**\n * Code sandbox instance for a pull request.\n *\n * @category Domain\n */\nexport class Sandbox extends Schema.Class<Sandbox>(\"Sandbox\")({\n id: SandboxId,\n pullRequestId: PullRequestId,\n awsAccountId: Schema.String,\n repositoryName: RepositoryName,\n region: AwsRegion,\n sourceBranch: Schema.String,\n containerId: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Number),\n workspacePath: Schema.String,\n status: SandboxStatus,\n error: Schema.optional(Schema.String),\n createdAt: Schema.Date,\n lastActivityAt: Schema.Date\n}) {}\n\n/**\n * Comment on a pull request.\n *\n * @category Domain\n */\nexport class PRComment extends Schema.Class<PRComment>(\"PRComment\")({\n id: CommentId,\n content: Schema.String,\n author: Schema.String,\n creationDate: Schema.Date,\n inReplyTo: Schema.optional(CommentId),\n deleted: Schema.Boolean,\n filePath: Schema.optional(Schema.String),\n lineNumber: Schema.optional(Schema.Number)\n}) {}\n\n/**\n * Recursive comment thread (root comment + nested replies).\n *\n * @category Domain\n */\nexport interface CommentThread {\n readonly root: PRComment\n readonly replies: ReadonlyArray<CommentThread>\n}\n\n/** Provider-relative side of a pull-request file position. */\nexport const RelativeFileVersion = Schema.Literals([\"BEFORE\", \"AFTER\"])\nexport type RelativeFileVersion = typeof RelativeFileVersion.Type\n\n/**\n * Comments grouped by file location in a pull request.\n *\n * @category Domain\n */\nexport interface PRCommentLocation {\n readonly filePath?: string\n readonly beforeCommitId?: string\n readonly afterCommitId?: string\n readonly relativeFileVersion?: RelativeFileVersion\n readonly comments: ReadonlyArray<CommentThread>\n}\n\n// ---------------------------------------------------------------------------\n// JSON-safe comment schemas (for HTTP API wire format)\n// ---------------------------------------------------------------------------\n\nconst PRCommentJson = Schema.Struct({\n id: Schema.String,\n content: Schema.String,\n author: Schema.String,\n creationDate: Schema.String,\n inReplyTo: Schema.optional(Schema.String),\n deleted: Schema.Boolean,\n filePath: Schema.optional(Schema.String),\n lineNumber: Schema.optional(Schema.Number)\n})\n\nexport interface CommentThreadJsonEncoded {\n readonly root: typeof PRCommentJson.Type\n readonly replies: ReadonlyArray<CommentThreadJsonEncoded>\n}\n\nconst CommentThreadJson: Schema.Codec<CommentThreadJsonEncoded> = Schema.Struct({\n root: PRCommentJson,\n replies: Schema.Array(Schema.suspend((): Schema.Codec<CommentThreadJsonEncoded> => CommentThreadJson))\n})\n\n/**\n * JSON-safe schema for comment locations (HTTP wire format).\n * Dates are ISO strings, no branded types.\n *\n * @category Domain\n */\nexport const PRCommentLocationJson = Schema.Struct({\n filePath: Schema.optional(Schema.String),\n beforeCommitId: Schema.optional(Schema.String),\n afterCommitId: Schema.optional(Schema.String),\n relativeFileVersion: Schema.optional(RelativeFileVersion),\n comments: Schema.Array(CommentThreadJson)\n})\n\n// NOTE: replies of deleted root comments are omitted — matches UI behavior\n// (deleted comments hide their subtree).\nconst serializeThread = (t: CommentThread): CommentThreadJsonEncoded => ({\n root: {\n id: t.root.id,\n content: t.root.content,\n author: t.root.author,\n creationDate: t.root.creationDate.toISOString(),\n ...((t.root.inReplyTo != null) && { inReplyTo: t.root.inReplyTo }),\n deleted: t.root.deleted,\n ...((t.root.filePath != null) && { filePath: t.root.filePath }),\n ...((t.root.lineNumber != null) && { lineNumber: t.root.lineNumber })\n },\n replies: t.root.deleted ? [] : t.replies.map(serializeThread)\n})\n\n/**\n * Encode PRCommentLocations to JSON-safe format for HTTP responses.\n *\n * @category Domain\n */\nexport const encodeCommentLocations = (\n locations: ReadonlyArray<PRCommentLocation>\n): ReadonlyArray<typeof PRCommentLocationJson.Type> =>\n locations.map((loc) => ({\n ...((loc.filePath != null) && { filePath: loc.filePath }),\n ...((loc.beforeCommitId != null) && { beforeCommitId: loc.beforeCommitId }),\n ...((loc.afterCommitId != null) && { afterCommitId: loc.afterCommitId }),\n ...((loc.relativeFileVersion != null) && { relativeFileVersion: loc.relativeFileVersion }),\n comments: loc.comments.map(serializeThread)\n }))\n\n// ---------------------------------------------------------------------------\n// Persistent Notification Types\n// ---------------------------------------------------------------------------\n\nexport const PersistentNotificationType = Schema.Literals([\n \"new_comment\",\n \"comment_edited\",\n \"comment_deleted\",\n \"approval_changed\",\n \"approval_requested\",\n \"review_reminder\",\n \"merge_changed\",\n \"title_changed\",\n \"description_changed\",\n \"pr_merged\",\n \"pr_closed\",\n \"pr_reopened\"\n])\nexport type PersistentNotificationType = typeof PersistentNotificationType.Type\n\nexport class PersistentNotification extends Schema.Class<PersistentNotification>(\"PersistentNotification\")({\n id: Schema.Number,\n pullRequestId: PullRequestId,\n awsAccountId: Schema.String,\n type: PersistentNotificationType,\n message: Schema.String,\n createdAt: Schema.Date,\n read: Schema.Boolean\n}) {}\n\nexport type PRSyncStatus = Data.TaggedEnum<{\n readonly Cached: { readonly fetchedAt: Date }\n readonly Syncing: { readonly fetchedAt: Date }\n readonly UpToDate: { readonly fetchedAt: Date }\n readonly Failed: { readonly fetchedAt: Date; readonly error: string }\n}>\nexport const PRSyncStatus = Data.taggedEnum<PRSyncStatus>()\n\n// ---------------------------------------------------------------------------\n// State Models\n// ---------------------------------------------------------------------------\n\n/**\n * Notification item with timestamp.\n *\n * @category Domain\n */\nexport class NotificationItem extends Schema.Class<NotificationItem>(\"NotificationItem\")({\n type: NotificationType,\n title: Schema.String,\n message: Schema.String,\n timestamp: Schema.Date,\n profile: Schema.optionalKey(Schema.String)\n}) {}\n\n/**\n * Notification state container.\n *\n * @category Domain\n */\nexport interface NotificationsState {\n readonly items: ReadonlyArray<NotificationItem>\n}\n\n/**\n * Account configuration in app state.\n *\n * @category Domain\n */\nexport interface AccountState {\n readonly profile: AwsProfileName\n readonly region: AwsRegion\n readonly enabled: boolean\n}\n\n/** Account-region scope whose pull-request list completed in the latest refresh. */\nexport interface PullRequestRefreshScope {\n readonly profile: AwsProfileName\n readonly region: AwsRegion\n readonly awsAccountId: string\n}\n\n/**\n * Application state.\n *\n * @category Domain\n */\nexport interface AppState {\n readonly pullRequests: ReadonlyArray<PullRequest>\n readonly accounts: ReadonlyArray<AccountState>\n readonly status: AppStatus\n readonly statusDetail?: string | undefined\n readonly error?: string | undefined\n readonly lastUpdated?: Date\n readonly currentUser?: string\n /**\n * Unused. codecommit-web no longer sets or reads it; its review count is the client-side\n * `yourReviewCount` (workbench-queue.ts). Kept for L2-7, which retires or replaces it.\n */\n readonly pendingReviewCount?: number\n /** Monotonic sequence incremented when a list refresh starts. */\n readonly refreshGeneration?: number\n readonly successfulRefreshScopes?: ReadonlyArray<PullRequestRefreshScope>\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Domain-DH_T_LJ8.js","names":["Schema.brand","Schema.Literals","Schema.Class","Schema.optional","Schema.String","Schema.Number","Schema.Array","Schema.withDecodingDefaultTypeKey","Effect.succeed","Schema.Boolean","Schema.Date","Schema.isPattern","Schema.Struct","Schema.isTrimmed","Schema.isNonEmpty","Schema.isMaxLength","Schema.decodeTo","SchemaGetter.transformEffect","Effect.fail","SchemaIssue.InvalidValue","SchemaGetter.transform","Schema.suspend","Data.taggedEnum","Schema.optionalKey","succeed","Number","transformEffect","Class","decodeTo","brand","String","Struct","InvalidValue","Literals","ArraySchema","fail","isNonEmpty","suspend","optionalKey","transform","isPattern","optional","taggedEnum","isMaxLength","isTrimmed","Date","Boolean","withDecodingDefaultTypeKey","PullRequestId","RepositoryName","AwsProfileName","AwsRegion","CommentId","SandboxId","PullRequestStatus","NotificationType","SandboxStatus","Account","ApprovalRule","consoleDomainForRegion","region","codecommitConsoleUrl","repo","prId","CodeCommitLocatorRegion","CodeCommitLocatorRepositoryName","CodeCommitLocatorPullRequestId","CodeCommitPullRequestLocator","codeCommitConsoleHost","codeCommitPullRequestPath","parseCodeCommitPullRequestUrl","input","url","host","path","domain","repositoryName","pullRequestId","view","queryRegions","CodeCommitPullRequestUrl","locator","options","RelativeFileVersion","PRCommentJson","CommentThreadJson","PersistentNotificationType"],"sources":["../../../../codecommit-core/src/Domain.ts"],"sourcesContent":["/**\n * Domain models for CodeCommit operations.\n *\n * Provides branded types for compile-time ID safety, `Schema.Class` models\n * with computed properties, and `Schema.Literal` enumerations. Central types\n * include {@link PullRequest} (with approval rules, approver ARNs, and\n * review detection), {@link ApprovalRule} (per-PR rule with pool members\n * and satisfaction state), and {@link PersistentNotification} (including\n * approval_requested and review_reminder types).\n *\n * **Mental model**\n *\n * - ApprovalRule: per-PR rule with pool members (normalized names) + raw ARNs\n * - needsMyReview: standalone fn (not method) so it works with wire objects too\n * - PersistentNotificationType: includes approval_requested, review_reminder\n *\n * **Gotchas**\n *\n * - ApprovalRule uses `Schema.Class`, but instances round-trip as plain objects\n * through JSON without class instance checks\n *\n * **Common tasks**\n *\n * - Define approval rule: {@link ApprovalRule}\n * - Check review needed: {@link needsMyReview}\n * - PR console URL: {@link codecommitConsoleUrl}\n * - Notification types: {@link PersistentNotificationType}\n *\n * **Quickstart**\n *\n * ```ts\n * import { needsMyReview, PullRequest } from \"./Domain.js\"\n *\n * declare const pr: PullRequest\n * if (needsMyReview(pr, \"alice\")) {\n * console.log(`Review needed: ${pr.consoleUrl}`)\n * }\n * ```\n *\n * @category Domain\n * @module\n */\nimport { Data, Effect, Schema, SchemaGetter, SchemaIssue } from \"effect\"\n\n// ---------------------------------------------------------------------------\n// Branded Types\n// ---------------------------------------------------------------------------\n\n/**\n * Branded pull request identifier.\n *\n * @category Domain\n */\nexport const PullRequestId = Schema.String.pipe(Schema.brand(\"PullRequestId\"))\nexport type PullRequestId = typeof PullRequestId.Type\n\n/**\n * Branded repository name.\n *\n * @category Domain\n */\nexport const RepositoryName = Schema.String.pipe(Schema.brand(\"RepositoryName\"))\nexport type RepositoryName = typeof RepositoryName.Type\n\n/**\n * Branded AWS profile name.\n *\n * @category Domain\n */\nexport const AwsProfileName = Schema.String.pipe(Schema.brand(\"AwsProfileName\"))\nexport type AwsProfileName = typeof AwsProfileName.Type\n\n/**\n * Branded AWS region name.\n *\n * @category Domain\n */\nexport const AwsRegion = Schema.String.pipe(Schema.brand(\"AwsRegion\"))\nexport type AwsRegion = typeof AwsRegion.Type\n\n/**\n * Branded comment identifier.\n *\n * @category Domain\n */\nexport const CommentId = Schema.String.pipe(Schema.brand(\"CommentId\"))\nexport type CommentId = typeof CommentId.Type\n\n/**\n * Branded sandbox identifier.\n *\n * @category Domain\n */\nexport const SandboxId = Schema.String.pipe(Schema.brand(\"SandboxId\"))\nexport type SandboxId = typeof SandboxId.Type\n\n// ---------------------------------------------------------------------------\n// Enumerations\n// ---------------------------------------------------------------------------\n\n/**\n * Pull request status.\n *\n * @category Domain\n */\nexport const PullRequestStatus = Schema.Literals([\"OPEN\", \"CLOSED\", \"MERGED\"])\nexport type PullRequestStatus = typeof PullRequestStatus.Type\n\n/** Normalizes provider/cache account identifiers; blank values are unresolved, not identities. */\nexport const normalizeAccountId = (value: string | null | undefined): string | undefined => {\n const normalized = value?.trim()\n return normalized === undefined || normalized.length === 0 ? undefined : normalized\n}\n\n/**\n * Notification severity type.\n *\n * @category Domain\n */\nexport const NotificationType = Schema.Literals([\"error\", \"info\", \"warning\", \"success\"])\nexport type NotificationType = typeof NotificationType.Type\n\n/**\n * Application loading status.\n *\n * @category Domain\n */\nexport const AppStatus = Schema.Literals([\"idle\", \"loading\", \"error\"])\nexport type AppStatus = typeof AppStatus.Type\n\n/**\n * Sandbox lifecycle status.\n *\n * @category Domain\n */\nexport const SandboxStatus = Schema.Literals([\n \"creating\",\n \"cloning\",\n \"starting\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"error\"\n])\nexport type SandboxStatus = typeof SandboxStatus.Type\n\n// ---------------------------------------------------------------------------\n// Domain Models\n// ---------------------------------------------------------------------------\n\n/**\n * AWS account reference (profile + region).\n *\n * @category Domain\n */\nexport class Account extends Schema.Class<Account>(\"Account\")({\n profile: AwsProfileName,\n region: AwsRegion,\n awsAccountId: Schema.optional(Schema.String),\n repoAccountId: Schema.optional(Schema.String)\n}) {}\n\n/**\n * Approval rule attached to a pull request.\n *\n * @category Domain\n */\nexport class ApprovalRule extends Schema.Class<ApprovalRule>(\"ApprovalRule\")({\n ruleName: Schema.String,\n requiredApprovals: Schema.Number,\n poolMembers: Schema.Array(Schema.String),\n poolMemberArns: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([]))),\n satisfied: Schema.Boolean,\n fromTemplate: Schema.optional(Schema.String)\n}) {}\n\n/**\n * CodeCommit pull request.\n *\n * @category Domain\n */\nexport class PullRequest extends Schema.Class<PullRequest>(\"PullRequest\")({\n id: PullRequestId,\n title: Schema.String,\n description: Schema.optional(Schema.String),\n author: Schema.String,\n repositoryName: RepositoryName,\n creationDate: Schema.Date,\n lastModifiedDate: Schema.Date,\n link: Schema.String,\n account: Account,\n status: PullRequestStatus,\n sourceBranch: Schema.String,\n destinationBranch: Schema.String,\n isMergeable: Schema.Boolean,\n isApproved: Schema.Boolean,\n commentCount: Schema.optional(Schema.Number),\n healthScore: Schema.optional(Schema.Number),\n fetchedAt: Schema.optional(Schema.Date),\n approvedBy: Schema.Array(Schema.String),\n approvedByArns: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([]))),\n commentedBy: Schema.Array(Schema.String),\n filesChanged: Schema.optional(Schema.Number),\n approvalRules: Schema.Array(ApprovalRule).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([])))\n}) {\n get consoleUrl(): string {\n return codecommitConsoleUrl(this.account.region, this.repositoryName, this.id)\n }\n}\n\n/**\n * Robust identity comparison for matching a caller against an author or\n * approval-pool member.\n *\n * Both sides normally arrive already normalised by `normalizeAuthor`\n * (ARN → trailing `/`-segment), so the happy path is a plain equality. Under\n * cross-account SSO / assumed-role setups the two strings can still diverge —\n * e.g. one side is a full ARN or `AWSReservedSSO_<perm>_<id>/<user>` form while\n * the other is the bare username, or they differ only in case. This is a\n * SUPERSET of exact match: it still matches when the strings are equal, and\n * additionally matches when, after case-folding and reducing each side to its\n * final `/`- or `:`-segment (the username), the username segments are equal.\n * It deliberately anchors on the username segment so unrelated users never match.\n *\n * @category Domain\n */\nexport const identityMatches = (callerUsername: string, prAuthor: string): boolean => {\n const norm = (s: string) => s.trim().toLowerCase()\n const tail = (s: string) => {\n const segments = norm(s).split(/[/:]/).filter((seg) => seg.length > 0)\n return segments[segments.length - 1] ?? \"\"\n }\n const a = norm(callerUsername)\n const b = norm(prAuthor)\n if (a === \"\" || b === \"\") return false\n if (a === b) return true\n const ta = tail(callerUsername)\n const tb = tail(prAuthor)\n return ta !== \"\" && ta === tb\n}\n\n/**\n * Check if a PR needs review from the given user.\n * Standalone function so it works with both Schema.Class instances and plain wire objects.\n *\n * Uses {@link identityMatches} (a superset of exact equality) for the\n * caller-vs-pool-member and caller-vs-approver comparisons so SSO/ARN identity\n * forms still match when they refer to the same user.\n */\nexport const needsMyReview = (\n pr: { readonly approvalRules: ReadonlyArray<ApprovalRule>; readonly approvedBy: ReadonlyArray<string> },\n currentUser: string | undefined\n): boolean => {\n if (currentUser === undefined || currentUser.length === 0) return false\n if (pr.approvedBy.some((approver) => identityMatches(currentUser, approver))) return false\n return pr.approvalRules.some(\n (rule) => !rule.satisfied && rule.poolMembers.some((member) => identityMatches(currentUser, member))\n )\n}\n\n/**\n * Pull requests a queue or list may show.\n *\n * A disabled account keeps its cached rows so re-enabling it needs no provider\n * round trip, so every queue drops them on read. URL-addressable surfaces — the\n * PR detail route, a notification link, a stats jump — keep resolving against\n * the whole cache, which is why this is a list filter rather than a filter on\n * the cache itself.\n *\n * `enabledProfiles` must come from the persisted config, never from\n * `AppState.accounts`: that snapshot is rebuilt from AWS profile detection,\n * which comes back empty when there is no readable `~/.aws/config` and would\n * silently un-hide everything. `undefined` says enablement is not known — the\n * list passes through, because showing one pull request too many beats blanking\n * the queue — while an empty set says nothing is enabled and hides everything.\n *\n * @category Domain\n */\nexport const listedForEnabledAccounts = <A extends { readonly account: { readonly profile: string } }>(\n pullRequests: ReadonlyArray<A>,\n enabledProfiles: ReadonlySet<string> | undefined\n): ReadonlyArray<A> =>\n enabledProfiles === undefined\n ? pullRequests\n : pullRequests.filter((pullRequest) => enabledProfiles.has(pullRequest.account.profile))\n\nconst consoleDomainForRegion = (region: string): string =>\n region.startsWith(\"cn-\")\n ? \"console.amazonaws.cn\"\n : region.startsWith(\"us-gov-\")\n ? \"console.amazonaws-us-gov.com\"\n : \"console.aws.amazon.com\"\n\nexport const codecommitConsoleUrl = (region: string, repo: string, prId: string): string =>\n `https://${region}.${\n consoleDomainForRegion(\n region\n )\n }/codesuite/codecommit/repositories/${repo}/pull-requests/${prId}?region=${region}`\n\nconst CodeCommitLocatorRegion = AwsRegion.check(\n Schema.isPattern(/^[a-z]{2}(?:-gov)?-[a-z0-9-]+-[0-9]+$/u)\n)\nconst CodeCommitLocatorRepositoryName = RepositoryName.check(\n Schema.isPattern(/^[A-Za-z0-9._-]{1,100}$/u)\n)\nconst CodeCommitLocatorPullRequestId = PullRequestId.check(\n Schema.isPattern(/^[0-9]{1,200}$/u)\n)\n\n/** Provider coordinates recovered from an AWS CodeCommit console pull-request URL. */\nexport const CodeCommitPullRequestLocator = Schema.Struct({\n region: CodeCommitLocatorRegion,\n repositoryName: CodeCommitLocatorRepositoryName,\n pullRequestId: CodeCommitLocatorPullRequestId\n})\nexport type CodeCommitPullRequestLocator = typeof CodeCommitPullRequestLocator.Type\n\nconst codeCommitConsoleHost =\n /^(?<region>[a-z]{2}(?:-gov)?-[a-z0-9-]+-\\d+)\\.(?<domain>console\\.aws\\.amazon\\.com|console\\.amazonaws\\.cn|console\\.amazonaws-us-gov\\.com)$/u\nconst codeCommitPullRequestPath =\n /^\\/codesuite\\/codecommit\\/repositories\\/(?<repositoryName>[A-Za-z0-9._-]{1,100})\\/pull-requests\\/(?<pullRequestId>[0-9]{1,200})(?:\\/(?<view>activity|changes|details))?$/u\n\nconst parseCodeCommitPullRequestUrl = (input: string): CodeCommitPullRequestLocator | null => {\n if (!URL.canParse(input)) return null\n const url = new URL(input)\n const host = codeCommitConsoleHost.exec(url.hostname)\n const path = codeCommitPullRequestPath.exec(url.pathname)\n const region = host?.groups?.region\n const domain = host?.groups?.domain\n const repositoryName = path?.groups?.repositoryName\n const pullRequestId = path?.groups?.pullRequestId\n const view = path?.groups?.view\n const queryRegions = url.searchParams.getAll(\"region\")\n if (\n url.protocol !== \"https:\" ||\n url.port.length > 0 ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n (url.hash.length > 0 && view !== \"activity\") ||\n region === undefined ||\n domain === undefined ||\n repositoryName === undefined ||\n pullRequestId === undefined ||\n domain !== consoleDomainForRegion(region) ||\n queryRegions.length > 1 ||\n (queryRegions.length === 1 && queryRegions[0] !== region)\n ) return null\n return {\n region: AwsRegion.make(region),\n repositoryName: RepositoryName.make(repositoryName),\n pullRequestId: PullRequestId.make(pullRequestId)\n }\n}\n\n/**\n * Decodes a shared AWS Console PR link into provider coordinates.\n *\n * The URL does not identify an AWS account. Callers must resolve the locator\n * within their authenticated workspace and reject ambiguous matches.\n */\nexport const CodeCommitPullRequestUrl = Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(2_048)\n).pipe(\n Schema.decodeTo(CodeCommitPullRequestLocator, {\n decode: SchemaGetter.transformEffect((input, options) => {\n const locator = parseCodeCommitPullRequestUrl(input)\n return locator === null\n ? Effect.fail(\n new SchemaIssue.InvalidValue({ expected: \"an AWS CodeCommit pull-request console URL\" }, input, options)\n )\n : Effect.succeed(locator)\n }),\n encode: SchemaGetter.transform(({ pullRequestId, region, repositoryName }) =>\n codecommitConsoleUrl(region, repositoryName, pullRequestId)\n )\n })\n)\n\n/**\n * Code sandbox instance for a pull request.\n *\n * @category Domain\n */\nexport class Sandbox extends Schema.Class<Sandbox>(\"Sandbox\")({\n id: SandboxId,\n pullRequestId: PullRequestId,\n awsAccountId: Schema.String,\n repositoryName: RepositoryName,\n region: AwsRegion,\n sourceBranch: Schema.String,\n containerId: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Number),\n workspacePath: Schema.String,\n status: SandboxStatus,\n error: Schema.optional(Schema.String),\n createdAt: Schema.Date,\n lastActivityAt: Schema.Date\n}) {}\n\n/**\n * Comment on a pull request.\n *\n * @category Domain\n */\nexport class PRComment extends Schema.Class<PRComment>(\"PRComment\")({\n id: CommentId,\n content: Schema.String,\n author: Schema.String,\n creationDate: Schema.Date,\n inReplyTo: Schema.optional(CommentId),\n deleted: Schema.Boolean,\n filePath: Schema.optional(Schema.String),\n lineNumber: Schema.optional(Schema.Number)\n}) {}\n\n/**\n * Recursive comment thread (root comment + nested replies).\n *\n * @category Domain\n */\nexport interface CommentThread {\n readonly root: PRComment\n readonly replies: ReadonlyArray<CommentThread>\n}\n\n/** Provider-relative side of a pull-request file position. */\nexport const RelativeFileVersion = Schema.Literals([\"BEFORE\", \"AFTER\"])\nexport type RelativeFileVersion = typeof RelativeFileVersion.Type\n\n/**\n * Comments grouped by file location in a pull request.\n *\n * @category Domain\n */\nexport interface PRCommentLocation {\n readonly filePath?: string\n readonly beforeCommitId?: string\n readonly afterCommitId?: string\n readonly relativeFileVersion?: RelativeFileVersion\n readonly comments: ReadonlyArray<CommentThread>\n}\n\n// ---------------------------------------------------------------------------\n// JSON-safe comment schemas (for HTTP API wire format)\n// ---------------------------------------------------------------------------\n\nconst PRCommentJson = Schema.Struct({\n id: Schema.String,\n content: Schema.String,\n author: Schema.String,\n creationDate: Schema.String,\n inReplyTo: Schema.optional(Schema.String),\n deleted: Schema.Boolean,\n filePath: Schema.optional(Schema.String),\n lineNumber: Schema.optional(Schema.Number)\n})\n\nexport interface CommentThreadJsonEncoded {\n readonly root: typeof PRCommentJson.Type\n readonly replies: ReadonlyArray<CommentThreadJsonEncoded>\n}\n\nconst CommentThreadJson: Schema.Codec<CommentThreadJsonEncoded> = Schema.Struct({\n root: PRCommentJson,\n replies: Schema.Array(Schema.suspend((): Schema.Codec<CommentThreadJsonEncoded> => CommentThreadJson))\n})\n\n/**\n * JSON-safe schema for comment locations (HTTP wire format).\n * Dates are ISO strings, no branded types.\n *\n * @category Domain\n */\nexport const PRCommentLocationJson = Schema.Struct({\n filePath: Schema.optional(Schema.String),\n beforeCommitId: Schema.optional(Schema.String),\n afterCommitId: Schema.optional(Schema.String),\n relativeFileVersion: Schema.optional(RelativeFileVersion),\n comments: Schema.Array(CommentThreadJson)\n})\n\n// NOTE: replies of deleted root comments are omitted — matches UI behavior\n// (deleted comments hide their subtree).\nconst serializeThread = (t: CommentThread): CommentThreadJsonEncoded => ({\n root: {\n id: t.root.id,\n content: t.root.content,\n author: t.root.author,\n creationDate: t.root.creationDate.toISOString(),\n ...((t.root.inReplyTo != null) && { inReplyTo: t.root.inReplyTo }),\n deleted: t.root.deleted,\n ...((t.root.filePath != null) && { filePath: t.root.filePath }),\n ...((t.root.lineNumber != null) && { lineNumber: t.root.lineNumber })\n },\n replies: t.root.deleted ? [] : t.replies.map(serializeThread)\n})\n\n/**\n * Encode PRCommentLocations to JSON-safe format for HTTP responses.\n *\n * @category Domain\n */\nexport const encodeCommentLocations = (\n locations: ReadonlyArray<PRCommentLocation>\n): ReadonlyArray<typeof PRCommentLocationJson.Type> =>\n locations.map((loc) => ({\n ...((loc.filePath != null) && { filePath: loc.filePath }),\n ...((loc.beforeCommitId != null) && { beforeCommitId: loc.beforeCommitId }),\n ...((loc.afterCommitId != null) && { afterCommitId: loc.afterCommitId }),\n ...((loc.relativeFileVersion != null) && { relativeFileVersion: loc.relativeFileVersion }),\n comments: loc.comments.map(serializeThread)\n }))\n\n// ---------------------------------------------------------------------------\n// Persistent Notification Types\n// ---------------------------------------------------------------------------\n\nexport const PersistentNotificationType = Schema.Literals([\n \"new_comment\",\n \"comment_edited\",\n \"comment_deleted\",\n \"approval_changed\",\n \"approval_requested\",\n \"review_reminder\",\n \"merge_changed\",\n \"title_changed\",\n \"description_changed\",\n \"pr_merged\",\n \"pr_closed\",\n \"pr_reopened\"\n])\nexport type PersistentNotificationType = typeof PersistentNotificationType.Type\n\nexport class PersistentNotification extends Schema.Class<PersistentNotification>(\"PersistentNotification\")({\n id: Schema.Number,\n pullRequestId: PullRequestId,\n awsAccountId: Schema.String,\n type: PersistentNotificationType,\n message: Schema.String,\n createdAt: Schema.Date,\n read: Schema.Boolean\n}) {}\n\nexport type PRSyncStatus = Data.TaggedEnum<{\n readonly Cached: { readonly fetchedAt: Date }\n readonly Syncing: { readonly fetchedAt: Date }\n readonly UpToDate: { readonly fetchedAt: Date }\n readonly Failed: { readonly fetchedAt: Date; readonly error: string }\n}>\nexport const PRSyncStatus = Data.taggedEnum<PRSyncStatus>()\n\n// ---------------------------------------------------------------------------\n// State Models\n// ---------------------------------------------------------------------------\n\n/**\n * Notification item with timestamp.\n *\n * @category Domain\n */\nexport class NotificationItem extends Schema.Class<NotificationItem>(\"NotificationItem\")({\n type: NotificationType,\n title: Schema.String,\n message: Schema.String,\n timestamp: Schema.Date,\n profile: Schema.optionalKey(Schema.String)\n}) {}\n\n/**\n * Notification state container.\n *\n * @category Domain\n */\nexport interface NotificationsState {\n readonly items: ReadonlyArray<NotificationItem>\n}\n\n/**\n * Account configuration in app state.\n *\n * @category Domain\n */\nexport interface AccountState {\n readonly profile: AwsProfileName\n readonly region: AwsRegion\n readonly enabled: boolean\n}\n\n/** Account-region scope whose pull-request list completed in the latest refresh. */\nexport interface PullRequestRefreshScope {\n readonly profile: AwsProfileName\n readonly region: AwsRegion\n readonly awsAccountId: string\n}\n\n/**\n * A pull request the last refresh read but could not re-evaluate: its approval rules failed to\n * evaluate, so its cached row is kept as it was and its account's refresh counts as partial.\n *\n * @category Domain\n */\nexport interface UnevaluatedPullRequest {\n readonly profile: AwsProfileName\n readonly region: AwsRegion\n readonly pullRequestId: string\n readonly repositoryName: string\n /** Names the failed operation and the provider's reason. */\n readonly message: string\n}\n\n/**\n * Application state.\n *\n * @category Domain\n */\nexport interface AppState {\n readonly pullRequests: ReadonlyArray<PullRequest>\n readonly accounts: ReadonlyArray<AccountState>\n readonly status: AppStatus\n readonly statusDetail?: string | undefined\n readonly error?: string | undefined\n readonly lastUpdated?: Date\n readonly currentUser?: string\n /** Pull requests the last refresh kept from cache because their approval rules failed to evaluate. */\n readonly unevaluatedPullRequests?: ReadonlyArray<UnevaluatedPullRequest>\n /**\n * Unused. codecommit-web no longer sets or reads it; its review count is the client-side\n * `yourReviewCount` (workbench-queue.ts). Kept for L2-7, which retires or replaces it.\n */\n readonly pendingReviewCount?: number\n /** Monotonic sequence incremented when a list refresh starts. */\n readonly refreshGeneration?: number\n readonly successfulRefreshScopes?: ReadonlyArray<PullRequestRefreshScope>\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{p as n,s as r,u as i}from"./hooks-CGvBGjhq.js";import{a,d as o,r as s,v as c}from"./Dialog-_t9OodCK-CzkLh9VB.js";import{t as l}from"./jsx-runtime-NZYk81nU.js";import{E as u,b as d,w as f}from"./index-BHQ_NP1r.js";import{d as p,n as m}from"./patterns-D0U0WCQS.js";import{n as h,t as g}from"./primitives-CjQX0eVM-BPKvllZ_.js";import{$t as _,Oa as v,Wr as y,qn as b}from"./agent-api-0YXZd1ag.js";import{i as x,o as S}from"./releaseRoutes-D04aOk03.js";import{PortfolioOverviewView as C}from"./PortfolioOverview-BRB_qe4T.js";import{n as w,r as T}from"./workspaceEntityRoutes-FAiial9O.js";import{a as E}from"./presentWorkspaceItems-Cd0qEwW1.js";import{n as ee,t as te}from"./useWorkspaceItems-BROb2PDr.js";import{n as ne,t as re}from"./workspaceScrollCapture-AJpPgzgz.js";import{t as D}from"./authorizedShareTransport-xJy2K3un.js";import{n as ie}from"./ReleaseWorkset-DcI6qwPE.js";var O=e(t(),1),k={page:`_page_wg828_1`,hero:`_hero_wg828_2`,filters:`_filters_wg828_3`,items:`_items_wg828_4`,item:`_item_wg828_4`,itemLink:`_itemLink_wg828_6`,meta:`_meta_wg828_7`,selection:`_selection_wg828_8`,membershipChoices:`_membershipChoices_wg828_54`,shareLink:`_shareLink_wg828_55`,resultHeading:`_resultHeading_wg828_60`,selectionHeader:`_selectionHeader_wg828_80`,selectionActions:`_selectionActions_wg828_81`,owners:`_owners_wg828_153`,ownerGroup:`_ownerGroup_wg828_157`,ownerLimit:`_ownerLimit_wg828_163`,shareForm:`_shareForm_wg828_181`,shareResult:`_shareResult_wg828_182`,search:`_search_wg828_242`},A=l(),j=e=>e===`hour`||e===`week`?e:`day`,M=(e,t)=>{let n=new Map;n.set(e,{displayName:`You`,personId:e});for(let e of t)n.set(e.personId,{displayName:e.displayName,personId:e.personId});return[...n.values()]},N=({currentPersonId:e,entityId:t,grantees:n,transport:r=D,workspaceId:i})=>{let a=(0,O.useMemo)(()=>M(e,n),[e,n]),[s,l]=(0,O.useState)(a[0]?.personId??e),[u,d]=(0,O.useState)(`day`),[p,m]=(0,O.useState)({_tag:`idle`}),g=(0,O.useRef)(null),v=(0,O.useRef)(null),b=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>v.current?.abort(),[]),(0,O.useEffect)(()=>{(p._tag===`ready`||p._tag===`revoked`)&&b.current?.focus()},[p._tag]);let x=e=>{e.preventDefault(),v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`creating`});let i=g.current;(i!==null&&i.entityId===t&&i.granteePersonId===s&&i.lifetime===u?Promise.resolve(i):r.prepareCreate({entityId:t,granteePersonId:s,lifetime:u}).then(e=>(g.current=e,e))).then(e=>r.create(e,n.signal)).then(e=>{if(n.signal.aborted)return;let t=g.current;if(t===null||e.shareId!==t.shareId||e.entityId!==t.entityId||e.granteePersonId!==t.granteePersonId){m({_tag:`failed`});return}if(e.revokedAt!==null){m({_tag:`revoked`});return}m({_tag:`ready`,shareId:e.shareId,expiresAt:y(e.expiresAt)})},()=>{n.signal.aborted||m({_tag:`failed`})})},S=(e,t)=>{v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`revoking`,shareId:e,expiresAt:t}),r.revoke(i,e,n.signal).then(()=>{n.signal.aborted||m({_tag:`revoked`})},()=>{n.signal.aborted||m({_tag:`ready`,shareId:e,expiresAt:t})})},C=e=>{g.current=null,l(_.make(e))},w=e=>{g.current=null,d(j(e))},T=()=>{g.current=null,m({_tag:`idle`})};if(p._tag===`ready`||p._tag===`revoking`){let e=`/shares/${i}/${p.shareId}`;return(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:b,role:`status`,tabIndex:-1,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(h,{as:`h3`,variant:`body-large`,children:`Authorized link ready`}),(0,A.jsxs)(h,{tone:`secondary`,children:[`Only the selected person can open this exact item. Expires `,p.expiresAt,`.`]})]}),(0,A.jsx)(f,{to:e,children:e}),(0,A.jsx)(o,{disabled:p._tag===`revoking`,onClick:()=>S(p.shareId,p.expiresAt),children:p._tag===`revoking`?`Revoking…`:`Revoke link`})]})}return p._tag===`revoked`?(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:b,role:`status`,tabIndex:-1,children:[(0,A.jsx)(c,{label:`Revoked`,size:`compact`,tone:`neutral`}),(0,A.jsx)(h,{tone:`secondary`,children:`This link no longer resolves.`}),(0,A.jsx)(o,{onClick:T,children:`Create another`})]}):(0,A.jsxs)(`form`,{className:k.shareForm,onSubmit:x,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(h,{as:`h3`,variant:`body-large`,children:`Share this exact item`}),(0,A.jsx)(h,{tone:`secondary`,children:`Authenticated access only. Related releases and relationships stay private.`})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Person`}),(0,A.jsx)(`select`,{disabled:p._tag===`creating`,onChange:e=>C(e.currentTarget.value),value:s,children:a.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId))})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Expires`}),(0,A.jsxs)(`select`,{disabled:p._tag===`creating`,onChange:e=>w(e.currentTarget.value),value:u,children:[(0,A.jsx)(`option`,{value:`hour`,children:`In 1 hour`}),(0,A.jsx)(`option`,{value:`day`,children:`In 1 day`}),(0,A.jsx)(`option`,{value:`week`,children:`In 7 days`})]})]}),(0,A.jsx)(o,{disabled:p._tag===`creating`,type:`submit`,children:p._tag===`creating`?`Creating…`:`Create authorized link`}),p._tag===`failed`?(0,A.jsx)(h,{role:`alert`,tone:`secondary`,children:`Could not create the link. Check the person and try again.`}):null]})},P=[`issue`,`pull-request`,`page`,`pipeline-execution`,`deployment`,`time-entry`],F=[`jira`,`codecommit`,`confluence`,`codepipeline`,`clockify`],I=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),L=e=>I.format(Date.parse(e)),R=(e,t)=>({hash:e.hash,pathname:e.pathname,search:t.size===0?``:`?${t.toString()}`}),z=(e,t,n)=>{let r=new URLSearchParams(t);return r.set(`object`,n),{hash:`#item-details`,pathname:e,search:`?${r.toString()}`}},B=e=>P.find(t=>t===e)??`all`,V=e=>e===`active`||e===`done`||e===`failed`?e:`all`,H=e=>{let t=b(_)(e);return v(t)?t.value:`all`},ae=e=>({owner:H(e.get(`owner`)),query:e.get(`q`)?.trim()??``,service:F.find(t=>t===e.get(`service`))??`all`,status:V(e.get(`status`)),type:B(e.get(`type`))}),U=(e,t)=>{let n=t.query.toLocaleLowerCase(`en-US`);return e.filter(e=>(n.length===0||`${e.key} ${e.title} ${e.status}`.toLocaleLowerCase(`en-US`).includes(n))&&(t.service===`all`||e.service===t.service)&&(t.owner===`all`||e.owners.some(({id:e})=>e===t.owner))&&(t.status===`all`||e.statusGroup===t.status)&&(t.type===`all`||e.kind===t.type))},W=({item:e})=>{let[t,n]=(0,O.useState)(!1);return e.owners.length===0?(0,A.jsx)(`span`,{children:`Unassigned`}):(0,A.jsxs)(`span`,{className:k.ownerGroup,children:[(0,A.jsx)(p,{"aria-label":`${e.key} collaborators${e.ownersTruncated?`, more collaborators not shown`:``}`,className:k.owners,expanded:t,limit:2,onExpandedChange:n,people:e.owners,size:`compact`}),e.ownersTruncated?(0,A.jsx)(`span`,{className:k.ownerLimit,children:`20+ people · More not shown`}):null]})},G=(e,t)=>t===null?null:e.find(e=>e.entityId===t)??null,K=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),q=e=>e.releaseIds.length===0?`This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.`:e.routableReleaseIds.length===0?`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`:e.releaseIds.length===1?`This object is linked to one release and can be opened in its complete delivery context.`:`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} releases. Choose the exact release context to avoid silently substituting another delivery trace.`,J=({shareTransport:e,transport:t=te}={})=>{let l=n(),p=d(),_=r(),v=i(),[y]=u(),b=l.controller.state._tag===`ready`?l.controller.state.portfolio:null,D=(0,O.useMemo)(()=>new Map(b?.releases.map(e=>[e.id,e])??[]),[b]),j=(0,O.useMemo)(()=>new Set(b?.releases.map(({id:e})=>e)??[]),[b]),M=l.controller.state._tag===`ready`?l.controller.state.portfolio.generatedAt:`pending`,I=ie(p.state),B=ae(y),V=ee(l.workspaceId,j,B,M,I,p.invalidateSession,t),H=e=>{v(R(_,e),{replace:!0})},U=(e,t)=>{let n=new URLSearchParams(y);t.length===0||t===`all`?n.delete(e===`query`?`q`:e):n.set(e===`query`?`q`:e,t),H(n)},J=l.controller.state._tag===`ready`?I===null?{_tag:`session`,reason:p.state._tag===`authenticated`?`checking`:p.state._tag}:null:l.controller.state;if(J?._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(J!==null)return(0,A.jsx)(C,{onPreviewRelease:()=>void 0,onRetry:l.controller.onRetry,state:J});if(V.state._tag===`idle`||V.state._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(V.state._tag===`failed`)return(0,A.jsx)(s,{action:(0,A.jsx)(o,{onClick:V.retry,children:`Try again`}),description:`Control Center could not read the normalized delivery index. Saved source facts remain unchanged.`,title:`Items unavailable`,tone:`caution`});let Y=V.state.items,oe=B.owner===`all`||V.state.ownerOptions.some(({personId:e})=>e===B.owner),se=B.owner===`all`?void 0:V.state.items.flatMap(({owners:e})=>e).find(({id:e})=>e===B.owner),X=y.get(`object`),Z=G(V.state.items,X),Q=p.state._tag===`authenticated`&&p.state.session.permission===`workspace-owner`&&p.state.session.actor._tag===`human`?p.state.session.actor.personId:null,$=()=>{let e=new URLSearchParams(y);e.delete(`object`),v({hash:`#results`,pathname:_.pathname,search:e.size===0?``:`?${e.toString()}`},{replace:!0})};return(0,A.jsxs)(`article`,{className:k.page,children:[(0,A.jsxs)(`header`,{className:k.hero,children:[(0,A.jsx)(h,{as:`p`,tone:`secondary`,variant:`label`,children:`Workspace items`}),(0,A.jsx)(h,{as:`h1`,variant:`verdict`,children:`Find release work.`}),(0,A.jsx)(h,{tone:`secondary`,variant:`body-large`,children:`One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.`})]}),(0,A.jsxs)(`section`,{"aria-label":`Item filters`,className:k.filters,children:[(0,A.jsxs)(`label`,{className:k.search,children:[(0,A.jsx)(`span`,{children:`Search`}),(0,A.jsx)(`input`,{maxLength:200,onChange:e=>U(`query`,e.currentTarget.value),placeholder:`Key, title, or status`,type:`search`,value:B.query})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Service`}),(0,A.jsxs)(`select`,{onChange:e=>U(`service`,e.currentTarget.value),value:B.service,children:[(0,A.jsx)(`option`,{value:`all`,children:`All services`}),F.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Owner`}),(0,A.jsxs)(`select`,{onChange:e=>U(`owner`,e.currentTarget.value),value:B.owner,children:[(0,A.jsx)(`option`,{value:`all`,children:`Anyone`}),B.owner!==`all`&&!oe?(0,A.jsx)(`option`,{value:B.owner,children:se?.name??`Owner …${B.owner.slice(-6)}`}):null,V.state.ownerOptions.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId)),V.state.ownerOptionsTruncated?(0,A.jsx)(`option`,{disabled:!0,children:`More owners not shown`}):null]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Type`}),(0,A.jsxs)(`select`,{onChange:e=>U(`type`,e.currentTarget.value),value:B.type,children:[(0,A.jsx)(`option`,{value:`all`,children:`All types`}),P.map(e=>(0,A.jsx)(`option`,{value:e,children:K(e)},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Status`}),(0,A.jsxs)(`select`,{onChange:e=>U(`status`,e.currentTarget.value),value:B.status,children:[(0,A.jsx)(`option`,{value:`all`,children:`Any status`}),(0,A.jsx)(`option`,{value:`active`,children:`Active`}),(0,A.jsx)(`option`,{value:`done`,children:`Done`}),(0,A.jsx)(`option`,{value:`failed`,children:`Needs attention`})]})]})]}),X===null?null:Z===null?(0,A.jsx)(`div`,{id:`item-details`,children:(0,A.jsx)(s,{action:(0,A.jsx)(o,{onClick:$,children:`Back to items`}),description:`This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.`,title:`Item unavailable`,tone:`caution`})}):(0,A.jsxs)(g,{as:`section`,className:k.selection,id:`item-details`,padding:`spacious`,tone:`secondary`,children:[(0,A.jsxs)(`div`,{className:k.selectionHeader,children:[(0,A.jsx)(m,{service:Z.service,size:`compact`}),(0,A.jsx)(c,{label:Z.status,size:`compact`,tone:Z.tone})]}),(0,A.jsxs)(h,{as:`p`,tone:`secondary`,variant:`label`,children:[Z.key,` · `,K(Z.kind)]}),(0,A.jsx)(h,{as:`h2`,variant:`section-title`,children:Z.title}),(0,A.jsx)(h,{tone:`secondary`,variant:`body-large`,children:q(Z)}),(0,A.jsx)(W,{item:Z}),Q===null?null:(0,A.jsx)(N,{currentPersonId:Q,entityId:Z.entityId,grantees:V.state.ownerOptions,workspaceId:l.workspaceId,...e===void 0?{}:{transport:e}},Z.entityId),(0,A.jsxs)(`div`,{className:k.selectionActions,children:[(0,A.jsx)(`div`,{className:k.membershipChoices,children:Z.routableReleaseIds.map(e=>{let t=D.get(e);return(0,A.jsxs)(f,{state:x(l.workspaceId,e,S(_)),to:E(l.workspaceId,e,Z.entityId),children:[`Open `,t===void 0?`release ${e.slice(-6)}`:t.relay.codename,t===void 0?null:(0,A.jsx)(`span`,{children:t.version})]},e)})}),(0,A.jsx)(o,{onClick:$,children:`Back to items`})]})]}),(0,A.jsxs)(`div`,{className:k.resultHeading,id:`results`,children:[(0,A.jsxs)(h,{as:`h2`,variant:`section-title`,children:[V.state.matchedCount,` of `,V.state.totalCount,` workspace items`]}),(0,A.jsx)(c,{label:V.state.refreshing?`Updating results`:V.state.truncated?`Bounded workspace result`:`Workspace scope`,size:`compact`,tone:V.state.truncated&&!V.state.refreshing?`caution`:`neutral`})]}),Y.length===0?(0,A.jsx)(s,{action:(0,A.jsx)(o,{onClick:()=>H(new URLSearchParams),children:`Clear filters`}),description:`Try a broader word, owner, service, type, or status. No demo object is substituted.`,title:`No matching items`}):(0,A.jsx)(`div`,{className:k.items,children:Y.map(e=>(0,A.jsxs)(g,{as:`article`,className:k.item,padding:`none`,tone:`secondary`,children:[(0,A.jsx)(m,{service:e.service,size:`compact`}),(0,A.jsxs)(f,{className:k.itemLink,onClick:t=>{ne(t,t.currentTarget.target)&&re(_,e.href)},state:T(_.state,l.workspaceId,e.entityId,w(_)),to:e.href,children:[(0,A.jsx)(`span`,{children:e.key}),(0,A.jsx)(`strong`,{children:e.title})]}),(0,A.jsxs)(`div`,{className:k.meta,children:[(0,A.jsx)(c,{label:e.status,size:`compact`,tone:e.tone}),(0,A.jsx)(`span`,{children:K(e.kind)}),(0,A.jsx)(`span`,{children:e.releaseIds.length===0?`Unlinked`:`${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`}`}),(0,A.jsx)(W,{item:e}),(0,A.jsx)(`time`,{dateTime:e.freshness,title:`Synchronized ${e.freshness}`,children:L(e.freshness)})]}),Q===null?null:(0,A.jsx)(f,{className:k.shareLink,to:z(_.pathname,y,e.entityId),children:`Share`})]},e.entityId))})]})};export{J as ItemsPage,U as filterWorkspaceItems,L as formatItemFreshness,R as itemsLocationWithSearch,G as selectWorkspaceItem,z as unlinkedItemLocation,q as workspaceItemMembershipDescription};
2
- //# sourceMappingURL=ItemsPage-BzinDuxs.js.map
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-Cvdyeg_0.js";import{p as n,s as r,u as i}from"./hooks-CGvBGjhq.js";import{a,d as o,r as s,v as c}from"./Dialog-_t9OodCK-CzkLh9VB.js";import{t as l}from"./jsx-runtime-NZYk81nU.js";import{E as u,b as d,w as f}from"./index-DlDEYM2e.js";import{n as p,y as m}from"./patterns-CJ4c7F5A.js";import{n as h,t as g}from"./primitives-Dj-qYrUZ-BIf5RLs4.js";import{$t as _,Oa as v,Wr as y,qn as b}from"./agent-api-0YXZd1ag.js";import{i as x,o as S}from"./releaseRoutes-Bpw_kfZI.js";import{PortfolioOverviewView as C}from"./PortfolioOverview-C0RZCx6V.js";import{n as w,r as T}from"./workspaceEntityRoutes-Cc_RtLvy.js";import{a as E}from"./presentWorkspaceItems-Cd0qEwW1.js";import{n as ee,t as te}from"./useWorkspaceItems-BROb2PDr.js";import{n as ne,t as re}from"./workspaceScrollCapture-Dg3Pebh8.js";import{t as D}from"./authorizedShareTransport-xJy2K3un.js";import{n as ie}from"./ReleaseWorkset-DGufwIFe.js";var O=e(t(),1),k={page:`_page_wg828_1`,hero:`_hero_wg828_2`,filters:`_filters_wg828_3`,items:`_items_wg828_4`,item:`_item_wg828_4`,itemLink:`_itemLink_wg828_6`,meta:`_meta_wg828_7`,selection:`_selection_wg828_8`,membershipChoices:`_membershipChoices_wg828_54`,shareLink:`_shareLink_wg828_55`,resultHeading:`_resultHeading_wg828_60`,selectionHeader:`_selectionHeader_wg828_80`,selectionActions:`_selectionActions_wg828_81`,owners:`_owners_wg828_153`,ownerGroup:`_ownerGroup_wg828_157`,ownerLimit:`_ownerLimit_wg828_163`,shareForm:`_shareForm_wg828_181`,shareResult:`_shareResult_wg828_182`,search:`_search_wg828_242`},A=l(),j=e=>e===`hour`||e===`week`?e:`day`,M=(e,t)=>{let n=new Map;n.set(e,{displayName:`You`,personId:e});for(let e of t)n.set(e.personId,{displayName:e.displayName,personId:e.personId});return[...n.values()]},N=({currentPersonId:e,entityId:t,grantees:n,transport:r=D,workspaceId:i})=>{let a=(0,O.useMemo)(()=>M(e,n),[e,n]),[s,l]=(0,O.useState)(a[0]?.personId??e),[u,d]=(0,O.useState)(`day`),[p,m]=(0,O.useState)({_tag:`idle`}),h=(0,O.useRef)(null),v=(0,O.useRef)(null),b=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>v.current?.abort(),[]),(0,O.useEffect)(()=>{(p._tag===`ready`||p._tag===`revoked`)&&b.current?.focus()},[p._tag]);let x=e=>{e.preventDefault(),v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`creating`});let i=h.current;(i!==null&&i.entityId===t&&i.granteePersonId===s&&i.lifetime===u?Promise.resolve(i):r.prepareCreate({entityId:t,granteePersonId:s,lifetime:u}).then(e=>(h.current=e,e))).then(e=>r.create(e,n.signal)).then(e=>{if(n.signal.aborted)return;let t=h.current;if(t===null||e.shareId!==t.shareId||e.entityId!==t.entityId||e.granteePersonId!==t.granteePersonId){m({_tag:`failed`});return}if(e.revokedAt!==null){m({_tag:`revoked`});return}m({_tag:`ready`,shareId:e.shareId,expiresAt:y(e.expiresAt)})},()=>{n.signal.aborted||m({_tag:`failed`})})},S=(e,t)=>{v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`revoking`,shareId:e,expiresAt:t}),r.revoke(i,e,n.signal).then(()=>{n.signal.aborted||m({_tag:`revoked`})},()=>{n.signal.aborted||m({_tag:`ready`,shareId:e,expiresAt:t})})},C=e=>{h.current=null,l(_.make(e))},w=e=>{h.current=null,d(j(e))},T=()=>{h.current=null,m({_tag:`idle`})};if(p._tag===`ready`||p._tag===`revoking`){let e=`/shares/${i}/${p.shareId}`;return(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:b,role:`status`,tabIndex:-1,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(g,{as:`h3`,variant:`body-large`,children:`Authorized link ready`}),(0,A.jsxs)(g,{tone:`secondary`,children:[`Only the selected person can open this exact item. Expires `,p.expiresAt,`.`]})]}),(0,A.jsx)(f,{to:e,children:e}),(0,A.jsx)(o,{disabled:p._tag===`revoking`,onClick:()=>S(p.shareId,p.expiresAt),children:p._tag===`revoking`?`Revoking…`:`Revoke link`})]})}return p._tag===`revoked`?(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:b,role:`status`,tabIndex:-1,children:[(0,A.jsx)(c,{label:`Revoked`,size:`compact`,tone:`neutral`}),(0,A.jsx)(g,{tone:`secondary`,children:`This link no longer resolves.`}),(0,A.jsx)(o,{onClick:T,children:`Create another`})]}):(0,A.jsxs)(`form`,{className:k.shareForm,onSubmit:x,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(g,{as:`h3`,variant:`body-large`,children:`Share this exact item`}),(0,A.jsx)(g,{tone:`secondary`,children:`Authenticated access only. Related releases and relationships stay private.`})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Person`}),(0,A.jsx)(`select`,{disabled:p._tag===`creating`,onChange:e=>C(e.currentTarget.value),value:s,children:a.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId))})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Expires`}),(0,A.jsxs)(`select`,{disabled:p._tag===`creating`,onChange:e=>w(e.currentTarget.value),value:u,children:[(0,A.jsx)(`option`,{value:`hour`,children:`In 1 hour`}),(0,A.jsx)(`option`,{value:`day`,children:`In 1 day`}),(0,A.jsx)(`option`,{value:`week`,children:`In 7 days`})]})]}),(0,A.jsx)(o,{disabled:p._tag===`creating`,type:`submit`,children:p._tag===`creating`?`Creating…`:`Create authorized link`}),p._tag===`failed`?(0,A.jsx)(g,{role:`alert`,tone:`secondary`,children:`Could not create the link. Check the person and try again.`}):null]})},P=[`issue`,`pull-request`,`page`,`pipeline-execution`,`deployment`,`time-entry`],F=[`jira`,`codecommit`,`confluence`,`codepipeline`,`clockify`],I=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),L=e=>I.format(Date.parse(e)),R=(e,t)=>({hash:e.hash,pathname:e.pathname,search:t.size===0?``:`?${t.toString()}`}),z=(e,t,n)=>{let r=new URLSearchParams(t);return r.set(`object`,n),{hash:`#item-details`,pathname:e,search:`?${r.toString()}`}},B=e=>P.find(t=>t===e)??`all`,V=e=>e===`active`||e===`done`||e===`failed`?e:`all`,H=e=>{let t=b(_)(e);return v(t)?t.value:`all`},ae=e=>({owner:H(e.get(`owner`)),query:e.get(`q`)?.trim()??``,service:F.find(t=>t===e.get(`service`))??`all`,status:V(e.get(`status`)),type:B(e.get(`type`))}),U=(e,t)=>{let n=t.query.toLocaleLowerCase(`en-US`);return e.filter(e=>(n.length===0||`${e.key} ${e.title} ${e.status}`.toLocaleLowerCase(`en-US`).includes(n))&&(t.service===`all`||e.service===t.service)&&(t.owner===`all`||e.owners.some(({id:e})=>e===t.owner))&&(t.status===`all`||e.statusGroup===t.status)&&(t.type===`all`||e.kind===t.type))},W=({item:e})=>{let[t,n]=(0,O.useState)(!1);return e.owners.length===0?(0,A.jsx)(`span`,{children:`Unassigned`}):(0,A.jsxs)(`span`,{className:k.ownerGroup,children:[(0,A.jsx)(p,{"aria-label":`${e.key} collaborators${e.ownersTruncated?`, more collaborators not shown`:``}`,className:k.owners,expanded:t,limit:2,onExpandedChange:n,people:e.owners,size:`compact`}),e.ownersTruncated?(0,A.jsx)(`span`,{className:k.ownerLimit,children:`20+ people · More not shown`}):null]})},G=(e,t)=>t===null?null:e.find(e=>e.entityId===t)??null,K=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),q=e=>e.releaseIds.length===0?`This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.`:e.routableReleaseIds.length===0?`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`:e.releaseIds.length===1?`This object is linked to one release and can be opened in its complete delivery context.`:`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} releases. Choose the exact release context to avoid silently substituting another delivery trace.`,J=({shareTransport:e,transport:t=te}={})=>{let l=n(),p=d(),_=r(),v=i(),[y]=u(),b=l.controller.state._tag===`ready`?l.controller.state.portfolio:null,D=(0,O.useMemo)(()=>new Map(b?.releases.map(e=>[e.id,e])??[]),[b]),j=(0,O.useMemo)(()=>new Set(b?.releases.map(({id:e})=>e)??[]),[b]),M=l.controller.state._tag===`ready`?l.controller.state.portfolio.generatedAt:`pending`,I=ie(p.state),B=ae(y),V=ee(l.workspaceId,j,B,M,I,p.invalidateSession,t),H=e=>{v(R(_,e),{replace:!0})},U=(e,t)=>{let n=new URLSearchParams(y);t.length===0||t===`all`?n.delete(e===`query`?`q`:e):n.set(e===`query`?`q`:e,t),H(n)},J=l.controller.state._tag===`ready`?I===null?{_tag:`session`,reason:p.state._tag===`authenticated`?`checking`:p.state._tag}:null:l.controller.state;if(J?._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(J!==null)return(0,A.jsx)(C,{onPreviewRelease:()=>void 0,onRetry:l.controller.onRetry,state:J});if(V.state._tag===`idle`||V.state._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(V.state._tag===`failed`)return(0,A.jsx)(s,{action:(0,A.jsx)(o,{onClick:V.retry,children:`Try again`}),description:`Control Center could not read the normalized delivery index. Saved source facts remain unchanged.`,title:`Items unavailable`,tone:`caution`});let Y=V.state.items,oe=B.owner===`all`||V.state.ownerOptions.some(({personId:e})=>e===B.owner),se=B.owner===`all`?void 0:V.state.items.flatMap(({owners:e})=>e).find(({id:e})=>e===B.owner),X=y.get(`object`),Z=G(V.state.items,X),Q=p.state._tag===`authenticated`&&p.state.session.permission===`workspace-owner`&&p.state.session.actor._tag===`human`?p.state.session.actor.personId:null,$=()=>{let e=new URLSearchParams(y);e.delete(`object`),v({hash:`#results`,pathname:_.pathname,search:e.size===0?``:`?${e.toString()}`},{replace:!0})};return(0,A.jsxs)(`article`,{className:k.page,children:[(0,A.jsxs)(`header`,{className:k.hero,children:[(0,A.jsx)(g,{as:`p`,tone:`secondary`,variant:`label`,children:`Workspace items`}),(0,A.jsx)(g,{as:`h1`,variant:`verdict`,children:`Find release work.`}),(0,A.jsx)(g,{tone:`secondary`,variant:`body-large`,children:`One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.`})]}),(0,A.jsxs)(`section`,{"aria-label":`Item filters`,className:k.filters,children:[(0,A.jsxs)(`label`,{className:k.search,children:[(0,A.jsx)(`span`,{children:`Search`}),(0,A.jsx)(`input`,{maxLength:200,onChange:e=>U(`query`,e.currentTarget.value),placeholder:`Key, title, or status`,type:`search`,value:B.query})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Service`}),(0,A.jsxs)(`select`,{onChange:e=>U(`service`,e.currentTarget.value),value:B.service,children:[(0,A.jsx)(`option`,{value:`all`,children:`All services`}),F.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Owner`}),(0,A.jsxs)(`select`,{onChange:e=>U(`owner`,e.currentTarget.value),value:B.owner,children:[(0,A.jsx)(`option`,{value:`all`,children:`Anyone`}),B.owner!==`all`&&!oe?(0,A.jsx)(`option`,{value:B.owner,children:se?.name??`Owner …${B.owner.slice(-6)}`}):null,V.state.ownerOptions.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId)),V.state.ownerOptionsTruncated?(0,A.jsx)(`option`,{disabled:!0,children:`More owners not shown`}):null]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Type`}),(0,A.jsxs)(`select`,{onChange:e=>U(`type`,e.currentTarget.value),value:B.type,children:[(0,A.jsx)(`option`,{value:`all`,children:`All types`}),P.map(e=>(0,A.jsx)(`option`,{value:e,children:K(e)},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Status`}),(0,A.jsxs)(`select`,{onChange:e=>U(`status`,e.currentTarget.value),value:B.status,children:[(0,A.jsx)(`option`,{value:`all`,children:`Any status`}),(0,A.jsx)(`option`,{value:`active`,children:`Active`}),(0,A.jsx)(`option`,{value:`done`,children:`Done`}),(0,A.jsx)(`option`,{value:`failed`,children:`Needs attention`})]})]})]}),X===null?null:Z===null?(0,A.jsx)(`div`,{id:`item-details`,children:(0,A.jsx)(s,{action:(0,A.jsx)(o,{onClick:$,children:`Back to items`}),description:`This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.`,title:`Item unavailable`,tone:`caution`})}):(0,A.jsxs)(h,{as:`section`,className:k.selection,id:`item-details`,padding:`spacious`,tone:`secondary`,children:[(0,A.jsxs)(`div`,{className:k.selectionHeader,children:[(0,A.jsx)(m,{service:Z.service,size:`compact`}),(0,A.jsx)(c,{label:Z.status,size:`compact`,tone:Z.tone})]}),(0,A.jsxs)(g,{as:`p`,tone:`secondary`,variant:`label`,children:[Z.key,` · `,K(Z.kind)]}),(0,A.jsx)(g,{as:`h2`,variant:`section-title`,children:Z.title}),(0,A.jsx)(g,{tone:`secondary`,variant:`body-large`,children:q(Z)}),(0,A.jsx)(W,{item:Z}),Q===null?null:(0,A.jsx)(N,{currentPersonId:Q,entityId:Z.entityId,grantees:V.state.ownerOptions,workspaceId:l.workspaceId,...e===void 0?{}:{transport:e}},Z.entityId),(0,A.jsxs)(`div`,{className:k.selectionActions,children:[(0,A.jsx)(`div`,{className:k.membershipChoices,children:Z.routableReleaseIds.map(e=>{let t=D.get(e);return(0,A.jsxs)(f,{state:x(l.workspaceId,e,S(_)),to:E(l.workspaceId,e,Z.entityId),children:[`Open `,t===void 0?`release ${e.slice(-6)}`:t.relay.codename,t===void 0?null:(0,A.jsx)(`span`,{children:t.version})]},e)})}),(0,A.jsx)(o,{onClick:$,children:`Back to items`})]})]}),(0,A.jsxs)(`div`,{className:k.resultHeading,id:`results`,children:[(0,A.jsxs)(g,{as:`h2`,variant:`section-title`,children:[V.state.matchedCount,` of `,V.state.totalCount,` workspace items`]}),(0,A.jsx)(c,{label:V.state.refreshing?`Updating results`:V.state.truncated?`Bounded workspace result`:`Workspace scope`,size:`compact`,tone:V.state.truncated&&!V.state.refreshing?`caution`:`neutral`})]}),Y.length===0?(0,A.jsx)(s,{action:(0,A.jsx)(o,{onClick:()=>H(new URLSearchParams),children:`Clear filters`}),description:`Try a broader word, owner, service, type, or status. No demo object is substituted.`,title:`No matching items`}):(0,A.jsx)(`div`,{className:k.items,children:Y.map(e=>(0,A.jsxs)(h,{as:`article`,className:k.item,padding:`none`,tone:`secondary`,children:[(0,A.jsx)(m,{service:e.service,size:`compact`}),(0,A.jsxs)(f,{className:k.itemLink,onClick:t=>{ne(t,t.currentTarget.target)&&re(_,e.href)},state:T(_.state,l.workspaceId,e.entityId,w(_)),to:e.href,children:[(0,A.jsx)(`span`,{children:e.key}),(0,A.jsx)(`strong`,{children:e.title})]}),(0,A.jsxs)(`div`,{className:k.meta,children:[(0,A.jsx)(c,{label:e.status,size:`compact`,tone:e.tone}),(0,A.jsx)(`span`,{children:K(e.kind)}),(0,A.jsx)(`span`,{children:e.releaseIds.length===0?`Unlinked`:`${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`}`}),(0,A.jsx)(W,{item:e}),(0,A.jsx)(`time`,{dateTime:e.freshness,title:`Synchronized ${e.freshness}`,children:L(e.freshness)})]}),Q===null?null:(0,A.jsx)(f,{className:k.shareLink,to:z(_.pathname,y,e.entityId),children:`Share`})]},e.entityId))})]})};export{J as ItemsPage,U as filterWorkspaceItems,L as formatItemFreshness,R as itemsLocationWithSearch,G as selectWorkspaceItem,z as unlinkedItemLocation,q as workspaceItemMembershipDescription};
2
+ //# sourceMappingURL=ItemsPage-CYmo7Dkm.js.map