@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manualPluginSynchronization-DFIeUHP9.js","names":[],"sources":["../../../src/server/application/pipelineExecutionProjection.ts","../../../src/server/application/pluginSynchronizationAuthority.ts","../../../src/server/application/normalizedPluginPageMaterialization.ts","../../../src/server/application/manualPluginSynchronization.ts"],"sourcesContent":["import * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\n\nimport { DeliveryEntityDetails } from \"../../domain/deliveryGraph.js\"\nimport type { NormalizedPluginEventV1 } from \"../../domain/plugins/events.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport {\n type CodePipelineCacheSelector,\n MaximumCodePipelineCorrelationExecutions\n} from \"../persistence/repositories/pluginRuntimeModels.js\"\n\ntype EntityUpsert = Extract<NormalizedPluginEventV1, { readonly _tag: \"UpsertEntity\" }>\n\nconst OptionalText = Schema.optionalKey(Schema.NullOr(Schema.String))\nconst OptionalUnknown = Schema.optionalKey(Schema.NullOr(Schema.Unknown))\nconst InputDirection: \"input\" = \"input\"\nconst OutputDirection: \"output\" = \"output\"\nconst ProxyRequired: \"proxy-required\" = \"proxy-required\"\nconst NamedText = Schema.Union([\n Schema.String,\n Schema.Struct({ name: Schema.optionalKey(Schema.NullOr(Schema.String)) })\n])\nconst PipelineSourceRevisionAttributes = Schema.Struct({\n actionName: OptionalText,\n revisionId: OptionalText,\n revisionSummary: OptionalText\n})\nconst PipelineArtifactRevisionAttributes = Schema.Struct({\n name: OptionalText,\n revisionId: OptionalText,\n revisionSummary: OptionalText,\n createdAt: OptionalUnknown\n})\nconst PipelineActionArtifactAttributes = Schema.Struct({\n name: OptionalText,\n access: Schema.optionalKey(Schema.Literal(\"proxy-required\"))\n})\nconst PipelineActionTypeAttributes = Schema.Struct({\n category: OptionalText,\n owner: OptionalText,\n provider: OptionalText,\n version: OptionalText\n})\nconst PipelineDeclarationActionAttributes = Schema.Struct({\n name: OptionalText,\n runOrder: Schema.optionalKey(Schema.NullOr(Schema.Int))\n})\nconst PipelineDeclarationStageAttributes = Schema.Struct({\n name: OptionalText,\n actions: Schema.optionalKey(Schema.Array(PipelineDeclarationActionAttributes))\n})\n\n/** Pipeline fields decoded only inside the CodePipeline projection boundary. */\nconst PipelineEntityAttributeFields = {\n pipelineName: OptionalText,\n pipelineVersion: Schema.optionalKey(Schema.NullOr(Schema.Int)),\n executionId: OptionalText,\n triggerRevision: OptionalText,\n statusSummary: OptionalText,\n startedAt: OptionalUnknown,\n updatedAt: OptionalUnknown,\n sourceRevisions: Schema.optionalKey(Schema.Array(PipelineSourceRevisionAttributes)),\n triggerType: OptionalText,\n triggerDetail: OptionalText,\n executionMode: OptionalText,\n executionType: OptionalText,\n rollbackTargetExecutionId: OptionalText,\n artifactRevisions: Schema.optionalKey(Schema.Array(PipelineArtifactRevisionAttributes)),\n actionCount: Schema.optionalKey(Schema.NullOr(Schema.Int)),\n actionsTruncated: Schema.optionalKey(Schema.Boolean),\n actionPagesRead: Schema.optionalKey(Schema.NullOr(Schema.Int)),\n actionExecutionId: OptionalText,\n stageName: OptionalText,\n actionName: OptionalText,\n actionType: Schema.optionalKey(Schema.NullOr(PipelineActionTypeAttributes)),\n updatedBy: OptionalText,\n actionRegion: OptionalText,\n inputArtifacts: Schema.optionalKey(Schema.Array(PipelineActionArtifactAttributes)),\n outputArtifacts: Schema.optionalKey(Schema.Array(PipelineActionArtifactAttributes)),\n externalExecutionSummary: OptionalText,\n errorCode: OptionalText,\n errorMessage: OptionalText,\n stages: Schema.optionalKey(Schema.Array(PipelineDeclarationStageAttributes))\n}\n\n/** Provider-owned field names that unrelated entity decoders may safely ignore. */\nexport const PipelineEntityAttributeNames: ReadonlySet<string> = new Set(Object.keys(PipelineEntityAttributeFields))\n\nconst PipelineEntityAttributes = Schema.Struct({\n status: Schema.optionalKey(Schema.NullOr(NamedText)),\n ...PipelineEntityAttributeFields\n})\ntype PipelineEntityAttributes = typeof PipelineEntityAttributes.Type\n\n/** Redacted failure raised while correlating one bounded execution page. */\nexport class PipelineExecutionProjectionError extends Schema.TaggedErrorClass<PipelineExecutionProjectionError>()(\n \"PipelineExecutionProjectionError\",\n {\n diagnosticCode: Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(100)),\n eventId: Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(512))\n }\n) {}\n\nconst malformed = (diagnosticCode: string, eventId: string) =>\n new PipelineExecutionProjectionError({ diagnosticCode, eventId })\n\nconst decodeAttributes = Effect.fn(\"PipelineExecutionProjection.decodeAttributes\")(function*(event: EntityUpsert) {\n return yield* Schema.decodeUnknownEffect(PipelineEntityAttributes)(event.attributes).pipe(\n Effect.mapError(() => malformed(\"normalized-entity-attributes-invalid\", event.eventId))\n )\n})\n\nconst bounded = (value: string | null | undefined, fallback: string, maximum: number): string => {\n const normalized = value?.trim()\n return (normalized === undefined || normalized.length === 0 ? fallback : normalized).slice(0, maximum)\n}\n\nconst optionalBounded = (value: string | null | undefined, maximum: number): string | null => {\n const normalized = value?.trim()\n return normalized === undefined || normalized.length === 0 ? null : normalized.slice(0, maximum)\n}\n\nconst namedText = (value: typeof NamedText.Type | null | undefined): string | null =>\n typeof value === \"string\" ? value : (value?.name ?? null)\n\n/** Collapse provider statuses into the canonical execution state vocabulary. */\nexport const pipelineStatus = (\n value: string | null\n): \"failed\" | \"queued\" | \"running\" | \"stopped\" | \"succeeded\" => {\n switch (value?.toLocaleLowerCase(\"en-US\")) {\n case \"failed\":\n case \"failure\":\n return \"failed\"\n case \"in-progress\":\n case \"inprogress\":\n case \"running\":\n return \"running\"\n case \"succeeded\":\n case \"success\":\n case \"successful\":\n return \"succeeded\"\n case \"stopped\":\n case \"stopping\":\n case \"superseded\":\n case \"abandoned\":\n case \"cancelled\":\n case \"canceled\":\n return \"stopped\"\n default:\n return \"queued\"\n }\n}\n\nconst normalizedTimestamp = Effect.fn(\"PipelineExecutionProjection.normalizeTimestamp\")(function*(\n value: unknown,\n eventId: string\n): Effect.fn.Return<string | null, PipelineExecutionProjectionError> {\n if (value === null || value === undefined) return null\n const timestamp = yield* Schema.decodeUnknownEffect(UtcTimestamp)(value).pipe(\n Effect.mapError(() => malformed(\"normalized-pipeline-timestamp-invalid\", eventId))\n )\n return DateTime.formatIso(timestamp)\n})\n\ninterface PipelineSiblingEvent {\n readonly attributes: PipelineEntityAttributes\n readonly event: EntityUpsert\n}\n\nconst laterSibling = (\n current: PipelineSiblingEvent | undefined,\n candidate: PipelineSiblingEvent\n): PipelineSiblingEvent =>\n current === undefined || DateTime.Order(current.event.observedAt, candidate.event.observedAt) < 0\n ? candidate\n : current\n\nconst aggregateStatus = (\n statuses: ReadonlyArray<ReturnType<typeof pipelineStatus>>\n): ReturnType<typeof pipelineStatus> => {\n if (statuses.includes(\"failed\")) return \"failed\"\n if (statuses.includes(\"running\")) return \"running\"\n if (statuses.includes(\"stopped\")) return \"stopped\"\n if (statuses.length > 0 && statuses.every((status) => status === \"succeeded\")) return \"succeeded\"\n return \"queued\"\n}\n\nconst executionKey = (attributes: PipelineEntityAttributes): string | null => {\n const pipelineName = optionalBounded(attributes.pipelineName, 200)\n const executionId = optionalBounded(attributes.executionId, 512)\n return pipelineName === null || executionId === null ? null : `${pipelineName}\\u0000${executionId}`\n}\n\n/** Derive bounded indexed-cache coordinates from the newly accepted pipeline page. */\nexport const codePipelineCacheSelectors = Effect.fn(\n \"PipelineExecutionProjection.cacheSelectors\"\n)(function*(\n events: ReadonlyArray<NormalizedPluginEventV1>\n): Effect.fn.Return<ReadonlyArray<CodePipelineCacheSelector>, PipelineExecutionProjectionError> {\n const selectors = new Map<string, CodePipelineCacheSelector>()\n for (const event of events) {\n if (\n event._tag !== \"UpsertEntity\" ||\n (event.entityType !== \"aws.codepipeline.pipeline\" &&\n event.entityType !== \"aws.codepipeline.execution\" &&\n event.entityType !== \"aws.codepipeline.stage\" &&\n event.entityType !== \"aws.codepipeline.action\")\n ) continue\n const attributes = yield* decodeAttributes(event)\n const pipelineName = optionalBounded(attributes.pipelineName, 200)\n if (pipelineName === null) continue\n const executionId = event.entityType === \"aws.codepipeline.pipeline\"\n ? null\n : optionalBounded(attributes.executionId, 512)\n if (event.entityType !== \"aws.codepipeline.pipeline\" && executionId === null) continue\n const selector = {\n executionId,\n pipelineName,\n pipelineVersion: attributes.pipelineVersion ?? null\n }\n const key = executionId === null\n ? `${pipelineName}\\u0000declaration\\u0000${String(selector.pipelineVersion ?? \"\")}`\n : `${pipelineName}\\u0000execution\\u0000${executionId}`\n if (!selectors.has(key) && selectors.size >= MaximumCodePipelineCorrelationExecutions) {\n return yield* malformed(\"normalized-pipeline-correlation-scope-exceeded\", event.eventId)\n }\n selectors.set(key, selector)\n }\n return [...selectors.values()]\n})\n\ninterface PipelineDeclarationKey {\n readonly pipelineName: string\n readonly pipelineVersion: number | null\n}\n\nconst declarationKey = (attributes: PipelineEntityAttributes): PipelineDeclarationKey | null => {\n const pipelineName = optionalBounded(attributes.pipelineName, 200)\n return pipelineName === null\n ? null\n : { pipelineName, pipelineVersion: attributes.pipelineVersion ?? null }\n}\n\nconst declarationMatchesExecution = (\n declaration: PipelineDeclarationKey,\n execution: PipelineEntityAttributes\n): boolean => {\n const pipelineName = optionalBounded(execution.pipelineName, 200)\n if (pipelineName !== declaration.pipelineName) return false\n const executionVersion = execution.pipelineVersion ?? null\n return declaration.pipelineVersion === null || executionVersion === null ||\n declaration.pipelineVersion === executionVersion\n}\n\n/** Select cached execution envelopes affected by newly accepted declarations, stages, or actions. */\nexport const affectedPipelineExecutionEvents = Effect.fn(\n \"PipelineExecutionProjection.affectedExecutions\"\n)(function*(\n cachedEvents: ReadonlyArray<NormalizedPluginEventV1>,\n changedEvents: ReadonlyArray<EntityUpsert>\n): Effect.fn.Return<ReadonlyArray<EntityUpsert>, PipelineExecutionProjectionError> {\n const affectedKeys = new Set<string>()\n const acceptedDeclarations: Array<PipelineDeclarationKey> = []\n for (const event of changedEvents) {\n if (event.entityType === \"aws.codepipeline.pipeline\") {\n const key = declarationKey(yield* decodeAttributes(event))\n if (key !== null) acceptedDeclarations.push(key)\n } else if (event.entityType === \"aws.codepipeline.stage\" || event.entityType === \"aws.codepipeline.action\") {\n const key = executionKey(yield* decodeAttributes(event))\n if (key !== null) affectedKeys.add(key)\n }\n }\n if (affectedKeys.size === 0 && acceptedDeclarations.length === 0) return []\n\n const executions: Array<EntityUpsert> = []\n for (const event of cachedEvents) {\n if (event._tag !== \"UpsertEntity\" || event.entityType !== \"aws.codepipeline.execution\") continue\n const attributes = yield* decodeAttributes(event)\n const key = executionKey(attributes)\n if (\n (key !== null && affectedKeys.has(key)) ||\n acceptedDeclarations.some((declaration) => declarationMatchesExecution(declaration, attributes))\n ) executions.push(event)\n }\n return executions\n})\n\n/** Correlate bounded pipeline, stage, and action siblings into one safe execution projection. */\nexport const projectPipelineExecution = Effect.fn(\"PipelineExecutionProjection.project\")(function*(\n event: EntityUpsert,\n siblingEvents: ReadonlyArray<NormalizedPluginEventV1>\n): Effect.fn.Return<DeliveryEntityDetails, PipelineExecutionProjectionError> {\n const attributes = yield* decodeAttributes(event)\n const executionId = bounded(attributes.executionId, event.vendorImmutableId, 512)\n const pipelineName = bounded(attributes.pipelineName, \"unknown\", 200)\n const stageEvents = new Map<string, PipelineSiblingEvent>()\n const actionEvents = new Map<string, PipelineSiblingEvent>()\n let declaration: PipelineSiblingEvent | undefined\n\n for (const sibling of siblingEvents) {\n if (sibling._tag !== \"UpsertEntity\" || sibling.eventId === event.eventId) continue\n if (\n sibling.entityType !== \"aws.codepipeline.pipeline\" &&\n sibling.entityType !== \"aws.codepipeline.stage\" &&\n sibling.entityType !== \"aws.codepipeline.action\"\n ) continue\n const siblingAttributes = yield* decodeAttributes(sibling)\n if (bounded(siblingAttributes.pipelineName, \"unknown\", 200) !== pipelineName) continue\n const candidate = { attributes: siblingAttributes, event: sibling }\n if (sibling.entityType === \"aws.codepipeline.pipeline\") {\n if (\n attributes.pipelineVersion !== null &&\n attributes.pipelineVersion !== undefined &&\n siblingAttributes.pipelineVersion !== null &&\n siblingAttributes.pipelineVersion !== undefined &&\n siblingAttributes.pipelineVersion !== attributes.pipelineVersion\n ) continue\n declaration = laterSibling(declaration, candidate)\n continue\n }\n if (bounded(siblingAttributes.executionId, \"\", 512) !== executionId) continue\n if (sibling.entityType === \"aws.codepipeline.stage\") {\n const stageName = optionalBounded(siblingAttributes.stageName, 200)\n if (stageName !== null) stageEvents.set(stageName, laterSibling(stageEvents.get(stageName), candidate))\n continue\n }\n const actionExecutionId = optionalBounded(siblingAttributes.actionExecutionId, 512)\n if (actionExecutionId !== null) {\n actionEvents.set(actionExecutionId, laterSibling(actionEvents.get(actionExecutionId), candidate))\n }\n }\n\n const declaredStages = (declaration?.attributes.stages ?? []).flatMap((stage) => {\n const name = optionalBounded(stage.name, 200)\n const actionNames = (stage.actions ?? []).flatMap((action, index) => {\n const actionName = optionalBounded(action.name, 200)\n return actionName === null ? [] : [{ index, name: actionName, runOrder: action.runOrder ?? index + 1 }]\n }).sort((left, right) => left.runOrder - right.runOrder || left.index - right.index).map(({ name }) => name)\n return name === null ? [] : [{ actionCount: stage.actions?.length ?? 0, actionNames, name }]\n }).slice(0, 100)\n const stageOrder = new Map(declaredStages.map(({ name }, index) => [name, index]))\n const actionOrder = new Map<string, number>()\n for (const stage of declaredStages) {\n for (let index = 0; index < stage.actionNames.length; index++) {\n const actionName = stage.actionNames[index]\n if (actionName === undefined) continue\n const key = `${stage.name}\\u0000${actionName}`\n if (!actionOrder.has(key)) actionOrder.set(key, index)\n }\n }\n const actions = yield* Effect.forEach(\n [...actionEvents.entries()],\n ([actionExecutionId, sibling]) =>\n Effect.gen(function*() {\n const action = sibling.attributes\n const stageName = bounded(action.stageName, \"Unknown stage\", 200)\n const actionName = bounded(action.actionName, actionExecutionId, 200)\n return {\n actionExecutionId,\n stageName,\n actionName,\n status: pipelineStatus(namedText(action.status)),\n startedAt: yield* normalizedTimestamp(action.startedAt, sibling.event.eventId),\n updatedAt: yield* normalizedTimestamp(action.updatedAt, sibling.event.eventId),\n updatedBy: optionalBounded(action.updatedBy, 512),\n category: optionalBounded(action.actionType?.category, 100),\n provider: optionalBounded(action.actionType?.provider, 100),\n owner: optionalBounded(action.actionType?.owner, 100),\n version: optionalBounded(action.actionType?.version, 100),\n region: optionalBounded(action.actionRegion, 100),\n externalExecutionSummary: optionalBounded(action.externalExecutionSummary, 500),\n errorCode: optionalBounded(action.errorCode, 200),\n errorMessage: optionalBounded(action.errorMessage, 500),\n artifacts: [\n ...(action.inputArtifacts ?? []).map((artifact, index) => ({\n name: bounded(artifact.name, `${actionName} input ${String(index + 1)}`, 200),\n direction: InputDirection,\n access: ProxyRequired\n })),\n ...(action.outputArtifacts ?? []).map((artifact, index) => ({\n name: bounded(artifact.name, `${actionName} output ${String(index + 1)}`, 200),\n direction: OutputDirection,\n access: ProxyRequired\n }))\n ].slice(0, 100)\n }\n }),\n { concurrency: 1 }\n )\n actions.sort((left, right) => {\n const stageComparison = (stageOrder.get(left.stageName) ?? 100) - (stageOrder.get(right.stageName) ?? 100) ||\n left.stageName.localeCompare(right.stageName)\n if (stageComparison !== 0) return stageComparison\n const leftOrder = actionOrder.get(`${left.stageName}\\u0000${left.actionName}`)\n const rightOrder = actionOrder.get(`${right.stageName}\\u0000${right.actionName}`)\n if (leftOrder !== undefined || rightOrder !== undefined) {\n const declaredComparison = (leftOrder ?? Number.MAX_SAFE_INTEGER) - (rightOrder ?? Number.MAX_SAFE_INTEGER)\n if (declaredComparison !== 0) return declaredComparison\n }\n return left.actionName.localeCompare(right.actionName) ||\n left.actionExecutionId.localeCompare(right.actionExecutionId)\n })\n const visibleActions = actions.slice(0, 200)\n const actionCount = Math.max(attributes.actionCount ?? 0, actions.length)\n const actionsTruncated = (attributes.actionsTruncated ?? false) || actionCount > visibleActions.length\n\n const allStageNames = [\n ...declaredStages.map(({ name }) => name),\n ...[...stageEvents.keys()].filter((name) => !stageOrder.has(name)).sort(),\n ...actions.map(({ stageName }) => stageName).filter(\n (name, index, names) => !stageOrder.has(name) && !stageEvents.has(name) && names.indexOf(name) === index\n ).sort()\n ].slice(0, 100)\n const declaredStageByName = new Map(declaredStages.map((stage) => [stage.name, stage]))\n const stages = allStageNames.map((name) => {\n const stage = stageEvents.get(name)?.attributes\n const stageActions = actions.filter((action) => action.stageName === name)\n const visibleStageActionCount = visibleActions.filter((action) => action.stageName === name).length\n const stageActionCount = Math.max(\n stage?.actionCount ?? 0,\n declaredStageByName.get(name)?.actionCount ?? 0,\n stageActions.length\n )\n return {\n name,\n status: stage === undefined\n ? aggregateStatus(stageActions.map(({ status }) => status))\n : pipelineStatus(namedText(stage.status)),\n actionCount: stageActionCount,\n actionsTruncated: (stage?.actionsTruncated ?? false) ||\n (attributes.actionsTruncated ?? false) ||\n stageActionCount > visibleStageActionCount\n }\n })\n const sourceRevision = attributes.sourceRevisions?.find(({ revisionId }) => optionalBounded(revisionId, 512) !== null)\n ?.revisionId\n const sourceRevisions = (attributes.sourceRevisions ?? []).flatMap((source) => {\n const actionName = optionalBounded(source.actionName, 200)\n return actionName === null ? [] : [{\n actionName,\n revisionId: optionalBounded(source.revisionId, 512),\n revisionSummary: optionalBounded(source.revisionSummary, 500)\n }]\n }).filter((source, index, sources) =>\n sources.findIndex(({ actionName }) => actionName === source.actionName) === index\n ).slice(0, 100)\n const sourceArtifacts = yield* Effect.forEach(\n (attributes.artifactRevisions ?? []).slice(0, 100),\n (artifact, index) =>\n Effect.gen(function*() {\n return {\n name: bounded(artifact.name, `Source artifact ${String(index + 1)}`, 200),\n revisionId: optionalBounded(artifact.revisionId, 512),\n revisionSummary: optionalBounded(artifact.revisionSummary, 500),\n createdAt: yield* normalizedTimestamp(artifact.createdAt, event.eventId),\n access: ProxyRequired\n }\n }),\n { concurrency: 1 }\n )\n return yield* Schema.decodeUnknownEffect(DeliveryEntityDetails)({\n _tag: \"pipeline-execution\",\n pipelineName,\n executionId,\n status: pipelineStatus(namedText(attributes.status)),\n triggerRevision: bounded(\n optionalBounded(attributes.triggerRevision, 512) ?? optionalBounded(sourceRevision, 512),\n event.revision,\n 512\n ),\n pipelineVersion: attributes.pipelineVersion ?? null,\n statusSummary: optionalBounded(attributes.statusSummary, 500),\n startedAt: yield* normalizedTimestamp(attributes.startedAt, event.eventId),\n updatedAt: yield* normalizedTimestamp(attributes.updatedAt, event.eventId),\n triggerType: optionalBounded(attributes.triggerType, 100),\n triggerDetail: optionalBounded(attributes.triggerDetail, 500),\n executionMode: optionalBounded(attributes.executionMode, 100),\n executionType: optionalBounded(attributes.executionType, 100),\n rollbackTargetExecutionId: optionalBounded(attributes.rollbackTargetExecutionId, 512),\n sourceRevisions,\n stages,\n actions: visibleActions,\n actionCount,\n actionsTruncated,\n actionPagesRead: Math.max(attributes.actionPagesRead ?? 0, 0),\n sourceArtifacts\n }).pipe(\n Effect.mapError(() => malformed(\"normalized-pipeline-details-invalid\", event.eventId))\n )\n})\n","import * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\n\nimport type { PluginConnectionId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport type { ProviderId } from \"../../domain/sourceRevision.js\"\nimport type { PersistenceOperationFailure, PersistenceService } from \"../persistence/Persistence.js\"\nimport type { PluginConnectionRecord } from \"../persistence/repositories/models.js\"\nimport { PluginConflictFailure } from \"../plugins/failures.js\"\n\n/** Exact mutable host state that authorized one manual synchronization runtime. */\nexport interface PluginSynchronizationAuthority {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n readonly providerId: ProviderId\n readonly connectionRevision: number\n readonly configurationRevision: number | null\n}\n\nconst conflict = () =>\n new PluginConflictFailure({\n operation: \"manual-sync\",\n diagnosticCode: \"manual-sync-runtime-authority-changed\"\n })\n\nconst authorityFor = Effect.fn(\"PluginSynchronizationAuthority.forConnection\")(function*(\n persistence: PersistenceService,\n connection: PluginConnectionRecord\n) {\n const configuration = yield* persistence.pluginConfigurations.get(\n connection.workspaceId,\n connection.pluginConnectionId\n )\n return {\n workspaceId: connection.workspaceId,\n pluginConnectionId: connection.pluginConnectionId,\n providerId: connection.providerId,\n connectionRevision: connection.revision,\n configurationRevision: Option.isSome(configuration) ? configuration.value.revision : null\n } satisfies PluginSynchronizationAuthority\n})\n\n/** Capture connection and configuration revisions in one durable read transaction. */\nexport const capturePluginSynchronizationAuthority = Effect.fn(\n \"PluginSynchronizationAuthority.capture\"\n)(function*(\n persistence: PersistenceService,\n workspaceId: WorkspaceId,\n pluginConnectionId: PluginConnectionId\n): Effect.fn.Return<\n { readonly connection: PluginConnectionRecord; readonly authority: PluginSynchronizationAuthority },\n PersistenceOperationFailure\n> {\n return yield* persistence.transact(Effect.gen(function*() {\n const connection = yield* persistence.pluginConnections.get(workspaceId, pluginConnectionId)\n const authority = yield* authorityFor(persistence, connection)\n return { connection, authority }\n }))\n})\n\n/** Reject a write transaction when its runtime no longer owns current connection authority. */\nexport const verifyPluginSynchronizationAuthority = Effect.fn(\n \"PluginSynchronizationAuthority.verify\"\n)(function*(\n persistence: PersistenceService,\n expected: PluginSynchronizationAuthority\n): Effect.fn.Return<void, PluginConflictFailure | PersistenceOperationFailure> {\n const connection = yield* persistence.pluginConnections.get(\n expected.workspaceId,\n expected.pluginConnectionId\n ).pipe(\n Effect.catchTag(\"RecordNotFoundError\", () => conflict())\n )\n const current = yield* authorityFor(persistence, connection)\n if (\n !connection.isEnabled ||\n current.providerId !== expected.providerId ||\n current.connectionRevision !== expected.connectionRevision ||\n current.configurationRevision !== expected.configurationRevision\n ) {\n return yield* conflict()\n }\n})\n","import * as Crypto from \"effect/Crypto\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Encoding from \"effect/Encoding\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\n\nimport { derivePersonInitials, Person, RoleAssignment } from \"../../domain/actors.js\"\nimport {\n DeliveryEntityDetails,\n type DeliveryEntityKind,\n type DeliveryNode,\n type DeliveryRelationship,\n EvidencePredicate,\n EvidenceValue,\n LedgerRevision,\n RelationshipKind\n} from \"../../domain/deliveryGraph.js\"\nimport type { Freshness, PluginHealth } from \"../../domain/freshness.js\"\nimport {\n EntityId,\n EnvironmentId,\n EvidenceClaimId,\n EvidenceId,\n GraphNodeId,\n PersonId,\n type PluginConnectionId,\n RelationshipId,\n ReleaseId,\n RoleAssignmentId,\n type WorkspaceId\n} from \"../../domain/identifiers.js\"\nimport { NormalizedIssueAttributes } from \"../../domain/normalizedIssue.js\"\nimport { NormalizedPluginEventV1, PluginEventId, type PluginSyncPageV1 } from \"../../domain/plugins/events.js\"\nimport { Release } from \"../../domain/release.js\"\nimport { deriveReleaseRelay } from \"../../domain/releaseRelay.js\"\nimport { NormalizationSchemaVersion, type ProviderId, VendorImmutableId } from \"../../domain/sourceRevision.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport type { WorkspaceSettingsV1 } from \"../../domain/workspaceSettings.js\"\nimport type { PersistenceOperationFailure, PersistenceService } from \"../persistence/Persistence.js\"\nimport { Persistence } from \"../persistence/Persistence.js\"\nimport { DeliveryGraphWriteBatch } from \"../persistence/repositories/deliveryGraphRepository.js\"\nimport type { EntityRecord, RoleAssignmentRecord } from \"../persistence/repositories/models.js\"\nimport { type PluginCacheRecord, type PluginStreamKey } from \"../persistence/repositories/pluginRuntimeModels.js\"\nimport type { WorkspaceSettingsRecord } from \"../persistence/repositories/workspaceSettingsRepository.js\"\nimport { ConfluencePageAttributesV1 } from \"../plugins/confluence/ConfluencePageSchemas.js\"\nimport type { PluginConflictFailure } from \"../plugins/failures.js\"\nimport {\n affectedPipelineExecutionEvents,\n codePipelineCacheSelectors,\n PipelineEntityAttributeNames,\n pipelineStatus,\n projectPipelineExecution\n} from \"./pipelineExecutionProjection.js\"\nimport {\n type PluginSynchronizationAuthority,\n verifyPluginSynchronizationAuthority\n} from \"./pluginSynchronizationAuthority.js\"\nimport { materializeRelationshipInference } from \"./relationshipInferenceMaterialization.js\"\n\ntype EntityUpsert = Extract<NormalizedPluginEventV1, { readonly _tag: \"UpsertEntity\" }>\ntype PageDetails = Extract<DeliveryEntityDetails, { readonly _tag: \"page\" }>\ntype EntityTombstone = Extract<NormalizedPluginEventV1, { readonly _tag: \"TombstoneEntity\" }>\ntype EvidenceAppend = Extract<NormalizedPluginEventV1, { readonly _tag: \"AppendEvidence\" }>\ntype PersonUpsert = Extract<NormalizedPluginEventV1, { readonly _tag: \"UpsertPerson\" }>\ntype RelationshipProposal = Extract<NormalizedPluginEventV1, { readonly _tag: \"ProposeRelationship\" }>\n\nconst isCodePipelineEntityType = (entityType: string): boolean =>\n entityType === \"aws.codepipeline.pipeline\" ||\n entityType === \"aws.codepipeline.execution\" ||\n entityType === \"aws.codepipeline.stage\" ||\n entityType === \"aws.codepipeline.action\"\n\nconst isCodePipelineUpsert = (event: NormalizedPluginEventV1): event is EntityUpsert =>\n event._tag === \"UpsertEntity\" && isCodePipelineEntityType(event.entityType)\n\nconst isCodePipelineTombstone = (event: NormalizedPluginEventV1): event is EntityTombstone =>\n event._tag === \"TombstoneEntity\" && isCodePipelineEntityType(event.entityType)\n\nconst pipelineEntityIdentity = (event: EntityUpsert | EntityTombstone): string =>\n `${event.entityType}\\u0000${event.vendorImmutableId}`\n\ninterface RelationshipEndpointResolution {\n readonly entity: EntityRecord | null\n readonly kind: DeliveryRelationship[\"sourceNodeKind\"]\n readonly node: DeliveryNode | null\n readonly nodeId: GraphNodeId\n readonly releaseId: ReleaseId | null\n}\n\nconst OptionalText = Schema.optionalKey(Schema.NullOr(Schema.String))\nconst OptionalUnknown = Schema.optionalKey(Schema.NullOr(Schema.Unknown))\nconst NamedText = Schema.Union([\n Schema.String,\n Schema.Struct({ name: Schema.optionalKey(Schema.NullOr(Schema.String)) })\n])\nconst EntityAttributes = Schema.Struct({\n key: OptionalText,\n status: Schema.optionalKey(Schema.NullOr(NamedText)),\n priority: Schema.optionalKey(Schema.NullOr(NamedText)),\n estimatePoints: Schema.optionalKey(Schema.NullOr(Schema.Number)),\n repository: OptionalText,\n sourceBranch: OptionalText,\n targetBranch: OptionalText,\n headRevision: OptionalText,\n baseRevision: OptionalText,\n mergeBase: OptionalText,\n description: OptionalText,\n authorArn: OptionalText,\n creationDate: OptionalUnknown,\n lastActivityDate: OptionalUnknown,\n reviewState: OptionalText,\n spaceKey: OptionalText,\n spaceId: OptionalText,\n currentVersion: Schema.optionalKey(Schema.NullOr(Schema.Number)),\n linkedIssueKeys: Schema.optionalKey(Schema.Array(Schema.String)),\n linkedReleaseVersions: Schema.optionalKey(Schema.Array(Schema.String)),\n environmentId: OptionalText,\n revision: OptionalText,\n durationMinutes: Schema.optionalKey(Schema.NullOr(Schema.Number)),\n billable: Schema.optionalKey(Schema.Boolean),\n locked: Schema.optionalKey(Schema.Boolean),\n approvalState: OptionalText,\n userId: OptionalText,\n projectId: OptionalText,\n interval: Schema.optionalKey(Schema.Struct({\n duration: OptionalText,\n state: OptionalText,\n start: OptionalUnknown,\n end: OptionalUnknown\n }))\n})\nconst LegacyIssueAttributes = Schema.Struct({\n key: OptionalText,\n status: Schema.optionalKey(Schema.NullOr(NamedText)),\n priority: Schema.optionalKey(Schema.NullOr(NamedText)),\n estimatePoints: Schema.optionalKey(Schema.NullOr(Schema.Number))\n})\nconst LegacyIssueAttributeKeys: ReadonlySet<string> = new Set([\n \"key\",\n \"status\",\n \"priority\",\n \"estimatePoints\",\n \"schemaVersion\",\n \"summary\"\n])\nconst CanonicalIssueAttributeKeys: ReadonlySet<string> = new Set(Object.keys(NormalizedIssueAttributes.fields))\nconst ReleaseAttributes = Schema.Struct({\n serviceName: Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(200)),\n version: Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(100)),\n lifecycle: Schema.Literals([\"assembling\", \"candidate\", \"deploying\", \"released\", \"cancelled\"])\n})\nconst JiraIssueRelationshipSnapshot = Schema.Struct({\n fixVersions: Schema.Array(Schema.Struct({\n sourceId: Schema.NullOr(Schema.String)\n })),\n truncatedFields: Schema.Array(Schema.String)\n})\nconst EvidenceData = Schema.Struct({\n predicate: Schema.optionalKey(EvidencePredicate),\n value: Schema.optionalKey(EvidenceValue)\n})\n/** Redacted failure raised before a normalized page can become a canonical projection. */\nexport class NormalizedPluginPageMaterializationError extends Schema.TaggedErrorClass<\n NormalizedPluginPageMaterializationError\n>()(\"NormalizedPluginPageMaterializationError\", {\n diagnosticCode: Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(100)),\n eventId: Schema.NullOr(Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(512)))\n}) {}\n\nconst malformed = (diagnosticCode: string, eventId: string | null = null) =>\n new NormalizedPluginPageMaterializationError({ diagnosticCode, eventId })\n\nconst decodedAttributes = Effect.fn(\"NormalizedPluginPageMaterialization.decodeAttributes\")(function*(\n event: EntityUpsert\n) {\n return yield* Schema.decodeUnknownEffect(EntityAttributes)(event.attributes).pipe(\n Effect.mapError(() => malformed(\"normalized-entity-attributes-invalid\", event.eventId))\n )\n})\n\nconst bounded = (value: string | null | undefined, fallback: string, maximum: number): string => {\n const normalized = value?.trim()\n return (normalized === undefined || normalized.length === 0 ? fallback : normalized).slice(0, maximum)\n}\n\nconst optionalBounded = (value: string | null | undefined, maximum: number): string | null => {\n const normalized = value?.trim()\n return normalized === undefined || normalized.length === 0 ? null : normalized.slice(0, maximum)\n}\n\nconst namedText = (value: typeof NamedText.Type | null | undefined): string | null =>\n typeof value === \"string\" ? value : (value?.name ?? null)\n\nconst decodedOptionalEntityTimestamp = Effect.fn(\n \"NormalizedPluginPageMaterialization.decodeOptionalEntityTimestamp\"\n)(function*(\n value: unknown,\n eventId: string,\n diagnosticCode: string\n): Effect.fn.Return<UtcTimestamp | null, NormalizedPluginPageMaterializationError> {\n if (value === null || value === undefined) return null\n return yield* Schema.decodeUnknownEffect(UtcTimestamp)(value).pipe(\n Effect.mapError(() => malformed(diagnosticCode, eventId))\n )\n})\n\nconst decodedIssueAttributes = Effect.fn(\"NormalizedPluginPageMaterialization.decodeIssueAttributes\")(function*(\n event: EntityUpsert\n) {\n const normalized = Schema.decodeUnknownResult(NormalizedIssueAttributes)(event.attributes)\n if (Result.isSuccess(normalized)) return normalized.success\n if (\n Object.keys(event.attributes).some((key) =>\n !LegacyIssueAttributeKeys.has(key) &&\n (!PipelineEntityAttributeNames.has(key) || CanonicalIssueAttributeKeys.has(key))\n )\n ) {\n return yield* malformed(\"normalized-issue-attributes-invalid\", event.eventId)\n }\n\n const legacy = yield* Schema.decodeUnknownEffect(LegacyIssueAttributes)(event.attributes).pipe(\n Effect.mapError(() => malformed(\"normalized-issue-attributes-invalid\", event.eventId))\n )\n const key = bounded(legacy.key, event.vendorImmutableId, 100)\n return yield* Schema.decodeUnknownEffect(NormalizedIssueAttributes)({\n key,\n status: bounded(namedText(legacy.status), \"unknown\", 100),\n priority: legacy.priority === null || legacy.priority === undefined\n ? null\n : bounded(namedText(legacy.priority), \"unknown\", 100),\n estimatePoints: legacy.estimatePoints ?? null\n }).pipe(Effect.mapError(() => malformed(\"normalized-issue-attributes-invalid\", event.eventId)))\n})\n\nconst decodedPageTimestamp = Effect.fn(\"NormalizedPluginPageMaterialization.decodePageTimestamp\")(function*(\n value: string,\n eventId: string\n) {\n return yield* Schema.decodeUnknownEffect(UtcTimestamp)(value).pipe(\n Effect.mapError(() => malformed(\"normalized-page-timestamp-invalid\", eventId))\n )\n})\n\nconst decodedConfluencePageAttributes = Effect.fn(\n \"NormalizedPluginPageMaterialization.decodeConfluencePageAttributes\"\n)(function*(event: EntityUpsert) {\n if (event.entityType !== \"confluence-page\") return null\n const decoded = Schema.decodeUnknownResult(ConfluencePageAttributesV1)(event.attributes)\n if (Result.isFailure(decoded)) {\n if (Object.hasOwn(event.attributes, \"schemaVersion\")) {\n return yield* malformed(\"normalized-confluence-page-attributes-invalid\", event.eventId)\n }\n return null\n }\n const attributes = decoded.success\n const versions = yield* Effect.forEach(attributes.versions, (version) =>\n Effect.gen(function*() {\n return {\n number: version.number,\n createdAt: yield* decodedPageTimestamp(version.createdAt, event.eventId),\n message: version.message,\n minorEdit: version.minorEdit,\n authorSourcePersonId: version.authorId\n }\n }))\n const attachments = attributes.attachments === undefined\n ? undefined\n : yield* Effect.forEach(attributes.attachments, (attachment) =>\n Effect.gen(function*() {\n return {\n ...attachment,\n createdAt: yield* decodedPageTimestamp(attachment.createdAt, event.eventId)\n }\n }))\n const contentState: \"lazy\" | \"loaded\" = attributes.contentState ?? \"loaded\"\n return {\n sourceSpaceId: attributes.spaceId,\n parentSourceId: attributes.parentId,\n createdAt: yield* decodedPageTimestamp(attributes.createdAt, event.eventId),\n updatedAt: yield* decodedPageTimestamp(attributes.updatedAt, event.eventId),\n content: attributes.content,\n contentState,\n taskUpdatesSafe: attributes.taskUpdatesSafe ?? false,\n versions,\n versionHistory: attributes.versionHistory,\n contributors: attributes.contributors.map((contributor) => ({\n sourcePersonId: contributor.accountId,\n displayName: contributor.displayName,\n active: contributor.active,\n external: contributor.external,\n resolved: contributor.resolved,\n roles: contributor.roles\n })),\n ...(attachments === undefined ? {} : { attachments }),\n ...(attributes.attachmentInventory === undefined ? {} : {\n attachmentInventory: attributes.attachmentInventory\n }),\n ...(attributes.watcherInventory === undefined ? {} : { watcherInventory: attributes.watcherInventory })\n }\n})\n\nconst canonicalKind = (entityType: string): typeof DeliveryEntityKind.Type | null => {\n switch (entityType) {\n case \"issue\":\n case \"jira.issue\":\n return \"issue\"\n case \"pull-request\":\n return \"pull-request\"\n case \"page\":\n case \"confluence-page\":\n return \"page\"\n case \"pipeline-execution\":\n case \"aws.codepipeline.execution\":\n return \"pipeline-execution\"\n case \"deployment\":\n return \"deployment\"\n case \"time-entry\":\n case \"clockify.time-entry\":\n return \"time-entry\"\n default:\n return null\n }\n}\n\nconst reviewState = (\n value: string | null | undefined\n): \"approved\" | \"changes-requested\" | \"merged\" | \"not-requested\" | \"requested\" => {\n switch (value?.toLowerCase()) {\n case \"requested\":\n return \"requested\"\n case \"changes-requested\":\n case \"changes requested\":\n return \"changes-requested\"\n case \"approved\":\n return \"approved\"\n case \"merged\":\n return \"merged\"\n default:\n return \"not-requested\"\n }\n}\n\nconst pullRequestLifecycle = (value: string | null | undefined): \"closed\" | \"merged\" | \"open\" | null => {\n switch (value?.toLowerCase()) {\n case \"open\":\n return \"open\"\n case \"closed\":\n return \"closed\"\n case \"merged\":\n return \"merged\"\n default:\n return null\n }\n}\n\nconst isoDurationMinutes = (value: string | null | undefined): number => {\n if (value === null || value === undefined) return 0\n const match = /^PT(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?$/u.exec(value)\n if (match === null) return 0\n const hours = Number(match[1] ?? 0)\n const minutes = Number(match[2] ?? 0)\n const seconds = Number(match[3] ?? 0)\n return Math.max(0, Math.round(hours * 60 + minutes + seconds / 60))\n}\n\nconst entityPresentation = Effect.fn(\"NormalizedPluginPageMaterialization.entityPresentation\")(function*(\n event: EntityUpsert,\n kind: typeof DeliveryEntityKind.Type,\n siblingEvents: ReadonlyArray<NormalizedPluginEventV1>\n): Effect.fn.Return<\n { readonly details: DeliveryEntityDetails; readonly displayKey: string },\n NormalizedPluginPageMaterializationError\n> {\n const attributes = yield* decodedAttributes(event)\n switch (kind) {\n case \"issue\": {\n const issueAttributes = yield* decodedIssueAttributes(event)\n return {\n displayKey: issueAttributes.key,\n details: {\n _tag: \"issue\",\n ...issueAttributes\n }\n }\n }\n case \"pull-request\": {\n const creationDate = yield* decodedOptionalEntityTimestamp(\n attributes.creationDate,\n event.eventId,\n \"normalized-pull-request-timestamp-invalid\"\n )\n const lastActivityDate = yield* decodedOptionalEntityTimestamp(\n attributes.lastActivityDate,\n event.eventId,\n \"normalized-pull-request-timestamp-invalid\"\n )\n const status = namedText(attributes.status)\n return {\n displayKey: bounded(event.vendorImmutableId, event.vendorImmutableId, 200),\n details: {\n _tag: \"pull-request\",\n repository: bounded(attributes.repository, \"unknown\", 200),\n sourceBranch: bounded(attributes.sourceBranch, \"unknown\", 500),\n targetBranch: bounded(attributes.targetBranch, \"unknown\", 500),\n headRevision: bounded(attributes.headRevision, event.revision, 512),\n reviewState: reviewState(attributes.reviewState ?? (pullRequestLifecycle(status) === null ? status : null)),\n lifecycle: pullRequestLifecycle(status),\n description: optionalBounded(attributes.description, 50_000),\n authorReference: optionalBounded(attributes.authorArn, 512),\n baseRevision: optionalBounded(attributes.baseRevision, 512),\n mergeBaseRevision: optionalBounded(attributes.mergeBase, 512),\n createdAt: creationDate === null ? null : DateTime.formatIso(creationDate),\n updatedAt: lastActivityDate === null ? null : DateTime.formatIso(lastActivityDate)\n }\n }\n }\n case \"page\": {\n const normalizedPage = yield* decodedConfluencePageAttributes(event)\n return {\n displayKey: bounded(event.vendorImmutableId, event.vendorImmutableId, 200),\n details: {\n _tag: \"page\",\n spaceKey: bounded(attributes.spaceKey ?? attributes.spaceId, \"unknown\", 100),\n revision: bounded(\n attributes.currentVersion === null || attributes.currentVersion === undefined\n ? attributes.revision\n : String(attributes.currentVersion),\n event.revision,\n 512\n ),\n status: namedText(attributes.status)?.toLowerCase() === \"superseded\" ? \"superseded\" : \"current\",\n ...(attributes.linkedIssueKeys === undefined ? {} : {\n linkedIssueKeys: attributes.linkedIssueKeys\n .map((key) => key.trim())\n .filter((key, index, keys) => key.length > 0 && key.length <= 100 && keys.indexOf(key) === index)\n .slice(0, 100)\n }),\n ...(attributes.linkedReleaseVersions === undefined ? {} : {\n linkedReleaseVersions: attributes.linkedReleaseVersions\n .map((version) => version.trim())\n .filter(\n (version, index, versions) =>\n version.length > 0 && version.length <= 100 && versions.indexOf(version) === index\n )\n .slice(0, 100)\n }),\n ...(normalizedPage ?? {})\n }\n }\n }\n case \"pipeline-execution\": {\n const details = yield* projectPipelineExecution(event, siblingEvents).pipe(\n Effect.mapError((error) => malformed(error.diagnosticCode, error.eventId))\n )\n if (details._tag !== \"pipeline-execution\") {\n return yield* malformed(\"normalized-pipeline-details-kind-invalid\", event.eventId)\n }\n return {\n displayKey: bounded(`${details.pipelineName}/${details.executionId}`, details.executionId, 200),\n details\n }\n }\n case \"deployment\": {\n const environmentId = yield* Schema.decodeUnknownEffect(EnvironmentId)(attributes.environmentId).pipe(\n Effect.mapError(() => malformed(\"normalized-deployment-environment-invalid\", event.eventId))\n )\n const status = pipelineStatus(namedText(attributes.status))\n return {\n displayKey: bounded(event.vendorImmutableId, event.vendorImmutableId, 200),\n details: {\n _tag: \"deployment\",\n environmentId,\n revision: bounded(attributes.revision, event.revision, 512),\n status: status === \"queued\" ? \"pending\" : status === \"running\" ?\n \"deploying\" :\n status === \"stopped\"\n ? \"rolled-back\"\n : status\n }\n }\n }\n case \"time-entry\": {\n const startedAt = yield* decodedOptionalEntityTimestamp(\n attributes.interval?.start,\n event.eventId,\n \"normalized-time-entry-timestamp-invalid\"\n )\n const endedAt = yield* decodedOptionalEntityTimestamp(\n attributes.interval?.end,\n event.eventId,\n \"normalized-time-entry-timestamp-invalid\"\n )\n if (\n startedAt !== null &&\n endedAt !== null &&\n DateTime.Order(endedAt, startedAt) < 0\n ) return yield* malformed(\"normalized-time-entry-timestamp-invalid\", event.eventId)\n const userId = optionalBounded(attributes.userId, 512)\n const projectId = optionalBounded(attributes.projectId, 512)\n const intervalMinutes = startedAt === null || endedAt === null\n ? 0\n : (DateTime.toEpochMillis(endedAt) - DateTime.toEpochMillis(startedAt)) / 60_000\n const reportedMinutes = attributes.durationMinutes ?? (\n attributes.interval?.duration === null || attributes.interval?.duration === undefined\n ? intervalMinutes\n : isoDurationMinutes(attributes.interval.duration)\n )\n return {\n displayKey: bounded(event.vendorImmutableId, event.vendorImmutableId, 200),\n details: {\n _tag: \"time-entry\",\n durationMinutes: Math.max(\n 0,\n Math.round(reportedMinutes)\n ),\n billable: attributes.billable ?? false,\n approvalState: attributes.approvalState === \"approved\" || attributes.approvalState === \"rejected\"\n ? attributes.approvalState\n : attributes.interval?.state === \"running\"\n ? \"pending\"\n : \"not-required\",\n ...(typeof attributes.locked === \"boolean\" ? { locked: attributes.locked } : {}),\n description: optionalBounded(attributes.description, 4_000),\n projectId,\n ...(userId === null ? {} : { userId }),\n ...(startedAt === null ? {} : { startedAt }),\n endedAt\n }\n }\n }\n }\n})\n\nconst stableUuid = Effect.fn(\"NormalizedPluginPageMaterialization.stableUuid\")(function*(\n cryptoService: Crypto.Crypto,\n identity: string,\n eventId: string\n) {\n const bytes = yield* Effect.fromResult(Encoding.decodeBase64(Encoding.encodeBase64(identity))).pipe(\n Effect.mapError(() => malformed(\"normalized-identity-encoding-failed\", eventId))\n )\n const digest = yield* cryptoService.digest(\"SHA-256\", bytes).pipe(\n Effect.mapError(() => malformed(\"normalized-identity-digest-failed\", eventId))\n )\n const hex = Encoding.encodeHex(digest)\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-7${hex.slice(13, 16)}-8${hex.slice(17, 20)}-${hex.slice(20, 32)}`\n})\n\nconst sourceIdentity = (\n scope: NormalizedPluginPageMaterializationScope,\n vendorImmutableId: typeof VendorImmutableId.Type\n) => ({\n pluginConnectionId: scope.pluginConnectionId,\n providerId: scope.providerId,\n vendorImmutableId\n})\n\nconst findEntity = Effect.fn(\"NormalizedPluginPageMaterialization.findEntity\")(function*(\n persistence: PersistenceService,\n scope: NormalizedPluginPageMaterializationScope,\n vendorImmutableId: typeof VendorImmutableId.Type\n) {\n const found = yield* persistence.entities.findBySourceIdentity(\n scope.workspaceId,\n sourceIdentity(scope, vendorImmutableId)\n ).pipe(Effect.result)\n if (Result.isSuccess(found)) return found.success\n if (found.failure._tag === \"RecordNotFoundError\") return null\n return yield* found.failure\n})\n\nconst readProjection = Effect.fn(\"NormalizedPluginPageMaterialization.readProjection\")(function*(\n persistence: PersistenceService,\n workspaceId: WorkspaceId,\n entityId: EntityId\n) {\n const found = yield* persistence.deliveryGraph.read(workspaceId, {\n _tag: \"entityProjection\",\n entityId,\n revision: null\n }).pipe(Effect.result)\n if (Result.isSuccess(found)) {\n return found.success._tag === \"entityProjection\" ? found.success.value : null\n }\n if (found.failure._tag === \"RecordNotFoundError\") return null\n return yield* found.failure\n})\n\nconst materializationKey = (\n scope: NormalizedPluginPageMaterializationScope,\n kind: string,\n externalId: string\n) => `${scope.workspaceId}\\u0000${scope.pluginConnectionId}\\u0000${scope.providerId}\\u0000${kind}\\u0000${externalId}`\n\nconst entityIdFor = Effect.fn(\"NormalizedPluginPageMaterialization.entityIdFor\")(function*(\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n vendorImmutableId: string,\n eventId: string\n) {\n return EntityId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"entity\", vendorImmutableId),\n eventId\n )\n )\n})\n\nconst nodeIdFor = Effect.fn(\"NormalizedPluginPageMaterialization.nodeIdFor\")(function*(\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n vendorImmutableId: string,\n eventId: string\n) {\n return GraphNodeId.make(\n yield* stableUuid(cryptoService, materializationKey(scope, \"entity-node\", vendorImmutableId), eventId)\n )\n})\n\nconst releaseIdFor = Effect.fn(\"NormalizedPluginPageMaterialization.releaseIdFor\")(function*(\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n vendorImmutableId: string,\n eventId: string\n) {\n return ReleaseId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"release\", vendorImmutableId),\n eventId\n )\n )\n})\n\nconst releaseNodeIdFor = Effect.fn(\"NormalizedPluginPageMaterialization.releaseNodeIdFor\")(function*(\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n vendorImmutableId: string,\n eventId: string\n) {\n return GraphNodeId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"release-node\", vendorImmutableId),\n eventId\n )\n )\n})\n\nconst sourceRevision = (\n scope: NormalizedPluginPageMaterializationScope,\n event: EntityUpsert | EntityTombstone,\n firstObservedAt: UtcTimestamp,\n sourceUrl: EntityUpsert[\"sourceUrl\"]\n) => ({\n ...sourceIdentity(scope, event.vendorImmutableId),\n revision: event.revision,\n sourceUrl,\n firstObservedAt,\n lastObservedAt: event.observedAt,\n synchronizedAt: scope.committedAt,\n normalizationSchemaVersion: NormalizationSchemaVersion.make(1)\n})\n\nconst laterTimestamp = (left: UtcTimestamp, right: UtcTimestamp): UtcTimestamp =>\n DateTime.Order(left, right) >= 0 ? left : right\n\nconst sameSourceUrl = (\n left: EntityUpsert[\"sourceUrl\"],\n right: EntityUpsert[\"sourceUrl\"]\n): boolean => left?.href === right?.href\n\nconst materializePipelineAuthority = Effect.fn(\n \"NormalizedPluginPageMaterialization.pipelineAuthority\"\n)(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n event: EntityUpsert\n) {\n const existing = yield* findEntity(persistence, scope, event.vendorImmutableId)\n const entityId = existing?.entityId ??\n (yield* entityIdFor(cryptoService, scope, event.vendorImmutableId, event.eventId))\n const pipelineSourceRevision = {\n ...sourceRevision(scope, event, existing?.sourceRevision.firstObservedAt ?? event.observedAt, event.sourceUrl),\n synchronizedAt: laterTimestamp(scope.committedAt, event.observedAt)\n }\n if (existing === null) {\n yield* persistence.entities.create(scope.workspaceId, {\n entityId,\n entityType: \"pipeline\",\n sourceRevision: pipelineSourceRevision,\n createdAt: scope.committedAt\n })\n return\n }\n if (existing.entityType !== \"pipeline\") {\n return yield* malformed(\"normalized-pipeline-authority-kind-conflict\", event.eventId)\n }\n const refreshed = {\n ...pipelineSourceRevision,\n lastObservedAt: laterTimestamp(existing.sourceRevision.lastObservedAt, event.observedAt),\n synchronizedAt: laterTimestamp(existing.sourceRevision.synchronizedAt, pipelineSourceRevision.synchronizedAt)\n }\n if (\n existing.sourceRevision.revision === refreshed.revision &&\n sameSourceUrl(existing.sourceRevision.sourceUrl, refreshed.sourceUrl) &&\n DateTime.Equivalence(existing.sourceRevision.lastObservedAt, refreshed.lastObservedAt) &&\n DateTime.Equivalence(existing.sourceRevision.synchronizedAt, refreshed.synchronizedAt)\n ) return\n yield* persistence.entities.updateSourceRevision(scope.workspaceId, entityId, {\n sourceRevision: refreshed,\n expectedRevision: existing.revision,\n updatedAt: scope.committedAt\n })\n})\n\nconst projectionSchemaVersion = (kind: DeliveryEntityKind): number =>\n kind === \"time-entry\" ? 4 : kind === \"page\" || kind === \"pipeline-execution\" || kind === \"pull-request\" ? 2 : 1\n\nconst requiresMaterializationBackfill = Effect.fn(\n \"NormalizedPluginPageMaterialization.requiresMaterializationBackfill\"\n)(function*(\n persistence: PersistenceService,\n scope: NormalizedPluginPageMaterializationScope,\n event: EntityUpsert\n) {\n if (event.entityType === \"aws.codepipeline.pipeline\") {\n return (yield* findEntity(persistence, scope, event.vendorImmutableId)) === null\n }\n const kind = canonicalKind(event.entityType)\n if (kind !== \"time-entry\") return false\n const existing = yield* findEntity(persistence, scope, event.vendorImmutableId)\n if (existing === null || existing.sourceRevision.revision !== event.revision) return false\n const currentProjection = yield* readProjection(persistence, scope.workspaceId, existing.entityId)\n return currentProjection?.projection.entityState === \"present\" &&\n currentProjection.projection.projectionSchemaVersion < projectionSchemaVersion(kind)\n})\n\nconst mergedPageContributors = (\n current: PageDetails[\"contributors\"],\n incoming: PageDetails[\"contributors\"],\n incomingWatchersComplete: boolean\n): {\n readonly contributors: PageDetails[\"contributors\"]\n readonly watcherCoverageTruncated: boolean\n} => {\n if (current === undefined && incoming === undefined) {\n return { contributors: undefined, watcherCoverageTruncated: false }\n }\n const contributors = new Map<string, NonNullable<PageDetails[\"contributors\"]>[number]>()\n const merge = (contributor: NonNullable<PageDetails[\"contributors\"]>[number]): void => {\n const previous = contributors.get(contributor.sourcePersonId)\n const roles = previous === undefined\n ? contributor.roles\n : [...new Set([...previous.roles, ...contributor.roles])]\n const identity = previous?.resolved === true && !contributor.resolved ? previous : contributor\n contributors.set(\n contributor.sourcePersonId,\n { ...identity, roles }\n )\n }\n for (const contributor of current ?? []) {\n const roles = incomingWatchersComplete\n ? contributor.roles.filter((role) => role !== \"watcher\")\n : contributor.roles\n if (roles.length > 0) merge({ ...contributor, roles })\n }\n for (const contributor of incoming ?? []) merge(contributor)\n const prioritized = [...contributors.values()].sort((left, right) => {\n const leftWatcherOnly = left.roles.every((role) => role === \"watcher\")\n const rightWatcherOnly = right.roles.every((role) => role === \"watcher\")\n return Number(leftWatcherOnly) - Number(rightWatcherOnly)\n })\n const dropped = prioritized.slice(502)\n return {\n contributors: prioritized.slice(0, 502),\n watcherCoverageTruncated: dropped.some(({ roles }) => roles.every((role) => role === \"watcher\"))\n }\n}\n\nconst mergePartialPageAttachments = (\n current: PageDetails[\"attachments\"],\n incoming: PageDetails[\"attachments\"]\n): PageDetails[\"attachments\"] => {\n if (current === undefined) return incoming\n if (incoming === undefined) return current\n const incomingIds = new Set(incoming.map(({ id }) => id))\n return [...incoming, ...current.filter(({ id }) => !incomingIds.has(id))].slice(0, 50)\n}\n\nconst mergePartialPageVersions = (\n current: PageDetails[\"versions\"],\n incoming: PageDetails[\"versions\"]\n): PageDetails[\"versions\"] => {\n if (current === undefined) return incoming\n if (incoming === undefined) return current\n const versions = new Map(current.map((version) => [version.number, version]))\n for (const version of incoming) versions.set(version.number, version)\n return [...versions.values()].sort((left, right) => right.number - left.number).slice(0, 500)\n}\n\nconst pageRevisionNumber = (revision: PageDetails[\"revision\"]): number | null => {\n const versionNumber = Number(revision)\n return Number.isSafeInteger(versionNumber) && versionNumber > 0 ? versionNumber : null\n}\n\nconst accuratePageVersionHistory = (details: PageDetails): PageDetails => {\n if (details.versionHistory?.complete !== true) return details\n const currentVersionNumber = pageRevisionNumber(details.revision)\n if (\n currentVersionNumber === null ||\n details.versions?.some(({ number }) => number === currentVersionNumber) === true\n ) return details\n return { ...details, versionHistory: { ...details.versionHistory, complete: false } }\n}\n\nconst mergeCompletePageVersions = (\n current: PageDetails[\"versions\"],\n incoming: PageDetails[\"versions\"],\n versionHistory: PageDetails[\"versionHistory\"],\n currentRevision: PageDetails[\"revision\"]\n): {\n readonly versions: PageDetails[\"versions\"]\n readonly versionHistory: PageDetails[\"versionHistory\"]\n} => {\n if (current === undefined || incoming === undefined) return { versions: incoming, versionHistory }\n const currentVersionNumber = pageRevisionNumber(currentRevision)\n if (currentVersionNumber === null || incoming.some(({ number }) => number === currentVersionNumber)) {\n return { versions: incoming, versionHistory }\n }\n const currentVersion = current.find(({ number }) => number === currentVersionNumber)\n if (currentVersion === undefined) {\n return {\n versions: incoming,\n versionHistory: versionHistory === undefined ? undefined : { ...versionHistory, complete: false }\n }\n }\n const overflowed = incoming.length >= 500\n const versions = overflowed\n ? [\n currentVersion,\n ...[...incoming]\n .sort((left, right) => right.number - left.number)\n .slice(0, 499)\n ].sort((left, right) => right.number - left.number)\n : mergePartialPageVersions([currentVersion], incoming)\n return {\n versions,\n versionHistory: overflowed && versionHistory !== undefined\n ? { ...versionHistory, complete: false }\n : versionHistory\n }\n}\n\nconst mergeSameRevisionPageDetails = (current: PageDetails, incoming: PageDetails): PageDetails => {\n const contributorMerge = mergedPageContributors(\n current.contributors,\n incoming.contributors,\n incoming.watcherInventory?.complete === true\n )\n const preserveLoadedContent = current.contentState === \"loaded\" &&\n (incoming.contentState === \"lazy\" || incoming.content === null)\n const attachments = incoming.attachmentInventory?.complete === false\n ? mergePartialPageAttachments(current.attachments, incoming.attachments)\n : incoming.attachments\n const versionMerge = incoming.versionHistory?.complete === false\n ? {\n versions: mergePartialPageVersions(current.versions, incoming.versions),\n versionHistory: incoming.versionHistory\n }\n : mergeCompletePageVersions(\n current.versions,\n incoming.versions,\n incoming.versionHistory,\n incoming.revision\n )\n const watcherInventory = contributorMerge.watcherCoverageTruncated\n ? {\n complete: false,\n pagesFetched: incoming.watcherInventory?.pagesFetched ?? current.watcherInventory?.pagesFetched ?? 0\n }\n : incoming.watcherInventory\n const merged: PageDetails = {\n ...current,\n ...incoming,\n ...(contributorMerge.contributors === undefined ? {} : { contributors: contributorMerge.contributors }),\n ...(attachments === undefined ? {} : { attachments }),\n ...(versionMerge.versions === undefined ? {} : { versions: versionMerge.versions }),\n ...(versionMerge.versionHistory === undefined ? {} : { versionHistory: versionMerge.versionHistory }),\n ...(watcherInventory === undefined ? {} : { watcherInventory })\n }\n return preserveLoadedContent ? { ...merged, content: current.content ?? null, contentState: \"loaded\" } : merged\n}\n\nconst equivalentPageDetails = (left: PageDetails, right: PageDetails): boolean =>\n JSON.stringify(Schema.encodeSync(DeliveryEntityDetails)(left)) ===\n JSON.stringify(Schema.encodeSync(DeliveryEntityDetails)(right))\n\nconst CachedNormalizedPluginEvent = Schema.fromJsonString(NormalizedPluginEventV1)\n\nconst pipelineEventsFromCacheRecords = Effect.fn(\n \"NormalizedPluginPageMaterialization.pipelineEventsFromCacheRecords\"\n)(function*(\n records: ReadonlyArray<PluginCacheRecord>,\n eventId: string\n) {\n const groups = yield* Effect.forEach(\n records,\n (record) =>\n Effect.gen(function*() {\n if (record.state !== \"present\" || record.payloadJson === null) return []\n const cached = yield* Schema.decodeUnknownEffect(CachedNormalizedPluginEvent)(record.payloadJson).pipe(\n Effect.mapError(() => malformed(\"normalized-pipeline-cache-event-invalid\", eventId))\n )\n if (\n cached._tag !== \"UpsertEntity\" ||\n (cached.entityType !== \"aws.codepipeline.pipeline\" &&\n cached.entityType !== \"aws.codepipeline.execution\" &&\n cached.entityType !== \"aws.codepipeline.stage\" &&\n cached.entityType !== \"aws.codepipeline.action\")\n ) return []\n return [cached]\n }),\n { concurrency: 1 }\n )\n return groups.flat()\n})\n\nconst currentPipelineEvents = Effect.fn(\"NormalizedPluginPageMaterialization.currentPipelineEvents\")(function*(\n persistence: PersistenceService,\n scope: NormalizedPluginPageMaterializationScope,\n eventId: string,\n selectors: Parameters<PersistenceService[\"pluginRuntime\"][\"getCodePipelineCache\"]>[3]\n) {\n const records = yield* persistence.pluginRuntime.getCodePipelineCache(\n scope.workspaceId,\n scope.pluginConnectionId,\n scope.streamKey,\n selectors\n )\n return yield* pipelineEventsFromCacheRecords(records, eventId)\n})\n\nconst writeGraph = Effect.fn(\"NormalizedPluginPageMaterialization.writeGraph\")(function*(\n persistence: PersistenceService,\n workspaceId: WorkspaceId,\n batch: typeof DeliveryGraphWriteBatch.Type,\n eventId: string\n) {\n const encoded = yield* Schema.encodeEffect(DeliveryGraphWriteBatch)(batch).pipe(\n Effect.mapError(() => malformed(\"normalized-delivery-graph-batch-invalid\", eventId))\n )\n return yield* persistence.deliveryGraph.write(workspaceId, encoded)\n})\n\nconst reconcileTimeEntryContributor = Effect.fn(\n \"NormalizedPluginPageMaterialization.reconcileTimeEntryContributor\"\n)(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n entityId: EntityId,\n userId: string,\n eventId: string,\n roleAssignments: Map<RoleAssignmentId, RoleAssignmentRecord>\n) {\n const identity = {\n pluginConnectionId: scope.pluginConnectionId,\n providerId: scope.providerId,\n vendorPersonId: VendorImmutableId.make(userId)\n }\n const person = yield* persistence.people.findPersonBySourceIdentity(scope.workspaceId, identity).pipe(Effect.result)\n if (Result.isFailure(person) && person.failure._tag !== \"RecordNotFoundError\") return yield* person.failure\n for (const record of roleAssignments.values()) {\n const assignment = record.assignment\n if (\n assignment.role !== \"contributor\" ||\n assignment.scope._tag !== \"entity\" ||\n assignment.scope.entityId !== entityId ||\n assignment.lifecycle._tag !== \"active\" ||\n assignment.actor._tag !== \"human\" ||\n (Result.isSuccess(person) &&\n person.success.person.isActive &&\n assignment.actor.personId === person.success.person.personId)\n ) continue\n const providerManagedAssignmentId = RoleAssignmentId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"role-assignment\", `${entityId}:contributor:${assignment.actor.personId}`),\n eventId\n )\n )\n if (assignment.assignmentId !== providerManagedAssignmentId) continue\n const updated = yield* persistence.people.updateRoleAssignment(\n scope.workspaceId,\n {\n ...assignment,\n lifecycle: {\n _tag: \"ended\",\n assignedAt: assignment.lifecycle.assignedAt,\n endedAt: laterTimestamp(assignment.lifecycle.assignedAt, scope.committedAt)\n }\n },\n record.revision,\n scope.committedAt\n )\n roleAssignments.set(updated.assignment.assignmentId, updated)\n }\n if (Result.isFailure(person) || !person.success.person.isActive) return\n const assignmentId = RoleAssignmentId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"role-assignment\", `${entityId}:contributor:${person.success.person.personId}`),\n eventId\n )\n )\n const existingAssignment = yield* persistence.people.getRoleAssignment(scope.workspaceId, assignmentId).pipe(\n Effect.result\n )\n if (Result.isFailure(existingAssignment) && existingAssignment.failure._tag !== \"RecordNotFoundError\") {\n return yield* existingAssignment.failure\n }\n if (Result.isSuccess(existingAssignment) && existingAssignment.success.assignment.lifecycle._tag !== \"active\") {\n const updated = yield* persistence.people.updateRoleAssignment(\n scope.workspaceId,\n {\n ...existingAssignment.success.assignment,\n lifecycle: { _tag: \"active\", assignedAt: scope.committedAt }\n },\n existingAssignment.success.revision,\n scope.committedAt\n )\n roleAssignments.set(updated.assignment.assignmentId, updated)\n } else if (Result.isFailure(existingAssignment)) {\n const assignment = yield* Schema.decodeUnknownEffect(Schema.toType(RoleAssignment))({\n actor: { _tag: \"human\", personId: person.success.person.personId },\n assignmentId,\n lifecycle: { _tag: \"active\", assignedAt: scope.committedAt },\n role: \"contributor\",\n scope: { _tag: \"entity\", entityId, workspaceId: scope.workspaceId }\n }).pipe(Effect.mapError(() => malformed(\"normalized-time-entry-contributor-invalid\", eventId)))\n const created = yield* persistence.people.createRoleAssignment(scope.workspaceId, assignment, scope.committedAt)\n roleAssignments.set(created.assignment.assignmentId, created)\n }\n})\n\nconst materializeUpsertEntity = Effect.fn(\n \"NormalizedPluginPageMaterialization.upsertEntity\"\n)(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n event: EntityUpsert,\n siblingEvents: ReadonlyArray<NormalizedPluginEventV1>,\n forceProjection: boolean,\n preserveSourceRevision: boolean,\n roleAssignments: Map<RoleAssignmentId, RoleAssignmentRecord>\n) {\n const kind = canonicalKind(event.entityType)\n if (kind === null) return { entityProjectionCount: 0, nodeCount: 0, skippedEntityCount: 1 }\n const existing = yield* findEntity(persistence, scope, event.vendorImmutableId)\n const presentation = yield* entityPresentation(event, kind, siblingEvents)\n const entityId = existing?.entityId ??\n (yield* entityIdFor(cryptoService, scope, event.vendorImmutableId, event.eventId))\n const currentProjection = existing === null\n ? null\n : yield* readProjection(persistence, scope.workspaceId, entityId)\n const currentDetails = currentProjection?.projection.details\n const sameRevisionPage = existing?.sourceRevision.revision === event.revision &&\n presentation.details._tag === \"page\" &&\n currentDetails?._tag === \"page\" &&\n currentProjection?.projection.entityState === \"present\"\n const effectivePresentation =\n sameRevisionPage && currentDetails?._tag === \"page\" && presentation.details._tag === \"page\"\n ? { ...presentation, details: mergeSameRevisionPageDetails(currentDetails, presentation.details) }\n : presentation.details._tag === \"page\"\n ? { ...presentation, details: accuratePageVersionHistory(presentation.details) }\n : presentation\n const pageEnrichment = sameRevisionPage &&\n currentDetails?._tag === \"page\" &&\n effectivePresentation.details._tag === \"page\" &&\n !equivalentPageDetails(currentDetails, effectivePresentation.details)\n const effectiveForceProjection = forceProjection || pageEnrichment\n const schemaVersion = projectionSchemaVersion(kind)\n const refreshedSource = existing === null\n ? null\n : {\n ...sourceRevision(\n scope,\n event,\n existing.sourceRevision.firstObservedAt,\n event.sourceUrl\n ),\n lastObservedAt: laterTimestamp(existing.sourceRevision.lastObservedAt, event.observedAt),\n synchronizedAt: laterTimestamp(existing.sourceRevision.synchronizedAt, scope.committedAt)\n }\n const sourceMetadataChanged = existing !== null && refreshedSource !== null && (\n !sameSourceUrl(existing.sourceRevision.sourceUrl, refreshedSource.sourceUrl) ||\n !DateTime.Equivalence(existing.sourceRevision.lastObservedAt, refreshedSource.lastObservedAt) ||\n !DateTime.Equivalence(existing.sourceRevision.synchronizedAt, refreshedSource.synchronizedAt)\n )\n if (\n existing !== null &&\n existing.sourceRevision.revision === event.revision &&\n currentProjection?.projection.entityState === \"present\" &&\n currentProjection.projection.projectionSchemaVersion === schemaVersion &&\n !sourceMetadataChanged &&\n !effectiveForceProjection\n ) {\n if (effectivePresentation.details._tag === \"time-entry\" && effectivePresentation.details.userId !== undefined) {\n yield* reconcileTimeEntryContributor(\n persistence,\n cryptoService,\n scope,\n entityId,\n effectivePresentation.details.userId,\n event.eventId,\n roleAssignments\n )\n }\n return { entityProjectionCount: 0, nodeCount: 0, skippedEntityCount: 0 }\n }\n\n const persisted = existing === null\n ? yield* persistence.entities.create(scope.workspaceId, {\n entityId,\n entityType: kind,\n sourceRevision: sourceRevision(scope, event, event.observedAt, event.sourceUrl),\n createdAt: scope.committedAt\n })\n : preserveSourceRevision && existing.sourceRevision.revision === event.revision\n ? existing\n : effectiveForceProjection && existing.sourceRevision.revision === event.revision && !sourceMetadataChanged\n ? existing\n : yield* persistence.entities.updateSourceRevision(scope.workspaceId, entityId, {\n sourceRevision: refreshedSource ?? sourceRevision(\n scope,\n event,\n existing.sourceRevision.firstObservedAt,\n event.sourceUrl\n ),\n expectedRevision: existing.revision,\n updatedAt: scope.committedAt\n })\n const projectionRevision = LedgerRevision.make((currentProjection?.projection.projectionRevision ?? 0) + 1)\n const nodeId = yield* nodeIdFor(cryptoService, scope, event.vendorImmutableId, event.eventId)\n const batch = {\n entityProjections: [{\n projection: {\n workspaceId: scope.workspaceId,\n entityId,\n projectionRevision,\n sourceEntityRevision: LedgerRevision.make(persisted.revision),\n supersedesProjectionRevision: currentProjection?.projection.projectionRevision ?? null,\n projectionSchemaVersion: schemaVersion,\n entityState: \"present\",\n entityType: kind,\n displayKey: effectivePresentation.displayKey,\n title: event.title,\n details: effectivePresentation.details\n },\n recordedAt: scope.committedAt\n }],\n nodes: currentProjection === null\n ? [{\n workspaceId: scope.workspaceId,\n nodeId,\n endpointKind: kind,\n resolution: { _tag: \"resolved\", target: { _tag: \"entity\", entityId, entityKind: kind } },\n createdAt: scope.committedAt\n }]\n : [],\n evidenceItems: [],\n evidenceClaims: [],\n relationships: []\n } satisfies typeof DeliveryGraphWriteBatch.Type\n const receipt = yield* writeGraph(persistence, scope.workspaceId, batch, event.eventId)\n if (effectivePresentation.details._tag === \"time-entry\" && effectivePresentation.details.userId !== undefined) {\n yield* reconcileTimeEntryContributor(\n persistence,\n cryptoService,\n scope,\n entityId,\n effectivePresentation.details.userId,\n event.eventId,\n roleAssignments\n )\n }\n return { ...receipt, skippedEntityCount: 0 }\n})\n\nconst materializeRelease = Effect.fn(\"NormalizedPluginPageMaterialization.upsertRelease\")(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n settings: WorkspaceSettingsV1,\n event: EntityUpsert\n) {\n const attributes = yield* Schema.decodeUnknownEffect(ReleaseAttributes)(event.attributes).pipe(\n Effect.mapError(() => malformed(\"normalized-release-attributes-invalid\", event.eventId))\n )\n const releaseId = yield* releaseIdFor(cryptoService, scope, event.vendorImmutableId, event.eventId)\n const existing = yield* persistence.releases.get(scope.workspaceId, releaseId).pipe(Effect.result)\n if (Result.isFailure(existing) && existing.failure._tag !== \"RecordNotFoundError\") {\n return yield* existing.failure\n }\n const previous = Result.isSuccess(existing) ? existing.success : null\n const previousSource = previous?.release.sourceRevisions.find(\n ({ pluginConnectionId, providerId, vendorImmutableId }) =>\n pluginConnectionId === scope.pluginConnectionId &&\n providerId === scope.providerId &&\n vendorImmutableId === event.vendorImmutableId\n )\n const observedAt = previousSource === undefined\n ? event.observedAt\n : laterTimestamp(previousSource.lastObservedAt, event.observedAt)\n const source = sourceRevision(\n scope,\n event,\n previousSource?.firstObservedAt ?? event.observedAt,\n event.sourceUrl\n )\n const refreshedSource = { ...source, lastObservedAt: observedAt }\n const sourceAgeSeconds = Math.max(\n 0,\n (DateTime.toEpochMillis(scope.committedAt) - DateTime.toEpochMillis(observedAt)) / 1_000\n )\n const staleAfterSeconds = settings.synchronization.staleAfterMinutes * 60\n const freshness: Freshness = sourceAgeSeconds < staleAfterSeconds\n ? {\n _tag: \"current\",\n evaluatedAt: scope.committedAt,\n pluginHealth: scope.successfulHealth,\n provenance: { _tag: \"provider\", sourceRevision: refreshedSource },\n sourceObservedAt: observedAt,\n staleAfterSeconds,\n synchronizedAt: scope.committedAt\n }\n : {\n _tag: \"stale\",\n evaluatedAt: scope.committedAt,\n pluginHealth: scope.successfulHealth,\n provenance: {\n _tag: \"cache\",\n cachedAt: refreshedSource.synchronizedAt,\n sourceRevision: refreshedSource\n },\n sourceObservedAt: observedAt,\n staleAfterSeconds,\n synchronizedAt: scope.committedAt\n }\n const release = yield* Schema.decodeUnknownEffect(Schema.toType(Release))({\n createdAt: previous?.release.createdAt ?? event.observedAt,\n freshness,\n id: releaseId,\n lifecycle: attributes.lifecycle,\n relay: deriveReleaseRelay(releaseId),\n roleAssignments: previous?.release.roleAssignments ?? [],\n serviceName: attributes.serviceName,\n sourceRevisions: [\n ...(previous?.release.sourceRevisions.filter(\n ({ pluginConnectionId, providerId, vendorImmutableId }) =>\n pluginConnectionId !== scope.pluginConnectionId ||\n providerId !== scope.providerId ||\n vendorImmutableId !== event.vendorImmutableId\n ) ?? []),\n refreshedSource\n ],\n targetEnvironmentIds: previous?.release.targetEnvironmentIds ?? [],\n updatedAt: scope.committedAt,\n version: attributes.version,\n workspaceId: scope.workspaceId\n }).pipe(Effect.mapError(() => malformed(\"normalized-release-invalid\", event.eventId)))\n if (previous === null) {\n yield* persistence.releases.create(scope.workspaceId, release)\n } else if (\n previousSource === undefined ||\n previousSource.revision !== refreshedSource.revision ||\n !sameSourceUrl(previousSource.sourceUrl, refreshedSource.sourceUrl) ||\n !DateTime.Equivalence(previousSource.lastObservedAt, refreshedSource.lastObservedAt) ||\n !DateTime.Equivalence(previousSource.synchronizedAt, refreshedSource.synchronizedAt) ||\n previous.release.serviceName !== release.serviceName ||\n previous.release.version !== release.version ||\n previous.release.lifecycle !== release.lifecycle\n ) {\n yield* persistence.releases.append(scope.workspaceId, release, previous.revision)\n }\n const nodeId = yield* releaseNodeIdFor(cryptoService, scope, event.vendorImmutableId, event.eventId)\n const existingNode = yield* persistence.deliveryGraph.read(scope.workspaceId, {\n _tag: \"node\",\n nodeId\n }).pipe(Effect.result)\n if (Result.isSuccess(existingNode)) return { nodeCount: 0 }\n if (existingNode.failure._tag !== \"RecordNotFoundError\") return yield* existingNode.failure\n const receipt = yield* writeGraph(persistence, scope.workspaceId, {\n entityProjections: [],\n nodes: [{\n workspaceId: scope.workspaceId,\n nodeId,\n endpointKind: \"release\",\n resolution: { _tag: \"resolved\", target: { _tag: \"release\", releaseId } },\n createdAt: scope.committedAt\n }],\n evidenceItems: [],\n evidenceClaims: [],\n relationships: []\n }, event.eventId)\n return { nodeCount: receipt.nodeCount }\n})\n\nconst materializeTombstoneEntity = Effect.fn(\n \"NormalizedPluginPageMaterialization.tombstoneEntity\"\n)(function*(\n persistence: PersistenceService,\n scope: NormalizedPluginPageMaterializationScope,\n event: EntityTombstone\n) {\n const existing = yield* findEntity(persistence, scope, event.vendorImmutableId)\n if (existing === null) return { entityProjectionCount: 0 }\n const current = yield* readProjection(persistence, scope.workspaceId, existing.entityId)\n if (current === null) return yield* malformed(\"normalized-tombstone-projection-missing\", event.eventId)\n if (existing.sourceRevision.revision === event.revision && current.projection.entityState === \"deleted\") {\n return { entityProjectionCount: 0 }\n }\n const persisted = existing.sourceRevision.revision === event.revision\n ? existing\n : yield* persistence.entities.updateSourceRevision(scope.workspaceId, existing.entityId, {\n sourceRevision: sourceRevision(\n scope,\n event,\n existing.sourceRevision.firstObservedAt,\n existing.sourceRevision.sourceUrl\n ),\n expectedRevision: existing.revision,\n updatedAt: scope.committedAt\n })\n const projectionRevision = LedgerRevision.make(current.projection.projectionRevision + 1)\n const receipt = yield* writeGraph(persistence, scope.workspaceId, {\n entityProjections: [{\n projection: {\n ...current.projection,\n projectionRevision,\n sourceEntityRevision: LedgerRevision.make(persisted.revision),\n supersedesProjectionRevision: current.projection.projectionRevision,\n entityState: \"deleted\"\n },\n recordedAt: scope.committedAt\n }],\n nodes: [],\n evidenceItems: [],\n evidenceClaims: [],\n relationships: []\n }, event.eventId)\n return { entityProjectionCount: receipt.entityProjectionCount }\n})\n\nconst materializePerson = Effect.fn(\"NormalizedPluginPageMaterialization.upsertPerson\")(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n event: PersonUpsert\n) {\n const identity = {\n pluginConnectionId: scope.pluginConnectionId,\n providerId: scope.providerId,\n vendorPersonId: VendorImmutableId.make(event.vendorPersonId)\n }\n const existing = yield* persistence.people.findPersonBySourceIdentity(scope.workspaceId, identity).pipe(\n Effect.result\n )\n if (Result.isFailure(existing) && existing.failure._tag !== \"RecordNotFoundError\") {\n return yield* existing.failure\n }\n const personId = Result.isSuccess(existing)\n ? existing.success.person.personId\n : PersonId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"person\", event.vendorPersonId),\n event.eventId\n )\n )\n const avatar = event.avatarUrl !== null && event.avatarUrl.toString().length <= 500\n ? { _tag: \"reference\", reference: event.avatarUrl.toString() }\n : { _tag: \"initials\", text: derivePersonInitials(event.displayName) }\n const person = yield* Schema.decodeUnknownEffect(Schema.toType(Person))({\n personId,\n displayName: event.displayName,\n avatar,\n isActive: event.active,\n sourceIdentities: Result.isSuccess(existing) ? existing.success.person.sourceIdentities : [identity]\n }).pipe(Effect.mapError(() => malformed(\"normalized-person-invalid\", event.eventId)))\n if (\n Result.isSuccess(existing) &&\n existing.success.person.displayName === person.displayName &&\n existing.success.person.isActive === person.isActive &&\n existing.success.person.avatar._tag === person.avatar._tag &&\n (existing.success.person.avatar._tag === \"initials\"\n ? existing.success.person.avatar.text === (person.avatar._tag === \"initials\" ? person.avatar.text : \"\")\n : existing.success.person.avatar.reference ===\n (person.avatar._tag === \"reference\" ? person.avatar.reference : \"\"))\n ) {\n return 0\n }\n if (Result.isSuccess(existing)) {\n yield* persistence.people.updatePerson(\n scope.workspaceId,\n person,\n existing.success.revision,\n scope.committedAt\n )\n } else {\n yield* persistence.people.createPerson(scope.workspaceId, person, scope.committedAt)\n }\n return 1\n})\n\nconst sequenceClockifyPersonEvents = Effect.fn(\n \"NormalizedPluginPageMaterialization.sequenceClockifyPersonEvents\"\n)(function*(\n persistence: PersistenceService,\n scope: NormalizedPluginPageMaterializationScope,\n page: PluginSyncPageV1\n) {\n if (scope.providerId !== \"clockify\") return page\n const events = yield* Effect.forEach(\n page.events,\n (event) =>\n Effect.gen(function*() {\n if (event._tag !== \"UpsertPerson\") return event\n const existing = yield* persistence.people.findPersonBySourceIdentity(scope.workspaceId, {\n pluginConnectionId: scope.pluginConnectionId,\n providerId: scope.providerId,\n vendorPersonId: VendorImmutableId.make(event.vendorPersonId)\n }).pipe(Effect.result)\n if (Result.isFailure(existing) && existing.failure._tag !== \"RecordNotFoundError\") {\n return yield* existing.failure\n }\n const nextRevision = Result.isFailure(existing)\n ? 1\n : existing.success.revision + (\n existing.success.person.displayName === event.displayName &&\n existing.success.person.isActive === event.active\n ? 0\n : 1\n )\n const eventId = yield* Schema.decodeUnknownEffect(PluginEventId)(\n `${event.eventId}:person-revision:${nextRevision}`\n ).pipe(Effect.mapError(() => malformed(\"normalized-clockify-person-event-id-invalid\", event.eventId)))\n return { ...event, eventId }\n }),\n { concurrency: 1 }\n )\n return { ...page, events }\n})\n\nconst evidencePredicate = (event: EvidenceAppend): typeof EvidencePredicate.Type => {\n const decoded = Schema.decodeUnknownResult(EvidencePredicate)(event.evidenceType)\n if (Result.isSuccess(decoded)) return decoded.success\n return \"status-observed\"\n}\n\nconst materializeEvidence = Effect.fn(\"NormalizedPluginPageMaterialization.appendEvidence\")(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n settings: WorkspaceSettingsV1,\n event: EvidenceAppend\n) {\n const subject = yield* findEntity(persistence, scope, event.subject.vendorImmutableId)\n if (subject === null) return yield* malformed(\"normalized-evidence-subject-missing\", event.eventId)\n const subjectKind = canonicalKind(event.subject.entityType)\n if (subjectKind === null) return yield* malformed(\"normalized-evidence-subject-unsupported\", event.eventId)\n const nodeId = yield* nodeIdFor(cryptoService, scope, event.subject.vendorImmutableId, event.eventId)\n const evidenceId = EvidenceId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"evidence\", event.evidenceId),\n event.eventId\n )\n )\n const evidenceClaimId = EvidenceClaimId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"evidence-claim\", event.evidenceId),\n event.eventId\n )\n )\n const decodedData = Schema.decodeUnknownResult(EvidenceData)(event.data)\n const predicate = Result.isSuccess(decodedData) && decodedData.success.predicate !== undefined\n ? decodedData.success.predicate\n : evidencePredicate(event)\n const value: typeof EvidenceValue.Type = Result.isSuccess(decodedData) && decodedData.success.value !== undefined\n ? decodedData.success.value\n : { _tag: \"state\", value: event.summary }\n const source = subject.sourceRevision\n const ageSeconds = Math.max(\n 0,\n (DateTime.toEpochMillis(scope.committedAt) - DateTime.toEpochMillis(source.lastObservedAt)) / 1_000\n )\n const health: Extract<PluginHealth, { readonly _tag: \"degraded\" | \"healthy\" }> =\n scope.successfulHealth._tag === \"healthy\"\n ? { _tag: \"healthy\", checkedAt: scope.committedAt }\n : { ...scope.successfulHealth, checkedAt: scope.committedAt }\n const staleAfterSeconds = settings.synchronization.staleAfterMinutes * 60\n const freshness: Freshness = ageSeconds < staleAfterSeconds\n ? {\n _tag: \"current\",\n evaluatedAt: scope.committedAt,\n pluginHealth: health,\n provenance: { _tag: \"provider\", sourceRevision: source },\n sourceObservedAt: source.lastObservedAt,\n staleAfterSeconds,\n synchronizedAt: scope.committedAt\n }\n : {\n _tag: \"stale\",\n evaluatedAt: scope.committedAt,\n pluginHealth: health,\n provenance: {\n _tag: \"cache\",\n cachedAt: source.synchronizedAt,\n sourceRevision: source\n },\n sourceObservedAt: source.lastObservedAt,\n staleAfterSeconds,\n synchronizedAt: scope.committedAt\n }\n const receipt = yield* writeGraph(persistence, scope.workspaceId, {\n entityProjections: [],\n nodes: [],\n evidenceItems: [{\n workspaceId: scope.workspaceId,\n evidenceId,\n schemaVersion: 1,\n attribution: {\n _tag: \"plugin\",\n pluginConnectionId: scope.pluginConnectionId,\n sourceEntityId: subject.entityId,\n sourceEntityRevision: LedgerRevision.make(subject.revision)\n },\n verifier: { _tag: \"system\", component: \"normalized-plugin-page-materializer\" },\n observedAt: event.capturedAt,\n recordedAt: scope.committedAt,\n validUntil: null,\n freshness,\n retention: {\n classification: \"evidence\",\n retainUntil: DateTime.add(scope.committedAt, {\n days: settings.retention.evidenceDays\n }),\n legalHold: false\n }\n }],\n evidenceClaims: [{\n workspaceId: scope.workspaceId,\n evidenceClaimId,\n evidenceId,\n subjectNodeId: nodeId,\n predicate,\n value,\n recordedAt: scope.committedAt,\n supersedesEvidenceClaimId: null\n }],\n relationships: []\n }, event.eventId)\n return {\n evidenceItemCount: receipt.evidenceItemCount,\n evidenceClaimCount: receipt.evidenceClaimCount\n }\n})\n\nconst materializeRelationship = Effect.fn(\n \"NormalizedPluginPageMaterialization.proposeRelationship\"\n)(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n event: RelationshipProposal\n) {\n const resolveEndpoint = Effect.fn(\"NormalizedPluginPageMaterialization.resolveRelationshipEndpoint\")(function*(\n reference: RelationshipProposal[\"from\"]\n ) {\n if (reference.entityType === \"release\") {\n const releaseId = yield* releaseIdFor(cryptoService, scope, reference.vendorImmutableId, event.eventId)\n const release = yield* persistence.releases.get(scope.workspaceId, releaseId).pipe(Effect.result)\n if (Result.isFailure(release)) {\n if (release.failure._tag === \"RecordNotFoundError\") {\n return yield* malformed(\"normalized-relationship-endpoint-missing\", event.eventId)\n }\n return yield* release.failure\n }\n const nodeId = yield* releaseNodeIdFor(cryptoService, scope, reference.vendorImmutableId, event.eventId)\n const existingNode = yield* persistence.deliveryGraph.read(scope.workspaceId, {\n _tag: \"node\",\n nodeId\n }).pipe(Effect.result)\n if (Result.isFailure(existingNode) && existingNode.failure._tag !== \"RecordNotFoundError\") {\n return yield* existingNode.failure\n }\n return {\n entity: null,\n kind: \"release\",\n node: Result.isSuccess(existingNode)\n ? null\n : {\n workspaceId: scope.workspaceId,\n nodeId,\n endpointKind: \"release\",\n resolution: { _tag: \"resolved\", target: { _tag: \"release\", releaseId } },\n createdAt: scope.committedAt\n },\n nodeId,\n releaseId\n } satisfies RelationshipEndpointResolution\n }\n const entity = yield* findEntity(persistence, scope, reference.vendorImmutableId)\n const kind = canonicalKind(reference.entityType)\n if (entity === null) return yield* malformed(\"normalized-relationship-endpoint-missing\", event.eventId)\n if (kind === null) return yield* malformed(\"normalized-relationship-endpoint-unsupported\", event.eventId)\n return {\n entity,\n kind,\n node: null,\n nodeId: yield* nodeIdFor(cryptoService, scope, reference.vendorImmutableId, event.eventId),\n releaseId: null\n } satisfies RelationshipEndpointResolution\n })\n const source = yield* resolveEndpoint(event.from)\n const target = yield* resolveEndpoint(event.to)\n const kind = yield* Schema.decodeUnknownEffect(RelationshipKind)(event.relationshipType).pipe(\n Effect.mapError(() => malformed(\"normalized-relationship-kind-invalid\", event.eventId))\n )\n const provenanceEntity = source.entity ?? target.entity\n if (provenanceEntity === null) {\n return yield* malformed(\"normalized-relationship-provenance-entity-missing\", event.eventId)\n }\n const relationshipScope: DeliveryRelationship[\"scope\"] = source.releaseId !== null\n ? { _tag: \"release\", releaseId: source.releaseId }\n : null\n const relationshipId = RelationshipId.make(\n yield* stableUuid(\n cryptoService,\n materializationKey(scope, \"relationship\", event.relationshipId),\n event.eventId\n )\n )\n const existing = yield* persistence.deliveryGraph.read(scope.workspaceId, {\n _tag: \"relationship\",\n relationshipId,\n revision: null\n }).pipe(Effect.result)\n if (Result.isFailure(existing) && existing.failure._tag !== \"RecordNotFoundError\") {\n return yield* existing.failure\n }\n const previous = Result.isSuccess(existing) && existing.success._tag === \"relationship\"\n ? existing.success.value\n : null\n const revision = LedgerRevision.make((previous?.revision ?? 0) + 1)\n const nodes: Array<DeliveryNode> = []\n if (source.node !== null) nodes.push(source.node)\n if (target.node !== null && target.node.nodeId !== source.nodeId) nodes.push(target.node)\n const receipt = yield* writeGraph(\n persistence,\n scope.workspaceId,\n {\n entityProjections: [],\n nodes,\n evidenceItems: [],\n evidenceClaims: [],\n relationships: [\n {\n workspaceId: scope.workspaceId,\n relationshipId,\n relationshipSchemaVersion: 1,\n revision,\n supersedesRevision: previous?.revision ?? null,\n kind,\n sourceNodeId: source.nodeId,\n sourceNodeKind: source.kind,\n targetNodeId: target.nodeId,\n targetNodeKind: target.kind,\n scope: relationshipScope,\n lifecycle: { _tag: \"proposed\", effectiveAt: event.observedAt },\n confidence: {\n _tag: \"inferred\",\n score: event.confidence,\n rationale: `Proposed by ${scope.providerId} normalized synchronization.`\n },\n provenance: {\n _tag: \"plugin\",\n pluginConnectionId: scope.pluginConnectionId,\n sourceEntityId: provenanceEntity.entityId,\n sourceEntityRevision: LedgerRevision.make(provenanceEntity.revision)\n },\n recordedBy: { _tag: \"system\", component: \"normalized-plugin-page-materializer\" },\n evidenceClaimIds: yield* Effect.forEach(\n event.evidenceIds,\n (evidenceId) =>\n stableUuid(cryptoService, materializationKey(scope, \"evidence-claim\", evidenceId), event.eventId).pipe(\n Effect.map(EvidenceClaimId.make)\n )\n ),\n recordedAt: scope.committedAt\n }\n ]\n },\n event.eventId\n )\n return { nodeCount: receipt.nodeCount, relationshipCount: receipt.relationshipCount }\n})\n\nconst hasAuthoritativeJiraFixVersions = (event: NormalizedPluginEventV1): event is EntityUpsert => {\n if (event._tag !== \"UpsertEntity\" || event.entityType !== \"jira.issue\") return false\n const snapshot = Schema.decodeUnknownResult(JiraIssueRelationshipSnapshot)(event.attributes)\n return Result.isSuccess(snapshot) && !snapshot.success.truncatedFields.includes(\"fixVersions\")\n}\n\nconst isReleaseContainmentForIssue = (\n event: NormalizedPluginEventV1,\n issue: EntityUpsert\n): event is RelationshipProposal =>\n event._tag === \"ProposeRelationship\" &&\n event.relationshipType === \"contains\" &&\n event.from.entityType === \"release\" &&\n event.to.entityType === issue.entityType &&\n event.to.vendorImmutableId === issue.vendorImmutableId\n\nconst retireMissingJiraReleaseContainments = Effect.fn(\n \"NormalizedPluginPageMaterialization.retireMissingJiraReleaseContainments\"\n)(function*(\n persistence: PersistenceService,\n cryptoService: Crypto.Crypto,\n scope: NormalizedPluginPageMaterializationScope,\n acceptedEvents: ReadonlyArray<NormalizedPluginEventV1>\n) {\n let relationshipCount = 0\n for (const issue of acceptedEvents) {\n if (!hasAuthoritativeJiraFixVersions(issue)) continue\n const source = yield* findEntity(persistence, scope, issue.vendorImmutableId)\n if (source === null) return yield* malformed(\"normalized-relationship-endpoint-missing\", issue.eventId)\n const issueNodeId = yield* nodeIdFor(cryptoService, scope, issue.vendorImmutableId, issue.eventId)\n const neighborhood = yield* persistence.deliveryGraph.read(scope.workspaceId, {\n _tag: \"nodeRelationships\",\n nodeId: issueNodeId,\n limit: 500\n })\n if (neighborhood._tag !== \"nodeRelationships\") continue\n if (neighborhood.value.truncated) {\n return yield* malformed(\"normalized-jira-containment-neighborhood-truncated\", issue.eventId)\n }\n const currentRelationshipIds = new Set(\n yield* Effect.forEach(\n acceptedEvents.filter((event) => isReleaseContainmentForIssue(event, issue)),\n ({ relationshipId }) =>\n stableUuid(\n cryptoService,\n materializationKey(scope, \"relationship\", relationshipId),\n issue.eventId\n ).pipe(Effect.map(RelationshipId.make))\n )\n )\n const removed = neighborhood.value.relationships.filter(\n (relationship) =>\n relationship.kind === \"contains\" &&\n relationship.sourceNodeKind === \"release\" &&\n relationship.targetNodeId === issueNodeId &&\n relationship.targetNodeKind === \"issue\" &&\n relationship.provenance._tag === \"plugin\" &&\n relationship.provenance.pluginConnectionId === scope.pluginConnectionId &&\n relationship.provenance.sourceEntityId === source.entityId &&\n !currentRelationshipIds.has(relationship.relationshipId)\n )\n if (removed.length === 0) continue\n\n for (const previous of removed) {\n if (previous.lifecycle._tag === \"rejected\" || previous.lifecycle._tag === \"superseded\") continue\n const receipt = yield* writeGraph(persistence, scope.workspaceId, {\n entityProjections: [],\n nodes: [],\n evidenceItems: [],\n evidenceClaims: [],\n relationships: [{\n ...previous,\n revision: LedgerRevision.make(previous.revision + 1),\n supersedesRevision: previous.revision,\n lifecycle: {\n _tag: \"superseded\",\n effectiveAt: issue.observedAt,\n reason: \"No longer present in the latest Jira fixVersion observation.\"\n },\n provenance: {\n _tag: \"plugin\",\n pluginConnectionId: scope.pluginConnectionId,\n sourceEntityId: source.entityId,\n sourceEntityRevision: LedgerRevision.make(source.revision)\n },\n recordedBy: { _tag: \"system\", component: \"normalized-plugin-page-materializer\" },\n recordedAt: scope.committedAt\n }]\n }, issue.eventId)\n relationshipCount += receipt.relationshipCount\n }\n }\n return relationshipCount\n})\n\n/** Host authority supplied separately from provider-controlled normalized data. */\nexport interface NormalizedPluginPageMaterializationScope {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n readonly providerId: ProviderId\n readonly streamKey: PluginStreamKey\n readonly expectedRevision: number\n readonly committedAt: UtcTimestamp\n readonly successfulHealth: Extract<PluginHealth, { readonly _tag: \"healthy\" | \"degraded\" }>\n readonly expectedAuthority?: PluginSynchronizationAuthority\n}\n\n/** Durable counts from one new page, or zero counts when the exact page is replayed. */\nexport interface NormalizedPluginPageMaterializationReceipt {\n readonly pageCommitted: boolean\n readonly acceptedEventCount: number\n readonly entityProjectionCount: number\n readonly evidenceClaimCount: number\n readonly evidenceItemCount: number\n readonly nodeCount: number\n readonly personCount: number\n readonly relationshipCount: number\n readonly skippedEntityCount: number\n}\n\n/**\n * Commit one decoded page and all accepted canonical projections atomically.\n * The existing plugin checkpoint transaction nests as a savepoint; only its\n * newly accepted event identities cross the materialization seam.\n */\nexport const materializeNormalizedPluginPage = Effect.fn(\n \"NormalizedPluginPageMaterialization.materializePage\"\n)(function*(\n scope: NormalizedPluginPageMaterializationScope,\n page: PluginSyncPageV1\n): Effect.fn.Return<\n NormalizedPluginPageMaterializationReceipt,\n NormalizedPluginPageMaterializationError | PersistenceOperationFailure | PluginConflictFailure,\n Crypto.Crypto | Persistence\n> {\n const cryptoService = yield* Crypto.Crypto\n const persistence = yield* Persistence\n const materializeWithSettings = Effect.fn(\n \"NormalizedPluginPageMaterialization.materializeWithSettings\"\n )(function*(settingsRecord: WorkspaceSettingsRecord) {\n if (scope.expectedAuthority !== undefined) {\n yield* verifyPluginSynchronizationAuthority(persistence, scope.expectedAuthority)\n }\n const settings = settingsRecord.settings\n const materializationPage = yield* sequenceClockifyPersonEvents(persistence, scope, page)\n const pipelineTombstones = materializationPage.events.filter(isCodePipelineTombstone)\n const previousPipelineRecords = pipelineTombstones.length === 0\n ? []\n : yield* persistence.pluginRuntime.getCodePipelineCacheBeforeTombstones(\n scope.workspaceId,\n scope.pluginConnectionId,\n scope.streamKey,\n pipelineTombstones\n )\n const previousPipelineEvents = pipelineTombstones.length === 0\n ? []\n : yield* pipelineEventsFromCacheRecords(previousPipelineRecords, pipelineTombstones[0]?.eventId ?? \"pipeline\")\n const committed = yield* persistence.pluginRuntime.commitNormalizedPageReceipt(\n scope.workspaceId,\n scope.pluginConnectionId,\n scope.providerId,\n scope.streamKey,\n scope.expectedRevision,\n materializationPage,\n scope.committedAt,\n scope.successfulHealth\n )\n const accepted = new Set(committed.acceptedEventIds)\n const acceptedEvents = materializationPage.events.filter(({ eventId }) => accepted.has(eventId))\n const acceptedClockifyTimeEntryIds = new Set(\n acceptedEvents.flatMap((event) =>\n event._tag === \"UpsertEntity\" && canonicalKind(event.entityType) === \"time-entry\"\n ? [event.vendorImmutableId]\n : []\n )\n )\n const backfillEntityEvents = yield* Effect.filter(\n materializationPage.events,\n (event) =>\n !accepted.has(event.eventId) &&\n event._tag === \"UpsertEntity\" &&\n !acceptedClockifyTimeEntryIds.has(event.vendorImmutableId)\n ? requiresMaterializationBackfill(persistence, scope, event)\n : Effect.succeed(false)\n )\n const acceptedPipelineTombstones = new Set(\n acceptedEvents.filter(isCodePipelineTombstone).map(pipelineEntityIdentity)\n )\n const pipelineChanges = [\n ...acceptedEvents.filter(isCodePipelineUpsert),\n ...previousPipelineEvents.filter((event) => acceptedPipelineTombstones.has(pipelineEntityIdentity(event)))\n ]\n const acceptedPipelineEvent = pipelineChanges[0]\n const pipelineSelectors = acceptedPipelineEvent === undefined\n ? []\n : yield* codePipelineCacheSelectors(pipelineChanges).pipe(\n Effect.mapError((error) => malformed(error.diagnosticCode, error.eventId))\n )\n const cachedPipelineEvents = acceptedPipelineEvent === undefined || pipelineSelectors.length === 0\n ? []\n : yield* currentPipelineEvents(persistence, scope, acceptedPipelineEvent.eventId, pipelineSelectors)\n const pipelineEventById = new Map<string, NormalizedPluginEventV1>()\n for (const event of [...acceptedEvents, ...cachedPipelineEvents]) {\n if (isCodePipelineUpsert(event)) pipelineEventById.set(event.eventId, event)\n }\n const pipelineEvents = [...pipelineEventById.values()]\n const affectedExecutions = acceptedPipelineEvent === undefined\n ? []\n : yield* affectedPipelineExecutionEvents(pipelineEvents, pipelineChanges).pipe(\n Effect.mapError((error) => malformed(error.diagnosticCode, error.eventId))\n )\n const acceptedPersonIds = new Set(\n acceptedEvents.flatMap((event) => event._tag === \"UpsertPerson\" ? [event.vendorPersonId] : [])\n )\n const roleBackfillCandidates = materializationPage.events.flatMap((event) => {\n if (\n accepted.has(event.eventId) ||\n event._tag !== \"UpsertEntity\" ||\n canonicalKind(event.entityType) !== \"time-entry\" ||\n acceptedClockifyTimeEntryIds.has(event.vendorImmutableId)\n ) return []\n const attributes = Schema.decodeUnknownResult(EntityAttributes)(event.attributes)\n if (\n Result.isFailure(attributes) ||\n attributes.success.userId === null ||\n attributes.success.userId === undefined\n ) return []\n return [{ event, vendorPersonId: VendorImmutableId.make(attributes.success.userId) }]\n })\n const persistedInactivePersonIds = new Set(\n yield* Effect.filter(\n [...new Set(roleBackfillCandidates.map(({ vendorPersonId }) => vendorPersonId))].filter(\n (vendorPersonId) => !acceptedPersonIds.has(vendorPersonId)\n ),\n (vendorPersonId) =>\n Effect.gen(function*() {\n const person = yield* persistence.people.findPersonBySourceIdentity(scope.workspaceId, {\n pluginConnectionId: scope.pluginConnectionId,\n providerId: scope.providerId,\n vendorPersonId\n }).pipe(Effect.result)\n if (Result.isSuccess(person)) return !person.success.person.isActive\n if (person.failure._tag === \"RecordNotFoundError\") return false\n return yield* person.failure\n }),\n { concurrency: 1 }\n )\n )\n const roleBackfillEntityEvents = roleBackfillCandidates.filter(\n ({ vendorPersonId }) => acceptedPersonIds.has(vendorPersonId) || persistedInactivePersonIds.has(vendorPersonId)\n ).map(({ event }) => event)\n const entityEventById = new Map<string, NormalizedPluginEventV1>()\n for (\n const event of [\n ...acceptedEvents,\n ...backfillEntityEvents,\n ...affectedExecutions.filter(({ eventId }) => !accepted.has(eventId))\n ]\n ) entityEventById.set(event.eventId, event)\n const entityEvents = [...entityEventById.values()]\n const backfillEntityEventIds = new Set(backfillEntityEvents.map(({ eventId }) => eventId))\n const forcedPipelineExecutionEventIds = new Set(affectedExecutions.map(({ eventId }) => eventId))\n let entityProjectionCount = 0\n let evidenceClaimCount = 0\n let evidenceItemCount = 0\n let nodeCount = 0\n let personCount = 0\n let relationshipCount = 0\n let skippedEntityCount = 0\n\n for (const event of acceptedEvents) {\n if (event._tag !== \"UpsertPerson\") continue\n personCount += yield* materializePerson(persistence, cryptoService, scope, event)\n }\n const roleAssignments = new Map<RoleAssignmentId, RoleAssignmentRecord>()\n if (\n roleBackfillEntityEvents.length > 0 || entityEvents.some(\n (event) => event._tag === \"UpsertEntity\" && canonicalKind(event.entityType) === \"time-entry\"\n )\n ) {\n for (const record of yield* persistence.people.listRoleAssignments(scope.workspaceId)) {\n roleAssignments.set(record.assignment.assignmentId, record)\n }\n }\n for (const event of roleBackfillEntityEvents) {\n if (event._tag !== \"UpsertEntity\") continue\n const attributes = Schema.decodeUnknownResult(EntityAttributes)(event.attributes)\n const userId = Result.isSuccess(attributes) ? attributes.success.userId : null\n if (userId === null || userId === undefined) continue\n const existing = yield* findEntity(persistence, scope, event.vendorImmutableId)\n if (existing === null) continue\n yield* reconcileTimeEntryContributor(\n persistence,\n cryptoService,\n scope,\n existing.entityId,\n userId,\n event.eventId,\n roleAssignments\n )\n }\n for (const event of entityEvents) {\n if (event._tag === \"UpsertEntity\") {\n if (event.entityType === \"release\") {\n nodeCount += (yield* materializeRelease(\n persistence,\n cryptoService,\n scope,\n settings,\n event\n )).nodeCount\n continue\n }\n if (event.entityType === \"aws.codepipeline.pipeline\") {\n yield* materializePipelineAuthority(persistence, cryptoService, scope, event)\n continue\n }\n const schemaBackfill = backfillEntityEventIds.has(event.eventId)\n const forcedPipelineProjection = event.entityType === \"aws.codepipeline.execution\" &&\n forcedPipelineExecutionEventIds.has(event.eventId)\n const receipt = yield* materializeUpsertEntity(\n persistence,\n cryptoService,\n scope,\n event,\n event.entityType === \"aws.codepipeline.execution\" ? pipelineEvents : acceptedEvents,\n forcedPipelineProjection || schemaBackfill,\n schemaBackfill,\n roleAssignments\n )\n entityProjectionCount += receipt.entityProjectionCount\n nodeCount += receipt.nodeCount\n skippedEntityCount += receipt.skippedEntityCount\n } else if (event._tag === \"TombstoneEntity\") {\n entityProjectionCount += (yield* materializeTombstoneEntity(persistence, scope, event)).entityProjectionCount\n }\n }\n for (const event of acceptedEvents) {\n if (event._tag !== \"AppendEvidence\") continue\n const receipt = yield* materializeEvidence(\n persistence,\n cryptoService,\n scope,\n settings,\n event\n )\n evidenceItemCount += receipt.evidenceItemCount\n evidenceClaimCount += receipt.evidenceClaimCount\n }\n for (const event of acceptedEvents) {\n if (event._tag !== \"ProposeRelationship\") continue\n const receipt = yield* materializeRelationship(persistence, cryptoService, scope, event)\n nodeCount += receipt.nodeCount\n relationshipCount += receipt.relationshipCount\n }\n relationshipCount += yield* retireMissingJiraReleaseContainments(\n persistence,\n cryptoService,\n scope,\n acceptedEvents\n )\n if (acceptedEvents.length > 0 || entityProjectionCount > 0) {\n const inference = yield* materializeRelationshipInference(\n persistence,\n (identity) => stableUuid(cryptoService, identity, \"relationship-inference\"),\n scope,\n settings\n )\n evidenceClaimCount += inference.evidenceClaimCount\n evidenceItemCount += inference.evidenceItemCount\n nodeCount += inference.nodeCount\n relationshipCount += inference.relationshipCount\n }\n return {\n pageCommitted: committed.pageCommitted,\n acceptedEventCount: acceptedEvents.length,\n entityProjectionCount,\n evidenceClaimCount,\n evidenceItemCount,\n nodeCount,\n personCount,\n relationshipCount,\n skippedEntityCount\n }\n })\n return yield* persistence.workspaceSettings.readAtomically(\n scope.workspaceId,\n materializeWithSettings\n )\n})\n","import * as Clock from \"effect/Clock\"\nimport * as Context from \"effect/Context\"\nimport * as Crypto from \"effect/Crypto\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\nimport * as Stream from \"effect/Stream\"\n\nimport type { PluginSynchronizationState } from \"../../api/plugins.js\"\nimport { PluginHealth, type PluginHealth as PluginHealthType } from \"../../domain/freshness.js\"\nimport type { PluginConnectionId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { NegotiatedPluginDescriptorV1 } from \"../../domain/plugins/descriptor.js\"\nimport { PluginCheckpointV1, type PluginSyncPageV1, PluginSyncRequestV1 } from \"../../domain/plugins/events.js\"\nimport type { ProviderId } from \"../../domain/sourceRevision.js\"\nimport type { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport {\n ApplicationInvalidRequest,\n ApplicationResourceNotFound,\n ApplicationServiceUnavailable,\n type PluginAdministrationError\n} from \"../api/ApplicationServices.js\"\nimport type { PersistenceOperationFailure } from \"../persistence/Persistence.js\"\nimport { Persistence } from \"../persistence/Persistence.js\"\nimport type {\n PluginSyncAttemptRecord,\n PluginSyncAttemptState\n} from \"../persistence/repositories/pluginRuntimeModels.js\"\nimport { PluginStreamKey } from \"../persistence/repositories/pluginRuntimeModels.js\"\nimport type { PluginFailure } from \"../plugins/failures.js\"\nimport { pluginFailureClass, PluginMalformedResponseFailure } from \"../plugins/failures.js\"\nimport { firstPartySyncStreamKey, supportsFirstPartySynchronization } from \"../plugins/firstPartySynchronization.js\"\nimport { PluginConnection, type PluginConnectionV1 } from \"../plugins/PluginConnection.js\"\nimport type { PluginConnectionMapV1 } from \"../plugins/PluginConnectionMap.js\"\nimport { DomainEventWakeups } from \"../runtime/DomainEventWakeups.js\"\nimport { materializeNormalizedPluginPage } from \"./normalizedPluginPageMaterialization.js\"\nimport {\n capturePluginSynchronizationAuthority,\n type PluginSynchronizationAuthority,\n verifyPluginSynchronizationAuthority\n} from \"./pluginSynchronizationAuthority.js\"\nimport { appendPortfolioInvalidation } from \"./portfolioInvalidation.js\"\n\nconst MAXIMUM_PAGES_PER_INVOCATION = 100\nconst SYNCHRONIZATION_CLAIM_LIFETIME_MINUTES = 15\nconst SOURCE_UNAVAILABLE_OUTCOME = \"source-unavailable\"\nconst SYNCHRONIZED_OUTCOME = \"synchronized\"\ntype SuccessfulPluginHealth = Extract<PluginHealthType, { readonly _tag: \"healthy\" | \"degraded\" }>\n\nconst successfulHealthAt = (\n health: SuccessfulPluginHealth,\n checkedAt: UtcTimestamp\n): SuccessfulPluginHealth =>\n health._tag === \"healthy\"\n ? { _tag: \"healthy\", checkedAt }\n : {\n ...health,\n checkedAt,\n retryAt: health.retryAt !== null && DateTime.Order(checkedAt, health.retryAt) <= 0\n ? health.retryAt\n : null\n }\n\n/** One provider-neutral manual synchronization driver with a fixed logical stream identity. */\nexport interface ManualPluginSyncDriver {\n readonly providerId: ProviderId\n readonly streamKey: string\n readonly sync: (\n connection: PluginConnectionV1,\n request: typeof PluginSyncRequestV1.Type\n ) => Stream.Stream<PluginSyncPageV1, PluginFailure>\n}\n\n/** Fixed lookup boundary that keeps provider identifiers out of the orchestration state machine. */\nexport interface ManualPluginSyncDriverRegistry {\n readonly get: (providerId: ProviderId) => Option.Option<ManualPluginSyncDriver>\n}\n\n/** Build a deterministic driver registry for production or fixture connections. */\nexport const makeManualPluginSyncDriverRegistry = (\n drivers: ReadonlyArray<ManualPluginSyncDriver>\n): ManualPluginSyncDriverRegistry => {\n const byProvider = new Map<ProviderId, ManualPluginSyncDriver>()\n for (const driver of drivers) byProvider.set(driver.providerId, driver)\n return { get: (providerId) => Option.fromNullishOr(byProvider.get(providerId)) }\n}\n\nconst connectionSync = (\n connection: PluginConnectionV1,\n request: typeof PluginSyncRequestV1.Type\n) => connection.sync(request)\n\n/** Production drivers for first-party connections that currently negotiate synchronization. */\nexport const firstPartyManualPluginSyncDrivers = makeManualPluginSyncDriverRegistry([\n { providerId: \"codecommit\", streamKey: firstPartySyncStreamKey(\"codecommit\"), sync: connectionSync },\n { providerId: \"codepipeline\", streamKey: firstPartySyncStreamKey(\"codepipeline\"), sync: connectionSync },\n { providerId: \"jira\", streamKey: firstPartySyncStreamKey(\"jira\"), sync: connectionSync },\n { providerId: \"clockify\", streamKey: firstPartySyncStreamKey(\"clockify\"), sync: connectionSync },\n { providerId: \"confluence\", streamKey: firstPartySyncStreamKey(\"confluence\"), sync: connectionSync }\n])\n\nconst unavailable = () => new ApplicationServiceUnavailable({ retryAt: null })\n\nconst mapPersistenceRead = (\n failure: PersistenceOperationFailure\n): ApplicationResourceNotFound | ApplicationServiceUnavailable =>\n failure._tag === \"RecordNotFoundError\" ? new ApplicationResourceNotFound() : unavailable()\n\nconst pluginFailureTags = new Set([\n \"PluginAuthenticationFailure\",\n \"PluginAuthorizationFailure\",\n \"PluginRateLimitFailure\",\n \"PluginTimeoutFailure\",\n \"PluginMalformedResponseFailure\",\n \"PluginOutageFailure\",\n \"PluginCancellationFailure\",\n \"PluginConflictFailure\",\n \"PluginUnsupportedCapabilityFailure\",\n \"PluginConfigurationFailure\",\n \"PluginUnknownOutcomeFailure\"\n])\n\nconst isPluginFailure = (failure: unknown): failure is PluginFailure =>\n Predicate.hasProperty(failure, \"_tag\") &&\n typeof failure._tag === \"string\" &&\n pluginFailureTags.has(failure._tag)\n\nconst sourceFailure = (failure: unknown): PluginFailure | null => {\n if (isPluginFailure(failure)) return failure\n if (\n Predicate.hasProperty(failure, \"_tag\") &&\n failure._tag === \"NormalizedPluginPageMaterializationError\"\n ) {\n return new PluginMalformedResponseFailure({\n operation: \"manual-sync\",\n diagnosticCode: \"normalized-plugin-page-rejected\"\n })\n }\n if (\n Predicate.hasProperty(failure, \"_tag\") &&\n failure._tag === \"SourceIdentityMismatchError\" &&\n Predicate.hasProperty(failure, \"recordKind\") &&\n (failure.recordKind === \"plugin-sync-event\" || failure.recordKind === \"plugin-sync-page\")\n ) {\n return new PluginMalformedResponseFailure({\n operation: \"manual-sync\",\n diagnosticCode: \"plugin-sync-source-identity-conflict\"\n })\n }\n return null\n}\n\nconst safeFailureMessage = (failure: PluginFailure): string => {\n switch (failure._tag) {\n case \"PluginAuthenticationFailure\":\n return \"Provider authentication failed.\"\n case \"PluginAuthorizationFailure\":\n return \"Provider permission was denied.\"\n case \"PluginRateLimitFailure\":\n return \"Provider rate limit was reached.\"\n case \"PluginTimeoutFailure\":\n return \"Provider request timed out.\"\n case \"PluginMalformedResponseFailure\":\n return \"Provider returned an invalid response.\"\n case \"PluginOutageFailure\":\n return \"Provider is temporarily unavailable.\"\n case \"PluginCancellationFailure\":\n return \"Provider synchronization was cancelled.\"\n case \"PluginConflictFailure\":\n return \"Provider state changed during synchronization.\"\n case \"PluginUnsupportedCapabilityFailure\":\n return \"Provider synchronization is not supported.\"\n case \"PluginConfigurationFailure\":\n return \"Provider configuration is incomplete.\"\n case \"PluginUnknownOutcomeFailure\":\n return \"Provider synchronization outcome is unknown.\"\n }\n}\n\nconst failureHealth = Effect.fn(\"ManualPluginSynchronization.failureHealth\")(function*(\n failure: PluginFailure,\n checkedAt: UtcTimestamp\n) {\n return yield* Schema.decodeUnknownEffect(Schema.toType(PluginHealth))({\n _tag: \"unavailable\",\n checkedAt,\n failureClass: pluginFailureClass(failure),\n retryAt: failure._tag === \"PluginRateLimitFailure\" ? failure.retryAt : null,\n safeMessage: safeFailureMessage(failure)\n })\n})\n\nconst stateFromAttemptState = (\n pluginConnectionId: PluginConnectionId,\n providerId: ProviderId,\n streamKey: string,\n attemptState: PluginSyncAttemptState\n): PluginSynchronizationState => {\n const lastAttempt: PluginSyncAttemptRecord | undefined = attemptState.latestAttempt ?? undefined\n const lastSuccess: PluginSyncAttemptRecord | undefined = attemptState.latestSynchronized ?? undefined\n return {\n pluginConnectionId,\n providerId,\n streamKey,\n lastAttemptAt: lastAttempt?.startedAt ?? null,\n lastSuccessAt: lastSuccess?.completedAt ?? null,\n result: lastAttempt === undefined\n ? \"never\"\n : lastAttempt.outcome === null\n ? \"running\"\n : lastAttempt.outcome,\n pagesCommitted: lastAttempt?.pagesCommitted ?? 0\n }\n}\n\ninterface BoundManualSync {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n readonly providerId: ProviderId\n readonly driver: ManualPluginSyncDriver\n readonly streamKey: PluginStreamKey\n}\n\ninterface SynchronizationClaim extends BoundManualSync {\n readonly claimId: string\n}\n\nexport interface ManualPluginSynchronizationService {\n readonly state: (input: {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n }) => Effect.Effect<PluginSynchronizationState, ApplicationInvalidRequest | PluginAdministrationError>\n readonly synchronize: (input: {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n }) => Effect.Effect<PluginSynchronizationState, ApplicationInvalidRequest | PluginAdministrationError>\n}\n\n/** Build the bounded synchronization application over a scoped provider runtime map. */\nexport const makeManualPluginSynchronization = Effect.fn(\n \"ManualPluginSynchronization.make\"\n)(function*(\n connections: PluginConnectionMapV1,\n drivers: ManualPluginSyncDriverRegistry = firstPartyManualPluginSyncDrivers\n): Effect.fn.Return<ManualPluginSynchronizationService, never, Crypto.Crypto | DomainEventWakeups | Persistence> {\n const persistence = yield* Persistence\n const wakeups = yield* DomainEventWakeups\n const cryptoService = yield* Crypto.Crypto\n\n const bind = Effect.fn(\"ManualPluginSynchronization.bind\")(function*(input: {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n }): Effect.fn.Return<BoundManualSync, ApplicationInvalidRequest | PluginAdministrationError> {\n const connection = yield* persistence.pluginConnections.get(\n input.workspaceId,\n input.pluginConnectionId\n ).pipe(Effect.mapError(mapPersistenceRead))\n const driver = drivers.get(connection.providerId)\n if (Option.isNone(driver)) return yield* new ApplicationInvalidRequest()\n const runtime = yield* persistence.pluginRuntime.getRuntime(\n input.workspaceId,\n input.pluginConnectionId\n ).pipe(Effect.mapError(mapPersistenceRead))\n const descriptor = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(NegotiatedPluginDescriptorV1))(\n runtime.descriptorJson\n ).pipe(Effect.mapError(() => new ApplicationInvalidRequest()))\n if (!supportsFirstPartySynchronization(connection.providerId, descriptor)) {\n return yield* new ApplicationInvalidRequest()\n }\n const streamKey = yield* Schema.decodeUnknownEffect(PluginStreamKey)(driver.value.streamKey).pipe(\n Effect.mapError(() => new ApplicationInvalidRequest())\n )\n return { ...input, providerId: connection.providerId, driver: driver.value, streamKey }\n })\n\n const releaseSynchronizationAttempt = Effect.fn(\n \"ManualPluginSynchronization.releaseSynchronizationAttempt\"\n )(function*(input: {\n readonly attempt: PluginSyncAttemptRecord\n readonly claim: SynchronizationClaim\n }) {\n const completedAt = DateTime.makeUnsafe(yield* Effect.clockWith((clock) => clock.currentTimeMillis))\n yield* persistence.pluginRuntime.reconcileSyncAttempts(\n input.claim.workspaceId,\n input.claim.pluginConnectionId,\n input.claim.providerId,\n input.claim.streamKey,\n completedAt,\n input.attempt.attemptSequence\n ).pipe(\n Effect.ignore({\n log: \"Error\",\n message: \"Could not reconcile an incomplete manual synchronization attempt\"\n })\n )\n })\n\n const releaseSynchronizationClaim = Effect.fn(\n \"ManualPluginSynchronization.releaseSynchronizationClaim\"\n )(function*(claim: SynchronizationClaim) {\n yield* persistence.pluginRuntime.releaseSyncClaim(\n claim.workspaceId,\n claim.pluginConnectionId,\n claim.streamKey,\n claim.claimId\n ).pipe(Effect.mapError(() => unavailable()))\n })\n\n const claimSynchronization = Effect.fn(\n \"ManualPluginSynchronization.claimSynchronization\"\n )(function*(bound: BoundManualSync) {\n const claimId = yield* cryptoService.randomUUIDv4.pipe(Effect.mapError(() => unavailable()))\n const claimedAt = DateTime.makeUnsafe(yield* Effect.clockWith((clock) => clock.currentTimeMillis))\n const expiresAt = DateTime.add(claimedAt, { minutes: SYNCHRONIZATION_CLAIM_LIFETIME_MINUTES })\n const claimed = yield* persistence.pluginRuntime.claimSync(\n bound.workspaceId,\n bound.pluginConnectionId,\n bound.providerId,\n bound.streamKey,\n claimId,\n claimedAt,\n expiresAt\n ).pipe(Effect.mapError(() => unavailable()))\n if (!claimed) return yield* unavailable()\n return { ...bound, claimId }\n })\n\n const stateFor = Effect.fn(\"ManualPluginSynchronization.stateFor\")(function*(bound: BoundManualSync) {\n const attemptState = yield* persistence.pluginRuntime.getSyncAttemptState(\n bound.workspaceId,\n bound.pluginConnectionId,\n bound.streamKey\n ).pipe(Effect.mapError(() => unavailable()))\n return stateFromAttemptState(\n bound.pluginConnectionId,\n bound.providerId,\n bound.streamKey,\n attemptState\n )\n })\n\n const readState = Effect.fn(\"ManualPluginSynchronization.state\")(function*(input: {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n }) {\n const bound = yield* bind(input)\n return yield* stateFor(bound)\n })\n\n const persistHealth = Effect.fn(\"ManualPluginSynchronization.persistHealth\")(function*(\n bound: BoundManualSync,\n authority: PluginSynchronizationAuthority,\n health: PluginHealthType,\n failed: boolean\n ) {\n const persisted = yield* persistence.transact(Effect.gen(function*() {\n yield* verifyPluginSynchronizationAuthority(persistence, authority)\n const runtime = yield* persistence.pluginRuntime.getRuntime(\n bound.workspaceId,\n bound.pluginConnectionId\n )\n yield* persistence.pluginRuntime.recordHealth(\n bound.workspaceId,\n bound.pluginConnectionId,\n runtime.revision,\n health,\n failed ? runtime.consecutiveFailures + 1 : 0\n )\n yield* appendPortfolioInvalidation({\n workspaceId: bound.workspaceId,\n pluginConnectionId: bound.pluginConnectionId,\n releaseId: null,\n occurredAt: health.checkedAt,\n reason: \"plugin-health\"\n }).pipe(\n Effect.provideService(Crypto.Crypto, cryptoService),\n Effect.provideService(Persistence, persistence)\n )\n return true\n })).pipe(\n Effect.catchTag(\"PluginConflictFailure\", () => Effect.succeed(false)),\n Effect.mapError(() => unavailable())\n )\n if (persisted) yield* wakeups.notify(bound.workspaceId)\n return persisted\n })\n\n const initialCheckpoint = Effect.fn(\"ManualPluginSynchronization.initialCheckpoint\")(function*(\n bound: BoundManualSync\n ) {\n const current = yield* Effect.result(\n persistence.pluginRuntime.getStream(bound.workspaceId, bound.pluginConnectionId, bound.streamKey)\n )\n if (Result.isFailure(current)) {\n if (current.failure._tag === \"RecordNotFoundError\") return null\n return yield* Effect.fail(current.failure)\n }\n return current.success.checkpointJson === null\n ? null\n : yield* Schema.decodeUnknownEffect(Schema.fromJsonString(PluginCheckpointV1))(\n current.success.checkpointJson\n )\n })\n\n const run = Effect.fn(\"ManualPluginSynchronization.run\")(function*(\n bound: BoundManualSync,\n authority: PluginSynchronizationAuthority,\n connection: PluginConnectionV1,\n health: SuccessfulPluginHealth\n ) {\n const checkpoint = yield* initialCheckpoint(bound)\n const request = yield* Schema.decodeUnknownEffect(PluginSyncRequestV1)({\n streamKey: bound.streamKey,\n checkpoint\n })\n const initialStream = yield* Effect.result(\n persistence.pluginRuntime.getStream(bound.workspaceId, bound.pluginConnectionId, bound.streamKey)\n )\n const revision = Result.isSuccess(initialStream) ? initialStream.success.revision : 0\n return yield* Stream.runFoldEffect(\n bound.driver.sync(connection, request).pipe(Stream.take(MAXIMUM_PAGES_PER_INVOCATION)),\n () => ({ health, isTerminal: false, pagesSeen: 0, pagesCommitted: 0, revision }),\n (state, page) =>\n Effect.gen(function*() {\n if (state.isTerminal) {\n return yield* new PluginMalformedResponseFailure({\n operation: \"manual-sync\",\n diagnosticCode: \"manual-sync-page-after-terminal\"\n })\n }\n const committedAt = DateTime.makeUnsafe(yield* Clock.currentTimeMillis)\n const successfulHealth = successfulHealthAt(state.health, committedAt)\n const receipt = yield* materializeNormalizedPluginPage({\n workspaceId: bound.workspaceId,\n pluginConnectionId: bound.pluginConnectionId,\n providerId: bound.providerId,\n streamKey: bound.streamKey,\n expectedRevision: state.revision,\n committedAt,\n successfulHealth,\n expectedAuthority: authority\n }, page).pipe(\n Effect.provideService(Crypto.Crypto, cryptoService),\n Effect.provideService(Persistence, persistence)\n )\n const pagesSeen = state.pagesSeen + 1\n return {\n health: successfulHealth,\n isTerminal: !page.hasMore,\n pagesSeen,\n pagesCommitted: state.pagesCommitted + (receipt.pageCommitted ? 1 : 0),\n revision: state.revision + (receipt.pageCommitted ? 1 : 0)\n }\n })\n )\n })\n\n const synchronizeAttempt = Effect.fn(\"ManualPluginSynchronization.synchronizeAttempt\")(function*(\n input: {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n },\n bound: BoundManualSync,\n attempt: PluginSyncAttemptRecord,\n authority: PluginSynchronizationAuthority\n ) {\n const synchronized = yield* Effect.result(Effect.scoped(\n Effect.flatMap(\n connections.contextEffect({\n workspaceId: bound.workspaceId,\n pluginConnectionId: bound.pluginConnectionId\n }),\n (context) =>\n Effect.gen(function*() {\n const connection = Context.get(context, PluginConnection)\n const health = yield* connection.health\n if (health._tag === \"unavailable\" || health._tag === \"disabled\") return health\n const completed = yield* run(bound, authority, connection, health)\n if (\n !completed.isTerminal &&\n (\n completed.pagesSeen < MAXIMUM_PAGES_PER_INVOCATION ||\n completed.pagesCommitted === 0\n )\n ) {\n return yield* new PluginMalformedResponseFailure({\n operation: \"manual-sync\",\n diagnosticCode: \"manual-sync-terminal-page-missing\"\n })\n }\n return completed.health\n }).pipe(Effect.provide(context))\n )\n ))\n const outcome = yield* Effect.gen(function*() {\n if (Result.isSuccess(synchronized)) {\n const health = synchronized.success\n const sourceUnavailable = health._tag === \"unavailable\" || health._tag === \"disabled\"\n const healthPersisted = yield* persistHealth(bound, authority, health, sourceUnavailable)\n return sourceUnavailable || !healthPersisted ? SOURCE_UNAVAILABLE_OUTCOME : SYNCHRONIZED_OUTCOME\n }\n yield* Effect.logError(\"Manual plugin synchronization failed\", synchronized.failure).pipe(\n Effect.annotateLogs({\n workspaceId: bound.workspaceId,\n pluginConnectionId: bound.pluginConnectionId,\n streamKey: bound.streamKey\n })\n )\n const failure = sourceFailure(synchronized.failure)\n if (failure === null) return yield* unavailable()\n const failedAt = DateTime.makeUnsafe(yield* Effect.clockWith((clock) => clock.currentTimeMillis))\n const health = yield* failureHealth(failure, failedAt).pipe(Effect.mapError(() => unavailable()))\n yield* persistHealth(bound, authority, health, true)\n return SOURCE_UNAVAILABLE_OUTCOME\n })\n const completedAt = DateTime.makeUnsafe(yield* Effect.clockWith((clock) => clock.currentTimeMillis))\n yield* persistence.pluginRuntime.completeSyncAttempt(\n bound.workspaceId,\n bound.pluginConnectionId,\n bound.streamKey,\n attempt.attemptSequence,\n outcome,\n completedAt\n ).pipe(Effect.mapError(() => unavailable()))\n return yield* readState(input)\n })\n\n const synchronizeBound = Effect.fn(\"ManualPluginSynchronization.synchronizeBound\")(function*(\n input: {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n },\n claim: SynchronizationClaim\n ) {\n const captured = yield* capturePluginSynchronizationAuthority(\n persistence,\n claim.workspaceId,\n claim.pluginConnectionId\n ).pipe(Effect.mapError(mapPersistenceRead))\n if (!captured.connection.isEnabled) return yield* new ApplicationInvalidRequest()\n return yield* Effect.acquireUseRelease(\n Effect.gen(function*() {\n const startedAt = DateTime.makeUnsafe(yield* Effect.clockWith((clock) => clock.currentTimeMillis))\n return yield* persistence.pluginRuntime.beginSyncAttempt(\n claim.workspaceId,\n claim.pluginConnectionId,\n claim.providerId,\n claim.streamKey,\n startedAt\n ).pipe(Effect.mapError(() => unavailable()))\n }),\n (attempt) => synchronizeAttempt(input, claim, attempt, captured.authority),\n (attempt) => releaseSynchronizationAttempt({ attempt, claim })\n )\n })\n\n const synchronize = Effect.fn(\"ManualPluginSynchronization.synchronize\")(function*(input: {\n readonly workspaceId: WorkspaceId\n readonly pluginConnectionId: PluginConnectionId\n }) {\n const bound = yield* bind(input)\n return yield* Effect.acquireUseRelease(\n claimSynchronization(bound),\n (claim) => synchronizeBound(input, claim),\n releaseSynchronizationClaim\n ).pipe(\n Effect.tapCause((cause) =>\n Effect.logError(\"Manual plugin synchronization orchestration failed\", cause).pipe(\n Effect.annotateLogs({\n workspaceId: bound.workspaceId,\n pluginConnectionId: bound.pluginConnectionId,\n streamKey: bound.streamKey\n })\n )\n )\n )\n })\n\n return { state: readState, synchronize }\n})\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { I as PluginEntityReferenceV1, Q as Revision, et as SourceUrl, nt as UtcTimestamp } from "./descriptor-CKtTnhef.js";
1
+ import { I as PluginEntityReferenceV1, Nt as UtcTimestamp, Q as Revision, et as SourceUrl } from "./descriptor-CCvNzSZL.js";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Schema from "effect/Schema";
4
4
  import * as Encoding from "effect/Encoding";
@@ -93,4 +93,4 @@ var PluginPipelineArtifactRangeV1 = Schema.Struct({
93
93
  //#endregion
94
94
  export { PluginPipelineLogPageRequestV1 as a, PluginDiscoveryV1 as c, PluginPipelineLogEventV1 as i, PluginPipelineArtifactRangeRequestV1 as n, PluginPipelineLogPageV1 as o, PluginPipelineArtifactRangeV1 as r, PluginDiscoveryEndpointV1 as s, PluginPipelineActionReferenceV1 as t };
95
95
 
96
- //# sourceMappingURL=plugins-D__oMDpI.js.map
96
+ //# sourceMappingURL=plugins-DiPrfzV8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugins-D__oMDpI.js","names":[],"sources":["../../../src/domain/plugins/discovery.ts","../../../src/domain/plugins/pipeline.ts"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as SchemaGetter from \"effect/SchemaGetter\"\n\nimport { SourceUrl } from \"../sourceRevision.js\"\nimport { UtcTimestamp } from \"../utcTimestamp.js\"\n\nconst SafeProviderIdentifier = Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(512)\n)\nconst SafeProviderLabel = Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(200)\n)\nconst SafeDiscoveryEndpointUrl = SourceUrl.pipe(\n Schema.check(\n Schema.makeFilter(\n ({ hash, search }) => hash.length === 0 && search.length === 0,\n { expected: \"a provider endpoint URL without query parameters or fragments\" }\n )\n )\n)\n\nconst ProviderContainer = Schema.Struct({\n providerImmutableId: SafeProviderIdentifier,\n displayName: SafeProviderLabel\n})\nconst NullableProviderContainer = Schema.NullOr(ProviderContainer)\n\n/** Secret-free provider endpoint advertised during connection discovery. */\nexport const PluginDiscoveryEndpointV1 = Schema.Struct({\n kind: Schema.Literals([\"api\", \"web\", \"graphql\", \"webhook\"]),\n url: SafeDiscoveryEndpointUrl,\n label: Schema.NullOr(SafeProviderLabel)\n})\n\n/** Decoded safe provider endpoint metadata. */\nexport type PluginDiscoveryEndpointV1 = typeof PluginDiscoveryEndpointV1.Type\n\n/**\n * Safe connection metadata discovered from the provider.\n * Credentials, raw headers, and provider response bodies are deliberately absent.\n */\nexport const PluginDiscoveryV1 = Schema.Struct({\n account: NullableProviderContainer,\n workspace: NullableProviderContainer,\n resource: Schema.optional(NullableProviderContainer).pipe(\n Schema.decodeTo(Schema.toType(NullableProviderContainer), {\n decode: SchemaGetter.withDefault(Effect.succeed<typeof NullableProviderContainer.Type>(null)),\n encode: SchemaGetter.required()\n })\n ),\n endpoints: Schema.Array(PluginDiscoveryEndpointV1).check(\n Schema.makeFilter(\n (endpoints) => endpoints.length <= 20,\n { expected: \"at most 20 safe provider endpoints\" }\n )\n ),\n discoveredAt: UtcTimestamp\n}).annotate({ identifier: \"PluginDiscoveryV1\" })\n\n/** Decoded secret-free connection discovery metadata. */\nexport type PluginDiscoveryV1 = typeof PluginDiscoveryV1.Type\n","import * as Encoding from \"effect/Encoding\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\n\nimport { Revision } from \"../sourceRevision.js\"\nimport { UtcTimestamp } from \"../utcTimestamp.js\"\nimport { PluginEntityReferenceV1 } from \"./events.js\"\n\nconst boundedOpaque = (name: string, maximum: number) =>\n Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(maximum)).pipe(Schema.brand(name))\n\nconst NonNegativeInteger = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))\nconst PositiveInteger = Schema.Int.check(Schema.isGreaterThan(0))\nconst MaximumArtifactRangeBytes = 1024 * 1024\nconst MaximumArtifactRangeBase64Characters = 4 * Math.ceil(MaximumArtifactRangeBytes / 3)\nconst MaximumLogPageBytes = 1024 * 1024\nconst utf8Encoder = new TextEncoder()\nconst Utf8BoundedLogMessage = Schema.String.check(\n Schema.makeFilter(\n (message) => utf8Encoder.encode(message).byteLength <= MaximumLogPageBytes,\n { expected: `at most ${MaximumLogPageBytes} UTF-8 log message bytes` }\n )\n)\n\n/** Exact provider action selected for a bounded pipeline evidence read. */\nexport const PluginPipelineActionReferenceV1 = Schema.Struct({\n entity: PluginEntityReferenceV1,\n executionId: boundedOpaque(\"PluginPipelineExecutionId\", 256),\n actionExecutionId: boundedOpaque(\"PluginPipelineActionExecutionId\", 256),\n expectedRevision: Revision\n})\n\n/** Decoded exact pipeline action identity. */\nexport type PluginPipelineActionReferenceV1 = typeof PluginPipelineActionReferenceV1.Type\n\n/** Bounded request for one page of pipeline action log events. */\nexport const PluginPipelineLogPageRequestV1 = Schema.Struct({\n action: PluginPipelineActionReferenceV1,\n cursor: Schema.NullOr(boundedOpaque(\"PluginPipelineLogCursor\", 4_096)),\n limit: PositiveInteger.check(Schema.isLessThanOrEqualTo(100))\n})\n\n/** One browser-safe provider log event. */\nexport const PluginPipelineLogEventV1 = Schema.Struct({\n timestamp: UtcTimestamp,\n ingestionTimestamp: Schema.NullOr(UtcTimestamp),\n message: Utf8BoundedLogMessage\n})\n\n/** Bounded pipeline action log page with an opaque continuation cursor. */\nexport const PluginPipelineLogPageV1 = Schema.Struct({\n events: Schema.Array(PluginPipelineLogEventV1).check(\n Schema.makeFilter((events) => events.length <= 100, { expected: \"at most 100 pipeline log events\" }),\n Schema.makeFilter(\n (events) =>\n events.reduce((total, event) => total + utf8Encoder.encode(event.message).byteLength, 0) <=\n MaximumLogPageBytes,\n { expected: `at most ${MaximumLogPageBytes} UTF-8 log message bytes` }\n )\n ),\n nextCursor: Schema.NullOr(boundedOpaque(\"PluginPipelineLogCursor\", 4_096))\n})\n\n/** Bounded request for one action artifact byte range. */\nexport const PluginPipelineArtifactRangeRequestV1 = Schema.Struct({\n action: PluginPipelineActionReferenceV1,\n direction: Schema.Literals([\"input\", \"output\"]),\n artifactName: boundedOpaque(\"PluginPipelineArtifactName\", 256),\n offset: NonNegativeInteger,\n length: PositiveInteger.check(Schema.isLessThanOrEqualTo(MaximumArtifactRangeBytes))\n})\n\n/** Browser-safe artifact bytes; provider storage coordinates are deliberately absent. */\nexport const PluginPipelineArtifactRangeV1 = Schema.Struct({\n bytesBase64: Schema.String.check(\n Schema.isMaxLength(MaximumArtifactRangeBase64Characters),\n Schema.isBase64(),\n Schema.makeFilter((value) => {\n const decoded = Encoding.decodeBase64(value)\n return Result.isSuccess(decoded) && decoded.success.byteLength <= MaximumArtifactRangeBytes\n }, { expected: `at most ${MaximumArtifactRangeBytes} base64-decoded bytes` })\n ),\n totalBytes: NonNegativeInteger,\n contentType: Schema.Literal(\"application/octet-stream\"),\n filename: Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(255),\n Schema.isPattern(/^[^\"\\\\/\\r\\n]+$/u, { expected: \"a safe attachment filename\" })\n )\n})\n\nexport type PluginPipelineLogPageRequestV1 = typeof PluginPipelineLogPageRequestV1.Type\nexport type PluginPipelineLogPageV1 = typeof PluginPipelineLogPageV1.Type\nexport type PluginPipelineArtifactRangeRequestV1 = typeof PluginPipelineArtifactRangeRequestV1.Type\nexport type PluginPipelineArtifactRangeV1 = typeof PluginPipelineArtifactRangeV1.Type\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugins-DiPrfzV8.js","names":[],"sources":["../../../src/domain/plugins/discovery.ts","../../../src/domain/plugins/pipeline.ts"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as SchemaGetter from \"effect/SchemaGetter\"\n\nimport { SourceUrl } from \"../sourceRevision.js\"\nimport { UtcTimestamp } from \"../utcTimestamp.js\"\n\nconst SafeProviderIdentifier = Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(512)\n)\nconst SafeProviderLabel = Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(200)\n)\nconst SafeDiscoveryEndpointUrl = SourceUrl.pipe(\n Schema.check(\n Schema.makeFilter(\n ({ hash, search }) => hash.length === 0 && search.length === 0,\n { expected: \"a provider endpoint URL without query parameters or fragments\" }\n )\n )\n)\n\nconst ProviderContainer = Schema.Struct({\n providerImmutableId: SafeProviderIdentifier,\n displayName: SafeProviderLabel\n})\nconst NullableProviderContainer = Schema.NullOr(ProviderContainer)\n\n/** Secret-free provider endpoint advertised during connection discovery. */\nexport const PluginDiscoveryEndpointV1 = Schema.Struct({\n kind: Schema.Literals([\"api\", \"web\", \"graphql\", \"webhook\"]),\n url: SafeDiscoveryEndpointUrl,\n label: Schema.NullOr(SafeProviderLabel)\n})\n\n/** Decoded safe provider endpoint metadata. */\nexport type PluginDiscoveryEndpointV1 = typeof PluginDiscoveryEndpointV1.Type\n\n/**\n * Safe connection metadata discovered from the provider.\n * Credentials, raw headers, and provider response bodies are deliberately absent.\n */\nexport const PluginDiscoveryV1 = Schema.Struct({\n account: NullableProviderContainer,\n workspace: NullableProviderContainer,\n resource: Schema.optional(NullableProviderContainer).pipe(\n Schema.decodeTo(Schema.toType(NullableProviderContainer), {\n decode: SchemaGetter.withDefault(Effect.succeed<typeof NullableProviderContainer.Type>(null)),\n encode: SchemaGetter.required()\n })\n ),\n endpoints: Schema.Array(PluginDiscoveryEndpointV1).check(\n Schema.makeFilter(\n (endpoints) => endpoints.length <= 20,\n { expected: \"at most 20 safe provider endpoints\" }\n )\n ),\n discoveredAt: UtcTimestamp\n}).annotate({ identifier: \"PluginDiscoveryV1\" })\n\n/** Decoded secret-free connection discovery metadata. */\nexport type PluginDiscoveryV1 = typeof PluginDiscoveryV1.Type\n","import * as Encoding from \"effect/Encoding\"\nimport * as Result from \"effect/Result\"\nimport * as Schema from \"effect/Schema\"\n\nimport { Revision } from \"../sourceRevision.js\"\nimport { UtcTimestamp } from \"../utcTimestamp.js\"\nimport { PluginEntityReferenceV1 } from \"./events.js\"\n\nconst boundedOpaque = (name: string, maximum: number) =>\n Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(maximum)).pipe(Schema.brand(name))\n\nconst NonNegativeInteger = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))\nconst PositiveInteger = Schema.Int.check(Schema.isGreaterThan(0))\nconst MaximumArtifactRangeBytes = 1024 * 1024\nconst MaximumArtifactRangeBase64Characters = 4 * Math.ceil(MaximumArtifactRangeBytes / 3)\nconst MaximumLogPageBytes = 1024 * 1024\nconst utf8Encoder = new TextEncoder()\nconst Utf8BoundedLogMessage = Schema.String.check(\n Schema.makeFilter(\n (message) => utf8Encoder.encode(message).byteLength <= MaximumLogPageBytes,\n { expected: `at most ${MaximumLogPageBytes} UTF-8 log message bytes` }\n )\n)\n\n/** Exact provider action selected for a bounded pipeline evidence read. */\nexport const PluginPipelineActionReferenceV1 = Schema.Struct({\n entity: PluginEntityReferenceV1,\n executionId: boundedOpaque(\"PluginPipelineExecutionId\", 256),\n actionExecutionId: boundedOpaque(\"PluginPipelineActionExecutionId\", 256),\n expectedRevision: Revision\n})\n\n/** Decoded exact pipeline action identity. */\nexport type PluginPipelineActionReferenceV1 = typeof PluginPipelineActionReferenceV1.Type\n\n/** Bounded request for one page of pipeline action log events. */\nexport const PluginPipelineLogPageRequestV1 = Schema.Struct({\n action: PluginPipelineActionReferenceV1,\n cursor: Schema.NullOr(boundedOpaque(\"PluginPipelineLogCursor\", 4_096)),\n limit: PositiveInteger.check(Schema.isLessThanOrEqualTo(100))\n})\n\n/** One browser-safe provider log event. */\nexport const PluginPipelineLogEventV1 = Schema.Struct({\n timestamp: UtcTimestamp,\n ingestionTimestamp: Schema.NullOr(UtcTimestamp),\n message: Utf8BoundedLogMessage\n})\n\n/** Bounded pipeline action log page with an opaque continuation cursor. */\nexport const PluginPipelineLogPageV1 = Schema.Struct({\n events: Schema.Array(PluginPipelineLogEventV1).check(\n Schema.makeFilter((events) => events.length <= 100, { expected: \"at most 100 pipeline log events\" }),\n Schema.makeFilter(\n (events) =>\n events.reduce((total, event) => total + utf8Encoder.encode(event.message).byteLength, 0) <=\n MaximumLogPageBytes,\n { expected: `at most ${MaximumLogPageBytes} UTF-8 log message bytes` }\n )\n ),\n nextCursor: Schema.NullOr(boundedOpaque(\"PluginPipelineLogCursor\", 4_096))\n})\n\n/** Bounded request for one action artifact byte range. */\nexport const PluginPipelineArtifactRangeRequestV1 = Schema.Struct({\n action: PluginPipelineActionReferenceV1,\n direction: Schema.Literals([\"input\", \"output\"]),\n artifactName: boundedOpaque(\"PluginPipelineArtifactName\", 256),\n offset: NonNegativeInteger,\n length: PositiveInteger.check(Schema.isLessThanOrEqualTo(MaximumArtifactRangeBytes))\n})\n\n/** Browser-safe artifact bytes; provider storage coordinates are deliberately absent. */\nexport const PluginPipelineArtifactRangeV1 = Schema.Struct({\n bytesBase64: Schema.String.check(\n Schema.isMaxLength(MaximumArtifactRangeBase64Characters),\n Schema.isBase64(),\n Schema.makeFilter((value) => {\n const decoded = Encoding.decodeBase64(value)\n return Result.isSuccess(decoded) && decoded.success.byteLength <= MaximumArtifactRangeBytes\n }, { expected: `at most ${MaximumArtifactRangeBytes} base64-decoded bytes` })\n ),\n totalBytes: NonNegativeInteger,\n contentType: Schema.Literal(\"application/octet-stream\"),\n filename: Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(255),\n Schema.isPattern(/^[^\"\\\\/\\r\\n]+$/u, { expected: \"a safe attachment filename\" })\n )\n})\n\nexport type PluginPipelineLogPageRequestV1 = typeof PluginPipelineLogPageRequestV1.Type\nexport type PluginPipelineLogPageV1 = typeof PluginPipelineLogPageV1.Type\nexport type PluginPipelineArtifactRangeRequestV1 = typeof PluginPipelineArtifactRangeRequestV1.Type\nexport type PluginPipelineArtifactRangeV1 = typeof PluginPipelineArtifactRangeV1.Type\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { Br as readinessDefinitionsShapeIsV1, Fr as deriveReleaseReadinessFindings, Ir as deriveReleaseReadinessNextEvaluationAt, Lr as deriveReleaseReadinessSourceSummaries, Qn as ReadinessArtifactRevision, Rr as deriveReleaseReadinessStages, Yr as readinessPolicyShapeIsV1, Zr as sortedReadinessUnique, _r as ReadinessReleaseRevision, ar as ReadinessFactDefinition, br as ReadinessRuleVersion, er as ReadinessCandidateDigest, kr as compareReadinessText, lr as ReadinessFactObservation, vr as ReadinessRuleId, zr as deriveReleaseReadinessVerdict } from "./workspaceSettings-BE713Oe8.js";
2
- import { At as SessionId, Et as ReleaseId, Mt as WorkspaceId, St as ReadinessAssessmentId, jt as ShareId, nt as UtcTimestamp, ot as EntityId, st as EnvironmentId, vt as PersonId } from "./descriptor-CKtTnhef.js";
1
+ import { $t as ReadinessFactDefinition, An as deriveReleaseReadinessNextEvaluationAt, Cn as compareReadinessText, Gn as sortedReadinessUnique, Jt as ReadinessCandidateDigest, Kt as ReadinessArtifactRevision, Mn as deriveReleaseReadinessStages, Nn as deriveReleaseReadinessVerdict, Pn as readinessDefinitionsShapeIsV1, Un as readinessPolicyShapeIsV1, dn as ReadinessReleaseRevision, fn as ReadinessRuleId, jn as deriveReleaseReadinessSourceSummaries, kn as deriveReleaseReadinessFindings, mn as ReadinessRuleVersion, rn as ReadinessFactObservation } from "./workspaceSettings-sv8h_h2P.js";
2
+ import { At as ShareId, Nt as UtcTimestamp, Tt as ReleaseId, _t as PersonId, at as EntityId, jt as WorkspaceId, kt as SessionId, ot as EnvironmentId, xt as ReadinessAssessmentId } from "./descriptor-CCvNzSZL.js";
3
3
  import * as Schema from "effect/Schema";
4
4
  import * as DateTime from "effect/DateTime";
5
5
  //#region src/domain/authorizedShare.ts
@@ -132,4 +132,4 @@ var rollUpReleaseReadiness = (input) => {
132
132
  //#endregion
133
133
  export { ReleaseReadinessCandidateMaterial as a, normalizeReadinessRuleMaterial as c, AuthorizedShareTarget as d, ReadinessRuleMaterial as i, normalizeReleaseReadinessCandidateMaterial as l, summarizeEnvironmentReadiness as n, ReleaseReadinessChildMaterial as o, EnvironmentReadinessCandidateMaterial as r, normalizeEnvironmentReadinessCandidateMaterial as s, rollUpReleaseReadiness as t, AuthorizedShareGrant as u };
134
134
 
135
- //# sourceMappingURL=readiness-BhA-Nr9c.js.map
135
+ //# sourceMappingURL=readiness-31Mqc-9H.js.map