@knpkv/control-center 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/client/.vite/manifest.json +430 -430
- package/dist/client/assets/{ActiveWorkPage-Upg00yYW.js → ActiveWorkPage-zWJnB-Cc.js} +2 -2
- package/dist/client/assets/{ActiveWorkPage-Upg00yYW.js.map → ActiveWorkPage-zWJnB-Cc.js.map} +1 -1
- package/dist/client/assets/{AgentPage-BCtDk8yR.js → AgentPage-DCrGAe9-.js} +2 -2
- package/dist/client/assets/{AgentPage-BCtDk8yR.js.map → AgentPage-DCrGAe9-.js.map} +1 -1
- package/dist/client/assets/{AtlassianOAuthCallbackPage-ChTCY_Un.js → AtlassianOAuthCallbackPage-DiYS-wZV.js} +2 -2
- package/dist/client/assets/{AtlassianOAuthCallbackPage-ChTCY_Un.js.map → AtlassianOAuthCallbackPage-DiYS-wZV.js.map} +1 -1
- package/dist/client/assets/{AuthorizedSharePage-BEk1V9hS.js → AuthorizedSharePage-D69hX3jN.js} +2 -2
- package/dist/client/assets/{AuthorizedSharePage-BEk1V9hS.js.map → AuthorizedSharePage-D69hX3jN.js.map} +1 -1
- package/dist/client/assets/{BrowserSessionHydrator-CB9DxOnS.js → BrowserSessionHydrator-DuScelRj.js} +2 -2
- package/dist/client/assets/{BrowserSessionHydrator-CB9DxOnS.js.map → BrowserSessionHydrator-DuScelRj.js.map} +1 -1
- package/dist/client/assets/{CommandSearch-ZtucgGqT.js → CommandSearch-BxhhZB25.js} +2 -2
- package/dist/client/assets/{CommandSearch-ZtucgGqT.js.map → CommandSearch-BxhhZB25.js.map} +1 -1
- package/dist/client/assets/{Dialog-CplGpe1F-DvPHUaxb.js → Dialog-CplGpe1F-DeMJtg-H.js} +2 -2
- package/dist/client/assets/{Dialog-CplGpe1F-DvPHUaxb.js.map → Dialog-CplGpe1F-DeMJtg-H.js.map} +1 -1
- package/dist/client/assets/{ItemsPage-rWXr2AYt.js → ItemsPage-BoSTawlJ.js} +2 -2
- package/dist/client/assets/{ItemsPage-rWXr2AYt.js.map → ItemsPage-BoSTawlJ.js.map} +1 -1
- package/dist/client/assets/{OpenPullRequestPage-C7Uo5MRd.js → OpenPullRequestPage-BfzPMfn_.js} +2 -2
- package/dist/client/assets/{OpenPullRequestPage-C7Uo5MRd.js.map → OpenPullRequestPage-BfzPMfn_.js.map} +1 -1
- package/dist/client/assets/{Pages-D2qsa2F2.js → Pages-DGc7_0RQ.js} +2 -2
- package/dist/client/assets/{Pages-D2qsa2F2.js.map → Pages-DGc7_0RQ.js.map} +1 -1
- package/dist/client/assets/{PairPage-DhpqcT8c.js → PairPage-DCNv3CTt.js} +2 -2
- package/dist/client/assets/{PairPage-DhpqcT8c.js.map → PairPage-DCNv3CTt.js.map} +1 -1
- package/dist/client/assets/{PortfolioOverview-mX6k5nL-.js → PortfolioOverview-Cnnxhgpt.js} +2 -2
- package/dist/client/assets/{PortfolioOverview-mX6k5nL-.js.map → PortfolioOverview-Cnnxhgpt.js.map} +1 -1
- package/dist/client/assets/{PullRequestReviewPanel-DoI2jcWK.js → PullRequestReviewPanel-Blbjn1Ns.js} +4 -4
- package/dist/client/assets/{PullRequestReviewPanel-DoI2jcWK.js.map → PullRequestReviewPanel-Blbjn1Ns.js.map} +1 -1
- package/dist/client/assets/{ReleaseRoute-C80uadO-.js → ReleaseRoute-0QrCZbE4.js} +2 -2
- package/dist/client/assets/{ReleaseRoute-C80uadO-.js.map → ReleaseRoute-0QrCZbE4.js.map} +1 -1
- package/dist/client/assets/{ReleaseWorkset-D2Q-pMv0.js → ReleaseWorkset-DxZ0mgJC.js} +2 -2
- package/dist/client/assets/{ReleaseWorkset-D2Q-pMv0.js.map → ReleaseWorkset-DxZ0mgJC.js.map} +1 -1
- package/dist/client/assets/{ReviewSuggestionOverview-BMy26AXn.js → ReviewSuggestionOverview-CZyq_yfx.js} +2 -2
- package/dist/client/assets/{ReviewSuggestionOverview-BMy26AXn.js.map → ReviewSuggestionOverview-CZyq_yfx.js.map} +1 -1
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-CRWl9aYb.js → ReviewSuggestionPublicationSurface-B6b8PzT8.js} +2 -2
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-CRWl9aYb.js.map → ReviewSuggestionPublicationSurface-B6b8PzT8.js.map} +1 -1
- package/dist/client/assets/{ServicesPage-Bfr3sYg7.js → ServicesPage-zCaWYAK6.js} +2 -2
- package/dist/client/assets/{ServicesPage-Bfr3sYg7.js.map → ServicesPage-zCaWYAK6.js.map} +1 -1
- package/dist/client/assets/{TimelinePage-52RmwoTM.js → TimelinePage-5cMSPV9K.js} +2 -2
- package/dist/client/assets/{TimelinePage-52RmwoTM.js.map → TimelinePage-5cMSPV9K.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityLink-DwxZwXwT.js → WorkspaceEntityLink-CW3XgIHd.js} +2 -2
- package/dist/client/assets/{WorkspaceEntityLink-DwxZwXwT.js.map → WorkspaceEntityLink-CW3XgIHd.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityRoute-BWvMo9IK.js → WorkspaceEntityRoute-HlXUP8jk.js} +4 -4
- package/dist/client/assets/{WorkspaceEntityRoute-BWvMo9IK.js.map → WorkspaceEntityRoute-HlXUP8jk.js.map} +1 -1
- package/dist/client/assets/WorkspaceHomeLink-Bkd98CxT.js +2 -0
- package/dist/client/assets/{WorkspaceHomeLink-Vs72lXwi.js.map → WorkspaceHomeLink-Bkd98CxT.js.map} +1 -1
- package/dist/client/assets/{WorkspacePullRequestDetails-yNQRd79F.js → WorkspacePullRequestDetails-mIv0fssg.js} +3 -3
- package/dist/client/assets/{WorkspacePullRequestDetails-yNQRd79F.js.map → WorkspacePullRequestDetails-mIv0fssg.js.map} +1 -1
- package/dist/client/assets/{WorkspaceReleaseLayout-Ci-HsUIO.js → WorkspaceReleaseLayout-D2RrmuSp.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-Ci-HsUIO.js.map → WorkspaceReleaseLayout-D2RrmuSp.js.map} +1 -1
- package/dist/client/assets/{WorkspaceSettingsPage-CiQKaJv2.js → WorkspaceSettingsPage-CiVpUW2n.js} +2 -2
- package/dist/client/assets/{WorkspaceSettingsPage-CiQKaJv2.js.map → WorkspaceSettingsPage-CiVpUW2n.js.map} +1 -1
- package/dist/client/assets/{angular-html-B-gwpVlh-Cq4vjMyj.js → angular-html-B-gwpVlh-Cymx1bgk.js} +2 -2
- package/dist/client/assets/{angular-html-B-gwpVlh-Cq4vjMyj.js.map → angular-html-B-gwpVlh-Cymx1bgk.js.map} +1 -1
- package/dist/client/assets/{angular-ts-BdaH9qH_-e9JuDelg.js → angular-ts-BdaH9qH_-DfV0rlVi.js} +2 -2
- package/dist/client/assets/{angular-ts-BdaH9qH_-e9JuDelg.js.map → angular-ts-BdaH9qH_-DfV0rlVi.js.map} +1 -1
- package/dist/client/assets/{apl-BLTDDucx-BzhLkVBd.js → apl-BLTDDucx-QGqL8Zyu.js} +2 -2
- package/dist/client/assets/{apl-BLTDDucx-BzhLkVBd.js.map → apl-BLTDDucx-QGqL8Zyu.js.map} +1 -1
- package/dist/client/assets/{astro-CM3EIsEH-Ow1Hk5_H.js → astro-CM3EIsEH-UPw08TJg.js} +2 -2
- package/dist/client/assets/{astro-CM3EIsEH-Ow1Hk5_H.js.map → astro-CM3EIsEH-UPw08TJg.js.map} +1 -1
- package/dist/client/assets/{blade-BuLZ1b4i-BEq2hRPF.js → blade-BuLZ1b4i-DveZJd7d.js} +2 -2
- package/dist/client/assets/{blade-BuLZ1b4i-BEq2hRPF.js.map → blade-BuLZ1b4i-DveZJd7d.js.map} +1 -1
- package/dist/client/assets/{c-BOe7FNWg-b0CPmvGq.js → c-BOe7FNWg-C6rvzF2w.js} +2 -2
- package/dist/client/assets/{c-BOe7FNWg-b0CPmvGq.js.map → c-BOe7FNWg-C6rvzF2w.js.map} +1 -1
- package/dist/client/assets/{chapel-DS426I0C-Bdl9gjGU.js → chapel-DS426I0C-CyMEywxj.js} +2 -2
- package/dist/client/assets/{chapel-DS426I0C-Bdl9gjGU.js.map → chapel-DS426I0C-CyMEywxj.js.map} +1 -1
- package/dist/client/assets/{cobol-D88xw2SU-B-tWRYTQ.js → cobol-D88xw2SU-CJdybb9y.js} +2 -2
- package/dist/client/assets/{cobol-D88xw2SU-B-tWRYTQ.js.map → cobol-D88xw2SU-CJdybb9y.js.map} +1 -1
- package/dist/client/assets/{coffee-9O-pYXz5-CIYW8apR.js → coffee-9O-pYXz5-CwYHswTW.js} +2 -2
- package/dist/client/assets/{coffee-9O-pYXz5-CIYW8apR.js.map → coffee-9O-pYXz5-CwYHswTW.js.map} +1 -1
- package/dist/client/assets/{controlCenterRelayDock-zaVoWYIC.js → controlCenterRelayDock-BJGzwNRb.js} +3 -3
- package/dist/client/assets/{controlCenterRelayDock-zaVoWYIC.js.map → controlCenterRelayDock-BJGzwNRb.js.map} +1 -1
- package/dist/client/assets/{controlCenterRelayDockChrome-BYmBsXTg.js → controlCenterRelayDockChrome-NY7Yy3Wd.js} +2 -2
- package/dist/client/assets/{controlCenterRelayDockChrome-BYmBsXTg.js.map → controlCenterRelayDockChrome-NY7Yy3Wd.js.map} +1 -1
- package/dist/client/assets/{cpp-CPk7VU6o-BaDGXMSE.js → cpp-CPk7VU6o-meCcDOMv.js} +2 -2
- package/dist/client/assets/{cpp-CPk7VU6o-BaDGXMSE.js.map → cpp-CPk7VU6o-meCcDOMv.js.map} +1 -1
- package/dist/client/assets/{crystal-CRftOMVe-DHnKmVfR.js → crystal-CRftOMVe-BqF5ZH9X.js} +2 -2
- package/dist/client/assets/{crystal-CRftOMVe-DHnKmVfR.js.map → crystal-CRftOMVe-BqF5ZH9X.js.map} +1 -1
- package/dist/client/assets/{css-DKjIhbA_-CHqfnemG.js → css-DKjIhbA_-bArDG2fj.js} +2 -2
- package/dist/client/assets/{css-DKjIhbA_-CHqfnemG.js.map → css-DKjIhbA_-bArDG2fj.js.map} +1 -1
- package/dist/client/assets/{diff-BeVL1ItO.js → diff-BwuHSQEv.js} +3 -3
- package/dist/client/assets/{diff-BeVL1ItO.js.map → diff-BwuHSQEv.js.map} +1 -1
- package/dist/client/assets/{edge-CZci3foK-BGBPQtXV.js → edge-CZci3foK-Baej4bS3.js} +2 -2
- package/dist/client/assets/{edge-CZci3foK-BGBPQtXV.js.map → edge-CZci3foK-Baej4bS3.js.map} +1 -1
- package/dist/client/assets/{elixir-BFbWRTPN-D8ufalD-.js → elixir-BFbWRTPN-BWJLR11U.js} +2 -2
- package/dist/client/assets/{elixir-BFbWRTPN-D8ufalD-.js.map → elixir-BFbWRTPN-BWJLR11U.js.map} +1 -1
- package/dist/client/assets/{elm-BFCSOEGh-BWI2TEHg.js → elm-BFCSOEGh-CpyI6Neq.js} +2 -2
- package/dist/client/assets/{elm-BFCSOEGh-BWI2TEHg.js.map → elm-BFCSOEGh-CpyI6Neq.js.map} +1 -1
- package/dist/client/assets/{erb-C0EkZJvn-CGeW6FLC.js → erb-C0EkZJvn-Beo0qNuA.js} +2 -2
- package/dist/client/assets/{erb-C0EkZJvn-CGeW6FLC.js.map → erb-C0EkZJvn-Beo0qNuA.js.map} +1 -1
- package/dist/client/assets/{git-rebase-DBDs07B2-C__RuUYe.js → git-rebase-DBDs07B2-Br9li6by.js} +2 -2
- package/dist/client/assets/{git-rebase-DBDs07B2-C__RuUYe.js.map → git-rebase-DBDs07B2-Br9li6by.js.map} +1 -1
- package/dist/client/assets/{glimmer-js-oqYt1Bty-vrJ7QEYA.js → glimmer-js-oqYt1Bty-CI97juJO.js} +2 -2
- package/dist/client/assets/{glimmer-js-oqYt1Bty-vrJ7QEYA.js.map → glimmer-js-oqYt1Bty-CI97juJO.js.map} +1 -1
- package/dist/client/assets/{glimmer-ts-CjmgbZTn-CZyNz47e.js → glimmer-ts-CjmgbZTn-CFc8doTi.js} +2 -2
- package/dist/client/assets/{glimmer-ts-CjmgbZTn-CZyNz47e.js.map → glimmer-ts-CjmgbZTn-CFc8doTi.js.map} +1 -1
- package/dist/client/assets/{glsl-BqUMGrwT-BZCkTWpI.js → glsl-BqUMGrwT-BVf1nX6P.js} +2 -2
- package/dist/client/assets/{glsl-BqUMGrwT-BZCkTWpI.js.map → glsl-BqUMGrwT-BVf1nX6P.js.map} +1 -1
- package/dist/client/assets/{graphql-CEJryLGF-DDeR3BFq.js → graphql-CEJryLGF-CfFuHqok.js} +2 -2
- package/dist/client/assets/{graphql-CEJryLGF-DDeR3BFq.js.map → graphql-CEJryLGF-CfFuHqok.js.map} +1 -1
- package/dist/client/assets/{hack-DwBIwaGr-BeH7XNPv.js → hack-DwBIwaGr-BPMqrtdG.js} +2 -2
- package/dist/client/assets/{hack-DwBIwaGr-BeH7XNPv.js.map → hack-DwBIwaGr-BPMqrtdG.js.map} +1 -1
- package/dist/client/assets/{haml-BgD6GFV2-CCEflW5Z.js → haml-BgD6GFV2-Di-RgCFS.js} +2 -2
- package/dist/client/assets/{haml-BgD6GFV2-CCEflW5Z.js.map → haml-BgD6GFV2-Di-RgCFS.js.map} +1 -1
- package/dist/client/assets/{handlebars-DAEAtsmp-Dqwx0Kwh.js → handlebars-DAEAtsmp-BpuAuOPs.js} +2 -2
- package/dist/client/assets/{handlebars-DAEAtsmp-Dqwx0Kwh.js.map → handlebars-DAEAtsmp-BpuAuOPs.js.map} +1 -1
- package/dist/client/assets/{html-B63qAdeQ-BjlpEcyt.js → html-B63qAdeQ-Bp_oaeLi.js} +2 -2
- package/dist/client/assets/{html-B63qAdeQ-BjlpEcyt.js.map → html-B63qAdeQ-Bp_oaeLi.js.map} +1 -1
- package/dist/client/assets/{html-derivative-DliF0Izh-Dq9RKlA8.js → html-derivative-DliF0Izh-Bw81poXH.js} +2 -2
- package/dist/client/assets/{html-derivative-DliF0Izh-Dq9RKlA8.js.map → html-derivative-DliF0Izh-Bw81poXH.js.map} +1 -1
- package/dist/client/assets/{http-BPdteiK2-Cj-CMxKK.js → http-BPdteiK2-BBjGiW6O.js} +2 -2
- package/dist/client/assets/{http-BPdteiK2-Cj-CMxKK.js.map → http-BPdteiK2-BBjGiW6O.js.map} +1 -1
- package/dist/client/assets/{hurl-y6bQoMbn-DeXMgrrh.js → hurl-y6bQoMbn-CGKICVmL.js} +2 -2
- package/dist/client/assets/{hurl-y6bQoMbn-DeXMgrrh.js.map → hurl-y6bQoMbn-CGKICVmL.js.map} +1 -1
- package/dist/client/assets/{index-E-cqUXMY.js → index-fW9vMAFR.js} +3 -3
- package/dist/client/assets/{index-E-cqUXMY.js.map → index-fW9vMAFR.js.map} +1 -1
- package/dist/client/assets/{java-HDTZqoJ--BO-Jj0c5.js → java-HDTZqoJ--BeIYdX-t.js} +2 -2
- package/dist/client/assets/{java-HDTZqoJ--BO-Jj0c5.js.map → java-HDTZqoJ--BeIYdX-t.js.map} +1 -1
- package/dist/client/assets/{javascript-B8-PXjxO-CNlEZ_U-.js → javascript-B8-PXjxO-C4s21pIs.js} +2 -2
- package/dist/client/assets/{javascript-B8-PXjxO-CNlEZ_U-.js.map → javascript-B8-PXjxO-C4s21pIs.js.map} +1 -1
- package/dist/client/assets/{jinja-Li2helwk-CViXQJpU.js → jinja-Li2helwk-BCopqVIq.js} +2 -2
- package/dist/client/assets/{jinja-Li2helwk-CViXQJpU.js.map → jinja-Li2helwk-BCopqVIq.js.map} +1 -1
- package/dist/client/assets/{jison-D4pd2L4r-BoCbGSBL.js → jison-D4pd2L4r-CTDGIVzo.js} +2 -2
- package/dist/client/assets/{jison-D4pd2L4r-BoCbGSBL.js.map → jison-D4pd2L4r-CTDGIVzo.js.map} +1 -1
- package/dist/client/assets/{json-CHeq_08V-B5PDP4--.js → json-CHeq_08V-CdHymei0.js} +2 -2
- package/dist/client/assets/{json-CHeq_08V-B5PDP4--.js.map → json-CHeq_08V-CdHymei0.js.map} +1 -1
- package/dist/client/assets/{jsx-CTDAtxCE-YPyPyysB.js → jsx-CTDAtxCE-BKJFk7NT.js} +2 -2
- package/dist/client/assets/{jsx-CTDAtxCE-YPyPyysB.js.map → jsx-CTDAtxCE-BKJFk7NT.js.map} +1 -1
- package/dist/client/assets/{julia-B8HGxjvO-B7cty-kU.js → julia-B8HGxjvO-DbZcmZnq.js} +2 -2
- package/dist/client/assets/{julia-B8HGxjvO-B7cty-kU.js.map → julia-B8HGxjvO-DbZcmZnq.js.map} +1 -1
- package/dist/client/assets/{just-C1IY8eCo-BHAYLNfG.js → just-C1IY8eCo-DnzjlI44.js} +2 -2
- package/dist/client/assets/{just-C1IY8eCo-BHAYLNfG.js.map → just-C1IY8eCo-DnzjlI44.js.map} +1 -1
- package/dist/client/assets/{latex-CWjLpLhK-D7HTZDbj.js → latex-CWjLpLhK-BRJ7QYc1.js} +2 -2
- package/dist/client/assets/{latex-CWjLpLhK-D7HTZDbj.js.map → latex-CWjLpLhK-BRJ7QYc1.js.map} +1 -1
- package/dist/client/assets/{liquid-DO0vm52w-lvCobhXx.js → liquid-DO0vm52w-COb7GO7S.js} +2 -2
- package/dist/client/assets/{liquid-DO0vm52w-lvCobhXx.js.map → liquid-DO0vm52w-COb7GO7S.js.map} +1 -1
- package/dist/client/assets/{lua-rOZn354j-ODMkPdxs.js → lua-rOZn354j-B2CBXdd4.js} +2 -2
- package/dist/client/assets/{lua-rOZn354j-ODMkPdxs.js.map → lua-rOZn354j-B2CBXdd4.js.map} +1 -1
- package/dist/client/assets/{marko-CiZdnOV9-D9_XzPtX.js → marko-CiZdnOV9-CrlbLtbs.js} +2 -2
- package/dist/client/assets/{marko-CiZdnOV9-D9_XzPtX.js.map → marko-CiZdnOV9-CrlbLtbs.js.map} +1 -1
- package/dist/client/assets/{mdc-D1ADfxGi-B9kHGPaY.js → mdc-D1ADfxGi-5tloi5Ku.js} +2 -2
- package/dist/client/assets/{mdc-D1ADfxGi-B9kHGPaY.js.map → mdc-D1ADfxGi-5tloi5Ku.js.map} +1 -1
- package/dist/client/assets/{nginx-8KXIzHX2-8svBtm3U.js → nginx-8KXIzHX2-Y9gA2lux.js} +2 -2
- package/dist/client/assets/{nginx-8KXIzHX2-8svBtm3U.js.map → nginx-8KXIzHX2-Y9gA2lux.js.map} +1 -1
- package/dist/client/assets/{nim-CbBDSJf5-Ba_yd7rp.js → nim-CbBDSJf5-1Pnbq29n.js} +2 -2
- package/dist/client/assets/{nim-CbBDSJf5-Ba_yd7rp.js.map → nim-CbBDSJf5-1Pnbq29n.js.map} +1 -1
- package/dist/client/assets/{org-BlnOvN6p-Dvs9aaDc.js → org-BlnOvN6p-CUznrYZp.js} +2 -2
- package/dist/client/assets/{org-BlnOvN6p-Dvs9aaDc.js.map → org-BlnOvN6p-CUznrYZp.js.map} +1 -1
- package/dist/client/assets/{patterns-C3f2OP8b.js → patterns-Bc4kz9tn.js} +2 -2
- package/dist/client/assets/{patterns-C3f2OP8b.js.map → patterns-Bc4kz9tn.js.map} +1 -1
- package/dist/client/assets/{perl-CntHWu4k-2uoQgsvj.js → perl-CntHWu4k-BhS1nQNx.js} +2 -2
- package/dist/client/assets/{perl-CntHWu4k-2uoQgsvj.js.map → perl-CntHWu4k-BhS1nQNx.js.map} +1 -1
- package/dist/client/assets/{php-VF06KE26-Cy5BNgCu.js → php-VF06KE26-DTPzSju2.js} +2 -2
- package/dist/client/assets/{php-VF06KE26-Cy5BNgCu.js.map → php-VF06KE26-DTPzSju2.js.map} +1 -1
- package/dist/client/assets/{primitives-BnTwQBvt-Wa0KbeR5.js → primitives-BXWPLy2C-mP10m9L8.js} +2 -2
- package/dist/client/assets/{primitives-BnTwQBvt-Wa0KbeR5.js.map → primitives-BXWPLy2C-mP10m9L8.js.map} +1 -1
- package/dist/client/assets/{pug-DeZwH1tK-sFeyNqLq.js → pug-DeZwH1tK-B9No4pnM.js} +2 -2
- package/dist/client/assets/{pug-DeZwH1tK-sFeyNqLq.js.map → pug-DeZwH1tK-B9No4pnM.js.map} +1 -1
- package/dist/client/assets/{pullRequestReviewThreadReplay-CZK0ojth.js → pullRequestReviewThreadReplay-GsJkHDmp.js} +2 -2
- package/dist/client/assets/{pullRequestReviewThreadReplay-CZK0ojth.js.map → pullRequestReviewThreadReplay-GsJkHDmp.js.map} +1 -1
- package/dist/client/assets/{qml-CQhAR2tt-ghxlEb6L.js → qml-CQhAR2tt-XfN_XeIY.js} +2 -2
- package/dist/client/assets/{qml-CQhAR2tt-ghxlEb6L.js.map → qml-CQhAR2tt-XfN_XeIY.js.map} +1 -1
- package/dist/client/assets/{r-CGShpgkr-BnDtomVK.js → r-CGShpgkr-CSPdymwb.js} +2 -2
- package/dist/client/assets/{r-CGShpgkr-BnDtomVK.js.map → r-CGShpgkr-CSPdymwb.js.map} +1 -1
- package/dist/client/assets/{razor-CgB2QCs6-Du0sH0Qv.js → razor-CgB2QCs6-CpnEe0o4.js} +2 -2
- package/dist/client/assets/{razor-CgB2QCs6-Du0sH0Qv.js.map → razor-CgB2QCs6-CpnEe0o4.js.map} +1 -1
- package/dist/client/assets/{regexp-go_CdRjx-DZsiR-xj.js → regexp-go_CdRjx-CygQCdLU.js} +2 -2
- package/dist/client/assets/{regexp-go_CdRjx-DZsiR-xj.js.map → regexp-go_CdRjx-CygQCdLU.js.map} +1 -1
- package/dist/client/assets/{releaseRoutes-DLfDmfqe.js → releaseRoutes-Dk8MT0in.js} +2 -2
- package/dist/client/assets/{releaseRoutes-DLfDmfqe.js.map → releaseRoutes-Dk8MT0in.js.map} +1 -1
- package/dist/client/assets/{rst-CbWMI8ou-frdHzckK.js → rst-CbWMI8ou-GxcerOld.js} +2 -2
- package/dist/client/assets/{rst-CbWMI8ou-frdHzckK.js.map → rst-CbWMI8ou-GxcerOld.js.map} +1 -1
- package/dist/client/assets/{ruby-DsGwIs06-DFbM8woV.js → ruby-DsGwIs06-DFlD6ccB.js} +2 -2
- package/dist/client/assets/{ruby-DsGwIs06-DFbM8woV.js.map → ruby-DsGwIs06-DFlD6ccB.js.map} +1 -1
- package/dist/client/assets/{sas-DjxN8J4Z-Fo0Jhar_.js → sas-DjxN8J4Z-O-nhpylU.js} +2 -2
- package/dist/client/assets/{sas-DjxN8J4Z-Fo0Jhar_.js.map → sas-DjxN8J4Z-O-nhpylU.js.map} +1 -1
- package/dist/client/assets/{scss-bkiiULjK-jVZWZBbu.js → scss-bkiiULjK-BCCx5Vl_.js} +2 -2
- package/dist/client/assets/{scss-bkiiULjK-jVZWZBbu.js.map → scss-bkiiULjK-BCCx5Vl_.js.map} +1 -1
- package/dist/client/assets/{shellscript-Cuh1SIPr-Dbirzu6D.js → shellscript-Cuh1SIPr-CHsx4a67.js} +2 -2
- package/dist/client/assets/{shellscript-Cuh1SIPr-Dbirzu6D.js.map → shellscript-Cuh1SIPr-CHsx4a67.js.map} +1 -1
- package/dist/client/assets/{shellsession-C4UOwxb7-7CJWgYuy.js → shellsession-C4UOwxb7-D6bkncqE.js} +2 -2
- package/dist/client/assets/{shellsession-C4UOwxb7-7CJWgYuy.js.map → shellsession-C4UOwxb7-D6bkncqE.js.map} +1 -1
- package/dist/client/assets/{soy-CeGFXpLT-D9dc77z6.js → soy-CeGFXpLT-9HOh-Ygc.js} +2 -2
- package/dist/client/assets/{soy-CeGFXpLT-D9dc77z6.js.map → soy-CeGFXpLT-9HOh-Ygc.js.map} +1 -1
- package/dist/client/assets/{sql-qDYmMTO1-uEsSySDj.js → sql-qDYmMTO1-CEdQ0v3n.js} +2 -2
- package/dist/client/assets/{sql-qDYmMTO1-uEsSySDj.js.map → sql-qDYmMTO1-CEdQ0v3n.js.map} +1 -1
- package/dist/client/assets/{stata-Dzus_rwP-BH7vam06.js → stata-Dzus_rwP-BuG1u1jJ.js} +2 -2
- package/dist/client/assets/{stata-Dzus_rwP-BH7vam06.js.map → stata-Dzus_rwP-BuG1u1jJ.js.map} +1 -1
- package/dist/client/assets/{surrealql-DmTrf8uR-CWkOYJpX.js → surrealql-DmTrf8uR-CSBOHXCO.js} +2 -2
- package/dist/client/assets/{surrealql-DmTrf8uR-CWkOYJpX.js.map → surrealql-DmTrf8uR-CSBOHXCO.js.map} +1 -1
- package/dist/client/assets/{svelte-CWlRonoS-BlW_D3qk.js → svelte-CWlRonoS-DgXWzKbz.js} +2 -2
- package/dist/client/assets/{svelte-CWlRonoS-BlW_D3qk.js.map → svelte-CWlRonoS-DgXWzKbz.js.map} +1 -1
- package/dist/client/assets/{templ-EuFg1gKs-BPpn997C.js → templ-EuFg1gKs-Gm_jX91q.js} +2 -2
- package/dist/client/assets/{templ-EuFg1gKs-BPpn997C.js.map → templ-EuFg1gKs-Gm_jX91q.js.map} +1 -1
- package/dist/client/assets/{tex-Cbbx1SXS-BYnCXVUj.js → tex-Cbbx1SXS-UHGl4s7W.js} +2 -2
- package/dist/client/assets/{tex-Cbbx1SXS-BYnCXVUj.js.map → tex-Cbbx1SXS-UHGl4s7W.js.map} +1 -1
- package/dist/client/assets/{ts-tags-DOHpIWV2-DGGUehb1.js → ts-tags-DOHpIWV2-BFeQ2_qS.js} +2 -2
- package/dist/client/assets/{ts-tags-DOHpIWV2-DGGUehb1.js.map → ts-tags-DOHpIWV2-BFeQ2_qS.js.map} +1 -1
- package/dist/client/assets/{tsx-DmRL3u_2-BuphZRb1.js → tsx-DmRL3u_2-XbmtCpCA.js} +2 -2
- package/dist/client/assets/{tsx-DmRL3u_2-BuphZRb1.js.map → tsx-DmRL3u_2-XbmtCpCA.js.map} +1 -1
- package/dist/client/assets/{twig-BzcHspK1-BHSYcxkL.js → twig-BzcHspK1-taTu1Drs.js} +2 -2
- package/dist/client/assets/{twig-BzcHspK1-BHSYcxkL.js.map → twig-BzcHspK1-taTu1Drs.js.map} +1 -1
- package/dist/client/assets/{typescript-BYTx4UxO-BWghQV1V.js → typescript-BYTx4UxO-kK2df6yp.js} +2 -2
- package/dist/client/assets/{typescript-BYTx4UxO-BWghQV1V.js.map → typescript-BYTx4UxO-kK2df6yp.js.map} +1 -1
- package/dist/client/assets/{typst-BrfC91e7-D-qhUyZC.js → typst-BrfC91e7-D77xpI_O.js} +2 -2
- package/dist/client/assets/{typst-BrfC91e7-D-qhUyZC.js.map → typst-BrfC91e7-D77xpI_O.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceDefaultLanding-DaE2YGNd.js → useWorkspaceDefaultLanding-CHavgP2x.js} +2 -2
- package/dist/client/assets/{useWorkspaceDefaultLanding-DaE2YGNd.js.map → useWorkspaceDefaultLanding-CHavgP2x.js.map} +1 -1
- package/dist/client/assets/{vue-B92PIQFm-CoGWLOqg.js → vue-B92PIQFm-CxfWUGFO.js} +2 -2
- package/dist/client/assets/{vue-B92PIQFm-CoGWLOqg.js.map → vue-B92PIQFm-CxfWUGFO.js.map} +1 -1
- package/dist/client/assets/{vue-html-EDHI-aeE-CC2k9uRQ.js → vue-html-EDHI-aeE-uPrIvgh4.js} +2 -2
- package/dist/client/assets/{vue-html-EDHI-aeE-CC2k9uRQ.js.map → vue-html-EDHI-aeE-uPrIvgh4.js.map} +1 -1
- package/dist/client/assets/{vue-vine-CmMdgoEY-_zZ7pZf1.js → vue-vine-CmMdgoEY-eCdJx6AS.js} +2 -2
- package/dist/client/assets/{vue-vine-CmMdgoEY-_zZ7pZf1.js.map → vue-vine-CmMdgoEY-eCdJx6AS.js.map} +1 -1
- package/dist/client/assets/{workspaceEntityRoutes-BUuMTdMr.js → workspaceEntityRoutes-DeWAeNbF.js} +2 -2
- package/dist/client/assets/{workspaceEntityRoutes-BUuMTdMr.js.map → workspaceEntityRoutes-DeWAeNbF.js.map} +1 -1
- package/dist/client/assets/{workspaceScrollCapture-DllLzjf8.js → workspaceScrollCapture-Cr6uBq-z.js} +2 -2
- package/dist/client/assets/{workspaceScrollCapture-DllLzjf8.js.map → workspaceScrollCapture-Cr6uBq-z.js.map} +1 -1
- package/dist/client/assets/{xml-Bz9Nzp99-B0ZZBRFq.js → xml-Bz9Nzp99-DniaQ-4l.js} +2 -2
- package/dist/client/assets/{xml-Bz9Nzp99-B0ZZBRFq.js.map → xml-Bz9Nzp99-DniaQ-4l.js.map} +1 -1
- package/dist/client/assets/{xsl-D0pOnfMq-DJSuRtxm.js → xsl-D0pOnfMq-DIsX5RIx.js} +2 -2
- package/dist/client/assets/{xsl-D0pOnfMq-DJSuRtxm.js.map → xsl-D0pOnfMq-DIsX5RIx.js.map} +1 -1
- package/dist/client/assets/{yaml-DKDHNCIP-CkHFy1FE.js → yaml-DKDHNCIP-DZpgjsVZ.js} +2 -2
- package/dist/client/assets/{yaml-DKDHNCIP-CkHFy1FE.js.map → yaml-DKDHNCIP-DZpgjsVZ.js.map} +1 -1
- package/dist/client/index.html +1 -1
- package/package.json +8 -8
- package/dist/client/assets/WorkspaceHomeLink-Vs72lXwi.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["ReviewProfileControl","profile","selected","profiles","id","selectedProfileId","presentation","_jsx","accessibleName","label","_jsxs","groupName","onProfileChange","describeProfile","Field","className","controlProps","disabled","event","anchorLabel","suggestion","replacementSides","before","after","currentPath","oldLinesRemaining","newLinesRemaining","line","unifiedDiff","hunk","boundary","content","suggestionStateLabel","state","ReviewSuggestionCard","replacement","import_jsx_runtime","styles","metadata","Text","location","extraActions","canPublish","Button","isPreviewing","publicationBlockedReason","onPreviewPublication","ReviewNotes","notes","note","reviewSuggestionRevisionAuthorLabel","revision","reviewSuggestionRevisionValidationLabel","ReviewSuggestionRevisionHistory","revisions","page","revisionId","DateTime.formatIso","DateTime.formatLocal","_Fragment","loadingEarlier","loadEarlier","AdvancedSuggestionFields","Schema.Struct","PrReviewSuggestion","AdvancedSuggestionFieldsJson","Schema.fromJsonString","narrativeFields","editableSuggestion","advancedJson","Schema.encodeSync","ReviewSuggestionRevisionDialog","current","draft","setDraft","useState","advanced","setAdvanced","advancedError","setAdvancedError","import_react","open","nextDraft","preservedDraft","description","useMemo","save","decoded","Schema.decodeUnknownResult","Result.isFailure","edit","PrReviewSuggestionEdit","onSave","Dialog","mode","severity","level","field","conflict","onResolveConflict","saving","canEdit","REVISION_PAGE_SIZE","PrReviewSuggestionRevisionPageSize","browserReviewSuggestionRevisionTransport","Effect.runPromise","Effect.gen","makeAuthenticatedMutationClient","scope","request","Effect.provide","FetchHttpClient.layer","makeControlCenterApiClient","sameScope","left","right","mergePages","earlier","retained","pageWithAcceptedRevision","accepted","saveOutcome","conflictFailure","Predicate.isTagged","ignoreAcceptedRevision","useReviewSuggestionRevisions","requestRevision","setRequestRevision","setLoadingEarlier","setState","activeAbort","useRef","loadingEarlierRef","latestScope","latestOnAccepted","onAccepted","abort","transport","useCallback","acceptedPage","failure","latest","outcome","dismiss","authorLabel","author","VersionedReviewSuggestionCard","controller","entityId","jobId","sessionKey","revisionTransport","onSuggestionRevisionAccepted","dialogMode","setDialogMode","dialogOpen","setDialogOpen","dismissOpen","setDismissOpen","dismissalReason","setDismissalReason","presentedSuggestion","suggestionCanMutate","validationBlocked","openDialog","onTargetSuggestion","selection","reason","PrReviewDismissalReason","unavailableMessage","outcomeLabel","formatBudget","minutes","budgetMillis","providerIdName","providerId","providerName","provider","providerReviewLabel","modelName","model","networkAccessLabel","networkAccess","failureHeading","stage","failureCause","cause","failureGuidance","retryable","REVIEW_PROMPT_TEMPLATES","ReviewPresetChoices","presets","controlCenterReviewProfile","preset","onSelect","selectedProviderId","THREAD_END_THRESHOLD","ReviewThreadTranscript","scrollerRef","followsLatestRef","previousRef","hasNewActivity","setHasNewActivity","first","events","last","scroller","previous","prepended","appended","previousFirstElement","element","followsLatest","firstElement","hasEarlier","historyAction","onLoadEarlier","historyLoaded","summary","ReviewSuggestionPublicationSurface","lazy","ReviewOrientationSurface","orientation","cohort","layer","path","startLine","endLine","layerIndex","cohortIndex","threadEventSummary","PullRequestReviewPanel","launchOpen","setLaunchOpen","setRequest","requestedSelection","setRequestedSelection","submittedRequest","setSubmittedRequest","setSelectedProviderId","requestRef","targetedSubmissionInFlightRef","providerPresets","selectedProvider","durableProviderName","candidate","requestScope","textarea","changeLaunchOpen","submitFullReview","onStart","submitTargetedReview","prompt","handleComposerKeyDown","insertPromptTemplate","selectionStart","selectionEnd","leadingBreak","trailingBreak","availableInsertionLength","MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH","insertion","nextRequest","publicationSurface","publication","Suspense","onCancelPublication","onPublishSuggestion","withPublication","onRetry","review","threadEvents","usageJobId","usageEvents","usage","total","usageRun","completeUsageVisible","missingUsageLabel","presentedThreadEvents","item","visibleThreadEvents","reviewRunning","composerDisabled","threadSurface","canEnqueue","template","withThread","reviewLaunch","triggerLabel","repeat","headRevision","startedAt","DateTime.toEpochMillis","DateTime.nowUnsafe","index","onExtendReviewBudget","onCancelReview","previousReviewCompleted","report","suggestions"],"ignoreList":[],"sources":["../../../../review/dist/view.js","../../../src/client/entities/ReviewSuggestionPresentation.tsx","../../../src/client/entities/ReviewSuggestionRevisionHistory.tsx","../../../src/client/entities/ReviewSuggestionRevisionDialog.tsx","../../../src/client/entities/useReviewSuggestionRevisions.ts","../../../src/client/entities/VersionedReviewSuggestionCard.tsx","../../../src/client/entities/PullRequestReviewPanel.tsx"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/** Controlled review controls and retained-result status. @module */\nimport { Field, StateLabel } from \"@knpkv/rly/primitives\";\n/** One profile owns kind, skills, provider, harness, and model; callers cannot create a mixed selection. */\nexport const ReviewProfileControl = ({ accessibleName, className, describeProfile = (profile) => `${profile.provider} · ${profile.model}`, disabled = false, groupName = \"review-profile\", label = \"Profile\", onProfileChange, presentation = \"select\", profiles, selectedProfileId }) => {\n const selected = profiles.find(({ id }) => id === selectedProfileId);\n if (presentation === \"radios\") {\n return (_jsx(\"fieldset\", { \"aria-label\": accessibleName ?? label, className: className, disabled: disabled, children: profiles.map((profile) => (_jsxs(\"label\", { children: [_jsx(\"input\", { checked: profile.id === selectedProfileId, name: groupName, onChange: () => onProfileChange(profile), type: \"radio\", value: profile.id }), _jsxs(\"span\", { children: [_jsx(\"strong\", { children: profile.name }), _jsx(\"small\", { children: describeProfile(profile) })] })] }, profile.id))) }));\n }\n return (_jsx(Field, { ...(className === undefined ? {} : { className }), ...(selected === undefined ? {} : { description: describeProfile(selected) }), label: label, size: \"compact\", children: (controlProps) => (_jsxs(\"select\", { ...controlProps, disabled: disabled || profiles.length === 0, onChange: (event) => {\n const profile = profiles.find(({ id }) => id === event.currentTarget.value);\n if (profile !== undefined)\n onProfileChange(profile);\n }, value: selected?.id ?? \"\", children: [selected === undefined ? _jsx(\"option\", { value: \"\", children: \"Select a profile\" }) : null, profiles.map((profile) => (_jsx(\"option\", { value: profile.id, children: profile.name }, profile.id)))] })) }));\n};\nexport const ReviewResultStatus = ({ presentation }) => {\n switch (presentation._tag) {\n case \"Empty\":\n return null;\n case \"Current\":\n return _jsx(StateLabel, { label: presentation.completed.profile.name, size: \"compact\", tone: \"progress\" });\n case \"Previous\":\n return _jsx(StateLabel, { label: \"Previous result\", size: \"compact\", tone: \"caution\" });\n case \"Stale\":\n return _jsx(StateLabel, { label: \"Earlier revision\", size: \"compact\", tone: \"caution\" });\n }\n};\n//# sourceMappingURL=view.js.map","import { Button, Text } from \"@knpkv/rly/primitives\"\nimport type { ReactElement, ReactNode } from \"react\"\n\nimport type { JobId } from \"../../domain/identifiers.js\"\nimport type { PrReviewNote, PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst anchorLabel = (suggestion: PrReviewSuggestion): string => {\n switch (suggestion.anchor._tag) {\n case \"line\":\n return `Line suggestion · ${suggestion.anchor.path}:${String(suggestion.anchor.line)}`\n case \"file\":\n return `File suggestion · ${suggestion.anchor.path}:${String(suggestion.anchor.line)}`\n case \"changes\":\n return \"Whole-change suggestion\"\n }\n}\n\nconst replacementSides = (unifiedDiff: string) => {\n const before = new Array<string>()\n const after = new Array<string>()\n let currentPath = \"\"\n let oldLinesRemaining = 0\n let newLinesRemaining = 0\n for (const line of unifiedDiff.split(\"\\n\")) {\n const hunk = /^@@ -\\d+(?:,(\\d+))? \\+\\d+(?:,(\\d+))? @@/u.exec(line)\n if (hunk !== null) {\n const boundary = `⋯ ${currentPath} · ${line}`\n before.push(boundary)\n after.push(boundary)\n oldLinesRemaining = Number(hunk[1] ?? \"1\")\n newLinesRemaining = Number(hunk[2] ?? \"1\")\n continue\n }\n if (oldLinesRemaining === 0 && newLinesRemaining === 0) {\n if (line.startsWith(\"+++ \")) currentPath = line.slice(4).replace(/^b\\//u, \"\")\n continue\n }\n if (line === \"\\\\") continue\n if (line.startsWith(\"-\") && oldLinesRemaining > 0) {\n before.push(line.slice(1))\n oldLinesRemaining -= 1\n continue\n }\n if (line.startsWith(\"+\") && newLinesRemaining > 0) {\n after.push(line.slice(1))\n newLinesRemaining -= 1\n continue\n }\n if (line.startsWith(\" \") && oldLinesRemaining > 0 && newLinesRemaining > 0) {\n const content = line.slice(1)\n before.push(content)\n after.push(content)\n oldLinesRemaining -= 1\n newLinesRemaining -= 1\n continue\n }\n }\n return {\n before: before.join(\"\\n\"),\n after: after.join(\"\\n\")\n }\n}\n\nconst suggestionStateLabel = (state: PrReviewSuggestion[\"state\"]): string =>\n `${state.slice(0, 1).toUpperCase()}${state.slice(1)}`\n\n/** Present one publishable, evidence-backed suggestion without owning its lifecycle. */\nexport const ReviewSuggestionCard = ({\n canPublish,\n extraActions,\n isPreviewing,\n jobId,\n metadata,\n onPreviewPublication,\n publicationBlockedReason,\n suggestion\n}: {\n readonly canPublish: boolean\n readonly extraActions?: ReactNode\n readonly isPreviewing: boolean\n readonly jobId: JobId\n readonly metadata?: ReactNode\n readonly onPreviewPublication: (selection: {\n readonly jobId: JobId\n readonly suggestionId: PrReviewSuggestion[\"suggestionId\"]\n }) => void\n readonly publicationBlockedReason?: string\n readonly suggestion: PrReviewSuggestion\n}): ReactElement => {\n const replacement = suggestion.replacement === undefined ? null : replacementSides(suggestion.replacement.unifiedDiff)\n\n return (\n <article className={styles.suggestionCard} data-severity={suggestion.severity}>\n <header className={styles.suggestionHeading}>\n <span className={styles.severity}>{suggestion.severity}</span>\n <span>\n <small>{anchorLabel(suggestion)}</small>\n <strong>{suggestion.title}</strong>\n </span>\n <span className={styles.confidence}>\n {suggestionStateLabel(suggestion.state)} · {suggestion.confidence.level} confidence\n </span>\n </header>\n {metadata}\n\n <Text>{suggestion.problem}</Text>\n <dl className={styles.suggestionDetails}>\n <div>\n <dt>Impact</dt>\n <dd>{suggestion.impact}</dd>\n </div>\n <div>\n <dt>Recommendation</dt>\n <dd>{suggestion.recommendation}</dd>\n </div>\n </dl>\n <details>\n <summary>Evidence and confidence</summary>\n <code>\n {suggestion.evidence.path}:{String(suggestion.evidence.startLine)}\n {suggestion.evidence.endLine === suggestion.evidence.startLine\n ? \"\"\n : `–${String(suggestion.evidence.endLine)}`}\n </code>\n <pre>{suggestion.evidence.excerpt}</pre>\n <Text>{suggestion.confidence.reason}</Text>\n </details>\n\n {suggestion.relatedLocations.length === 0 ? null : (\n <section aria-label=\"Related locations\" className={styles.relatedLocations}>\n <strong>Related locations</strong>\n <ul>\n {suggestion.relatedLocations.map((location) => (\n <li key={`${location.path}:${String(location.startLine)}:${String(location.endLine)}`}>\n <code>\n {location.path}:{String(location.startLine)}\n {location.endLine === location.startLine ? \"\" : `–${String(location.endLine)}`}\n </code>\n <span>{location.label}</span>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {replacement === null || suggestion.replacement === undefined ? null : (\n <section aria-label=\"Suggested replacement\" className={styles.replacementPreview}>\n <header>\n <strong>Suggested replacement</strong>\n <span>Inert patch · {suggestion.replacement.reviewedHead.slice(0, 12)}</span>\n </header>\n <Text>{suggestion.replacement.explanation}</Text>\n <div>\n <figure>\n <figcaption>Before</figcaption>\n <pre>{replacement.before}</pre>\n </figure>\n <figure>\n <figcaption>After</figcaption>\n <pre>{replacement.after}</pre>\n </figure>\n </div>\n </section>\n )}\n\n {suggestion.prevention === undefined ? null : suggestion.prevention.enforcement === \"none\" ? (\n <details className={styles.preventionProposal}>\n <summary>Prevention note · no stable guardrail</summary>\n <Text>\n {suggestion.prevention.summary} · {suggestion.prevention.rationale}\n </Text>\n </details>\n ) : (\n <details className={styles.preventionProposal}>\n <summary>Prevention proposal · separate review required</summary>\n <Text>\n {suggestion.prevention.summary} · {suggestion.prevention.enforcement}\n </Text>\n <dl>\n <dt>Recurring evidence</dt>\n <dd>{suggestion.prevention.recurrenceEvidence}</dd>\n <dt>Existing rule or configuration</dt>\n <dd>{suggestion.prevention.existingRuleOrConfig}</dd>\n <dt>Target file</dt>\n <dd>{suggestion.prevention.targetFile}</dd>\n <dt>Source paths</dt>\n <dd>{suggestion.prevention.sourcePaths.join(\", \")}</dd>\n <dt>Matcher or invariant</dt>\n <dd>{suggestion.prevention.matcherOrInvariant}</dd>\n <dt>Invalid fixture</dt>\n <dd>\n <pre>{suggestion.prevention.invalidFixture}</pre>\n </dd>\n <dt>Valid fixture</dt>\n <dd>\n <pre>{suggestion.prevention.validFixture}</pre>\n </dd>\n <dt>Boundary and exclusions</dt>\n <dd>{suggestion.prevention.boundary}</dd>\n </dl>\n </details>\n )}\n\n {extraActions === undefined && (!canPublish || suggestion.state !== \"draft\") ? null : (\n <div className={styles.suggestionActions}>\n {extraActions}\n {canPublish && suggestion.state === \"draft\" ? (\n <Button\n disabled={isPreviewing || publicationBlockedReason !== undefined}\n onClick={() =>\n onPreviewPublication({\n jobId,\n suggestionId: suggestion.suggestionId\n })\n }\n >\n {isPreviewing ? \"Preparing approval…\" : \"Review & approve\"}\n </Button>\n ) : null}\n </div>\n )}\n {publicationBlockedReason === undefined ? null : (\n <Text role=\"status\" tone=\"secondary\" variant=\"meta\">\n {publicationBlockedReason}\n </Text>\n )}\n </article>\n )\n}\n\n/** Keep non-publishable observations visibly separate from actionable suggestions. */\nexport const ReviewNotes = ({ notes }: { readonly notes: ReadonlyArray<PrReviewNote> }): ReactElement | null =>\n notes.length === 0 ? null : (\n <section aria-labelledby=\"review-notes-title\" className={styles.reviewNotes}>\n <header>\n <span>\n <small>Never publishable</small>\n <strong id=\"review-notes-title\">Review Notes</strong>\n </span>\n <span>{notes.length}</span>\n </header>\n <ul>\n {notes.map((note) => (\n <li key={note.noteId}>\n <span>\n {note.reason === \"pre-existing\" ? \"Pre-existing\" : \"Low confidence\"} · {note.confidence.level}\n </span>\n <strong>{note.title}</strong>\n <Text>{note.observation}</Text>\n {note.location === undefined ? null : (\n <code>\n {note.location.path}:{String(note.location.startLine)}\n {note.location.endLine === note.location.startLine ? \"\" : `–${String(note.location.endLine)}`}\n </code>\n )}\n <small>{note.confidence.reason}</small>\n </li>\n ))}\n </ul>\n </section>\n )\n","import { Button, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\n\nimport type { PrReviewSuggestionRevision, PrReviewSuggestionRevisionPage } from \"../../domain/prReviewRevision.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nexport const reviewSuggestionRevisionAuthorLabel = (revision: PrReviewSuggestionRevision): string =>\n revision.author._tag === \"operator\"\n ? \"Operator\"\n : `${revision.author.providerId}${revision.author.model === null ? \"\" : ` · ${revision.author.model}`}`\n\nexport const reviewSuggestionRevisionValidationLabel = (revision: PrReviewSuggestionRevision): string =>\n revision.validation._tag === \"validated\" ? \"Validated\" : \"Needs revalidation\"\n\n/** Inspect complete immutable suggestion history without leaving the diff. */\nexport const ReviewSuggestionRevisionHistory = ({\n loadEarlier,\n loadingEarlier,\n page\n}: {\n readonly loadEarlier: () => void\n readonly loadingEarlier: boolean\n readonly page: PrReviewSuggestionRevisionPage\n}): ReactElement => {\n const revisions = [page.current, ...page.revisions.filter(({ revisionId }) => revisionId !== page.current.revisionId)]\n return (\n <div className={styles.revisionHistory}>\n <ol>\n {revisions.map((revision) => (\n <li key={revision.revisionId}>\n <header>\n <strong>Revision {String(revision.sequence)}</strong>\n <span>\n {reviewSuggestionRevisionValidationLabel(revision)} · {reviewSuggestionRevisionAuthorLabel(revision)}\n </span>\n </header>\n <time dateTime={DateTime.formatIso(revision.createdAt)}>\n {DateTime.formatLocal(revision.createdAt, {\n dateStyle: \"medium\",\n timeStyle: \"short\"\n })}\n </time>\n <details>\n <summary>{revision.suggestion.title}</summary>\n <Text>{revision.suggestion.problem}</Text>\n <dl>\n <dt>Impact</dt>\n <dd>{revision.suggestion.impact}</dd>\n <dt>Recommendation</dt>\n <dd>{revision.suggestion.recommendation}</dd>\n <dt>Severity</dt>\n <dd>{revision.suggestion.severity}</dd>\n <dt>Confidence</dt>\n <dd>\n {revision.suggestion.confidence.level} · {revision.suggestion.confidence.reason}\n </dd>\n <dt>Evidence</dt>\n <dd>\n <code>\n {revision.suggestion.evidence.path}:{String(revision.suggestion.evidence.startLine)}\n </code>\n <pre>{revision.suggestion.evidence.excerpt}</pre>\n </dd>\n <dt>Anchor</dt>\n <dd>\n <code>{JSON.stringify(revision.suggestion.anchor)}</code>\n </dd>\n <dt>Related locations</dt>\n <dd>\n {revision.suggestion.relatedLocations.length === 0 ? (\n \"None\"\n ) : (\n <pre>{JSON.stringify(revision.suggestion.relatedLocations, null, 2)}</pre>\n )}\n </dd>\n <dt>Replacement</dt>\n <dd>\n {revision.suggestion.replacement === undefined ? (\n \"None\"\n ) : (\n <>\n <Text>{revision.suggestion.replacement.explanation}</Text>\n <pre>{revision.suggestion.replacement.unifiedDiff}</pre>\n </>\n )}\n </dd>\n <dt>Prevention</dt>\n <dd>\n {revision.suggestion.prevention === undefined ? (\n \"None\"\n ) : (\n <pre>{JSON.stringify(revision.suggestion.prevention, null, 2)}</pre>\n )}\n </dd>\n </dl>\n </details>\n </li>\n ))}\n </ol>\n {page.hasMore ? (\n <Button aria-busy={loadingEarlier} disabled={loadingEarlier} loading={loadingEarlier} onClick={loadEarlier}>\n {loadingEarlier ? \"Loading earlier revisions…\" : \"Load earlier revisions\"}\n </Button>\n ) : null}\n </div>\n )\n}\n","import { Button, Dialog, Text } from \"@knpkv/rly/primitives\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useMemo, useState } from \"react\"\n\nimport { PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport { PrReviewSuggestionEdit, type PrReviewSuggestionRevisionPage } from \"../../domain/prReviewRevision.js\"\nimport {\n ReviewSuggestionRevisionHistory,\n reviewSuggestionRevisionAuthorLabel,\n reviewSuggestionRevisionValidationLabel\n} from \"./ReviewSuggestionRevisionHistory.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst AdvancedSuggestionFields = Schema.Struct({\n anchor: PrReviewSuggestion.fields.anchor,\n evidence: PrReviewSuggestion.fields.evidence,\n relatedLocations: PrReviewSuggestion.fields.relatedLocations,\n replacement: PrReviewSuggestion.fields.replacement,\n prevention: PrReviewSuggestion.fields.prevention\n})\nconst AdvancedSuggestionFieldsJson = Schema.fromJsonString(AdvancedSuggestionFields)\nconst narrativeFields = [\n [\"Problem\", \"problem\"],\n [\"Impact\", \"impact\"],\n [\"Recommendation\", \"recommendation\"]\n] satisfies ReadonlyArray<readonly [string, \"impact\" | \"problem\" | \"recommendation\"]>\n\nconst editableSuggestion = (suggestion: PrReviewSuggestion): PrReviewSuggestionEdit => ({\n title: suggestion.title,\n severity: suggestion.severity,\n problem: suggestion.problem,\n impact: suggestion.impact,\n evidence: suggestion.evidence,\n recommendation: suggestion.recommendation,\n confidence: suggestion.confidence,\n relatedLocations: suggestion.relatedLocations,\n ...(!(suggestion.prevention === undefined) && { prevention: suggestion.prevention }),\n ...(!(suggestion.replacement === undefined) && { replacement: suggestion.replacement }),\n anchor: suggestion.anchor\n})\n\nconst advancedJson = (suggestion: PrReviewSuggestionEdit): string =>\n Schema.encodeSync(AdvancedSuggestionFieldsJson)({\n anchor: suggestion.anchor,\n evidence: suggestion.evidence,\n relatedLocations: suggestion.relatedLocations,\n ...(!(suggestion.prevention === undefined) && { prevention: suggestion.prevention }),\n ...(!(suggestion.replacement === undefined) && { replacement: suggestion.replacement })\n })\n\n/** Edit or inspect one immutable suggestion revision without leaving the diff. */\nexport const ReviewSuggestionRevisionDialog = ({\n canEdit,\n conflict,\n loadEarlier,\n loadingEarlier,\n mode,\n onOpenChange,\n onResolveConflict,\n onSave,\n open,\n page,\n preservedDraft,\n saving\n}: {\n readonly canEdit: boolean\n readonly conflict: boolean\n readonly loadEarlier: () => void\n readonly loadingEarlier: boolean\n readonly mode: \"edit\" | \"history\"\n readonly onOpenChange: (open: boolean) => void\n readonly onResolveConflict: () => void\n readonly onSave: (edit: PrReviewSuggestionEdit) => void\n readonly open: boolean\n readonly page: PrReviewSuggestionRevisionPage\n readonly preservedDraft: PrReviewSuggestionEdit | null\n readonly saving: boolean\n}): ReactElement => {\n const current = page.current\n const [draft, setDraft] = useState(() => editableSuggestion(current.suggestion))\n const [advanced, setAdvanced] = useState(() => advancedJson(current.suggestion))\n const [advancedError, setAdvancedError] = useState(false)\n useEffect(() => {\n if (!open) return\n const nextDraft = preservedDraft ?? editableSuggestion(current.suggestion)\n setDraft(nextDraft)\n setAdvanced(advancedJson(nextDraft))\n setAdvancedError(false)\n }, [current.revisionId, current.suggestion, open, preservedDraft])\n const description = useMemo(\n () =>\n `Revision ${String(current.sequence)} · ${reviewSuggestionRevisionValidationLabel(\n current\n )} · ${reviewSuggestionRevisionAuthorLabel(current)}`,\n [current]\n )\n const save = (): void => {\n const decoded = Schema.decodeUnknownResult(AdvancedSuggestionFieldsJson)(advanced)\n if (Result.isFailure(decoded)) {\n setAdvancedError(true)\n return\n }\n setAdvancedError(false)\n const edit = Schema.decodeUnknownResult(PrReviewSuggestionEdit)({\n title: draft.title,\n severity: draft.severity,\n problem: draft.problem,\n impact: draft.impact,\n recommendation: draft.recommendation,\n confidence: draft.confidence,\n ...decoded.success\n })\n if (Result.isFailure(edit)) {\n setAdvancedError(true)\n return\n }\n onSave(edit.success)\n }\n\n return (\n <Dialog.Root onOpenChange={onOpenChange} open={open}>\n <Dialog.Content\n className={styles.revisionDialog}\n description={description}\n size=\"wide\"\n title={mode === \"edit\" ? \"Edit review suggestion\" : \"Revision history\"}\n >\n {mode === \"history\" ? (\n <ReviewSuggestionRevisionHistory loadEarlier={loadEarlier} loadingEarlier={loadingEarlier} page={page} />\n ) : (\n <form\n className={styles.revisionEditor}\n onSubmit={(event) => {\n event.preventDefault()\n save()\n }}\n >\n <div className={styles.revisionEditorLead}>\n <label>\n <span>Title</span>\n <input\n maxLength={500}\n onChange={(event) => setDraft({ ...draft, title: event.currentTarget.value })}\n required\n value={draft.title}\n />\n </label>\n <label>\n <span>Severity</span>\n <select\n onChange={(event) => {\n const severity = Schema.decodeUnknownResult(PrReviewSuggestion.fields.severity)(\n event.currentTarget.value\n )\n if (Result.isFailure(severity)) return\n setDraft({ ...draft, severity: severity.success })\n }}\n value={draft.severity}\n >\n <option value=\"P1\">P1</option>\n <option value=\"P2\">P2</option>\n <option value=\"P3\">P3</option>\n <option value=\"P4\">P4</option>\n </select>\n </label>\n <label>\n <span>Confidence</span>\n <select\n onChange={(event) => {\n const level = Schema.decodeUnknownResult(PrReviewSuggestion.fields.confidence.fields.level)(\n event.currentTarget.value\n )\n if (Result.isFailure(level)) return\n setDraft({\n ...draft,\n confidence: {\n ...draft.confidence,\n level: level.success\n }\n })\n }}\n value={draft.confidence.level}\n >\n <option value=\"high\">High</option>\n <option value=\"medium\">Medium</option>\n </select>\n </label>\n </div>\n {narrativeFields.map(([label, field]) => (\n <label key={field}>\n <span>{label}</span>\n <textarea\n maxLength={4_000}\n onChange={(event) =>\n setDraft({\n ...draft,\n [field]: event.currentTarget.value\n })\n }\n required\n rows={4}\n value={draft[field]}\n />\n </label>\n ))}\n <label>\n <span>Confidence reason</span>\n <textarea\n maxLength={2_000}\n onChange={(event) =>\n setDraft({\n ...draft,\n confidence: {\n ...draft.confidence,\n reason: event.currentTarget.value\n }\n })\n }\n required\n rows={3}\n value={draft.confidence.reason}\n />\n </label>\n <details className={styles.revisionAdvanced}>\n <summary>Advanced evidence, anchor, replacement and prevention</summary>\n <Text tone=\"secondary\">\n Complete schema-checked JSON. Invalid or incoherent evidence cannot be saved.\n </Text>\n <textarea\n aria-describedby={advancedError ? \"revision-advanced-error\" : undefined}\n aria-invalid={advancedError}\n aria-label=\"Advanced evidence, anchor, replacement and prevention JSON\"\n onChange={(event) => setAdvanced(event.currentTarget.value)}\n rows={14}\n spellCheck={false}\n value={advanced}\n />\n {advancedError ? (\n <span id=\"revision-advanced-error\" role=\"alert\">\n Advanced fields are not a valid complete suggestion.\n </span>\n ) : null}\n </details>\n {conflict ? (\n <div role=\"alert\">\n <span>A newer revision won. Your draft is preserved, but cannot be saved over the winner.</span>\n <Button onClick={onResolveConflict} type=\"button\" variant=\"quiet\">\n Use latest revision\n </Button>\n </div>\n ) : current.validation._tag === \"requires-revalidation\" ? (\n <span role=\"status\">Technical changes remain blocked from publication until revalidated.</span>\n ) : null}\n <div className={styles.revisionDialogActions}>\n <Dialog.Close disabled={saving}>Cancel</Dialog.Close>\n <Button disabled={!canEdit || saving} loading={saving} type=\"submit\">\n {saving ? \"Saving revision…\" : \"Save revision\"}\n </Button>\n </div>\n </form>\n )}\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nimport type {\n DismissReviewSuggestionRequest,\n DismissReviewSuggestionResponse,\n EditReviewSuggestionRequest,\n EditReviewSuggestionResponse,\n ReviewSuggestionRevisionPage\n} from \"../../api/agent.js\"\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EntityId, JobId } from \"../../domain/identifiers.js\"\nimport type { PrReviewDismissalReason, PrReviewSuggestion, PrReviewSuggestionId } from \"../../domain/prReview.js\"\nimport {\n type PrReviewSuggestionEdit,\n PrReviewSuggestionRevisionPageSize,\n type PrReviewSuggestionRevisionSequence\n} from \"../../domain/prReviewRevision.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\ntype PrReviewDismissalReasonType = PrReviewDismissalReason\n\nconst REVISION_PAGE_SIZE = PrReviewSuggestionRevisionPageSize.make(24)\n\nexport interface ReviewSuggestionRevisionScope {\n readonly entityId: EntityId\n readonly jobId: JobId\n readonly sessionKey: string\n readonly suggestionId: PrReviewSuggestionId\n}\n\nexport interface ReviewSuggestionRevisionTransport {\n readonly dismiss?: (\n scope: ReviewSuggestionRevisionScope,\n request: DismissReviewSuggestionRequest,\n signal: AbortSignal\n ) => Promise<DismissReviewSuggestionResponse>\n readonly edit: (\n scope: ReviewSuggestionRevisionScope,\n request: EditReviewSuggestionRequest,\n signal: AbortSignal\n ) => Promise<EditReviewSuggestionResponse>\n readonly load: (\n scope: ReviewSuggestionRevisionScope,\n before: PrReviewSuggestionRevisionSequence | null,\n signal: AbortSignal\n ) => Promise<ReviewSuggestionRevisionPage>\n}\n\nexport type ReviewSuggestionRevisionAccepted = (suggestion: PrReviewSuggestion) => void\n\nexport type ReviewSuggestionRevisionState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"ready\"; readonly page: ReviewSuggestionRevisionPage }\n | { readonly _tag: \"dismissing\"; readonly page: ReviewSuggestionRevisionPage }\n | {\n readonly _tag: \"saving\"\n readonly draft: PrReviewSuggestionEdit\n readonly page: ReviewSuggestionRevisionPage\n }\n | {\n readonly _tag: \"conflict\"\n readonly draft: PrReviewSuggestionEdit\n readonly page: ReviewSuggestionRevisionPage\n }\n | {\n readonly _tag: \"failed\"\n readonly draft: PrReviewSuggestionEdit | null\n readonly page: ReviewSuggestionRevisionPage | null\n }\n\nexport const browserReviewSuggestionRevisionTransport: ReviewSuggestionRevisionTransport = {\n dismiss: (scope, request, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.dismissReviewSuggestion({\n params: {\n entityId: scope.entityId,\n jobId: scope.jobId,\n suggestionId: scope.suggestionId\n },\n payload: request\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n edit: (scope, request, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.editReviewSuggestion({\n params: {\n entityId: scope.entityId,\n jobId: scope.jobId,\n suggestionId: scope.suggestionId\n },\n payload: request\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n load: (scope, before, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.reviewSuggestionRevisions({\n params: {\n entityId: scope.entityId,\n jobId: scope.jobId,\n suggestionId: scope.suggestionId\n },\n query: {\n ...(!(before === null) && { before }),\n limit: REVISION_PAGE_SIZE\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst sameScope = (\n left: ReviewSuggestionRevisionScope,\n right: ReviewSuggestionRevisionScope\n): boolean =>\n left.entityId === right.entityId &&\n left.jobId === right.jobId &&\n left.sessionKey === right.sessionKey &&\n left.suggestionId === right.suggestionId\n\nconst mergePages = (\n retained: ReviewSuggestionRevisionPage,\n earlier: ReviewSuggestionRevisionPage\n): ReviewSuggestionRevisionPage => {\n const current = earlier.current.sequence > retained.current.sequence\n ? earlier.current\n : retained.current\n const revisions = new Map(\n [\n retained.current,\n earlier.current,\n ...retained.revisions,\n ...earlier.revisions\n ]\n .filter(({ revisionId }) => revisionId !== current.revisionId)\n .map((revision) => [revision.revisionId, revision])\n )\n return {\n current,\n revisions: [...revisions.values()].sort(\n (left, right) => right.sequence - left.sequence\n ),\n hasMore: earlier.hasMore,\n nextBeforeSequence: earlier.nextBeforeSequence\n }\n}\n\nconst pageWithAcceptedRevision = (\n retained: ReviewSuggestionRevisionPage,\n accepted: ReviewSuggestionRevisionPage[\"current\"]\n): ReviewSuggestionRevisionPage => ({\n current: accepted,\n revisions: [retained.current, ...retained.revisions]\n .filter(({ revisionId }) => revisionId !== accepted.revisionId)\n .sort((left, right) => right.sequence - left.sequence),\n hasMore: retained.hasMore,\n nextBeforeSequence: retained.nextBeforeSequence\n})\n\ntype SaveOutcome =\n | { readonly _tag: \"accepted-refresh-failed\"; readonly page: ReviewSuggestionRevisionPage }\n | { readonly _tag: \"conflict\"; readonly page: ReviewSuggestionRevisionPage }\n | { readonly _tag: \"refreshed\"; readonly page: ReviewSuggestionRevisionPage }\n\nconst saveOutcome = (\n _tag: SaveOutcome[\"_tag\"],\n page: ReviewSuggestionRevisionPage\n): SaveOutcome => ({ _tag, page })\n\nconst conflictFailure = Predicate.isTagged(\"ConflictApiError\")\nconst ignoreAcceptedRevision = (_suggestion: PrReviewSuggestion): void => undefined\n\n/** Scope-safe browser controller for one stable suggestion's immutable revisions. */\nexport const useReviewSuggestionRevisions = (\n scope: ReviewSuggestionRevisionScope | null,\n transport: ReviewSuggestionRevisionTransport = browserReviewSuggestionRevisionTransport,\n onAccepted: ReviewSuggestionRevisionAccepted = ignoreAcceptedRevision\n): {\n readonly dismiss: (reason: PrReviewDismissalReasonType) => void\n readonly loadEarlier: () => void\n readonly loadingEarlier: boolean\n readonly resolveConflict: () => void\n readonly retry: () => void\n readonly save: (draft: PrReviewSuggestionEdit) => void\n readonly state: ReviewSuggestionRevisionState\n} => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [loadingEarlier, setLoadingEarlier] = useState(false)\n const [state, setState] = useState<ReviewSuggestionRevisionState>({ _tag: \"idle\" })\n const activeAbort = useRef<AbortController | null>(null)\n const loadingEarlierRef = useRef(false)\n const latestScope = useRef(scope)\n const latestOnAccepted = useRef(onAccepted)\n latestScope.current = scope\n latestOnAccepted.current = onAccepted\n\n useEffect(() => {\n activeAbort.current?.abort()\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n if (scope === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const current = scope\n const abort = new AbortController()\n activeAbort.current = abort\n setState({ _tag: \"loading\" })\n transport.load(current, null, abort.signal).then(\n (page) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"ready\", page })\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"failed\", draft: null, page: null })\n }\n )\n return () => abort.abort()\n }, [requestRevision, scope, transport])\n\n const save = useCallback((draft: PrReviewSuggestionEdit): void => {\n if (scope === null || state._tag === \"conflict\") return\n const retained = state._tag === \"ready\"\n ? state.page\n : state._tag === \"failed\"\n ? state.page\n : null\n if (retained === null) return\n const current = scope\n activeAbort.current?.abort()\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n const abort = new AbortController()\n activeAbort.current = abort\n setState({ _tag: \"saving\", draft, page: retained })\n transport.edit(current, {\n expectedRevisionId: retained.current.revisionId,\n expectedSequence: retained.current.sequence,\n edit: draft\n }, abort.signal).then(\n (accepted) => {\n const acceptedPage = pageWithAcceptedRevision(retained, accepted)\n return transport.load(current, null, abort.signal).then(\n (page) => saveOutcome(\"refreshed\", page),\n () => saveOutcome(\"accepted-refresh-failed\", acceptedPage)\n )\n },\n <UnparsedInput>(failure: UnparsedInput) => {\n if (!conflictFailure(failure)) throw failure\n return transport.load(current, null, abort.signal).then((page) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return saveOutcome(\"conflict\", page)\n setState({ _tag: \"conflict\", draft, page })\n return saveOutcome(\"conflict\", page)\n })\n }\n ).then(\n (outcome) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState((latest) =>\n latest._tag === \"conflict\"\n ? latest\n : outcome._tag === \"accepted-refresh-failed\"\n ? { _tag: \"failed\", draft: null, page: outcome.page }\n : { _tag: \"ready\", page: outcome.page }\n )\n if (outcome._tag !== \"conflict\") latestOnAccepted.current(outcome.page.current.suggestion)\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"failed\", draft, page: retained })\n }\n )\n }, [scope, state, transport])\n\n const dismiss = useCallback((reason: PrReviewDismissalReasonType): void => {\n if (scope === null || state._tag !== \"ready\" || transport.dismiss === undefined) return\n const current = scope\n const retained = state.page\n activeAbort.current?.abort()\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n const abort = new AbortController()\n activeAbort.current = abort\n setState({ _tag: \"dismissing\", page: retained })\n transport.dismiss(current, {\n expectedRevisionId: retained.current.revisionId,\n expectedSequence: retained.current.sequence,\n reason\n }, abort.signal).then(\n (accepted) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({\n _tag: \"ready\",\n page: pageWithAcceptedRevision(retained, accepted)\n })\n latestOnAccepted.current(accepted.suggestion)\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"failed\", draft: null, page: retained })\n }\n )\n }, [scope, state, transport])\n\n const loadEarlier = useCallback((): void => {\n if (\n scope === null ||\n (state._tag !== \"ready\" && state._tag !== \"conflict\") ||\n loadingEarlierRef.current ||\n !state.page.hasMore ||\n state.page.nextBeforeSequence === null\n ) return\n const current = scope\n const retained = state.page\n activeAbort.current?.abort()\n const abort = new AbortController()\n activeAbort.current = abort\n loadingEarlierRef.current = true\n setLoadingEarlier(true)\n transport.load(\n current,\n retained.nextBeforeSequence,\n abort.signal\n ).then(\n (page) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n if (activeAbort.current !== abort) return\n setState((latest) =>\n latest._tag === \"ready\" || latest._tag === \"conflict\"\n ? { ...latest, page: mergePages(latest.page, page) }\n : latest\n )\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n if (activeAbort.current !== abort) return\n setState((latest) =>\n latest._tag === \"ready\"\n ? { _tag: \"failed\", draft: null, page: latest.page }\n : latest\n )\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n }\n )\n }, [scope, state, transport])\n\n return useMemo(() => ({\n dismiss,\n loadEarlier,\n loadingEarlier,\n resolveConflict: () =>\n setState((latest) =>\n latest._tag === \"conflict\"\n ? { _tag: \"ready\", page: latest.page }\n : latest\n ),\n retry: () => {\n if (state._tag === \"conflict\") return\n if (\n state._tag === \"failed\" &&\n state.draft !== null &&\n state.page !== null\n ) {\n save(state.draft)\n return\n }\n setRequestRevision((revision) => revision + 1)\n },\n save,\n state\n }), [dismiss, loadEarlier, loadingEarlier, save, state])\n}\n","import { Button, Dialog, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useMemo, useState } from \"react\"\n\nimport type { EntityId, JobId } from \"../../domain/identifiers.js\"\nimport { PrReviewDismissalReason, type PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport type { PrReviewSuggestionRevisionAuthor } from \"../../domain/prReviewRevision.js\"\nimport { ReviewSuggestionCard } from \"./ReviewSuggestionPresentation.js\"\nimport { ReviewSuggestionRevisionDialog } from \"./ReviewSuggestionRevisionDialog.js\"\nimport {\n browserReviewSuggestionRevisionTransport,\n useReviewSuggestionRevisions,\n type ReviewSuggestionRevisionScope,\n type ReviewSuggestionRevisionTransport\n} from \"./useReviewSuggestionRevisions.js\"\nimport type { ReviewSuggestionPublicationTarget, ReviewSuggestionTarget } from \"./usePullRequestReview.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst authorLabel = (author: PrReviewSuggestionRevisionAuthor): string =>\n author._tag === \"operator\" ? \"Operator\" : author.providerId\n\n/** Enrich one immediate review-report card with its durable current revision. */\nexport const VersionedReviewSuggestionCard = ({\n canEdit,\n entityId,\n isPreviewing,\n jobId,\n onPreviewPublication,\n onSuggestionRevisionAccepted,\n onTargetSuggestion,\n revisionTransport = browserReviewSuggestionRevisionTransport,\n sessionKey,\n suggestion\n}: {\n readonly canEdit: boolean\n readonly entityId: EntityId\n readonly isPreviewing: boolean\n readonly jobId: JobId\n readonly onPreviewPublication: (selection: ReviewSuggestionPublicationTarget) => void\n readonly onTargetSuggestion: (target: ReviewSuggestionTarget) => void\n readonly onSuggestionRevisionAccepted?: (suggestion: PrReviewSuggestion) => void\n readonly revisionTransport?: ReviewSuggestionRevisionTransport\n readonly sessionKey: string\n readonly suggestion: PrReviewSuggestion\n}): ReactElement => {\n const scope: ReviewSuggestionRevisionScope = useMemo(\n () => ({\n entityId,\n jobId,\n sessionKey,\n suggestionId: suggestion.suggestionId\n }),\n [entityId, jobId, sessionKey, suggestion.suggestionId]\n )\n const controller = useReviewSuggestionRevisions(scope, revisionTransport, onSuggestionRevisionAccepted)\n const [dialogMode, setDialogMode] = useState<\"edit\" | \"history\">(\"history\")\n const [dialogOpen, setDialogOpen] = useState(false)\n const [dismissOpen, setDismissOpen] = useState(false)\n const [dismissalReason, setDismissalReason] = useState<typeof PrReviewDismissalReason.Type>(\"false-positive\")\n const page =\n controller.state._tag === \"ready\" ||\n controller.state._tag === \"dismissing\" ||\n controller.state._tag === \"saving\" ||\n controller.state._tag === \"conflict\"\n ? controller.state.page\n : controller.state._tag === \"failed\"\n ? controller.state.page\n : null\n const preservedDraft =\n controller.state._tag === \"saving\" || controller.state._tag === \"conflict\" || controller.state._tag === \"failed\"\n ? controller.state.draft\n : null\n const current = page?.current\n const presentedSuggestion: PrReviewSuggestion =\n current === undefined\n ? suggestion\n : {\n ...current.suggestion,\n state: suggestion.state === \"published\" ? \"published\" : current.suggestion.state\n }\n const suggestionCanMutate = canEdit && presentedSuggestion.state === \"draft\" && controller.state._tag !== \"dismissing\"\n const validationBlocked = current?.validation._tag === \"requires-revalidation\"\n const publicationBlockedReason =\n controller.state._tag === \"loading\"\n ? \"Loading the exact revision before publication.\"\n : controller.state._tag === \"failed\"\n ? \"Revision history is unavailable. Retry before publishing.\"\n : validationBlocked\n ? \"This technical edit needs agent revalidation before it can be posted.\"\n : undefined\n const openDialog = (mode: \"edit\" | \"history\"): void => {\n setDialogMode(mode)\n setDialogOpen(true)\n }\n\n return (\n <>\n <ReviewSuggestionCard\n canPublish={suggestionCanMutate}\n extraActions={\n <>\n <Button disabled={page === null} onClick={() => openDialog(\"history\")} variant=\"quiet\">\n History\n </Button>\n {suggestionCanMutate ? (\n <Button disabled={page === null} onClick={() => openDialog(\"edit\")} variant=\"quiet\">\n Edit\n </Button>\n ) : null}\n {suggestionCanMutate ? (\n <Button disabled={page === null} onClick={() => setDismissOpen(true)} variant=\"quiet\">\n Dismiss\n </Button>\n ) : null}\n {suggestionCanMutate && current !== undefined && current.validation._tag !== \"requires-revalidation\" ? (\n <Button\n disabled={controller.state._tag === \"loading\"}\n onClick={() =>\n onTargetSuggestion({\n expectedRevisionId: current.revisionId,\n expectedSequence: current.sequence,\n intent: \"suggestion-edit\",\n jobId,\n suggestionId: presentedSuggestion.suggestionId\n })\n }\n variant=\"quiet\"\n >\n Ask agent to edit\n </Button>\n ) : null}\n {canEdit && current?.validation._tag === \"requires-revalidation\" ? (\n <Button\n disabled={controller.state._tag === \"loading\"}\n onClick={() =>\n onTargetSuggestion({\n expectedRevisionId: current.revisionId,\n expectedSequence: current.sequence,\n intent: \"suggestion-revalidation\",\n jobId,\n suggestionId: presentedSuggestion.suggestionId\n })\n }\n variant=\"quiet\"\n >\n Revalidate\n </Button>\n ) : null}\n {controller.state._tag === \"dismissing\" ? (\n <Button disabled variant=\"quiet\">\n Dismissing…\n </Button>\n ) : null}\n {controller.state._tag === \"failed\" ? (\n <Button onClick={controller.retry} variant=\"quiet\">\n Retry revision\n </Button>\n ) : null}\n </>\n }\n isPreviewing={isPreviewing}\n jobId={jobId}\n metadata={\n current === undefined ? null : (\n <div className={styles.suggestionRevisionMeta} data-validation={current.validation._tag}>\n <strong>Revision {String(current.sequence)}</strong>\n <span>{current.validation._tag === \"validated\" ? \"Validated\" : \"Needs revalidation\"}</span>\n <span>{authorLabel(current.author)}</span>\n <time dateTime={DateTime.formatIso(current.createdAt)}>\n {DateTime.formatLocal(current.createdAt, {\n dateStyle: \"medium\",\n timeStyle: \"short\"\n })}\n </time>\n </div>\n )\n }\n onPreviewPublication={(selection) => {\n if (current === undefined) return\n onPreviewPublication({\n ...selection,\n revisionId: current.revisionId\n })\n }}\n {...(publicationBlockedReason === undefined ? {} : { publicationBlockedReason })}\n suggestion={presentedSuggestion}\n />\n {page === null ? null : (\n <ReviewSuggestionRevisionDialog\n canEdit={suggestionCanMutate}\n conflict={controller.state._tag === \"conflict\"}\n loadEarlier={controller.loadEarlier}\n loadingEarlier={controller.loadingEarlier}\n mode={dialogMode}\n onOpenChange={setDialogOpen}\n onResolveConflict={controller.resolveConflict}\n onSave={controller.save}\n open={dialogOpen}\n page={page}\n preservedDraft={preservedDraft}\n saving={controller.state._tag === \"saving\"}\n />\n )}\n <Dialog.Root onOpenChange={setDismissOpen} open={dismissOpen}>\n <Dialog.Content\n description=\"Dismiss this finding for the reviewed head. It will remain in revision history and will not be posted to CodeCommit.\"\n size=\"default\"\n title=\"Dismiss finding?\"\n >\n <Text>This records your decision without changing the pull request or publishing a comment.</Text>\n <label>\n Reason\n <select\n aria-label=\"Dismissal reason\"\n onChange={(event) => {\n const reason = Schema.decodeUnknownResult(PrReviewDismissalReason)(event.currentTarget.value)\n if (Result.isFailure(reason)) return\n setDismissalReason(reason.success)\n }}\n value={dismissalReason}\n >\n <option value=\"false-positive\">False positive</option>\n <option value=\"not-applicable\">Not applicable</option>\n <option value=\"accepted-risk\">Accepted risk</option>\n <option value=\"duplicate\">Duplicate</option>\n <option value=\"other\">Other</option>\n </select>\n </label>\n <div className={styles.publicationActions}>\n <Dialog.Close>Keep finding</Dialog.Close>\n <Button\n onClick={() => {\n setDismissOpen(false)\n controller.dismiss(dismissalReason)\n }}\n >\n Dismiss finding\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Root>\n </>\n )\n}\n","import { Button, Dialog, Text } from \"@knpkv/rly/primitives\"\nimport { ReviewProfileControl } from \"@knpkv/review/react\"\nimport * as DateTime from \"effect/DateTime\"\nimport {\n type KeyboardEvent,\n type ReactElement,\n type UIEvent,\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport {\n MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH,\n type DurableAgentProviderId,\n type DurableAgentPrompt,\n type PullRequestReviewFailure,\n type PullRequestReviewThreadEvent\n} from \"../../api/agent.js\"\nimport type { PrReviewOrientation, PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport { ReviewNotes, ReviewSuggestionCard } from \"./ReviewSuggestionPresentation.js\"\nimport { controlCenterReviewProfile } from \"./reviewPlatformAdapter.js\"\nimport { VersionedReviewSuggestionCard } from \"./VersionedReviewSuggestionCard.js\"\nimport type { ReviewSuggestionRevisionTransport } from \"./useReviewSuggestionRevisions.js\"\nimport type {\n PullRequestReviewControllerState,\n PullRequestReviewPublicationState,\n ReviewSuggestionPublicationTarget,\n ReviewSuggestionTarget\n} from \"./usePullRequestReview.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst unavailableMessage = (\n reason: Extract<PullRequestReviewControllerState, { readonly _tag: \"ready\" }>[\"review\"] extends infer Review\n ? Review extends { readonly _tag: \"unavailable\"; readonly reason: infer Reason }\n ? Reason\n : never\n : never\n): string => {\n switch (reason) {\n case \"not-codecommit\":\n case \"not-pull-request\":\n return \"Agent review is available only for synchronized CodeCommit pull requests.\"\n case \"source-stale\":\n return \"Synchronize this pull request before reviewing its immutable head.\"\n case \"base-revision-unavailable\":\n return \"The base revision has not been synchronized, so an exact review cannot start.\"\n }\n}\n\nconst outcomeLabel = (\n outcome: \"changes-required\" | \"non-blocking-suggestions\" | \"no-issues-found\" | \"unable-to-conclude\"\n) => {\n switch (outcome) {\n case \"changes-required\":\n return \"Changes Required\"\n case \"non-blocking-suggestions\":\n return \"Non-blocking Suggestions\"\n case \"no-issues-found\":\n return \"No Issues Found\"\n case \"unable-to-conclude\":\n return \"Unable to Conclude\"\n }\n}\n\nconst formatBudget = (budgetMillis: number): string => {\n const minutes = Math.round(budgetMillis / 60_000)\n return `${String(minutes)} minute${minutes === 1 ? \"\" : \"s\"}`\n}\n\nconst providerIdName = (providerId: DurableAgentProviderId): string => {\n switch (providerId) {\n case \"codex\":\n return \"Codex\"\n case \"claude\":\n return \"Claude\"\n case \"relay-gateway\":\n return \"Relay Gateway\"\n default:\n return providerId\n }\n}\n\nconst providerName = (\n provider: NonNullable<Extract<PullRequestReviewControllerState, { readonly _tag: \"ready\" }>[\"provider\"]>\n): string => provider.displayName ?? providerIdName(provider.providerId)\n\nconst providerReviewLabel = (provider: Parameters<typeof providerName>[0]): string => `${providerName(provider)} review`\n\nconst modelName = (providerId: DurableAgentProviderId, model: string): string =>\n model === \"configured-default\" || (providerId === \"claude\" && model === \"default\") ? \"CLI default\" : model\n\nconst networkAccessLabel = (networkAccess: \"blocked\" | \"provider-enabled\", provider: string): string =>\n networkAccess === \"blocked\" ? \"Network blocked\" : `${provider} access enabled`\n\nconst failureHeading = (stage: PullRequestReviewFailure[\"stage\"]): string => {\n switch (stage) {\n case \"source-checkout\":\n return \"Source checkout failed\"\n case \"review-setup\":\n return \"Review setup is incomplete\"\n case \"sandbox-start\":\n return \"Review sandbox failed to start\"\n case \"agent-run\":\n return \"Agent review failed\"\n case \"cleanup\":\n return \"Review cleanup did not finish\"\n case \"result-validation\":\n return \"Review result was invalid\"\n case \"control-center\":\n return \"Control Center could not save the review\"\n }\n}\n\nconst failureCause = (cause: PullRequestReviewFailure[\"cause\"]): string | null => {\n switch (cause) {\n case undefined:\n return null\n case \"invalid-configuration\":\n return \"The Review Sandbox configuration is invalid.\"\n case \"invalid-request\":\n return \"Control Center rejected the generated review command.\"\n case \"source-rejected\":\n return \"The source exceeded review safety limits or failed validation.\"\n case \"source-unavailable\":\n return \"CodeCommit source could not be materialized.\"\n case \"sandbox-unavailable\":\n return \"sbx could not create or reach the review sandbox.\"\n case \"sandbox-timeout\":\n return \"The review sandbox did not become ready in time.\"\n case \"command-timeout\":\n return \"The review command exceeded its time budget.\"\n case \"provider-authentication\":\n return \"The agent provider rejected its credentials or required API access is missing.\"\n case \"provider-rate-limited\":\n return \"The agent provider rate-limited this review.\"\n case \"provider-unavailable\":\n return \"The agent provider could not be reached.\"\n case \"agent-command-failed\":\n return \"The agent command exited before producing a review.\"\n case \"output-rejected\":\n return \"The review command returned output outside the safe limits.\"\n case \"artifact-unavailable\":\n return \"The retained review output could not be read.\"\n case \"session-closed\":\n return \"The review sandbox closed before the command finished.\"\n case \"cleanup-failed\":\n return \"The run ended, but sbx cleanup did not complete.\"\n }\n}\n\nconst failureGuidance = ({ retryable, stage }: PullRequestReviewFailure): string => {\n if (retryable && stage !== \"cleanup\") return \"The failure may be temporary. Retry this exact-head review.\"\n switch (stage) {\n case \"source-checkout\":\n return \"Check the CodeCommit connection, AWS credentials, region, and repository access.\"\n case \"review-setup\":\n return \"Check the workspace review policy and selected runner.\"\n case \"sandbox-start\":\n return \"Check the sbx installation and Review sandbox configuration.\"\n case \"agent-run\":\n return \"Check the selected review runner and its authentication.\"\n case \"cleanup\":\n return \"Check sbx status and reconcile the orphaned review sandbox before retrying.\"\n case \"result-validation\":\n return \"The runner returned a result Control Center could not safely accept. Check its version and configuration.\"\n case \"control-center\":\n return \"Check Control Center storage and worker health before starting a new review.\"\n }\n}\n\nconst REVIEW_PROMPT_TEMPLATES: ReadonlyArray<{\n readonly label: string\n readonly prompt: string\n}> = [\n {\n label: \"Correctness\",\n prompt: \"Review correctness, regressions, error handling, and boundary conditions.\"\n },\n {\n label: \"Security\",\n prompt: \"Review authorization, credential handling, unsafe input, and privilege boundaries.\"\n },\n {\n label: \"Tests\",\n prompt: \"Review test coverage, failure paths, race conditions, and missing regression guardrails.\"\n }\n]\n\nconst ReviewPresetChoices = ({\n accessibleName,\n groupName,\n onSelect,\n presets,\n selectedProviderId\n}: {\n readonly accessibleName: string\n readonly groupName: string\n readonly onSelect: (providerId: DurableAgentProviderId) => void\n readonly presets: ReadonlyArray<Parameters<typeof providerName>[0]>\n readonly selectedProviderId: DurableAgentProviderId\n}): ReactElement => {\n const profiles = presets.map((preset) => ({\n ...controlCenterReviewProfile(preset),\n name: providerReviewLabel(preset)\n }))\n return (\n <ReviewProfileControl\n accessibleName={accessibleName}\n {...(styles.reviewPresetList === undefined ? {} : { className: styles.reviewPresetList })}\n describeProfile={(profile) => {\n const preset = presets.find(({ providerId }) => String(providerId) === profile.provider)\n return preset === undefined ? profile.model : modelName(preset.providerId, preset.model)\n }}\n groupName={groupName}\n onProfileChange={(profile) => {\n const preset = presets.find(({ providerId }) => String(providerId) === profile.provider)\n if (preset !== undefined) onSelect(preset.providerId)\n }}\n presentation=\"radios\"\n profiles={profiles}\n selectedProfileId={String(selectedProviderId)}\n />\n )\n}\n\ntype PresentedThreadEvent = {\n readonly event: PullRequestReviewThreadEvent\n readonly summary: string\n}\n\nconst THREAD_END_THRESHOLD = 24\n\nconst ReviewThreadTranscript = ({\n events,\n hasEarlier,\n historyAction,\n historyLoaded,\n onLoadEarlier\n}: {\n readonly events: ReadonlyArray<PresentedThreadEvent>\n readonly hasEarlier: boolean\n readonly historyAction: \"idle\" | \"loading\" | \"failed\"\n readonly historyLoaded: boolean\n readonly onLoadEarlier: () => void\n}): ReactElement => {\n const scrollerRef = useRef<HTMLDivElement>(null)\n const followsLatestRef = useRef(true)\n const previousRef = useRef<{\n readonly first: number | null\n readonly firstOffsetTop: number\n readonly last: number | null\n }>({ first: null, firstOffsetTop: 0, last: null })\n const [hasNewActivity, setHasNewActivity] = useState(false)\n const first = events[0]?.event.eventSequence ?? null\n const last = events.at(-1)?.event.eventSequence ?? null\n\n useLayoutEffect(() => {\n const scroller = scrollerRef.current\n if (scroller === null) return\n const previous = previousRef.current\n const prepended = previous.first !== null && first !== null && first < previous.first\n const appended = previous.last !== null && last !== null && last > previous.last\n const previousFirstElement = [...scroller.querySelectorAll<HTMLElement>(\"[data-review-event-sequence]\")].find(\n (element) => element.dataset.reviewEventSequence === String(previous.first)\n )\n if (prepended && previousFirstElement !== undefined) {\n scroller.scrollTop += previousFirstElement.offsetTop - previous.firstOffsetTop\n const followsLatest = scroller.scrollHeight - scroller.clientHeight - scroller.scrollTop <= THREAD_END_THRESHOLD\n followsLatestRef.current = followsLatest\n setHasNewActivity(appended && !followsLatest)\n } else if (followsLatestRef.current) {\n scroller.scrollTop = scroller.scrollHeight\n setHasNewActivity(false)\n } else if (appended) {\n setHasNewActivity(true)\n }\n const firstElement = scroller.querySelector<HTMLElement>(\"[data-review-event-sequence]\")\n previousRef.current = { first, firstOffsetTop: firstElement?.offsetTop ?? 0, last }\n }, [first, last])\n\n const handleScroll = (event: UIEvent<HTMLDivElement>): void => {\n const scroller = event.currentTarget\n const followsLatest = scroller.scrollHeight - scroller.clientHeight - scroller.scrollTop <= THREAD_END_THRESHOLD\n followsLatestRef.current = followsLatest\n if (followsLatest) setHasNewActivity(false)\n }\n const jumpToLatest = (): void => {\n const scroller = scrollerRef.current\n if (scroller === null) return\n followsLatestRef.current = true\n scroller.scrollTop = scroller.scrollHeight\n setHasNewActivity(false)\n scroller.focus({ preventScroll: true })\n }\n\n return (\n <>\n <div\n aria-label=\"Review activity\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n className={styles.reviewThreadTranscript}\n onScroll={handleScroll}\n ref={scrollerRef}\n role=\"log\"\n tabIndex={0}\n >\n {hasEarlier ? (\n <Button loading={historyAction === \"loading\"} onClick={onLoadEarlier}>\n {historyAction === \"loading\"\n ? \"Loading earlier activity…\"\n : historyAction === \"failed\"\n ? \"Retry earlier activity\"\n : \"Load earlier activity\"}\n </Button>\n ) : historyLoaded ? (\n <Text tone=\"secondary\" variant=\"meta\">\n Beginning of review thread\n </Text>\n ) : null}\n {events.length === 0 ? null : (\n <ol className={styles.reviewThreadEvents}>\n {events.map(({ event, summary }) => (\n <li data-review-event-sequence={event.eventSequence} key={event.eventSequence}>\n <span>{summary}</span>\n </li>\n ))}\n </ol>\n )}\n </div>\n {hasNewActivity ? <Button onClick={jumpToLatest}>New activity · Jump to latest</Button> : null}\n </>\n )\n}\n\nconst ReviewSuggestionPublicationSurface = lazy(() => import(\"./ReviewSuggestionPublicationSurface.js\"))\n\nconst ReviewOrientationSurface = ({\n orientation\n}: {\n readonly orientation: PrReviewOrientation | undefined\n}): ReactElement | null =>\n orientation === undefined ? null : (\n <section aria-label=\"Pull request orientation\" className={styles.reviewOrientation}>\n <header>\n <strong>What this PR changes</strong>\n <Text tone=\"secondary\" variant=\"body\">\n {orientation.summary}\n </Text>\n </header>\n {orientation.cohorts.map((cohort, cohortIndex) => (\n <article key={`${String(cohortIndex)}:${cohort.title}`}>\n <h3>{cohort.title}</h3>\n <p>{cohort.summary}</p>\n <ol>\n {cohort.layers.map((layer, layerIndex) => (\n <li key={`${String(layerIndex)}:${layer.title}`}>\n <strong>{`${layer.kind} · ${layer.title}`}</strong>\n <span>{layer.summary}</span>\n <small>\n {layer.ranges\n .map(\n ({ endLine, label, path, startLine }) =>\n `${label} · ${path}:${String(startLine)}${endLine === startLine ? \"\" : `–${String(endLine)}`}`\n )\n .join(\" · \")}\n </small>\n </li>\n ))}\n </ol>\n </article>\n ))}\n </section>\n )\n\nconst threadEventSummary = (event: PullRequestReviewThreadEvent): string | null => {\n switch (event._tag) {\n case \"operator-message\":\n return `Local Operator · ${event.prompt}`\n case \"run-queued\":\n return `${event.reviewProfile.label} · head ${event.subject.headRevision.slice(0, 12)}`\n case \"run-started\":\n return event.runtimeMetadata === undefined\n ? \"Review sandbox started\"\n : `Review sandbox started · ${event.runtimeMetadata.implementation} ${event.runtimeMetadata.version ?? \"\"}`.trim()\n case \"progress\":\n return event.text\n case \"review-report\":\n return `${String(event.report.suggestions.length)} suggestions · ${String(event.report.notes.length)} notes`\n case \"suggestion-revised\":\n return event.suggestionState === \"dismissed\"\n ? `Suggestion revision ${String(event.sequence)} · dismissed by operator`\n : `Suggestion revision ${String(event.sequence)} · ${event.validationState === \"validated\" ? \"validated\" : \"needs revalidation\"}`\n case \"suggestion-published\":\n return \"Suggestion published to CodeCommit\"\n case \"run-completed\":\n return `Run completed · ${event.outcome}`\n case \"run-failed\":\n return `${failureHeading(event.stage)}${event.cause === undefined ? \"\" : ` · ${failureCause(event.cause)}`}${\n event.retryable ? \" · retryable\" : \"\"\n }`\n case \"run-interrupted\":\n return \"Run interrupted · Control Center restarted\"\n case \"cancellation-requested\":\n return \"Cancellation requested\"\n case \"usage\":\n return null\n }\n}\n\n/** Render durable agent advice without conflating it with human disposition. */\nexport const PullRequestReviewPanel = ({\n canEnqueue,\n onCancelPublication,\n onCancelReview = () => undefined,\n onExtendReviewBudget = () => undefined,\n onLoadEarlier = () => undefined,\n onPreviewPublication,\n onPublishSuggestion,\n onRetry,\n onStart,\n onSuggestionRevisionAccepted,\n onTargetSuggestion = () => undefined,\n publication,\n revisionTransport,\n state,\n suggestions\n}: {\n readonly canEnqueue: boolean\n readonly onCancelReview?: () => void\n readonly onCancelPublication: () => void\n readonly onExtendReviewBudget?: () => void\n readonly onLoadEarlier?: () => void\n readonly onPreviewPublication: (selection: ReviewSuggestionPublicationTarget) => void\n readonly onPublishSuggestion: (finalContent: string) => void\n readonly onTargetSuggestion?: (target: ReviewSuggestionTarget) => void\n readonly onRetry: () => void\n readonly onStart: (prompt?: DurableAgentPrompt, providerId?: DurableAgentProviderId) => void\n readonly onSuggestionRevisionAccepted?: (suggestion: PrReviewSuggestion) => void\n readonly publication: PullRequestReviewPublicationState\n readonly revisionTransport?: ReviewSuggestionRevisionTransport\n readonly state: PullRequestReviewControllerState\n readonly suggestions?: ReadonlyArray<PrReviewSuggestion>\n}): ReactElement => {\n const [launchOpen, setLaunchOpen] = useState(false)\n const [request, setRequest] = useState(\"\")\n const [requestedSelection, setRequestedSelection] = useState<number | null>(null)\n const [submittedRequest, setSubmittedRequest] = useState<string | null>(null)\n const [selectedProviderId, setSelectedProviderId] = useState<DurableAgentProviderId | null>(null)\n const requestRef = useRef<HTMLTextAreaElement>(null)\n const targetedSubmissionInFlightRef = useRef(false)\n const providerPresets = useMemo(\n () => (state._tag === \"ready\" ? (state.providerPresets ?? (state.provider === null ? [] : [state.provider])) : []),\n [state]\n )\n const selectedProvider =\n providerPresets.find(({ providerId }) => providerId === selectedProviderId) ?? providerPresets[0] ?? null\n const durableProviderName = (providerId: DurableAgentProviderId): string => {\n const preset = providerPresets.find((candidate) => candidate.providerId === providerId)\n return preset === undefined ? providerIdName(providerId) : providerName(preset)\n }\n const requestScope =\n state._tag === \"idle\"\n ? null\n : `${state.entityId}:${state.baseRevision ?? \"\"}:${state.headRevision}:${state.sessionKey}`\n useEffect(() => {\n setLaunchOpen(false)\n setRequest(\"\")\n setRequestedSelection(null)\n setSubmittedRequest(null)\n setSelectedProviderId(null)\n targetedSubmissionInFlightRef.current = false\n }, [requestScope])\n useEffect(() => {\n if (providerPresets.length === 0) {\n setSelectedProviderId(null)\n return\n }\n if (!providerPresets.some(({ providerId }) => providerId === selectedProviderId)) {\n setSelectedProviderId(providerPresets[0]?.providerId ?? null)\n }\n }, [providerPresets, selectedProviderId])\n useLayoutEffect(() => {\n if (requestedSelection === null) return\n const textarea = requestRef.current\n if (textarea === null) return\n textarea.focus({ preventScroll: true })\n textarea.setSelectionRange(requestedSelection, requestedSelection)\n setRequestedSelection(null)\n }, [request, requestedSelection])\n useEffect(() => {\n if (submittedRequest === null || state._tag !== \"ready\") return\n if (state.action === \"failed\") {\n targetedSubmissionInFlightRef.current = false\n return\n }\n if (state.action === \"idle\" && state.review._tag === \"pending\") {\n targetedSubmissionInFlightRef.current = false\n setRequest((current) => (current.trim() === submittedRequest ? \"\" : current))\n setSubmittedRequest(null)\n }\n }, [state, submittedRequest])\n const changeLaunchOpen = useCallback((open: boolean): void => {\n setLaunchOpen(open)\n }, [])\n const submitFullReview = useCallback((): void => {\n if (selectedProvider === null) return\n setSubmittedRequest(null)\n onStart(undefined, selectedProvider.providerId)\n }, [onStart, selectedProvider])\n const submitTargetedReview = useCallback((): void => {\n const prompt = request.trim()\n if (\n prompt.length === 0 ||\n selectedProvider === null ||\n targetedSubmissionInFlightRef.current ||\n state._tag !== \"ready\" ||\n state.action === \"starting\" ||\n state.review._tag === \"pending\"\n )\n return\n targetedSubmissionInFlightRef.current = true\n setSubmittedRequest(prompt)\n onStart(prompt, selectedProvider.providerId)\n }, [onStart, request, selectedProvider, state])\n const handleComposerKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>): void => {\n if (event.nativeEvent.isComposing) return\n if (event.key !== \"Enter\" || (!event.metaKey && !event.ctrlKey)) return\n event.preventDefault()\n submitTargetedReview()\n }\n const insertPromptTemplate = (prompt: string): void => {\n const textarea = requestRef.current\n const selectionStart = textarea?.selectionStart ?? request.length\n const selectionEnd = textarea?.selectionEnd ?? selectionStart\n const before = request.slice(0, selectionStart)\n const after = request.slice(selectionEnd)\n const leadingBreak = before.length > 0 && !/\\s$/u.test(before) ? \"\\n\" : \"\"\n const trailingBreak = after.length > 0 && !/^\\s/u.test(after) ? \"\\n\" : \"\"\n const availableInsertionLength = Math.max(0, MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH - before.length - after.length)\n const insertion = `${leadingBreak}${prompt}${trailingBreak}`.slice(0, availableInsertionLength)\n const nextRequest = `${before}${insertion}${after}`\n setRequest(nextRequest)\n setRequestedSelection(before.length + insertion.length)\n }\n const publicationSurface =\n publication._tag === \"idle\" || publication._tag === \"previewing\" ? null : (\n <Suspense fallback={<span>Preparing publication surface…</span>}>\n <ReviewSuggestionPublicationSurface\n onCancel={onCancelPublication}\n onPublish={onPublishSuggestion}\n publication={publication}\n />\n </Suspense>\n )\n const withPublication = (content: ReactElement): ReactElement => (\n <>\n {content}\n {publicationSurface}\n </>\n )\n\n if (state._tag === \"idle\" || state._tag === \"loading\") {\n return withPublication(\n <div aria-live=\"polite\" className={styles.reviewStatus} role=\"status\">\n <strong>Loading review state</strong>\n <span>Checking durable review history for this exact head.</span>\n <span aria-hidden=\"true\" className={styles.reviewRunway} />\n </div>\n )\n }\n if (state._tag === \"failed\") {\n return withPublication(\n <div className={styles.reviewStatus}>\n <strong>Review state unavailable</strong>\n <span>The current review could not be loaded. No human decision was changed.</span>\n <Button onClick={onRetry}>Retry</Button>\n </div>\n )\n }\n\n const review = state.review\n const threadEvents = state.thread?.events ?? []\n const usageJobId =\n review._tag === \"stale\"\n ? review.previousJobId\n : review._tag === \"pending\" ||\n review._tag === \"completed\" ||\n review._tag === \"failed\" ||\n review._tag === \"interrupted\"\n ? review.jobId\n : null\n const usageEvents =\n usageJobId === null\n ? []\n : threadEvents.filter(\n (event): event is Extract<PullRequestReviewThreadEvent, { readonly _tag: \"usage\" }> =>\n event._tag === \"usage\" && event.jobId === usageJobId\n )\n const usage = usageEvents.reduce(\n (total, event) => ({\n inputTokens: total.inputTokens + event.inputTokens,\n outputTokens: total.outputTokens + event.outputTokens\n }),\n { inputTokens: 0, outputTokens: 0 }\n )\n const usageRun =\n usageJobId === null\n ? null\n : threadEvents.find(\n (event): event is Extract<PullRequestReviewThreadEvent, { readonly _tag: \"run-queued\" }> =>\n event._tag === \"run-queued\" && event.jobId === usageJobId\n )\n const completeUsageVisible =\n state.thread !== undefined && (!state.thread.hasEarlier || (usageRun !== null && usageRun !== undefined))\n const missingUsageLabel = completeUsageVisible ? \"Not reported\" : \"Load earlier history\"\n const presentedThreadEvents = threadEvents\n .map((event) => ({ event, summary: threadEventSummary(event) }))\n .filter(\n (\n item\n ): item is {\n readonly event: PullRequestReviewThreadEvent\n readonly summary: string\n } => item.summary !== null\n )\n const completeThreadVisible = state.thread !== undefined && (state.thread.historyLoaded || !state.thread.hasEarlier)\n const visibleThreadEvents = completeThreadVisible ? presentedThreadEvents : presentedThreadEvents.slice(-12)\n const reviewRunning = review._tag === \"pending\"\n const composerDisabled = state.action === \"starting\" || reviewRunning\n const threadSurface = (\n <section aria-label=\"Review thread\" className={styles.reviewThread}>\n <header>\n <strong>Review thread</strong>\n <span>{threadEvents.length === 0 ? \"No runs yet\" : \"Durable across pull-request heads\"}</span>\n </header>\n {usageJobId === null ? null : (\n <dl aria-label=\"Review run usage\" className={styles.reviewUsage}>\n <div>\n <dt>Agent</dt>\n <dd>\n {usageRun === null || usageRun === undefined\n ? missingUsageLabel\n : `${durableProviderName(usageRun.providerId)} · ${\n usageRun.model === null ? \"model not reported\" : modelName(usageRun.providerId, usageRun.model)\n }`}\n </dd>\n </div>\n <div>\n <dt>Input tokens</dt>\n <dd>\n {!completeUsageVisible || usageEvents.length === 0\n ? missingUsageLabel\n : usage.inputTokens.toLocaleString(\"en-US\")}\n </dd>\n </div>\n <div>\n <dt>Output tokens</dt>\n <dd>\n {!completeUsageVisible || usageEvents.length === 0\n ? missingUsageLabel\n : usage.outputTokens.toLocaleString(\"en-US\")}\n </dd>\n </div>\n <div>\n <dt>Cost</dt>\n <dd>Not reported</dd>\n </div>\n </dl>\n )}\n <ReviewThreadTranscript\n events={visibleThreadEvents}\n hasEarlier={state.thread?.hasEarlier ?? false}\n historyAction={state.historyAction}\n historyLoaded={state.thread !== undefined}\n key={requestScope}\n onLoadEarlier={onLoadEarlier}\n />\n {canEnqueue && state.provider !== null && review._tag !== \"unavailable\" ? (\n <div className={styles.reviewThreadComposer}>\n <label htmlFor=\"review-thread-request\">\n {reviewRunning ? \"Draft the next review request\" : \"Ask Relay about this pull request\"}\n </label>\n {providerPresets.length > 1 ? (\n selectedProvider === null ? null : (\n <ReviewPresetChoices\n accessibleName=\"Targeted review agent presets\"\n groupName=\"targeted-review-agent\"\n onSelect={setSelectedProviderId}\n presets={providerPresets}\n selectedProviderId={selectedProvider.providerId}\n />\n )\n ) : selectedProvider === null ? null : (\n <span className={styles.reviewSelectedPreset}>\n Review with {providerName(selectedProvider)} ·{\" \"}\n {modelName(selectedProvider.providerId, selectedProvider.model)}\n </span>\n )}\n <div aria-label=\"Review prompt templates\" className={styles.reviewTemplateList}>\n {REVIEW_PROMPT_TEMPLATES.map((template) => (\n <Button key={template.label} onClick={() => insertPromptTemplate(template.prompt)}>\n {template.label}\n </Button>\n ))}\n </div>\n <textarea\n aria-describedby=\"review-thread-request-help review-thread-request-count\"\n id=\"review-thread-request\"\n maxLength={MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH}\n onChange={(event) => setRequest(event.currentTarget.value)}\n onKeyDown={handleComposerKeyDown}\n placeholder=\"Re-check the error handling in the connection flow…\"\n ref={requestRef}\n rows={3}\n value={request}\n />\n <div className={styles.reviewThreadComposerFooter}>\n <span id=\"review-thread-request-help\">Ctrl/⌘ + Enter to run</span>\n <span id=\"review-thread-request-count\">\n {String(request.length)} / {String(MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH)}\n </span>\n </div>\n {state.action === \"failed\" && submittedRequest !== null ? (\n <span role=\"alert\">\n Targeted review did not start. Your request is still here—check the provider and worker, then try again.\n </span>\n ) : null}\n <Button disabled={composerDisabled || request.trim().length === 0} onClick={submitTargetedReview}>\n {state.action === \"starting\"\n ? \"Starting targeted review…\"\n : reviewRunning\n ? \"Review in progress\"\n : \"Start targeted review\"}\n </Button>\n </div>\n ) : null}\n </section>\n )\n const withThread = (content: ReactElement): ReactElement =>\n withPublication(\n <>\n {content}\n {threadSurface}\n </>\n )\n const reviewLaunch = (headRevision: string, triggerLabel: string, repeat = false): ReactElement | null =>\n selectedProvider === null ? null : (\n <Dialog.Root onOpenChange={changeLaunchOpen} open={launchOpen}>\n <Dialog.Trigger disabled={state.action === \"starting\"}>\n {state.action === \"starting\" ? \"Starting review…\" : triggerLabel}\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.reviewLaunchDialog}\n description={`${providerName(selectedProvider)} can inspect and temporarily edit the disposable checkout. It cannot approve, comment on, or change this CodeCommit pull request.`}\n title={repeat ? \"Review this exact head again\" : \"Review this exact head\"}\n >\n <div className={styles.reviewLaunchBody}>\n <small className={styles.reviewLaunchEyebrow}>No CodeCommit writes</small>\n {providerPresets.length > 1 ? (\n <ReviewPresetChoices\n accessibleName=\"Review agent presets\"\n groupName=\"full-review-agent\"\n onSelect={setSelectedProviderId}\n presets={providerPresets}\n selectedProviderId={selectedProvider.providerId}\n />\n ) : null}\n <dl className={styles.reviewLaunchFacts}>\n <div>\n <dt>Exact head</dt>\n <dd>\n <code>{headRevision}</code>\n </dd>\n </div>\n <div>\n <dt>Agent</dt>\n <dd>{providerName(selectedProvider)}</dd>\n </div>\n <div>\n <dt>Model</dt>\n <dd>{modelName(selectedProvider.providerId, selectedProvider.model)}</dd>\n </div>\n <div>\n <dt>Scope</dt>\n <dd>Full project</dd>\n </div>\n <div>\n <dt>Budget</dt>\n <dd>{formatBudget(selectedProvider.reviewProfile.budgetMillis)}</dd>\n </div>\n <div>\n <dt>Network</dt>\n <dd>\n {networkAccessLabel(selectedProvider.reviewProfile.networkAccess, providerName(selectedProvider))}\n </dd>\n </div>\n <div>\n <dt>Isolation</dt>\n <dd>Disposable sbx sandbox</dd>\n </div>\n </dl>\n <div className={styles.reviewLaunchActions}>\n <Dialog.Close>Cancel</Dialog.Close>\n <Dialog.Close onClick={submitFullReview}>Start full-project review</Dialog.Close>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Root>\n )\n if (review._tag === \"unavailable\") {\n return withThread(\n <>\n <strong>Review unavailable</strong>\n <span>{unavailableMessage(review.reason)}</span>\n </>\n )\n }\n if (review._tag === \"pending\") {\n const startedAt = review.startedAt ?? null\n const budgetMillis = review.budgetMillis ?? review.reviewProfile.budgetMillis\n const label =\n review.state === \"queued\"\n ? \"Review queued\"\n : review.state === \"running\"\n ? \"Reviewing exact head\"\n : \"Cancellation requested\"\n return withThread(\n <div aria-live=\"polite\" className={styles.reviewStatus} role=\"status\">\n <strong>{label}</strong>\n <span>\n {durableProviderName(review.providerId)} · {modelName(review.providerId, review.model)}. This page updates\n automatically.\n </span>\n <span>\n {networkAccessLabel(review.reviewProfile.networkAccess, durableProviderName(review.providerId))} · Disposable\n sbx sandbox\n </span>\n <dl>\n <div>\n <dt>Elapsed</dt>\n <dd>\n {startedAt === null\n ? \"Waiting for worker\"\n : formatBudget(\n Math.max(0, DateTime.toEpochMillis(DateTime.nowUnsafe()) - DateTime.toEpochMillis(startedAt))\n )}\n </dd>\n </div>\n <div>\n <dt>Remaining budget</dt>\n <dd>\n {startedAt === null\n ? formatBudget(budgetMillis)\n : formatBudget(\n Math.max(\n 0,\n budgetMillis - (DateTime.toEpochMillis(DateTime.nowUnsafe()) - DateTime.toEpochMillis(startedAt))\n )\n )}\n </dd>\n </div>\n <div>\n <dt>Current step</dt>\n <dd>{review.activity.events.at(-1) ?? \"Fetching exact source and starting the sandbox…\"}</dd>\n </div>\n </dl>\n {review.activity.events.length === 0 ? null : (\n <ol aria-label=\"Live review activity\">\n {review.activity.events.map((event, index) => (\n <li key={`${String(index)}:${event}`}>{event}</li>\n ))}\n </ol>\n )}\n {review.activity.truncated ? <span>Earlier review activity is not shown.</span> : null}\n {canEnqueue ? (\n <div>\n {review.budgetExtensionCount === 0 ? (\n <Button onClick={onExtendReviewBudget}>{`Add ${formatBudget(review.reviewProfile.budgetMillis)}`}</Button>\n ) : (\n <span>One budget extension used.</span>\n )}\n <Button onClick={onCancelReview}>Cancel review</Button>\n </div>\n ) : null}\n <code className={styles.reviewHead}>{review.subject.headRevision}</code>\n <span aria-hidden=\"true\" className={styles.reviewRunway} />\n </div>\n )\n }\n if (review._tag === \"stale\") {\n const previousReviewCompleted = review.previousState === \"succeeded\"\n return (\n <>\n <div aria-live=\"polite\" className={styles.reviewStatus} role=\"status\">\n <strong>New head available</strong>\n {previousReviewCompleted ? (\n <span>\n The last completed review belongs to an older immutable revision. Its findings cannot be published against\n the current head.\n </span>\n ) : (\n <span>\n The previous review did not finish and belongs to an older immutable revision. Its retained findings are\n incomplete and cannot be published against the current head.\n </span>\n )}\n <dl>\n <div>\n <dt>Last reviewed</dt>\n <dd>\n <code>{review.previousHead}</code>\n </dd>\n </div>\n <div>\n <dt>Current head</dt>\n <dd>\n <code>{review.subject.headRevision}</code>\n </dd>\n </div>\n </dl>\n <ReviewOrientationSurface orientation={review.previousReport.orientation} />\n {review.previousReport.suggestions.length === 0 ? (\n <span>The previous review retained no validated suggestions.</span>\n ) : (\n <ol aria-label=\"Previous review findings\" className={styles.reviewFindings}>\n {review.previousReport.suggestions.map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <ReviewSuggestionCard\n canPublish={false}\n isPreviewing={false}\n jobId={review.previousJobId}\n onPreviewPublication={() => undefined}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={review.previousReport.notes} />\n <span>Previous-head findings are read-only. Start a current-head review before publishing anything.</span>\n {!canEnqueue ? (\n <span>Only a workspace owner can start the new review.</span>\n ) : state.provider === null ? (\n <span>Configure an sbx Review Agent Profile to review the new head.</span>\n ) : (\n <>\n {reviewLaunch(review.subject.headRevision, \"Review current head\")}\n {state.action === \"failed\" ? (\n <span role=\"alert\">\n The current-head review could not be started. Check the provider and worker, then try again.\n </span>\n ) : null}\n </>\n )}\n </div>\n {threadSurface}\n </>\n )\n }\n if (review._tag === \"failed\") {\n const report = review.report\n const failure = review.failure ?? null\n return withThread(\n <>\n <strong>\n {review.state === \"cancelled\"\n ? \"Review cancelled\"\n : failure === null\n ? \"Review did not finish\"\n : failureHeading(failure.stage)}\n </strong>\n {review.state === \"failed\" && failure !== null ? <span>{failureGuidance(failure)}</span> : null}\n {review.state === \"failed\" && failure !== null && failureCause(failure.cause) !== null ? (\n <span>Cause: {failureCause(failure.cause)}</span>\n ) : null}\n {report == null ? (\n <span>The failed run did not change approval or publish a recommendation.</span>\n ) : (\n <>\n <Text>\n This review is incomplete. The retained findings were validated before the run stopped; unreviewed areas\n remain.\n </Text>\n <ReviewOrientationSurface orientation={report.orientation} />\n {report.suggestions.length === 0 ? (\n <span>No validated suggestions were retained before the run stopped.</span>\n ) : (\n <ol className={styles.reviewFindings}>\n {report.suggestions.map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <VersionedReviewSuggestionCard\n canEdit={canEnqueue}\n entityId={state.entityId}\n isPreviewing={\n publication._tag === \"previewing\" &&\n publication.selection.suggestionId === suggestion.suggestionId\n }\n jobId={review.jobId}\n onPreviewPublication={onPreviewPublication}\n onTargetSuggestion={onTargetSuggestion}\n {...(onSuggestionRevisionAccepted === undefined ? {} : { onSuggestionRevisionAccepted })}\n {...(revisionTransport === undefined ? {} : { revisionTransport })}\n sessionKey={state.sessionKey}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={report.notes} />\n <span>Retained findings remain advice only and may be published after confirmation.</span>\n </>\n )}\n {canEnqueue && state.provider !== null ? (\n <>\n {state.action === \"failed\" && submittedRequest === null ? (\n <span role=\"alert\">\n A new full review could not be started. Check the provider and worker, then try again.\n </span>\n ) : null}\n {reviewLaunch(\n review.subject.headRevision,\n failure?.retryable === false ? \"Review again\" : \"Retry review\",\n true\n )}\n </>\n ) : null}\n </>\n )\n }\n if (review._tag === \"interrupted\") {\n return withThread(\n <>\n <strong>Review interrupted by restart</strong>\n <Text>\n Control Center restarted before this run finished. The retained findings were validated before the run\n stopped; unreviewed areas remain.\n </Text>\n <ReviewOrientationSurface orientation={review.report.orientation} />\n {review.report.suggestions.length === 0 ? (\n <span>No validated suggestions were retained before the run stopped.</span>\n ) : (\n <ol className={styles.reviewFindings}>\n {review.report.suggestions.map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <VersionedReviewSuggestionCard\n canEdit={canEnqueue}\n entityId={state.entityId}\n isPreviewing={\n publication._tag === \"previewing\" && publication.selection.suggestionId === suggestion.suggestionId\n }\n jobId={review.jobId}\n onPreviewPublication={onPreviewPublication}\n onTargetSuggestion={onTargetSuggestion}\n {...(onSuggestionRevisionAccepted === undefined ? {} : { onSuggestionRevisionAccepted })}\n {...(revisionTransport === undefined ? {} : { revisionTransport })}\n sessionKey={state.sessionKey}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={review.report.notes} />\n <span>Retained findings remain advice only and may be published after confirmation.</span>\n {canEnqueue && state.provider !== null ? (\n <>\n {state.action === \"failed\" && submittedRequest === null ? (\n <span role=\"alert\">\n A new full review could not be started. Check the provider and worker, then try again.\n </span>\n ) : null}\n {reviewLaunch(review.subject.headRevision, \"Start a new review\")}\n </>\n ) : null}\n </>\n )\n }\n if (review._tag === \"completed\") {\n return withThread(\n <>\n <strong>{outcomeLabel(review.outcome)}</strong>\n {review.report.completion.status === \"unable-to-conclude\" ? (\n <Text>{review.report.completion.reason}</Text>\n ) : null}\n <ReviewOrientationSurface orientation={review.report.orientation} />\n {(suggestions ?? review.report.suggestions).length === 0 ? (\n <span>No validated suggestions were retained for this exact head.</span>\n ) : (\n <ol className={styles.reviewFindings}>\n {(suggestions ?? review.report.suggestions).map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <VersionedReviewSuggestionCard\n canEdit={canEnqueue}\n entityId={state.entityId}\n isPreviewing={\n publication._tag === \"previewing\" && publication.selection.suggestionId === suggestion.suggestionId\n }\n jobId={review.jobId}\n onPreviewPublication={onPreviewPublication}\n onTargetSuggestion={onTargetSuggestion}\n {...(onSuggestionRevisionAccepted === undefined ? {} : { onSuggestionRevisionAccepted })}\n {...(revisionTransport === undefined ? {} : { revisionTransport })}\n sessionKey={state.sessionKey}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={review.report.notes} />\n <span>Agent advice only. Preview and confirm a finding to post it to CodeCommit, or dismiss it locally.</span>\n </>\n )\n }\n\n return withThread(\n <>\n <strong>Agent review not run</strong>\n <span>An immutable-head review produces advice, never a human approval.</span>\n {!canEnqueue ? (\n <span>Only a workspace owner can start a review.</span>\n ) : state.provider === null ? (\n <span>\n PR review is not configured. Enable Codex, Claude, or an Effect AI review runner on the Control Center server.\n The workspace must allow that provider with Review sandbox and Isolated profile.\n </span>\n ) : (\n <>{reviewLaunch(review.subject.headRevision, \"Review exact head\")}</>\n )}\n {state.action === \"failed\" ? (\n <span role=\"alert\">The review could not be started. Check provider and worker configuration, then retry.</span>\n ) : null}\n </>\n )\n}\n\nexport default PullRequestReviewPanel\n"],"file":"PullRequestReviewPanel-DoI2jcWK.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["ReviewProfileControl","profile","selected","profiles","id","selectedProfileId","presentation","_jsx","accessibleName","label","_jsxs","groupName","onProfileChange","describeProfile","Field","className","controlProps","disabled","event","anchorLabel","suggestion","replacementSides","before","after","currentPath","oldLinesRemaining","newLinesRemaining","line","unifiedDiff","hunk","boundary","content","suggestionStateLabel","state","ReviewSuggestionCard","replacement","import_jsx_runtime","styles","metadata","Text","location","extraActions","canPublish","Button","isPreviewing","publicationBlockedReason","onPreviewPublication","ReviewNotes","notes","note","reviewSuggestionRevisionAuthorLabel","revision","reviewSuggestionRevisionValidationLabel","ReviewSuggestionRevisionHistory","revisions","page","revisionId","DateTime.formatIso","DateTime.formatLocal","_Fragment","loadingEarlier","loadEarlier","AdvancedSuggestionFields","Schema.Struct","PrReviewSuggestion","AdvancedSuggestionFieldsJson","Schema.fromJsonString","narrativeFields","editableSuggestion","advancedJson","Schema.encodeSync","ReviewSuggestionRevisionDialog","current","draft","setDraft","useState","advanced","setAdvanced","advancedError","setAdvancedError","import_react","open","nextDraft","preservedDraft","description","useMemo","save","decoded","Schema.decodeUnknownResult","Result.isFailure","edit","PrReviewSuggestionEdit","onSave","Dialog","mode","severity","level","field","conflict","onResolveConflict","saving","canEdit","REVISION_PAGE_SIZE","PrReviewSuggestionRevisionPageSize","browserReviewSuggestionRevisionTransport","Effect.runPromise","Effect.gen","makeAuthenticatedMutationClient","scope","request","Effect.provide","FetchHttpClient.layer","makeControlCenterApiClient","sameScope","left","right","mergePages","earlier","retained","pageWithAcceptedRevision","accepted","saveOutcome","conflictFailure","Predicate.isTagged","ignoreAcceptedRevision","useReviewSuggestionRevisions","requestRevision","setRequestRevision","setLoadingEarlier","setState","activeAbort","useRef","loadingEarlierRef","latestScope","latestOnAccepted","onAccepted","abort","transport","useCallback","acceptedPage","failure","latest","outcome","dismiss","authorLabel","author","VersionedReviewSuggestionCard","controller","entityId","jobId","sessionKey","revisionTransport","onSuggestionRevisionAccepted","dialogMode","setDialogMode","dialogOpen","setDialogOpen","dismissOpen","setDismissOpen","dismissalReason","setDismissalReason","presentedSuggestion","suggestionCanMutate","validationBlocked","openDialog","onTargetSuggestion","selection","reason","PrReviewDismissalReason","unavailableMessage","outcomeLabel","formatBudget","minutes","budgetMillis","providerIdName","providerId","providerName","provider","providerReviewLabel","modelName","model","networkAccessLabel","networkAccess","failureHeading","stage","failureCause","cause","failureGuidance","retryable","REVIEW_PROMPT_TEMPLATES","ReviewPresetChoices","presets","controlCenterReviewProfile","preset","onSelect","selectedProviderId","THREAD_END_THRESHOLD","ReviewThreadTranscript","scrollerRef","followsLatestRef","previousRef","hasNewActivity","setHasNewActivity","first","events","last","scroller","previous","prepended","appended","previousFirstElement","element","followsLatest","firstElement","hasEarlier","historyAction","onLoadEarlier","historyLoaded","summary","ReviewSuggestionPublicationSurface","lazy","ReviewOrientationSurface","orientation","cohort","layer","path","startLine","endLine","layerIndex","cohortIndex","threadEventSummary","PullRequestReviewPanel","launchOpen","setLaunchOpen","setRequest","requestedSelection","setRequestedSelection","submittedRequest","setSubmittedRequest","setSelectedProviderId","requestRef","targetedSubmissionInFlightRef","providerPresets","selectedProvider","durableProviderName","candidate","requestScope","textarea","changeLaunchOpen","submitFullReview","onStart","submitTargetedReview","prompt","handleComposerKeyDown","insertPromptTemplate","selectionStart","selectionEnd","leadingBreak","trailingBreak","availableInsertionLength","MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH","insertion","nextRequest","publicationSurface","publication","Suspense","onCancelPublication","onPublishSuggestion","withPublication","onRetry","review","threadEvents","usageJobId","usageEvents","usage","total","usageRun","completeUsageVisible","missingUsageLabel","presentedThreadEvents","item","visibleThreadEvents","reviewRunning","composerDisabled","threadSurface","canEnqueue","template","withThread","reviewLaunch","triggerLabel","repeat","headRevision","startedAt","DateTime.toEpochMillis","DateTime.nowUnsafe","index","onExtendReviewBudget","onCancelReview","previousReviewCompleted","report","suggestions"],"ignoreList":[],"sources":["../../../../review/dist/view.js","../../../src/client/entities/ReviewSuggestionPresentation.tsx","../../../src/client/entities/ReviewSuggestionRevisionHistory.tsx","../../../src/client/entities/ReviewSuggestionRevisionDialog.tsx","../../../src/client/entities/useReviewSuggestionRevisions.ts","../../../src/client/entities/VersionedReviewSuggestionCard.tsx","../../../src/client/entities/PullRequestReviewPanel.tsx"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/** Controlled review controls and retained-result status. @module */\nimport { Field, StateLabel } from \"@knpkv/rly/primitives\";\n/** One profile owns kind, skills, provider, harness, and model; callers cannot create a mixed selection. */\nexport const ReviewProfileControl = ({ accessibleName, className, describeProfile = (profile) => `${profile.provider} · ${profile.model}`, disabled = false, groupName = \"review-profile\", label = \"Profile\", onProfileChange, presentation = \"select\", profiles, selectedProfileId }) => {\n const selected = profiles.find(({ id }) => id === selectedProfileId);\n if (presentation === \"radios\") {\n return (_jsx(\"fieldset\", { \"aria-label\": accessibleName ?? label, className: className, disabled: disabled, children: profiles.map((profile) => (_jsxs(\"label\", { children: [_jsx(\"input\", { checked: profile.id === selectedProfileId, name: groupName, onChange: () => onProfileChange(profile), type: \"radio\", value: profile.id }), _jsxs(\"span\", { children: [_jsx(\"strong\", { children: profile.name }), _jsx(\"small\", { children: describeProfile(profile) })] })] }, profile.id))) }));\n }\n return (_jsx(Field, { ...(className === undefined ? {} : { className }), ...(selected === undefined ? {} : { description: describeProfile(selected) }), label: label, size: \"compact\", children: (controlProps) => (_jsxs(\"select\", { ...controlProps, disabled: disabled || profiles.length === 0, onChange: (event) => {\n const profile = profiles.find(({ id }) => id === event.currentTarget.value);\n if (profile !== undefined)\n onProfileChange(profile);\n }, value: selected?.id ?? \"\", children: [selected === undefined ? _jsx(\"option\", { value: \"\", children: \"Select a profile\" }) : null, profiles.map((profile) => (_jsx(\"option\", { value: profile.id, children: profile.name }, profile.id)))] })) }));\n};\nexport const ReviewResultStatus = ({ presentation }) => {\n switch (presentation._tag) {\n case \"Empty\":\n return null;\n case \"Current\":\n return _jsx(StateLabel, { label: presentation.completed.profile.name, size: \"compact\", tone: \"progress\" });\n case \"Previous\":\n return _jsx(StateLabel, { label: \"Previous result\", size: \"compact\", tone: \"caution\" });\n case \"Stale\":\n return _jsx(StateLabel, { label: \"Earlier revision\", size: \"compact\", tone: \"caution\" });\n }\n};\n//# sourceMappingURL=view.js.map","import { Button, Text } from \"@knpkv/rly/primitives\"\nimport type { ReactElement, ReactNode } from \"react\"\n\nimport type { JobId } from \"../../domain/identifiers.js\"\nimport type { PrReviewNote, PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst anchorLabel = (suggestion: PrReviewSuggestion): string => {\n switch (suggestion.anchor._tag) {\n case \"line\":\n return `Line suggestion · ${suggestion.anchor.path}:${String(suggestion.anchor.line)}`\n case \"file\":\n return `File suggestion · ${suggestion.anchor.path}:${String(suggestion.anchor.line)}`\n case \"changes\":\n return \"Whole-change suggestion\"\n }\n}\n\nconst replacementSides = (unifiedDiff: string) => {\n const before = new Array<string>()\n const after = new Array<string>()\n let currentPath = \"\"\n let oldLinesRemaining = 0\n let newLinesRemaining = 0\n for (const line of unifiedDiff.split(\"\\n\")) {\n const hunk = /^@@ -\\d+(?:,(\\d+))? \\+\\d+(?:,(\\d+))? @@/u.exec(line)\n if (hunk !== null) {\n const boundary = `⋯ ${currentPath} · ${line}`\n before.push(boundary)\n after.push(boundary)\n oldLinesRemaining = Number(hunk[1] ?? \"1\")\n newLinesRemaining = Number(hunk[2] ?? \"1\")\n continue\n }\n if (oldLinesRemaining === 0 && newLinesRemaining === 0) {\n if (line.startsWith(\"+++ \")) currentPath = line.slice(4).replace(/^b\\//u, \"\")\n continue\n }\n if (line === \"\\\\") continue\n if (line.startsWith(\"-\") && oldLinesRemaining > 0) {\n before.push(line.slice(1))\n oldLinesRemaining -= 1\n continue\n }\n if (line.startsWith(\"+\") && newLinesRemaining > 0) {\n after.push(line.slice(1))\n newLinesRemaining -= 1\n continue\n }\n if (line.startsWith(\" \") && oldLinesRemaining > 0 && newLinesRemaining > 0) {\n const content = line.slice(1)\n before.push(content)\n after.push(content)\n oldLinesRemaining -= 1\n newLinesRemaining -= 1\n continue\n }\n }\n return {\n before: before.join(\"\\n\"),\n after: after.join(\"\\n\")\n }\n}\n\nconst suggestionStateLabel = (state: PrReviewSuggestion[\"state\"]): string =>\n `${state.slice(0, 1).toUpperCase()}${state.slice(1)}`\n\n/** Present one publishable, evidence-backed suggestion without owning its lifecycle. */\nexport const ReviewSuggestionCard = ({\n canPublish,\n extraActions,\n isPreviewing,\n jobId,\n metadata,\n onPreviewPublication,\n publicationBlockedReason,\n suggestion\n}: {\n readonly canPublish: boolean\n readonly extraActions?: ReactNode\n readonly isPreviewing: boolean\n readonly jobId: JobId\n readonly metadata?: ReactNode\n readonly onPreviewPublication: (selection: {\n readonly jobId: JobId\n readonly suggestionId: PrReviewSuggestion[\"suggestionId\"]\n }) => void\n readonly publicationBlockedReason?: string\n readonly suggestion: PrReviewSuggestion\n}): ReactElement => {\n const replacement = suggestion.replacement === undefined ? null : replacementSides(suggestion.replacement.unifiedDiff)\n\n return (\n <article className={styles.suggestionCard} data-severity={suggestion.severity}>\n <header className={styles.suggestionHeading}>\n <span className={styles.severity}>{suggestion.severity}</span>\n <span>\n <small>{anchorLabel(suggestion)}</small>\n <strong>{suggestion.title}</strong>\n </span>\n <span className={styles.confidence}>\n {suggestionStateLabel(suggestion.state)} · {suggestion.confidence.level} confidence\n </span>\n </header>\n {metadata}\n\n <Text>{suggestion.problem}</Text>\n <dl className={styles.suggestionDetails}>\n <div>\n <dt>Impact</dt>\n <dd>{suggestion.impact}</dd>\n </div>\n <div>\n <dt>Recommendation</dt>\n <dd>{suggestion.recommendation}</dd>\n </div>\n </dl>\n <details>\n <summary>Evidence and confidence</summary>\n <code>\n {suggestion.evidence.path}:{String(suggestion.evidence.startLine)}\n {suggestion.evidence.endLine === suggestion.evidence.startLine\n ? \"\"\n : `–${String(suggestion.evidence.endLine)}`}\n </code>\n <pre>{suggestion.evidence.excerpt}</pre>\n <Text>{suggestion.confidence.reason}</Text>\n </details>\n\n {suggestion.relatedLocations.length === 0 ? null : (\n <section aria-label=\"Related locations\" className={styles.relatedLocations}>\n <strong>Related locations</strong>\n <ul>\n {suggestion.relatedLocations.map((location) => (\n <li key={`${location.path}:${String(location.startLine)}:${String(location.endLine)}`}>\n <code>\n {location.path}:{String(location.startLine)}\n {location.endLine === location.startLine ? \"\" : `–${String(location.endLine)}`}\n </code>\n <span>{location.label}</span>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {replacement === null || suggestion.replacement === undefined ? null : (\n <section aria-label=\"Suggested replacement\" className={styles.replacementPreview}>\n <header>\n <strong>Suggested replacement</strong>\n <span>Inert patch · {suggestion.replacement.reviewedHead.slice(0, 12)}</span>\n </header>\n <Text>{suggestion.replacement.explanation}</Text>\n <div>\n <figure>\n <figcaption>Before</figcaption>\n <pre>{replacement.before}</pre>\n </figure>\n <figure>\n <figcaption>After</figcaption>\n <pre>{replacement.after}</pre>\n </figure>\n </div>\n </section>\n )}\n\n {suggestion.prevention === undefined ? null : suggestion.prevention.enforcement === \"none\" ? (\n <details className={styles.preventionProposal}>\n <summary>Prevention note · no stable guardrail</summary>\n <Text>\n {suggestion.prevention.summary} · {suggestion.prevention.rationale}\n </Text>\n </details>\n ) : (\n <details className={styles.preventionProposal}>\n <summary>Prevention proposal · separate review required</summary>\n <Text>\n {suggestion.prevention.summary} · {suggestion.prevention.enforcement}\n </Text>\n <dl>\n <dt>Recurring evidence</dt>\n <dd>{suggestion.prevention.recurrenceEvidence}</dd>\n <dt>Existing rule or configuration</dt>\n <dd>{suggestion.prevention.existingRuleOrConfig}</dd>\n <dt>Target file</dt>\n <dd>{suggestion.prevention.targetFile}</dd>\n <dt>Source paths</dt>\n <dd>{suggestion.prevention.sourcePaths.join(\", \")}</dd>\n <dt>Matcher or invariant</dt>\n <dd>{suggestion.prevention.matcherOrInvariant}</dd>\n <dt>Invalid fixture</dt>\n <dd>\n <pre>{suggestion.prevention.invalidFixture}</pre>\n </dd>\n <dt>Valid fixture</dt>\n <dd>\n <pre>{suggestion.prevention.validFixture}</pre>\n </dd>\n <dt>Boundary and exclusions</dt>\n <dd>{suggestion.prevention.boundary}</dd>\n </dl>\n </details>\n )}\n\n {extraActions === undefined && (!canPublish || suggestion.state !== \"draft\") ? null : (\n <div className={styles.suggestionActions}>\n {extraActions}\n {canPublish && suggestion.state === \"draft\" ? (\n <Button\n disabled={isPreviewing || publicationBlockedReason !== undefined}\n onClick={() =>\n onPreviewPublication({\n jobId,\n suggestionId: suggestion.suggestionId\n })\n }\n >\n {isPreviewing ? \"Preparing approval…\" : \"Review & approve\"}\n </Button>\n ) : null}\n </div>\n )}\n {publicationBlockedReason === undefined ? null : (\n <Text role=\"status\" tone=\"secondary\" variant=\"meta\">\n {publicationBlockedReason}\n </Text>\n )}\n </article>\n )\n}\n\n/** Keep non-publishable observations visibly separate from actionable suggestions. */\nexport const ReviewNotes = ({ notes }: { readonly notes: ReadonlyArray<PrReviewNote> }): ReactElement | null =>\n notes.length === 0 ? null : (\n <section aria-labelledby=\"review-notes-title\" className={styles.reviewNotes}>\n <header>\n <span>\n <small>Never publishable</small>\n <strong id=\"review-notes-title\">Review Notes</strong>\n </span>\n <span>{notes.length}</span>\n </header>\n <ul>\n {notes.map((note) => (\n <li key={note.noteId}>\n <span>\n {note.reason === \"pre-existing\" ? \"Pre-existing\" : \"Low confidence\"} · {note.confidence.level}\n </span>\n <strong>{note.title}</strong>\n <Text>{note.observation}</Text>\n {note.location === undefined ? null : (\n <code>\n {note.location.path}:{String(note.location.startLine)}\n {note.location.endLine === note.location.startLine ? \"\" : `–${String(note.location.endLine)}`}\n </code>\n )}\n <small>{note.confidence.reason}</small>\n </li>\n ))}\n </ul>\n </section>\n )\n","import { Button, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\n\nimport type { PrReviewSuggestionRevision, PrReviewSuggestionRevisionPage } from \"../../domain/prReviewRevision.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nexport const reviewSuggestionRevisionAuthorLabel = (revision: PrReviewSuggestionRevision): string =>\n revision.author._tag === \"operator\"\n ? \"Operator\"\n : `${revision.author.providerId}${revision.author.model === null ? \"\" : ` · ${revision.author.model}`}`\n\nexport const reviewSuggestionRevisionValidationLabel = (revision: PrReviewSuggestionRevision): string =>\n revision.validation._tag === \"validated\" ? \"Validated\" : \"Needs revalidation\"\n\n/** Inspect complete immutable suggestion history without leaving the diff. */\nexport const ReviewSuggestionRevisionHistory = ({\n loadEarlier,\n loadingEarlier,\n page\n}: {\n readonly loadEarlier: () => void\n readonly loadingEarlier: boolean\n readonly page: PrReviewSuggestionRevisionPage\n}): ReactElement => {\n const revisions = [page.current, ...page.revisions.filter(({ revisionId }) => revisionId !== page.current.revisionId)]\n return (\n <div className={styles.revisionHistory}>\n <ol>\n {revisions.map((revision) => (\n <li key={revision.revisionId}>\n <header>\n <strong>Revision {String(revision.sequence)}</strong>\n <span>\n {reviewSuggestionRevisionValidationLabel(revision)} · {reviewSuggestionRevisionAuthorLabel(revision)}\n </span>\n </header>\n <time dateTime={DateTime.formatIso(revision.createdAt)}>\n {DateTime.formatLocal(revision.createdAt, {\n dateStyle: \"medium\",\n timeStyle: \"short\"\n })}\n </time>\n <details>\n <summary>{revision.suggestion.title}</summary>\n <Text>{revision.suggestion.problem}</Text>\n <dl>\n <dt>Impact</dt>\n <dd>{revision.suggestion.impact}</dd>\n <dt>Recommendation</dt>\n <dd>{revision.suggestion.recommendation}</dd>\n <dt>Severity</dt>\n <dd>{revision.suggestion.severity}</dd>\n <dt>Confidence</dt>\n <dd>\n {revision.suggestion.confidence.level} · {revision.suggestion.confidence.reason}\n </dd>\n <dt>Evidence</dt>\n <dd>\n <code>\n {revision.suggestion.evidence.path}:{String(revision.suggestion.evidence.startLine)}\n </code>\n <pre>{revision.suggestion.evidence.excerpt}</pre>\n </dd>\n <dt>Anchor</dt>\n <dd>\n <code>{JSON.stringify(revision.suggestion.anchor)}</code>\n </dd>\n <dt>Related locations</dt>\n <dd>\n {revision.suggestion.relatedLocations.length === 0 ? (\n \"None\"\n ) : (\n <pre>{JSON.stringify(revision.suggestion.relatedLocations, null, 2)}</pre>\n )}\n </dd>\n <dt>Replacement</dt>\n <dd>\n {revision.suggestion.replacement === undefined ? (\n \"None\"\n ) : (\n <>\n <Text>{revision.suggestion.replacement.explanation}</Text>\n <pre>{revision.suggestion.replacement.unifiedDiff}</pre>\n </>\n )}\n </dd>\n <dt>Prevention</dt>\n <dd>\n {revision.suggestion.prevention === undefined ? (\n \"None\"\n ) : (\n <pre>{JSON.stringify(revision.suggestion.prevention, null, 2)}</pre>\n )}\n </dd>\n </dl>\n </details>\n </li>\n ))}\n </ol>\n {page.hasMore ? (\n <Button aria-busy={loadingEarlier} disabled={loadingEarlier} loading={loadingEarlier} onClick={loadEarlier}>\n {loadingEarlier ? \"Loading earlier revisions…\" : \"Load earlier revisions\"}\n </Button>\n ) : null}\n </div>\n )\n}\n","import { Button, Dialog, Text } from \"@knpkv/rly/primitives\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useMemo, useState } from \"react\"\n\nimport { PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport { PrReviewSuggestionEdit, type PrReviewSuggestionRevisionPage } from \"../../domain/prReviewRevision.js\"\nimport {\n ReviewSuggestionRevisionHistory,\n reviewSuggestionRevisionAuthorLabel,\n reviewSuggestionRevisionValidationLabel\n} from \"./ReviewSuggestionRevisionHistory.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst AdvancedSuggestionFields = Schema.Struct({\n anchor: PrReviewSuggestion.fields.anchor,\n evidence: PrReviewSuggestion.fields.evidence,\n relatedLocations: PrReviewSuggestion.fields.relatedLocations,\n replacement: PrReviewSuggestion.fields.replacement,\n prevention: PrReviewSuggestion.fields.prevention\n})\nconst AdvancedSuggestionFieldsJson = Schema.fromJsonString(AdvancedSuggestionFields)\nconst narrativeFields = [\n [\"Problem\", \"problem\"],\n [\"Impact\", \"impact\"],\n [\"Recommendation\", \"recommendation\"]\n] satisfies ReadonlyArray<readonly [string, \"impact\" | \"problem\" | \"recommendation\"]>\n\nconst editableSuggestion = (suggestion: PrReviewSuggestion): PrReviewSuggestionEdit => ({\n title: suggestion.title,\n severity: suggestion.severity,\n problem: suggestion.problem,\n impact: suggestion.impact,\n evidence: suggestion.evidence,\n recommendation: suggestion.recommendation,\n confidence: suggestion.confidence,\n relatedLocations: suggestion.relatedLocations,\n ...(!(suggestion.prevention === undefined) && { prevention: suggestion.prevention }),\n ...(!(suggestion.replacement === undefined) && { replacement: suggestion.replacement }),\n anchor: suggestion.anchor\n})\n\nconst advancedJson = (suggestion: PrReviewSuggestionEdit): string =>\n Schema.encodeSync(AdvancedSuggestionFieldsJson)({\n anchor: suggestion.anchor,\n evidence: suggestion.evidence,\n relatedLocations: suggestion.relatedLocations,\n ...(!(suggestion.prevention === undefined) && { prevention: suggestion.prevention }),\n ...(!(suggestion.replacement === undefined) && { replacement: suggestion.replacement })\n })\n\n/** Edit or inspect one immutable suggestion revision without leaving the diff. */\nexport const ReviewSuggestionRevisionDialog = ({\n canEdit,\n conflict,\n loadEarlier,\n loadingEarlier,\n mode,\n onOpenChange,\n onResolveConflict,\n onSave,\n open,\n page,\n preservedDraft,\n saving\n}: {\n readonly canEdit: boolean\n readonly conflict: boolean\n readonly loadEarlier: () => void\n readonly loadingEarlier: boolean\n readonly mode: \"edit\" | \"history\"\n readonly onOpenChange: (open: boolean) => void\n readonly onResolveConflict: () => void\n readonly onSave: (edit: PrReviewSuggestionEdit) => void\n readonly open: boolean\n readonly page: PrReviewSuggestionRevisionPage\n readonly preservedDraft: PrReviewSuggestionEdit | null\n readonly saving: boolean\n}): ReactElement => {\n const current = page.current\n const [draft, setDraft] = useState(() => editableSuggestion(current.suggestion))\n const [advanced, setAdvanced] = useState(() => advancedJson(current.suggestion))\n const [advancedError, setAdvancedError] = useState(false)\n useEffect(() => {\n if (!open) return\n const nextDraft = preservedDraft ?? editableSuggestion(current.suggestion)\n setDraft(nextDraft)\n setAdvanced(advancedJson(nextDraft))\n setAdvancedError(false)\n }, [current.revisionId, current.suggestion, open, preservedDraft])\n const description = useMemo(\n () =>\n `Revision ${String(current.sequence)} · ${reviewSuggestionRevisionValidationLabel(\n current\n )} · ${reviewSuggestionRevisionAuthorLabel(current)}`,\n [current]\n )\n const save = (): void => {\n const decoded = Schema.decodeUnknownResult(AdvancedSuggestionFieldsJson)(advanced)\n if (Result.isFailure(decoded)) {\n setAdvancedError(true)\n return\n }\n setAdvancedError(false)\n const edit = Schema.decodeUnknownResult(PrReviewSuggestionEdit)({\n title: draft.title,\n severity: draft.severity,\n problem: draft.problem,\n impact: draft.impact,\n recommendation: draft.recommendation,\n confidence: draft.confidence,\n ...decoded.success\n })\n if (Result.isFailure(edit)) {\n setAdvancedError(true)\n return\n }\n onSave(edit.success)\n }\n\n return (\n <Dialog.Root onOpenChange={onOpenChange} open={open}>\n <Dialog.Content\n className={styles.revisionDialog}\n description={description}\n size=\"wide\"\n title={mode === \"edit\" ? \"Edit review suggestion\" : \"Revision history\"}\n >\n {mode === \"history\" ? (\n <ReviewSuggestionRevisionHistory loadEarlier={loadEarlier} loadingEarlier={loadingEarlier} page={page} />\n ) : (\n <form\n className={styles.revisionEditor}\n onSubmit={(event) => {\n event.preventDefault()\n save()\n }}\n >\n <div className={styles.revisionEditorLead}>\n <label>\n <span>Title</span>\n <input\n maxLength={500}\n onChange={(event) => setDraft({ ...draft, title: event.currentTarget.value })}\n required\n value={draft.title}\n />\n </label>\n <label>\n <span>Severity</span>\n <select\n onChange={(event) => {\n const severity = Schema.decodeUnknownResult(PrReviewSuggestion.fields.severity)(\n event.currentTarget.value\n )\n if (Result.isFailure(severity)) return\n setDraft({ ...draft, severity: severity.success })\n }}\n value={draft.severity}\n >\n <option value=\"P1\">P1</option>\n <option value=\"P2\">P2</option>\n <option value=\"P3\">P3</option>\n <option value=\"P4\">P4</option>\n </select>\n </label>\n <label>\n <span>Confidence</span>\n <select\n onChange={(event) => {\n const level = Schema.decodeUnknownResult(PrReviewSuggestion.fields.confidence.fields.level)(\n event.currentTarget.value\n )\n if (Result.isFailure(level)) return\n setDraft({\n ...draft,\n confidence: {\n ...draft.confidence,\n level: level.success\n }\n })\n }}\n value={draft.confidence.level}\n >\n <option value=\"high\">High</option>\n <option value=\"medium\">Medium</option>\n </select>\n </label>\n </div>\n {narrativeFields.map(([label, field]) => (\n <label key={field}>\n <span>{label}</span>\n <textarea\n maxLength={4_000}\n onChange={(event) =>\n setDraft({\n ...draft,\n [field]: event.currentTarget.value\n })\n }\n required\n rows={4}\n value={draft[field]}\n />\n </label>\n ))}\n <label>\n <span>Confidence reason</span>\n <textarea\n maxLength={2_000}\n onChange={(event) =>\n setDraft({\n ...draft,\n confidence: {\n ...draft.confidence,\n reason: event.currentTarget.value\n }\n })\n }\n required\n rows={3}\n value={draft.confidence.reason}\n />\n </label>\n <details className={styles.revisionAdvanced}>\n <summary>Advanced evidence, anchor, replacement and prevention</summary>\n <Text tone=\"secondary\">\n Complete schema-checked JSON. Invalid or incoherent evidence cannot be saved.\n </Text>\n <textarea\n aria-describedby={advancedError ? \"revision-advanced-error\" : undefined}\n aria-invalid={advancedError}\n aria-label=\"Advanced evidence, anchor, replacement and prevention JSON\"\n onChange={(event) => setAdvanced(event.currentTarget.value)}\n rows={14}\n spellCheck={false}\n value={advanced}\n />\n {advancedError ? (\n <span id=\"revision-advanced-error\" role=\"alert\">\n Advanced fields are not a valid complete suggestion.\n </span>\n ) : null}\n </details>\n {conflict ? (\n <div role=\"alert\">\n <span>A newer revision won. Your draft is preserved, but cannot be saved over the winner.</span>\n <Button onClick={onResolveConflict} type=\"button\" variant=\"quiet\">\n Use latest revision\n </Button>\n </div>\n ) : current.validation._tag === \"requires-revalidation\" ? (\n <span role=\"status\">Technical changes remain blocked from publication until revalidated.</span>\n ) : null}\n <div className={styles.revisionDialogActions}>\n <Dialog.Close disabled={saving}>Cancel</Dialog.Close>\n <Button disabled={!canEdit || saving} loading={saving} type=\"submit\">\n {saving ? \"Saving revision…\" : \"Save revision\"}\n </Button>\n </div>\n </form>\n )}\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n","import * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Predicate from \"effect/Predicate\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nimport type {\n DismissReviewSuggestionRequest,\n DismissReviewSuggestionResponse,\n EditReviewSuggestionRequest,\n EditReviewSuggestionResponse,\n ReviewSuggestionRevisionPage\n} from \"../../api/agent.js\"\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EntityId, JobId } from \"../../domain/identifiers.js\"\nimport type { PrReviewDismissalReason, PrReviewSuggestion, PrReviewSuggestionId } from \"../../domain/prReview.js\"\nimport {\n type PrReviewSuggestionEdit,\n PrReviewSuggestionRevisionPageSize,\n type PrReviewSuggestionRevisionSequence\n} from \"../../domain/prReviewRevision.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\ntype PrReviewDismissalReasonType = PrReviewDismissalReason\n\nconst REVISION_PAGE_SIZE = PrReviewSuggestionRevisionPageSize.make(24)\n\nexport interface ReviewSuggestionRevisionScope {\n readonly entityId: EntityId\n readonly jobId: JobId\n readonly sessionKey: string\n readonly suggestionId: PrReviewSuggestionId\n}\n\nexport interface ReviewSuggestionRevisionTransport {\n readonly dismiss?: (\n scope: ReviewSuggestionRevisionScope,\n request: DismissReviewSuggestionRequest,\n signal: AbortSignal\n ) => Promise<DismissReviewSuggestionResponse>\n readonly edit: (\n scope: ReviewSuggestionRevisionScope,\n request: EditReviewSuggestionRequest,\n signal: AbortSignal\n ) => Promise<EditReviewSuggestionResponse>\n readonly load: (\n scope: ReviewSuggestionRevisionScope,\n before: PrReviewSuggestionRevisionSequence | null,\n signal: AbortSignal\n ) => Promise<ReviewSuggestionRevisionPage>\n}\n\nexport type ReviewSuggestionRevisionAccepted = (suggestion: PrReviewSuggestion) => void\n\nexport type ReviewSuggestionRevisionState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"ready\"; readonly page: ReviewSuggestionRevisionPage }\n | { readonly _tag: \"dismissing\"; readonly page: ReviewSuggestionRevisionPage }\n | {\n readonly _tag: \"saving\"\n readonly draft: PrReviewSuggestionEdit\n readonly page: ReviewSuggestionRevisionPage\n }\n | {\n readonly _tag: \"conflict\"\n readonly draft: PrReviewSuggestionEdit\n readonly page: ReviewSuggestionRevisionPage\n }\n | {\n readonly _tag: \"failed\"\n readonly draft: PrReviewSuggestionEdit | null\n readonly page: ReviewSuggestionRevisionPage | null\n }\n\nexport const browserReviewSuggestionRevisionTransport: ReviewSuggestionRevisionTransport = {\n dismiss: (scope, request, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.dismissReviewSuggestion({\n params: {\n entityId: scope.entityId,\n jobId: scope.jobId,\n suggestionId: scope.suggestionId\n },\n payload: request\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n edit: (scope, request, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.editReviewSuggestion({\n params: {\n entityId: scope.entityId,\n jobId: scope.jobId,\n suggestionId: scope.suggestionId\n },\n payload: request\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n load: (scope, before, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.reviewSuggestionRevisions({\n params: {\n entityId: scope.entityId,\n jobId: scope.jobId,\n suggestionId: scope.suggestionId\n },\n query: {\n ...(!(before === null) && { before }),\n limit: REVISION_PAGE_SIZE\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst sameScope = (\n left: ReviewSuggestionRevisionScope,\n right: ReviewSuggestionRevisionScope\n): boolean =>\n left.entityId === right.entityId &&\n left.jobId === right.jobId &&\n left.sessionKey === right.sessionKey &&\n left.suggestionId === right.suggestionId\n\nconst mergePages = (\n retained: ReviewSuggestionRevisionPage,\n earlier: ReviewSuggestionRevisionPage\n): ReviewSuggestionRevisionPage => {\n const current = earlier.current.sequence > retained.current.sequence\n ? earlier.current\n : retained.current\n const revisions = new Map(\n [\n retained.current,\n earlier.current,\n ...retained.revisions,\n ...earlier.revisions\n ]\n .filter(({ revisionId }) => revisionId !== current.revisionId)\n .map((revision) => [revision.revisionId, revision])\n )\n return {\n current,\n revisions: [...revisions.values()].sort(\n (left, right) => right.sequence - left.sequence\n ),\n hasMore: earlier.hasMore,\n nextBeforeSequence: earlier.nextBeforeSequence\n }\n}\n\nconst pageWithAcceptedRevision = (\n retained: ReviewSuggestionRevisionPage,\n accepted: ReviewSuggestionRevisionPage[\"current\"]\n): ReviewSuggestionRevisionPage => ({\n current: accepted,\n revisions: [retained.current, ...retained.revisions]\n .filter(({ revisionId }) => revisionId !== accepted.revisionId)\n .sort((left, right) => right.sequence - left.sequence),\n hasMore: retained.hasMore,\n nextBeforeSequence: retained.nextBeforeSequence\n})\n\ntype SaveOutcome =\n | { readonly _tag: \"accepted-refresh-failed\"; readonly page: ReviewSuggestionRevisionPage }\n | { readonly _tag: \"conflict\"; readonly page: ReviewSuggestionRevisionPage }\n | { readonly _tag: \"refreshed\"; readonly page: ReviewSuggestionRevisionPage }\n\nconst saveOutcome = (\n _tag: SaveOutcome[\"_tag\"],\n page: ReviewSuggestionRevisionPage\n): SaveOutcome => ({ _tag, page })\n\nconst conflictFailure = Predicate.isTagged(\"ConflictApiError\")\nconst ignoreAcceptedRevision = (_suggestion: PrReviewSuggestion): void => undefined\n\n/** Scope-safe browser controller for one stable suggestion's immutable revisions. */\nexport const useReviewSuggestionRevisions = (\n scope: ReviewSuggestionRevisionScope | null,\n transport: ReviewSuggestionRevisionTransport = browserReviewSuggestionRevisionTransport,\n onAccepted: ReviewSuggestionRevisionAccepted = ignoreAcceptedRevision\n): {\n readonly dismiss: (reason: PrReviewDismissalReasonType) => void\n readonly loadEarlier: () => void\n readonly loadingEarlier: boolean\n readonly resolveConflict: () => void\n readonly retry: () => void\n readonly save: (draft: PrReviewSuggestionEdit) => void\n readonly state: ReviewSuggestionRevisionState\n} => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [loadingEarlier, setLoadingEarlier] = useState(false)\n const [state, setState] = useState<ReviewSuggestionRevisionState>({ _tag: \"idle\" })\n const activeAbort = useRef<AbortController | null>(null)\n const loadingEarlierRef = useRef(false)\n const latestScope = useRef(scope)\n const latestOnAccepted = useRef(onAccepted)\n latestScope.current = scope\n latestOnAccepted.current = onAccepted\n\n useEffect(() => {\n activeAbort.current?.abort()\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n if (scope === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const current = scope\n const abort = new AbortController()\n activeAbort.current = abort\n setState({ _tag: \"loading\" })\n transport.load(current, null, abort.signal).then(\n (page) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"ready\", page })\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"failed\", draft: null, page: null })\n }\n )\n return () => abort.abort()\n }, [requestRevision, scope, transport])\n\n const save = useCallback((draft: PrReviewSuggestionEdit): void => {\n if (scope === null || state._tag === \"conflict\") return\n const retained = state._tag === \"ready\"\n ? state.page\n : state._tag === \"failed\"\n ? state.page\n : null\n if (retained === null) return\n const current = scope\n activeAbort.current?.abort()\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n const abort = new AbortController()\n activeAbort.current = abort\n setState({ _tag: \"saving\", draft, page: retained })\n transport.edit(current, {\n expectedRevisionId: retained.current.revisionId,\n expectedSequence: retained.current.sequence,\n edit: draft\n }, abort.signal).then(\n (accepted) => {\n const acceptedPage = pageWithAcceptedRevision(retained, accepted)\n return transport.load(current, null, abort.signal).then(\n (page) => saveOutcome(\"refreshed\", page),\n () => saveOutcome(\"accepted-refresh-failed\", acceptedPage)\n )\n },\n <UnparsedInput>(failure: UnparsedInput) => {\n if (!conflictFailure(failure)) throw failure\n return transport.load(current, null, abort.signal).then((page) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return saveOutcome(\"conflict\", page)\n setState({ _tag: \"conflict\", draft, page })\n return saveOutcome(\"conflict\", page)\n })\n }\n ).then(\n (outcome) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState((latest) =>\n latest._tag === \"conflict\"\n ? latest\n : outcome._tag === \"accepted-refresh-failed\"\n ? { _tag: \"failed\", draft: null, page: outcome.page }\n : { _tag: \"ready\", page: outcome.page }\n )\n if (outcome._tag !== \"conflict\") latestOnAccepted.current(outcome.page.current.suggestion)\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"failed\", draft, page: retained })\n }\n )\n }, [scope, state, transport])\n\n const dismiss = useCallback((reason: PrReviewDismissalReasonType): void => {\n if (scope === null || state._tag !== \"ready\" || transport.dismiss === undefined) return\n const current = scope\n const retained = state.page\n activeAbort.current?.abort()\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n const abort = new AbortController()\n activeAbort.current = abort\n setState({ _tag: \"dismissing\", page: retained })\n transport.dismiss(current, {\n expectedRevisionId: retained.current.revisionId,\n expectedSequence: retained.current.sequence,\n reason\n }, abort.signal).then(\n (accepted) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({\n _tag: \"ready\",\n page: pageWithAcceptedRevision(retained, accepted)\n })\n latestOnAccepted.current(accepted.suggestion)\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n setState({ _tag: \"failed\", draft: null, page: retained })\n }\n )\n }, [scope, state, transport])\n\n const loadEarlier = useCallback((): void => {\n if (\n scope === null ||\n (state._tag !== \"ready\" && state._tag !== \"conflict\") ||\n loadingEarlierRef.current ||\n !state.page.hasMore ||\n state.page.nextBeforeSequence === null\n ) return\n const current = scope\n const retained = state.page\n activeAbort.current?.abort()\n const abort = new AbortController()\n activeAbort.current = abort\n loadingEarlierRef.current = true\n setLoadingEarlier(true)\n transport.load(\n current,\n retained.nextBeforeSequence,\n abort.signal\n ).then(\n (page) => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n if (activeAbort.current !== abort) return\n setState((latest) =>\n latest._tag === \"ready\" || latest._tag === \"conflict\"\n ? { ...latest, page: mergePages(latest.page, page) }\n : latest\n )\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n },\n () => {\n if (\n abort.signal.aborted ||\n latestScope.current === null ||\n !sameScope(latestScope.current, current)\n ) return\n if (activeAbort.current !== abort) return\n setState((latest) =>\n latest._tag === \"ready\"\n ? { _tag: \"failed\", draft: null, page: latest.page }\n : latest\n )\n loadingEarlierRef.current = false\n setLoadingEarlier(false)\n }\n )\n }, [scope, state, transport])\n\n return useMemo(() => ({\n dismiss,\n loadEarlier,\n loadingEarlier,\n resolveConflict: () =>\n setState((latest) =>\n latest._tag === \"conflict\"\n ? { _tag: \"ready\", page: latest.page }\n : latest\n ),\n retry: () => {\n if (state._tag === \"conflict\") return\n if (\n state._tag === \"failed\" &&\n state.draft !== null &&\n state.page !== null\n ) {\n save(state.draft)\n return\n }\n setRequestRevision((revision) => revision + 1)\n },\n save,\n state\n }), [dismiss, loadEarlier, loadingEarlier, save, state])\n}\n","import { Button, Dialog, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useMemo, useState } from \"react\"\n\nimport type { EntityId, JobId } from \"../../domain/identifiers.js\"\nimport { PrReviewDismissalReason, type PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport type { PrReviewSuggestionRevisionAuthor } from \"../../domain/prReviewRevision.js\"\nimport { ReviewSuggestionCard } from \"./ReviewSuggestionPresentation.js\"\nimport { ReviewSuggestionRevisionDialog } from \"./ReviewSuggestionRevisionDialog.js\"\nimport {\n browserReviewSuggestionRevisionTransport,\n useReviewSuggestionRevisions,\n type ReviewSuggestionRevisionScope,\n type ReviewSuggestionRevisionTransport\n} from \"./useReviewSuggestionRevisions.js\"\nimport type { ReviewSuggestionPublicationTarget, ReviewSuggestionTarget } from \"./usePullRequestReview.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst authorLabel = (author: PrReviewSuggestionRevisionAuthor): string =>\n author._tag === \"operator\" ? \"Operator\" : author.providerId\n\n/** Enrich one immediate review-report card with its durable current revision. */\nexport const VersionedReviewSuggestionCard = ({\n canEdit,\n entityId,\n isPreviewing,\n jobId,\n onPreviewPublication,\n onSuggestionRevisionAccepted,\n onTargetSuggestion,\n revisionTransport = browserReviewSuggestionRevisionTransport,\n sessionKey,\n suggestion\n}: {\n readonly canEdit: boolean\n readonly entityId: EntityId\n readonly isPreviewing: boolean\n readonly jobId: JobId\n readonly onPreviewPublication: (selection: ReviewSuggestionPublicationTarget) => void\n readonly onTargetSuggestion: (target: ReviewSuggestionTarget) => void\n readonly onSuggestionRevisionAccepted?: (suggestion: PrReviewSuggestion) => void\n readonly revisionTransport?: ReviewSuggestionRevisionTransport\n readonly sessionKey: string\n readonly suggestion: PrReviewSuggestion\n}): ReactElement => {\n const scope: ReviewSuggestionRevisionScope = useMemo(\n () => ({\n entityId,\n jobId,\n sessionKey,\n suggestionId: suggestion.suggestionId\n }),\n [entityId, jobId, sessionKey, suggestion.suggestionId]\n )\n const controller = useReviewSuggestionRevisions(scope, revisionTransport, onSuggestionRevisionAccepted)\n const [dialogMode, setDialogMode] = useState<\"edit\" | \"history\">(\"history\")\n const [dialogOpen, setDialogOpen] = useState(false)\n const [dismissOpen, setDismissOpen] = useState(false)\n const [dismissalReason, setDismissalReason] = useState<typeof PrReviewDismissalReason.Type>(\"false-positive\")\n const page =\n controller.state._tag === \"ready\" ||\n controller.state._tag === \"dismissing\" ||\n controller.state._tag === \"saving\" ||\n controller.state._tag === \"conflict\"\n ? controller.state.page\n : controller.state._tag === \"failed\"\n ? controller.state.page\n : null\n const preservedDraft =\n controller.state._tag === \"saving\" || controller.state._tag === \"conflict\" || controller.state._tag === \"failed\"\n ? controller.state.draft\n : null\n const current = page?.current\n const presentedSuggestion: PrReviewSuggestion =\n current === undefined\n ? suggestion\n : {\n ...current.suggestion,\n state: suggestion.state === \"published\" ? \"published\" : current.suggestion.state\n }\n const suggestionCanMutate = canEdit && presentedSuggestion.state === \"draft\" && controller.state._tag !== \"dismissing\"\n const validationBlocked = current?.validation._tag === \"requires-revalidation\"\n const publicationBlockedReason =\n controller.state._tag === \"loading\"\n ? \"Loading the exact revision before publication.\"\n : controller.state._tag === \"failed\"\n ? \"Revision history is unavailable. Retry before publishing.\"\n : validationBlocked\n ? \"This technical edit needs agent revalidation before it can be posted.\"\n : undefined\n const openDialog = (mode: \"edit\" | \"history\"): void => {\n setDialogMode(mode)\n setDialogOpen(true)\n }\n\n return (\n <>\n <ReviewSuggestionCard\n canPublish={suggestionCanMutate}\n extraActions={\n <>\n <Button disabled={page === null} onClick={() => openDialog(\"history\")} variant=\"quiet\">\n History\n </Button>\n {suggestionCanMutate ? (\n <Button disabled={page === null} onClick={() => openDialog(\"edit\")} variant=\"quiet\">\n Edit\n </Button>\n ) : null}\n {suggestionCanMutate ? (\n <Button disabled={page === null} onClick={() => setDismissOpen(true)} variant=\"quiet\">\n Dismiss\n </Button>\n ) : null}\n {suggestionCanMutate && current !== undefined && current.validation._tag !== \"requires-revalidation\" ? (\n <Button\n disabled={controller.state._tag === \"loading\"}\n onClick={() =>\n onTargetSuggestion({\n expectedRevisionId: current.revisionId,\n expectedSequence: current.sequence,\n intent: \"suggestion-edit\",\n jobId,\n suggestionId: presentedSuggestion.suggestionId\n })\n }\n variant=\"quiet\"\n >\n Ask agent to edit\n </Button>\n ) : null}\n {canEdit && current?.validation._tag === \"requires-revalidation\" ? (\n <Button\n disabled={controller.state._tag === \"loading\"}\n onClick={() =>\n onTargetSuggestion({\n expectedRevisionId: current.revisionId,\n expectedSequence: current.sequence,\n intent: \"suggestion-revalidation\",\n jobId,\n suggestionId: presentedSuggestion.suggestionId\n })\n }\n variant=\"quiet\"\n >\n Revalidate\n </Button>\n ) : null}\n {controller.state._tag === \"dismissing\" ? (\n <Button disabled variant=\"quiet\">\n Dismissing…\n </Button>\n ) : null}\n {controller.state._tag === \"failed\" ? (\n <Button onClick={controller.retry} variant=\"quiet\">\n Retry revision\n </Button>\n ) : null}\n </>\n }\n isPreviewing={isPreviewing}\n jobId={jobId}\n metadata={\n current === undefined ? null : (\n <div className={styles.suggestionRevisionMeta} data-validation={current.validation._tag}>\n <strong>Revision {String(current.sequence)}</strong>\n <span>{current.validation._tag === \"validated\" ? \"Validated\" : \"Needs revalidation\"}</span>\n <span>{authorLabel(current.author)}</span>\n <time dateTime={DateTime.formatIso(current.createdAt)}>\n {DateTime.formatLocal(current.createdAt, {\n dateStyle: \"medium\",\n timeStyle: \"short\"\n })}\n </time>\n </div>\n )\n }\n onPreviewPublication={(selection) => {\n if (current === undefined) return\n onPreviewPublication({\n ...selection,\n revisionId: current.revisionId\n })\n }}\n {...(publicationBlockedReason === undefined ? {} : { publicationBlockedReason })}\n suggestion={presentedSuggestion}\n />\n {page === null ? null : (\n <ReviewSuggestionRevisionDialog\n canEdit={suggestionCanMutate}\n conflict={controller.state._tag === \"conflict\"}\n loadEarlier={controller.loadEarlier}\n loadingEarlier={controller.loadingEarlier}\n mode={dialogMode}\n onOpenChange={setDialogOpen}\n onResolveConflict={controller.resolveConflict}\n onSave={controller.save}\n open={dialogOpen}\n page={page}\n preservedDraft={preservedDraft}\n saving={controller.state._tag === \"saving\"}\n />\n )}\n <Dialog.Root onOpenChange={setDismissOpen} open={dismissOpen}>\n <Dialog.Content\n description=\"Dismiss this finding for the reviewed head. It will remain in revision history and will not be posted to CodeCommit.\"\n size=\"default\"\n title=\"Dismiss finding?\"\n >\n <Text>This records your decision without changing the pull request or publishing a comment.</Text>\n <label>\n Reason\n <select\n aria-label=\"Dismissal reason\"\n onChange={(event) => {\n const reason = Schema.decodeUnknownResult(PrReviewDismissalReason)(event.currentTarget.value)\n if (Result.isFailure(reason)) return\n setDismissalReason(reason.success)\n }}\n value={dismissalReason}\n >\n <option value=\"false-positive\">False positive</option>\n <option value=\"not-applicable\">Not applicable</option>\n <option value=\"accepted-risk\">Accepted risk</option>\n <option value=\"duplicate\">Duplicate</option>\n <option value=\"other\">Other</option>\n </select>\n </label>\n <div className={styles.publicationActions}>\n <Dialog.Close>Keep finding</Dialog.Close>\n <Button\n onClick={() => {\n setDismissOpen(false)\n controller.dismiss(dismissalReason)\n }}\n >\n Dismiss finding\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Root>\n </>\n )\n}\n","import { Button, Dialog, Text } from \"@knpkv/rly/primitives\"\nimport { ReviewProfileControl } from \"@knpkv/review/react\"\nimport * as DateTime from \"effect/DateTime\"\nimport {\n type KeyboardEvent,\n type ReactElement,\n type UIEvent,\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport {\n MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH,\n type DurableAgentProviderId,\n type DurableAgentPrompt,\n type PullRequestReviewFailure,\n type PullRequestReviewThreadEvent\n} from \"../../api/agent.js\"\nimport type { PrReviewOrientation, PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport { ReviewNotes, ReviewSuggestionCard } from \"./ReviewSuggestionPresentation.js\"\nimport { controlCenterReviewProfile } from \"./reviewPlatformAdapter.js\"\nimport { VersionedReviewSuggestionCard } from \"./VersionedReviewSuggestionCard.js\"\nimport type { ReviewSuggestionRevisionTransport } from \"./useReviewSuggestionRevisions.js\"\nimport type {\n PullRequestReviewControllerState,\n PullRequestReviewPublicationState,\n ReviewSuggestionPublicationTarget,\n ReviewSuggestionTarget\n} from \"./usePullRequestReview.js\"\nimport styles from \"./WorkspacePullRequestDetails.module.css\"\n\nconst unavailableMessage = (\n reason: Extract<PullRequestReviewControllerState, { readonly _tag: \"ready\" }>[\"review\"] extends infer Review\n ? Review extends { readonly _tag: \"unavailable\"; readonly reason: infer Reason }\n ? Reason\n : never\n : never\n): string => {\n switch (reason) {\n case \"not-codecommit\":\n case \"not-pull-request\":\n return \"Agent review is available only for synchronized CodeCommit pull requests.\"\n case \"source-stale\":\n return \"Synchronize this pull request before reviewing its immutable head.\"\n case \"base-revision-unavailable\":\n return \"The base revision has not been synchronized, so an exact review cannot start.\"\n }\n}\n\nconst outcomeLabel = (\n outcome: \"changes-required\" | \"non-blocking-suggestions\" | \"no-issues-found\" | \"unable-to-conclude\"\n) => {\n switch (outcome) {\n case \"changes-required\":\n return \"Changes Required\"\n case \"non-blocking-suggestions\":\n return \"Non-blocking Suggestions\"\n case \"no-issues-found\":\n return \"No Issues Found\"\n case \"unable-to-conclude\":\n return \"Unable to Conclude\"\n }\n}\n\nconst formatBudget = (budgetMillis: number): string => {\n const minutes = Math.round(budgetMillis / 60_000)\n return `${String(minutes)} minute${minutes === 1 ? \"\" : \"s\"}`\n}\n\nconst providerIdName = (providerId: DurableAgentProviderId): string => {\n switch (providerId) {\n case \"codex\":\n return \"Codex\"\n case \"claude\":\n return \"Claude\"\n case \"relay-gateway\":\n return \"Relay Gateway\"\n default:\n return providerId\n }\n}\n\nconst providerName = (\n provider: NonNullable<Extract<PullRequestReviewControllerState, { readonly _tag: \"ready\" }>[\"provider\"]>\n): string => provider.displayName ?? providerIdName(provider.providerId)\n\nconst providerReviewLabel = (provider: Parameters<typeof providerName>[0]): string => `${providerName(provider)} review`\n\nconst modelName = (providerId: DurableAgentProviderId, model: string): string =>\n model === \"configured-default\" || (providerId === \"claude\" && model === \"default\") ? \"CLI default\" : model\n\nconst networkAccessLabel = (networkAccess: \"blocked\" | \"provider-enabled\", provider: string): string =>\n networkAccess === \"blocked\" ? \"Network blocked\" : `${provider} access enabled`\n\nconst failureHeading = (stage: PullRequestReviewFailure[\"stage\"]): string => {\n switch (stage) {\n case \"source-checkout\":\n return \"Source checkout failed\"\n case \"review-setup\":\n return \"Review setup is incomplete\"\n case \"sandbox-start\":\n return \"Review sandbox failed to start\"\n case \"agent-run\":\n return \"Agent review failed\"\n case \"cleanup\":\n return \"Review cleanup did not finish\"\n case \"result-validation\":\n return \"Review result was invalid\"\n case \"control-center\":\n return \"Control Center could not save the review\"\n }\n}\n\nconst failureCause = (cause: PullRequestReviewFailure[\"cause\"]): string | null => {\n switch (cause) {\n case undefined:\n return null\n case \"invalid-configuration\":\n return \"The Review Sandbox configuration is invalid.\"\n case \"invalid-request\":\n return \"Control Center rejected the generated review command.\"\n case \"source-rejected\":\n return \"The source exceeded review safety limits or failed validation.\"\n case \"source-unavailable\":\n return \"CodeCommit source could not be materialized.\"\n case \"sandbox-unavailable\":\n return \"sbx could not create or reach the review sandbox.\"\n case \"sandbox-timeout\":\n return \"The review sandbox did not become ready in time.\"\n case \"command-timeout\":\n return \"The review command exceeded its time budget.\"\n case \"provider-authentication\":\n return \"The agent provider rejected its credentials or required API access is missing.\"\n case \"provider-rate-limited\":\n return \"The agent provider rate-limited this review.\"\n case \"provider-unavailable\":\n return \"The agent provider could not be reached.\"\n case \"agent-command-failed\":\n return \"The agent command exited before producing a review.\"\n case \"output-rejected\":\n return \"The review command returned output outside the safe limits.\"\n case \"artifact-unavailable\":\n return \"The retained review output could not be read.\"\n case \"session-closed\":\n return \"The review sandbox closed before the command finished.\"\n case \"cleanup-failed\":\n return \"The run ended, but sbx cleanup did not complete.\"\n }\n}\n\nconst failureGuidance = ({ retryable, stage }: PullRequestReviewFailure): string => {\n if (retryable && stage !== \"cleanup\") return \"The failure may be temporary. Retry this exact-head review.\"\n switch (stage) {\n case \"source-checkout\":\n return \"Check the CodeCommit connection, AWS credentials, region, and repository access.\"\n case \"review-setup\":\n return \"Check the workspace review policy and selected runner.\"\n case \"sandbox-start\":\n return \"Check the sbx installation and Review sandbox configuration.\"\n case \"agent-run\":\n return \"Check the selected review runner and its authentication.\"\n case \"cleanup\":\n return \"Check sbx status and reconcile the orphaned review sandbox before retrying.\"\n case \"result-validation\":\n return \"The runner returned a result Control Center could not safely accept. Check its version and configuration.\"\n case \"control-center\":\n return \"Check Control Center storage and worker health before starting a new review.\"\n }\n}\n\nconst REVIEW_PROMPT_TEMPLATES: ReadonlyArray<{\n readonly label: string\n readonly prompt: string\n}> = [\n {\n label: \"Correctness\",\n prompt: \"Review correctness, regressions, error handling, and boundary conditions.\"\n },\n {\n label: \"Security\",\n prompt: \"Review authorization, credential handling, unsafe input, and privilege boundaries.\"\n },\n {\n label: \"Tests\",\n prompt: \"Review test coverage, failure paths, race conditions, and missing regression guardrails.\"\n }\n]\n\nconst ReviewPresetChoices = ({\n accessibleName,\n groupName,\n onSelect,\n presets,\n selectedProviderId\n}: {\n readonly accessibleName: string\n readonly groupName: string\n readonly onSelect: (providerId: DurableAgentProviderId) => void\n readonly presets: ReadonlyArray<Parameters<typeof providerName>[0]>\n readonly selectedProviderId: DurableAgentProviderId\n}): ReactElement => {\n const profiles = presets.map((preset) => ({\n ...controlCenterReviewProfile(preset),\n name: providerReviewLabel(preset)\n }))\n return (\n <ReviewProfileControl\n accessibleName={accessibleName}\n {...(styles.reviewPresetList === undefined ? {} : { className: styles.reviewPresetList })}\n describeProfile={(profile) => {\n const preset = presets.find(({ providerId }) => String(providerId) === profile.provider)\n return preset === undefined ? profile.model : modelName(preset.providerId, preset.model)\n }}\n groupName={groupName}\n onProfileChange={(profile) => {\n const preset = presets.find(({ providerId }) => String(providerId) === profile.provider)\n if (preset !== undefined) onSelect(preset.providerId)\n }}\n presentation=\"radios\"\n profiles={profiles}\n selectedProfileId={String(selectedProviderId)}\n />\n )\n}\n\ntype PresentedThreadEvent = {\n readonly event: PullRequestReviewThreadEvent\n readonly summary: string\n}\n\nconst THREAD_END_THRESHOLD = 24\n\nconst ReviewThreadTranscript = ({\n events,\n hasEarlier,\n historyAction,\n historyLoaded,\n onLoadEarlier\n}: {\n readonly events: ReadonlyArray<PresentedThreadEvent>\n readonly hasEarlier: boolean\n readonly historyAction: \"idle\" | \"loading\" | \"failed\"\n readonly historyLoaded: boolean\n readonly onLoadEarlier: () => void\n}): ReactElement => {\n const scrollerRef = useRef<HTMLDivElement>(null)\n const followsLatestRef = useRef(true)\n const previousRef = useRef<{\n readonly first: number | null\n readonly firstOffsetTop: number\n readonly last: number | null\n }>({ first: null, firstOffsetTop: 0, last: null })\n const [hasNewActivity, setHasNewActivity] = useState(false)\n const first = events[0]?.event.eventSequence ?? null\n const last = events.at(-1)?.event.eventSequence ?? null\n\n useLayoutEffect(() => {\n const scroller = scrollerRef.current\n if (scroller === null) return\n const previous = previousRef.current\n const prepended = previous.first !== null && first !== null && first < previous.first\n const appended = previous.last !== null && last !== null && last > previous.last\n const previousFirstElement = [...scroller.querySelectorAll<HTMLElement>(\"[data-review-event-sequence]\")].find(\n (element) => element.dataset.reviewEventSequence === String(previous.first)\n )\n if (prepended && previousFirstElement !== undefined) {\n scroller.scrollTop += previousFirstElement.offsetTop - previous.firstOffsetTop\n const followsLatest = scroller.scrollHeight - scroller.clientHeight - scroller.scrollTop <= THREAD_END_THRESHOLD\n followsLatestRef.current = followsLatest\n setHasNewActivity(appended && !followsLatest)\n } else if (followsLatestRef.current) {\n scroller.scrollTop = scroller.scrollHeight\n setHasNewActivity(false)\n } else if (appended) {\n setHasNewActivity(true)\n }\n const firstElement = scroller.querySelector<HTMLElement>(\"[data-review-event-sequence]\")\n previousRef.current = { first, firstOffsetTop: firstElement?.offsetTop ?? 0, last }\n }, [first, last])\n\n const handleScroll = (event: UIEvent<HTMLDivElement>): void => {\n const scroller = event.currentTarget\n const followsLatest = scroller.scrollHeight - scroller.clientHeight - scroller.scrollTop <= THREAD_END_THRESHOLD\n followsLatestRef.current = followsLatest\n if (followsLatest) setHasNewActivity(false)\n }\n const jumpToLatest = (): void => {\n const scroller = scrollerRef.current\n if (scroller === null) return\n followsLatestRef.current = true\n scroller.scrollTop = scroller.scrollHeight\n setHasNewActivity(false)\n scroller.focus({ preventScroll: true })\n }\n\n return (\n <>\n <div\n aria-label=\"Review activity\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n className={styles.reviewThreadTranscript}\n onScroll={handleScroll}\n ref={scrollerRef}\n role=\"log\"\n tabIndex={0}\n >\n {hasEarlier ? (\n <Button loading={historyAction === \"loading\"} onClick={onLoadEarlier}>\n {historyAction === \"loading\"\n ? \"Loading earlier activity…\"\n : historyAction === \"failed\"\n ? \"Retry earlier activity\"\n : \"Load earlier activity\"}\n </Button>\n ) : historyLoaded ? (\n <Text tone=\"secondary\" variant=\"meta\">\n Beginning of review thread\n </Text>\n ) : null}\n {events.length === 0 ? null : (\n <ol className={styles.reviewThreadEvents}>\n {events.map(({ event, summary }) => (\n <li data-review-event-sequence={event.eventSequence} key={event.eventSequence}>\n <span>{summary}</span>\n </li>\n ))}\n </ol>\n )}\n </div>\n {hasNewActivity ? <Button onClick={jumpToLatest}>New activity · Jump to latest</Button> : null}\n </>\n )\n}\n\nconst ReviewSuggestionPublicationSurface = lazy(() => import(\"./ReviewSuggestionPublicationSurface.js\"))\n\nconst ReviewOrientationSurface = ({\n orientation\n}: {\n readonly orientation: PrReviewOrientation | undefined\n}): ReactElement | null =>\n orientation === undefined ? null : (\n <section aria-label=\"Pull request orientation\" className={styles.reviewOrientation}>\n <header>\n <strong>What this PR changes</strong>\n <Text tone=\"secondary\" variant=\"body\">\n {orientation.summary}\n </Text>\n </header>\n {orientation.cohorts.map((cohort, cohortIndex) => (\n <article key={`${String(cohortIndex)}:${cohort.title}`}>\n <h3>{cohort.title}</h3>\n <p>{cohort.summary}</p>\n <ol>\n {cohort.layers.map((layer, layerIndex) => (\n <li key={`${String(layerIndex)}:${layer.title}`}>\n <strong>{`${layer.kind} · ${layer.title}`}</strong>\n <span>{layer.summary}</span>\n <small>\n {layer.ranges\n .map(\n ({ endLine, label, path, startLine }) =>\n `${label} · ${path}:${String(startLine)}${endLine === startLine ? \"\" : `–${String(endLine)}`}`\n )\n .join(\" · \")}\n </small>\n </li>\n ))}\n </ol>\n </article>\n ))}\n </section>\n )\n\nconst threadEventSummary = (event: PullRequestReviewThreadEvent): string | null => {\n switch (event._tag) {\n case \"operator-message\":\n return `Local Operator · ${event.prompt}`\n case \"run-queued\":\n return `${event.reviewProfile.label} · head ${event.subject.headRevision.slice(0, 12)}`\n case \"run-started\":\n return event.runtimeMetadata === undefined\n ? \"Review sandbox started\"\n : `Review sandbox started · ${event.runtimeMetadata.implementation} ${event.runtimeMetadata.version ?? \"\"}`.trim()\n case \"progress\":\n return event.text\n case \"review-report\":\n return `${String(event.report.suggestions.length)} suggestions · ${String(event.report.notes.length)} notes`\n case \"suggestion-revised\":\n return event.suggestionState === \"dismissed\"\n ? `Suggestion revision ${String(event.sequence)} · dismissed by operator`\n : `Suggestion revision ${String(event.sequence)} · ${event.validationState === \"validated\" ? \"validated\" : \"needs revalidation\"}`\n case \"suggestion-published\":\n return \"Suggestion published to CodeCommit\"\n case \"run-completed\":\n return `Run completed · ${event.outcome}`\n case \"run-failed\":\n return `${failureHeading(event.stage)}${event.cause === undefined ? \"\" : ` · ${failureCause(event.cause)}`}${\n event.retryable ? \" · retryable\" : \"\"\n }`\n case \"run-interrupted\":\n return \"Run interrupted · Control Center restarted\"\n case \"cancellation-requested\":\n return \"Cancellation requested\"\n case \"usage\":\n return null\n }\n}\n\n/** Render durable agent advice without conflating it with human disposition. */\nexport const PullRequestReviewPanel = ({\n canEnqueue,\n onCancelPublication,\n onCancelReview = () => undefined,\n onExtendReviewBudget = () => undefined,\n onLoadEarlier = () => undefined,\n onPreviewPublication,\n onPublishSuggestion,\n onRetry,\n onStart,\n onSuggestionRevisionAccepted,\n onTargetSuggestion = () => undefined,\n publication,\n revisionTransport,\n state,\n suggestions\n}: {\n readonly canEnqueue: boolean\n readonly onCancelReview?: () => void\n readonly onCancelPublication: () => void\n readonly onExtendReviewBudget?: () => void\n readonly onLoadEarlier?: () => void\n readonly onPreviewPublication: (selection: ReviewSuggestionPublicationTarget) => void\n readonly onPublishSuggestion: (finalContent: string) => void\n readonly onTargetSuggestion?: (target: ReviewSuggestionTarget) => void\n readonly onRetry: () => void\n readonly onStart: (prompt?: DurableAgentPrompt, providerId?: DurableAgentProviderId) => void\n readonly onSuggestionRevisionAccepted?: (suggestion: PrReviewSuggestion) => void\n readonly publication: PullRequestReviewPublicationState\n readonly revisionTransport?: ReviewSuggestionRevisionTransport\n readonly state: PullRequestReviewControllerState\n readonly suggestions?: ReadonlyArray<PrReviewSuggestion>\n}): ReactElement => {\n const [launchOpen, setLaunchOpen] = useState(false)\n const [request, setRequest] = useState(\"\")\n const [requestedSelection, setRequestedSelection] = useState<number | null>(null)\n const [submittedRequest, setSubmittedRequest] = useState<string | null>(null)\n const [selectedProviderId, setSelectedProviderId] = useState<DurableAgentProviderId | null>(null)\n const requestRef = useRef<HTMLTextAreaElement>(null)\n const targetedSubmissionInFlightRef = useRef(false)\n const providerPresets = useMemo(\n () => (state._tag === \"ready\" ? (state.providerPresets ?? (state.provider === null ? [] : [state.provider])) : []),\n [state]\n )\n const selectedProvider =\n providerPresets.find(({ providerId }) => providerId === selectedProviderId) ?? providerPresets[0] ?? null\n const durableProviderName = (providerId: DurableAgentProviderId): string => {\n const preset = providerPresets.find((candidate) => candidate.providerId === providerId)\n return preset === undefined ? providerIdName(providerId) : providerName(preset)\n }\n const requestScope =\n state._tag === \"idle\"\n ? null\n : `${state.entityId}:${state.baseRevision ?? \"\"}:${state.headRevision}:${state.sessionKey}`\n useEffect(() => {\n setLaunchOpen(false)\n setRequest(\"\")\n setRequestedSelection(null)\n setSubmittedRequest(null)\n setSelectedProviderId(null)\n targetedSubmissionInFlightRef.current = false\n }, [requestScope])\n useEffect(() => {\n if (providerPresets.length === 0) {\n setSelectedProviderId(null)\n return\n }\n if (!providerPresets.some(({ providerId }) => providerId === selectedProviderId)) {\n setSelectedProviderId(providerPresets[0]?.providerId ?? null)\n }\n }, [providerPresets, selectedProviderId])\n useLayoutEffect(() => {\n if (requestedSelection === null) return\n const textarea = requestRef.current\n if (textarea === null) return\n textarea.focus({ preventScroll: true })\n textarea.setSelectionRange(requestedSelection, requestedSelection)\n setRequestedSelection(null)\n }, [request, requestedSelection])\n useEffect(() => {\n if (submittedRequest === null || state._tag !== \"ready\") return\n if (state.action === \"failed\") {\n targetedSubmissionInFlightRef.current = false\n return\n }\n if (state.action === \"idle\" && state.review._tag === \"pending\") {\n targetedSubmissionInFlightRef.current = false\n setRequest((current) => (current.trim() === submittedRequest ? \"\" : current))\n setSubmittedRequest(null)\n }\n }, [state, submittedRequest])\n const changeLaunchOpen = useCallback((open: boolean): void => {\n setLaunchOpen(open)\n }, [])\n const submitFullReview = useCallback((): void => {\n if (selectedProvider === null) return\n setSubmittedRequest(null)\n onStart(undefined, selectedProvider.providerId)\n }, [onStart, selectedProvider])\n const submitTargetedReview = useCallback((): void => {\n const prompt = request.trim()\n if (\n prompt.length === 0 ||\n selectedProvider === null ||\n targetedSubmissionInFlightRef.current ||\n state._tag !== \"ready\" ||\n state.action === \"starting\" ||\n state.review._tag === \"pending\"\n )\n return\n targetedSubmissionInFlightRef.current = true\n setSubmittedRequest(prompt)\n onStart(prompt, selectedProvider.providerId)\n }, [onStart, request, selectedProvider, state])\n const handleComposerKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>): void => {\n if (event.nativeEvent.isComposing) return\n if (event.key !== \"Enter\" || (!event.metaKey && !event.ctrlKey)) return\n event.preventDefault()\n submitTargetedReview()\n }\n const insertPromptTemplate = (prompt: string): void => {\n const textarea = requestRef.current\n const selectionStart = textarea?.selectionStart ?? request.length\n const selectionEnd = textarea?.selectionEnd ?? selectionStart\n const before = request.slice(0, selectionStart)\n const after = request.slice(selectionEnd)\n const leadingBreak = before.length > 0 && !/\\s$/u.test(before) ? \"\\n\" : \"\"\n const trailingBreak = after.length > 0 && !/^\\s/u.test(after) ? \"\\n\" : \"\"\n const availableInsertionLength = Math.max(0, MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH - before.length - after.length)\n const insertion = `${leadingBreak}${prompt}${trailingBreak}`.slice(0, availableInsertionLength)\n const nextRequest = `${before}${insertion}${after}`\n setRequest(nextRequest)\n setRequestedSelection(before.length + insertion.length)\n }\n const publicationSurface =\n publication._tag === \"idle\" || publication._tag === \"previewing\" ? null : (\n <Suspense fallback={<span>Preparing publication surface…</span>}>\n <ReviewSuggestionPublicationSurface\n onCancel={onCancelPublication}\n onPublish={onPublishSuggestion}\n publication={publication}\n />\n </Suspense>\n )\n const withPublication = (content: ReactElement): ReactElement => (\n <>\n {content}\n {publicationSurface}\n </>\n )\n\n if (state._tag === \"idle\" || state._tag === \"loading\") {\n return withPublication(\n <div aria-live=\"polite\" className={styles.reviewStatus} role=\"status\">\n <strong>Loading review state</strong>\n <span>Checking durable review history for this exact head.</span>\n <span aria-hidden=\"true\" className={styles.reviewRunway} />\n </div>\n )\n }\n if (state._tag === \"failed\") {\n return withPublication(\n <div className={styles.reviewStatus}>\n <strong>Review state unavailable</strong>\n <span>The current review could not be loaded. No human decision was changed.</span>\n <Button onClick={onRetry}>Retry</Button>\n </div>\n )\n }\n\n const review = state.review\n const threadEvents = state.thread?.events ?? []\n const usageJobId =\n review._tag === \"stale\"\n ? review.previousJobId\n : review._tag === \"pending\" ||\n review._tag === \"completed\" ||\n review._tag === \"failed\" ||\n review._tag === \"interrupted\"\n ? review.jobId\n : null\n const usageEvents =\n usageJobId === null\n ? []\n : threadEvents.filter(\n (event): event is Extract<PullRequestReviewThreadEvent, { readonly _tag: \"usage\" }> =>\n event._tag === \"usage\" && event.jobId === usageJobId\n )\n const usage = usageEvents.reduce(\n (total, event) => ({\n inputTokens: total.inputTokens + event.inputTokens,\n outputTokens: total.outputTokens + event.outputTokens\n }),\n { inputTokens: 0, outputTokens: 0 }\n )\n const usageRun =\n usageJobId === null\n ? null\n : threadEvents.find(\n (event): event is Extract<PullRequestReviewThreadEvent, { readonly _tag: \"run-queued\" }> =>\n event._tag === \"run-queued\" && event.jobId === usageJobId\n )\n const completeUsageVisible =\n state.thread !== undefined && (!state.thread.hasEarlier || (usageRun !== null && usageRun !== undefined))\n const missingUsageLabel = completeUsageVisible ? \"Not reported\" : \"Load earlier history\"\n const presentedThreadEvents = threadEvents\n .map((event) => ({ event, summary: threadEventSummary(event) }))\n .filter(\n (\n item\n ): item is {\n readonly event: PullRequestReviewThreadEvent\n readonly summary: string\n } => item.summary !== null\n )\n const completeThreadVisible = state.thread !== undefined && (state.thread.historyLoaded || !state.thread.hasEarlier)\n const visibleThreadEvents = completeThreadVisible ? presentedThreadEvents : presentedThreadEvents.slice(-12)\n const reviewRunning = review._tag === \"pending\"\n const composerDisabled = state.action === \"starting\" || reviewRunning\n const threadSurface = (\n <section aria-label=\"Review thread\" className={styles.reviewThread}>\n <header>\n <strong>Review thread</strong>\n <span>{threadEvents.length === 0 ? \"No runs yet\" : \"Durable across pull-request heads\"}</span>\n </header>\n {usageJobId === null ? null : (\n <dl aria-label=\"Review run usage\" className={styles.reviewUsage}>\n <div>\n <dt>Agent</dt>\n <dd>\n {usageRun === null || usageRun === undefined\n ? missingUsageLabel\n : `${durableProviderName(usageRun.providerId)} · ${\n usageRun.model === null ? \"model not reported\" : modelName(usageRun.providerId, usageRun.model)\n }`}\n </dd>\n </div>\n <div>\n <dt>Input tokens</dt>\n <dd>\n {!completeUsageVisible || usageEvents.length === 0\n ? missingUsageLabel\n : usage.inputTokens.toLocaleString(\"en-US\")}\n </dd>\n </div>\n <div>\n <dt>Output tokens</dt>\n <dd>\n {!completeUsageVisible || usageEvents.length === 0\n ? missingUsageLabel\n : usage.outputTokens.toLocaleString(\"en-US\")}\n </dd>\n </div>\n <div>\n <dt>Cost</dt>\n <dd>Not reported</dd>\n </div>\n </dl>\n )}\n <ReviewThreadTranscript\n events={visibleThreadEvents}\n hasEarlier={state.thread?.hasEarlier ?? false}\n historyAction={state.historyAction}\n historyLoaded={state.thread !== undefined}\n key={requestScope}\n onLoadEarlier={onLoadEarlier}\n />\n {canEnqueue && state.provider !== null && review._tag !== \"unavailable\" ? (\n <div className={styles.reviewThreadComposer}>\n <label htmlFor=\"review-thread-request\">\n {reviewRunning ? \"Draft the next review request\" : \"Ask Relay about this pull request\"}\n </label>\n {providerPresets.length > 1 ? (\n selectedProvider === null ? null : (\n <ReviewPresetChoices\n accessibleName=\"Targeted review agent presets\"\n groupName=\"targeted-review-agent\"\n onSelect={setSelectedProviderId}\n presets={providerPresets}\n selectedProviderId={selectedProvider.providerId}\n />\n )\n ) : selectedProvider === null ? null : (\n <span className={styles.reviewSelectedPreset}>\n Review with {providerName(selectedProvider)} ·{\" \"}\n {modelName(selectedProvider.providerId, selectedProvider.model)}\n </span>\n )}\n <div aria-label=\"Review prompt templates\" className={styles.reviewTemplateList}>\n {REVIEW_PROMPT_TEMPLATES.map((template) => (\n <Button key={template.label} onClick={() => insertPromptTemplate(template.prompt)}>\n {template.label}\n </Button>\n ))}\n </div>\n <textarea\n aria-describedby=\"review-thread-request-help review-thread-request-count\"\n id=\"review-thread-request\"\n maxLength={MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH}\n onChange={(event) => setRequest(event.currentTarget.value)}\n onKeyDown={handleComposerKeyDown}\n placeholder=\"Re-check the error handling in the connection flow…\"\n ref={requestRef}\n rows={3}\n value={request}\n />\n <div className={styles.reviewThreadComposerFooter}>\n <span id=\"review-thread-request-help\">Ctrl/⌘ + Enter to run</span>\n <span id=\"review-thread-request-count\">\n {String(request.length)} / {String(MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH)}\n </span>\n </div>\n {state.action === \"failed\" && submittedRequest !== null ? (\n <span role=\"alert\">\n Targeted review did not start. Your request is still here—check the provider and worker, then try again.\n </span>\n ) : null}\n <Button disabled={composerDisabled || request.trim().length === 0} onClick={submitTargetedReview}>\n {state.action === \"starting\"\n ? \"Starting targeted review…\"\n : reviewRunning\n ? \"Review in progress\"\n : \"Start targeted review\"}\n </Button>\n </div>\n ) : null}\n </section>\n )\n const withThread = (content: ReactElement): ReactElement =>\n withPublication(\n <>\n {content}\n {threadSurface}\n </>\n )\n const reviewLaunch = (headRevision: string, triggerLabel: string, repeat = false): ReactElement | null =>\n selectedProvider === null ? null : (\n <Dialog.Root onOpenChange={changeLaunchOpen} open={launchOpen}>\n <Dialog.Trigger disabled={state.action === \"starting\"}>\n {state.action === \"starting\" ? \"Starting review…\" : triggerLabel}\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.reviewLaunchDialog}\n description={`${providerName(selectedProvider)} can inspect and temporarily edit the disposable checkout. It cannot approve, comment on, or change this CodeCommit pull request.`}\n title={repeat ? \"Review this exact head again\" : \"Review this exact head\"}\n >\n <div className={styles.reviewLaunchBody}>\n <small className={styles.reviewLaunchEyebrow}>No CodeCommit writes</small>\n {providerPresets.length > 1 ? (\n <ReviewPresetChoices\n accessibleName=\"Review agent presets\"\n groupName=\"full-review-agent\"\n onSelect={setSelectedProviderId}\n presets={providerPresets}\n selectedProviderId={selectedProvider.providerId}\n />\n ) : null}\n <dl className={styles.reviewLaunchFacts}>\n <div>\n <dt>Exact head</dt>\n <dd>\n <code>{headRevision}</code>\n </dd>\n </div>\n <div>\n <dt>Agent</dt>\n <dd>{providerName(selectedProvider)}</dd>\n </div>\n <div>\n <dt>Model</dt>\n <dd>{modelName(selectedProvider.providerId, selectedProvider.model)}</dd>\n </div>\n <div>\n <dt>Scope</dt>\n <dd>Full project</dd>\n </div>\n <div>\n <dt>Budget</dt>\n <dd>{formatBudget(selectedProvider.reviewProfile.budgetMillis)}</dd>\n </div>\n <div>\n <dt>Network</dt>\n <dd>\n {networkAccessLabel(selectedProvider.reviewProfile.networkAccess, providerName(selectedProvider))}\n </dd>\n </div>\n <div>\n <dt>Isolation</dt>\n <dd>Disposable sbx sandbox</dd>\n </div>\n </dl>\n <div className={styles.reviewLaunchActions}>\n <Dialog.Close>Cancel</Dialog.Close>\n <Dialog.Close onClick={submitFullReview}>Start full-project review</Dialog.Close>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Root>\n )\n if (review._tag === \"unavailable\") {\n return withThread(\n <>\n <strong>Review unavailable</strong>\n <span>{unavailableMessage(review.reason)}</span>\n </>\n )\n }\n if (review._tag === \"pending\") {\n const startedAt = review.startedAt ?? null\n const budgetMillis = review.budgetMillis ?? review.reviewProfile.budgetMillis\n const label =\n review.state === \"queued\"\n ? \"Review queued\"\n : review.state === \"running\"\n ? \"Reviewing exact head\"\n : \"Cancellation requested\"\n return withThread(\n <div aria-live=\"polite\" className={styles.reviewStatus} role=\"status\">\n <strong>{label}</strong>\n <span>\n {durableProviderName(review.providerId)} · {modelName(review.providerId, review.model)}. This page updates\n automatically.\n </span>\n <span>\n {networkAccessLabel(review.reviewProfile.networkAccess, durableProviderName(review.providerId))} · Disposable\n sbx sandbox\n </span>\n <dl>\n <div>\n <dt>Elapsed</dt>\n <dd>\n {startedAt === null\n ? \"Waiting for worker\"\n : formatBudget(\n Math.max(0, DateTime.toEpochMillis(DateTime.nowUnsafe()) - DateTime.toEpochMillis(startedAt))\n )}\n </dd>\n </div>\n <div>\n <dt>Remaining budget</dt>\n <dd>\n {startedAt === null\n ? formatBudget(budgetMillis)\n : formatBudget(\n Math.max(\n 0,\n budgetMillis - (DateTime.toEpochMillis(DateTime.nowUnsafe()) - DateTime.toEpochMillis(startedAt))\n )\n )}\n </dd>\n </div>\n <div>\n <dt>Current step</dt>\n <dd>{review.activity.events.at(-1) ?? \"Fetching exact source and starting the sandbox…\"}</dd>\n </div>\n </dl>\n {review.activity.events.length === 0 ? null : (\n <ol aria-label=\"Live review activity\">\n {review.activity.events.map((event, index) => (\n <li key={`${String(index)}:${event}`}>{event}</li>\n ))}\n </ol>\n )}\n {review.activity.truncated ? <span>Earlier review activity is not shown.</span> : null}\n {canEnqueue ? (\n <div>\n {review.budgetExtensionCount === 0 ? (\n <Button onClick={onExtendReviewBudget}>{`Add ${formatBudget(review.reviewProfile.budgetMillis)}`}</Button>\n ) : (\n <span>One budget extension used.</span>\n )}\n <Button onClick={onCancelReview}>Cancel review</Button>\n </div>\n ) : null}\n <code className={styles.reviewHead}>{review.subject.headRevision}</code>\n <span aria-hidden=\"true\" className={styles.reviewRunway} />\n </div>\n )\n }\n if (review._tag === \"stale\") {\n const previousReviewCompleted = review.previousState === \"succeeded\"\n return (\n <>\n <div aria-live=\"polite\" className={styles.reviewStatus} role=\"status\">\n <strong>New head available</strong>\n {previousReviewCompleted ? (\n <span>\n The last completed review belongs to an older immutable revision. Its findings cannot be published against\n the current head.\n </span>\n ) : (\n <span>\n The previous review did not finish and belongs to an older immutable revision. Its retained findings are\n incomplete and cannot be published against the current head.\n </span>\n )}\n <dl>\n <div>\n <dt>Last reviewed</dt>\n <dd>\n <code>{review.previousHead}</code>\n </dd>\n </div>\n <div>\n <dt>Current head</dt>\n <dd>\n <code>{review.subject.headRevision}</code>\n </dd>\n </div>\n </dl>\n <ReviewOrientationSurface orientation={review.previousReport.orientation} />\n {review.previousReport.suggestions.length === 0 ? (\n <span>The previous review retained no validated suggestions.</span>\n ) : (\n <ol aria-label=\"Previous review findings\" className={styles.reviewFindings}>\n {review.previousReport.suggestions.map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <ReviewSuggestionCard\n canPublish={false}\n isPreviewing={false}\n jobId={review.previousJobId}\n onPreviewPublication={() => undefined}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={review.previousReport.notes} />\n <span>Previous-head findings are read-only. Start a current-head review before publishing anything.</span>\n {!canEnqueue ? (\n <span>Only a workspace owner can start the new review.</span>\n ) : state.provider === null ? (\n <span>Configure an sbx Review Agent Profile to review the new head.</span>\n ) : (\n <>\n {reviewLaunch(review.subject.headRevision, \"Review current head\")}\n {state.action === \"failed\" ? (\n <span role=\"alert\">\n The current-head review could not be started. Check the provider and worker, then try again.\n </span>\n ) : null}\n </>\n )}\n </div>\n {threadSurface}\n </>\n )\n }\n if (review._tag === \"failed\") {\n const report = review.report\n const failure = review.failure ?? null\n return withThread(\n <>\n <strong>\n {review.state === \"cancelled\"\n ? \"Review cancelled\"\n : failure === null\n ? \"Review did not finish\"\n : failureHeading(failure.stage)}\n </strong>\n {review.state === \"failed\" && failure !== null ? <span>{failureGuidance(failure)}</span> : null}\n {review.state === \"failed\" && failure !== null && failureCause(failure.cause) !== null ? (\n <span>Cause: {failureCause(failure.cause)}</span>\n ) : null}\n {report == null ? (\n <span>The failed run did not change approval or publish a recommendation.</span>\n ) : (\n <>\n <Text>\n This review is incomplete. The retained findings were validated before the run stopped; unreviewed areas\n remain.\n </Text>\n <ReviewOrientationSurface orientation={report.orientation} />\n {report.suggestions.length === 0 ? (\n <span>No validated suggestions were retained before the run stopped.</span>\n ) : (\n <ol className={styles.reviewFindings}>\n {report.suggestions.map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <VersionedReviewSuggestionCard\n canEdit={canEnqueue}\n entityId={state.entityId}\n isPreviewing={\n publication._tag === \"previewing\" &&\n publication.selection.suggestionId === suggestion.suggestionId\n }\n jobId={review.jobId}\n onPreviewPublication={onPreviewPublication}\n onTargetSuggestion={onTargetSuggestion}\n {...(onSuggestionRevisionAccepted === undefined ? {} : { onSuggestionRevisionAccepted })}\n {...(revisionTransport === undefined ? {} : { revisionTransport })}\n sessionKey={state.sessionKey}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={report.notes} />\n <span>Retained findings remain advice only and may be published after confirmation.</span>\n </>\n )}\n {canEnqueue && state.provider !== null ? (\n <>\n {state.action === \"failed\" && submittedRequest === null ? (\n <span role=\"alert\">\n A new full review could not be started. Check the provider and worker, then try again.\n </span>\n ) : null}\n {reviewLaunch(\n review.subject.headRevision,\n failure?.retryable === false ? \"Review again\" : \"Retry review\",\n true\n )}\n </>\n ) : null}\n </>\n )\n }\n if (review._tag === \"interrupted\") {\n return withThread(\n <>\n <strong>Review interrupted by restart</strong>\n <Text>\n Control Center restarted before this run finished. The retained findings were validated before the run\n stopped; unreviewed areas remain.\n </Text>\n <ReviewOrientationSurface orientation={review.report.orientation} />\n {review.report.suggestions.length === 0 ? (\n <span>No validated suggestions were retained before the run stopped.</span>\n ) : (\n <ol className={styles.reviewFindings}>\n {review.report.suggestions.map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <VersionedReviewSuggestionCard\n canEdit={canEnqueue}\n entityId={state.entityId}\n isPreviewing={\n publication._tag === \"previewing\" && publication.selection.suggestionId === suggestion.suggestionId\n }\n jobId={review.jobId}\n onPreviewPublication={onPreviewPublication}\n onTargetSuggestion={onTargetSuggestion}\n {...(onSuggestionRevisionAccepted === undefined ? {} : { onSuggestionRevisionAccepted })}\n {...(revisionTransport === undefined ? {} : { revisionTransport })}\n sessionKey={state.sessionKey}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={review.report.notes} />\n <span>Retained findings remain advice only and may be published after confirmation.</span>\n {canEnqueue && state.provider !== null ? (\n <>\n {state.action === \"failed\" && submittedRequest === null ? (\n <span role=\"alert\">\n A new full review could not be started. Check the provider and worker, then try again.\n </span>\n ) : null}\n {reviewLaunch(review.subject.headRevision, \"Start a new review\")}\n </>\n ) : null}\n </>\n )\n }\n if (review._tag === \"completed\") {\n return withThread(\n <>\n <strong>{outcomeLabel(review.outcome)}</strong>\n {review.report.completion.status === \"unable-to-conclude\" ? (\n <Text>{review.report.completion.reason}</Text>\n ) : null}\n <ReviewOrientationSurface orientation={review.report.orientation} />\n {(suggestions ?? review.report.suggestions).length === 0 ? (\n <span>No validated suggestions were retained for this exact head.</span>\n ) : (\n <ol className={styles.reviewFindings}>\n {(suggestions ?? review.report.suggestions).map((suggestion) => (\n <li key={suggestion.suggestionId}>\n <VersionedReviewSuggestionCard\n canEdit={canEnqueue}\n entityId={state.entityId}\n isPreviewing={\n publication._tag === \"previewing\" && publication.selection.suggestionId === suggestion.suggestionId\n }\n jobId={review.jobId}\n onPreviewPublication={onPreviewPublication}\n onTargetSuggestion={onTargetSuggestion}\n {...(onSuggestionRevisionAccepted === undefined ? {} : { onSuggestionRevisionAccepted })}\n {...(revisionTransport === undefined ? {} : { revisionTransport })}\n sessionKey={state.sessionKey}\n suggestion={suggestion}\n />\n </li>\n ))}\n </ol>\n )}\n <ReviewNotes notes={review.report.notes} />\n <span>Agent advice only. Preview and confirm a finding to post it to CodeCommit, or dismiss it locally.</span>\n </>\n )\n }\n\n return withThread(\n <>\n <strong>Agent review not run</strong>\n <span>An immutable-head review produces advice, never a human approval.</span>\n {!canEnqueue ? (\n <span>Only a workspace owner can start a review.</span>\n ) : state.provider === null ? (\n <span>\n PR review is not configured. Enable Codex, Claude, or an Effect AI review runner on the Control Center server.\n The workspace must allow that provider with Review sandbox and Isolated profile.\n </span>\n ) : (\n <>{reviewLaunch(review.subject.headRevision, \"Review exact head\")}</>\n )}\n {state.action === \"failed\" ? (\n <span role=\"alert\">The review could not be started. Check provider and worker configuration, then retry.</span>\n ) : null}\n </>\n )\n}\n\nexport default PullRequestReviewPanel\n"],"file":"PullRequestReviewPanel-Blbjn1Ns.js"}
|