@knpkv/control-center 0.7.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/.vite/manifest.json +312 -255
- package/dist/client/assets/ActiveWorkPage-DKlotZGc.js +2 -0
- package/dist/client/assets/{ActiveWorkPage-BsaIr8ah.js.map → ActiveWorkPage-DKlotZGc.js.map} +1 -1
- package/dist/client/assets/AgentPage-Cxm1gj2C.js +6 -0
- package/dist/client/assets/{AgentPage-Cybynsnc.js.map → AgentPage-Cxm1gj2C.js.map} +1 -1
- package/dist/client/assets/{AtlassianOAuthCallbackPage-Du3pHuS9.js → AtlassianOAuthCallbackPage-fEFUJE2g.js} +2 -2
- package/dist/client/assets/{AtlassianOAuthCallbackPage-Du3pHuS9.js.map → AtlassianOAuthCallbackPage-fEFUJE2g.js.map} +1 -1
- package/dist/client/assets/AuthorizedSharePage-Dh7Y_gmJ.js +2 -0
- package/dist/client/assets/{AuthorizedSharePage-tfTdXNjt.js.map → AuthorizedSharePage-Dh7Y_gmJ.js.map} +1 -1
- package/dist/client/assets/BrowserCrypto-CoBR2WBd.js +2 -0
- package/dist/client/assets/{BrowserCrypto-DVxU0-Oc.js.map → BrowserCrypto-CoBR2WBd.js.map} +1 -1
- package/dist/client/assets/BrowserSessionHydrator-DkomS8Yl.js +2 -0
- package/dist/client/assets/{BrowserSessionHydrator-CvtvZstV.js.map → BrowserSessionHydrator-DkomS8Yl.js.map} +1 -1
- package/dist/client/assets/CommandSearch-nf16HEqz.js +2 -0
- package/dist/client/assets/{CommandSearch-Bf_oW_kD.js.map → CommandSearch-nf16HEqz.js.map} +1 -1
- package/dist/client/assets/Dialog-DSwimdwG-BeHnBpPp.js +42 -0
- package/dist/client/assets/Dialog-DSwimdwG-BeHnBpPp.js.map +1 -0
- package/dist/client/assets/Domain-cJ5aJFpE.js +2 -0
- package/dist/client/assets/Domain-cJ5aJFpE.js.map +1 -0
- package/dist/client/assets/ItemsPage-Bok8Vpy4.js +2 -0
- package/dist/client/assets/{ItemsPage-BmWEHinz.js.map → ItemsPage-Bok8Vpy4.js.map} +1 -1
- package/dist/client/assets/OpenPullRequestPage-DdL7PhKZ.js +2 -0
- package/dist/client/assets/OpenPullRequestPage-DdL7PhKZ.js.map +1 -0
- package/dist/client/assets/{Pages-BmZj4KzS.js → Pages-DrDuXLFH.js} +2 -2
- package/dist/client/assets/{Pages-BmZj4KzS.js.map → Pages-DrDuXLFH.js.map} +1 -1
- package/dist/client/assets/PairPage-BCtzYqK6.js +2 -0
- package/dist/client/assets/{PairPage-CLLUweYZ.js.map → PairPage-BCtzYqK6.js.map} +1 -1
- package/dist/client/assets/PortalProvider-CN_81Fy3-D_japesx.js +2 -0
- package/dist/client/assets/{PortalProvider-BpgZwSpw-nEH0TqWT.js.map → PortalProvider-CN_81Fy3-D_japesx.js.map} +1 -1
- package/dist/client/assets/PortfolioOverview-C-jqvYgQ.js +2 -0
- package/dist/client/assets/{PortfolioOverview-BBKSc-yI.js.map → PortfolioOverview-C-jqvYgQ.js.map} +1 -1
- package/dist/client/assets/{PullRequestReviewPanel-Boi0A6pq.js → PullRequestReviewPanel-DwVYuZ8Q.js} +5 -5
- package/dist/client/assets/{PullRequestReviewPanel-Boi0A6pq.js.map → PullRequestReviewPanel-DwVYuZ8Q.js.map} +1 -1
- package/dist/client/assets/ReleaseRoute-cuvP4ug5.js +2 -0
- package/dist/client/assets/{ReleaseRoute-D4CttCjC.js.map → ReleaseRoute-cuvP4ug5.js.map} +1 -1
- package/dist/client/assets/ReleaseWorkset-DImwmjS3.js +2 -0
- package/dist/client/assets/{ReleaseWorkset-Dt-ArwsN.js.map → ReleaseWorkset-DImwmjS3.js.map} +1 -1
- package/dist/client/assets/ReviewSuggestionPublicationSurface-BZIa-Vvc.js +2 -0
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-N9Qwdh2n.js.map → ReviewSuggestionPublicationSurface-BZIa-Vvc.js.map} +1 -1
- package/dist/client/assets/ServicesPage-CrM8R820.js +2 -0
- package/dist/client/assets/{ServicesPage-D0ygZTFD.js.map → ServicesPage-CrM8R820.js.map} +1 -1
- package/dist/client/assets/TimelinePage-FrvepGa_.js +2 -0
- package/dist/client/assets/{TimelinePage-Bb2o9DGU.js.map → TimelinePage-FrvepGa_.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityLink-Cw675wTN.js → WorkspaceEntityLink-CAj42f02.js} +2 -2
- package/dist/client/assets/{WorkspaceEntityLink-Cw675wTN.js.map → WorkspaceEntityLink-CAj42f02.js.map} +1 -1
- package/dist/client/assets/WorkspaceEntityRoute-rQ9ccetx.js +14 -0
- package/dist/client/assets/WorkspaceEntityRoute-rQ9ccetx.js.map +1 -0
- package/dist/client/assets/WorkspaceHomeLink-ObQ3AQVw.js +2 -0
- package/dist/client/assets/{WorkspaceHomeLink-FGslxXCu.js.map → WorkspaceHomeLink-ObQ3AQVw.js.map} +1 -1
- package/dist/client/assets/WorkspacePullRequestDetails-BhxoqR7V.js +3 -0
- package/dist/client/assets/{WorkspacePullRequestDetails-Dxg8argO.js.map → WorkspacePullRequestDetails-BhxoqR7V.js.map} +1 -1
- package/dist/client/assets/{WorkspaceReleaseLayout-BvEiZJEb.js → WorkspaceReleaseLayout-BWL66Fff.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-BvEiZJEb.js.map → WorkspaceReleaseLayout-BWL66Fff.js.map} +1 -1
- package/dist/client/assets/{WorkspaceRichText-CocmKQ4T.js → WorkspaceRichText-Beh64wsV.js} +2 -2
- package/dist/client/assets/{WorkspaceRichText-CocmKQ4T.js.map → WorkspaceRichText-Beh64wsV.js.map} +1 -1
- package/dist/client/assets/WorkspaceSettingsPage-DutfiGPe.js +2 -0
- package/dist/client/assets/{WorkspaceSettingsPage-iZhUs-pg.js.map → WorkspaceSettingsPage-DutfiGPe.js.map} +1 -1
- package/dist/client/assets/{agent-api-CzdQFCcD.js → agent-api-CUWP1qs8.js} +2 -2
- package/dist/client/assets/{agent-api-CzdQFCcD.js.map → agent-api-CUWP1qs8.js.map} +1 -1
- package/dist/client/assets/{atlassianOAuthSetupIntentStorage-BxsxmjSm.js → atlassianOAuthSetupIntentStorage-Cy1Gw639.js} +2 -2
- package/dist/client/assets/{atlassianOAuthSetupIntentStorage-BxsxmjSm.js.map → atlassianOAuthSetupIntentStorage-Cy1Gw639.js.map} +1 -1
- package/dist/client/assets/authenticatedMutationClient-Bc_-Jpbo.js +2 -0
- package/dist/client/assets/{authenticatedMutationClient-DUqEcJHu.js.map → authenticatedMutationClient-Bc_-Jpbo.js.map} +1 -1
- package/dist/client/assets/authorizedShareTransport-kkT3Jf6q.js +2 -0
- package/dist/client/assets/{authorizedShareTransport-7YCNH9l3.js.map → authorizedShareTransport-kkT3Jf6q.js.map} +1 -1
- package/dist/client/assets/client-D3WRV6yl.js +5 -0
- package/dist/client/assets/client-D3WRV6yl.js.map +1 -0
- package/dist/client/assets/{confluenceTasks-D9yrB-oV.js → confluenceTasks-By7BV0WN.js} +2 -2
- package/dist/client/assets/{confluenceTasks-D9yrB-oV.js.map → confluenceTasks-By7BV0WN.js.map} +1 -1
- package/dist/client/assets/connectionTestTransport-CRq7l9X0.js +2 -0
- package/dist/client/assets/{connectionTestTransport-D8tiZ4ym.js.map → connectionTestTransport-CRq7l9X0.js.map} +1 -1
- package/dist/client/assets/controlCenterRelayDock-CyYeXh75.js +3 -0
- package/dist/client/assets/controlCenterRelayDock-CyYeXh75.js.map +1 -0
- package/dist/client/assets/controlCenterRelayDockChrome-upgtq649.js +3 -0
- package/dist/client/assets/controlCenterRelayDockChrome-upgtq649.js.map +1 -0
- package/dist/client/assets/index-kmYFvwT0.js +11 -0
- package/dist/client/assets/index-kmYFvwT0.js.map +1 -0
- package/dist/client/assets/index-tjRpNCt_.css +1 -0
- package/dist/client/assets/openPullRequest-BMlmibLP.js +2 -0
- package/dist/client/assets/openPullRequest-BMlmibLP.js.map +1 -0
- package/dist/client/assets/patterns-DuFUSnJW.js +2 -0
- package/dist/client/assets/patterns-DuFUSnJW.js.map +1 -0
- package/dist/client/assets/{presentPortfolio-c8-wbodG.js → presentPortfolio-DVP-zqTg.js} +2 -2
- package/dist/client/assets/{presentPortfolio-c8-wbodG.js.map → presentPortfolio-DVP-zqTg.js.map} +1 -1
- package/dist/client/assets/{presentWorkspaceItems-DfhyQeSY.js → presentWorkspaceItems-BY8bmqjF.js} +2 -2
- package/dist/client/assets/{presentWorkspaceItems-DfhyQeSY.js.map → presentWorkspaceItems-BY8bmqjF.js.map} +1 -1
- package/dist/client/assets/primitives-DYGtIZqB-r-Glkv2i.js +2 -0
- package/dist/client/assets/primitives-DYGtIZqB-r-Glkv2i.js.map +1 -0
- package/dist/client/assets/pullRequestReviewFailures-CCNxSXP6.js +2 -0
- package/dist/client/assets/{pullRequestReviewFailures-QvtS729d.js.map → pullRequestReviewFailures-CCNxSXP6.js.map} +1 -1
- package/dist/client/assets/pullRequestReviewThreadReplay-eI3Y4i6s.js +2 -0
- package/dist/client/assets/{pullRequestReviewThreadReplay-CpPdYxQE.js.map → pullRequestReviewThreadReplay-eI3Y4i6s.js.map} +1 -1
- package/dist/client/assets/{releaseAgentTransport-BCQDYqZt.js → releaseAgentTransport-CJjWwE8y.js} +2 -2
- package/dist/client/assets/{releaseAgentTransport-BCQDYqZt.js.map → releaseAgentTransport-CJjWwE8y.js.map} +1 -1
- package/dist/client/assets/releaseRoutes-h4FVwFvJ.js +2 -0
- package/dist/client/assets/{releaseRoutes-CSP_eBj6.js.map → releaseRoutes-h4FVwFvJ.js.map} +1 -1
- package/dist/client/assets/{serviceOnboarding-B6v5VXTG.js → serviceOnboarding-F9Lj6a7y.js} +2 -2
- package/dist/client/assets/{serviceOnboarding-B6v5VXTG.js.map → serviceOnboarding-F9Lj6a7y.js.map} +1 -1
- package/dist/client/assets/useWorkspaceDefaultLanding-BmaR7aTj.js +3 -0
- package/dist/client/assets/{useWorkspaceDefaultLanding-C3PRrLgk.js.map → useWorkspaceDefaultLanding-BmaR7aTj.js.map} +1 -1
- package/dist/client/assets/useWorkspaceItems-6KWfmFtx.js +2 -0
- package/dist/client/assets/{useWorkspaceItems-CHYpfLmL.js.map → useWorkspaceItems-6KWfmFtx.js.map} +1 -1
- package/dist/client/assets/{workspaceEntityRoutes-CFPO-iFw.js → workspaceEntityRoutes-BHccxrFj.js} +2 -2
- package/dist/client/assets/{workspaceEntityRoutes-CFPO-iFw.js.map → workspaceEntityRoutes-BHccxrFj.js.map} +1 -1
- package/dist/client/assets/{workspaceScrollCapture-DUj-_YMd.js → workspaceScrollCapture-BzsNJoL7.js} +2 -2
- package/dist/client/assets/{workspaceScrollCapture-DUj-_YMd.js.map → workspaceScrollCapture-BzsNJoL7.js.map} +1 -1
- package/dist/client/assets/workspaceSettingsTransport-BwRQteEH.js +2 -0
- package/dist/client/assets/{workspaceSettingsTransport-Kq7lfPsC.js.map → workspaceSettingsTransport-BwRQteEH.js.map} +1 -1
- package/dist/client/build-graph.json +63 -0
- package/dist/client/index.html +3 -3
- package/dist/server/api/index.js +1 -1
- package/dist/server/assets/{BindConfig-hNWrGfu2.js → BindConfig-BG-FGtB5.js} +14 -5
- package/dist/server/assets/BindConfig-BG-FGtB5.js.map +1 -0
- package/dist/server/assets/{controlCenterApi-BcVWTP9F.js → controlCenterApi-WaKi6EUb.js} +2 -1
- package/dist/server/assets/controlCenterApi-WaKi6EUb.js.map +1 -0
- package/dist/server/index.js +1 -1
- package/dist/server/server/cli.js +1 -1
- package/dist/server/server/index.js +1 -1
- package/package.json +8 -7
- package/dist/client/assets/ActiveWorkPage-BsaIr8ah.js +0 -2
- package/dist/client/assets/AgentPage-Cybynsnc.js +0 -6
- package/dist/client/assets/AuthorizedSharePage-tfTdXNjt.js +0 -2
- package/dist/client/assets/BrowserCrypto-DVxU0-Oc.js +0 -2
- package/dist/client/assets/BrowserSessionHydrator-CvtvZstV.js +0 -2
- package/dist/client/assets/CommandSearch-Bf_oW_kD.js +0 -2
- package/dist/client/assets/Dialog-1WvU8GjA-C7r26HF0.js +0 -42
- package/dist/client/assets/Dialog-1WvU8GjA-C7r26HF0.js.map +0 -1
- package/dist/client/assets/ItemsPage-BmWEHinz.js +0 -2
- package/dist/client/assets/OpenPullRequestPage-DkCom6mf.js +0 -2
- package/dist/client/assets/OpenPullRequestPage-DkCom6mf.js.map +0 -1
- package/dist/client/assets/PairPage-CLLUweYZ.js +0 -2
- package/dist/client/assets/PortalProvider-BpgZwSpw-nEH0TqWT.js +0 -2
- package/dist/client/assets/PortfolioOverview-BBKSc-yI.js +0 -2
- package/dist/client/assets/ReleaseRoute-D4CttCjC.js +0 -2
- package/dist/client/assets/ReleaseWorkset-Dt-ArwsN.js +0 -2
- package/dist/client/assets/ReviewSuggestionPublicationSurface-N9Qwdh2n.js +0 -2
- package/dist/client/assets/ServicesPage-D0ygZTFD.js +0 -2
- package/dist/client/assets/TimelinePage-Bb2o9DGU.js +0 -2
- package/dist/client/assets/WorkspaceEntityRoute-rLRiaF8b.js +0 -14
- package/dist/client/assets/WorkspaceEntityRoute-rLRiaF8b.js.map +0 -1
- package/dist/client/assets/WorkspaceHomeLink-FGslxXCu.js +0 -2
- package/dist/client/assets/WorkspacePullRequestDetails-Dxg8argO.js +0 -3
- package/dist/client/assets/WorkspaceSettingsPage-iZhUs-pg.js +0 -2
- package/dist/client/assets/authenticatedMutationClient-DUqEcJHu.js +0 -2
- package/dist/client/assets/authorizedShareTransport-7YCNH9l3.js +0 -2
- package/dist/client/assets/client-D2F6HlDk.js +0 -5
- package/dist/client/assets/client-D2F6HlDk.js.map +0 -1
- package/dist/client/assets/connectionTestTransport-D8tiZ4ym.js +0 -2
- package/dist/client/assets/index-BWx9sNOT.js +0 -11
- package/dist/client/assets/index-BWx9sNOT.js.map +0 -1
- package/dist/client/assets/index-CIfiz7oF.css +0 -1
- package/dist/client/assets/patterns-CxMz8DKX-ByHwV03y.js +0 -2
- package/dist/client/assets/patterns-CxMz8DKX-ByHwV03y.js.map +0 -1
- package/dist/client/assets/primitives-CW89TsFB-BBLwFFPo.js +0 -2
- package/dist/client/assets/primitives-CW89TsFB-BBLwFFPo.js.map +0 -1
- package/dist/client/assets/pullRequestReviewFailures-QvtS729d.js +0 -2
- package/dist/client/assets/pullRequestReviewThreadReplay-CpPdYxQE.js +0 -2
- package/dist/client/assets/releaseRoutes-CSP_eBj6.js +0 -2
- package/dist/client/assets/useWorkspaceDefaultLanding-C3PRrLgk.js +0 -3
- package/dist/client/assets/useWorkspaceItems-CHYpfLmL.js +0 -2
- package/dist/client/assets/workspaceSettingsTransport-Kq7lfPsC.js +0 -2
- package/dist/server/assets/BindConfig-hNWrGfu2.js.map +0 -1
- package/dist/server/assets/controlCenterApi-BcVWTP9F.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=presentPortfolio-
|
|
1
|
+
import{Jr as e,Xr as t}from"./agent-api-CUWP1qs8.js";var n=[`Build`,`Verify`,`Production`],r={assembling:{label:`Assembling`,tone:`progress`},candidate:{label:`Candidate`,tone:`neutral`},deploying:{label:`Deploying`,tone:`progress`},released:{label:`Released`,tone:`positive`},cancelled:{label:`Cancelled`,tone:`caution`}},i={"release-owner":`Release owner`,"release-approver":`Release approver`},a={label:`Disabled`,message:`This source connection is disabled.`,tone:`neutral`,isUnhealthy:!0},o=e=>{switch(e){case`codecommit`:return`codecommit`;case`codepipeline`:return`codepipeline`;case`jira`:return`jira`;case`confluence`:return`confluence`;case`clockify`:return`clockify`}},s=e=>{if(e===null)return{label:`Not checked`,message:null,tone:`neutral`,isUnhealthy:!1};switch(e._tag){case`healthy`:return{label:`Healthy`,message:null,tone:`positive`,isUnhealthy:!1};case`degraded`:return{label:`Degraded`,message:e.safeMessage,tone:`caution`,isUnhealthy:!0};case`unavailable`:return{label:`Unavailable`,message:e.safeMessage,tone:`critical`,isUnhealthy:!0};case`disabled`:return a}},c=e=>{switch(e._tag){case`current`:return e.provenance._tag===`cache`?`cached`:`current`;case`stale`:return`stale`;case`missing`:return`missing`;case`unavailable`:return`unavailable`}},l=e=>e.provenance._tag===`none`?e.provenance.pluginConnectionId:e.provenance.sourceRevision.pluginConnectionId,u=e=>e.freshness.sourceObservedAt??e.freshness.synchronizedAt,d=e=>t(e,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`,timeZoneName:`short`}),f=(t,n)=>{let r=l(t.freshness),i=n.find(({pluginConnectionId:e})=>e===r),f=i===void 0?{label:`Unavailable`,message:`The source connection is missing from the current portfolio snapshot.`,tone:`critical`,isUnhealthy:!0}:i.isEnabled?s(i.health):a,p=c(t.freshness),m=u(t),h=t.freshness._tag===`stale`?f.message??`The source is not current. Preserved facts remain visible from the last successful sync.`:f.isUnhealthy?f.message??`The source needs attention. Saved release facts remain visible.`:null;return{displayName:i?.displayName??`Source connection unavailable`,freshness:p,freshnessDateTime:m===null?null:e(m),freshnessTime:m===null?null:d(m),healthLabel:f.label,healthTone:f.tone,service:i===void 0?null:o(i.providerId),warning:h}},p=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),m=e=>{if(e!==null)return e._tag===`count`?`${String(e.completed)} of ${String(e.total)} complete`:`${String(e.value)}% complete`},h=e=>{switch(e){case`failed`:return`critical`;case`held`:return`caution`;case`queued`:case`running`:return`progress`;case`succeeded`:return`positive`;case`not-started`:return`neutral`}},g=e=>{switch(e){case`failed`:return`critical`;case`held`:return`caution`;case`pending`:return`progress`;case`passed`:return`positive`;case`not-started`:return`neutral`}},_=e=>{switch(e){case`failed`:case`rolled-back`:return`critical`;case`held`:return`caution`;case`deploying`:case`waiting`:return`progress`;case`succeeded`:return`positive`;case`not-started`:return`neutral`}},v=()=>n.map(e=>({id:e.toLocaleLowerCase(`en-US`),name:e,reason:`No readiness evidence has been evaluated yet.`,state:`Not evaluated`,tone:`neutral`})),y=(e,t,n,r,i)=>{let a=m(i),o={id:e,name:t,state:p(n),tone:r};return a===void 0?o:{...o,reason:a}},b=e=>[y(`build`,`Build`,e.build.state,h(e.build.state),e.build.progress),y(`verify`,`Verify`,e.verify.state,g(e.verify.state),e.verify.progress),y(`production`,`Production`,e.production.state,_(e.production.state),e.production.progress)],x={blocked:{label:`Can't ship`,tone:`critical`},ready:{label:`Can ship`,tone:`positive`},deploying:{label:`Deploying`,tone:`progress`},building:{label:`Building`,tone:`progress`},shipped:{label:`Shipped`,tone:`positive`},held:{label:`Needs links`,tone:`caution`}},S=e=>{switch(e.code){case`input-incomplete`:return`Readiness inputs are incomplete.`;case`relationship-missing`:return`A required delivery link is missing.`;case`relationship-unverified`:return`A delivery link still needs verification.`;case`relationship-rejected`:return`A required delivery link was rejected.`;case`relationship-superseded`:return`A delivery link points to superseded work.`;case`approval-missing`:return`A required approval is missing.`;case`approval-pending`:return`A required approval is pending.`;case`approval-rejected`:return`A required approval was rejected.`;case`approval-expired`:return`A required approval expired.`;case`check-missing`:return`A required check is missing.`;case`check-pending`:return`Required checks are still running.`;case`check-failed`:return`A required check failed.`;case`check-cancelled`:return`A required check was cancelled.`;case`execution-missing`:return`A required pipeline run is missing.`;case`execution-pending`:return`A required pipeline is still running.`;case`execution-failed`:return`A required pipeline failed.`;case`execution-stopped`:return`A required pipeline was stopped.`;case`documentation-missing`:return`Required release documentation is missing.`;case`documentation-draft`:return`Release documentation is still a draft.`;case`documentation-stale`:return`Release documentation is stale.`;case`documentation-superseded`:return`Release documentation was superseded.`;case`deployment-missing`:return`Production deployment evidence is missing.`;case`deployment-failed`:return`Production deployment failed.`;case`deployment-rolled-back`:return`Production deployment was rolled back.`;case`source-stale`:return`A required source is stale.`;case`source-missing`:return`A required source is missing.`;case`source-unavailable`:return`A required source is unavailable.`;case`plugin-degraded`:return`A connected service is degraded.`;case`evidence-expired`:return`Required evidence has expired.`}},C=e=>{switch(e){case`blocked`:return`Required release evidence failed.`;case`ready`:return`All required evidence is verified.`;case`deploying`:return`Production rollout is in progress.`;case`building`:return`Build and verification are in progress.`;case`shipped`:return`Production deployment is verified.`;case`held`:return`Waiting for required delivery links.`}},w=(e,t)=>{let n=r[e.lifecycle],a=f(e,t),o=e.collaborators.map(({avatarFallback:e,displayName:t,personId:n,role:r})=>({avatarFallback:e,id:`${n}:${r}`,name:t,role:i[r]})),s=o.find(({role:e})=>e===i[`release-owner`]),c=o.find(({role:e})=>e===i[`release-approver`]),l=[{id:`service`,label:`Service`,value:e.serviceName},{id:`issues`,label:`Jira`,value:String(e.relationships.issues)},{id:`pull-requests`,label:`PRs`,value:String(e.relationships.pullRequests)},{id:`pipelines`,label:`Pipelines`,value:String(e.relationships.pipelineExecutions)},{id:`gaps`,label:`Gaps`,value:String(e.readiness?.gapCount??0)}],u=e.readiness,d=u===null?`No readiness evidence has been evaluated yet.`:u.authority===`pending`?`Evidence changed. Rechecking this release.`:u.primaryFinding===null?C(u.verdict):S(u.primaryFinding),p=u===null?null:x[u.verdict];return{collaborators:o,collaboratorCount:e.collaboratorCount,facts:l,id:e.releaseId,releasePageAwareness:e.releasePageAwareness,lifecycleLabel:n.label,lifecycleTone:n.tone,readinessVerdict:u?.verdict??`unknown`,readinessReason:d,release:{algorithm:e.relay.algorithm,...c!==void 0&&{approver:c},codename:e.relay.codename,facts:l,freshness:a.freshness,...a.freshnessDateTime!==null&&a.freshnessTime!==null&&{freshnessDateTime:a.freshnessDateTime,freshnessTime:a.freshnessTime},id:e.releaseId,...s!==void 0&&{owner:s},reason:d,state:u?.verdict??`unknown`,symbolIndices:e.relay.symbolIndices,tone:p?.tone??`neutral`,verdict:p?.label??`Readiness not evaluated`,version:e.version},relay:{algorithm:e.relay.algorithm,codename:e.relay.codename,symbolIndices:e.relay.symbolIndices},serviceName:e.serviceName,source:a,stages:u===null?v():b(u.stages),targetEnvironmentIds:e.targetEnvironmentIds,version:e.version}},T=t=>({generatedAt:e(t.generatedAt),generatedTime:d(t.generatedAt),releases:t.releases.map(e=>w(e,t.plugins)),workspaceId:t.workspaceId});export{T as t};
|
|
2
|
+
//# sourceMappingURL=presentPortfolio-DVP-zqTg.js.map
|
package/dist/client/assets/{presentPortfolio-c8-wbodG.js.map → presentPortfolio-DVP-zqTg.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentPortfolio-c8-wbodG.js","names":[],"sources":["../../../src/client/portfolio/presentPortfolio.ts"],"sourcesContent":["import type {\n RlyFreshnessState,\n RlyPerson,\n RlyReleasePresentation,\n RlyReleaseRelaySymbolIndices,\n RlyService,\n RlyStage\n} from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\n\nimport type { PortfolioReleaseRole, PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { PluginHealth } from \"../../domain/freshness.js\"\nimport type {\n ReadinessFinding,\n ReadinessProgress,\n ReadinessStages,\n ReadinessVerdict\n} from \"../../domain/readiness/model.js\"\nimport type { ReleaseLifecycle } from \"../../domain/release.js\"\n\nconst READINESS_STAGES: ReadonlyArray<string> = [\"Build\", \"Verify\", \"Production\"]\n\nconst lifecyclePresentation = {\n assembling: { label: \"Assembling\", tone: \"progress\" },\n candidate: { label: \"Candidate\", tone: \"neutral\" },\n deploying: { label: \"Deploying\", tone: \"progress\" },\n released: { label: \"Released\", tone: \"positive\" },\n cancelled: { label: \"Cancelled\", tone: \"caution\" }\n} satisfies Readonly<\n Record<ReleaseLifecycle, { readonly label: string; readonly tone: RlyStateTone }>\n>\n\nconst releaseRoleLabels = {\n \"release-owner\": \"Release owner\",\n \"release-approver\": \"Release approver\"\n} satisfies Readonly<Record<PortfolioReleaseRole, string>>\n\ninterface SourceHealthPresentation {\n readonly label: string\n readonly message: string | null\n readonly tone: RlyStateTone\n readonly isUnhealthy: boolean\n}\n\nconst DISABLED_SOURCE_HEALTH = {\n label: \"Disabled\",\n message: \"This source connection is disabled.\",\n tone: \"neutral\",\n isUnhealthy: true\n} satisfies SourceHealthPresentation\n\nexport interface PortfolioSourcePresentation {\n readonly displayName: string\n readonly freshness: RlyFreshnessState\n readonly freshnessDateTime: string | null\n readonly freshnessTime: string | null\n readonly healthLabel: string\n readonly healthTone: RlyStateTone\n readonly service: RlyService | null\n readonly warning: string | null\n}\n\nexport interface PortfolioReleasePresentation {\n readonly collaborators: ReadonlyArray<RlyPerson>\n readonly collaboratorCount: number\n readonly facts: ReadonlyArray<{ readonly id: string; readonly label: string; readonly value: string }>\n readonly id: PortfolioSnapshot[\"releases\"][number][\"releaseId\"]\n readonly releasePageAwareness: PortfolioSnapshot[\"releases\"][number][\"releasePageAwareness\"]\n readonly lifecycleLabel: string\n readonly lifecycleTone: RlyStateTone\n readonly readinessVerdict: ReadinessVerdict | \"unknown\"\n readonly readinessReason: string\n readonly release: RlyReleasePresentation\n readonly relay: {\n readonly algorithm: string\n readonly codename: string\n readonly symbolIndices: RlyReleaseRelaySymbolIndices\n }\n readonly serviceName: string\n readonly source: PortfolioSourcePresentation\n readonly stages: ReadonlyArray<RlyStage>\n readonly targetEnvironmentIds: PortfolioSnapshot[\"releases\"][number][\"targetEnvironmentIds\"]\n readonly version: PortfolioSnapshot[\"releases\"][number][\"version\"]\n}\n\nexport interface PortfolioPresentation {\n readonly generatedAt: string\n readonly generatedTime: string\n readonly releases: ReadonlyArray<PortfolioReleasePresentation>\n readonly workspaceId: PortfolioSnapshot[\"workspaceId\"]\n}\n\nconst serviceForProvider = (providerId: PortfolioSnapshot[\"plugins\"][number][\"providerId\"]): RlyService => {\n switch (providerId) {\n case \"codecommit\":\n return \"codecommit\"\n case \"codepipeline\":\n return \"codepipeline\"\n case \"jira\":\n return \"jira\"\n case \"confluence\":\n return \"confluence\"\n case \"clockify\":\n return \"clockify\"\n }\n}\n\nconst healthPresentation = (health: PluginHealth | null): SourceHealthPresentation => {\n if (health === null) {\n return { label: \"Not checked\", message: null, tone: \"neutral\", isUnhealthy: false }\n }\n switch (health._tag) {\n case \"healthy\":\n return { label: \"Healthy\", message: null, tone: \"positive\", isUnhealthy: false }\n case \"degraded\":\n return { label: \"Degraded\", message: health.safeMessage, tone: \"caution\", isUnhealthy: true }\n case \"unavailable\":\n return { label: \"Unavailable\", message: health.safeMessage, tone: \"critical\", isUnhealthy: true }\n case \"disabled\":\n return DISABLED_SOURCE_HEALTH\n }\n}\n\nconst freshnessState = (freshness: PortfolioSnapshot[\"releases\"][number][\"freshness\"]): RlyFreshnessState => {\n switch (freshness._tag) {\n case \"current\":\n return freshness.provenance._tag === \"cache\" ? \"cached\" : \"current\"\n case \"stale\":\n return \"stale\"\n case \"missing\":\n return \"missing\"\n case \"unavailable\":\n return \"unavailable\"\n }\n}\n\nconst sourceConnectionId = (\n freshness: PortfolioSnapshot[\"releases\"][number][\"freshness\"]\n): PortfolioSnapshot[\"plugins\"][number][\"pluginConnectionId\"] =>\n freshness.provenance._tag === \"none\"\n ? freshness.provenance.pluginConnectionId\n : freshness.provenance.sourceRevision.pluginConnectionId\n\nconst freshnessTimestamp = (\n release: PortfolioSnapshot[\"releases\"][number]\n): PortfolioSnapshot[\"releases\"][number][\"updatedAt\"] | null =>\n release.freshness.sourceObservedAt ?? release.freshness.synchronizedAt\n\nconst formattedTime = (timestamp: PortfolioSnapshot[\"generatedAt\"]): string =>\n DateTime.formatUtc(timestamp, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n timeZoneName: \"short\"\n })\n\nconst sourcePresentation = (\n release: PortfolioSnapshot[\"releases\"][number],\n plugins: PortfolioSnapshot[\"plugins\"]\n): PortfolioSourcePresentation => {\n const connectionId = sourceConnectionId(release.freshness)\n const plugin = plugins.find(({ pluginConnectionId }) => pluginConnectionId === connectionId)\n const health = plugin === undefined\n ? {\n label: \"Unavailable\",\n message: \"The source connection is missing from the current portfolio snapshot.\",\n tone: \"critical\",\n isUnhealthy: true\n } satisfies SourceHealthPresentation\n : plugin.isEnabled\n ? healthPresentation(plugin.health)\n : DISABLED_SOURCE_HEALTH\n const freshness = freshnessState(release.freshness)\n const timestamp = freshnessTimestamp(release)\n const hasStaleFacts = release.freshness._tag === \"stale\"\n const warning = hasStaleFacts\n ? health.message ?? \"The source is not current. Preserved facts remain visible from the last successful sync.\"\n : health.isUnhealthy\n ? health.message ?? \"The source needs attention. Saved release facts remain visible.\"\n : null\n\n return {\n displayName: plugin?.displayName ?? \"Source connection unavailable\",\n freshness,\n freshnessDateTime: timestamp === null ? null : DateTime.formatIso(timestamp),\n freshnessTime: timestamp === null ? null : formattedTime(timestamp),\n healthLabel: health.label,\n healthTone: health.tone,\n service: plugin === undefined ? null : serviceForProvider(plugin.providerId),\n warning\n }\n}\n\nconst stageStateLabel = (state: string): string =>\n state.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nconst progressReason = (progress: ReadinessProgress | null): string | undefined => {\n if (progress === null) return undefined\n return progress._tag === \"count\"\n ? `${String(progress.completed)} of ${String(progress.total)} complete`\n : `${String(progress.value)}% complete`\n}\n\nconst buildTone = (state: ReadinessStages[\"build\"][\"state\"]): RlyStateTone => {\n switch (state) {\n case \"failed\":\n return \"critical\"\n case \"held\":\n return \"caution\"\n case \"queued\":\n case \"running\":\n return \"progress\"\n case \"succeeded\":\n return \"positive\"\n case \"not-started\":\n return \"neutral\"\n }\n}\n\nconst verifyTone = (state: ReadinessStages[\"verify\"][\"state\"]): RlyStateTone => {\n switch (state) {\n case \"failed\":\n return \"critical\"\n case \"held\":\n return \"caution\"\n case \"pending\":\n return \"progress\"\n case \"passed\":\n return \"positive\"\n case \"not-started\":\n return \"neutral\"\n }\n}\n\nconst productionTone = (state: ReadinessStages[\"production\"][\"state\"]): RlyStateTone => {\n switch (state) {\n case \"failed\":\n case \"rolled-back\":\n return \"critical\"\n case \"held\":\n return \"caution\"\n case \"deploying\":\n case \"waiting\":\n return \"progress\"\n case \"succeeded\":\n return \"positive\"\n case \"not-started\":\n return \"neutral\"\n }\n}\n\nconst unevaluatedStages = (): ReadonlyArray<RlyStage> =>\n READINESS_STAGES.map((name) => ({\n id: name.toLocaleLowerCase(\"en-US\"),\n name,\n reason: \"No readiness evidence has been evaluated yet.\",\n state: \"Not evaluated\",\n tone: \"neutral\"\n }))\n\nconst readinessStage = (\n id: string,\n name: string,\n state: string,\n tone: RlyStateTone,\n progress: ReadinessProgress | null\n): RlyStage => {\n const reason = progressReason(progress)\n const stage = { id, name, state: stageStateLabel(state), tone }\n return reason === undefined ? stage : { ...stage, reason }\n}\n\nconst readinessStages = (stages: ReadinessStages): ReadonlyArray<RlyStage> => [\n readinessStage(\"build\", \"Build\", stages.build.state, buildTone(stages.build.state), stages.build.progress),\n readinessStage(\"verify\", \"Verify\", stages.verify.state, verifyTone(stages.verify.state), stages.verify.progress),\n readinessStage(\n \"production\",\n \"Production\",\n stages.production.state,\n productionTone(stages.production.state),\n stages.production.progress\n )\n]\n\nconst verdictPresentation = {\n blocked: { label: \"Can't ship\", tone: \"critical\" },\n ready: { label: \"Can ship\", tone: \"positive\" },\n deploying: { label: \"Deploying\", tone: \"progress\" },\n building: { label: \"Building\", tone: \"progress\" },\n shipped: { label: \"Shipped\", tone: \"positive\" },\n held: { label: \"Needs links\", tone: \"caution\" }\n} satisfies Readonly<\n Record<ReadinessVerdict, { readonly label: string; readonly tone: RlyStateTone }>\n>\n\nconst findingReason = (finding: ReadinessFinding): string => {\n switch (finding.code) {\n case \"input-incomplete\":\n return \"Readiness inputs are incomplete.\"\n case \"relationship-missing\":\n return \"A required delivery link is missing.\"\n case \"relationship-unverified\":\n return \"A delivery link still needs verification.\"\n case \"relationship-rejected\":\n return \"A required delivery link was rejected.\"\n case \"relationship-superseded\":\n return \"A delivery link points to superseded work.\"\n case \"approval-missing\":\n return \"A required approval is missing.\"\n case \"approval-pending\":\n return \"A required approval is pending.\"\n case \"approval-rejected\":\n return \"A required approval was rejected.\"\n case \"approval-expired\":\n return \"A required approval expired.\"\n case \"check-missing\":\n return \"A required check is missing.\"\n case \"check-pending\":\n return \"Required checks are still running.\"\n case \"check-failed\":\n return \"A required check failed.\"\n case \"check-cancelled\":\n return \"A required check was cancelled.\"\n case \"execution-missing\":\n return \"A required pipeline run is missing.\"\n case \"execution-pending\":\n return \"A required pipeline is still running.\"\n case \"execution-failed\":\n return \"A required pipeline failed.\"\n case \"execution-stopped\":\n return \"A required pipeline was stopped.\"\n case \"documentation-missing\":\n return \"Required release documentation is missing.\"\n case \"documentation-draft\":\n return \"Release documentation is still a draft.\"\n case \"documentation-stale\":\n return \"Release documentation is stale.\"\n case \"documentation-superseded\":\n return \"Release documentation was superseded.\"\n case \"deployment-missing\":\n return \"Production deployment evidence is missing.\"\n case \"deployment-failed\":\n return \"Production deployment failed.\"\n case \"deployment-rolled-back\":\n return \"Production deployment was rolled back.\"\n case \"source-stale\":\n return \"A required source is stale.\"\n case \"source-missing\":\n return \"A required source is missing.\"\n case \"source-unavailable\":\n return \"A required source is unavailable.\"\n case \"plugin-degraded\":\n return \"A connected service is degraded.\"\n case \"evidence-expired\":\n return \"Required evidence has expired.\"\n }\n}\n\nconst verdictReason = (verdict: ReadinessVerdict): string => {\n switch (verdict) {\n case \"blocked\":\n return \"Required release evidence failed.\"\n case \"ready\":\n return \"All required evidence is verified.\"\n case \"deploying\":\n return \"Production rollout is in progress.\"\n case \"building\":\n return \"Build and verification are in progress.\"\n case \"shipped\":\n return \"Production deployment is verified.\"\n case \"held\":\n return \"Waiting for required delivery links.\"\n }\n}\n\nconst releasePresentation = (\n release: PortfolioSnapshot[\"releases\"][number],\n plugins: PortfolioSnapshot[\"plugins\"]\n): PortfolioReleasePresentation => {\n const lifecycle = lifecyclePresentation[release.lifecycle]\n const source = sourcePresentation(release, plugins)\n const collaborators = release.collaborators.map(({ avatarFallback, displayName, personId, role }) => ({\n avatarFallback,\n id: `${personId}:${role}`,\n name: displayName,\n role: releaseRoleLabels[role]\n }))\n const owner = collaborators.find(({ role }) => role === releaseRoleLabels[\"release-owner\"])\n const approver = collaborators.find(({ role }) => role === releaseRoleLabels[\"release-approver\"])\n const facts = [\n { id: \"service\", label: \"Service\", value: release.serviceName },\n { id: \"issues\", label: \"Jira\", value: String(release.relationships.issues) },\n { id: \"pull-requests\", label: \"PRs\", value: String(release.relationships.pullRequests) },\n { id: \"pipelines\", label: \"Pipelines\", value: String(release.relationships.pipelineExecutions) },\n { id: \"gaps\", label: \"Gaps\", value: String(release.readiness?.gapCount ?? 0) }\n ]\n const readiness = release.readiness\n const readinessReason = readiness === null\n ? \"No readiness evidence has been evaluated yet.\"\n : readiness.authority === \"pending\"\n ? \"Evidence changed. Rechecking this release.\"\n : readiness.primaryFinding === null\n ? verdictReason(readiness.verdict)\n : findingReason(readiness.primaryFinding)\n const verdict = readiness === null ? null : verdictPresentation[readiness.verdict]\n return {\n collaborators,\n collaboratorCount: release.collaboratorCount,\n facts,\n id: release.releaseId,\n releasePageAwareness: release.releasePageAwareness,\n lifecycleLabel: lifecycle.label,\n lifecycleTone: lifecycle.tone,\n readinessVerdict: readiness?.verdict ?? \"unknown\",\n readinessReason,\n release: {\n algorithm: release.relay.algorithm,\n ...(!(approver === undefined) && { approver }),\n codename: release.relay.codename,\n facts,\n freshness: source.freshness,\n ...(!(source.freshnessDateTime === null || source.freshnessTime === null) &&\n { freshnessDateTime: source.freshnessDateTime, freshnessTime: source.freshnessTime }),\n id: release.releaseId,\n ...(!(owner === undefined) && { owner }),\n reason: readinessReason,\n state: readiness?.verdict ?? \"unknown\",\n symbolIndices: release.relay.symbolIndices,\n tone: verdict?.tone ?? \"neutral\",\n verdict: verdict?.label ?? \"Readiness not evaluated\",\n version: release.version\n },\n relay: {\n algorithm: release.relay.algorithm,\n codename: release.relay.codename,\n symbolIndices: release.relay.symbolIndices\n },\n serviceName: release.serviceName,\n source,\n stages: readiness === null ? unevaluatedStages() : readinessStages(readiness.stages),\n targetEnvironmentIds: release.targetEnvironmentIds,\n version: release.version\n }\n}\n\n/** Map one authoritative API snapshot into explicit rly component props without deriving readiness. */\nexport const presentPortfolio = (snapshot: PortfolioSnapshot): PortfolioPresentation => ({\n generatedAt: DateTime.formatIso(snapshot.generatedAt),\n generatedTime: formattedTime(snapshot.generatedAt),\n releases: snapshot.releases.map((release) => releasePresentation(release, snapshot.plugins)),\n workspaceId: snapshot.workspaceId\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"presentPortfolio-DVP-zqTg.js","names":[],"sources":["../../../src/client/portfolio/presentPortfolio.ts"],"sourcesContent":["import type {\n RlyFreshnessState,\n RlyPerson,\n RlyReleasePresentation,\n RlyReleaseRelaySymbolIndices,\n RlyService,\n RlyStage\n} from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\n\nimport type { PortfolioReleaseRole, PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { PluginHealth } from \"../../domain/freshness.js\"\nimport type {\n ReadinessFinding,\n ReadinessProgress,\n ReadinessStages,\n ReadinessVerdict\n} from \"../../domain/readiness/model.js\"\nimport type { ReleaseLifecycle } from \"../../domain/release.js\"\n\nconst READINESS_STAGES: ReadonlyArray<string> = [\"Build\", \"Verify\", \"Production\"]\n\nconst lifecyclePresentation = {\n assembling: { label: \"Assembling\", tone: \"progress\" },\n candidate: { label: \"Candidate\", tone: \"neutral\" },\n deploying: { label: \"Deploying\", tone: \"progress\" },\n released: { label: \"Released\", tone: \"positive\" },\n cancelled: { label: \"Cancelled\", tone: \"caution\" }\n} satisfies Readonly<\n Record<ReleaseLifecycle, { readonly label: string; readonly tone: RlyStateTone }>\n>\n\nconst releaseRoleLabels = {\n \"release-owner\": \"Release owner\",\n \"release-approver\": \"Release approver\"\n} satisfies Readonly<Record<PortfolioReleaseRole, string>>\n\ninterface SourceHealthPresentation {\n readonly label: string\n readonly message: string | null\n readonly tone: RlyStateTone\n readonly isUnhealthy: boolean\n}\n\nconst DISABLED_SOURCE_HEALTH = {\n label: \"Disabled\",\n message: \"This source connection is disabled.\",\n tone: \"neutral\",\n isUnhealthy: true\n} satisfies SourceHealthPresentation\n\nexport interface PortfolioSourcePresentation {\n readonly displayName: string\n readonly freshness: RlyFreshnessState\n readonly freshnessDateTime: string | null\n readonly freshnessTime: string | null\n readonly healthLabel: string\n readonly healthTone: RlyStateTone\n readonly service: RlyService | null\n readonly warning: string | null\n}\n\nexport interface PortfolioReleasePresentation {\n readonly collaborators: ReadonlyArray<RlyPerson>\n readonly collaboratorCount: number\n readonly facts: ReadonlyArray<{ readonly id: string; readonly label: string; readonly value: string }>\n readonly id: PortfolioSnapshot[\"releases\"][number][\"releaseId\"]\n readonly releasePageAwareness: PortfolioSnapshot[\"releases\"][number][\"releasePageAwareness\"]\n readonly lifecycleLabel: string\n readonly lifecycleTone: RlyStateTone\n readonly readinessVerdict: ReadinessVerdict | \"unknown\"\n readonly readinessReason: string\n readonly release: RlyReleasePresentation\n readonly relay: {\n readonly algorithm: string\n readonly codename: string\n readonly symbolIndices: RlyReleaseRelaySymbolIndices\n }\n readonly serviceName: string\n readonly source: PortfolioSourcePresentation\n readonly stages: ReadonlyArray<RlyStage>\n readonly targetEnvironmentIds: PortfolioSnapshot[\"releases\"][number][\"targetEnvironmentIds\"]\n readonly version: PortfolioSnapshot[\"releases\"][number][\"version\"]\n}\n\nexport interface PortfolioPresentation {\n readonly generatedAt: string\n readonly generatedTime: string\n readonly releases: ReadonlyArray<PortfolioReleasePresentation>\n readonly workspaceId: PortfolioSnapshot[\"workspaceId\"]\n}\n\nconst serviceForProvider = (providerId: PortfolioSnapshot[\"plugins\"][number][\"providerId\"]): RlyService => {\n switch (providerId) {\n case \"codecommit\":\n return \"codecommit\"\n case \"codepipeline\":\n return \"codepipeline\"\n case \"jira\":\n return \"jira\"\n case \"confluence\":\n return \"confluence\"\n case \"clockify\":\n return \"clockify\"\n }\n}\n\nconst healthPresentation = (health: PluginHealth | null): SourceHealthPresentation => {\n if (health === null) {\n return { label: \"Not checked\", message: null, tone: \"neutral\", isUnhealthy: false }\n }\n switch (health._tag) {\n case \"healthy\":\n return { label: \"Healthy\", message: null, tone: \"positive\", isUnhealthy: false }\n case \"degraded\":\n return { label: \"Degraded\", message: health.safeMessage, tone: \"caution\", isUnhealthy: true }\n case \"unavailable\":\n return { label: \"Unavailable\", message: health.safeMessage, tone: \"critical\", isUnhealthy: true }\n case \"disabled\":\n return DISABLED_SOURCE_HEALTH\n }\n}\n\nconst freshnessState = (freshness: PortfolioSnapshot[\"releases\"][number][\"freshness\"]): RlyFreshnessState => {\n switch (freshness._tag) {\n case \"current\":\n return freshness.provenance._tag === \"cache\" ? \"cached\" : \"current\"\n case \"stale\":\n return \"stale\"\n case \"missing\":\n return \"missing\"\n case \"unavailable\":\n return \"unavailable\"\n }\n}\n\nconst sourceConnectionId = (\n freshness: PortfolioSnapshot[\"releases\"][number][\"freshness\"]\n): PortfolioSnapshot[\"plugins\"][number][\"pluginConnectionId\"] =>\n freshness.provenance._tag === \"none\"\n ? freshness.provenance.pluginConnectionId\n : freshness.provenance.sourceRevision.pluginConnectionId\n\nconst freshnessTimestamp = (\n release: PortfolioSnapshot[\"releases\"][number]\n): PortfolioSnapshot[\"releases\"][number][\"updatedAt\"] | null =>\n release.freshness.sourceObservedAt ?? release.freshness.synchronizedAt\n\nconst formattedTime = (timestamp: PortfolioSnapshot[\"generatedAt\"]): string =>\n DateTime.formatUtc(timestamp, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n timeZoneName: \"short\"\n })\n\nconst sourcePresentation = (\n release: PortfolioSnapshot[\"releases\"][number],\n plugins: PortfolioSnapshot[\"plugins\"]\n): PortfolioSourcePresentation => {\n const connectionId = sourceConnectionId(release.freshness)\n const plugin = plugins.find(({ pluginConnectionId }) => pluginConnectionId === connectionId)\n const health = plugin === undefined\n ? {\n label: \"Unavailable\",\n message: \"The source connection is missing from the current portfolio snapshot.\",\n tone: \"critical\",\n isUnhealthy: true\n } satisfies SourceHealthPresentation\n : plugin.isEnabled\n ? healthPresentation(plugin.health)\n : DISABLED_SOURCE_HEALTH\n const freshness = freshnessState(release.freshness)\n const timestamp = freshnessTimestamp(release)\n const hasStaleFacts = release.freshness._tag === \"stale\"\n const warning = hasStaleFacts\n ? health.message ?? \"The source is not current. Preserved facts remain visible from the last successful sync.\"\n : health.isUnhealthy\n ? health.message ?? \"The source needs attention. Saved release facts remain visible.\"\n : null\n\n return {\n displayName: plugin?.displayName ?? \"Source connection unavailable\",\n freshness,\n freshnessDateTime: timestamp === null ? null : DateTime.formatIso(timestamp),\n freshnessTime: timestamp === null ? null : formattedTime(timestamp),\n healthLabel: health.label,\n healthTone: health.tone,\n service: plugin === undefined ? null : serviceForProvider(plugin.providerId),\n warning\n }\n}\n\nconst stageStateLabel = (state: string): string =>\n state.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nconst progressReason = (progress: ReadinessProgress | null): string | undefined => {\n if (progress === null) return undefined\n return progress._tag === \"count\"\n ? `${String(progress.completed)} of ${String(progress.total)} complete`\n : `${String(progress.value)}% complete`\n}\n\nconst buildTone = (state: ReadinessStages[\"build\"][\"state\"]): RlyStateTone => {\n switch (state) {\n case \"failed\":\n return \"critical\"\n case \"held\":\n return \"caution\"\n case \"queued\":\n case \"running\":\n return \"progress\"\n case \"succeeded\":\n return \"positive\"\n case \"not-started\":\n return \"neutral\"\n }\n}\n\nconst verifyTone = (state: ReadinessStages[\"verify\"][\"state\"]): RlyStateTone => {\n switch (state) {\n case \"failed\":\n return \"critical\"\n case \"held\":\n return \"caution\"\n case \"pending\":\n return \"progress\"\n case \"passed\":\n return \"positive\"\n case \"not-started\":\n return \"neutral\"\n }\n}\n\nconst productionTone = (state: ReadinessStages[\"production\"][\"state\"]): RlyStateTone => {\n switch (state) {\n case \"failed\":\n case \"rolled-back\":\n return \"critical\"\n case \"held\":\n return \"caution\"\n case \"deploying\":\n case \"waiting\":\n return \"progress\"\n case \"succeeded\":\n return \"positive\"\n case \"not-started\":\n return \"neutral\"\n }\n}\n\nconst unevaluatedStages = (): ReadonlyArray<RlyStage> =>\n READINESS_STAGES.map((name) => ({\n id: name.toLocaleLowerCase(\"en-US\"),\n name,\n reason: \"No readiness evidence has been evaluated yet.\",\n state: \"Not evaluated\",\n tone: \"neutral\"\n }))\n\nconst readinessStage = (\n id: string,\n name: string,\n state: string,\n tone: RlyStateTone,\n progress: ReadinessProgress | null\n): RlyStage => {\n const reason = progressReason(progress)\n const stage = { id, name, state: stageStateLabel(state), tone }\n return reason === undefined ? stage : { ...stage, reason }\n}\n\nconst readinessStages = (stages: ReadinessStages): ReadonlyArray<RlyStage> => [\n readinessStage(\"build\", \"Build\", stages.build.state, buildTone(stages.build.state), stages.build.progress),\n readinessStage(\"verify\", \"Verify\", stages.verify.state, verifyTone(stages.verify.state), stages.verify.progress),\n readinessStage(\n \"production\",\n \"Production\",\n stages.production.state,\n productionTone(stages.production.state),\n stages.production.progress\n )\n]\n\nconst verdictPresentation = {\n blocked: { label: \"Can't ship\", tone: \"critical\" },\n ready: { label: \"Can ship\", tone: \"positive\" },\n deploying: { label: \"Deploying\", tone: \"progress\" },\n building: { label: \"Building\", tone: \"progress\" },\n shipped: { label: \"Shipped\", tone: \"positive\" },\n held: { label: \"Needs links\", tone: \"caution\" }\n} satisfies Readonly<\n Record<ReadinessVerdict, { readonly label: string; readonly tone: RlyStateTone }>\n>\n\nconst findingReason = (finding: ReadinessFinding): string => {\n switch (finding.code) {\n case \"input-incomplete\":\n return \"Readiness inputs are incomplete.\"\n case \"relationship-missing\":\n return \"A required delivery link is missing.\"\n case \"relationship-unverified\":\n return \"A delivery link still needs verification.\"\n case \"relationship-rejected\":\n return \"A required delivery link was rejected.\"\n case \"relationship-superseded\":\n return \"A delivery link points to superseded work.\"\n case \"approval-missing\":\n return \"A required approval is missing.\"\n case \"approval-pending\":\n return \"A required approval is pending.\"\n case \"approval-rejected\":\n return \"A required approval was rejected.\"\n case \"approval-expired\":\n return \"A required approval expired.\"\n case \"check-missing\":\n return \"A required check is missing.\"\n case \"check-pending\":\n return \"Required checks are still running.\"\n case \"check-failed\":\n return \"A required check failed.\"\n case \"check-cancelled\":\n return \"A required check was cancelled.\"\n case \"execution-missing\":\n return \"A required pipeline run is missing.\"\n case \"execution-pending\":\n return \"A required pipeline is still running.\"\n case \"execution-failed\":\n return \"A required pipeline failed.\"\n case \"execution-stopped\":\n return \"A required pipeline was stopped.\"\n case \"documentation-missing\":\n return \"Required release documentation is missing.\"\n case \"documentation-draft\":\n return \"Release documentation is still a draft.\"\n case \"documentation-stale\":\n return \"Release documentation is stale.\"\n case \"documentation-superseded\":\n return \"Release documentation was superseded.\"\n case \"deployment-missing\":\n return \"Production deployment evidence is missing.\"\n case \"deployment-failed\":\n return \"Production deployment failed.\"\n case \"deployment-rolled-back\":\n return \"Production deployment was rolled back.\"\n case \"source-stale\":\n return \"A required source is stale.\"\n case \"source-missing\":\n return \"A required source is missing.\"\n case \"source-unavailable\":\n return \"A required source is unavailable.\"\n case \"plugin-degraded\":\n return \"A connected service is degraded.\"\n case \"evidence-expired\":\n return \"Required evidence has expired.\"\n }\n}\n\nconst verdictReason = (verdict: ReadinessVerdict): string => {\n switch (verdict) {\n case \"blocked\":\n return \"Required release evidence failed.\"\n case \"ready\":\n return \"All required evidence is verified.\"\n case \"deploying\":\n return \"Production rollout is in progress.\"\n case \"building\":\n return \"Build and verification are in progress.\"\n case \"shipped\":\n return \"Production deployment is verified.\"\n case \"held\":\n return \"Waiting for required delivery links.\"\n }\n}\n\nconst releasePresentation = (\n release: PortfolioSnapshot[\"releases\"][number],\n plugins: PortfolioSnapshot[\"plugins\"]\n): PortfolioReleasePresentation => {\n const lifecycle = lifecyclePresentation[release.lifecycle]\n const source = sourcePresentation(release, plugins)\n const collaborators = release.collaborators.map(({ avatarFallback, displayName, personId, role }) => ({\n avatarFallback,\n id: `${personId}:${role}`,\n name: displayName,\n role: releaseRoleLabels[role]\n }))\n const owner = collaborators.find(({ role }) => role === releaseRoleLabels[\"release-owner\"])\n const approver = collaborators.find(({ role }) => role === releaseRoleLabels[\"release-approver\"])\n const facts = [\n { id: \"service\", label: \"Service\", value: release.serviceName },\n { id: \"issues\", label: \"Jira\", value: String(release.relationships.issues) },\n { id: \"pull-requests\", label: \"PRs\", value: String(release.relationships.pullRequests) },\n { id: \"pipelines\", label: \"Pipelines\", value: String(release.relationships.pipelineExecutions) },\n { id: \"gaps\", label: \"Gaps\", value: String(release.readiness?.gapCount ?? 0) }\n ]\n const readiness = release.readiness\n const readinessReason = readiness === null\n ? \"No readiness evidence has been evaluated yet.\"\n : readiness.authority === \"pending\"\n ? \"Evidence changed. Rechecking this release.\"\n : readiness.primaryFinding === null\n ? verdictReason(readiness.verdict)\n : findingReason(readiness.primaryFinding)\n const verdict = readiness === null ? null : verdictPresentation[readiness.verdict]\n return {\n collaborators,\n collaboratorCount: release.collaboratorCount,\n facts,\n id: release.releaseId,\n releasePageAwareness: release.releasePageAwareness,\n lifecycleLabel: lifecycle.label,\n lifecycleTone: lifecycle.tone,\n readinessVerdict: readiness?.verdict ?? \"unknown\",\n readinessReason,\n release: {\n algorithm: release.relay.algorithm,\n ...(!(approver === undefined) && { approver }),\n codename: release.relay.codename,\n facts,\n freshness: source.freshness,\n ...(!(source.freshnessDateTime === null || source.freshnessTime === null) &&\n { freshnessDateTime: source.freshnessDateTime, freshnessTime: source.freshnessTime }),\n id: release.releaseId,\n ...(!(owner === undefined) && { owner }),\n reason: readinessReason,\n state: readiness?.verdict ?? \"unknown\",\n symbolIndices: release.relay.symbolIndices,\n tone: verdict?.tone ?? \"neutral\",\n verdict: verdict?.label ?? \"Readiness not evaluated\",\n version: release.version\n },\n relay: {\n algorithm: release.relay.algorithm,\n codename: release.relay.codename,\n symbolIndices: release.relay.symbolIndices\n },\n serviceName: release.serviceName,\n source,\n stages: readiness === null ? unevaluatedStages() : readinessStages(readiness.stages),\n targetEnvironmentIds: release.targetEnvironmentIds,\n version: release.version\n }\n}\n\n/** Map one authoritative API snapshot into explicit rly component props without deriving readiness. */\nexport const presentPortfolio = (snapshot: PortfolioSnapshot): PortfolioPresentation => ({\n generatedAt: DateTime.formatIso(snapshot.generatedAt),\n generatedTime: formattedTime(snapshot.generatedAt),\n releases: snapshot.releases.map((release) => releasePresentation(release, snapshot.plugins)),\n workspaceId: snapshot.workspaceId\n})\n"],"mappings":"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"}
|
package/dist/client/assets/{presentWorkspaceItems-DfhyQeSY.js → presentWorkspaceItems-BY8bmqjF.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=presentWorkspaceItems-
|
|
1
|
+
import{Jr as e}from"./agent-api-CUWP1qs8.js";import{n as t}from"./workspaceEntityPaths-xAl2jRFm.js";var n=e=>{switch(e){case`change-owner`:case`issue-owner`:case`page-owner`:return`Owner`;case`issue-assignee`:return`Assignee`;case`author`:return`Author`;case`operator`:return`Operator`;default:return i(e)}},r=e=>{switch(e){case`issue`:return`jira`;case`pull-request`:return`codecommit`;case`page`:return`confluence`;case`pipeline-execution`:case`deployment`:return`codepipeline`;case`time-entry`:return`clockify`}},i=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),a=e=>{switch(e._tag){case`issue`:return e.status;case`pull-request`:switch(e.reviewState){case`changes-requested`:return`Changes requested`;case`approved`:return`Approved`;case`merged`:return`Merged`;case`not-requested`:case`requested`:return e.lifecycle!==null&&e.lifecycle!==void 0?i(e.lifecycle):e.reviewState===`requested`?`Review requested`:`Review not requested`}case`page`:case`pipeline-execution`:case`deployment`:return i(e.status);case`time-entry`:return i(e.approvalState)}},o=e=>{let t=e.trim().toLocaleLowerCase(`en-US`);return t===`blocked`||t===`rejected`?{statusGroup:`failed`,tone:`critical`}:t===`closed`||t===`done`||t===`resolved`?{statusGroup:`done`,tone:`positive`}:{statusGroup:`active`,tone:`progress`}},s=(e,t)=>{if(e===`issue`)return o(t);let n=t.toLocaleLowerCase(`en-US`);return[`blocked`,`changes requested`,`failed`,`rejected`,`rolled back`,`stopped`,`superseded`].some(e=>n.includes(e))?{statusGroup:`failed`,tone:`critical`}:[`approved`,`closed`,`current`,`done`,`merged`,`not required`,`ready`,`resolved`,`succeeded`].some(e=>n.includes(e))?{statusGroup:`done`,tone:`positive`}:{statusGroup:`active`,tone:`progress`}},c=(e,t,n)=>`/w/${e}/releases/${t}?object=${encodeURIComponent(n)}#release-work`,l=(i,o,c)=>{let l=o.projection,u=a(l.details),d=o.releaseIds.filter(e=>c===void 0||c.has(e)),f=o.releaseIds.length===1&&!o.releaseMembershipsTruncated?d[0]??null:null,p=(o.owners??[]).map(({avatarFallback:e,displayName:t,personId:r,roles:i})=>({avatarFallback:e,id:r,name:t,role:[...new Set(i.map(n))].join(` · `),roles:i}));return{entityId:l.entityId,freshness:e(o.recordedAt),href:t(i,l.entityId),key:l.displayKey,kind:l.entityType,owner:p.length===0?`Unassigned`:p.map(({name:e})=>e).join(`, `),owners:p,ownersTruncated:o.ownersTruncated??!1,releaseId:f,releaseIds:o.releaseIds,releaseMembershipsTruncated:o.releaseMembershipsTruncated,routableReleaseIds:d,service:r(l.entityType),status:u,...s(l.entityType,u),title:l.title}},u=(e,t,n)=>t.items.filter(({projection:e})=>e.entityState===`present`).map(t=>l(e,t,n)).sort((e,t)=>e.service.localeCompare(t.service)||e.key.localeCompare(t.key));export{c as a,s as i,r as n,a as r,u as t};
|
|
2
|
+
//# sourceMappingURL=presentWorkspaceItems-BY8bmqjF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentWorkspaceItems-DfhyQeSY.js","names":[],"sources":["../../../src/client/items/presentWorkspaceItems.ts"],"sourcesContent":["import type { RlyService } from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\n\nimport type {\n ReleaseDeliveryGraphInspection,\n WorkspaceEntityOwner,\n WorkspaceEntityProjectionIndex\n} from \"../../api/deliveryGraph.js\"\nimport type { Role } from \"../../domain/actors.js\"\nimport type {\n DeliveryEntityDetails,\n DeliveryEntityKind,\n DeliveryEntityStatusGroup\n} from \"../../domain/deliveryGraph.js\"\nimport type { EntityId, ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nexport type WorkspaceItemStatus = DeliveryEntityStatusGroup\n\nexport interface WorkspaceItemPresentation {\n readonly entityId: EntityId\n readonly freshness: string\n readonly href: string\n readonly key: string\n readonly kind: DeliveryEntityKind\n readonly owner: string\n readonly owners: ReadonlyArray<WorkspaceItemOwnerPresentation>\n readonly ownersTruncated: boolean\n readonly releaseId: ReleaseId | null\n readonly releaseIds: ReadonlyArray<ReleaseId>\n readonly releaseMembershipsTruncated: boolean\n readonly routableReleaseIds: ReadonlyArray<ReleaseId>\n readonly service: RlyService\n readonly status: string\n readonly statusGroup: WorkspaceItemStatus\n readonly title: string\n readonly tone: RlyStateTone\n}\n\nexport interface WorkspaceItemOwnerPresentation {\n readonly avatarFallback: string\n readonly id: string\n readonly name: string\n readonly role: string\n readonly roles: ReadonlyArray<Role>\n}\n\nconst collaboratorRoleLabel = (role: Role): string => {\n switch (role) {\n case \"change-owner\":\n case \"issue-owner\":\n case \"page-owner\":\n return \"Owner\"\n case \"issue-assignee\":\n return \"Assignee\"\n case \"author\":\n return \"Author\"\n case \"operator\":\n return \"Operator\"\n default:\n return titleCase(role)\n }\n}\n\nexport const serviceFor = (kind: DeliveryEntityKind): RlyService => {\n switch (kind) {\n case \"issue\":\n return \"jira\"\n case \"pull-request\":\n return \"codecommit\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n }\n}\n\nconst titleCase = (value: string): string =>\n value.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nexport const statusFor = (details: DeliveryEntityDetails): string => {\n switch (details._tag) {\n case \"issue\":\n return details.status\n case \"pull-request\": {\n switch (details.reviewState) {\n case \"changes-requested\":\n return \"Changes requested\"\n case \"approved\":\n return \"Approved\"\n case \"merged\":\n return \"Merged\"\n case \"not-requested\":\n case \"requested\":\n if (details.lifecycle !== null && details.lifecycle !== undefined) return titleCase(details.lifecycle)\n return details.reviewState === \"requested\" ? \"Review requested\" : \"Review not requested\"\n }\n }\n case \"page\":\n case \"pipeline-execution\":\n case \"deployment\":\n return titleCase(details.status)\n case \"time-entry\":\n return titleCase(details.approvalState)\n }\n}\n\nconst issueStatusPresentation = (status: string): Pick<WorkspaceItemPresentation, \"statusGroup\" | \"tone\"> => {\n const value = status.trim().toLocaleLowerCase(\"en-US\")\n if (value === \"blocked\" || value === \"rejected\") return { statusGroup: \"failed\", tone: \"critical\" }\n if (value === \"closed\" || value === \"done\" || value === \"resolved\") {\n return { statusGroup: \"done\", tone: \"positive\" }\n }\n return { statusGroup: \"active\", tone: \"progress\" }\n}\n\nexport const statusPresentation = (\n kind: DeliveryEntityKind,\n status: string\n): Pick<WorkspaceItemPresentation, \"statusGroup\" | \"tone\"> => {\n if (kind === \"issue\") return issueStatusPresentation(status)\n const value = status.toLocaleLowerCase(\"en-US\")\n if (\n [\"blocked\", \"changes requested\", \"failed\", \"rejected\", \"rolled back\", \"stopped\", \"superseded\"].some((part) =>\n value.includes(part)\n )\n ) return { statusGroup: \"failed\", tone: \"critical\" }\n if (\n [\"approved\", \"closed\", \"current\", \"done\", \"merged\", \"not required\", \"ready\", \"resolved\", \"succeeded\"]\n .some((part) => value.includes(part))\n ) return { statusGroup: \"done\", tone: \"positive\" }\n return { statusGroup: \"active\", tone: \"progress\" }\n}\n\nexport const workspaceItemReleaseHref = (\n workspaceId: WorkspaceId,\n releaseId: ReleaseId,\n entityId: EntityId\n): string => `/w/${workspaceId}/releases/${releaseId}?object=${encodeURIComponent(entityId)}#release-work`\n\nconst presentProjection = (\n workspaceId: WorkspaceId,\n entry: ReleaseDeliveryGraphInspection[\"entityProjections\"][number] & {\n readonly canonicalReleaseId: ReleaseId | null\n readonly owners?: ReadonlyArray<WorkspaceEntityOwner>\n readonly ownersTruncated?: boolean\n readonly releaseIds: ReadonlyArray<ReleaseId>\n readonly releaseMembershipsTruncated: boolean\n },\n routableReleaseIds?: ReadonlySet<ReleaseId>\n): WorkspaceItemPresentation => {\n const projection = entry.projection\n const status = statusFor(projection.details)\n const routableMemberships = entry.releaseIds.filter(\n (releaseId) => routableReleaseIds === undefined || routableReleaseIds.has(releaseId)\n )\n const releaseId = entry.releaseIds.length === 1 && !entry.releaseMembershipsTruncated\n ? (routableMemberships[0] ?? null)\n : null\n const owners: ReadonlyArray<WorkspaceItemOwnerPresentation> = (entry.owners ?? []).map(({\n avatarFallback,\n displayName,\n personId,\n roles\n }) => ({\n avatarFallback,\n id: personId,\n name: displayName,\n role: [...new Set(roles.map(collaboratorRoleLabel))].join(\" · \"),\n roles\n }))\n return {\n entityId: projection.entityId,\n freshness: DateTime.formatIso(entry.recordedAt),\n href: workspaceEntityPath(workspaceId, projection.entityId),\n key: projection.displayKey,\n kind: projection.entityType,\n owner: owners.length === 0 ? \"Unassigned\" : owners.map(({ name }) => name).join(\", \"),\n owners,\n ownersTruncated: entry.ownersTruncated ?? false,\n releaseId,\n releaseIds: entry.releaseIds,\n releaseMembershipsTruncated: entry.releaseMembershipsTruncated,\n routableReleaseIds: routableMemberships,\n service: serviceFor(projection.entityType),\n status,\n ...statusPresentation(projection.entityType, status),\n title: projection.title\n }\n}\n\n/** Present one server-authoritative workspace entity index. */\nexport const presentWorkspaceEntityIndex = (\n workspaceId: WorkspaceId,\n index: WorkspaceEntityProjectionIndex,\n routableReleaseIds?: ReadonlySet<ReleaseId>\n): ReadonlyArray<WorkspaceItemPresentation> =>\n index.items\n .filter(({ projection }) => projection.entityState === \"present\")\n .map((entry) => presentProjection(workspaceId, entry, routableReleaseIds))\n .sort((left, right) => left.service.localeCompare(right.service) || left.key.localeCompare(right.key))\n\n/** Present bounded release slices as one deduplicated release-linked item index. */\nexport const presentWorkspaceItems = (\n workspaceId: WorkspaceId,\n inspections: ReadonlyArray<ReleaseDeliveryGraphInspection>\n): ReadonlyArray<WorkspaceItemPresentation> => {\n const items = new Map<EntityId, {\n readonly entry: ReleaseDeliveryGraphInspection[\"entityProjections\"][number]\n readonly releaseIds: Set<ReleaseId>\n }>()\n const canonicalInspections = [...inspections].sort((left, right) => left.releaseId.localeCompare(right.releaseId))\n for (const inspection of canonicalInspections) {\n for (const entry of inspection.entityProjections) {\n const projection = entry.projection\n if (projection.entityState !== \"present\") continue\n const existing = items.get(projection.entityId)\n if (existing !== undefined) {\n existing.releaseIds.add(inspection.releaseId)\n continue\n }\n items.set(projection.entityId, { entry, releaseIds: new Set([inspection.releaseId]) })\n }\n }\n return [...items.values()].map(({ entry, releaseIds: membershipSet }) => {\n const releaseIds = [...membershipSet].sort((left, right) => left.localeCompare(right))\n return presentProjection(workspaceId, {\n ...entry,\n canonicalReleaseId: releaseIds[0] ?? null,\n releaseIds,\n releaseMembershipsTruncated: false\n })\n }).sort((left, right) => left.service.localeCompare(right.service) || left.key.localeCompare(right.key))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"presentWorkspaceItems-BY8bmqjF.js","names":[],"sources":["../../../src/client/items/presentWorkspaceItems.ts"],"sourcesContent":["import type { RlyService } from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\n\nimport type {\n ReleaseDeliveryGraphInspection,\n WorkspaceEntityOwner,\n WorkspaceEntityProjectionIndex\n} from \"../../api/deliveryGraph.js\"\nimport type { Role } from \"../../domain/actors.js\"\nimport type {\n DeliveryEntityDetails,\n DeliveryEntityKind,\n DeliveryEntityStatusGroup\n} from \"../../domain/deliveryGraph.js\"\nimport type { EntityId, ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nexport type WorkspaceItemStatus = DeliveryEntityStatusGroup\n\nexport interface WorkspaceItemPresentation {\n readonly entityId: EntityId\n readonly freshness: string\n readonly href: string\n readonly key: string\n readonly kind: DeliveryEntityKind\n readonly owner: string\n readonly owners: ReadonlyArray<WorkspaceItemOwnerPresentation>\n readonly ownersTruncated: boolean\n readonly releaseId: ReleaseId | null\n readonly releaseIds: ReadonlyArray<ReleaseId>\n readonly releaseMembershipsTruncated: boolean\n readonly routableReleaseIds: ReadonlyArray<ReleaseId>\n readonly service: RlyService\n readonly status: string\n readonly statusGroup: WorkspaceItemStatus\n readonly title: string\n readonly tone: RlyStateTone\n}\n\nexport interface WorkspaceItemOwnerPresentation {\n readonly avatarFallback: string\n readonly id: string\n readonly name: string\n readonly role: string\n readonly roles: ReadonlyArray<Role>\n}\n\nconst collaboratorRoleLabel = (role: Role): string => {\n switch (role) {\n case \"change-owner\":\n case \"issue-owner\":\n case \"page-owner\":\n return \"Owner\"\n case \"issue-assignee\":\n return \"Assignee\"\n case \"author\":\n return \"Author\"\n case \"operator\":\n return \"Operator\"\n default:\n return titleCase(role)\n }\n}\n\nexport const serviceFor = (kind: DeliveryEntityKind): RlyService => {\n switch (kind) {\n case \"issue\":\n return \"jira\"\n case \"pull-request\":\n return \"codecommit\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n }\n}\n\nconst titleCase = (value: string): string =>\n value.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nexport const statusFor = (details: DeliveryEntityDetails): string => {\n switch (details._tag) {\n case \"issue\":\n return details.status\n case \"pull-request\": {\n switch (details.reviewState) {\n case \"changes-requested\":\n return \"Changes requested\"\n case \"approved\":\n return \"Approved\"\n case \"merged\":\n return \"Merged\"\n case \"not-requested\":\n case \"requested\":\n if (details.lifecycle !== null && details.lifecycle !== undefined) return titleCase(details.lifecycle)\n return details.reviewState === \"requested\" ? \"Review requested\" : \"Review not requested\"\n }\n }\n case \"page\":\n case \"pipeline-execution\":\n case \"deployment\":\n return titleCase(details.status)\n case \"time-entry\":\n return titleCase(details.approvalState)\n }\n}\n\nconst issueStatusPresentation = (status: string): Pick<WorkspaceItemPresentation, \"statusGroup\" | \"tone\"> => {\n const value = status.trim().toLocaleLowerCase(\"en-US\")\n if (value === \"blocked\" || value === \"rejected\") return { statusGroup: \"failed\", tone: \"critical\" }\n if (value === \"closed\" || value === \"done\" || value === \"resolved\") {\n return { statusGroup: \"done\", tone: \"positive\" }\n }\n return { statusGroup: \"active\", tone: \"progress\" }\n}\n\nexport const statusPresentation = (\n kind: DeliveryEntityKind,\n status: string\n): Pick<WorkspaceItemPresentation, \"statusGroup\" | \"tone\"> => {\n if (kind === \"issue\") return issueStatusPresentation(status)\n const value = status.toLocaleLowerCase(\"en-US\")\n if (\n [\"blocked\", \"changes requested\", \"failed\", \"rejected\", \"rolled back\", \"stopped\", \"superseded\"].some((part) =>\n value.includes(part)\n )\n ) return { statusGroup: \"failed\", tone: \"critical\" }\n if (\n [\"approved\", \"closed\", \"current\", \"done\", \"merged\", \"not required\", \"ready\", \"resolved\", \"succeeded\"]\n .some((part) => value.includes(part))\n ) return { statusGroup: \"done\", tone: \"positive\" }\n return { statusGroup: \"active\", tone: \"progress\" }\n}\n\nexport const workspaceItemReleaseHref = (\n workspaceId: WorkspaceId,\n releaseId: ReleaseId,\n entityId: EntityId\n): string => `/w/${workspaceId}/releases/${releaseId}?object=${encodeURIComponent(entityId)}#release-work`\n\nconst presentProjection = (\n workspaceId: WorkspaceId,\n entry: ReleaseDeliveryGraphInspection[\"entityProjections\"][number] & {\n readonly canonicalReleaseId: ReleaseId | null\n readonly owners?: ReadonlyArray<WorkspaceEntityOwner>\n readonly ownersTruncated?: boolean\n readonly releaseIds: ReadonlyArray<ReleaseId>\n readonly releaseMembershipsTruncated: boolean\n },\n routableReleaseIds?: ReadonlySet<ReleaseId>\n): WorkspaceItemPresentation => {\n const projection = entry.projection\n const status = statusFor(projection.details)\n const routableMemberships = entry.releaseIds.filter(\n (releaseId) => routableReleaseIds === undefined || routableReleaseIds.has(releaseId)\n )\n const releaseId = entry.releaseIds.length === 1 && !entry.releaseMembershipsTruncated\n ? (routableMemberships[0] ?? null)\n : null\n const owners: ReadonlyArray<WorkspaceItemOwnerPresentation> = (entry.owners ?? []).map(({\n avatarFallback,\n displayName,\n personId,\n roles\n }) => ({\n avatarFallback,\n id: personId,\n name: displayName,\n role: [...new Set(roles.map(collaboratorRoleLabel))].join(\" · \"),\n roles\n }))\n return {\n entityId: projection.entityId,\n freshness: DateTime.formatIso(entry.recordedAt),\n href: workspaceEntityPath(workspaceId, projection.entityId),\n key: projection.displayKey,\n kind: projection.entityType,\n owner: owners.length === 0 ? \"Unassigned\" : owners.map(({ name }) => name).join(\", \"),\n owners,\n ownersTruncated: entry.ownersTruncated ?? false,\n releaseId,\n releaseIds: entry.releaseIds,\n releaseMembershipsTruncated: entry.releaseMembershipsTruncated,\n routableReleaseIds: routableMemberships,\n service: serviceFor(projection.entityType),\n status,\n ...statusPresentation(projection.entityType, status),\n title: projection.title\n }\n}\n\n/** Present one server-authoritative workspace entity index. */\nexport const presentWorkspaceEntityIndex = (\n workspaceId: WorkspaceId,\n index: WorkspaceEntityProjectionIndex,\n routableReleaseIds?: ReadonlySet<ReleaseId>\n): ReadonlyArray<WorkspaceItemPresentation> =>\n index.items\n .filter(({ projection }) => projection.entityState === \"present\")\n .map((entry) => presentProjection(workspaceId, entry, routableReleaseIds))\n .sort((left, right) => left.service.localeCompare(right.service) || left.key.localeCompare(right.key))\n\n/** Present bounded release slices as one deduplicated release-linked item index. */\nexport const presentWorkspaceItems = (\n workspaceId: WorkspaceId,\n inspections: ReadonlyArray<ReleaseDeliveryGraphInspection>\n): ReadonlyArray<WorkspaceItemPresentation> => {\n const items = new Map<EntityId, {\n readonly entry: ReleaseDeliveryGraphInspection[\"entityProjections\"][number]\n readonly releaseIds: Set<ReleaseId>\n }>()\n const canonicalInspections = [...inspections].sort((left, right) => left.releaseId.localeCompare(right.releaseId))\n for (const inspection of canonicalInspections) {\n for (const entry of inspection.entityProjections) {\n const projection = entry.projection\n if (projection.entityState !== \"present\") continue\n const existing = items.get(projection.entityId)\n if (existing !== undefined) {\n existing.releaseIds.add(inspection.releaseId)\n continue\n }\n items.set(projection.entityId, { entry, releaseIds: new Set([inspection.releaseId]) })\n }\n }\n return [...items.values()].map(({ entry, releaseIds: membershipSet }) => {\n const releaseIds = [...membershipSet].sort((left, right) => left.localeCompare(right))\n return presentProjection(workspaceId, {\n ...entry,\n canonicalReleaseId: releaseIds[0] ?? null,\n releaseIds,\n releaseMembershipsTruncated: false\n })\n }).sort((left, right) => left.service.localeCompare(right.service) || left.key.localeCompare(right.key))\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{c as r,n as i,o as a}from"./component-DKy8kjZl-DJ62HeaY.js";var o=e(t(),1);n();var s={root:`rly_Divider-module__root`,horizontal:`rly_Divider-module__horizontal`,vertical:`rly_Divider-module__vertical`,subtle:`rly_Divider-module__subtle`,strong:`rly_Divider-module__strong`},c=e=>r(s,e);a({orientation:{horizontal:{className:c(`horizontal`),purpose:`Separate stacked content`,tokens:[`space-0`]},vertical:{className:c(`vertical`),purpose:`Separate adjacent content`,tokens:[`space-0`]}},strength:{subtle:{className:c(`subtle`),purpose:`Quiet structural boundary`,tokens:[`color-border-1`]},strong:{className:c(`strong`),purpose:`Explicit structural boundary`,tokens:[`color-border-2`]}}}),a({orientation:`horizontal`,strength:`subtle`});var l={root:`rly_IconButton-module__root`,primary:`rly_IconButton-module__primary`,secondary:`rly_IconButton-module__secondary`,quiet:`rly_IconButton-module__quiet`,compact:`rly_IconButton-module__compact`,defaultSize:`rly_IconButton-module__defaultSize`,principal:`rly_IconButton-module__principal`},u=e=>r(l,e);a({variant:{primary:{className:u(`primary`),purpose:`Principal icon action`,tokens:[`color-action-background`,`color-action-foreground`]},secondary:{className:u(`secondary`),purpose:`Default icon action`,tokens:[`color-surface-1`,`color-border-2`]},quiet:{className:u(`quiet`),purpose:`Low-emphasis icon action`,tokens:[`color-text-1`,`color-surface-2`]}},size:{compact:{className:u(`compact`),purpose:`Minimum accessible icon target`,tokens:[`space-40`,`space-4`]},default:{className:u(`defaultSize`),purpose:`Standard icon target`,tokens:[`space-48`]},principal:{className:u(`principal`),purpose:`Prominent icon target`,tokens:[`space-48`,`space-8`]}}}),a({variant:`secondary`,size:`default`});var d={root:`rly_Surface-module__root`,tonePrimary:`rly_Surface-module__tonePrimary`,toneSecondary:`rly_Surface-module__toneSecondary`,toneTertiary:`rly_Surface-module__toneTertiary`,shapeCard:`rly_Surface-module__shapeCard`,shapeGrouped:`rly_Surface-module__shapeGrouped`,paddingNone:`rly_Surface-module__paddingNone`,paddingCompact:`rly_Surface-module__paddingCompact`,paddingDefault:`rly_Surface-module__paddingDefault`,paddingSpacious:`rly_Surface-module__paddingSpacious`},f=e=>r(d,e),p=a({tone:{primary:{className:f(`tonePrimary`),purpose:`Primary bordered surface`,tokens:[`color-surface-1`,`color-border-1`]},secondary:{className:f(`toneSecondary`),purpose:`Quiet secondary surface`,tokens:[`color-surface-2`]},tertiary:{className:f(`toneTertiary`),purpose:`Inset tertiary surface`,tokens:[`color-surface-3`]}},form:{card:{className:f(`shapeCard`),purpose:`Standard card geometry`,tokens:[`radius-control`]},grouped:{className:f(`shapeGrouped`),purpose:`Grouped content geometry`,tokens:[`radius-group`]}},padding:{none:{className:f(`paddingNone`),purpose:`Caller-owned internal layout`,tokens:[`space-0`]},compact:{className:f(`paddingCompact`),purpose:`Dense supporting content`,tokens:[`space-16`]},default:{className:f(`paddingDefault`),purpose:`Standard content`,tokens:[`space-24`]},spacious:{className:f(`paddingSpacious`),purpose:`Prominent grouped content`,tokens:[`space-32`]}}});a({tone:`primary`,form:`card`,padding:`default`});var m=({as:e,children:t,className:n,form:r=`card`,padding:a=`default`,ref:s,tone:c=`primary`,...l})=>(0,o.createElement)(e??`div`,{...l,className:i(f(`root`),p.tone[c].className,p.form[r].className,p.padding[a].className,n),ref:s},t),h={root:`rly_Tabs-module__root`,list:`rly_Tabs-module__list`,trigger:`rly_Tabs-module__trigger`,defaultSize:`rly_Tabs-module__defaultSize`,large:`rly_Tabs-module__large`,panel:`rly_Tabs-module__panel`},g=e=>r(h,e);a({size:{default:{className:g(`defaultSize`),purpose:`Standard section navigation`,tokens:[`type-label`,`space-40`,`space-4`]},large:{className:g(`large`),purpose:`Prominent page-level navigation`,tokens:[`type-body`,`space-48`]}}}),a({size:`default`});var _={root:`rly_Text-module__root`,verdict:`rly_Text-module__verdict`,pageTitle:`rly_Text-module__pageTitle`,sectionTitle:`rly_Text-module__sectionTitle`,cardTitle:`rly_Text-module__cardTitle`,bodyLarge:`rly_Text-module__bodyLarge`,body:`rly_Text-module__body`,label:`rly_Text-module__label`,meta:`rly_Text-module__meta`,code:`rly_Text-module__code`,tonePrimary:`rly_Text-module__tonePrimary`,toneSecondary:`rly_Text-module__toneSecondary`,toneTertiary:`rly_Text-module__toneTertiary`,toneInherit:`rly_Text-module__toneInherit`},v=e=>r(_,e),y=a({variant:{verdict:{className:v(`verdict`),purpose:`One restrained verdict thesis`,tokens:[`type-verdict`]},"page-title":{className:v(`pageTitle`),purpose:`Primary page title`,tokens:[`type-page-title`]},"section-title":{className:v(`sectionTitle`),purpose:`Section heading`,tokens:[`type-section-title`]},"card-title":{className:v(`cardTitle`),purpose:`Card or panel heading`,tokens:[`type-card-title`]},"body-large":{className:v(`bodyLarge`),purpose:`Leading explanatory copy`,tokens:[`type-body-large`]},body:{className:v(`body`),purpose:`Default interface copy`,tokens:[`type-body`]},label:{className:v(`label`),purpose:`Control and metadata labels`,tokens:[`type-label`]},meta:{className:v(`meta`),purpose:`Supporting metadata`,tokens:[`type-meta`]},code:{className:v(`code`),purpose:`Code and tabular data`,tokens:[`type-code`]}},tone:{primary:{className:v(`tonePrimary`),purpose:`Primary readable text`,tokens:[`color-text-1`]},secondary:{className:v(`toneSecondary`),purpose:`Supporting text`,tokens:[`color-text-2`]},tertiary:{className:v(`toneTertiary`),purpose:`Restricted tertiary text`,tokens:[`color-text-3`]},inherit:{className:v(`toneInherit`),purpose:`Inherit semantic context`,tokens:[]}}}),b=a({variant:`body`,tone:`primary`}),x=e=>e===`code`?`code`:e===`verdict`?`p`:e===`label`||e===`meta`?`span`:`p`,S=({as:e,children:t,className:n,ref:r,tone:a=b.tone,variant:s=b.variant,...c})=>(0,o.createElement)(e??x(s),{...c,className:i(v(`root`),y.variant[s].className,y.tone[a].className,n),ref:r},t);export{S as n,m as t};
|
|
2
|
+
//# sourceMappingURL=primitives-DYGtIZqB-r-Glkv2i.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives-DYGtIZqB-r-Glkv2i.js","names":[],"sources":["../../../../rly/dist/primitives-DYGtIZqB.js"],"sourcesContent":["import { i as e } from \"./PortalProvider-CN_81Fy3.js\";\nimport { i as t, n, r, t as i } from \"./component-DKy8kjZl.js\";\nimport { Tabs as a } from \"radix-ui\";\nimport { createElement as o } from \"react\";\nimport { jsx as s, jsxs as c } from \"react/jsx-runtime\";\nvar l = {\n\troot: \"rly_Divider-module__root\",\n\thorizontal: \"rly_Divider-module__horizontal\",\n\tvertical: \"rly_Divider-module__vertical\",\n\tsubtle: \"rly_Divider-module__subtle\",\n\tstrong: \"rly_Divider-module__strong\"\n}, u = (e) => n(l, e), d = r({\n\torientation: {\n\t\thorizontal: {\n\t\t\tclassName: u(\"horizontal\"),\n\t\t\tpurpose: \"Separate stacked content\",\n\t\t\ttokens: [\"space-0\"]\n\t\t},\n\t\tvertical: {\n\t\t\tclassName: u(\"vertical\"),\n\t\t\tpurpose: \"Separate adjacent content\",\n\t\t\ttokens: [\"space-0\"]\n\t\t}\n\t},\n\tstrength: {\n\t\tsubtle: {\n\t\t\tclassName: u(\"subtle\"),\n\t\t\tpurpose: \"Quiet structural boundary\",\n\t\t\ttokens: [\"color-border-1\"]\n\t\t},\n\t\tstrong: {\n\t\t\tclassName: u(\"strong\"),\n\t\t\tpurpose: \"Explicit structural boundary\",\n\t\t\ttokens: [\"color-border-2\"]\n\t\t}\n\t}\n}), f = r({\n\torientation: \"horizontal\",\n\tstrength: \"subtle\"\n}), p = ({ className: e, decorative: n = !0, label: r, orientation: a = \"horizontal\", strength: o = \"subtle\", ...c }) => {\n\tif (!n && r === void 0) throw Error(\"Semantic Divider label must contain visible text\");\n\tlet l = n || r === void 0 ? void 0 : t(r, \"Semantic Divider label\");\n\treturn /* @__PURE__ */ s(\"div\", {\n\t\t...c,\n\t\t\"aria-hidden\": n ? \"true\" : void 0,\n\t\t\"aria-label\": l,\n\t\t\"aria-orientation\": n ? void 0 : a,\n\t\tclassName: i(u(\"root\"), d.orientation[a].className, d.strength[o].className, e),\n\t\trole: n ? \"presentation\" : \"separator\"\n\t});\n}, m = {\n\troot: \"rly_IconButton-module__root\",\n\tprimary: \"rly_IconButton-module__primary\",\n\tsecondary: \"rly_IconButton-module__secondary\",\n\tquiet: \"rly_IconButton-module__quiet\",\n\tcompact: \"rly_IconButton-module__compact\",\n\tdefaultSize: \"rly_IconButton-module__defaultSize\",\n\tprincipal: \"rly_IconButton-module__principal\"\n}, h = (e) => n(m, e), g = r({\n\tvariant: {\n\t\tprimary: {\n\t\t\tclassName: h(\"primary\"),\n\t\t\tpurpose: \"Principal icon action\",\n\t\t\ttokens: [\"color-action-background\", \"color-action-foreground\"]\n\t\t},\n\t\tsecondary: {\n\t\t\tclassName: h(\"secondary\"),\n\t\t\tpurpose: \"Default icon action\",\n\t\t\ttokens: [\"color-surface-1\", \"color-border-2\"]\n\t\t},\n\t\tquiet: {\n\t\t\tclassName: h(\"quiet\"),\n\t\t\tpurpose: \"Low-emphasis icon action\",\n\t\t\ttokens: [\"color-text-1\", \"color-surface-2\"]\n\t\t}\n\t},\n\tsize: {\n\t\tcompact: {\n\t\t\tclassName: h(\"compact\"),\n\t\t\tpurpose: \"Minimum accessible icon target\",\n\t\t\ttokens: [\"space-40\", \"space-4\"]\n\t\t},\n\t\tdefault: {\n\t\t\tclassName: h(\"defaultSize\"),\n\t\t\tpurpose: \"Standard icon target\",\n\t\t\ttokens: [\"space-48\"]\n\t\t},\n\t\tprincipal: {\n\t\t\tclassName: h(\"principal\"),\n\t\t\tpurpose: \"Prominent icon target\",\n\t\t\ttokens: [\"space-48\", \"space-8\"]\n\t\t}\n\t}\n}), _ = r({\n\tvariant: \"secondary\",\n\tsize: \"default\"\n}), v = ({ className: n, disabled: r, icon: a, label: o, loading: c = !1, size: l = \"default\", type: u, variant: d = \"secondary\", ...f }) => /* @__PURE__ */ s(\"button\", {\n\t...f,\n\t\"aria-busy\": c ? \"true\" : void 0,\n\t\"aria-label\": t(o, \"IconButton label\"),\n\tclassName: i(h(\"root\"), g.variant[d].className, g.size[l].className, n),\n\t\"data-loading\": c ? \"true\" : void 0,\n\tdisabled: r || c,\n\ttype: u ?? \"button\",\n\tchildren: /* @__PURE__ */ s(e, {\n\t\tdecorative: !0,\n\t\tname: c ? \"loader\" : a,\n\t\tsize: l === \"compact\" ? \"small\" : \"default\"\n\t})\n}), y = {\n\troot: \"rly_Surface-module__root\",\n\ttonePrimary: \"rly_Surface-module__tonePrimary\",\n\ttoneSecondary: \"rly_Surface-module__toneSecondary\",\n\ttoneTertiary: \"rly_Surface-module__toneTertiary\",\n\tshapeCard: \"rly_Surface-module__shapeCard\",\n\tshapeGrouped: \"rly_Surface-module__shapeGrouped\",\n\tpaddingNone: \"rly_Surface-module__paddingNone\",\n\tpaddingCompact: \"rly_Surface-module__paddingCompact\",\n\tpaddingDefault: \"rly_Surface-module__paddingDefault\",\n\tpaddingSpacious: \"rly_Surface-module__paddingSpacious\"\n}, b = (e) => n(y, e), x = r({\n\ttone: {\n\t\tprimary: {\n\t\t\tclassName: b(\"tonePrimary\"),\n\t\t\tpurpose: \"Primary bordered surface\",\n\t\t\ttokens: [\"color-surface-1\", \"color-border-1\"]\n\t\t},\n\t\tsecondary: {\n\t\t\tclassName: b(\"toneSecondary\"),\n\t\t\tpurpose: \"Quiet secondary surface\",\n\t\t\ttokens: [\"color-surface-2\"]\n\t\t},\n\t\ttertiary: {\n\t\t\tclassName: b(\"toneTertiary\"),\n\t\t\tpurpose: \"Inset tertiary surface\",\n\t\t\ttokens: [\"color-surface-3\"]\n\t\t}\n\t},\n\tform: {\n\t\tcard: {\n\t\t\tclassName: b(\"shapeCard\"),\n\t\t\tpurpose: \"Standard card geometry\",\n\t\t\ttokens: [\"radius-control\"]\n\t\t},\n\t\tgrouped: {\n\t\t\tclassName: b(\"shapeGrouped\"),\n\t\t\tpurpose: \"Grouped content geometry\",\n\t\t\ttokens: [\"radius-group\"]\n\t\t}\n\t},\n\tpadding: {\n\t\tnone: {\n\t\t\tclassName: b(\"paddingNone\"),\n\t\t\tpurpose: \"Caller-owned internal layout\",\n\t\t\ttokens: [\"space-0\"]\n\t\t},\n\t\tcompact: {\n\t\t\tclassName: b(\"paddingCompact\"),\n\t\t\tpurpose: \"Dense supporting content\",\n\t\t\ttokens: [\"space-16\"]\n\t\t},\n\t\tdefault: {\n\t\t\tclassName: b(\"paddingDefault\"),\n\t\t\tpurpose: \"Standard content\",\n\t\t\ttokens: [\"space-24\"]\n\t\t},\n\t\tspacious: {\n\t\t\tclassName: b(\"paddingSpacious\"),\n\t\t\tpurpose: \"Prominent grouped content\",\n\t\t\ttokens: [\"space-32\"]\n\t\t}\n\t}\n}), S = r({\n\ttone: \"primary\",\n\tform: \"card\",\n\tpadding: \"default\"\n}), C = ({ as: e, children: t, className: n, form: r = \"card\", padding: a = \"default\", ref: s, tone: c = \"primary\", ...l }) => o(e ?? \"div\", {\n\t...l,\n\tclassName: i(b(\"root\"), x.tone[c].className, x.form[r].className, x.padding[a].className, n),\n\tref: s\n}, t), w = {\n\troot: \"rly_Tabs-module__root\",\n\tlist: \"rly_Tabs-module__list\",\n\ttrigger: \"rly_Tabs-module__trigger\",\n\tdefaultSize: \"rly_Tabs-module__defaultSize\",\n\tlarge: \"rly_Tabs-module__large\",\n\tpanel: \"rly_Tabs-module__panel\"\n}, T = (e) => n(w, e), E = r({ size: {\n\tdefault: {\n\t\tclassName: T(\"defaultSize\"),\n\t\tpurpose: \"Standard section navigation\",\n\t\ttokens: [\n\t\t\t\"type-label\",\n\t\t\t\"space-40\",\n\t\t\t\"space-4\"\n\t\t]\n\t},\n\tlarge: {\n\t\tclassName: T(\"large\"),\n\t\tpurpose: \"Prominent page-level navigation\",\n\t\ttokens: [\"type-body\", \"space-48\"]\n\t}\n} }), D = r({ size: \"default\" }), O = (e) => {\n\tif (e.length === 0) throw Error(\"Tabs items must contain at least one enabled tab\");\n\tlet n = /* @__PURE__ */ new Set(), r;\n\tfor (let i of e) {\n\t\tlet e = t(i.value, \"Tab value\");\n\t\tif (t(i.label, `Tab label for ${e}`), n.has(e)) throw Error(`Tabs item values must be unique: ${e}`);\n\t\tn.add(e), !i.disabled && r === void 0 && (r = i);\n\t}\n\tif (r === void 0) throw Error(\"Tabs items must contain at least one enabled tab\");\n\treturn r;\n}, k = ({ \"aria-label\": e, className: n, defaultValue: r, direction: o, items: l, onValueChange: u, size: d = \"default\", value: f, ...p }) => {\n\tlet m = t(e, \"Tabs aria-label\"), h = O(l), g = f ?? r ?? h.value, _ = l.find((e) => e.value === g);\n\tif (_ === void 0 || _.disabled) throw Error(`Tabs selected value must identify an enabled tab: ${g}`);\n\tlet v = f === void 0 ? u === void 0 ? { defaultValue: g } : {\n\t\tdefaultValue: g,\n\t\tonValueChange: u\n\t} : {\n\t\tonValueChange: u,\n\t\tvalue: f\n\t}, y = o === void 0 ? {} : { dir: o };\n\treturn /* @__PURE__ */ c(a.Root, {\n\t\t...p,\n\t\t...v,\n\t\t...y,\n\t\tactivationMode: \"automatic\",\n\t\tclassName: i(T(\"root\"), E.size[d].className, n),\n\t\torientation: \"horizontal\",\n\t\tchildren: [/* @__PURE__ */ s(a.List, {\n\t\t\t\"aria-label\": m,\n\t\t\tclassName: T(\"list\"),\n\t\t\tloop: !0,\n\t\t\tchildren: l.map((e) => /* @__PURE__ */ s(a.Trigger, {\n\t\t\t\tclassName: T(\"trigger\"),\n\t\t\t\tdisabled: e.disabled,\n\t\t\t\tvalue: e.value,\n\t\t\t\tchildren: e.label\n\t\t\t}, e.value))\n\t\t}), l.map((e) => /* @__PURE__ */ s(a.Content, {\n\t\t\tclassName: T(\"panel\"),\n\t\t\tvalue: e.value,\n\t\t\tchildren: e.content\n\t\t}, e.value))]\n\t});\n}, A = {\n\troot: \"rly_Text-module__root\",\n\tverdict: \"rly_Text-module__verdict\",\n\tpageTitle: \"rly_Text-module__pageTitle\",\n\tsectionTitle: \"rly_Text-module__sectionTitle\",\n\tcardTitle: \"rly_Text-module__cardTitle\",\n\tbodyLarge: \"rly_Text-module__bodyLarge\",\n\tbody: \"rly_Text-module__body\",\n\tlabel: \"rly_Text-module__label\",\n\tmeta: \"rly_Text-module__meta\",\n\tcode: \"rly_Text-module__code\",\n\ttonePrimary: \"rly_Text-module__tonePrimary\",\n\ttoneSecondary: \"rly_Text-module__toneSecondary\",\n\ttoneTertiary: \"rly_Text-module__toneTertiary\",\n\ttoneInherit: \"rly_Text-module__toneInherit\"\n}, j = (e) => n(A, e), M = r({\n\tvariant: {\n\t\tverdict: {\n\t\t\tclassName: j(\"verdict\"),\n\t\t\tpurpose: \"One restrained verdict thesis\",\n\t\t\ttokens: [\"type-verdict\"]\n\t\t},\n\t\t\"page-title\": {\n\t\t\tclassName: j(\"pageTitle\"),\n\t\t\tpurpose: \"Primary page title\",\n\t\t\ttokens: [\"type-page-title\"]\n\t\t},\n\t\t\"section-title\": {\n\t\t\tclassName: j(\"sectionTitle\"),\n\t\t\tpurpose: \"Section heading\",\n\t\t\ttokens: [\"type-section-title\"]\n\t\t},\n\t\t\"card-title\": {\n\t\t\tclassName: j(\"cardTitle\"),\n\t\t\tpurpose: \"Card or panel heading\",\n\t\t\ttokens: [\"type-card-title\"]\n\t\t},\n\t\t\"body-large\": {\n\t\t\tclassName: j(\"bodyLarge\"),\n\t\t\tpurpose: \"Leading explanatory copy\",\n\t\t\ttokens: [\"type-body-large\"]\n\t\t},\n\t\tbody: {\n\t\t\tclassName: j(\"body\"),\n\t\t\tpurpose: \"Default interface copy\",\n\t\t\ttokens: [\"type-body\"]\n\t\t},\n\t\tlabel: {\n\t\t\tclassName: j(\"label\"),\n\t\t\tpurpose: \"Control and metadata labels\",\n\t\t\ttokens: [\"type-label\"]\n\t\t},\n\t\tmeta: {\n\t\t\tclassName: j(\"meta\"),\n\t\t\tpurpose: \"Supporting metadata\",\n\t\t\ttokens: [\"type-meta\"]\n\t\t},\n\t\tcode: {\n\t\t\tclassName: j(\"code\"),\n\t\t\tpurpose: \"Code and tabular data\",\n\t\t\ttokens: [\"type-code\"]\n\t\t}\n\t},\n\ttone: {\n\t\tprimary: {\n\t\t\tclassName: j(\"tonePrimary\"),\n\t\t\tpurpose: \"Primary readable text\",\n\t\t\ttokens: [\"color-text-1\"]\n\t\t},\n\t\tsecondary: {\n\t\t\tclassName: j(\"toneSecondary\"),\n\t\t\tpurpose: \"Supporting text\",\n\t\t\ttokens: [\"color-text-2\"]\n\t\t},\n\t\ttertiary: {\n\t\t\tclassName: j(\"toneTertiary\"),\n\t\t\tpurpose: \"Restricted tertiary text\",\n\t\t\ttokens: [\"color-text-3\"]\n\t\t},\n\t\tinherit: {\n\t\t\tclassName: j(\"toneInherit\"),\n\t\t\tpurpose: \"Inherit semantic context\",\n\t\t\ttokens: []\n\t\t}\n\t}\n}), N = r({\n\tvariant: \"body\",\n\ttone: \"primary\"\n}), P = (e) => e === \"code\" ? \"code\" : e === \"verdict\" ? \"p\" : e === \"label\" || e === \"meta\" ? \"span\" : \"p\", F = ({ as: e, children: t, className: n, ref: r, tone: a = N.tone, variant: s = N.variant, ...c }) => o(e ?? P(s), {\n\t...c,\n\tclassName: i(j(\"root\"), M.variant[s].className, M.tone[a].className, n),\n\tref: r\n}, t);\n//#endregion\nexport { E as a, x as c, _ as d, g as f, d as h, D as i, C as l, f as m, M as n, k as o, p, F as r, S as s, N as t, v as u };\n\n//# sourceMappingURL=primitives-DYGtIZqB.js.map"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Pt as e,Ya as t}from"./agent-api-CUWP1qs8.js";var n=n=>t(n,`RequestTimedOutApiError`)||t(n,`RateLimitedApiError`)||t(n,`ServiceUnavailableApiError`)||e(n)&&n.reason._tag===`TransportError`,r=e=>t(e,`UnauthorizedApiError`);export{r as n,n as t};
|
|
2
|
+
//# sourceMappingURL=pullRequestReviewFailures-CCNxSXP6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pullRequestReviewFailures-
|
|
1
|
+
{"version":3,"file":"pullRequestReviewFailures-CCNxSXP6.js","names":[],"sources":["../../../src/client/entities/pullRequestReviewFailures.ts"],"sourcesContent":["import * as Predicate from \"effect/Predicate\"\nimport * as HttpClientError from \"effect/unstable/http/HttpClientError\"\n\n/** Whether a review snapshot read can be retried without operator intervention. */\nexport const isRecoverablePullRequestReviewFailure = <UnparsedInput>(failure: UnparsedInput): boolean =>\n Predicate.isTagged(failure, \"RequestTimedOutApiError\") ||\n Predicate.isTagged(failure, \"RateLimitedApiError\") ||\n Predicate.isTagged(failure, \"ServiceUnavailableApiError\") ||\n (\n HttpClientError.isHttpClientError(failure) &&\n failure.reason._tag === \"TransportError\"\n )\n\n/** Whether an authenticated review request proves that the browser session expired. */\nexport const isUnauthorizedPullRequestReviewFailure = <UnparsedInput>(failure: UnparsedInput): boolean =>\n Predicate.isTagged(failure, \"UnauthorizedApiError\")\n"],"mappings":"qDAIA,IAAa,EAAwD,GACnE,EAAmB,EAAS,yBAAyB,GACrD,EAAmB,EAAS,qBAAqB,GACjD,EAAmB,EAAS,4BAA4B,GAEtD,EAAkC,CAAO,GACzC,EAAQ,OAAO,OAAS,iBAIf,EAAyD,GACpE,EAAmB,EAAS,sBAAsB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Oi as e,Ti as t,_i as n,i as r,ki as i,vi as a,yi as o,za as s}from"./agent-api-CUWP1qs8.js";import{a as c,t as l}from"./client-D3WRV6yl.js";import{t as u}from"./authenticatedMutationClient-Bc_-Jpbo.js";import{n as d,t as f}from"./pullRequestReviewFailures-CCNxSXP6.js";var p=128,m=256,h=e=>e.events[0]?.eventSequence??2**53-1,g=(e,t)=>{let n=new Map;for(let r of[...e.events,...t.events]){let e=n.get(r.eventSequence);if(e!==void 0&&!s(e,r))throw Error(`Pull-request review thread contained conflicting duplicate events`);n.set(r.eventSequence,r)}let i=[...n.values()].sort((e,t)=>e.eventSequence-t.eventSequence),a=h(e),o=h(t),c=a<o?e:o<a?t:e.historyLoaded?e:t,l=c.historyLoaded,u=l?i:i.slice(-256);return{events:u,hasEarlier:(a===o?e.historyLoaded&&t.historyLoaded?e.hasEarlier&&t.hasEarlier:e.historyLoaded?e.hasEarlier:t.historyLoaded?t.hasEarlier:e.hasEarlier||t.hasEarlier:c.hasEarlier)||u.length<i.length,historyLoaded:l,nextCursor:r.make(Math.max(e.nextCursor,t.nextCursor)),replayGeneration:Math.max(e.replayGeneration??0,t.replayGeneration??0)}},_=(e,t,n)=>{if(!n.aborted){let n=e.current?.replayGeneration??0,r=t.replayGeneration??n;if(r<n)return e.current??t;let{replacesRetainedWindow:i,...a}=t,o={...a,replayGeneration:r};if(t.replacesRetainedWindow===!0&&r===n&&e.current!==null&&t.nextCursor<e.current.nextCursor)return e.current;let s=e.current!==null&&t.replacesRetainedWindow===!0&&t.events.some(t=>e.current?.events.some(e=>e.eventSequence===t.eventSequence));e.current=e.current===null||r>n||t.replacesRetainedWindow===!0&&t.nextCursor>e.current.nextCursor&&!s?o:g(e.current,a)}return e.current??t},v={enqueue:(e,r,a,o)=>i(n(function*(){return yield*(yield*u).agent.enqueuePullRequestReview({params:{entityId:e},payload:{providerId:r.providerId,model:r.model,profile:`read-only`,reviewProfileId:r.reviewProfile.profileId,...a!==void 0&&{prompt:a}}})}).pipe(t(c)),{signal:o}),targetSuggestion:(e,r,a,o)=>i(n(function*(){return yield*(yield*u).agent.targetReviewSuggestion({params:{entityId:e,jobId:r.jobId,suggestionId:r.suggestionId},payload:{providerId:a.providerId,model:a.model,profile:`read-only`,reviewProfileId:a.reviewProfile.profileId,intent:r.intent,expectedRevisionId:r.expectedRevisionId,expectedSequence:r.expectedSequence}})}).pipe(t(c)),{signal:o}),cancel:(e,r,a)=>i(n(function*(){return yield*(yield*u).agent.cancelPullRequestReview({params:{entityId:e,jobId:r},payload:{}})}).pipe(t(c)),{signal:a}),extendBudget:(e,r,a)=>i(n(function*(){return yield*(yield*u).agent.extendPullRequestReviewBudget({params:{entityId:e,jobId:r},payload:{}})}).pipe(t(c)),{signal:a}),load:(e,r)=>i(n(function*(){return yield*(yield*l()).agent.pullRequestReview({params:{entityId:e}})}).pipe(t(c)),{signal:r}),loadThread:(e,r,a,o=`after`)=>i(n(function*(){return yield*(yield*l()).agent.pullRequestReviewThread({params:{entityId:e},query:r===null?{}:o===`before`?{before:r}:{after:r}})}).pipe(t(c)),{signal:a}),previewPublication:(e,r,a,o,s)=>i(n(function*(){return yield*(yield*l()).agent.previewReviewSuggestionPublication({params:{entityId:e,jobId:r.jobId,suggestionId:r.suggestionId},query:{revisionId:r.revisionId,...o!==void 0&&{operation:o},...s!==void 0&&{commentId:s}}})}).pipe(t(c)),{signal:a}),providers:e=>i(n(function*(){return yield*(yield*l()).agent.providers()}).pipe(t(c)),{signal:e}),publishSuggestion:(e,r,a,o,s,l,d)=>i(n(function*(){return yield*(yield*u).agent.publishReviewSuggestion({params:{entityId:e},payload:{...r,finalContent:a,authorityBinding:o,...l!==void 0&&{operation:l},...d!==void 0&&{commentId:d}}})}).pipe(t(c)),{signal:s})},y=async(e,t,n,r=null)=>{let i=[],a=r;for(let r=0;r<128;r++){let r=await e.loadThread(t,a,n);for(let e of r.events)i.push(e);if(!r.hasMore)return{events:i,hasEarlier:r.hasEarlier,historyLoaded:!1,nextCursor:r.nextCursor};if(a!==null&&r.nextCursor<=a)throw Error(`Pull-request review thread cursor did not advance`);a=r.nextCursor}let o=await e.loadThread(t,null,n);if(o.hasMore||a!==null&&o.nextCursor<=a)throw Error(`Pull-request review thread tail fallback was not usable`);return{events:[...o.events],hasEarlier:!0,historyLoaded:!1,nextCursor:o.nextCursor,replacesRetainedWindow:!0}},b=async(e,t,n,r)=>{let i=await y(e,t,n,r?.nextCursor);if(i.replacesRetainedWindow===!0)return{...i,replayGeneration:(r?.replayGeneration??0)+1};let a=r===void 0?i.events:[...r.events,...i.events],o=r?.historyLoaded??!1,s=o?a:a.slice(-256);return{events:s,hasEarlier:(r?.hasEarlier??!1)||i.hasEarlier||s.length<a.length,historyLoaded:o,nextCursor:i.nextCursor,replayGeneration:r?.replayGeneration??i.replayGeneration??0,...r?.replacesRetainedWindow===!0&&{replacesRetainedWindow:!0}}},x=async(e,t,n,r)=>{let i=r.events[0]?.eventSequence;if(!r.hasEarlier||i===void 0)return r;let a=await e.loadThread(t,i,n,`before`);if(a.events.some((e,t,n)=>e.eventSequence>=i||t>0&&e.eventSequence<=n[t-1].eventSequence)||a.events.length>0&&a.nextCursor>=i||a.hasMore&&a.events.length===0)throw Error(`Pull-request review history cursor did not retreat`);return{events:[...a.events,...r.events],hasEarlier:a.hasMore,historyLoaded:!0,nextCursor:r.nextCursor,replayGeneration:r.replayGeneration??0}},S=(e,t)=>e.baseRevision===t.baseRevision&&e.entityId===t.entityId&&e.headRevision===t.headRevision&&e.sessionKey===t.sessionKey,C=(t,n,r,i,o,s,c,l)=>(async()=>{try{let e=await x(t,n.entityId,i,r);if(i.aborted||o.current===null||!S(o.current,n))return;let a=_(s,e,i);l(e=>e._tag===`ready`&&S(e,n)?{...e,historyAction:`idle`,thread:a}:e)}catch(t){if(i.aborted||o.current===null||!S(o.current,n))return;d(t)&&c(n.sessionKey),e(a(`Pull-request review history load failed`,t)),l(e=>e._tag===`ready`&&S(e,n)?{...e,historyAction:`failed`}:e)}})(),w=async(t,n,r,i,a,s)=>{let c=r?t.providers(i).then(e=>({catalog:e,needsRetry:!1}),t=>{if(i.aborted||!f(t))throw t;return e(o(`Pull-request review provider catalog load failed`,t)),{catalog:{providers:[]},needsRetry:!0}}):Promise.resolve({catalog:{providers:[]},needsRetry:!1}),[l,u,d]=await Promise.all([t.load(n,i),b(t,n,i,a),c]),p=l._tag===`completed`||l._tag===`failed`?await b(t,n,i,u):u;return{catalog:d.catalog,catalogNeedsRetry:d.needsRetry,review:l,thread:_(s,p,i)}},T=async(t,n,r,i,o)=>{try{return _(o,await b(t,n,r,i),r)}catch(t){throw r.aborted||e(a(`Pull-request review thread refresh failed`,t)),t}};export{m as MAXIMUM_RETAINED_REVIEW_THREAD_EVENTS,p as MAXIMUM_REVIEW_THREAD_PAGE_READS,b as continuePullRequestReviewThread,v as generatedClientPullRequestReviewTransport,_ as installNewestThread,y as loadCompletePullRequestReviewThread,x as loadEarlierPullRequestReviewThread,C as loadEarlierPullRequestReviewThreadIntoState,w as loadPullRequestReviewSnapshot,g as mergePullRequestReviewThreads,T as refreshPullRequestReviewThread};
|
|
2
|
+
//# sourceMappingURL=pullRequestReviewThreadReplay-eI3Y4i6s.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pullRequestReviewThreadReplay-CpPdYxQE.js","names":[],"sources":["../../../src/client/entities/pullRequestReviewThreadReplay.ts"],"sourcesContent":["/** Bounded browser replay for a durable pull-request review thread. @module */\nimport * as Effect from \"effect/Effect\"\nimport * as Equal from \"effect/Equal\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { ReleaseAgentThreadCursor } from \"../../api/agent.js\"\nimport type {\n AgentProviderCatalog,\n PullRequestReviewState,\n PullRequestReviewThreadEvent,\n PullRequestReviewThreadPage\n} from \"../../api/agent.js\"\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EntityId } from \"../../domain/identifiers.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\nimport {\n isRecoverablePullRequestReviewFailure,\n isUnauthorizedPullRequestReviewFailure\n} from \"./pullRequestReviewFailures.js\"\nimport type {\n PullRequestReviewControllerState,\n PullRequestReviewScope,\n PullRequestReviewTransport\n} from \"./usePullRequestReview.js\"\n\nexport const MAXIMUM_REVIEW_THREAD_PAGE_READS = 128\nexport const MAXIMUM_RETAINED_REVIEW_THREAD_EVENTS = 256\n\ninterface PullRequestReviewThreadPageTransport {\n readonly loadThread: (\n entityId: EntityId,\n cursor: ReleaseAgentThreadCursor | null,\n signal: AbortSignal,\n direction?: \"after\" | \"before\"\n ) => Promise<PullRequestReviewThreadPage>\n}\n\nexport interface PullRequestReviewThread {\n readonly events: ReadonlyArray<PullRequestReviewThreadEvent>\n readonly hasEarlier: boolean\n readonly historyLoaded: boolean\n readonly nextCursor: ReleaseAgentThreadCursor\n /** Monotonic window identity used to reject reads started before a tail replacement. */\n readonly replayGeneration?: number\n /** Transient signal that a bounded tail must replace, rather than append to, an older window. */\n readonly replacesRetainedWindow?: true\n}\n\ninterface PullRequestReviewThreadRef {\n current: PullRequestReviewThread | null\n}\n\nconst earliestSequence = (thread: PullRequestReviewThread): number =>\n thread.events[0]?.eventSequence ?? Number.MAX_SAFE_INTEGER\n\n/** Merge concurrent live and backward reads without dropping either cursor direction. */\nexport const mergePullRequestReviewThreads = (\n left: PullRequestReviewThread,\n right: PullRequestReviewThread\n): PullRequestReviewThread => {\n const eventsBySequence = new Map<number, PullRequestReviewThreadEvent>()\n for (const event of [...left.events, ...right.events]) {\n const existing = eventsBySequence.get(event.eventSequence)\n if (existing !== undefined && !Equal.equals(existing, event)) {\n throw new Error(\"Pull-request review thread contained conflicting duplicate events\")\n }\n eventsBySequence.set(event.eventSequence, event)\n }\n const allEvents = [...eventsBySequence.values()].sort(\n (left, right) => left.eventSequence - right.eventSequence\n )\n const leftEarliestSequence = earliestSequence(left)\n const rightEarliestSequence = earliestSequence(right)\n const boundary = leftEarliestSequence < rightEarliestSequence\n ? left\n : rightEarliestSequence < leftEarliestSequence\n ? right\n : left.historyLoaded\n ? left\n : right\n const historyLoaded = boundary.historyLoaded\n const events = historyLoaded\n ? allEvents\n : allEvents.slice(-MAXIMUM_RETAINED_REVIEW_THREAD_EVENTS)\n const hasEarlierAtBoundary = leftEarliestSequence !== rightEarliestSequence\n ? boundary.hasEarlier\n : left.historyLoaded && right.historyLoaded\n ? left.hasEarlier && right.hasEarlier\n : left.historyLoaded\n ? left.hasEarlier\n : right.historyLoaded\n ? right.hasEarlier\n : left.hasEarlier || right.hasEarlier\n return {\n events,\n hasEarlier: hasEarlierAtBoundary || events.length < allEvents.length,\n historyLoaded,\n nextCursor: ReleaseAgentThreadCursor.make(\n Math.max(left.nextCursor, right.nextCursor)\n ),\n replayGeneration: Math.max(left.replayGeneration ?? 0, right.replayGeneration ?? 0)\n }\n}\n\nexport const installNewestThread = (\n target: PullRequestReviewThreadRef,\n candidate: PullRequestReviewThread,\n signal: AbortSignal\n): PullRequestReviewThread => {\n if (!signal.aborted) {\n const retainedGeneration = target.current?.replayGeneration ?? 0\n const candidateGeneration = candidate.replayGeneration ?? retainedGeneration\n if (candidateGeneration < retainedGeneration) return target.current ?? candidate\n const { replacesRetainedWindow: _replacesRetainedWindow, ...retainedCandidate } = candidate\n const versionedCandidate = { ...retainedCandidate, replayGeneration: candidateGeneration }\n if (\n candidate.replacesRetainedWindow === true &&\n candidateGeneration === retainedGeneration &&\n target.current !== null &&\n candidate.nextCursor < target.current.nextCursor\n ) return target.current\n const overlapsRetainedWindow = target.current !== null &&\n candidate.replacesRetainedWindow === true &&\n candidate.events.some((candidateEvent) =>\n target.current?.events.some(\n (retainedEvent) => retainedEvent.eventSequence === candidateEvent.eventSequence\n )\n )\n target.current = target.current === null ||\n candidateGeneration > retainedGeneration ||\n (\n candidate.replacesRetainedWindow === true &&\n candidate.nextCursor > target.current.nextCursor &&\n !overlapsRetainedWindow\n )\n ? versionedCandidate\n : mergePullRequestReviewThreads(target.current, retainedCandidate)\n }\n return target.current ?? candidate\n}\n\n/** Generated-client transport kept outside the default workspace-entity chunk. */\nexport const generatedClientPullRequestReviewTransport: PullRequestReviewTransport = {\n enqueue: (entityId, provider, prompt, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.enqueuePullRequestReview({\n params: { entityId },\n payload: {\n providerId: provider.providerId,\n model: provider.model,\n profile: \"read-only\",\n reviewProfileId: provider.reviewProfile.profileId,\n ...(!(prompt === undefined) && { prompt })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n targetSuggestion: (entityId, target, provider, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.targetReviewSuggestion({\n params: {\n entityId,\n jobId: target.jobId,\n suggestionId: target.suggestionId\n },\n payload: {\n providerId: provider.providerId,\n model: provider.model,\n profile: \"read-only\",\n reviewProfileId: provider.reviewProfile.profileId,\n intent: target.intent,\n expectedRevisionId: target.expectedRevisionId,\n expectedSequence: target.expectedSequence\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n cancel: (entityId, jobId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.cancelPullRequestReview({\n params: { entityId, jobId },\n payload: {}\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n extendBudget: (entityId, jobId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.extendPullRequestReviewBudget({\n params: { entityId, jobId },\n payload: {}\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n load: (entityId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.pullRequestReview({ params: { entityId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n loadThread: (entityId, cursor, signal, direction = \"after\") =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.pullRequestReviewThread({\n params: { entityId },\n query: cursor === null\n ? {}\n : direction === \"before\"\n ? { before: cursor }\n : { after: cursor }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n previewPublication: (entityId, selection, signal, operation, commentId) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.previewReviewSuggestionPublication({\n params: {\n entityId,\n jobId: selection.jobId,\n suggestionId: selection.suggestionId\n },\n query: {\n revisionId: selection.revisionId,\n ...(!(operation === undefined) && { operation }),\n ...(!(commentId === undefined) && { commentId })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n providers: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.providers()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n publishSuggestion: (entityId, selection, finalContent, authorityBinding, signal, operation, commentId) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.publishReviewSuggestion({\n params: { entityId },\n payload: {\n ...selection,\n finalContent,\n authorityBinding,\n ...(!(operation === undefined) && { operation }),\n ...(!(commentId === undefined) && { commentId })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Follow advancing cursors to the durable tail without allowing unbounded replay. */\nexport const loadCompletePullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n initialCursor: ReleaseAgentThreadCursor | null = null\n): Promise<PullRequestReviewThread> => {\n const events = new Array<PullRequestReviewThreadEvent>()\n let after = initialCursor\n for (let pageRead = 0; pageRead < MAXIMUM_REVIEW_THREAD_PAGE_READS; pageRead++) {\n const page = await transport.loadThread(entityId, after, signal)\n for (const event of page.events) events.push(event)\n if (!page.hasMore) {\n return {\n events,\n hasEarlier: page.hasEarlier,\n historyLoaded: false,\n nextCursor: page.nextCursor\n }\n }\n if (after !== null && page.nextCursor <= after) {\n throw new Error(\"Pull-request review thread cursor did not advance\")\n }\n after = page.nextCursor\n }\n const tail = await transport.loadThread(entityId, null, signal)\n if (tail.hasMore || (after !== null && tail.nextCursor <= after)) {\n throw new Error(\"Pull-request review thread tail fallback was not usable\")\n }\n return {\n events: [...tail.events],\n hasEarlier: true,\n historyLoaded: false,\n nextCursor: tail.nextCursor,\n replacesRetainedWindow: true\n }\n}\n\n/** Continue one previously loaded thread without replaying its durable prefix. */\nexport const continuePullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n previous?: PullRequestReviewThread\n): Promise<PullRequestReviewThread> => {\n const update = await loadCompletePullRequestReviewThread(\n transport,\n entityId,\n signal,\n previous?.nextCursor\n )\n if (update.replacesRetainedWindow === true) {\n return {\n ...update,\n replayGeneration: (previous?.replayGeneration ?? 0) + 1\n }\n }\n const events = previous === undefined\n ? update.events\n : [...previous.events, ...update.events]\n const historyLoaded = previous?.historyLoaded ?? false\n const retainedEvents = historyLoaded\n ? events\n : events.slice(-MAXIMUM_RETAINED_REVIEW_THREAD_EVENTS)\n return {\n events: retainedEvents,\n hasEarlier: (previous?.hasEarlier ?? false) ||\n update.hasEarlier ||\n retainedEvents.length < events.length,\n historyLoaded,\n nextCursor: update.nextCursor,\n replayGeneration: previous?.replayGeneration ?? update.replayGeneration ?? 0,\n ...((previous?.replacesRetainedWindow === true) && { replacesRetainedWindow: true })\n }\n}\n\n/** Prepend one explicit bounded history page without disturbing live replay. */\nexport const loadEarlierPullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n previous: PullRequestReviewThread\n): Promise<PullRequestReviewThread> => {\n const before = previous.events[0]?.eventSequence\n if (!previous.hasEarlier || before === undefined) return previous\n const page = await transport.loadThread(entityId, before, signal, \"before\")\n const invalidEvent = page.events.some(\n (event, index, events) =>\n event.eventSequence >= before ||\n (index > 0 && event.eventSequence <= events[index - 1]!.eventSequence)\n )\n if (\n invalidEvent ||\n (page.events.length > 0 && page.nextCursor >= before) ||\n (page.hasMore && page.events.length === 0)\n ) {\n throw new Error(\"Pull-request review history cursor did not retreat\")\n }\n return {\n events: [...page.events, ...previous.events],\n hasEarlier: page.hasMore,\n historyLoaded: true,\n nextCursor: previous.nextCursor,\n replayGeneration: previous.replayGeneration ?? 0\n }\n}\n\ntype ReadyPullRequestReviewState = Extract<\n PullRequestReviewControllerState,\n { readonly _tag: \"ready\" }\n>\n\nconst sameReviewScope = (\n left: PullRequestReviewScope,\n right: PullRequestReviewScope\n): boolean =>\n left.baseRevision === right.baseRevision &&\n left.entityId === right.entityId &&\n left.headRevision === right.headRevision &&\n left.sessionKey === right.sessionKey\n\n/** Apply one dynamic history read without growing the default entity-route chunk. */\nexport const loadEarlierPullRequestReviewThreadIntoState = (\n transport: PullRequestReviewThreadPageTransport,\n current: ReadyPullRequestReviewState,\n currentThread: PullRequestReviewThread,\n signal: AbortSignal,\n latestScope: { current: PullRequestReviewScope | null },\n latestThread: PullRequestReviewThreadRef,\n onSessionExpired: (sessionKey: string) => void,\n setState: (\n update: (state: PullRequestReviewControllerState) => PullRequestReviewControllerState\n ) => void\n): Promise<void> => {\n const run = async (): Promise<void> => {\n try {\n const thread = await loadEarlierPullRequestReviewThread(\n transport,\n current.entityId,\n signal,\n currentThread\n )\n if (\n signal.aborted ||\n latestScope.current === null ||\n !sameReviewScope(latestScope.current, current)\n ) return\n const installed = installNewestThread(latestThread, thread, signal)\n setState((latest) =>\n latest._tag === \"ready\" && sameReviewScope(latest, current)\n ? { ...latest, historyAction: \"idle\", thread: installed }\n : latest\n )\n } catch (failure) {\n if (\n signal.aborted ||\n latestScope.current === null ||\n !sameReviewScope(latestScope.current, current)\n ) return\n if (isUnauthorizedPullRequestReviewFailure(failure)) {\n onSessionExpired(current.sessionKey)\n }\n Effect.runFork(Effect.logError(\"Pull-request review history load failed\", failure))\n setState((latest) =>\n latest._tag === \"ready\" && sameReviewScope(latest, current)\n ? { ...latest, historyAction: \"failed\" }\n : latest\n )\n }\n }\n return run()\n}\n\n/** Load one coherent review snapshot and close a pending-to-terminal tail race. */\nexport const loadPullRequestReviewSnapshot = async (\n transport: PullRequestReviewTransport,\n entityId: EntityId,\n canEnqueue: boolean,\n signal: AbortSignal,\n previous: PullRequestReviewThread | undefined,\n target: PullRequestReviewThreadRef\n): Promise<{\n readonly catalog: AgentProviderCatalog\n readonly catalogNeedsRetry: boolean\n readonly review: PullRequestReviewState\n readonly thread: PullRequestReviewThread\n}> => {\n const catalogPromise = canEnqueue\n ? transport.providers(signal).then(\n (catalog) => ({ catalog, needsRetry: false }),\n <UnparsedInput>(failure: UnparsedInput) => {\n if (signal.aborted || !isRecoverablePullRequestReviewFailure(failure)) throw failure\n Effect.runFork(Effect.logWarning(\"Pull-request review provider catalog load failed\", failure))\n return {\n catalog: { providers: [] } satisfies AgentProviderCatalog,\n needsRetry: true\n }\n }\n )\n : Promise.resolve({\n catalog: { providers: [] } satisfies AgentProviderCatalog,\n needsRetry: false\n })\n const [review, initialThread, catalogResult] = await Promise.all([\n transport.load(entityId, signal),\n continuePullRequestReviewThread(transport, entityId, signal, previous),\n catalogPromise\n ])\n const thread = review._tag === \"completed\" || review._tag === \"failed\"\n ? await continuePullRequestReviewThread(transport, entityId, signal, initialThread)\n : initialThread\n return {\n catalog: catalogResult.catalog,\n catalogNeedsRetry: catalogResult.needsRetry,\n review,\n thread: installNewestThread(target, thread, signal)\n }\n}\n\n/** Continue a visible thread while retaining diagnostics for non-fatal refresh failures. */\nexport const refreshPullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n previous: PullRequestReviewThread | undefined,\n target: PullRequestReviewThreadRef\n): Promise<PullRequestReviewThread> => {\n try {\n const thread = await continuePullRequestReviewThread(transport, entityId, signal, previous)\n return installNewestThread(target, thread, signal)\n } catch (failure) {\n if (!signal.aborted) {\n Effect.runFork(Effect.logError(\"Pull-request review thread refresh failed\", failure))\n }\n throw failure\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pullRequestReviewThreadReplay-eI3Y4i6s.js","names":[],"sources":["../../../src/client/entities/pullRequestReviewThreadReplay.ts"],"sourcesContent":["/** Bounded browser replay for a durable pull-request review thread. @module */\nimport * as Effect from \"effect/Effect\"\nimport * as Equal from \"effect/Equal\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { ReleaseAgentThreadCursor } from \"../../api/agent.js\"\nimport type {\n AgentProviderCatalog,\n PullRequestReviewState,\n PullRequestReviewThreadEvent,\n PullRequestReviewThreadPage\n} from \"../../api/agent.js\"\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EntityId } from \"../../domain/identifiers.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\nimport {\n isRecoverablePullRequestReviewFailure,\n isUnauthorizedPullRequestReviewFailure\n} from \"./pullRequestReviewFailures.js\"\nimport type {\n PullRequestReviewControllerState,\n PullRequestReviewScope,\n PullRequestReviewTransport\n} from \"./usePullRequestReview.js\"\n\nexport const MAXIMUM_REVIEW_THREAD_PAGE_READS = 128\nexport const MAXIMUM_RETAINED_REVIEW_THREAD_EVENTS = 256\n\ninterface PullRequestReviewThreadPageTransport {\n readonly loadThread: (\n entityId: EntityId,\n cursor: ReleaseAgentThreadCursor | null,\n signal: AbortSignal,\n direction?: \"after\" | \"before\"\n ) => Promise<PullRequestReviewThreadPage>\n}\n\nexport interface PullRequestReviewThread {\n readonly events: ReadonlyArray<PullRequestReviewThreadEvent>\n readonly hasEarlier: boolean\n readonly historyLoaded: boolean\n readonly nextCursor: ReleaseAgentThreadCursor\n /** Monotonic window identity used to reject reads started before a tail replacement. */\n readonly replayGeneration?: number\n /** Transient signal that a bounded tail must replace, rather than append to, an older window. */\n readonly replacesRetainedWindow?: true\n}\n\ninterface PullRequestReviewThreadRef {\n current: PullRequestReviewThread | null\n}\n\nconst earliestSequence = (thread: PullRequestReviewThread): number =>\n thread.events[0]?.eventSequence ?? Number.MAX_SAFE_INTEGER\n\n/** Merge concurrent live and backward reads without dropping either cursor direction. */\nexport const mergePullRequestReviewThreads = (\n left: PullRequestReviewThread,\n right: PullRequestReviewThread\n): PullRequestReviewThread => {\n const eventsBySequence = new Map<number, PullRequestReviewThreadEvent>()\n for (const event of [...left.events, ...right.events]) {\n const existing = eventsBySequence.get(event.eventSequence)\n if (existing !== undefined && !Equal.equals(existing, event)) {\n throw new Error(\"Pull-request review thread contained conflicting duplicate events\")\n }\n eventsBySequence.set(event.eventSequence, event)\n }\n const allEvents = [...eventsBySequence.values()].sort(\n (left, right) => left.eventSequence - right.eventSequence\n )\n const leftEarliestSequence = earliestSequence(left)\n const rightEarliestSequence = earliestSequence(right)\n const boundary = leftEarliestSequence < rightEarliestSequence\n ? left\n : rightEarliestSequence < leftEarliestSequence\n ? right\n : left.historyLoaded\n ? left\n : right\n const historyLoaded = boundary.historyLoaded\n const events = historyLoaded\n ? allEvents\n : allEvents.slice(-MAXIMUM_RETAINED_REVIEW_THREAD_EVENTS)\n const hasEarlierAtBoundary = leftEarliestSequence !== rightEarliestSequence\n ? boundary.hasEarlier\n : left.historyLoaded && right.historyLoaded\n ? left.hasEarlier && right.hasEarlier\n : left.historyLoaded\n ? left.hasEarlier\n : right.historyLoaded\n ? right.hasEarlier\n : left.hasEarlier || right.hasEarlier\n return {\n events,\n hasEarlier: hasEarlierAtBoundary || events.length < allEvents.length,\n historyLoaded,\n nextCursor: ReleaseAgentThreadCursor.make(\n Math.max(left.nextCursor, right.nextCursor)\n ),\n replayGeneration: Math.max(left.replayGeneration ?? 0, right.replayGeneration ?? 0)\n }\n}\n\nexport const installNewestThread = (\n target: PullRequestReviewThreadRef,\n candidate: PullRequestReviewThread,\n signal: AbortSignal\n): PullRequestReviewThread => {\n if (!signal.aborted) {\n const retainedGeneration = target.current?.replayGeneration ?? 0\n const candidateGeneration = candidate.replayGeneration ?? retainedGeneration\n if (candidateGeneration < retainedGeneration) return target.current ?? candidate\n const { replacesRetainedWindow: _replacesRetainedWindow, ...retainedCandidate } = candidate\n const versionedCandidate = { ...retainedCandidate, replayGeneration: candidateGeneration }\n if (\n candidate.replacesRetainedWindow === true &&\n candidateGeneration === retainedGeneration &&\n target.current !== null &&\n candidate.nextCursor < target.current.nextCursor\n ) return target.current\n const overlapsRetainedWindow = target.current !== null &&\n candidate.replacesRetainedWindow === true &&\n candidate.events.some((candidateEvent) =>\n target.current?.events.some(\n (retainedEvent) => retainedEvent.eventSequence === candidateEvent.eventSequence\n )\n )\n target.current = target.current === null ||\n candidateGeneration > retainedGeneration ||\n (\n candidate.replacesRetainedWindow === true &&\n candidate.nextCursor > target.current.nextCursor &&\n !overlapsRetainedWindow\n )\n ? versionedCandidate\n : mergePullRequestReviewThreads(target.current, retainedCandidate)\n }\n return target.current ?? candidate\n}\n\n/** Generated-client transport kept outside the default workspace-entity chunk. */\nexport const generatedClientPullRequestReviewTransport: PullRequestReviewTransport = {\n enqueue: (entityId, provider, prompt, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.enqueuePullRequestReview({\n params: { entityId },\n payload: {\n providerId: provider.providerId,\n model: provider.model,\n profile: \"read-only\",\n reviewProfileId: provider.reviewProfile.profileId,\n ...(!(prompt === undefined) && { prompt })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n targetSuggestion: (entityId, target, provider, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.targetReviewSuggestion({\n params: {\n entityId,\n jobId: target.jobId,\n suggestionId: target.suggestionId\n },\n payload: {\n providerId: provider.providerId,\n model: provider.model,\n profile: \"read-only\",\n reviewProfileId: provider.reviewProfile.profileId,\n intent: target.intent,\n expectedRevisionId: target.expectedRevisionId,\n expectedSequence: target.expectedSequence\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n cancel: (entityId, jobId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.cancelPullRequestReview({\n params: { entityId, jobId },\n payload: {}\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n extendBudget: (entityId, jobId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.extendPullRequestReviewBudget({\n params: { entityId, jobId },\n payload: {}\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n load: (entityId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.pullRequestReview({ params: { entityId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n loadThread: (entityId, cursor, signal, direction = \"after\") =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.pullRequestReviewThread({\n params: { entityId },\n query: cursor === null\n ? {}\n : direction === \"before\"\n ? { before: cursor }\n : { after: cursor }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n previewPublication: (entityId, selection, signal, operation, commentId) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.previewReviewSuggestionPublication({\n params: {\n entityId,\n jobId: selection.jobId,\n suggestionId: selection.suggestionId\n },\n query: {\n revisionId: selection.revisionId,\n ...(!(operation === undefined) && { operation }),\n ...(!(commentId === undefined) && { commentId })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n providers: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.agent.providers()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n publishSuggestion: (entityId, selection, finalContent, authorityBinding, signal, operation, commentId) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.agent.publishReviewSuggestion({\n params: { entityId },\n payload: {\n ...selection,\n finalContent,\n authorityBinding,\n ...(!(operation === undefined) && { operation }),\n ...(!(commentId === undefined) && { commentId })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Follow advancing cursors to the durable tail without allowing unbounded replay. */\nexport const loadCompletePullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n initialCursor: ReleaseAgentThreadCursor | null = null\n): Promise<PullRequestReviewThread> => {\n const events = new Array<PullRequestReviewThreadEvent>()\n let after = initialCursor\n for (let pageRead = 0; pageRead < MAXIMUM_REVIEW_THREAD_PAGE_READS; pageRead++) {\n const page = await transport.loadThread(entityId, after, signal)\n for (const event of page.events) events.push(event)\n if (!page.hasMore) {\n return {\n events,\n hasEarlier: page.hasEarlier,\n historyLoaded: false,\n nextCursor: page.nextCursor\n }\n }\n if (after !== null && page.nextCursor <= after) {\n throw new Error(\"Pull-request review thread cursor did not advance\")\n }\n after = page.nextCursor\n }\n const tail = await transport.loadThread(entityId, null, signal)\n if (tail.hasMore || (after !== null && tail.nextCursor <= after)) {\n throw new Error(\"Pull-request review thread tail fallback was not usable\")\n }\n return {\n events: [...tail.events],\n hasEarlier: true,\n historyLoaded: false,\n nextCursor: tail.nextCursor,\n replacesRetainedWindow: true\n }\n}\n\n/** Continue one previously loaded thread without replaying its durable prefix. */\nexport const continuePullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n previous?: PullRequestReviewThread\n): Promise<PullRequestReviewThread> => {\n const update = await loadCompletePullRequestReviewThread(\n transport,\n entityId,\n signal,\n previous?.nextCursor\n )\n if (update.replacesRetainedWindow === true) {\n return {\n ...update,\n replayGeneration: (previous?.replayGeneration ?? 0) + 1\n }\n }\n const events = previous === undefined\n ? update.events\n : [...previous.events, ...update.events]\n const historyLoaded = previous?.historyLoaded ?? false\n const retainedEvents = historyLoaded\n ? events\n : events.slice(-MAXIMUM_RETAINED_REVIEW_THREAD_EVENTS)\n return {\n events: retainedEvents,\n hasEarlier: (previous?.hasEarlier ?? false) ||\n update.hasEarlier ||\n retainedEvents.length < events.length,\n historyLoaded,\n nextCursor: update.nextCursor,\n replayGeneration: previous?.replayGeneration ?? update.replayGeneration ?? 0,\n ...((previous?.replacesRetainedWindow === true) && { replacesRetainedWindow: true })\n }\n}\n\n/** Prepend one explicit bounded history page without disturbing live replay. */\nexport const loadEarlierPullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n previous: PullRequestReviewThread\n): Promise<PullRequestReviewThread> => {\n const before = previous.events[0]?.eventSequence\n if (!previous.hasEarlier || before === undefined) return previous\n const page = await transport.loadThread(entityId, before, signal, \"before\")\n const invalidEvent = page.events.some(\n (event, index, events) =>\n event.eventSequence >= before ||\n (index > 0 && event.eventSequence <= events[index - 1]!.eventSequence)\n )\n if (\n invalidEvent ||\n (page.events.length > 0 && page.nextCursor >= before) ||\n (page.hasMore && page.events.length === 0)\n ) {\n throw new Error(\"Pull-request review history cursor did not retreat\")\n }\n return {\n events: [...page.events, ...previous.events],\n hasEarlier: page.hasMore,\n historyLoaded: true,\n nextCursor: previous.nextCursor,\n replayGeneration: previous.replayGeneration ?? 0\n }\n}\n\ntype ReadyPullRequestReviewState = Extract<\n PullRequestReviewControllerState,\n { readonly _tag: \"ready\" }\n>\n\nconst sameReviewScope = (\n left: PullRequestReviewScope,\n right: PullRequestReviewScope\n): boolean =>\n left.baseRevision === right.baseRevision &&\n left.entityId === right.entityId &&\n left.headRevision === right.headRevision &&\n left.sessionKey === right.sessionKey\n\n/** Apply one dynamic history read without growing the default entity-route chunk. */\nexport const loadEarlierPullRequestReviewThreadIntoState = (\n transport: PullRequestReviewThreadPageTransport,\n current: ReadyPullRequestReviewState,\n currentThread: PullRequestReviewThread,\n signal: AbortSignal,\n latestScope: { current: PullRequestReviewScope | null },\n latestThread: PullRequestReviewThreadRef,\n onSessionExpired: (sessionKey: string) => void,\n setState: (\n update: (state: PullRequestReviewControllerState) => PullRequestReviewControllerState\n ) => void\n): Promise<void> => {\n const run = async (): Promise<void> => {\n try {\n const thread = await loadEarlierPullRequestReviewThread(\n transport,\n current.entityId,\n signal,\n currentThread\n )\n if (\n signal.aborted ||\n latestScope.current === null ||\n !sameReviewScope(latestScope.current, current)\n ) return\n const installed = installNewestThread(latestThread, thread, signal)\n setState((latest) =>\n latest._tag === \"ready\" && sameReviewScope(latest, current)\n ? { ...latest, historyAction: \"idle\", thread: installed }\n : latest\n )\n } catch (failure) {\n if (\n signal.aborted ||\n latestScope.current === null ||\n !sameReviewScope(latestScope.current, current)\n ) return\n if (isUnauthorizedPullRequestReviewFailure(failure)) {\n onSessionExpired(current.sessionKey)\n }\n Effect.runFork(Effect.logError(\"Pull-request review history load failed\", failure))\n setState((latest) =>\n latest._tag === \"ready\" && sameReviewScope(latest, current)\n ? { ...latest, historyAction: \"failed\" }\n : latest\n )\n }\n }\n return run()\n}\n\n/** Load one coherent review snapshot and close a pending-to-terminal tail race. */\nexport const loadPullRequestReviewSnapshot = async (\n transport: PullRequestReviewTransport,\n entityId: EntityId,\n canEnqueue: boolean,\n signal: AbortSignal,\n previous: PullRequestReviewThread | undefined,\n target: PullRequestReviewThreadRef\n): Promise<{\n readonly catalog: AgentProviderCatalog\n readonly catalogNeedsRetry: boolean\n readonly review: PullRequestReviewState\n readonly thread: PullRequestReviewThread\n}> => {\n const catalogPromise = canEnqueue\n ? transport.providers(signal).then(\n (catalog) => ({ catalog, needsRetry: false }),\n <UnparsedInput>(failure: UnparsedInput) => {\n if (signal.aborted || !isRecoverablePullRequestReviewFailure(failure)) throw failure\n Effect.runFork(Effect.logWarning(\"Pull-request review provider catalog load failed\", failure))\n return {\n catalog: { providers: [] } satisfies AgentProviderCatalog,\n needsRetry: true\n }\n }\n )\n : Promise.resolve({\n catalog: { providers: [] } satisfies AgentProviderCatalog,\n needsRetry: false\n })\n const [review, initialThread, catalogResult] = await Promise.all([\n transport.load(entityId, signal),\n continuePullRequestReviewThread(transport, entityId, signal, previous),\n catalogPromise\n ])\n const thread = review._tag === \"completed\" || review._tag === \"failed\"\n ? await continuePullRequestReviewThread(transport, entityId, signal, initialThread)\n : initialThread\n return {\n catalog: catalogResult.catalog,\n catalogNeedsRetry: catalogResult.needsRetry,\n review,\n thread: installNewestThread(target, thread, signal)\n }\n}\n\n/** Continue a visible thread while retaining diagnostics for non-fatal refresh failures. */\nexport const refreshPullRequestReviewThread = async (\n transport: PullRequestReviewThreadPageTransport,\n entityId: EntityId,\n signal: AbortSignal,\n previous: PullRequestReviewThread | undefined,\n target: PullRequestReviewThreadRef\n): Promise<PullRequestReviewThread> => {\n try {\n const thread = await continuePullRequestReviewThread(transport, entityId, signal, previous)\n return installNewestThread(target, thread, signal)\n } catch (failure) {\n if (!signal.aborted) {\n Effect.runFork(Effect.logError(\"Pull-request review thread refresh failed\", failure))\n }\n throw failure\n }\n}\n"],"mappings":"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"}
|
package/dist/client/assets/{releaseAgentTransport-BCQDYqZt.js → releaseAgentTransport-CJjWwE8y.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{
|
|
2
|
-
//# sourceMappingURL=releaseAgentTransport-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{Jr as n,Ti as r,Ya as i,Yi as a,_i as o,ei as s,ki as c,mi as l}from"./agent-api-CUWP1qs8.js";import{a as u,t as d}from"./client-D3WRV6yl.js";import{t as f}from"./authenticatedMutationClient-Bc_-Jpbo.js";var p=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),m=e=>e===void 0?null:{dateTime:n(e),label:p.format(s(e))},h=(e,t)=>e===void 0?`${t} not synchronized`:`${e.complete?`Complete`:`Partial`} · ${String(e.pagesFetched)} bounded page${e.pagesFetched===1?``:`s`} read`,g=e=>e===null?`Size unavailable`:e<1024?`${String(e)} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`,_=e=>e.map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` · `),v=e=>{let t=new Map;for(let n of e){let e=t.get(n.sourcePersonId),r=e===void 0?n.roles:[...new Set([...e.roles,...n.roles])],i=e?.resolved===!0&&!n.resolved?e:n;t.set(n.sourcePersonId,{...i,roles:r})}return[...t.values()]},y=(e,t)=>{let n=v(e.contributors??[]),r=new Map(n.map(({displayName:e,sourcePersonId:t})=>[t,e])),i=e.contentState===`lazy`?`lazy`:e.content===null||e.content===void 0?`empty`:`loaded`;return{attachmentInventoryLabel:h(e.attachmentInventory,`Attachment inventory`),attachments:(e.attachments??[]).map(e=>({createdAt:m(e.createdAt),fileSize:g(e.fileSize),id:e.id,mediaType:e.mediaType??`Type unavailable`,title:e.title,version:e.version===null?`Version unavailable`:`v${String(e.version)}`})),content:i===`loaded`?e.content?.markdown??null:null,contentState:i,contributors:n.map(e=>({id:e.sourcePersonId,name:e.displayName,role:`${_(e.roles)}${e.external?` · External`:``}${e.resolved?``:` · Identity unresolved`}`})),createdAt:m(e.createdAt),historyInventoryLabel:h(e.versionHistory,`Revision history`),revision:e.revision,runbookEvidenceCount:t.graph.evidenceItems.length,sourceSpaceId:e.sourceSpaceId??e.spaceKey,status:e.status===`superseded`?`Superseded`:e.status===`draft`?`Draft`:`Current`,taskUpdatesSafe:e.taskUpdatesSafe===!0,updatedAt:m(e.updatedAt),versions:(e.versions??[]).map(e=>({author:e.authorSourcePersonId===null?`Author unavailable`:r.get(e.authorSourcePersonId)??`Identity not resolved`,createdAt:m(e.createdAt),message:e.message??`No revision note`,minorEdit:e.minorEdit,number:e.number})),watcherInventoryLabel:h(e.watcherInventory,`Watcher inventory`)}},b=e(t(),1),x=i(`UnauthorizedApiError`),S=i(`NotFoundApiError`),C=(e,t)=>e._tag!==`idle`&&e.entityId===t.entityId&&e.sessionKey===t.sessionKey&&e.workspaceId===t.workspaceId,w=(e,t)=>C(e,t)&&(e._tag===`ready`||e._tag===`stale`)?e.inspection:null,T=(e,t)=>!e.isSourceCurrent||e.freshness?._tag===`stale`?{_tag:`stale`,inspection:e,reason:`source-stale`,...t}:{_tag:`ready`,inspection:e,...t},E={load:(e,t)=>c(o(function*(){return yield*(yield*d()).deliveryGraph.workspaceEntity({params:{entityId:e}})}).pipe(r(u)),{signal:t})},D=(e,t,n,r,i,a=E)=>{let[o,s]=(0,b.useState)(0),[c,l]=(0,b.useState)({_tag:`idle`});(0,b.useEffect)(()=>{if(r===null){l({_tag:`idle`});return}let o={entityId:t,refreshKey:n,sessionKey:r,workspaceId:e},s=new AbortController;return l(e=>{let t=w(e,o);return t===null?{_tag:`loading`,...o}:{_tag:`stale`,inspection:t,reason:`refreshing`,...o}}),a.load(t,s.signal).then(e=>{s.signal.aborted||l(T(e,o))},e=>{if(!s.signal.aborted){if(x(e)){i(r),l({_tag:`failed`,...o});return}if(S(e)){l({_tag:`not-found`,...o});return}l(e=>{let t=w(e,o);return t===null?{_tag:`failed`,...o}:{_tag:`stale`,inspection:t,reason:`refresh-failed`,...o}})}}),()=>s.abort()},[t,i,n,o,r,a,e]);let u=r===null?null:{entityId:t,refreshKey:n,sessionKey:r,workspaceId:e},d=u===null?{_tag:`idle`}:c._tag===`idle`||!C(c,u)?{_tag:`loading`,...u}:c.refreshKey!==n&&(c._tag===`ready`||c._tag===`stale`)?{_tag:`stale`,inspection:c.inspection,reason:`refreshing`,...u}:c.refreshKey===n?c:{_tag:`loading`,...u};return{retry:(0,b.useCallback)(()=>s(e=>e+1),[]),state:d}},O=e=>c(o(function*(){return yield*(yield*f).agent.submitReleasePublication({params:{releaseId:e.releaseId},payload:{provider:e.provider,title:e.title,markdown:e.markdown,parentId:null,...e.publicationActionId!==void 0&&{publicationActionId:e.publicationActionId},...e.templateEntityId!==void 0&&{templateEntityId:e.templateEntityId},...e.targetEntityId!==void 0&&{targetEntityId:e.targetEntityId},...e.targetRevision!==void 0&&{targetRevision:e.targetRevision}}})}).pipe(r(u)),e.signal===void 0?void 0:{signal:e.signal}),k=class extends a(`ReleaseAgentProtocolError`){},A=l(`ReleaseAgentTransport.runTurn`)(function*(e){let t=yield*(yield*f).agent.turn({params:{releaseId:e.releaseId},payload:{history:e.history,...e.originPath!==void 0&&{originPath:e.originPath},prompt:e.prompt,provider:e.provider}});return t.releaseId!==e.releaseId||t.release.releaseId!==e.releaseId?yield*new k:{eventCursor:t.eventCursor,provider:t.provider,release:t.release,reply:t.reply}}),j=l(`ReleaseAgentTransport.loadPresets`)(function*(){let e=yield*(yield*f).agent.providers(),t=[];for(let n of e.providers){let e=String(n.providerId);n.health===`available`&&n.capabilities.includes(`release-chat`)&&(e===`codex`||e===`claude`)&&t.push(e)}return t}),M=(e,{signal:t})=>c(A(e).pipe(r(u)),{signal:t}),N=e=>c(j().pipe(r(u)),{signal:e});export{D as a,E as i,M as n,y as o,O as r,N as t};
|
|
2
|
+
//# sourceMappingURL=releaseAgentTransport-CJjWwE8y.js.map
|