@knpkv/control-center 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/README.md +70 -17
  2. package/dist/client/.vite/manifest.json +223 -178
  3. package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js → ActiveWorkPage-g2-Jyavo.js} +2 -2
  4. package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js.map → ActiveWorkPage-g2-Jyavo.js.map} +1 -1
  5. package/dist/client/assets/AgentPage-B6GQdZAs.css +1 -0
  6. package/dist/client/assets/AgentPage-DmVsEe13.js +6 -0
  7. package/dist/client/assets/AgentPage-DmVsEe13.js.map +1 -0
  8. package/dist/client/assets/AtlassianOAuthCallbackPage-C8u9ItMj.js +2 -0
  9. package/dist/client/assets/{AtlassianOAuthCallbackPage-D1F1xE_2.js.map → AtlassianOAuthCallbackPage-C8u9ItMj.js.map} +1 -1
  10. package/dist/client/assets/AuthorizedSharePage-CVBJ1NTm.js +2 -0
  11. package/dist/client/assets/AuthorizedSharePage-CVBJ1NTm.js.map +1 -0
  12. package/dist/client/assets/BrowserCrypto-3BoTVFdl.js +2 -0
  13. package/dist/client/assets/{BrowserCrypto-DVWR7DFd.js.map → BrowserCrypto-3BoTVFdl.js.map} +1 -1
  14. package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js +2 -0
  15. package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js.map +1 -0
  16. package/dist/client/assets/CommandSearch-DUeRRbV2.js +2 -0
  17. package/dist/client/assets/{CommandSearch-CP_QCbkm.js.map → CommandSearch-DUeRRbV2.js.map} +1 -1
  18. package/dist/client/assets/ItemsPage-BF2ZkSzh.js +2 -0
  19. package/dist/client/assets/{ItemsPage-BGFUkRL2.js.map → ItemsPage-BF2ZkSzh.js.map} +1 -1
  20. package/dist/client/assets/{PairPage-DIgzx0K2.js → PairPage-CkaZltHd.js} +2 -2
  21. package/dist/client/assets/{PairPage-DIgzx0K2.js.map → PairPage-CkaZltHd.js.map} +1 -1
  22. package/dist/client/assets/PortfolioOverview-CEUHJmGC.js +2 -0
  23. package/dist/client/assets/PortfolioOverview-CEUHJmGC.js.map +1 -0
  24. package/dist/client/assets/PullRequestReviewPanel-D1IpvHe2.js +6 -0
  25. package/dist/client/assets/PullRequestReviewPanel-D1IpvHe2.js.map +1 -0
  26. package/dist/client/assets/ReleaseRoute-BuQybrsg.js +2 -0
  27. package/dist/client/assets/{ReleaseRoute-DXJ8Jg60.js.map → ReleaseRoute-BuQybrsg.js.map} +1 -1
  28. package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js +2 -0
  29. package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js.map +1 -0
  30. package/dist/client/assets/ServicesPage-hw5Ee69-.js +2 -0
  31. package/dist/client/assets/ServicesPage-hw5Ee69-.js.map +1 -0
  32. package/dist/client/assets/TimelinePage-Cj3V98uI.js +2 -0
  33. package/dist/client/assets/TimelinePage-Cj3V98uI.js.map +1 -0
  34. package/dist/client/assets/WorkspaceEntityLink-C_rc8lxi.js +2 -0
  35. package/dist/client/assets/{WorkspaceEntityLink-AdZ_T-Wk.js.map → WorkspaceEntityLink-C_rc8lxi.js.map} +1 -1
  36. package/dist/client/assets/WorkspaceEntityRoute-DLLT6fY0.css +1 -0
  37. package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js +14 -0
  38. package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js.map +1 -0
  39. package/dist/client/assets/WorkspaceHomeLink-DeYYLEsH.js +2 -0
  40. package/dist/client/assets/{WorkspaceHomeLink-XbKSPths.js.map → WorkspaceHomeLink-DeYYLEsH.js.map} +1 -1
  41. package/dist/client/assets/{WorkspacePullRequestDetails-BErJ5bk8.js → WorkspacePullRequestDetails-CizqydjN.js} +3 -3
  42. package/dist/client/assets/WorkspacePullRequestDetails-CizqydjN.js.map +1 -0
  43. package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js → WorkspaceReleaseLayout-CXAQUhkh.js} +2 -2
  44. package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js.map → WorkspaceReleaseLayout-CXAQUhkh.js.map} +1 -1
  45. package/dist/client/assets/{WorkspaceRichText-D1M637Ff.js → WorkspaceRichText-CCOciILO.js} +2 -2
  46. package/dist/client/assets/WorkspaceRichText-CCOciILO.js.map +1 -0
  47. package/dist/client/assets/WorkspaceSettingsPage-GoBfQzBx.css +1 -0
  48. package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js +2 -0
  49. package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js.map +1 -0
  50. package/dist/client/assets/agent-api-Dl9TuGOJ.js +19 -0
  51. package/dist/client/assets/agent-api-Dl9TuGOJ.js.map +1 -0
  52. package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js +2 -0
  53. package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js.map +1 -0
  54. package/dist/client/assets/authenticatedMutationClient-DdowMjyo.js +2 -0
  55. package/dist/client/assets/{authenticatedMutationClient-Ccwguc3i.js.map → authenticatedMutationClient-DdowMjyo.js.map} +1 -1
  56. package/dist/client/assets/authorizedShareTransport-CnclcYai.js +2 -0
  57. package/dist/client/assets/{authorizedShareTransport-DZHgFEkh.js.map → authorizedShareTransport-CnclcYai.js.map} +1 -1
  58. package/dist/client/assets/client-Dq_XQE_l.js +5 -0
  59. package/dist/client/assets/client-Dq_XQE_l.js.map +1 -0
  60. package/dist/client/assets/confluenceTasks-DtKq8_eU.js +5 -0
  61. package/dist/client/assets/confluenceTasks-DtKq8_eU.js.map +1 -0
  62. package/dist/client/assets/connectionTestTransport-CPK98z7H.js +2 -0
  63. package/dist/client/assets/connectionTestTransport-CPK98z7H.js.map +1 -0
  64. package/dist/client/assets/index-zVjlBm9l.js +11 -0
  65. package/dist/client/assets/index-zVjlBm9l.js.map +1 -0
  66. package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js → patterns-5N-j-AD2-DLfaGePK.js} +2 -2
  67. package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js.map → patterns-5N-j-AD2-DLfaGePK.js.map} +1 -1
  68. package/dist/client/assets/{presentPortfolio-D3ZIcnqt.js → presentPortfolio-DLEq-vEz.js} +2 -2
  69. package/dist/client/assets/presentPortfolio-DLEq-vEz.js.map +1 -0
  70. package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js → presentWorkspaceItems-BOY3FbhO.js} +2 -2
  71. package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js.map → presentWorkspaceItems-BOY3FbhO.js.map} +1 -1
  72. package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js → pullRequestReviewFailures-CyjTVnSX.js} +2 -2
  73. package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js.map → pullRequestReviewFailures-CyjTVnSX.js.map} +1 -1
  74. package/dist/client/assets/pullRequestReviewThreadReplay-CXHspFTr.js +2 -0
  75. package/dist/client/assets/pullRequestReviewThreadReplay-CXHspFTr.js.map +1 -0
  76. package/dist/client/assets/releaseAgentTransport-DaO4svPu.js +2 -0
  77. package/dist/client/assets/releaseAgentTransport-DaO4svPu.js.map +1 -0
  78. package/dist/client/assets/releaseRoutes-B4ciNOJj.js +2 -0
  79. package/dist/client/assets/{releaseRoutes-BCuIdZyA.js.map → releaseRoutes-B4ciNOJj.js.map} +1 -1
  80. package/dist/client/assets/serviceOnboarding-D0FmodRi.js +2 -0
  81. package/dist/client/assets/{serviceOnboarding-Jg_0yNjf.js.map → serviceOnboarding-D0FmodRi.js.map} +1 -1
  82. package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js → useWorkspaceDefaultLanding-BaQdg0sY.js} +3 -3
  83. package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js.map → useWorkspaceDefaultLanding-BaQdg0sY.js.map} +1 -1
  84. package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js → useWorkspaceItems-B-7JHtm0.js} +2 -2
  85. package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js.map → useWorkspaceItems-B-7JHtm0.js.map} +1 -1
  86. package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js +2 -0
  87. package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js.map +1 -0
  88. package/dist/client/assets/workspaceScrollCapture-BYNfR2wo.js +2 -0
  89. package/dist/client/assets/workspaceScrollCapture-BYNfR2wo.js.map +1 -0
  90. package/dist/client/assets/workspaceSettingsTransport-Br4lBmvS.js +2 -0
  91. package/dist/client/assets/{workspaceSettingsTransport-CZWYL5T7.js.map → workspaceSettingsTransport-Br4lBmvS.js.map} +1 -1
  92. package/dist/client/build-graph.json +115 -0
  93. package/dist/client/index.html +1 -1
  94. package/dist/server/api/agent.d.ts +575 -44
  95. package/dist/server/api/agent.d.ts.map +1 -1
  96. package/dist/server/api/deliveryGraph.d.ts +474 -454
  97. package/dist/server/api/deliveryGraph.d.ts.map +1 -1
  98. package/dist/server/api/index.d.ts +2 -2
  99. package/dist/server/api/index.d.ts.map +1 -1
  100. package/dist/server/api/index.js +4 -4
  101. package/dist/server/api/liveEvents.d.ts +20 -0
  102. package/dist/server/api/liveEvents.d.ts.map +1 -1
  103. package/dist/server/api/portfolio.d.ts +23 -0
  104. package/dist/server/api/portfolio.d.ts.map +1 -1
  105. package/dist/server/api/session.d.ts +23 -1
  106. package/dist/server/api/session.d.ts.map +1 -1
  107. package/dist/server/api/shares.d.ts +4 -2
  108. package/dist/server/api/shares.d.ts.map +1 -1
  109. package/dist/server/assets/{BindConfig-DIsf2Rnh.js → BindConfig-DAASchDn.js} +2405 -322
  110. package/dist/server/assets/BindConfig-DAASchDn.js.map +1 -0
  111. package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js → CodePipelineStateDecoder-CNiFRgSi.js} +2 -2
  112. package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js.map → CodePipelineStateDecoder-CNiFRgSi.js.map} +1 -1
  113. package/dist/server/assets/{agent-CyZ40zs1.js → agent-xQhAQXly.js} +181 -11
  114. package/dist/server/assets/agent-xQhAQXly.js.map +1 -0
  115. package/dist/server/assets/{controlCenterApi-ZUX3Y-LE.js → controlCenterApi-DNXK7MT1.js} +6 -5
  116. package/dist/server/assets/controlCenterApi-DNXK7MT1.js.map +1 -0
  117. package/dist/server/assets/{descriptor-CKtTnhef.js → descriptor-CCvNzSZL.js} +10 -10
  118. package/dist/server/assets/{descriptor-CKtTnhef.js.map → descriptor-CCvNzSZL.js.map} +1 -1
  119. package/dist/server/assets/{failures-mgYDkUZy.js → failures-CesHLYbN.js} +2 -2
  120. package/dist/server/assets/{failures-mgYDkUZy.js.map → failures-CesHLYbN.js.map} +1 -1
  121. package/dist/server/assets/{firstPartyServices-D7b8BOek.js → firstPartyServices-Cdzjcs2H.js} +2 -2
  122. package/dist/server/assets/{firstPartyServices-D7b8BOek.js.map → firstPartyServices-Cdzjcs2H.js.map} +1 -1
  123. package/dist/server/assets/{manualPluginSynchronization-DFlhKvav.js → manualPluginSynchronization-DFIeUHP9.js} +6 -5
  124. package/dist/server/assets/manualPluginSynchronization-DFIeUHP9.js.map +1 -0
  125. package/dist/server/assets/{plugins-D__oMDpI.js → plugins-DiPrfzV8.js} +2 -2
  126. package/dist/server/assets/{plugins-D__oMDpI.js.map → plugins-DiPrfzV8.js.map} +1 -1
  127. package/dist/server/assets/{readiness-BhA-Nr9c.js → readiness-31Mqc-9H.js} +3 -3
  128. package/dist/server/assets/{readiness-BhA-Nr9c.js.map → readiness-31Mqc-9H.js.map} +1 -1
  129. package/dist/server/assets/{relationshipInferenceMaterialization-DYBcaWhQ.js → relationshipInferenceMaterialization-Dyix96px.js} +1158 -169
  130. package/dist/server/assets/relationshipInferenceMaterialization-Dyix96px.js.map +1 -0
  131. package/dist/server/assets/{workspaceSettings-BE713Oe8.js → workspaceSettings-sv8h_h2P.js} +2787 -2700
  132. package/dist/server/assets/workspaceSettings-sv8h_h2P.js.map +1 -0
  133. package/dist/server/build-graph.json +144 -4
  134. package/dist/server/domain/actors.d.ts +12 -12
  135. package/dist/server/domain/confluenceTasks.d.ts +27 -0
  136. package/dist/server/domain/confluenceTasks.d.ts.map +1 -0
  137. package/dist/server/domain/deliveryGraph.d.ts +51 -49
  138. package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
  139. package/dist/server/domain/governedAction/bindings.d.ts +26 -12
  140. package/dist/server/domain/governedAction/bindings.d.ts.map +1 -1
  141. package/dist/server/domain/governedAction/lifecycle.d.ts +8 -8
  142. package/dist/server/domain/governedAction/model.d.ts +45 -18
  143. package/dist/server/domain/governedAction/model.d.ts.map +1 -1
  144. package/dist/server/domain/governedAction/stateMachine.d.ts +34 -34
  145. package/dist/server/domain/index.js +6 -6
  146. package/dist/server/domain/normalizedIssue.d.ts +1 -1
  147. package/dist/server/domain/normalizedPage.d.ts +1 -0
  148. package/dist/server/domain/normalizedPage.d.ts.map +1 -1
  149. package/dist/server/domain/prReview.d.ts +38 -0
  150. package/dist/server/domain/prReview.d.ts.map +1 -1
  151. package/dist/server/domain/prReviewReconciliation.d.ts +56 -0
  152. package/dist/server/domain/prReviewReconciliation.d.ts.map +1 -0
  153. package/dist/server/domain/prReviewRevision.d.ts +1 -0
  154. package/dist/server/domain/prReviewRevision.d.ts.map +1 -1
  155. package/dist/server/domain/readiness/model.d.ts +3 -3
  156. package/dist/server/domain/release.d.ts +3 -3
  157. package/dist/server/domain/releasePipelineApproval.d.ts +31 -0
  158. package/dist/server/domain/releasePipelineApproval.d.ts.map +1 -0
  159. package/dist/server/domain/releasePublication.d.ts +4 -0
  160. package/dist/server/domain/releasePublication.d.ts.map +1 -0
  161. package/dist/server/index.js +8 -8
  162. package/dist/server/server/agent/AgentJobWorker.d.ts +10 -1
  163. package/dist/server/server/agent/AgentJobWorker.d.ts.map +1 -1
  164. package/dist/server/server/agent/ReleaseAgentPrompt.d.ts.map +1 -1
  165. package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts +4 -3
  166. package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts.map +1 -1
  167. package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts +17 -1
  168. package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts.map +1 -1
  169. package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts +76 -2
  170. package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts.map +1 -1
  171. package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts +27 -0
  172. package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts.map +1 -0
  173. package/dist/server/server/api/ApplicationServices.d.ts +39 -5
  174. package/dist/server/server/api/ApplicationServices.d.ts.map +1 -1
  175. package/dist/server/server/api/Handlers.d.ts +1 -1
  176. package/dist/server/server/api/Handlers.d.ts.map +1 -1
  177. package/dist/server/server/api/RequestBoundary.d.ts.map +1 -1
  178. package/dist/server/server/application/GovernedReviewSuggestionPublicationGateway.d.ts.map +1 -1
  179. package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts +4 -0
  180. package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts.map +1 -1
  181. package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -1
  182. package/dist/server/server/application/index.d.ts +1 -0
  183. package/dist/server/server/application/index.d.ts.map +1 -1
  184. package/dist/server/server/application/liveEvents.d.ts.map +1 -1
  185. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
  186. package/dist/server/server/application/pipelineExecutionProjection.d.ts +7 -6
  187. package/dist/server/server/application/pipelineExecutionProjection.d.ts.map +1 -1
  188. package/dist/server/server/application/portfolioSnapshots.d.ts +2018 -4
  189. package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -1
  190. package/dist/server/server/application/pullRequestReviews.d.ts.map +1 -1
  191. package/dist/server/server/application/releaseAgent.d.ts +11 -3
  192. package/dist/server/server/application/releaseAgent.d.ts.map +1 -1
  193. package/dist/server/server/application/releasePublicationIntent.d.ts +7 -0
  194. package/dist/server/server/application/releasePublicationIntent.d.ts.map +1 -0
  195. package/dist/server/server/application/releasePublicationMetadata.d.ts +61 -0
  196. package/dist/server/server/application/releasePublicationMetadata.d.ts.map +1 -0
  197. package/dist/server/server/application/releasePublicationSubmissions.d.ts +3730 -0
  198. package/dist/server/server/application/releasePublicationSubmissions.d.ts.map +1 -0
  199. package/dist/server/server/application/releaseRunbookHydration.d.ts +2310 -0
  200. package/dist/server/server/application/releaseRunbookHydration.d.ts.map +1 -0
  201. package/dist/server/server/application/releaseSynchronization.d.ts.map +1 -1
  202. package/dist/server/server/cli.js +8 -8
  203. package/dist/server/server/cli.js.map +1 -1
  204. package/dist/server/server/governance/governedActionDigests.d.ts +236 -218
  205. package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -1
  206. package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts +3 -4
  207. package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts.map +1 -1
  208. package/dist/server/server/governance/internal/execution-store/begin.d.ts.map +1 -1
  209. package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts +1 -1
  210. package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts +8 -8
  211. package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts +2 -2
  212. package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts +1 -1
  213. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +37 -30
  214. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -1
  215. package/dist/server/server/index.js +5 -5
  216. package/dist/server/server/internal/codepipeline-state-probe.js +1 -1
  217. package/dist/server/server/persistence/Database.d.ts +1 -1
  218. package/dist/server/server/persistence/Database.d.ts.map +1 -1
  219. package/dist/server/server/persistence/Persistence.d.ts +1549 -577
  220. package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
  221. package/dist/server/server/persistence/backup/BackupArchive.d.ts.map +1 -1
  222. package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -1
  223. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +2 -2
  224. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -1
  225. package/dist/server/server/persistence/repositories/agentJobModels.d.ts +345 -8
  226. package/dist/server/server/persistence/repositories/agentJobModels.d.ts.map +1 -1
  227. package/dist/server/server/persistence/repositories/agentJobRepository.d.ts +654 -192
  228. package/dist/server/server/persistence/repositories/agentJobRepository.d.ts.map +1 -1
  229. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +148 -138
  230. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
  231. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +27 -25
  232. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
  233. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +117 -111
  234. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
  235. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +28 -27
  236. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
  237. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +50 -48
  238. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
  239. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +117 -111
  240. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
  241. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +259 -234
  242. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -1
  243. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +68 -46
  244. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -1
  245. package/dist/server/server/persistence/repositories/governed-action/read.d.ts +668 -190
  246. package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -1
  247. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +680 -206
  248. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -1
  249. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +38 -31
  250. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -1
  251. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +46 -32
  252. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -1
  253. package/dist/server/server/persistence/repositories/governed-action/write.d.ts +46 -32
  254. package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -1
  255. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +678 -205
  256. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -1
  257. package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts +85 -4
  258. package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts.map +1 -1
  259. package/dist/server/server/persistence/repositories/models.d.ts +9 -9
  260. package/dist/server/server/persistence/repositories/peopleRepository.d.ts +36 -36
  261. package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts +1 -1
  262. package/dist/server/server/persistence/repositories/readiness/assessments.d.ts +6 -6
  263. package/dist/server/server/persistence/repositories/readiness/contract.d.ts +450 -450
  264. package/dist/server/server/persistence/repositories/readiness/queue.d.ts +14 -14
  265. package/dist/server/server/persistence/repositories/readinessRepository.d.ts +7 -7
  266. package/dist/server/server/persistence/repositories/releaseRepository.d.ts +18 -18
  267. package/dist/server/server/persistence/repositories/retentionRepository.d.ts.map +1 -1
  268. package/dist/server/server/persistence/repositories/timelineRepository.d.ts +4 -4
  269. package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts.map +1 -1
  270. package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts +9 -0
  271. package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts.map +1 -0
  272. package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts.map +1 -1
  273. package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts.map +1 -1
  274. package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts +2 -2
  275. package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts.map +1 -1
  276. package/dist/server/server/plugins/jira/JiraReadProvider.d.ts.map +1 -1
  277. package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts +8 -0
  278. package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts.map +1 -0
  279. package/dist/server/server/plugins/jira/index.d.ts +1 -1
  280. package/dist/server/server/plugins/jira/index.d.ts.map +1 -1
  281. package/dist/server/server/runtime/Bootstrap.d.ts +1 -1
  282. package/dist/server/server/runtime/Bootstrap.d.ts.map +1 -1
  283. package/dist/server/server/runtime/ControlCenterServer.d.ts +3 -3
  284. package/dist/server/server/runtime/ControlCenterServer.d.ts.map +1 -1
  285. package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts +11 -1
  286. package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts.map +1 -1
  287. package/dist/server/server/runtime/RetentionStartup.d.ts.map +1 -1
  288. package/dist/server/server/runtime/ServerLifecycle.d.ts.map +1 -1
  289. package/dist/server/server/secrets/SecretStore.d.ts.map +1 -1
  290. package/package.json +10 -9
  291. package/dist/client/assets/AgentPage-DGL93TJU.js +0 -3
  292. package/dist/client/assets/AgentPage-DGL93TJU.js.map +0 -1
  293. package/dist/client/assets/AgentPage-DVSgQgJa.css +0 -1
  294. package/dist/client/assets/AtlassianOAuthCallbackPage-D1F1xE_2.js +0 -2
  295. package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js +0 -2
  296. package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js.map +0 -1
  297. package/dist/client/assets/BrowserCrypto-DVWR7DFd.js +0 -2
  298. package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js +0 -2
  299. package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js.map +0 -1
  300. package/dist/client/assets/CommandSearch-CP_QCbkm.js +0 -2
  301. package/dist/client/assets/ItemsPage-BGFUkRL2.js +0 -2
  302. package/dist/client/assets/PortfolioOverview-D45rk8Hl.js +0 -2
  303. package/dist/client/assets/PortfolioOverview-D45rk8Hl.js.map +0 -1
  304. package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js +0 -6
  305. package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js.map +0 -1
  306. package/dist/client/assets/ReleaseRoute-DXJ8Jg60.js +0 -2
  307. package/dist/client/assets/ReleaseWorkset-Dtzalmji.js +0 -2
  308. package/dist/client/assets/ReleaseWorkset-Dtzalmji.js.map +0 -1
  309. package/dist/client/assets/ServicesPage-DGcUjd2H.js +0 -2
  310. package/dist/client/assets/ServicesPage-DGcUjd2H.js.map +0 -1
  311. package/dist/client/assets/TimelinePage-Bq1RTQlP.js +0 -2
  312. package/dist/client/assets/TimelinePage-Bq1RTQlP.js.map +0 -1
  313. package/dist/client/assets/WorkspaceEntityLink-AdZ_T-Wk.js +0 -2
  314. package/dist/client/assets/WorkspaceEntityRoute-9iMOV64J.css +0 -1
  315. package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js +0 -3
  316. package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js.map +0 -1
  317. package/dist/client/assets/WorkspaceHomeLink-XbKSPths.js +0 -2
  318. package/dist/client/assets/WorkspacePullRequestDetails-BErJ5bk8.js.map +0 -1
  319. package/dist/client/assets/WorkspaceRichText-D1M637Ff.js.map +0 -1
  320. package/dist/client/assets/WorkspaceSettingsPage-Fy7Wx8Y2.js +0 -2
  321. package/dist/client/assets/WorkspaceSettingsPage-Fy7Wx8Y2.js.map +0 -1
  322. package/dist/client/assets/WorkspaceSettingsPage-P6yfac0b.css +0 -1
  323. package/dist/client/assets/agent-api-QVqt4a0O.js +0 -19
  324. package/dist/client/assets/agent-api-QVqt4a0O.js.map +0 -1
  325. package/dist/client/assets/authenticatedMutationClient-Ccwguc3i.js +0 -2
  326. package/dist/client/assets/authorizedShareTransport-DZHgFEkh.js +0 -2
  327. package/dist/client/assets/client-D27unen8.js +0 -5
  328. package/dist/client/assets/client-D27unen8.js.map +0 -1
  329. package/dist/client/assets/connectionTestTransport-BQ55d6Me.js +0 -2
  330. package/dist/client/assets/connectionTestTransport-BQ55d6Me.js.map +0 -1
  331. package/dist/client/assets/index-j5ze816l.js +0 -11
  332. package/dist/client/assets/index-j5ze816l.js.map +0 -1
  333. package/dist/client/assets/presentPortfolio-D3ZIcnqt.js.map +0 -1
  334. package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js +0 -2
  335. package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js.map +0 -1
  336. package/dist/client/assets/releaseRoutes-BCuIdZyA.js +0 -2
  337. package/dist/client/assets/serviceOnboarding-Jg_0yNjf.js +0 -2
  338. package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js +0 -2
  339. package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js.map +0 -1
  340. package/dist/client/assets/workspaceSettingsTransport-CZWYL5T7.js +0 -2
  341. package/dist/server/assets/BindConfig-DIsf2Rnh.js.map +0 -1
  342. package/dist/server/assets/agent-CyZ40zs1.js.map +0 -1
  343. package/dist/server/assets/controlCenterApi-ZUX3Y-LE.js.map +0 -1
  344. package/dist/server/assets/manualPluginSynchronization-DFlhKvav.js.map +0 -1
  345. package/dist/server/assets/relationshipInferenceMaterialization-DYBcaWhQ.js.map +0 -1
  346. package/dist/server/assets/workspaceSettings-BE713Oe8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PrReviewWorkerStartup.d.ts","sourceRoot":"","sources":["../../../../src/server/runtime/PrReviewWorkerStartup.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,KAAK,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAA;AACvH,OAAO,EAAE,WAAW,EAAE,KAAK,2BAA2B,EAAE,MAAM,+BAA+B,CAAA;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAKtD,kFAAkF;AAClF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;IAC1C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;CAC9C;;;;AAED,kFAAkF;AAClF,qBAAa,qBAAsB,SAAQ,2BAA4B;IACrE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAClC,CAAC;CAAG;;AAEL,kDAAkD;AAClD,qBAAa,qBAAsB,SAAQ,0BAGsB;CAAG;AAmCpE,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,GACrC,SAAS,4BAA4B,KACpC,KAAK,CAAC,KAAK,CACZ,qBAAqB,EACrB,2BAA2B,GAAG,2BAA2B,EACzD,cAAc,GAAG,sBAAsB,GAAG,WAAW,GAAG,uBAAuB,GAAG,eAAe,CACrC,CAAA"}
1
+ {"version":3,"file":"PrReviewWorkerStartup.d.ts","sourceRoot":"","sources":["../../../../src/server/runtime/PrReviewWorkerStartup.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAGzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAIrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,uBAAuB,EACxB,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,KAAK,2BAA2B,EAAE,MAAM,+BAA+B,CAAA;AAC7F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAKtD,kFAAkF;AAClF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;IAC1C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;CAC9C;;;;AAED,kFAAkF;AAClF,qBAAa,qBAAsB,SAAQ,2BAA4B;IACrE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAClC,CAAC;CAAG;;AAEL,kDAAkD;AAClD,qBAAa,qBAAsB,SAAQ,0BAGsB;CAAG;AAEpE,KAAK,yBAAyB,GAAG,WAAW,CAC1C,6BAA6B,CAAC,6BAA6B,CAAC,CAC7D,CAAC,MAAM,CAAC,CAAA;AAET,0EAA0E;AAC1E,eAAO,MAAM,8BAA8B,GACzC,iBAAiB,aAAa,CAAC,sBAAsB,CAAC,EACtD,mBAAmB,aAAa,CAAC,yBAAyB,CAAC;;;;;;GAYzD,CAAA;AAoFJ,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,GACrC,SAAS,4BAA4B,KACpC,KAAK,CAAC,KAAK,CACZ,qBAAqB,EACrB,2BAA2B,GAAG,2BAA2B,EACzD,cAAc,GAAG,sBAAsB,GAAG,WAAW,GAAG,uBAAuB,GAAG,eAAe,CACrC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"RetentionStartup.d.ts","sourceRoot":"","sources":["../../../../src/server/runtime/RetentionStartup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAKtD,gDAAgD;AAChD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;CAC1C;;;;AAED,kFAAkF;AAClF,qBAAa,gBAAiB,SAAQ,sBAA4B;IAChE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAClC,CAAC;CAAG;;AAEL,kDAAkD;AAClD,qBAAa,gBAAiB,SAAQ,qBAGsB;CAAG;AA2C/D,8DAA8D;AAC9D,eAAO,MAAM,qBAAqB,GAChC,SAAS,uBAAuB,KAC/B,KAAK,CAAC,KAAK,CACZ,gBAAgB,EAChB,KAAK,EACL,sBAAsB,GAAG,WAAW,GAAG,eAAe,CACC,CAAA"}
1
+ {"version":3,"file":"RetentionStartup.d.ts","sourceRoot":"","sources":["../../../../src/server/runtime/RetentionStartup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAKtD,gDAAgD;AAChD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;CAC1C;;;;AAED,kFAAkF;AAClF,qBAAa,gBAAiB,SAAQ,sBAA4B;IAChE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAClC,CAAC;CAAG;;AAEL,kDAAkD;AAClD,qBAAa,gBAAiB,SAAQ,qBAGsB;CAAG;AA4C/D,8DAA8D;AAC9D,eAAO,MAAM,qBAAqB,GAChC,SAAS,uBAAuB,KAC/B,KAAK,CAAC,KAAK,CACZ,gBAAgB,EAChB,KAAK,EACL,sBAAsB,GAAG,WAAW,GAAG,eAAe,CACC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ServerLifecycle.d.ts","sourceRoot":"","sources":["../../../../src/server/runtime/ServerLifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAE1C,6EAA6E;AAC7E,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,UAAU,CAAA;;AAE3D,mEAAmE;AACnE,qBAAa,cAAe,SAAQ,mBAGnC;CAAG;;;;AAEJ,yEAAyE;AACzE,qBAAa,uBAAwB,SAAQ,4BAG5C;CAAG;AAEJ,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GACrC;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAE7E,UAAU,eAAe;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAClC;AAqBD,UAAU,sBAAsB;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxC,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnD,8FAA8F;IAC9F,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;IACpF,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;IACnD,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,CAAC,CAAA;IAC5C,6FAA6F;IAC7F,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,CAAC,CAAA;IAC5C,qEAAqE;IACrE,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,IAAI,EAAE,eAAe,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IAC/E,sFAAsF;IACtF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CACzE;;AA+MD,kFAAkF;AAClF,qBAAa,eAAgB,SAAQ,oBAEpC;IACC,wEAAwE;IACxE,MAAM,CAAC,QAAQ,CAAC,IAAI;;;;;gCAvEW,QAAQ,CAAC,KAAK;;sBA+C7B,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAQrC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;kCA5CjD,eAAe,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;;qBA2DjC;IAE5C,MAAM,CAAC,QAAQ,CAAC,KAAK,6CAAsD;CAC5E"}
1
+ {"version":3,"file":"ServerLifecycle.d.ts","sourceRoot":"","sources":["../../../../src/server/runtime/ServerLifecycle.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SecretStore.d.ts","sourceRoot":"","sources":["../../../../src/server/secrets/SecretStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,KAAK,EAAE,MAAM,QAAQ,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAU,IAAI,EAA0B,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEjH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAGL,KAAK,gBAAgB,EAItB,MAAM,uBAAuB,CAAA;AAqB9B,6DAA6D;AAC7D,eAAO,MAAM,UAAU,2CAMW,CAAA;AAElC,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C,oFAAoF;AACpF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC1B,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,YAAY,CAAA;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,YAAY,CAAA;CACtC;AAED,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;IAClF,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;IAClG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAC1E,QAAQ,CAAC,OAAO,EAAE,CAChB,GAAG,EAAE,SAAS,KACX,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAC/D;;AAED,yEAAyE;AACzE,qBAAa,WAAY,SAAQ,gBAEhC;IACC,MAAM,CAAC,QAAQ,CAAC,KAAK,GACnB,SAAS,kBAAkB,KAC1B,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAC3C;CACtD;AAgCD,4EAA4E;AAC5E,eAAO,MAAM,eAAe,EAAE,CAC5B,OAAO,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAChB,WAAW,CAAC,SAAS,CAAC,EACtB,gBAAgB,EAChB,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAobjD,CAAA"}
1
+ {"version":3,"file":"SecretStore.d.ts","sourceRoot":"","sources":["../../../../src/server/secrets/SecretStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,KAAK,EAAE,MAAM,QAAQ,CAAA;AACjE,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAU,IAAI,EAA0B,MAAM,EAAE,MAAM,QAAQ,CAAA;AAExH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAGL,KAAK,gBAAgB,EAItB,MAAM,uBAAuB,CAAA;AAqB9B,6DAA6D;AAC7D,eAAO,MAAM,UAAU,2CAMW,CAAA;AAElC,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C,oFAAoF;AACpF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC1B,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,YAAY,CAAA;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,YAAY,CAAA;CACtC;AAWD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;IAClF,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;IAClG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAC1E,QAAQ,CAAC,OAAO,EAAE,CAChB,GAAG,EAAE,SAAS,KACX,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAC/D;;AAED,yEAAyE;AACzE,qBAAa,WAAY,SAAQ,gBAEhC;IACC,MAAM,CAAC,QAAQ,CAAC,KAAK,GACnB,SAAS,kBAAkB,KAC1B,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAC3C;CACtD;AAgCD,4EAA4E;AAC5E,eAAO,MAAM,eAAe,EAAE,CAC5B,OAAO,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAChB,WAAW,CAAC,SAAS,CAAC,EACtB,gBAAgB,EAChB,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAibjD,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/control-center",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Human- and agent-oriented delivery control center",
5
5
  "license": "MIT",
6
6
  "author": "knpkv",
@@ -58,14 +58,14 @@
58
58
  "react-router": "^8.2.0",
59
59
  "remark-gfm": "^4.0.1",
60
60
  "@knpkv/ai-claude": "^0.1.0",
61
- "@knpkv/ai-codex": "^0.1.0",
62
- "@knpkv/ai-runtime": "^0.2.0",
63
- "@knpkv/atlassian-common": "^1.2.0",
64
- "@knpkv/codecommit-core": "^0.10.0",
65
- "@knpkv/confluence-api-client": "^1.0.0",
61
+ "@knpkv/ai-codex": "^0.2.0",
62
+ "@knpkv/ai-runtime": "^0.2.1",
63
+ "@knpkv/atlassian-common": "^1.3.0",
64
+ "@knpkv/codecommit-core": "^0.11.0",
66
65
  "@knpkv/clockify-api-client": "^1.0.3",
67
- "@knpkv/confluence-to-markdown": "^2.1.2",
68
- "@knpkv/control-center-sql": "^0.2.0",
66
+ "@knpkv/confluence-api-client": "^1.0.0",
67
+ "@knpkv/confluence-to-markdown": "^2.1.3",
68
+ "@knpkv/control-center-sql": "^0.2.1",
69
69
  "@knpkv/jira-api-client": "^1.0.1",
70
70
  "@knpkv/rly": "^0.2.0"
71
71
  },
@@ -93,13 +93,14 @@
93
93
  "check": "pnpm validate:boundaries && pnpm lint:rly-css-tokens && tsc -b tsconfig.json",
94
94
  "clean": "rimraf dist *.tsbuildinfo node_modules/.cache",
95
95
  "dev": "vite --host 127.0.0.1 --port 5173 --strictPort",
96
- "lint": "eslint \"{src,test,e2e,scripts}/**/*.{ts,tsx}\" vite.config.ts vitest.config.ts vitest.live.config.ts vitest.live-aws.config.ts playwright.config.ts && pnpm lint:rly-css-tokens",
96
+ "lint": "eslint \"{src,test,e2e,scripts}/**/*.{ts,tsx}\" vite.config.ts vitest.config.ts vitest.live.config.ts vitest.live-aws.config.ts playwright.config.ts playwright.atlassian-oauth.config.ts && pnpm lint:rly-css-tokens",
97
97
  "lint:rly-css-tokens": "tsx scripts/validateRlyCssTokens.ts",
98
98
  "preview": "vite preview --outDir dist/client --host 127.0.0.1 --port 4173 --strictPort",
99
99
  "start": "node ./dist/server/server/cli.js",
100
100
  "test": "vitest run",
101
101
  "test:browser": "pnpm test:e2e",
102
102
  "test:e2e": "pnpm build && rimraf test-results/control-center/runtime-benchmark.json && playwright test --config playwright.config.ts",
103
+ "test:e2e:atlassian-oauth": "CONTROL_CENTER_TEST_ATLASSIAN_OAUTH=1 pnpm build && CONTROL_CENTER_TEST_ATLASSIAN_OAUTH=1 playwright test e2e/atlassian-oauth.spec.ts --config playwright.atlassian-oauth.config.ts",
103
104
  "test:integration:live-aws": "pnpm build && vitest run --config vitest.live-aws.config.ts",
104
105
  "test:integration:live": "pnpm build && vitest run --config vitest.live.config.ts",
105
106
  "test:pack": "tsx scripts/test-packed-package.ts",
@@ -1,3 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,m as r,p as i,t as a,u as o}from"./lib-BzlsKFNV.js";import{t as s}from"./jsx-runtime-By8HlURe.js";import{n as c,t as l}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{r as u}from"./releasePaths-XoI2BHX3.js";import{g as d,h as f,t as ee}from"./patterns-5N-j-AD2-BwypFm-e.js";import{n as p,r as m,t as h}from"./primitives-nKxQGSsE-CJNmac__.js";import{Ai as g,Cr as _,D as v,Di as y,E as b,Jn as x,Ki as S,La as C,O as w,Qr as T,Rn as E,Tr as D,Wn as O,Yn as k,Zr as A,_r as j,ca as M,dr as N,gi as P,hr as te,jr as F,kr as I,mr as ne,ni as re,on as ie,pi as ae,tt as oe,ua as se,xn as ce}from"./agent-api-QVqt4a0O.js";import{a as L}from"./client-D27unen8.js";import{c as le,n as R,r as z}from"./releaseRoutes-BCuIdZyA.js";import{t as B}from"./authenticatedMutationClient-Ccwguc3i.js";var V=e(t(),1),H=24,U=256e3,ue=k({eventCursor:ie,relayCodename:w,serviceName:b,updatedAt:oe,version:v}),W=te(E(k({content:x.check(D(),_(32e3)),context:F(ue),dateTime:x.check(D(),_(64)),id:x.check(D(),_(100)),provider:F(O([`codex`,`claude`])),role:O([`user`,`assistant`]),time:x.check(D(),_(32))})).check(I(e=>e.length<=H,{expected:`at most ${H} stored release-agent messages`}),I(e=>e.reduce((e,t)=>e+t.content.length,0)<=U,{expected:`at most ${U} stored release-agent characters`}),I(e=>{let t=new Set;for(let n of e){if(t.has(n.id))return!1;t.add(n.id)}return!0},{expected:`unique stored release-agent message ids`}))),G=e=>{let t=sessionStorage.getItem(`cc_session_id`);return t===null||!j(ce)(t)?null:`cc_release_agent_thread:${t}:${e}`},de=e=>{let t=[],n=0;for(let r of e.slice(-24).reverse()){if(n+r.content.length>U)break;t.unshift(r),n+=r.content.length}return t},fe=e=>{try{let t=G(e);if(t===null)return[];let n=sessionStorage.getItem(t);if(n===null)return[];let r=N(W)(n);return se(r)?r.success:[]}catch{return[]}},pe=(e,t)=>{let n=ne(W)(de(t));if(!M(n))try{let t=G(e);if(t===null)return;sessionStorage.setItem(t,n.success)}catch{}},me=class extends S(`ReleaseAgentProtocolError`){},he=P(`ReleaseAgentTransport.runTurn`)(function*(e){let t=yield*(yield*B).agent.turn({params:{releaseId:e.releaseId},payload:{history:e.history,prompt:e.prompt,provider:e.provider}});return t.releaseId!==e.releaseId||t.release.releaseId!==e.releaseId?yield*ae(new me):{eventCursor:t.eventCursor,provider:t.provider,release:t.release,reply:t.reply}}),ge=P(`ReleaseAgentTransport.loadPresets`)(function*(){let e=yield*(yield*B).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}),_e=(e,{signal:t})=>g(he(e).pipe(y(L)),{signal:t}),ve=e=>g(ge().pipe(y(L)),{signal:e}),K={room:`_room_etqjt_1`,hero:`_hero_etqjt_2`,heroCopy:`_heroCopy_etqjt_3`,people:`_people_etqjt_4`,starters:`_starters_etqjt_5`,composer:`_composer_etqjt_6`,legacy:`_legacy_etqjt_7`,legacyHeader:`_legacyHeader_etqjt_8`,legacyContext:`_legacyContext_etqjt_9`,back:`_back_etqjt_18`,eyebrow:`_eyebrow_etqjt_59`,presetList:`_presetList_etqjt_69`,preset:`_preset_etqjt_69`,suggestionList:`_suggestionList_etqjt_76`,suggestion:`_suggestion_etqjt_76`,thread:`_thread_etqjt_147`,threadContext:`_threadContext_etqjt_151`,failure:`_failure_etqjt_181`,state:`_state_etqjt_185`},q=s(),J={description:`The workspace-wide view of release readiness, people, source health, and agent work.`,label:`Overview`,path:`/`},ye={"/":J,"/pair":{description:`The private browser-pairing flow. Credentials never become part of the agent context.`,label:`Browser pairing`,path:`/pair`},"/releases":{description:`Release relationships, blockers, collaborators, pull requests, and deployment evidence.`,label:`Releases`,path:`/releases`},"/services":{description:`Negotiated plugin health and the connections that provide delivery evidence.`,label:`Services`,path:`/services`}},Y=`https://control-center.invalid`,be=e=>{if(e===null)return J;let t=URL.parse(e,Y);if(t===null||t.origin!==Y)return{description:`The calling page is not a recognized Control Center context. No fallback workspace or entity is substituted.`,label:`Context unavailable`,path:null};let n=`${t.pathname}${t.search}${t.hash}`,r=ye[t.pathname];if(r!==void 0)return{...r,path:n};let i=t.pathname.split(`/`),a=z(i[2]),o=i[3],s=R(i[4]),c=i[5],l=i[1]===`w`&&i[4]===void 0,u=i[1]===`w`&&a!==null&&o===`releases`&&s!==null&&(c===void 0||c===`preview`||c===`agent`);if(l&&a!==null&&o===`overview`&&s===null)return{description:`Workspace ${a} release readiness, people, source health, and agent work.`,label:`Workspace overview`,path:n};if(l&&a!==null&&o===`items`&&s===null)return{description:`Current normalized delivery items in workspace ${a}, including the exact active filters and selection.`,label:`Workspace items`,path:n};if(l&&a!==null&&o===`timeline`&&s===null){let e=t.searchParams.get(`event`);return{description:e===null?`Attributable delivery activity in workspace ${a}, including the exact actor and date filters.`:`Timeline event ${e} in workspace ${a}, including the exact actor and date filters.`,label:`Workspace timeline`,path:n}}let d=t.searchParams.get(`release`),f=d===null||R(d)!==null;return l&&a!==null&&o===`work`&&s===null&&f?{description:`Active release decisions in workspace ${a}, including the exact selected release and filters.`,label:`Active work`,path:n}:u?{description:`Release ${s} in workspace ${a}. Relay will resolve current release facts on the server before answering.`,label:`Release ${s.slice(-6)}`,path:n}:{description:`The calling page is not a recognized Control Center context. No fallback workspace or entity is substituted.`,label:`Context unavailable`,path:null}},X=()=>{let e=re();return{dateTime:A(e),time:T(e,{hour:`2-digit`,minute:`2-digit`})}},xe=e=>!C(e,`_tag`)||typeof e._tag!=`string`?null:e._tag,Se=e=>{switch(xe(e)){case`UnauthorizedApiError`:return`session-expired`;case`ForbiddenApiError`:return`blocked`;case`NotFoundApiError`:case`ApplicationResourceNotFound`:return`not-found`;case`ServiceUnavailableApiError`:case`ApplicationServiceUnavailable`:return`unavailable`;case`RateLimitedApiError`:return`rate-limited`;case`RequestTimedOutApiError`:return`timed-out`;default:return`failed`}},Ce=e=>{switch(e){case`session-expired`:return(0,q.jsx)(c,{action:(0,q.jsx)(a,{to:`/pair`,children:`Pair this browser`}),announce:`assertive`,description:`Pair this browser again, then return to the release thread. Your local messages remain in this tab.`,title:`Session expired`,tone:`caution`});case`blocked`:return(0,q.jsx)(c,{announce:`assertive`,description:`This connection cannot run a release agent. Use an allowed Control Center address.`,title:`Agent access blocked`,tone:`critical`});case`not-found`:return(0,q.jsx)(c,{announce:`assertive`,description:`This release is no longer in the current workspace snapshot. Return to the release before asking again.`,title:`Release not found`,tone:`caution`});case`unavailable`:return(0,q.jsx)(c,{announce:`assertive`,description:`Start the configured local Codex or Claude runner, then ask again.`,title:`Relay is unavailable`,tone:`caution`});case`rate-limited`:return(0,q.jsx)(c,{announce:`assertive`,description:`Relay has reached its local turn budget. Wait a moment, then submit the message again.`,title:`Too many agent turns`,tone:`caution`});case`timed-out`:return(0,q.jsx)(c,{announce:`assertive`,description:`The local model exceeded this turn's deadline. Narrow the question, then submit it again.`,title:`Relay took too long`,tone:`caution`});case`failed`:return(0,q.jsx)(c,{announce:`assertive`,description:`The agent did not complete this turn. Your message is still here; ask again when the runtime is ready.`,title:`Relay could not answer`,tone:`critical`})}},we=[{description:`Fast, repository-aware release work with the configured Codex CLI.`,label:`Run with Codex`,provider:`codex`},{description:`Use the configured Claude CLI for a second agent perspective.`,label:`Run with Claude`,provider:`claude`}],Te=[{label:`Release blockers`,prompt:`What blocks this release?`},{label:`Release summary`,prompt:`Write a concise release summary.`},{label:`Missing evidence`,prompt:`Which evidence is still missing?`}],Z=12e3,Ee=64e3,De=`
2
- [earlier content truncated]`,Q=e=>{let t=[],n=0;for(let r of e.slice(-12).reverse()){let e=r.content.length<=Z?r.content:`${r.content.slice(0,Z-28)}${De}`;if(n+e.length>Ee)break;t.unshift({content:e,role:r.role}),n+=e.length}return t},Oe={kind:`human`,person:{avatarFallback:`YO`,id:`current-operator`,name:`You`,role:`Release operator`}},ke={avatarFallback:`AI`,id:`relay`,kind:`agent`,name:`Relay`,role:`Release agent`},Ae=e=>e.map(e=>({actor:e.role===`user`?Oe:ke,content:e.content,dateTime:e.dateTime,id:e.id,time:e.time,...e.context===void 0?{}:{evidence:(0,q.jsxs)(`span`,{children:[`Answered from `,e.context.serviceName,` `,e.context.version,` · `,e.context.relayCodename,` · snapshot `,e.context.eventCursor]})}})),je=e=>e.reduce((e,{id:t})=>{let n=Number(t.split(`-`)[1]);return Number.isSafeInteger(n)&&n>=e?n+1:e},0),Me=({disabled:e,isRunning:t,onPromptChange:n,onSubmit:r,prompt:i,provider:a})=>(0,q.jsxs)(`form`,{className:K.composer,onSubmit:r,children:[(0,q.jsx)(h,{label:`What do you need?`,children:t=>(0,q.jsx)(`textarea`,{...t,autoFocus:!0,disabled:e,maxLength:8e3,onChange:e=>n(e.currentTarget.value),placeholder:`Ask about blockers, people, checks, or release notes…`,rows:4,value:i})}),(0,q.jsx)(l,{disabled:e||i.trim().length===0,loading:t,size:`principal`,stretch:!0,type:`submit`,variant:`primary`,children:`Ask Relay with ${a===`codex`?`Codex`:`Claude`}`})]}),Ne=({availableProviders:e,providerCatalogPending:t,release:n,runTurn:r,workspaceId:i})=>{let s=o(),[l,p]=(0,V.useState)(``),[h,g]=(0,V.useState)(`codex`),_=(0,V.useRef)(!1),[v,y]=(0,V.useState)(()=>fe(n.id)),[b,x]=(0,V.useState)(null),[S,C]=(0,V.useState)(!1),[w,T]=(0,V.useState)(``),E=(0,V.useRef)(je(v)),D=(0,V.useRef)(null),O=le(n.id);(0,V.useEffect)(()=>()=>{let e=D.current;D.current=null,e?.abort()},[]),(0,V.useEffect)(()=>{pe(n.id,v)},[v,n.id]);let k=(0,V.useMemo)(()=>Ae(v),[v]),A=[...v].reverse().find(e=>e.provider!==void 0)?.provider,j=r===void 0,M=t||e!==void 0&&!e.includes(h);(0,V.useEffect)(()=>{if(e===void 0||_.current&&e.includes(h))return;let t=e[0];t!==void 0&&g(t)},[e,h]);let N=e=>{e.preventDefault();let t=l.trim();if(t.length===0||r===void 0||M||S)return;let a=Q(v),o={...X(),content:t,id:`turn-${E.current++}-human`,role:`user`},s=new AbortController;D.current?.abort(),D.current=s,y(e=>[...e,o]),p(``),x(null),C(!0),T(`Relay is reading the release context.`),r({history:a,prompt:t,provider:h,releaseId:n.id,workspaceId:i},{signal:s.signal}).then(e=>{if(s.signal.aborted)return;let t=e.reply.trim();if(t.length===0){x(`failed`),T(`Relay returned an empty answer.`);return}y(n=>[...n,{...X(),content:t,context:{eventCursor:e.eventCursor,relayCodename:e.release.relay.codename,serviceName:e.release.serviceName,updatedAt:e.release.updatedAt,version:e.release.version},id:`turn-${E.current++}-agent`,provider:e.provider,role:`assistant`}]),T(`Relay answered in this release thread.`)},e=>{s.signal.aborted||(x(Se(e)),T(`Relay could not complete this turn.`))}).finally(()=>{D.current===s&&(D.current=null,C(!1))})};return(0,q.jsxs)(`article`,{className:K.room,"data-release-agent-id":n.id,children:[(0,q.jsx)(a,{className:K.back,state:s.state,to:u(i,n.id),children:`Back to release`}),(0,q.jsxs)(`header`,{className:K.hero,children:[(0,q.jsx)(ee,{algorithm:n.relay.algorithm,codename:n.relay.codename,"data-rly-release-transition-name":O.relay,"data-rly-release-transition-part":`relay`,size:`hero`,style:{viewTransitionName:O.relay},symbolIndices:n.relay.symbolIndices}),(0,q.jsxs)(`div`,{className:K.heroCopy,children:[(0,q.jsxs)(m,{className:K.eyebrow,tone:`secondary`,variant:`label`,children:[n.lifecycleLabel,` · `,n.version]}),(0,q.jsxs)(m,{as:`h1`,id:`agent-title`,variant:`verdict`,children:[`Ask `,n.relay.codename,`.`]}),(0,q.jsx)(m,{tone:`secondary`,variant:`body-large`,children:`Relay resolves the current release before every answer. This thread stays in this tab.`})]})]}),(0,q.jsxs)(`section`,{"aria-labelledby":`agent-collaborators`,className:K.people,children:[(0,q.jsx)(m,{as:`h2`,id:`agent-collaborators`,variant:`section-title`,children:`In this release`}),n.collaborators.length===0?(0,q.jsx)(m,{tone:`secondary`,children:`No owner or approver is assigned yet.`}):(0,q.jsx)(d,{"aria-label":`${n.serviceName} release collaborators`,expanded:!0,limit:n.collaborators.length,onExpandedChange:()=>void 0,people:n.collaborators})]}),(0,q.jsxs)(`section`,{"aria-labelledby":`agent-presets`,className:K.starters,children:[(0,q.jsx)(m,{as:`h2`,id:`agent-presets`,tone:`secondary`,variant:`label`,children:`Agent preset`}),(0,q.jsx)(`div`,{"aria-label":`Agent presets`,className:K.presetList,role:`radiogroup`,children:we.map(n=>(0,q.jsxs)(`button`,{"aria-checked":h===n.provider,className:K.preset,disabled:j||S||t||e!==void 0&&!e.includes(n.provider),onClick:()=>{_.current=!0,g(n.provider)},role:`radio`,type:`button`,children:[(0,q.jsx)(`strong`,{children:n.label}),(0,q.jsx)(`span`,{children:n.description}),e!==void 0&&!e.includes(n.provider)?(0,q.jsx)(`small`,{children:`Not configured`}):null]},n.provider))}),(0,q.jsx)(m,{as:`h2`,id:`agent-starters`,tone:`secondary`,variant:`label`,children:`Prompt templates`}),(0,q.jsx)(`div`,{className:K.suggestionList,children:Te.map(e=>(0,q.jsxs)(`button`,{className:K.suggestion,disabled:j||M||S,onClick:()=>p(e.prompt),type:`button`,children:[(0,q.jsx)(`strong`,{children:e.label}),(0,q.jsx)(`span`,{children:e.prompt})]},e.label))})]}),j?(0,q.jsx)(c,{description:`Connect the server to a local Codex or Claude runner. Provider credentials and repository access stay server-side; this tab stores its bounded thread locally.`,title:`Local agent not connected`}):t?null:M?(0,q.jsx)(c,{description:`Choose a configured Codex or Claude preset before starting this turn.`,title:`Selected agent is not configured`,tone:`caution`}):null,b===null?null:(0,q.jsx)(`div`,{className:K.failure,children:Ce(b)}),(0,q.jsx)(f,{...w.length===0?{}:{announcement:w},className:K.thread,composer:(0,q.jsx)(Me,{disabled:j||M,isRunning:S,onPromptChange:p,onSubmit:N,prompt:l,provider:h}),context:(0,q.jsxs)(`div`,{className:K.threadContext,children:[(0,q.jsx)(`strong`,{children:n.serviceName}),(0,q.jsx)(`span`,{children:n.version}),(0,q.jsx)(`span`,{children:n.relay.codename}),(0,q.jsxs)(`span`,{children:[`Preset `,h]}),A===void 0?null:(0,q.jsxs)(`span`,{children:[`Last answer `,A]})]}),emptyLabel:`Ask one useful question. Relay will answer only for this release.`,heading:`Release thread`,messages:k})]})},Pe=({context:e})=>{switch(e.controller.state._tag){case`loading`:return(0,q.jsx)(c,{description:`Control Center is loading the exact release and its collaborators.`,title:`Loading release context`});case`session`:return(0,q.jsx)(c,{action:e.controller.state.reason===`anonymous`?(0,q.jsx)(a,{to:`/pair`,children:`Pair this browser`}):void 0,description:`Release context must be available before Relay can answer.`,title:e.controller.state.reason===`blocked`?`Release access blocked`:`Release context unavailable`,tone:e.controller.state.reason===`blocked`?`critical`:`caution`});case`failed`:return(0,q.jsx)(c,{action:(0,q.jsx)(l,{onClick:e.controller.onRetry,children:`Try again`}),description:`Control Center could not load the release. Check the server, then try again.`,title:`Release context unavailable`,tone:`critical`});case`ready`:return(0,q.jsx)(q.Fragment,{})}},Fe=()=>{let[e]=n(),t=be(e.get(`from`));return(0,q.jsxs)(`section`,{"aria-labelledby":`agent-title`,className:K.legacy,children:[(0,q.jsxs)(`header`,{className:K.legacyHeader,children:[(0,q.jsx)(m,{className:K.eyebrow,tone:`secondary`,variant:`label`,children:`Relay`}),(0,q.jsx)(m,{as:`h1`,id:`agent-title`,variant:`verdict`,children:`Ask in context.`}),(0,q.jsx)(m,{tone:`secondary`,variant:`body-large`,children:`Open Relay from a release to start an exact, release-owned thread.`})]}),(0,q.jsxs)(p,{as:`section`,className:K.legacyContext,padding:`spacious`,shape:`grouped`,tone:`secondary`,children:[(0,q.jsx)(m,{tone:`secondary`,variant:`label`,children:`Current context`}),(0,q.jsx)(m,{as:`h2`,variant:`section-title`,children:t.label}),(0,q.jsx)(m,{tone:`secondary`,children:t.description}),t.path===null?null:(0,q.jsxs)(a,{className:K.back,to:t.path,children:[`Return to `,t.label]})]})]})},$=({availableProviders:e,providerCatalogPending:t=!1,runTurn:n})=>{let o=i(),s=r(),l=z(s.workspaceId),u=R(s.releaseId);if(!(s.workspaceId!==void 0||s.releaseId!==void 0))return(0,q.jsx)(Fe,{});if(l===null||u===null||o===null||o.workspaceId!==l)return(0,q.jsx)(`section`,{className:K.state,children:(0,q.jsx)(c,{action:l===null?(0,q.jsx)(a,{to:`/`,children:`Return to Control Center`}):void 0,description:`This address does not identify a release in the current workspace.`,title:`Release not found`})});if(o.controller.state._tag!==`ready`)return(0,q.jsx)(Pe,{context:o});let d=o.controller.state.portfolio.releases.find(e=>e.id===u);return d===void 0?(0,q.jsx)(`section`,{className:K.state,children:(0,q.jsx)(c,{action:(0,q.jsx)(a,{to:o.controller.state.portfolio.workspaceId===l?`/w/${l}/overview`:`/`,children:`Return to workspace`}),description:`This release does not exist in the current workspace snapshot.`,title:`Release not found`})}):(0,q.jsx)(Ne,{availableProviders:e,providerCatalogPending:t,release:d,runTurn:n,workspaceId:l},d.id)},Ie=({loadPresets:e=ve,runTurn:t=_e}={})=>{let[n,r]=(0,V.useState)({_tag:`loading`}),[i,a]=(0,V.useState)(0);(0,V.useEffect)(()=>{let t=new AbortController;return r({_tag:`loading`}),e(t.signal).then(e=>{t.signal.aborted||r({_tag:`ready`,providers:e})},()=>{t.signal.aborted||r({_tag:`failed`})}),()=>t.abort()},[i,e]);let o=n._tag===`ready`?n.providers:void 0;return(0,q.jsxs)(q.Fragment,{children:[n._tag===`failed`?(0,q.jsx)(`section`,{className:K.state,children:(0,q.jsx)(c,{action:(0,q.jsx)(l,{onClick:()=>a(e=>e+1),children:`Retry agent presets`}),description:`Relay could not confirm the configured local runners. You can retry without leaving this release.`,title:`Agent presets could not be refreshed`,tone:`caution`})}):null,(0,q.jsx)($,{...o===void 0?{}:{availableProviders:o},providerCatalogPending:n._tag!==`ready`,runTurn:t})]})};export{$ as AgentPage,Ie as ConnectedAgentPage,Q as boundedReleaseAgentHistory};
3
- //# sourceMappingURL=AgentPage-DGL93TJU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentPage-DGL93TJU.js","names":[],"sources":["../../../src/client/releases/releaseAgentThreadStorage.ts","../../../src/client/releases/releaseAgentTransport.ts","../../../src/client/AgentPage.module.css","../../../src/client/AgentPage.tsx"],"sourcesContent":["import * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\n\nimport { SessionId } from \"../../api/session.js\"\nimport { EventCursor, type ReleaseId } from \"../../domain/identifiers.js\"\nimport { ReleaseServiceName, ReleaseVersion } from \"../../domain/release.js\"\nimport { ReleaseRelayCodename } from \"../../domain/releaseRelay.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\n\nconst MAXIMUM_STORED_MESSAGES = 24\nconst MAXIMUM_STORED_CONTENT = 256_000\n\nconst StoredReleaseAgentTurnContext = Schema.Struct({\n eventCursor: EventCursor,\n relayCodename: ReleaseRelayCodename,\n serviceName: ReleaseServiceName,\n updatedAt: UtcTimestamp,\n version: ReleaseVersion\n})\n\nconst StoredReleaseAgentThreadMessage = Schema.Struct({\n content: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(32_000)),\n context: Schema.optionalKey(StoredReleaseAgentTurnContext),\n dateTime: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(64)),\n id: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(100)),\n provider: Schema.optionalKey(Schema.Literals([\"codex\", \"claude\"])),\n role: Schema.Literals([\"user\", \"assistant\"]),\n time: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(32))\n})\n\nconst hasUniqueMessageIds = (messages: ReadonlyArray<{ readonly id: string }>): boolean => {\n const ids = new Set<string>()\n for (const message of messages) {\n if (ids.has(message.id)) return false\n ids.add(message.id)\n }\n return true\n}\n\nconst StoredReleaseAgentThread = Schema.Array(StoredReleaseAgentThreadMessage).check(\n Schema.makeFilter((messages) => messages.length <= MAXIMUM_STORED_MESSAGES, {\n expected: `at most ${MAXIMUM_STORED_MESSAGES} stored release-agent messages`\n }),\n Schema.makeFilter(\n (messages) => messages.reduce((length, message) => length + message.content.length, 0) <= MAXIMUM_STORED_CONTENT,\n { expected: `at most ${MAXIMUM_STORED_CONTENT} stored release-agent characters` }\n ),\n Schema.makeFilter(hasUniqueMessageIds, {\n expected: \"unique stored release-agent message ids\"\n })\n)\n\nconst StoredReleaseAgentThreadJson = Schema.fromJsonString(StoredReleaseAgentThread)\n\nexport type StoredReleaseAgentThreadMessage = typeof StoredReleaseAgentThreadMessage.Type\n\nconst storageKey = (releaseId: ReleaseId): string | null => {\n const sessionId = sessionStorage.getItem(\"cc_session_id\")\n if (sessionId === null || !Schema.is(SessionId)(sessionId)) return null\n return `cc_release_agent_thread:${sessionId}:${releaseId}`\n}\n\nconst boundedStoredMessages = (\n messages: ReadonlyArray<StoredReleaseAgentThreadMessage>\n): ReadonlyArray<StoredReleaseAgentThreadMessage> => {\n const bounded: Array<StoredReleaseAgentThreadMessage> = []\n let contentLength = 0\n for (const message of messages.slice(-MAXIMUM_STORED_MESSAGES).reverse()) {\n if (contentLength + message.content.length > MAXIMUM_STORED_CONTENT) break\n bounded.unshift(message)\n contentLength += message.content.length\n }\n return bounded\n}\n\n/** Recover only Schema-valid tab-local thread state for the exact release. */\nexport const readReleaseAgentThread = (\n releaseId: ReleaseId\n): ReadonlyArray<StoredReleaseAgentThreadMessage> => {\n try {\n const key = storageKey(releaseId)\n if (key === null) return []\n const source = sessionStorage.getItem(key)\n if (source === null) return []\n const decoded = Schema.decodeUnknownResult(StoredReleaseAgentThreadJson)(source)\n return Result.isSuccess(decoded) ? decoded.success : []\n } catch {\n return []\n }\n}\n\n/** Persist a bounded release thread for the lifetime of the current browser tab. */\nexport const writeReleaseAgentThread = (\n releaseId: ReleaseId,\n messages: ReadonlyArray<StoredReleaseAgentThreadMessage>\n): void => {\n const encoded = Schema.encodeUnknownResult(StoredReleaseAgentThreadJson)(boundedStoredMessages(messages))\n if (Result.isFailure(encoded)) return\n try {\n const key = storageKey(releaseId)\n if (key === null) return\n sessionStorage.setItem(key, encoded.success)\n } catch {\n // Storage can be unavailable in hardened browser contexts; the in-memory thread still works.\n }\n}\n","import * as Data from \"effect/Data\"\nimport * as Effect from \"effect/Effect\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\n\nimport type { ReleaseAgentTurn } from \"../AgentPage.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\nclass ReleaseAgentProtocolError extends Data.TaggedError(\"ReleaseAgentProtocolError\") {}\n\nconst runTurnEffect = Effect.fn(\"ReleaseAgentTransport.runTurn\")(function*(\n input: Parameters<ReleaseAgentTurn>[0]\n) {\n const client = yield* makeAuthenticatedMutationClient\n const response = yield* client.agent.turn({\n params: { releaseId: input.releaseId },\n payload: {\n history: input.history,\n prompt: input.prompt,\n provider: input.provider\n }\n })\n if (response.releaseId !== input.releaseId || response.release.releaseId !== input.releaseId) {\n return yield* Effect.fail(new ReleaseAgentProtocolError())\n }\n return {\n eventCursor: response.eventCursor,\n provider: response.provider,\n release: response.release,\n reply: response.reply\n }\n})\n\nconst loadPresetsEffect = Effect.fn(\"ReleaseAgentTransport.loadPresets\")(function*() {\n const client = yield* makeAuthenticatedMutationClient\n const catalog = yield* client.agent.providers()\n const presets = new Array<\"claude\" | \"codex\">()\n for (const provider of catalog.providers) {\n const providerId = String(provider.providerId)\n if (\n provider.health === \"available\" &&\n provider.capabilities.includes(\"release-chat\") &&\n (providerId === \"codex\" || providerId === \"claude\")\n ) {\n presets.push(providerId)\n }\n }\n return presets\n})\n\n/** Browser transport for the selected read-only local release-agent preset. */\nexport const runBrowserReleaseAgentTurn: ReleaseAgentTurn = (input, { signal }) =>\n Effect.runPromise(runTurnEffect(input).pipe(Effect.provide(FetchHttpClient.layer)), { signal })\n\n/** Load only configured local release-agent presets from the redacted catalog. */\nexport const loadBrowserReleaseAgentPresets = (\n signal: AbortSignal\n): Promise<ReadonlyArray<\"claude\" | \"codex\">> =>\n Effect.runPromise(loadPresetsEffect().pipe(Effect.provide(FetchHttpClient.layer)), { signal })\n",".room,\n.hero,\n.heroCopy,\n.people,\n.starters,\n.composer,\n.legacy,\n.legacyHeader,\n.legacyContext {\n display: grid;\n}\n\n.room,\n.legacy {\n gap: clamp(4rem, 9vw, 8rem);\n}\n\n.back {\n inline-size: fit-content;\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.back:hover,\n.back:focus-visible {\n color: var(--rly-color-text-1);\n text-decoration: underline;\n text-underline-offset: var(--rly-space-4);\n}\n\n.hero,\n.legacyHeader {\n gap: var(--rly-space-32);\n}\n\n.heroCopy,\n.legacyHeader {\n max-inline-size: 58rem;\n}\n\n.heroCopy {\n gap: var(--rly-space-16);\n}\n\n.heroCopy h1,\n.legacyHeader h1 {\n max-inline-size: 11ch;\n letter-spacing: -0.065em;\n text-wrap: balance;\n}\n\n.heroCopy p,\n.legacyHeader p {\n max-inline-size: 46rem;\n}\n\n.eyebrow {\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.people,\n.starters {\n gap: var(--rly-space-24);\n}\n\n.presetList {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--rly-space-12);\n}\n\n.preset,\n.suggestionList {\n display: grid;\n}\n\n.suggestionList {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--rly-space-12);\n}\n\n.preset,\n.suggestion {\n min-block-size: 7rem;\n padding: var(--rly-space-20);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n cursor: pointer;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-align: start;\n transition:\n border-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing),\n background-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing),\n box-shadow var(--rly-motion-fast-duration) var(--rly-motion-fast-easing);\n}\n\n.preset {\n gap: var(--rly-space-8);\n}\n\n.preset span,\n.suggestion span {\n color: var(--rly-color-text-2);\n font: var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height)\n var(--rly-type-body-font);\n}\n\n.preset small {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n text-transform: uppercase;\n}\n\n.preset[aria-checked=\"true\"] {\n border-color: var(--rly-color-agent);\n background: var(--rly-color-surface-2);\n box-shadow: inset 0 0 0 1px var(--rly-color-agent);\n}\n\n.preset:hover,\n.suggestion:hover {\n border-color: var(--rly-color-agent);\n background: var(--rly-color-surface-2);\n}\n\n.preset:focus-visible,\n.suggestion:focus-visible {\n border-color: var(--rly-color-agent);\n background: var(--rly-color-surface-2);\n outline: 2px solid var(--rly-color-focus);\n outline-offset: 2px;\n}\n\n.preset:disabled,\n.suggestion:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n}\n\n.thread {\n border-color: var(--rly-color-border-2);\n}\n\n.threadContext {\n display: flex;\n flex-wrap: wrap;\n gap: var(--rly-space-8) var(--rly-space-16);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.threadContext strong {\n color: var(--rly-color-text-1);\n}\n\n.threadContext span + span::before {\n margin-inline-end: var(--rly-space-16);\n color: var(--rly-color-border-2);\n content: \"·\";\n}\n\n.composer {\n gap: var(--rly-space-16);\n}\n\n.composer textarea {\n min-block-size: 10rem;\n resize: vertical;\n font: var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height)\n var(--rly-type-body-large-font);\n}\n\n.failure {\n scroll-margin-block-start: 6rem;\n}\n\n.state {\n display: grid;\n min-block-size: 60dvh;\n place-items: center;\n}\n\n.legacyHeader,\n.legacyContext {\n gap: var(--rly-space-16);\n}\n\n.legacyContext {\n max-inline-size: 52rem;\n}\n\n@media (max-width: 48rem) {\n .suggestionList {\n grid-template-columns: 1fr;\n }\n\n .presetList {\n grid-template-columns: 1fr;\n }\n\n .preset,\n .suggestion {\n min-block-size: 5rem;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .preset,\n .suggestion {\n transition: none;\n }\n}\n","import { AgentThread, PeopleStrip, ReleaseRelay, type RlyAgentThreadMessage } from \"@knpkv/rly/patterns\"\nimport { Button, Field, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Predicate from \"effect/Predicate\"\nimport { type FormEvent, type ReactElement, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Link, useLocation, useOutletContext, useParams, useSearchParams } from \"react-router\"\n\nimport type { PortfolioReleaseSummary } from \"../api/portfolio.js\"\nimport type { EventCursor, ReleaseId, WorkspaceId } from \"../domain/identifiers.js\"\nimport type { PortfolioReleasePresentation } from \"./portfolio/presentPortfolio.js\"\nimport {\n decodeReleaseRouteId,\n decodeWorkspaceRouteId,\n releaseFullPath,\n releaseTransitionNames\n} from \"./releases/releaseRoutes.js\"\nimport {\n readReleaseAgentThread,\n type StoredReleaseAgentThreadMessage,\n writeReleaseAgentThread\n} from \"./releases/releaseAgentThreadStorage.js\"\nimport type { WorkspaceReleaseOutletContext } from \"./releases/WorkspaceReleaseLayout.js\"\nimport { loadBrowserReleaseAgentPresets, runBrowserReleaseAgentTurn } from \"./releases/releaseAgentTransport.js\"\nimport styles from \"./AgentPage.module.css\"\n\nexport interface ReleaseAgentHistoryMessage {\n readonly content: string\n readonly role: \"assistant\" | \"user\"\n}\n\nexport interface ReleaseAgentTurnInput {\n readonly history: ReadonlyArray<ReleaseAgentHistoryMessage>\n readonly prompt: string\n readonly provider: \"claude\" | \"codex\"\n readonly releaseId: ReleaseId\n readonly workspaceId: WorkspaceId\n}\n\nexport interface ReleaseAgentTurnResult {\n readonly eventCursor: EventCursor\n readonly provider: \"claude\" | \"codex\"\n readonly release: PortfolioReleaseSummary\n readonly reply: string\n}\n\nexport type ReleaseAgentTurn = (\n input: ReleaseAgentTurnInput,\n options: { readonly signal: AbortSignal }\n) => Promise<ReleaseAgentTurnResult>\n\nexport type ReleaseAgentPresetLoader = (signal: AbortSignal) => Promise<ReadonlyArray<\"claude\" | \"codex\">>\n\nexport interface AgentPageProps {\n /** Application-owned local runtime boundary. Omit it to render an honest unavailable state. */\n readonly runTurn?: ReleaseAgentTurn\n /** Configured local presets. Omit only at deterministic/test boundaries. */\n readonly availableProviders?: ReadonlyArray<\"claude\" | \"codex\">\n /** Whether the connected route is still establishing a trustworthy provider catalog. */\n readonly providerCatalogPending?: boolean\n}\n\ninterface AgentPageContext {\n readonly description: string\n readonly label: string\n readonly path: string | null\n}\n\ntype LocalThreadMessage = StoredReleaseAgentThreadMessage\n\ntype TurnFailure = \"blocked\" | \"failed\" | \"not-found\" | \"rate-limited\" | \"session-expired\" | \"timed-out\" | \"unavailable\"\n\nconst DEFAULT_CONTEXT: AgentPageContext = {\n description: \"The workspace-wide view of release readiness, people, source health, and agent work.\",\n label: \"Overview\",\n path: \"/\"\n}\n\nconst contexts: Readonly<Record<string, AgentPageContext>> = {\n \"/\": DEFAULT_CONTEXT,\n \"/pair\": {\n description: \"The private browser-pairing flow. Credentials never become part of the agent context.\",\n label: \"Browser pairing\",\n path: \"/pair\"\n },\n \"/releases\": {\n description: \"Release relationships, blockers, collaborators, pull requests, and deployment evidence.\",\n label: \"Releases\",\n path: \"/releases\"\n },\n \"/services\": {\n description: \"Negotiated plugin health and the connections that provide delivery evidence.\",\n label: \"Services\",\n path: \"/services\"\n }\n}\n\nconst AGENT_CONTEXT_BASE = \"https://control-center.invalid\"\n\nconst contextFor = (path: string | null): AgentPageContext => {\n if (path === null) return DEFAULT_CONTEXT\n const contextUrl = URL.parse(path, AGENT_CONTEXT_BASE)\n if (contextUrl === null || contextUrl.origin !== AGENT_CONTEXT_BASE) {\n return {\n description:\n \"The calling page is not a recognized Control Center context. No fallback workspace or entity is substituted.\",\n label: \"Context unavailable\",\n path: null\n }\n }\n const safePath = `${contextUrl.pathname}${contextUrl.search}${contextUrl.hash}`\n const knownContext = contexts[contextUrl.pathname]\n if (knownContext !== undefined) return { ...knownContext, path: safePath }\n const routeSegments = contextUrl.pathname.split(\"/\")\n const workspaceId = decodeWorkspaceRouteId(routeSegments[2])\n const routeKind = routeSegments[3]\n const releaseId = decodeReleaseRouteId(routeSegments[4])\n const releaseSuffix = routeSegments[5]\n const isWorkspaceCollectionRoute = routeSegments[1] === \"w\" && routeSegments[4] === undefined\n const isReleaseRoute =\n routeSegments[1] === \"w\" &&\n workspaceId !== null &&\n routeKind === \"releases\" &&\n releaseId !== null &&\n (releaseSuffix === undefined || releaseSuffix === \"preview\" || releaseSuffix === \"agent\")\n if (isWorkspaceCollectionRoute && workspaceId !== null && routeKind === \"overview\" && releaseId === null) {\n return {\n description: `Workspace ${workspaceId} release readiness, people, source health, and agent work.`,\n label: \"Workspace overview\",\n path: safePath\n }\n }\n if (isWorkspaceCollectionRoute && workspaceId !== null && routeKind === \"items\" && releaseId === null) {\n return {\n description: `Current normalized delivery items in workspace ${workspaceId}, including the exact active filters and selection.`,\n label: \"Workspace items\",\n path: safePath\n }\n }\n if (isWorkspaceCollectionRoute && workspaceId !== null && routeKind === \"timeline\" && releaseId === null) {\n const selectedEvent = contextUrl.searchParams.get(\"event\")\n return {\n description:\n selectedEvent === null\n ? `Attributable delivery activity in workspace ${workspaceId}, including the exact actor and date filters.`\n : `Timeline event ${selectedEvent} in workspace ${workspaceId}, including the exact actor and date filters.`,\n label: \"Workspace timeline\",\n path: safePath\n }\n }\n const activeWorkRelease = contextUrl.searchParams.get(\"release\")\n const hasValidActiveWorkRelease = activeWorkRelease === null || decodeReleaseRouteId(activeWorkRelease) !== null\n if (\n isWorkspaceCollectionRoute &&\n workspaceId !== null &&\n routeKind === \"work\" &&\n releaseId === null &&\n hasValidActiveWorkRelease\n ) {\n return {\n description: `Active release decisions in workspace ${workspaceId}, including the exact selected release and filters.`,\n label: \"Active work\",\n path: safePath\n }\n }\n if (isReleaseRoute) {\n return {\n description: `Release ${releaseId} in workspace ${workspaceId}. Relay will resolve current release facts on the server before answering.`,\n label: `Release ${releaseId.slice(-6)}`,\n path: safePath\n }\n }\n return {\n description:\n \"The calling page is not a recognized Control Center context. No fallback workspace or entity is substituted.\",\n label: \"Context unavailable\",\n path: null\n }\n}\n\nconst timestamp = (): Pick<LocalThreadMessage, \"dateTime\" | \"time\"> => {\n const now = DateTime.nowUnsafe()\n return {\n dateTime: DateTime.formatIso(now),\n time: DateTime.formatLocal(now, { hour: \"2-digit\", minute: \"2-digit\" })\n }\n}\n\nconst failureTag = (failure: unknown): string | null => {\n if (!Predicate.hasProperty(failure, \"_tag\") || typeof failure._tag !== \"string\") return null\n return failure._tag\n}\n\nconst classifyTurnFailure = (failure: unknown): TurnFailure => {\n switch (failureTag(failure)) {\n case \"UnauthorizedApiError\":\n return \"session-expired\"\n case \"ForbiddenApiError\":\n return \"blocked\"\n case \"NotFoundApiError\":\n case \"ApplicationResourceNotFound\":\n return \"not-found\"\n case \"ServiceUnavailableApiError\":\n case \"ApplicationServiceUnavailable\":\n return \"unavailable\"\n case \"RateLimitedApiError\":\n return \"rate-limited\"\n case \"RequestTimedOutApiError\":\n return \"timed-out\"\n default:\n return \"failed\"\n }\n}\n\nconst failurePanel = (failure: TurnFailure): ReactElement => {\n switch (failure) {\n case \"session-expired\":\n return (\n <StatePanel\n action={<Link to=\"/pair\">Pair this browser</Link>}\n announce=\"assertive\"\n description=\"Pair this browser again, then return to the release thread. Your local messages remain in this tab.\"\n title=\"Session expired\"\n tone=\"caution\"\n />\n )\n case \"blocked\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"This connection cannot run a release agent. Use an allowed Control Center address.\"\n title=\"Agent access blocked\"\n tone=\"critical\"\n />\n )\n case \"not-found\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"This release is no longer in the current workspace snapshot. Return to the release before asking again.\"\n title=\"Release not found\"\n tone=\"caution\"\n />\n )\n case \"unavailable\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"Start the configured local Codex or Claude runner, then ask again.\"\n title=\"Relay is unavailable\"\n tone=\"caution\"\n />\n )\n case \"rate-limited\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"Relay has reached its local turn budget. Wait a moment, then submit the message again.\"\n title=\"Too many agent turns\"\n tone=\"caution\"\n />\n )\n case \"timed-out\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"The local model exceeded this turn's deadline. Narrow the question, then submit it again.\"\n title=\"Relay took too long\"\n tone=\"caution\"\n />\n )\n case \"failed\":\n return (\n <StatePanel\n announce=\"assertive\"\n description=\"The agent did not complete this turn. Your message is still here; ask again when the runtime is ready.\"\n title=\"Relay could not answer\"\n tone=\"critical\"\n />\n )\n }\n}\n\nconst RUN_PRESETS: ReadonlyArray<{\n readonly description: string\n readonly label: string\n readonly provider: \"claude\" | \"codex\"\n}> = [\n {\n description: \"Fast, repository-aware release work with the configured Codex CLI.\",\n label: \"Run with Codex\",\n provider: \"codex\"\n },\n {\n description: \"Use the configured Claude CLI for a second agent perspective.\",\n label: \"Run with Claude\",\n provider: \"claude\"\n }\n]\n\nconst PROMPT_TEMPLATES: ReadonlyArray<{\n readonly label: string\n readonly prompt: string\n}> = [\n { label: \"Release blockers\", prompt: \"What blocks this release?\" },\n { label: \"Release summary\", prompt: \"Write a concise release summary.\" },\n { label: \"Missing evidence\", prompt: \"Which evidence is still missing?\" }\n]\n\nconst MAXIMUM_HISTORY_MESSAGES = 12\nconst MAXIMUM_HISTORY_MESSAGE_LENGTH = 12_000\nconst MAXIMUM_HISTORY_CONTENT_LENGTH = 64_000\nconst HISTORY_TRUNCATION_MARKER = \"\\n[earlier content truncated]\"\n\n/** Keep browser-owned thread history inside the public agent-turn payload contract. */\nexport const boundedReleaseAgentHistory = (\n messages: ReadonlyArray<ReleaseAgentHistoryMessage>\n): ReadonlyArray<ReleaseAgentHistoryMessage> => {\n const history: Array<ReleaseAgentHistoryMessage> = []\n let contentLength = 0\n for (const message of messages.slice(-MAXIMUM_HISTORY_MESSAGES).reverse()) {\n const content =\n message.content.length <= MAXIMUM_HISTORY_MESSAGE_LENGTH\n ? message.content\n : `${message.content.slice(0, MAXIMUM_HISTORY_MESSAGE_LENGTH - HISTORY_TRUNCATION_MARKER.length)}${HISTORY_TRUNCATION_MARKER}`\n if (contentLength + content.length > MAXIMUM_HISTORY_CONTENT_LENGTH) break\n history.unshift({ content, role: message.role })\n contentLength += content.length\n }\n return history\n}\n\nconst humanActor = {\n kind: \"human\",\n person: { avatarFallback: \"YO\", id: \"current-operator\", name: \"You\", role: \"Release operator\" }\n} satisfies RlyAgentThreadMessage[\"actor\"]\n\nconst agentActor = {\n avatarFallback: \"AI\",\n id: \"relay\",\n kind: \"agent\",\n name: \"Relay\",\n role: \"Release agent\"\n} satisfies RlyAgentThreadMessage[\"actor\"]\n\nconst presentMessages = (messages: ReadonlyArray<LocalThreadMessage>): ReadonlyArray<RlyAgentThreadMessage> =>\n messages.map((message) => ({\n actor: message.role === \"user\" ? humanActor : agentActor,\n content: message.content,\n dateTime: message.dateTime,\n id: message.id,\n time: message.time,\n ...(message.context === undefined\n ? {}\n : {\n evidence: (\n <span>\n Answered from {message.context.serviceName} {message.context.version} · {message.context.relayCodename} ·\n snapshot {message.context.eventCursor}\n </span>\n )\n })\n }))\n\nconst nextThreadSequence = (messages: ReadonlyArray<LocalThreadMessage>): number =>\n messages.reduce((next, { id }) => {\n const sequence = Number(id.split(\"-\")[1])\n return Number.isSafeInteger(sequence) && sequence >= next ? sequence + 1 : next\n }, 0)\n\nconst ReleaseAgentComposer = ({\n disabled,\n isRunning,\n onPromptChange,\n onSubmit,\n prompt,\n provider\n}: {\n readonly disabled: boolean\n readonly isRunning: boolean\n readonly onPromptChange: (prompt: string) => void\n readonly onSubmit: (event: FormEvent<HTMLFormElement>) => void\n readonly prompt: string\n readonly provider: \"claude\" | \"codex\"\n}): ReactElement => (\n <form className={styles.composer} onSubmit={onSubmit}>\n <Field label=\"What do you need?\">\n {(controlProps) => (\n <textarea\n {...controlProps}\n autoFocus\n disabled={disabled}\n maxLength={8_000}\n onChange={(event) => onPromptChange(event.currentTarget.value)}\n placeholder=\"Ask about blockers, people, checks, or release notes…\"\n rows={4}\n value={prompt}\n />\n )}\n </Field>\n <Button\n disabled={disabled || prompt.trim().length === 0}\n loading={isRunning}\n size=\"principal\"\n stretch\n type=\"submit\"\n variant=\"primary\"\n >\n {`Ask Relay with ${provider === \"codex\" ? \"Codex\" : \"Claude\"}`}\n </Button>\n </form>\n)\n\nconst ReleaseAgentRoom = ({\n availableProviders,\n providerCatalogPending,\n release,\n runTurn,\n workspaceId\n}: {\n readonly release: PortfolioReleasePresentation\n readonly runTurn: ReleaseAgentTurn | undefined\n readonly availableProviders: ReadonlyArray<\"claude\" | \"codex\"> | undefined\n readonly providerCatalogPending: boolean\n readonly workspaceId: WorkspaceId\n}): ReactElement => {\n const location = useLocation()\n const [prompt, setPrompt] = useState(\"\")\n const [provider, setProvider] = useState<\"claude\" | \"codex\">(\"codex\")\n const providerWasSelected = useRef(false)\n const [messages, setMessages] = useState<ReadonlyArray<LocalThreadMessage>>(() => readReleaseAgentThread(release.id))\n const [failure, setFailure] = useState<TurnFailure | null>(null)\n const [isRunning, setIsRunning] = useState(false)\n const [announcement, setAnnouncement] = useState(\"\")\n const nextMessage = useRef(nextThreadSequence(messages))\n const activeTurn = useRef<AbortController | null>(null)\n const transitionNames = releaseTransitionNames(release.id)\n\n useEffect(\n () => () => {\n const currentTurn = activeTurn.current\n activeTurn.current = null\n currentTurn?.abort()\n },\n []\n )\n\n useEffect(() => {\n writeReleaseAgentThread(release.id, messages)\n }, [messages, release.id])\n\n const threadMessages = useMemo(() => presentMessages(messages), [messages])\n const lastProvider = [...messages].reverse().find((message) => message.provider !== undefined)?.provider\n const runtimeUnavailable = runTurn === undefined\n const selectedProviderUnavailable =\n providerCatalogPending || (availableProviders !== undefined && !availableProviders.includes(provider))\n\n useEffect(() => {\n if (availableProviders === undefined || (providerWasSelected.current && availableProviders.includes(provider)))\n return\n const fallback = availableProviders[0]\n if (fallback !== undefined) setProvider(fallback)\n }, [availableProviders, provider])\n\n const onSubmit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n const submittedPrompt = prompt.trim()\n if (submittedPrompt.length === 0 || runTurn === undefined || selectedProviderUnavailable || isRunning) return\n const history = boundedReleaseAgentHistory(messages)\n const humanMessage = {\n ...timestamp(),\n content: submittedPrompt,\n id: `turn-${nextMessage.current++}-human`,\n role: \"user\"\n } satisfies LocalThreadMessage\n const abortController = new AbortController()\n activeTurn.current?.abort()\n activeTurn.current = abortController\n setMessages((current) => [...current, humanMessage])\n setPrompt(\"\")\n setFailure(null)\n setIsRunning(true)\n setAnnouncement(\"Relay is reading the release context.\")\n\n runTurn(\n { history, prompt: submittedPrompt, provider, releaseId: release.id, workspaceId },\n { signal: abortController.signal }\n )\n .then(\n (result) => {\n if (abortController.signal.aborted) return\n const reply = result.reply.trim()\n if (reply.length === 0) {\n setFailure(\"failed\")\n setAnnouncement(\"Relay returned an empty answer.\")\n return\n }\n setMessages((current) => [\n ...current,\n {\n ...timestamp(),\n content: reply,\n context: {\n eventCursor: result.eventCursor,\n relayCodename: result.release.relay.codename,\n serviceName: result.release.serviceName,\n updatedAt: result.release.updatedAt,\n version: result.release.version\n },\n id: `turn-${nextMessage.current++}-agent`,\n provider: result.provider,\n role: \"assistant\"\n }\n ])\n setAnnouncement(\"Relay answered in this release thread.\")\n },\n (cause: unknown) => {\n if (abortController.signal.aborted) return\n setFailure(classifyTurnFailure(cause))\n setAnnouncement(\"Relay could not complete this turn.\")\n }\n )\n .finally(() => {\n if (activeTurn.current !== abortController) return\n activeTurn.current = null\n setIsRunning(false)\n })\n }\n\n return (\n <article className={styles.room} data-release-agent-id={release.id}>\n <Link className={styles.back} state={location.state} to={releaseFullPath(workspaceId, release.id)}>\n Back to release\n </Link>\n <header className={styles.hero}>\n <ReleaseRelay\n algorithm={release.relay.algorithm}\n codename={release.relay.codename}\n data-rly-release-transition-name={transitionNames.relay}\n data-rly-release-transition-part=\"relay\"\n size=\"hero\"\n style={{ viewTransitionName: transitionNames.relay }}\n symbolIndices={release.relay.symbolIndices}\n />\n <div className={styles.heroCopy}>\n <Text className={styles.eyebrow} tone=\"secondary\" variant=\"label\">\n {release.lifecycleLabel} · {release.version}\n </Text>\n <Text as=\"h1\" id=\"agent-title\" variant=\"verdict\">\n Ask {release.relay.codename}.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Relay resolves the current release before every answer. This thread stays in this tab.\n </Text>\n </div>\n </header>\n\n <section aria-labelledby=\"agent-collaborators\" className={styles.people}>\n <Text as=\"h2\" id=\"agent-collaborators\" variant=\"section-title\">\n In this release\n </Text>\n {release.collaborators.length === 0 ? (\n <Text tone=\"secondary\">No owner or approver is assigned yet.</Text>\n ) : (\n <PeopleStrip\n aria-label={`${release.serviceName} release collaborators`}\n expanded\n limit={release.collaborators.length}\n onExpandedChange={() => undefined}\n people={release.collaborators}\n />\n )}\n </section>\n\n <section aria-labelledby=\"agent-presets\" className={styles.starters}>\n <Text as=\"h2\" id=\"agent-presets\" tone=\"secondary\" variant=\"label\">\n Agent preset\n </Text>\n <div aria-label=\"Agent presets\" className={styles.presetList} role=\"radiogroup\">\n {RUN_PRESETS.map((preset) => (\n <button\n aria-checked={provider === preset.provider}\n className={styles.preset}\n disabled={\n runtimeUnavailable ||\n isRunning ||\n providerCatalogPending ||\n (availableProviders !== undefined && !availableProviders.includes(preset.provider))\n }\n key={preset.provider}\n onClick={() => {\n providerWasSelected.current = true\n setProvider(preset.provider)\n }}\n role=\"radio\"\n type=\"button\"\n >\n <strong>{preset.label}</strong>\n <span>{preset.description}</span>\n {availableProviders !== undefined && !availableProviders.includes(preset.provider) ? (\n <small>Not configured</small>\n ) : null}\n </button>\n ))}\n </div>\n <Text as=\"h2\" id=\"agent-starters\" tone=\"secondary\" variant=\"label\">\n Prompt templates\n </Text>\n <div className={styles.suggestionList}>\n {PROMPT_TEMPLATES.map((template) => (\n <button\n className={styles.suggestion}\n disabled={runtimeUnavailable || selectedProviderUnavailable || isRunning}\n key={template.label}\n onClick={() => setPrompt(template.prompt)}\n type=\"button\"\n >\n <strong>{template.label}</strong>\n <span>{template.prompt}</span>\n </button>\n ))}\n </div>\n </section>\n\n {runtimeUnavailable ? (\n <StatePanel\n description=\"Connect the server to a local Codex or Claude runner. Provider credentials and repository access stay server-side; this tab stores its bounded thread locally.\"\n title=\"Local agent not connected\"\n />\n ) : providerCatalogPending ? null : selectedProviderUnavailable ? (\n <StatePanel\n description=\"Choose a configured Codex or Claude preset before starting this turn.\"\n title=\"Selected agent is not configured\"\n tone=\"caution\"\n />\n ) : null}\n {failure === null ? null : <div className={styles.failure}>{failurePanel(failure)}</div>}\n\n <AgentThread\n {...(announcement.length === 0 ? {} : { announcement })}\n className={styles.thread}\n composer={\n <ReleaseAgentComposer\n disabled={runtimeUnavailable || selectedProviderUnavailable}\n isRunning={isRunning}\n onPromptChange={setPrompt}\n onSubmit={onSubmit}\n prompt={prompt}\n provider={provider}\n />\n }\n context={\n <div className={styles.threadContext}>\n <strong>{release.serviceName}</strong>\n <span>{release.version}</span>\n <span>{release.relay.codename}</span>\n <span>Preset {provider}</span>\n {lastProvider === undefined ? null : <span>Last answer {lastProvider}</span>}\n </div>\n }\n emptyLabel=\"Ask one useful question. Relay will answer only for this release.\"\n heading=\"Release thread\"\n messages={threadMessages}\n />\n </article>\n )\n}\n\nconst CanonicalAgentState = ({ context }: { readonly context: WorkspaceReleaseOutletContext }): ReactElement => {\n switch (context.controller.state._tag) {\n case \"loading\":\n return (\n <StatePanel\n description=\"Control Center is loading the exact release and its collaborators.\"\n title=\"Loading release context\"\n />\n )\n case \"session\":\n return (\n <StatePanel\n action={\n context.controller.state.reason === \"anonymous\" ? <Link to=\"/pair\">Pair this browser</Link> : undefined\n }\n description=\"Release context must be available before Relay can answer.\"\n title={\n context.controller.state.reason === \"blocked\" ? \"Release access blocked\" : \"Release context unavailable\"\n }\n tone={context.controller.state.reason === \"blocked\" ? \"critical\" : \"caution\"}\n />\n )\n case \"failed\":\n return (\n <StatePanel\n action={<Button onClick={context.controller.onRetry}>Try again</Button>}\n description=\"Control Center could not load the release. Check the server, then try again.\"\n title=\"Release context unavailable\"\n tone=\"critical\"\n />\n )\n case \"ready\":\n return <></>\n }\n}\n\nconst LegacyAgentPage = (): ReactElement => {\n const [searchParams] = useSearchParams()\n const context = contextFor(searchParams.get(\"from\"))\n return (\n <section aria-labelledby=\"agent-title\" className={styles.legacy}>\n <header className={styles.legacyHeader}>\n <Text className={styles.eyebrow} tone=\"secondary\" variant=\"label\">\n Relay\n </Text>\n <Text as=\"h1\" id=\"agent-title\" variant=\"verdict\">\n Ask in context.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Open Relay from a release to start an exact, release-owned thread.\n </Text>\n </header>\n <Surface as=\"section\" className={styles.legacyContext} padding=\"spacious\" shape=\"grouped\" tone=\"secondary\">\n <Text tone=\"secondary\" variant=\"label\">\n Current context\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {context.label}\n </Text>\n <Text tone=\"secondary\">{context.description}</Text>\n {context.path === null ? null : (\n <Link className={styles.back} to={context.path}>\n Return to {context.label}\n </Link>\n )}\n </Surface>\n </section>\n )\n}\n\n/** Render an exact release-owned local agent thread, with a safe legacy context preview. */\nexport const AgentPage = ({\n availableProviders,\n providerCatalogPending = false,\n runTurn\n}: AgentPageProps): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext | null>()\n const params = useParams()\n const workspaceId = decodeWorkspaceRouteId(params.workspaceId)\n const releaseId = decodeReleaseRouteId(params.releaseId)\n const isCanonicalRoute = params.workspaceId !== undefined || params.releaseId !== undefined\n\n if (!isCanonicalRoute) return <LegacyAgentPage />\n if (workspaceId === null || releaseId === null || context === null || context.workspaceId !== workspaceId) {\n return (\n <section className={styles.state}>\n <StatePanel\n action={workspaceId === null ? <Link to=\"/\">Return to Control Center</Link> : undefined}\n description=\"This address does not identify a release in the current workspace.\"\n title=\"Release not found\"\n />\n </section>\n )\n }\n if (context.controller.state._tag !== \"ready\") return <CanonicalAgentState context={context} />\n const release = context.controller.state.portfolio.releases.find((candidate) => candidate.id === releaseId)\n if (release === undefined) {\n return (\n <section className={styles.state}>\n <StatePanel\n action={\n <Link\n to={context.controller.state.portfolio.workspaceId === workspaceId ? `/w/${workspaceId}/overview` : \"/\"}\n >\n Return to workspace\n </Link>\n }\n description=\"This release does not exist in the current workspace snapshot.\"\n title=\"Release not found\"\n />\n </section>\n )\n }\n return (\n <ReleaseAgentRoom\n availableProviders={availableProviders}\n key={release.id}\n providerCatalogPending={providerCatalogPending}\n release={release}\n runTurn={runTurn}\n workspaceId={workspaceId}\n />\n )\n}\n\ntype ProviderCatalogState =\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"ready\"; readonly providers: ReadonlyArray<\"claude\" | \"codex\"> }\n | { readonly _tag: \"failed\" }\n\n/** Route entry wired to the authenticated Control Center release-agent API. */\nexport const ConnectedAgentPage = ({\n loadPresets = loadBrowserReleaseAgentPresets,\n runTurn = runBrowserReleaseAgentTurn\n}: {\n readonly loadPresets?: ReleaseAgentPresetLoader\n readonly runTurn?: ReleaseAgentTurn\n} = {}): ReactElement => {\n const [catalog, setCatalog] = useState<ProviderCatalogState>({ _tag: \"loading\" })\n const [catalogRequest, setCatalogRequest] = useState(0)\n useEffect(() => {\n const abort = new AbortController()\n setCatalog({ _tag: \"loading\" })\n loadPresets(abort.signal).then(\n (providers) => {\n if (!abort.signal.aborted) setCatalog({ _tag: \"ready\", providers })\n },\n () => {\n if (!abort.signal.aborted) setCatalog({ _tag: \"failed\" })\n }\n )\n return () => abort.abort()\n }, [catalogRequest, loadPresets])\n const availableProviders = catalog._tag === \"ready\" ? catalog.providers : undefined\n return (\n <>\n {catalog._tag === \"failed\" ? (\n <section className={styles.state}>\n <StatePanel\n action={<Button onClick={() => setCatalogRequest((request) => request + 1)}>Retry agent presets</Button>}\n description=\"Relay could not confirm the configured local runners. You can retry without leaving this release.\"\n title=\"Agent presets could not be refreshed\"\n tone=\"caution\"\n />\n </section>\n ) : null}\n <AgentPage\n {...(availableProviders === undefined ? {} : { availableProviders })}\n providerCatalogPending={catalog._tag !== \"ready\"}\n runTurn={runTurn}\n />\n </>\n )\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- ._room_etqjt_1,._hero_etqjt_2,._heroCopy_etqjt_3,._people_etqjt_4,._starters_etqjt_5,._composer_etqjt_6,._legacy_etqjt_7,._legacyHeader_etqjt_8,._legacyContext_etqjt_9{display:grid}._room_etqjt_1,._legacy_etqjt_7{gap:clamp(4rem,9vw,8rem)}._back_etqjt_18{inline-size:fit-content;color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-decoration:none}._back_etqjt_18:hover,._back_etqjt_18:focus-visible{color:var(--rly-color-text-1);text-underline-offset:var(--rly-space-4);text-decoration:underline}._hero_etqjt_2,._legacyHeader_etqjt_8{gap:var(--rly-space-32)}._heroCopy_etqjt_3,._legacyHeader_etqjt_8{max-inline-size:58rem}._heroCopy_etqjt_3{gap:var(--rly-space-16)}._heroCopy_etqjt_3 h1,._legacyHeader_etqjt_8 h1{letter-spacing:-.065em;text-wrap:balance;max-inline-size:11ch}._heroCopy_etqjt_3 p,._legacyHeader_etqjt_8 p{max-inline-size:46rem}._eyebrow_etqjt_59{letter-spacing:.08em;text-transform:uppercase}._people_etqjt_4,._starters_etqjt_5{gap:var(--rly-space-24)}._presetList_etqjt_69{gap:var(--rly-space-12);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}._preset_etqjt_69,._suggestionList_etqjt_76{display:grid}._suggestionList_etqjt_76{gap:var(--rly-space-12);grid-template-columns:repeat(3,minmax(0,1fr))}._preset_etqjt_69,._suggestion_etqjt_76{min-block-size:7rem;padding:var(--rly-space-20);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-group);background:var(--rly-color-surface-1);color:var(--rly-color-text-1);cursor:pointer;font:var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height) var(--rly-type-card-title-font);text-align:start;transition:border-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing), background-color var(--rly-motion-fast-duration) var(--rly-motion-fast-easing), box-shadow var(--rly-motion-fast-duration) var(--rly-motion-fast-easing)}._preset_etqjt_69{gap:var(--rly-space-8)}._preset_etqjt_69 span,._suggestion_etqjt_76 span{color:var(--rly-color-text-2);font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font)}._preset_etqjt_69 small{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font);text-transform:uppercase}._preset_etqjt_69[aria-checked=true]{border-color:var(--rly-color-agent);background:var(--rly-color-surface-2);box-shadow:inset 0 0 0 1px var(--rly-color-agent)}._preset_etqjt_69:hover,._suggestion_etqjt_76:hover{border-color:var(--rly-color-agent);background:var(--rly-color-surface-2)}._preset_etqjt_69:focus-visible,._suggestion_etqjt_76:focus-visible{border-color:var(--rly-color-agent);background:var(--rly-color-surface-2);outline:2px solid var(--rly-color-focus);outline-offset:2px}._preset_etqjt_69:disabled,._suggestion_etqjt_76:disabled{cursor:not-allowed;opacity:.45}._thread_etqjt_147{border-color:var(--rly-color-border-2)}._threadContext_etqjt_151{gap:var(--rly-space-8) var(--rly-space-16);color:var(--rly-color-text-2);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);flex-wrap:wrap;display:flex}._threadContext_etqjt_151 strong{color:var(--rly-color-text-1)}._threadContext_etqjt_151 span+span:before{color:var(--rly-color-border-2);content:"·";margin-inline-end:var(--rly-space-16)}._composer_etqjt_6{gap:var(--rly-space-16)}._composer_etqjt_6 textarea{resize:vertical;min-block-size:10rem;font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font)}._failure_etqjt_181{scroll-margin-block-start:6rem}._state_etqjt_185{place-items:center;min-block-size:60dvh;display:grid}._legacyHeader_etqjt_8,._legacyContext_etqjt_9{gap:var(--rly-space-16)}._legacyContext_etqjt_9{max-inline-size:52rem}@media (width<=48rem){._suggestionList_etqjt_76,._presetList_etqjt_69{grid-template-columns:1fr}._preset_etqjt_69,._suggestion_etqjt_76{min-block-size:5rem}}@media (prefers-reduced-motion:reduce){._preset_etqjt_69,._suggestion_etqjt_76{transition:none}}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,f as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{n as a,t as o}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{u as s}from"./index-j5ze816l.js";import{n as c,r as l}from"./primitives-nKxQGSsE-CJNmac__.js";import{Cr as u,Dr as d,Jn as f,Tr as p,ca as m,dr as h,s as g}from"./agent-api-QVqt4a0O.js";import{n as _,t as v}from"./serviceOnboarding-Jg_0yNjf.js";import{n as y,r as b,t as x}from"./connectionTestTransport-BQ55d6Me.js";var S=e(t(),1),C={page:`_page_qe0fs_1`,heading:`_heading_qe0fs_9`,sites:`_sites_qe0fs_10`,site:`_site_qe0fs_10`,identity:`_identity_qe0fs_22`},w=i(),T=f.check(d(),p(),u(4096)),E=({transport:e=x}={})=>{let t=r(),[i,u]=n(),d=(0,S.useRef)(i.get(`state`)).current,[f]=(0,S.useState)(()=>b(d)),{state:p}=s(),[E,D]=(0,S.useState)({_tag:`waiting`}),O=(0,S.useRef)(!1),k=(0,S.useRef)(null),A=(0,S.useRef)(null),j=(0,S.useRef)(0);(0,S.useEffect)(()=>{let t=++j.current,n=()=>{A.current?.abort(),Promise.resolve().then(()=>{j.current===t&&k.current?.abort()})};if(p._tag!==`authenticated`||O.current)return n;if(O.current=!0,i.has(`error`))return D({_tag:`failed`}),n;let r=h(g)(i.get(`state`)),a=h(T)(i.get(`code`)),o=e.exchangeAtlassianOAuthGrant;if(m(r)||m(a)||o===void 0)return D({_tag:`failed`}),n;u({},{replace:!0});let s=new AbortController;return k.current=s,D({_tag:`exchanging`}),o(r.success,a.success,s.signal).then(e=>{s.signal.aborted||D({_tag:`selecting`,grant:e,saveFailed:!1})},()=>{s.signal.aborted||D({_tag:`failed`})}),n},[i,p,u,e]);let M=(n,r)=>{if(f!==null&&f.preferredSiteId!==null&&f.preferredSiteId!==r)return;let i=e.completeAtlassianOAuthGrant;if(i===void 0){D({_tag:`failed`});return}let a=new AbortController;A.current?.abort(),A.current=a,D({_tag:`saving`,grant:n,cloudId:r}),i(n.grantId,r,a.signal).then(e=>{a.signal.aborted||(y(d),t(f===null?`/services`:f.recoveryConnectionId===void 0?_(f.providers,e.profileId,f.preferredSiteId):v(f.recoveryConnectionId,e.profileId),{replace:!0}))},()=>{a.signal.aborted||D({_tag:`selecting`,grant:n,saveFailed:!0})})},N=()=>{y(d),t(f===null?`/services`:f.recoveryConnectionId===void 0?_(f.providers,null,f.preferredSiteId):`/services`)};return p._tag===`checking`?(0,w.jsx)(`section`,{className:C.page,children:(0,w.jsx)(a,{description:`Restoring the browser session that started this sign-in.`,title:`Finishing sign-in`})}):p._tag===`authenticated`?E._tag===`failed`?(0,w.jsx)(`section`,{className:C.page,children:(0,w.jsx)(a,{action:(0,w.jsx)(o,{onClick:N,children:`Try again`}),description:`The grant may have expired, been denied, or already been used. No provider token was saved.`,title:`Atlassian sign-in did not finish`})}):E._tag!==`selecting`&&E._tag!==`saving`?(0,w.jsx)(`section`,{className:C.page,children:(0,w.jsx)(a,{description:`Verifying the single-use grant with Atlassian.`,title:`Finishing sign-in`})}):f!==null&&f.preferredSiteId!==null&&!E.grant.sites.some(({cloudId:e})=>e===f.preferredSiteId)?(0,w.jsx)(`section`,{className:C.page,children:(0,w.jsx)(a,{action:(0,w.jsx)(o,{onClick:N,children:`Return to Services`}),description:`Sign in with an Atlassian account that can access the site selected from the account card.`,title:`Selected Atlassian site unavailable`})}):(0,w.jsxs)(`section`,{"aria-labelledby":`atlassian-site-title`,className:C.page,children:[(0,w.jsxs)(`header`,{className:C.heading,children:[(0,w.jsx)(l,{as:`h1`,id:`atlassian-site-title`,variant:`page-title`,children:`Choose your Atlassian site`}),(0,w.jsxs)(l,{tone:`secondary`,variant:`body-large`,children:[`Signed in as `,E.grant.accountName,E.grant.accountEmail===null?``:` · ${E.grant.accountEmail}`,`. Jira and Confluence will share this machine-local profile.`]})]}),(0,w.jsxs)(`div`,{className:C.sites,children:[E._tag===`selecting`&&E.saveFailed?(0,w.jsx)(l,{as:`p`,tone:`secondary`,variant:`body`,children:`The shared profile could not be saved to both tools. Fix the local profile store and retry this site.`}):null,E.grant.sites.map(e=>(0,w.jsxs)(c,{as:`article`,className:C.site,padding:`default`,shape:`grouped`,children:[(0,w.jsxs)(`div`,{className:C.identity,children:[(0,w.jsx)(l,{as:`h2`,variant:`card-title`,children:e.name}),(0,w.jsx)(l,{tone:`secondary`,variant:`body`,children:e.siteUrl})]}),(0,w.jsx)(o,{disabled:E._tag===`saving`||f!==null&&f.preferredSiteId!==null&&f.preferredSiteId!==e.cloudId,loading:E._tag===`saving`&&E.cloudId===e.cloudId,onClick:()=>M(E.grant,e.cloudId),variant:`primary`,children:`Use this site`})]},e.cloudId))]})]}):(0,w.jsx)(`section`,{className:C.page,children:(0,w.jsx)(a,{action:(0,w.jsx)(o,{onClick:N,children:`Return to Services`}),description:`Return to the paired browser session that started this sign-in.`,title:`Paired session required`})})};export{E as AtlassianOAuthCallbackPage};
2
- //# sourceMappingURL=AtlassianOAuthCallbackPage-D1F1xE_2.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{m as n,t as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{a,n as o,r as s,t as c}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{u as l}from"./index-j5ze816l.js";import{v as u}from"./patterns-5N-j-AD2-BwypFm-e.js";import{n as d,r as f}from"./primitives-nKxQGSsE-CJNmac__.js";import{Ai as p,Cn as m,La as h,Li as g,Mi as _,Oi as v,Sn as y,Zr as b,fa as x,ur as S,wa as C,yi as w}from"./agent-api-QVqt4a0O.js";import{i as T,n as E,r as D}from"./presentWorkspaceItems-Bmh4oEbH.js";import{t as O}from"./authorizedShareTransport-DZHgFEkh.js";var k=e(t(),1),A={page:`_page_m9pfd_1`,hero:`_hero_m9pfd_2`,item:`_item_m9pfd_3`,facts:`_facts_m9pfd_4`,itemHeader:`_itemHeader_m9pfd_24`},j=i(),M=3e4,N=e=>t=>h(t,`_tag`)&&t._tag===e,P=N(`NotFoundApiError`),F=N(`UnauthorizedApiError`),I=({transport:e=O}={})=>{let t=n(),i=l(),h=S(y)(t.shareId),N=S(m)(t.workspaceId),I=C(h)?h.value:null,L=C(N)?N.value:null,R=i.state._tag===`authenticated`||i.state._tag===`storage-unavailable`?i.state.session:null,z=R!==null&&R.workspaceId===L?R:null,[B,V]=(0,k.useState)(0),[H,U]=(0,k.useState)({_tag:`idle`});if((0,k.useEffect)(()=>{if(I===null||L===null||z===null){U({_tag:`idle`});return}let t=new AbortController;return U({_tag:`loading`}),p(w(function*(){for(;!t.signal.aborted;){let n=yield*g({try:()=>e.resolve(L,I,t.signal),catch:e=>e}).pipe(v);if(t.signal.aborted)return;if(n._tag===`Failure`){F(n.failure)&&i.invalidateSession(z.sessionId),U(P(n.failure)?{_tag:`not-found`}:{_tag:`failed`});return}U({_tag:`ready`,resolution:n.success}),yield*_(x(M))}}),{signal:t.signal}).catch(()=>{t.signal.aborted||U({_tag:`failed`})}),()=>t.abort()},[i,B,z,I,e,L]),I===null||L===null)return(0,j.jsx)(o,{action:(0,j.jsx)(r,{to:`/`,children:`Return to Control Center`}),description:`This authorized link is malformed. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(i.state._tag===`checking`||H._tag===`loading`)return(0,j.jsxs)(`section`,{"aria-label":`Loading authorized share`,className:A.page,children:[(0,j.jsx)(a,{height:`8rem`,variant:`block`}),(0,j.jsx)(a,{height:`18rem`,variant:`block`})]});if(R===null)return(0,j.jsx)(o,{action:(0,j.jsx)(r,{to:`/pair`,children:`Pair this browser`}),description:`This link grants no bearer access. Pair as the selected person, then reopen it.`,title:`Authentication required`,tone:`caution`});if(R.workspaceId!==L)return(0,j.jsx)(o,{description:`This link is scoped to another workspace. No item was substituted.`,title:`Share unavailable`,tone:`caution`});if(H._tag===`not-found`)return(0,j.jsx)(o,{description:`The link may target another person, be expired or revoked, or point to a deleted item.`,title:`Share unavailable`,tone:`caution`});if(H._tag===`failed`||H._tag===`idle`)return(0,j.jsx)(o,{action:(0,j.jsx)(c,{onClick:()=>V(e=>e+1),children:`Try again`}),description:`Control Center could not resolve this authorized link.`,title:`Share unavailable`,tone:`caution`});let W=H.resolution.item.projection,G=D(W.details),K=T(W.entityType,G);return(0,j.jsxs)(`article`,{className:A.page,children:[(0,j.jsxs)(`header`,{className:A.hero,children:[(0,j.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:`Authorized item`}),(0,j.jsx)(f,{as:`h1`,variant:`verdict`,children:`Exact scope. Nothing adjacent.`}),(0,j.jsx)(f,{tone:`secondary`,variant:`body-large`,children:`This view contains only the granted current item projection. Releases, relationships, and evidence remain private.`})]}),(0,j.jsxs)(d,{as:`section`,className:A.item,padding:`spacious`,tone:`secondary`,children:[(0,j.jsxs)(`div`,{className:A.itemHeader,children:[(0,j.jsx)(u,{service:E(W.entityType),size:`compact`}),(0,j.jsx)(s,{label:G,size:`compact`,tone:K.tone})]}),(0,j.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:W.displayKey}),(0,j.jsx)(f,{as:`h2`,variant:`section-title`,children:W.title}),(0,j.jsxs)(`dl`,{className:A.facts,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Type`}),(0,j.jsx)(`dd`,{children:W.entityType})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Observed`}),(0,j.jsx)(`dd`,{children:b(H.resolution.item.recordedAt)})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Expires`}),(0,j.jsx)(`dd`,{children:b(H.resolution.share.expiresAt)})]})]})]})]})};export{I as AuthorizedSharePage};
2
- //# sourceMappingURL=AuthorizedSharePage-DCQUFY2I.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AuthorizedSharePage-DCQUFY2I.js","names":[],"sources":["../../../src/client/items/AuthorizedSharePage.module.css","../../../src/client/items/AuthorizedSharePage.tsx"],"sourcesContent":[".page,\n.hero,\n.item,\n.facts {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n max-inline-size: 58rem;\n margin-inline: auto;\n}\n\n.hero,\n.item {\n gap: var(--rly-space-12);\n}\n\n.hero > *,\n.item > * {\n margin: 0;\n}\n\n.itemHeader {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.facts {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--rly-space-12);\n margin-block: var(--rly-space-8);\n}\n\n.facts div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.facts dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.item a {\n justify-self: start;\n min-block-size: 3rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.item a:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 40rem) {\n .facts {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Duration from \"effect/Duration\"\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useEffect, useState } from \"react\"\nimport { Link, useParams } from \"react-router\"\n\nimport type { AuthorizedShareResolution } from \"../../api/shares.js\"\nimport { ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { browserAuthorizedShareTransport, type AuthorizedShareTransport } from \"./authorizedShareTransport.js\"\nimport { serviceFor, statusFor, statusPresentation } from \"./presentWorkspaceItems.js\"\nimport styles from \"./AuthorizedSharePage.module.css\"\n\ntype AuthorizedSharePageState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"not-found\" }\n | { readonly _tag: \"ready\"; readonly resolution: AuthorizedShareResolution }\n\nconst SHARE_REVALIDATION_MILLISECONDS = 30_000\n\nconst isTaggedFailure =\n (tag: string) =>\n (failure: unknown): boolean =>\n Predicate.hasProperty(failure, \"_tag\") && failure._tag === tag\n\nconst isNotFound = isTaggedFailure(\"NotFoundApiError\")\nconst isUnauthorized = isTaggedFailure(\"UnauthorizedApiError\")\n\nexport interface AuthorizedSharePageProps {\n readonly transport?: AuthorizedShareTransport\n}\n\n/** Direct-load authenticated page for one exact shared normalized item. */\nexport const AuthorizedSharePage = ({\n transport = browserAuthorizedShareTransport\n}: AuthorizedSharePageProps = {}): ReactElement => {\n const params = useParams()\n const browserSession = useBrowserSession()\n const decodedShareId = Schema.decodeUnknownOption(ShareId)(params.shareId)\n const decodedWorkspaceId = Schema.decodeUnknownOption(WorkspaceId)(params.workspaceId)\n const shareId = Option.isSome(decodedShareId) ? decodedShareId.value : null\n const workspaceId = Option.isSome(decodedWorkspaceId) ? decodedWorkspaceId.value : null\n const authenticatedSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const session =\n authenticatedSession !== null && authenticatedSession.workspaceId === workspaceId ? authenticatedSession : null\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<AuthorizedSharePageState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (shareId === null || workspaceId === null || session === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n setState({ _tag: \"loading\" })\n const program = Effect.gen(function* () {\n while (!request.signal.aborted) {\n const result = yield* Effect.tryPromise({\n try: () => transport.resolve(workspaceId, shareId, request.signal),\n catch: (cause) => cause\n }).pipe(Effect.result)\n if (request.signal.aborted) return\n if (result._tag === \"Failure\") {\n if (isUnauthorized(result.failure)) browserSession.invalidateSession(session.sessionId)\n setState(isNotFound(result.failure) ? { _tag: \"not-found\" } : { _tag: \"failed\" })\n return\n }\n setState({ _tag: \"ready\", resolution: result.success })\n yield* Effect.sleep(Duration.millis(SHARE_REVALIDATION_MILLISECONDS))\n }\n })\n Effect.runPromise(program, { signal: request.signal }).catch(() => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n })\n return () => request.abort()\n }, [browserSession, requestRevision, session, shareId, transport, workspaceId])\n\n if (shareId === null || workspaceId === null) {\n return (\n <StatePanel\n action={<Link to=\"/\">Return to Control Center</Link>}\n description=\"This authorized link is malformed. No item was substituted.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (browserSession.state._tag === \"checking\" || state._tag === \"loading\") {\n return (\n <section aria-label=\"Loading authorized share\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"18rem\" variant=\"block\" />\n </section>\n )\n }\n\n if (authenticatedSession === null) {\n return (\n <StatePanel\n action={<Link to=\"/pair\">Pair this browser</Link>}\n description=\"This link grants no bearer access. Pair as the selected person, then reopen it.\"\n title=\"Authentication required\"\n tone=\"caution\"\n />\n )\n }\n\n if (authenticatedSession.workspaceId !== workspaceId) {\n return (\n <StatePanel\n description=\"This link is scoped to another workspace. No item was substituted.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (state._tag === \"not-found\") {\n return (\n <StatePanel\n description=\"The link may target another person, be expired or revoked, or point to a deleted item.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n if (state._tag === \"failed\" || state._tag === \"idle\") {\n return (\n <StatePanel\n action={<Button onClick={() => setRequestRevision((revision) => revision + 1)}>Try again</Button>}\n description=\"Control Center could not resolve this authorized link.\"\n title=\"Share unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const projection = state.resolution.item.projection\n const status = statusFor(projection.details)\n const presentation = statusPresentation(projection.entityType, status)\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Authorized item\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Exact scope. Nothing adjacent.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n This view contains only the granted current item projection. Releases, relationships, and evidence remain\n private.\n </Text>\n </header>\n <Surface as=\"section\" className={styles.item} padding=\"spacious\" tone=\"secondary\">\n <div className={styles.itemHeader}>\n <ServiceMark service={serviceFor(projection.entityType)} size=\"compact\" />\n <StateLabel label={status} size=\"compact\" tone={presentation.tone} />\n </div>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n {projection.displayKey}\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {projection.title}\n </Text>\n <dl className={styles.facts}>\n <div>\n <dt>Type</dt>\n <dd>{projection.entityType}</dd>\n </div>\n <div>\n <dt>Observed</dt>\n <dd>{DateTime.formatIso(state.resolution.item.recordedAt)}</dd>\n </div>\n <div>\n <dt>Expires</dt>\n <dd>{DateTime.formatIso(state.resolution.share.expiresAt)}</dd>\n </div>\n </dl>\n </Surface>\n </article>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{Fi as e,Fn as t,Li as n,Ni as r,Pn as i,Si as a,fi as o,ha as s,li as c,ma as l,na as u,pi as d,yi as f}from"./agent-api-QVqt4a0O.js";var p=`~effect/platform/Crypto`,m=s(`effect/Crypto`),h=t=>{let n=t.randomBytes,i=e=>a(g(`randomBytes`,e),n),o=()=>{let e=n(7);return((e[0]&31)*2**48+e[1]*2**40+e[2]*2**32+e[3]*2**24+e[4]*2**16+e[5]*2**8+e[6])/2**53},s=()=>Math.floor(o()*(2**53-1- -(2**53-1)+1))+-(2**53-1);return m.of({[p]:p,randomBytes:i,nextDoubleUnsafe:o,nextIntUnsafe:s,digest:t.digest,random:e(()=>o()),randomBoolean:e(()=>o()>.5),randomInt:e(()=>s()),randomBetween:(t,n)=>e(()=>o()*(n-t)+t),randomIntBetween(t,n,r){let i=r?.halfOpen===!0?0:1;return e(()=>{let e=Math.ceil(t),r=Math.floor(n);return Math.floor(o()*(r-e+i))+e})},randomShuffle:t=>e(()=>{let e=Array.from(t);for(let t=e.length-1;t>=1;--t){let n=Math.min(t,Math.floor(o()*(t+1))),r=e[t];e[t]=e[n],e[n]=r}return e}),randomUUIDv4:e(()=>y(n(16))),randomUUIDv7:c(e=>r(x(e.currentTimeMillisUnsafe(),n(16))))})},g=(e,t)=>Number.isSafeInteger(t)&&t>=0?r(t):d(i({module:`Crypto`,method:e,description:`size must be a non-negative safe integer`})),_=e=>e.toString(16).padStart(2,`0`),v=e=>[e.subarray(0,4),e.subarray(4,6),e.subarray(6,8),e.subarray(8,10),e.subarray(10,16)].map(e=>Array.from(e,_).join(``)).join(`-`),y=e=>(e[6]=e[6]&15|64,e[8]=e[8]&63|128,v(e)),b=2**48-1,x=(e,t)=>{let n=Math.min(Math.max(0,Math.trunc(e)),b);return t[0]=Math.floor(n/2**40),t[1]=Math.floor(n/2**32)&255,t[2]=Math.floor(n/2**24)&255,t[3]=Math.floor(n/2**16)&255,t[4]=Math.floor(n/2**8)&255,t[5]=n&255,t[6]=t[6]&15|112,t[8]=t[8]&63|128,v(t)},S=l(`@effect/platform-browser/Crypto/WebCrypto`,{defaultValue:()=>globalThis.crypto}),C=u(m,f(function*(){let e=yield*S;return e?h({randomBytes:t=>{let n=new Uint8Array(t);return e.getRandomValues(n),n},digest:(r,i)=>typeof e.subtle.digest==`function`?a(n({try:()=>e.subtle.digest(r,new Uint8Array(i)),catch:e=>t({module:`Crypto`,method:`digest`,_tag:`Unknown`,description:`Could not compute digest`,cause:e})}),e=>new Uint8Array(e)):d(t({module:`Crypto`,method:`digest`,_tag:`Unknown`,description:`crypto.subtle.digest is not available`}))}):yield*o(Error(`Web Crypto API is not available`))}));export{m as n,C as t};
2
- //# sourceMappingURL=BrowserCrypto-DVWR7DFd.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{u as n}from"./index-j5ze816l.js";import{Ai as r,Di as i,La as a,yi as o}from"./agent-api-QVqt4a0O.js";import{a as s,t as c}from"./client-D27unen8.js";var l=e(t(),1),u=o(function*(){return yield*(yield*c()).session.current()}).pipe(i(s)),d=e=>!a(e,`_tag`)||typeof e._tag!=`string`?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},f=()=>{let{beginHydration:e,completeHydration:t}=n();return(0,l.useEffect)(()=>{let n=e(),i=!0;return r(u).then(e=>{i&&t(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{i&&t(n,d(e))}),()=>{i=!1}},[e,t]),null};export{f as BrowserSessionHydrator};
2
- //# sourceMappingURL=BrowserSessionHydrator-DE46feEX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserSessionHydrator-DE46feEX.js","names":[],"sources":["../../../src/client/BrowserSessionHydrator.tsx"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { type ReactElement, useEffect } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { useBrowserSession, type BrowserSessionState } from \"./BrowserSession.js\"\n\nconst loadBrowserSession = Effect.gen(function* () {\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.current()\n}).pipe(Effect.provide(FetchHttpClient.layer))\n\nconst failedSessionState = (\n failure: unknown\n): Exclude<BrowserSessionState, { readonly _tag: \"authenticated\" | \"checking\" }> => {\n if (!Predicate.hasProperty(failure, \"_tag\") || typeof failure._tag !== \"string\") {\n return { _tag: \"unavailable\" }\n }\n if (failure._tag === \"UnauthorizedApiError\") return { _tag: \"anonymous\" }\n if (failure._tag === \"ForbiddenApiError\") return { _tag: \"blocked\" }\n return { _tag: \"unavailable\" }\n}\n\n/** Recover this tab's mutation proof once, regardless of its initial route. */\nexport const BrowserSessionHydrator = (): ReactElement | null => {\n const { beginHydration, completeHydration } = useBrowserSession()\n\n useEffect(() => {\n const attempt = beginHydration()\n let isCurrent = true\n Effect.runPromise(loadBrowserSession).then(\n (result) => {\n if (!isCurrent) return\n completeHydration(attempt, {\n _tag: \"authenticated\",\n csrfToken: result.csrfToken,\n session: result.session\n })\n },\n (failure: unknown) => {\n if (isCurrent) completeHydration(attempt, failedSessionState(failure))\n }\n )\n return () => {\n isCurrent = false\n }\n }, [beginHydration, completeHydration])\n\n return null\n}\n"],"mappings":"kQAQM,EAAqB,EAAW,WAAa,CAEjD,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,QAAQ,QAAQ,CACvC,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAEvC,EACJ,GAEI,CAAC,EAAsB,EAAS,MAAM,GAAK,OAAO,EAAQ,MAAS,SAC9D,CAAE,KAAM,aAAc,EAE3B,EAAQ,OAAS,uBAA+B,CAAE,KAAM,WAAY,EACpE,EAAQ,OAAS,oBAA4B,CAAE,KAAM,SAAU,EAC5D,CAAE,KAAM,aAAc,EAIlB,MAAoD,CAC/D,GAAM,CAAE,iBAAgB,qBAAsB,EAAkB,EAuBhE,OArBA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAU,EAAe,EAC3B,EAAY,GAchB,OAbA,EAAkB,CAAkB,CAAC,CAAC,KACnC,GAAW,CACL,GACL,EAAkB,EAAS,CACzB,KAAM,gBACN,UAAW,EAAO,UAClB,QAAS,EAAO,OAClB,CAAC,CACH,EACC,GAAqB,CAChB,GAAW,EAAkB,EAAS,EAAmB,CAAO,CAAC,CACvE,CACF,MACa,CACX,EAAY,EACd,CACF,EAAG,CAAC,EAAgB,CAAiB,CAAC,EAE/B,IACT"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{f as n,t as r,u as i}from"./lib-BzlsKFNV.js";import{t as a}from"./jsx-runtime-By8HlURe.js";import{r as o,s}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{r as c,s as l}from"./releasePaths-XoI2BHX3.js";import{l as u,s as d,u as f}from"./index-j5ze816l.js";import{v as p}from"./patterns-5N-j-AD2-BwypFm-e.js";import{Ai as m,Di as h,yi as g,za as _}from"./agent-api-QVqt4a0O.js";import{a as v,t as y}from"./client-D27unen8.js";import{i as b,o as x}from"./releaseRoutes-BCuIdZyA.js";import{a as S,i as C,t as w}from"./workspaceScrollCapture-CJ4QUptr.js";import{n as T,t as E}from"./useWorkspaceItems-Cd3MPke2.js";import{t as D}from"./presentPortfolio-D3ZIcnqt.js";var O=e(t(),1),k=e=>{let t=new URLSearchParams,n=e.trim();return n.length>0&&t.set(`q`,n),t},A=(e,t)=>{let n=k(t),r=n.size===0?``:`?${n.toString()}`;return`${l(e)}${r}#results`},j=_(`UnauthorizedApiError`),M={load:e=>m(g(function*(){return yield*(yield*y()).portfolio.snapshot()}).pipe(h(v)),{signal:e})},N=e=>D(e).releases.map(t=>({codename:t.relay.codename,href:c(e.workspaceId,t.id),id:t.id,serviceName:t.serviceName,status:t.lifecycleLabel,tone:t.lifecycleTone,version:t.version})),P=(e,t,n=M)=>{let[r,i]=(0,O.useState)(0),[a,o]=(0,O.useState)({_tag:`idle`});(0,O.useEffect)(()=>{if(e===null){o({_tag:`idle`});return}let r=new AbortController;return o({_tag:`loading`,sessionKey:e}),n.load(r.signal).then(t=>{r.signal.aborted||o({_tag:`ready`,releases:N(t),sessionKey:e,workspaceId:t.workspaceId})},n=>{r.signal.aborted||(j(n)&&t(e),o({_tag:`failed`,sessionKey:e}))}),()=>r.abort()},[t,r,e,n]);let s=e===null?{_tag:`idle`}:a._tag===`idle`||a.sessionKey!==e?{_tag:`loading`,sessionKey:e}:a;return{retry:(0,O.useCallback)(()=>i(e=>e+1),[]),state:s}},F={trigger:`_trigger_dhy9p_1`,pairTrigger:`_pairTrigger_dhy9p_2`,dialog:`_dialog_dhy9p_13`,searchField:`_searchField_dhy9p_17`,results:`_results_dhy9p_43`,result:`_result_dhy9p_43`,resultCopy:`_resultCopy_dhy9p_69`,releaseMark:`_releaseMark_dhy9p_75`,resultKey:`_resultKey_dhy9p_96`,message:`_message_dhy9p_102`,loading:`_loading_dhy9p_103`,footer:`_footer_dhy9p_120`,visuallyHidden:`_visuallyHidden_dhy9p_149`},I=a(),L=2,R=6,z=new Set,B=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),V=e=>e===null?!1:`isContentEditable`in e&&e.isContentEditable===!0?!0:!(`nodeName`in e)||typeof e.nodeName!=`string`?!1:e.nodeName===`INPUT`||e.nodeName===`SELECT`||e.nodeName===`TEXTAREA`,H=(e,t)=>{let n=t.map(e=>e.toLocaleLowerCase(`en-US`));return n.some(t=>t===e)?0:n.some(t=>t.startsWith(e))?1:n.some(t=>t.includes(e))?2:3},U=(e,t,n)=>{let r=n.trim().toLocaleLowerCase(`en-US`);if(r.length===0)return[];let i=e.flatMap(e=>{let t=H(r,[e.codename,e.version,e.serviceName,e.status]);return t===3?[]:[{_tag:`release`,rank:t,release:e}]}),a=t.flatMap(e=>{let t=H(r,[e.key,e.title,e.status]);return t===3?[]:[{_tag:`item`,item:e,rank:t}]});return[...i,...a].sort((e,t)=>{if(e.rank!==t.rank)return e.rank-t.rank;if(e._tag!==t._tag)return e._tag===`release`?-1:1;let n=e._tag===`release`?e.release.codename:e.item.key,r=t._tag===`release`?t.release.codename:t.item.key;return n.localeCompare(r)}).slice(0,R)},W=({releaseTransport:e=M,sessionKey:t,transport:a=E,workspaceId:c})=>{let l=f(),u=i(),m=n(),h=(0,O.useRef)(null),[g,_]=(0,O.useState)(!1),[v,y]=(0,O.useState)(``),[D,k]=(0,O.useState)(0),j=v.trim(),N=(0,O.useDeferredValue)(j),R=N.length>=L,H=P(g?t:null,l.invalidateSession,e),W=H.state,G=(0,O.useMemo)(()=>W._tag===`ready`&&W.workspaceId===c?new Set(W.releases.map(({id:e})=>e)):z,[W,c]),K=W._tag===`ready`&&W.workspaceId===c,q=T(c,G,(0,O.useMemo)(()=>({owner:`all`,query:R?N:``,service:`all`,status:`all`,type:`all`}),[N,R]),W._tag===`ready`?W.releases.map(({id:e})=>e).join(`:`):`command-search`,g&&R&&K?t:null,l.invalidateSession,a),J=q.state._tag===`ready`&&!q.state.refreshing,Y=K&&J?U(W.releases,q.state.items,N):[],X=Y.length>0,Z=e=>{_(e),e||(y(``),k(0))};(0,O.useEffect)(()=>{let e=e=>{e.defaultPrevented||V(e.target)||e.key.toLocaleLowerCase(`en-US`)!==`k`||!e.metaKey&&!e.ctrlKey||(e.preventDefault(),_(!0))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[]),(0,O.useEffect)(()=>k(0),[N]);let Q=e=>{if(Z(!1),e._tag===`release`){m(e.release.href,{state:b(c,e.release.id,x(u))});return}let t=e.item;w(u,t.href),m(t.href,{state:S(u.state,c,t.entityId,C(u))})};return(0,I.jsxs)(s.Root,{onOpenChange:Z,open:g,children:[(0,I.jsx)(s.Trigger,{className:F.trigger,size:`compact`,variant:`quiet`,children:`Search ⌘K`}),(0,I.jsxs)(s.Content,{className:F.dialog,description:`Find releases and current work, or continue with Relay.`,initialFocusRef:h,size:`wide`,title:`Go anywhere.`,children:[(0,I.jsxs)(`label`,{className:F.searchField,children:[(0,I.jsx)(`span`,{className:F.visuallyHidden,children:`Search workspace`}),(0,I.jsx)(`input`,{"aria-activedescendant":X?`command-search-option-${D}`:void 0,"aria-autocomplete":`list`,"aria-busy":N!==j||W._tag===`loading`||q.state._tag===`loading`,"aria-controls":X?`command-search-results`:void 0,"aria-expanded":X,"aria-label":`Search workspace`,autoComplete:`off`,maxLength:200,onChange:e=>y(e.currentTarget.value),onKeyDown:e=>{if(Y.length!==0){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;k(e=>(e+t+Y.length)%Y.length);return}if(e.key===`Enter`){e.preventDefault();let t=Y[D];t!==void 0&&Q(t)}}},placeholder:`Release, ticket, PR, page, pipeline…`,ref:h,role:`combobox`,type:`search`,value:v})]}),j.length<L?(0,I.jsxs)(`div`,{className:F.message,children:[(0,I.jsx)(`strong`,{children:`Type two characters.`}),(0,I.jsx)(`span`,{children:`Search releases, tickets, pull requests, docs, pipelines, deployments, and time.`})]}):N!==j||W._tag===`idle`||W._tag===`loading`||q.state._tag===`idle`||q.state._tag===`loading`?(0,I.jsx)(`div`,{className:F.loading,children:`Searching the current workspace…`}):!K||q.state._tag===`failed`?(0,I.jsxs)(`div`,{className:F.message,children:[(0,I.jsx)(`strong`,{children:`Search is unavailable.`}),(0,I.jsx)(`span`,{children:`The release and item indexes were not changed.`}),(0,I.jsx)(`button`,{onClick:()=>{H.retry(),q.retry()},type:`button`,children:`Try again`})]}):Y.length===0?(0,I.jsxs)(`div`,{className:F.message,children:[(0,I.jsxs)(`strong`,{children:[`No release or current item matches “`,N,`”.`]}),(0,I.jsx)(`span`,{children:`Try a release name, version, key, title, or current status.`})]}):(0,I.jsx)(`div`,{"aria-label":`Workspace search results`,className:F.results,id:`command-search-results`,role:`listbox`,children:Y.map((e,t)=>{let n=e._tag===`release`,r=n?e.release.id:e.item.entityId;return(0,I.jsxs)(`button`,{"aria-selected":t===D,className:F.result,id:`command-search-option-${t}`,onClick:()=>Q(e),onMouseEnter:()=>k(t),role:`option`,type:`button`,children:[n?(0,I.jsx)(`span`,{className:F.releaseMark,children:`R`}):(0,I.jsx)(p,{service:e.item.service,size:`compact`}),(0,I.jsxs)(`span`,{className:F.resultCopy,children:[(0,I.jsx)(`span`,{className:F.resultKey,children:n?`${e.release.version} · Release`:e.item.key}),(0,I.jsx)(`strong`,{children:n?e.release.codename:e.item.title}),(0,I.jsx)(`span`,{children:n?e.release.serviceName:B(e.item.kind)})]}),(0,I.jsx)(o,{label:n?e.release.status:e.item.status,size:`compact`,tone:n?e.release.tone:e.item.tone})]},r)})}),(0,I.jsxs)(`footer`,{className:F.footer,children:[(0,I.jsx)(r,{onClick:()=>Z(!1),to:A(c,j),children:`Open item results`}),(0,I.jsx)(r,{onClick:()=>Z(!1),to:d(u.pathname,u.search,u.hash),children:`Ask Relay from here`}),(0,I.jsx)(`span`,{children:`↑↓ choose · Enter open · Esc close`})]})]})]})},G=e=>{let t=f(),n=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,i=u(t.state);return n!==null&&n.workspaceId!==e.workspaceId?null:i===null?(0,I.jsx)(r,{className:F.pairTrigger,to:`/pair`,children:`Pair to search`}):(0,I.jsx)(W,{...e,sessionKey:i})};export{G as CommandSearch,U as commandSearchResults};
2
- //# sourceMappingURL=CommandSearch-CP_QCbkm.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,f as r,p as i,t as a,u as o}from"./lib-BzlsKFNV.js";import{t as s}from"./jsx-runtime-By8HlURe.js";import{a as c,n as l,r as u,t as d}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{u as f}from"./index-j5ze816l.js";import{g as p,v as m}from"./patterns-5N-j-AD2-BwypFm-e.js";import{n as h,r as g}from"./primitives-nKxQGSsE-CJNmac__.js";import{Zr as _,hn as v,ur as y,wa as b}from"./agent-api-QVqt4a0O.js";import{i as x,o as S}from"./releaseRoutes-BCuIdZyA.js";import{a as C,i as w,n as T,t as E}from"./workspaceScrollCapture-CJ4QUptr.js";import{a as ee}from"./presentWorkspaceItems-Bmh4oEbH.js";import{n as te,t as ne}from"./useWorkspaceItems-Cd3MPke2.js";import{t as D}from"./authorizedShareTransport-DZHgFEkh.js";import{PortfolioOverviewView as re}from"./PortfolioOverview-D45rk8Hl.js";import{n as ie}from"./ReleaseWorkset-Dtzalmji.js";var O=e(t(),1),k={page:`_page_wg828_1`,hero:`_hero_wg828_2`,filters:`_filters_wg828_3`,items:`_items_wg828_4`,item:`_item_wg828_4`,itemLink:`_itemLink_wg828_6`,meta:`_meta_wg828_7`,selection:`_selection_wg828_8`,membershipChoices:`_membershipChoices_wg828_54`,shareLink:`_shareLink_wg828_55`,resultHeading:`_resultHeading_wg828_60`,selectionHeader:`_selectionHeader_wg828_80`,selectionActions:`_selectionActions_wg828_81`,owners:`_owners_wg828_153`,ownerGroup:`_ownerGroup_wg828_157`,ownerLimit:`_ownerLimit_wg828_163`,shareForm:`_shareForm_wg828_181`,shareResult:`_shareResult_wg828_182`,search:`_search_wg828_242`},A=s(),j=e=>e===`hour`||e===`week`?e:`day`,M=(e,t)=>{let n=new Map;n.set(e,{displayName:`You`,personId:e});for(let e of t)n.set(e.personId,{displayName:e.displayName,personId:e.personId});return[...n.values()]},N=({currentPersonId:e,entityId:t,grantees:n,transport:r=D,workspaceId:i})=>{let o=(0,O.useMemo)(()=>M(e,n),[e,n]),[s,c]=(0,O.useState)(o[0]?.personId??e),[l,f]=(0,O.useState)(`day`),[p,m]=(0,O.useState)({_tag:`idle`}),h=(0,O.useRef)(null),y=(0,O.useRef)(null),b=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>y.current?.abort(),[]),(0,O.useEffect)(()=>{(p._tag===`ready`||p._tag===`revoked`)&&b.current?.focus()},[p._tag]);let x=e=>{e.preventDefault(),y.current?.abort();let n=new AbortController;y.current=n,m({_tag:`creating`});let i=h.current;(i!==null&&i.entityId===t&&i.granteePersonId===s&&i.lifetime===l?Promise.resolve(i):r.prepareCreate({entityId:t,granteePersonId:s,lifetime:l}).then(e=>(h.current=e,e))).then(e=>r.create(e,n.signal)).then(e=>{if(n.signal.aborted)return;let t=h.current;if(t===null||e.shareId!==t.shareId||e.entityId!==t.entityId||e.granteePersonId!==t.granteePersonId){m({_tag:`failed`});return}if(e.revokedAt!==null){m({_tag:`revoked`});return}m({_tag:`ready`,shareId:e.shareId,expiresAt:_(e.expiresAt)})},()=>{n.signal.aborted||m({_tag:`failed`})})},S=(e,t)=>{y.current?.abort();let n=new AbortController;y.current=n,m({_tag:`revoking`,shareId:e,expiresAt:t}),r.revoke(i,e,n.signal).then(()=>{n.signal.aborted||m({_tag:`revoked`})},()=>{n.signal.aborted||m({_tag:`ready`,shareId:e,expiresAt:t})})},C=e=>{h.current=null,c(v.make(e))},w=e=>{h.current=null,f(j(e))},T=()=>{h.current=null,m({_tag:`idle`})};if(p._tag===`ready`||p._tag===`revoking`){let e=`/shares/${i}/${p.shareId}`;return(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:b,role:`status`,tabIndex:-1,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(g,{as:`h3`,variant:`body-large`,children:`Authorized link ready`}),(0,A.jsxs)(g,{tone:`secondary`,children:[`Only the selected person can open this exact item. Expires `,p.expiresAt,`.`]})]}),(0,A.jsx)(a,{to:e,children:e}),(0,A.jsx)(d,{disabled:p._tag===`revoking`,onClick:()=>S(p.shareId,p.expiresAt),children:p._tag===`revoking`?`Revoking…`:`Revoke link`})]})}return p._tag===`revoked`?(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:b,role:`status`,tabIndex:-1,children:[(0,A.jsx)(u,{label:`Revoked`,size:`compact`,tone:`neutral`}),(0,A.jsx)(g,{tone:`secondary`,children:`This link no longer resolves.`}),(0,A.jsx)(d,{onClick:T,children:`Create another`})]}):(0,A.jsxs)(`form`,{className:k.shareForm,onSubmit:x,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(g,{as:`h3`,variant:`body-large`,children:`Share this exact item`}),(0,A.jsx)(g,{tone:`secondary`,children:`Authenticated access only. Related releases and relationships stay private.`})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Person`}),(0,A.jsx)(`select`,{disabled:p._tag===`creating`,onChange:e=>C(e.currentTarget.value),value:s,children:o.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId))})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Expires`}),(0,A.jsxs)(`select`,{disabled:p._tag===`creating`,onChange:e=>w(e.currentTarget.value),value:l,children:[(0,A.jsx)(`option`,{value:`hour`,children:`In 1 hour`}),(0,A.jsx)(`option`,{value:`day`,children:`In 1 day`}),(0,A.jsx)(`option`,{value:`week`,children:`In 7 days`})]})]}),(0,A.jsx)(d,{disabled:p._tag===`creating`,type:`submit`,children:p._tag===`creating`?`Creating…`:`Create authorized link`}),p._tag===`failed`?(0,A.jsx)(g,{role:`alert`,tone:`secondary`,children:`Could not create the link. Check the person and try again.`}):null]})},P=[`issue`,`pull-request`,`page`,`pipeline-execution`,`deployment`,`time-entry`],F=[`jira`,`codecommit`,`confluence`,`codepipeline`,`clockify`],I=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),L=e=>I.format(Date.parse(e)),R=(e,t)=>({hash:e.hash,pathname:e.pathname,search:t.size===0?``:`?${t.toString()}`}),z=(e,t,n)=>{let r=new URLSearchParams(t);return r.set(`object`,n),{hash:`#item-details`,pathname:e,search:`?${r.toString()}`}},B=e=>P.find(t=>t===e)??`all`,V=e=>e===`active`||e===`done`||e===`failed`?e:`all`,H=e=>{let t=y(v)(e);return b(t)?t.value:`all`},ae=e=>({owner:H(e.get(`owner`)),query:e.get(`q`)?.trim()??``,service:F.find(t=>t===e.get(`service`))??`all`,status:V(e.get(`status`)),type:B(e.get(`type`))}),U=(e,t)=>{let n=t.query.toLocaleLowerCase(`en-US`);return e.filter(e=>(n.length===0||`${e.key} ${e.title} ${e.status}`.toLocaleLowerCase(`en-US`).includes(n))&&(t.service===`all`||e.service===t.service)&&(t.owner===`all`||e.owners.some(({id:e})=>e===t.owner))&&(t.status===`all`||e.statusGroup===t.status)&&(t.type===`all`||e.kind===t.type))},W=({item:e})=>{let[t,n]=(0,O.useState)(!1);return e.owners.length===0?(0,A.jsx)(`span`,{children:`Unassigned`}):(0,A.jsxs)(`span`,{className:k.ownerGroup,children:[(0,A.jsx)(p,{"aria-label":`${e.key} collaborators${e.ownersTruncated?`, more collaborators not shown`:``}`,className:k.owners,expanded:t,limit:2,onExpandedChange:n,people:e.owners,size:`compact`}),e.ownersTruncated?(0,A.jsx)(`span`,{className:k.ownerLimit,children:`20+ people · More not shown`}):null]})},G=(e,t)=>t===null?null:e.find(e=>e.entityId===t)??null,K=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),q=e=>e.releaseIds.length===0?`This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.`:e.routableReleaseIds.length===0?`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`:e.releaseIds.length===1?`This object is linked to one release and can be opened in its complete delivery context.`:`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} releases. Choose the exact release context to avoid silently substituting another delivery trace.`,J=({shareTransport:e,transport:t=ne}={})=>{let s=i(),p=f(),_=o(),v=r(),[y]=n(),b=s.controller.state._tag===`ready`?s.controller.state.portfolio:null,D=(0,O.useMemo)(()=>new Map(b?.releases.map(e=>[e.id,e])??[]),[b]),j=(0,O.useMemo)(()=>new Set(b?.releases.map(({id:e})=>e)??[]),[b]),M=s.controller.state._tag===`ready`?s.controller.state.portfolio.generatedAt:`pending`,I=ie(p.state),B=ae(y),V=te(s.workspaceId,j,B,M,I,p.invalidateSession,t),H=e=>{v(R(_,e),{replace:!0})},U=(e,t)=>{let n=new URLSearchParams(y);t.length===0||t===`all`?n.delete(e===`query`?`q`:e):n.set(e===`query`?`q`:e,t),H(n)},J=s.controller.state._tag===`ready`?I===null?{_tag:`session`,reason:p.state._tag===`authenticated`?`checking`:p.state._tag}:null:s.controller.state;if(J?._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(c,{height:`8rem`,variant:`block`}),(0,A.jsx)(c,{height:`20rem`,variant:`block`})]});if(J!==null)return(0,A.jsx)(re,{onPreviewRelease:()=>void 0,onRetry:s.controller.onRetry,state:J});if(V.state._tag===`idle`||V.state._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(c,{height:`8rem`,variant:`block`}),(0,A.jsx)(c,{height:`20rem`,variant:`block`})]});if(V.state._tag===`failed`)return(0,A.jsx)(l,{action:(0,A.jsx)(d,{onClick:V.retry,children:`Try again`}),description:`Control Center could not read the normalized delivery index. Saved source facts remain unchanged.`,title:`Items unavailable`,tone:`caution`});let Y=V.state.items,oe=B.owner===`all`||V.state.ownerOptions.some(({personId:e})=>e===B.owner),se=B.owner===`all`?void 0:V.state.items.flatMap(({owners:e})=>e).find(({id:e})=>e===B.owner),X=y.get(`object`),Z=G(V.state.items,X),Q=p.state._tag===`authenticated`&&p.state.session.permission===`workspace-owner`&&p.state.session.actor._tag===`human`?p.state.session.actor.personId:null,$=()=>{let e=new URLSearchParams(y);e.delete(`object`),v({hash:`#results`,pathname:_.pathname,search:e.size===0?``:`?${e.toString()}`},{replace:!0})};return(0,A.jsxs)(`article`,{className:k.page,children:[(0,A.jsxs)(`header`,{className:k.hero,children:[(0,A.jsx)(g,{as:`p`,tone:`secondary`,variant:`label`,children:`Workspace items`}),(0,A.jsx)(g,{as:`h1`,variant:`verdict`,children:`Find release work.`}),(0,A.jsx)(g,{tone:`secondary`,variant:`body-large`,children:`One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.`})]}),(0,A.jsxs)(`section`,{"aria-label":`Item filters`,className:k.filters,children:[(0,A.jsxs)(`label`,{className:k.search,children:[(0,A.jsx)(`span`,{children:`Search`}),(0,A.jsx)(`input`,{maxLength:200,onChange:e=>U(`query`,e.currentTarget.value),placeholder:`Key, title, or status`,type:`search`,value:B.query})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Service`}),(0,A.jsxs)(`select`,{onChange:e=>U(`service`,e.currentTarget.value),value:B.service,children:[(0,A.jsx)(`option`,{value:`all`,children:`All services`}),F.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Owner`}),(0,A.jsxs)(`select`,{onChange:e=>U(`owner`,e.currentTarget.value),value:B.owner,children:[(0,A.jsx)(`option`,{value:`all`,children:`Anyone`}),B.owner!==`all`&&!oe?(0,A.jsx)(`option`,{value:B.owner,children:se?.name??`Owner …${B.owner.slice(-6)}`}):null,V.state.ownerOptions.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId)),V.state.ownerOptionsTruncated?(0,A.jsx)(`option`,{disabled:!0,children:`More owners not shown`}):null]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Type`}),(0,A.jsxs)(`select`,{onChange:e=>U(`type`,e.currentTarget.value),value:B.type,children:[(0,A.jsx)(`option`,{value:`all`,children:`All types`}),P.map(e=>(0,A.jsx)(`option`,{value:e,children:K(e)},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Status`}),(0,A.jsxs)(`select`,{onChange:e=>U(`status`,e.currentTarget.value),value:B.status,children:[(0,A.jsx)(`option`,{value:`all`,children:`Any status`}),(0,A.jsx)(`option`,{value:`active`,children:`Active`}),(0,A.jsx)(`option`,{value:`done`,children:`Done`}),(0,A.jsx)(`option`,{value:`failed`,children:`Needs attention`})]})]})]}),X===null?null:Z===null?(0,A.jsx)(`div`,{id:`item-details`,children:(0,A.jsx)(l,{action:(0,A.jsx)(d,{onClick:$,children:`Back to items`}),description:`This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.`,title:`Item unavailable`,tone:`caution`})}):(0,A.jsxs)(h,{as:`section`,className:k.selection,id:`item-details`,padding:`spacious`,tone:`secondary`,children:[(0,A.jsxs)(`div`,{className:k.selectionHeader,children:[(0,A.jsx)(m,{service:Z.service,size:`compact`}),(0,A.jsx)(u,{label:Z.status,size:`compact`,tone:Z.tone})]}),(0,A.jsxs)(g,{as:`p`,tone:`secondary`,variant:`label`,children:[Z.key,` · `,K(Z.kind)]}),(0,A.jsx)(g,{as:`h2`,variant:`section-title`,children:Z.title}),(0,A.jsx)(g,{tone:`secondary`,variant:`body-large`,children:q(Z)}),(0,A.jsx)(W,{item:Z}),Q===null?null:(0,A.jsx)(N,{currentPersonId:Q,entityId:Z.entityId,grantees:V.state.ownerOptions,workspaceId:s.workspaceId,...e===void 0?{}:{transport:e}},Z.entityId),(0,A.jsxs)(`div`,{className:k.selectionActions,children:[(0,A.jsx)(`div`,{className:k.membershipChoices,children:Z.routableReleaseIds.map(e=>{let t=D.get(e);return(0,A.jsxs)(a,{state:x(s.workspaceId,e,S(_)),to:ee(s.workspaceId,e,Z.entityId),children:[`Open `,t===void 0?`release ${e.slice(-6)}`:t.relay.codename,t===void 0?null:(0,A.jsx)(`span`,{children:t.version})]},e)})}),(0,A.jsx)(d,{onClick:$,children:`Back to items`})]})]}),(0,A.jsxs)(`div`,{className:k.resultHeading,id:`results`,children:[(0,A.jsxs)(g,{as:`h2`,variant:`section-title`,children:[V.state.matchedCount,` of `,V.state.totalCount,` workspace items`]}),(0,A.jsx)(u,{label:V.state.refreshing?`Updating results`:V.state.truncated?`Bounded workspace result`:`Workspace scope`,size:`compact`,tone:V.state.truncated&&!V.state.refreshing?`caution`:`neutral`})]}),Y.length===0?(0,A.jsx)(l,{action:(0,A.jsx)(d,{onClick:()=>H(new URLSearchParams),children:`Clear filters`}),description:`Try a broader word, owner, service, type, or status. No demo object is substituted.`,title:`No matching items`}):(0,A.jsx)(`div`,{className:k.items,children:Y.map(e=>(0,A.jsxs)(h,{as:`article`,className:k.item,padding:`none`,tone:`secondary`,children:[(0,A.jsx)(m,{service:e.service,size:`compact`}),(0,A.jsxs)(a,{className:k.itemLink,onClick:t=>{T(t,t.currentTarget.target)&&E(_,e.href)},state:C(_.state,s.workspaceId,e.entityId,w(_)),to:e.href,children:[(0,A.jsx)(`span`,{children:e.key}),(0,A.jsx)(`strong`,{children:e.title})]}),(0,A.jsxs)(`div`,{className:k.meta,children:[(0,A.jsx)(u,{label:e.status,size:`compact`,tone:e.tone}),(0,A.jsx)(`span`,{children:K(e.kind)}),(0,A.jsx)(`span`,{children:e.releaseIds.length===0?`Unlinked`:`${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`}`}),(0,A.jsx)(W,{item:e}),(0,A.jsx)(`time`,{dateTime:e.freshness,title:`Synchronized ${e.freshness}`,children:L(e.freshness)})]}),Q===null?null:(0,A.jsx)(a,{className:k.shareLink,to:z(_.pathname,y,e.entityId),children:`Share`})]},e.entityId))})]})};export{J as ItemsPage,U as filterWorkspaceItems,L as formatItemFreshness,R as itemsLocationWithSearch,G as selectWorkspaceItem,z as unlinkedItemLocation,q as workspaceItemMembershipDescription};
2
- //# sourceMappingURL=ItemsPage-BGFUkRL2.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{o as n,s as r,t as i,u as a}from"./lib-BzlsKFNV.js";import{t as o}from"./jsx-runtime-By8HlURe.js";import{a as s,n as c,r as l,t as u}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{i as ee}from"./releasePaths-XoI2BHX3.js";import{u as d}from"./index-j5ze816l.js";import{n as te,s as ne,v as re}from"./patterns-5N-j-AD2-BwypFm-e.js";import{r as f}from"./primitives-nKxQGSsE-CJNmac__.js";import{$i as p,An as m,Di as h,Fi as g,Hi as _,Ii as ie,Ki as v,La as ae,Mi as oe,Ni as se,Oi as y,Pi as ce,Si as b,Ti as x,Ui as le,ai as S,ca as ue,gi as C,hi as w,ji as de,ma as fe,pi as T,ra as pe,si as me,ua as he,yi as E}from"./agent-api-QVqt4a0O.js";import{a as D,t as O}from"./client-D27unen8.js";import{c as k}from"./releaseRoutes-BCuIdZyA.js";import{t as A}from"./pages.module-CpW6k_pw.js";import{d as j,u as M}from"./serviceOnboarding-Jg_0yNjf.js";import{t as N}from"./presentPortfolio-D3ZIcnqt.js";import{t as P}from"./useWorkspaceDefaultLanding-CzlDdEF-.js";var F=e(t(),1),I=o(),L=fe(`effect/Random`,{defaultValue:()=>({nextIntUnsafe(){return Math.floor(Math.random()*(2**53-1- -(2**53-1)+1))+-(2**53-1)},nextDoubleUnsafe(){return Math.random()}})}),R=(e=>le(t=>se(e(t.getRef(L)))))(e=>e.nextDoubleUnsafe()),ge=e=>e===`workspace-owner`?`Owner browser paired`:`Browser paired`,_e=({anonymousAction:e=`link`}={})=>{let{state:t}=d(),n=(0,F.useRef)(null);return(0,F.useEffect)(()=>{t._tag===`storage-unavailable`&&n.current?.focus()},[t._tag]),t._tag===`anonymous`?e===`status`?(0,I.jsx)(f,{className:A.sessionStatus,tone:`secondary`,variant:`label`,children:`Browser not paired`}):(0,I.jsx)(i,{className:A.linkButton,to:`/pair`,children:`Pair this browser`}):t._tag===`authenticated`?(0,I.jsxs)(f,{className:A.sessionBadge,variant:`label`,children:[(0,I.jsx)(`span`,{"aria-hidden":`true`,children:`✓`}),` `,ge(t.session.permission)]}):t._tag===`storage-unavailable`?(0,I.jsx)(f,{"aria-atomic":`true`,as:`span`,className:A.sessionStatus,ref:n,role:`alert`,tabIndex:-1,tone:`secondary`,variant:`label`,children:t.session===null?`Session storage is unavailable. Check storage permissions or space, then reload.`:`Browser paired, but session storage is unavailable. Check storage permissions or space, then reload.`}):(0,I.jsx)(f,{className:A.sessionStatus,tone:`secondary`,variant:`label`,children:t._tag===`checking`?`Checking this browser…`:t._tag===`blocked`?`Session access blocked on this connection`:`Server unavailable`})},z={all:`All`,attention:`Need attention`,deploying:`Deploying`,shipped:`Shipped`},ve=[`all`,`attention`,`deploying`,`shipped`],ye=e=>{let t=new URLSearchParams(e).get(`status`);return t===`attention`||t===`deploying`||t===`shipped`?t:`all`},B=(e,t)=>{let n=new URLSearchParams(e);t===`all`?n.delete(`status`):n.set(`status`,t);let r=n.toString();return r.length===0?``:`?${r}`},be=(e,t)=>{switch(t){case`all`:return!0;case`attention`:return e.readinessVerdict===`blocked`||e.readinessVerdict===`held`||e.readinessVerdict===`unknown`;case`deploying`:return e.readinessVerdict===`deploying`||e.readinessVerdict===`building`;case`shipped`:return e.readinessVerdict===`shipped`}},V=(e,t)=>e.filter(e=>be(e,t)),xe=e=>ve.map(t=>({count:V(e,t).length,id:t,label:z[t]})),Se=e=>z[e],H=(e,t)=>e===null||t>e?t:e,Ce=(e,t)=>{switch(t._tag){case`clear`:return{_tag:`idle`};case`begin`:return{_tag:`loading`,sessionKey:t.sessionKey};case`failed`:return{_tag:`failed`,sessionKey:t.sessionKey,failure:t.failure};case`initial-snapshot`:return{_tag:`loaded`,awaitingResetSnapshot:!1,connection:{_tag:`connecting`},isSnapshotStale:!1,minimumRefreshCursor:null,sessionKey:t.sessionKey,snapshot:t.snapshot};case`caught-up`:return e._tag!==`loaded`||e.awaitingResetSnapshot||e.minimumRefreshCursor!==null&&e.minimumRefreshCursor>e.snapshot.eventCursor?e:{...e,awaitingResetSnapshot:!1,connection:{_tag:`connected`},isSnapshotStale:!1,minimumRefreshCursor:null};case`stream-snapshot`:return e._tag!==`loaded`||e.minimumRefreshCursor!==null&&t.snapshot.eventCursor<e.minimumRefreshCursor||!e.awaitingResetSnapshot&&t.snapshot.eventCursor<e.snapshot.eventCursor?e:{...e,awaitingResetSnapshot:!1,connection:{_tag:`connected`},isSnapshotStale:!1,minimumRefreshCursor:null,snapshot:t.snapshot};case`invalidated`:return e._tag!==`loaded`||e.awaitingResetSnapshot||t.eventCursor<=e.snapshot.eventCursor?e:{...e,isSnapshotStale:!0,minimumRefreshCursor:H(e.minimumRefreshCursor,t.eventCursor)};case`reset-required`:return e._tag===`loaded`?{...e,awaitingResetSnapshot:!0,isSnapshotStale:!0,minimumRefreshCursor:H(e.minimumRefreshCursor,t.headCursor)}:e;case`reconnecting`:return e._tag===`loaded`?{...e,connection:{_tag:`reconnecting`,attempt:t.attempt},isSnapshotStale:!0}:e;case`offline`:return e._tag===`loaded`?{...e,connection:{_tag:`offline`},isSnapshotStale:!0}:e}},U=e=>e._tag===`loaded`?e.snapshot.eventCursor:null,we=3e4,Te=500,Ee=16,W=class extends v(`PortfolioStreamProtocolError`){},De=class extends v(`PortfolioStreamClosedError`){},G=e=>!ae(e,`_tag`)||typeof e._tag!=`string`?`unavailable`:e._tag===`UnauthorizedApiError`?`session-expired`:e._tag===`ForbiddenApiError`?`blocked`:`unavailable`,Oe=(e,t)=>{let n=Math.min(Math.max(e-1,0),Ee),r=Math.min(we,Te*2**n)/2;return Math.max(1,Math.floor(r+r*Math.min(Math.max(t,0),1)))},ke=e=>R.pipe(b(t=>Oe(e,t)),w(oe)),Ae=e=>{if(e.prunedThroughCursor>e.headCursor)return!1;switch(e.reason){case`retention`:return e.requestedCursor<e.prunedThroughCursor;case`cursor-ahead`:return e.requestedCursor>e.headCursor;case`gap`:return e.prunedThroughCursor<=e.requestedCursor&&e.requestedCursor<e.headCursor;case`replay-budget`:return e.requestedCursor<=e.headCursor}},je={isOnline:g(()=>navigator.onLine),waitUntilOnline:ce(()=>navigator.onLine?_:me(e=>{let t=()=>e(_);return window.addEventListener(`online`,t,{once:!0}),g(()=>window.removeEventListener(`online`,t))}))},Me=E(function*(){let e=yield*O();return{loadSnapshot:e.portfolio.snapshot(),openStream:t=>e.liveEvents.stream({headers:{"last-event-id":t},query:{after:t}})}}),K=({failure:e,onSessionExpired:t,sessionKey:n})=>{let r=G(e);return r===`session-expired`&&t(n),{_tag:`failed`,sessionKey:n,failure:r}},Ne=C(`PortfolioLiveController.run`)(function*({connectivity:e,onSessionExpired:t,onState:n,sessionKey:r,transport:i}){let a={_tag:`loading`,sessionKey:r},o=e=>g(()=>{a=Ce(a,e),n(a)}),s=yield*y(i.loadSnapshot);if(ue(s))return yield*o({_tag:`failed`,failure:K({failure:s.failure,onSessionExpired:t,sessionKey:r}).failure,sessionKey:r}),yield*x;yield*o({_tag:`initial-snapshot`,sessionKey:r,snapshot:s.success});let c=C(`PortfolioLiveController.refreshSnapshot`)(function*(e){let t=yield*i.loadSnapshot;if(t.eventCursor<e)return yield*T(new W);yield*o({_tag:`stream-snapshot`,snapshot:t})}),l=C(`PortfolioLiveController.consumeStream`)(function*(e,t,n){let r=!1,i=a._tag===`loaded`&&a.awaitingResetSnapshot?a.minimumRefreshCursor:null,s=t,l=e=>{e>s&&(s=e)},u=e=>{switch(e.event){case`portfolio.snapshot`:{if(e.id!==e.data.eventCursor)return T(new W);let t=U(a);return t===null||i!==null&&e.id<i?T(new W):(i===null?l(e.id):s=e.id,i===null&&e.id<t?_:(i=null,o({_tag:`stream-snapshot`,snapshot:e.data})))}case`portfolio.invalidated`:{if(i!==null||e.id!==e.data.eventCursor)return T(new W);l(e.id);let t=U(a);return t===null||e.id<=t?_:o({_tag:`invalidated`,eventCursor:e.id}).pipe(S(c(e.id)))}case`stream.reset-required`:return e.data.requestedCursor!==s||!Ae(e.data)?T(new W):(i=i===null||e.data.headCursor>i?e.data.headCursor:i,o({_tag:`reset-required`,headCursor:i}));case`stream.heartbeat`:if(i!==null)return T(new W);{let t=U(a);return t===null?T(new W):(l(e.data.eventCursor),e.data.eventCursor<=t?o({_tag:`caught-up`}):o({_tag:`invalidated`,eventCursor:e.data.eventCursor}).pipe(S(c(e.data.eventCursor))))}}};return yield*m(e,e=>u(e).pipe(ie(()=>r?_:(r=!0,n)))),yield*T(new De)});return yield*C(`PortfolioLiveController.reconnect`)(function*(){let n=0;for(;;){(yield*e.isOnline)?n>0&&(yield*o({_tag:`reconnecting`,attempt:n}),yield*ke(n)):(yield*o({_tag:`offline`}),yield*e.waitUntilOnline);let s=U(a);if(s===null)return yield*x;let c=yield*y(E(function*(){let e=yield*i.openStream(s);return yield*l(e,s,g(()=>{n=0}))}));if(he(c))return yield*x;let u=G(c.failure);if(u===`session-expired`||u===`blocked`){let e=K({failure:c.failure,onSessionExpired:t,sessionKey:r});return yield*o({_tag:`failed`,failure:e.failure,sessionKey:r}),yield*x}n+=1}})()}),Pe=e=>Ne(e),Fe=(e,t,n)=>{let[r,i]=(0,F.useState)(0),[a,o]=(0,F.useState)({_tag:`idle`});return(0,F.useEffect)(()=>{if(e===null){o({_tag:`idle`});return}let r=new AbortController,i=!0;o({_tag:`loading`,sessionKey:e});let a=(n,r)=>Pe({connectivity:r,onSessionExpired:t,onState:e=>{i&&o(e)},sessionKey:e,transport:n});return de(n===void 0?w(Me,e=>a(e,je)).pipe(h(D)):a(n.transport,n.connectivity),{signal:r.signal}).then(t=>{!i||pe(t)||p(t.cause)||o({_tag:`failed`,failure:`unavailable`,sessionKey:e})}),()=>{i=!1,r.abort()}},[n,t,r,e]),{retry:(0,F.useCallback)(()=>i(e=>e+1),[]),state:a}},q={root:`_root_10gd5_1`,hero:`_hero_10gd5_6`,heroCopy:`_heroCopy_10gd5_13`,title:`_title_10gd5_18`,lede:`_lede_10gd5_23`,session:`_session_10gd5_28`,liveStatus:`_liveStatus_10gd5_34`,content:`_content_10gd5_42`,readyPortfolio:`_readyPortfolio_10gd5_43`,releaseList:`_releaseList_10gd5_44`,filters:`_filters_10gd5_53`,filter:`_filter_10gd5_53`,filterCount:`_filterCount_10gd5_100`,statePanel:`_statePanel_10gd5_115`,firstService:`_firstService_10gd5_119`,firstServiceCopy:`_firstServiceCopy_10gd5_124`,serviceLauncher:`_serviceLauncher_10gd5_130`,serviceChoice:`_serviceChoice_10gd5_136`,serviceAction:`_serviceAction_10gd5_187`,pairAction:`_pairAction_10gd5_193`,loading:`_loading_10gd5_207`,loadingRail:`_loadingRail_10gd5_213`,releaseEntry:`_releaseEntry_10gd5_219`,stageRail:`_stageRail_10gd5_239`,sourceWarning:`_sourceWarning_10gd5_244`},Ie=(e,t)=>{switch(e._tag){case`connecting`:return{detail:`Connecting to live updates.`,label:`Connecting`,tone:`progress`};case`reconnecting`:return{detail:`Showing the last snapshot; it may be stale.`,label:`Reconnecting`,tone:`caution`};case`offline`:return{detail:`Showing the last snapshot; it may be stale.`,label:`Offline`,tone:`caution`};case`connected`:return t?{detail:`Refreshing the authoritative snapshot.`,label:`Updating`,tone:`progress`}:{detail:`Snapshot up to date.`,label:`Live`,tone:`positive`}}},Le=({connection:e,isSnapshotStale:t})=>{let n=Ie(e,t);return(0,I.jsxs)(`div`,{"aria-atomic":`true`,"aria-live":`polite`,className:q.liveStatus,role:`status`,children:[(0,I.jsx)(l,{label:n.label,size:`compact`,tone:n.tone}),(0,I.jsx)(f,{tone:`tertiary`,variant:`meta`,children:n.detail})]})},Re=()=>(0,I.jsxs)(`section`,{"aria-labelledby":`first-service-title`,className:q.firstService,children:[(0,I.jsxs)(`div`,{className:q.firstServiceCopy,children:[(0,I.jsx)(f,{as:`h2`,id:`first-service-title`,variant:`page-title`,children:`Choose your first service`}),(0,I.jsx)(f,{tone:`secondary`,variant:`body-large`,children:`Enable and verify one source. Its releases, people, and delivery evidence will appear here automatically.`})]}),(0,I.jsx)(`nav`,{"aria-label":`Services available to enable`,className:q.serviceLauncher,children:j.map(e=>(0,I.jsxs)(i,{className:q.serviceChoice,"data-service":e.providerId,to:M(e.providerId),children:[(0,I.jsx)(re,{service:e.providerId}),(0,I.jsx)(`span`,{className:q.serviceAction,children:`Enable`})]},e.providerId))})]}),ze=()=>(0,I.jsxs)(`div`,{className:q.loading,children:[(0,I.jsx)(s,{decorative:!1,height:`1.25rem`,label:`Loading releases`,width:`10rem`}),(0,I.jsx)(s,{decorative:!0,height:`8rem`,variant:`block`}),(0,I.jsxs)(`div`,{className:q.loadingRail,children:[(0,I.jsx)(s,{decorative:!0,height:`3rem`,variant:`block`}),(0,I.jsx)(s,{decorative:!0,height:`3rem`,variant:`block`}),(0,I.jsx)(s,{decorative:!0,height:`3rem`,variant:`block`})]})]}),J=e=>{switch(e){case`anonymous`:return{description:`Pair this browser to read the workspace portfolio. Release facts never load before authentication.`,title:`Release facts stay private`};case`checking`:return{description:`Control Center is confirming whether this browser can read the workspace portfolio.`,title:`Checking this browser`};case`blocked`:return{announce:`assertive`,description:`This connection cannot read private release facts. Use an allowed Control Center address.`,title:`Portfolio access blocked`,tone:`critical`};case`storage-unavailable`:return{announce:`assertive`,description:`This browser cannot retain the private session proof. Check storage permissions or space, then reload.`,title:`Session storage unavailable`,tone:`caution`};case`unavailable`:return{announce:`assertive`,description:`Control Center could not check this browser session. Check the server, then reload this page.`,title:`Control Center unavailable`,tone:`critical`}}},Be=({reason:e})=>(0,I.jsx)(c,{...J(e),action:e===`anonymous`?(0,I.jsx)(i,{className:q.pairAction,to:`/pair`,children:`Pair this browser`}):void 0,className:q.statePanel}),Ve=({failure:e,onRetry:t})=>e===`session-expired`?(0,I.jsx)(c,{action:(0,I.jsx)(i,{className:q.pairAction,to:`/pair`,children:`Pair this browser`}),announce:`assertive`,className:q.statePanel,description:`Pair this browser again to read the workspace portfolio.`,title:`Pairing expired`,tone:`caution`}):e===`blocked`?(0,I.jsx)(c,{announce:`assertive`,className:q.statePanel,description:`This connection cannot read private release facts. Use an allowed Control Center address.`,title:`Portfolio access blocked`,tone:`critical`}):(0,I.jsx)(c,{action:(0,I.jsx)(u,{onClick:t,children:`Try again`}),announce:`assertive`,className:q.statePanel,description:`Control Center could not read the saved portfolio. Check the server, then try again.`,title:`Overview unavailable`,tone:`critical`}),Y=({onPreview:e,release:t,transitionNames:n})=>(0,I.jsxs)(`div`,{className:q.releaseEntry,"data-portfolio-release-id":t.id,children:[(0,I.jsx)(te,{onPreview:e,previewLabel:`Preview ${t.relay.codename}`,release:t.release,...n===void 0?{}:{transitionNames:n}}),(0,I.jsx)(ne,{className:q.stageRail,heading:`Delivery`,size:`compact`,stages:t.stages}),t.source.warning===null?null:(0,I.jsx)(c,{announce:`polite`,className:q.sourceWarning,description:t.source.warning,title:`Showing preserved source facts`,tone:`caution`})]}),He=({activeFilter:e,portfolio:t})=>{let n=a();return(0,I.jsx)(`nav`,{"aria-label":`Release filters`,className:q.filters,children:xe(t.releases).map(t=>(0,I.jsxs)(i,{"aria-current":t.id===e?`page`:void 0,className:q.filter,"data-active":t.id===e?`true`:`false`,to:{pathname:n.pathname,search:B(n.search,t.id)},children:[(0,I.jsx)(`span`,{children:t.label}),(0,I.jsx)(`span`,{"aria-label":`${String(t.count)} ${t.count===1?`release`:`releases`}`,className:q.filterCount,children:t.count})]},t.id))})},Ue=({filter:e})=>{let t=a();return(0,I.jsx)(c,{action:(0,I.jsx)(i,{className:q.pairAction,to:{pathname:t.pathname,search:B(t.search,`all`)},children:`Show all releases`}),className:q.statePanel,description:`No releases currently match ${Se(e)}. Live updates may change this view.`,title:`Nothing here right now`})},X=({onPreview:e,originPath:t,previewPath:r,release:i})=>{let o=a(),s=n(r);return(0,I.jsx)(Y,{onPreview:e,release:i,...s&&o.pathname===t?{transitionNames:k(i.id)}:{}})},We=({onPreviewRelease:e,portfolio:t,previewPathForRelease:n})=>{if(t.releases.length===0)return(0,I.jsx)(Re,{});let r=ye(a().search),i=V(t.releases,r);return(0,I.jsxs)(`div`,{className:q.readyPortfolio,children:[(0,I.jsx)(He,{activeFilter:r,portfolio:t}),i.length===0?(0,I.jsx)(Ue,{filter:r}):(0,I.jsx)(`div`,{className:q.releaseList,children:i.map(r=>n===void 0?(0,I.jsx)(Y,{onPreview:()=>e(r.id),release:r},r.id):(0,I.jsx)(X,{onPreview:()=>e(r.id),originPath:ee(t.workspaceId),previewPath:n(r.id),release:r},r.id))})]})},Z=({onPreviewRelease:e,onRetry:t,previewPathForRelease:n,state:r})=>(0,I.jsxs)(`section`,{"aria-labelledby":`portfolio-title`,className:q.root,children:[(0,I.jsxs)(`header`,{className:q.hero,children:[(0,I.jsxs)(`div`,{className:q.heroCopy,children:[(0,I.jsx)(f,{as:`h1`,className:q.title,id:`portfolio-title`,tabIndex:-1,variant:`verdict`,children:`Every release. One view.`}),(0,I.jsx)(f,{className:q.lede,tone:`secondary`,variant:`body-large`,children:`One factual view of releases, people, source health, and every handoff still to prove.`})]}),(0,I.jsxs)(`div`,{className:q.session,children:[r._tag===`session`&&r.reason===`storage-unavailable`?null:(0,I.jsx)(_e,{anonymousAction:`status`}),r._tag===`ready`?(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(Le,{connection:r.connection,isSnapshotStale:r.isSnapshotStale}),(0,I.jsxs)(f,{as:`time`,dateTime:r.portfolio.generatedAt,tone:`tertiary`,variant:`meta`,children:[`Snapshot `,r.portfolio.generatedTime]})]}):null]})]}),(0,I.jsxs)(`div`,{className:q.content,children:[r._tag===`session`?(0,I.jsx)(Be,{...r}):null,r._tag===`loading`?(0,I.jsx)(ze,{}):null,r._tag===`failed`?(0,I.jsx)(Ve,{failure:r.failure,onRetry:t}):null,r._tag===`ready`?(0,I.jsx)(We,{onPreviewRelease:e,portfolio:r.portfolio,...n===void 0?{}:{previewPathForRelease:n}}):null]})]}),Ge=e=>{switch(e._tag){case`idle`:return{_tag:`session`,reason:`anonymous`};case`loading`:return{_tag:`loading`};case`failed`:return{_tag:`failed`,failure:e.failure};case`loaded`:return{_tag:`ready`,connection:e.connection,isSnapshotStale:e.isSnapshotStale,portfolio:N(e.snapshot)}}},Q=(e,t,n=`anonymous`)=>t===null?{_tag:`session`,reason:n}:e._tag===`idle`||e.sessionKey!==t?{_tag:`loading`}:Ge(e),$=()=>{let{invalidateSession:e,state:t}=d(),n=t._tag===`authenticated`||t._tag===`storage-unavailable`?t.session:null,r=Fe(n?.sessionId??null,e);return{onRetry:r.retry,state:Q(r.state,n?.sessionId??null,t._tag===`authenticated`?`checking`:t._tag)}},Ke=()=>{let e=$(),{state:t}=e,n=P(t._tag===`ready`?t.portfolio.workspaceId:null);return t._tag===`ready`&&n!==null?(0,I.jsx)(r,{replace:!0,to:n}):(0,I.jsx)(Z,{onPreviewRelease:()=>void 0,onRetry:e.onRetry,state:t})};export{Ke as PortfolioOverview,Z as PortfolioOverviewView,J as portfolioSessionBoundaryPresentation,Q as selectPortfolioOverviewState,$ as usePortfolioOverviewController};
2
- //# sourceMappingURL=PortfolioOverview-D45rk8Hl.js.map