@knpkv/control-center 0.10.3 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/dist/client/.vite/manifest.json +406 -406
  2. package/dist/client/assets/{ActiveWorkPage-DJbMyFnV.js → ActiveWorkPage-DK9ucRgq.js} +2 -2
  3. package/dist/client/assets/{ActiveWorkPage-DJbMyFnV.js.map → ActiveWorkPage-DK9ucRgq.js.map} +1 -1
  4. package/dist/client/assets/{AgentPage-CkoowYNN.js → AgentPage-DiaRhWH4.js} +2 -2
  5. package/dist/client/assets/{AgentPage-CkoowYNN.js.map → AgentPage-DiaRhWH4.js.map} +1 -1
  6. package/dist/client/assets/{AtlassianOAuthCallbackPage-i2zdrAW9.js → AtlassianOAuthCallbackPage-B00yNx-2.js} +2 -2
  7. package/dist/client/assets/{AtlassianOAuthCallbackPage-i2zdrAW9.js.map → AtlassianOAuthCallbackPage-B00yNx-2.js.map} +1 -1
  8. package/dist/client/assets/{AuthorizedSharePage-BKRFQEW5.js → AuthorizedSharePage-BJM10BAd.js} +2 -2
  9. package/dist/client/assets/{AuthorizedSharePage-BKRFQEW5.js.map → AuthorizedSharePage-BJM10BAd.js.map} +1 -1
  10. package/dist/client/assets/{BrowserSessionHydrator-DsrYOye8.js → BrowserSessionHydrator-Bm8F4Ctu.js} +2 -2
  11. package/dist/client/assets/{BrowserSessionHydrator-DsrYOye8.js.map → BrowserSessionHydrator-Bm8F4Ctu.js.map} +1 -1
  12. package/dist/client/assets/{CommandSearch-B3ogcxH6.js → CommandSearch-BxAJW0LJ.js} +2 -2
  13. package/dist/client/assets/{CommandSearch-B3ogcxH6.js.map → CommandSearch-BxAJW0LJ.js.map} +1 -1
  14. package/dist/client/assets/{ItemsPage-C8Kvj_hC.js → ItemsPage-DkKQR0qC.js} +2 -2
  15. package/dist/client/assets/{ItemsPage-C8Kvj_hC.js.map → ItemsPage-DkKQR0qC.js.map} +1 -1
  16. package/dist/client/assets/{OpenPullRequestPage-CdKHYk5U.js → OpenPullRequestPage-BXQFgiq0.js} +2 -2
  17. package/dist/client/assets/{OpenPullRequestPage-CdKHYk5U.js.map → OpenPullRequestPage-BXQFgiq0.js.map} +1 -1
  18. package/dist/client/assets/{Pages-_Z_n1J6R.js → Pages-DlF3u5xB.js} +2 -2
  19. package/dist/client/assets/{Pages-_Z_n1J6R.js.map → Pages-DlF3u5xB.js.map} +1 -1
  20. package/dist/client/assets/{PairPage-BEMXhRqa.js → PairPage-CKINCdoy.js} +2 -2
  21. package/dist/client/assets/{PairPage-BEMXhRqa.js.map → PairPage-CKINCdoy.js.map} +1 -1
  22. package/dist/client/assets/{PortfolioOverview-k2woweJX.js → PortfolioOverview-ajQK-ZVn.js} +2 -2
  23. package/dist/client/assets/{PortfolioOverview-k2woweJX.js.map → PortfolioOverview-ajQK-ZVn.js.map} +1 -1
  24. package/dist/client/assets/{PullRequestReviewPanel-BZ9gJ9do.js → PullRequestReviewPanel-CUiPHp33.js} +4 -4
  25. package/dist/client/assets/{PullRequestReviewPanel-BZ9gJ9do.js.map → PullRequestReviewPanel-CUiPHp33.js.map} +1 -1
  26. package/dist/client/assets/{ReleaseRoute-D5Mrpp8w.js → ReleaseRoute-Dccsofss.js} +2 -2
  27. package/dist/client/assets/ReleaseRoute-Dccsofss.js.map +1 -0
  28. package/dist/client/assets/{ReleaseWorkset-idMU3iUy.js → ReleaseWorkset-CpploDSa.js} +2 -2
  29. package/dist/client/assets/{ReleaseWorkset-idMU3iUy.js.map → ReleaseWorkset-CpploDSa.js.map} +1 -1
  30. package/dist/client/assets/{ReviewSuggestionOverview-sS1HGbOF.js → ReviewSuggestionOverview-C0gKrq0N.js} +2 -2
  31. package/dist/client/assets/{ReviewSuggestionOverview-sS1HGbOF.js.map → ReviewSuggestionOverview-C0gKrq0N.js.map} +1 -1
  32. package/dist/client/assets/{ReviewSuggestionPublicationSurface-CIUTjuOD.js → ReviewSuggestionPublicationSurface-B485cO3v.js} +2 -2
  33. package/dist/client/assets/{ReviewSuggestionPublicationSurface-CIUTjuOD.js.map → ReviewSuggestionPublicationSurface-B485cO3v.js.map} +1 -1
  34. package/dist/client/assets/{ServicesPage-C2sELVLy.js → ServicesPage-DxMDCBRr.js} +2 -2
  35. package/dist/client/assets/{ServicesPage-C2sELVLy.js.map → ServicesPage-DxMDCBRr.js.map} +1 -1
  36. package/dist/client/assets/{TimelinePage-5BEpQPra.js → TimelinePage-BzvR1pQi.js} +2 -2
  37. package/dist/client/assets/{TimelinePage-5BEpQPra.js.map → TimelinePage-BzvR1pQi.js.map} +1 -1
  38. package/dist/client/assets/{WorkspaceEntityLink-w0WA7xRO.js → WorkspaceEntityLink-DOOjBPKo.js} +2 -2
  39. package/dist/client/assets/{WorkspaceEntityLink-w0WA7xRO.js.map → WorkspaceEntityLink-DOOjBPKo.js.map} +1 -1
  40. package/dist/client/assets/{WorkspaceEntityRoute-BpO38Ge1.js → WorkspaceEntityRoute-HkedzU2L.js} +4 -4
  41. package/dist/client/assets/{WorkspaceEntityRoute-BpO38Ge1.js.map → WorkspaceEntityRoute-HkedzU2L.js.map} +1 -1
  42. package/dist/client/assets/{WorkspaceHomeLink-Xl8GvzFw.js → WorkspaceHomeLink-Dn-m2Xhv.js} +2 -2
  43. package/dist/client/assets/{WorkspaceHomeLink-Xl8GvzFw.js.map → WorkspaceHomeLink-Dn-m2Xhv.js.map} +1 -1
  44. package/dist/client/assets/{WorkspacePullRequestDetails-COZdOIOb.js → WorkspacePullRequestDetails-DuIuN53U.js} +3 -3
  45. package/dist/client/assets/{WorkspacePullRequestDetails-COZdOIOb.js.map → WorkspacePullRequestDetails-DuIuN53U.js.map} +1 -1
  46. package/dist/client/assets/{WorkspaceReleaseLayout-D__SEsHt.js → WorkspaceReleaseLayout-CmOYomjP.js} +2 -2
  47. package/dist/client/assets/{WorkspaceReleaseLayout-D__SEsHt.js.map → WorkspaceReleaseLayout-CmOYomjP.js.map} +1 -1
  48. package/dist/client/assets/{WorkspaceSettingsPage-D-0O9-41.js → WorkspaceSettingsPage-Co6JSDzD.js} +2 -2
  49. package/dist/client/assets/{WorkspaceSettingsPage-D-0O9-41.js.map → WorkspaceSettingsPage-Co6JSDzD.js.map} +1 -1
  50. package/dist/client/assets/{angular-html-B-gwpVlh-BRbhVJ6Y.js → angular-html-B-gwpVlh-Bgrt633l.js} +2 -2
  51. package/dist/client/assets/{angular-html-B-gwpVlh-BRbhVJ6Y.js.map → angular-html-B-gwpVlh-Bgrt633l.js.map} +1 -1
  52. package/dist/client/assets/{angular-ts-BdaH9qH_-CreuaMKb.js → angular-ts-BdaH9qH_-BkPrletd.js} +2 -2
  53. package/dist/client/assets/{angular-ts-BdaH9qH_-CreuaMKb.js.map → angular-ts-BdaH9qH_-BkPrletd.js.map} +1 -1
  54. package/dist/client/assets/{apl-BLTDDucx-E9crm-GK.js → apl-BLTDDucx-wY4O_74Y.js} +2 -2
  55. package/dist/client/assets/{apl-BLTDDucx-E9crm-GK.js.map → apl-BLTDDucx-wY4O_74Y.js.map} +1 -1
  56. package/dist/client/assets/{astro-CM3EIsEH-DpNG08M6.js → astro-CM3EIsEH-D7flgJwH.js} +2 -2
  57. package/dist/client/assets/{astro-CM3EIsEH-DpNG08M6.js.map → astro-CM3EIsEH-D7flgJwH.js.map} +1 -1
  58. package/dist/client/assets/{blade-BuLZ1b4i-s07PULYH.js → blade-BuLZ1b4i-qswDnG1D.js} +2 -2
  59. package/dist/client/assets/{blade-BuLZ1b4i-s07PULYH.js.map → blade-BuLZ1b4i-qswDnG1D.js.map} +1 -1
  60. package/dist/client/assets/{c-BOe7FNWg-PrQjeFQ3.js → c-BOe7FNWg-9K6ZU3yU.js} +2 -2
  61. package/dist/client/assets/{c-BOe7FNWg-PrQjeFQ3.js.map → c-BOe7FNWg-9K6ZU3yU.js.map} +1 -1
  62. package/dist/client/assets/{chapel-DS426I0C-DB9jZ2L5.js → chapel-DS426I0C-D7P1_fn5.js} +2 -2
  63. package/dist/client/assets/{chapel-DS426I0C-DB9jZ2L5.js.map → chapel-DS426I0C-D7P1_fn5.js.map} +1 -1
  64. package/dist/client/assets/{cobol-D88xw2SU-C4G8uiv_.js → cobol-D88xw2SU-BeZ5JZSl.js} +2 -2
  65. package/dist/client/assets/{cobol-D88xw2SU-C4G8uiv_.js.map → cobol-D88xw2SU-BeZ5JZSl.js.map} +1 -1
  66. package/dist/client/assets/{coffee-9O-pYXz5-BZexwMqx.js → coffee-9O-pYXz5-CB0EJ1nc.js} +2 -2
  67. package/dist/client/assets/{coffee-9O-pYXz5-BZexwMqx.js.map → coffee-9O-pYXz5-CB0EJ1nc.js.map} +1 -1
  68. package/dist/client/assets/{controlCenterRelayDock-CyvFJBSX.js → controlCenterRelayDock-Duxhij28.js} +3 -3
  69. package/dist/client/assets/{controlCenterRelayDock-CyvFJBSX.js.map → controlCenterRelayDock-Duxhij28.js.map} +1 -1
  70. package/dist/client/assets/{controlCenterRelayDockChrome-LsVvlXRh.js → controlCenterRelayDockChrome-8SmLWAq4.js} +2 -2
  71. package/dist/client/assets/{controlCenterRelayDockChrome-LsVvlXRh.js.map → controlCenterRelayDockChrome-8SmLWAq4.js.map} +1 -1
  72. package/dist/client/assets/{cpp-CPk7VU6o-lNmTk_pG.js → cpp-CPk7VU6o-hQ9MAV3y.js} +2 -2
  73. package/dist/client/assets/{cpp-CPk7VU6o-lNmTk_pG.js.map → cpp-CPk7VU6o-hQ9MAV3y.js.map} +1 -1
  74. package/dist/client/assets/{crystal-CRftOMVe-BSooBDgS.js → crystal-CRftOMVe-DN_g4Upk.js} +2 -2
  75. package/dist/client/assets/{crystal-CRftOMVe-BSooBDgS.js.map → crystal-CRftOMVe-DN_g4Upk.js.map} +1 -1
  76. package/dist/client/assets/{css-DKjIhbA_-kkwCxkks.js → css-DKjIhbA_-CUnFG3ES.js} +2 -2
  77. package/dist/client/assets/{css-DKjIhbA_-kkwCxkks.js.map → css-DKjIhbA_-CUnFG3ES.js.map} +1 -1
  78. package/dist/client/assets/{diff-BvynzM0a.js → diff-Ci0yCkTU.js} +3 -3
  79. package/dist/client/assets/{diff-BvynzM0a.js.map → diff-Ci0yCkTU.js.map} +1 -1
  80. package/dist/client/assets/{edge-CZci3foK-DbjelmsF.js → edge-CZci3foK-Ctlg1YxQ.js} +2 -2
  81. package/dist/client/assets/{edge-CZci3foK-DbjelmsF.js.map → edge-CZci3foK-Ctlg1YxQ.js.map} +1 -1
  82. package/dist/client/assets/{elixir-BFbWRTPN-DGdecMQe.js → elixir-BFbWRTPN-cC1K9Ezq.js} +2 -2
  83. package/dist/client/assets/{elixir-BFbWRTPN-DGdecMQe.js.map → elixir-BFbWRTPN-cC1K9Ezq.js.map} +1 -1
  84. package/dist/client/assets/{elm-BFCSOEGh-B9BWZIGp.js → elm-BFCSOEGh-XnRYfTO2.js} +2 -2
  85. package/dist/client/assets/{elm-BFCSOEGh-B9BWZIGp.js.map → elm-BFCSOEGh-XnRYfTO2.js.map} +1 -1
  86. package/dist/client/assets/{erb-C0EkZJvn-BQCINe4O.js → erb-C0EkZJvn-Dzi6SH3N.js} +2 -2
  87. package/dist/client/assets/{erb-C0EkZJvn-BQCINe4O.js.map → erb-C0EkZJvn-Dzi6SH3N.js.map} +1 -1
  88. package/dist/client/assets/{git-rebase-DBDs07B2-BsUn_6wp.js → git-rebase-DBDs07B2-CPonOskG.js} +2 -2
  89. package/dist/client/assets/{git-rebase-DBDs07B2-BsUn_6wp.js.map → git-rebase-DBDs07B2-CPonOskG.js.map} +1 -1
  90. package/dist/client/assets/{glimmer-js-oqYt1Bty-DhwIdeuV.js → glimmer-js-oqYt1Bty-8uN_RGfs.js} +2 -2
  91. package/dist/client/assets/{glimmer-js-oqYt1Bty-DhwIdeuV.js.map → glimmer-js-oqYt1Bty-8uN_RGfs.js.map} +1 -1
  92. package/dist/client/assets/{glimmer-ts-CjmgbZTn-D--4KEri.js → glimmer-ts-CjmgbZTn-BbhdlUs3.js} +2 -2
  93. package/dist/client/assets/{glimmer-ts-CjmgbZTn-D--4KEri.js.map → glimmer-ts-CjmgbZTn-BbhdlUs3.js.map} +1 -1
  94. package/dist/client/assets/{glsl-BqUMGrwT-BugoDbsL.js → glsl-BqUMGrwT-BdC4EsWs.js} +2 -2
  95. package/dist/client/assets/{glsl-BqUMGrwT-BugoDbsL.js.map → glsl-BqUMGrwT-BdC4EsWs.js.map} +1 -1
  96. package/dist/client/assets/{graphql-CEJryLGF-CK33Sd2D.js → graphql-CEJryLGF-BRAA6O06.js} +2 -2
  97. package/dist/client/assets/{graphql-CEJryLGF-CK33Sd2D.js.map → graphql-CEJryLGF-BRAA6O06.js.map} +1 -1
  98. package/dist/client/assets/{hack-DwBIwaGr-BlHtHO90.js → hack-DwBIwaGr-BAtB0Umc.js} +2 -2
  99. package/dist/client/assets/{hack-DwBIwaGr-BlHtHO90.js.map → hack-DwBIwaGr-BAtB0Umc.js.map} +1 -1
  100. package/dist/client/assets/{haml-BgD6GFV2-Cn_7eMhf.js → haml-BgD6GFV2-Cc0uNVUI.js} +2 -2
  101. package/dist/client/assets/{haml-BgD6GFV2-Cn_7eMhf.js.map → haml-BgD6GFV2-Cc0uNVUI.js.map} +1 -1
  102. package/dist/client/assets/{handlebars-DAEAtsmp-Ddwvn7SX.js → handlebars-DAEAtsmp-DLsK2kOk.js} +2 -2
  103. package/dist/client/assets/{handlebars-DAEAtsmp-Ddwvn7SX.js.map → handlebars-DAEAtsmp-DLsK2kOk.js.map} +1 -1
  104. package/dist/client/assets/{html-B63qAdeQ-C8grXLcX.js → html-B63qAdeQ-BI2TthmT.js} +2 -2
  105. package/dist/client/assets/{html-B63qAdeQ-C8grXLcX.js.map → html-B63qAdeQ-BI2TthmT.js.map} +1 -1
  106. package/dist/client/assets/{html-derivative-DliF0Izh-eHtyKN9s.js → html-derivative-DliF0Izh-CMfd68Cg.js} +2 -2
  107. package/dist/client/assets/{html-derivative-DliF0Izh-eHtyKN9s.js.map → html-derivative-DliF0Izh-CMfd68Cg.js.map} +1 -1
  108. package/dist/client/assets/{http-BPdteiK2-tAvZYLK6.js → http-BPdteiK2-CX-IhbOk.js} +2 -2
  109. package/dist/client/assets/{http-BPdteiK2-tAvZYLK6.js.map → http-BPdteiK2-CX-IhbOk.js.map} +1 -1
  110. package/dist/client/assets/{hurl-y6bQoMbn-BGQBtGLU.js → hurl-y6bQoMbn-7mwJ2k07.js} +2 -2
  111. package/dist/client/assets/{hurl-y6bQoMbn-BGQBtGLU.js.map → hurl-y6bQoMbn-7mwJ2k07.js.map} +1 -1
  112. package/dist/client/assets/{index-BDOFEVxB.js → index-CyCO7dDM.js} +3 -3
  113. package/dist/client/assets/{index-BDOFEVxB.js.map → index-CyCO7dDM.js.map} +1 -1
  114. package/dist/client/assets/{index-DBsf6vDR.css → index-Dn0IKu62.css} +1 -1
  115. package/dist/client/assets/{java-HDTZqoJ--BjrQmsMC.js → java-HDTZqoJ--B9p-6FTD.js} +2 -2
  116. package/dist/client/assets/{java-HDTZqoJ--BjrQmsMC.js.map → java-HDTZqoJ--B9p-6FTD.js.map} +1 -1
  117. package/dist/client/assets/{javascript-B8-PXjxO-Bq-MMO25.js → javascript-B8-PXjxO-CxKVIkrE.js} +2 -2
  118. package/dist/client/assets/{javascript-B8-PXjxO-Bq-MMO25.js.map → javascript-B8-PXjxO-CxKVIkrE.js.map} +1 -1
  119. package/dist/client/assets/{jinja-Li2helwk-l0WFvHGY.js → jinja-Li2helwk-wiEfSEKd.js} +2 -2
  120. package/dist/client/assets/{jinja-Li2helwk-l0WFvHGY.js.map → jinja-Li2helwk-wiEfSEKd.js.map} +1 -1
  121. package/dist/client/assets/{jison-D4pd2L4r-DfaKq-VY.js → jison-D4pd2L4r-CdTHAA5K.js} +2 -2
  122. package/dist/client/assets/{jison-D4pd2L4r-DfaKq-VY.js.map → jison-D4pd2L4r-CdTHAA5K.js.map} +1 -1
  123. package/dist/client/assets/{json-CHeq_08V-DZfpiOP9.js → json-CHeq_08V-BaAxXEpC.js} +2 -2
  124. package/dist/client/assets/{json-CHeq_08V-DZfpiOP9.js.map → json-CHeq_08V-BaAxXEpC.js.map} +1 -1
  125. package/dist/client/assets/{jsx-CTDAtxCE-Zsgbxq22.js → jsx-CTDAtxCE-DqkBvJVQ.js} +2 -2
  126. package/dist/client/assets/{jsx-CTDAtxCE-Zsgbxq22.js.map → jsx-CTDAtxCE-DqkBvJVQ.js.map} +1 -1
  127. package/dist/client/assets/{julia-B8HGxjvO-LAG3JTya.js → julia-B8HGxjvO-BViJH-3Z.js} +2 -2
  128. package/dist/client/assets/{julia-B8HGxjvO-LAG3JTya.js.map → julia-B8HGxjvO-BViJH-3Z.js.map} +1 -1
  129. package/dist/client/assets/{just-C1IY8eCo-BbIdo5MA.js → just-C1IY8eCo-DyJ_BTeb.js} +2 -2
  130. package/dist/client/assets/{just-C1IY8eCo-BbIdo5MA.js.map → just-C1IY8eCo-DyJ_BTeb.js.map} +1 -1
  131. package/dist/client/assets/{latex-CWjLpLhK-46pD4fMG.js → latex-CWjLpLhK-DpCuHsze.js} +2 -2
  132. package/dist/client/assets/{latex-CWjLpLhK-46pD4fMG.js.map → latex-CWjLpLhK-DpCuHsze.js.map} +1 -1
  133. package/dist/client/assets/{liquid-DO0vm52w-Cy8GQMCW.js → liquid-DO0vm52w-CEF5fJp5.js} +2 -2
  134. package/dist/client/assets/{liquid-DO0vm52w-Cy8GQMCW.js.map → liquid-DO0vm52w-CEF5fJp5.js.map} +1 -1
  135. package/dist/client/assets/{lua-rOZn354j-Cbcfon72.js → lua-rOZn354j-CaHUiAfq.js} +2 -2
  136. package/dist/client/assets/{lua-rOZn354j-Cbcfon72.js.map → lua-rOZn354j-CaHUiAfq.js.map} +1 -1
  137. package/dist/client/assets/{marko-CiZdnOV9-CcFVdIL7.js → marko-CiZdnOV9-Brrk-_VN.js} +2 -2
  138. package/dist/client/assets/{marko-CiZdnOV9-CcFVdIL7.js.map → marko-CiZdnOV9-Brrk-_VN.js.map} +1 -1
  139. package/dist/client/assets/{mdc-D1ADfxGi-YqDuYoZm.js → mdc-D1ADfxGi-Co8KdHkR.js} +2 -2
  140. package/dist/client/assets/{mdc-D1ADfxGi-YqDuYoZm.js.map → mdc-D1ADfxGi-Co8KdHkR.js.map} +1 -1
  141. package/dist/client/assets/{nginx-8KXIzHX2-Bic9RPc2.js → nginx-8KXIzHX2-CEzGaPe_.js} +2 -2
  142. package/dist/client/assets/{nginx-8KXIzHX2-Bic9RPc2.js.map → nginx-8KXIzHX2-CEzGaPe_.js.map} +1 -1
  143. package/dist/client/assets/{nim-CbBDSJf5-BQ6kTMUg.js → nim-CbBDSJf5-whZa9TGm.js} +2 -2
  144. package/dist/client/assets/{nim-CbBDSJf5-BQ6kTMUg.js.map → nim-CbBDSJf5-whZa9TGm.js.map} +1 -1
  145. package/dist/client/assets/{org-BlnOvN6p-B_-wxUCO.js → org-BlnOvN6p-C-HBqFDh.js} +2 -2
  146. package/dist/client/assets/{org-BlnOvN6p-B_-wxUCO.js.map → org-BlnOvN6p-C-HBqFDh.js.map} +1 -1
  147. package/dist/client/assets/{patterns-Nc-ycn7Y.js → patterns-DsePY14f.js} +2 -2
  148. package/dist/client/assets/{patterns-Nc-ycn7Y.js.map → patterns-DsePY14f.js.map} +1 -1
  149. package/dist/client/assets/{perl-CntHWu4k-BuEQuG7U.js → perl-CntHWu4k-DLNYobup.js} +2 -2
  150. package/dist/client/assets/{perl-CntHWu4k-BuEQuG7U.js.map → perl-CntHWu4k-DLNYobup.js.map} +1 -1
  151. package/dist/client/assets/{php-VF06KE26-BliObRgA.js → php-VF06KE26-Dp4fuXKl.js} +2 -2
  152. package/dist/client/assets/{php-VF06KE26-BliObRgA.js.map → php-VF06KE26-Dp4fuXKl.js.map} +1 -1
  153. package/dist/client/assets/{primitives-CgvvYKjR-BnO9EmQf.js → primitives-Bd6WhE78-DyJtZKnH.js} +2 -2
  154. package/dist/client/assets/primitives-Bd6WhE78-DyJtZKnH.js.map +1 -0
  155. package/dist/client/assets/{pug-DeZwH1tK-DpL6DGEh.js → pug-DeZwH1tK-Bho3PjIQ.js} +2 -2
  156. package/dist/client/assets/{pug-DeZwH1tK-DpL6DGEh.js.map → pug-DeZwH1tK-Bho3PjIQ.js.map} +1 -1
  157. package/dist/client/assets/{pullRequestReviewThreadReplay-FCMFIIPG.js → pullRequestReviewThreadReplay-D-Gd3hoP.js} +2 -2
  158. package/dist/client/assets/{pullRequestReviewThreadReplay-FCMFIIPG.js.map → pullRequestReviewThreadReplay-D-Gd3hoP.js.map} +1 -1
  159. package/dist/client/assets/{qml-CQhAR2tt-Cjst7VAs.js → qml-CQhAR2tt-D1c_pknn.js} +2 -2
  160. package/dist/client/assets/{qml-CQhAR2tt-Cjst7VAs.js.map → qml-CQhAR2tt-D1c_pknn.js.map} +1 -1
  161. package/dist/client/assets/{r-CGShpgkr-BVeckCHF.js → r-CGShpgkr-C7bXpPjk.js} +2 -2
  162. package/dist/client/assets/{r-CGShpgkr-BVeckCHF.js.map → r-CGShpgkr-C7bXpPjk.js.map} +1 -1
  163. package/dist/client/assets/{razor-CgB2QCs6-Cd3_piVw.js → razor-CgB2QCs6-DhGc3RMt.js} +2 -2
  164. package/dist/client/assets/{razor-CgB2QCs6-Cd3_piVw.js.map → razor-CgB2QCs6-DhGc3RMt.js.map} +1 -1
  165. package/dist/client/assets/{regexp-go_CdRjx-CR2YSHZ1.js → regexp-go_CdRjx-CJ0kv0kL.js} +2 -2
  166. package/dist/client/assets/{regexp-go_CdRjx-CR2YSHZ1.js.map → regexp-go_CdRjx-CJ0kv0kL.js.map} +1 -1
  167. package/dist/client/assets/{releaseRoutes-DPwinWrO.js → releaseRoutes-cNpu7gsD.js} +2 -2
  168. package/dist/client/assets/{releaseRoutes-DPwinWrO.js.map → releaseRoutes-cNpu7gsD.js.map} +1 -1
  169. package/dist/client/assets/{rst-CbWMI8ou-DAnUZELh.js → rst-CbWMI8ou-QeegT2a0.js} +2 -2
  170. package/dist/client/assets/{rst-CbWMI8ou-DAnUZELh.js.map → rst-CbWMI8ou-QeegT2a0.js.map} +1 -1
  171. package/dist/client/assets/{ruby-DsGwIs06--OWGrZzF.js → ruby-DsGwIs06-zfezgkhT.js} +2 -2
  172. package/dist/client/assets/{ruby-DsGwIs06--OWGrZzF.js.map → ruby-DsGwIs06-zfezgkhT.js.map} +1 -1
  173. package/dist/client/assets/{sas-DjxN8J4Z-jVfbDYqr.js → sas-DjxN8J4Z-CnTs8n2C.js} +2 -2
  174. package/dist/client/assets/{sas-DjxN8J4Z-jVfbDYqr.js.map → sas-DjxN8J4Z-CnTs8n2C.js.map} +1 -1
  175. package/dist/client/assets/{scss-bkiiULjK-D2AbGytL.js → scss-bkiiULjK-XMjkwalx.js} +2 -2
  176. package/dist/client/assets/{scss-bkiiULjK-D2AbGytL.js.map → scss-bkiiULjK-XMjkwalx.js.map} +1 -1
  177. package/dist/client/assets/{shellscript-Cuh1SIPr-BiNPTO6b.js → shellscript-Cuh1SIPr-46XCCu2F.js} +2 -2
  178. package/dist/client/assets/{shellscript-Cuh1SIPr-BiNPTO6b.js.map → shellscript-Cuh1SIPr-46XCCu2F.js.map} +1 -1
  179. package/dist/client/assets/{shellsession-C4UOwxb7-kRylcT_R.js → shellsession-C4UOwxb7-BKA80XTI.js} +2 -2
  180. package/dist/client/assets/{shellsession-C4UOwxb7-kRylcT_R.js.map → shellsession-C4UOwxb7-BKA80XTI.js.map} +1 -1
  181. package/dist/client/assets/{soy-CeGFXpLT-C8n-t50V.js → soy-CeGFXpLT-Nlu0Kd5l.js} +2 -2
  182. package/dist/client/assets/{soy-CeGFXpLT-C8n-t50V.js.map → soy-CeGFXpLT-Nlu0Kd5l.js.map} +1 -1
  183. package/dist/client/assets/{sql-qDYmMTO1-CMujL9b5.js → sql-qDYmMTO1-D24X-mUh.js} +2 -2
  184. package/dist/client/assets/{sql-qDYmMTO1-CMujL9b5.js.map → sql-qDYmMTO1-D24X-mUh.js.map} +1 -1
  185. package/dist/client/assets/{stata-Dzus_rwP-xpTbStns.js → stata-Dzus_rwP-DJ7CmNSn.js} +2 -2
  186. package/dist/client/assets/{stata-Dzus_rwP-xpTbStns.js.map → stata-Dzus_rwP-DJ7CmNSn.js.map} +1 -1
  187. package/dist/client/assets/{surrealql-DmTrf8uR-C71726g6.js → surrealql-DmTrf8uR-C3LuBr-Y.js} +2 -2
  188. package/dist/client/assets/{surrealql-DmTrf8uR-C71726g6.js.map → surrealql-DmTrf8uR-C3LuBr-Y.js.map} +1 -1
  189. package/dist/client/assets/{svelte-CWlRonoS-Dsmgsl3p.js → svelte-CWlRonoS-B_ECcTzN.js} +2 -2
  190. package/dist/client/assets/{svelte-CWlRonoS-Dsmgsl3p.js.map → svelte-CWlRonoS-B_ECcTzN.js.map} +1 -1
  191. package/dist/client/assets/{templ-EuFg1gKs-Dlt8LDbj.js → templ-EuFg1gKs-ByAnUgBM.js} +2 -2
  192. package/dist/client/assets/{templ-EuFg1gKs-Dlt8LDbj.js.map → templ-EuFg1gKs-ByAnUgBM.js.map} +1 -1
  193. package/dist/client/assets/{tex-Cbbx1SXS-CGW7lVtU.js → tex-Cbbx1SXS-0Ywa__H_.js} +2 -2
  194. package/dist/client/assets/{tex-Cbbx1SXS-CGW7lVtU.js.map → tex-Cbbx1SXS-0Ywa__H_.js.map} +1 -1
  195. package/dist/client/assets/{ts-tags-DOHpIWV2-Cs4BupLU.js → ts-tags-DOHpIWV2-CuulTIKM.js} +2 -2
  196. package/dist/client/assets/{ts-tags-DOHpIWV2-Cs4BupLU.js.map → ts-tags-DOHpIWV2-CuulTIKM.js.map} +1 -1
  197. package/dist/client/assets/{tsx-DmRL3u_2-Br3tQc1n.js → tsx-DmRL3u_2-GCLpfMRQ.js} +2 -2
  198. package/dist/client/assets/{tsx-DmRL3u_2-Br3tQc1n.js.map → tsx-DmRL3u_2-GCLpfMRQ.js.map} +1 -1
  199. package/dist/client/assets/{twig-BzcHspK1-DTeHZkzh.js → twig-BzcHspK1-BaXWhuif.js} +2 -2
  200. package/dist/client/assets/{twig-BzcHspK1-DTeHZkzh.js.map → twig-BzcHspK1-BaXWhuif.js.map} +1 -1
  201. package/dist/client/assets/{typescript-BYTx4UxO-Ckgqgf_6.js → typescript-BYTx4UxO-D62Ug8gp.js} +2 -2
  202. package/dist/client/assets/{typescript-BYTx4UxO-Ckgqgf_6.js.map → typescript-BYTx4UxO-D62Ug8gp.js.map} +1 -1
  203. package/dist/client/assets/{typst-BrfC91e7-C5LPu314.js → typst-BrfC91e7-BqtmZjA2.js} +2 -2
  204. package/dist/client/assets/{typst-BrfC91e7-C5LPu314.js.map → typst-BrfC91e7-BqtmZjA2.js.map} +1 -1
  205. package/dist/client/assets/{useWorkspaceDefaultLanding-DwCv_p0F.js → useWorkspaceDefaultLanding-CNq5BmMV.js} +2 -2
  206. package/dist/client/assets/{useWorkspaceDefaultLanding-DwCv_p0F.js.map → useWorkspaceDefaultLanding-CNq5BmMV.js.map} +1 -1
  207. package/dist/client/assets/{vue-B92PIQFm-D2EcIWyt.js → vue-B92PIQFm-C54gWdwm.js} +2 -2
  208. package/dist/client/assets/{vue-B92PIQFm-D2EcIWyt.js.map → vue-B92PIQFm-C54gWdwm.js.map} +1 -1
  209. package/dist/client/assets/{vue-html-EDHI-aeE-Cu1z77i2.js → vue-html-EDHI-aeE-Cw2PnKOb.js} +2 -2
  210. package/dist/client/assets/{vue-html-EDHI-aeE-Cu1z77i2.js.map → vue-html-EDHI-aeE-Cw2PnKOb.js.map} +1 -1
  211. package/dist/client/assets/{vue-vine-CmMdgoEY-xSl0fRHe.js → vue-vine-CmMdgoEY-C9ayJcHX.js} +2 -2
  212. package/dist/client/assets/{vue-vine-CmMdgoEY-xSl0fRHe.js.map → vue-vine-CmMdgoEY-C9ayJcHX.js.map} +1 -1
  213. package/dist/client/assets/{workspaceEntityRoutes-DY6gXtOy.js → workspaceEntityRoutes-BYPBqjUZ.js} +2 -2
  214. package/dist/client/assets/{workspaceEntityRoutes-DY6gXtOy.js.map → workspaceEntityRoutes-BYPBqjUZ.js.map} +1 -1
  215. package/dist/client/assets/{workspaceScrollCapture-B4_xSwNQ.js → workspaceScrollCapture-u6lJbYGL.js} +2 -2
  216. package/dist/client/assets/{workspaceScrollCapture-B4_xSwNQ.js.map → workspaceScrollCapture-u6lJbYGL.js.map} +1 -1
  217. package/dist/client/assets/{xml-Bz9Nzp99-Dci4Wxub.js → xml-Bz9Nzp99-q2auRtdj.js} +2 -2
  218. package/dist/client/assets/{xml-Bz9Nzp99-Dci4Wxub.js.map → xml-Bz9Nzp99-q2auRtdj.js.map} +1 -1
  219. package/dist/client/assets/{xsl-D0pOnfMq-BJ-ZDrUM.js → xsl-D0pOnfMq-DV7XsD_5.js} +2 -2
  220. package/dist/client/assets/{xsl-D0pOnfMq-BJ-ZDrUM.js.map → xsl-D0pOnfMq-DV7XsD_5.js.map} +1 -1
  221. package/dist/client/assets/{yaml-DKDHNCIP-DhiHdxcC.js → yaml-DKDHNCIP-DSSGln5p.js} +2 -2
  222. package/dist/client/assets/{yaml-DKDHNCIP-DhiHdxcC.js.map → yaml-DKDHNCIP-DSSGln5p.js.map} +1 -1
  223. package/dist/client/index.html +2 -2
  224. package/package.json +9 -9
  225. package/dist/client/assets/ReleaseRoute-D5Mrpp8w.js.map +0 -1
  226. package/dist/client/assets/primitives-CgvvYKjR-BnO9EmQf.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AtlassianOAuthCallbackPage-i2zdrAW9.js","names":["Schema.isTrimmed","Schema.isNonEmpty","Schema.isMaxLength","useRef","useState","Schema.decodeUnknownResult","Result.isFailure","styles","StatePanel","Button","Text","Surface","__toESM","useNavigate","V","He","require_jsx_runtime","useSearchParams","useBrowserSession","ue","L","String","decodeUnknownResult","AtlassianOAuthGrantId","isTrimmed","isFailure","isNonEmpty","isMaxLength","atlassianOAuthSetupPath","atlassianOAuthRecoveryPath","browserConnectionTestTransport","readAtlassianOAuthSetupIntent","forgetAtlassianOAuthSetupIntent","import_react","require_react","AtlassianOAuthCallbackPage_module_default","import_jsx_runtime","AuthorizationCode","AtlassianOAuthCallbackPage","navigate","searchParams","setSearchParams","callbackGrantState","setupIntent","sessionState","state","setState","exchangeStarted","exchangeRequest","saveRequest","effectGeneration","generation","cleanup","grantId","code","exchange","transport","request","complete","cloudId","save","grant","profile","leaveCallback","site"],"sources":["../../../src/client/services/AtlassianOAuthCallbackPage.module.css","../../../src/client/services/AtlassianOAuthCallbackPage.tsx"],"sourcesContent":[".page {\n display: grid;\n gap: var(--rly-space-6);\n margin: 0 auto;\n max-width: 44rem;\n padding: var(--rly-space-8) var(--rly-space-4);\n}\n\n.heading,\n.sites {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.site {\n align-items: center;\n display: flex;\n gap: var(--rly-space-4);\n justify-content: space-between;\n}\n\n.identity {\n display: grid;\n gap: var(--rly-space-2);\n}\n","import { Button, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\nimport { useNavigate, useSearchParams } from \"react-router\"\n\nimport { AtlassianOAuthGrantId, type AtlassianOAuthGrantExchangeResponse } from \"../../api/plugins.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { forgetAtlassianOAuthSetupIntent, readAtlassianOAuthSetupIntent } from \"./atlassianOAuthSetupIntentStorage.js\"\nimport { browserConnectionTestTransport, type ConnectionTestTransport } from \"./connectionTestTransport.js\"\nimport { atlassianOAuthRecoveryPath, atlassianOAuthSetupPath } from \"./serviceOnboarding.js\"\nimport styles from \"./AtlassianOAuthCallbackPage.module.css\"\n\nconst AuthorizationCode = Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(4_096))\n\ntype CallbackState =\n | { readonly _tag: \"waiting\" }\n | { readonly _tag: \"exchanging\" }\n | { readonly _tag: \"selecting\"; readonly grant: AtlassianOAuthGrantExchangeResponse; readonly saveFailed: boolean }\n | { readonly _tag: \"saving\"; readonly grant: AtlassianOAuthGrantExchangeResponse; readonly cloudId: string }\n | { readonly _tag: \"failed\" }\n\ntype CallbackTransport = Pick<ConnectionTestTransport, \"completeAtlassianOAuthGrant\" | \"exchangeAtlassianOAuthGrant\">\n\n/** Complete a browser OAuth redirect without exposing provider tokens to the browser. */\nexport const AtlassianOAuthCallbackPage = ({\n transport = browserConnectionTestTransport\n}: {\n readonly transport?: CallbackTransport | undefined\n} = {}): ReactElement => {\n const navigate = useNavigate()\n const [searchParams, setSearchParams] = useSearchParams()\n const callbackGrantState = useRef(searchParams.get(\"state\")).current\n const [setupIntent] = useState(() => readAtlassianOAuthSetupIntent(callbackGrantState))\n const { state: sessionState } = useBrowserSession()\n const [state, setState] = useState<CallbackState>({ _tag: \"waiting\" })\n const exchangeStarted = useRef(false)\n const exchangeRequest = useRef<AbortController | null>(null)\n const saveRequest = useRef<AbortController | null>(null)\n const effectGeneration = useRef(0)\n\n useEffect(() => {\n const generation = ++effectGeneration.current\n const cleanup = (): void => {\n saveRequest.current?.abort()\n void Promise.resolve().then(() => {\n if (effectGeneration.current !== generation) return\n exchangeRequest.current?.abort()\n })\n }\n if (sessionState._tag !== \"authenticated\" || exchangeStarted.current) return cleanup\n exchangeStarted.current = true\n if (searchParams.has(\"error\")) {\n setState({ _tag: \"failed\" })\n return cleanup\n }\n const grantId = Schema.decodeUnknownResult(AtlassianOAuthGrantId)(searchParams.get(\"state\"))\n const code = Schema.decodeUnknownResult(AuthorizationCode)(searchParams.get(\"code\"))\n const exchange = transport.exchangeAtlassianOAuthGrant\n if (Result.isFailure(grantId) || Result.isFailure(code) || exchange === undefined) {\n setState({ _tag: \"failed\" })\n return cleanup\n }\n setSearchParams({}, { replace: true })\n const request = new AbortController()\n exchangeRequest.current = request\n setState({ _tag: \"exchanging\" })\n exchange(grantId.success, code.success, request.signal).then(\n (grant) => {\n if (!request.signal.aborted) setState({ _tag: \"selecting\", grant, saveFailed: false })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n }\n )\n return cleanup\n }, [searchParams, sessionState, setSearchParams, transport])\n\n const complete = (grant: AtlassianOAuthGrantExchangeResponse, cloudId: string): void => {\n if (setupIntent !== null && setupIntent.preferredSiteId !== null && setupIntent.preferredSiteId !== cloudId) return\n const save = transport.completeAtlassianOAuthGrant\n if (save === undefined) {\n setState({ _tag: \"failed\" })\n return\n }\n const request = new AbortController()\n saveRequest.current?.abort()\n saveRequest.current = request\n setState({ _tag: \"saving\", grant, cloudId })\n void save(grant.grantId, cloudId, request.signal).then(\n (profile) => {\n if (request.signal.aborted) return\n forgetAtlassianOAuthSetupIntent(callbackGrantState)\n navigate(\n setupIntent === null\n ? \"/services\"\n : setupIntent.recoveryConnectionId === undefined\n ? atlassianOAuthSetupPath(setupIntent.providers, profile.profileId, setupIntent.preferredSiteId)\n : atlassianOAuthRecoveryPath(setupIntent.recoveryConnectionId, profile.profileId),\n { replace: true }\n )\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"selecting\", grant, saveFailed: true })\n }\n )\n }\n\n const leaveCallback = (): void => {\n forgetAtlassianOAuthSetupIntent(callbackGrantState)\n navigate(\n setupIntent === null\n ? \"/services\"\n : setupIntent.recoveryConnectionId === undefined\n ? atlassianOAuthSetupPath(setupIntent.providers, null, setupIntent.preferredSiteId)\n : \"/services\"\n )\n }\n\n if (sessionState._tag === \"checking\") {\n return (\n <section className={styles.page}>\n <StatePanel description=\"Restoring the browser session that started this sign-in.\" title=\"Finishing sign-in\" />\n </section>\n )\n }\n\n if (sessionState._tag !== \"authenticated\") {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Return to Services</Button>}\n description=\"Return to the paired browser session that started this sign-in.\"\n title=\"Paired session required\"\n />\n </section>\n )\n }\n\n if (state._tag === \"failed\") {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Try again</Button>}\n description=\"The grant may have expired, been denied, or already been used. No provider token was saved.\"\n title=\"Atlassian sign-in did not finish\"\n />\n </section>\n )\n }\n\n if (state._tag !== \"selecting\" && state._tag !== \"saving\") {\n return (\n <section className={styles.page}>\n <StatePanel description=\"Verifying the single-use grant with Atlassian.\" title=\"Finishing sign-in\" />\n </section>\n )\n }\n\n if (\n setupIntent !== null &&\n setupIntent.preferredSiteId !== null &&\n !state.grant.sites.some(({ cloudId }) => cloudId === setupIntent.preferredSiteId)\n ) {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Return to Services</Button>}\n description=\"Sign in with an Atlassian account that can access the site selected from the account card.\"\n title=\"Selected Atlassian site unavailable\"\n />\n </section>\n )\n }\n\n return (\n <section aria-labelledby=\"atlassian-site-title\" className={styles.page}>\n <header className={styles.heading}>\n <Text as=\"h1\" id=\"atlassian-site-title\" variant=\"page-title\">\n Choose your Atlassian site\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Signed in as {state.grant.accountName}\n {state.grant.accountEmail === null ? \"\" : ` · ${state.grant.accountEmail}`}. Jira and Confluence will share\n this machine-local profile.\n </Text>\n </header>\n <div className={styles.sites}>\n {state._tag === \"selecting\" && state.saveFailed ? (\n <Text as=\"p\" tone=\"secondary\" variant=\"body\">\n The shared profile could not be saved to both tools. Fix the local profile store and retry this site.\n </Text>\n ) : null}\n {state.grant.sites.map((site) => (\n <Surface as=\"article\" className={styles.site} key={site.cloudId} padding=\"default\" form=\"grouped\">\n <div className={styles.identity}>\n <Text as=\"h2\" variant=\"card-title\">\n {site.name}\n </Text>\n <Text tone=\"secondary\" variant=\"body\">\n {site.siteUrl}\n </Text>\n </div>\n <Button\n disabled={\n state._tag === \"saving\" ||\n (setupIntent !== null &&\n setupIntent.preferredSiteId !== null &&\n setupIntent.preferredSiteId !== site.cloudId)\n }\n loading={state._tag === \"saving\" && state.cloudId === site.cloudId}\n onClick={() => complete(state.grant, site.cloudId)}\n variant=\"primary\"\n >\n Use this site\n </Button>\n </Surface>\n ))}\n </div>\n </section>\n )\n}\n"],"mappings":"iwBCaMqC,EAAAhB,EAAkC,MAAMrB,EAAiB,EAAGC,EAAkB,EAAGC,EAAmB,IAAK,CAAC,EAYnGoC,GAA8B,CACzC,YAAYR,GAGV,CAAC,IAAoB,CACvB,IAAMS,EAAW1B,EAAY,EACvB,CAAC2B,EAAcC,GAAmBxB,EAAgB,EAClDyB,GAAA,EAAqBvC,EAAAA,OAAAA,CAAOqC,EAAa,IAAI,OAAO,CAAC,CAAC,CAAC,QACvD,CAACG,IAAA,EAAevC,EAAAA,SAAAA,KAAe2B,EAA8BW,CAAkB,CAAC,EAChF,CAAE,MAAOE,GAAiB1B,EAAkB,EAC5C,CAAC2B,EAAOC,IAAA,EAAY1C,EAAAA,SAAAA,CAAwB,CAAE,KAAM,SAAU,CAAC,EAC/D2C,GAAA,EAAkB5C,EAAAA,OAAAA,CAAO,EAAK,EAC9B6C,GAAA,EAAkB7C,EAAAA,OAAAA,CAA+B,IAAI,EACrD8C,GAAA,EAAc9C,EAAAA,OAAAA,CAA+B,IAAI,EACjD+C,GAAA,EAAmB/C,EAAAA,OAAAA,CAAO,CAAC,GAEjC,EAAA8B,EAAA,UAAA,KAAgB,CACd,IAAMkB,EAAa,EAAED,EAAiB,QAChCE,MAAsB,CAC1BH,EAAY,SAAS,MAAM,EAC3B,QAAa,QAAQ,CAAC,CAAC,SAAW,CAC5BC,EAAiB,UAAYC,GACjCH,EAAgB,SAAS,MAAM,CACjC,CAAC,CACH,EACA,GAAIJ,EAAa,OAAS,iBAAmBG,EAAgB,QAAS,OAAOK,EAE7E,GADA,EAAgB,QAAU,GACtBZ,EAAa,IAAI,OAAO,EAE1B,OADAM,EAAS,CAAE,KAAM,QAAS,CAAC,EACpBM,EAET,IAAMC,EAAUhD,EAA2BkB,CAAqB,CAAC,CAACiB,EAAa,IAAI,OAAO,CAAC,EACrFc,EAAOjD,EAA2BgC,CAAiB,CAAC,CAACG,EAAa,IAAI,MAAM,CAAC,EAC7Ee,EAAWC,EAAU,4BAC3B,GAAIlD,EAAiB+C,CAAO,GAAK/C,EAAiBgD,CAAI,GAAKC,IAAa,IAAA,GAEtE,OADAT,EAAS,CAAE,KAAM,QAAS,CAAC,EACpBM,EAETX,EAAgB,CAAC,EAAG,CAAE,QAAS,EAAK,CAAC,EACrC,IAAMgB,EAAU,IAAI,gBAWpB,MAVA,GAAgB,QAAUA,EAC1BX,EAAS,CAAE,KAAM,YAAa,CAAC,EAC/BS,EAASF,EAAQ,QAASC,EAAK,QAASG,EAAQ,MAAM,CAAC,CAAC,KACrD,GAAU,CACJA,EAAQ,OAAO,SAASX,EAAS,CAAE,KAAM,YAAa,QAAO,WAAY,EAAM,CAAC,CACvF,MACM,CACCW,EAAQ,OAAO,SAASX,EAAS,CAAE,KAAM,QAAS,CAAC,CAC1D,CACF,EACOM,CACT,EAAG,CAACZ,EAAcI,EAAcH,EAAiBe,CAAS,CAAC,EAE3D,IAAME,GAAY,EAA4C,IAA0B,CACtF,GAAIf,IAAgB,MAAQA,EAAY,kBAAoB,MAAQA,EAAY,kBAAoBgB,EAAS,OAC7G,IAAMC,EAAOJ,EAAU,4BACvB,GAAII,IAAS,IAAA,GAAW,CACtBd,EAAS,CAAE,KAAM,QAAS,CAAC,EAC3B,MACF,CACA,IAAMW,EAAU,IAAI,gBACpBR,EAAY,SAAS,MAAM,EAC3B,EAAY,QAAUQ,EACtBX,EAAS,CAAE,KAAM,SAAU,QAAO,SAAQ,CAAC,EAC3Cc,EAAUC,EAAM,QAASF,EAASF,EAAQ,MAAM,CAAC,CAAC,KAC/C,GAAY,CACPA,EAAQ,OAAO,UACnBzB,EAAgCU,CAAkB,EAClDH,EACEI,IAAgB,KACZ,YACAA,EAAY,uBAAyB,IAAA,GACnCf,EAAwBe,EAAY,UAAWmB,EAAQ,UAAWnB,EAAY,eAAe,EAC7Fd,EAA2Bc,EAAY,qBAAsBmB,EAAQ,SAAS,EACpF,CAAE,QAAS,EAAK,CAClB,EACF,MACM,CACCL,EAAQ,OAAO,SAASX,EAAS,CAAE,KAAM,YAAa,QAAO,WAAY,EAAK,CAAC,CACtF,CACF,CACF,EAEMiB,MAA4B,CAChC/B,EAAgCU,CAAkB,EAClDH,EACEI,IAAgB,KACZ,YACAA,EAAY,uBAAyB,IAAA,GACnCf,EAAwBe,EAAY,UAAW,KAAMA,EAAY,eAAe,EAChF,WACR,CACF,EA0DA,OAxDIC,EAAa,OAAS,YAEtB,EAAAR,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW7B,EAAO,KACzB,UAAA,EAAA6B,EAAA,IAAA,CAAC5B,EAAD,CAAY,YAAY,2DAA2D,MAAM,mBAAqB,CAAA,CACvG,CAAA,EAIToC,EAAa,OAAS,gBAYtBC,EAAM,OAAS,UAEf,EAAAT,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW7B,EAAO,KACzB,UAAA,EAAA6B,EAAA,IAAA,CAAC5B,EAAD,CACE,QAAQ,EAAA4B,EAAA,IAAA,CAAC3B,EAAD,CAAQ,QAASsD,EAAe,SAAA,WAAiB,CAAA,EACzD,YAAY,8FACZ,MAAM,kCACP,CAAA,CACM,CAAA,EAITlB,EAAM,OAAS,aAAeA,EAAM,OAAS,UAE7C,EAAAT,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW7B,EAAO,KACzB,UAAA,EAAA6B,EAAA,IAAA,CAAC5B,EAAD,CAAY,YAAY,iDAAiD,MAAM,mBAAqB,CAAA,CAC7F,CAAA,EAKXmC,IAAgB,MAChBA,EAAY,kBAAoB,MAChC,CAACE,EAAM,MAAM,MAAM,MAAM,CAAE,aAAcc,IAAYhB,EAAY,eAAe,GAG9E,EAAAP,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW7B,EAAO,KACzB,UAAA,EAAA6B,EAAA,IAAA,CAAC5B,EAAD,CACE,QAAQ,EAAA4B,EAAA,IAAA,CAAC3B,EAAD,CAAQ,QAASsD,EAAe,SAAA,oBAA0B,CAAA,EAClE,YAAY,6FACZ,MAAM,qCACP,CAAA,CACM,CAAA,GAKX,EAAA3B,EAAA,KAAA,CAAC,UAAD,CAAS,kBAAgB,uBAAuB,UAAW7B,EAAO,KAAlE,SAAA,EACE,EAAA6B,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW7B,EAAO,QAA1B,SAAA,EACE,EAAA6B,EAAA,IAAA,CAAC1B,EAAD,CAAM,GAAG,KAAK,GAAG,uBAAuB,QAAQ,aAAa,SAAA,4BAEvD,CAAA,GACN,EAAA0B,EAAA,KAAA,CAAC1B,EAAD,CAAM,KAAK,YAAY,QAAQ,aAA/B,SAAA,CAA4C,gBAC5BmC,EAAM,MAAM,YACzBA,EAAM,MAAM,eAAiB,KAAO,GAAK,MAAMA,EAAM,MAAM,eAAe,8DAEvE,CACA,CAAA,CAAA,CACR,CAAA,GAAA,EAAAT,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW7B,EAAO,MAAvB,SAAA,CACGsC,EAAM,OAAS,aAAeA,EAAM,YACnC,EAAAT,EAAA,IAAA,CAAC1B,EAAD,CAAM,GAAG,IAAI,KAAK,YAAY,QAAQ,OAAO,SAAA,uGAEvC,CAAA,EACJ,KACHmC,EAAM,MAAM,MAAM,IAAK,IACtB,EAAAT,EAAA,KAAA,CAACzB,EAAD,CAAS,GAAG,UAAU,UAAWJ,EAAO,KAAyB,QAAQ,UAAU,KAAK,UAAxF,SAAA,EACE,EAAA6B,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW7B,EAAO,SAAvB,SAAA,EACE,EAAA6B,EAAA,IAAA,CAAC1B,EAAD,CAAM,GAAG,KAAK,QAAQ,aACnB,SAAAsD,EAAK,IACF,CAAA,GACN,EAAA5B,EAAA,IAAA,CAAC1B,EAAD,CAAM,KAAK,YAAY,QAAQ,OAC5B,SAAAsD,EAAK,OACF,CAAA,CACH,CACL,CAAA,GAAA,EAAA5B,EAAA,IAAA,CAAC3B,EAAD,CACE,SACEoC,EAAM,OAAS,UACdF,IAAgB,MACfA,EAAY,kBAAoB,MAChCA,EAAY,kBAAoBqB,EAAK,QAEzC,QAASnB,EAAM,OAAS,UAAYA,EAAM,UAAYmB,EAAK,QAC3D,YAAeN,EAASb,EAAM,MAAOmB,EAAK,OAAO,EACjD,QAAQ,UACT,SAAA,eAEO,CAAA,CACD,CAtB0C,EAAAA,EAAK,OAsB/C,CACV,CACE,CACE,CAAA,CAAA,KA1FP,EAAA5B,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW7B,EAAO,KACzB,UAAA,EAAA6B,EAAA,IAAA,CAAC5B,EAAD,CACE,QAAQ,EAAA4B,EAAA,IAAA,CAAC3B,EAAD,CAAQ,QAASsD,EAAe,SAAA,oBAA0B,CAAA,EAClE,YAAY,kEACZ,MAAM,yBACP,CAAA,CACM,CAAA,CAsFf"}
1
+ {"version":3,"file":"AtlassianOAuthCallbackPage-B00yNx-2.js","names":["Schema.isTrimmed","Schema.isNonEmpty","Schema.isMaxLength","useRef","useState","Schema.decodeUnknownResult","Result.isFailure","styles","StatePanel","Button","Text","Surface","__toESM","useNavigate","V","He","require_jsx_runtime","useSearchParams","useBrowserSession","Re","G","String","decodeUnknownResult","AtlassianOAuthGrantId","isTrimmed","isFailure","isNonEmpty","isMaxLength","atlassianOAuthSetupPath","atlassianOAuthRecoveryPath","browserConnectionTestTransport","readAtlassianOAuthSetupIntent","forgetAtlassianOAuthSetupIntent","import_react","require_react","AtlassianOAuthCallbackPage_module_default","import_jsx_runtime","AuthorizationCode","AtlassianOAuthCallbackPage","navigate","searchParams","setSearchParams","callbackGrantState","setupIntent","sessionState","state","setState","exchangeStarted","exchangeRequest","saveRequest","effectGeneration","generation","cleanup","grantId","code","exchange","transport","request","complete","cloudId","save","grant","profile","leaveCallback","site"],"sources":["../../../src/client/services/AtlassianOAuthCallbackPage.module.css","../../../src/client/services/AtlassianOAuthCallbackPage.tsx"],"sourcesContent":[".page {\n display: grid;\n gap: var(--rly-space-6);\n margin: 0 auto;\n max-width: 44rem;\n padding: var(--rly-space-8) var(--rly-space-4);\n}\n\n.heading,\n.sites {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.site {\n align-items: center;\n display: flex;\n gap: var(--rly-space-4);\n justify-content: space-between;\n}\n\n.identity {\n display: grid;\n gap: var(--rly-space-2);\n}\n","import { Button, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\nimport { useNavigate, useSearchParams } from \"react-router\"\n\nimport { AtlassianOAuthGrantId, type AtlassianOAuthGrantExchangeResponse } from \"../../api/plugins.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { forgetAtlassianOAuthSetupIntent, readAtlassianOAuthSetupIntent } from \"./atlassianOAuthSetupIntentStorage.js\"\nimport { browserConnectionTestTransport, type ConnectionTestTransport } from \"./connectionTestTransport.js\"\nimport { atlassianOAuthRecoveryPath, atlassianOAuthSetupPath } from \"./serviceOnboarding.js\"\nimport styles from \"./AtlassianOAuthCallbackPage.module.css\"\n\nconst AuthorizationCode = Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(4_096))\n\ntype CallbackState =\n | { readonly _tag: \"waiting\" }\n | { readonly _tag: \"exchanging\" }\n | { readonly _tag: \"selecting\"; readonly grant: AtlassianOAuthGrantExchangeResponse; readonly saveFailed: boolean }\n | { readonly _tag: \"saving\"; readonly grant: AtlassianOAuthGrantExchangeResponse; readonly cloudId: string }\n | { readonly _tag: \"failed\" }\n\ntype CallbackTransport = Pick<ConnectionTestTransport, \"completeAtlassianOAuthGrant\" | \"exchangeAtlassianOAuthGrant\">\n\n/** Complete a browser OAuth redirect without exposing provider tokens to the browser. */\nexport const AtlassianOAuthCallbackPage = ({\n transport = browserConnectionTestTransport\n}: {\n readonly transport?: CallbackTransport | undefined\n} = {}): ReactElement => {\n const navigate = useNavigate()\n const [searchParams, setSearchParams] = useSearchParams()\n const callbackGrantState = useRef(searchParams.get(\"state\")).current\n const [setupIntent] = useState(() => readAtlassianOAuthSetupIntent(callbackGrantState))\n const { state: sessionState } = useBrowserSession()\n const [state, setState] = useState<CallbackState>({ _tag: \"waiting\" })\n const exchangeStarted = useRef(false)\n const exchangeRequest = useRef<AbortController | null>(null)\n const saveRequest = useRef<AbortController | null>(null)\n const effectGeneration = useRef(0)\n\n useEffect(() => {\n const generation = ++effectGeneration.current\n const cleanup = (): void => {\n saveRequest.current?.abort()\n void Promise.resolve().then(() => {\n if (effectGeneration.current !== generation) return\n exchangeRequest.current?.abort()\n })\n }\n if (sessionState._tag !== \"authenticated\" || exchangeStarted.current) return cleanup\n exchangeStarted.current = true\n if (searchParams.has(\"error\")) {\n setState({ _tag: \"failed\" })\n return cleanup\n }\n const grantId = Schema.decodeUnknownResult(AtlassianOAuthGrantId)(searchParams.get(\"state\"))\n const code = Schema.decodeUnknownResult(AuthorizationCode)(searchParams.get(\"code\"))\n const exchange = transport.exchangeAtlassianOAuthGrant\n if (Result.isFailure(grantId) || Result.isFailure(code) || exchange === undefined) {\n setState({ _tag: \"failed\" })\n return cleanup\n }\n setSearchParams({}, { replace: true })\n const request = new AbortController()\n exchangeRequest.current = request\n setState({ _tag: \"exchanging\" })\n exchange(grantId.success, code.success, request.signal).then(\n (grant) => {\n if (!request.signal.aborted) setState({ _tag: \"selecting\", grant, saveFailed: false })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n }\n )\n return cleanup\n }, [searchParams, sessionState, setSearchParams, transport])\n\n const complete = (grant: AtlassianOAuthGrantExchangeResponse, cloudId: string): void => {\n if (setupIntent !== null && setupIntent.preferredSiteId !== null && setupIntent.preferredSiteId !== cloudId) return\n const save = transport.completeAtlassianOAuthGrant\n if (save === undefined) {\n setState({ _tag: \"failed\" })\n return\n }\n const request = new AbortController()\n saveRequest.current?.abort()\n saveRequest.current = request\n setState({ _tag: \"saving\", grant, cloudId })\n void save(grant.grantId, cloudId, request.signal).then(\n (profile) => {\n if (request.signal.aborted) return\n forgetAtlassianOAuthSetupIntent(callbackGrantState)\n navigate(\n setupIntent === null\n ? \"/services\"\n : setupIntent.recoveryConnectionId === undefined\n ? atlassianOAuthSetupPath(setupIntent.providers, profile.profileId, setupIntent.preferredSiteId)\n : atlassianOAuthRecoveryPath(setupIntent.recoveryConnectionId, profile.profileId),\n { replace: true }\n )\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"selecting\", grant, saveFailed: true })\n }\n )\n }\n\n const leaveCallback = (): void => {\n forgetAtlassianOAuthSetupIntent(callbackGrantState)\n navigate(\n setupIntent === null\n ? \"/services\"\n : setupIntent.recoveryConnectionId === undefined\n ? atlassianOAuthSetupPath(setupIntent.providers, null, setupIntent.preferredSiteId)\n : \"/services\"\n )\n }\n\n if (sessionState._tag === \"checking\") {\n return (\n <section className={styles.page}>\n <StatePanel description=\"Restoring the browser session that started this sign-in.\" title=\"Finishing sign-in\" />\n </section>\n )\n }\n\n if (sessionState._tag !== \"authenticated\") {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Return to Services</Button>}\n description=\"Return to the paired browser session that started this sign-in.\"\n title=\"Paired session required\"\n />\n </section>\n )\n }\n\n if (state._tag === \"failed\") {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Try again</Button>}\n description=\"The grant may have expired, been denied, or already been used. No provider token was saved.\"\n title=\"Atlassian sign-in did not finish\"\n />\n </section>\n )\n }\n\n if (state._tag !== \"selecting\" && state._tag !== \"saving\") {\n return (\n <section className={styles.page}>\n <StatePanel description=\"Verifying the single-use grant with Atlassian.\" title=\"Finishing sign-in\" />\n </section>\n )\n }\n\n if (\n setupIntent !== null &&\n setupIntent.preferredSiteId !== null &&\n !state.grant.sites.some(({ cloudId }) => cloudId === setupIntent.preferredSiteId)\n ) {\n return (\n <section className={styles.page}>\n <StatePanel\n action={<Button onClick={leaveCallback}>Return to Services</Button>}\n description=\"Sign in with an Atlassian account that can access the site selected from the account card.\"\n title=\"Selected Atlassian site unavailable\"\n />\n </section>\n )\n }\n\n return (\n <section aria-labelledby=\"atlassian-site-title\" className={styles.page}>\n <header className={styles.heading}>\n <Text as=\"h1\" id=\"atlassian-site-title\" variant=\"page-title\">\n Choose your Atlassian site\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Signed in as {state.grant.accountName}\n {state.grant.accountEmail === null ? \"\" : ` · ${state.grant.accountEmail}`}. Jira and Confluence will share\n this machine-local profile.\n </Text>\n </header>\n <div className={styles.sites}>\n {state._tag === \"selecting\" && state.saveFailed ? (\n <Text as=\"p\" tone=\"secondary\" variant=\"body\">\n The shared profile could not be saved to both tools. Fix the local profile store and retry this site.\n </Text>\n ) : null}\n {state.grant.sites.map((site) => (\n <Surface as=\"article\" className={styles.site} key={site.cloudId} padding=\"default\" form=\"grouped\">\n <div className={styles.identity}>\n <Text as=\"h2\" variant=\"card-title\">\n {site.name}\n </Text>\n <Text tone=\"secondary\" variant=\"body\">\n {site.siteUrl}\n </Text>\n </div>\n <Button\n disabled={\n state._tag === \"saving\" ||\n (setupIntent !== null &&\n setupIntent.preferredSiteId !== null &&\n setupIntent.preferredSiteId !== site.cloudId)\n }\n loading={state._tag === \"saving\" && state.cloudId === site.cloudId}\n onClick={() => complete(state.grant, site.cloudId)}\n variant=\"primary\"\n >\n Use this site\n </Button>\n </Surface>\n ))}\n </div>\n </section>\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{m as n}from"./hooks-CGvBGjhq.js";import{a as r,d as i,r as a,v as o}from"./Dialog-B9Ub_gMT-D8Er5PRs.js";import{t as s}from"./jsx-runtime-NZYk81nU.js";import{b as c,w as l}from"./index-BDOFEVxB.js";import{y as u}from"./patterns-Nc-ycn7Y.js";import{n as d,t as f}from"./primitives-CgvvYKjR-BnO9EmQf.js";import{Di as p,Fi as m,Gr as h,Jn as g,Ni as _,Pi as v,Ua as y,Ui as b,ga as x,ii as S,ka as C,oa as w,on as T,sn as E,wi as D}from"./agent-api-CmrKwleK.js";import{i as O,n as k,r as A}from"./presentWorkspaceItems-B2gTVuc-.js";import{t as j}from"./authorizedShareTransport-DF_kDztw.js";var M=e(t(),1),N={page:`_page_1wzwh_1`,hero:`_hero_1wzwh_2`,item:`_item_1wzwh_3`,facts:`_facts_1wzwh_4`,itemHeader:`_itemHeader_1wzwh_24`},P=s(),F=3e4,I=e=>t=>y(t,`_tag`)&&t._tag===e,L=I(`NotFoundApiError`),R=I(`UnauthorizedApiError`),z=class extends w(`AuthorizedShareResolveError`){},B=({transport:e=j}={})=>{let t=n(),s=c(),y=g(T)(t.shareId),w=g(E)(t.workspaceId),I=C(y)?y.value:null,B=C(w)?w.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=m({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=D(n,b(x(F))).pipe(S(e=>_(()=>{t.signal.aborted||(R(e.cause)&&s.invalidateSession(H.sessionId),K(L(e.cause)?{_tag:`not-found`}:{_tag:`failed`}))})));return p(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:h(G.resolution.item.recordedAt)})]}),(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Expires`}),(0,P.jsx)(`dd`,{children:h(G.resolution.share.expiresAt)})]})]})]})]})};export{B as AuthorizedSharePage};
2
- //# sourceMappingURL=AuthorizedSharePage-BKRFQEW5.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-B9Ub_gMT-D8Er5PRs.js";import{t as s}from"./jsx-runtime-NZYk81nU.js";import{b as c,w as l}from"./index-CyCO7dDM.js";import{y as u}from"./patterns-DsePY14f.js";import{n as d,t as f}from"./primitives-Bd6WhE78-DyJtZKnH.js";import{Di as p,Fi as m,Gr as h,Jn as g,Ni as _,Pi as v,Ua as y,Ui as b,ga as x,ii as S,ka as C,oa as w,on as T,sn as E,wi as D}from"./agent-api-CmrKwleK.js";import{i as O,n as k,r as A}from"./presentWorkspaceItems-B2gTVuc-.js";import{t as j}from"./authorizedShareTransport-DF_kDztw.js";var M=e(t(),1),N={page:`_page_1wzwh_1`,hero:`_hero_1wzwh_2`,item:`_item_1wzwh_3`,facts:`_facts_1wzwh_4`,itemHeader:`_itemHeader_1wzwh_24`},P=s(),F=3e4,I=e=>t=>y(t,`_tag`)&&t._tag===e,L=I(`NotFoundApiError`),R=I(`UnauthorizedApiError`),z=class extends w(`AuthorizedShareResolveError`){},B=({transport:e=j}={})=>{let t=n(),s=c(),y=g(T)(t.shareId),w=g(E)(t.workspaceId),I=C(y)?y.value:null,B=C(w)?w.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=m({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=D(n,b(x(F))).pipe(S(e=>_(()=>{t.signal.aborted||(R(e.cause)&&s.invalidateSession(H.sessionId),K(L(e.cause)?{_tag:`not-found`}:{_tag:`failed`}))})));return p(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:h(G.resolution.item.recordedAt)})]}),(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:`Expires`}),(0,P.jsx)(`dd`,{children:h(G.resolution.share.expiresAt)})]})]})]})]})};export{B as AuthorizedSharePage};
2
+ //# sourceMappingURL=AuthorizedSharePage-BJM10BAd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthorizedSharePage-BKRFQEW5.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","ue","L","runPromise","tryPromise","formatIso","decodeUnknownOption","sync","tap","hasProperty","spaced","millis","catch_","isSome","TaggedError","ShareId","WorkspaceId","repeat","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 min-inline-size: 0;\n overflow-wrap: break-word;\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: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\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
+ {"version":3,"file":"AuthorizedSharePage-BJM10BAd.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","Re","G","runPromise","tryPromise","formatIso","decodeUnknownOption","sync","tap","hasProperty","spaced","millis","catch_","isSome","TaggedError","ShareId","WorkspaceId","repeat","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 min-inline-size: 0;\n overflow-wrap: break-word;\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: var(--rly-focus-ring-width) solid var(--rly-color-focus);\n outline-offset: var(--rly-focus-ring-offset);\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":"yzBC2BMwD,EAAkC,IAElCC,EACH,GACgB,GACfzD,EAAsB0D,EAAS,MAAM,GAAKA,EAAQ,OAASC,EAEzDC,EAAaH,EAAgB,kBAAkB,EAC/CI,EAAiBJ,EAAgB,sBAAsB,EAEvDK,EAAN,cAA0C7D,EAAiB,6BAA6B,CAAC,AAEtF,CAAC,EAOS8D,GAAuB,CAClC,YAAYZ,GACgB,CAAC,IAAoB,CACjD,IAAMa,EAAS1C,EAAU,EACnB2C,EAAiBrC,EAAkB,EACnCsC,EAAiBhE,EAA2B2C,CAAO,CAAC,CAACmB,EAAO,OAAO,EACnEG,EAAqBjE,EAA2B4C,CAAW,CAAC,CAACkB,EAAO,WAAW,EAC/EI,EAAUjE,EAAc+D,CAAc,EAAIA,EAAe,MAAQ,KACjEG,EAAclE,EAAcgE,CAAkB,EAAIA,EAAmB,MAAQ,KAC7EG,EACJL,EAAe,MAAM,OAAS,iBAE1BA,EAAe,MAAM,OAAS,sBAD9BA,EAAe,MAAM,QAGnB,KACFM,EACJD,IAAyB,MAAQA,EAAqB,cAAgBD,EAAcC,EAAuB,KACvG,CAACE,EAAiBC,IAAA,EAAsBrE,EAAAA,SAAAA,CAAS,CAAC,EAClD,CAACsE,EAAOC,IAAA,EAAYvE,EAAAA,SAAAA,CAAmC,CAAE,KAAM,MAAO,CAAC,EAkC7E,IAhCA,EAAAgD,EAAA,UAAA,KAAgB,CACd,GAAIgB,IAAY,MAAQC,IAAgB,MAAQE,IAAY,KAAM,CAChEI,EAAS,CAAE,KAAM,MAAO,CAAC,EACzB,MACF,CACA,IAAMC,EAAU,IAAI,gBACpBD,EAAS,CAAE,KAAM,SAAU,CAAC,EAC5B,IAAME,EAAcxE,EAAkB,CACpC,QAAWyE,EAAU,QAAQT,EAAaD,EAASQ,EAAQ,MAAM,EACjE,MAAQ,GAAU,IAAId,EAA4B,CAAE,OAAM,CAAC,CAC7D,CAAC,CAAC,CAAC,KACDxD,EAAY,GACVC,MAAkB,CACXqE,EAAQ,OAAO,SAASD,EAAS,CAAE,KAAM,QAAS,YAAW,CAAC,CACrE,CAAC,CACH,CACF,EACMI,EAAUvE,EAAcqE,EAAapE,EAAgBC,EAAgB8C,CAA+B,CAAC,CAAC,CAAC,CAAC,KAC5G7C,EAAc,GACZJ,MAAkB,CACZqE,EAAQ,OAAO,UACff,EAAeH,EAAQ,KAAK,GAAGO,EAAe,kBAAkBM,EAAQ,SAAS,EACrFI,EAASf,EAAWF,EAAQ,KAAK,EAAI,CAAE,KAAM,WAAY,EAAI,CAAE,KAAM,QAAS,CAAC,EACjF,CAAC,CACH,CACF,EAIA,OAHAzB,EAAkB8C,EAAS,CAAE,OAAQH,EAAQ,MAAO,CAAC,CAAC,CAAC,UAAY,CAC5DA,EAAQ,OAAO,SAASD,EAAS,CAAE,KAAM,QAAS,CAAC,CAC1D,CAAC,MACYC,EAAQ,MAAM,CAC7B,EAAG,CAACX,EAAgBO,EAAiBD,EAASH,EAASU,EAAWT,CAAW,CAAC,EAE1ED,IAAY,MAAQC,IAAgB,KACtC,OACE,EAAAd,EAAA,IAAA,CAAC3C,EAAD,CACE,QAAQ,EAAA2C,EAAA,IAAA,CAAC1B,EAAD,CAAM,GAAG,IAAI,SAAA,0BAA8B,CAAA,EACnD,YAAY,8DACZ,MAAM,oBACN,KAAK,SACN,CAAA,EAIL,GAAIoC,EAAe,MAAM,OAAS,YAAcS,EAAM,OAAS,UAC7D,OACE,EAAAnB,EAAA,KAAA,CAAC,UAAD,CAAS,aAAW,2BAA2B,UAAW1C,EAAO,KAAjE,SAAA,EACE,EAAA0C,EAAA,IAAA,CAACzC,EAAD,CAAU,OAAO,OAAO,QAAQ,OAAS,CAAA,GACzC,EAAAyC,EAAA,IAAA,CAACzC,EAAD,CAAU,OAAO,QAAQ,QAAQ,OAAS,CAAA,CACnC,IAIb,GAAIwD,IAAyB,KAC3B,OACE,EAAAf,EAAA,IAAA,CAAC3C,EAAD,CACE,QAAQ,EAAA2C,EAAA,IAAA,CAAC1B,EAAD,CAAM,GAAG,QAAQ,SAAA,mBAAuB,CAAA,EAChD,YAAY,kFACZ,MAAM,0BACN,KAAK,SACN,CAAA,EAIL,GAAIyC,EAAqB,cAAgBD,EACvC,OACE,EAAAd,EAAA,IAAA,CAAC3C,EAAD,CACE,YAAY,qEACZ,MAAM,oBACN,KAAK,SACN,CAAA,EAIL,GAAI8D,EAAM,OAAS,YACjB,OACE,EAAAnB,EAAA,IAAA,CAAC3C,EAAD,CACE,YAAY,yFACZ,MAAM,oBACN,KAAK,SACN,CAAA,EAIL,GAAI8D,EAAM,OAAS,UAAYA,EAAM,OAAS,OAC5C,OACE,EAAAnB,EAAA,IAAA,CAAC3C,EAAD,CACE,QAAQ,EAAA2C,EAAA,IAAA,CAACxC,EAAD,CAAQ,YAAe0D,EAAoB,GAAaO,EAAW,CAAC,EAAG,SAAA,WAAiB,CAAA,EAChG,YAAY,yDACZ,MAAM,oBACN,KAAK,SACN,CAAA,EAIL,IAAMC,EAAaP,EAAM,WAAW,KAAK,WACnCQ,EAAShC,EAAU+B,EAAW,OAAO,EACrCE,EAAenC,EAAmBiC,EAAW,WAAYC,CAAM,EACrE,OACE,EAAA3B,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW1C,EAAO,KAA3B,SAAA,EACE,EAAA0C,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW1C,EAAO,KAA1B,SAAA,EACE,EAAA0C,EAAA,IAAA,CAACvC,EAAD,CAAM,GAAG,IAAI,KAAK,YAAY,QAAQ,QAAQ,SAAA,iBAExC,CAAA,GACN,EAAAuC,EAAA,IAAA,CAACvC,EAAD,CAAM,GAAG,KAAK,QAAQ,UAAU,SAAA,gCAE1B,CAAA,GACN,EAAAuC,EAAA,IAAA,CAACvC,EAAD,CAAM,KAAK,YAAY,QAAQ,aAAa,SAAA,oHAGtC,CAAA,CACA,CACR,CAAA,GAAA,EAAAuC,EAAA,KAAA,CAACtC,EAAD,CAAS,GAAG,UAAU,UAAWJ,EAAO,KAAM,QAAQ,WAAW,KAAK,YAAtE,SAAA,EACE,EAAA0C,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW1C,EAAO,WAAvB,SAAA,EACE,EAAA0C,EAAA,IAAA,CAACrC,EAAD,CAAa,QAAS+B,EAAWgC,EAAW,UAAU,EAAG,KAAK,SAAW,CAAA,GACzE,EAAA1B,EAAA,IAAA,CAACpC,EAAD,CAAY,MAAO+D,EAAQ,KAAK,UAAU,KAAMC,EAAa,IAAO,CAAA,CACjE,KACL,EAAA5B,EAAA,IAAA,CAACvC,EAAD,CAAM,GAAG,IAAI,KAAK,YAAY,QAAQ,QACnC,SAAAiE,EAAW,UACR,CAAA,GACN,EAAA1B,EAAA,IAAA,CAACvC,EAAD,CAAM,GAAG,KAAK,QAAQ,gBACnB,SAAAiE,EAAW,KACR,CAAA,GACN,EAAA1B,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW1C,EAAO,MAAtB,SAAA,EACE,EAAA0C,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GACZ,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK0B,EAAW,UAAe,CAAA,CAC5B,CAAA,CAAA,GACL,EAAA1B,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,UAAY,CAAA,GAChB,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAKnC,EAAmBsD,EAAM,WAAW,KAAK,UAAU,CAAM,CAAA,CAC3D,CAAA,CAAA,GACL,EAAAnB,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,SAAW,CAAA,GACf,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAKnC,EAAmBsD,EAAM,WAAW,MAAM,SAAS,CAAM,CAAA,CAC3D,CAAA,CAAA,CACH,GACG,CACF,CAAA,CAAA,GAEb"}
@@ -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-BDOFEVxB.js";import{Ci as r,Di as i,Ka as a,Ua as o,hi as s}from"./agent-api-CmrKwleK.js";import{a as c,t as l}from"./client-C6yk7c6s.js";var u=e(t(),1),d=s(function*(){return yield*(yield*l()).session.current()}).pipe(r(c)),f=e=>!o(e,`_tag`)||!a(e._tag)?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},p=({loadSession:e=d}={})=>{let{beginHydration:t,completeHydration:r}=n();return(0,u.useEffect)(()=>{let n=t(),a=new AbortController,o=!0;return i(e,{signal:a.signal}).then(e=>{o&&r(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{o&&r(n,f(e))}),()=>{o=!1,a.abort()}},[t,r,e]),null};export{p as BrowserSessionHydrator};
2
- //# sourceMappingURL=BrowserSessionHydrator-DsrYOye8.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-CyCO7dDM.js";import{Ci as r,Di as i,Ka as a,Ua as o,hi as s}from"./agent-api-CmrKwleK.js";import{a as c,t as l}from"./client-C6yk7c6s.js";var u=e(t(),1),d=s(function*(){return yield*(yield*l()).session.current()}).pipe(r(c)),f=e=>!o(e,`_tag`)||!a(e._tag)?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},p=({loadSession:e=d}={})=>{let{beginHydration:t,completeHydration:r}=n();return(0,u.useEffect)(()=>{let n=t(),a=new AbortController,o=!0;return i(e,{signal:a.signal}).then(e=>{o&&r(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{o&&r(n,f(e))}),()=>{o=!1,a.abort()}},[t,r,e]),null};export{p as BrowserSessionHydrator};
2
+ //# sourceMappingURL=BrowserSessionHydrator-Bm8F4Ctu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserSessionHydrator-DsrYOye8.js","names":["Effect.gen","Effect.provide","FetchHttpClient.layer","Predicate.hasProperty","Predicate.isString","__toESM","useBrowserSession","provide","runPromise","isString","hasProperty","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,OAbAf,EAAkBgB,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-Bm8F4Ctu.js","names":["Effect.gen","Effect.provide","FetchHttpClient.layer","Predicate.hasProperty","Predicate.isString","__toESM","useBrowserSession","provide","runPromise","isString","hasProperty","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,OAbAf,EAAkBgB,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-B9Ub_gMT-D8Er5PRs.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-BDOFEVxB.js";import{y as p}from"./patterns-Nc-ycn7Y.js";import{Ci as m,Di as h,Ka as g,hi as _,qa as v}from"./agent-api-CmrKwleK.js";import{a as y,t as b}from"./client-C6yk7c6s.js";import{i as x,o as S}from"./releaseRoutes-DPwinWrO.js";import{t as C}from"./presentPortfolio-DmyVOQzf.js";import{n as w,r as T}from"./workspaceEntityRoutes-DY6gXtOy.js";import{n as E,t as D}from"./useWorkspaceItems-CG8bShqT.js";import{t as O}from"./workspaceScrollCapture-B4_xSwNQ.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=v(`UnauthorizedApiError`),N={load:e=>h(_(function*(){return yield*(yield*b()).portfolio.snapshot()}).pipe(m(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)||!g(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,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-B3ogcxH6.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-B9Ub_gMT-D8Er5PRs.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-CyCO7dDM.js";import{y as p}from"./patterns-DsePY14f.js";import{Ci as m,Di as h,Ka as g,hi as _,qa as v}from"./agent-api-CmrKwleK.js";import{a as y,t as b}from"./client-C6yk7c6s.js";import{i as x,o as S}from"./releaseRoutes-cNpu7gsD.js";import{t as C}from"./presentPortfolio-DmyVOQzf.js";import{n as w,r as T}from"./workspaceEntityRoutes-BYPBqjUZ.js";import{n as E,t as D}from"./useWorkspaceItems-CG8bShqT.js";import{t as O}from"./workspaceScrollCapture-u6lJbYGL.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=v(`UnauthorizedApiError`),N={load:e=>h(_(function*(){return yield*(yield*b()).portfolio.snapshot()}).pipe(m(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)||!g(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,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-BxAJW0LJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandSearch-B3ogcxH6.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","provide","runPromise","isString","gen","isTagged","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} 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-BxAJW0LJ.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","provide","runPromise","isString","gen","isTagged","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} 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,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-B9Ub_gMT-D8Er5PRs.js";import{t as l}from"./jsx-runtime-NZYk81nU.js";import{E as u,b as d,w as f}from"./index-BDOFEVxB.js";import{n as p,y as m}from"./patterns-Nc-ycn7Y.js";import{n as h,t as g}from"./primitives-CgvvYKjR-BnO9EmQf.js";import{$t as _,Gr as v,Jn as y,ka as b}from"./agent-api-CmrKwleK.js";import{i as x,o as S}from"./releaseRoutes-DPwinWrO.js";import{PortfolioOverviewView as C}from"./PortfolioOverview-k2woweJX.js";import{n as w,r as T}from"./workspaceEntityRoutes-DY6gXtOy.js";import{a as E}from"./presentWorkspaceItems-B2gTVuc-.js";import{n as ee,t as te}from"./useWorkspaceItems-CG8bShqT.js";import{n as ne,t as re}from"./workspaceScrollCapture-B4_xSwNQ.js";import{t as D}from"./authorizedShareTransport-DF_kDztw.js";import{n as ie}from"./ReleaseWorkset-idMU3iUy.js";var O=e(t(),1),k={page:`_page_1uuvg_1`,hero:`_hero_1uuvg_2`,filters:`_filters_1uuvg_3`,items:`_items_1uuvg_4`,item:`_item_1uuvg_4`,itemLink:`_itemLink_1uuvg_6`,meta:`_meta_1uuvg_7`,selection:`_selection_1uuvg_8`,membershipChoices:`_membershipChoices_1uuvg_54`,shareLink:`_shareLink_1uuvg_55`,resultHeading:`_resultHeading_1uuvg_60`,selectionHeader:`_selectionHeader_1uuvg_80`,selectionActions:`_selectionActions_1uuvg_81`,owners:`_owners_1uuvg_153`,ownerGroup:`_ownerGroup_1uuvg_157`,ownerLimit:`_ownerLimit_1uuvg_163`,shareForm:`_shareForm_1uuvg_181`,shareResult:`_shareResult_1uuvg_182`,search:`_search_1uuvg_243`},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),y=(0,O.useRef)(null),b=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>y.current?.abort(),[]),(0,O.useEffect)(()=>{(p._tag===`ready`||p._tag===`revoked`)&&b.current?.focus()},[p._tag]);let x=e=>{e.preventDefault(),y.current?.abort();let n=new AbortController;y.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:v(e.expiresAt)})},()=>{n.signal.aborted||m({_tag:`failed`})})},S=(e,t)=>{y.current?.abort();let n=new AbortController;y.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=y(_)(e);return b(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-C8Kvj_hC.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-B9Ub_gMT-D8Er5PRs.js";import{t as l}from"./jsx-runtime-NZYk81nU.js";import{E as u,b as d,w as f}from"./index-CyCO7dDM.js";import{n as p,y as m}from"./patterns-DsePY14f.js";import{n as h,t as g}from"./primitives-Bd6WhE78-DyJtZKnH.js";import{$t as _,Gr as v,Jn as y,ka as b}from"./agent-api-CmrKwleK.js";import{i as x,o as S}from"./releaseRoutes-cNpu7gsD.js";import{PortfolioOverviewView as C}from"./PortfolioOverview-ajQK-ZVn.js";import{n as w,r as T}from"./workspaceEntityRoutes-BYPBqjUZ.js";import{a as E}from"./presentWorkspaceItems-B2gTVuc-.js";import{n as ee,t as te}from"./useWorkspaceItems-CG8bShqT.js";import{n as ne,t as re}from"./workspaceScrollCapture-u6lJbYGL.js";import{t as D}from"./authorizedShareTransport-DF_kDztw.js";import{n as ie}from"./ReleaseWorkset-CpploDSa.js";var O=e(t(),1),k={page:`_page_1uuvg_1`,hero:`_hero_1uuvg_2`,filters:`_filters_1uuvg_3`,items:`_items_1uuvg_4`,item:`_item_1uuvg_4`,itemLink:`_itemLink_1uuvg_6`,meta:`_meta_1uuvg_7`,selection:`_selection_1uuvg_8`,membershipChoices:`_membershipChoices_1uuvg_54`,shareLink:`_shareLink_1uuvg_55`,resultHeading:`_resultHeading_1uuvg_60`,selectionHeader:`_selectionHeader_1uuvg_80`,selectionActions:`_selectionActions_1uuvg_81`,owners:`_owners_1uuvg_153`,ownerGroup:`_ownerGroup_1uuvg_157`,ownerLimit:`_ownerLimit_1uuvg_163`,shareForm:`_shareForm_1uuvg_181`,shareResult:`_shareResult_1uuvg_182`,search:`_search_1uuvg_243`},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),y=(0,O.useRef)(null),b=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>y.current?.abort(),[]),(0,O.useEffect)(()=>{(p._tag===`ready`||p._tag===`revoked`)&&b.current?.focus()},[p._tag]);let x=e=>{e.preventDefault(),y.current?.abort();let n=new AbortController;y.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:v(e.expiresAt)})},()=>{n.signal.aborted||m({_tag:`failed`})})},S=(e,t)=>{y.current?.abort();let n=new AbortController;y.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=y(_)(e);return b(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-DkKQR0qC.js.map