@knpkv/control-center 0.3.0 → 0.5.0
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 +70 -17
- package/dist/client/.vite/manifest.json +223 -178
- package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js → ActiveWorkPage-g2-Jyavo.js} +2 -2
- package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js.map → ActiveWorkPage-g2-Jyavo.js.map} +1 -1
- package/dist/client/assets/AgentPage-B6GQdZAs.css +1 -0
- package/dist/client/assets/AgentPage-DmVsEe13.js +6 -0
- package/dist/client/assets/AgentPage-DmVsEe13.js.map +1 -0
- package/dist/client/assets/AtlassianOAuthCallbackPage-C8u9ItMj.js +2 -0
- package/dist/client/assets/{AtlassianOAuthCallbackPage-D1F1xE_2.js.map → AtlassianOAuthCallbackPage-C8u9ItMj.js.map} +1 -1
- package/dist/client/assets/AuthorizedSharePage-CVBJ1NTm.js +2 -0
- package/dist/client/assets/AuthorizedSharePage-CVBJ1NTm.js.map +1 -0
- package/dist/client/assets/BrowserCrypto-3BoTVFdl.js +2 -0
- package/dist/client/assets/{BrowserCrypto-DVWR7DFd.js.map → BrowserCrypto-3BoTVFdl.js.map} +1 -1
- package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js +2 -0
- package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js.map +1 -0
- package/dist/client/assets/CommandSearch-DUeRRbV2.js +2 -0
- package/dist/client/assets/{CommandSearch-CP_QCbkm.js.map → CommandSearch-DUeRRbV2.js.map} +1 -1
- package/dist/client/assets/ItemsPage-BF2ZkSzh.js +2 -0
- package/dist/client/assets/{ItemsPage-BGFUkRL2.js.map → ItemsPage-BF2ZkSzh.js.map} +1 -1
- package/dist/client/assets/{PairPage-DIgzx0K2.js → PairPage-CkaZltHd.js} +2 -2
- package/dist/client/assets/{PairPage-DIgzx0K2.js.map → PairPage-CkaZltHd.js.map} +1 -1
- package/dist/client/assets/PortfolioOverview-CEUHJmGC.js +2 -0
- package/dist/client/assets/PortfolioOverview-CEUHJmGC.js.map +1 -0
- package/dist/client/assets/PullRequestReviewPanel-D1IpvHe2.js +6 -0
- package/dist/client/assets/PullRequestReviewPanel-D1IpvHe2.js.map +1 -0
- package/dist/client/assets/ReleaseRoute-BuQybrsg.js +2 -0
- package/dist/client/assets/{ReleaseRoute-DXJ8Jg60.js.map → ReleaseRoute-BuQybrsg.js.map} +1 -1
- package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js +2 -0
- package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js.map +1 -0
- package/dist/client/assets/ServicesPage-hw5Ee69-.js +2 -0
- package/dist/client/assets/ServicesPage-hw5Ee69-.js.map +1 -0
- package/dist/client/assets/TimelinePage-Cj3V98uI.js +2 -0
- package/dist/client/assets/TimelinePage-Cj3V98uI.js.map +1 -0
- package/dist/client/assets/WorkspaceEntityLink-C_rc8lxi.js +2 -0
- package/dist/client/assets/{WorkspaceEntityLink-AdZ_T-Wk.js.map → WorkspaceEntityLink-C_rc8lxi.js.map} +1 -1
- package/dist/client/assets/WorkspaceEntityRoute-DLLT6fY0.css +1 -0
- package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js +14 -0
- package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js.map +1 -0
- package/dist/client/assets/WorkspaceHomeLink-DeYYLEsH.js +2 -0
- package/dist/client/assets/{WorkspaceHomeLink-XbKSPths.js.map → WorkspaceHomeLink-DeYYLEsH.js.map} +1 -1
- package/dist/client/assets/{WorkspacePullRequestDetails-BErJ5bk8.js → WorkspacePullRequestDetails-CizqydjN.js} +3 -3
- package/dist/client/assets/WorkspacePullRequestDetails-CizqydjN.js.map +1 -0
- package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js → WorkspaceReleaseLayout-CXAQUhkh.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js.map → WorkspaceReleaseLayout-CXAQUhkh.js.map} +1 -1
- package/dist/client/assets/{WorkspaceRichText-D1M637Ff.js → WorkspaceRichText-CCOciILO.js} +2 -2
- package/dist/client/assets/WorkspaceRichText-CCOciILO.js.map +1 -0
- package/dist/client/assets/WorkspaceSettingsPage-GoBfQzBx.css +1 -0
- package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js +2 -0
- package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js.map +1 -0
- package/dist/client/assets/agent-api-Dl9TuGOJ.js +19 -0
- package/dist/client/assets/agent-api-Dl9TuGOJ.js.map +1 -0
- package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js +2 -0
- package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js.map +1 -0
- package/dist/client/assets/authenticatedMutationClient-DdowMjyo.js +2 -0
- package/dist/client/assets/{authenticatedMutationClient-Ccwguc3i.js.map → authenticatedMutationClient-DdowMjyo.js.map} +1 -1
- package/dist/client/assets/authorizedShareTransport-CnclcYai.js +2 -0
- package/dist/client/assets/{authorizedShareTransport-DZHgFEkh.js.map → authorizedShareTransport-CnclcYai.js.map} +1 -1
- package/dist/client/assets/client-Dq_XQE_l.js +5 -0
- package/dist/client/assets/client-Dq_XQE_l.js.map +1 -0
- package/dist/client/assets/confluenceTasks-DtKq8_eU.js +5 -0
- package/dist/client/assets/confluenceTasks-DtKq8_eU.js.map +1 -0
- package/dist/client/assets/connectionTestTransport-CPK98z7H.js +2 -0
- package/dist/client/assets/connectionTestTransport-CPK98z7H.js.map +1 -0
- package/dist/client/assets/index-zVjlBm9l.js +11 -0
- package/dist/client/assets/index-zVjlBm9l.js.map +1 -0
- package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js → patterns-5N-j-AD2-DLfaGePK.js} +2 -2
- package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js.map → patterns-5N-j-AD2-DLfaGePK.js.map} +1 -1
- package/dist/client/assets/{presentPortfolio-D3ZIcnqt.js → presentPortfolio-DLEq-vEz.js} +2 -2
- package/dist/client/assets/presentPortfolio-DLEq-vEz.js.map +1 -0
- package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js → presentWorkspaceItems-BOY3FbhO.js} +2 -2
- package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js.map → presentWorkspaceItems-BOY3FbhO.js.map} +1 -1
- package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js → pullRequestReviewFailures-CyjTVnSX.js} +2 -2
- package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js.map → pullRequestReviewFailures-CyjTVnSX.js.map} +1 -1
- package/dist/client/assets/pullRequestReviewThreadReplay-CXHspFTr.js +2 -0
- package/dist/client/assets/pullRequestReviewThreadReplay-CXHspFTr.js.map +1 -0
- package/dist/client/assets/releaseAgentTransport-DaO4svPu.js +2 -0
- package/dist/client/assets/releaseAgentTransport-DaO4svPu.js.map +1 -0
- package/dist/client/assets/releaseRoutes-B4ciNOJj.js +2 -0
- package/dist/client/assets/{releaseRoutes-BCuIdZyA.js.map → releaseRoutes-B4ciNOJj.js.map} +1 -1
- package/dist/client/assets/serviceOnboarding-D0FmodRi.js +2 -0
- package/dist/client/assets/{serviceOnboarding-Jg_0yNjf.js.map → serviceOnboarding-D0FmodRi.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js → useWorkspaceDefaultLanding-BaQdg0sY.js} +3 -3
- package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js.map → useWorkspaceDefaultLanding-BaQdg0sY.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js → useWorkspaceItems-B-7JHtm0.js} +2 -2
- package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js.map → useWorkspaceItems-B-7JHtm0.js.map} +1 -1
- package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js +2 -0
- package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js.map +1 -0
- package/dist/client/assets/workspaceScrollCapture-BYNfR2wo.js +2 -0
- package/dist/client/assets/workspaceScrollCapture-BYNfR2wo.js.map +1 -0
- package/dist/client/assets/workspaceSettingsTransport-Br4lBmvS.js +2 -0
- package/dist/client/assets/{workspaceSettingsTransport-CZWYL5T7.js.map → workspaceSettingsTransport-Br4lBmvS.js.map} +1 -1
- package/dist/client/build-graph.json +115 -0
- package/dist/client/index.html +1 -1
- package/dist/server/api/agent.d.ts +575 -44
- package/dist/server/api/agent.d.ts.map +1 -1
- package/dist/server/api/deliveryGraph.d.ts +474 -454
- package/dist/server/api/deliveryGraph.d.ts.map +1 -1
- package/dist/server/api/index.d.ts +2 -2
- package/dist/server/api/index.d.ts.map +1 -1
- package/dist/server/api/index.js +4 -4
- package/dist/server/api/liveEvents.d.ts +20 -0
- package/dist/server/api/liveEvents.d.ts.map +1 -1
- package/dist/server/api/portfolio.d.ts +23 -0
- package/dist/server/api/portfolio.d.ts.map +1 -1
- package/dist/server/api/session.d.ts +23 -1
- package/dist/server/api/session.d.ts.map +1 -1
- package/dist/server/api/shares.d.ts +4 -2
- package/dist/server/api/shares.d.ts.map +1 -1
- package/dist/server/assets/{BindConfig-DIsf2Rnh.js → BindConfig-DAASchDn.js} +2405 -322
- package/dist/server/assets/BindConfig-DAASchDn.js.map +1 -0
- package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js → CodePipelineStateDecoder-CNiFRgSi.js} +2 -2
- package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js.map → CodePipelineStateDecoder-CNiFRgSi.js.map} +1 -1
- package/dist/server/assets/{agent-CyZ40zs1.js → agent-xQhAQXly.js} +181 -11
- package/dist/server/assets/agent-xQhAQXly.js.map +1 -0
- package/dist/server/assets/{controlCenterApi-ZUX3Y-LE.js → controlCenterApi-DNXK7MT1.js} +6 -5
- package/dist/server/assets/controlCenterApi-DNXK7MT1.js.map +1 -0
- package/dist/server/assets/{descriptor-CKtTnhef.js → descriptor-CCvNzSZL.js} +10 -10
- package/dist/server/assets/{descriptor-CKtTnhef.js.map → descriptor-CCvNzSZL.js.map} +1 -1
- package/dist/server/assets/{failures-mgYDkUZy.js → failures-CesHLYbN.js} +2 -2
- package/dist/server/assets/{failures-mgYDkUZy.js.map → failures-CesHLYbN.js.map} +1 -1
- package/dist/server/assets/{firstPartyServices-D7b8BOek.js → firstPartyServices-Cdzjcs2H.js} +2 -2
- package/dist/server/assets/{firstPartyServices-D7b8BOek.js.map → firstPartyServices-Cdzjcs2H.js.map} +1 -1
- package/dist/server/assets/{manualPluginSynchronization-DFlhKvav.js → manualPluginSynchronization-DFIeUHP9.js} +6 -5
- package/dist/server/assets/manualPluginSynchronization-DFIeUHP9.js.map +1 -0
- package/dist/server/assets/{plugins-D__oMDpI.js → plugins-DiPrfzV8.js} +2 -2
- package/dist/server/assets/{plugins-D__oMDpI.js.map → plugins-DiPrfzV8.js.map} +1 -1
- package/dist/server/assets/{readiness-BhA-Nr9c.js → readiness-31Mqc-9H.js} +3 -3
- package/dist/server/assets/{readiness-BhA-Nr9c.js.map → readiness-31Mqc-9H.js.map} +1 -1
- package/dist/server/assets/{relationshipInferenceMaterialization-DYBcaWhQ.js → relationshipInferenceMaterialization-Dyix96px.js} +1158 -169
- package/dist/server/assets/relationshipInferenceMaterialization-Dyix96px.js.map +1 -0
- package/dist/server/assets/{workspaceSettings-BE713Oe8.js → workspaceSettings-sv8h_h2P.js} +2787 -2700
- package/dist/server/assets/workspaceSettings-sv8h_h2P.js.map +1 -0
- package/dist/server/build-graph.json +144 -4
- package/dist/server/domain/actors.d.ts +12 -12
- package/dist/server/domain/confluenceTasks.d.ts +27 -0
- package/dist/server/domain/confluenceTasks.d.ts.map +1 -0
- package/dist/server/domain/deliveryGraph.d.ts +51 -49
- package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
- package/dist/server/domain/governedAction/bindings.d.ts +26 -12
- package/dist/server/domain/governedAction/bindings.d.ts.map +1 -1
- package/dist/server/domain/governedAction/lifecycle.d.ts +8 -8
- package/dist/server/domain/governedAction/model.d.ts +45 -18
- package/dist/server/domain/governedAction/model.d.ts.map +1 -1
- package/dist/server/domain/governedAction/stateMachine.d.ts +34 -34
- package/dist/server/domain/index.js +6 -6
- package/dist/server/domain/normalizedIssue.d.ts +1 -1
- package/dist/server/domain/normalizedPage.d.ts +1 -0
- package/dist/server/domain/normalizedPage.d.ts.map +1 -1
- package/dist/server/domain/prReview.d.ts +38 -0
- package/dist/server/domain/prReview.d.ts.map +1 -1
- package/dist/server/domain/prReviewReconciliation.d.ts +56 -0
- package/dist/server/domain/prReviewReconciliation.d.ts.map +1 -0
- package/dist/server/domain/prReviewRevision.d.ts +1 -0
- package/dist/server/domain/prReviewRevision.d.ts.map +1 -1
- package/dist/server/domain/readiness/model.d.ts +3 -3
- package/dist/server/domain/release.d.ts +3 -3
- package/dist/server/domain/releasePipelineApproval.d.ts +31 -0
- package/dist/server/domain/releasePipelineApproval.d.ts.map +1 -0
- package/dist/server/domain/releasePublication.d.ts +4 -0
- package/dist/server/domain/releasePublication.d.ts.map +1 -0
- package/dist/server/index.js +8 -8
- package/dist/server/server/agent/AgentJobWorker.d.ts +10 -1
- package/dist/server/server/agent/AgentJobWorker.d.ts.map +1 -1
- package/dist/server/server/agent/ReleaseAgentPrompt.d.ts.map +1 -1
- package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts +4 -3
- package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts.map +1 -1
- package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts +17 -1
- package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts.map +1 -1
- package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts +76 -2
- package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts.map +1 -1
- package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts +27 -0
- package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts.map +1 -0
- package/dist/server/server/api/ApplicationServices.d.ts +39 -5
- package/dist/server/server/api/ApplicationServices.d.ts.map +1 -1
- package/dist/server/server/api/Handlers.d.ts +1 -1
- package/dist/server/server/api/Handlers.d.ts.map +1 -1
- package/dist/server/server/api/RequestBoundary.d.ts.map +1 -1
- package/dist/server/server/application/GovernedReviewSuggestionPublicationGateway.d.ts.map +1 -1
- package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts +4 -0
- package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts.map +1 -1
- package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -1
- package/dist/server/server/application/index.d.ts +1 -0
- package/dist/server/server/application/index.d.ts.map +1 -1
- package/dist/server/server/application/liveEvents.d.ts.map +1 -1
- package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
- package/dist/server/server/application/pipelineExecutionProjection.d.ts +7 -6
- package/dist/server/server/application/pipelineExecutionProjection.d.ts.map +1 -1
- package/dist/server/server/application/portfolioSnapshots.d.ts +2018 -4
- package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -1
- package/dist/server/server/application/pullRequestReviews.d.ts.map +1 -1
- package/dist/server/server/application/releaseAgent.d.ts +11 -3
- package/dist/server/server/application/releaseAgent.d.ts.map +1 -1
- package/dist/server/server/application/releasePublicationIntent.d.ts +7 -0
- package/dist/server/server/application/releasePublicationIntent.d.ts.map +1 -0
- package/dist/server/server/application/releasePublicationMetadata.d.ts +61 -0
- package/dist/server/server/application/releasePublicationMetadata.d.ts.map +1 -0
- package/dist/server/server/application/releasePublicationSubmissions.d.ts +3730 -0
- package/dist/server/server/application/releasePublicationSubmissions.d.ts.map +1 -0
- package/dist/server/server/application/releaseRunbookHydration.d.ts +2310 -0
- package/dist/server/server/application/releaseRunbookHydration.d.ts.map +1 -0
- package/dist/server/server/application/releaseSynchronization.d.ts.map +1 -1
- package/dist/server/server/cli.js +8 -8
- package/dist/server/server/cli.js.map +1 -1
- package/dist/server/server/governance/governedActionDigests.d.ts +236 -218
- package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -1
- package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts +3 -4
- package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts.map +1 -1
- package/dist/server/server/governance/internal/execution-store/begin.d.ts.map +1 -1
- package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts +1 -1
- package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts +8 -8
- package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts +2 -2
- package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts +1 -1
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +37 -30
- package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -1
- package/dist/server/server/index.js +5 -5
- package/dist/server/server/internal/codepipeline-state-probe.js +1 -1
- package/dist/server/server/persistence/Database.d.ts +1 -1
- package/dist/server/server/persistence/Database.d.ts.map +1 -1
- package/dist/server/server/persistence/Persistence.d.ts +1549 -577
- package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
- package/dist/server/server/persistence/backup/BackupArchive.d.ts.map +1 -1
- package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -1
- package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +2 -2
- package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/agentJobModels.d.ts +345 -8
- package/dist/server/server/persistence/repositories/agentJobModels.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/agentJobRepository.d.ts +654 -192
- package/dist/server/server/persistence/repositories/agentJobRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +148 -138
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +27 -25
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +117 -111
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +28 -27
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +50 -48
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +117 -111
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +259 -234
- package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +68 -46
- package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/read.d.ts +668 -190
- package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +680 -206
- package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +38 -31
- package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +46 -32
- package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governed-action/write.d.ts +46 -32
- package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +678 -205
- package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts +85 -4
- package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/models.d.ts +9 -9
- package/dist/server/server/persistence/repositories/peopleRepository.d.ts +36 -36
- package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts +1 -1
- package/dist/server/server/persistence/repositories/readiness/assessments.d.ts +6 -6
- package/dist/server/server/persistence/repositories/readiness/contract.d.ts +450 -450
- package/dist/server/server/persistence/repositories/readiness/queue.d.ts +14 -14
- package/dist/server/server/persistence/repositories/readinessRepository.d.ts +7 -7
- package/dist/server/server/persistence/repositories/releaseRepository.d.ts +18 -18
- package/dist/server/server/persistence/repositories/retentionRepository.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/timelineRepository.d.ts +4 -4
- package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts.map +1 -1
- package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts +9 -0
- package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts.map +1 -0
- package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts.map +1 -1
- package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts.map +1 -1
- package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts +2 -2
- package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts.map +1 -1
- package/dist/server/server/plugins/jira/JiraReadProvider.d.ts.map +1 -1
- package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts +8 -0
- package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts.map +1 -0
- package/dist/server/server/plugins/jira/index.d.ts +1 -1
- package/dist/server/server/plugins/jira/index.d.ts.map +1 -1
- package/dist/server/server/runtime/Bootstrap.d.ts +1 -1
- package/dist/server/server/runtime/Bootstrap.d.ts.map +1 -1
- package/dist/server/server/runtime/ControlCenterServer.d.ts +3 -3
- package/dist/server/server/runtime/ControlCenterServer.d.ts.map +1 -1
- package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts +11 -1
- package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts.map +1 -1
- package/dist/server/server/runtime/RetentionStartup.d.ts.map +1 -1
- package/dist/server/server/runtime/ServerLifecycle.d.ts.map +1 -1
- package/dist/server/server/secrets/SecretStore.d.ts.map +1 -1
- package/package.json +10 -9
- package/dist/client/assets/AgentPage-DGL93TJU.js +0 -3
- package/dist/client/assets/AgentPage-DGL93TJU.js.map +0 -1
- package/dist/client/assets/AgentPage-DVSgQgJa.css +0 -1
- package/dist/client/assets/AtlassianOAuthCallbackPage-D1F1xE_2.js +0 -2
- package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js +0 -2
- package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js.map +0 -1
- package/dist/client/assets/BrowserCrypto-DVWR7DFd.js +0 -2
- package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js +0 -2
- package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js.map +0 -1
- package/dist/client/assets/CommandSearch-CP_QCbkm.js +0 -2
- package/dist/client/assets/ItemsPage-BGFUkRL2.js +0 -2
- package/dist/client/assets/PortfolioOverview-D45rk8Hl.js +0 -2
- package/dist/client/assets/PortfolioOverview-D45rk8Hl.js.map +0 -1
- package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js +0 -6
- package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js.map +0 -1
- package/dist/client/assets/ReleaseRoute-DXJ8Jg60.js +0 -2
- package/dist/client/assets/ReleaseWorkset-Dtzalmji.js +0 -2
- package/dist/client/assets/ReleaseWorkset-Dtzalmji.js.map +0 -1
- package/dist/client/assets/ServicesPage-DGcUjd2H.js +0 -2
- package/dist/client/assets/ServicesPage-DGcUjd2H.js.map +0 -1
- package/dist/client/assets/TimelinePage-Bq1RTQlP.js +0 -2
- package/dist/client/assets/TimelinePage-Bq1RTQlP.js.map +0 -1
- package/dist/client/assets/WorkspaceEntityLink-AdZ_T-Wk.js +0 -2
- package/dist/client/assets/WorkspaceEntityRoute-9iMOV64J.css +0 -1
- package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js +0 -3
- package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js.map +0 -1
- package/dist/client/assets/WorkspaceHomeLink-XbKSPths.js +0 -2
- package/dist/client/assets/WorkspacePullRequestDetails-BErJ5bk8.js.map +0 -1
- package/dist/client/assets/WorkspaceRichText-D1M637Ff.js.map +0 -1
- package/dist/client/assets/WorkspaceSettingsPage-Fy7Wx8Y2.js +0 -2
- package/dist/client/assets/WorkspaceSettingsPage-Fy7Wx8Y2.js.map +0 -1
- package/dist/client/assets/WorkspaceSettingsPage-P6yfac0b.css +0 -1
- package/dist/client/assets/agent-api-QVqt4a0O.js +0 -19
- package/dist/client/assets/agent-api-QVqt4a0O.js.map +0 -1
- package/dist/client/assets/authenticatedMutationClient-Ccwguc3i.js +0 -2
- package/dist/client/assets/authorizedShareTransport-DZHgFEkh.js +0 -2
- package/dist/client/assets/client-D27unen8.js +0 -5
- package/dist/client/assets/client-D27unen8.js.map +0 -1
- package/dist/client/assets/connectionTestTransport-BQ55d6Me.js +0 -2
- package/dist/client/assets/connectionTestTransport-BQ55d6Me.js.map +0 -1
- package/dist/client/assets/index-j5ze816l.js +0 -11
- package/dist/client/assets/index-j5ze816l.js.map +0 -1
- package/dist/client/assets/presentPortfolio-D3ZIcnqt.js.map +0 -1
- package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js +0 -2
- package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js.map +0 -1
- package/dist/client/assets/releaseRoutes-BCuIdZyA.js +0 -2
- package/dist/client/assets/serviceOnboarding-Jg_0yNjf.js +0 -2
- package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js +0 -2
- package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js.map +0 -1
- package/dist/client/assets/workspaceSettingsTransport-CZWYL5T7.js +0 -2
- package/dist/server/assets/BindConfig-DIsf2Rnh.js.map +0 -1
- package/dist/server/assets/agent-CyZ40zs1.js.map +0 -1
- package/dist/server/assets/controlCenterApi-ZUX3Y-LE.js.map +0 -1
- package/dist/server/assets/manualPluginSynchronization-DFlhKvav.js.map +0 -1
- package/dist/server/assets/relationshipInferenceMaterialization-DYBcaWhQ.js.map +0 -1
- package/dist/server/assets/workspaceSettings-BE713Oe8.js.map +0 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ReviewSuggestionPublicationSurface-DHI3AT1u.js","assets/rolldown-runtime-QTnfLwEv.js","assets/react-CZI7_Jkm.js","assets/jsx-runtime-By8HlURe.js","assets/Dialog-xSrBk0Vv-ClGyDPlc.js","assets/react-dom-cJyBB_A4.js","assets/PortalProvider-BpgZwSpw-aHWGwW1o.js","assets/component-BJeeRuSu-Bu7KhcFC.js","assets/primitives-nKxQGSsE-CJNmac__.js","assets/WorkspacePullRequestDetails.module-CCFLGO4V.js","assets/WorkspacePullRequestDetails-DrPltvYZ.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{t as n}from"./preload-helper-Czpn1I53.js";import{t as r}from"./jsx-runtime-By8HlURe.js";import{s as i,t as a}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{r as o}from"./primitives-nKxQGSsE-CJNmac__.js";import{A as s,Ir as c,Jn as l,Lr as u,M as d,Nn as f,Qn as p,Ur as m,Vr as h,Yn as g,_i as _,ai as v,ea as y,j as b,ja as x,k as S,n as C,pi as w}from"./agent-api-Dl9TuGOJ.js";import{a as T,t as E}from"./client-Dq_XQE_l.js";import{t as D}from"./authenticatedMutationClient-DdowMjyo.js";import{t as O}from"./WorkspacePullRequestDetails.module-CCFLGO4V.js";var k=e(t(),1),A=r(),j=e=>{switch(e.anchor._tag){case`line`:return`Line suggestion · ${e.anchor.path}:${String(e.anchor.line)}`;case`file`:return`File suggestion · ${e.anchor.path}:${String(e.anchor.line)}`;case`changes`:return`Whole-change suggestion`}},M=e=>{let t=[],n=[],r=``,i=0,a=0;for(let o of e.split(`
|
|
3
|
+
`)){let e=/^@@ -\d+(?:,(\d+))? \+\d+(?:,(\d+))? @@/u.exec(o);if(e!==null){let s=`⋯ ${r} · ${o}`;t.push(s),n.push(s),i=Number(e[1]??`1`),a=Number(e[2]??`1`);continue}if(i===0&&a===0){o.startsWith(`+++ `)&&(r=o.slice(4).replace(/^b\//u,``));continue}if(o!==`\`){if(o.startsWith(`-`)&&i>0){t.push(o.slice(1)),--i;continue}if(o.startsWith(`+`)&&a>0){n.push(o.slice(1)),--a;continue}if(o.startsWith(` `)&&i>0&&a>0){let e=o.slice(1);t.push(e),n.push(e),--i,--a;continue}}}return{before:t.join(`
|
|
4
|
+
`),after:n.join(`
|
|
5
|
+
`)}},N=e=>`${e.slice(0,1).toUpperCase()}${e.slice(1)}`,P=({canPublish:e,extraActions:t,isPreviewing:n,jobId:r,metadata:i,onPreviewPublication:s,publicationBlockedReason:c,suggestion:l})=>{let u=l.replacement===void 0?null:M(l.replacement.unifiedDiff);return(0,A.jsxs)(`article`,{className:O.suggestionCard,"data-severity":l.severity,children:[(0,A.jsxs)(`header`,{className:O.suggestionHeading,children:[(0,A.jsx)(`span`,{className:O.severity,children:l.severity}),(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`small`,{children:j(l)}),(0,A.jsx)(`strong`,{children:l.title})]}),(0,A.jsxs)(`span`,{className:O.confidence,children:[N(l.state),` · `,l.confidence.level,` confidence`]})]}),i,(0,A.jsx)(o,{children:l.problem}),(0,A.jsxs)(`dl`,{className:O.suggestionDetails,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Impact`}),(0,A.jsx)(`dd`,{children:l.impact})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Recommendation`}),(0,A.jsx)(`dd`,{children:l.recommendation})]})]}),(0,A.jsxs)(`details`,{children:[(0,A.jsx)(`summary`,{children:`Evidence and confidence`}),(0,A.jsxs)(`code`,{children:[l.evidence.path,`:`,String(l.evidence.startLine),l.evidence.endLine===l.evidence.startLine?``:`–${String(l.evidence.endLine)}`]}),(0,A.jsx)(`pre`,{children:l.evidence.excerpt}),(0,A.jsx)(o,{children:l.confidence.reason})]}),l.relatedLocations.length===0?null:(0,A.jsxs)(`section`,{"aria-label":`Related locations`,className:O.relatedLocations,children:[(0,A.jsx)(`strong`,{children:`Related locations`}),(0,A.jsx)(`ul`,{children:l.relatedLocations.map(e=>(0,A.jsxs)(`li`,{children:[(0,A.jsxs)(`code`,{children:[e.path,`:`,String(e.startLine),e.endLine===e.startLine?``:`–${String(e.endLine)}`]}),(0,A.jsx)(`span`,{children:e.label})]},`${e.path}:${String(e.startLine)}:${String(e.endLine)}`))})]}),u===null||l.replacement===void 0?null:(0,A.jsxs)(`section`,{"aria-label":`Suggested replacement`,className:O.replacementPreview,children:[(0,A.jsxs)(`header`,{children:[(0,A.jsx)(`strong`,{children:`Suggested replacement`}),(0,A.jsxs)(`span`,{children:[`Inert patch · `,l.replacement.reviewedHead.slice(0,12)]})]}),(0,A.jsx)(o,{children:l.replacement.explanation}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`figure`,{children:[(0,A.jsx)(`figcaption`,{children:`Before`}),(0,A.jsx)(`pre`,{children:u.before})]}),(0,A.jsxs)(`figure`,{children:[(0,A.jsx)(`figcaption`,{children:`After`}),(0,A.jsx)(`pre`,{children:u.after})]})]})]}),l.prevention===void 0?null:l.prevention.enforcement===`none`?(0,A.jsxs)(`details`,{className:O.preventionProposal,children:[(0,A.jsx)(`summary`,{children:`Prevention note · no stable guardrail`}),(0,A.jsxs)(o,{children:[l.prevention.summary,` · `,l.prevention.rationale]})]}):(0,A.jsxs)(`details`,{className:O.preventionProposal,children:[(0,A.jsx)(`summary`,{children:`Prevention proposal · separate review required`}),(0,A.jsxs)(o,{children:[l.prevention.summary,` · `,l.prevention.enforcement]}),(0,A.jsxs)(`dl`,{children:[(0,A.jsx)(`dt`,{children:`Recurring evidence`}),(0,A.jsx)(`dd`,{children:l.prevention.recurrenceEvidence}),(0,A.jsx)(`dt`,{children:`Existing rule or configuration`}),(0,A.jsx)(`dd`,{children:l.prevention.existingRuleOrConfig}),(0,A.jsx)(`dt`,{children:`Target file`}),(0,A.jsx)(`dd`,{children:l.prevention.targetFile}),(0,A.jsx)(`dt`,{children:`Source paths`}),(0,A.jsx)(`dd`,{children:l.prevention.sourcePaths.join(`, `)}),(0,A.jsx)(`dt`,{children:`Matcher or invariant`}),(0,A.jsx)(`dd`,{children:l.prevention.matcherOrInvariant}),(0,A.jsx)(`dt`,{children:`Invalid fixture`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`pre`,{children:l.prevention.invalidFixture})}),(0,A.jsx)(`dt`,{children:`Valid fixture`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`pre`,{children:l.prevention.validFixture})}),(0,A.jsx)(`dt`,{children:`Boundary and exclusions`}),(0,A.jsx)(`dd`,{children:l.prevention.boundary})]})]}),t===void 0&&(!e||l.state!==`draft`)?null:(0,A.jsxs)(`div`,{className:O.suggestionActions,children:[t,e&&l.state===`draft`?(0,A.jsx)(a,{disabled:n||c!==void 0,onClick:()=>s({jobId:r,suggestionId:l.suggestionId}),children:n?`Preparing approval…`:`Review & approve`}):null]}),c===void 0?null:(0,A.jsx)(o,{role:`status`,tone:`secondary`,variant:`meta`,children:c})]})},F=({notes:e})=>e.length===0?null:(0,A.jsxs)(`section`,{"aria-labelledby":`review-notes-title`,className:O.reviewNotes,children:[(0,A.jsxs)(`header`,{children:[(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`small`,{children:`Never publishable`}),(0,A.jsx)(`strong`,{id:`review-notes-title`,children:`Review Notes`})]}),(0,A.jsx)(`span`,{children:e.length})]}),(0,A.jsx)(`ul`,{children:e.map(e=>(0,A.jsxs)(`li`,{children:[(0,A.jsxs)(`span`,{children:[e.reason===`pre-existing`?`Pre-existing`:`Low confidence`,` · `,e.confidence.level]}),(0,A.jsx)(`strong`,{children:e.title}),(0,A.jsx)(o,{children:e.observation}),e.location===void 0?null:(0,A.jsxs)(`code`,{children:[e.location.path,`:`,String(e.location.startLine),e.location.endLine===e.location.startLine?``:`–${String(e.location.endLine)}`]}),(0,A.jsx)(`small`,{children:e.confidence.reason})]},e.noteId))})]}),I=e=>e.author._tag===`operator`?`Operator`:`${e.author.providerId}${e.author.model===null?``:` · ${e.author.model}`}`,L=e=>e.validation._tag===`validated`?`Validated`:`Needs revalidation`,R=({loadEarlier:e,loadingEarlier:t,page:n})=>{let r=[n.current,...n.revisions.filter(({revisionId:e})=>e!==n.current.revisionId)];return(0,A.jsxs)(`div`,{className:O.revisionHistory,children:[(0,A.jsx)(`ol`,{children:r.map(e=>(0,A.jsxs)(`li`,{children:[(0,A.jsxs)(`header`,{children:[(0,A.jsxs)(`strong`,{children:[`Revision `,String(e.sequence)]}),(0,A.jsxs)(`span`,{children:[L(e),` · `,I(e)]})]}),(0,A.jsx)(`time`,{dateTime:c(e.createdAt),children:u(e.createdAt,{dateStyle:`medium`,timeStyle:`short`})}),(0,A.jsxs)(`details`,{children:[(0,A.jsx)(`summary`,{children:e.suggestion.title}),(0,A.jsx)(o,{children:e.suggestion.problem}),(0,A.jsxs)(`dl`,{children:[(0,A.jsx)(`dt`,{children:`Impact`}),(0,A.jsx)(`dd`,{children:e.suggestion.impact}),(0,A.jsx)(`dt`,{children:`Recommendation`}),(0,A.jsx)(`dd`,{children:e.suggestion.recommendation}),(0,A.jsx)(`dt`,{children:`Severity`}),(0,A.jsx)(`dd`,{children:e.suggestion.severity}),(0,A.jsx)(`dt`,{children:`Confidence`}),(0,A.jsxs)(`dd`,{children:[e.suggestion.confidence.level,` · `,e.suggestion.confidence.reason]}),(0,A.jsx)(`dt`,{children:`Evidence`}),(0,A.jsxs)(`dd`,{children:[(0,A.jsxs)(`code`,{children:[e.suggestion.evidence.path,`:`,String(e.suggestion.evidence.startLine)]}),(0,A.jsx)(`pre`,{children:e.suggestion.evidence.excerpt})]}),(0,A.jsx)(`dt`,{children:`Anchor`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`code`,{children:JSON.stringify(e.suggestion.anchor)})}),(0,A.jsx)(`dt`,{children:`Related locations`}),(0,A.jsx)(`dd`,{children:e.suggestion.relatedLocations.length===0?`None`:(0,A.jsx)(`pre`,{children:JSON.stringify(e.suggestion.relatedLocations,null,2)})}),(0,A.jsx)(`dt`,{children:`Replacement`}),(0,A.jsx)(`dd`,{children:e.suggestion.replacement===void 0?`None`:(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(o,{children:e.suggestion.replacement.explanation}),(0,A.jsx)(`pre`,{children:e.suggestion.replacement.unifiedDiff})]})}),(0,A.jsx)(`dt`,{children:`Prevention`}),(0,A.jsx)(`dd`,{children:e.suggestion.prevention===void 0?`None`:(0,A.jsx)(`pre`,{children:JSON.stringify(e.suggestion.prevention,null,2)})})]})]})]},e.revisionId))}),n.hasMore?(0,A.jsx)(a,{"aria-busy":t,disabled:t,loading:t,onClick:e,children:t?`Loading earlier revisions…`:`Load earlier revisions`}):null]})},z=p(f({anchor:d.fields.anchor,evidence:d.fields.evidence,relatedLocations:d.fields.relatedLocations,replacement:d.fields.replacement,prevention:d.fields.prevention})),B=[[`Problem`,`problem`],[`Impact`,`impact`],[`Recommendation`,`recommendation`]],V=e=>({title:e.title,severity:e.severity,problem:e.problem,impact:e.impact,evidence:e.evidence,recommendation:e.recommendation,confidence:e.confidence,relatedLocations:e.relatedLocations,...e.prevention===void 0?{}:{prevention:e.prevention},...e.replacement===void 0?{}:{replacement:e.replacement},anchor:e.anchor}),H=e=>g(z)({anchor:e.anchor,evidence:e.evidence,relatedLocations:e.relatedLocations,...e.prevention===void 0?{}:{prevention:e.prevention},...e.replacement===void 0?{}:{replacement:e.replacement}}),U=({canEdit:e,conflict:t,loadEarlier:n,loadingEarlier:r,mode:s,onOpenChange:c,onResolveConflict:u,onSave:f,open:p,page:m,preservedDraft:h,saving:g})=>{let _=m.current,[v,b]=(0,k.useState)(()=>V(_.suggestion)),[x,C]=(0,k.useState)(()=>H(_.suggestion)),[w,T]=(0,k.useState)(!1);(0,k.useEffect)(()=>{if(!p)return;let e=h??V(_.suggestion);b(e),C(H(e)),T(!1)},[_.revisionId,_.suggestion,p,h]);let E=(0,k.useMemo)(()=>`Revision ${String(_.sequence)} · ${L(_)} · ${I(_)}`,[_]),D=()=>{let e=l(z)(x);if(y(e)){T(!0);return}T(!1);let t=l(S)({title:v.title,severity:v.severity,problem:v.problem,impact:v.impact,recommendation:v.recommendation,confidence:v.confidence,...e.success});if(y(t)){T(!0);return}f(t.success)};return(0,A.jsx)(i.Root,{onOpenChange:c,open:p,children:(0,A.jsx)(i.Content,{className:O.revisionDialog,description:E,size:`wide`,title:s===`edit`?`Edit review suggestion`:`Revision history`,children:s===`history`?(0,A.jsx)(R,{loadEarlier:n,loadingEarlier:r,page:m}):(0,A.jsxs)(`form`,{className:O.revisionEditor,onSubmit:e=>{e.preventDefault(),D()},children:[(0,A.jsxs)(`div`,{className:O.revisionEditorLead,children:[(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Title`}),(0,A.jsx)(`input`,{maxLength:500,onChange:e=>b({...v,title:e.currentTarget.value}),required:!0,value:v.title})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Severity`}),(0,A.jsxs)(`select`,{onChange:e=>{let t=l(d.fields.severity)(e.currentTarget.value);y(t)||b({...v,severity:t.success})},value:v.severity,children:[(0,A.jsx)(`option`,{value:`P1`,children:`P1`}),(0,A.jsx)(`option`,{value:`P2`,children:`P2`}),(0,A.jsx)(`option`,{value:`P3`,children:`P3`}),(0,A.jsx)(`option`,{value:`P4`,children:`P4`})]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Confidence`}),(0,A.jsxs)(`select`,{onChange:e=>{let t=l(d.fields.confidence.fields.level)(e.currentTarget.value);y(t)||b({...v,confidence:{...v.confidence,level:t.success}})},value:v.confidence.level,children:[(0,A.jsx)(`option`,{value:`high`,children:`High`}),(0,A.jsx)(`option`,{value:`medium`,children:`Medium`})]})]})]}),B.map(([e,t])=>(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:e}),(0,A.jsx)(`textarea`,{maxLength:4e3,onChange:e=>b({...v,[t]:e.currentTarget.value}),required:!0,rows:4,value:v[t]})]},t)),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Confidence reason`}),(0,A.jsx)(`textarea`,{maxLength:2e3,onChange:e=>b({...v,confidence:{...v.confidence,reason:e.currentTarget.value}}),required:!0,rows:3,value:v.confidence.reason})]}),(0,A.jsxs)(`details`,{className:O.revisionAdvanced,children:[(0,A.jsx)(`summary`,{children:`Advanced evidence, anchor, replacement and prevention`}),(0,A.jsx)(o,{tone:`secondary`,children:`Complete schema-checked JSON. Invalid or incoherent evidence cannot be saved.`}),(0,A.jsx)(`textarea`,{"aria-describedby":w?`revision-advanced-error`:void 0,"aria-invalid":w,"aria-label":`Advanced evidence, anchor, replacement and prevention JSON`,onChange:e=>C(e.currentTarget.value),rows:14,spellCheck:!1,value:x}),w?(0,A.jsx)(`span`,{id:`revision-advanced-error`,role:`alert`,children:`Advanced fields are not a valid complete suggestion.`}):null]}),t?(0,A.jsxs)(`div`,{role:`alert`,children:[(0,A.jsx)(`span`,{children:`A newer revision won. Your draft is preserved, but cannot be saved over the winner.`}),(0,A.jsx)(a,{onClick:u,type:`button`,variant:`quiet`,children:`Use latest revision`})]}):_.validation._tag===`requires-revalidation`?(0,A.jsx)(`span`,{role:`status`,children:`Technical changes remain blocked from publication until revalidated.`}):null,(0,A.jsxs)(`div`,{className:O.revisionDialogActions,children:[(0,A.jsx)(i.Close,{disabled:g,children:`Cancel`}),(0,A.jsx)(a,{disabled:!e||g,loading:g,type:`submit`,children:g?`Saving revision…`:`Save revision`})]})]})})})},W=s.make(24),G={dismiss:(e,t,n)=>_(v(function*(){return yield*(yield*D).agent.dismissReviewSuggestion({params:{entityId:e.entityId,jobId:e.jobId,suggestionId:e.suggestionId},payload:t})}).pipe(w(T)),{signal:n}),edit:(e,t,n)=>_(v(function*(){return yield*(yield*D).agent.editReviewSuggestion({params:{entityId:e.entityId,jobId:e.jobId,suggestionId:e.suggestionId},payload:t})}).pipe(w(T)),{signal:n}),load:(e,t,n)=>_(v(function*(){return yield*(yield*E()).agent.reviewSuggestionRevisions({params:{entityId:e.entityId,jobId:e.jobId,suggestionId:e.suggestionId},query:{...t===null?{}:{before:t},limit:W}})}).pipe(w(T)),{signal:n})},K=(e,t)=>e.entityId===t.entityId&&e.jobId===t.jobId&&e.sessionKey===t.sessionKey&&e.suggestionId===t.suggestionId,q=(e,t)=>{let n=t.current.sequence>e.current.sequence?t.current:e.current;return{current:n,revisions:[...new Map([e.current,t.current,...e.revisions,...t.revisions].filter(({revisionId:e})=>e!==n.revisionId).map(e=>[e.revisionId,e])).values()].sort((e,t)=>t.sequence-e.sequence),hasMore:t.hasMore,nextBeforeSequence:t.nextBeforeSequence}},J=(e,t)=>({current:t,revisions:[e.current,...e.revisions].filter(({revisionId:e})=>e!==t.revisionId).sort((e,t)=>t.sequence-e.sequence),hasMore:e.hasMore,nextBeforeSequence:e.nextBeforeSequence}),Y=(e,t)=>({_tag:e,page:t}),ee=x(`ConflictApiError`),te=e=>void 0,ne=(e,t=G,n=te)=>{let[r,i]=(0,k.useState)(0),[a,o]=(0,k.useState)(!1),[s,c]=(0,k.useState)({_tag:`idle`}),l=(0,k.useRef)(null),u=(0,k.useRef)(!1),d=(0,k.useRef)(e),f=(0,k.useRef)(n);d.current=e,f.current=n,(0,k.useEffect)(()=>{if(l.current?.abort(),u.current=!1,o(!1),e===null){c({_tag:`idle`});return}let n=e,r=new AbortController;return l.current=r,c({_tag:`loading`}),t.load(n,null,r.signal).then(e=>{r.signal.aborted||d.current===null||!K(d.current,n)||c({_tag:`ready`,page:e})},()=>{r.signal.aborted||d.current===null||!K(d.current,n)||c({_tag:`failed`,draft:null,page:null})}),()=>r.abort()},[r,e,t]);let p=(0,k.useCallback)(n=>{if(e===null||s._tag===`conflict`)return;let r=s._tag===`ready`||s._tag===`failed`?s.page:null;if(r===null)return;let i=e;l.current?.abort(),u.current=!1,o(!1);let a=new AbortController;l.current=a,c({_tag:`saving`,draft:n,page:r}),t.edit(i,{expectedRevisionId:r.current.revisionId,expectedSequence:r.current.sequence,edit:n},a.signal).then(e=>{let n=J(r,e);return t.load(i,null,a.signal).then(e=>Y(`refreshed`,e),()=>Y(`accepted-refresh-failed`,n))},e=>{if(!ee(e))throw e;return t.load(i,null,a.signal).then(e=>(a.signal.aborted||d.current===null||!K(d.current,i)||c({_tag:`conflict`,draft:n,page:e}),Y(`conflict`,e)))}).then(e=>{a.signal.aborted||d.current===null||!K(d.current,i)||(c(t=>t._tag===`conflict`?t:e._tag===`accepted-refresh-failed`?{_tag:`failed`,draft:null,page:e.page}:{_tag:`ready`,page:e.page}),e._tag!==`conflict`&&f.current(e.page.current.suggestion))},()=>{a.signal.aborted||d.current===null||!K(d.current,i)||c({_tag:`failed`,draft:n,page:r})})},[e,s,t]),m=(0,k.useCallback)(n=>{if(e===null||s._tag!==`ready`||t.dismiss===void 0)return;let r=e,i=s.page;l.current?.abort(),u.current=!1,o(!1);let a=new AbortController;l.current=a,c({_tag:`dismissing`,page:i}),t.dismiss(r,{expectedRevisionId:i.current.revisionId,expectedSequence:i.current.sequence,reason:n},a.signal).then(e=>{a.signal.aborted||d.current===null||!K(d.current,r)||(c({_tag:`ready`,page:J(i,e)}),f.current(e.suggestion))},()=>{a.signal.aborted||d.current===null||!K(d.current,r)||c({_tag:`failed`,draft:null,page:i})})},[e,s,t]),h=(0,k.useCallback)(()=>{if(e===null||s._tag!==`ready`&&s._tag!==`conflict`||u.current||!s.page.hasMore||s.page.nextBeforeSequence===null)return;let n=e,r=s.page;l.current?.abort();let i=new AbortController;l.current=i,u.current=!0,o(!0),t.load(n,r.nextBeforeSequence,i.signal).then(e=>{i.signal.aborted||d.current===null||!K(d.current,n)||l.current===i&&(c(t=>t._tag===`ready`||t._tag===`conflict`?{...t,page:q(t.page,e)}:t),u.current=!1,o(!1))},()=>{i.signal.aborted||d.current===null||!K(d.current,n)||l.current===i&&(c(e=>e._tag===`ready`?{_tag:`failed`,draft:null,page:e.page}:e),u.current=!1,o(!1))})},[e,s,t]);return(0,k.useMemo)(()=>({dismiss:m,loadEarlier:h,loadingEarlier:a,resolveConflict:()=>c(e=>e._tag===`conflict`?{_tag:`ready`,page:e.page}:e),retry:()=>{if(s._tag!==`conflict`){if(s._tag===`failed`&&s.draft!==null&&s.page!==null){p(s.draft);return}i(e=>e+1)}},save:p,state:s}),[m,h,a,p,s])},re=e=>e._tag===`operator`?`Operator`:e.providerId,X=({canEdit:e,entityId:t,isPreviewing:n,jobId:r,onPreviewPublication:s,onSuggestionRevisionAccepted:d,onTargetSuggestion:f,revisionTransport:p=G,sessionKey:m,suggestion:h})=>{let g=ne((0,k.useMemo)(()=>({entityId:t,jobId:r,sessionKey:m,suggestionId:h.suggestionId}),[t,r,m,h.suggestionId]),p,d),[_,v]=(0,k.useState)(`history`),[x,S]=(0,k.useState)(!1),[C,w]=(0,k.useState)(!1),[T,E]=(0,k.useState)(`false-positive`),D=g.state._tag===`ready`||g.state._tag===`dismissing`||g.state._tag===`saving`||g.state._tag===`conflict`||g.state._tag===`failed`?g.state.page:null,j=g.state._tag===`saving`||g.state._tag===`conflict`||g.state._tag===`failed`?g.state.draft:null,M=D?.current,N=M===void 0?h:{...M.suggestion,state:h.state===`published`?`published`:M.suggestion.state},F=e&&N.state===`draft`&&g.state._tag!==`dismissing`,I=M?.validation._tag===`requires-revalidation`,L=g.state._tag===`loading`?`Loading the exact revision before publication.`:g.state._tag===`failed`?`Revision history is unavailable. Retry before publishing.`:I?`This technical edit needs agent revalidation before it can be posted.`:void 0,R=e=>{v(e),S(!0)};return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(P,{canPublish:F,extraActions:(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(a,{disabled:D===null,onClick:()=>R(`history`),variant:`quiet`,children:`History`}),F?(0,A.jsx)(a,{disabled:D===null,onClick:()=>R(`edit`),variant:`quiet`,children:`Edit`}):null,F?(0,A.jsx)(a,{disabled:D===null,onClick:()=>w(!0),variant:`quiet`,children:`Dismiss`}):null,F&&M!==void 0&&M.validation._tag!==`requires-revalidation`?(0,A.jsx)(a,{disabled:g.state._tag===`loading`,onClick:()=>f({expectedRevisionId:M.revisionId,expectedSequence:M.sequence,intent:`suggestion-edit`,jobId:r,suggestionId:N.suggestionId}),variant:`quiet`,children:`Ask agent to edit`}):null,e&&M?.validation._tag===`requires-revalidation`?(0,A.jsx)(a,{disabled:g.state._tag===`loading`,onClick:()=>f({expectedRevisionId:M.revisionId,expectedSequence:M.sequence,intent:`suggestion-revalidation`,jobId:r,suggestionId:N.suggestionId}),variant:`quiet`,children:`Revalidate`}):null,g.state._tag===`dismissing`?(0,A.jsx)(a,{disabled:!0,variant:`quiet`,children:`Dismissing…`}):null,g.state._tag===`failed`?(0,A.jsx)(a,{onClick:g.retry,variant:`quiet`,children:`Retry revision`}):null]}),isPreviewing:n,jobId:r,metadata:M===void 0?null:(0,A.jsxs)(`div`,{className:O.suggestionRevisionMeta,"data-validation":M.validation._tag,children:[(0,A.jsxs)(`strong`,{children:[`Revision `,String(M.sequence)]}),(0,A.jsx)(`span`,{children:M.validation._tag===`validated`?`Validated`:`Needs revalidation`}),(0,A.jsx)(`span`,{children:re(M.author)}),(0,A.jsx)(`time`,{dateTime:c(M.createdAt),children:u(M.createdAt,{dateStyle:`medium`,timeStyle:`short`})})]}),onPreviewPublication:e=>{M!==void 0&&s({...e,revisionId:M.revisionId})},...L===void 0?{}:{publicationBlockedReason:L},suggestion:N}),D===null?null:(0,A.jsx)(U,{canEdit:F,conflict:g.state._tag===`conflict`,loadEarlier:g.loadEarlier,loadingEarlier:g.loadingEarlier,mode:_,onOpenChange:S,onResolveConflict:g.resolveConflict,onSave:g.save,open:x,page:D,preservedDraft:j,saving:g.state._tag===`saving`}),(0,A.jsx)(i.Root,{onOpenChange:w,open:C,children:(0,A.jsxs)(i.Content,{description:`Dismiss this finding for the reviewed head. It will remain in revision history and will not be posted to CodeCommit.`,size:`default`,title:`Dismiss finding?`,children:[(0,A.jsx)(o,{children:`This records your decision without changing the pull request or publishing a comment.`}),(0,A.jsxs)(`label`,{children:[`Reason`,(0,A.jsxs)(`select`,{"aria-label":`Dismissal reason`,onChange:e=>{let t=l(b)(e.currentTarget.value);y(t)||E(t.success)},value:T,children:[(0,A.jsx)(`option`,{value:`false-positive`,children:`False positive`}),(0,A.jsx)(`option`,{value:`not-applicable`,children:`Not applicable`}),(0,A.jsx)(`option`,{value:`accepted-risk`,children:`Accepted risk`}),(0,A.jsx)(`option`,{value:`duplicate`,children:`Duplicate`}),(0,A.jsx)(`option`,{value:`other`,children:`Other`})]})]}),(0,A.jsxs)(`div`,{className:O.publicationActions,children:[(0,A.jsx)(i.Close,{children:`Keep finding`}),(0,A.jsx)(a,{onClick:()=>{w(!1),g.dismiss(T)},children:`Dismiss finding`})]})]})})]})},ie=e=>{switch(e){case`not-codecommit`:case`not-pull-request`:return`Agent review is available only for synchronized CodeCommit pull requests.`;case`source-stale`:return`Synchronize this pull request before reviewing its immutable head.`;case`release-unavailable`:return`Connect this pull request to a release before asking Relay to review it.`;case`base-revision-unavailable`:return`The base revision has not been synchronized, so an exact review cannot start.`}},ae=e=>{switch(e){case`changes-required`:return`Changes Required`;case`non-blocking-suggestions`:return`Non-blocking Suggestions`;case`no-issues-found`:return`No Issues Found`;case`unable-to-conclude`:return`Unable to Conclude`}},Z=e=>{let t=Math.round(e/6e4);return`${String(t)} minute${t===1?``:`s`}`},Q=e=>e.displayName??e.providerId,$=e=>`${Q(e)} review`,oe=[{label:`Correctness`,prompt:`Review correctness, regressions, error handling, and boundary conditions.`},{label:`Security`,prompt:`Review authorization, credential handling, unsafe input, and privilege boundaries.`},{label:`Tests`,prompt:`Review test coverage, failure paths, race conditions, and missing regression guardrails.`}],se=(0,k.lazy)(()=>n(()=>import(`./ReviewSuggestionPublicationSurface-DHI3AT1u.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]))),ce=e=>{switch(e._tag){case`operator-message`:return`Local Operator · ${e.prompt}`;case`run-queued`:return`${e.reviewProfile.label} · head ${e.subject.headRevision.slice(0,12)}`;case`run-started`:return e.runtimeMetadata===void 0?`Review sandbox started`:`Review sandbox started · ${e.runtimeMetadata.implementation} ${e.runtimeMetadata.version??``}`.trim();case`progress`:return e.text;case`review-report`:return`${String(e.report.suggestions.length)} suggestions · ${String(e.report.notes.length)} notes`;case`suggestion-revised`:return e.suggestionState===`dismissed`?`Suggestion revision ${String(e.sequence)} · dismissed by operator`:`Suggestion revision ${String(e.sequence)} · ${e.validationState===`validated`?`validated`:`needs revalidation`}`;case`suggestion-published`:return`Suggestion published to CodeCommit`;case`run-completed`:return`Run completed · ${e.outcome}`;case`run-failed`:return e.retryable?`Run failed · retryable`:`Run failed`;case`run-interrupted`:return`Run interrupted · Control Center restarted`;case`cancellation-requested`:return`Cancellation requested`;case`usage`:return null}},le=({canEnqueue:e,onCancelPublication:t,onCancelReview:n=()=>void 0,onExtendReviewBudget:r=()=>void 0,onLoadEarlier:s=()=>void 0,onPreviewPublication:c,onPublishSuggestion:l,onRetry:u,onStart:d,onSuggestionRevisionAccepted:f,onTargetSuggestion:p=()=>void 0,publication:g,revisionTransport:_,state:v,suggestions:y})=>{let[b,x]=(0,k.useState)(!1),[S,w]=(0,k.useState)(``),[T,E]=(0,k.useState)(null),[D,j]=(0,k.useState)(null),M=(0,k.useMemo)(()=>v._tag===`ready`?v.providerPresets??(v.provider===null?[]:[v.provider]):[],[v]),N=M.find(({providerId:e})=>e===D)??M[0]??null;(0,k.useEffect)(()=>{x(!1),w(``),E(null),j(null)},[v._tag===`idle`?null:`${v.entityId}:${v.baseRevision??``}:${v.headRevision}:${v.sessionKey}`]),(0,k.useEffect)(()=>{if(M.length===0){j(null);return}M.some(({providerId:e})=>e===D)||j(M[0]?.providerId??null)},[M,D]),(0,k.useEffect)(()=>{T===null||v._tag!==`ready`||v.action!==`failed`&&v.action===`idle`&&v.review._tag===`pending`&&(w(e=>e.trim()===T?``:e),E(null))},[v,T]);let P=(0,k.useCallback)(e=>{x(e)},[]),I=(0,k.useCallback)(()=>{N!==null&&(E(null),d(void 0,N.providerId))},[d,N]),L=(0,k.useCallback)(()=>{let e=S.trim();e.length===0||v._tag!==`ready`||v.action===`starting`||(E(e),N!==null&&d(e,N.providerId))},[d,S,N,v]),R=e=>{e.key!==`Enter`||!e.metaKey&&!e.ctrlKey||(e.preventDefault(),L())},z=g._tag===`idle`||g._tag===`previewing`?null:(0,A.jsx)(k.Suspense,{fallback:(0,A.jsx)(`span`,{children:`Preparing publication surface…`}),children:(0,A.jsx)(se,{onCancel:t,onPublish:l,publication:g})}),B=e=>(0,A.jsxs)(A.Fragment,{children:[e,z]});if(v._tag===`idle`||v._tag===`loading`)return B((0,A.jsxs)(`div`,{"aria-live":`polite`,className:O.reviewStatus,role:`status`,children:[(0,A.jsx)(`strong`,{children:`Loading review state`}),(0,A.jsx)(`span`,{children:`Checking durable review history for this exact head.`}),(0,A.jsx)(`span`,{"aria-hidden":`true`,className:O.reviewRunway})]}));if(v._tag===`failed`)return B((0,A.jsxs)(`div`,{className:O.reviewStatus,children:[(0,A.jsx)(`strong`,{children:`Review state unavailable`}),(0,A.jsx)(`span`,{children:`The current review could not be loaded. No human decision was changed.`}),(0,A.jsx)(a,{onClick:u,children:`Retry`})]}));let V=v.review,H=v.thread?.events??[],U=H.map(e=>({event:e,summary:ce(e)})).filter(e=>e.summary!==null),W=v.thread!==void 0&&(v.thread.historyLoaded||!v.thread.hasEarlier)?U:U.slice(-12),G=(0,A.jsxs)(`section`,{"aria-label":`Review thread`,className:O.reviewThread,children:[(0,A.jsxs)(`header`,{children:[(0,A.jsx)(`strong`,{children:`Review thread`}),(0,A.jsx)(`span`,{children:H.length===0?`No runs yet`:`Durable across pull-request heads`})]}),W.length===0?null:(0,A.jsx)(`ol`,{className:O.reviewThreadEvents,children:W.map(({event:e,summary:t})=>(0,A.jsx)(`li`,{children:(0,A.jsx)(`span`,{children:t})},e.eventSequence))}),v.thread?.hasEarlier?(0,A.jsx)(a,{loading:v.historyAction===`loading`,onClick:s,children:v.historyAction===`loading`?`Loading earlier activity…`:v.historyAction===`failed`?`Retry earlier activity`:`Load earlier activity`}):v.thread===void 0?null:(0,A.jsx)(o,{tone:`secondary`,variant:`meta`,children:`Beginning of review thread`}),e&&v.provider!==null&&V._tag!==`pending`&&V._tag!==`unavailable`?(0,A.jsxs)(`div`,{className:O.reviewThreadComposer,children:[(0,A.jsx)(`label`,{htmlFor:`review-thread-request`,children:`Ask Relay about this pull request`}),M.length>1?(0,A.jsx)(`div`,{"aria-label":`Targeted review agent presets`,className:O.reviewPresetList,role:`radiogroup`,children:M.map(e=>(0,A.jsxs)(`button`,{"aria-checked":e.providerId===N?.providerId,onClick:()=>j(e.providerId),role:`radio`,type:`button`,children:[(0,A.jsx)(`strong`,{children:$(e)}),(0,A.jsx)(`span`,{children:e.model})]},e.providerId))}):N===null?null:(0,A.jsxs)(`span`,{className:O.reviewSelectedPreset,children:[`Review with `,Q(N),` · `,N.model]}),(0,A.jsx)(`div`,{"aria-label":`Review prompt templates`,className:O.reviewTemplateList,children:oe.map(e=>(0,A.jsx)(a,{onClick:()=>w(e.prompt),children:e.label},e.label))}),(0,A.jsx)(`textarea`,{"aria-describedby":`review-thread-request-help review-thread-request-count`,id:`review-thread-request`,maxLength:C,onChange:e=>w(e.currentTarget.value),onKeyDown:R,placeholder:`Re-check the error handling in the connection flow…`,rows:3,value:S}),(0,A.jsxs)(`div`,{className:O.reviewThreadComposerFooter,children:[(0,A.jsx)(`span`,{id:`review-thread-request-help`,children:`Ctrl/⌘ + Enter to run`}),(0,A.jsxs)(`span`,{id:`review-thread-request-count`,children:[String(S.length),` / `,String(C)]})]}),v.action===`failed`&&T!==null?(0,A.jsx)(`span`,{role:`alert`,children:`Targeted review did not start. Your request is still here—check the provider and worker, then try again.`}):null,(0,A.jsx)(a,{disabled:v.action===`starting`||S.trim().length===0,onClick:L,children:v.action===`starting`?`Starting targeted review…`:`Start targeted review`})]}):null]}),K=e=>B((0,A.jsxs)(A.Fragment,{children:[e,G]})),q=(e,t)=>N===null?null:(0,A.jsxs)(i.Root,{onOpenChange:P,open:b,children:[(0,A.jsx)(i.Trigger,{disabled:v.action===`starting`,children:v.action===`starting`?`Starting review…`:t}),(0,A.jsx)(i.Content,{className:O.reviewLaunchDialog,description:`Relay will inspect the immutable revision in an isolated sandbox. It cannot approve or change the pull request.`,title:`Review this exact head`,children:(0,A.jsxs)(`div`,{className:O.reviewLaunchBody,children:[(0,A.jsx)(`small`,{className:O.reviewLaunchEyebrow,children:`Read-only agent run`}),M.length>1?(0,A.jsx)(`div`,{"aria-label":`Review agent presets`,className:O.reviewPresetList,role:`radiogroup`,children:M.map(e=>(0,A.jsxs)(`button`,{"aria-checked":e.providerId===N.providerId,onClick:()=>j(e.providerId),role:`radio`,type:`button`,children:[(0,A.jsx)(`strong`,{children:$(e)}),(0,A.jsx)(`span`,{children:e.model})]},e.providerId))}):null,(0,A.jsxs)(`dl`,{className:O.reviewLaunchFacts,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Exact head`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`code`,{children:e})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Review profile`}),(0,A.jsx)(`dd`,{children:N.reviewProfile.label})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Time budget`}),(0,A.jsx)(`dd`,{children:Z(N.reviewProfile.budgetMillis)})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Runtime`}),(0,A.jsx)(`dd`,{children:N.reviewProfile.networkAccess===`blocked`?`Network blocked · sbx`:`Provider connection enabled · sbx`})]})]}),(0,A.jsxs)(`div`,{className:O.reviewLaunchActions,children:[(0,A.jsx)(i.Close,{children:`Keep reading`}),(0,A.jsx)(i.Close,{onClick:I,children:`Start full review`})]})]})})]});if(V._tag===`unavailable`)return K((0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`strong`,{children:`Review unavailable`}),(0,A.jsx)(`span`,{children:ie(V.reason)})]}));if(V._tag===`pending`){let t=V.startedAt??null,i=V.budgetMillis??V.reviewProfile.budgetMillis,o=V.state===`queued`?`Review queued`:V.state===`running`?`Reviewing exact head`:`Cancellation requested`;return K((0,A.jsxs)(`div`,{"aria-live":`polite`,className:O.reviewStatus,role:`status`,children:[(0,A.jsx)(`strong`,{children:o}),(0,A.jsxs)(`span`,{children:[`Relay is using `,V.providerId,` · `,V.model,`. This page updates automatically.`]}),(0,A.jsxs)(`span`,{children:[V.reviewProfile.label,` · `,Z(V.reviewProfile.budgetMillis),` ·`,` `,V.reviewProfile.networkAccess===`blocked`?`network blocked · sbx`:`provider connection enabled · sbx`]}),(0,A.jsxs)(`dl`,{children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Elapsed`}),(0,A.jsx)(`dd`,{children:t===null?`Waiting for worker`:Z(Math.max(0,m(h())-m(t)))})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Remaining budget`}),(0,A.jsx)(`dd`,{children:Z(t===null?i:Math.max(0,i-(m(h())-m(t))))})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{children:`Current command`}),(0,A.jsx)(`dd`,{children:V.activity.events.at(-1)??`Preparing review sandbox…`})]})]}),V.activity.events.length===0?null:(0,A.jsx)(`ol`,{"aria-label":`Live review activity`,children:V.activity.events.map((e,t)=>(0,A.jsx)(`li`,{children:e},`${String(t)}:${e}`))}),V.activity.truncated?(0,A.jsx)(`span`,{children:`Earlier review activity is not shown.`}):null,e?(0,A.jsxs)(`div`,{children:[V.budgetExtensionCount===0?(0,A.jsx)(a,{onClick:r,children:`Extend review once`}):(0,A.jsx)(`span`,{children:`One budget extension used.`}),(0,A.jsx)(a,{onClick:n,children:`Cancel review`})]}):null,(0,A.jsx)(`code`,{className:O.reviewHead,children:V.subject.headRevision}),(0,A.jsx)(`span`,{"aria-hidden":`true`,className:O.reviewRunway})]}))}if(V._tag===`failed`){let t=V.report;return K((0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`strong`,{children:V.state===`cancelled`?`Review cancelled`:`Review did not finish`}),t==null?(0,A.jsx)(`span`,{children:`The failed run did not change approval or publish a recommendation.`}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(o,{children:`This review is incomplete. The retained findings were validated before the run stopped; unreviewed areas remain.`}),t.suggestions.length===0?(0,A.jsx)(`span`,{children:`No validated suggestions were retained before the run stopped.`}):(0,A.jsx)(`ol`,{className:O.reviewFindings,children:t.suggestions.map(t=>(0,A.jsx)(`li`,{children:(0,A.jsx)(X,{canEdit:e,entityId:v.entityId,isPreviewing:g._tag===`previewing`&&g.selection.suggestionId===t.suggestionId,jobId:V.jobId,onPreviewPublication:c,onTargetSuggestion:p,...f===void 0?{}:{onSuggestionRevisionAccepted:f},..._===void 0?{}:{revisionTransport:_},sessionKey:v.sessionKey,suggestion:t})},t.suggestionId))}),(0,A.jsx)(F,{notes:t.notes}),(0,A.jsx)(`span`,{children:`Retained findings remain advice only and may be published after confirmation.`})]}),e&&v.provider!==null?(0,A.jsxs)(A.Fragment,{children:[v.action===`failed`&&T===null?(0,A.jsx)(`span`,{role:`alert`,children:`A new full review could not be started. Check the provider and worker, then try again.`}):null,q(V.subject.headRevision,`Try again`)]}):null]}))}return V._tag===`interrupted`?K((0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`strong`,{children:`Review interrupted by restart`}),(0,A.jsx)(o,{children:`Control Center restarted before this run finished. The retained findings were validated before the run stopped; unreviewed areas remain.`}),V.report.suggestions.length===0?(0,A.jsx)(`span`,{children:`No validated suggestions were retained before the run stopped.`}):(0,A.jsx)(`ol`,{className:O.reviewFindings,children:V.report.suggestions.map(t=>(0,A.jsx)(`li`,{children:(0,A.jsx)(X,{canEdit:e,entityId:v.entityId,isPreviewing:g._tag===`previewing`&&g.selection.suggestionId===t.suggestionId,jobId:V.jobId,onPreviewPublication:c,onTargetSuggestion:p,...f===void 0?{}:{onSuggestionRevisionAccepted:f},..._===void 0?{}:{revisionTransport:_},sessionKey:v.sessionKey,suggestion:t})},t.suggestionId))}),(0,A.jsx)(F,{notes:V.report.notes}),(0,A.jsx)(`span`,{children:`Retained findings remain advice only and may be published after confirmation.`}),e&&v.provider!==null?(0,A.jsxs)(A.Fragment,{children:[v.action===`failed`&&T===null?(0,A.jsx)(`span`,{role:`alert`,children:`A new full review could not be started. Check the provider and worker, then try again.`}):null,q(V.subject.headRevision,`Start a new review`)]}):null]})):V._tag===`completed`?K((0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`strong`,{children:ae(V.outcome)}),V.report.completion.status===`unable-to-conclude`?(0,A.jsx)(o,{children:V.report.completion.reason}):null,(y??V.report.suggestions).length===0?(0,A.jsx)(`span`,{children:`No validated suggestions were retained for this exact head.`}):(0,A.jsx)(`ol`,{className:O.reviewFindings,children:(y??V.report.suggestions).map(t=>(0,A.jsx)(`li`,{children:(0,A.jsx)(X,{canEdit:e,entityId:v.entityId,isPreviewing:g._tag===`previewing`&&g.selection.suggestionId===t.suggestionId,jobId:V.jobId,onPreviewPublication:c,onTargetSuggestion:p,...f===void 0?{}:{onSuggestionRevisionAccepted:f},..._===void 0?{}:{revisionTransport:_},sessionKey:v.sessionKey,suggestion:t})},t.suggestionId))}),(0,A.jsx)(F,{notes:V.report.notes}),(0,A.jsx)(`span`,{children:`Agent advice only. Approve a finding to post it to CodeCommit, or dismiss it locally.`})]})):K((0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`strong`,{children:`Agent review not run`}),(0,A.jsx)(`span`,{children:`An immutable-head review produces advice, never a human approval.`}),e?v.provider===null?(0,A.jsx)(`span`,{children:`Configure an sbx Review Agent Profile with an Effect AI provider to enable review.`}):(0,A.jsx)(A.Fragment,{children:q(V.subject.headRevision,`Review exact head`)}):(0,A.jsx)(`span`,{children:`Only a workspace owner can start a review.`}),v.action===`failed`?(0,A.jsx)(`span`,{role:`alert`,children:`The review could not be started. Check provider and worker configuration, then retry.`}):null]}))};export{le as PullRequestReviewPanel,le as default};
|
|
6
|
+
//# sourceMappingURL=PullRequestReviewPanel-D1IpvHe2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../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 { 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 = (\n unifiedDiff: string\n): {\n readonly after: string\n readonly before: string\n} => {\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 Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\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 (failure: unknown) => {\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 * as DateTime from \"effect/DateTime\"\nimport { type KeyboardEvent, type ReactElement, lazy, Suspense, useCallback, useEffect, useMemo, useState } from \"react\"\n\nimport {\n MAXIMUM_REVIEW_THREAD_PROMPT_LENGTH,\n type DurableAgentProviderId,\n type DurableAgentPrompt,\n type PullRequestReviewThreadEvent\n} from \"../../api/agent.js\"\nimport type { PrReviewSuggestion } from \"../../domain/prReview.js\"\nimport { ReviewNotes } from \"./ReviewSuggestionPresentation.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 \"release-unavailable\":\n return \"Connect this pull request to a release before asking Relay to review it.\"\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 providerName = (\n provider: NonNullable<Extract<PullRequestReviewControllerState, { readonly _tag: \"ready\" }>[\"provider\"]>\n): string => provider.displayName ?? provider.providerId\n\nconst providerReviewLabel = (provider: Parameters<typeof providerName>[0]): string => `${providerName(provider)} review`\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 ReviewSuggestionPublicationSurface = lazy(() => import(\"./ReviewSuggestionPublicationSurface.js\"))\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 event.retryable ? \"Run failed · retryable\" : \"Run failed\"\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 [submittedRequest, setSubmittedRequest] = useState<string | null>(null)\n const [selectedProviderId, setSelectedProviderId] = useState<DurableAgentProviderId | null>(null)\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 requestScope =\n state._tag === \"idle\"\n ? null\n : `${state.entityId}:${state.baseRevision ?? \"\"}:${state.headRevision}:${state.sessionKey}`\n useEffect(() => {\n setLaunchOpen(false)\n setRequest(\"\")\n setSubmittedRequest(null)\n setSelectedProviderId(null)\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 useEffect(() => {\n if (submittedRequest === null || state._tag !== \"ready\") return\n if (state.action === \"failed\") return\n if (state.action === \"idle\" && state.review._tag === \"pending\") {\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 (prompt.length === 0 || state._tag !== \"ready\" || state.action === \"starting\") return\n setSubmittedRequest(prompt)\n if (selectedProvider === null) return\n onStart(prompt, selectedProvider.providerId)\n }, [onStart, request, selectedProvider, state])\n const handleComposerKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>): void => {\n if (event.key !== \"Enter\" || (!event.metaKey && !event.ctrlKey)) return\n event.preventDefault()\n submitTargetedReview()\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 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 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 {visibleThreadEvents.length === 0 ? null : (\n <ol className={styles.reviewThreadEvents}>\n {visibleThreadEvents.map(({ event, summary }) => (\n <li key={event.eventSequence}>\n <span>{summary}</span>\n </li>\n ))}\n </ol>\n )}\n {state.thread?.hasEarlier ? (\n <Button loading={state.historyAction === \"loading\"} onClick={onLoadEarlier}>\n {state.historyAction === \"loading\"\n ? \"Loading earlier activity…\"\n : state.historyAction === \"failed\"\n ? \"Retry earlier activity\"\n : \"Load earlier activity\"}\n </Button>\n ) : state.thread !== undefined ? (\n <Text tone=\"secondary\" variant=\"meta\">\n Beginning of review thread\n </Text>\n ) : null}\n {canEnqueue && state.provider !== null && review._tag !== \"pending\" && review._tag !== \"unavailable\" ? (\n <div className={styles.reviewThreadComposer}>\n <label htmlFor=\"review-thread-request\">Ask Relay about this pull request</label>\n {providerPresets.length > 1 ? (\n <div aria-label=\"Targeted review agent presets\" className={styles.reviewPresetList} role=\"radiogroup\">\n {providerPresets.map((preset) => (\n <button\n aria-checked={preset.providerId === selectedProvider?.providerId}\n key={preset.providerId}\n onClick={() => setSelectedProviderId(preset.providerId)}\n role=\"radio\"\n type=\"button\"\n >\n <strong>{providerReviewLabel(preset)}</strong>\n <span>{preset.model}</span>\n </button>\n ))}\n </div>\n ) : selectedProvider === null ? null : (\n <span className={styles.reviewSelectedPreset}>\n Review with {providerName(selectedProvider)} · {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={() => setRequest(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 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={state.action === \"starting\" || request.trim().length === 0} onClick={submitTargetedReview}>\n {state.action === \"starting\" ? \"Starting targeted review…\" : \"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): 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=\"Relay will inspect the immutable revision in an isolated sandbox. It cannot approve or change the pull request.\"\n title=\"Review this exact head\"\n >\n <div className={styles.reviewLaunchBody}>\n <small className={styles.reviewLaunchEyebrow}>Read-only agent run</small>\n {providerPresets.length > 1 ? (\n <div aria-label=\"Review agent presets\" className={styles.reviewPresetList} role=\"radiogroup\">\n {providerPresets.map((preset) => (\n <button\n aria-checked={preset.providerId === selectedProvider.providerId}\n key={preset.providerId}\n onClick={() => setSelectedProviderId(preset.providerId)}\n role=\"radio\"\n type=\"button\"\n >\n <strong>{providerReviewLabel(preset)}</strong>\n <span>{preset.model}</span>\n </button>\n ))}\n </div>\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>Review profile</dt>\n <dd>{selectedProvider.reviewProfile.label}</dd>\n </div>\n <div>\n <dt>Time budget</dt>\n <dd>{formatBudget(selectedProvider.reviewProfile.budgetMillis)}</dd>\n </div>\n <div>\n <dt>Runtime</dt>\n <dd>\n {selectedProvider.reviewProfile.networkAccess === \"blocked\"\n ? \"Network blocked · sbx\"\n : \"Provider connection enabled · sbx\"}\n </dd>\n </div>\n </dl>\n <div className={styles.reviewLaunchActions}>\n <Dialog.Close>Keep reading</Dialog.Close>\n <Dialog.Close onClick={submitFullReview}>Start full 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 Relay is using {review.providerId} · {review.model}. This page updates automatically.\n </span>\n <span>\n {review.reviewProfile.label} · {formatBudget(review.reviewProfile.budgetMillis)} ·{\" \"}\n {review.reviewProfile.networkAccess === \"blocked\"\n ? \"network blocked · sbx\"\n : \"provider connection enabled · sbx\"}\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 command</dt>\n <dd>{review.activity.events.at(-1) ?? \"Preparing review 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}>Extend review once</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 === \"failed\") {\n const report = review.report\n return withThread(\n <>\n <strong>{review.state === \"cancelled\" ? \"Review cancelled\" : \"Review did not finish\"}</strong>\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 {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(review.subject.headRevision, \"Try again\")}\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 {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 {(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. Approve 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>Configure an sbx Review Agent Profile with an Effect AI provider to enable review.</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-D1IpvHe2.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{f as n,m as r,o as i,p as a,t as o,u as s}from"./lib-BzlsKFNV.js";import{t as c}from"./jsx-runtime-By8HlURe.js";import{a as l,n as u,r as d,t as f}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{a as p,i as m,n as h,r as g,s as _,t as v}from"./releasePaths-XoI2BHX3.js";import{d as y}from"./index-zVjlBm9l.js";import{_ as b,d as x,g as S,i as C,l as w,o as T,s as E,t as D,v as ee}from"./patterns-5N-j-AD2-DLfaGePK.js";import{n as O,r as k,t as te}from"./primitives-nKxQGSsE-CJNmac__.js";import{Kn as ne,Pr as re,Rr as ie,_i as A,ai as j,an as ae,in as oe,ja as se,pi as M}from"./agent-api-Dl9TuGOJ.js";import{a as N,t as P}from"./client-Dq_XQE_l.js";import{n as ce,t as le}from"./BrowserCrypto-3BoTVFdl.js";import{a as ue,c as de,l as fe,n as pe,s as me}from"./releaseRoutes-B4ciNOJj.js";import{PortfolioOverviewView as he}from"./PortfolioOverview-CEUHJmGC.js";import{t as F}from"./authenticatedMutationClient-DdowMjyo.js";import{r as I,t as L}from"./ReleaseWorkset-BclY0Nvj.js";import{n as R,t as ge}from"./useCompactReleasePreview-BBBQ2fKX.js";var z=e(t(),1),_e=j(function*(){let e=yield*(yield*ce).randomUUIDv7;return yield*ne(oe)(e)}),ve={create:(e,t,n,r)=>A(j(function*(){return yield*(yield*F).deliveryGraph.createRepairProposal({params:{releaseId:e,relationshipId:t.precondition.relationshipId},payload:{proposalId:n,environmentId:t.candidate.impact.environmentId,expectedRevision:t.precondition.expectedRevision,disposition:t.proposal.disposition,rationale:t.proposal.rationale}})}).pipe(M(N)),{signal:r}),draft:(e,t,n,r,i)=>A(j(function*(){return yield*(yield*P()).deliveryGraph.repairProposalDraft({params:{releaseId:e,relationshipId:n},query:t===null?{revision:r}:{environmentId:t,revision:r}})}).pipe(M(N)),{signal:i}),list:(e,t,n)=>A(j(function*(){return yield*(yield*P()).deliveryGraph.repairCandidates({params:{releaseId:e},query:t===null?{}:{environmentId:t}})}).pipe(M(N)),{signal:n}),makeProposalId:()=>A(_e.pipe(M(le)))},B={candidates:`_candidates_nbx6f_1`,draft:`_draft_nbx6f_2`,candidateHeader:`_candidateHeader_nbx6f_10`,draftHeader:`_draftHeader_nbx6f_11`,actions:`_actions_nbx6f_12`,candidate:`_candidate_nbx6f_1`,"reveal-draft":`_reveal-draft_nbx6f_1`},V=c(),H=e=>e.replaceAll(`-`,` `),ye=e=>`${H(e.relationship.sourceNodeKind)} → ${H(e.relationship.targetNodeKind)}`,U=(e,t)=>{let n=new Set,r=[];for(let e of t.flatMap(e=>e.candidates)){let t=`${e.relationship.relationshipId}:${e.relationship.revision}`;n.has(t)||(n.add(t),r.push(e))}return{releaseId:e,environmentId:null,truncated:t.some(({truncated:e})=>e)||r.length>500,candidates:r.slice(0,500)}},W=({announce:e=!1,children:t,stateTag:n})=>{let r=(0,z.useRef)(null);return(0,z.useEffect)(()=>r.current?.focus(),[n]),(0,V.jsx)(`div`,{"aria-live":e?`polite`:void 0,ref:r,role:e?`status`:void 0,tabIndex:-1,children:t})},be=({environmentIds:e,onCreated:t,releaseId:n,session:r,transport:i=ve})=>{let[a,o]=(0,z.useState)({_tag:`idle`}),s=(0,z.useRef)(null),c=r.actor._tag===`human`?r.actor.personId:r.actor.agentId;if((0,z.useEffect)(()=>(s.current?.abort(),s.current=null,o({_tag:`idle`}),()=>s.current?.abort()),[`${r.sessionId}:${r.workspaceId}:${r.permission}:${r.actor._tag}:${c}`,e.join(`:`),n]),r.permission!==`workspace-owner`)return null;let l=async(e,t,n)=>{s.current?.abort();let r=new AbortController;s.current=r;try{let n=await e(r.signal);!r.signal.aborted&&s.current===r&&t(n)}catch{!r.signal.aborted&&s.current===r&&n()}finally{s.current===r&&(s.current=null)}},p=()=>{o({_tag:`loading`}),l(t=>I(e,e=>i.list(n,e,t)),e=>o({_tag:`ready`,page:U(n,e)}),()=>o({_tag:`load-failed`}))},m=(e,t)=>{o({_tag:`drafting`,page:t}),l(t=>i.draft(n,e.impact.environmentId,e.relationship.relationshipId,e.relationship.revision,t),e=>o({_tag:`draft`,draft:e,page:t}),()=>o({_tag:`draft-failed`,candidate:e,page:t}))},h=t=>{o({_tag:`loading`}),l(t=>I(e,e=>i.list(n,e,t)),e=>{let r=U(n,e),i=r.candidates.find(e=>e.relationship.relationshipId===t.relationship.relationshipId);if(i===void 0){o({_tag:`ready`,page:r});return}m(i,r)},()=>o({_tag:`load-failed`}))},g=(e,r,a=null)=>{s.current?.abort();let c=new AbortController;s.current=c,o({_tag:`creating`,draft:e,page:r,proposalId:a}),(async()=>{let l=a;try{if(l??=await i.makeProposalId(),c.signal.aborted||s.current!==c||(o({_tag:`creating`,draft:e,page:r,proposalId:l}),await i.create(n,e,l,c.signal),c.signal.aborted||s.current!==c))return;o({_tag:`created`}),t()}catch{!c.signal.aborted&&s.current===c&&o({_tag:`create-failed`,draft:e,page:r,proposalId:l})}finally{s.current===c&&(s.current=null)}})()};if(a._tag===`idle`)return(0,V.jsx)(f,{onClick:p,children:`Find repair candidates`});if(a._tag===`loading`)return(0,V.jsx)(W,{announce:!0,stateTag:a._tag,children:(0,V.jsx)(k,{tone:`secondary`,children:`Finding incomplete relationships…`})});if(a._tag===`load-failed`)return(0,V.jsx)(W,{stateTag:a._tag,children:(0,V.jsx)(u,{action:(0,V.jsx)(f,{onClick:p,children:`Try again`}),announce:`assertive`,description:`Candidate discovery did not change the release.`,title:`Could not find candidates`,tone:`caution`})});if(a._tag===`created`)return(0,V.jsx)(W,{announce:!0,stateTag:a._tag,children:(0,V.jsx)(d,{label:`Proposal created`,tone:`positive`})});if(a._tag===`drafting`)return(0,V.jsx)(W,{announce:!0,stateTag:a._tag,children:(0,V.jsx)(k,{tone:`secondary`,children:`Preparing an exact proposal…`})});if(a._tag===`draft-failed`)return(0,V.jsx)(W,{stateTag:a._tag,children:(0,V.jsx)(u,{action:(0,V.jsx)(f,{onClick:()=>h(a.candidate),children:`Refresh candidate`}),announce:`assertive`,description:`The relationship may have changed since discovery.`,title:`Candidate is stale`,tone:`caution`})});if(a._tag===`draft`||a._tag===`creating`||a._tag===`create-failed`){let e=a._tag===`creating`;return(0,V.jsx)(W,{announce:e,stateTag:a._tag,children:(0,V.jsxs)(O,{as:`section`,className:B.draft,padding:`none`,tone:`secondary`,children:[(0,V.jsxs)(`div`,{className:B.draftHeader,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsxs)(k,{as:`h4`,variant:`card-title`,children:[H(a.draft.proposal.disposition),` relationship`]}),(0,V.jsxs)(k,{tone:`tertiary`,variant:`meta`,children:[`r`,a.draft.precondition.expectedRevision,` → r`,a.draft.precondition.expectedRevision+1]})]}),(0,V.jsx)(d,{label:`Proposal preview`,size:`compact`,tone:`neutral`})]}),(0,V.jsx)(k,{children:a.draft.proposal.rationale}),a._tag===`create-failed`?(0,V.jsx)(k,{role:`alert`,tone:`secondary`,children:`The relationship changed or the proposal was not recorded. Refresh the candidate before retrying.`}):null,(0,V.jsxs)(`div`,{className:B.actions,children:[(0,V.jsx)(f,{disabled:e,onClick:()=>o({_tag:`ready`,page:a.page}),variant:`quiet`,children:`Back`}),(0,V.jsx)(f,{loading:e,onClick:()=>g(a.draft,a.page,a._tag===`create-failed`?a.proposalId:null),variant:`primary`,children:`Create proposal`})]})]})})}return a.page.candidates.length===0?(0,V.jsx)(W,{announce:!0,stateTag:a._tag,children:(0,V.jsx)(k,{tone:`secondary`,children:`No incomplete relationships need an owner decision.`})}):(0,V.jsx)(W,{stateTag:a._tag,children:(0,V.jsxs)(`div`,{className:B.candidates,children:[(0,V.jsxs)(`div`,{className:B.candidateHeader,children:[(0,V.jsxs)(k,{tone:`secondary`,children:[a.page.candidates.length,a.page.truncated?`+`:``,` incomplete relationship`,a.page.candidates.length===1?``:`s`]}),(0,V.jsx)(f,{onClick:()=>o({_tag:`idle`}),variant:`quiet`,children:`Close`})]}),a.page.candidates.map(e=>(0,V.jsxs)(`button`,{className:B.candidate,onClick:()=>m(e,a.page),type:`button`,children:[(0,V.jsxs)(`span`,{children:[(0,V.jsx)(`strong`,{children:ye(e)}),(0,V.jsx)(`small`,{children:e.explanation})]}),(0,V.jsx)(`span`,{"aria-hidden":`true`,children:`→`})]},e.relationship.relationshipId))]})})},xe=j(function*(){let e=yield*(yield*ce).randomUUIDv7;return yield*ne(ae)(e)}),Se={apply:(e,t)=>A(j(function*(){return yield*(yield*F).deliveryGraph.applyRepairProposal({params:{proposalId:e}})}).pipe(M(N)),{signal:t}),list:(e,t,n)=>A(j(function*(){return yield*(yield*P()).deliveryGraph.listRepairProposals({params:{releaseId:e},query:t===null?{}:{environmentId:t}})}).pipe(M(N)),{signal:n}),makeReviewId:()=>A(xe.pipe(M(le))),review:(e,t,n,r,i)=>A(j(function*(){return yield*(yield*F).deliveryGraph.reviewRepairProposal({params:{proposalId:e},payload:{reviewId:t,decision:n,rationale:r}})}).pipe(M(N)),{signal:i})},Ce=se(`UnauthorizedApiError`),we=()=>void 0,Te=(e,t)=>{let n=re(t.proposedAt,e.proposedAt);return n===0?t.proposalId.localeCompare(e.proposalId):n},Ee=(e,t)=>{let n=new Map,r=new Map;for(let e of t){for(let t of e.proposals)n.set(t.proposalId,t);for(let t of e.applications)r.set(t.proposalId,t)}let i=[...n.values()].sort(Te),a=i.slice(0,128),o=a.flatMap(e=>{let t=r.get(e.proposalId);return t===void 0?[]:[t]});return{releaseId:e,environmentId:null,status:null,truncated:t.some(({truncated:e})=>e)||i.length>128,proposals:a,applications:o}},De=(e,t,n,r=Se,i=we)=>{let[a,o]=(0,z.useState)(0),[s,c]=(0,z.useState)({_tag:`idle`}),l=(0,z.useRef)(null),u=(0,z.useRef)(null),d=(0,z.useRef)(new Map),f=(0,z.useRef)(s),p=t.join(`:`);(0,z.useEffect)(()=>{if(l.current?.abort(),l.current=null,u.current=null,d.current.clear(),n===null){c({_tag:`idle`});return}let a=new AbortController;return c({_tag:`loading`}),I(t,t=>r.list(e,t,a.signal)).then(t=>{if(!a.signal.aborted){let r=Ee(e,t);c({_tag:`ready`,actionFailure:null,applications:new Map(r.applications.map(e=>[e.proposalId,e])),busyProposalId:null,environmentScopeKey:p,page:r,releaseId:e,sessionKey:n})}},e=>{a.signal.aborted||(Ce(e)&&i(n),c({_tag:`failed`}))}),()=>a.abort()},[p,i,e,a,n,r]),(0,z.useEffect)(()=>()=>l.current?.abort(),[]);let m=s._tag===`ready`&&(s.environmentScopeKey!==p||s.releaseId!==e||s.sessionKey!==n)?{_tag:`loading`}:s;f.current=m;let h=(0,z.useCallback)(e=>{if(f.current._tag!==`ready`||u.current!==null)return null;let t=new AbortController;return u.current=e,l.current?.abort(),l.current=t,c(t=>t._tag===`ready`?{...t,actionFailure:null,busyProposalId:e}:t),t},[]),g=(0,z.useCallback)(e=>l.current===e?(l.current=null,u.current=null,!0):!1,[]),_=(0,z.useCallback)(async(e,t,n)=>{let i=h(e);if(i===null)return!1;try{let a=d.current.get(e),o=a?.decision===t&&a.rationale===n?a:{decision:t,rationale:n,reviewId:await r.makeReviewId()};d.current.set(e,o);let s=await r.review(e,o.reviewId,t,n,i.signal);return!g(i)||i.signal.aborted?!1:(d.current.delete(e),c(t=>t._tag!==`ready`||i.signal.aborted?t:{...t,busyProposalId:null,page:{...t.page,proposals:t.page.proposals.map(t=>t.proposalId===e?s:t)}}),!0)}catch{return!i.signal.aborted&&g(i)&&c(t=>t._tag===`ready`?{...t,actionFailure:e,busyProposalId:null}:t),!1}},[h,g,r]);return{apply:(0,z.useCallback)(async e=>{let t=h(e);if(t===null)return!1;try{let n=await r.apply(e,t.signal);return!g(t)||t.signal.aborted?!1:(c(r=>{if(r._tag!==`ready`||t.signal.aborted)return r;let i=new Map(r.applications);return i.set(e,n.application),{...r,applications:i,busyProposalId:null}}),!0)}catch{return!t.signal.aborted&&g(t)&&c(t=>t._tag===`ready`?{...t,actionFailure:e,busyProposalId:null}:t),!1}},[h,g,r]),retry:(0,z.useCallback)(()=>o(e=>e+1),[]),review:_,state:m}},G={root:`_root_1x4wx_1`,ledger:`_ledger_1x4wx_2`,proposal:`_proposal_1x4wx_3`,proposalHeader:`_proposalHeader_1x4wx_4`,decision:`_decision_1x4wx_5`,reviewEvidence:`_reviewEvidence_1x4wx_6`,reviewForm:`_reviewForm_1x4wx_7`,loading:`_loading_1x4wx_8`,panelStack:`_panelStack_1x4wx_9`,header:`_header_1x4wx_26`,peopleTrace:`_peopleTrace_1x4wx_28`,actions:`_actions_1x4wx_29`,agentIdentity:`_agentIdentity_1x4wx_30`,rationale:`_rationale_1x4wx_80`,traceArrow:`_traceArrow_1x4wx_89`,agentGlyph:`_agentGlyph_1x4wx_98`,actionFailure:`_actionFailure_1x4wx_134`,status:`_status_1x4wx_138`,srOnly:`_srOnly_1x4wx_142`,"reveal-review":`_reveal-review_1x4wx_1`},Oe=()=>void 0,ke=e=>e.slice(-6),Ae=(e,t)=>e._tag===t._tag&&(e._tag===`human`?t._tag===`human`&&e.personId===t.personId:t._tag===`agent`&&e.agentId===t.agentId),je=(e,t,n)=>{let r=t.collaborators.find(({id:t})=>t.startsWith(`${e.personId}:`));return r===void 0?{id:e.personId,name:`Person ${ke(e.personId)}`,role:n}:{...r,role:n}},K=({actor:e,release:t,role:n})=>e._tag===`human`?(0,V.jsx)(T,{person:je(e,t,n),size:`compact`}):(0,V.jsxs)(`div`,{className:G.agentIdentity,children:[(0,V.jsx)(`span`,{"aria-hidden":`true`,className:G.agentGlyph,children:`✦`}),(0,V.jsxs)(`span`,{children:[(0,V.jsxs)(`strong`,{children:[`Agent `,ke(e.agentId)]}),(0,V.jsx)(`small`,{children:n})]})]}),Me=(e,t)=>{if(t!==void 0)return{label:`Applied · r${t.appliedRevision}`,tone:`positive`};switch(e.status){case`pending`:return{label:`Needs review`,tone:`caution`};case`approved`:return{label:`Ready to apply`,tone:`positive`};case`rejected`:return{label:`Rejected`,tone:`critical`}}},q=e=>ie(e,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`}),Ne=({actionFailed:e,application:t,isBusy:n,isGloballyBusy:r,mutationsEnabled:i,onApply:a,onRetry:o,onReview:s,proposal:c,release:l,session:p})=>{let[m,h]=(0,z.useState)(!1),[g,_]=(0,z.useState)(``),[v,y]=(0,z.useState)(null),b=(0,z.useRef)(null),x=Me(c,t),S=i&&c.status===`pending`&&(p.permission===`workspace-owner`||p.permission===`workspace-approver`)&&!Ae(c.origin.actor,p.actor),C=i&&c.status===`approved`&&t===void 0&&p.permission===`workspace-owner`,w=g.trim(),T=async e=>{w.length!==0&&await s(c.proposalId,e,w)&&(h(!1),_(``),y(e===`approved`?`Proposal approved.`:`Proposal rejected.`))},E=async()=>{await a(c.proposalId)&&y(`Repair applied.`)};return(0,z.useEffect)(()=>{v!==null&&b.current?.focus()},[v]),(0,V.jsxs)(O,{as:`article`,className:G.proposal,padding:`none`,tone:`secondary`,children:[(0,V.jsxs)(`header`,{className:G.proposalHeader,children:[(0,V.jsxs)(`div`,{className:G.decision,children:[(0,V.jsxs)(`strong`,{children:[c.disposition[0]?.toLocaleUpperCase(`en-US`),c.disposition.slice(1)]}),(0,V.jsxs)(`code`,{children:[`r`,c.expectedRevision,` → r`,c.expectedRevision+1]})]}),(0,V.jsxs)(`div`,{className:G.status,ref:b,tabIndex:v===null?void 0:-1,children:[(0,V.jsx)(d,{label:x.label,size:`compact`,tone:x.tone}),(0,V.jsx)(`span`,{"aria-live":`polite`,className:G.srOnly,children:v??``})]})]}),(0,V.jsx)(k,{className:G.rationale,variant:`body-large`,children:c.rationale}),(0,V.jsxs)(`div`,{className:G.peopleTrace,children:[(0,V.jsx)(K,{actor:c.origin.actor,release:l,role:`Proposed · ${q(c.proposedAt)}`}),c.review===null?null:(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{"aria-hidden":`true`,className:G.traceArrow,children:`→`}),(0,V.jsx)(K,{actor:c.review.origin.actor,release:l,role:`${c.review.decision===`approved`?`Approved`:`Rejected`} · ${q(c.review.reviewedAt)}`})]}),t===void 0?null:(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{"aria-hidden":`true`,className:G.traceArrow,children:`→`}),(0,V.jsx)(K,{actor:t.origin.actor,release:l,role:`Applied revision ${t.appliedRevision} · ${q(t.appliedAt)}`})]})]}),c.review===null?null:(0,V.jsxs)(`div`,{className:G.reviewEvidence,children:[(0,V.jsx)(k,{as:`strong`,variant:`label`,children:`Review note`}),(0,V.jsx)(k,{tone:`secondary`,children:c.review.rationale})]}),e?(0,V.jsx)(u,{action:(0,V.jsx)(f,{onClick:o,children:`Reload decisions`}),announce:`assertive`,className:G.actionFailure,description:`The proposal may have changed. Reload the release decisions before trying again.`,title:`Action not recorded`,tone:`caution`}):null,m&&S?(0,V.jsxs)(`form`,{className:G.reviewForm,onSubmit:e=>e.preventDefault(),children:[(0,V.jsx)(te,{description:`Stored with the immutable decision.`,label:`Review note`,required:!0,children:e=>(0,V.jsx)(`textarea`,{...e,autoFocus:!0,maxLength:1e3,onChange:e=>_(e.currentTarget.value),value:g})}),(0,V.jsxs)(`div`,{className:G.actions,children:[(0,V.jsx)(f,{disabled:w.length===0||r,loading:n,onClick:()=>void T(`rejected`),variant:`quiet`,children:`Reject`}),(0,V.jsx)(f,{disabled:w.length===0||r,loading:n,onClick:()=>void T(`approved`),variant:`primary`,children:`Approve`})]})]}):(0,V.jsxs)(`div`,{className:G.actions,children:[S?(0,V.jsx)(f,{disabled:r,onClick:()=>h(!0),children:`Review proposal`}):null,C?(0,V.jsx)(f,{disabled:r&&!n,loading:n,onClick:()=>void E(),variant:`primary`,children:`Apply repair`}):null,c.status===`pending`&&Ae(c.origin.actor,p.actor)?(0,V.jsx)(k,{tone:`tertiary`,variant:`meta`,children:`Another owner or approver must review.`}):null]})]})},Pe=()=>(0,V.jsxs)(`div`,{"aria-label":`Loading release decisions`,className:G.loading,role:`status`,children:[(0,V.jsx)(l,{decorative:!1,height:`1.5rem`,label:`Loading release decisions`,width:`12rem`}),(0,V.jsx)(l,{decorative:!0,height:`11rem`,variant:`block`})]}),Fe=({mutationsEnabled:e,onApply:t,onRetry:n,onReview:r,release:i,session:a,state:o})=>o._tag===`idle`||o._tag===`loading`?(0,V.jsx)(Pe,{}):o._tag===`failed`?(0,V.jsx)(u,{action:(0,V.jsx)(f,{onClick:n,children:`Try again`}),description:`Control Center could not read the governed decisions for this release.`,title:`Release decisions unavailable`,tone:`caution`}):o.page.proposals.length===0?(0,V.jsx)(u,{description:`No relationship repair is waiting for review or application.`,title:`No repair decisions`}):(0,V.jsxs)(`div`,{className:G.root,children:[(0,V.jsxs)(`header`,{className:G.header,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsx)(k,{as:`h3`,variant:`card-title`,children:`Repair decisions`}),(0,V.jsx)(k,{tone:`secondary`,children:`One compact ledger from proposal to human decision to applied revision.`})]}),(0,V.jsx)(d,{label:`${o.page.proposals.length}${o.page.truncated?`+`:``} decision${o.page.proposals.length===1?``:`s`}`,size:`compact`,tone:`neutral`})]}),(0,V.jsx)(`div`,{className:G.ledger,children:o.page.proposals.map(s=>(0,V.jsx)(Ne,{actionFailed:o.actionFailure===s.proposalId,application:o.applications.get(s.proposalId),isBusy:o.busyProposalId===s.proposalId,isGloballyBusy:o.busyProposalId!==null,mutationsEnabled:e,onApply:t,onRetry:n,onReview:r,proposal:s,release:i,session:a},s.proposalId))})]}),Ie=e=>{let t=e.actor._tag===`human`?e.actor.personId:e.actor.agentId;return`${e.sessionId}:${e.workspaceId}:${e.permission}:${e.actor._tag}:${t}`},Le=e=>{switch(e._tag){case`authenticated`:return{mutationsEnabled:!0,session:e.session};case`storage-unavailable`:return{mutationsEnabled:!1,session:e.session};case`anonymous`:case`blocked`:case`checking`:case`unavailable`:return{mutationsEnabled:!1,session:null}}},Re=({browserSessionState:e,onSessionExpired:t=Oe,release:n,transport:r})=>{let i=Le(e),a=De(n.id,n.targetEnvironmentIds,i.session?.sessionId??null,r,t);return i.session===null?(0,V.jsx)(Pe,{}):(0,V.jsxs)(`div`,{className:G.panelStack,children:[(0,V.jsx)(Fe,{mutationsEnabled:i.mutationsEnabled,onApply:a.apply,onRetry:a.retry,onReview:a.review,release:n,session:i.session,state:a.state}),i.mutationsEnabled?(0,V.jsx)(be,{environmentIds:n.targetEnvironmentIds,onCreated:a.retry,releaseId:n.id,session:i.session},`${n.id}:${n.targetEnvironmentIds.join(`:`)}:${Ie(i.session)}`):null]})},ze=({release:e})=>{let t=y();return(0,V.jsx)(Re,{browserSessionState:t.state,onSessionExpired:t.invalidateSession,release:e})},J={state:`_state_1mg2y_1`,back:`_back_1mg2y_8`,releaseAction:`_releaseAction_1mg2y_9`,previewDetails:`_previewDetails_1mg2y_33`,evidence:`_evidence_1mg2y_34`,full:`_full_1mg2y_35`,fullHeader:`_fullHeader_1mg2y_36`,fullTitle:`_fullTitle_1mg2y_37`,section:`_section_1mg2y_38`,evidenceHeading:`_evidenceHeading_1mg2y_47`,fullIdentity:`_fullIdentity_1mg2y_48`},Be=(e,t)=>{let n=pe(t);if(n===null||e.controller.state._tag!==`ready`)return null;let r=e.controller.state.portfolio.releases.find(e=>e.id===n);return r===void 0?null:{release:r,releaseId:n}},Ve=({workspaceId:e})=>{let t=(0,z.useRef)(null);return(0,z.useEffect)(()=>t.current?.focus(),[]),(0,V.jsx)(`section`,{className:J.state,"data-release-not-found":``,ref:t,tabIndex:-1,children:(0,V.jsx)(u,{action:(0,V.jsx)(o,{to:m(e),children:`Return to workspace overview`}),description:`This release does not exist in the current workspace snapshot. It may have been removed or the address may be incorrect.`,title:`Release not found`})})},Y=({context:e})=>{let t=(0,z.useRef)(null);return(0,z.useEffect)(()=>t.current?.querySelector(`#portfolio-title`)?.focus(),[]),(0,V.jsx)(`div`,{ref:t,children:(0,V.jsx)(he,{onPreviewRelease:()=>void 0,onRetry:e.controller.onRetry,state:e.controller.state})})},X=({release:e})=>{let t=a(),n=s(),r=(()=>{switch(e.readinessVerdict){case`blocked`:return{label:`Review blocker`,to:v(t.workspaceId,e.id)};case`held`:return{label:`Repair missing links`,to:`${g(t.workspaceId,e.id)}#release-work`};case`ready`:return{label:`Review ship evidence`,to:`${g(t.workspaceId,e.id)}#release-evidence`};case`deploying`:return{label:`Open deployment`,to:`${g(t.workspaceId,e.id)}#release-work`};case`building`:return{label:`Open build`,to:`${g(t.workspaceId,e.id)}#release-work`};case`shipped`:return{label:`View release record`,to:`${g(t.workspaceId,e.id)}#release-evidence`};case`unknown`:return null}})();return r===null?(0,V.jsx)(f,{disabled:!0,size:`principal`,stretch:!0,variant:`primary`,children:`Readiness evidence required`}):(0,V.jsx)(o,{className:J.releaseAction,state:n.state,to:r.to,children:r.label})},Z=({release:e})=>(0,V.jsxs)(O,{as:`section`,className:J.evidence,padding:`compact`,tone:`secondary`,children:[(0,V.jsxs)(`div`,{className:J.evidenceHeading,children:[e.source.service===null?null:(0,V.jsx)(ee,{service:e.source.service}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(k,{as:`h2`,variant:`card-title`,children:e.source.displayName}),(0,V.jsx)(k,{tone:`secondary`,variant:`meta`,children:`Source evidence`})]})]}),(0,V.jsx)(d,{label:e.source.healthLabel,size:`compact`,tone:e.source.healthTone}),e.source.warning===null?(0,V.jsx)(k,{tone:`secondary`,children:`Detailed evidence is not evaluated in the tracer snapshot.`}):(0,V.jsx)(k,{tone:`secondary`,children:e.source.warning})]}),He=e=>`${e.serviceName} · ${e.version} · ${e.relay.codename} · ${e.id}`,Q=({release:e})=>{let t=a(),r=s(),i=n(),o=R();return(0,V.jsx)(b,{actionLabel:`Ask about this release`,agentName:`Relay`,context:He(e),onClick:()=>i(h(t.workspaceId,e.id),{state:r.state,viewTransition:!o})})},$=({release:e})=>e.collaborators.length===0?(0,V.jsx)(u,{description:`Assign an owner or approver before a governed release action can proceed.`,title:`No release collaborators assigned`}):(0,V.jsx)(S,{"aria-label":`All ${e.serviceName} release collaborators`,expanded:!0,limit:e.collaborators.length,onExpandedChange:()=>void 0,people:e.collaborators}),Ue=({selection:e})=>{let t=a(),r=ge(),o=R(),c=s(),l=n(),[u,d]=(0,z.useState)(null),[f,m]=(0,z.useState)(!0),_=fe(c.state,t.workspaceId,e.releaseId),v=me(_.origin),y=g(t.workspaceId,e.releaseId),b=h(t.workspaceId,e.releaseId),x=i(p(t.workspaceId,e.releaseId)),S=i(y),C=i(b),T=x||S||C?de(e.releaseId):void 0;(0,z.useEffect)(()=>{f||u===null||l(v,{replace:!0})},[t.workspaceId,u,f,l,v,e.releaseId]);let D=()=>{t.requestReleaseFocus(e.releaseId),d(`origin`),m(!1)};return(0,V.jsx)(w,{agentEntry:(0,V.jsx)(Q,{release:e.release}),collaborators:(0,V.jsx)($,{release:e.release}),entryMotion:_.isStored?`external`:`intrinsic`,evidence:(0,V.jsx)(Z,{release:e.release}),onOpenChange:e=>{e||D()},onOpenFullView:()=>l(y,{state:c.state,viewTransition:!o}),open:f,openFullViewLabel:`Open ${e.release.relay.codename} full view`,presentation:r?`sheet`:`dialog`,primaryAction:(0,V.jsx)(X,{release:e.release}),release:e.release.release,stages:(0,V.jsx)(E,{heading:`Release stages`,stages:e.release.stages}),...T===void 0?{}:{transitionNames:T},workset:(0,V.jsx)(`div`,{className:J.previewDetails,children:(0,V.jsx)(L,{release:e.release,workspaceId:t.workspaceId})})})},We=()=>{let e=a(),t=r();if(e.controller.state._tag!==`ready`)return(0,V.jsx)(Y,{context:e});let n=Be(e,t.releaseId);return n===null?(0,V.jsx)(Ve,{workspaceId:e.workspaceId}):(0,V.jsx)(Ue,{selection:n})},Ge=({selection:e})=>{let t=a(),n=s(),r=(0,z.useRef)(null),c=ue(n.state,t.workspaceId,e.releaseId),l=c.pathname===_(t.workspaceId)?`Back to items`:`Back to overview`,u=e.release,d=g(t.workspaceId,e.releaseId),f=h(t.workspaceId,e.releaseId),p=i(d),m=i(f),v=p||m?de(e.releaseId):void 0;return(0,z.useEffect)(()=>r.current?.focus(),[]),(0,V.jsxs)(`article`,{className:J.full,"data-release-full-id":u.id,children:[(0,V.jsxs)(`header`,{className:J.fullHeader,children:[(0,V.jsx)(o,{className:J.back,to:me(c),children:l}),(0,V.jsxs)(`div`,{className:J.fullIdentity,children:[(0,V.jsx)(D,{algorithm:u.relay.algorithm,codename:u.relay.codename,"data-rly-release-transition-name":v?.relay,"data-rly-release-transition-part":`relay`,size:`hero`,style:v===void 0?void 0:{viewTransitionName:v.relay},symbolIndices:u.relay.symbolIndices}),u.source.freshnessDateTime===null||u.source.freshnessTime===null?(0,V.jsx)(C,{state:u.source.freshness}):(0,V.jsx)(C,{dateTime:u.source.freshnessDateTime,state:u.source.freshness,time:u.source.freshnessTime})]}),(0,V.jsxs)(`div`,{className:J.fullTitle,children:[(0,V.jsx)(k,{as:`h1`,id:`release-title`,ref:r,tabIndex:-1,variant:`verdict`,children:u.serviceName}),(0,V.jsx)(k,{as:`code`,"data-rly-release-transition-name":v?.version,"data-rly-release-transition-part":`version`,style:v===void 0?void 0:{viewTransitionName:v.version},tone:`secondary`,variant:`code`,children:u.version})]}),(0,V.jsx)(x,{"data-rly-release-transition-name":v?.verdict,"data-rly-release-transition-part":`verdict`,reason:u.readinessReason,style:v===void 0?void 0:{viewTransitionName:v.verdict},tone:u.release.tone,verdict:u.release.verdict}),(0,V.jsx)(X,{release:u})]}),(0,V.jsx)(E,{heading:`Build, verify, production`,stages:u.stages}),(0,V.jsxs)(`section`,{"aria-labelledby":`release-people`,className:J.section,children:[(0,V.jsx)(k,{as:`h2`,id:`release-people`,variant:`section-title`,children:`People`}),(0,V.jsx)($,{release:u})]}),(0,V.jsxs)(`section`,{"aria-labelledby":`release-work-title`,className:J.section,id:`release-work`,children:[(0,V.jsx)(k,{as:`h2`,id:`release-work-title`,variant:`section-title`,children:`Delivery relationships`}),(0,V.jsx)(L,{release:u,workspaceId:t.workspaceId}),(0,V.jsx)(ze,{release:u})]}),(0,V.jsxs)(`section`,{"aria-labelledby":`release-evidence-title`,className:J.section,id:`release-evidence`,children:[(0,V.jsx)(k,{as:`h2`,id:`release-evidence-title`,variant:`section-title`,children:`Evidence`}),(0,V.jsx)(Z,{release:u})]}),(0,V.jsxs)(`section`,{"aria-labelledby":`release-agent`,className:J.section,children:[(0,V.jsx)(k,{as:`h2`,id:`release-agent`,variant:`section-title`,children:`Release agent`}),(0,V.jsx)(Q,{release:u})]})]})},Ke=()=>{let e=a(),t=r();if(e.controller.state._tag!==`ready`)return(0,V.jsx)(Y,{context:e});let n=Be(e,t.releaseId);return n===null?(0,V.jsx)(Ve,{workspaceId:e.workspaceId}):(0,V.jsx)(Ge,{selection:n})};export{X as ReleaseAction,Q as ReleaseAgentEntry,Z as ReleaseEvidence,Ke as ReleaseFullRoute,We as ReleasePreviewRoute,ze as t};
|
|
2
|
+
//# sourceMappingURL=ReleaseRoute-BuQybrsg.js.map
|