@knpkv/control-center 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/README.md +70 -17
  2. package/dist/client/.vite/manifest.json +223 -178
  3. package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js → ActiveWorkPage-g2-Jyavo.js} +2 -2
  4. package/dist/client/assets/{ActiveWorkPage-DJQgGZeV.js.map → ActiveWorkPage-g2-Jyavo.js.map} +1 -1
  5. package/dist/client/assets/AgentPage-B6GQdZAs.css +1 -0
  6. package/dist/client/assets/AgentPage-DmVsEe13.js +6 -0
  7. package/dist/client/assets/AgentPage-DmVsEe13.js.map +1 -0
  8. package/dist/client/assets/AtlassianOAuthCallbackPage-C8u9ItMj.js +2 -0
  9. package/dist/client/assets/{AtlassianOAuthCallbackPage-D1F1xE_2.js.map → AtlassianOAuthCallbackPage-C8u9ItMj.js.map} +1 -1
  10. package/dist/client/assets/AuthorizedSharePage-CVBJ1NTm.js +2 -0
  11. package/dist/client/assets/AuthorizedSharePage-CVBJ1NTm.js.map +1 -0
  12. package/dist/client/assets/BrowserCrypto-3BoTVFdl.js +2 -0
  13. package/dist/client/assets/{BrowserCrypto-DVWR7DFd.js.map → BrowserCrypto-3BoTVFdl.js.map} +1 -1
  14. package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js +2 -0
  15. package/dist/client/assets/BrowserSessionHydrator-CpZnNm4X.js.map +1 -0
  16. package/dist/client/assets/CommandSearch-DUeRRbV2.js +2 -0
  17. package/dist/client/assets/{CommandSearch-CP_QCbkm.js.map → CommandSearch-DUeRRbV2.js.map} +1 -1
  18. package/dist/client/assets/ItemsPage-BF2ZkSzh.js +2 -0
  19. package/dist/client/assets/{ItemsPage-BGFUkRL2.js.map → ItemsPage-BF2ZkSzh.js.map} +1 -1
  20. package/dist/client/assets/{PairPage-DIgzx0K2.js → PairPage-CkaZltHd.js} +2 -2
  21. package/dist/client/assets/{PairPage-DIgzx0K2.js.map → PairPage-CkaZltHd.js.map} +1 -1
  22. package/dist/client/assets/PortfolioOverview-CEUHJmGC.js +2 -0
  23. package/dist/client/assets/PortfolioOverview-CEUHJmGC.js.map +1 -0
  24. package/dist/client/assets/PullRequestReviewPanel-D1IpvHe2.js +6 -0
  25. package/dist/client/assets/PullRequestReviewPanel-D1IpvHe2.js.map +1 -0
  26. package/dist/client/assets/ReleaseRoute-BuQybrsg.js +2 -0
  27. package/dist/client/assets/{ReleaseRoute-DXJ8Jg60.js.map → ReleaseRoute-BuQybrsg.js.map} +1 -1
  28. package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js +2 -0
  29. package/dist/client/assets/ReleaseWorkset-BclY0Nvj.js.map +1 -0
  30. package/dist/client/assets/ServicesPage-hw5Ee69-.js +2 -0
  31. package/dist/client/assets/ServicesPage-hw5Ee69-.js.map +1 -0
  32. package/dist/client/assets/TimelinePage-Cj3V98uI.js +2 -0
  33. package/dist/client/assets/TimelinePage-Cj3V98uI.js.map +1 -0
  34. package/dist/client/assets/WorkspaceEntityLink-C_rc8lxi.js +2 -0
  35. package/dist/client/assets/{WorkspaceEntityLink-AdZ_T-Wk.js.map → WorkspaceEntityLink-C_rc8lxi.js.map} +1 -1
  36. package/dist/client/assets/WorkspaceEntityRoute-DLLT6fY0.css +1 -0
  37. package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js +14 -0
  38. package/dist/client/assets/WorkspaceEntityRoute-kbnrQ_lY.js.map +1 -0
  39. package/dist/client/assets/WorkspaceHomeLink-DeYYLEsH.js +2 -0
  40. package/dist/client/assets/{WorkspaceHomeLink-XbKSPths.js.map → WorkspaceHomeLink-DeYYLEsH.js.map} +1 -1
  41. package/dist/client/assets/{WorkspacePullRequestDetails-BErJ5bk8.js → WorkspacePullRequestDetails-CizqydjN.js} +3 -3
  42. package/dist/client/assets/WorkspacePullRequestDetails-CizqydjN.js.map +1 -0
  43. package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js → WorkspaceReleaseLayout-CXAQUhkh.js} +2 -2
  44. package/dist/client/assets/{WorkspaceReleaseLayout-cfboC5Qh.js.map → WorkspaceReleaseLayout-CXAQUhkh.js.map} +1 -1
  45. package/dist/client/assets/{WorkspaceRichText-D1M637Ff.js → WorkspaceRichText-CCOciILO.js} +2 -2
  46. package/dist/client/assets/WorkspaceRichText-CCOciILO.js.map +1 -0
  47. package/dist/client/assets/WorkspaceSettingsPage-GoBfQzBx.css +1 -0
  48. package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js +2 -0
  49. package/dist/client/assets/WorkspaceSettingsPage-JG-pN_CA.js.map +1 -0
  50. package/dist/client/assets/agent-api-Dl9TuGOJ.js +19 -0
  51. package/dist/client/assets/agent-api-Dl9TuGOJ.js.map +1 -0
  52. package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js +2 -0
  53. package/dist/client/assets/atlassianOAuthSetupIntentStorage-DE4ySCTb.js.map +1 -0
  54. package/dist/client/assets/authenticatedMutationClient-DdowMjyo.js +2 -0
  55. package/dist/client/assets/{authenticatedMutationClient-Ccwguc3i.js.map → authenticatedMutationClient-DdowMjyo.js.map} +1 -1
  56. package/dist/client/assets/authorizedShareTransport-CnclcYai.js +2 -0
  57. package/dist/client/assets/{authorizedShareTransport-DZHgFEkh.js.map → authorizedShareTransport-CnclcYai.js.map} +1 -1
  58. package/dist/client/assets/client-Dq_XQE_l.js +5 -0
  59. package/dist/client/assets/client-Dq_XQE_l.js.map +1 -0
  60. package/dist/client/assets/confluenceTasks-DtKq8_eU.js +5 -0
  61. package/dist/client/assets/confluenceTasks-DtKq8_eU.js.map +1 -0
  62. package/dist/client/assets/connectionTestTransport-CPK98z7H.js +2 -0
  63. package/dist/client/assets/connectionTestTransport-CPK98z7H.js.map +1 -0
  64. package/dist/client/assets/index-zVjlBm9l.js +11 -0
  65. package/dist/client/assets/index-zVjlBm9l.js.map +1 -0
  66. package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js → patterns-5N-j-AD2-DLfaGePK.js} +2 -2
  67. package/dist/client/assets/{patterns-5N-j-AD2-BwypFm-e.js.map → patterns-5N-j-AD2-DLfaGePK.js.map} +1 -1
  68. package/dist/client/assets/{presentPortfolio-D3ZIcnqt.js → presentPortfolio-DLEq-vEz.js} +2 -2
  69. package/dist/client/assets/presentPortfolio-DLEq-vEz.js.map +1 -0
  70. package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js → presentWorkspaceItems-BOY3FbhO.js} +2 -2
  71. package/dist/client/assets/{presentWorkspaceItems-Bmh4oEbH.js.map → presentWorkspaceItems-BOY3FbhO.js.map} +1 -1
  72. package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js → pullRequestReviewFailures-CyjTVnSX.js} +2 -2
  73. package/dist/client/assets/{pullRequestReviewFailures-S74M-fOk.js.map → pullRequestReviewFailures-CyjTVnSX.js.map} +1 -1
  74. package/dist/client/assets/pullRequestReviewThreadReplay-CXHspFTr.js +2 -0
  75. package/dist/client/assets/pullRequestReviewThreadReplay-CXHspFTr.js.map +1 -0
  76. package/dist/client/assets/releaseAgentTransport-DaO4svPu.js +2 -0
  77. package/dist/client/assets/releaseAgentTransport-DaO4svPu.js.map +1 -0
  78. package/dist/client/assets/releaseRoutes-B4ciNOJj.js +2 -0
  79. package/dist/client/assets/{releaseRoutes-BCuIdZyA.js.map → releaseRoutes-B4ciNOJj.js.map} +1 -1
  80. package/dist/client/assets/serviceOnboarding-D0FmodRi.js +2 -0
  81. package/dist/client/assets/{serviceOnboarding-Jg_0yNjf.js.map → serviceOnboarding-D0FmodRi.js.map} +1 -1
  82. package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js → useWorkspaceDefaultLanding-BaQdg0sY.js} +3 -3
  83. package/dist/client/assets/{useWorkspaceDefaultLanding-CzlDdEF-.js.map → useWorkspaceDefaultLanding-BaQdg0sY.js.map} +1 -1
  84. package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js → useWorkspaceItems-B-7JHtm0.js} +2 -2
  85. package/dist/client/assets/{useWorkspaceItems-Cd3MPke2.js.map → useWorkspaceItems-B-7JHtm0.js.map} +1 -1
  86. package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js +2 -0
  87. package/dist/client/assets/workspaceEntityRoutes-DqqDa0AB.js.map +1 -0
  88. package/dist/client/assets/workspaceScrollCapture-BYNfR2wo.js +2 -0
  89. package/dist/client/assets/workspaceScrollCapture-BYNfR2wo.js.map +1 -0
  90. package/dist/client/assets/workspaceSettingsTransport-Br4lBmvS.js +2 -0
  91. package/dist/client/assets/{workspaceSettingsTransport-CZWYL5T7.js.map → workspaceSettingsTransport-Br4lBmvS.js.map} +1 -1
  92. package/dist/client/build-graph.json +115 -0
  93. package/dist/client/index.html +1 -1
  94. package/dist/server/api/agent.d.ts +575 -44
  95. package/dist/server/api/agent.d.ts.map +1 -1
  96. package/dist/server/api/deliveryGraph.d.ts +474 -454
  97. package/dist/server/api/deliveryGraph.d.ts.map +1 -1
  98. package/dist/server/api/index.d.ts +2 -2
  99. package/dist/server/api/index.d.ts.map +1 -1
  100. package/dist/server/api/index.js +4 -4
  101. package/dist/server/api/liveEvents.d.ts +20 -0
  102. package/dist/server/api/liveEvents.d.ts.map +1 -1
  103. package/dist/server/api/portfolio.d.ts +23 -0
  104. package/dist/server/api/portfolio.d.ts.map +1 -1
  105. package/dist/server/api/session.d.ts +23 -1
  106. package/dist/server/api/session.d.ts.map +1 -1
  107. package/dist/server/api/shares.d.ts +4 -2
  108. package/dist/server/api/shares.d.ts.map +1 -1
  109. package/dist/server/assets/{BindConfig-DIsf2Rnh.js → BindConfig-DAASchDn.js} +2405 -322
  110. package/dist/server/assets/BindConfig-DAASchDn.js.map +1 -0
  111. package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js → CodePipelineStateDecoder-CNiFRgSi.js} +2 -2
  112. package/dist/server/assets/{CodePipelineStateDecoder-CVf1A2zG.js.map → CodePipelineStateDecoder-CNiFRgSi.js.map} +1 -1
  113. package/dist/server/assets/{agent-CyZ40zs1.js → agent-xQhAQXly.js} +181 -11
  114. package/dist/server/assets/agent-xQhAQXly.js.map +1 -0
  115. package/dist/server/assets/{controlCenterApi-ZUX3Y-LE.js → controlCenterApi-DNXK7MT1.js} +6 -5
  116. package/dist/server/assets/controlCenterApi-DNXK7MT1.js.map +1 -0
  117. package/dist/server/assets/{descriptor-CKtTnhef.js → descriptor-CCvNzSZL.js} +10 -10
  118. package/dist/server/assets/{descriptor-CKtTnhef.js.map → descriptor-CCvNzSZL.js.map} +1 -1
  119. package/dist/server/assets/{failures-mgYDkUZy.js → failures-CesHLYbN.js} +2 -2
  120. package/dist/server/assets/{failures-mgYDkUZy.js.map → failures-CesHLYbN.js.map} +1 -1
  121. package/dist/server/assets/{firstPartyServices-D7b8BOek.js → firstPartyServices-Cdzjcs2H.js} +2 -2
  122. package/dist/server/assets/{firstPartyServices-D7b8BOek.js.map → firstPartyServices-Cdzjcs2H.js.map} +1 -1
  123. package/dist/server/assets/{manualPluginSynchronization-DFlhKvav.js → manualPluginSynchronization-DFIeUHP9.js} +6 -5
  124. package/dist/server/assets/manualPluginSynchronization-DFIeUHP9.js.map +1 -0
  125. package/dist/server/assets/{plugins-D__oMDpI.js → plugins-DiPrfzV8.js} +2 -2
  126. package/dist/server/assets/{plugins-D__oMDpI.js.map → plugins-DiPrfzV8.js.map} +1 -1
  127. package/dist/server/assets/{readiness-BhA-Nr9c.js → readiness-31Mqc-9H.js} +3 -3
  128. package/dist/server/assets/{readiness-BhA-Nr9c.js.map → readiness-31Mqc-9H.js.map} +1 -1
  129. package/dist/server/assets/{relationshipInferenceMaterialization-DYBcaWhQ.js → relationshipInferenceMaterialization-Dyix96px.js} +1158 -169
  130. package/dist/server/assets/relationshipInferenceMaterialization-Dyix96px.js.map +1 -0
  131. package/dist/server/assets/{workspaceSettings-BE713Oe8.js → workspaceSettings-sv8h_h2P.js} +2787 -2700
  132. package/dist/server/assets/workspaceSettings-sv8h_h2P.js.map +1 -0
  133. package/dist/server/build-graph.json +144 -4
  134. package/dist/server/domain/actors.d.ts +12 -12
  135. package/dist/server/domain/confluenceTasks.d.ts +27 -0
  136. package/dist/server/domain/confluenceTasks.d.ts.map +1 -0
  137. package/dist/server/domain/deliveryGraph.d.ts +51 -49
  138. package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
  139. package/dist/server/domain/governedAction/bindings.d.ts +26 -12
  140. package/dist/server/domain/governedAction/bindings.d.ts.map +1 -1
  141. package/dist/server/domain/governedAction/lifecycle.d.ts +8 -8
  142. package/dist/server/domain/governedAction/model.d.ts +45 -18
  143. package/dist/server/domain/governedAction/model.d.ts.map +1 -1
  144. package/dist/server/domain/governedAction/stateMachine.d.ts +34 -34
  145. package/dist/server/domain/index.js +6 -6
  146. package/dist/server/domain/normalizedIssue.d.ts +1 -1
  147. package/dist/server/domain/normalizedPage.d.ts +1 -0
  148. package/dist/server/domain/normalizedPage.d.ts.map +1 -1
  149. package/dist/server/domain/prReview.d.ts +38 -0
  150. package/dist/server/domain/prReview.d.ts.map +1 -1
  151. package/dist/server/domain/prReviewReconciliation.d.ts +56 -0
  152. package/dist/server/domain/prReviewReconciliation.d.ts.map +1 -0
  153. package/dist/server/domain/prReviewRevision.d.ts +1 -0
  154. package/dist/server/domain/prReviewRevision.d.ts.map +1 -1
  155. package/dist/server/domain/readiness/model.d.ts +3 -3
  156. package/dist/server/domain/release.d.ts +3 -3
  157. package/dist/server/domain/releasePipelineApproval.d.ts +31 -0
  158. package/dist/server/domain/releasePipelineApproval.d.ts.map +1 -0
  159. package/dist/server/domain/releasePublication.d.ts +4 -0
  160. package/dist/server/domain/releasePublication.d.ts.map +1 -0
  161. package/dist/server/index.js +8 -8
  162. package/dist/server/server/agent/AgentJobWorker.d.ts +10 -1
  163. package/dist/server/server/agent/AgentJobWorker.d.ts.map +1 -1
  164. package/dist/server/server/agent/ReleaseAgentPrompt.d.ts.map +1 -1
  165. package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts +4 -3
  166. package/dist/server/server/agent/internal/AgentJobTaskExecutor.d.ts.map +1 -1
  167. package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts +17 -1
  168. package/dist/server/server/agent/internal/PrReviewSandboxSession.d.ts.map +1 -1
  169. package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts +76 -2
  170. package/dist/server/server/agent/internal/PrReviewTaskExecutor.d.ts.map +1 -1
  171. package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts +27 -0
  172. package/dist/server/server/agent/internal/PrReviewTelemetry.d.ts.map +1 -0
  173. package/dist/server/server/api/ApplicationServices.d.ts +39 -5
  174. package/dist/server/server/api/ApplicationServices.d.ts.map +1 -1
  175. package/dist/server/server/api/Handlers.d.ts +1 -1
  176. package/dist/server/server/api/Handlers.d.ts.map +1 -1
  177. package/dist/server/server/api/RequestBoundary.d.ts.map +1 -1
  178. package/dist/server/server/application/GovernedReviewSuggestionPublicationGateway.d.ts.map +1 -1
  179. package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts +4 -0
  180. package/dist/server/server/application/ReviewSuggestionPublicationGateway.d.ts.map +1 -1
  181. package/dist/server/server/application/deliveryGraphInspection.d.ts.map +1 -1
  182. package/dist/server/server/application/index.d.ts +1 -0
  183. package/dist/server/server/application/index.d.ts.map +1 -1
  184. package/dist/server/server/application/liveEvents.d.ts.map +1 -1
  185. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
  186. package/dist/server/server/application/pipelineExecutionProjection.d.ts +7 -6
  187. package/dist/server/server/application/pipelineExecutionProjection.d.ts.map +1 -1
  188. package/dist/server/server/application/portfolioSnapshots.d.ts +2018 -4
  189. package/dist/server/server/application/portfolioSnapshots.d.ts.map +1 -1
  190. package/dist/server/server/application/pullRequestReviews.d.ts.map +1 -1
  191. package/dist/server/server/application/releaseAgent.d.ts +11 -3
  192. package/dist/server/server/application/releaseAgent.d.ts.map +1 -1
  193. package/dist/server/server/application/releasePublicationIntent.d.ts +7 -0
  194. package/dist/server/server/application/releasePublicationIntent.d.ts.map +1 -0
  195. package/dist/server/server/application/releasePublicationMetadata.d.ts +61 -0
  196. package/dist/server/server/application/releasePublicationMetadata.d.ts.map +1 -0
  197. package/dist/server/server/application/releasePublicationSubmissions.d.ts +3730 -0
  198. package/dist/server/server/application/releasePublicationSubmissions.d.ts.map +1 -0
  199. package/dist/server/server/application/releaseRunbookHydration.d.ts +2310 -0
  200. package/dist/server/server/application/releaseRunbookHydration.d.ts.map +1 -0
  201. package/dist/server/server/application/releaseSynchronization.d.ts.map +1 -1
  202. package/dist/server/server/cli.js +8 -8
  203. package/dist/server/server/cli.js.map +1 -1
  204. package/dist/server/server/governance/governedActionDigests.d.ts +236 -218
  205. package/dist/server/server/governance/governedActionDigests.d.ts.map +1 -1
  206. package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts +3 -4
  207. package/dist/server/server/governance/internal/GovernedActionExecutionEngine.d.ts.map +1 -1
  208. package/dist/server/server/governance/internal/execution-store/begin.d.ts.map +1 -1
  209. package/dist/server/server/governance/internal/execution-store/dispatch-inbox.d.ts +1 -1
  210. package/dist/server/server/governance/internal/execution-store/dispatch-outcome.d.ts +8 -8
  211. package/dist/server/server/governance/internal/execution-store/provider-outcome-fold.d.ts +2 -2
  212. package/dist/server/server/governance/internal/execution-store/reconciliation-inbox.d.ts +1 -1
  213. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts +37 -30
  214. package/dist/server/server/governance/internal/execution-store/recovery-claim.d.ts.map +1 -1
  215. package/dist/server/server/index.js +5 -5
  216. package/dist/server/server/internal/codepipeline-state-probe.js +1 -1
  217. package/dist/server/server/persistence/Database.d.ts +1 -1
  218. package/dist/server/server/persistence/Database.d.ts.map +1 -1
  219. package/dist/server/server/persistence/Persistence.d.ts +1549 -577
  220. package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
  221. package/dist/server/server/persistence/backup/BackupArchive.d.ts.map +1 -1
  222. package/dist/server/server/persistence/object-store/BlobPublisher.d.ts.map +1 -1
  223. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts +2 -2
  224. package/dist/server/server/persistence/object-store/PinnedDirectory.d.ts.map +1 -1
  225. package/dist/server/server/persistence/repositories/agentJobModels.d.ts +345 -8
  226. package/dist/server/server/persistence/repositories/agentJobModels.d.ts.map +1 -1
  227. package/dist/server/server/persistence/repositories/agentJobRepository.d.ts +654 -192
  228. package/dist/server/server/persistence/repositories/agentJobRepository.d.ts.map +1 -1
  229. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +148 -138
  230. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
  231. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +27 -25
  232. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
  233. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +117 -111
  234. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
  235. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +28 -27
  236. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
  237. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +50 -48
  238. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
  239. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +117 -111
  240. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
  241. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts +259 -234
  242. package/dist/server/server/persistence/repositories/governed-action/codec.d.ts.map +1 -1
  243. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts +68 -46
  244. package/dist/server/server/persistence/repositories/governed-action/contract.d.ts.map +1 -1
  245. package/dist/server/server/persistence/repositories/governed-action/read.d.ts +668 -190
  246. package/dist/server/server/persistence/repositories/governed-action/read.d.ts.map +1 -1
  247. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts +680 -206
  248. package/dist/server/server/persistence/repositories/governed-action/transaction.d.ts.map +1 -1
  249. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts +38 -31
  250. package/dist/server/server/persistence/repositories/governed-action/write-preparation.d.ts.map +1 -1
  251. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts +46 -32
  252. package/dist/server/server/persistence/repositories/governed-action/write-replay.d.ts.map +1 -1
  253. package/dist/server/server/persistence/repositories/governed-action/write.d.ts +46 -32
  254. package/dist/server/server/persistence/repositories/governed-action/write.d.ts.map +1 -1
  255. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts +678 -205
  256. package/dist/server/server/persistence/repositories/governedActionRepository.d.ts.map +1 -1
  257. package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts +85 -4
  258. package/dist/server/server/persistence/repositories/internal/reviewSuggestionRevisions.d.ts.map +1 -1
  259. package/dist/server/server/persistence/repositories/models.d.ts +9 -9
  260. package/dist/server/server/persistence/repositories/peopleRepository.d.ts +36 -36
  261. package/dist/server/server/persistence/repositories/providerAccountRepository.d.ts +1 -1
  262. package/dist/server/server/persistence/repositories/readiness/assessments.d.ts +6 -6
  263. package/dist/server/server/persistence/repositories/readiness/contract.d.ts +450 -450
  264. package/dist/server/server/persistence/repositories/readiness/queue.d.ts +14 -14
  265. package/dist/server/server/persistence/repositories/readinessRepository.d.ts +7 -7
  266. package/dist/server/server/persistence/repositories/releaseRepository.d.ts +18 -18
  267. package/dist/server/server/persistence/repositories/retentionRepository.d.ts.map +1 -1
  268. package/dist/server/server/persistence/repositories/timelineRepository.d.ts +4 -4
  269. package/dist/server/server/plugins/atlassian/AtlassianOAuthGrants.d.ts.map +1 -1
  270. package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts +9 -0
  271. package/dist/server/server/plugins/atlassian/AtlassianOAuthScopes.d.ts.map +1 -0
  272. package/dist/server/server/plugins/atlassian/AtlassianProfiles.d.ts.map +1 -1
  273. package/dist/server/server/plugins/codecommit/CodeCommitPluginDefinition.d.ts.map +1 -1
  274. package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts +2 -2
  275. package/dist/server/server/plugins/jira/JiraReadPlugin.d.ts.map +1 -1
  276. package/dist/server/server/plugins/jira/JiraReadProvider.d.ts.map +1 -1
  277. package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts +8 -0
  278. package/dist/server/server/plugins/jira/JiraReleaseVersionLimits.d.ts.map +1 -0
  279. package/dist/server/server/plugins/jira/index.d.ts +1 -1
  280. package/dist/server/server/plugins/jira/index.d.ts.map +1 -1
  281. package/dist/server/server/runtime/Bootstrap.d.ts +1 -1
  282. package/dist/server/server/runtime/Bootstrap.d.ts.map +1 -1
  283. package/dist/server/server/runtime/ControlCenterServer.d.ts +3 -3
  284. package/dist/server/server/runtime/ControlCenterServer.d.ts.map +1 -1
  285. package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts +11 -1
  286. package/dist/server/server/runtime/PrReviewWorkerStartup.d.ts.map +1 -1
  287. package/dist/server/server/runtime/RetentionStartup.d.ts.map +1 -1
  288. package/dist/server/server/runtime/ServerLifecycle.d.ts.map +1 -1
  289. package/dist/server/server/secrets/SecretStore.d.ts.map +1 -1
  290. package/package.json +10 -9
  291. package/dist/client/assets/AgentPage-DGL93TJU.js +0 -3
  292. package/dist/client/assets/AgentPage-DGL93TJU.js.map +0 -1
  293. package/dist/client/assets/AgentPage-DVSgQgJa.css +0 -1
  294. package/dist/client/assets/AtlassianOAuthCallbackPage-D1F1xE_2.js +0 -2
  295. package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js +0 -2
  296. package/dist/client/assets/AuthorizedSharePage-DCQUFY2I.js.map +0 -1
  297. package/dist/client/assets/BrowserCrypto-DVWR7DFd.js +0 -2
  298. package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js +0 -2
  299. package/dist/client/assets/BrowserSessionHydrator-DE46feEX.js.map +0 -1
  300. package/dist/client/assets/CommandSearch-CP_QCbkm.js +0 -2
  301. package/dist/client/assets/ItemsPage-BGFUkRL2.js +0 -2
  302. package/dist/client/assets/PortfolioOverview-D45rk8Hl.js +0 -2
  303. package/dist/client/assets/PortfolioOverview-D45rk8Hl.js.map +0 -1
  304. package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js +0 -6
  305. package/dist/client/assets/PullRequestReviewPanel-CqPtjhVW.js.map +0 -1
  306. package/dist/client/assets/ReleaseRoute-DXJ8Jg60.js +0 -2
  307. package/dist/client/assets/ReleaseWorkset-Dtzalmji.js +0 -2
  308. package/dist/client/assets/ReleaseWorkset-Dtzalmji.js.map +0 -1
  309. package/dist/client/assets/ServicesPage-DGcUjd2H.js +0 -2
  310. package/dist/client/assets/ServicesPage-DGcUjd2H.js.map +0 -1
  311. package/dist/client/assets/TimelinePage-Bq1RTQlP.js +0 -2
  312. package/dist/client/assets/TimelinePage-Bq1RTQlP.js.map +0 -1
  313. package/dist/client/assets/WorkspaceEntityLink-AdZ_T-Wk.js +0 -2
  314. package/dist/client/assets/WorkspaceEntityRoute-9iMOV64J.css +0 -1
  315. package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js +0 -3
  316. package/dist/client/assets/WorkspaceEntityRoute-Bxxnc8us.js.map +0 -1
  317. package/dist/client/assets/WorkspaceHomeLink-XbKSPths.js +0 -2
  318. package/dist/client/assets/WorkspacePullRequestDetails-BErJ5bk8.js.map +0 -1
  319. package/dist/client/assets/WorkspaceRichText-D1M637Ff.js.map +0 -1
  320. package/dist/client/assets/WorkspaceSettingsPage-Fy7Wx8Y2.js +0 -2
  321. package/dist/client/assets/WorkspaceSettingsPage-Fy7Wx8Y2.js.map +0 -1
  322. package/dist/client/assets/WorkspaceSettingsPage-P6yfac0b.css +0 -1
  323. package/dist/client/assets/agent-api-QVqt4a0O.js +0 -19
  324. package/dist/client/assets/agent-api-QVqt4a0O.js.map +0 -1
  325. package/dist/client/assets/authenticatedMutationClient-Ccwguc3i.js +0 -2
  326. package/dist/client/assets/authorizedShareTransport-DZHgFEkh.js +0 -2
  327. package/dist/client/assets/client-D27unen8.js +0 -5
  328. package/dist/client/assets/client-D27unen8.js.map +0 -1
  329. package/dist/client/assets/connectionTestTransport-BQ55d6Me.js +0 -2
  330. package/dist/client/assets/connectionTestTransport-BQ55d6Me.js.map +0 -1
  331. package/dist/client/assets/index-j5ze816l.js +0 -11
  332. package/dist/client/assets/index-j5ze816l.js.map +0 -1
  333. package/dist/client/assets/presentPortfolio-D3ZIcnqt.js.map +0 -1
  334. package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js +0 -2
  335. package/dist/client/assets/pullRequestReviewThreadReplay-oljKM7Xz.js.map +0 -1
  336. package/dist/client/assets/releaseRoutes-BCuIdZyA.js +0 -2
  337. package/dist/client/assets/serviceOnboarding-Jg_0yNjf.js +0 -2
  338. package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js +0 -2
  339. package/dist/client/assets/workspaceScrollCapture-CJ4QUptr.js.map +0 -1
  340. package/dist/client/assets/workspaceSettingsTransport-CZWYL5T7.js +0 -2
  341. package/dist/server/assets/BindConfig-DIsf2Rnh.js.map +0 -1
  342. package/dist/server/assets/agent-CyZ40zs1.js.map +0 -1
  343. package/dist/server/assets/controlCenterApi-ZUX3Y-LE.js.map +0 -1
  344. package/dist/server/assets/manualPluginSynchronization-DFlhKvav.js.map +0 -1
  345. package/dist/server/assets/relationshipInferenceMaterialization-DYBcaWhQ.js.map +0 -1
  346. package/dist/server/assets/workspaceSettings-BE713Oe8.js.map +0 -1
package/README.md CHANGED
@@ -31,7 +31,7 @@ delivery evidence as one connected release.
31
31
 
32
32
  | Target | Largest measured artifact | Measured raw / gzip | Per-artifact raw / gzip budget |
33
33
  | ------ | --------------------------- | ------------------------: | -----------------------------: |
34
- | Client | generated API client chunk | 221,593 / 66,543 bytes | 235,000 / 70,000 bytes |
34
+ | Client | generated API client chunk | 251,169 / 74,462 bytes | 260,000 / 80,000 bytes |
35
35
  | Server | shared `BindConfig-*` chunk | 1,583,001 / 273,567 bytes | 1,650,000 / 290,000 bytes |
36
36
 
37
37
  These initial ceilings were measured from a production build on 2026-07-19 and leave roughly four to six percent headroom, enough for build variance while rejecting meaningful per-file growth. The server chunk was about 6.87 MB raw and 1.09 MB gzip before the server build externalized declared runtime dependencies. Vite had followed linked workspace packages into their transitive graphs, including `confluence-to-markdown`'s Atlaskit schema/transformer, AJV, Markdown, and ProseMirror dependencies, `control-center-sql`'s query parser, and the broad `codecommit-core` root barrel. The server now keeps dependencies as runtime imports and uses narrow CodeCommit subpaths.
@@ -49,6 +49,34 @@ pnpm --filter @knpkv/control-center start
49
49
 
50
50
  The first run prints a single-use pairing code and listens at `http://127.0.0.1:4173`. Durable data, content, and owner-only secrets live under `.control-center` by default; set `CONTROL_CENTER_DATA_ROOT` to choose another owner-controlled directory.
51
51
 
52
+ ### Real Atlassian OAuth acceptance journey
53
+
54
+ The full interactive Jira + Confluence OAuth journey is opt-in because it requires a human Atlassian
55
+ consent and access to a real site. Register the callback URL
56
+ `http://127.0.0.1:<temporary-port>/services/oauth/atlassian/callback` in the OAuth app, then run:
57
+
58
+ ```sh
59
+ CONTROL_CENTER_TEST_ATLASSIAN_OAUTH=1 \
60
+ CONTROL_CENTER_TEST_ATLASSIAN_PORT=4173 \
61
+ CONTROL_CENTER_TEST_ATLASSIAN_CLIENT_ID=... \
62
+ CONTROL_CENTER_TEST_ATLASSIAN_CLIENT_SECRET=... \
63
+ CONTROL_CENTER_TEST_ATLASSIAN_PROJECT_ID=... \
64
+ CONTROL_CENTER_TEST_ATLASSIAN_SPACE_ID=... \
65
+ CONTROL_CENTER_TEST_ATLASSIAN_PAGE_ID=... \
66
+ CONTROL_CENTER_TEST_ATLASSIAN_EXPECTED_ACCOUNT_EMAIL=... \
67
+ CONTROL_CENTER_TEST_ATLASSIAN_EXPECTED_SITE_URL=https://example.atlassian.net/ \
68
+ pnpm --filter @knpkv/control-center test:e2e:atlassian-oauth
69
+ ```
70
+
71
+ The command starts a fresh temporary server and data root on the configured fixed port, pairs through
72
+ the browser, waits for the operator to complete Atlassian sign-in and consent, selects one site, creates
73
+ both provider connections, and runs both connection checks. Register the callback using the same port
74
+ before starting the command. The client secret is used only as masked form input; the test disables
75
+ screenshots and traces, verifies the canonical profile contains credentials, and checks browser
76
+ storage, SQL/WAL/journal files, Playwright artifacts, and server output for the client/provider
77
+ credentials. It removes the temporary data, auth, and configuration roots on success or failure.
78
+ Provider tokens remain server-private and are never returned to browser storage or SQL.
79
+
52
80
  ### Local OpenTelemetry
53
81
 
54
82
  Control Center can export Effect traces and structured logs to an OTLP/HTTP collector. Export is opt-in and disabled unless the corresponding OpenTelemetry exporters are enabled. Metrics are not exported in this initial slice.
@@ -183,16 +211,31 @@ and uses only the disposable clone. Codex disables project-document and exec-pol
183
211
  reviewed head; Claude disables project, local, and user setting sources so its `CLAUDE.md` files are
184
212
  review content rather than executable instructions, and safe mode disables automatic project-memory
185
213
  discovery. Every path validates structured output and exact
186
- diff evidence on the trusted host. Sandbox names are server-private, remain within sbx's 63-character
214
+ diff evidence on the trusted host. Sandbox names use a server-private compact workspace-scoped prefix and remain within sbx's 63-character
187
215
  limit, and begin with the configured worker workspace's
188
- `cc-pr-review-<compact-workspace-id>-` prefix. Startup removes only crash leftovers in that owned
189
- namespace; foreign-workspace and legacy unscoped names are not removed automatically.
216
+ `cc-pr-review-<compact-workspace-id>-` prefix. Startup retains live names in that owned namespace
217
+ for recovery inspection and never removes foreign-workspace or legacy unscoped names automatically.
218
+ When no owned live sandbox remains, active review jobs receive a durable interrupted result with
219
+ partial evidence and a later operator retry creates a new immutable run.
190
220
  While a review is running, the worker renews its durable lease and
191
221
  observes cancellation; cancellation
192
222
  interrupts the scoped checkout, sandbox, and model work before durably completing the job as cancelled.
193
223
  `CONTROL_CENTER_PR_REVIEW_BUDGET_MILLIS` and
194
224
  `CONTROL_CENTER_PR_REVIEW_MAXIMUM_DURATION_MILLIS` both default to 1,200,000 milliseconds. The maximum
195
225
  session duration should be at least the selected Review Agent Profile budget.
226
+ The worker enforces the selected budget independently of provider process limits. An operator may extend
227
+ one running review once by one profile budget; the extension is durable and visible to the worker after
228
+ restart. Cancellation and budget expiry retain the last validated partial report, mark the run unable to
229
+ conclude, and leave any retained suggestions as advice-only because unexplored project areas remain.
230
+
231
+ Provider parity is enforced at the Review Sandbox boundary: native Codex and Claude receive the same
232
+ immutable checkout, bounded review prompt, structured report schema, exact diff anchoring, activity,
233
+ and cleanup contract. The deterministic executor tests exercise that shared request shape for both
234
+ providers; the installed-runtime fixture additionally runs full-project discovery, a command, a write,
235
+ diff generation, and a structured JSON result without credentials. Run that fixture deliberately with
236
+ `pnpm --filter @knpkv/control-center test:sbx:real`; it requires Docker and `sbx`, but does not require
237
+ AWS, Codex, Claude, or provider API credentials. The real authenticated Codex CLI smoke remains an
238
+ explicit separate opt-in in `@knpkv/ai-codex`.
196
239
 
197
240
  The launch dialog shows the exact head, selected Review Agent Profile, budget, network policy, and sbx
198
241
  runtime before enqueue. The selected model explores the complete project inside the Review Sandbox.
@@ -384,11 +427,11 @@ The exported `PluginConnection` service contains reads, health, sync, complete-d
384
427
 
385
428
  ### CodeCommit read adapter
386
429
 
387
- The production CodeCommit adapter exports an opaque `CodeCommitPluginDefinition` from `@knpkv/control-center/server`. One connection configures an AWS profile, region, and repository name. It negotiates `entity.read@1`, `sync.incremental@1`, `diff.inventory@2`, and `diff.content@2` (while retaining the v1 codecs for persisted descriptors), then normalizes pull requests with immutable PR/base/head revisions and complete cursor-based changed-file pages. Diff v2 requires the synchronized provider revision and immutable base/head commits; the authenticated application resolves those coordinates from the workspace-scoped canonical projection rather than accepting them from the browser. Provider output is decoded by `@knpkv/codecommit-core` before it enters the vendor-neutral plugin contract; raw AWS types and causes do not cross the adapter.
430
+ The production CodeCommit adapter exports an opaque `CodeCommitPluginDefinition` from `@knpkv/control-center/server`. One connection configures an AWS profile, region, and repository name. It negotiates `entity.read@1`, `sync.incremental@1`, `diff.inventory@2`, and `diff.content@2` (while retaining the v1 codecs for persisted descriptors), then normalizes pull requests with immutable PR/base/head revisions and complete cursor-based changed-file pages. Its governed review actions support exact-head create, update, and reply comment mutations plus native approval state changes; every mutation remains behind the human-confirmed action flow. Diff v2 requires the synchronized provider revision and immutable base/head commits; the authenticated application resolves those coordinates from the workspace-scoped canonical projection rather than accepting them from the browser. Provider output is decoded by `@knpkv/codecommit-core` before it enters the vendor-neutral plugin contract; raw AWS types and causes do not cross the adapter.
388
431
 
389
432
  Authenticated diff APIs collect at most 500 files and 100 provider pages before returning `ready`; partial inventories never masquerade as complete. Every file receives a stable exact-revision anchor. Content reads resubmit that anchor with the normalized status and previous path in a bounded read-only POST payload, keeping maximum-length rename identities out of the request URL. The application verifies the canonical identity before the provider selects the exact entry from the stored commits, so synchronized historical revisions remain readable after the live pull request advances. Text content is fetched only for the selected before/after side in ranges of at most one MiB. Binary, generated, oversized, and missing content remain explicit inventory/workbench states; authentication, throttling, timeout, and provider outages remain typed failures and retain the normal safe-read retry policy.
390
433
 
391
- This milestone remains read-only. It does not expose comments, commits/history, checks, merge, or any ungoverned provider mutation capability. Provider credentials and AWS response types stay behind the scoped server runtime and never enter browser state or diff URLs.
434
+ This milestone's synchronized entity data remains read-only and does not expose comment reads, commits/history, checks, or merge. Only the governed create, update, and reply comment mutations and approval actions described above are exposed; no ungoverned provider mutation capability exists. Provider credentials and AWS response types stay behind the scoped server runtime and never enter browser state or diff URLs.
392
435
 
393
436
  ### AWS CodePipeline adapter
394
437
 
@@ -404,7 +447,7 @@ The canonical CodePipeline entity page is a read-first execution flight recorder
404
447
 
405
448
  ### Jira issue adapter
406
449
 
407
- `makeJiraReadPluginRuntime` from `@knpkv/control-center/server` builds the production Jira adapter around the shared Schema-validated `JiraApiClient`. It negotiates bounded project synchronization, `entity.read` for `jira.issue`, and revision-inspected governed proposals for comments, reply fallbacks, exact fix-version assignments, and typed issue links. Every proposal preserves the exact `jira.issue` target identity and records the inspected issue revision. Jira provider writes are unnegotiated until Jira offers atomic provider revision guards or the product adopts explicit append-only authorization semantics.
450
+ `makeJiraReadPluginRuntime` from `@knpkv/control-center/server` builds the production Jira adapter around the shared Schema-validated `JiraApiClient`. It negotiates bounded project synchronization, `entity.read` for `jira.issue`, revision-inspected governed proposals for comments, reply fallbacks, exact fix-version assignments, and typed issue links, plus a separately governed `create-release-version` action. Every issue proposal preserves the exact `jira.issue` target identity and records the inspected issue revision. Jira issue provider writes remain disabled until Jira offers a documented, verified provider-enforced atomic revision precondition for the exact target revision; append-only authorization is not a substitute for that guard. The release-version action is create-only and project-scoped: it never edits an existing issue or version, checks for an exact existing name before dispatch, and reconciles ambiguous outcomes by that name. Its durable canonical request is the governed-action `envelope_json`: the payload persists only `projectId`, exact `name`, and release `description`; the production identity also binds the workspace, selected connection and its verified Atlassian site, release, source-revision digest, immutable project destination, and canonical payload digest. Provider credentials remain server-private and are never durable payload fields.
408
451
 
409
452
  The secret-free runtime configuration requires an HTTPS Jira Cloud tenant root `webBaseUrl` under `atlassian.net`, its stable Atlassian cloud `siteId`, the immutable `projectId` followed by this connection, an activity `pageSize` from 1 to 50, a `maximumPages` limit from 1 to 5, and a per-request `operationTimeoutMillis` from 1,000 to 120,000. Discovery verifies the project through Jira before it can become a followed resource, and entity reads fail closed when an issue belongs to another project. Authentication remains in the externally supplied `JiraApiClient` layer, so tokens never enter plugin configuration.
410
453
 
@@ -412,19 +455,25 @@ OAuth profiles provide the verified cloud ID used to share one Atlassian site ac
412
455
 
413
456
  An issue read fetches the issue, comments, and changelog through interruptible Effect operations. Pagination stops at the configured bound and records explicit comment/history truncation flags. The normalized issue attributes include description and environment text, workflow metadata, release versions, parent and subtasks, comments, history, and deduplicated collaborators with roles and avatar URLs. If fixed issue fields would cross the payload cap, optional arrays and presentation fields are omitted deterministically and named in `truncatedFields`. OpenAPI, HTTP, timeout, authentication, authorization, rate-limit, outage, and adapter-schema failures are translated to the closed plugin failure taxonomy without retaining raw provider causes.
414
457
 
415
- These proposals are useful for review and authorization workflows, but this adapter does not execute or reconcile them. Jira Cloud's issue-comment API does not expose portable threaded replies, so a reply proposal is rendered as a normal comment headed with the inspected parent comment ID; a missing parent blocks the proposal. Issue-link proposals require an explicit direction and retain Jira's canonical inward and outward labels: `outward` means the target issue points to the linked issue, while `inward` means the linked issue points to the target issue. Workflow transitions and description replacement remain unsupported, and all comment, fix-version, and issue-link provider mutations stay disabled behind the proposal boundary.
458
+ The issue-targeted proposals are useful for review and authorization workflows, but this adapter does not execute or reconcile them. Jira Cloud's issue-comment API does not expose portable threaded replies, so a reply proposal is rendered as a normal comment headed with the inspected parent comment ID; a missing parent blocks the proposal. Issue-link proposals require an explicit direction and retain Jira's canonical inward and outward labels: `outward` means the target issue points to the linked issue, while `inward` means the linked issue points to the target issue. Workflow transitions and description replacement remain unsupported, and all comment, fix-version, and issue-link provider mutations stay disabled behind the proposal boundary. Separately, Relay can execute and reconcile create-only Jira project-version publication after an explicit workspace-owner confirmation.
416
459
 
417
460
  ### Confluence page adapter
418
461
 
419
462
  The production Confluence adapter negotiates `entity.read@1`, bounded `sync.incremental@1` for the `pages` stream, and governed `action.propose@1`, `action.execute@1`, and `action.reconcile@1` page publication. Each connection is pinned to one immutable space ID under its verified Atlassian site. Space iteration and actions always send that exact ID to Confluence and reject any returned page belonging to another space, so followed spaces sharing one OAuth site remain isolated.
420
463
 
421
- Synchronization retains current page and bounded revision metadata, owner/author/contributor/watcher roles, and at most two pages each of watcher and attachment metadata without loading attachment bytes. Page bodies remain `contentState: "lazy"`; `entity.read` loads and safely converts ADF only when the page is opened. Titles containing operational runbook terms emit explicit `confluence.runbook-candidate` evidence rather than silently classifying a page as authoritative documentation.
464
+ Synchronization retains current page and bounded revision metadata, owner/author/contributor/watcher roles, safely converted current page text, and at most two pages each of watcher and attachment metadata without loading attachment bytes. When the normalized payload would exceed its bound, content is dropped first and explicitly remains `contentState: "lazy"`; `entity.read` can still load and safely convert the exact page. Titles containing operational runbook terms emit explicit `confluence.runbook-candidate` evidence rather than silently classifying a page as authoritative documentation.
422
465
 
423
466
  One invocation reads at most five provider pages and persists a resumable `bounded:<cursor>` checkpoint when more work exists. Large provider pages are deterministically divided into contract-sized atomic pages. Intermediate chunks use a restart checkpoint for the current provider page so interruption replays stable event identities instead of skipping uncommitted entities.
424
467
 
425
- An `update-page` proposal accepts bounded Markdown, converts it through the owning package's strict outgoing ADF validator, and freezes the canonical ADF, title, space, expected version, and exact next version in the authorized payload. Final preflight blocks a changed revision or a visible unpublished draft before dispatch, and dispatch checks for a draft again immediately before mutation. The provider update then supplies only `expectedVersion + 1`, so Confluence's atomic version check prevents a superseded authorization from overwriting newer published content. The draft probes are defense in depth rather than an atomic guarantee: Confluence exposes no conditional update that prevents a draft created after the final probe from being merged or overwritten, so callers that require draft-atomic publication must not use this action. Each published version carries a bounded Control Center idempotency-and-payload marker. A timeout, conflict, outage, or malformed post-write response becomes an unknown outcome, while a provider-declared invalid request is a confirmed rejection. Reconciliation reads the exact authorized version for that marker without replaying the mutation, so recovery can find it after arbitrarily many later edits. Because Confluence uses the same exact-version 404 for an absent version, a vanished page, and lost permission, and may omit version messages, those ambiguous observations remain pending instead of producing a false terminal failure. The retained marker keeps historical publication evidence attributable after later edits. Cancellation remains unsupported because the provider update is synchronous.
468
+ An `update-page` proposal accepts bounded Markdown, converts it through the owning package's strict outgoing ADF validator, and freezes the canonical ADF, title, space, expected version, and exact next version in the authorized payload. Final preflight blocks a changed revision or a visible unpublished draft unless the draft exactly matches the published title, ADF body, parent, and owner; dispatch repeats that equivalence check immediately before mutation. Missing comparison fields are treated as divergent. The provider update then supplies only `expectedVersion + 1`, so Confluence's atomic version check prevents a superseded authorization from overwriting newer published content. The draft probes are defense in depth rather than an atomic guarantee: Confluence exposes no conditional update that prevents a draft created after the final probe from being merged or overwritten, and newly editable provider fields require explicit equivalence coverage, so callers that require draft-atomic publication must not use this action. Each published version persists the exact marker `Control Center <authorized idempotencyKey> <payloadDigest>[ · <bounded versionMessage>]` in its Confluence version message. The durable provider outcome separately records either the terminal provider-operation identity `confluence-page:<pageId>:v<targetVersion>` or, while an outcome is unknown, the reconciliation key `cfpg:v1:<pageId>:<targetVersion>`; neither is folded into the version marker. The normalized `pluginConnectionId` is an authenticated client-visible identifier used in typed HTTP route parameters and the browser's cross-tab synchronization storage key; it is not a credential or raw provider locator and must not cross an unauthenticated or public boundary. The verified Atlassian `siteId`, API credentials, and raw provider secrets remain server-private. None of those values are marker fields or canonical payload fields. A timeout, conflict, outage, or malformed post-write response becomes an unknown outcome, while a provider-declared invalid request is a confirmed rejection. Reconciliation reads the exact authorized version for that marker without replaying the mutation, so recovery can find it after arbitrarily many later edits. Because Confluence uses the same exact-version 404 for an absent version, a vanished page, and lost permission, and may omit version messages, those ambiguous observations remain pending instead of producing a false terminal failure. The retained marker keeps historical publication evidence attributable after later edits. Cancellation remains unsupported because the provider update is synchronous.
469
+
470
+ The canonical item page presents synchronized safe Markdown as an in-place visual editor for workspace owners. Saving always targets the exact normalized page and revision; Relay can draft against that same page before the owner confirms publication. Markdown task checkboxes on pages related directly to a release are counted in the release workset. A task-only update is enabled only when the normalized page explicitly proves that its Markdown can replace the provider ADF without losing structure; ordinary safe projections remain read-only because they deliberately omit destinations, media, raw HTML, and ADF round-trip metadata. Unchecked tasks, lazy page bodies, a truncated release graph, or an affected CodePipeline execution that is not waiting at an observed approval stage block a new Jira release-version publication. Every pipeline reached by a current pull-request `delivered-by` relationship is affected; each must expose a manual approval action or an approval-named stage and keep that stage running while the release is prepared.
471
+
472
+ While an enabled Confluence page is open and visible to a workspace owner, the browser performs one immediate connection-wide synchronization and repeats it every 15 seconds; saving or manually requesting a refresh can trigger an additional synchronization after current work settles. Same-origin browser tabs and mounted page controllers for the same connection share one foreground cadence. This foreground, owner-visible refresh is distinct from background scheduling: unbounded scheduled synchronization and webhook-driven synchronization remain deferred.
473
+
474
+ Confluence release templates are synchronized pages whose title contains the word `template`. Classification happens before the bounded 50-template hydration limit, so unrelated pages cannot hide a later template. The release agent loads only classified pages with exact readable content, places a copy in the release editor, and creates a separate Confluence page while the source remains unchanged. The durable canonical request is the governed-action `envelope_json`; its `releasePublication` structure persists the release ID, predecessor publication action, optional `templateSourceEntityId`, source-revision digest, and source-revision count. The publication idempotency digest binds workspace, release, provider and action kind, title, Markdown, parent, predecessor, source entity, Confluence page and expected version, source-revision digest, destination, and target entity. Provider credentials and private locators remain server-private and are never canonical payload fields.
426
475
 
427
- Unbounded watcher/activity history, authoritative deletion evidence, scheduled or webhook synchronization, and content search remain deferred to later Confluence milestones.
476
+ Unbounded watcher/activity history, authoritative deletion evidence, background scheduled or webhook synchronization, and content search remain deferred to later Confluence milestones.
428
477
 
429
478
  ### Clockify time-entry integration
430
479
 
@@ -460,7 +509,7 @@ Secure blob reads and publication require the host to expose opened files and di
460
509
 
461
510
  ## Local authentication
462
511
 
463
- `Auth` uses ten-minute, single-use pairing codes to create browser sessions. The first code for a workspace is unique and creates its owner; further device codes, session listing, and targeted revocation require an active owner session. Sessions have a twelve-hour sliding idle limit, a thirty-day absolute limit, and a separate CSRF credential for mutations. SQLite contains only SHA-256 credential digests. Invalid, expired, replayed, revoked, and malformed stored credentials share the same public rejection shape.
512
+ `Auth` uses ten-minute, single-use pairing codes to create browser sessions. The first code for a workspace is unique and creates its owner. An owner can use the **Browsers** section in workspace settings to add further owner or approver browsers, inspect every independent session, and revoke a selected browser without disrupting the current one. The displayed device code is returned once with `private, no-store` response policy and is never persisted by the browser. Sessions have a twelve-hour sliding idle limit, a thirty-day absolute limit, and a separate CSRF credential for mutations. SQLite contains only SHA-256 credential digests. Invalid, expired, replayed, revoked, and malformed stored credentials share the same public rejection shape.
464
513
 
465
514
  Use `authLayer(persistenceConfig)` from `@knpkv/control-center/server` for standalone composition. `TerminalRecovery` is a separate, terminal-only service: it derives the exact canonical `0700` directory from the configured database, requires an exact confirmation phrase, and proves that the running process owns the descriptor-pinned directory before it can issue an owner recovery code. Each successful recovery creates a durable audit event. Recovery is deliberately absent from the HTTP-facing `Auth` service.
466
515
 
@@ -510,10 +559,14 @@ the normalized provider identities and account/resource bindings. Scope finaliza
510
559
  server and removes the database, blob, static, and secret roots after success, failure, timeout, or
511
560
  interruption. The scheduled/manual workflow builds a checksum-sealed runner in a job without OIDC,
512
561
  then verifies it in the protected `control-center-live-integration` execution job before assuming the
513
- AWS role. The short-lived runner artifact contains code and dependencies only; provider credentials,
514
- results, logs, and runtime evidence are never uploaded. Ordinary pull-request tests never select
515
- this entry. The external read-only AWS role and stable provider fixtures are defined in
516
- `infra/control-center-live-aws`; interactive Atlassian OAuth consent remains tracked by #242.
562
+ AWS role. That GitHub environment is the non-mutable trust boundary for manual `workflow_dispatch
563
+ --ref` runs: keep its deployment branch policy limited to `main`, store the Atlassian secrets only in
564
+ that environment, and pin the AWS role trust policy to the repository and environment OIDC subject.
565
+ A branch-authored workflow-level `if` is only defense in depth because a selected ref can change its
566
+ own YAML. The short-lived runner artifact contains code and dependencies only; provider
567
+ credentials, results, logs, and runtime evidence are never uploaded. Ordinary pull-request tests
568
+ never select this entry. The external read-only AWS role and stable provider fixtures are defined in
569
+ `infra/control-center-live-aws`; interactive Atlassian OAuth consent remains tracked by issue `#242`.
517
570
 
518
571
  The smaller AWS-only acceptance command is
519
572
  `pnpm --filter @knpkv/control-center test:integration:live-aws`. It requires
@@ -530,7 +583,7 @@ Configured connections can be enabled or disabled directly from Services through
530
583
 
531
584
  Catalog field metadata marks adapter settings separately from credential fields. Jira and Confluence prefer one shared local Atlassian OAuth profile. An owner can start PKCE-protected Atlassian sign-in for the intended provider set from Services, return to the session-bound callback route, and explicitly choose one accessible site. Control Center requests only the intended providers' scope union and writes the selected token once to its canonical machine-local `control-center` profile store; both Jira and Confluence runtimes resolve that same credential record when its granted scopes support them. Before writing, it rechecks the canonical store's OAuth client configuration. A populated canonical store with a missing or different client configuration rejects completion without changing the store, while an empty canonical store receives the shared configuration and token. The first-run client secret crosses one bounded CSRF-protected request and is never returned, persisted in browser storage, or written to SQL; provider tokens never enter the browser or SQL. Existing `jira-cli` and `confluence-to-markdown` profiles remain discoverable as provider-specific legacy profiles rather than being merged into a shared credential, and an explicit API-token fallback retains the `email` and `apiToken` secret-store path. OAuth fills the stable Atlassian cloud ID automatically; API-token setup requires the same site ID explicitly.
532
585
 
533
- Create one shared Atlassian OAuth app for Control Center on the server machine. Add `<public-origin>/services/oauth/atlassian/callback` as its callback URL and enable the complete scope union requested by the Jira and Confluence integrations: `read:jira-work`, `write:jira-work`, `read:jira-user`, `manage:jira-project`, `manage:jira-configuration`, `read:page:confluence`, `write:page:confluence`, `delete:page:confluence`, `read:attachment:confluence`, `write:attachment:confluence`, `read:me`, and `offline_access`.
586
+ Create one shared Atlassian OAuth app for Control Center on the server machine. Add `<public-origin>/services/oauth/atlassian/callback` as its callback URL. Enable Jira's governed release-version publication scopes (`read:jira-work`, `manage:jira-project`, `read:jira-user`, `read:me`, `offline_access`) and the Confluence integration's documented scopes (`read:page:confluence`, `write:page:confluence`, `delete:page:confluence`, `read:attachment:confluence`, `write:attachment:confluence`). Jira authority is limited to create-only project-version publication; Jira issue edits remain proposal-only.
534
587
 
535
588
  Choose **Sign in with Atlassian** in Services. When no OAuth app has been configured, Control Center shows its exact callback URL and accepts the client ID and secret inline. The CSRF-protected server stores them directly in the machine-local `control-center` auth store before continuing sign-in; neither the Jira nor Confluence CLI needs to be installed or configured. Credentials can be corrected after a failed first exchange while the canonical store has no profiles. Once a profile is saved, the existing configuration is reused and cannot be silently replaced. Matching legacy CLI configurations remain a compatibility fallback only. Non-loopback callbacks use the trusted HTTPS proxy or direct-TLS setup described above; insecure LAN mode cannot configure providers. A grant expires after ten minutes, is bound to the initiating workspace and browser session, and is consumed once at code exchange and once at site selection. Token expiry remains anchored to the provider exchange response even when site selection or a safe completion retry occurs later.
536
589