@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,10 +1,10 @@
1
- import { $n as PrReviewSuggestionEdit, $r as GovernedActionAuthorityMismatch, Ar as PrReviewSuggestionId, B as LedgerRevision, Br as GovernedActionCommandId, Cr as PrReviewReport, Ct as ReleaseVersion, Dr as PrReviewSuggestionDraft, Fr as reconcilePrReviewReports, Ft as deriveReleaseRelay, Hi as derivePersonInitials, Ii as Person, Jn as PluginHealth, Mi as Actor, Nr as derivePrReviewOutcome, Pr as prReviewSuggestionIdentityMaterial, Qn as PrReviewSuggestionAgentAuthor, Sr as PrReviewReplacement, St as ReleaseServiceName, Tr as PrReviewSuggestion, Y as evidenceFreshnessAt, Yn as evaluateFreshnessAt, Yr as GovernedActionUnknownOutcome, _i as GovernedActionPluginConnectionRevision, ar as PrReviewSuggestionRevisionPageSize, bt as Release, ci as GovernedActionAuthorizationV1, dr as PrReviewCompletion, er as PrReviewSuggestionOperatorAuthor, gi as GovernedActionPluginConnectionAuthorityDigest, gr as PrReviewNoteId, hi as GovernedActionIdempotencyKey, hr as PrReviewNoteDraft, ir as PrReviewSuggestionRevisionPage, j as DeliveryRelationship, li as GovernedActionEnvelopeDigest, nr as PrReviewSuggestionRevision, o as WorkspaceSettingsV1, oi as GovernedActionAttemptV1, ti as governedActionAuthorityMismatches, ui as GovernedActionEnvelopeMaterialV1, ut as NormalizedIssueAttributes, vi as GovernedActionPolicyBinding, wi as GovernedActionTargetSnapshotV1, wr as PrReviewSubject, xi as GovernedActionPolicyEvaluationV1, xt as ReleaseLifecycle, yr as PrReviewPrevention, zi as Role, zr as GovernedActionCommandDigest } from "./workspaceSettings-C2Zsk6RI.js";
1
+ import { $n as PrReviewSuggestionEdit, $r as GovernedActionAuthorityMismatch, Ar as PrReviewSuggestionId, B as LedgerRevision, Br as GovernedActionCommandId, Cr as PrReviewReport, Ct as ReleaseVersion, Dr as PrReviewSuggestionDraft, Fr as reconcilePrReviewReports, Ft as deriveReleaseRelay, Hi as derivePersonInitials, Ii as Person, Jn as PluginHealth, Mi as Actor, Nr as derivePrReviewOutcome, Pr as prReviewSuggestionIdentityMaterial, Qn as PrReviewSuggestionAgentAuthor, Sr as PrReviewReplacement, St as ReleaseServiceName, Tr as PrReviewSuggestion, Y as evidenceFreshnessAt, Yn as evaluateFreshnessAt, Yr as GovernedActionUnknownOutcome, _i as GovernedActionPluginConnectionRevision, ar as PrReviewSuggestionRevisionPageSize, bt as Release, ci as GovernedActionAuthorizationV1, dr as PrReviewCompletion, er as PrReviewSuggestionOperatorAuthor, gi as GovernedActionPluginConnectionAuthorityDigest, gr as PrReviewNoteId, hi as GovernedActionIdempotencyKey, hr as PrReviewNoteDraft, ir as PrReviewSuggestionRevisionPage, j as DeliveryRelationship, li as GovernedActionEnvelopeDigest, nr as PrReviewSuggestionRevision, o as WorkspaceSettingsV1, oi as GovernedActionAttemptV1, ti as governedActionAuthorityMismatches, ui as GovernedActionEnvelopeMaterialV1, ut as NormalizedIssueAttributes, vi as GovernedActionPolicyBinding, wi as GovernedActionTargetSnapshotV1, wr as PrReviewSubject, xi as GovernedActionPolicyEvaluationV1, xt as ReleaseLifecycle, yr as PrReviewPrevention, zi as Role, zr as GovernedActionCommandDigest } from "./workspaceSettings-sv8h_h2P.js";
2
2
  import { $ as SourceRevision$1, A as DiffInventoryPageRequestV1, D as DiffContentRangeRequestV1, Dt as ReviewSuggestionPublicationReservationId, Et as ReviewCommandArtifactId, H as PluginSyncRequestV1, I as PluginEntityReferenceV1, K as MaximumPluginPayloadBytes, L as PluginEntityType, M as DiffInventoryPageV1, N as NormalizedPluginEventV1, Nt as UtcTimestamp, O as DiffContentRangeRequestV2, Ot as RoleAssignmentId, P as PluginCheckpointV1, Q as Revision, S as PluginProviderOperationId, T as ProposePluginActionRequestV1, Tt as ReleaseId, U as ReadPluginEntityRequestV1, V as PluginSyncPageV1, W as ReadPluginEntityResultV1, Y as hasMaximumPluginJsonBytes, Z as ProviderId, _ as PluginActionPreflightV1, _t as PersonId, a as PluginConfigurationFieldV1, at as EntityId, b as PluginActionReconciliationRequestV1, bt as ProviderAccountId, ct as EvidenceClaimId, dt as GovernedActionAttemptId, et as SourceUrl, f as PluginActionActorIdentityV1, ft as GovernedActionAuthorizationId, g as PluginActionPayloadDigest, gt as JobId, h as PluginActionDispatchResultV1, it as DomainEventId, j as DiffInventoryPageRequestV2, jt as WorkspaceId, k as DiffContentRangeV1, kt as SessionId, l as AuthorizedPluginActionV1, m as PluginActionCancellationResultV1, mt as GovernedActionTransitionId, n as NegotiatedPluginDescriptorV1, nt as AgentId, ot as EnvironmentId, p as PluginActionCancellationRequestV1, pt as GovernedActionId, rt as AgentThreadId, tt as VendorImmutableId, ut as FollowedResourceId, v as PluginActionProposalV1, vt as PluginConnectionId, x as PluginActionReconciliationResultV1, y as PluginActionReconciliationKey, yt as PrReviewSuggestionRevisionId } from "./descriptor-CCvNzSZL.js";
3
- import { C as PublishedReviewComment, Cn as PayloadTooLargeApiError, D as PullRequestReviewNotStarted, Dn as UnauthorizedApiError, Dt as DiscoveredAtlassianProfile, E as PullRequestReviewInterrupted, En as ServiceUnavailableApiError, G as ReviewSuggestionPublicationAuthorityBinding, I as ReleaseAgentThreadCursor, It as PluginConfigurationKey, J as ReviewSuggestionPublicationPreview, K as ReviewSuggestionPublicationContent, M as PullRequestReviewThreadPage, N as PullRequestReviewUnavailable, O as PullRequestReviewPending, Sn as NotFoundApiError, T as PullRequestReviewFailed, Tn as RequestTimedOutApiError, W as ReviewAgentProfileId, X as ReviewSuggestionRevisionPage, _n as ConflictApiError, an as CsrfToken$1, b as MAXIMUM_REVIEW_SUGGESTION_PUBLICATION_CONTENT_LENGTH, bn as ForbiddenApiError, ct as AtlassianOAuthGrantExchangeResponse, f as DurableAgentPrompt, hn as SessionMutationAuth, j as PullRequestReviewThreadEvent, k as PullRequestReviewStale, lt as AtlassianOAuthGrantId, on as CurrentSession, p as DurableAgentProviderId, pn as SessionCookieAuth, pt as AtlassianOAuthSite, r as AgentModelId, vn as CorrelationId, w as PullRequestReviewCompleted, wn as RateLimitedApiError, wt as CreatePluginConnectionValue, xn as InvalidRequestApiError } from "./agent-ZvwskOQu.js";
3
+ import { An as UnauthorizedApiError, C as PublishedReviewComment, Cn as ForbiddenApiError, D as PullRequestReviewNotStarted, Dn as RateLimitedApiError, Dt as DiscoveredAtlassianProfile, E as PullRequestReviewInterrupted, En as PayloadTooLargeApiError, G as ReviewSuggestionPublicationAuthorityBinding, I as ReleaseAgentThreadCursor, It as PluginConfigurationKey, J as ReviewSuggestionPublicationPreview, K as ReviewSuggestionPublicationContent, M as PullRequestReviewThreadPage, N as PullRequestReviewUnavailable, O as PullRequestReviewPending, On as RequestTimedOutApiError, T as PullRequestReviewFailed, Tn as NotFoundApiError, W as ReviewAgentProfileId, X as ReviewSuggestionRevisionPage, b as MAXIMUM_REVIEW_SUGGESTION_PUBLICATION_CONTENT_LENGTH, bn as ConflictApiError, ct as AtlassianOAuthGrantExchangeResponse, f as DurableAgentPrompt, gn as SessionCookieAuth, j as PullRequestReviewThreadEvent, k as PullRequestReviewStale, kn as ServiceUnavailableApiError, lt as AtlassianOAuthGrantId, mn as PairingCode, on as CsrfToken$1, p as DurableAgentProviderId, pt as AtlassianOAuthSite, r as AgentModelId, sn as CurrentSession, vn as SessionMutationAuth, w as PullRequestReviewCompleted, wn as InvalidRequestApiError, wt as CreatePluginConnectionValue, xn as CorrelationId } from "./agent-xQhAQXly.js";
4
4
  import { a as PluginPipelineLogPageRequestV1, c as PluginDiscoveryV1, n as PluginPipelineArtifactRangeRequestV1, o as PluginPipelineLogPageV1, r as PluginPipelineArtifactRangeV1 } from "./plugins-DiPrfzV8.js";
5
- import { F as DiffFileAnchor, b as SafeMediaContentType, c as workspaceSettingsEtag, r as WorkspacePresentationReadModel, s as WorkspaceSettingsRevision, t as ControlCenterApi } from "./controlCenterApi-5j3gOXgE.js";
5
+ import { F as DiffFileAnchor, b as SafeMediaContentType, c as workspaceSettingsEtag, r as WorkspacePresentationReadModel, s as WorkspaceSettingsRevision, t as ControlCenterApi } from "./controlCenterApi-DNXK7MT1.js";
6
6
  import { r as firstPartyServiceIdentityByProvider } from "./firstPartyServices-Cdzjcs2H.js";
7
- import { $ as negotiatePluginDescriptorV1, A as PullRequestReviews, An as ReviewSuggestionPublicationDigest, Ar as RecordAlreadyExistsError, B as persistenceLayerFromDatabase, Br as BackupIntegrityError, C as CodePipelineReads, Ct as ProjectionRow, D as MediaReads, Dr as PersistenceOperationError, E as LiveEvents, Er as PersistenceConfigError, Et as AgentJobRepository, F as TimelineReads, Fn as SecretRef, Fr as SourceIdentityMismatchError, Ft as AgentAttemptSequence, G as authorizeWorkspaceSettingsGovernanceRequest, H as ReviewCommandArtifactMetadata, Hr as BackupManifestError, I as WorkspaceSettingsAdministration, In as makePersistedRowQuarantine, Jn as ProviderAccountDisplayName, K as governedHumanMutationPolicyAllows, Kn as PluginConnectionDisplayName, Kr as BlobDigest, L as PluginConnection, Ln as QuarantineRepository, Lt as AgentEventCursor, M as ReleaseAgentJobs, N as ReleaseAgentTurns, Nr as RevisionConflictError, O as PluginAdministration, P as TimelineExportAudits, Pn as blobPath, Q as hasPluginCapability, Qt as AgentThreadEventPageSize, R as Persistence, Rn as ContentBlobDigest, Rt as AgentJobInputError, S as AuthorizedShares, St as EvidenceRow, T as DeliveryGraphInspection, Tr as PersistedRecordError, U as ReviewCommandArtifactRepository, Un as FollowedResourceDisplayName, Ur as BackupSqlError, Ut as AgentLeaseOwner, V as ReviewCommandArtifactHandle, Vr as BackupLimitError, W as WorkspaceSettingsRepository, Wr as BackupStorageError, Wt as AgentLeaseToken, Zt as AgentThreadEvent, _ as ApplicationConflict, _n as MAXIMUM_REVIEW_BUDGET_MILLIS, _r as validateCurrentSchema, _t as makeGovernedActionEnvelope, ar as VendorAccountId, at as makeGovernedActionTransactionWrite, b as ApplicationResourceNotFound, bt as makeDeliveryGraphDecoders, c as RawConfluenceAttachmentPage, ct as canonicalizeGovernedActionJson, d as RawConfluencePage, dr as mapPersistenceOperation, dt as digestGovernedActionPayload, et as PluginPageId, f as RawConfluenceSpacePage, fr as readChanges, ft as digestGovernedActionPolicyDefinition, g as RawConfluenceWatcherPage, gr as CURRENT_SCHEMA_VERSION, gt as encodeGovernedActionUnknownOutcome, h as RawConfluenceVersionPage, ht as encodeGovernedActionDispatchOutcome, i as DomainEventWakeups, it as StoredPluginConfigurationKey, j as RelationshipRepairProposals, jr as RecordNotFoundError, k as PortfolioSnapshots, kn as ReviewSuggestionPublicationCommentLocator, l as RawConfluenceCurrentUser, lt as digestCanonicalGovernedActionJson, m as RawConfluenceVersion, mr as databaseLayer, mt as digestGovernedActionTransitionCommand, n as reconcileRelationshipInferencePolicy, nr as RecordRevision, nt as PluginStreamKey, o as supportsFirstPartySynchronization, or as VendorResourceId, ot as makeGovernedActionTransaction, p as RawConfluenceUsers, pr as Database, pt as digestGovernedActionPolicyEvaluation, r as appendPortfolioInvalidation, rt as StoredPluginConfiguration, s as ConfluencePageAttributesV1, st as GovernedActionDigestError, tt as PluginRecordKey, u as RawConfluenceDraftPage, ur as BlobClassification, ut as digestGovernedActionEvidenceSet, v as ApplicationInvalidRequest, vn as PrReviewThreadContextSnapshot, vt as verifyGovernedActionEnvelope, w as CompleteDiffReads, wt as decodeRows$1, x as ApplicationServiceUnavailable, xr as decodePersistenceConfig, xt as ClaimRow, y as ApplicationRateLimited, yn as PrReviewThreadSubject, yt as GovernedActionCommitInput, zr as BackupInputError, zt as AgentJobPrompt } from "./relationshipInferenceMaterialization-CR6xyMNL.js";
7
+ import { $ as negotiatePluginDescriptorV1, A as PullRequestReviews, An as ReviewSuggestionPublicationDigest, Ar as RecordAlreadyExistsError, B as persistenceLayerFromDatabase, Br as BackupIntegrityError, C as CodePipelineReads, Ct as ProjectionRow, D as MediaReads, Dr as PersistenceOperationError, E as LiveEvents, Er as PersistenceConfigError, Et as AgentJobRepository, F as TimelineReads, Fn as SecretRef, Fr as SourceIdentityMismatchError, Ft as AgentAttemptSequence, G as authorizeWorkspaceSettingsGovernanceRequest, H as ReviewCommandArtifactMetadata, Hr as BackupManifestError, I as WorkspaceSettingsAdministration, In as makePersistedRowQuarantine, Jn as ProviderAccountDisplayName, K as governedHumanMutationPolicyAllows, Kn as PluginConnectionDisplayName, Kr as BlobDigest, L as PluginConnection, Ln as QuarantineRepository, Lt as AgentEventCursor, M as ReleaseAgentJobs, N as ReleaseAgentTurns, Nr as RevisionConflictError, O as PluginAdministration, P as TimelineExportAudits, Pn as blobPath, Q as hasPluginCapability, Qt as AgentThreadEventPageSize, R as Persistence, Rn as ContentBlobDigest, Rt as AgentJobInputError, S as AuthorizedShares, St as EvidenceRow, T as DeliveryGraphInspection, Tr as PersistedRecordError, U as ReviewCommandArtifactRepository, Un as FollowedResourceDisplayName, Ur as BackupSqlError, Ut as AgentLeaseOwner, V as ReviewCommandArtifactHandle, Vr as BackupLimitError, W as WorkspaceSettingsRepository, Wr as BackupStorageError, Wt as AgentLeaseToken, Zt as AgentThreadEvent, _ as ApplicationConflict, _n as MAXIMUM_REVIEW_BUDGET_MILLIS, _r as validateCurrentSchema, _t as makeGovernedActionEnvelope, ar as VendorAccountId, at as makeGovernedActionTransactionWrite, b as ApplicationResourceNotFound, bt as makeDeliveryGraphDecoders, c as RawConfluenceAttachmentPage, ct as canonicalizeGovernedActionJson, d as RawConfluencePage, dr as mapPersistenceOperation, dt as digestGovernedActionPayload, et as PluginPageId, f as RawConfluenceSpacePage, fr as readChanges, ft as digestGovernedActionPolicyDefinition, g as RawConfluenceWatcherPage, gr as CURRENT_SCHEMA_VERSION, gt as encodeGovernedActionUnknownOutcome, h as RawConfluenceVersionPage, ht as encodeGovernedActionDispatchOutcome, i as DomainEventWakeups, it as StoredPluginConfigurationKey, j as RelationshipRepairProposals, jr as RecordNotFoundError, k as PortfolioSnapshots, kn as ReviewSuggestionPublicationCommentLocator, l as RawConfluenceCurrentUser, lt as digestCanonicalGovernedActionJson, m as RawConfluenceVersion, mr as databaseLayer, mt as digestGovernedActionTransitionCommand, n as reconcileRelationshipInferencePolicy, nr as RecordRevision, nt as PluginStreamKey, o as supportsFirstPartySynchronization, or as VendorResourceId, ot as makeGovernedActionTransaction, p as RawConfluenceUsers, pr as Database, pt as digestGovernedActionPolicyEvaluation, r as appendPortfolioInvalidation, rt as StoredPluginConfiguration, s as ConfluencePageAttributesV1, st as GovernedActionDigestError, tt as PluginRecordKey, u as RawConfluenceDraftPage, ur as BlobClassification, ut as digestGovernedActionEvidenceSet, v as ApplicationInvalidRequest, vn as PrReviewThreadContextSnapshot, vt as verifyGovernedActionEnvelope, w as CompleteDiffReads, wt as decodeRows$1, x as ApplicationServiceUnavailable, xr as decodePersistenceConfig, xt as ClaimRow, y as ApplicationRateLimited, yn as PrReviewThreadSubject, yt as GovernedActionCommitInput, zr as BackupInputError, zt as AgentJobPrompt } from "./relationshipInferenceMaterialization-Dyix96px.js";
8
8
  import { a as PluginConflictFailure, c as PluginRateLimitFailure, d as PluginUnsupportedCapabilityFailure, f as pluginFailureClass, i as PluginConfigurationFailure, l as PluginTimeoutFailure, n as PluginAuthorizationFailure, o as PluginMalformedResponseFailure, s as PluginOutageFailure, t as PluginAuthenticationFailure, u as PluginUnknownOutcomeFailure } from "./failures-CesHLYbN.js";
9
9
  import { t as decodeCodePipelineStateProviderOutput } from "./CodePipelineStateDecoder-CNiFRgSi.js";
10
10
  import { AgentContextFingerprint, AgentContextMismatchError, AgentProviderError, AgentProviderId, AgentRunId, AgentRuntimeEvent, AgentRuntimeMetadata, AgentRuntimeMetadataError, AgentRuntimeProtocolError, AgentSessionRef, MAXIMUM_AGENT_OUTPUT_TEXT_LENGTH, MAXIMUM_MODEL_VISIBLE_TOOL_RESULT_BYTES, attachAgentRuntimeMetadata, makeAgentRuntime, makeToolAgentAdapter, readLocalCliRuntimeMetadata, runToolAgent } from "@knpkv/ai-runtime";
@@ -2937,6 +2937,8 @@ Schema.Class("PRComment")({
2937
2937
  filePath: Schema.optional(Schema.String),
2938
2938
  lineNumber: Schema.optional(Schema.Number)
2939
2939
  });
2940
+ /** Provider-relative side of a pull-request file position. */
2941
+ var RelativeFileVersion = Schema.Literals(["BEFORE", "AFTER"]);
2940
2942
  var PRCommentJson = Schema.Struct({
2941
2943
  id: Schema.String,
2942
2944
  content: Schema.String,
@@ -2955,6 +2957,7 @@ Schema.Struct({
2955
2957
  filePath: Schema.optional(Schema.String),
2956
2958
  beforeCommitId: Schema.optional(Schema.String),
2957
2959
  afterCommitId: Schema.optional(Schema.String),
2960
+ relativeFileVersion: Schema.optional(RelativeFileVersion),
2958
2961
  comments: Schema.Array(CommentThreadJson)
2959
2962
  });
2960
2963
  var PersistentNotificationType = Schema.Literals([
@@ -3691,7 +3694,7 @@ var CodeCommitReviewTarget = Schema.Struct({
3691
3694
  var CodeCommitReviewLocation = class extends Schema.Class("CodeCommitReviewLocation")({
3692
3695
  filePath: ReviewFilePath,
3693
3696
  filePosition: ReviewFilePosition,
3694
- relativeFileVersion: Schema.Literals(["BEFORE", "AFTER"])
3697
+ relativeFileVersion: RelativeFileVersion
3695
3698
  }) {};
3696
3699
  var CommentActionFields = {
3697
3700
  target: CodeCommitReviewTarget,
@@ -12725,6 +12728,7 @@ var makeConfluencePageClient = (api) => ({
12725
12728
  status: ["current"]
12726
12729
  }))).pipe(Effect$1.flatMap(HttpClientResponse.filterStatusOk), Effect$1.flatMap(HttpClientResponse.schemaBodyJson(RawConfluencePage)))),
12727
12730
  getPageDraft: (pageId) => bounded("confluence-page-draft-read", api.v2.httpClient.execute(HttpClientRequest.get(`/pages/${encodeURIComponent(pageId)}`).pipe(HttpClientRequest.setUrlParams({
12731
+ "body-format": "atlas_doc_format",
12728
12732
  "get-draft": true,
12729
12733
  status: ["draft"]
12730
12734
  }))).pipe(Effect$1.flatMap(HttpClientResponse.filterStatusOk), Effect$1.flatMap(HttpClientResponse.schemaBodyJson(RawConfluenceDraftPage)))),
@@ -12948,6 +12952,15 @@ var reconciliationKey = (payload) => PluginActionReconciliationKey.make(Schema$1
12948
12952
  ":",
12949
12953
  payload.targetVersion
12950
12954
  ]));
12955
+ var confirmedRejectedUpdate = (payload, observedAt) => ({
12956
+ _tag: "confirmed",
12957
+ receipt: {
12958
+ status: "failed",
12959
+ providerOperationId: PluginProviderOperationId.make(`rejected:${payload.pageId}:v${payload.targetVersion}`),
12960
+ safeSummary: "Confluence rejected the authorized page publication without applying it",
12961
+ observedAt
12962
+ }
12963
+ });
12951
12964
  var decodeReconciliationKey = (key) => {
12952
12965
  return Schema$1.decodeUnknownEffect(ReconciliationLocator)(key).pipe(Effect$1.map(([, pageId, , targetVersion]) => ({
12953
12966
  pageId,
@@ -12967,15 +12980,15 @@ var readExactVersion = Effect$1.fn("ConfluenceGovernedActions.readExactVersion")
12967
12980
  version
12968
12981
  };
12969
12982
  });
12970
- var hasVisibleDraft = Effect$1.fn("ConfluenceGovernedActions.hasVisibleDraft")(function* (client, pageId, spaceId) {
12971
- const result = yield* client.getPageDraft(pageId).pipe(Effect$1.result);
12983
+ var hasDivergentDraft = Effect$1.fn("ConfluenceGovernedActions.hasDivergentDraft")(function* (client, page) {
12984
+ const result = yield* client.getPageDraft(page.id).pipe(Effect$1.result);
12972
12985
  if (Result$1.isFailure(result)) {
12973
12986
  if (result.failure.reason === "not-found") return false;
12974
12987
  return yield* clientFailure(result.failure).pipe(Effect$1.flatMap(Effect$1.fail));
12975
12988
  }
12976
12989
  const draft = yield* Schema$1.decodeUnknownEffect(RawConfluenceDraftPage)(result.success).pipe(Effect$1.mapError(() => malformed$2("confluence-page-draft-read", "confluence-page-draft-invalid")));
12977
- if (draft.id !== pageId || draft.spaceId !== spaceId) return yield* malformed$2("confluence-page-draft-read", "confluence-page-draft-scope-mismatch");
12978
- return true;
12990
+ if (draft.id !== page.id || draft.spaceId !== page.spaceId) return yield* malformed$2("confluence-page-draft-read", "confluence-page-draft-scope-mismatch");
12991
+ return draft.parentId === void 0 || page.parentId === void 0 || draft.ownerId === void 0 || page.ownerId === void 0 || draft.parentId !== page.parentId || draft.ownerId !== page.ownerId || draft.title !== page.title || draft.body.atlas_doc_format.value !== page.body?.atlas_doc_format?.value;
12979
12992
  });
12980
12993
  /** Build the governed Confluence proposal and executor surfaces. @internal */
12981
12994
  var makeConfluenceGovernedActions = (input) => {
@@ -13164,7 +13177,7 @@ var makeConfluenceGovernedActions = (input) => {
13164
13177
  reasons: ["Confluence page revision changed after authorization"],
13165
13178
  checkedAt
13166
13179
  });
13167
- if (yield* hasVisibleDraft(input.client, payload.pageId, input.spaceId)) return yield* output("preflight", PluginActionPreflightV1, {
13180
+ if (yield* hasDivergentDraft(input.client, page)) return yield* output("preflight", PluginActionPreflightV1, {
13168
13181
  _tag: "blocked",
13169
13182
  reasons: ["Confluence page has an unpublished draft that this publication could overwrite"],
13170
13183
  checkedAt
@@ -13180,7 +13193,13 @@ var makeConfluenceGovernedActions = (input) => {
13180
13193
  const payload = yield* decodeAuthorizedAction(request, input.spaceId).pipe(Effect$1.provideService(Crypto$1.Crypto, input.cryptoService));
13181
13194
  const locator = reconciliationKey(payload);
13182
13195
  const marker = versionMarker(request.idempotencyKey, request.payloadDigest, payload.versionMessage);
13183
- if (yield* hasVisibleDraft(input.client, payload.pageId, input.spaceId)) return yield* new PluginConflictFailure({
13196
+ const currentResult = yield* input.client.getPage(payload.pageId).pipe(Effect$1.result);
13197
+ if (Result$1.isFailure(currentResult)) {
13198
+ if (currentResult.failure.reason === "not-found") return confirmedRejectedUpdate(payload, yield* DateTime$1.now);
13199
+ return yield* clientFailure(currentResult.failure).pipe(Effect$1.flatMap(Effect$1.fail));
13200
+ }
13201
+ const currentPage = yield* decodePage("confluence-execute-page", currentResult.success, payload.pageId, input.spaceId);
13202
+ if (yield* hasDivergentDraft(input.client, currentPage)) return yield* new PluginConflictFailure({
13184
13203
  operation: "execute-authorized-action",
13185
13204
  diagnosticCode: "confluence-page-draft-present"
13186
13205
  });
@@ -13197,15 +13216,7 @@ var makeConfluenceGovernedActions = (input) => {
13197
13216
  reconciliationKey: locator
13198
13217
  });
13199
13218
  if (result.failure.reason !== "not-found" && result.failure.reason !== "invalid-request") return yield* clientFailure(result.failure).pipe(Effect$1.flatMap(Effect$1.fail));
13200
- return {
13201
- _tag: "confirmed",
13202
- receipt: {
13203
- status: "failed",
13204
- providerOperationId: PluginProviderOperationId.make(`rejected:${payload.pageId}:v${payload.targetVersion}`),
13205
- safeSummary: "Confluence rejected the authorized page publication without applying it",
13206
- observedAt
13207
- }
13208
- };
13219
+ return confirmedRejectedUpdate(payload, observedAt);
13209
13220
  }
13210
13221
  const page = yield* decodePage("confluence-page-update", result.success, payload.pageId, input.spaceId).pipe(Effect$1.catchTag("PluginMalformedResponseFailure", () => Effect$1.fail(new PluginUnknownOutcomeFailure({
13211
13222
  operation: "execute-authorized-action",
@@ -13721,6 +13732,8 @@ var fitSyncAttributes = (attributes) => {
13721
13732
  const attachments = [...attributes.attachments];
13722
13733
  let compacted = {
13723
13734
  ...attributes,
13735
+ content: null,
13736
+ contentState: "lazy",
13724
13737
  versions,
13725
13738
  contributors,
13726
13739
  attachments,
@@ -13915,6 +13928,9 @@ var normalizeSyncEvents = Effect$1.fn("ConfluencePage.normalizeSyncEvents")(func
13915
13928
  return (yield* Effect$1.forEach(contexts, Effect$1.fn("ConfluencePage.normalizeSyncPage")(function* (context) {
13916
13929
  const { history, inventory, page, versions, watchers } = context;
13917
13930
  const contributors = contributorsFromUsers(rolesByPage.get(page.id) ?? /* @__PURE__ */ new Map(), users);
13931
+ const adf = page.body?.atlas_doc_format?.value;
13932
+ const converted = adf === void 0 ? null : yield* toSafeConfluenceMarkdown(input.converter, adf);
13933
+ const markdown = converted === null || converted.trim().length === 0 ? null : converted;
13918
13934
  const attributes = yield* decodeProvider("confluence-sync", "confluence-sync-page-attributes-invalid", ConfluencePageAttributesV1, fitSyncAttributes({
13919
13935
  schemaVersion: 1,
13920
13936
  status: page.status,
@@ -13923,8 +13939,11 @@ var normalizeSyncEvents = Effect$1.fn("ConfluencePage.normalizeSyncEvents")(func
13923
13939
  createdAt: page.createdAt,
13924
13940
  updatedAt: page.version.createdAt,
13925
13941
  currentVersion: page.version.number,
13926
- content: null,
13927
- contentState: "lazy",
13942
+ content: markdown === null ? null : {
13943
+ representation: "safe-markdown",
13944
+ markdown
13945
+ },
13946
+ contentState: markdown === null ? "lazy" : "loaded",
13928
13947
  versions: versions.map((version) => ({
13929
13948
  number: version.number,
13930
13949
  createdAt: version.createdAt,
@@ -14079,6 +14098,7 @@ var sourceUrl = (siteBaseUrl, webui) => {
14079
14098
  const candidate = Result$1.try(() => new URL(webui, siteBaseUrl));
14080
14099
  if (Result$1.isFailure(candidate) || candidate.success.origin !== siteBaseUrl.origin) return null;
14081
14100
  if (candidate.success.username.length > 0 || candidate.success.password.length > 0) return null;
14101
+ if (candidate.success.pathname.startsWith("/spaces/")) candidate.success.pathname = `/wiki${candidate.success.pathname}`;
14082
14102
  return candidate.success.toString();
14083
14103
  };
14084
14104
  var readPageEntity = Effect$1.fn("ConfluencePage.readEntity")(function* (input, pageId) {
@@ -17642,7 +17662,7 @@ var makePluginAdministrationWithConnections = Effect$1.fn("PluginAdministration.
17642
17662
  const fileSystem = yield* FileSystem$1.FileSystem;
17643
17663
  const path = yield* Path$1.Path;
17644
17664
  const awsResourceDiscovery = yield* Effect$1.contextWith((context) => Effect$1.succeed(Context$1.getOption(context, AwsResourceDiscovery)));
17645
- const manualSynchronization = pluginConnections === null ? null : yield* Effect$1.flatMap(Effect$1.promise(() => import("./manualPluginSynchronization-CzIhZ_Dw.js")), ({ makeManualPluginSynchronization }) => makeManualPluginSynchronization(pluginConnections));
17665
+ const manualSynchronization = pluginConnections === null ? null : yield* Effect$1.flatMap(Effect$1.promise(() => import("./manualPluginSynchronization-DFIeUHP9.js")), ({ makeManualPluginSynchronization }) => makeManualPluginSynchronization(pluginConnections));
17646
17666
  const patchProviderAccount = Effect$1.fn("PluginAdministration.patchProviderAccount")(function* (workspaceId, providerAccountId, patch) {
17647
17667
  const displayName = yield* Schema$1.decodeUnknownEffect(ProviderAccountDisplayName)(patch.displayName).pipe(Effect$1.mapError(() => new ApplicationInvalidRequest()));
17648
17668
  const current = yield* persistence.providerAccounts.get(workspaceId, providerAccountId).pipe(Effect$1.mapError(mapPersistenceReadError));
@@ -17904,6 +17924,103 @@ var pluginAdministrationOAuthLayerWithConnections = (pluginConnections, publicOr
17904
17924
  var listPluginConnectionSummaries = listPluginConnections;
17905
17925
  /** Secret-free fixed catalog projection consumed by the authenticated overview handler. */
17906
17926
  var listFirstPartyServiceMetadata = () => firstPartyServiceCatalog.map(({ metadata }) => metadata);
17927
+ Schema$1.Struct({
17928
+ checked: Schema$1.Boolean,
17929
+ label: Schema$1.String,
17930
+ lineIndex: Schema$1.Int.check(Schema$1.isGreaterThanOrEqualTo(0)),
17931
+ lineNumber: Schema$1.Int.check(Schema$1.isGreaterThan(0))
17932
+ });
17933
+ var taskLine = /^(?:\s*(?:(?:[-*+]|\d+\.)\s+)?)(?:\[( |x|X)?\]|\\\[( |x|X)?\\\])\s+(.+?)\s*$/u;
17934
+ var openingFenceLine = /^\s*(`{3,}|~{3,})/u;
17935
+ var closingFenceLine = /^\s*(`{3,}|~{3,})\s*$/u;
17936
+ /** Read task-list checkboxes while ignoring examples inside fenced code blocks. */
17937
+ var confluenceTasks = (markdown) => {
17938
+ const tasks = [];
17939
+ let fence = null;
17940
+ for (const [lineIndex, line] of markdown.split("\n").entries()) {
17941
+ const fenceMatch = (fence === null ? openingFenceLine : closingFenceLine).exec(line);
17942
+ if (fenceMatch?.[1] !== void 0) {
17943
+ const marker = fenceMatch[1];
17944
+ const character = marker[0];
17945
+ if (character === "`" || character === "~") {
17946
+ if (fence === null) fence = {
17947
+ character,
17948
+ length: marker.length
17949
+ };
17950
+ else if (fence.character === character && marker.length >= fence.length) fence = null;
17951
+ }
17952
+ continue;
17953
+ }
17954
+ if (fence !== null) continue;
17955
+ const match = taskLine.exec(line);
17956
+ if (match?.[3] === void 0) continue;
17957
+ const marker = match[1] ?? match[2];
17958
+ tasks.push({
17959
+ checked: marker?.toLocaleLowerCase("en-US") === "x",
17960
+ label: match[3],
17961
+ lineIndex,
17962
+ lineNumber: lineIndex + 1
17963
+ });
17964
+ }
17965
+ return tasks;
17966
+ };
17967
+ /** Summarize task completion for UI counts and release gates. */
17968
+ var confluenceTaskSummary = (markdown) => {
17969
+ const tasks = confluenceTasks(markdown);
17970
+ const completed = tasks.filter(({ checked }) => checked).length;
17971
+ return {
17972
+ completed,
17973
+ outstanding: tasks.length - completed,
17974
+ tasks,
17975
+ total: tasks.length
17976
+ };
17977
+ };
17978
+ //#endregion
17979
+ //#region src/domain/releasePipelineApproval.ts
17980
+ var currentRelationship$1 = (lifecycle) => lifecycle._tag !== "missing" && lifecycle._tag !== "rejected" && lifecycle._tag !== "superseded";
17981
+ var approvalName = (value) => /(?:^|[\s_-])(?:approval|approve)(?:$|[\s_-])/iu.test(value) || /release[\s_-]*gate/iu.test(value);
17982
+ /** Prove that every pipeline delivering a release PR is stopped at its observed manual approval gate. */
17983
+ var releasePipelineApprovalReadiness = (inspection) => {
17984
+ const nodeById = new Map(inspection.nodes.map((node) => [node.nodeId, node]));
17985
+ const projectionByEntityId = new Map(inspection.entityProjections.map(({ projection }) => [projection.entityId, projection]));
17986
+ const affectedPipelineIds = new Set(inspection.relationships.flatMap((relationship) => {
17987
+ if (relationship.kind !== "delivered-by" || relationship.sourceNodeKind !== "pull-request" || relationship.targetNodeKind !== "pipeline-execution" || !currentRelationship$1(relationship.lifecycle)) return [];
17988
+ const source = nodeById.get(relationship.sourceNodeId);
17989
+ const target = nodeById.get(relationship.targetNodeId);
17990
+ return source?.resolution._tag === "resolved" && source.resolution.target._tag === "entity" && target?.resolution._tag === "resolved" && target.resolution.target._tag === "entity" ? [target.resolution.target.entityId] : [];
17991
+ }));
17992
+ let unverifiablePipelines = 0;
17993
+ const gates = [];
17994
+ for (const entityId of affectedPipelineIds) {
17995
+ const projection = projectionByEntityId.get(entityId);
17996
+ const details = projection?.details;
17997
+ if (projection?.entityState !== "present" || projection.entityType !== "pipeline-execution" || details?._tag !== "pipeline-execution") {
17998
+ unverifiablePipelines += 1;
17999
+ continue;
18000
+ }
18001
+ const approvalActionStages = new Set((details.actions ?? []).flatMap((action) => action.category?.toLocaleLowerCase("en-US") === "approval" || action.provider?.toLocaleLowerCase("en-US") === "manual" ? [action.stageName] : []));
18002
+ const approvalStages = (details.stages ?? []).filter((stage) => approvalActionStages.has(stage.name) || approvalName(stage.name));
18003
+ const waiting = approvalStages.some((stage) => {
18004
+ if (stage.status !== "running") return false;
18005
+ const explicitActions = (details.actions ?? []).filter((action) => action.stageName === stage.name && (action.category?.toLocaleLowerCase("en-US") === "approval" || action.provider?.toLocaleLowerCase("en-US") === "manual"));
18006
+ return explicitActions.length === 0 || explicitActions.some(({ status }) => status === "running");
18007
+ });
18008
+ gates.push({
18009
+ entityId,
18010
+ pipelineName: details.pipelineName,
18011
+ state: approvalStages.length === 0 ? "missing" : waiting ? "waiting" : "not-waiting"
18012
+ });
18013
+ }
18014
+ return {
18015
+ affected: affectedPipelineIds.size,
18016
+ gates,
18017
+ missing: gates.filter(({ state }) => state === "missing").length,
18018
+ notWaiting: gates.filter(({ state }) => state === "not-waiting").length,
18019
+ ready: !inspection.truncated && unverifiablePipelines === 0 && gates.every(({ state }) => state === "waiting"),
18020
+ unverifiablePipelines,
18021
+ waiting: gates.filter(({ state }) => state === "waiting").length
18022
+ };
18023
+ };
17907
18024
  //#endregion
17908
18025
  //#region src/domain/releasePublication.ts
17909
18026
  /** Canonical owner-visible title shared by explicit and natural-language publication paths. */
@@ -17980,6 +18097,47 @@ var digestReleaseSourceRevisions = Effect$1.fn("ReleasePublicationMetadata.diges
17980
18097
  const digest = yield* digestCanonicalGovernedActionJson(yield* Schema$1.decodeUnknownEffect(Schema$1.Json)(stableRevisions));
17981
18098
  return GovernedActionEnvelopeDigest.make(`sha256:${digest}`);
17982
18099
  });
18100
+ var relationshipIsCurrent = (relationship) => relationship.lifecycle._tag !== "missing" && relationship.lifecycle._tag !== "rejected" && relationship.lifecycle._tag !== "superseded";
18101
+ /** Resolve only pages directly documenting the inspected release. */
18102
+ var releaseRunbookEntityIds = (inspection) => {
18103
+ const nodes = new Map(inspection.nodes.map((node) => [node.nodeId, node]));
18104
+ return Array.from(new Set(inspection.relationships.flatMap((relationship) => {
18105
+ if (relationship.kind !== "documented-by" || relationship.sourceNodeKind !== "release" || relationship.targetNodeKind !== "page" || !relationshipIsCurrent(relationship)) return [];
18106
+ const source = nodes.get(relationship.sourceNodeId);
18107
+ const target = nodes.get(relationship.targetNodeId);
18108
+ return source?.resolution._tag === "resolved" && source.resolution.target._tag === "release" && source.resolution.target.releaseId === inspection.releaseId && target?.resolution._tag === "resolved" && target.resolution.target._tag === "entity" ? [target.resolution.target.entityId] : [];
18109
+ })));
18110
+ };
18111
+ /** Hydrate exact safe page content only for release runbooks whose tasks govern readiness. */
18112
+ var hydrateReleaseRunbookContent = Effect$1.fn("ReleaseRunbookHydration.hydrate")(function* (persistence, workspaceId, inspection) {
18113
+ const presentEntityIds = new Set(inspection.entityProjections.flatMap(({ projection }) => projection.entityState === "present" ? [projection.entityId] : []));
18114
+ const candidates = releaseRunbookEntityIds(inspection).filter((entityId) => presentEntityIds.has(entityId));
18115
+ const exactPages = new Array();
18116
+ let hydratedCharacters = 0;
18117
+ let hydrationTruncated = candidates.length > 16;
18118
+ for (const entityId of candidates.slice(0, 16)) {
18119
+ const page = yield* persistence.deliveryGraph.read(workspaceId, {
18120
+ _tag: "entityProjection",
18121
+ entityId,
18122
+ revision: null
18123
+ }).pipe(Effect$1.flatMap((result) => result._tag === "entityProjection" ? Effect$1.succeed(result.value) : Effect$1.die("Expected an exact entity projection for release runbook")), Effect$1.catchTag("RecordNotFoundError", () => Effect$1.succeed(null)));
18124
+ if (page === null) continue;
18125
+ const pageCharacters = page.projection.details._tag === "page" ? page.projection.details.content?.markdown.length ?? 0 : 0;
18126
+ if (hydratedCharacters + pageCharacters > 1048576) {
18127
+ hydrationTruncated = true;
18128
+ break;
18129
+ }
18130
+ hydratedCharacters += pageCharacters;
18131
+ exactPages.push(page);
18132
+ }
18133
+ if (exactPages.length === 0 && !hydrationTruncated) return inspection;
18134
+ const exactByEntityId = new Map(exactPages.map((page) => [page.projection.entityId, page]));
18135
+ return {
18136
+ ...inspection,
18137
+ truncated: inspection.truncated || hydrationTruncated,
18138
+ entityProjections: inspection.entityProjections.map((summary) => exactByEntityId.get(summary.projection.entityId) ?? summary)
18139
+ };
18140
+ });
17983
18141
  //#endregion
17984
18142
  //#region src/server/application/releasePublicationSubmissions.ts
17985
18143
  /** Human-confirmed, append-only release publication boundary for Relay. @module */
@@ -17990,6 +18148,14 @@ var ReleasePublicationSubmissionError = class extends Schema$1.TaggedErrorClass(
17990
18148
  "invalid-request",
17991
18149
  "unavailable"
17992
18150
  ]) }) {};
18151
+ /** Bind an explicitly selected related page, continuing its chain only when the latest receipt is for that page. */
18152
+ var confluenceEntityPublicationContext = (history, target) => {
18153
+ return {
18154
+ historyMatches: true,
18155
+ predecessorPublicationActionId: history.latestReference?.pageId === target.pageId ? history.latestReference.publicationActionId : null,
18156
+ publication: target
18157
+ };
18158
+ };
17993
18159
  /** Require creates to have no history and updates to match the exact latest durable receipt. */
17994
18160
  var confluencePublicationRequestMatchesHistory = (request, history) => {
17995
18161
  return request.publicationActionId === void 0 ? !history.hasBlockingPublication : history.latestReference?.publicationActionId === request.publicationActionId;
@@ -18026,8 +18192,50 @@ var loadConfluenceReleasePublicationByActionId = Effect$1.fn("ReleasePublication
18026
18192
  });
18027
18193
  var ReleasePublicationSubmissions = class extends Context$1.Service()("@knpkv/control-center/server/application/ReleasePublicationSubmissions") {};
18028
18194
  var failure = (reason) => new ReleasePublicationSubmissionError({ reason });
18195
+ var ConfluencePageVersionFromRevision = Schema$1.FiniteFromString.check(Schema$1.isInt(), Schema$1.isBetween({
18196
+ minimum: 1,
18197
+ maximum: 2147483646
18198
+ }));
18199
+ /** Require the provider revision reviewed by the owner to remain current at submission time. */
18200
+ var confluenceTargetRevisionMatches = (currentRevision, requestedRevision) => currentRevision === requestedRevision;
18029
18201
  /** Match Jira's release-version name and UTF-8 description limits before provider work. */
18030
18202
  var jiraPublicationPayloadWithinLimits = (title, markdown) => title.length <= 255 && jiraReleaseVersionDescriptionWithinLimit(markdown);
18203
+ var currentRelationship = (lifecycle) => lifecycle._tag !== "missing" && lifecycle._tag !== "rejected" && lifecycle._tag !== "superseded";
18204
+ /** Prove every task on a directly release-related Confluence page is complete. */
18205
+ var releaseConfluenceTaskReadiness = (inspection) => {
18206
+ const nodeById = new Map(inspection.nodes.map((node) => [node.nodeId, node]));
18207
+ const projectionByEntityId = new Map(inspection.entityProjections.map(({ projection }) => [projection.entityId, projection]));
18208
+ const releasePageIds = new Set(inspection.relationships.flatMap((relationship) => {
18209
+ if (relationship.kind !== "documented-by" || relationship.sourceNodeKind !== "release" || relationship.targetNodeKind !== "page" || !currentRelationship(relationship.lifecycle)) return [];
18210
+ const source = nodeById.get(relationship.sourceNodeId);
18211
+ const target = nodeById.get(relationship.targetNodeId);
18212
+ return source?.resolution._tag === "resolved" && source.resolution.target._tag === "release" && source.resolution.target.releaseId === inspection.releaseId && target?.resolution._tag === "resolved" && target.resolution.target._tag === "entity" ? [target.resolution.target.entityId] : [];
18213
+ }));
18214
+ let completed = 0;
18215
+ let outstanding = 0;
18216
+ let unverifiablePages = 0;
18217
+ for (const entityId of releasePageIds) {
18218
+ const projection = projectionByEntityId.get(entityId);
18219
+ if (projection?.entityState !== "present" || projection.entityType !== "page" || projection.details._tag !== "page") {
18220
+ unverifiablePages += 1;
18221
+ continue;
18222
+ }
18223
+ if (projection.details.contentState !== "loaded") {
18224
+ unverifiablePages += 1;
18225
+ continue;
18226
+ }
18227
+ const summary = confluenceTaskSummary(projection.details.content?.markdown ?? "");
18228
+ completed += summary.completed;
18229
+ outstanding += summary.outstanding;
18230
+ }
18231
+ return {
18232
+ completed,
18233
+ outstanding,
18234
+ ready: !inspection.truncated && unverifiablePages === 0 && outstanding === 0,
18235
+ total: completed + outstanding,
18236
+ unverifiablePages
18237
+ };
18238
+ };
18031
18239
  var mapFailure$1 = Effect$1.catch((cause) => Schema$1.is(ReleasePublicationSubmissionError)(cause) ? Effect$1.fail(cause) : Effect$1.logError("Release publication submission failed", cause).pipe(Effect$1.andThen(Effect$1.fail(failure("unavailable")))));
18032
18240
  var makeService = Effect$1.gen(function* () {
18033
18241
  const cryptoService = yield* Crypto$1.Crypto;
@@ -18036,30 +18244,86 @@ var makeService = Effect$1.gen(function* () {
18036
18244
  const proposalAuthority = yield* GovernedActionProposalAuthority;
18037
18245
  const policies = yield* GovernedActionPolicyBindingSource;
18038
18246
  const submission = yield* GovernedActionSubmission;
18247
+ const loadConfluenceEntityPublicationTarget = Effect$1.fn("ReleasePublicationSubmissions.loadConfluenceEntityPublicationTarget")(function* (workspaceId, releaseId, entityId, targetRevision) {
18248
+ const entity = yield* persistence.entities.get(workspaceId, entityId).pipe(mapFailure$1);
18249
+ const graph = yield* persistence.deliveryGraph.read(workspaceId, {
18250
+ _tag: "entitySlice",
18251
+ entityId,
18252
+ limit: 1
18253
+ }).pipe(mapFailure$1);
18254
+ if (graph._tag !== "entitySlice" || !graph.value.entity.releaseIds.includes(releaseId) || graph.value.entity.projection.entityType !== "page" || graph.value.entity.projection.details._tag !== "page" || entity.sourceRevision.providerId !== "confluence" || !confluenceTargetRevisionMatches(entity.sourceRevision.revision, targetRevision)) return yield* failure("conflict");
18255
+ const pageVersion = yield* Schema$1.decodeUnknownEffect(ConfluencePageVersionFromRevision)(entity.sourceRevision.revision).pipe(Effect$1.mapError(() => failure("invalid-request")));
18256
+ return {
18257
+ pageId: entity.sourceRevision.vendorImmutableId,
18258
+ pageVersion,
18259
+ pluginConnectionId: entity.sourceRevision.pluginConnectionId
18260
+ };
18261
+ });
18262
+ const loadConfluenceTemplatePublicationSource = Effect$1.fn("ReleasePublicationSubmissions.loadConfluenceTemplatePublicationSource")(function* (workspaceId, entityId) {
18263
+ const entity = yield* persistence.entities.get(workspaceId, entityId).pipe(mapFailure$1);
18264
+ const graph = yield* persistence.deliveryGraph.read(workspaceId, {
18265
+ _tag: "entitySlice",
18266
+ entityId,
18267
+ limit: 1
18268
+ }).pipe(mapFailure$1);
18269
+ if (graph._tag !== "entitySlice" || graph.value.entity.projection.entityType !== "page" || graph.value.entity.projection.details._tag !== "page" || entity.sourceRevision.providerId !== "confluence") return yield* failure("conflict");
18270
+ return { pluginConnectionId: entity.sourceRevision.pluginConnectionId };
18271
+ });
18039
18272
  const submit = Effect$1.fn("ReleasePublicationSubmissions.submit")(function* (input) {
18040
18273
  const checkedAt = yield* DateTime$1.now;
18041
18274
  if (input.session.actor._tag !== "human" || input.session.workspaceId !== input.workspaceId || input.session.revokedAt !== null || DateTime$1.Order(checkedAt, input.session.idleExpiresAt) >= 0 || DateTime$1.Order(checkedAt, input.session.absoluteExpiresAt) >= 0) return yield* failure("unauthorized");
18042
18275
  if (input.session.permission !== "workspace-owner") return yield* failure("forbidden");
18043
- if (input.request.provider !== "confluence" && input.request.publicationActionId !== void 0) return yield* failure("conflict");
18276
+ if (input.request.provider !== "confluence" && (input.request.publicationActionId !== void 0 || input.request.targetEntityId !== void 0 || input.request.targetRevision !== void 0 || input.request.templateEntityId !== void 0)) return yield* failure("conflict");
18277
+ if ([
18278
+ input.request.publicationActionId,
18279
+ input.request.targetEntityId,
18280
+ input.request.templateEntityId
18281
+ ].filter((value) => value !== void 0).length > 1) return yield* failure("conflict");
18282
+ if (input.request.targetEntityId === void 0 !== (input.request.targetRevision === void 0)) return yield* failure("invalid-request");
18044
18283
  const release = yield* persistence.releases.get(input.workspaceId, input.releaseId).pipe(mapFailure$1);
18045
18284
  if (input.expectedReleaseUpdatedAt !== void 0 && release.release.updatedAt !== input.expectedReleaseUpdatedAt) return yield* failure("conflict");
18046
18285
  const publicationTitle = input.useReleaseIdentity === true ? canonicalReleasePublicationTitle(release.release.version) : input.request.title;
18047
18286
  const publicationMarkdown = input.useReleaseIdentity === true ? `Release ${release.release.version} for ${release.release.serviceName}. Published by Relay after human confirmation.` : input.request.markdown;
18048
18287
  if (input.request.provider === "jira" && !jiraPublicationPayloadWithinLimits(publicationTitle, publicationMarkdown)) return yield* failure("invalid-request");
18288
+ if (input.request.provider === "jira") {
18289
+ const taskInspection = yield* persistence.deliveryGraph.read(input.workspaceId, {
18290
+ _tag: "releaseSlice",
18291
+ releaseId: input.releaseId,
18292
+ environmentId: null,
18293
+ limit: 500
18294
+ }).pipe(mapFailure$1);
18295
+ if (taskInspection._tag !== "releaseSlice") return yield* failure("conflict");
18296
+ const hydratedTaskInspection = yield* hydrateReleaseRunbookContent(persistence, input.workspaceId, taskInspection.value).pipe(mapFailure$1);
18297
+ if (!releaseConfluenceTaskReadiness(hydratedTaskInspection).ready || !releasePipelineApprovalReadiness(hydratedTaskInspection).ready) return yield* failure("conflict");
18298
+ }
18049
18299
  const sources = release.release.sourceRevisions.filter(({ providerId }) => providerId === input.request.provider);
18050
18300
  if (sources.length > 1) return yield* failure("conflict");
18051
18301
  const releaseSource = sources[0];
18052
18302
  let publicationReceiptConnectionId;
18053
18303
  let confluencePublication = null;
18054
18304
  let confluenceHistoryMatches = true;
18305
+ let predecessorPublicationActionId = input.request.publicationActionId ?? null;
18055
18306
  if (input.request.provider === "confluence") {
18056
18307
  const publicationHistory = yield* loadConfluenceReleasePublicationHistory(persistence.governedActions, input.workspaceId, input.releaseId).pipe(mapFailure$1);
18057
- const requestedReference = input.request.publicationActionId === void 0 ? null : yield* loadConfluenceReleasePublicationByActionId(persistence.governedActions, input.workspaceId, input.releaseId, input.request.publicationActionId).pipe(mapFailure$1);
18058
- const publicationContext = confluencePublicationRequestContext(input.request, publicationHistory, requestedReference);
18059
- confluenceHistoryMatches = publicationContext.historyMatches;
18060
- confluencePublication = publicationContext.publication;
18061
- if (input.request.publicationActionId !== void 0 && confluencePublication === null) return yield* failure("conflict");
18062
- publicationReceiptConnectionId = confluencePublication?.pluginConnectionId;
18308
+ if (input.request.templateEntityId !== void 0) {
18309
+ const template = yield* loadConfluenceTemplatePublicationSource(input.workspaceId, input.request.templateEntityId);
18310
+ confluenceHistoryMatches = true;
18311
+ predecessorPublicationActionId = null;
18312
+ publicationReceiptConnectionId = template.pluginConnectionId;
18313
+ } else if (input.request.targetEntityId !== void 0) {
18314
+ if (input.request.targetRevision === void 0) return yield* failure("invalid-request");
18315
+ const publicationContext = confluenceEntityPublicationContext(publicationHistory, yield* loadConfluenceEntityPublicationTarget(input.workspaceId, input.releaseId, input.request.targetEntityId, input.request.targetRevision));
18316
+ confluenceHistoryMatches = publicationContext.historyMatches;
18317
+ confluencePublication = publicationContext.publication;
18318
+ predecessorPublicationActionId = publicationContext.predecessorPublicationActionId;
18319
+ } else {
18320
+ const requestedReference = input.request.publicationActionId === void 0 ? null : yield* loadConfluenceReleasePublicationByActionId(persistence.governedActions, input.workspaceId, input.releaseId, input.request.publicationActionId).pipe(mapFailure$1);
18321
+ const publicationContext = confluencePublicationRequestContext(input.request, publicationHistory, requestedReference);
18322
+ confluenceHistoryMatches = publicationContext.historyMatches;
18323
+ confluencePublication = publicationContext.publication;
18324
+ if (input.request.publicationActionId !== void 0 && confluencePublication === null) return yield* failure("conflict");
18325
+ }
18326
+ publicationReceiptConnectionId ??= confluencePublication?.pluginConnectionId;
18063
18327
  }
18064
18328
  const connectionSelection = selectReleasePublicationConnection({
18065
18329
  enabledConnectionIds: (releaseSource === void 0 && publicationReceiptConnectionId === void 0 ? yield* persistence.pluginConnections.list(input.workspaceId).pipe(mapFailure$1) : []).filter(({ isEnabled, providerId }) => providerId === input.request.provider && isEnabled).map(({ pluginConnectionId }) => pluginConnectionId),
@@ -18123,7 +18387,8 @@ var makeService = Effect$1.gen(function* () {
18123
18387
  title: publicationTitle,
18124
18388
  markdown: publicationMarkdown,
18125
18389
  parentId: input.request.parentId,
18126
- publicationActionId: input.request.publicationActionId ?? null,
18390
+ publicationActionId: predecessorPublicationActionId,
18391
+ sourceEntityId: input.request.targetEntityId ?? input.request.templateEntityId ?? null,
18127
18392
  pageId: confluencePublication?.pageId ?? null,
18128
18393
  expectedVersion: confluencePublication?.pageVersion ?? null,
18129
18394
  sourceRevisionDigest,
@@ -18191,7 +18456,8 @@ var makeService = Effect$1.gen(function* () {
18191
18456
  correlationId: null,
18192
18457
  releasePublication: {
18193
18458
  releaseId: input.releaseId,
18194
- predecessorPublicationActionId: input.request.publicationActionId ?? null,
18459
+ predecessorPublicationActionId,
18460
+ ...input.request.templateEntityId === void 0 ? {} : { templateSourceEntityId: input.request.templateEntityId },
18195
18461
  sourceRevisionDigest,
18196
18462
  sourceRevisionCount: release.release.sourceRevisions.length
18197
18463
  }
@@ -18480,7 +18746,18 @@ var sessionHandlersLayer = HttpApiBuilder.group(ControlCenterApi, "session", (ha
18480
18746
  };
18481
18747
  })).handle("list", ({ request }) => Effect$1.gen(function* () {
18482
18748
  return yield* mapAuthenticationFailures(auth.listSessions(currentSessionToken(request)));
18483
- })).handle("revoke", ({ params, request }) => Effect$1.gen(function* () {
18749
+ })).handle("issueBrowserPairingCode", ({ payload, request }) => lifecycle.runMutation(Effect$1.gen(function* () {
18750
+ const session = yield* CurrentSession;
18751
+ const issued = yield* mapAuthenticationFailures(auth.issuePairingCode(currentSessionToken(request), {
18752
+ actor: session.actor,
18753
+ permission: payload.permission
18754
+ }));
18755
+ yield* HttpEffect.appendPreResponseHandler((_request, response) => Effect$1.succeed(HttpServerResponse.setHeader(response, "cache-control", "private, no-store")));
18756
+ return {
18757
+ pairingCode: PairingCode.make(Redacted$1.value(issued.pairingCode)),
18758
+ expiresAt: issued.summary.expiresAt
18759
+ };
18760
+ })).pipe(Effect$1.catchTag("ServerDraining", () => Effect$1.flatMap(serviceUnavailableApiError(), Effect$1.fail)))).handle("revoke", ({ params, request }) => Effect$1.gen(function* () {
18484
18761
  yield* mapAuthenticationFailures(auth.revokeSession(currentSessionToken(request), params.sessionId));
18485
18762
  })).handle("logout", ({ request }) => Effect$1.gen(function* () {
18486
18763
  yield* mapAuthenticationFailures(auth.logout(currentSessionToken(request)));
@@ -20593,7 +20870,7 @@ var makeDeliveryGraphInspection = Effect$1.gen(function* () {
20593
20870
  limit: 500
20594
20871
  }));
20595
20872
  if (result._tag !== "releaseSlice") return yield* unexpectedResult("release slice");
20596
- return result.value;
20873
+ return yield* hydrateReleaseRunbookContent(persistence, input.workspaceId, result.value).pipe(mapPersistenceRead);
20597
20874
  });
20598
20875
  const readRelationship = Effect$1.fn("DeliveryGraphInspection.relationship")(function* (input) {
20599
20876
  const result = yield* mapPersistenceRead(persistence.deliveryGraph.read(input.workspaceId, {
@@ -20640,11 +20917,13 @@ var makeDeliveryGraphInspection = Effect$1.gen(function* () {
20640
20917
  const [connection, runtime] = yield* Effect$1.all([persistence.pluginConnections.get(input.workspaceId, entityRecord.sourceRevision.pluginConnectionId).pipe(Effect$1.result), persistence.pluginRuntime.getRuntime(input.workspaceId, entityRecord.sourceRevision.pluginConnectionId).pipe(Effect$1.result)]);
20641
20918
  const negotiated = Result$1.isSuccess(runtime) ? Schema$1.decodeUnknownResult(Schema$1.fromJsonString(NegotiatedPluginDescriptorV1))(runtime.success.descriptorJson) : null;
20642
20919
  const sourceActionsAvailable = Result$1.isSuccess(connection) && connection.success.isEnabled && negotiated !== null && Result$1.isSuccess(negotiated) && hasPluginCapability(negotiated.success, "action.propose", 1) && hasPluginCapability(negotiated.success, "action.execute", 1);
20920
+ const sourceSynchronizationAvailable = Result$1.isSuccess(connection) && connection.success.isEnabled && negotiated !== null && Result$1.isSuccess(negotiated) && hasPluginCapability(negotiated.success, "sync.incremental", 1);
20643
20921
  return {
20644
20922
  entity: result.value.entity,
20645
20923
  source: entityRecord.sourceRevision,
20646
20924
  isSourceCurrent: Number(entityRecord.revision) === Number(result.value.entity.projection.sourceEntityRevision),
20647
20925
  sourceActionsAvailable,
20926
+ sourceSynchronizationAvailable,
20648
20927
  freshness,
20649
20928
  clockifyApproval: projectClockifyApproval(input.entityId, entityRecord.sourceRevision, clockifyActions),
20650
20929
  graph: {
@@ -25721,7 +26000,7 @@ var makeGovernedActionExecutionBegin = Effect$1.gen(function* () {
25721
26000
  reason: "authority-changed"
25722
26001
  });
25723
26002
  }
25724
- const currentTarget = publication !== void 0 && record.envelope.targetEntityId === EntityId.make(publication.releaseId) ? yield* Schema$1.decodeUnknownEffect(GovernedActionTargetSnapshotV1)({
26003
+ const currentTarget = publication !== void 0 && record.envelope.targetEntityId === EntityId.make(publication.releaseId) ? yield* Schema$1.decodeUnknownEffect(Schema$1.toType(GovernedActionTargetSnapshotV1))({
25725
26004
  workspaceId: record.envelope.workspaceId,
25726
26005
  entityId: record.envelope.targetEntityId,
25727
26006
  entityType: record.envelope.proposal.request.target.entityType,
@@ -27847,4 +28126,4 @@ var effectiveReachableUrls = (config, detectedPrivateAddresses) => {
27847
28126
  //#endregion
27848
28127
  export { deliveryGraphInspectionLayer as $, controlCenterBootstrapLayer as $n, TerminalRecoveryRefusedError as $r, authorizePairingRequest as $t, makeTimelineExportAudits as A, PrReviewSandboxTools as An, makeSecretStore as Ar, listPluginConnectionSummaries as At, releaseAgentJobsUnavailableLayer as B, prReviewSandboxToolsLayer as Bn, terminalRecoveryLayer as Br, JiraReadPluginConfiguration as Bt, staticApplicationWithAssetsLayer as C, AgentJobWorker as Cn, decodeOperationalDataPaths as Cr, DEFAULT_MAXIMUM_LIVE_STREAMS as Ct, makeStaticAssetStore as D, PrReviewCommandArtifactId as Dn, syncDataRootPath as Dr, releasePublicationSubmissionsLayer as Dt, StaticAssetStoreError as E, prReviewAgentJobWorkerLayer as En, publishFreshDataRootClaim as Er, LiveStreamAdmissionExceeded as Et, synchronizeFakeRelease as F, ReviewReadFile as Fn, SecretTooLargeError as Fr, pluginAdministrationLayerWithConnections as Ft, relationshipRepairProposalsLayer as G, PLUGIN_RETRY_MAX_DELAY_MILLIS as Gn, SESSION_ABSOLUTE_LIFETIME_DAYS as Gr, ClockifyReadPluginConfiguration as Gt, releaseAgentTurnsLayer as H, PLUGIN_OPERATION_MAX_ATTEMPTS as Hn, PairingCodeId as Hr, makeJiraReadPluginRuntime as Ht, synchronizeFakeReleaseFromMap as I, ReviewRunCommand as In, secretStoreIoError as Ir, pluginAdministrationOAuthLayer as It, portfolioSnapshotsLayer as J, retryPluginStream as Jn, AuthCryptoError as Jr, makeClockifyReadPluginRuntime as Jt, pullRequestReviewsLayer as K, isPluginFailureRetryable as Kn, SESSION_IDLE_LIFETIME_HOURS as Kr, clockifyReadOnlyPluginDescriptor as Kt, makeReleaseAgentJobs as L, ReviewSearchArtifact as Ln, MINIMUM_PR_REVIEW_BUDGET_MILLIS as Lr, pluginAdministrationOAuthLayerWithConnections as Lt, reconcileFakeReleaseProjection as M, ReviewListFiles as Mn, SecretProtectionError as Mr, makePluginAdministrationWithConnections as Mt, reconcileFakeReleaseSyncAttempts as N, ReviewPageArtifact as Nn, SecretStoreInputError as Nr, makePluginAdministrationWithOAuth as Nt, makeWorkspaceSettingsAdministration as O, PrReviewSandboxSessionError as On, SecretRoot as Or, releasePublicationSubmissionsUnavailableLayer as Ot, recoverFakeReleaseProjection as P, ReviewReadDiff as Pn, SecretStoreIoError as Pr, pluginAdministrationLayer as Pt, makeLiveEvents as Q, ControlCenterBootstrap as Qn, FirstRunPairingAlreadyIssuedError as Qr, PluginConnectionMap as Qt, releaseAgentJobsLayer as R, ReviewSearchFiles as Rn, TERMINAL_RECOVERY_CONFIRMATION as Rr, mapPersistenceReadError as Rt, staticApplicationLayer as S, ApiBindConfiguration as Sn, decodeControlCenterDataPaths as Sr, controlCenterApiMiddlewareLayer as St, StaticAssetStore as T, agentJobWorkerWithPrReviewLayer as Tn, publishDataRootMarker as Tr, LiveStreamAdmission as Tt, releaseAgentUnavailableLayer as U, PLUGIN_RATE_LIMIT_MAX_DELAY_MILLIS as Un, PairingCodeSummary as Ur, makeJiraReadPluginRuntimeFromProvider as Ut, makeReleaseAgentTurns as V, CodeCommitPluginDefinition as Vn, PAIRING_CODE_LIFETIME_MINUTES as Vr, jiraReadPluginDescriptor as Vt, makeRelationshipRepairProposals as W, PLUGIN_RETRY_BASE_DELAY_MILLIS as Wn, PairingPurpose as Wr, CodePipelinePluginDefinition as Wt, mediaReadsLayer as X, agentProviderRuntimeRegistryLayer as Xn, AuthPersistenceError as Xr, clockifyActionSubmissionsLayer as Xt, makeMediaReads as Y, AgentRuntimeRegistry as Yn, AuthPermissionDeniedError as Yr, makeClockifyReadPluginRuntimeFromProvider as Yt, liveEventsLayer as Z, agentRuntimeRegistryLayer as Zn, CredentialRejectedError as Zr, clockifyActionSubmissionsUnavailableLayer as Zt, prReviewWorkerStartupLayer as _, hashCsrfToken as _n, DATA_ROOT_MARKER_V1_CONTENT as _r, HttpByteLimit as _t, decodeBindConfig as a, withCorrelationResponse as an, restoreBackup as ar, codePipelineReadsLayer as at, controlCenterTransportProtocol as b, ServerDraining as bn, DATA_ROOT_STAGING_PREFIX as br, controlCenterApiLayer as bt, makeControlCenterApplication as c, InsecureLanCapability as cn, BackupBlobEntryV1 as cr, makeAuthorizedShares as ct, ReleaseSynchronizationStartup as d, authorizeAuthenticatedMutation as dn, BackupId as dr, requestRateLimiterLayer as dt, mutationCsrfLayer as en, makeControlCenterBootstrap as er, makeDeliveryGraphInspection as et, ReleaseSynchronizationStartupConfigurationError as f, authorizeAuthenticatedRead as fn, BackupManifestJsonV1 as fr, securityHeaders as ft, PrReviewWorkerStartup as g, effectiveRequestAuthority as gn, DATA_ROOT_MARKER_NAME as gr, DEFAULT_HTTP_SECURITY_LIMITS as gt, PrReviewWorkerRunning as h, authorizeRequest as hn, DATA_ROOT_MARKER_MAX_BYTES as hr, limitRequestBodyStream as ht, TransportPolicy as i, provideCurrentRequest as in, createVerifiedBackup as ir, makeCompleteDiffReads as it, timelineExportAuditsLayer as j, ReviewApplyPatch as jn, SecretNotFoundError as jr, makePluginAdministration as jt, workspaceSettingsAdministrationLayer as k, PrReviewSandboxSessions as kn, SecretStore as kr, listFirstPartyServiceMetadata as kt, makeControlCenterServer as l, RequestAccess as ln, BackupBoundaryV1 as lr, requestBoundaryLayer as lt, releaseSynchronizationStartupLayer as m, authorizeInsecureLanCapability as mn, ReproducibleBlobGap as mr, authorizeRequestBody as mt, BindConfigError as n, CurrentRequestContext as nn, authLayer as nr, timelineReadsLayer as nt, effectiveReachableUrls as o, CsrfDigest as on, verifyBackup as or, makeCodePipelineReads as ot, releaseIdFromStartupState as p, authorizeAuthenticatedReadPost as pn, BackupManifestV1 as pr, RequestBodyPolicyError as pt, makePortfolioSnapshots as q, retryPluginOperation as qn, SessionSummary as qr, clockifyReadPluginDescriptor as qt, DirectTlsMaterial as r, makeCurrentRequestContext as rn, createOfflineVerifiedBackup as rr, completeDiffReadsLayer as rt, PrReviewWorkerConfigurationError as s, CsrfToken as sn, BackupBlobCountsV1 as sr, authorizedSharesLayer as st, BindConfig as t, sessionCookieAuthLayer as tn, Auth as tr, makeTimelineReads as tt, requestUrlBoundaryLayer as u, RequestSecurityError as un, BackupDatabaseArtifactV1 as ur, RequestLimitPolicy as ut, DirectTlsServerError as v, sessionCookiePolicy as vn, DATA_ROOT_MARKER_V2_PREFIX as vr, HttpSecurityLimits as vt, StaticAssetMimeType as w, agentJobWorkerLayer as wn, inspectFreshDataRootClaim as wr, DEFAULT_MAXIMUM_LIVE_STREAMS_PER_SESSION as wt, makeNodeTransportLayer as x, ServerLifecycle as xn, boundDataRootMarkerContent as xr, controlCenterApiLayerWithLifecycle as xt, NODE_LISTENER_SECURITY_POLICY as y, verifyCsrfToken as yn, DATA_ROOT_PENDING_MARKER_PREFIX as yr, controlCenterApiHandlersLayer as yt, releaseAgentJobsLayerForWorkerWorkspace as z, prReviewSandboxSessionsLayer as zn, TerminalRecovery as zr, mapPersistenceWriteError as zt };
27849
28128
 
27850
- //# sourceMappingURL=BindConfig-Bj282xDC.js.map
28129
+ //# sourceMappingURL=BindConfig-DAASchDn.js.map