@knpkv/control-center 0.4.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 (220) hide show
  1. package/README.md +18 -8
  2. package/dist/client/.vite/manifest.json +214 -182
  3. package/dist/client/assets/{ActiveWorkPage-Dd1mxPrq.js → ActiveWorkPage-g2-Jyavo.js} +2 -2
  4. package/dist/client/assets/{ActiveWorkPage-Dd1mxPrq.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-BPoF6oKf.js.map → AtlassianOAuthCallbackPage-C8u9ItMj.js.map} +1 -1
  10. package/dist/client/assets/{AuthorizedSharePage-jjqu6W_f.js → AuthorizedSharePage-CVBJ1NTm.js} +2 -2
  11. package/dist/client/assets/{AuthorizedSharePage-jjqu6W_f.js.map → AuthorizedSharePage-CVBJ1NTm.js.map} +1 -1
  12. package/dist/client/assets/BrowserCrypto-3BoTVFdl.js +2 -0
  13. package/dist/client/assets/{BrowserCrypto-BMbjhcvP.js.map → BrowserCrypto-3BoTVFdl.js.map} +1 -1
  14. package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js +2 -0
  15. package/dist/client/assets/{BrowserSessionHydrator-BC1ymLkL.js.map → BrowserSessionHydrator-CpZnNm4X.js.map} +1 -1
  16. package/dist/client/assets/{CommandSearch-WwAVDrD9.js → CommandSearch-DUeRRbV2.js} +2 -2
  17. package/dist/client/assets/{CommandSearch-WwAVDrD9.js.map → CommandSearch-DUeRRbV2.js.map} +1 -1
  18. package/dist/client/assets/{ItemsPage-CKK_KkJ2.js → ItemsPage-BF2ZkSzh.js} +2 -2
  19. package/dist/client/assets/{ItemsPage-CKK_KkJ2.js.map → ItemsPage-BF2ZkSzh.js.map} +1 -1
  20. package/dist/client/assets/{PairPage-DA6cmyqF.js → PairPage-CkaZltHd.js} +2 -2
  21. package/dist/client/assets/{PairPage-DA6cmyqF.js.map → PairPage-CkaZltHd.js.map} +1 -1
  22. package/dist/client/assets/PortfolioOverview-CEUHJmGC.js +2 -0
  23. package/dist/client/assets/{PortfolioOverview-CEI4gpXi.js.map → PortfolioOverview-CEUHJmGC.js.map} +1 -1
  24. package/dist/client/assets/{PullRequestReviewPanel-D7AKnwL-.js → PullRequestReviewPanel-D1IpvHe2.js} +3 -3
  25. package/dist/client/assets/{PullRequestReviewPanel-D7AKnwL-.js.map → PullRequestReviewPanel-D1IpvHe2.js.map} +1 -1
  26. package/dist/client/assets/{ReleaseRoute-CbPW3qUT.js → ReleaseRoute-BuQybrsg.js} +2 -2
  27. package/dist/client/assets/{ReleaseRoute-CbPW3qUT.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-_B89DAvG.js.map → ServicesPage-hw5Ee69-.js.map} +1 -1
  32. package/dist/client/assets/{TimelinePage-DvpgD8AY.js → TimelinePage-Cj3V98uI.js} +2 -2
  33. package/dist/client/assets/{TimelinePage-DvpgD8AY.js.map → TimelinePage-Cj3V98uI.js.map} +1 -1
  34. package/dist/client/assets/{WorkspaceEntityLink-DPj6MKI2.js → WorkspaceEntityLink-C_rc8lxi.js} +2 -2
  35. package/dist/client/assets/{WorkspaceEntityLink-DPj6MKI2.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-CkJfzO25.js.map → WorkspaceHomeLink-DeYYLEsH.js.map} +1 -1
  41. package/dist/client/assets/WorkspacePullRequestDetails-CizqydjN.js +3 -0
  42. package/dist/client/assets/{WorkspacePullRequestDetails-HwDgp12e.js.map → WorkspacePullRequestDetails-CizqydjN.js.map} +1 -1
  43. package/dist/client/assets/{WorkspaceReleaseLayout-CGHi8eoo.js → WorkspaceReleaseLayout-CXAQUhkh.js} +2 -2
  44. package/dist/client/assets/{WorkspaceReleaseLayout-CGHi8eoo.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-DYaieXUe.js.map → authenticatedMutationClient-DdowMjyo.js.map} +1 -1
  56. package/dist/client/assets/{authorizedShareTransport-cxBoQzQ2.js → authorizedShareTransport-CnclcYai.js} +2 -2
  57. package/dist/client/assets/{authorizedShareTransport-cxBoQzQ2.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-C7_FDTU7.js → index-zVjlBm9l.js} +3 -3
  65. package/dist/client/assets/{index-C7_FDTU7.js.map → index-zVjlBm9l.js.map} +1 -1
  66. package/dist/client/assets/{patterns-5N-j-AD2-B9qgekXA.js → patterns-5N-j-AD2-DLfaGePK.js} +2 -2
  67. package/dist/client/assets/{patterns-5N-j-AD2-B9qgekXA.js.map → patterns-5N-j-AD2-DLfaGePK.js.map} +1 -1
  68. package/dist/client/assets/{presentPortfolio-C_JsoSWg.js → presentPortfolio-DLEq-vEz.js} +2 -2
  69. package/dist/client/assets/{presentPortfolio-C_JsoSWg.js.map → presentPortfolio-DLEq-vEz.js.map} +1 -1
  70. package/dist/client/assets/{presentWorkspaceItems-DboAfwGc.js → presentWorkspaceItems-BOY3FbhO.js} +2 -2
  71. package/dist/client/assets/{presentWorkspaceItems-DboAfwGc.js.map → presentWorkspaceItems-BOY3FbhO.js.map} +1 -1
  72. package/dist/client/assets/{pullRequestReviewFailures-DHmYwffV.js → pullRequestReviewFailures-CyjTVnSX.js} +2 -2
  73. package/dist/client/assets/{pullRequestReviewFailures-DHmYwffV.js.map → pullRequestReviewFailures-CyjTVnSX.js.map} +1 -1
  74. package/dist/client/assets/{pullRequestReviewThreadReplay-Vy1k53qE.js → pullRequestReviewThreadReplay-CXHspFTr.js} +2 -2
  75. package/dist/client/assets/{pullRequestReviewThreadReplay-Vy1k53qE.js.map → pullRequestReviewThreadReplay-CXHspFTr.js.map} +1 -1
  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-t9uCfs5T.js.map → releaseRoutes-B4ciNOJj.js.map} +1 -1
  80. package/dist/client/assets/{serviceOnboarding-DLINCon7.js → serviceOnboarding-D0FmodRi.js} +2 -2
  81. package/dist/client/assets/{serviceOnboarding-DLINCon7.js.map → serviceOnboarding-D0FmodRi.js.map} +1 -1
  82. package/dist/client/assets/{useWorkspaceDefaultLanding-CC5ImHkL.js → useWorkspaceDefaultLanding-BaQdg0sY.js} +3 -3
  83. package/dist/client/assets/{useWorkspaceDefaultLanding-CC5ImHkL.js.map → useWorkspaceDefaultLanding-BaQdg0sY.js.map} +1 -1
  84. package/dist/client/assets/{useWorkspaceItems-B1X-JNwq.js → useWorkspaceItems-B-7JHtm0.js} +2 -2
  85. package/dist/client/assets/{useWorkspaceItems-B1X-JNwq.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-BsjcWVsk.js → workspaceScrollCapture-BYNfR2wo.js} +2 -2
  89. package/dist/client/assets/{workspaceScrollCapture-BsjcWVsk.js.map → workspaceScrollCapture-BYNfR2wo.js.map} +1 -1
  90. package/dist/client/assets/{workspaceSettingsTransport-Dw2hueXv.js → workspaceSettingsTransport-Br4lBmvS.js} +2 -2
  91. package/dist/client/assets/{workspaceSettingsTransport-Dw2hueXv.js.map → workspaceSettingsTransport-Br4lBmvS.js.map} +1 -1
  92. package/dist/client/build-graph.json +98 -0
  93. package/dist/client/index.html +1 -1
  94. package/dist/server/api/agent.d.ts +12 -0
  95. package/dist/server/api/agent.d.ts.map +1 -1
  96. package/dist/server/api/deliveryGraph.d.ts +20 -0
  97. package/dist/server/api/deliveryGraph.d.ts.map +1 -1
  98. package/dist/server/api/index.d.ts +1 -1
  99. package/dist/server/api/index.d.ts.map +1 -1
  100. package/dist/server/api/index.js +3 -3
  101. package/dist/server/api/session.d.ts +23 -1
  102. package/dist/server/api/session.d.ts.map +1 -1
  103. package/dist/server/api/shares.d.ts +2 -0
  104. package/dist/server/api/shares.d.ts.map +1 -1
  105. package/dist/server/assets/{BindConfig-Bj282xDC.js → BindConfig-DAASchDn.js} +315 -36
  106. package/dist/server/assets/BindConfig-DAASchDn.js.map +1 -0
  107. package/dist/server/assets/{agent-ZvwskOQu.js → agent-xQhAQXly.js} +26 -6
  108. package/dist/server/assets/agent-xQhAQXly.js.map +1 -0
  109. package/dist/server/assets/{controlCenterApi-5j3gOXgE.js → controlCenterApi-DNXK7MT1.js} +4 -3
  110. package/dist/server/assets/controlCenterApi-DNXK7MT1.js.map +1 -0
  111. package/dist/server/assets/{manualPluginSynchronization-CzIhZ_Dw.js → manualPluginSynchronization-DFIeUHP9.js} +4 -3
  112. package/dist/server/assets/manualPluginSynchronization-DFIeUHP9.js.map +1 -0
  113. package/dist/server/assets/{readiness-BtntBhDj.js → readiness-31Mqc-9H.js} +2 -2
  114. package/dist/server/assets/{readiness-BtntBhDj.js.map → readiness-31Mqc-9H.js.map} +1 -1
  115. package/dist/server/assets/{relationshipInferenceMaterialization-CR6xyMNL.js → relationshipInferenceMaterialization-Dyix96px.js} +41 -14
  116. package/dist/server/assets/relationshipInferenceMaterialization-Dyix96px.js.map +1 -0
  117. package/dist/server/assets/{workspaceSettings-C2Zsk6RI.js → workspaceSettings-sv8h_h2P.js} +4 -1
  118. package/dist/server/assets/workspaceSettings-sv8h_h2P.js.map +1 -0
  119. package/dist/server/build-graph.json +28 -1
  120. package/dist/server/domain/confluenceTasks.d.ts +27 -0
  121. package/dist/server/domain/confluenceTasks.d.ts.map +1 -0
  122. package/dist/server/domain/deliveryGraph.d.ts +2 -0
  123. package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
  124. package/dist/server/domain/governedAction/bindings.d.ts +2 -0
  125. package/dist/server/domain/governedAction/bindings.d.ts.map +1 -1
  126. package/dist/server/domain/governedAction/model.d.ts +6 -0
  127. package/dist/server/domain/governedAction/model.d.ts.map +1 -1
  128. package/dist/server/domain/index.js +2 -2
  129. package/dist/server/domain/normalizedPage.d.ts +1 -0
  130. package/dist/server/domain/normalizedPage.d.ts.map +1 -1
  131. package/dist/server/domain/releasePipelineApproval.d.ts +31 -0
  132. package/dist/server/domain/releasePipelineApproval.d.ts.map +1 -0
  133. package/dist/server/index.js +5 -5
  134. package/dist/server/server/api/Handlers.d.ts +1 -1
  135. package/dist/server/server/api/Handlers.d.ts.map +1 -1
  136. package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -1
  137. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
  138. package/dist/server/server/application/pipelineExecutionProjection.d.ts +1 -0
  139. package/dist/server/server/application/pipelineExecutionProjection.d.ts.map +1 -1
  140. package/dist/server/server/application/portfolioSnapshots.d.ts +4 -0
  141. package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -1
  142. package/dist/server/server/application/releasePublicationSubmissions.d.ts +32 -1
  143. package/dist/server/server/application/releasePublicationSubmissions.d.ts.map +1 -1
  144. package/dist/server/server/application/releaseRunbookHydration.d.ts +2310 -0
  145. package/dist/server/server/application/releaseRunbookHydration.d.ts.map +1 -0
  146. package/dist/server/server/cli.js +3 -3
  147. package/dist/server/server/governance/governedActionDigests.d.ts +3 -0
  148. package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -1
  149. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +1 -0
  150. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -1
  151. package/dist/server/server/index.js +2 -2
  152. package/dist/server/server/persistence/Persistence.d.ts +10 -0
  153. package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
  154. package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -1
  155. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +2 -2
  156. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -1
  157. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +10 -0
  158. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
  159. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +2 -0
  160. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
  161. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +6 -0
  162. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
  163. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +1 -0
  164. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
  165. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +2 -0
  166. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
  167. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +6 -0
  168. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
  169. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +4 -0
  170. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -1
  171. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +2 -0
  172. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -1
  173. package/dist/server/server/persistence/repositories/governed-action/read.d.ts +4 -0
  174. package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -1
  175. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +4 -0
  176. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -1
  177. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +1 -0
  178. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -1
  179. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +2 -0
  180. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -1
  181. package/dist/server/server/persistence/repositories/governed-action/write.d.ts +2 -0
  182. package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -1
  183. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +4 -0
  184. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -1
  185. package/package.json +3 -3
  186. package/dist/client/assets/AgentPage-C3LThgPZ.js +0 -3
  187. package/dist/client/assets/AgentPage-C3LThgPZ.js.map +0 -1
  188. package/dist/client/assets/AgentPage-DVSgQgJa.css +0 -1
  189. package/dist/client/assets/AtlassianOAuthCallbackPage-BPoF6oKf.js +0 -2
  190. package/dist/client/assets/BrowserCrypto-BMbjhcvP.js +0 -2
  191. package/dist/client/assets/BrowserSessionHydrator-BC1ymLkL.js +0 -2
  192. package/dist/client/assets/PortfolioOverview-CEI4gpXi.js +0 -2
  193. package/dist/client/assets/ReleaseWorkset-BluAe7Sq.js +0 -2
  194. package/dist/client/assets/ReleaseWorkset-BluAe7Sq.js.map +0 -1
  195. package/dist/client/assets/ServicesPage-_B89DAvG.js +0 -2
  196. package/dist/client/assets/WorkspaceEntityRoute-9iMOV64J.css +0 -1
  197. package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js +0 -3
  198. package/dist/client/assets/WorkspaceEntityRoute-B01fxxB3.js.map +0 -1
  199. package/dist/client/assets/WorkspaceHomeLink-CkJfzO25.js +0 -2
  200. package/dist/client/assets/WorkspacePullRequestDetails-HwDgp12e.js +0 -3
  201. package/dist/client/assets/WorkspaceRichText-D1M637Ff.js.map +0 -1
  202. package/dist/client/assets/WorkspaceSettingsPage-DyoGiGJG.js +0 -2
  203. package/dist/client/assets/WorkspaceSettingsPage-DyoGiGJG.js.map +0 -1
  204. package/dist/client/assets/WorkspaceSettingsPage-P6yfac0b.css +0 -1
  205. package/dist/client/assets/agent-api-CeONl_8w.js +0 -19
  206. package/dist/client/assets/agent-api-CeONl_8w.js.map +0 -1
  207. package/dist/client/assets/authenticatedMutationClient-DYaieXUe.js +0 -2
  208. package/dist/client/assets/client-DKS82kT_.js +0 -5
  209. package/dist/client/assets/client-DKS82kT_.js.map +0 -1
  210. package/dist/client/assets/connectionTestTransport-I_Ga9UNs.js +0 -2
  211. package/dist/client/assets/connectionTestTransport-I_Ga9UNs.js.map +0 -1
  212. package/dist/client/assets/releaseRoutes-t9uCfs5T.js +0 -2
  213. package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js +0 -2
  214. package/dist/client/assets/workspaceEntityRoutes-2TejMrzb.js.map +0 -1
  215. package/dist/server/assets/BindConfig-Bj282xDC.js.map +0 -1
  216. package/dist/server/assets/agent-ZvwskOQu.js.map +0 -1
  217. package/dist/server/assets/controlCenterApi-5j3gOXgE.js.map +0 -1
  218. package/dist/server/assets/manualPluginSynchronization-CzIhZ_Dw.js.map +0 -1
  219. package/dist/server/assets/relationshipInferenceMaterialization-CR6xyMNL.js.map +0 -1
  220. package/dist/server/assets/workspaceSettings-C2Zsk6RI.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{t as n,u as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{a,i as o,n as s,r as c,t as l}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{d as u,f as d,s as f,u as p}from"./index-C7_FDTU7.js";import{a as m,v as h}from"./patterns-5N-j-AD2-B9qgekXA.js";import{r as g}from"./primitives-nKxQGSsE-CJNmac__.js";import{Hr as _,Ir as v,Jn as y,Kt as b,Oa as x,Rr as S,_i as C,ai as w,pi as T}from"./agent-api-CeONl_8w.js";import{a as E,t as D}from"./client-DKS82kT_.js";import{t as O}from"./WorkspaceEntityLink-DPj6MKI2.js";var k=e(t(),1),A={body:`_body_vqgmt_1`,loading:`_loading_vqgmt_2`,content:`_content_vqgmt_3`,identity:`_identity_vqgmt_4`,identityMeta:`_identityMeta_vqgmt_5`,section:`_section_vqgmt_6`,ledger:`_ledger_vqgmt_7`,footerLink:`_footerLink_vqgmt_70`},j=x(`UnauthorizedApiError`),M={load:(e,t)=>C(w(function*(){return yield*(yield*D()).timeline.detail({params:{eventKey:e}})}).pipe(T(E)),{signal:t})},N=(e,t,n,r=M)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`});(0,k.useEffect)(()=>{if(e===null||t===null){s({_tag:`idle`});return}let i=new AbortController;return s({_tag:`loading`,eventKey:e,sessionKey:t}),r.load(e,i.signal).then(n=>{i.signal.aborted||s({_tag:`ready`,detail:n,eventKey:e,sessionKey:t})},r=>{i.signal.aborted||(j(r)&&n(t),s({_tag:`failed`,eventKey:e,sessionKey:t}))}),()=>i.abort()},[e,n,i,t,r]);let c=e===null||t===null?{_tag:`idle`}:o._tag===`idle`||o.eventKey!==e||o.sessionKey!==t?{_tag:`loading`,eventKey:e,sessionKey:t}:o;return{retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:c}},P=i(),F={action:`Governed action`,"plugin-sync":`Service sync`,relationship:`Delivery link`,system:`Control Center`},I=e=>S(e.occurredAt,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`,second:`2-digit`,year:`numeric`}),L=e=>{let t=[{label:`Actor`,value:e.identifiers.actorId},{label:`Agent job`,value:e.agentJob?.jobId??null},{label:`Action`,value:e.identifiers.actionId},{label:`Relationship`,value:e.identifiers.relationshipId},{label:`Connection`,value:e.identifiers.pluginConnectionId},{label:`Release`,value:e.identifiers.releaseId},{label:`Entity`,value:e.identifiers.entityId}];return[{label:`Event`,value:e.event.eventKey},{label:`Type`,value:e.event.eventType},...t.filter(e=>e.value!==null)]},R=({agentHref:e,event:t,onClose:r,onSessionExpired:i,sessionKey:u,transport:d})=>{let f=N(t?.eventKey??null,u,i,d);return(0,P.jsx)(o.Root,{onOpenChange:e=>{e||r()},open:t!==null,children:(0,P.jsxs)(o.Content,{closeLabel:`Close event details`,description:`Durable provenance for this exact workspace event.`,title:`Event details`,children:[(0,P.jsx)(o.Body,{className:A.body,children:t===null||f.state._tag===`idle`||f.state._tag===`loading`?(0,P.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading event details`,className:A.loading,children:[(0,P.jsx)(a,{height:`10rem`}),(0,P.jsx)(a,{height:`14rem`})]}):f.state._tag===`failed`?(0,P.jsx)(s,{action:(0,P.jsx)(l,{onClick:f.retry,children:`Try again`}),description:`The Timeline row remains unchanged. Its provenance could not be loaded.`,title:`Event details unavailable`,tone:`caution`}):(0,P.jsxs)(`div`,{className:A.content,children:[(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-detail-title`,className:A.identity,children:[(0,P.jsx)(g,{tone:`secondary`,variant:`label`,children:F[f.state.detail.event.sourceKind]}),(0,P.jsx)(g,{as:`h2`,id:`timeline-detail-title`,variant:`page-title`,children:f.state.detail.event.title}),(0,P.jsxs)(`div`,{className:A.identityMeta,children:[(0,P.jsx)(c,{label:f.state.detail.event.actor.kind,size:`compact`,tone:f.state.detail.event.actor.kind===`agent`?`progress`:`neutral`}),f.state.detail.event.service===null?null:(0,P.jsx)(h,{service:f.state.detail.event.service,size:`compact`}),(0,P.jsx)(g,{tone:`secondary`,variant:`meta`,children:f.state.detail.event.actor.label}),(0,P.jsxs)(g,{as:`time`,dateTime:v(f.state.detail.event.occurredAt),tone:`secondary`,variant:`meta`,children:[I(f.state.detail.event),` UTC`]})]})]}),(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-provenance-title`,className:A.section,children:[(0,P.jsx)(g,{as:`h3`,id:`timeline-provenance-title`,variant:`section-title`,children:`Provenance`}),(0,P.jsx)(`dl`,{className:A.ledger,children:L(f.state.detail).map(({label:e,value:t})=>(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:e}),(0,P.jsx)(`dd`,{children:t})]},e))})]})]})}),(0,P.jsx)(o.Footer,{children:(0,P.jsx)(n,{className:A.footerLink,to:e,children:`Ask Relay about this event`})})]})})},z={page:`_page_18su2_1`,hero:`_hero_18su2_2`,intro:`_intro_18su2_22`,askRelay:`_askRelay_18su2_26`,summary:`_summary_18su2_40`,filters:`_filters_18su2_89`,events:`_events_18su2_115`,rowActor:`_rowActor_18su2_122`},B={load:(e,t,n)=>C(w(function*(){let e=yield*D(),r=t.from.length===0?void 0:yield*y(b)(`${t.from}T00:00:00.000Z`),i=t.to.length===0?void 0:yield*y(b)(`${t.to}T23:59:59.999Z`);return yield*e.timeline.page({query:{...t.actorKind===`all`?{}:{actor:t.actorKind},...n===null?{}:{beforeEventKey:n.eventKey,beforeOccurredAt:n.occurredAt},...r===void 0?{}:{from:r},limit:50,...i===void 0?{}:{to:i}}})}).pipe(T(E)),{signal:e})},V=x(`UnauthorizedApiError`),H=(e,t,n,r=B)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`}),c=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(c.current?.abort(),t===null){s({_tag:`idle`});return}let i=new AbortController;return c.current=i,s({_tag:`loading`}),r.load(i.signal,e,null).then(e=>{i.signal.aborted||s({_tag:`ready`,events:e.events,isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(V(e)&&n(t),s({_tag:`failed`}))}),()=>i.abort()},[`${e.actorKind}|${e.from}|${e.to}`,e,n,i,t,r]),{loadMore:(0,k.useCallback)(()=>{if(t===null||o._tag!==`ready`||o.nextCursor===null||o.isLoadingMore)return;c.current?.abort();let i=new AbortController;c.current=i;let a=o;s({...a,isLoadingMore:!0}),r.load(i.signal,e,a.nextCursor).then(e=>{i.signal.aborted||s({_tag:`ready`,events:[...a.events,...e.events],isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(V(e)&&n(t),s({...a,isLoadingMore:!1}))})},[e,n,t,o,r]),retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:o}},U=e=>new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}).format(_(e)),W=[{label:`Everyone`,value:`all`},{label:`People`,value:`human`},{label:`Agents`,value:`agent`},{label:`Services`,value:`plugin`},{label:`System`,value:`system`}],G=[`action`,`relationship`,`plugin-sync`,`system`],K=e=>W.find(t=>t.value===e)?.value??`all`,q={action:{label:`Governed action`},"plugin-sync":{label:`Service sync`},relationship:{label:`Delivery link`},system:{label:`Control Center`}},J=({actor:e,continued:t,event:n})=>(0,P.jsx)(m,{continued:t,event:{actor:e??n.actor.label,actorKind:n.actor.kind,dateTime:v(n.occurredAt),detail:q[n.sourceKind].label,...n.href===null?{}:{href:n.href},id:n.eventKey,...n.service===null?{}:{service:n.service},time:U(n.occurredAt),title:n.title}}),Y=e=>{switch(e._tag){case`authenticated`:return e.session.permission===`workspace-owner`;case`storage-unavailable`:return e.session?.permission===`workspace-owner`;case`anonymous`:case`blocked`:case`checking`:case`unavailable`:return!1}},X=(e,t,n,r)=>{let i=new URLSearchParams(t);return i.set(`event`,r),f(e,`?${i.toString()}`,n)},Z=({events:e})=>{let t=(0,k.useMemo)(()=>new Map([[`action`,e.filter(({sourceKind:e})=>e===`action`).length],[`relationship`,e.filter(({sourceKind:e})=>e===`relationship`).length],[`plugin-sync`,e.filter(({sourceKind:e})=>e===`plugin-sync`).length],[`system`,e.filter(({sourceKind:e})=>e===`system`).length]]),[e]);return(0,P.jsx)(`dl`,{className:z.summary,children:G.map(e=>(0,P.jsxs)(`div`,{"data-source":e,children:[(0,P.jsx)(`dt`,{children:q[e].label}),(0,P.jsx)(`dd`,{children:t.get(e)??0})]},e))})},Q=({detailTransport:e,transport:t=B}={})=>{let i=r(),a=u(),o=p(a.state),[c,m]=(0,k.useState)({actorKind:`all`,from:``,to:``}),[h,_]=(0,k.useState)(null),v=H(c,o,a.invalidateSession,t),y=f(i.pathname,i.search,i.hash),b=Y(a.state);if(v.state._tag===`idle`||v.state._tag===`loading`)return(0,P.jsx)(s,{description:`Combining durable activity across your connected services.`,title:`Loading Timeline`});if(v.state._tag===`failed`)return(0,P.jsx)(s,{action:(0,P.jsx)(l,{onClick:v.retry,children:`Try again`}),description:`The Timeline could not be read.`,title:`Timeline unavailable`});let x=v.state;return(0,P.jsxs)(`article`,{className:z.page,children:[(0,P.jsxs)(`header`,{className:z.hero,children:[(0,P.jsx)(g,{as:`p`,tone:`secondary`,variant:`label`,children:`Timeline`}),(0,P.jsxs)(g,{as:`h1`,variant:`verdict`,children:[`Everything`,(0,P.jsx)(`br`,{}),`that moved.`]}),(0,P.jsx)(g,{className:z.intro,tone:`secondary`,variant:`body-large`,children:`One chronological truth across people, agents, code, delivery links, and connected services.`}),(0,P.jsx)(n,{className:z.askRelay,to:y,children:`Ask Relay about this Timeline`})]}),(0,P.jsx)(Z,{events:x.events}),(0,P.jsxs)(`section`,{"aria-label":`Timeline filters`,className:z.filters,children:[(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`Actor`}),(0,P.jsx)(`select`,{value:c.actorKind,onChange:e=>m({...c,actorKind:K(e.currentTarget.value)}),children:W.map(e=>(0,P.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`From`}),(0,P.jsx)(`input`,{type:`date`,value:c.from,onChange:e=>m({...c,from:e.currentTarget.value})})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`To`}),(0,P.jsx)(`input`,{type:`date`,value:c.to,onChange:e=>m({...c,to:e.currentTarget.value})})]})]}),x.events.length===0?(0,P.jsx)(s,{description:`Try a wider date range or another actor.`,title:`No activity in this view`}):(0,P.jsx)(d,{component:O,children:(0,P.jsx)(`ol`,{className:z.events,children:x.events.map((e,t)=>(0,P.jsx)(J,{actor:b?(0,P.jsxs)(`span`,{className:z.rowActor,children:[(0,P.jsx)(`span`,{children:e.actor.label}),(0,P.jsx)(l,{onClick:()=>_(e),size:`compact`,variant:`quiet`,children:`Inspect`})]}):void 0,continued:t<x.events.length-1,event:e},e.eventKey))})}),x.nextCursor===null?null:(0,P.jsx)(l,{disabled:x.isLoadingMore,onClick:v.loadMore,size:`principal`,stretch:!0,children:x.isLoadingMore?`Loading…`:`Show earlier activity`}),(0,P.jsx)(R,{agentHref:h===null?y:X(i.pathname,i.search,i.hash,h.eventKey),event:h,onClose:()=>_(null),onSessionExpired:a.invalidateSession,sessionKey:o,...e===void 0?{}:{transport:e}})]})};export{Q as TimelinePage,Y as canInspectTimelineDetails,X as timelineEventAgentPath};
2
- //# sourceMappingURL=TimelinePage-DvpgD8AY.js.map
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{t as n,u as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{a,i as o,n as s,r as c,t as l}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{d as u,f as d,s as f,u as p}from"./index-zVjlBm9l.js";import{a as m,v as h}from"./patterns-5N-j-AD2-DLfaGePK.js";import{r as g}from"./primitives-nKxQGSsE-CJNmac__.js";import{Hr as _,Ir as v,Kn as y,Kt as b,Rr as x,_i as S,ai as C,ja as w,pi as T}from"./agent-api-Dl9TuGOJ.js";import{a as E,t as D}from"./client-Dq_XQE_l.js";import{t as O}from"./WorkspaceEntityLink-C_rc8lxi.js";var k=e(t(),1),A={body:`_body_vqgmt_1`,loading:`_loading_vqgmt_2`,content:`_content_vqgmt_3`,identity:`_identity_vqgmt_4`,identityMeta:`_identityMeta_vqgmt_5`,section:`_section_vqgmt_6`,ledger:`_ledger_vqgmt_7`,footerLink:`_footerLink_vqgmt_70`},j=w(`UnauthorizedApiError`),M={load:(e,t)=>S(C(function*(){return yield*(yield*D()).timeline.detail({params:{eventKey:e}})}).pipe(T(E)),{signal:t})},N=(e,t,n,r=M)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`});(0,k.useEffect)(()=>{if(e===null||t===null){s({_tag:`idle`});return}let i=new AbortController;return s({_tag:`loading`,eventKey:e,sessionKey:t}),r.load(e,i.signal).then(n=>{i.signal.aborted||s({_tag:`ready`,detail:n,eventKey:e,sessionKey:t})},r=>{i.signal.aborted||(j(r)&&n(t),s({_tag:`failed`,eventKey:e,sessionKey:t}))}),()=>i.abort()},[e,n,i,t,r]);let c=e===null||t===null?{_tag:`idle`}:o._tag===`idle`||o.eventKey!==e||o.sessionKey!==t?{_tag:`loading`,eventKey:e,sessionKey:t}:o;return{retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:c}},P=i(),F={action:`Governed action`,"plugin-sync":`Service sync`,relationship:`Delivery link`,system:`Control Center`},I=e=>x(e.occurredAt,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`,second:`2-digit`,year:`numeric`}),L=e=>{let t=[{label:`Actor`,value:e.identifiers.actorId},{label:`Agent job`,value:e.agentJob?.jobId??null},{label:`Action`,value:e.identifiers.actionId},{label:`Relationship`,value:e.identifiers.relationshipId},{label:`Connection`,value:e.identifiers.pluginConnectionId},{label:`Release`,value:e.identifiers.releaseId},{label:`Entity`,value:e.identifiers.entityId}];return[{label:`Event`,value:e.event.eventKey},{label:`Type`,value:e.event.eventType},...t.filter(e=>e.value!==null)]},R=({agentHref:e,event:t,onClose:r,onSessionExpired:i,sessionKey:u,transport:d})=>{let f=N(t?.eventKey??null,u,i,d);return(0,P.jsx)(o.Root,{onOpenChange:e=>{e||r()},open:t!==null,children:(0,P.jsxs)(o.Content,{closeLabel:`Close event details`,description:`Durable provenance for this exact workspace event.`,title:`Event details`,children:[(0,P.jsx)(o.Body,{className:A.body,children:t===null||f.state._tag===`idle`||f.state._tag===`loading`?(0,P.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading event details`,className:A.loading,children:[(0,P.jsx)(a,{height:`10rem`}),(0,P.jsx)(a,{height:`14rem`})]}):f.state._tag===`failed`?(0,P.jsx)(s,{action:(0,P.jsx)(l,{onClick:f.retry,children:`Try again`}),description:`The Timeline row remains unchanged. Its provenance could not be loaded.`,title:`Event details unavailable`,tone:`caution`}):(0,P.jsxs)(`div`,{className:A.content,children:[(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-detail-title`,className:A.identity,children:[(0,P.jsx)(g,{tone:`secondary`,variant:`label`,children:F[f.state.detail.event.sourceKind]}),(0,P.jsx)(g,{as:`h2`,id:`timeline-detail-title`,variant:`page-title`,children:f.state.detail.event.title}),(0,P.jsxs)(`div`,{className:A.identityMeta,children:[(0,P.jsx)(c,{label:f.state.detail.event.actor.kind,size:`compact`,tone:f.state.detail.event.actor.kind===`agent`?`progress`:`neutral`}),f.state.detail.event.service===null?null:(0,P.jsx)(h,{service:f.state.detail.event.service,size:`compact`}),(0,P.jsx)(g,{tone:`secondary`,variant:`meta`,children:f.state.detail.event.actor.label}),(0,P.jsxs)(g,{as:`time`,dateTime:v(f.state.detail.event.occurredAt),tone:`secondary`,variant:`meta`,children:[I(f.state.detail.event),` UTC`]})]})]}),(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-provenance-title`,className:A.section,children:[(0,P.jsx)(g,{as:`h3`,id:`timeline-provenance-title`,variant:`section-title`,children:`Provenance`}),(0,P.jsx)(`dl`,{className:A.ledger,children:L(f.state.detail).map(({label:e,value:t})=>(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:e}),(0,P.jsx)(`dd`,{children:t})]},e))})]})]})}),(0,P.jsx)(o.Footer,{children:(0,P.jsx)(n,{className:A.footerLink,to:e,children:`Ask Relay about this event`})})]})})},z={page:`_page_18su2_1`,hero:`_hero_18su2_2`,intro:`_intro_18su2_22`,askRelay:`_askRelay_18su2_26`,summary:`_summary_18su2_40`,filters:`_filters_18su2_89`,events:`_events_18su2_115`,rowActor:`_rowActor_18su2_122`},B={load:(e,t,n)=>S(C(function*(){let e=yield*D(),r=t.from.length===0?void 0:yield*y(b)(`${t.from}T00:00:00.000Z`),i=t.to.length===0?void 0:yield*y(b)(`${t.to}T23:59:59.999Z`);return yield*e.timeline.page({query:{...t.actorKind===`all`?{}:{actor:t.actorKind},...n===null?{}:{beforeEventKey:n.eventKey,beforeOccurredAt:n.occurredAt},...r===void 0?{}:{from:r},limit:50,...i===void 0?{}:{to:i}}})}).pipe(T(E)),{signal:e})},V=w(`UnauthorizedApiError`),H=(e,t,n,r=B)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`}),c=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(c.current?.abort(),t===null){s({_tag:`idle`});return}let i=new AbortController;return c.current=i,s({_tag:`loading`}),r.load(i.signal,e,null).then(e=>{i.signal.aborted||s({_tag:`ready`,events:e.events,isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(V(e)&&n(t),s({_tag:`failed`}))}),()=>i.abort()},[`${e.actorKind}|${e.from}|${e.to}`,e,n,i,t,r]),{loadMore:(0,k.useCallback)(()=>{if(t===null||o._tag!==`ready`||o.nextCursor===null||o.isLoadingMore)return;c.current?.abort();let i=new AbortController;c.current=i;let a=o;s({...a,isLoadingMore:!0}),r.load(i.signal,e,a.nextCursor).then(e=>{i.signal.aborted||s({_tag:`ready`,events:[...a.events,...e.events],isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(V(e)&&n(t),s({...a,isLoadingMore:!1}))})},[e,n,t,o,r]),retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:o}},U=e=>new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}).format(_(e)),W=[{label:`Everyone`,value:`all`},{label:`People`,value:`human`},{label:`Agents`,value:`agent`},{label:`Services`,value:`plugin`},{label:`System`,value:`system`}],G=[`action`,`relationship`,`plugin-sync`,`system`],K=e=>W.find(t=>t.value===e)?.value??`all`,q={action:{label:`Governed action`},"plugin-sync":{label:`Service sync`},relationship:{label:`Delivery link`},system:{label:`Control Center`}},J=({actor:e,continued:t,event:n})=>(0,P.jsx)(m,{continued:t,event:{actor:e??n.actor.label,actorKind:n.actor.kind,dateTime:v(n.occurredAt),detail:q[n.sourceKind].label,...n.href===null?{}:{href:n.href},id:n.eventKey,...n.service===null?{}:{service:n.service},time:U(n.occurredAt),title:n.title}}),Y=e=>{switch(e._tag){case`authenticated`:return e.session.permission===`workspace-owner`;case`storage-unavailable`:return e.session?.permission===`workspace-owner`;case`anonymous`:case`blocked`:case`checking`:case`unavailable`:return!1}},X=(e,t,n,r)=>{let i=new URLSearchParams(t);return i.set(`event`,r),f(e,`?${i.toString()}`,n)},Z=({events:e})=>{let t=(0,k.useMemo)(()=>new Map([[`action`,e.filter(({sourceKind:e})=>e===`action`).length],[`relationship`,e.filter(({sourceKind:e})=>e===`relationship`).length],[`plugin-sync`,e.filter(({sourceKind:e})=>e===`plugin-sync`).length],[`system`,e.filter(({sourceKind:e})=>e===`system`).length]]),[e]);return(0,P.jsx)(`dl`,{className:z.summary,children:G.map(e=>(0,P.jsxs)(`div`,{"data-source":e,children:[(0,P.jsx)(`dt`,{children:q[e].label}),(0,P.jsx)(`dd`,{children:t.get(e)??0})]},e))})},Q=({detailTransport:e,transport:t=B}={})=>{let i=r(),a=u(),o=p(a.state),[c,m]=(0,k.useState)({actorKind:`all`,from:``,to:``}),[h,_]=(0,k.useState)(null),v=H(c,o,a.invalidateSession,t),y=f(i.pathname,i.search,i.hash),b=Y(a.state);if(v.state._tag===`idle`||v.state._tag===`loading`)return(0,P.jsx)(s,{description:`Combining durable activity across your connected services.`,title:`Loading Timeline`});if(v.state._tag===`failed`)return(0,P.jsx)(s,{action:(0,P.jsx)(l,{onClick:v.retry,children:`Try again`}),description:`The Timeline could not be read.`,title:`Timeline unavailable`});let x=v.state;return(0,P.jsxs)(`article`,{className:z.page,children:[(0,P.jsxs)(`header`,{className:z.hero,children:[(0,P.jsx)(g,{as:`p`,tone:`secondary`,variant:`label`,children:`Timeline`}),(0,P.jsxs)(g,{as:`h1`,variant:`verdict`,children:[`Everything`,(0,P.jsx)(`br`,{}),`that moved.`]}),(0,P.jsx)(g,{className:z.intro,tone:`secondary`,variant:`body-large`,children:`One chronological truth across people, agents, code, delivery links, and connected services.`}),(0,P.jsx)(n,{className:z.askRelay,to:y,children:`Ask Relay about this Timeline`})]}),(0,P.jsx)(Z,{events:x.events}),(0,P.jsxs)(`section`,{"aria-label":`Timeline filters`,className:z.filters,children:[(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`Actor`}),(0,P.jsx)(`select`,{value:c.actorKind,onChange:e=>m({...c,actorKind:K(e.currentTarget.value)}),children:W.map(e=>(0,P.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`From`}),(0,P.jsx)(`input`,{type:`date`,value:c.from,onChange:e=>m({...c,from:e.currentTarget.value})})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`To`}),(0,P.jsx)(`input`,{type:`date`,value:c.to,onChange:e=>m({...c,to:e.currentTarget.value})})]})]}),x.events.length===0?(0,P.jsx)(s,{description:`Try a wider date range or another actor.`,title:`No activity in this view`}):(0,P.jsx)(d,{component:O,children:(0,P.jsx)(`ol`,{className:z.events,children:x.events.map((e,t)=>(0,P.jsx)(J,{actor:b?(0,P.jsxs)(`span`,{className:z.rowActor,children:[(0,P.jsx)(`span`,{children:e.actor.label}),(0,P.jsx)(l,{onClick:()=>_(e),size:`compact`,variant:`quiet`,children:`Inspect`})]}):void 0,continued:t<x.events.length-1,event:e},e.eventKey))})}),x.nextCursor===null?null:(0,P.jsx)(l,{disabled:x.isLoadingMore,onClick:v.loadMore,size:`principal`,stretch:!0,children:x.isLoadingMore?`Loading…`:`Show earlier activity`}),(0,P.jsx)(R,{agentHref:h===null?y:X(i.pathname,i.search,i.hash,h.eventKey),event:h,onClose:()=>_(null),onSessionExpired:a.invalidateSession,sessionKey:o,...e===void 0?{}:{transport:e}})]})};export{Q as TimelinePage,Y as canInspectTimelineDetails,X as timelineEventAgentPath};
2
+ //# sourceMappingURL=TimelinePage-Cj3V98uI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimelinePage-DvpgD8AY.js","names":[],"sources":["../../../src/client/timeline/TimelineDetailSheet.module.css","../../../src/client/timeline/useTimelineDetail.ts","../../../src/client/timeline/TimelineDetailSheet.tsx","../../../src/client/timeline/TimelinePage.module.css","../../../src/client/timeline/useTimeline.ts","../../../src/client/timeline/TimelinePage.tsx"],"sourcesContent":[".body,\n.loading,\n.content,\n.identity,\n.identityMeta,\n.section,\n.ledger {\n display: grid;\n}\n\n.body,\n.loading,\n.content {\n gap: var(--rly-space-20);\n}\n\n.identity,\n.section {\n gap: var(--rly-space-12);\n}\n\n.identity {\n padding-block: var(--rly-space-12) var(--rly-space-20);\n border-block-end: 1px solid var(--rly-color-border-1);\n}\n\n.identity h2,\n.identity p,\n.section h3,\n.ledger dd {\n margin: 0;\n}\n\n.identity h2 {\n max-inline-size: 13ch;\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.identityMeta {\n grid-template-columns: repeat(2, minmax(0, max-content));\n align-items: center;\n gap: var(--rly-space-8) var(--rly-space-12);\n}\n\n.ledger {\n margin: 0;\n}\n\n.ledger div {\n display: grid;\n grid-template-columns: minmax(7rem, 0.35fr) minmax(0, 1fr);\n gap: var(--rly-space-12);\n padding-block: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.ledger dt {\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}\n\n.ledger dd {\n overflow-wrap: anywhere;\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height)\n var(--rly-type-code-font);\n}\n\n.footerLink {\n min-block-size: 3rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding-inline: var(--rly-space-16);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-align: center;\n text-decoration: none;\n}\n\n.footerLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 30rem) {\n .identityMeta,\n .ledger div {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineEvent, TimelineEventDetail } from \"../../domain/timeline.js\"\n\n/** Browser boundary for one exact owner-only Timeline event expansion. */\nexport interface TimelineDetailTransport {\n readonly load: (eventKey: TimelineEvent[\"eventKey\"], signal: AbortSignal) => Promise<TimelineEventDetail>\n}\n\nexport type TimelineDetailState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly detail: TimelineEventDetail\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for an owner-authorized event detail read. */\nexport const browserTimelineDetailTransport: TimelineDetailTransport = {\n load: (eventKey, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.detail({ params: { eventKey } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep a detail result bound to the exact event and authenticated session that requested it. */\nexport const useTimelineDetail = (\n eventKey: TimelineEvent[\"eventKey\"] | null,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineDetailTransport = browserTimelineDetailTransport\n): { readonly retry: () => void; readonly state: TimelineDetailState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineDetailState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (eventKey === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", eventKey, sessionKey })\n transport.load(eventKey, abort.signal).then(\n (detail) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", detail, eventKey, sessionKey })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", eventKey, sessionKey })\n }\n )\n return () => abort.abort()\n }, [eventKey, onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: TimelineDetailState = eventKey === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.eventKey !== eventKey || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", eventKey, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { TimelineEvent, TimelineEventDetail, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport styles from \"./TimelineDetailSheet.module.css\"\nimport { type TimelineDetailTransport, useTimelineDetail } from \"./useTimelineDetail.js\"\n\nconst sourceLabels: Readonly<Record<TimelineSourceKind, string>> = {\n action: \"Governed action\",\n \"plugin-sync\": \"Service sync\",\n relationship: \"Delivery link\",\n system: \"Control Center\"\n}\n\nconst formatTimestamp = (event: TimelineEvent): string =>\n DateTime.formatUtc(event.occurredAt, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n second: \"2-digit\",\n year: \"numeric\"\n })\n\n/** Non-secret durable references that make one owner-visible event attributable. */\nexport const timelineDetailLedger = (\n detail: TimelineEventDetail\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n const optionalEntries: ReadonlyArray<{ readonly label: string; readonly value: string | null }> = [\n { label: \"Actor\", value: detail.identifiers.actorId },\n { label: \"Agent job\", value: detail.agentJob?.jobId ?? null },\n { label: \"Action\", value: detail.identifiers.actionId },\n { label: \"Relationship\", value: detail.identifiers.relationshipId },\n { label: \"Connection\", value: detail.identifiers.pluginConnectionId },\n { label: \"Release\", value: detail.identifiers.releaseId },\n { label: \"Entity\", value: detail.identifiers.entityId }\n ]\n return [\n { label: \"Event\", value: detail.event.eventKey },\n { label: \"Type\", value: detail.event.eventType },\n ...optionalEntries.filter(\n (entry): entry is { readonly label: string; readonly value: string } => entry.value !== null\n )\n ]\n}\n\n/** Owner-only expansion of one redacted Timeline row into its durable provenance. */\nexport const TimelineDetailSheet = ({\n agentHref,\n event,\n onClose,\n onSessionExpired,\n sessionKey,\n transport\n}: {\n readonly agentHref: string\n readonly event: TimelineEvent | null\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly sessionKey: string | null\n readonly transport?: TimelineDetailTransport\n}): ReactElement => {\n const controller = useTimelineDetail(event?.eventKey ?? null, sessionKey, onSessionExpired, transport)\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={event !== null}\n >\n <Sheet.Content\n closeLabel=\"Close event details\"\n description=\"Durable provenance for this exact workspace event.\"\n title=\"Event details\"\n >\n <Sheet.Body className={styles.body}>\n {event === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading event details\" className={styles.loading}>\n <Skeleton height=\"10rem\" />\n <Skeleton height=\"14rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline row remains unchanged. Its provenance could not be loaded.\"\n title=\"Event details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"timeline-detail-title\" className={styles.identity}>\n <Text tone=\"secondary\" variant=\"label\">\n {sourceLabels[controller.state.detail.event.sourceKind]}\n </Text>\n <Text as=\"h2\" id=\"timeline-detail-title\" variant=\"page-title\">\n {controller.state.detail.event.title}\n </Text>\n <div className={styles.identityMeta}>\n <StateLabel\n label={controller.state.detail.event.actor.kind}\n size=\"compact\"\n tone={controller.state.detail.event.actor.kind === \"agent\" ? \"progress\" : \"neutral\"}\n />\n {controller.state.detail.event.service === null ? null : (\n <ServiceMark service={controller.state.detail.event.service} size=\"compact\" />\n )}\n <Text tone=\"secondary\" variant=\"meta\">\n {controller.state.detail.event.actor.label}\n </Text>\n <Text\n as=\"time\"\n dateTime={DateTime.formatIso(controller.state.detail.event.occurredAt)}\n tone=\"secondary\"\n variant=\"meta\"\n >\n {formatTimestamp(controller.state.detail.event)} UTC\n </Text>\n </div>\n </section>\n\n <section aria-labelledby=\"timeline-provenance-title\" className={styles.section}>\n <Text as=\"h3\" id=\"timeline-provenance-title\" variant=\"section-title\">\n Provenance\n </Text>\n <dl className={styles.ledger}>\n {timelineDetailLedger(controller.state.detail).map(({ label, value }) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n </section>\n </div>\n )}\n </Sheet.Body>\n <Sheet.Footer>\n <Link className={styles.footerLink} to={agentHref}>\n Ask Relay about this event\n </Link>\n </Sheet.Footer>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n",".page,\n.hero,\n.page {\n gap: clamp(2.5rem, 7vw, 6rem);\n}\n\n.hero {\n gap: var(--rly-space-16);\n}\n\n.hero p,\n.hero h1 {\n margin: 0;\n}\n\n.hero h1 {\n max-inline-size: 9ch;\n letter-spacing: -0.075em;\n text-wrap: balance;\n}\n\n.intro {\n max-inline-size: 46rem;\n}\n\n.askRelay {\n inline-size: fit-content;\n min-block-size: 3.5rem;\n display: inline-flex;\n align-items: center;\n padding-inline: var(--rly-space-20);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.summary {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n margin: 0;\n overflow: hidden;\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n}\n\n.summary div {\n display: grid;\n gap: var(--rly-space-12);\n min-block-size: 8rem;\n padding: var(--rly-space-20);\n background: var(--rly-color-surface-1);\n}\n\n.summary div + div {\n border-inline-start: 1px solid var(--rly-color-border-1);\n}\n\n.summary 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.summary dd {\n margin: 0;\n color: var(--rly-color-text-1);\n font-size: clamp(2.5rem, 6vw, 5rem);\n font-weight: 700;\n line-height: 0.9;\n letter-spacing: -0.07em;\n}\n\n.summary div[data-source=\"action\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codecommit);\n}\n.summary div[data-source=\"relationship\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codepipeline);\n}\n.summary div[data-source=\"plugin-sync\"] {\n box-shadow: inset 0 4px var(--rly-color-service-jira);\n}\n.summary div[data-source=\"system\"] {\n box-shadow: inset 0 4px var(--rly-color-focus);\n}\n\n.filters {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n gap: var(--rly-space-12);\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-8);\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.filters select,\n.filters input {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\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: inherit;\n}\n\n.events {\n margin: 0;\n padding: 0;\n list-style: none;\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.rowActor {\n display: grid;\n gap: var(--rly-space-8);\n justify-items: start;\n}\n\n@media (max-width: 48rem) {\n .summary {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .summary div:nth-child(3) {\n border-inline-start: 0;\n }\n .summary div:nth-child(n + 3) {\n border-block-start: 1px solid var(--rly-color-border-1);\n }\n .filters {\n grid-template-columns: 1fr;\n }\n}\n","import * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineActorKind, TimelineCursor, TimelineEvent, TimelinePage } from \"../../domain/timeline.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\n\n/** User-controlled Timeline filters. */\nexport interface TimelineFilters {\n readonly actorKind: TimelineActorKind | \"all\"\n readonly from: string\n readonly to: string\n}\n\n/** Browser transport boundary for Timeline tests and authenticated reads. */\nexport interface TimelineTransport {\n readonly load: (\n signal: AbortSignal,\n filters: TimelineFilters,\n cursor: TimelineCursor | null\n ) => Promise<TimelinePage>\n}\n\nexport type TimelineState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly events: ReadonlyArray<TimelineEvent>\n readonly isLoadingMore: boolean\n readonly nextCursor: TimelineCursor | null\n }\n\n/** Generated-client transport for the authenticated Timeline page. */\nexport const browserTimelineTransport: TimelineTransport = {\n load: (signal, filters, cursor) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n const from = filters.from.length === 0\n ? undefined\n : yield* Schema.decodeUnknownEffect(UtcTimestamp)(`${filters.from}T00:00:00.000Z`)\n const to = filters.to.length === 0\n ? undefined\n : yield* Schema.decodeUnknownEffect(UtcTimestamp)(`${filters.to}T23:59:59.999Z`)\n return yield* client.timeline.page({\n query: {\n ...(filters.actorKind === \"all\" ? {} : { actor: filters.actorKind }),\n ...(cursor === null\n ? {}\n : { beforeEventKey: cursor.eventKey, beforeOccurredAt: cursor.occurredAt }),\n ...(from === undefined ? {} : { from }),\n limit: 50,\n ...(to === undefined ? {} : { to })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load and incrementally page one exact authenticated Timeline filter set. */\nexport const useTimeline = (\n filters: TimelineFilters,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineTransport = browserTimelineTransport\n): {\n readonly loadMore: () => void\n readonly retry: () => void\n readonly state: TimelineState\n} => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineState>({ _tag: \"idle\" })\n const activeRequest = useRef<AbortController | null>(null)\n const filterKey = `${filters.actorKind}|${filters.from}|${filters.to}`\n\n useEffect(() => {\n activeRequest.current?.abort()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n activeRequest.current = request\n setState({ _tag: \"loading\" })\n transport.load(request.signal, filters, null).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({ _tag: \"ready\", events: page.events, isLoadingMore: false, nextCursor: page.nextCursor })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [filterKey, filters, onSessionExpired, requestRevision, sessionKey, transport])\n\n const loadMore = useCallback((): void => {\n if (sessionKey === null || state._tag !== \"ready\" || state.nextCursor === null || state.isLoadingMore) return\n activeRequest.current?.abort()\n const request = new AbortController()\n activeRequest.current = request\n const current = state\n setState({ ...current, isLoadingMore: true })\n transport.load(request.signal, filters, current.nextCursor).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({\n _tag: \"ready\",\n events: [...current.events, ...page.events],\n isLoadingMore: false,\n nextCursor: page.nextCursor\n })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ ...current, isLoadingMore: false })\n }\n )\n }, [filters, onSessionExpired, sessionKey, state, transport])\n\n return {\n loadMore,\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state\n }\n}\n\n/** Compact UTC timestamp for Timeline rows. */\nexport const formatTimelineTimestamp = (timestamp: TimelineEvent[\"occurredAt\"]): string =>\n new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n }).format(DateTime.toDateUtc(timestamp))\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { TimelineRow as RlyTimelineRow } from \"@knpkv/rly/patterns\"\nimport { Button, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type ReactElement, type ReactNode, useMemo, useState } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport type { TimelineActorKind, TimelineEvent, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport { browserReadableSessionKey, type BrowserSessionState, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport { WorkspaceEntityLink } from \"../entities/WorkspaceEntityLink.js\"\nimport { TimelineDetailSheet } from \"./TimelineDetailSheet.js\"\nimport type { TimelineDetailTransport } from \"./useTimelineDetail.js\"\nimport styles from \"./TimelinePage.module.css\"\nimport {\n browserTimelineTransport,\n formatTimelineTimestamp,\n type TimelineFilters,\n type TimelineTransport,\n useTimeline\n} from \"./useTimeline.js\"\n\nconst actorOptions: ReadonlyArray<{ readonly label: string; readonly value: TimelineActorKind | \"all\" }> = [\n { label: \"Everyone\", value: \"all\" },\n { label: \"People\", value: \"human\" },\n { label: \"Agents\", value: \"agent\" },\n { label: \"Services\", value: \"plugin\" },\n { label: \"System\", value: \"system\" }\n]\nconst timelineSources: ReadonlyArray<TimelineSourceKind> = [\"action\", \"relationship\", \"plugin-sync\", \"system\"]\n\nconst actorFilter = (value: string): TimelineFilters[\"actorKind\"] =>\n actorOptions.find((option) => option.value === value)?.value ?? \"all\"\n\nconst sourcePresentation: Readonly<Record<TimelineSourceKind, { readonly label: string }>> = {\n action: { label: \"Governed action\" },\n \"plugin-sync\": { label: \"Service sync\" },\n relationship: { label: \"Delivery link\" },\n system: { label: \"Control Center\" }\n}\n\nconst TimelineRow = ({\n actor,\n continued,\n event\n}: {\n readonly actor?: ReactNode\n readonly continued: boolean\n readonly event: TimelineEvent\n}): ReactElement => (\n <RlyTimelineRow\n continued={continued}\n event={{\n actor: actor ?? event.actor.label,\n actorKind: event.actor.kind,\n dateTime: DateTime.formatIso(event.occurredAt),\n detail: sourcePresentation[event.sourceKind].label,\n ...(event.href === null ? {} : { href: event.href }),\n id: event.eventKey,\n ...(event.service === null ? {} : { service: event.service }),\n time: formatTimelineTimestamp(event.occurredAt),\n title: event.title\n }}\n />\n)\n\n/** Only workspace owners can deliberately expand redacted Timeline rows. */\nexport const canInspectTimelineDetails = (state: BrowserSessionState): boolean => {\n switch (state._tag) {\n case \"authenticated\":\n return state.session.permission === \"workspace-owner\"\n case \"storage-unavailable\":\n return state.session?.permission === \"workspace-owner\"\n case \"anonymous\":\n case \"blocked\":\n case \"checking\":\n case \"unavailable\":\n return false\n }\n}\n\n/** Preserve one selected event alongside the current Timeline filters for Relay. */\nexport const timelineEventAgentPath = (\n pathname: string,\n search: string,\n hash: string,\n eventKey: TimelineEvent[\"eventKey\"]\n): string => {\n const context = new URLSearchParams(search)\n context.set(\"event\", eventKey)\n return contextualAgentPath(pathname, `?${context.toString()}`, hash)\n}\n\nconst SourceSummary = ({ events }: { readonly events: ReadonlyArray<TimelineEvent> }): ReactElement => {\n const totals = useMemo(\n () =>\n new Map<TimelineSourceKind, number>([\n [\"action\", events.filter(({ sourceKind }) => sourceKind === \"action\").length],\n [\"relationship\", events.filter(({ sourceKind }) => sourceKind === \"relationship\").length],\n [\"plugin-sync\", events.filter(({ sourceKind }) => sourceKind === \"plugin-sync\").length],\n [\"system\", events.filter(({ sourceKind }) => sourceKind === \"system\").length]\n ]),\n [events]\n )\n return (\n <dl className={styles.summary}>\n {timelineSources.map((source) => {\n return (\n <div data-source={source} key={source}>\n <dt>{sourcePresentation[source].label}</dt>\n <dd>{totals.get(source) ?? 0}</dd>\n </div>\n )\n })}\n </dl>\n )\n}\n\n/** Bird's-eye view of attributable human, agent, service, and system activity. */\nexport const TimelinePage = ({\n detailTransport,\n transport = browserTimelineTransport\n}: {\n readonly detailTransport?: TimelineDetailTransport\n readonly transport?: TimelineTransport\n} = {}): ReactElement => {\n const location = useLocation()\n const browserSession = useBrowserSession()\n const sessionKey = browserReadableSessionKey(browserSession.state)\n const [filters, setFilters] = useState<TimelineFilters>({ actorKind: \"all\", from: \"\", to: \"\" })\n const [selectedEvent, setSelectedEvent] = useState<TimelineEvent | null>(null)\n const controller = useTimeline(filters, sessionKey, browserSession.invalidateSession, transport)\n const agentHref = contextualAgentPath(location.pathname, location.search, location.hash)\n const canInspect = canInspectTimelineDetails(browserSession.state)\n\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <StatePanel description=\"Combining durable activity across your connected services.\" title=\"Loading Timeline\" />\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline could not be read.\"\n title=\"Timeline unavailable\"\n />\n )\n }\n const timelineState = controller.state\n\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Timeline\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Everything\n <br />\n that moved.\n </Text>\n <Text className={styles.intro} tone=\"secondary\" variant=\"body-large\">\n One chronological truth across people, agents, code, delivery links, and connected services.\n </Text>\n <Link className={styles.askRelay} to={agentHref}>\n Ask Relay about this Timeline\n </Link>\n </header>\n\n <SourceSummary events={timelineState.events} />\n\n <section aria-label=\"Timeline filters\" className={styles.filters}>\n <label>\n <span>Actor</span>\n <select\n value={filters.actorKind}\n onChange={(event) => setFilters({ ...filters, actorKind: actorFilter(event.currentTarget.value) })}\n >\n {actorOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>From</span>\n <input\n type=\"date\"\n value={filters.from}\n onChange={(event) => setFilters({ ...filters, from: event.currentTarget.value })}\n />\n </label>\n <label>\n <span>To</span>\n <input\n type=\"date\"\n value={filters.to}\n onChange={(event) => setFilters({ ...filters, to: event.currentTarget.value })}\n />\n </label>\n </section>\n\n {timelineState.events.length === 0 ? (\n <StatePanel description=\"Try a wider date range or another actor.\" title=\"No activity in this view\" />\n ) : (\n <LinkProvider component={WorkspaceEntityLink}>\n <ol className={styles.events}>\n {timelineState.events.map((event, index) => (\n <TimelineRow\n actor={\n canInspect ? (\n <span className={styles.rowActor}>\n <span>{event.actor.label}</span>\n <Button onClick={() => setSelectedEvent(event)} size=\"compact\" variant=\"quiet\">\n Inspect\n </Button>\n </span>\n ) : undefined\n }\n continued={index < timelineState.events.length - 1}\n event={event}\n key={event.eventKey}\n />\n ))}\n </ol>\n </LinkProvider>\n )}\n {timelineState.nextCursor === null ? null : (\n <Button disabled={timelineState.isLoadingMore} onClick={controller.loadMore} size=\"principal\" stretch>\n {timelineState.isLoadingMore ? \"Loading…\" : \"Show earlier activity\"}\n </Button>\n )}\n <TimelineDetailSheet\n agentHref={\n selectedEvent === null\n ? agentHref\n : timelineEventAgentPath(location.pathname, location.search, location.hash, selectedEvent.eventKey)\n }\n event={selectedEvent}\n onClose={() => setSelectedEvent(null)}\n onSessionExpired={browserSession.invalidateSession}\n sessionKey={sessionKey}\n {...(detailTransport === undefined ? {} : { transport: detailTransport })}\n />\n </article>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TimelinePage-Cj3V98uI.js","names":[],"sources":["../../../src/client/timeline/TimelineDetailSheet.module.css","../../../src/client/timeline/useTimelineDetail.ts","../../../src/client/timeline/TimelineDetailSheet.tsx","../../../src/client/timeline/TimelinePage.module.css","../../../src/client/timeline/useTimeline.ts","../../../src/client/timeline/TimelinePage.tsx"],"sourcesContent":[".body,\n.loading,\n.content,\n.identity,\n.identityMeta,\n.section,\n.ledger {\n display: grid;\n}\n\n.body,\n.loading,\n.content {\n gap: var(--rly-space-20);\n}\n\n.identity,\n.section {\n gap: var(--rly-space-12);\n}\n\n.identity {\n padding-block: var(--rly-space-12) var(--rly-space-20);\n border-block-end: 1px solid var(--rly-color-border-1);\n}\n\n.identity h2,\n.identity p,\n.section h3,\n.ledger dd {\n margin: 0;\n}\n\n.identity h2 {\n max-inline-size: 13ch;\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.identityMeta {\n grid-template-columns: repeat(2, minmax(0, max-content));\n align-items: center;\n gap: var(--rly-space-8) var(--rly-space-12);\n}\n\n.ledger {\n margin: 0;\n}\n\n.ledger div {\n display: grid;\n grid-template-columns: minmax(7rem, 0.35fr) minmax(0, 1fr);\n gap: var(--rly-space-12);\n padding-block: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.ledger dt {\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}\n\n.ledger dd {\n overflow-wrap: anywhere;\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height)\n var(--rly-type-code-font);\n}\n\n.footerLink {\n min-block-size: 3rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding-inline: var(--rly-space-16);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-align: center;\n text-decoration: none;\n}\n\n.footerLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 30rem) {\n .identityMeta,\n .ledger div {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineEvent, TimelineEventDetail } from \"../../domain/timeline.js\"\n\n/** Browser boundary for one exact owner-only Timeline event expansion. */\nexport interface TimelineDetailTransport {\n readonly load: (eventKey: TimelineEvent[\"eventKey\"], signal: AbortSignal) => Promise<TimelineEventDetail>\n}\n\nexport type TimelineDetailState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly detail: TimelineEventDetail\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for an owner-authorized event detail read. */\nexport const browserTimelineDetailTransport: TimelineDetailTransport = {\n load: (eventKey, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.detail({ params: { eventKey } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep a detail result bound to the exact event and authenticated session that requested it. */\nexport const useTimelineDetail = (\n eventKey: TimelineEvent[\"eventKey\"] | null,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineDetailTransport = browserTimelineDetailTransport\n): { readonly retry: () => void; readonly state: TimelineDetailState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineDetailState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (eventKey === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", eventKey, sessionKey })\n transport.load(eventKey, abort.signal).then(\n (detail) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", detail, eventKey, sessionKey })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", eventKey, sessionKey })\n }\n )\n return () => abort.abort()\n }, [eventKey, onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: TimelineDetailState = eventKey === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.eventKey !== eventKey || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", eventKey, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { TimelineEvent, TimelineEventDetail, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport styles from \"./TimelineDetailSheet.module.css\"\nimport { type TimelineDetailTransport, useTimelineDetail } from \"./useTimelineDetail.js\"\n\nconst sourceLabels: Readonly<Record<TimelineSourceKind, string>> = {\n action: \"Governed action\",\n \"plugin-sync\": \"Service sync\",\n relationship: \"Delivery link\",\n system: \"Control Center\"\n}\n\nconst formatTimestamp = (event: TimelineEvent): string =>\n DateTime.formatUtc(event.occurredAt, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n second: \"2-digit\",\n year: \"numeric\"\n })\n\n/** Non-secret durable references that make one owner-visible event attributable. */\nexport const timelineDetailLedger = (\n detail: TimelineEventDetail\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n const optionalEntries: ReadonlyArray<{ readonly label: string; readonly value: string | null }> = [\n { label: \"Actor\", value: detail.identifiers.actorId },\n { label: \"Agent job\", value: detail.agentJob?.jobId ?? null },\n { label: \"Action\", value: detail.identifiers.actionId },\n { label: \"Relationship\", value: detail.identifiers.relationshipId },\n { label: \"Connection\", value: detail.identifiers.pluginConnectionId },\n { label: \"Release\", value: detail.identifiers.releaseId },\n { label: \"Entity\", value: detail.identifiers.entityId }\n ]\n return [\n { label: \"Event\", value: detail.event.eventKey },\n { label: \"Type\", value: detail.event.eventType },\n ...optionalEntries.filter(\n (entry): entry is { readonly label: string; readonly value: string } => entry.value !== null\n )\n ]\n}\n\n/** Owner-only expansion of one redacted Timeline row into its durable provenance. */\nexport const TimelineDetailSheet = ({\n agentHref,\n event,\n onClose,\n onSessionExpired,\n sessionKey,\n transport\n}: {\n readonly agentHref: string\n readonly event: TimelineEvent | null\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly sessionKey: string | null\n readonly transport?: TimelineDetailTransport\n}): ReactElement => {\n const controller = useTimelineDetail(event?.eventKey ?? null, sessionKey, onSessionExpired, transport)\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={event !== null}\n >\n <Sheet.Content\n closeLabel=\"Close event details\"\n description=\"Durable provenance for this exact workspace event.\"\n title=\"Event details\"\n >\n <Sheet.Body className={styles.body}>\n {event === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading event details\" className={styles.loading}>\n <Skeleton height=\"10rem\" />\n <Skeleton height=\"14rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline row remains unchanged. Its provenance could not be loaded.\"\n title=\"Event details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"timeline-detail-title\" className={styles.identity}>\n <Text tone=\"secondary\" variant=\"label\">\n {sourceLabels[controller.state.detail.event.sourceKind]}\n </Text>\n <Text as=\"h2\" id=\"timeline-detail-title\" variant=\"page-title\">\n {controller.state.detail.event.title}\n </Text>\n <div className={styles.identityMeta}>\n <StateLabel\n label={controller.state.detail.event.actor.kind}\n size=\"compact\"\n tone={controller.state.detail.event.actor.kind === \"agent\" ? \"progress\" : \"neutral\"}\n />\n {controller.state.detail.event.service === null ? null : (\n <ServiceMark service={controller.state.detail.event.service} size=\"compact\" />\n )}\n <Text tone=\"secondary\" variant=\"meta\">\n {controller.state.detail.event.actor.label}\n </Text>\n <Text\n as=\"time\"\n dateTime={DateTime.formatIso(controller.state.detail.event.occurredAt)}\n tone=\"secondary\"\n variant=\"meta\"\n >\n {formatTimestamp(controller.state.detail.event)} UTC\n </Text>\n </div>\n </section>\n\n <section aria-labelledby=\"timeline-provenance-title\" className={styles.section}>\n <Text as=\"h3\" id=\"timeline-provenance-title\" variant=\"section-title\">\n Provenance\n </Text>\n <dl className={styles.ledger}>\n {timelineDetailLedger(controller.state.detail).map(({ label, value }) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n </section>\n </div>\n )}\n </Sheet.Body>\n <Sheet.Footer>\n <Link className={styles.footerLink} to={agentHref}>\n Ask Relay about this event\n </Link>\n </Sheet.Footer>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n",".page,\n.hero,\n.page {\n gap: clamp(2.5rem, 7vw, 6rem);\n}\n\n.hero {\n gap: var(--rly-space-16);\n}\n\n.hero p,\n.hero h1 {\n margin: 0;\n}\n\n.hero h1 {\n max-inline-size: 9ch;\n letter-spacing: -0.075em;\n text-wrap: balance;\n}\n\n.intro {\n max-inline-size: 46rem;\n}\n\n.askRelay {\n inline-size: fit-content;\n min-block-size: 3.5rem;\n display: inline-flex;\n align-items: center;\n padding-inline: var(--rly-space-20);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.summary {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n margin: 0;\n overflow: hidden;\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n}\n\n.summary div {\n display: grid;\n gap: var(--rly-space-12);\n min-block-size: 8rem;\n padding: var(--rly-space-20);\n background: var(--rly-color-surface-1);\n}\n\n.summary div + div {\n border-inline-start: 1px solid var(--rly-color-border-1);\n}\n\n.summary 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.summary dd {\n margin: 0;\n color: var(--rly-color-text-1);\n font-size: clamp(2.5rem, 6vw, 5rem);\n font-weight: 700;\n line-height: 0.9;\n letter-spacing: -0.07em;\n}\n\n.summary div[data-source=\"action\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codecommit);\n}\n.summary div[data-source=\"relationship\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codepipeline);\n}\n.summary div[data-source=\"plugin-sync\"] {\n box-shadow: inset 0 4px var(--rly-color-service-jira);\n}\n.summary div[data-source=\"system\"] {\n box-shadow: inset 0 4px var(--rly-color-focus);\n}\n\n.filters {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n gap: var(--rly-space-12);\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-8);\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.filters select,\n.filters input {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\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: inherit;\n}\n\n.events {\n margin: 0;\n padding: 0;\n list-style: none;\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.rowActor {\n display: grid;\n gap: var(--rly-space-8);\n justify-items: start;\n}\n\n@media (max-width: 48rem) {\n .summary {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .summary div:nth-child(3) {\n border-inline-start: 0;\n }\n .summary div:nth-child(n + 3) {\n border-block-start: 1px solid var(--rly-color-border-1);\n }\n .filters {\n grid-template-columns: 1fr;\n }\n}\n","import * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineActorKind, TimelineCursor, TimelineEvent, TimelinePage } from \"../../domain/timeline.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\n\n/** User-controlled Timeline filters. */\nexport interface TimelineFilters {\n readonly actorKind: TimelineActorKind | \"all\"\n readonly from: string\n readonly to: string\n}\n\n/** Browser transport boundary for Timeline tests and authenticated reads. */\nexport interface TimelineTransport {\n readonly load: (\n signal: AbortSignal,\n filters: TimelineFilters,\n cursor: TimelineCursor | null\n ) => Promise<TimelinePage>\n}\n\nexport type TimelineState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly events: ReadonlyArray<TimelineEvent>\n readonly isLoadingMore: boolean\n readonly nextCursor: TimelineCursor | null\n }\n\n/** Generated-client transport for the authenticated Timeline page. */\nexport const browserTimelineTransport: TimelineTransport = {\n load: (signal, filters, cursor) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n const from = filters.from.length === 0\n ? undefined\n : yield* Schema.decodeUnknownEffect(UtcTimestamp)(`${filters.from}T00:00:00.000Z`)\n const to = filters.to.length === 0\n ? undefined\n : yield* Schema.decodeUnknownEffect(UtcTimestamp)(`${filters.to}T23:59:59.999Z`)\n return yield* client.timeline.page({\n query: {\n ...(filters.actorKind === \"all\" ? {} : { actor: filters.actorKind }),\n ...(cursor === null\n ? {}\n : { beforeEventKey: cursor.eventKey, beforeOccurredAt: cursor.occurredAt }),\n ...(from === undefined ? {} : { from }),\n limit: 50,\n ...(to === undefined ? {} : { to })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load and incrementally page one exact authenticated Timeline filter set. */\nexport const useTimeline = (\n filters: TimelineFilters,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineTransport = browserTimelineTransport\n): {\n readonly loadMore: () => void\n readonly retry: () => void\n readonly state: TimelineState\n} => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineState>({ _tag: \"idle\" })\n const activeRequest = useRef<AbortController | null>(null)\n const filterKey = `${filters.actorKind}|${filters.from}|${filters.to}`\n\n useEffect(() => {\n activeRequest.current?.abort()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n activeRequest.current = request\n setState({ _tag: \"loading\" })\n transport.load(request.signal, filters, null).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({ _tag: \"ready\", events: page.events, isLoadingMore: false, nextCursor: page.nextCursor })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [filterKey, filters, onSessionExpired, requestRevision, sessionKey, transport])\n\n const loadMore = useCallback((): void => {\n if (sessionKey === null || state._tag !== \"ready\" || state.nextCursor === null || state.isLoadingMore) return\n activeRequest.current?.abort()\n const request = new AbortController()\n activeRequest.current = request\n const current = state\n setState({ ...current, isLoadingMore: true })\n transport.load(request.signal, filters, current.nextCursor).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({\n _tag: \"ready\",\n events: [...current.events, ...page.events],\n isLoadingMore: false,\n nextCursor: page.nextCursor\n })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ ...current, isLoadingMore: false })\n }\n )\n }, [filters, onSessionExpired, sessionKey, state, transport])\n\n return {\n loadMore,\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state\n }\n}\n\n/** Compact UTC timestamp for Timeline rows. */\nexport const formatTimelineTimestamp = (timestamp: TimelineEvent[\"occurredAt\"]): string =>\n new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n }).format(DateTime.toDateUtc(timestamp))\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { TimelineRow as RlyTimelineRow } from \"@knpkv/rly/patterns\"\nimport { Button, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type ReactElement, type ReactNode, useMemo, useState } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport type { TimelineActorKind, TimelineEvent, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport { browserReadableSessionKey, type BrowserSessionState, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport { WorkspaceEntityLink } from \"../entities/WorkspaceEntityLink.js\"\nimport { TimelineDetailSheet } from \"./TimelineDetailSheet.js\"\nimport type { TimelineDetailTransport } from \"./useTimelineDetail.js\"\nimport styles from \"./TimelinePage.module.css\"\nimport {\n browserTimelineTransport,\n formatTimelineTimestamp,\n type TimelineFilters,\n type TimelineTransport,\n useTimeline\n} from \"./useTimeline.js\"\n\nconst actorOptions: ReadonlyArray<{ readonly label: string; readonly value: TimelineActorKind | \"all\" }> = [\n { label: \"Everyone\", value: \"all\" },\n { label: \"People\", value: \"human\" },\n { label: \"Agents\", value: \"agent\" },\n { label: \"Services\", value: \"plugin\" },\n { label: \"System\", value: \"system\" }\n]\nconst timelineSources: ReadonlyArray<TimelineSourceKind> = [\"action\", \"relationship\", \"plugin-sync\", \"system\"]\n\nconst actorFilter = (value: string): TimelineFilters[\"actorKind\"] =>\n actorOptions.find((option) => option.value === value)?.value ?? \"all\"\n\nconst sourcePresentation: Readonly<Record<TimelineSourceKind, { readonly label: string }>> = {\n action: { label: \"Governed action\" },\n \"plugin-sync\": { label: \"Service sync\" },\n relationship: { label: \"Delivery link\" },\n system: { label: \"Control Center\" }\n}\n\nconst TimelineRow = ({\n actor,\n continued,\n event\n}: {\n readonly actor?: ReactNode\n readonly continued: boolean\n readonly event: TimelineEvent\n}): ReactElement => (\n <RlyTimelineRow\n continued={continued}\n event={{\n actor: actor ?? event.actor.label,\n actorKind: event.actor.kind,\n dateTime: DateTime.formatIso(event.occurredAt),\n detail: sourcePresentation[event.sourceKind].label,\n ...(event.href === null ? {} : { href: event.href }),\n id: event.eventKey,\n ...(event.service === null ? {} : { service: event.service }),\n time: formatTimelineTimestamp(event.occurredAt),\n title: event.title\n }}\n />\n)\n\n/** Only workspace owners can deliberately expand redacted Timeline rows. */\nexport const canInspectTimelineDetails = (state: BrowserSessionState): boolean => {\n switch (state._tag) {\n case \"authenticated\":\n return state.session.permission === \"workspace-owner\"\n case \"storage-unavailable\":\n return state.session?.permission === \"workspace-owner\"\n case \"anonymous\":\n case \"blocked\":\n case \"checking\":\n case \"unavailable\":\n return false\n }\n}\n\n/** Preserve one selected event alongside the current Timeline filters for Relay. */\nexport const timelineEventAgentPath = (\n pathname: string,\n search: string,\n hash: string,\n eventKey: TimelineEvent[\"eventKey\"]\n): string => {\n const context = new URLSearchParams(search)\n context.set(\"event\", eventKey)\n return contextualAgentPath(pathname, `?${context.toString()}`, hash)\n}\n\nconst SourceSummary = ({ events }: { readonly events: ReadonlyArray<TimelineEvent> }): ReactElement => {\n const totals = useMemo(\n () =>\n new Map<TimelineSourceKind, number>([\n [\"action\", events.filter(({ sourceKind }) => sourceKind === \"action\").length],\n [\"relationship\", events.filter(({ sourceKind }) => sourceKind === \"relationship\").length],\n [\"plugin-sync\", events.filter(({ sourceKind }) => sourceKind === \"plugin-sync\").length],\n [\"system\", events.filter(({ sourceKind }) => sourceKind === \"system\").length]\n ]),\n [events]\n )\n return (\n <dl className={styles.summary}>\n {timelineSources.map((source) => {\n return (\n <div data-source={source} key={source}>\n <dt>{sourcePresentation[source].label}</dt>\n <dd>{totals.get(source) ?? 0}</dd>\n </div>\n )\n })}\n </dl>\n )\n}\n\n/** Bird's-eye view of attributable human, agent, service, and system activity. */\nexport const TimelinePage = ({\n detailTransport,\n transport = browserTimelineTransport\n}: {\n readonly detailTransport?: TimelineDetailTransport\n readonly transport?: TimelineTransport\n} = {}): ReactElement => {\n const location = useLocation()\n const browserSession = useBrowserSession()\n const sessionKey = browserReadableSessionKey(browserSession.state)\n const [filters, setFilters] = useState<TimelineFilters>({ actorKind: \"all\", from: \"\", to: \"\" })\n const [selectedEvent, setSelectedEvent] = useState<TimelineEvent | null>(null)\n const controller = useTimeline(filters, sessionKey, browserSession.invalidateSession, transport)\n const agentHref = contextualAgentPath(location.pathname, location.search, location.hash)\n const canInspect = canInspectTimelineDetails(browserSession.state)\n\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <StatePanel description=\"Combining durable activity across your connected services.\" title=\"Loading Timeline\" />\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline could not be read.\"\n title=\"Timeline unavailable\"\n />\n )\n }\n const timelineState = controller.state\n\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Timeline\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Everything\n <br />\n that moved.\n </Text>\n <Text className={styles.intro} tone=\"secondary\" variant=\"body-large\">\n One chronological truth across people, agents, code, delivery links, and connected services.\n </Text>\n <Link className={styles.askRelay} to={agentHref}>\n Ask Relay about this Timeline\n </Link>\n </header>\n\n <SourceSummary events={timelineState.events} />\n\n <section aria-label=\"Timeline filters\" className={styles.filters}>\n <label>\n <span>Actor</span>\n <select\n value={filters.actorKind}\n onChange={(event) => setFilters({ ...filters, actorKind: actorFilter(event.currentTarget.value) })}\n >\n {actorOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>From</span>\n <input\n type=\"date\"\n value={filters.from}\n onChange={(event) => setFilters({ ...filters, from: event.currentTarget.value })}\n />\n </label>\n <label>\n <span>To</span>\n <input\n type=\"date\"\n value={filters.to}\n onChange={(event) => setFilters({ ...filters, to: event.currentTarget.value })}\n />\n </label>\n </section>\n\n {timelineState.events.length === 0 ? (\n <StatePanel description=\"Try a wider date range or another actor.\" title=\"No activity in this view\" />\n ) : (\n <LinkProvider component={WorkspaceEntityLink}>\n <ol className={styles.events}>\n {timelineState.events.map((event, index) => (\n <TimelineRow\n actor={\n canInspect ? (\n <span className={styles.rowActor}>\n <span>{event.actor.label}</span>\n <Button onClick={() => setSelectedEvent(event)} size=\"compact\" variant=\"quiet\">\n Inspect\n </Button>\n </span>\n ) : undefined\n }\n continued={index < timelineState.events.length - 1}\n event={event}\n key={event.eventKey}\n />\n ))}\n </ol>\n </LinkProvider>\n )}\n {timelineState.nextCursor === null ? null : (\n <Button disabled={timelineState.isLoadingMore} onClick={controller.loadMore} size=\"principal\" stretch>\n {timelineState.isLoadingMore ? \"Loading…\" : \"Show earlier activity\"}\n </Button>\n )}\n <TimelineDetailSheet\n agentHref={\n selectedEvent === null\n ? agentHref\n : timelineEventAgentPath(location.pathname, location.search, location.hash, selectedEvent.eventKey)\n }\n event={selectedEvent}\n onClose={() => setSelectedEvent(null)}\n onSessionExpired={browserSession.invalidateSession}\n sessionKey={sessionKey}\n {...(detailTransport === undefined ? {} : { transport: detailTransport })}\n />\n </article>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{t as n,u as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{n as a,r as o,s}from"./workspaceEntityRoutes-2TejMrzb.js";import{n as c,t as l}from"./workspaceScrollCapture-BsjcWVsk.js";var u=e(t(),1),d=i(),f=(e,t)=>{let n=s(e);return n===null?void 0:o(t.state,n.workspaceId,n.entityId,a(t))},p=(0,u.forwardRef)(function({href:e,onClick:t,...i},a){let o=r(),s=f(e,o);return(0,d.jsx)(n,{...i,onClick:n=>{t?.(n),s!==void 0&&c(n,n.currentTarget.target)&&l(o,e)},ref:a,state:s,to:e})});export{f as n,p as t};
2
- //# sourceMappingURL=WorkspaceEntityLink-DPj6MKI2.js.map
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{t as n,u as r}from"./lib-BzlsKFNV.js";import{t as i}from"./jsx-runtime-By8HlURe.js";import{n as a,r as o,s}from"./workspaceEntityRoutes-DqqDa0AB.js";import{n as c,t as l}from"./workspaceScrollCapture-BYNfR2wo.js";var u=e(t(),1),d=i(),f=(e,t)=>{let n=s(e);return n===null?void 0:o(t.state,n.workspaceId,n.entityId,a(t))},p=(0,u.forwardRef)(function({href:e,onClick:t,...i},a){let o=r(),s=f(e,o);return(0,d.jsx)(n,{...i,onClick:n=>{t?.(n),s!==void 0&&c(n,n.currentTarget.target)&&l(o,e)},ref:a,state:s,to:e})});export{f as n,p as t};
2
+ //# sourceMappingURL=WorkspaceEntityLink-C_rc8lxi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceEntityLink-DPj6MKI2.js","names":[],"sources":["../../../src/client/entities/WorkspaceEntityLink.tsx"],"sourcesContent":["import type { RlyLinkProps } from \"@knpkv/rly/foundations\"\nimport { forwardRef, type ReactElement } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport {\n entityOriginFromLocation,\n makeWorkspaceEntityRouteState,\n workspaceEntityTargetFromHref\n} from \"../items/workspaceEntityRoutes.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Preserve the validated root origin when an Rly relationship opens another canonical entity. */\nexport const workspaceEntityStateForHref = (href: string, location: RouterLocationParts): unknown => {\n const target = workspaceEntityTargetFromHref(href)\n return target === null\n ? undefined\n : makeWorkspaceEntityRouteState(\n location.state,\n target.workspaceId,\n target.entityId,\n entityOriginFromLocation(location)\n )\n}\n\n/** React Router bridge installed only inside lazy entity-aware route chunks. */\nexport const WorkspaceEntityLink = forwardRef<HTMLAnchorElement, RlyLinkProps>(function WorkspaceEntityLink(\n { href, onClick, ...props },\n ref\n): ReactElement {\n const location = useLocation()\n const state = workspaceEntityStateForHref(href, location)\n return (\n <Link\n {...props}\n onClick={(event) => {\n onClick?.(event)\n if (state !== undefined && shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)) {\n rememberWorkspaceScrollPosition(location, href)\n }\n }}\n ref={ref}\n state={state}\n to={href}\n />\n )\n})\n"],"mappings":"uUAmBa,GAA+B,EAAc,IAA2C,CACnG,IAAM,EAAS,EAA8B,CAAI,EACjD,OAAO,IAAW,KACd,IAAA,GACA,EACE,EAAS,MACT,EAAO,YACP,EAAO,SACP,EAAyB,CAAQ,CACnC,CACN,EAGa,GAAA,EAAA,EAAA,WAAA,CAAkE,SAC7E,CAAE,OAAM,UAAS,GAAG,GACpB,EACc,CACd,IAAM,EAAW,EAAY,EACvB,EAAQ,EAA4B,EAAM,CAAQ,EACxD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EACJ,QAAU,GAAU,CAClB,IAAU,CAAK,EACX,IAAU,IAAA,IAAa,EAAsC,EAAO,EAAM,cAAc,MAAM,GAChG,EAAgC,EAAU,CAAI,CAElD,EACK,MACE,QACP,GAAI,CACL,CAAA,CAEL,CAAC"}
1
+ {"version":3,"file":"WorkspaceEntityLink-C_rc8lxi.js","names":[],"sources":["../../../src/client/entities/WorkspaceEntityLink.tsx"],"sourcesContent":["import type { RlyLinkProps } from \"@knpkv/rly/foundations\"\nimport { forwardRef, type ReactElement } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport {\n entityOriginFromLocation,\n makeWorkspaceEntityRouteState,\n workspaceEntityTargetFromHref\n} from \"../items/workspaceEntityRoutes.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Preserve the validated root origin when an Rly relationship opens another canonical entity. */\nexport const workspaceEntityStateForHref = (href: string, location: RouterLocationParts): unknown => {\n const target = workspaceEntityTargetFromHref(href)\n return target === null\n ? undefined\n : makeWorkspaceEntityRouteState(\n location.state,\n target.workspaceId,\n target.entityId,\n entityOriginFromLocation(location)\n )\n}\n\n/** React Router bridge installed only inside lazy entity-aware route chunks. */\nexport const WorkspaceEntityLink = forwardRef<HTMLAnchorElement, RlyLinkProps>(function WorkspaceEntityLink(\n { href, onClick, ...props },\n ref\n): ReactElement {\n const location = useLocation()\n const state = workspaceEntityStateForHref(href, location)\n return (\n <Link\n {...props}\n onClick={(event) => {\n onClick?.(event)\n if (state !== undefined && shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)) {\n rememberWorkspaceScrollPosition(location, href)\n }\n }}\n ref={ref}\n state={state}\n to={href}\n />\n )\n})\n"],"mappings":"uUAmBa,GAA+B,EAAc,IAA2C,CACnG,IAAM,EAAS,EAA8B,CAAI,EACjD,OAAO,IAAW,KACd,IAAA,GACA,EACE,EAAS,MACT,EAAO,YACP,EAAO,SACP,EAAyB,CAAQ,CACnC,CACN,EAGa,GAAA,EAAA,EAAA,WAAA,CAAkE,SAC7E,CAAE,OAAM,UAAS,GAAG,GACpB,EACc,CACd,IAAM,EAAW,EAAY,EACvB,EAAQ,EAA4B,EAAM,CAAQ,EACxD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EACJ,QAAU,GAAU,CAClB,IAAU,CAAK,EACX,IAAU,IAAA,IAAa,EAAsC,EAAO,EAAM,cAAc,MAAM,GAChG,EAAgC,EAAU,CAAI,CAElD,EACK,MACE,QACP,GAAI,CACL,CAAA,CAEL,CAAC"}
@@ -0,0 +1 @@
1
+ ._state_13ab1_1{outline:none;place-items:center;min-block-size:60dvh;display:grid}._state_13ab1_1>*{inline-size:min(100%,42rem)}._loading_13ab1_12,._loadingColumns_13ab1_13,._content_13ab1_14,._entityActions_13ab1_15,._deliveryPath_13ab1_16,._facts_13ab1_17,._evidence_13ab1_18,._activity_13ab1_19,._sectionHeading_13ab1_20{display:grid}._loading_13ab1_12{gap:var(--rly-space-32);min-block-size:60dvh}._loadingColumns_13ab1_13{gap:var(--rly-space-24);grid-template-columns:minmax(var(--rly-space-0), 1fr) minmax(var(--rly-space-0), 20rem)}._back_13ab1_34,._principalAction_13ab1_35,._releasePath_13ab1_36 a{color:inherit;font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-underline-offset:var(--rly-space-4)}._back_13ab1_34:focus-visible,._principalAction_13ab1_35:focus-visible,._releasePath_13ab1_36 a:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-4)}._principalAction_13ab1_35{background:var(--rly-color-action-background);border-radius:var(--rly-radius-control);color:var(--rly-color-action-foreground);font-size:var(--rly-type-body-large-size);min-block-size:var(--rly-space-48);padding-inline:var(--rly-space-24);justify-content:center;align-items:center;text-decoration:none;display:inline-flex}._entityActions_13ab1_15{gap:var(--rly-space-8)}._pageSynchronization_13ab1_67{gap:var(--rly-space-6);display:grid}._pageSynchronization_13ab1_67>button{inline-size:100%}._secondaryAction_13ab1_76{border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-control);color:var(--rly-color-text-1);font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);min-block-size:var(--rly-space-40);padding-inline:var(--rly-space-20);justify-content:center;align-items:center;text-decoration:none;display:inline-flex}._secondaryAction_13ab1_76:hover{background:var(--rly-color-surface-2);border-color:var(--rly-color-service-confluence)}._secondaryAction_13ab1_76:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-4)}._content_13ab1_14{gap:var(--rly-space-24)}._deliveryPath_13ab1_16{gap:var(--rly-space-20)}._sectionHeading_13ab1_20{gap:var(--rly-space-4)}._pathRail_13ab1_112{align-items:stretch;gap:var(--rly-space-12);min-inline-size:var(--rly-space-0);padding-block:var(--rly-space-4);display:flex;overflow-x:auto}._pathNode_13ab1_121,._pathEmpty_13ab1_122,._releasePath_13ab1_36 li{background:var(--rly-color-surface-2);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-control);align-items:center;gap:var(--rly-space-12);min-block-size:var(--rly-space-48);padding:var(--rly-space-12) var(--rly-space-16);flex:none;display:flex}._pathNode_13ab1_121>span{gap:var(--rly-space-2);display:grid}._pathNode_13ab1_121 code,._pathEmpty_13ab1_122{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)}._releasePath_13ab1_36{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none;display:contents}._releasePath_13ab1_36 li:before{color:var(--rly-color-text-3);content:"→";margin-inline-end:var(--rly-space-4)}._facts_13ab1_17,._evidence_13ab1_18{gap:var(--rly-space-16)}._facts_13ab1_17 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._facts_13ab1_17 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(6rem, .65fr) minmax(var(--rly-space-0), 1fr);display:grid}._facts_13ab1_17 dt{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)}._facts_13ab1_17 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._workingCircle_13ab1_190{--entity-accent:var(--rly-color-focus);isolation:isolate;min-inline-size:var(--rly-space-0);position:relative;overflow:hidden}._workingCircle_13ab1_190:before{block-size:calc(var(--rly-space-64) * 2);border:1px solid color-mix(in srgb, var(--entity-accent) 46%, var(--rly-color-border-1));border-radius:var(--rly-radius-round);content:"";inline-size:calc(var(--rly-space-64) * 2);pointer-events:none;z-index:-1;position:absolute;inset-block-start:calc(var(--rly-space-64) * -1);inset-inline-end:calc(var(--rly-space-48) * -1)}._shell_13ab1_212[data-service=codecommit] ._workingCircle_13ab1_190{--entity-accent:var(--rly-color-service-codecommit)}._shell_13ab1_212[data-service=codepipeline] ._workingCircle_13ab1_190{--entity-accent:var(--rly-color-service-codepipeline)}._shell_13ab1_212[data-service=jira] ._workingCircle_13ab1_190{--entity-accent:var(--rly-color-service-jira)}._shell_13ab1_212[data-service=confluence] ._workingCircle_13ab1_190{--entity-accent:var(--rly-color-service-confluence)}._shell_13ab1_212[data-service=clockify] ._workingCircle_13ab1_190{--entity-accent:var(--rly-color-service-clockify)}._activity_13ab1_19{gap:var(--rly-space-24)}._timeline_13ab1_236{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}@media (width<=44rem){._loadingColumns_13ab1_13,._facts_13ab1_17 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}@media (prefers-reduced-motion:reduce){._pathRail_13ab1_112{scroll-behavior:auto}}._document_1mruv_1,._ledger_1mruv_2,._ledgerBody_1mruv_3,._ledgerBody_1mruv_3 header,._primaryFacts_1mruv_5,._primaryFacts_1mruv_5>div,._section_1mruv_7,._sectionHeading_1mruv_8,._entry_1mruv_9,._entry_1mruv_9 dl,._entry_1mruv_9 dl>div,._attribution_1mruv_12,._attribution_1mruv_12>div,._attribution_1mruv_12 ul,._attribution_1mruv_12 li,._attribution_1mruv_12 a,._people_1mruv_17,._people_1mruv_17>div,._readOnly_1mruv_19{display:grid}._document_1mruv_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._ledger_1mruv_2{background:color-mix(in srgb, var(--rly-color-service-clockify) 8%, var(--rly-color-surface-2));border:1px solid color-mix(in srgb, var(--rly-color-service-clockify) 46%, var(--rly-color-border-1));border-radius:var(--rly-radius-control);grid-template-columns:minmax(13rem, .42fr) minmax(var(--rly-space-0), 1fr);overflow:hidden}._total_1mruv_36{background:color-mix(in srgb, var(--rly-color-service-clockify) 82%, var(--rly-color-text-1));color:var(--rly-color-surface-1);min-block-size:15rem;padding:var(--rly-space-32);flex-direction:column;align-content:center;display:flex}._total_1mruv_36 span,._total_1mruv_36 small,._ledgerBody_1mruv_3 header>span,._primaryFacts_1mruv_5 dt,._entry_1mruv_9 dt,._attribution_1mruv_12 small,._people_1mruv_17 dt{font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._total_1mruv_36 strong{font:var(--rly-type-page-title-weight) var(--rly-type-page-title-size) / var(--rly-type-page-title-line-height) var(--rly-type-page-title-font);letter-spacing:-.05em;margin-block:var(--rly-space-8)}._ledgerBody_1mruv_3{align-content:space-between;gap:var(--rly-space-24);padding:var(--rly-space-32)}._ledgerBody_1mruv_3 header{align-items:center;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._ledgerBody_1mruv_3 p{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);margin:var(--rly-space-0);max-inline-size:46ch}._primaryFacts_1mruv_5{gap:var(--rly-space-12) var(--rly-space-24);grid-template-columns:repeat(3, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._primaryFacts_1mruv_5>div,._entry_1mruv_9 dl>div,._people_1mruv_17>div{gap:var(--rly-space-4)}._primaryFacts_1mruv_5 dt,._entry_1mruv_9 dt,._people_1mruv_17 dt{color:var(--rly-color-text-2)}._primaryFacts_1mruv_5 dd,._entry_1mruv_9 dd,._people_1mruv_17 dd{margin:var(--rly-space-0);overflow-wrap:anywhere}._section_1mruv_7{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_1mruv_8{gap:var(--rly-space-4)}._entry_1mruv_9{align-items:center;gap:var(--rly-space-24);grid-template-columns:auto minmax(var(--rly-space-0), 1fr)}._entry_1mruv_9>strong{color:var(--rly-color-service-clockify);font:var(--rly-type-verdict-weight) var(--rly-type-verdict-size) / var(--rly-type-verdict-line-height) var(--rly-type-verdict-font)}._entry_1mruv_9 dl,._people_1mruv_17{gap:var(--rly-space-12) var(--rly-space-24);grid-template-columns:repeat(3, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._attribution_1mruv_12{border-inline-start:var(--rly-space-4) solid var(--rly-color-service-clockify);gap:var(--rly-space-20);padding:var(--rly-space-20)}._attribution_1mruv_12[data-state=missing]{background:var(--rly-color-held-tint);border-inline-start-color:var(--rly-color-held-ink)}._attribution_1mruv_12>div{gap:var(--rly-space-4)}._attribution_1mruv_12 p{color:var(--rly-color-text-2);margin:var(--rly-space-0)}._attribution_1mruv_12 ul{gap:var(--rly-space-8);margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._attribution_1mruv_12 a{border-block-start:1px solid var(--rly-color-border-1);color:inherit;gap:var(--rly-space-4);padding-block:var(--rly-space-12);text-decoration:none}._attribution_1mruv_12 a:hover strong,._attribution_1mruv_12 a:focus-visible strong{color:var(--rly-color-service-jira)}._attribution_1mruv_12 a:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-4)}._attribution_1mruv_12 a>span{color:var(--rly-color-service-jira);font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._attribution_1mruv_12 small{color:var(--rly-color-text-2)}._people_1mruv_17{grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr))}._readOnly_1mruv_19{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-field);align-items:center;gap:var(--rly-space-4) var(--rly-space-16);grid-template-columns:auto minmax(var(--rly-space-0), 1fr);padding:var(--rly-space-16) var(--rly-space-20)}._readOnly_1mruv_19 strong{color:var(--rly-color-service-clockify)}._readOnly_1mruv_19 span{color:var(--rly-color-text-2)}@media (width<=52rem){._ledger_1mruv_2,._entry_1mruv_9{grid-template-columns:minmax(var(--rly-space-0), 1fr)}._total_1mruv_36{min-block-size:auto}._primaryFacts_1mruv_5,._entry_1mruv_9 dl,._people_1mruv_17{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}@media (prefers-reduced-motion:reduce){._document_1mruv_1 *{scroll-behavior:auto}}._document_1dvhb_1,._folio_1dvhb_2,._revision_1dvhb_3,._folioMeta_1dvhb_4,._folioMeta_1dvhb_4 dl,._folioMeta_1dvhb_4 dl>div,._section_1dvhb_7,._sectionHeading_1dvhb_8,._collections_1dvhb_9,._versions_1dvhb_10,._versions_1dvhb_10>li,._attachments_1dvhb_12,._attachments_1dvhb_12>li,._contentState_1dvhb_14,._documentRead_1dvhb_15,._editorEntry_1dvhb_16,._visualEditor_1dvhb_17,._editorHeading_1dvhb_18,._editorActions_1dvhb_19,._editorToolbar_1dvhb_20,._releaseTasks_1dvhb_21,._releaseTaskHeading_1dvhb_22,._releaseTaskList_1dvhb_23,._releaseTaskList_1dvhb_23>li,._evidenceCount_1dvhb_25{display:grid}._document_1dvhb_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._folio_1dvhb_2{background:color-mix(in srgb, var(--rly-color-service-confluence) 8%, var(--rly-color-surface-2));border:1px solid color-mix(in srgb, var(--rly-color-service-confluence) 48%, var(--rly-color-border-1));border-inline-start:var(--rly-space-8) solid var(--rly-color-service-confluence);border-radius:var(--rly-radius-control);gap:var(--rly-space-32);grid-template-columns:minmax(10rem, .42fr) minmax(var(--rly-space-0), 1fr);padding:var(--rly-space-32)}._revision_1dvhb_3{align-content:start;gap:var(--rly-space-4)}._revision_1dvhb_3 span,._folioMeta_1dvhb_4 dt,._versions_1dvhb_10 small,._attachments_1dvhb_12 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)}._revision_1dvhb_3 strong{color:var(--rly-color-service-confluence);font:var(--rly-type-page-title-weight) var(--rly-type-page-title-size) / var(--rly-type-page-title-line-height) var(--rly-type-page-title-font);overflow-wrap:anywhere}._folioMeta_1dvhb_4{align-content:space-between;gap:var(--rly-space-24);justify-items:start}._folioMeta_1dvhb_4 dl{gap:var(--rly-space-12) var(--rly-space-32);grid-template-columns:repeat(3, minmax(var(--rly-space-0), 1fr));inline-size:100%;margin:var(--rly-space-0)}._folioMeta_1dvhb_4 dl>div{gap:var(--rly-space-4)}._folioMeta_1dvhb_4 dd{margin:var(--rly-space-0);overflow-wrap:anywhere}._section_1dvhb_7{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_1dvhb_8{gap:var(--rly-space-4)}._richText_1dvhb_97{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);overflow-wrap:anywhere;max-inline-size:62ch}._richText_1dvhb_97>:first-child{margin-block-start:var(--rly-space-0)}._richText_1dvhb_97>:last-child{margin-block-end:var(--rly-space-0)}._richText_1dvhb_97 a{color:var(--rly-color-service-confluence)}._richText_1dvhb_97 pre{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-field);padding:var(--rly-space-16);overflow:auto}._richText_1dvhb_97 blockquote{border-inline-start:2px solid var(--rly-color-service-confluence);margin-inline:var(--rly-space-0);padding-inline-start:var(--rly-space-16)}._contentState_1dvhb_14{background:var(--rly-color-surface-2);border-inline-start:var(--rly-space-4) solid var(--rly-color-service-confluence);gap:var(--rly-space-8);padding:var(--rly-space-20)}._documentRead_1dvhb_15,._visualEditor_1dvhb_17{gap:var(--rly-space-24)}._releaseTasks_1dvhb_21{background:color-mix(in srgb, var(--rly-color-service-confluence) 5%, var(--rly-color-surface-2));border:1px solid color-mix(in srgb, var(--rly-color-service-confluence) 28%, var(--rly-color-border-1));border-radius:var(--rly-radius-group);gap:var(--rly-space-16);max-inline-size:62ch;padding:var(--rly-space-20)}._releaseTaskHeading_1dvhb_22{align-items:baseline;gap:var(--rly-space-12);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._releaseTaskList_1dvhb_23{gap:var(--rly-space-8);margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._releaseTaskList_1dvhb_23>li{align-items:center;gap:var(--rly-space-12);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._releaseTaskList_1dvhb_23 label{cursor:pointer;align-items:start;gap:var(--rly-space-12);display:flex}._releaseTaskList_1dvhb_23 input{accent-color:var(--rly-color-service-confluence);block-size:var(--rly-space-20);inline-size:var(--rly-space-20);margin:var(--rly-space-0)}._releaseTaskList_1dvhb_23 input:disabled+span{color:var(--rly-color-text-2);cursor:not-allowed}._editorEntry_1dvhb_16{align-items:center;gap:var(--rly-space-12);grid-template-columns:repeat(2, max-content) minmax(var(--rly-space-0), 1fr)}._visualEditor_1dvhb_17{background:color-mix(in srgb, var(--rly-color-service-confluence) 4%, var(--rly-color-surface-1));border:1px solid color-mix(in srgb, var(--rly-color-service-confluence) 36%, var(--rly-color-border-1));border-radius:var(--rly-radius-group);padding:var(--rly-space-24)}._editorHeading_1dvhb_18{align-items:start;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._editorHeading_1dvhb_18>div:first-child{gap:var(--rly-space-4);display:grid}._editorActions_1dvhb_19{gap:var(--rly-space-8);flex-wrap:wrap;display:flex}._editorToolbar_1dvhb_20{background:var(--rly-color-surface-2);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-field);padding:var(--rly-space-4);grid-auto-columns:max-content;grid-auto-flow:column;gap:1px;overflow-x:auto}._editorToolbar_1dvhb_20 button{border-radius:var(--rly-radius-control);color:var(--rly-color-text-1);cursor:pointer;font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);padding:var(--rly-space-8) var(--rly-space-12);white-space:nowrap;background:0 0;border:0}._editorToolbar_1dvhb_20 button:hover{background:var(--rly-color-surface-1)}._editorToolbar_1dvhb_20 button:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:1px}._editorCanvas_1dvhb_250{background:var(--rly-color-surface-1);border:1px solid var(--rly-color-border-2);border-radius:var(--rly-radius-field);min-block-size:24rem;max-inline-size:none;padding:clamp(var(--rly-space-24), 5vw, var(--rly-space-48));outline:none}._editorCanvas_1dvhb_250:focus{border-color:var(--rly-color-service-confluence);box-shadow:0 0 0 2px color-mix(in srgb, var(--rly-color-service-confluence) 22%, transparent)}._collections_1dvhb_9{gap:var(--rly-space-40);grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr))}._versions_1dvhb_10,._attachments_1dvhb_12{gap:var(--rly-space-0);margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._versions_1dvhb_10>li,._attachments_1dvhb_12>li{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-4);padding-block:var(--rly-space-16)}._versions_1dvhb_10>li:first-child,._attachments_1dvhb_12>li:first-child{padding-block-start:var(--rly-space-0)}._versions_1dvhb_10 strong{color:var(--rly-color-service-confluence);font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._attachments_1dvhb_12 span{color:var(--rly-color-text-2)}._evidenceCount_1dvhb_25{align-items:end;gap:var(--rly-space-12);grid-template-columns:auto minmax(var(--rly-space-0), 1fr)}._evidenceCount_1dvhb_25 strong{color:var(--rly-color-service-confluence);font:var(--rly-type-verdict-weight) var(--rly-type-verdict-size) / var(--rly-type-verdict-line-height) var(--rly-type-verdict-font)}@media (width<=52rem){._folio_1dvhb_2,._collections_1dvhb_9,._folioMeta_1dvhb_4 dl,._editorHeading_1dvhb_18,._editorEntry_1dvhb_16{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}@media (prefers-reduced-motion:reduce){._document_1dvhb_1 *{scroll-behavior:auto}}._document_1cny9_1,._section_1cny9_2,._sectionHeading_1cny9_3,._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6,._related_1cny9_7,._metadata_1cny9_8,._attribution_1cny9_9{display:grid}._document_1cny9_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._section_1cny9_2{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_1cny9_3{gap:var(--rly-space-4)}._richText_1cny9_28,._commentBody_1cny9_29{overflow-wrap:anywhere}._richText_1cny9_28{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);max-inline-size:58ch}._richText_1cny9_28>:first-child,._commentBody_1cny9_29>:first-child{margin-block-start:var(--rly-space-0)}._richText_1cny9_28>:last-child,._commentBody_1cny9_29>:last-child{margin-block-end:var(--rly-space-0)}._richText_1cny9_28 pre,._commentBody_1cny9_29 pre{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-field);max-inline-size:100%;padding:var(--rly-space-16);overflow:auto}._richText_1cny9_28 blockquote,._commentBody_1cny9_29 blockquote{border-inline-start:2px solid var(--rly-color-border-2);margin-inline:var(--rly-space-0);padding-inline-start:var(--rly-space-16)}._richText_1cny9_28 a,._commentBody_1cny9_29 a{color:var(--rly-color-service-jira)}._criteria_1cny9_70{border-inline-start:var(--rly-space-4) solid var(--rly-color-service-jira);padding:var(--rly-space-8) var(--rly-space-24)}._boundaryNotice_1cny9_75,._collectionNotice_1cny9_76{border-radius:var(--rly-radius-field);margin:var(--rly-space-0);padding:var(--rly-space-12) var(--rly-space-16)}._boundaryNotice_1cny9_75{background:var(--rly-color-held-tint);color:var(--rly-color-held-ink)}._collectionNotice_1cny9_76{background:var(--rly-color-surface-2)}._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._people_1cny9_4{gap:var(--rly-space-20);grid-template-columns:repeat(auto-fit,minmax(13rem,1fr))}._metadata_1cny9_8{gap:var(--rly-space-0) var(--rly-space-32);grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._metadata_1cny9_8>div{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-6);padding-block:var(--rly-space-16);display:grid}._metadata_1cny9_8 dt,._history_1cny9_6 dt{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)}._metadata_1cny9_8 dd,._history_1cny9_6 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._related_1cny9_7{gap:var(--rly-space-12);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr))}._related_1cny9_7>div{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-control);gap:var(--rly-space-6);padding:var(--rly-space-16);display:grid}._related_1cny9_7 strong,._related_1cny9_7 a{font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._related_1cny9_7 a{color:var(--rly-color-service-jira);text-underline-offset:var(--rly-space-4);inline-size:fit-content;text-decoration-thickness:1px}._related_1cny9_7 small,._attribution_1cny9_9 time{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)}._conversation_1cny9_5,._history_1cny9_6{gap:var(--rly-space-0)}._conversation_1cny9_5>li,._history_1cny9_6>li{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-16);padding-block:var(--rly-space-24);display:grid}._conversation_1cny9_5>li:first-child,._history_1cny9_6>li:first-child{padding-block-start:var(--rly-space-0)}._attribution_1cny9_9{align-items:center;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._history_1cny9_6 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._history_1cny9_6 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(7rem, .35fr) minmax(var(--rly-space-0), 1fr);display:grid}@media (width<=44rem){._document_1cny9_1{gap:var(--rly-space-40)}._metadata_1cny9_8,._history_1cny9_6 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}._criteria_1cny9_70{padding-inline-end:var(--rly-space-0)}}._document_173oo_1,._hero_173oo_2,._heroHeading_173oo_3,._heroFacts_173oo_4,._heroFacts_173oo_4>div,._executionMeta_173oo_6,._section_173oo_7,._sectionHeading_173oo_8,._peopleLanes_173oo_9,._peopleLanes_173oo_9>div,._actions_173oo_11,._actions_173oo_11>li,._actions_173oo_11 header,._actions_173oo_11 header>span,._actions_173oo_11 dl,._actions_173oo_11 dl>div,._artifacts_173oo_17,._sourceArtifacts_173oo_18,._sourceArtifacts_173oo_18>li,._sourceArtifacts_173oo_18>li>span,._deliveryCounts_173oo_21{display:grid}._document_173oo_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._hero_173oo_2{background:color-mix(in srgb, var(--rly-color-service-codepipeline) 10%, var(--rly-color-surface-2));border:1px solid color-mix(in srgb, var(--rly-color-service-codepipeline) 50%, var(--rly-color-border-1));border-radius:var(--rly-radius-control);gap:var(--rly-space-24);padding:var(--rly-space-32)}._heroHeading_173oo_3{align-items:center;gap:var(--rly-space-8) var(--rly-space-16);grid-template-columns:auto minmax(var(--rly-space-0), 1fr) auto}._heroHeading_173oo_3>span,._heroFacts_173oo_4 dt,._executionMeta_173oo_6 dt,._peopleLanes_173oo_9 small,._actions_173oo_11 small,._actions_173oo_11 dt,._artifacts_173oo_17 span,._artifacts_173oo_17 small,._deliveryCounts_173oo_21 dt{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)}._heroHeading_173oo_3 strong{font:var(--rly-type-verdict-weight) var(--rly-type-verdict-size) / var(--rly-type-verdict-line-height) var(--rly-type-verdict-font);overflow-wrap:anywhere}._summary_173oo_64{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);margin:var(--rly-space-0);max-inline-size:62ch}._heroFacts_173oo_4{gap:var(--rly-space-16);grid-template-columns:repeat(4, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._heroFacts_173oo_4>div{background:var(--rly-color-surface-1);border-radius:var(--rly-radius-field);gap:var(--rly-space-8);padding:var(--rly-space-16)}._heroFacts_173oo_4 dd,._executionMeta_173oo_6 dd,._actions_173oo_11 dd,._deliveryCounts_173oo_21 dd{margin:var(--rly-space-0);overflow-wrap:anywhere}._heroFacts_173oo_4 dd{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)}._heroFacts_173oo_4 dd 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);margin-block-start:var(--rly-space-4);display:block}._heroFacts_173oo_4 code{font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._executionMeta_173oo_6{gap:var(--rly-space-12) var(--rly-space-24);grid-template-columns:repeat(4, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._stageRail_173oo_116{border-block:1px solid var(--rly-color-border-1);padding-block:var(--rly-space-32)}._section_173oo_7{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_173oo_8{gap:var(--rly-space-4)}._peopleLanes_173oo_9{gap:var(--rly-space-16);grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr))}._peopleLanes_173oo_9>div{border-inline-start:var(--rly-space-4) solid var(--rly-color-service-codepipeline);gap:var(--rly-space-8);padding:var(--rly-space-16)}._partial_173oo_142{background:color-mix(in srgb, var(--rly-color-service-codepipeline) 8%, var(--rly-color-surface-2));border-inline-start:var(--rly-space-4) solid var(--rly-color-service-codepipeline);margin:var(--rly-space-0);padding:var(--rly-space-16)}._actions_173oo_11{gap:var(--rly-space-16);margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._actions_173oo_11>li{border:1px solid var(--rly-color-border-1);border-inline-start:var(--rly-space-4) solid var(--rly-color-service-codepipeline);border-radius:var(--rly-radius-control);gap:var(--rly-space-16);padding:var(--rly-space-20)}._actions_173oo_11 header{align-items:start;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._actions_173oo_11 header>span{gap:var(--rly-space-2)}._actions_173oo_11 header strong{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)}._actions_173oo_11 dl{gap:var(--rly-space-8) var(--rly-space-24);grid-template-columns:repeat(4, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._actions_173oo_11 dl>div{gap:var(--rly-space-2)}._actions_173oo_11 p{margin:var(--rly-space-0)}._error_173oo_193{font-weight:700}._artifacts_173oo_17,._sourceArtifacts_173oo_18{gap:var(--rly-space-8);margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._artifacts_173oo_17>li{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-field);align-items:center;gap:var(--rly-space-8);padding:var(--rly-space-8) var(--rly-space-12);flex-wrap:wrap;display:flex}._artifacts_173oo_17 span{text-transform:uppercase}._artifacts_173oo_17 small{margin-inline-start:auto}._sourceArtifacts_173oo_18>li{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) minmax(var(--rly-space-0), 1fr);padding-block:var(--rly-space-12)}._sourceArtifacts_173oo_18>li>span{gap:var(--rly-space-4)}._sourceArtifacts_173oo_18 code{font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font);overflow-wrap:anywhere}._sourceArtifacts_173oo_18 small{color:var(--rly-color-text-2)}._deliveryCounts_173oo_21{gap:var(--rly-space-12);grid-template-columns:repeat(3, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._deliveryCounts_173oo_21>div{border-block-end:1px solid var(--rly-color-border-1);padding-block-end:var(--rly-space-12)}._deliveryCounts_173oo_21 dd{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)}@media (width<=52rem){._heroFacts_173oo_4,._executionMeta_173oo_6,._actions_173oo_11 dl{grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr))}}@media (width<=40rem){._heroHeading_173oo_3,._heroFacts_173oo_4,._executionMeta_173oo_6,._peopleLanes_173oo_9,._actions_173oo_11 dl,._sourceArtifacts_173oo_18>li,._deliveryCounts_173oo_21{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}
@@ -0,0 +1,14 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pullRequestReviewThreadReplay-CXHspFTr.js","assets/agent-api-Dl9TuGOJ.js","assets/client-Dq_XQE_l.js","assets/authenticatedMutationClient-DdowMjyo.js","assets/pullRequestReviewFailures-CyjTVnSX.js","assets/WorkspacePullRequestDetails-CizqydjN.js","assets/rolldown-runtime-QTnfLwEv.js","assets/react-CZI7_Jkm.js","assets/preload-helper-Czpn1I53.js","assets/jsx-runtime-By8HlURe.js","assets/patterns-5N-j-AD2-DLfaGePK.js","assets/PortalProvider-BpgZwSpw-aHWGwW1o.js","assets/react-dom-cJyBB_A4.js","assets/Dialog-xSrBk0Vv-ClGyDPlc.js","assets/component-BJeeRuSu-Bu7KhcFC.js","assets/index-zVjlBm9l.js","assets/lib-BzlsKFNV.js","assets/releasePaths-XoI2BHX3.js","assets/index-CZ1jqlt4.css","assets/primitives-nKxQGSsE-CJNmac__.js","assets/WorkspacePullRequestDetails.module-CCFLGO4V.js","assets/WorkspacePullRequestDetails-DrPltvYZ.css","assets/WorkspacePullRequestDiff.module-DJEWRmoT.js","assets/WorkspacePullRequestDiff-HJB-ezE4.css","assets/WorkspaceRichText-CCOciILO.js","assets/workbench-tHBnbqSx-BUtNhWVC.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{f as n,m as r,p as i,t as a,u as o}from"./lib-BzlsKFNV.js";import{t as s}from"./preload-helper-Czpn1I53.js";import{t as c}from"./jsx-runtime-By8HlURe.js";import{a as l,n as u,r as d,t as f}from"./Dialog-xSrBk0Vv-ClGyDPlc.js";import{d as p,f as m,u as h}from"./index-zVjlBm9l.js";import{_ as g,a as _,c as v,f as y,g as b,m as x,o as S,p as C,s as w,u as T,v as ee}from"./patterns-5N-j-AD2-DLfaGePK.js";import{r as E,t as te}from"./primitives-nKxQGSsE-CJNmac__.js";import{$i as ne,Br as re,Cn as ie,Fi as D,Hr as O,Ht as ae,Ir as k,Jn as A,Mn as oe,Nn as se,On as ce,Qn as le,Ur as ue,Yn as de,_i as j,aa as fe,ai as pe,bi as M,gi as me,ia as he,ja as N,jn as ge,oi as _e,pi as ve,si as ye,ti as be,va as xe,yi as Se,zr as Ce}from"./agent-api-Dl9TuGOJ.js";import{a as we}from"./client-Dq_XQE_l.js";import{n as Te,t as Ee}from"./BrowserCrypto-3BoTVFdl.js";import{a as De,i as Oe,o as ke,r as Ae}from"./releaseAgentTransport-DaO4svPu.js";import{n as je,t as Me}from"./workspaceEntityPaths-xAl2jRFm.js";import{a as Ne,i as Pe,o as Fe,t as Ie}from"./workspaceEntityRoutes-DqqDa0AB.js";import{i as Le,n as Re,r as ze}from"./presentWorkspaceItems-BOY3FbhO.js";import{t as Be}from"./authenticatedMutationClient-DdowMjyo.js";import{i as Ve,n as He,t as Ue}from"./confluenceTasks-DtKq8_eU.js";import{t as We}from"./WorkspaceEntityLink-C_rc8lxi.js";import{t as Ge}from"./connectionTestTransport-CPK98z7H.js";import{t as Ke}from"./WorkspaceRichText-CCOciILO.js";import{n as P,t as qe}from"./pullRequestReviewFailures-CyjTVnSX.js";var F=e(t(),1),Je=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),Ye=e=>e.split(/[_\-\s]+/u).filter(Boolean).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1).toLocaleLowerCase(`en-US`)}`).join(` `),Xe=e=>{let t=Math.floor(e/60),n=e%60;return t===0?`${String(n)}m`:n===0?`${String(t)}h`:`${String(t)}h ${String(n)}m`},Ze=e=>e==null?`Not synchronized`:Je.format(O(e)),Qe=e=>e==null?null:{dateTime:k(e),label:Je.format(O(e))},$e=e=>e.lifecycle._tag!==`missing`&&e.lifecycle._tag!==`rejected`&&e.lifecycle._tag!==`superseded`,et=(e,t)=>{let n=new Set(t.graph.nodes.flatMap(({nodeId:e,resolution:n})=>n._tag===`resolved`&&n.target._tag===`entity`&&n.target.entityId===t.entity.projection.entityId?[e]:[])),r=new Map;for(let{nodeId:e,resolution:n}of t.graph.nodes)n._tag===`resolved`&&n.target._tag===`entity`&&n.target.entityKind===`issue`&&r.set(e,n.target.entityId);let i=new Map;for(let{projection:e}of t.graph.relatedEntityProjections)e.entityState===`present`&&e.entityType===`issue`&&i.set(e.entityId,e);let a=new Map;for(let e of t.graph.relationships){if(e.kind!==`tracks-time-for`||!n.has(e.sourceNodeId)||!$e(e))continue;let t=r.get(e.targetNodeId),o=t===void 0?void 0:i.get(t);if(t===void 0||o===void 0)continue;let s=e.lifecycle._tag===`inferred`||e.confidence._tag===`inferred`,c=a.get(t);if(c===void 0){a.set(t,{evidenceClaimIds:new Set(e.evidenceClaimIds),issue:o,state:s?`inferred`:`linked`});continue}for(let t of e.evidenceClaimIds)c.evidenceClaimIds.add(t);s||(c.state=`linked`)}return[...a.entries()].map(([t,{evidenceClaimIds:n,issue:r,state:i}])=>({evidenceLabel:`${String(n.size)} evidence claim${n.size===1?``:`s`}`,href:je(e,t),key:r.displayKey,state:i,title:r.title}))},tt=(e,t,n)=>{let r=et(e,n),i=r.filter(({state:e})=>e===`inferred`).length,a=n.entity.owners.filter(({roles:e})=>e.some(e=>e.includes(`approver`))).map(({displayName:e})=>e),o=t.userId===void 0?void 0:n.entity.owners.find(({sourceIdentities:e})=>e?.some(({providerId:e,vendorPersonId:n})=>e===`clockify`&&n===t.userId)??!1);return{approvalDecidedAt:Qe(n.clockifyApproval?.decidedAt),approvalDetail:n.clockifyApproval===null?`No Control Center decision is recorded for this exact Clockify revision.`:n.clockifyApproval.rationale,approvalLabel:n.clockifyApproval===null?`Pending`:Ye(n.clockifyApproval.decision),approvers:a,associationDetail:r.length===0?`No current Jira relationship explains where this time belongs. The entry remains visible.`:i===0?`${String(r.length)} current Jira link${r.length===1?``:`s`}`:`${String(i)} inferred Jira link${i===1?``:`s`} — verify before reporting`,associationLabel:r.length===0?`Unattributed`:`Attributed`,billableLabel:t.billable?`Billable`:`Non-billable`,contributorLabel:o?.displayName??t.userId??`Contributor not synchronized`,description:t.description??n.entity.projection.title,durationLabel:Xe(t.durationMinutes),endedAt:Ze(t.endedAt),jiraAssociations:r,lockLabel:t.locked===void 0?`Lock state not synchronized`:t.locked?`Locked`:`Unlocked`,projectLabel:t.projectId??`No Clockify project`,rollupLabel:`1 visible entry · ${String(t.durationMinutes)} exact minute${t.durationMinutes===1?``:`s`}`,sourceRevision:n.source.revision,startedAt:Ze(t.startedAt),timerLabel:t.startedAt===void 0||t.endedAt===void 0?`Timer state not synchronized`:t.endedAt===null?`Timer running`:`Completed`,totalMinutes:t.durationMinutes}},nt=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),rt=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),I=e=>e===null?null:xe(Ce(e),{onNone:()=>e,onSome:e=>nt.format(O(e))}),L=e=>e.name??e.sourceId??`Not set`,it=e=>e===void 0||e.length===0?`Not set`:e.join(` · `),at=e=>({id:e,name:`Unknown collaborator`,role:`Jira collaborator`}),ot=e=>new Map((e.collaborators??[]).map(e=>{let t=e.roles.map(rt);return[e.sourcePersonId,{id:e.sourcePersonId,name:e.displayName,role:t.length===0?`Jira collaborator`:t.join(` · `),...e.avatarUrl===null?{}:{avatarSrc:e.avatarUrl}}]})),st=(e,t)=>({href:(()=>{if(t===null||e.key===null)return null;let n=/^(.*\/browse\/)[^/]+$/u.exec(t.pathname)?.[1];return n===void 0?null:`${t.origin}${n}${encodeURIComponent(e.key)}`})(),key:e.key??e.sourceId??`Unknown issue`,status:e.status===null?`Status unknown`:L(e.status),summary:e.summary??`Summary unavailable`}),ct=e=>{let t=e.project,n=(e.fixVersions??[]).map(L),r=(e.components??[]).map(L);return[{label:`Type`,value:e.issueType===null||e.issueType===void 0?`Not set`:L(e.issueType)},{label:`Project`,value:t==null?`Not set`:[t.key,t.name].filter(e=>e!==null).join(` · `)||`Not set`},{label:`Resolution`,value:e.resolution===null||e.resolution===void 0?`Unresolved`:L(e.resolution)},{label:`Labels`,value:it(e.labels)},{label:`Components`,value:it(r)},{label:`Fix versions`,value:it(n)},{label:`Created`,value:I(e.createdAt??null)??`Not available`},{label:`Updated`,value:I(e.updatedAt??null)??`Not available`},{label:`Due`,value:I(e.dueDate??null)??`Not set`}]},lt=(e,t)=>`${e??`Empty`} → ${t??`Empty`}`,ut=(e,t)=>{let n=ot(e),r=e=>e===null?at(`unknown-person`):n.get(e)??at(e),i=new Set(e.truncatedFields??[]),a=(e.comments??[]).map(e=>({author:r(e.authorSourcePersonId),body:e.body,id:e.sourceId,time:I(e.updatedAt??e.createdAt)})),o=(e.history??[]).map(e=>({actor:r(e.authorSourcePersonId),changes:e.changes.map(e=>({field:e.field,transition:lt(e.from,e.to)})),id:e.sourceId,time:I(e.createdAt)})),s=e.commentTotal??a.length,c=e.historyTotal??o.length,l=(e.commentsTruncated??!1)||s>a.length,u=(e.historyTruncated??!1)||c>o.length,d=[...i].filter(e=>e!==`comments`&&(e!==`history`||!u));return{acceptanceCriteria:e.acceptanceCriteria??null,collaborators:[...n.values()],commentCount:s,comments:a,commentBodiesTruncated:e.commentBodiesTruncated??(i.has(`comments`)&&!l),commentsTruncated:l,description:e.description??null,environment:e.environment??null,history:o,historyCount:c,historyTruncated:u,metadata:ct(e),parent:e.parent===null||e.parent===void 0?null:st(e.parent,t),subtasks:(e.subtasks??[]).map(e=>st(e,t)),truncationMessage:d.length===0?null:`Jira shortened ${d.map(rt).join(`, `)} to keep this synchronized view bounded.`}},dt=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),ft=e=>e.split(/[._\-\s]+/u).filter(e=>e.length>0).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),pt=e=>ft(e.split(`/`).filter(e=>e.length>0).at(-1)??e)||`AWS identity`,mt=e=>e==null?null:{id:e,name:pt(e),role:`Pull request author`},ht=e=>e==null?null:xe(Ce(e),{onNone:()=>null,onSome:e=>({dateTime:k(e),label:dt.format(O(e))})}),gt=e=>{switch(e){case`approved`:return`Approved by people`;case`changes-requested`:return`Changes requested`;case`merged`:return`Merged`;case`requested`:return`Human review requested`;case`not-requested`:return`No human approval synchronized`}},_t=e=>{let t=new Map(e.graph.nodes.flatMap(({nodeId:e,resolution:t})=>t._tag===`resolved`&&t.target._tag===`entity`?[[e,t.target.entityId]]:[])),n=new Set(e.graph.nodes.flatMap(({nodeId:t,resolution:n})=>n._tag===`resolved`&&n.target._tag===`entity`&&n.target.entityId===e.entity.projection.entityId?[t]:[]));return new Set(e.graph.relationships.flatMap(e=>{if(e.lifecycle._tag===`missing`||e.lifecycle._tag===`rejected`||e.lifecycle._tag===`superseded`)return[];let r=n.has(e.sourceNodeId)?e.targetNodeId:n.has(e.targetNodeId)?e.sourceNodeId:null,i=r===null?null:t.get(r);return i==null?[]:[i]}))},vt=(e,t,n)=>{let r=_t(n),i=e=>n.graph.relatedEntityProjections.filter(({projection:t})=>t.entityState===`present`&&t.entityType===e&&r.has(t.entityId)).length,a=n.entity.releaseIds.length,o=i(`issue`),s=i(`pipeline-execution`),c=e=>`${String(e)}${n.graph.truncated?`+`:``}`;return{author:mt(e.authorReference),baseRevision:e.baseRevision??null,createdAt:ht(e.createdAt),description:e.description?.trim()||null,diffScope:{pluginConnectionId:t.pluginConnectionId,vendorImmutableId:t.vendorImmutableId,revision:t.revision},filesHref:t.sourceUrl?.href??null,headRevision:e.headRevision,issueCount:o,issueCountLabel:c(o),mergeBaseRevision:e.mergeBaseRevision??null,pipelineCount:s,pipelineCountLabel:c(s),releaseCount:a,releaseCountLabel:`${String(a)}${n.entity.releaseMembershipsTruncated?`+`:``}`,reviewLabel:gt(e.reviewState),sourceBranch:e.sourceBranch,targetBranch:e.targetBranch,updatedAt:ht(e.updatedAt)}},yt=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),R=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),bt={clockify:`Clockify`,codecommit:`CodeCommit`,codepipeline:`CodePipeline`,confluence:`Confluence`,jira:`Jira`},xt={deployment:`Deployment`,issue:`Issue`,page:`Page`,"pipeline-execution":`Pipeline execution`,"pull-request":`Pull request`,"time-entry":`Time entry`},St=e=>yt.format(O(e)),Ct=e=>{if(e.sourceUrl===null)return null;let t=new URL(e.sourceUrl.href);return e.providerId===`confluence`&&t.pathname.startsWith(`/spaces/`)&&(t.pathname=`/wiki${t.pathname}`),t.href},wt=(e,t)=>`/w/${encodeURIComponent(e)}/releases/${encodeURIComponent(t)}`,z=e=>e.slice(-8),Tt=e=>{switch(e._tag){case`issue`:return[{label:`Priority`,value:e.priority??`Not set`},{label:`Estimate`,value:e.estimatePoints===null?`Not estimated`:`${e.estimatePoints} points`}];case`pull-request`:return[{label:`Repository`,value:e.repository},...e.lifecycle===null||e.lifecycle===void 0?[]:[{label:`State`,value:R(e.lifecycle)}],{label:`Branches`,value:`${e.sourceBranch} → ${e.targetBranch}`},{label:`Head revision`,value:e.headRevision}];case`page`:return[{label:`Space`,value:e.spaceKey},{label:`Revision`,value:e.revision}];case`pipeline-execution`:return[{label:`Pipeline`,value:e.pipelineName},{label:`Execution`,value:e.executionId},{label:`Trigger revision`,value:e.triggerRevision}];case`deployment`:return[{label:`Environment`,value:z(e.environmentId)},{label:`Revision`,value:e.revision}];case`time-entry`:return[{label:`Duration`,value:`${e.durationMinutes} min`},{label:`Billable`,value:e.billable?`Yes`:`No`}]}},Et=e=>R(e),Dt=e=>({avatarFallback:e.avatarFallback,id:e.personId,name:e.displayName,role:[...new Set(e.roles.map(Et))].join(` · `)}),Ot=e=>e.some(e=>e.includes(`approver`))?`approvers`:e.some(e=>e===`reviewer`||e===`watcher`)?`reviewers`:e.includes(`operator`)?`operators`:e.some(e=>e===`author`||e===`contributor`)?`authors`:`owners`,kt=e=>{let t=[`authors`,`owners`,`reviewers`,`operators`,`approvers`],n={approvers:[],authors:[],operators:[],owners:[],reviewers:[]};for(let t of e)n[Ot(t.roles)].push(Dt(t));let r=t.filter(e=>n[e].length>0);return{...n,emptyLabel:`No collaborator is assigned to this object.`,expandedCategories:r}},At=(e,t)=>{if(t===null)return e;let n=[...e.owners],r=[...e.authors],i=new Set([...e.approvers,...e.authors,...e.operators,...e.owners,...e.reviewers].map(e=>e.name.toLocaleLowerCase(`en-US`))),a=new Set;for(let e of t.collaborators){if(a.has(e.id))continue;a.add(e.id);let t=e.name.toLocaleLowerCase(`en-US`);i.has(t)||(e.role.includes(`Assignee`)?n.push(e):r.push(e))}let o=[];r.length>0&&o.push(`authors`),n.length>0&&o.push(`owners`);for(let t of e.expandedCategories)o.push(t);return{...e,authors:r,emptyLabel:`No collaborator was synchronized or assigned to this object.`,expandedCategories:[...new Set(o)],owners:n}},jt=(e,t,n)=>{if(t===null)return e;let r={approvers:[...e.approvers],authors:[...e.authors],operators:[...e.operators],owners:[...e.owners],reviewers:[...e.reviewers]},i=new Set(Object.values(r).flat().map(({id:e})=>e)),a=new Set(n.flatMap(e=>(e.sourceIdentities??[]).filter(({providerId:e})=>e===`confluence`).map(({vendorPersonId:e})=>e)));for(let e of t.contributors)i.has(e.id)||a.has(e.id)||(i.add(e.id),e.role.includes(`Owner`)?r.owners.push(e):e.role.includes(`Watcher`)?r.reviewers.push(e):r.authors.push(e));let o=[`authors`,`owners`,`reviewers`,`operators`,`approvers`];return{...r,emptyLabel:`No collaborator was synchronized or assigned to this document.`,expandedCategories:o.filter(e=>r[e].length>0)}},Mt=e=>{let t=e.freshness;return t===null?e.isSourceCurrent?`current`:`cached`:t._tag===`current`?e.isSourceCurrent&&t.provenance._tag===`provider`?`current`:`cached`:t._tag},Nt=e=>{let t=e.freshness;return t===null?e.entity.recordedAt:t.sourceObservedAt??t.synchronizedAt??t.pluginHealth.checkedAt},Pt=(e,t,n,r)=>{if(e===void 0)return{state:`missing`,label:`Unknown graph endpoint`,reason:`The endpoint is outside this graph response.`};if(e.resolution._tag===`missing`)return{state:`missing`,label:e.resolution.missingKey,reason:`${R(e.endpointKind)} is not connected.`};let i=e.resolution.target;if(i._tag===`entity`){let e=t.get(i.entityId);return e===void 0?{state:`missing`,label:`${xt[i.entityKind]} ${z(i.entityId)}`,reason:`The related object is outside this bounded response.`,service:Re(i.entityKind)}:e.entityState===`deleted`?{state:`missing`,label:`${e.title} · Deleted`,reason:`The related object was deleted.`,service:Re(e.entityType)}:{state:`present`,href:je(r,e.entityId),id:e.entityId,reference:e.displayKey,service:Re(e.entityType),title:e.title}}return i._tag===`release`?{state:`present`,href:wt(r,i.releaseId),id:i.releaseId,reference:`Control Center release · ${z(i.releaseId)}`,service:n,title:`Delivery release`}:{state:`present`,id:i.environmentId,reference:`Control Center environment · ${z(i.environmentId)}`,service:n,title:`Delivery environment`}},Ft=e=>{let t=e.evidenceClaimIds.length,n=e.confidence._tag===`inferred`?`${Math.round(e.confidence.score*100)}% inferred`:R(e.confidence._tag);return`${t} evidence claim${t===1?``:`s`} · ${n}`},It=(e,t,n)=>{let r=new Map(e.graph.nodes.map(e=>[e.nodeId,e])),i=[e.entity,...e.graph.relatedEntityProjections].map(({projection:e})=>e),a=new Map(i.map(e=>[e.entityId,e])),o=new Map(e.entity.owners.map(e=>[e.personId,e]));return e.graph.relationships.map(e=>{let i=e.recordedBy._tag===`human`?o.get(e.recordedBy.personId):void 0;return{...i===void 0?{}:{actor:Dt(i)},direction:`forward`,evidence:Ft(e),id:e.relationshipId,kind:R(e.kind),lifecycle:e.lifecycle._tag,source:Pt(r.get(e.sourceNodeId),a,n,t),target:Pt(r.get(e.targetNodeId),a,n,t)}})},Lt=e=>e.activity.events.map(e=>({actor:e.actor.label,actorKind:e.actor.kind,dateTime:k(e.occurredAt),detail:R(e.sourceKind),...e.href===null?{}:{href:e.href},id:e.eventKey,...e.service===null?{}:{service:e.service},time:St(e.occurredAt),title:e.title})),Rt=(e,t,n)=>{let r=Ct(e.source);if(r!==null)return{external:!0,href:r,label:e.source.providerId===`confluence`?`View in Confluence`:`Open in ${n}`};let i=e.entity.canonicalReleaseId;return i===null?{external:!1,href:null,label:`Source link unavailable`}:{external:!1,href:wt(t,i),label:`Open delivery release`}},zt=e=>[...e.entity.ownersTruncated?[`More collaborators exist than this bounded view can show.`]:[],...e.entity.releaseMembershipsTruncated?[`More release memberships exist than this bounded delivery path can show.`]:[],...e.graph.truncated?[`The relationship graph is partial; additional delivery links exist.`]:[],...e.activity.truncated?[`The activity list is partial; older events are not shown.`]:[]],Bt=({displayKey:e,issue:t,releaseCount:n,serviceName:r,title:i})=>t===null?`${e} · ${i} · ${r}`:`${e} · ${i} · ${r} issue · ${String(n)} release${n===1?``:`s`} · ${String(t.commentCount)} synchronized comment${t.commentCount===1?``:`s`}`,Vt=(e,t)=>{let n=t.entity.projection,r=Re(n.entityType),i=bt[r],a=ze(n.details),o=n.details._tag===`issue`?ut(n.details,t.source.sourceUrl):null,s=n.details._tag===`pull-request`?vt(n.details,t.source,t):null,c=n.details._tag===`pipeline-execution`?Ve(n.details,t):null,l=n.details._tag===`page`?ke(n.details,t):null,u=n.details._tag===`time-entry`?tt(e,n.details,t):null,d=Nt(t),f=t.entity.releaseIds.length;return{activity:Lt(t),activityEmptyLabel:`No attributable activity has been recorded for this object.`,agentContext:Bt({displayKey:n.displayKey,issue:o,releaseCount:f,serviceName:i,title:n.title}),collaborators:jt(At(kt(t.entity.owners),o),l,t.entity.owners),clockifyTimeEntry:u,confluencePage:l,contentSummary:`${xt[n.entityType]} ${n.displayKey} is tracked in ${i}. ${f===0?`It is not linked to a release yet.`:`It belongs to ${f}${t.entity.releaseMembershipsTruncated?`+`:``} release${f===1?``:`s`}.`}`,displayKey:n.displayKey,evidence:{claimCount:t.graph.evidenceClaims.length,freshness:Mt(t),freshnessDateTime:k(d),freshnessTime:St(d),itemCount:t.graph.evidenceItems.length,reference:`${n.displayKey} · source revision ${t.source.revision}`},facts:[{label:`Object`,value:xt[n.entityType]},{label:`Service`,value:i},...Tt(n.details)],freshness:Mt(t),freshnessDateTime:k(d),freshnessTime:St(d),kindLabel:xt[n.entityType],issue:o,pipelineExecution:c,pullRequest:s,partialMessages:zt(t),primaryAction:Rt(t,e,i),relationships:It(t,e,r),relationshipEmptyLabel:`No delivery relationships have been recorded for this object.`,releases:t.entity.releaseIds.map(t=>({href:wt(e,t),id:t,label:`Release ${z(t)}`})),service:r,serviceName:i,title:n.title,tone:Le(n.entityType,a).tone,verdict:a}},B={state:`_state_13ab1_1`,loading:`_loading_13ab1_12`,loadingColumns:`_loadingColumns_13ab1_13`,content:`_content_13ab1_14`,entityActions:`_entityActions_13ab1_15`,deliveryPath:`_deliveryPath_13ab1_16`,facts:`_facts_13ab1_17`,evidence:`_evidence_13ab1_18`,activity:`_activity_13ab1_19`,sectionHeading:`_sectionHeading_13ab1_20`,back:`_back_13ab1_34`,principalAction:`_principalAction_13ab1_35`,releasePath:`_releasePath_13ab1_36`,pageSynchronization:`_pageSynchronization_13ab1_67`,secondaryAction:`_secondaryAction_13ab1_76`,pathRail:`_pathRail_13ab1_112`,pathNode:`_pathNode_13ab1_121`,pathEmpty:`_pathEmpty_13ab1_122`,workingCircle:`_workingCircle_13ab1_190`,shell:`_shell_13ab1_212`,timeline:`_timeline_13ab1_236`},V={document:`_document_1mruv_1`,ledger:`_ledger_1mruv_2`,ledgerBody:`_ledgerBody_1mruv_3`,primaryFacts:`_primaryFacts_1mruv_5`,section:`_section_1mruv_7`,sectionHeading:`_sectionHeading_1mruv_8`,entry:`_entry_1mruv_9`,attribution:`_attribution_1mruv_12`,people:`_people_1mruv_17`,readOnly:`_readOnly_1mruv_19`,total:`_total_1mruv_36`},H=c(),Ht=({children:e,heading:t,meta:n})=>(0,H.jsxs)(`section`,{className:V.section,children:[(0,H.jsxs)(`header`,{className:V.sectionHeading,children:[(0,H.jsx)(E,{as:`h2`,variant:`section-title`,children:t}),(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:n})]}),e]}),Ut=({canApprove:e=!1,canCorrect:t=!1,onSubmit:n,submission:r={_tag:`idle`},timeEntry:i})=>{let[o,s]=(0,F.useState)(``),[c,l]=(0,F.useState)(``),u=(0,F.useRef)(`approved`),f=!t||n===void 0||r._tag===`submitting`,p=!e||n===void 0||r._tag===`submitting`;return(0,H.jsxs)(`article`,{className:V.document,"data-workspace-clockify-time-entry-detail":!0,children:[(0,H.jsxs)(`section`,{"aria-label":`Clockify time ledger`,className:V.ledger,children:[(0,H.jsxs)(`div`,{className:V.total,children:[(0,H.jsx)(`span`,{children:`Total tracked`}),(0,H.jsx)(`strong`,{children:i.durationLabel}),(0,H.jsx)(`small`,{children:i.rollupLabel})]}),(0,H.jsxs)(`div`,{className:V.ledgerBody,children:[(0,H.jsxs)(`header`,{children:[(0,H.jsx)(`span`,{children:`Time ledger`}),(0,H.jsx)(d,{label:i.associationLabel,tone:i.jiraAssociations.length===0?`caution`:`positive`})]}),(0,H.jsx)(`p`,{children:i.description}),(0,H.jsxs)(`dl`,{className:V.primaryFacts,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Project`}),(0,H.jsx)(`dd`,{children:i.projectLabel})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Billing`}),(0,H.jsx)(`dd`,{children:i.billableLabel})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Contributor`}),(0,H.jsx)(`dd`,{children:i.contributorLabel})]})]})]})]}),(0,H.jsx)(Ht,{heading:`Entry`,meta:`The exact source record included in the total`,children:(0,H.jsxs)(`div`,{className:V.entry,children:[(0,H.jsx)(`strong`,{children:i.durationLabel}),(0,H.jsxs)(`dl`,{children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Started`}),(0,H.jsx)(`dd`,{children:i.startedAt})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Ended`}),(0,H.jsx)(`dd`,{children:i.endedAt})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`State`}),(0,H.jsx)(`dd`,{children:i.timerLabel})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Provider lock`}),(0,H.jsx)(`dd`,{children:i.lockLabel})]})]})]})}),(0,H.jsx)(Ht,{heading:`Jira attribution`,meta:`Current delivery-ledger relationships`,children:(0,H.jsxs)(`div`,{className:V.attribution,"data-state":i.jiraAssociations.length===0?`missing`:`linked`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`strong`,{children:i.associationLabel}),(0,H.jsx)(`p`,{children:i.associationDetail})]}),i.jiraAssociations.length===0?null:(0,H.jsx)(`ul`,{children:i.jiraAssociations.map(e=>(0,H.jsx)(`li`,{children:(0,H.jsxs)(a,{to:e.href,children:[(0,H.jsx)(`span`,{children:e.key}),(0,H.jsx)(`strong`,{children:e.title}),(0,H.jsxs)(`small`,{children:[e.state===`inferred`?`Inferred`:`Linked`,` · `,e.evidenceLabel]})]})},e.href))})]})}),(0,H.jsx)(Ht,{heading:`People`,meta:`Provider contributor and assigned approvers`,children:(0,H.jsxs)(`dl`,{className:V.people,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Contributor`}),(0,H.jsx)(`dd`,{children:i.contributorLabel})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Approvers`}),(0,H.jsx)(`dd`,{children:i.approvers.join(` · `)||`No approval recorded`})]})]})}),(0,H.jsxs)(`aside`,{className:V.readOnly,"data-clockify-approval":!0,children:[(0,H.jsxs)(`strong`,{children:[`Control Center approval: `,i.approvalLabel]}),(0,H.jsx)(`span`,{children:i.approvalDetail}),i.approvalDecidedAt===null?null:(0,H.jsxs)(`time`,{dateTime:i.approvalDecidedAt.dateTime,children:[`Recorded `,i.approvalDecidedAt.label]})]}),(0,H.jsxs)(`section`,{"aria-label":`Governed Clockify actions`,"data-clockify-governed-actions":!0,children:[(0,H.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),f||n({_tag:`correct-association`,expectedRevision:i.sourceRevision,jiraIssueKey:o})},children:[(0,H.jsxs)(`label`,{children:[`Jira issue key`,(0,H.jsx)(`input`,{disabled:f,maxLength:100,onChange:e=>s(e.currentTarget.value),pattern:`[A-Z][A-Z0-9]*-[1-9][0-9]*`,required:!0,value:o})]}),(0,H.jsx)(`button`,{disabled:f,type:`submit`,children:`Correct association`})]}),(0,H.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),!p&&c.trim().length>0&&(n({_tag:`record-approval`,expectedRevision:i.sourceRevision,decision:u.current,rationale:c.trim()}),u.current=`approved`)},children:[(0,H.jsxs)(`label`,{children:[`Approval rationale`,(0,H.jsx)(`input`,{disabled:p,maxLength:1e3,onChange:e=>l(e.currentTarget.value),required:!0,value:c})]}),(0,H.jsx)(`button`,{disabled:p||c.trim().length===0,onClick:()=>{u.current=`approved`},type:`submit`,children:`Approve revision`}),(0,H.jsx)(`button`,{disabled:p||c.trim().length===0,onClick:()=>{u.current=`rejected`},type:`submit`,children:`Reject revision`})]}),r._tag===`failed`?(0,H.jsx)(`p`,{role:`alert`,children:`The governed action could not be submitted.`}):null,r._tag===`succeeded`?(0,H.jsxs)(`p`,{children:[`Action recorded: `,r.result.state]}):null]})]})},Wt={submit:(e,t,n)=>j(pe(function*(){let n=yield*Be;return yield*(t._tag,n.deliveryGraph.submitClockifyAction({params:{entityId:e},payload:t}))}).pipe(ve(we)),{signal:n})},Gt=(e,t,n,r,i=Wt)=>{let[a,o]=(0,F.useState)({_tag:`idle`}),s=(0,F.useRef)(null);return(0,F.useEffect)(()=>(s.current?.abort(),s.current=null,o({_tag:`idle`}),()=>{s.current?.abort(),s.current=null}),[e,t]),{state:a,submit:(0,F.useCallback)(a=>{if(t===null||s.current!==null)return;let c=new AbortController;s.current=c,o({_tag:`submitting`}),i.submit(e,a,c.signal).then(e=>{s.current===c&&(s.current=null,o({_tag:`succeeded`,result:e}),r())},e=>{s.current===c&&(s.current=null,N(`UnauthorizedApiError`)(e)&&n(t),c.signal.aborted||o({_tag:`failed`}))})},[e,n,r,t,i])}},Kt=`15 seconds`,qt=15e3,Jt=1e3,Yt=15*6e4,Xt={synchronize:(e,t)=>{let n=Ge.synchronize;return n===void 0?Promise.reject(Error(`Confluence synchronization is unavailable`)):n(e,t)}},Zt=se({ownerKey:oe,recordedAt:ge,sessionExpired:ie,state:ce([`syncing`,`synchronized`,`failed`])}),U=new Map,Qt=new WeakMap,$t=new Map,en=pe(function*(){return yield*(yield*Te).randomUUIDv4}).pipe(ve(Ee)),tn=e=>{let t=$t.get(e);if(t!==void 0)return t;let n=Se(en);return $t.set(e,n),n},nn=e=>`control-center:confluence-sync:${e}`,rn=e=>{try{let t=localStorage.getItem(e);return t===null?null:ne(A(le(Zt))(t))}catch{return null}},an=(e,t)=>{try{localStorage.setItem(e,de(le(Zt))(t))}catch{}},on=(e,t)=>{let n=rn(e);if(!(n?.state!==`syncing`||n.ownerKey!==t.ownerKey||n.recordedAt!==t.recordedAt))try{localStorage.removeItem(e)}catch{}},W=async(e,t)=>{let n=!1;return await Promise.all(Array.from(e.participants.values(),async e=>{if(!e.lifetime.aborted){if(t.sessionExpired&&t.ownerKey!==e.ownerKey){n=!0;return}if(t.state!==`synchronized`){e.setState(t.state),t.sessionExpired&&e.onSessionExpired();return}e.setState(`syncing`);try{let t=await e.verifySynchronized(e.lifetime);if(e.lifetime.aborted)return;e.setState(t?`synchronized`:`idle`),t&&e.onSynchronized()}catch(t){if(e.lifetime.aborted)return;N(`UnauthorizedApiError`)(t)&&e.onSessionExpired(),e.setState(`failed`)}}})),n},sn=(e,t,n=!1)=>{if(t.active!==null)return t.active.completion;let r=new AbortController,i=j(D),a=nn(e),o=!1,s=async()=>{let s=await i,c=await j(D),l=t.participants.values().next().value;if(l===void 0||r.signal.aborted)return;let u=rn(a),d=u===null?null:c-u.recordedAt;if(u!==null&&d!==null&&u.recordedAt<=c+Jt&&(!u.sessionExpired||u.ownerKey===l.ownerKey)&&(u.state===`syncing`?d<Yt:!n&&(u.recordedAt>=s||d<qt))){u.state!==`syncing`&&(o=await W(t,u));return}let f={ownerKey:l.ownerKey,recordedAt:c,sessionExpired:!1,state:`syncing`};an(a,f),o=await W(t,f);let p=()=>on(a,f);r.signal.addEventListener(`abort`,p,{once:!0});try{let n=await l.transport.synchronize(e,r.signal);if(r.signal.aborted)return p();let i={ownerKey:l.ownerKey,recordedAt:await j(D),sessionExpired:!1,state:n.result===`synchronized`?`synchronized`:`failed`};an(a,i),o=await W(t,i)}catch(e){if(r.signal.aborted)return p();let n={ownerKey:l.ownerKey,recordedAt:await j(D),sessionExpired:N(`UnauthorizedApiError`)(e),state:`failed`};an(a,n),o=await W(t,n)}finally{r.signal.removeEventListener(`abort`,p)}},c=`locks`in navigator?navigator.locks:null,l=(c===null?s():c.request(`control-center:confluence-sync:${e}`,{signal:r.signal},()=>s())).catch(async e=>{let n=t.participants.values().next().value;!r.signal.aborted&&n!==void 0&&(o=await W(t,{ownerKey:n.ownerKey,recordedAt:0,sessionExpired:N(`UnauthorizedApiError`)(e),state:`failed`}))}).finally(()=>{t.active?.abort===r&&(t.active=null),o&&document.visibilityState===`visible`&&sn(e,t,!0)});return t.active={abort:r,completion:l},l},cn=(e,t)=>{let n=null,r=0,i=!1,a=e=>{if(i||e!==r)return;let a=new AbortController;n=a,j(M(Kt),{signal:a.signal}).then(()=>o(),e=>{if(!a.signal.aborted)for(let e of t.participants.values())e.setState(`failed`)})},o=()=>{r+=1;let i=r;n?.abort(),n=null,(document.visibilityState===`visible`?sn(e,t):Promise.resolve()).finally(()=>a(i))},s=()=>{if(document.visibilityState===`visible`){r+=1;let i=r;n?.abort(),n=null,sn(e,t,!0).finally(()=>a(i))}},c=n=>{if(n.key!==nn(e)||n.newValue===null)return;let r=ne(A(le(Zt))(n.newValue));r!==null&&W(t,r).then(n=>{n&&document.visibilityState===`visible`&&sn(e,t,!0)})};return document.addEventListener(`visibilitychange`,s),window.addEventListener(`storage`,c),o(),()=>{i=!0,r+=1,n?.abort(),n=null,t.active?.abort.abort(),t.active=null,document.removeEventListener(`visibilitychange`,s),window.removeEventListener(`storage`,c)}},ln=(e,t)=>{let n=Symbol(),r=U.get(e),i=r??{active:null,participants:new Map};return i.participants.set(n,t),r===void 0&&(U.set(e,i),Qt.set(i,cn(e,i))),()=>{i.participants.delete(n),i.participants.size===0&&(Qt.get(i)?.(),Qt.delete(i),U.get(e)===i&&U.delete(e))}},un=async e=>{let t=rn(e);if(t?.state!==`syncing`)return null;let n=await j(D);if(t.recordedAt>n+Jt)return null;let r=t.recordedAt+Yt-n;return r<=0?null:{remainingMillis:r,synchronization:t}},dn=async(e,t)=>{let n=nn(e);for(;;){if(t.aborted)return;let e=await un(n);if(e===null)return;let r=new AbortController;await new Promise(i=>{let a=!1,o=()=>{a||(a=!0,r.abort(),window.removeEventListener(`storage`,s),t.removeEventListener(`abort`,o),i())},s=e=>{e.key===n&&o()};window.addEventListener(`storage`,s),t.addEventListener(`abort`,o,{once:!0}),t.aborted&&o();let c=rn(n);(c?.state!==`syncing`||c.ownerKey!==e.synchronization.ownerKey||c.recordedAt!==e.synchronization.recordedAt)&&o(),j(M(e.remainingMillis),{signal:r.signal}).then(o,e=>{r.signal.aborted||o()})})}},fn=({enabled:e,onSessionExpired:t,onSynchronized:n,pluginConnectionId:r,readSynchronizationRevision:i,sessionKey:a,synchronizationRevision:o,transport:s=Xt})=>{let[c,l]=(0,F.useState)(`idle`),u=(0,F.useRef)(null),d=(0,F.useRef)(t),f=(0,F.useRef)(n),p=(0,F.useRef)(i),m=(0,F.useRef)({pluginConnectionId:r,sessionKey:a,value:o});d.current=t,f.current=n,p.current=i,m.current.pluginConnectionId!==r||m.current.sessionKey!==a?m.current={pluginConnectionId:r,sessionKey:a,value:o}:o!==null&&(m.current.value===null||o>m.current.value)&&(m.current.value=o);let h=(0,F.useCallback)(async e=>{let t=await p.current(e),n=m.current.value;return t===null||n===null||t<=n?!1:(m.current.value=t,!0)},[]),g=(0,F.useCallback)(()=>{if(!e||r===null||a===null)return Promise.resolve();let t=U.get(r);return t===void 0?Promise.resolve():sn(r,t,!0)},[e,r,a]),_=(0,F.useCallback)(()=>{let e=u.current?.signal;if(e===void 0||e.aborted)return;let t=r===null?void 0:U.get(r)?.active?.completion??dn(r,e);t===void 0?g():t.then(()=>{e.aborted||g()})},[r,g]);return(0,F.useEffect)(()=>{if(l(`idle`),!e||r===null||a===null)return;let t=new AbortController;u.current=t;let n=ln(r,{lifetime:t.signal,onSessionExpired:()=>d.current(a),onSynchronized:()=>f.current(),ownerKey:tn(a),sessionKey:a,setState:l,transport:s,verifySynchronized:h});return()=>{t.abort(),u.current===t&&(u.current=null),n()}},[e,r,a,s,h]),{state:c,synchronizeAfterMutation:_,synchronizeNow:_}},G={document:`_document_1dvhb_1`,folio:`_folio_1dvhb_2`,revision:`_revision_1dvhb_3`,folioMeta:`_folioMeta_1dvhb_4`,section:`_section_1dvhb_7`,sectionHeading:`_sectionHeading_1dvhb_8`,collections:`_collections_1dvhb_9`,versions:`_versions_1dvhb_10`,attachments:`_attachments_1dvhb_12`,contentState:`_contentState_1dvhb_14`,documentRead:`_documentRead_1dvhb_15`,editorEntry:`_editorEntry_1dvhb_16`,visualEditor:`_visualEditor_1dvhb_17`,editorHeading:`_editorHeading_1dvhb_18`,editorActions:`_editorActions_1dvhb_19`,editorToolbar:`_editorToolbar_1dvhb_20`,releaseTasks:`_releaseTasks_1dvhb_21`,releaseTaskHeading:`_releaseTaskHeading_1dvhb_22`,releaseTaskList:`_releaseTaskList_1dvhb_23`,evidenceCount:`_evidenceCount_1dvhb_25`,richText:`_richText_1dvhb_97`,editorCanvas:`_editorCanvas_1dvhb_250`},pn=e=>e.replace(/([\\`*_[\]<>])/gu,`\\$1`),mn=e=>e.nodeType===Node.ELEMENT_NODE,hn=e=>e.tagName.toLocaleLowerCase(`en-US`)===`input`&&`type`in e&&e.type===`checkbox`&&`checked`in e&&typeof e.checked==`boolean`,K=e=>{if(e.nodeType===Node.TEXT_NODE)return pn(e.textContent??``);if(!mn(e))return``;let t=[...e.childNodes].map(K).join(``);switch(e.tagName.toLocaleLowerCase(`en-US`)){case`strong`:case`b`:return`**${t}**`;case`em`:case`i`:return`*${t}*`;case`s`:case`del`:return`~~${t}~~`;case`code`:return`\`${(e.textContent??``).replace(/`/gu,"\\`")}\``;case`a`:{let n=e.getAttribute(`href`);return n===null?t:`[${t}](${n.replace(/\)/gu,`\\)`)})`}case`br`:return`
3
+ `;default:return t}},gn=(e,t,n=0)=>[...e.children].filter(e=>e.tagName.toLocaleLowerCase(`en-US`)===`li`).map((e,r)=>{let i=[...e.children].find(hn),a=i===void 0?``:`[${i.checked?`x`:` `}] `,o=[...e.children].filter(e=>/^(?:ol|ul)$/u.test(e.tagName.toLowerCase())),s=[...e.childNodes].filter(e=>!mn(e)||!/^(?:ol|ul)$/u.test(e.tagName.toLowerCase())).map(K).join(``).trim(),c=` `.repeat(n),l=o.map(e=>gn(e,e.tagName.toLowerCase()===`ol`,n+1));return[`${c}${t?`${String(r+1)}.`:`-`} ${i===void 0?``:a}${s}`,...l].join(`
4
+ `)}).join(`
5
+ `),_n=e=>{if(e.nodeType===Node.TEXT_NODE)return pn(e.textContent??``);if(!mn(e))return``;let t=e.tagName.toLocaleLowerCase(`en-US`);switch(t){case`h1`:case`h2`:case`h3`:case`h4`:case`h5`:case`h6`:return`${`#`.repeat(Number(t.slice(1)))} ${K(e).trim()}`;case`ul`:return gn(e,!1);case`ol`:return gn(e,!0);case`blockquote`:return K(e).trim().split(`
6
+ `).map(e=>`> ${e}`).join(`
7
+ `);case`pre`:{let t=e.textContent??``,n=Math.max(0,...[...t.matchAll(/`+/gu)].map(([e])=>e.length)),r="`".repeat(Math.max(3,n+1));return`${r}\n${t}\n${r}`}case`hr`:return`---`;case`p`:case`div`:case`section`:case`article`:return[...e.children].some(e=>/^(?:article|blockquote|div|h[1-6]|hr|ol|p|pre|section|ul)$/u.test(e.tagName.toLocaleLowerCase(`en-US`)))?[...e.childNodes].map(_n).filter(e=>e.trim().length>0).join(`
8
+
9
+ `):K(e).trim();default:return K(e).trim()}},vn=e=>[...e.childNodes].map(_n).filter(e=>e.trim().length>0).join(`
10
+
11
+ `).replace(/\n{3,}/gu,`
12
+
13
+ `).trim(),q=(e,t)=>{document.execCommand(e,!1,t)},yn=e=>{let t=URL.parse(e);return t!==null&&(t.protocol===`http:`||t.protocol===`https:`)?t.href:null},bn=e=>e===`succeeded`,xn=(0,F.memo)(({markdown:e})=>(0,H.jsx)(Ke,{value:e}),()=>!0),Sn=({canEdit:e,entityId:t,onAskAgent:n,onSaved:r,page:i,releaseId:a,submitPublication:o=Ae,title:s})=>{let[c,l]=(0,F.useState)({_tag:`idle`}),[d,p]=(0,F.useState)(null),[m,h]=(0,F.useState)(!1),[g,_]=(0,F.useState)(s),v=(0,F.useRef)(null),y=c._tag!==`idle`&&c._tag!==`saved`,b=c._tag===`saving`,x=Ue(i.content??``);(0,F.useEffect)(()=>{_(s),l({_tag:`idle`}),p(null),h(!1)},[i.revision,s]);let S=(n,c)=>{if(!e||!i.taskUpdatesSafe||a===null||i.content===null||d!==null)return;let l=He(i.content,n,c);l!==null&&(p(n),h(!1),o({releaseId:a,provider:`confluence`,title:s,markdown:l,targetEntityId:t,targetRevision:ae.make(i.revision),signal:AbortSignal.timeout(3e4)}).then(e=>{bn(e.state)?r():h(!0)},()=>h(!0)).finally(()=>p(null)))};return y?(0,H.jsxs)(`div`,{className:G.visualEditor,"data-confluence-visual-editor":!0,children:[(0,H.jsxs)(`div`,{className:G.editorHeading,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsxs)(E,{as:`strong`,children:[`Editing revision `,i.revision]}),(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:`Save creates the next Confluence revision after an explicit owner confirmation.`})]}),(0,H.jsxs)(`div`,{className:G.editorActions,children:[(0,H.jsx)(f,{disabled:b,onClick:n,variant:`secondary`,children:`Ask Relay`}),(0,H.jsx)(f,{disabled:b,onClick:()=>l({_tag:`idle`}),variant:`secondary`,children:`Cancel`}),(0,H.jsx)(f,{disabled:b,loading:b,onClick:()=>{let e=v.current;if(e===null||a===null||b)return;let n=vn(e),s=g.trim();if(s.length===0||n.length===0){l({_tag:`failed`});return}l({_tag:`saving`}),o({releaseId:a,provider:`confluence`,title:s,markdown:n,targetEntityId:t,targetRevision:ae.make(i.revision),signal:AbortSignal.timeout(3e4)}).then(e=>{bn(e.state)?(l({_tag:`saved`}),r()):l({_tag:`failed`})},()=>l({_tag:`failed`}))},children:`Save to Confluence`})]})]}),i.contentState!==`loaded`||i.content===null?(0,H.jsx)(u,{description:`The existing body is not synchronized. Saving this draft replaces the complete Confluence page body at the displayed revision.`,title:`Complete replacement`,tone:`caution`}):null,(0,H.jsx)(te,{label:`Page title`,children:e=>(0,H.jsx)(`input`,{...e,disabled:b,maxLength:500,onChange:e=>_(e.target.value),value:g})}),(0,H.jsxs)(`div`,{"aria-label":`Document formatting`,className:G.editorToolbar,onMouseDown:e=>e.preventDefault(),role:`toolbar`,children:[(0,H.jsx)(`button`,{onClick:()=>q(`formatBlock`,`p`),type:`button`,children:`Paragraph`}),(0,H.jsx)(`button`,{onClick:()=>q(`formatBlock`,`h2`),type:`button`,children:`Heading 2`}),(0,H.jsx)(`button`,{onClick:()=>q(`formatBlock`,`h3`),type:`button`,children:`Heading 3`}),(0,H.jsx)(`button`,{"aria-label":`Bold`,onClick:()=>q(`bold`),type:`button`,children:(0,H.jsx)(`strong`,{children:`B`})}),(0,H.jsx)(`button`,{"aria-label":`Italic`,onClick:()=>q(`italic`),type:`button`,children:(0,H.jsx)(`em`,{children:`I`})}),(0,H.jsx)(`button`,{onClick:()=>q(`insertUnorderedList`),type:`button`,children:`Bullets`}),(0,H.jsx)(`button`,{onClick:()=>q(`insertOrderedList`),type:`button`,children:`Numbered`}),(0,H.jsx)(`button`,{onClick:()=>{let e=window.prompt(`Link address`),t=e===null?null:yn(e);t!==null&&q(`createLink`,t)},type:`button`,children:`Link`})]}),(0,H.jsx)(`div`,{"aria-label":`Confluence page body`,"aria-multiline":`true`,className:`${G.editorCanvas} ${G.richText}`,contentEditable:!b,ref:v,role:`textbox`,suppressContentEditableWarning:!0,children:(0,H.jsx)(xn,{markdown:i.content??``})}),c._tag===`failed`?(0,H.jsx)(u,{description:`Keep a non-empty title and document body, refresh the latest revision, then try again.`,title:`The page was not saved`,tone:`critical`}):null]}):(0,H.jsxs)(`div`,{className:G.documentRead,children:[i.contentState===`loaded`&&i.content!==null?(0,H.jsx)(Ke,{className:G.richText,value:i.content}):(0,H.jsxs)(`div`,{className:G.contentState,"data-content-state":i.contentState,children:[(0,H.jsx)(`strong`,{children:i.contentState===`lazy`?`Content has not been loaded`:`No readable body was returned`}),(0,H.jsx)(E,{tone:`secondary`,children:`Open the authenticated Confluence source to read it now, or synchronize the connection before editing so Relay never replaces an unseen document.`})]}),x.total===0?null:(0,H.jsxs)(`section`,{"aria-labelledby":`confluence-release-tasks`,className:G.releaseTasks,children:[(0,H.jsxs)(`div`,{className:G.releaseTaskHeading,children:[(0,H.jsx)(E,{as:`h3`,id:`confluence-release-tasks`,variant:`card-title`,children:`Release tasks`}),(0,H.jsxs)(E,{tone:`secondary`,variant:`meta`,children:[x.completed,` of `,x.total,` complete`]})]}),(0,H.jsx)(`ul`,{className:G.releaseTaskList,children:x.tasks.map(t=>(0,H.jsxs)(`li`,{children:[(0,H.jsxs)(`label`,{children:[(0,H.jsx)(`input`,{checked:t.checked,disabled:!e||!i.taskUpdatesSafe||a===null||d!==null,onChange:e=>S(t.lineIndex,e.target.checked),type:`checkbox`}),(0,H.jsx)(`span`,{children:t.label})]}),d===t.lineIndex?(0,H.jsx)(E,{variant:`meta`,children:`Saving…`}):null]},`${String(t.lineIndex)}-${t.label}`))}),x.outstanding===0?(0,H.jsx)(E,{children:`All Confluence tasks are complete.`}):(0,H.jsxs)(E,{tone:`secondary`,children:[x.outstanding,` task`,x.outstanding===1?``:`s`,` block release publication.`]}),i.taskUpdatesSafe?null:(0,H.jsx)(E,{tone:`secondary`,children:`Task-only updates are unavailable because this safe page projection cannot prove a lossless ADF round trip. Review a complete replacement before changing these tasks.`}),m?(0,H.jsx)(u,{description:`Refresh the latest Confluence revision, then tick the task again.`,title:`The task was not updated`,tone:`critical`}):null]}),(0,H.jsxs)(`div`,{className:G.editorEntry,children:[(0,H.jsx)(f,{disabled:!e||a===null,onClick:()=>l({_tag:`editing`}),children:i.contentState===`loaded`&&i.content!==null?`Edit on this page`:`Write a complete replacement`}),(0,H.jsx)(f,{onClick:n,variant:`secondary`,children:`Ask Relay to edit`}),c._tag===`saved`?(0,H.jsx)(E,{children:`Saved to Confluence.`}):null,e?null:(0,H.jsx)(E,{tone:`secondary`,children:`Current source data and workspace-owner access are required to edit.`}),e&&a===null?(0,H.jsx)(E,{tone:`secondary`,children:`Link this page to a release before editing it in Relay.`}):null]})]})},Cn=({children:e,heading:t,meta:n})=>(0,H.jsxs)(`section`,{className:G.section,children:[(0,H.jsxs)(`header`,{className:G.sectionHeading,children:[(0,H.jsx)(E,{as:`h2`,variant:`section-title`,children:t}),(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:n})]}),e]}),wn=({editor:e,page:t})=>{let[n,r]=(0,F.useState)(!1);return(0,H.jsxs)(`article`,{className:G.document,"data-workspace-confluence-page-detail":!0,children:[(0,H.jsxs)(`section`,{"aria-label":`Document identity`,className:G.folio,children:[(0,H.jsxs)(`div`,{className:G.revision,children:[(0,H.jsx)(`span`,{children:`Revision`}),(0,H.jsx)(`strong`,{children:t.revision})]}),(0,H.jsxs)(`div`,{className:G.folioMeta,children:[(0,H.jsx)(d,{label:t.status,tone:t.status===`Superseded`?`caution`:t.status===`Current`?`positive`:`neutral`}),(0,H.jsxs)(`dl`,{children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Space`}),(0,H.jsx)(`dd`,{children:t.sourceSpaceId})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Updated`}),(0,H.jsx)(`dd`,{children:t.updatedAt===null?`Not synchronized`:(0,H.jsx)(`time`,{dateTime:t.updatedAt.dateTime,children:t.updatedAt.label})})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Created`}),(0,H.jsx)(`dd`,{children:t.createdAt===null?`Not synchronized`:(0,H.jsx)(`time`,{dateTime:t.createdAt.dateTime,children:t.createdAt.label})})]})]})]})]}),(0,H.jsx)(Cn,{heading:`Document`,meta:`Safely converted text; raw provider markup and media stay outside this view`,children:(0,H.jsx)(Sn,{...e,page:t})}),(0,H.jsx)(Cn,{heading:`People`,meta:t.watcherInventoryLabel,children:t.contributors.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No owner, contributor, or watcher identity was synchronized.`}):(0,H.jsx)(b,{"aria-label":`Page collaborators`,expanded:n,limit:4,onExpandedChange:r,people:t.contributors})}),(0,H.jsxs)(`div`,{className:G.collections,children:[(0,H.jsx)(Cn,{heading:`Revision history`,meta:t.historyInventoryLabel,children:t.versions.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No revision history was synchronized.`}):(0,H.jsx)(`ol`,{className:G.versions,children:t.versions.map(e=>(0,H.jsxs)(`li`,{children:[(0,H.jsxs)(`strong`,{children:[`v`,e.number]}),(0,H.jsx)(`span`,{children:e.message}),(0,H.jsxs)(`small`,{children:[e.author,` · `,(0,H.jsx)(`time`,{dateTime:e.createdAt.dateTime,children:e.createdAt.label}),e.minorEdit?` · Minor edit`:``]})]},`${String(e.number)}-${e.createdAt.dateTime}`))})}),(0,H.jsx)(Cn,{heading:`Attachments`,meta:t.attachmentInventoryLabel,children:t.attachments.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No attachment metadata was synchronized.`}):(0,H.jsx)(`ul`,{className:G.attachments,children:t.attachments.map(e=>(0,H.jsxs)(`li`,{children:[(0,H.jsx)(`strong`,{children:e.title}),(0,H.jsxs)(`span`,{children:[e.mediaType,` · `,e.fileSize,` · `,e.version]}),(0,H.jsx)(`small`,{children:`Metadata only · authenticated proxy required`})]},e.id))})})]}),(0,H.jsx)(Cn,{heading:`Runbook evidence`,meta:`Immutable delivery evidence around this page`,children:(0,H.jsxs)(`div`,{className:G.evidenceCount,children:[(0,H.jsx)(`strong`,{children:t.runbookEvidenceCount}),(0,H.jsxs)(`span`,{children:[`evidence item`,t.runbookEvidenceCount===1?``:`s`,` in the current bounded graph`]})]})})]})},J={document:`_document_1cny9_1`,section:`_section_1cny9_2`,sectionHeading:`_sectionHeading_1cny9_3`,people:`_people_1cny9_4`,conversation:`_conversation_1cny9_5`,history:`_history_1cny9_6`,related:`_related_1cny9_7`,metadata:`_metadata_1cny9_8`,attribution:`_attribution_1cny9_9`,richText:`_richText_1cny9_28`,commentBody:`_commentBody_1cny9_29`,criteria:`_criteria_1cny9_70`,boundaryNotice:`_boundaryNotice_1cny9_75`,collectionNotice:`_collectionNotice_1cny9_76`},Y=({children:e,heading:t,meta:n})=>(0,H.jsxs)(`section`,{className:J.section,children:[(0,H.jsxs)(`header`,{className:J.sectionHeading,children:[(0,H.jsx)(E,{as:`h2`,variant:`section-title`,children:t}),n===void 0?null:(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:n})]}),e]}),Tn=({empty:e,value:t})=>t===null?(0,H.jsx)(E,{tone:`secondary`,children:e}):(0,H.jsx)(Ke,{className:J.richText,value:t}),En=({issue:e})=>(0,H.jsxs)(`article`,{className:J.document,"data-workspace-issue-detail":!0,children:[e.truncationMessage===null?null:(0,H.jsx)(E,{className:J.boundaryNotice,tone:`secondary`,children:e.truncationMessage}),(0,H.jsx)(Y,{heading:`Description`,meta:`What changes and why`,children:(0,H.jsx)(Tn,{empty:`No description was synchronized from Jira.`,value:e.description})}),(0,H.jsx)(Y,{heading:`Acceptance criteria`,meta:`The finish line`,children:(0,H.jsx)(`div`,{className:J.criteria,children:(0,H.jsx)(Tn,{empty:`No acceptance criteria were synchronized.`,value:e.acceptanceCriteria})})}),e.environment===null?null:(0,H.jsx)(Y,{heading:`Environment`,meta:`Where this applies`,children:(0,H.jsx)(Tn,{empty:`No environment was synchronized.`,value:e.environment})}),(0,H.jsx)(Y,{heading:`People`,meta:`${String(e.collaborators.length)} collaborators`,children:e.collaborators.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No Jira collaborator was synchronized for this issue.`}):(0,H.jsx)(`ul`,{className:J.people,children:e.collaborators.map(e=>(0,H.jsx)(`li`,{children:(0,H.jsx)(S,{person:e})},e.id))})}),(0,H.jsx)(Y,{heading:`Issue details`,meta:`Synchronized fields`,children:(0,H.jsx)(`dl`,{className:J.metadata,children:e.metadata.map(e=>(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:e.label}),(0,H.jsx)(`dd`,{children:e.value})]},e.label))})}),e.parent===null&&e.subtasks.length===0?null:(0,H.jsx)(Y,{heading:`Related Jira work`,meta:`Source hierarchy`,children:(0,H.jsxs)(`div`,{className:J.related,children:[e.parent===null?null:(0,H.jsxs)(`div`,{children:[(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:`Parent`}),e.parent.href===null?(0,H.jsx)(`strong`,{children:e.parent.key}):(0,H.jsx)(`a`,{href:e.parent.href,rel:`noreferrer`,target:`_blank`,children:e.parent.key}),(0,H.jsx)(`span`,{children:e.parent.summary}),(0,H.jsx)(`small`,{children:e.parent.status})]}),e.subtasks.map(e=>(0,H.jsxs)(`div`,{children:[(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:`Subtask`}),e.href===null?(0,H.jsx)(`strong`,{children:e.key}):(0,H.jsx)(`a`,{href:e.href,rel:`noreferrer`,target:`_blank`,children:e.key}),(0,H.jsx)(`span`,{children:e.summary}),(0,H.jsx)(`small`,{children:e.status})]},e.key))]})}),(0,H.jsxs)(Y,{heading:`Comments`,meta:`${String(e.commentCount)} comments`,children:[e.commentBodiesTruncated?(0,H.jsx)(E,{className:J.collectionNotice,tone:`secondary`,children:`Jira shortened comment bodies to keep this synchronized view bounded.`}):null,e.commentsTruncated?(0,H.jsx)(E,{className:J.collectionNotice,tone:`secondary`,children:`Only the newest synchronized comments are shown.`}):null,e.comments.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No comment was synchronized for this issue.`}):(0,H.jsx)(`ol`,{className:J.conversation,children:e.comments.map(e=>(0,H.jsxs)(`li`,{children:[(0,H.jsxs)(`div`,{className:J.attribution,children:[(0,H.jsx)(S,{person:e.author,size:`compact`}),e.time===null?null:(0,H.jsx)(`time`,{children:e.time})]}),(0,H.jsx)(Ke,{className:J.commentBody,value:e.body??`Comment body unavailable.`})]},e.id))})]}),(0,H.jsxs)(Y,{heading:`History`,meta:`${String(e.historyCount)} changes`,children:[e.historyTruncated?(0,H.jsx)(E,{className:J.collectionNotice,tone:`secondary`,children:`Only the newest synchronized history is shown.`}):null,e.history.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No field history was synchronized for this issue.`}):(0,H.jsx)(`ol`,{className:J.history,children:e.history.map(e=>(0,H.jsxs)(`li`,{children:[(0,H.jsxs)(`div`,{className:J.attribution,children:[(0,H.jsx)(S,{person:e.actor,size:`compact`}),e.time===null?null:(0,H.jsx)(`time`,{children:e.time})]}),(0,H.jsx)(`dl`,{children:e.changes.map((e,t)=>(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:e.field}),(0,H.jsx)(`dd`,{children:e.transition})]},`${e.field}:${String(t)}`))})]},e.id))})]})]}),X={document:`_document_173oo_1`,hero:`_hero_173oo_2`,heroHeading:`_heroHeading_173oo_3`,heroFacts:`_heroFacts_173oo_4`,executionMeta:`_executionMeta_173oo_6`,section:`_section_173oo_7`,sectionHeading:`_sectionHeading_173oo_8`,peopleLanes:`_peopleLanes_173oo_9`,actions:`_actions_173oo_11`,artifacts:`_artifacts_173oo_17`,sourceArtifacts:`_sourceArtifacts_173oo_18`,deliveryCounts:`_deliveryCounts_173oo_21`,summary:`_summary_173oo_64`,stageRail:`_stageRail_173oo_116`,partial:`_partial_173oo_142`,error:`_error_173oo_193`},Dn=({children:e,heading:t,meta:n})=>(0,H.jsxs)(`section`,{className:X.section,children:[(0,H.jsxs)(`header`,{className:X.sectionHeading,children:[(0,H.jsx)(E,{as:`h2`,variant:`section-title`,children:t}),(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:n})]}),e]}),On=({value:e})=>e===null?(0,H.jsx)(H.Fragment,{children:`Not synchronized`}):(0,H.jsx)(`time`,{dateTime:e.dateTime,children:e.label}),kn=({pipeline:e})=>(0,H.jsxs)(`article`,{className:X.document,"data-workspace-pipeline-execution-detail":!0,children:[(0,H.jsxs)(`section`,{"aria-label":`Execution identity`,className:X.hero,children:[(0,H.jsxs)(`div`,{className:X.heroHeading,children:[(0,H.jsx)(`span`,{children:`Execution`}),(0,H.jsx)(`strong`,{children:e.executionId}),(0,H.jsx)(d,{label:e.status,tone:e.status===`Succeeded`?`positive`:e.status===`Failed`?`critical`:e.status===`Running`?`progress`:e.status===`Stopped`?`caution`:`neutral`})]}),e.statusSummary===null?null:(0,H.jsx)(`p`,{className:X.summary,children:e.statusSummary}),(0,H.jsxs)(`dl`,{className:X.heroFacts,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Why`}),(0,H.jsxs)(`dd`,{children:[e.triggerType,(0,H.jsx)(`small`,{children:e.triggerDetail})]})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Revision`}),(0,H.jsx)(`dd`,{children:(0,H.jsx)(`code`,{children:e.triggerRevision})})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Where`}),(0,H.jsx)(`dd`,{children:e.targetEnvironment})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Duration`}),(0,H.jsx)(`dd`,{children:e.duration})]})]}),(0,H.jsxs)(`dl`,{className:X.executionMeta,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Pipeline`}),(0,H.jsxs)(`dd`,{children:[e.pipelineName,` · `,e.pipelineVersion]})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Started`}),(0,H.jsx)(`dd`,{children:(0,H.jsx)(On,{value:e.startedAt})})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Updated`}),(0,H.jsx)(`dd`,{children:(0,H.jsx)(On,{value:e.updatedAt})})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Mode`}),(0,H.jsx)(`dd`,{children:e.executionMode})]})]})]}),(0,H.jsx)(w,{className:X.stageRail,emptyLabel:`No stage detail was synchronized for this execution.`,heading:`Execution path`,stages:e.stages}),(0,H.jsx)(Dn,{heading:`People`,meta:`Provider identities that operated or approved this run`,children:(0,H.jsxs)(`div`,{className:X.peopleLanes,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`small`,{children:`Operators`}),(0,H.jsx)(`strong`,{children:e.operators.join(` · `)||`Not synchronized`})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`small`,{children:`Approvers`}),(0,H.jsx)(`strong`,{children:e.approvers.join(` · `)||`No approval recorded`})]})]})}),(0,H.jsxs)(Dn,{heading:`Actions`,meta:`${e.actionCountLabel} actions · ${String(e.pagesRead)} bounded pages read`,children:[e.actionsTruncated?(0,H.jsx)(`p`,{className:X.partial,children:`This is a bounded view. Additional action detail exists in CodePipeline.`}):null,e.actions.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No action detail was synchronized for this execution.`}):(0,H.jsx)(`ol`,{className:X.actions,children:e.actions.map(e=>(0,H.jsxs)(`li`,{"data-tone":e.tone,children:[(0,H.jsxs)(`header`,{children:[(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`small`,{children:e.stageName}),(0,H.jsx)(`strong`,{children:e.name})]}),(0,H.jsx)(d,{label:e.status,tone:e.tone})]}),(0,H.jsxs)(`dl`,{children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Provider`}),(0,H.jsx)(`dd`,{children:e.provider})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Duration`}),(0,H.jsx)(`dd`,{children:e.duration})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Actor`}),(0,H.jsx)(`dd`,{children:e.actor??`Not synchronized`})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Region`}),(0,H.jsx)(`dd`,{children:e.region??`Not synchronized`})]})]}),e.summary===null?null:(0,H.jsx)(`p`,{children:e.summary}),e.error===null?null:(0,H.jsx)(`p`,{className:X.error,children:e.error}),e.artifacts.length===0?null:(0,H.jsx)(`ul`,{className:X.artifacts,children:e.artifacts.map((e,t)=>(0,H.jsxs)(`li`,{children:[(0,H.jsx)(`span`,{children:e.direction}),(0,H.jsx)(`strong`,{children:e.name}),(0,H.jsx)(`small`,{children:e.accessLabel})]},`${e.direction}-${e.name}-${String(t)}`))})]},e.id))})]}),(0,H.jsx)(Dn,{heading:`Source artifacts`,meta:`Metadata only; content stays behind the authenticated proxy`,children:e.sourceArtifacts.length===0?(0,H.jsx)(E,{tone:`secondary`,children:`No source artifact metadata was synchronized.`}):(0,H.jsx)(`ul`,{className:X.sourceArtifacts,children:e.sourceArtifacts.map(e=>(0,H.jsxs)(`li`,{children:[(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`strong`,{children:e.name}),(0,H.jsx)(`code`,{children:e.revision})]}),(0,H.jsxs)(`span`,{children:[e.summary??`No summary`,(0,H.jsx)(`small`,{children:e.accessLabel})]})]},`${e.name}-${e.revision}`))})}),(0,H.jsxs)(Dn,{heading:`Delivery evidence`,meta:`Current accepted relationships around this exact run`,children:[(0,H.jsxs)(`dl`,{className:X.deliveryCounts,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Releases`}),(0,H.jsx)(`dd`,{children:e.releaseCountLabel})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Pull requests`}),(0,H.jsx)(`dd`,{children:e.pullRequestCountLabel})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Runbooks`}),(0,H.jsx)(`dd`,{children:e.runbookCountLabel})]})]}),(0,H.jsx)(E,{tone:`secondary`,children:`Use the delivery relationships below to open each connected object and inspect its evidence.`})]})]}),An=s(()=>import(`./pullRequestReviewThreadReplay-CXHspFTr.js`),__vite__mapDeps([0,1,2,3,4])),Z=An.then(({generatedClientPullRequestReviewTransport:e})=>e),jn=e=>N(e,`RateLimitedApiError`),Mn=e=>{if(!jn(e))return M(fe(1));let t=e.retryAt;return t===null?M(fe(2)):be(re,e=>M(he(Math.max(0,ue(t)-ue(e)))))},Nn=e=>{let t=[];for(let n of e.providers){let e=n.models[0];n.health===`available`&&n.capabilities.includes(`pr-review`)&&n.reviewProfile!==void 0&&e&&t.push({providerId:n.providerId,model:e,reviewProfile:n.reviewProfile,...n.displayName===void 0?{}:{displayName:n.displayName}})}return t},Pn={enqueue:(...e)=>Z.then(t=>t.enqueue(...e)),cancel:(...e)=>Z.then(t=>t.cancel(...e)),extendBudget:(...e)=>Z.then(t=>t.extendBudget(...e)),load:(...e)=>Z.then(t=>t.load(...e)),loadThread:(...e)=>Z.then(t=>t.loadThread(...e)),previewPublication:(...e)=>Z.then(t=>t.previewPublication(...e)),providers:(...e)=>Z.then(t=>t.providers(...e)),publishSuggestion:(...e)=>Z.then(t=>t.publishSuggestion(...e)),targetSuggestion:(...e)=>Z.then(t=>t.targetSuggestion(...e))},Q=(e,t)=>e.baseRevision===t.baseRevision&&e.entityId===t.entityId&&e.headRevision===t.headRevision&&e.sessionKey===t.sessionKey,Fn=(e,t,n,r,i)=>{e.catch(e=>{t.aborted||r.current===null||!Q(r.current,n)||(me(_e(`Pull-request review history boundary failed`,e)),i(e=>e._tag===`ready`&&Q(e,n)?{...e,historyAction:`failed`}:e))})},In=(e,t,n,r,i,a)=>{t.aborted||r.current===null||!Q(r.current,n)||a(t=>t._tag===`ready`&&Q(t,n)?{...t,thread:i.current??e}:t)},Ln=(e,t)=>e._tag===`unavailable`||e.subject.baseRevision===t.baseRevision&&e.subject.headRevision===t.headRevision,Rn=(e,t,n,r,i,a,o=Pn)=>{let[s,c]=(0,F.useState)(0),[l,u]=(0,F.useState)({_tag:`idle`}),[d,f]=(0,F.useState)({_tag:`idle`}),p=(0,F.useRef)(null),m=(0,F.useRef)(null),h=(0,F.useRef)(null),g=(0,F.useRef)(null),_=(0,F.useRef)(null),v=(0,F.useRef)(null),y=(0,F.useMemo)(()=>r===null||n===null?null:{baseRevision:t,entityId:e,headRevision:n,sessionKey:r},[t,e,n,r]);(0,F.useLayoutEffect)(()=>{_.current=y},[y]),(0,F.useLayoutEffect)(()=>{v.current=null},[e,r]),(0,F.useEffect)(()=>{if(r===null||n===null){u({_tag:`idle`});return}let s={baseRevision:t,entityId:e,headRevision:n,sessionKey:r},l=v.current??void 0,d=new AbortController,f=(e,t)=>g.current!==null&&Q(g.current,s)?!1:(g.current=s,me(ye(e,t)),j(Mn(t),{signal:d.signal}).then(()=>{d.signal.aborted||c(e=>e+1)},e=>{d.signal.aborted||u({_tag:`failed`,...s})}),!0);return u(e=>e._tag===`ready`&&Q(e,s)?e:{_tag:`loading`,...s}),An.then(({loadPullRequestReviewSnapshot:t})=>t(o,e,i,d.signal,l,v)).then(({catalog:e,catalogNeedsRetry:t,review:n,thread:r})=>{if(!d.signal.aborted){t||(g.current=null);let i=Nn(e);u(Ln(n,s)?{_tag:`ready`,...s,action:`idle`,historyAction:`idle`,provider:i[0]??null,providerPresets:i,review:n,thread:r}:{_tag:`failed`,...s}),t&&f(`Pull-request review provider catalog unavailable; retrying once`)}},e=>{if(!d.signal.aborted){if(P(e)){a(r),u({_tag:`failed`,...s});return}qe(e)&&f(`Pull-request review snapshot load failed; retrying once`,e)||u({_tag:`failed`,...s})}}),()=>d.abort()},[t,i,e,n,a,s,r,o]),(0,F.useEffect)(()=>{if(l._tag!==`ready`||l.review._tag!==`pending`)return;let e=new AbortController;return j(M(`2 seconds`),{signal:e.signal}).then(()=>{e.signal.aborted||c(e=>e+1)},t=>{e.signal.aborted||u({_tag:`failed`,baseRevision:l.baseRevision,entityId:l.entityId,headRevision:l.headRevision,sessionKey:l.sessionKey})}),()=>e.abort()},[l]),(0,F.useEffect)(()=>()=>{p.current?.abort(),m.current?.abort(),h.current?.abort()},[]),(0,F.useEffect)(()=>{p.current?.abort(),p.current=null,m.current?.abort(),m.current=null,h.current?.abort(),h.current=null,f({_tag:`idle`})},[e,r]),(0,F.useLayoutEffect)(()=>{m.current?.abort(),m.current=null,f(e=>e._tag===`publishing`?e:{_tag:`idle`})},[t,n]);let b=(0,F.useCallback)((e,t)=>{let n=v.current??void 0;An.then(({refreshPullRequestReviewThread:r})=>r(o,e.entityId,t,n,v)).then(n=>{In(n,t,e,_,v,u)},()=>void 0)},[o]),x=(0,F.useCallback)(()=>{if(l._tag!==`ready`||l.historyAction===`loading`||l.thread===void 0||!l.thread.hasEarlier)return;let e=l,t=l.thread;p.current?.abort();let n=new AbortController;p.current=n,u({...e,historyAction:`loading`}),Fn(An.then(({loadEarlierPullRequestReviewThreadIntoState:r})=>r(o,e,t,n.signal,_,v,a,u)),n.signal,e,_,u)},[a,l,o]),S=(0,F.useCallback)((t,n)=>{if(l._tag!==`ready`||l.review._tag===`unavailable`)return;let r=n===void 0?l.provider:l.providerPresets?.find(e=>e.providerId===n)??null;if(r===null)return;let i=l;m.current?.abort();let s=new AbortController;m.current=s,u({...i,action:`starting`}),o.enqueue(e,r,t,s.signal).then(e=>{s.signal.aborted||u(t=>t._tag===`ready`&&Q(t,i)&&Ln(e,i)?{...t,action:`idle`,review:e}:t._tag===`ready`&&Q(t,i)?{_tag:`failed`,baseRevision:i.baseRevision,entityId:i.entityId,headRevision:i.headRevision,sessionKey:i.sessionKey}:t)},e=>{s.signal.aborted||(P(e)&&a(i.sessionKey),u(e=>e._tag===`ready`&&Q(e,i)?{...e,action:`failed`}:e))})},[e,a,l,o]),C=(0,F.useCallback)(e=>{if(l._tag!==`ready`)return;let t=l.review;if(t._tag!==`pending`)return;let n=l;m.current?.abort();let r=new AbortController;m.current=r,e(t.jobId,r.signal).then(e=>{r.signal.aborted||u(t=>t._tag===`ready`&&Q(t,n)&&Ln(e,n)?{...t,review:e}:t)},e=>{r.signal.aborted||P(e)&&a(n.sessionKey)})},[a,l]),w=(0,F.useCallback)(t=>{if(l._tag!==`ready`||l.review._tag!==`completed`||l.review.jobId!==t.jobId||!l.review.report.suggestions.some(({suggestionId:e})=>e===t.suggestionId))return;let n=l;m.current?.abort();let r=new AbortController;m.current=r,f({_tag:`previewing`,selection:t}),o.previewPublication(e,t,r.signal).then(e=>{r.signal.aborted||f(e.subject.headRevision===n.headRevision?{_tag:`preview`,preview:e}:{_tag:`failed`,preview:null,selection:t})},e=>{r.signal.aborted||(P(e)&&a(n.sessionKey),f({_tag:`failed`,preview:null,selection:t}))})},[e,a,l,o]),T=(0,F.useCallback)(t=>{if(l._tag!==`ready`)return;let n=d._tag===`preview`||d._tag===`failed`?d.preview:null;if(n===null)return;let r=l,i={jobId:n.jobId,suggestionId:n.suggestionId,revisionId:n.revisionId};h.current?.abort();let s=new AbortController;h.current=s,f({_tag:`publishing`,preview:n}),o.publishSuggestion(e,i,t,n.authorityBinding,s.signal).then(e=>{if(s.signal.aborted)return;let t=e.suggestionRevision.reviewedHead===n.suggestionRevision.reviewedHead;t&&u(t=>t._tag===`ready`&&t.review._tag===`completed`&&t.review.jobId===e.jobId?{...t,review:{...t.review,report:{...t.review.report,suggestions:t.review.report.suggestions.map(t=>t.suggestionId===e.suggestionId?{...t,state:`published`}:t)}}}:t),f(t?{_tag:`published`,headSuperseded:_.current===null||e.subject.baseRevision!==_.current.baseRevision||e.subject.headRevision!==_.current.headRevision,preview:n,publication:e}:{_tag:`receipt-conflict`,preview:n,publication:e});let i=_.current;i!==null&&i.entityId===r.entityId&&i.sessionKey===r.sessionKey&&b(i,s.signal)},e=>{s.signal.aborted||(P(e)&&a(r.sessionKey),f({_tag:`failed`,preview:n,selection:i}))})},[e,a,d,b,l,o]),ee=(0,F.useCallback)(t=>{if(l._tag!==`ready`||l.review._tag!==`completed`||l.review.jobId!==t.jobId||l.provider===null||!l.review.report.suggestions.some(({suggestionId:e})=>e===t.suggestionId)||o.targetSuggestion===void 0)return;let n=l;m.current?.abort();let r=new AbortController;m.current=r,u({...n,action:`starting`}),o.targetSuggestion(e,t,l.provider,r.signal).then(e=>{r.signal.aborted||u(t=>t._tag===`ready`&&Q(t,n)&&Ln(e,n)?{...t,action:`idle`,review:e}:t)},e=>{r.signal.aborted||(P(e)&&a(n.sessionKey),u(e=>e._tag===`ready`&&Q(e,n)?{...e,action:`failed`}:e))})},[e,a,l,o]),E=y===null?{_tag:`idle`}:l._tag!==`idle`&&Q(l,y)?l:{_tag:`loading`,...y};return{cancel:(0,F.useCallback)(()=>{o.cancel!==void 0&&C((t,n)=>o.cancel(e,t,n))},[e,C,o]),cancelPublication:(0,F.useCallback)(()=>{m.current?.abort(),m.current=null,h.current?.abort(),h.current=null,f({_tag:`idle`})},[]),extendBudget:(0,F.useCallback)(()=>{o.extendBudget!==void 0&&C((t,n)=>o.extendBudget(e,t,n))},[e,C,o]),loadEarlier:x,previewPublication:w,publication:d,publishSuggestion:T,targetSuggestion:ee,retry:(0,F.useCallback)(()=>{g.current=null,c(e=>e+1)},[]),start:S,state:E}},zn=(0,F.lazy)(()=>s(()=>import(`./WorkspacePullRequestDetails-CizqydjN.js`).then(e=>({default:e.WorkspacePullRequestDetails})),__vite__mapDeps([5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,1,2,20,21,22,23,24,25]))),Bn=(e,t)=>{let n=e.split(/[?#]/u,1)[0]??``;return n===Me(t)?`Back to items`:n.includes(`/releases/`)?`Back to release`:n.endsWith(`/work`)?`Back to active work`:n.endsWith(`/timeline`)?`Back to timeline`:`Back to workspace`},Vn=({action:e,description:t,title:n,tone:r=`neutral`})=>{let i=(0,F.useRef)(null);return(0,F.useEffect)(()=>i.current?.focus(),[]),(0,H.jsx)(`section`,{className:B.state,"data-workspace-entity-state":r,ref:i,tabIndex:-1,children:(0,H.jsx)(u,{action:e,description:t,title:n,tone:r})})},Hn=()=>(0,H.jsxs)(`section`,{"aria-label":`Loading canonical entity`,className:B.loading,children:[(0,H.jsx)(l,{decorative:!1,height:`12rem`,label:`Loading canonical entity`,variant:`block`}),(0,H.jsxs)(`div`,{className:B.loadingColumns,children:[(0,H.jsx)(l,{height:`20rem`,variant:`block`}),(0,H.jsx)(l,{height:`20rem`,variant:`block`})]})]}),Un=({action:e})=>e.href===null?(0,H.jsx)(f,{disabled:!0,size:`principal`,stretch:!0,variant:`primary`,children:e.label}):e.external?(0,H.jsx)(`a`,{className:B.principalAction,href:e.href,rel:`noreferrer`,target:`_blank`,children:e.label}):(0,H.jsx)(a,{className:B.principalAction,to:e.href,children:e.label}),Wn=(e,t)=>{if(e===null)return null;let n=URL.parse(e);if(n===null||n.protocol!==`https:`)return null;let r=/^\/wiki\/spaces\/([^/]+)\/pages\/([^/]+)(?:\/|$)/u.exec(n.pathname);return r?.[1]===void 0||r[2]!==encodeURIComponent(t)?null:(n.pathname=`/wiki/spaces/${r[1]}/pages/edit-v2/${encodeURIComponent(t)}`,n.search=``,n.hash=``,n.href)},Gn=({onConfluenceSynchronize:e,presentation:t,synchronizationState:n})=>{let r=t.confluencePage===null?null:Wn(t.primaryAction.href,t.displayKey);return(0,H.jsxs)(`div`,{className:B.entityActions,children:[(0,H.jsx)(Un,{action:t.primaryAction}),r===null?null:(0,H.jsx)(`a`,{className:B.secondaryAction,href:r,rel:`noreferrer`,target:`_blank`,children:`Edit in Confluence`}),t.confluencePage===null||n===null?null:(0,H.jsxs)(`div`,{className:B.pageSynchronization,children:[(0,H.jsx)(f,{disabled:n===`syncing`,loading:n===`syncing`,onClick:e,variant:`secondary`,children:`Sync now`}),(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:n===`failed`?`Sync failed. Try again.`:n===`synchronized`?`Up to date · live sync every 15 seconds while visible`:`Live sync every 15 seconds while visible`})]})]})},Kn=({presentation:e})=>(0,H.jsxs)(`section`,{"aria-labelledby":`workspace-entity-path`,className:B.deliveryPath,children:[(0,H.jsxs)(`div`,{className:B.sectionHeading,children:[(0,H.jsx)(E,{as:`h2`,id:`workspace-entity-path`,variant:`section-title`,children:`Delivery path`}),(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:`Where this work lives`})]}),(0,H.jsxs)(`div`,{className:B.pathRail,children:[(0,H.jsxs)(`div`,{className:B.pathNode,children:[(0,H.jsx)(ee,{service:e.service,size:`compact`}),(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`strong`,{children:e.serviceName}),(0,H.jsx)(`code`,{children:e.displayKey})]})]}),e.releases.length===0?(0,H.jsx)(`div`,{className:B.pathEmpty,children:`No release membership yet`}):(0,H.jsx)(`ol`,{className:B.releasePath,children:e.releases.map(e=>(0,H.jsx)(`li`,{children:(0,H.jsx)(a,{to:e.href,children:e.label})},e.id))})]}),(0,H.jsx)(E,{tone:`secondary`,children:e.contentSummary})]}),qn=({presentation:e})=>(0,H.jsxs)(`section`,{"aria-labelledby":`workspace-entity-facts`,className:B.facts,children:[(0,H.jsx)(E,{as:`h2`,id:`workspace-entity-facts`,variant:`card-title`,children:`At a glance`}),(0,H.jsx)(`dl`,{children:e.facts.map(e=>(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:e.label}),(0,H.jsx)(`dd`,{children:e.value})]},e.label))})]}),Jn=({presentation:e})=>(0,H.jsxs)(`section`,{"aria-labelledby":`workspace-entity-evidence`,className:B.evidence,children:[(0,H.jsx)(E,{as:`h2`,id:`workspace-entity-evidence`,variant:`card-title`,children:`Provenance`}),(0,H.jsx)(y,{freshness:e.evidence.freshness,freshnessDateTime:e.evidence.freshnessDateTime,freshnessTime:e.evidence.freshnessTime,reference:e.evidence.reference,service:e.service}),(0,H.jsxs)(E,{tone:`secondary`,variant:`meta`,children:[e.evidence.itemCount,` evidence item`,e.evidence.itemCount===1?``:`s`,` ·`,` `,e.evidence.claimCount,` claim`,e.evidence.claimCount===1?``:`s`]})]}),Yn=({presentation:e})=>{let[t,n]=(0,F.useState)(e.collaborators.expandedCategories);return(0,H.jsx)(`div`,{className:B.workingCircle,children:(0,H.jsx)(v,{approvers:e.collaborators.approvers,authors:e.collaborators.authors,emptyLabel:e.collaborators.emptyLabel,expandedCategories:t,heading:`Working circle`,limit:3,onCategoryExpandedChange:(e,t)=>{n(n=>t?[...new Set([...n,e])]:n.filter(t=>t!==e))},operators:e.collaborators.operators,owners:e.collaborators.owners,reviewers:e.collaborators.reviewers,size:`compact`})})},Xn=({presentation:e})=>e.relationships.length<=4?(0,H.jsx)(C,{emptyLabel:e.relationshipEmptyLabel,heading:`Delivery relationships`,relationships:e.relationships}):(0,H.jsx)(x,{emptyLabel:e.relationshipEmptyLabel,heading:`Delivery relationships`,relationships:e.relationships}),Zn=({presentation:e})=>(0,H.jsxs)(`section`,{"aria-labelledby":`workspace-entity-activity`,className:B.activity,children:[(0,H.jsxs)(`div`,{className:B.sectionHeading,children:[(0,H.jsx)(E,{as:`h2`,id:`workspace-entity-activity`,variant:`section-title`,children:`Activity`}),(0,H.jsx)(E,{tone:`secondary`,variant:`meta`,children:`Quiet, attributable history`})]}),e.activity.length===0?(0,H.jsx)(E,{tone:`secondary`,children:e.activityEmptyLabel}):(0,H.jsx)(`ol`,{className:B.timeline,children:e.activity.map((t,n)=>(0,H.jsx)(_,{continued:n<e.activity.length-1,event:t},t.id))})]}),Qn=e=>{switch(e.reason){case`refreshing`:return`Refreshing from the connected service. The last complete inspection remains visible.`;case`refresh-failed`:return`The latest refresh failed. The last complete inspection remains visible and may be out of date.`;case`source-stale`:return`The connected service reported stale source data. Confirm current state before acting.`}},$n=({clockifyActionCanApprove:e,clockifyActionCanCorrect:t,clockifyActionState:n,clockifyActionSubmit:r,confluenceEditor:i,onSessionExpired:a,presentation:o,retry:s,reviewCanEnqueue:c,reviewCancel:d,reviewExtendBudget:p,reviewLoadEarlier:m,reviewPublication:h,reviewPublicationCancel:g,reviewPublicationPreview:_,reviewRetry:v,reviewStart:y,reviewState:b,reviewSuggestionPublish:x,reviewSuggestionRevisionTransport:S,reviewTargetSuggestion:C,sessionKey:w,stale:T})=>(0,H.jsxs)(`div`,{className:B.content,children:[T===null?null:(0,H.jsx)(u,{action:T.reason===`refreshing`?void 0:(0,H.jsx)(f,{onClick:s,children:`Retry refresh`}),announce:T.reason===`refresh-failed`?`polite`:`off`,description:Qn(T),title:T.reason===`refreshing`?`Refreshing source`:`Showing retained source data`,tone:`caution`}),o.partialMessages.map(e=>(0,H.jsx)(u,{description:e,title:`Partial canonical view`,tone:`caution`},e)),o.clockifyTimeEntry===null?null:(0,H.jsx)(Ut,{canApprove:e,canCorrect:t,onSubmit:r,submission:n,timeEntry:o.clockifyTimeEntry}),o.issue===null?null:(0,H.jsx)(En,{issue:o.issue}),o.confluencePage===null?null:(0,H.jsx)(wn,{editor:i,page:o.confluencePage}),o.pipelineExecution===null?null:(0,H.jsx)(kn,{pipeline:o.pipelineExecution}),o.pullRequest===null?null:(0,H.jsx)(F.Suspense,{fallback:(0,H.jsx)(l,{decorative:!1,height:`20rem`,label:`Loading pull request`,variant:`block`}),children:(0,H.jsx)(zn,{approvers:o.collaborators.approvers,onSessionExpired:a,onReviewCancel:d,onReviewExtendBudget:p,onReviewLoadEarlier:m,onReviewPublicationCancel:g,onReviewPublicationPreview:_,onReviewRetry:v,onReviewSuggestionPublish:x,onReviewTargetSuggestion:C,onReviewStart:y,pullRequest:o.pullRequest,reviewCanEnqueue:c,reviewPublication:h,...S===void 0?{}:{reviewSuggestionRevisionTransport:S},reviewState:b,reviewers:o.collaborators.reviewers,sessionKey:w})}),(0,H.jsx)(Kn,{presentation:o})]}),er=e=>void 0,$=()=>void 0,tr=({clockifyActionCanApprove:e=!1,clockifyActionCanCorrect:t=!1,clockifyActionState:n={_tag:`idle`},clockifyActionSubmit:r=$,confluenceCanEdit:i=!1,confluenceSynchronizationState:o=null,onAskAgent:s,onConfluenceSaved:c,onConfluenceSynchronize:l=$,onSessionExpired:u=er,originHref:d,originLabel:p,originState:h,retry:_,reviewCanEnqueue:v=!1,reviewCancel:y=$,reviewExtendBudget:b=$,reviewLoadEarlier:x=$,reviewPublication:S={_tag:`idle`},reviewPublicationCancel:C=$,reviewPublicationPreview:w=$,reviewRetry:ee=$,reviewStart:E=$,reviewState:te={_tag:`idle`},reviewSuggestionPublish:ne=$,reviewSuggestionRevisionTransport:re,reviewTargetSuggestion:ie=$,sessionKey:D=null,state:O,workspaceId:ae})=>{let k=(0,F.useRef)(null);if((0,F.useEffect)(()=>k.current?.focus(),[O._tag===`ready`||O._tag===`stale`?O.inspection.entity.projection.entityId:O._tag]),O._tag===`idle`)return(0,H.jsx)(Vn,{action:(0,H.jsx)(a,{state:h,to:d,children:p}),description:`A readable workspace session is required before this object can be loaded.`,title:`Entity unavailable`});if(O._tag===`loading`)return(0,H.jsx)(Hn,{});if(O._tag===`not-found`)return(0,H.jsx)(Vn,{action:(0,H.jsx)(a,{state:h,to:d,children:p}),description:`This object is not in this workspace. It may have been deleted, disconnected, or the address may be wrong.`,title:`Object not found`});if(O._tag===`failed`)return(0,H.jsx)(Vn,{action:(0,H.jsx)(f,{onClick:_,children:`Retry entity`}),description:`The canonical object could not be loaded. Your current workspace location is preserved.`,title:`Could not load object`,tone:`critical`});let A=Vt(ae,O.inspection),oe=O._tag===`ready`&&O.inspection.isSourceCurrent&&O.inspection.sourceActionsAvailable,se=c??_;return(0,H.jsx)(m,{component:We,children:(0,H.jsx)(T,{actions:(0,H.jsx)(Gn,{onConfluenceSynchronize:l,presentation:A,synchronizationState:o}),activity:(0,H.jsx)(Zn,{presentation:A}),agentEntry:(0,H.jsx)(g,{actionLabel:A.confluencePage===null?`Ask about this object`:`Draft with Relay`,agentName:`Relay`,context:A.agentContext,onClick:s}),collaborators:(0,H.jsx)(Yn,{presentation:A},O.inspection.entity.projection.entityId),className:B.shell,content:(0,H.jsx)($n,{clockifyActionCanApprove:oe&&e,clockifyActionCanCorrect:oe&&t,clockifyActionState:n,clockifyActionSubmit:r,confluenceEditor:{canEdit:i&&O._tag===`ready`&&O.inspection.isSourceCurrent&&O.inspection.sourceActionsAvailable,entityId:O.inspection.entity.projection.entityId,onAskAgent:s,onSaved:se,releaseId:O.inspection.entity.canonicalReleaseId,title:A.title},onSessionExpired:u,presentation:A,reviewCanEnqueue:v,reviewCancel:y,reviewExtendBudget:b,reviewPublication:S,reviewPublicationCancel:C,reviewLoadEarlier:x,reviewPublicationPreview:w,reviewRetry:ee,...re===void 0?{}:{reviewSuggestionRevisionTransport:re},reviewSuggestionPublish:ne,reviewTargetSuggestion:ie,reviewStart:E,reviewState:te,retry:_,sessionKey:D,stale:O._tag===`stale`?O:null}),"data-service":A.service,"data-workspace-entity-id":O.inspection.entity.projection.entityId,evidence:(0,H.jsx)(Jn,{presentation:A}),facts:(0,H.jsx)(qn,{presentation:A}),freshness:A.freshness,freshnessDateTime:A.freshnessDateTime,freshnessTime:A.freshnessTime,navigation:(0,H.jsx)(a,{className:B.back,state:h,to:d,children:p}),reason:`${A.displayKey} is ${A.verdict.toLocaleLowerCase(`en-US`)} in ${A.serviceName}.`,ref:k,relationships:(0,H.jsx)(Xn,{presentation:A}),service:A.service,tabIndex:-1,title:A.title,tone:A.tone,verdict:A.verdict})})},nr=({entityId:e,workspaceId:t})=>{let r=i(),a=p(),s=o(),c=n(),l=r.controller.state._tag===`ready`?r.controller.state.portfolio.generatedAt:`pending`,u=h(a.state),d=De(t,e,l,u,a.invalidateSession),f=(d.state._tag===`ready`||d.state._tag===`stale`)&&d.state.inspection.entity.projection.details._tag===`page`?d.state.inspection.source.pluginConnectionId:null,m=f!==null&&(d.state._tag===`ready`||d.state._tag===`stale`)&&d.state.inspection.sourceSynchronizationAvailable&&a.state._tag===`authenticated`&&a.state.session.permission===`workspace-owner`,g=f!==null&&(d.state._tag===`ready`||d.state._tag===`stale`)?ue(d.state.inspection.source.synchronizedAt):null,_=(0,F.useCallback)(async t=>{if(f===null)return null;let n=await Oe.load(e,t);return n.entity.projection.entityId===e&&n.source.pluginConnectionId===f?ue(n.source.synchronizedAt):null},[f,e]),v=fn({enabled:m,onSessionExpired:a.invalidateSession,onSynchronized:d.retry,pluginConnectionId:f,readSynchronizationRevision:_,sessionKey:u,synchronizationRevision:g}),y=Gt(e,u,a.invalidateSession,d.retry),b=a.state._tag===`authenticated`&&a.state.session.permission===`workspace-owner`,x=(d.state._tag===`ready`||d.state._tag===`stale`)&&d.state.inspection.entity.projection.details._tag===`pull-request`?{baseRevision:d.state.inspection.entity.projection.details.baseRevision??null,headRevision:d.state.inspection.entity.projection.details.headRevision}:null,S=Rn(e,x?.baseRevision??null,x?.headRevision??null,u,b,a.invalidateSession),C=Pe(s.state,t,e),w=Fe(C.origin),T=d.state._tag===`ready`||d.state._tag===`stale`?d.state.inspection.entity:{canonicalReleaseId:null,releaseIds:[],releaseMembershipsTruncated:!1},ee=new Set(r.controller.state._tag===`ready`?r.controller.state.portfolio.releases.map(({id:e})=>e):[]),E=Ne(C.origin,t,s,T,ee);return(0,H.jsx)(tr,{clockifyActionCanApprove:a.state._tag===`authenticated`&&(a.state.session.permission===`workspace-owner`||a.state.session.permission===`workspace-approver`),clockifyActionCanCorrect:a.state._tag===`authenticated`&&a.state.session.permission===`workspace-owner`,clockifyActionState:y.state,clockifyActionSubmit:y.submit,confluenceCanEdit:a.state._tag===`authenticated`&&a.state.session.permission===`workspace-owner`,confluenceSynchronizationState:m?v.state:null,onAskAgent:()=>c(E,{state:s.state}),onConfluenceSaved:v.synchronizeAfterMutation,onConfluenceSynchronize:v.synchronizeNow,onSessionExpired:a.invalidateSession,originHref:w,originLabel:Bn(w,t),originState:C.origin.state,retry:d.retry,reviewCanEnqueue:b,reviewCancel:S.cancel,reviewExtendBudget:S.extendBudget,reviewPublication:S.publication,reviewPublicationCancel:S.cancelPublication,reviewLoadEarlier:S.loadEarlier,reviewPublicationPreview:S.previewPublication,reviewRetry:S.retry,reviewSuggestionPublish:S.publishSuggestion,reviewTargetSuggestion:S.targetSuggestion,reviewStart:S.start,reviewState:S.state,state:d.state,sessionKey:u,workspaceId:t})},rr=()=>{let e=i(),t=Ie(r().entityId);return t===null?(0,H.jsx)(Vn,{action:(0,H.jsx)(a,{to:Me(e.workspaceId),children:`Back to items`}),description:`The object address is not a canonical entity identifier.`,title:`Object not found`}):(0,H.jsx)(nr,{entityId:t,workspaceId:e.workspaceId})};export{rr as WorkspaceEntityRoute,tr as WorkspaceEntityView,Wn as confluenceEditHref};
14
+ //# sourceMappingURL=WorkspaceEntityRoute-kbnrQ_lY.js.map